diff --git a/Assets/Editor/Icons/AssetBrowser/Collapse_All.svg b/Assets/Editor/Icons/AssetBrowser/Collapse_All.svg
new file mode 100644
index 0000000000..7c7a7b85bd
--- /dev/null
+++ b/Assets/Editor/Icons/AssetBrowser/Collapse_All.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/TestSuite_Sandbox.py b/AutomatedTesting/Gem/PythonTests/Atom/TestSuite_Sandbox.py
index c9182070f6..bd0477a1db 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/TestSuite_Sandbox.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/TestSuite_Sandbox.py
@@ -9,87 +9,20 @@ import os
import pytest
-import ly_test_tools.environment.file_system as file_system
-import editor_python_test_tools.hydra_test_utils as hydra
from ly_test_tools.o3de.editor_test import EditorSharedTest, EditorTestSuite
-from Atom.atom_utils.atom_constants import LIGHT_TYPES
logger = logging.getLogger(__name__)
TEST_DIRECTORY = os.path.join(os.path.dirname(__file__), "tests")
-@pytest.mark.parametrize("project", ["AutomatedTesting"])
-@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
-@pytest.mark.parametrize("level", ["auto_test"])
-class TestAtomEditorComponentsMain(object):
- """Holds tests for Atom components."""
-
- @pytest.mark.test_case_id("C34525095")
- def test_AtomEditorComponents_LightComponent(
- self, request, editor, workspace, project, launcher_platform, level):
- """
- Please review the hydra script run by this test for more specific test info.
- Tests that the Light component has the expected property options available to it.
- """
- cfg_args = [level]
-
- expected_lines = [
- "light_entity Entity successfully created",
- "Entity has a Light component",
- "light_entity_test: Component added to the entity: True",
- f"light_entity_test: Property value is {LIGHT_TYPES['sphere']} which matches {LIGHT_TYPES['sphere']}",
- "Controller|Configuration|Shadows|Enable shadow set to True",
- "light_entity Controller|Configuration|Shadows|Shadowmap size: SUCCESS",
- "Controller|Configuration|Shadows|Shadow filter method set to 1", # PCF
- "Controller|Configuration|Shadows|Filtering sample count set to 4",
- "Controller|Configuration|Shadows|Filtering sample count set to 64",
- "Controller|Configuration|Shadows|Shadow filter method set to 2", # ESM
- "Controller|Configuration|Shadows|ESM exponent set to 50.0",
- "Controller|Configuration|Shadows|ESM exponent set to 5000.0",
- "Controller|Configuration|Shadows|Shadow filter method set to 3", # ESM+PCF
- f"light_entity_test: Property value is {LIGHT_TYPES['spot_disk']} which matches {LIGHT_TYPES['spot_disk']}",
- f"light_entity_test: Property value is {LIGHT_TYPES['capsule']} which matches {LIGHT_TYPES['capsule']}",
- f"light_entity_test: Property value is {LIGHT_TYPES['quad']} which matches {LIGHT_TYPES['quad']}",
- "light_entity Controller|Configuration|Fast approximation: SUCCESS",
- "light_entity Controller|Configuration|Both directions: SUCCESS",
- f"light_entity_test: Property value is {LIGHT_TYPES['polygon']} which matches {LIGHT_TYPES['polygon']}",
- f"light_entity_test: Property value is {LIGHT_TYPES['simple_point']} "
- f"which matches {LIGHT_TYPES['simple_point']}",
- "Controller|Configuration|Attenuation radius|Mode set to 0",
- "Controller|Configuration|Attenuation radius|Radius set to 100.0",
- f"light_entity_test: Property value is {LIGHT_TYPES['simple_spot']} "
- f"which matches {LIGHT_TYPES['simple_spot']}",
- "Controller|Configuration|Shutters|Outer angle set to 45.0",
- "Controller|Configuration|Shutters|Outer angle set to 90.0",
- "light_entity_test: Component added to the entity: True",
- "Light component test (non-GPU) completed.",
- ]
-
- unexpected_lines = ["Traceback (most recent call last):"]
-
- hydra.launch_and_validate_results(
- request,
- TEST_DIRECTORY,
- editor,
- "hydra_AtomEditorComponents_LightComponent.py",
- timeout=120,
- expected_lines=expected_lines,
- unexpected_lines=unexpected_lines,
- halt_on_unexpected=True,
- null_renderer=True,
- cfg_args=cfg_args,
- enable_prefab_system=False,
- )
-
-
@pytest.mark.parametrize("project", ["AutomatedTesting"])
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
class TestAutomation(EditorTestSuite):
enable_prefab_system = False
- #this test is intermittently timing out without ever having executed. sandboxing while we investigate cause.
+ # this test is intermittently timing out without ever having executed. sandboxing while we investigate cause.
@pytest.mark.test_case_id("C36525660")
class AtomEditorComponents_DisplayMapperAdded(EditorSharedTest):
from Atom.tests import hydra_AtomEditorComponents_DisplayMapperAdded as test_module
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_LightComponent.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_LightComponent.py
deleted file mode 100644
index 7ecdc6859b..0000000000
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_LightComponent.py
+++ /dev/null
@@ -1,213 +0,0 @@
-"""
-Copyright (c) Contributors to the Open 3D Engine Project.
-For complete copyright and license terms please see the LICENSE at the root of this distribution.
-
-SPDX-License-Identifier: Apache-2.0 OR MIT
-"""
-
-import os
-import sys
-
-import azlmbr.bus as bus
-import azlmbr.editor as editor
-import azlmbr.math as math
-import azlmbr.paths
-import azlmbr.legacy.general as general
-
-sys.path.append(os.path.join(azlmbr.paths.projectroot, "Gem", "PythonTests"))
-
-import editor_python_test_tools.hydra_editor_utils as hydra
-from Atom.atom_utils.atom_constants import LIGHT_TYPES
-
-LIGHT_TYPE_PROPERTY = 'Controller|Configuration|Light type'
-SPHERE_AND_SPOT_DISK_LIGHT_PROPERTIES = [
- ("Controller|Configuration|Shadows|Enable shadow", True),
- ("Controller|Configuration|Shadows|Shadowmap size", 0), # 256
- ("Controller|Configuration|Shadows|Shadowmap size", 1), # 512
- ("Controller|Configuration|Shadows|Shadowmap size", 2), # 1024
- ("Controller|Configuration|Shadows|Shadowmap size", 3), # 2048
- ("Controller|Configuration|Shadows|Shadow filter method", 1), # PCF
- ("Controller|Configuration|Shadows|Filtering sample count", 4.0),
- ("Controller|Configuration|Shadows|Filtering sample count", 64.0),
- ("Controller|Configuration|Shadows|Shadow filter method", 2), # ECM
- ("Controller|Configuration|Shadows|ESM exponent", 50),
- ("Controller|Configuration|Shadows|ESM exponent", 5000),
- ("Controller|Configuration|Shadows|Shadow filter method", 3), # ESM+PCF
-]
-QUAD_LIGHT_PROPERTIES = [
- ("Controller|Configuration|Both directions", True),
- ("Controller|Configuration|Fast approximation", True),
-]
-SIMPLE_POINT_LIGHT_PROPERTIES = [
- ("Controller|Configuration|Attenuation radius|Mode", 0),
- ("Controller|Configuration|Attenuation radius|Radius", 100.0),
-]
-SIMPLE_SPOT_LIGHT_PROPERTIES = [
- ("Controller|Configuration|Shutters|Inner angle", 45.0),
- ("Controller|Configuration|Shutters|Outer angle", 90.0),
-]
-
-
-def verify_required_component_property_value(entity_name, component, property_path, expected_property_value):
- """
- Compares the property value of component against the expected_property_value.
- :param entity_name: name of the entity to use (for test verification purposes).
- :param component: component to check on a given entity for its current property value.
- :param property_path: the path to the property inside the component.
- :param expected_property_value: The value expected from the value inside property_path.
- :return: None, but prints to general.log() which the test uses to verify against.
- """
- property_value = editor.EditorComponentAPIBus(
- bus.Broadcast, "GetComponentProperty", component, property_path).GetValue()
- general.log(f"{entity_name}_test: Property value is {property_value} "
- f"which matches {expected_property_value}")
-
-
-def run():
- """
- Test Case - Light Component
- 1. Creates a "light_entity" Entity and attaches a "Light" component to it.
- 2. Updates the Light component to each light type option from the LIGHT_TYPES constant.
- 3. The test will check the Editor log to ensure each light type was selected.
- 4. Prints the string "Light component test (non-GPU) completed" after completion.
-
- Tests will fail immediately if any of these log lines are found:
- 1. Trace::Assert
- 2. Trace::Error
- 3. Traceback (most recent call last):
-
- :return: None
- """
- # Create a "light_entity" entity with "Light" component.
- light_entity_name = "light_entity"
- light_component = "Light"
- light_entity = hydra.Entity(light_entity_name)
- light_entity.create_entity(math.Vector3(-1.0, -2.0, 3.0), [light_component])
- general.log(
- f"{light_entity_name}_test: Component added to the entity: "
- f"{hydra.has_components(light_entity.id, [light_component])}")
-
- # Populate the light_component_id_pair value so that it can be used to select all Light component options.
- light_component_id_pair = None
- component_type_id_list = azlmbr.editor.EditorComponentAPIBus(
- azlmbr.bus.Broadcast, 'FindComponentTypeIdsByEntityType', [light_component], 0)
- if len(component_type_id_list) < 1:
- general.log(f"ERROR: A component class with name {light_component} doesn't exist")
- light_component_id_pair = None
- elif len(component_type_id_list) > 1:
- general.log(f"ERROR: Found more than one component classes with same name: {light_component}")
- light_component_id_pair = None
- entity_component_id_pair = azlmbr.editor.EditorComponentAPIBus(
- azlmbr.bus.Broadcast, 'GetComponentOfType', light_entity.id, component_type_id_list[0])
- if entity_component_id_pair.IsSuccess():
- light_component_id_pair = entity_component_id_pair.GetValue()
-
- # Test each Light component option can be selected and it's properties updated.
- # Point (sphere) light type checks.
- light_type_property_test(
- light_type=LIGHT_TYPES['sphere'],
- light_properties=SPHERE_AND_SPOT_DISK_LIGHT_PROPERTIES,
- light_component_id_pair=light_component_id_pair,
- light_entity_name=light_entity_name,
- light_entity=light_entity
- )
-
- # Spot (disk) light type checks.
- light_type_property_test(
- light_type=LIGHT_TYPES['spot_disk'],
- light_properties=SPHERE_AND_SPOT_DISK_LIGHT_PROPERTIES,
- light_component_id_pair=light_component_id_pair,
- light_entity_name=light_entity_name,
- light_entity=light_entity
- )
-
- # Capsule light type checks.
- azlmbr.editor.EditorComponentAPIBus(
- azlmbr.bus.Broadcast,
- 'SetComponentProperty',
- light_component_id_pair,
- LIGHT_TYPE_PROPERTY,
- LIGHT_TYPES['capsule']
- )
- verify_required_component_property_value(
- entity_name=light_entity_name,
- component=light_entity.components[0],
- property_path=LIGHT_TYPE_PROPERTY,
- expected_property_value=LIGHT_TYPES['capsule']
- )
-
- # Quad light type checks.
- light_type_property_test(
- light_type=LIGHT_TYPES['quad'],
- light_properties=QUAD_LIGHT_PROPERTIES,
- light_component_id_pair=light_component_id_pair,
- light_entity_name=light_entity_name,
- light_entity=light_entity
- )
-
- # Polygon light type checks.
- azlmbr.editor.EditorComponentAPIBus(
- azlmbr.bus.Broadcast,
- 'SetComponentProperty',
- light_component_id_pair,
- LIGHT_TYPE_PROPERTY,
- LIGHT_TYPES['polygon']
- )
- verify_required_component_property_value(
- entity_name=light_entity_name,
- component=light_entity.components[0],
- property_path=LIGHT_TYPE_PROPERTY,
- expected_property_value=LIGHT_TYPES['polygon']
- )
-
- # Point (simple punctual) light type checks.
- light_type_property_test(
- light_type=LIGHT_TYPES['simple_point'],
- light_properties=SIMPLE_POINT_LIGHT_PROPERTIES,
- light_component_id_pair=light_component_id_pair,
- light_entity_name=light_entity_name,
- light_entity=light_entity
- )
-
- # Spot (simple punctual) light type checks.
- light_type_property_test(
- light_type=LIGHT_TYPES['simple_spot'],
- light_properties=SIMPLE_SPOT_LIGHT_PROPERTIES,
- light_component_id_pair=light_component_id_pair,
- light_entity_name=light_entity_name,
- light_entity=light_entity
- )
-
- general.log("Light component test (non-GPU) completed.")
-
-
-def light_type_property_test(light_type, light_properties, light_component_id_pair, light_entity_name, light_entity):
- """
- Updates the current light type and modifies its properties, then verifies they are accurate to what was set.
- :param light_type: The type of light to update, must match a value in LIGHT_TYPES
- :param light_properties: List of tuples detailing properties to modify with update values.
- :param light_component_id_pair: Entity + component ID pair for updating the light component on a given entity.
- :param light_entity_name: the name of the Entity holding the light component.
- :param light_entity: the Entity object containing the light component.
- :return: None
- """
- azlmbr.editor.EditorComponentAPIBus(
- azlmbr.bus.Broadcast,
- 'SetComponentProperty',
- light_component_id_pair,
- LIGHT_TYPE_PROPERTY,
- light_type
- )
- verify_required_component_property_value(
- entity_name=light_entity_name,
- component=light_entity.components[0],
- property_path=LIGHT_TYPE_PROPERTY,
- expected_property_value=light_type
- )
-
- for light_property in light_properties:
- light_entity.get_set_test(0, light_property[0], light_property[1])
-
-
-if __name__ == "__main__":
- run()
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ShapeIntersectionFilter_FilterStageToggle.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ShapeIntersectionFilter_FilterStageToggle.py
index 8f179f7f50..b5c00a53b7 100644
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ShapeIntersectionFilter_FilterStageToggle.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ShapeIntersectionFilter_FilterStageToggle.py
@@ -68,7 +68,7 @@ def ShapeIntersectionFilter_FilterStageToggle():
# Create a new entity as a child of the vegetation area entity with Box Shape
box = hydra.Entity("box")
box.create_entity(position, ["Box Shape"])
- box.get_set_test(0, "Box Shape|Box Configuration|Dimensions", math.Vector3(8.0, 8.0, 1.0))
+ box.get_set_test(0, "Box Shape|Box Configuration|Dimensions", math.Vector3(5.0, 5.0, 1.0))
# Create a new entity as a child of the vegetation area entity with Cylinder Shape.
cylinder = hydra.Entity("cylinder")
@@ -80,10 +80,10 @@ def ShapeIntersectionFilter_FilterStageToggle():
# On the Shape Intersection Filter component, click the crosshair button, and add child entities one by one
vegetation.get_set_test(3, "Configuration|Shape Entity Id", box.id)
- result = helper.wait_for_condition(lambda: dynveg.validate_instance_count(position, 8.0, 100), 2.0)
+ result = helper.wait_for_condition(lambda: dynveg.validate_instance_count(position, 5.0, 49), 2.0)
Report.result(Tests.instance_count_in_box_shape, result)
vegetation.get_set_test(3, "Configuration|Shape Entity Id", cylinder.id)
- result = helper.wait_for_condition(lambda: dynveg.validate_instance_count(position, 5.0, 100), 2.0)
+ result = helper.wait_for_condition(lambda: dynveg.validate_instance_count(position, 5.0, 121), 2.0)
Report.result(Tests.instance_count_in_cylinder_shape, result)
# Create a new entity as a child of the area entity with Random Noise Gradient, Gradient Transform Modifier,
@@ -98,12 +98,13 @@ def ShapeIntersectionFilter_FilterStageToggle():
# Pin the Random Noise entity to the Gradient Entity Id field of the Position Modifier's Gradient X
vegetation.get_set_test(4, "Configuration|Position X|Gradient|Gradient Entity Id", random_noise.id)
- # Toggle between PreProcess and PostProcess
+ # Toggle between PreProcess and PostProcess and validate instances. Validate in a 0.3m wider radius due to position
+ # offsets
vegetation.get_set_test(3, "Configuration|Filter Stage", 1)
- result = helper.wait_for_condition(lambda: dynveg.validate_instance_count(position, 5.0, 117), 2.0)
+ result = helper.wait_for_condition(lambda: dynveg.validate_instance_count(position, 5.3, 121), 2.0)
Report.result(Tests.preprocess_instance_count, result)
vegetation.get_set_test(3, "Configuration|Filter Stage", 2)
- result = helper.wait_for_condition(lambda: dynveg.validate_instance_count(position, 5.0, 122), 2.0)
+ result = helper.wait_for_condition(lambda: dynveg.validate_instance_count(position, 5.3, 122), 2.0)
Report.result(Tests.postprocess_instance_count, result)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Main_Optimized.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Main_Optimized.py
index af1c187817..5b1e504442 100644
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Main_Optimized.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Main_Optimized.py
@@ -131,7 +131,6 @@ class TestAutomation_PrefabNotEnabled(EditorTestSuite):
class test_ShapeIntersectionFilter_InstancesPlantInAssignedShape(EditorParallelTest):
from .EditorScripts import ShapeIntersectionFilter_InstancesPlantInAssignedShape as test_module
- @pytest.mark.skip("https://github.com/o3de/o3de/issues/6973")
class test_ShapeIntersectionFilter_FilterStageToggle(EditorParallelTest):
from .EditorScripts import ShapeIntersectionFilter_FilterStageToggle as test_module
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_black.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_black.material
index cc2c9e785b..d15aa620c7 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_black.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_black.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"baseColor": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_green.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_green.material
index a4bfb73d12..579359b085 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_green.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_green.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"baseColor": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_arch.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_arch.material
index fe9c54bc02..88d5fc0fc6 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_arch.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_arch.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"baseColor": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_bricks.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_bricks.material
index a19afa33e2..7244397ee9 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_bricks.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_bricks.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"baseColor": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_floor.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_floor.material
index 0c1208d8fb..8a3f289c26 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_floor.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_floor.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"baseColor": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_roof.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_roof.material
index 6aad4d644a..7bc193978f 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_roof.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_roof.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"baseColor": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_phong5.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_phong5.material
index 302589dc85..a53cbef4e4 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_phong5.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_phong5.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"baseColor": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_red.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_red.material
index 5217a4e4be..6ddb645319 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_red.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_red.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"baseColor": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_white.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_white.material
index dba44f7b49..e3d310cd15 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_white.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_white.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"emissive": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/objects/lightBlocker_lambert1.material b/AutomatedTesting/Gem/Sponza/Assets/objects/lightBlocker_lambert1.material
index c8e9f1f8f7..35677a81c6 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/objects/lightBlocker_lambert1.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/objects/lightBlocker_lambert1.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"emissive": {
"color": [
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic.material
index 32ac8dfd10..6af3ceb0c1 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic.material
@@ -1,6 +1,6 @@
{
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"baseColor": {
"color": [ 1.0, 1.0, 1.0 ],
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r00.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r00.material
index 1c1096bf12..541bd83981 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r00.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r00.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r01.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r01.material
index 33148f3f73..19691258e0 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r01.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r01.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r02.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r02.material
index 38339454cb..46fda2aab1 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r02.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r02.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r03.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r03.material
index e21ab5775a..79cf4bf401 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r03.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r03.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r04.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r04.material
index 0272e66081..9aabf3e158 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r04.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r04.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r05.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r05.material
index 67d51777a4..8b02f225fc 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r05.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r05.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r06.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r06.material
index 3136f654e6..5b089da4bd 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r06.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r06.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r07.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r07.material
index a79744ea11..25741cf689 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r07.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r07.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r08.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r08.material
index 1372283500..04103273f2 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r08.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r08.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r09.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r09.material
index d1c951e53c..74eb68da99 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r09.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r09.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r10.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r10.material
index d34fc46530..3533ca6676 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r10.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r10.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r00.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r00.material
index 92ddfec7c4..d2ce0fadc9 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r00.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r00.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r01.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r01.material
index 874422384a..8d96ea6217 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r01.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r01.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r02.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r02.material
index b017add10b..e8feb87283 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r02.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r02.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r03.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r03.material
index 5353d651c8..c14591bd52 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r03.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r03.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r04.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r04.material
index 6dd47e4e3b..60a3167f02 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r04.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r04.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r05.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r05.material
index 04912cbfd4..d71ff06961 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r05.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r05.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r06.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r06.material
index 27f7f6ff42..6fa8cfe1a6 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r06.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r06.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r07.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r07.material
index e2b5df681c..773cc66f03 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r07.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r07.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r08.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r08.material
index 5418f9c855..6971597d1d 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r08.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r08.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r09.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r09.material
index dd1ec3489a..c2d8cc47bd 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r09.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r09.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r10.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r10.material
index 5f9317d2cc..906879b0ea 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r10.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r10.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Materials/DefaultPBRTransparent.material b/AutomatedTesting/Materials/DefaultPBRTransparent.material
index 7c8aa6cf94..a7000d5371 100644
--- a/AutomatedTesting/Materials/DefaultPBRTransparent.material
+++ b/AutomatedTesting/Materials/DefaultPBRTransparent.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "Materials/Presets/PBR/default_grid.material",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"opacity": {
"mode": "Blended"
diff --git a/AutomatedTesting/Materials/basic_grey.material b/AutomatedTesting/Materials/basic_grey.material
index 0b890db4c6..6ecc1e029a 100644
--- a/AutomatedTesting/Materials/basic_grey.material
+++ b/AutomatedTesting/Materials/basic_grey.material
@@ -1,6 +1,6 @@
{
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"baseColor": {
"color": [ 0.18, 0.18, 0.18 ],
diff --git a/AutomatedTesting/Objects/MorphTargets/DisplayWrinkleMaskBlendValues.material b/AutomatedTesting/Objects/MorphTargets/DisplayWrinkleMaskBlendValues.material
index 878b3ac39f..52c323b454 100644
--- a/AutomatedTesting/Objects/MorphTargets/DisplayWrinkleMaskBlendValues.material
+++ b/AutomatedTesting/Objects/MorphTargets/DisplayWrinkleMaskBlendValues.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/Skin.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"wrinkleLayers": {
"count": 3,
diff --git a/Code/Editor/AssetImporter/AssetImporterManager/AssetImporterManager.cpp b/Code/Editor/AssetImporter/AssetImporterManager/AssetImporterManager.cpp
index baa287e47f..73c3d6f9ed 100644
--- a/Code/Editor/AssetImporter/AssetImporterManager/AssetImporterManager.cpp
+++ b/Code/Editor/AssetImporter/AssetImporterManager/AssetImporterManager.cpp
@@ -191,6 +191,7 @@ void AssetImporterManager::OnBrowseDestinationFilePath(QLineEdit* destinationLin
fileDialog.setViewMode(QFileDialog::List);
fileDialog.setWindowModality(Qt::WindowModality::ApplicationModal);
fileDialog.setWindowTitle(tr("Select import destination"));
+ fileDialog.setFileMode(QFileDialog::Directory);
QSettings settings;
QString currentDestination = settings.value(AssetImporterManagerPrivate::g_selectDestinationFilesPath).toString();
diff --git a/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.cpp b/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.cpp
index a7faea36f6..36e08982a7 100644
--- a/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.cpp
+++ b/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.cpp
@@ -32,6 +32,15 @@ AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING
AZ_CVAR_EXTERNED(bool, ed_useNewAssetBrowserTableView);
+namespace AzToolsFramework
+{
+ namespace AssetBrowser
+ {
+ static constexpr const char* CollapseAllIcon = "Assets/Editor/Icons/AssetBrowser/Collapse_All.svg";
+ static constexpr const char* MenuIcon = ":/Menu/menu.svg";
+ } // namespace AssetBrowser
+} // namespace AzToolsFramework
+
class ListenerForShowAssetEditorEvent
: public QObject
, private AzToolsFramework::EditorEvents::Bus::Handler
@@ -87,10 +96,21 @@ AzAssetBrowserWindow::AzAssetBrowserWindow(QWidget* parent)
m_assetBrowserModel->SetFilterModel(m_filterModel.data());
+ m_ui->m_collapseAllButton->setAutoRaise(true); // hover highlight
+ m_ui->m_collapseAllButton->setIcon(QIcon(AzAssetBrowser::CollapseAllIcon));
+
+ connect(
+ m_ui->m_collapseAllButton, &QToolButton::clicked, this,
+ [this]()
+ {
+ m_ui->m_assetBrowserTreeViewWidget->collapseAll();
+ });
+
if (ed_useNewAssetBrowserTableView)
{
m_ui->m_toggleDisplayViewBtn->setVisible(true);
- m_ui->m_toggleDisplayViewBtn->setIcon(QIcon(":/Menu/menu.svg"));
+ m_ui->m_toggleDisplayViewBtn->setAutoRaise(true);
+ m_ui->m_toggleDisplayViewBtn->setIcon(QIcon(AzAssetBrowser::MenuIcon));
m_tableModel->setFilterRole(Qt::DisplayRole);
m_tableModel->setSourceModel(m_filterModel.data());
diff --git a/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.ui b/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.ui
index a345438aed..2cc7c57ccd 100644
--- a/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.ui
+++ b/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.ui
@@ -72,6 +72,22 @@
+ -
+
+
+ Qt::ClickFocus
+
+
+
+
+
+ 3
+
+
+
+
+
+
-
@@ -143,15 +159,6 @@
true
-
- false
-
-
- true
-
-
- false
-
-
diff --git a/Code/Editor/EditorPreferencesDialog.cpp b/Code/Editor/EditorPreferencesDialog.cpp
index 665daf52a8..42f7446716 100644
--- a/Code/Editor/EditorPreferencesDialog.cpp
+++ b/Code/Editor/EditorPreferencesDialog.cpp
@@ -112,29 +112,31 @@ void EditorPreferencesDialog::showEvent(QShowEvent* event)
QDialog::showEvent(event);
}
-void WidgetHandleKeyPressEvent(QWidget* widget, QKeyEvent* event)
+bool WidgetConsumesKeyPressEvent(QKeyEvent* event)
{
// If the enter key is pressed during any text input, the dialog box will close
// making it inconvenient to do multiple edits. This routine captures the
// Key_Enter or Key_Return and clears the focus to give a visible cue that
- // editing of that field has finished and then doesn't propogate it.
+ // editing of that field has finished and then doesn't propagate it.
if (event->key() != Qt::Key::Key_Enter && event->key() != Qt::Key::Key_Return)
{
- QApplication::sendEvent(widget, event);
+ return false;
}
- else
+
+ if (QWidget* editWidget = QApplication::focusWidget())
{
- if (QWidget* editWidget = QApplication::focusWidget())
- {
- editWidget->clearFocus();
- }
+ editWidget->clearFocus();
}
-}
+ return true;
+}
void EditorPreferencesDialog::keyPressEvent(QKeyEvent* event)
{
- WidgetHandleKeyPressEvent(this, event);
+ if (!WidgetConsumesKeyPressEvent(event))
+ {
+ QDialog::keyPressEvent(event);
+ }
}
void EditorPreferencesDialog::OnTreeCurrentItemChanged()
diff --git a/Code/Editor/EditorPreferencesDialog.h b/Code/Editor/EditorPreferencesDialog.h
index a3f05ad00d..70a186375b 100644
--- a/Code/Editor/EditorPreferencesDialog.h
+++ b/Code/Editor/EditorPreferencesDialog.h
@@ -19,7 +19,7 @@ namespace Ui
class EditorPreferencesTreeWidgetItem;
-void WidgetHandleKeyPressEvent(QWidget* widget, QKeyEvent* event);
+bool WidgetConsumesKeyPressEvent(QKeyEvent* event);
class EditorPreferencesDialog
: public QDialog
diff --git a/Code/Editor/Include/SandboxAPI.h b/Code/Editor/Include/SandboxAPI.h
index 4e0cafea4a..757b799837 100644
--- a/Code/Editor/Include/SandboxAPI.h
+++ b/Code/Editor/Include/SandboxAPI.h
@@ -21,7 +21,7 @@
#endif
#if defined(SANDBOX_IMPORTS) && defined(SANDBOX_EXPORTS)
-#error SANDBOX_EXPORTS and SANDBOX_IMPORTS can't be defined at the same time
+#error SANDBOX_EXPORTS and SANDBOX_IMPORTS cannot be defined at the same time
#endif
#if defined(SANDBOX_EXPORTS)
diff --git a/Code/Editor/Platform/Common/GCC/editor_lib_gcc.cmake b/Code/Editor/Platform/Common/GCC/editor_lib_gcc.cmake
new file mode 100644
index 0000000000..bc945f55c9
--- /dev/null
+++ b/Code/Editor/Platform/Common/GCC/editor_lib_gcc.cmake
@@ -0,0 +1,9 @@
+#
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+#
+
+set(LY_COMPILE_OPTIONS PRIVATE -fexceptions)
diff --git a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerListModel.cpp b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerListModel.cpp
index 1c361b050d..39be4839e6 100644
--- a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerListModel.cpp
+++ b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerListModel.cpp
@@ -2599,11 +2599,12 @@ void OutlinerItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem&
optionV4.text.clear();
optionV4.widget->style()->drawControl(QStyle::CE_ItemViewItem, &optionV4, painter);
- // Now we setup a Text Document so it can draw the rich text
int verticalOffset = GetEntityNameVerticalOffset(entityId);
- painter->translate(textRect.topLeft() + QPoint(0, verticalOffset));
- AzToolsFramework::RichTextHighlighter::PaintHighlightedRichText(entityNameRichText, painter, optionV4, textRect);
+ AzToolsFramework::RichTextHighlighter::PaintHighlightedRichText(
+ entityNameRichText, painter, optionV4, textRect, QPoint(0, verticalOffset));
+
+ painter->restore();
OutlinerListModel::s_paintingName = false;
}
diff --git a/Code/Editor/TopRendererWnd.h b/Code/Editor/TopRendererWnd.h
index c5bc7a31f2..7bdf2eaff2 100644
--- a/Code/Editor/TopRendererWnd.h
+++ b/Code/Editor/TopRendererWnd.h
@@ -81,8 +81,6 @@ public:
bool m_bShowStatObjects;
bool m_bShowWater;
bool m_bAutoScaleGreyRange;
-
- friend class QTopRendererWnd;
};
#endif // CRYINCLUDE_EDITOR_TOPRENDERERWND_H
diff --git a/Code/Framework/AzCore/AzCore/DOM/DomPath.cpp b/Code/Framework/AzCore/AzCore/DOM/DomPath.cpp
new file mode 100644
index 0000000000..bc50a8513c
--- /dev/null
+++ b/Code/Framework/AzCore/AzCore/DOM/DomPath.cpp
@@ -0,0 +1,478 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#include
+#include
+#include
+#include
+
+namespace AZ::Dom
+{
+ PathEntry::PathEntry(size_t value)
+ : m_value(value)
+ {
+ }
+
+ PathEntry::PathEntry(AZ::Name value)
+ : m_value(AZStd::move(value))
+ {
+ }
+
+ PathEntry::PathEntry(AZStd::string_view value)
+ : m_value(AZ::Name(value))
+ {
+ }
+
+ PathEntry& PathEntry::operator=(size_t value)
+ {
+ m_value = value;
+ return *this;
+ }
+
+ PathEntry& PathEntry::operator=(AZ::Name value)
+ {
+ m_value = AZStd::move(value);
+ return *this;
+ }
+
+ PathEntry& PathEntry::operator=(AZStd::string_view value)
+ {
+ m_value = AZ::Name(value);
+ return *this;
+ }
+
+ bool PathEntry::operator==(const PathEntry& other) const
+ {
+ return m_value == other.m_value;
+ }
+
+ bool PathEntry::operator==(size_t value) const
+ {
+ return IsIndex() && GetIndex() == value;
+ }
+
+ bool PathEntry::operator==(const AZ::Name& key) const
+ {
+ return IsKey() && GetKey() == key;
+ }
+
+ bool PathEntry::operator==(AZStd::string_view key) const
+ {
+ return IsKey() && GetKey() == AZ::Name(key);
+ }
+
+ bool PathEntry::operator!=(const PathEntry& other) const
+ {
+ return m_value != other.m_value;
+ }
+
+ bool PathEntry::operator!=(size_t value) const
+ {
+ return !IsIndex() || GetIndex() != value;
+ }
+
+ bool PathEntry::operator!=(const AZ::Name& key) const
+ {
+ return !IsKey() || GetKey() != key;
+ }
+
+ bool PathEntry::operator!=(AZStd::string_view key) const
+ {
+ return !IsKey() || GetKey() != AZ::Name(key);
+ }
+
+ void PathEntry::SetEndOfArray()
+ {
+ m_value = EndOfArrayIndex;
+ }
+
+ bool PathEntry::IsEndOfArray() const
+ {
+ const size_t* result = AZStd::get_if(&m_value);
+ return result == nullptr ? false : ((*result) == EndOfArrayIndex);
+ }
+
+ bool PathEntry::IsIndex() const
+ {
+ const size_t* result = AZStd::get_if(&m_value);
+ return result == nullptr ? false : ((*result) != EndOfArrayIndex);
+ }
+
+ bool PathEntry::IsKey() const
+ {
+ return AZStd::holds_alternative(m_value);
+ }
+
+ size_t PathEntry::GetIndex() const
+ {
+ AZ_Assert(IsIndex(), "GetIndex called on PathEntry that is not an index");
+ return AZStd::get(m_value);
+ }
+
+ const AZ::Name& PathEntry::GetKey() const
+ {
+ AZ_Assert(IsKey(), "Key called on PathEntry that is not a key");
+ return AZStd::get(m_value);
+ }
+
+ Path::Path(AZStd::initializer_list init)
+ : m_entries(init)
+ {
+ }
+
+ Path::Path(AZStd::string_view pathString)
+ {
+ FromString(pathString);
+ }
+
+ Path Path::operator/(const PathEntry& entry) const
+ {
+ Path newPath(*this);
+ newPath /= entry;
+ return newPath;
+ }
+
+ Path Path::operator/(size_t index) const
+ {
+ return *this / PathEntry(index);
+ }
+
+ Path Path::operator/(AZ::Name key) const
+ {
+ return *this / PathEntry(key);
+ }
+
+ Path Path::operator/(AZStd::string_view key) const
+ {
+ return *this / PathEntry(key);
+ }
+
+ Path Path::operator/(const Path& other) const
+ {
+ Path newPath(*this);
+ newPath /= other;
+ return newPath;
+ }
+
+ Path& Path::operator/=(const PathEntry& entry)
+ {
+ Push(entry);
+ return *this;
+ }
+
+ Path& Path::operator/=(size_t index)
+ {
+ return *this /= PathEntry(index);
+ }
+
+ Path& Path::operator/=(AZ::Name key)
+ {
+ return *this /= PathEntry(key);
+ }
+
+ Path& Path::operator/=(AZStd::string_view key)
+ {
+ return *this /= PathEntry(key);
+ }
+
+ Path& Path::operator/=(const Path& other)
+ {
+ for (const PathEntry& entry : other)
+ {
+ Push(entry);
+ }
+ return *this;
+ }
+
+ bool Path::operator==(const Path& other) const
+ {
+ return m_entries == other.m_entries;
+ }
+
+ const Path::ContainerType& Path::GetEntries() const
+ {
+ return m_entries;
+ }
+
+ void Path::Push(PathEntry entry)
+ {
+ m_entries.push_back(AZStd::move(entry));
+ }
+
+ void Path::Push(size_t entry)
+ {
+ Push(PathEntry(entry));
+ }
+
+ void Path::Push(AZ::Name entry)
+ {
+ Push(PathEntry(AZStd::move(entry)));
+ }
+
+ void Path::Push(AZStd::string_view entry)
+ {
+ Push(AZ::Name(entry));
+ }
+
+ void Path::Pop()
+ {
+ m_entries.pop_back();
+ }
+
+ void Path::Clear()
+ {
+ m_entries.clear();
+ }
+
+ PathEntry Path::At(size_t index) const
+ {
+ if (index < m_entries.size())
+ {
+ return m_entries[index];
+ }
+ return {};
+ }
+
+ size_t Path::Size() const
+ {
+ return m_entries.size();
+ }
+
+ PathEntry& Path::operator[](size_t index)
+ {
+ return m_entries[index];
+ }
+
+ const PathEntry& Path::operator[](size_t index) const
+ {
+ return m_entries[index];
+ }
+
+ Path::ContainerType::iterator Path::begin()
+ {
+ return m_entries.begin();
+ }
+
+ Path::ContainerType::iterator Path::end()
+ {
+ return m_entries.end();
+ }
+
+ Path::ContainerType::const_iterator Path::begin() const
+ {
+ return m_entries.cbegin();
+ }
+
+ Path::ContainerType::const_iterator Path::end() const
+ {
+ return m_entries.cend();
+ }
+
+ Path::ContainerType::const_iterator Path::cbegin() const
+ {
+ return m_entries.cbegin();
+ }
+
+ Path::ContainerType::const_iterator Path::cend() const
+ {
+ return m_entries.cend();
+ }
+
+ size_t Path::size() const
+ {
+ return m_entries.size();
+ }
+
+ size_t Path::GetStringLength() const
+ {
+ size_t size = 0;
+ for (const PathEntry& entry : m_entries)
+ {
+ ++size;
+ if (entry.IsEndOfArray())
+ {
+ size += 1;
+ }
+ else if (entry.IsIndex())
+ {
+ const size_t index = entry.GetIndex();
+ const double digitCount = index > 0 ? log10(aznumeric_cast(index + 1)) : 1.0;
+ size += aznumeric_cast(ceil(digitCount));
+ }
+ else
+ {
+ const char* nameBuffer = entry.GetKey().GetCStr();
+ for (size_t i = 0; nameBuffer[i]; ++i)
+ {
+ if (nameBuffer[i] == EscapeCharacter || nameBuffer[i] == PathSeparator)
+ {
+ ++size;
+ }
+ ++size;
+ }
+ }
+ }
+ return size;
+ }
+
+ void Path::FormatString(char* stringBuffer, size_t bufferSize) const
+ {
+ size_t bufferIndex = 0;
+
+ auto putChar = [&](char c)
+ {
+ if (bufferIndex == bufferSize)
+ {
+ return;
+ }
+ stringBuffer[bufferIndex++] = c;
+ };
+
+ auto writeToBuffer = [&](const char* key)
+ {
+ for (size_t keyIndex = 0; key[keyIndex]; ++keyIndex)
+ {
+ const char c = key[keyIndex];
+ if (c == EscapeCharacter)
+ {
+ putChar(EscapeCharacter);
+ putChar(TildeSequence);
+ }
+ else if (c == PathSeparator)
+ {
+ putChar(EscapeCharacter);
+ putChar(ForwardSlashSequence);
+ }
+ else
+ {
+ putChar(c);
+ }
+ }
+ };
+
+ for (const PathEntry& entry : m_entries)
+ {
+ putChar(PathSeparator);
+ if (entry.IsEndOfArray())
+ {
+ putChar(EndOfArrayCharacter);
+ }
+ else if (entry.IsIndex())
+ {
+ bufferIndex += azsnprintf(&stringBuffer[bufferIndex], bufferSize - bufferIndex, "%zu", entry.GetIndex());
+ }
+ else
+ {
+ writeToBuffer(entry.GetKey().GetCStr());
+ }
+ }
+
+ putChar('\0');
+ }
+
+ AZStd::string Path::ToString() const
+ {
+ AZStd::string formattedString;
+ const size_t size = GetStringLength();
+ formattedString.resize_no_construct(size);
+ FormatString(formattedString.data(), size + 1);
+ return formattedString;
+ }
+
+ void Path::AppendToString(AZStd::string& output) const
+ {
+ const size_t startIndex = output.length();
+ const size_t stringLength = GetStringLength();
+ output.resize_no_construct(startIndex + stringLength);
+ FormatString(output.data() + startIndex, stringLength + 1);
+ }
+
+ void Path::FromString(AZStd::string_view pathString)
+ {
+ m_entries.clear();
+ if (pathString.empty())
+ {
+ return;
+ }
+
+ size_t pathEntryCount = 0;
+ for (size_t i = 1; i <= pathString.size(); ++i)
+ {
+ if (pathString[i] == PathSeparator)
+ {
+ ++pathEntryCount;
+ }
+ }
+ m_entries.reserve(pathEntryCount);
+
+ // Ignore a preceeding path separator and start processing after it
+ size_t pathIndex = pathString[0] == PathSeparator ? 1 : 0;
+ bool isNumber = true;
+ AZStd::string convertedSection;
+ for (size_t i = pathIndex; i <= pathString.size(); ++i)
+ {
+ if (i == pathString.size() || pathString[i] == PathSeparator)
+ {
+ AZStd::string_view section = pathString.substr(pathIndex, i - pathIndex);
+ if (section.size() == 1 && section[0] == EndOfArrayCharacter)
+ {
+ PathEntry entry;
+ entry.SetEndOfArray();
+ m_entries.push_back(AZStd::move(entry));
+ }
+ else if (isNumber && !section.empty())
+ {
+ size_t index = 0;
+ ConsoleTypeHelpers::StringToValue(index, section);
+ m_entries.push_back(PathEntry{ index });
+ }
+ else
+ {
+ convertedSection.clear();
+ size_t lastPos = 0;
+ size_t posToEscape = section.find(EscapeCharacter);
+ while (posToEscape != AZStd::string_view::npos)
+ {
+ if (convertedSection.empty())
+ {
+ convertedSection.reserve(section.size() - 1);
+ }
+ convertedSection += section.substr(lastPos, posToEscape - lastPos);
+ if (section[posToEscape + 1] == ForwardSlashSequence)
+ {
+ convertedSection += '/';
+ }
+ else
+ {
+ convertedSection += '~';
+ }
+
+ lastPos = posToEscape + 2;
+ posToEscape = section.find(EscapeCharacter, posToEscape + 2);
+ }
+
+ if (!convertedSection.empty())
+ {
+ convertedSection += section.substr(lastPos);
+ m_entries.emplace_back(convertedSection);
+ }
+ else
+ {
+ m_entries.emplace_back(section);
+ }
+ }
+ pathIndex = i + 1;
+ isNumber = true;
+ continue;
+ }
+
+ const char c = pathString[i];
+ isNumber = isNumber && c >= '0' && c <= '9';
+ }
+ }
+} // namespace AZ::Dom
diff --git a/Code/Framework/AzCore/AzCore/DOM/DomPath.h b/Code/Framework/AzCore/AzCore/DOM/DomPath.h
new file mode 100644
index 0000000000..39f7c7da98
--- /dev/null
+++ b/Code/Framework/AzCore/AzCore/DOM/DomPath.h
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#pragma once
+
+#include
+#include
+#include
+
+namespace AZ::Dom
+{
+ //! Represents the path to a direct descendant of a Value.
+ //! PathEntry may be one of the following:
+ //! - Index, a numerical index for indexing within Arrays and Nodes
+ //! - Key, a name for indexing within Objects and Nodes
+ //! - EndOfArray, a special-case indicator for representing the end of an array
+ //! used by the patching system to represent push / pop back operations.
+ class PathEntry final
+ {
+ public:
+ static constexpr size_t EndOfArrayIndex = size_t(-1);
+
+ PathEntry() = default;
+ PathEntry(const PathEntry&) = default;
+ PathEntry(PathEntry&&) = default;
+ explicit PathEntry(size_t value);
+ explicit PathEntry(AZ::Name value);
+ explicit PathEntry(AZStd::string_view value);
+
+ PathEntry& operator=(const PathEntry&) = default;
+ PathEntry& operator=(PathEntry&&) = default;
+ PathEntry& operator=(size_t value);
+ PathEntry& operator=(AZ::Name value);
+ PathEntry& operator=(AZStd::string_view value);
+
+ bool operator==(const PathEntry& other) const;
+ bool operator==(size_t index) const;
+ bool operator==(const AZ::Name& key) const;
+ bool operator==(AZStd::string_view key) const;
+ bool operator!=(const PathEntry& other) const;
+ bool operator!=(size_t index) const;
+ bool operator!=(const AZ::Name& key) const;
+ bool operator!=(AZStd::string_view key) const;
+
+ void SetEndOfArray();
+
+ bool IsEndOfArray() const;
+ bool IsIndex() const;
+ bool IsKey() const;
+
+ size_t GetIndex() const;
+ const AZ::Name& GetKey() const;
+
+ private:
+ AZStd::variant m_value;
+ };
+
+ //! Represents a path, represented as a series of PathEntry values, to a position in a Value.
+ class Path final
+ {
+ public:
+ using ContainerType = AZStd::vector;
+ static constexpr char PathSeparator = '/';
+ static constexpr char EscapeCharacter = '~';
+ static constexpr char TildeSequence = '0';
+ static constexpr char ForwardSlashSequence = '1';
+ static constexpr char EndOfArrayCharacter = '-';
+
+ Path() = default;
+ Path(const Path&) = default;
+ Path(Path&&) = default;
+ explicit Path(AZStd::initializer_list init);
+ //! Creates a Path from a path string, a path string is formatted per the JSON pointer specification
+ //! and looks like "/path/to/value/0"
+ explicit Path(AZStd::string_view pathString);
+
+ template
+ explicit Path(InputIterator first, InputIterator last)
+ : m_entries(first, last)
+ {
+ }
+
+ Path& operator=(const Path&) = default;
+ Path& operator=(Path&&) = default;
+
+ Path operator/(const PathEntry&) const;
+ Path operator/(size_t) const;
+ Path operator/(AZ::Name) const;
+ Path operator/(AZStd::string_view) const;
+ Path operator/(const Path&) const;
+
+ Path& operator/=(const PathEntry&);
+ Path& operator/=(size_t);
+ Path& operator/=(AZ::Name);
+ Path& operator/=(AZStd::string_view);
+ Path& operator/=(const Path&);
+
+ bool operator==(const Path&) const;
+
+ const ContainerType& GetEntries() const;
+ void Push(PathEntry entry);
+ void Push(size_t entry);
+ void Push(AZ::Name entry);
+ void Push(AZStd::string_view key);
+ void Pop();
+ void Clear();
+ PathEntry At(size_t index) const;
+ size_t Size() const;
+
+ PathEntry& operator[](size_t index);
+ const PathEntry& operator[](size_t index) const;
+
+ ContainerType::iterator begin();
+ ContainerType::iterator end();
+ ContainerType::const_iterator begin() const;
+ ContainerType::const_iterator end() const;
+ ContainerType::const_iterator cbegin() const;
+ ContainerType::const_iterator cend() const;
+ size_t size() const;
+
+ //! Gets the length this path would require, if string-formatted.
+ //! The length includes the contents of the string but not a null terminator.
+ size_t GetStringLength() const;
+ //! Formats a JSON-pointer style path string into the target buffer.
+ //! This operation will fail if bufferSize < GetStringLength() + 1
+ void FormatString(char* stringBuffer, size_t bufferSize) const;
+ //! Returns a JSON-pointer style path string for this path.
+ AZStd::string ToString() const;
+ void AppendToString(AZStd::string& output) const;
+ //! Reads a JSON-pointer style path from pathString and replaces this path's contents.
+ //! Paths are accepted in the following forms:
+ //! "/path/to/foo/0"
+ //! "path/to/foo/0"
+ void FromString(AZStd::string_view pathString);
+
+ private:
+ ContainerType m_entries;
+ };
+} // namespace AZ::Dom
diff --git a/Code/Framework/AzCore/AzCore/DOM/DomUtils.cpp b/Code/Framework/AzCore/AzCore/DOM/DomUtils.cpp
index c604373296..bc5c2b28cf 100644
--- a/Code/Framework/AzCore/AzCore/DOM/DomUtils.cpp
+++ b/Code/Framework/AzCore/AzCore/DOM/DomUtils.cpp
@@ -77,8 +77,8 @@ namespace AZ::Dom::Utils
for (size_t i = 0; i < ourValues.size(); ++i)
{
const Object::EntryType& lhsChild = ourValues[i];
- const Object::EntryType& rhsChild = theirValues[i];
- if (lhsChild.first != rhsChild.first || !DeepCompareIsEqual(lhsChild.second, rhsChild.second))
+ auto rhsIt = rhs.FindMember(lhsChild.first);
+ if (rhsIt == rhs.MemberEnd() || !DeepCompareIsEqual(lhsChild.second, rhsIt->second))
{
return false;
}
@@ -144,8 +144,8 @@ namespace AZ::Dom::Utils
for (size_t i = 0; i < ourProperties.size(); ++i)
{
const Object::EntryType& lhsChild = ourProperties[i];
- const Object::EntryType& rhsChild = theirProperties[i];
- if (lhsChild.first != rhsChild.first || !DeepCompareIsEqual(lhsChild.second, rhsChild.second))
+ auto rhsIt = rhs.FindMember(lhsChild.first);
+ if (rhsIt == rhs.MemberEnd() || !DeepCompareIsEqual(lhsChild.second, rhsIt->second))
{
return false;
}
diff --git a/Code/Framework/AzCore/AzCore/DOM/DomValue.cpp b/Code/Framework/AzCore/AzCore/DOM/DomValue.cpp
index 6d944c9f45..793fadd092 100644
--- a/Code/Framework/AzCore/AzCore/DOM/DomValue.cpp
+++ b/Code/Framework/AzCore/AzCore/DOM/DomValue.cpp
@@ -6,6 +6,7 @@
*
*/
+#include
#include
#include
#include
@@ -283,64 +284,33 @@ namespace AZ::Dom
Type Dom::Value::GetType() const
{
- return AZStd::visit(
- [](auto&& value) -> Type
- {
- using CurrentType = AZStd::decay_t;
- if constexpr (AZStd::is_same_v)
- {
- return Type::Null;
- }
- else if constexpr (AZStd::is_same_v)
- {
- return Type::Int64;
- }
- else if constexpr (AZStd::is_same_v)
- {
- return Type::Uint64;
- }
- else if constexpr (AZStd::is_same_v)
- {
- return Type::Double;
- }
- else if constexpr (AZStd::is_same_v)
- {
- return Type::Bool;
- }
- else if constexpr (AZStd::is_same_v)
- {
- return Type::String;
- }
- else if constexpr (AZStd::is_same_v)
- {
- return Type::String;
- }
- else if constexpr (AZStd::is_same_v)
- {
- return Type::String;
- }
- else if constexpr (AZStd::is_same_v)
- {
- return Type::Object;
- }
- else if constexpr (AZStd::is_same_v)
- {
- return Type::Array;
- }
- else if constexpr (AZStd::is_same_v)
- {
- return Type::Node;
- }
- else if constexpr (AZStd::is_same_v)
- {
- return Type::Opaque;
- }
- else
- {
- AZ_Assert(false, "AZ::Dom::Value::GetType: m_value has an unexpected type");
- }
- },
- m_value);
+ switch (m_value.index())
+ {
+ case GetTypeIndex():
+ return Type::Null;
+ case GetTypeIndex():
+ return Type::Int64;
+ case GetTypeIndex():
+ return Type::Uint64;
+ case GetTypeIndex():
+ return Type::Double;
+ case GetTypeIndex():
+ return Type::Bool;
+ case GetTypeIndex():
+ case GetTypeIndex():
+ case GetTypeIndex():
+ return Type::String;
+ case GetTypeIndex():
+ return Type::Object;
+ case GetTypeIndex():
+ return Type::Array;
+ case GetTypeIndex():
+ return Type::Node;
+ case GetTypeIndex>():
+ return Type::Opaque;
+ }
+ AZ_Assert(false, "AZ::Dom::Value::GetType: m_value has an unexpected type");
+ return Type::Null;
}
bool Value::IsNull() const
@@ -594,12 +564,12 @@ namespace AZ::Dom
return GetObjectInternal().end();
}
- Object::Iterator Value::MemberBegin()
+ Object::Iterator Value::MutableMemberBegin()
{
return GetObjectInternal().begin();
}
- Object::Iterator Value::MemberEnd()
+ Object::Iterator Value::MutableMemberEnd()
{
return GetObjectInternal().end();
}
@@ -725,12 +695,12 @@ namespace AZ::Dom
return object.end();
}
- Object::Iterator Value::EraseMember(Object::ConstIterator pos)
+ Object::Iterator Value::EraseMember(Object::Iterator pos)
{
return GetObjectInternal().erase(pos);
}
- Object::Iterator Value::EraseMember(Object::ConstIterator first, Object::ConstIterator last)
+ Object::Iterator Value::EraseMember(Object::Iterator first, Object::Iterator last)
{
return GetObjectInternal().erase(first, last);
}
@@ -811,12 +781,12 @@ namespace AZ::Dom
return GetArrayInternal().end();
}
- Array::Iterator Value::ArrayBegin()
+ Array::Iterator Value::MutableArrayBegin()
{
return GetArrayInternal().begin();
}
- Array::Iterator Value::ArrayEnd()
+ Array::Iterator Value::MutableArrayEnd()
{
return GetArrayInternal().end();
}
@@ -843,12 +813,12 @@ namespace AZ::Dom
return *this;
}
- Array::Iterator Value::ArrayErase(Array::ConstIterator pos)
+ Array::Iterator Value::ArrayErase(Array::Iterator pos)
{
return GetArrayInternal().erase(pos);
}
- Array::Iterator Value::ArrayErase(Array::ConstIterator first, Array::ConstIterator last)
+ Array::Iterator Value::ArrayErase(Array::Iterator first, Array::Iterator last)
{
return GetArrayInternal().erase(first, last);
}
@@ -1113,6 +1083,10 @@ namespace AZ::Dom
{
result = visitor.RefCountedString(arg, copyStrings ? Lifetime::Temporary : Lifetime::Persistent);
}
+ else if constexpr (AZStd::is_same_v)
+ {
+ result = visitor.String(arg, copyStrings ? Lifetime::Temporary : Lifetime::Persistent);
+ }
else if constexpr (AZStd::is_same_v)
{
result = visitor.StartObject();
@@ -1204,4 +1178,124 @@ namespace AZ::Dom
{
return m_value;
}
+
+ Value& Value::operator[](const PathEntry& entry)
+ {
+ if (entry.IsEndOfArray())
+ {
+ Array::ContainerType& array = GetArrayInternal();
+ array.push_back();
+ return array[array.size() - 1];
+ }
+ return entry.IsIndex() ? operator[](entry.GetIndex()) : operator[](entry.GetKey());
+ }
+
+ const Value& Value::operator[](const PathEntry& entry) const
+ {
+ return entry.IsIndex() ? operator[](entry.GetIndex()) : operator[](entry.GetKey());
+ }
+
+ Value& Value::operator[](const Path& path)
+ {
+ Value* value = this;
+ for (const PathEntry& entry : path)
+ {
+ value = &value->operator[](entry);
+ }
+ return *value;
+ }
+
+ const Value& Value::operator[](const Path& path) const
+ {
+ const Value* value = this;
+ for (const PathEntry& entry : path)
+ {
+ value = &value->operator[](entry);
+ }
+ return *value;
+ }
+
+ const Value* Value::FindChild(const PathEntry& entry) const
+ {
+ if (entry.IsEndOfArray())
+ {
+ return nullptr;
+ }
+ else if (entry.IsIndex())
+ {
+ const Array::ContainerType& array = GetArrayInternal();
+ const size_t index = entry.GetIndex();
+ if (index < array.size())
+ {
+ return &array[index];
+ }
+ }
+ else
+ {
+ const Object::ContainerType& obj = GetObjectInternal();
+ auto memberIt = FindMember(entry.GetKey());
+ if (memberIt != obj.end())
+ {
+ return &memberIt->second;
+ }
+ }
+ return nullptr;
+ }
+
+ Value* Value::FindMutableChild(const PathEntry& entry)
+ {
+ if (entry.IsEndOfArray())
+ {
+ Array::ContainerType& array = GetArrayInternal();
+ array.push_back();
+ return &array[array.size() - 1];
+ }
+ else if (entry.IsIndex())
+ {
+ Array::ContainerType& array = GetArrayInternal();
+ const size_t index = entry.GetIndex();
+ if (index < array.size())
+ {
+ return &array[index];
+ }
+ }
+ else
+ {
+ Object::ContainerType& obj = GetObjectInternal();
+ auto memberIt = FindMutableMember(entry.GetKey());
+ if (memberIt != obj.end())
+ {
+ return &memberIt->second;
+ }
+ }
+ return nullptr;
+ }
+
+ const Value* Value::FindChild(const Path& path) const
+ {
+ const Value* value = this;
+ for (const PathEntry& entry : path)
+ {
+ value = value->FindChild(entry);
+ if (value == nullptr)
+ {
+ return nullptr;
+ }
+ }
+ return value;
+ }
+
+ Value* Value::FindMutableChild(const Path& path)
+ {
+ Value* value = this;
+ for (const PathEntry& entry : path)
+ {
+ value = value->FindMutableChild(entry);
+ if (value == nullptr)
+ {
+ return nullptr;
+ }
+ }
+ return value;
+ }
} // namespace AZ::Dom
diff --git a/Code/Framework/AzCore/AzCore/DOM/DomValue.h b/Code/Framework/AzCore/AzCore/DOM/DomValue.h
index ecf8326525..be5d855003 100644
--- a/Code/Framework/AzCore/AzCore/DOM/DomValue.h
+++ b/Code/Framework/AzCore/AzCore/DOM/DomValue.h
@@ -22,6 +22,8 @@
namespace AZ::Dom
{
+ class PathEntry;
+ class Path;
using KeyType = AZ::Name;
//! The type of underlying value stored in a value. \see Value
@@ -268,8 +270,8 @@ namespace AZ::Dom
Object::ConstIterator MemberBegin() const;
Object::ConstIterator MemberEnd() const;
- Object::Iterator MemberBegin();
- Object::Iterator MemberEnd();
+ Object::Iterator MutableMemberBegin();
+ Object::Iterator MutableMemberEnd();
Object::Iterator FindMutableMember(KeyType name);
Object::Iterator FindMutableMember(AZStd::string_view name);
@@ -289,8 +291,8 @@ namespace AZ::Dom
void RemoveMember(KeyType name);
void RemoveMember(AZStd::string_view name);
Object::Iterator RemoveMember(Object::Iterator pos);
- Object::Iterator EraseMember(Object::ConstIterator pos);
- Object::Iterator EraseMember(Object::ConstIterator first, Object::ConstIterator last);
+ Object::Iterator EraseMember(Object::Iterator pos);
+ Object::Iterator EraseMember(Object::Iterator first, Object::Iterator last);
Object::Iterator EraseMember(KeyType name);
Object::Iterator EraseMember(AZStd::string_view name);
@@ -313,15 +315,15 @@ namespace AZ::Dom
Array::ConstIterator ArrayBegin() const;
Array::ConstIterator ArrayEnd() const;
- Array::Iterator ArrayBegin();
- Array::Iterator ArrayEnd();
+ Array::Iterator MutableArrayBegin();
+ Array::Iterator MutableArrayEnd();
Value& ArrayReserve(size_t newCapacity);
Value& ArrayPushBack(Value value);
Value& ArrayPopBack();
- Array::Iterator ArrayErase(Array::ConstIterator pos);
- Array::Iterator ArrayErase(Array::ConstIterator first, Array::ConstIterator last);
+ Array::Iterator ArrayErase(Array::Iterator pos);
+ Array::Iterator ArrayErase(Array::Iterator first, Array::Iterator last);
Array::ContainerType& GetMutableArray();
const Array::ContainerType& GetArray() const;
@@ -380,6 +382,17 @@ namespace AZ::Dom
Visitor::Result Accept(Visitor& visitor, bool copyStrings) const;
AZStd::unique_ptr GetWriteHandler();
+ // Path API...
+ Value& operator[](const PathEntry& entry);
+ const Value& operator[](const PathEntry& entry) const;
+ Value& operator[](const Path& path);
+ const Value& operator[](const Path& path) const;
+
+ const Value* FindChild(const PathEntry& entry) const;
+ Value* FindMutableChild(const PathEntry& entry);
+ const Value* FindChild(const Path& path) const;
+ Value* FindMutableChild(const Path& path);
+
//! Gets the internal value of this Value. Note that this value's types may not correspond one-to-one with the Type enumeration,
//! as internally the same type might have different storage mechanisms. Where possible, prefer using the typed API.
const ValueType& GetInternalValue() const;
diff --git a/Code/Framework/AzCore/AzCore/EBus/EBus.h b/Code/Framework/AzCore/AzCore/EBus/EBus.h
index 67cffb4e41..4ab4f9a76c 100644
--- a/Code/Framework/AzCore/AzCore/EBus/EBus.h
+++ b/Code/Framework/AzCore/AzCore/EBus/EBus.h
@@ -23,6 +23,11 @@
#include
#include
+ // Included for backwards compatibility purposes
+#include
+#include
+#include
+
#include
#include
@@ -515,7 +520,7 @@ namespace AZ
* This is not EBus Context Mutex when LocklessDispatch is set
*/
template
- using DispatchLockGuard = typename ImplTraits::template DispatchLockGuard;
+ using DispatchLockGuardTemplate = typename ImplTraits::template DispatchLockGuard;
//////////////////////////////////////////////////////////////////////////
// Check to help identify common mistakes
@@ -645,7 +650,7 @@ namespace AZ
* during broadcast/event dispatch.
* @see EBusTraits::LocklessDispatch
*/
- using DispatchLockGuard = DispatchLockGuard;
+ using DispatchLockGuard = DispatchLockGuardTemplate;
/**
* The scoped lock guard to use during connection. Some specialized policies execute handler methods which
diff --git a/Code/Framework/AzCore/AzCore/EBus/Internal/BusContainer.h b/Code/Framework/AzCore/AzCore/EBus/Internal/BusContainer.h
index 2c57359c67..ce79b93805 100644
--- a/Code/Framework/AzCore/AzCore/EBus/Internal/BusContainer.h
+++ b/Code/Framework/AzCore/AzCore/EBus/Internal/BusContainer.h
@@ -93,14 +93,14 @@ namespace AZ
// This struct will hold the handlers per address
struct HandlerHolder;
// This struct will hold each handler
- using HandlerNode = HandlerNode;
+ using HandlerNode = AZ::Internal::HandlerNode;
// Defines how handler holders are stored (will be some sort of map-like structure from id -> handler holder)
using AddressStorage = AddressStoragePolicy;
// Defines how handlers are stored per address (will be some sort of list)
using HandlerStorage = HandlerStoragePolicy;
using Handler = IdHandler;
- using MultiHandler = MultiHandler;
+ using MultiHandler = AZ::Internal::MultiHandler;
using BusPtr = AZStd::intrusive_ptr;
EBusContainer() = default;
@@ -774,13 +774,13 @@ namespace AZ
// This struct will hold the handler per address
struct HandlerHolder;
// This struct will hold each handler
- using HandlerNode = HandlerNode;
+ using HandlerNode = AZ::Internal::HandlerNode;
// Defines how handler holders are stored (will be some sort of map-like structure from id -> handler holder)
using AddressStorage = AddressStoragePolicy;
// No need for HandlerStorage, there's only 1 so it will always just be a HandlerNode*
using Handler = IdHandler;
- using MultiHandler = MultiHandler;
+ using MultiHandler = AZ::Internal::MultiHandler;
using BusPtr = AZStd::intrusive_ptr;
EBusContainer() = default;
@@ -1316,7 +1316,7 @@ namespace AZ
// This struct will hold the handlers per address
struct HandlerHolder;
// This struct will hold each handler
- using HandlerNode = HandlerNode;
+ using HandlerNode = AZ::Internal::HandlerNode;
// Defines how handlers are stored per address (will be some sort of list)
using HandlerStorage = HandlerStoragePolicy;
// No need for AddressStorage, there's only 1
diff --git a/Code/Framework/AzCore/AzCore/EBus/Internal/CallstackEntry.h b/Code/Framework/AzCore/AzCore/EBus/Internal/CallstackEntry.h
index bcda78aef8..391a0ea18e 100644
--- a/Code/Framework/AzCore/AzCore/EBus/Internal/CallstackEntry.h
+++ b/Code/Framework/AzCore/AzCore/EBus/Internal/CallstackEntry.h
@@ -161,7 +161,7 @@ namespace AZ
template
struct EBusCallstackStorage
{
- AZ_THREAD_LOCAL static C* s_entry;
+ static AZ_THREAD_LOCAL C* s_entry;
EBusCallstackStorage() = default;
~EBusCallstackStorage() = default;
diff --git a/Code/Framework/AzCore/AzCore/IO/Path/Path.inl b/Code/Framework/AzCore/AzCore/IO/Path/Path.inl
index 0dc1799528..ab991e1750 100644
--- a/Code/Framework/AzCore/AzCore/IO/Path/Path.inl
+++ b/Code/Framework/AzCore/AzCore/IO/Path/Path.inl
@@ -13,50 +13,6 @@
#include
-// extern instantiations of Path templates to prevent implicit instantiations
-namespace AZ::IO
-{
- // Class templates explicit declarations
- extern template class BasicPath;
- extern template class BasicPath;
- extern template class PathIterator;
- extern template class PathIterator;
- extern template class PathIterator;
-
- // Swap function explicit declarations
- extern template void swap(Path& lhs, Path& rhs) noexcept;
- extern template void swap(FixedMaxPath& lhs, FixedMaxPath& rhs) noexcept;
-
- // Hash function explicit declarations
- extern template size_t hash_value(const Path& pathToHash);
- extern template size_t hash_value(const FixedMaxPath& pathToHash);
-
- // Append operator explicit declarations
- extern template BasicPath operator/(const BasicPath& lhs, const PathView& rhs);
- extern template BasicPath operator/(const BasicPath& lhs, const PathView& rhs);
- extern template BasicPath operator/(const BasicPath& lhs, AZStd::string_view rhs);
- extern template BasicPath operator/(const BasicPath& lhs, AZStd::string_view rhs);
- extern template BasicPath operator/(const BasicPath& lhs,
- const typename BasicPath::value_type* rhs);
- extern template BasicPath operator/(const BasicPath& lhs,
- const typename BasicPath::value_type* rhs);
-
- // Iterator compare explicit declarations
- extern template bool operator==(const PathIterator& lhs,
- const PathIterator& rhs);
- extern template bool operator==(const PathIterator& lhs,
- const PathIterator& rhs);
- extern template bool operator==(const PathIterator& lhs,
- const PathIterator& rhs);
- extern template bool operator!=(const PathIterator& lhs,
- const PathIterator& rhs);
- extern template bool operator!=(const PathIterator& lhs,
- const PathIterator& rhs);
- extern template bool operator!=(const PathIterator& lhs,
- const PathIterator& rhs);
-}
-
-
//! PathView implementation
namespace AZ::IO
{
@@ -939,13 +895,13 @@ namespace AZ::IO
// then it has no root directory nor filename
if (rootNameView.end() == m_path.end())
{
- // has_root_directory || has_filename = false
- // If the root name is of the form
- // # C: - then it isn't absolute unless it has a root directory C:\
- // # \\?\ = is a UNC path that can't exist without a root directory
- // # \\server - Is absolute, but has no root directory
- // Therefore if the rootName is larger than three characters
- // then append the path separator
+ /* has_root_directory || has_filename = false
+ If the root name is of the form
+ C: - then it isn't absolute unless it has a root directory C:\.
+ \\?\ = is a UNC path that can't exist without a root directory.
+ \\server - Is absolute, but has no root directory.
+ Therefore if the rootName is larger than three characters
+ then append the path separator. */
if (rootNameView.size() >= 3)
{
m_path.push_back(m_preferred_separator);
@@ -1550,3 +1506,39 @@ namespace AZ::IO
return AZStd::hash{}(pathToHash);
}
}
+
+// extern instantiations of Path templates to prevent implicit instantiations
+namespace AZ::IO
+{
+ // Swap function explicit declarations
+ extern template void swap(Path& lhs, Path& rhs) noexcept;
+ extern template void swap(FixedMaxPath& lhs, FixedMaxPath& rhs) noexcept;
+
+ // Hash function explicit declarations
+ extern template size_t hash_value(const Path& pathToHash);
+ extern template size_t hash_value(const FixedMaxPath& pathToHash);
+
+ // Append operator explicit declarations
+ extern template BasicPath operator/(const BasicPath& lhs, const PathView& rhs);
+ extern template BasicPath operator/(const BasicPath& lhs, const PathView& rhs);
+ extern template BasicPath operator/(const BasicPath& lhs, AZStd::string_view rhs);
+ extern template BasicPath operator/(const BasicPath& lhs, AZStd::string_view rhs);
+ extern template BasicPath operator/(const BasicPath& lhs,
+ const typename BasicPath::value_type* rhs);
+ extern template BasicPath operator/(const BasicPath& lhs,
+ const typename BasicPath::value_type* rhs);
+
+ // Iterator compare explicit declarations
+ extern template bool operator==(const PathIterator& lhs,
+ const PathIterator& rhs);
+ extern template bool operator==(const PathIterator& lhs,
+ const PathIterator& rhs);
+ extern template bool operator==(const PathIterator& lhs,
+ const PathIterator& rhs);
+ extern template bool operator!=(const PathIterator& lhs,
+ const PathIterator& rhs);
+ extern template bool operator!=(const PathIterator& lhs,
+ const PathIterator& rhs);
+ extern template bool operator!=(const PathIterator& lhs,
+ const PathIterator& rhs);
+}
diff --git a/Code/Framework/AzCore/AzCore/Math/MathIntrinsics.h b/Code/Framework/AzCore/AzCore/Math/MathIntrinsics.h
index 7b731a12b2..32441aaa32 100644
--- a/Code/Framework/AzCore/AzCore/Math/MathIntrinsics.h
+++ b/Code/Framework/AzCore/AzCore/Math/MathIntrinsics.h
@@ -14,7 +14,7 @@
#define az_clz_u64(x) _lzcnt_u64(x)
#define az_popcnt_u32(x) __popcnt(x)
#define az_popcnt_u64(x) __popcnt64(x)
-#elif defined(AZ_COMPILER_CLANG)
+#elif defined(AZ_COMPILER_CLANG) || defined(AZ_COMPILER_GCC)
#define az_ctz_u32(x) __builtin_ctz(x)
#define az_ctz_u64(x) __builtin_ctzll(x)
#define az_clz_u32(x) __builtin_clz(x)
@@ -22,5 +22,5 @@
#define az_popcnt_u32(x) __builtin_popcount(x)
#define az_popcnt_u64(x) __builtin_popcountll(x)
#else
- #error Count Leading Zeros, Count Trailing Zeros and Pop Count intrinsics isn't supported for this compiler
+ #error Count Leading Zeros, Count Trailing Zeros and Pop Count intrinsics isnt supported for this compiler
#endif
diff --git a/Code/Framework/AzCore/AzCore/Memory/AllocatorManager.h b/Code/Framework/AzCore/AzCore/Memory/AllocatorManager.h
index 14dec68ad1..50afce929a 100644
--- a/Code/Framework/AzCore/AzCore/Memory/AllocatorManager.h
+++ b/Code/Framework/AzCore/AzCore/Memory/AllocatorManager.h
@@ -39,6 +39,9 @@ namespace AZ
template constexpr friend void AZStd::destroy_at(T*);
public:
+
+ AllocatorManager();
+
typedef AZStd::function OutOfMemoryCBType;
static void PreRegisterAllocator(IAllocator* allocator); // Only call if the environment is not yet attached
@@ -185,7 +188,6 @@ namespace AZ
AZ::Debug::AllocationRecords::Mode m_defaultTrackingRecordMode;
AZStd::unique_ptr m_mallocSchema;
- AllocatorManager();
~AllocatorManager();
static AllocatorManager g_allocMgr; ///< The single instance of the allocator manager
diff --git a/Code/Framework/AzCore/AzCore/Name/NameDictionary.h b/Code/Framework/AzCore/AzCore/Name/NameDictionary.h
index 8f9af4be3a..3df05f04b5 100644
--- a/Code/Framework/AzCore/AzCore/Name/NameDictionary.h
+++ b/Code/Framework/AzCore/AzCore/Name/NameDictionary.h
@@ -45,7 +45,9 @@ namespace AZ
//! that already exist.
class NameDictionary final
{
+ public:
AZ_CLASS_ALLOCATOR(NameDictionary, AZ::OSAllocator, 0);
+ private:
friend Module;
friend Name;
@@ -75,8 +77,8 @@ namespace AZ
//! @return A Name instance. If the hash was not found, the Name will be empty.
Name FindName(Name::Hash hash) const;
- private:
NameDictionary();
+ private:
~NameDictionary();
void ReportStats() const;
diff --git a/Code/Framework/AzCore/AzCore/PlatformDef.h b/Code/Framework/AzCore/AzCore/PlatformDef.h
index 7f00f7e90e..8609ad5756 100644
--- a/Code/Framework/AzCore/AzCore/PlatformDef.h
+++ b/Code/Framework/AzCore/AzCore/PlatformDef.h
@@ -10,10 +10,17 @@
//////////////////////////////////////////////////////////////////////////
// Platforms
+#include
+
#include "PlatformRestrictedFileDef.h"
#if defined(__clang__)
#define AZ_COMPILER_CLANG __clang_major__
+#elif defined(__GNUC__)
+ // Assign AZ_COMPILER_GCC to a number that represents the major+minor (2 digits) + path level (2 digits) i.e. 3.2.0 == 30200
+ #define AZ_COMPILER_GCC (__GNUC__ * 10000 \
+ + __GNUC_MINOR__ * 100 \
+ + __GNUC_PATCHLEVEL__)
#elif defined(_MSC_VER)
#define AZ_COMPILER_MSVC _MSC_VER
#else
@@ -29,7 +36,7 @@
#define AZ_DYNAMIC_LIBRARY_PREFIX AZ_TRAIT_OS_DYNAMIC_LIBRARY_PREFIX
#define AZ_DYNAMIC_LIBRARY_EXTENSION AZ_TRAIT_OS_DYNAMIC_LIBRARY_EXTENSION
-#if defined(AZ_COMPILER_CLANG)
+#if defined(AZ_COMPILER_CLANG) || defined(AZ_COMPILER_GCC)
#define AZ_DLL_EXPORT AZ_TRAIT_OS_DLL_EXPORT_CLANG
#define AZ_DLL_IMPORT AZ_TRAIT_OS_DLL_IMPORT_CLANG
#elif defined(AZ_COMPILER_MSVC)
@@ -67,12 +74,36 @@
#if defined(AZ_COMPILER_MSVC)
/// Disables a warning using push style. For use matched with an AZ_POP_WARNING
-#define AZ_PUSH_DISABLE_WARNING(_msvcOption, __) \
- __pragma(warning(push)) \
+
+// Compiler specific AZ_PUSH_DISABLE_WARNING
+#define AZ_PUSH_DISABLE_WARNING_MSVC(_msvcOption) \
+ __pragma(warning(push)) \
+ __pragma(warning(disable : _msvcOption))
+#define AZ_PUSH_DISABLE_WARNING_CLANG(_clangOption)
+#define AZ_PUSH_DISABLE_WARNING_GCC(_gccOption)
+
+/// Compiler specific AZ_POP_DISABLE_WARNING. This needs to be matched with the compiler specific AZ_PUSH_DISABLE_WARNINGs
+#define AZ_POP_DISABLE_WARNING_CLANG
+#define AZ_POP_DISABLE_WARNING_MSVC \
+ __pragma(warning(pop))
+#define AZ_POP_DISABLE_WARNING_GCC
+
+
+// Variadic definitions for AZ_PUSH_DISABLE_WARNING for the current compiler
+#define AZ_PUSH_DISABLE_WARNING_1(_msvcOption) \
+ __pragma(warning(push)) \
+ __pragma(warning(disable : _msvcOption))
+
+#define AZ_PUSH_DISABLE_WARNING_2(_msvcOption, _2) \
+ __pragma(warning(push)) \
+ __pragma(warning(disable : _msvcOption))
+
+#define AZ_PUSH_DISABLE_WARNING_3(_msvcOption, _2, _3) \
+ __pragma(warning(push)) \
__pragma(warning(disable : _msvcOption))
/// Pops the warning stack. For use matched with an AZ_PUSH_DISABLE_WARNING
-#define AZ_POP_DISABLE_WARNING \
+#define AZ_POP_DISABLE_WARNING \
__pragma(warning(pop))
@@ -94,17 +125,62 @@
# define AZ_FUNCTION_SIGNATURE __FUNCSIG__
//////////////////////////////////////////////////////////////////////////
-#elif defined(AZ_COMPILER_CLANG)
+#elif defined(AZ_COMPILER_CLANG) || defined(AZ_COMPILER_GCC)
+
+#if defined(AZ_COMPILER_CLANG)
/// Disables a single warning using push style. For use matched with an AZ_POP_WARNING
-#define AZ_PUSH_DISABLE_WARNING(__, _clangOption) \
- _Pragma("clang diagnostic push") \
+
+// Compiler specific AZ_PUSH_DISABLE_WARNING
+#define AZ_PUSH_DISABLE_WARNING_CLANG(_clangOption) \
+ _Pragma("clang diagnostic push") \
_Pragma(AZ_STRINGIZE(clang diagnostic ignored _clangOption))
+#define AZ_PUSH_DISABLE_WARNING_MSVC(_msvcOption)
+#define AZ_PUSH_DISABLE_WARNING_GCC(_gccOption)
+
+/// Compiler specific AZ_POP_DISABLE_WARNING. This needs to be matched with the compiler specific AZ_PUSH_DISABLE_WARNINGs
+#define AZ_POP_DISABLE_WARNING_CLANG \
+ _Pragma("clang diagnostic pop")
+#define AZ_POP_DISABLE_WARNING_MSVC
+#define AZ_POP_DISABLE_WARNING_GCC
+
+// Variadic definitions for AZ_PUSH_DISABLE_WARNING for the current compiler
+#define AZ_PUSH_DISABLE_WARNING_1(_1)
+#define AZ_PUSH_DISABLE_WARNING_2(_1, _clangOption) AZ_PUSH_DISABLE_WARNING_CLANG(_clangOption)
+#define AZ_PUSH_DISABLE_WARNING_3(_1, _clangOption, _2) AZ_PUSH_DISABLE_WARNING_CLANG(_clangOption)
/// Pops the warning stack. For use matched with an AZ_PUSH_DISABLE_WARNING
#define AZ_POP_DISABLE_WARNING \
_Pragma("clang diagnostic pop")
+#else
+
+/// Disables a single warning using push style. For use matched with an AZ_POP_WARNING
+
+// Compiler specific AZ_PUSH_DISABLE_WARNING
+#define AZ_PUSH_DISABLE_WARNING_GCC(_gccOption) \
+ _Pragma("GCC diagnostic push") \
+ _Pragma(AZ_STRINGIZE(GCC diagnostic ignored _gccOption))
+#define AZ_PUSH_DISABLE_WARNING_CLANG(_clangOption)
+#define AZ_PUSH_DISABLE_WARNING_MSVC(_msvcOption)
+
+/// Compiler specific AZ_POP_DISABLE_WARNING. This needs to be matched with the compiler specific AZ_PUSH_DISABLE_WARNINGs
+#define AZ_POP_DISABLE_WARNING_CLANG
+#define AZ_POP_DISABLE_WARNING_MSVC
+#define AZ_POP_DISABLE_WARNING_GCC \
+ _Pragma("GCC diagnostic pop")
+
+// Variadic definitions for AZ_PUSH_DISABLE_WARNING for the current compiler
+#define AZ_PUSH_DISABLE_WARNING_1(_1)
+#define AZ_PUSH_DISABLE_WARNING_2(_1, _2)
+#define AZ_PUSH_DISABLE_WARNING_3(_1, _2, _gccOption) AZ_PUSH_DISABLE_WARNING_GCC(_gccOption)
+
+/// Pops the warning stack. For use matched with an AZ_PUSH_DISABLE_WARNING
+#define AZ_POP_DISABLE_WARNING
+ _Pragma("GCC diagnostic pop")
+
+#endif // defined(AZ_COMPILER_CLANG)
+
#define AZ_PUSH_DISABLE_DLL_EXPORT_BASECLASS_WARNING
#define AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING
#define AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING
@@ -121,6 +197,8 @@
#error Compiler not supported
#endif
+#define AZ_PUSH_DISABLE_WARNING(...) AZ_MACRO_SPECIALIZE(AZ_PUSH_DISABLE_WARNING_, AZ_VA_NUM_ARGS(__VA_ARGS__), (__VA_ARGS__))
+
// We need to define AZ_DEBUG_BUILD in debug mode. We can also define it in debug optimized mode (left up to the user).
// note that _DEBUG is not in fact always defined on all platforms, and only AZ_DEBUG_BUILD should be relied on.
#if !defined(AZ_DEBUG_BUILD) && defined(_DEBUG)
diff --git a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h
index 7f48f301aa..0f7470eb39 100644
--- a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h
+++ b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h
@@ -1541,7 +1541,7 @@ namespace AZ
}
template
- static bool SetClassEqualityComparer(BehaviorClass* behaviorClass, const T*)
+ static void SetClassEqualityComparer(BehaviorClass* behaviorClass, const T*)
{
behaviorClass->m_equalityComparer = &DefaultEqualityComparer;
}
@@ -2341,8 +2341,6 @@ namespace AZ
// For some reason the Script.cpp test validates that an incomplete type can be used with the SetResult struct
template
static constexpr bool IsCopyAssignable = false;
- template
- static constexpr bool IsCopyAssignable() = AZStd::declval())>> = true;
template
static bool Set(BehaviorValueParameter& param, T&& result, bool IsValueCopy)
@@ -2402,6 +2400,9 @@ namespace AZ
}
};
+ template
+ constexpr bool SetResult::IsCopyAssignable() = AZStd::declval())>> = true;
+
AZ_FORCE_INLINE BehaviorValueParameter& BehaviorValueParameter::operator=(BehaviorValueParameter&& other)
{
*static_cast(this) = AZStd::move(static_cast(other));
diff --git a/Code/Framework/AzCore/AzCore/RTTI/RTTI.h b/Code/Framework/AzCore/AzCore/RTTI/RTTI.h
index acf6f64f77..e8ccaa79cf 100644
--- a/Code/Framework/AzCore/AzCore/RTTI/RTTI.h
+++ b/Code/Framework/AzCore/AzCore/RTTI/RTTI.h
@@ -977,26 +977,32 @@ namespace AZ
{
return AzGenericTypeInfo::Uuid();
}
-
+
+ #if defined(AZ_COMPILER_MSVC)
+ // There is a bug with the MSVC compiler when using the 'auto' keyword here. It appears that MSVC is unable to distinguish between a template
+ // template argument with a type variadic pack vs a template template argument with a non-type auto variadic pack.
template class U, typename = void>
+ #else
+ template class U, typename = void>
+ #endif // defined(AZ_COMPILER_MSVC)
inline const AZ::TypeId& RttiTypeId()
{
return AzGenericTypeInfo::Uuid();
}
- template class U, typename = void>
+ template class U, typename = void>
inline const AZ::TypeId& RttiTypeId()
{
return AzGenericTypeInfo::Uuid();
}
- template class U, typename = void>
+ template class U, typename = void>
inline const AZ::TypeId& RttiTypeId()
{
return AzGenericTypeInfo::Uuid();
}
- template class U, typename = void>
+ template class U, typename = void>
inline const AZ::TypeId& RttiTypeId()
{
return AzGenericTypeInfo::Uuid();
@@ -1027,15 +1033,22 @@ namespace AZ
}
// Returns true if the type is contained, otherwise false. Safe to call for type not supporting AZRtti (returns false unless type fully match).
+
+#if defined(AZ_COMPILER_MSVC)
+ // There is a bug with the MSVC compiler when using the 'auto' keyword here. It appears that MSVC is unable to distinguish between a template
+ // template argument with a type variadic pack vs a template template argument with a non-type auto variadic pack.
template class T, class U>
- inline bool RttiIsTypeOf(const U&)
+#else
+ template class T, class U>
+#endif // defined(AZ_COMPILER_MSVC)
+ inline bool RttiIsTypeOf(const U&)
{
using CheckType = typename AZ::Internal::RttiRemoveQualifiers::type;
return AzGenericTypeInfo::Uuid() == RttiTypeId();
}
// Returns true if the type is contained, otherwise false. Safe to call for type not supporting AZRtti (returns false unless type fully match).
- template class T, class U>
+ template class T, class U>
inline bool RttiIsTypeOf(const U&)
{
using CheckType = typename AZ::Internal::RttiRemoveQualifiers::type;
@@ -1043,7 +1056,7 @@ namespace AZ
}
// Returns true if the type is contained, otherwise false.Safe to call for type not supporting AZRtti(returns false unless type fully match).
- template class T, class U>
+ template class T, class U>
inline bool RttiIsTypeOf(const U&)
{
using CheckType = typename AZ::Internal::RttiRemoveQualifiers::type;
@@ -1051,7 +1064,7 @@ namespace AZ
}
// Returns true if the type is contained, otherwise false.Safe to call for type not supporting AZRtti(returns false unless type fully match).
- template class T, class U>
+ template class T, class U>
inline bool RttiIsTypeOf(const U&)
{
using CheckType = typename AZ::Internal::RttiRemoveQualifiers::type;
diff --git a/Code/Framework/AzCore/AzCore/RTTI/TypeInfo.h b/Code/Framework/AzCore/AzCore/RTTI/TypeInfo.h
index 022025a3df..2cff17a638 100644
--- a/Code/Framework/AzCore/AzCore/RTTI/TypeInfo.h
+++ b/Code/Framework/AzCore/AzCore/RTTI/TypeInfo.h
@@ -148,11 +148,18 @@ namespace AZ
{
/// Needs to match declared parameter type.
template class> constexpr bool false_v1 = false;
- template class> constexpr bool false_v2 = false;
- template class> constexpr bool false_v3 = false;
- template class> constexpr bool false_v4 = false;
- template class> constexpr bool false_v5 = false;
- template class> constexpr bool false_v6 = false;
+#if defined(AZ_COMPILER_MSVC)
+ // There is a bug with the MSVC compiler when using the 'auto' keyword here. It appears that MSVC is unable to distinguish between a template
+ // template argument with a type variadic pack vs a template template argument with a non-type auto variadic pack.
+ template class> constexpr bool false_v2 = false;
+#else
+ template class> constexpr bool false_v2 = false;
+#endif // defined(AZ_COMPILER_MSVC)
+ template class>
+ constexpr bool false_v3 = false;
+ template class> constexpr bool false_v4 = false;
+ template class> constexpr bool false_v5 = false;
+ template class> constexpr bool false_v6 = false;
template
inline const AZ::TypeId& Uuid()
@@ -167,8 +174,13 @@ namespace AZ
static const AZ::TypeId s_uuid = AZ::TypeId::CreateNull();
return s_uuid;
}
-
+#if defined(AZ_COMPILER_MSVC)
+ // There is a bug with the MSVC compiler when using the 'auto' keyword here. It appears that MSVC is unable to distinguish between a template
+ // template argument with a type variadic pack vs a template template argument with a non-type auto variadic pack.
template class T>
+#else
+ template class T>
+#endif // defined(AZ_COMPILER_MSVC)
inline const AZ::TypeId& Uuid()
{
static_assert(false_v2, "Missing specialization for this template. Make sure it's registered for type info support.");
@@ -176,7 +188,8 @@ namespace AZ
return s_uuid;
}
- template class T>
+
+ template class T>
inline const AZ::TypeId& Uuid()
{
static_assert(false_v3, "Missing specialization for this template. Make sure it's registered for type info support.");
@@ -184,7 +197,7 @@ namespace AZ
return s_uuid;
}
- template class T>
+ template class T>
inline const AZ::TypeId& Uuid()
{
static_assert(false_v4, "Missing specialization for this template. Make sure it's registered for type info support.");
@@ -192,7 +205,7 @@ namespace AZ
return s_uuid;
}
- template class T>
+ template class T>
inline const AZ::TypeId& Uuid()
{
static_assert(false_v5, "Missing specialization for this template. Make sure it's registered for type info support.");
@@ -200,7 +213,7 @@ namespace AZ
return s_uuid;
}
- template class T>
+ template class T>
inline const AZ::TypeId& Uuid()
{
static_assert(false_v6, "Missing specialization for this template. Make sure it's registered for type info support.");
@@ -689,8 +702,7 @@ namespace AZ
#define AZ_TYPE_INFO_INTERNAL_CLASS_VARARGS__UUID(Tag, A) AZ::Internal::AggregateTypes< A... >::template Uuid< Tag >()
#define AZ_TYPE_INFO_INTERNAL_CLASS_VARARGS__NAME(A) AZ::Internal::AggregateTypes< A... >::TypeName(typeName, AZ_ARRAY_SIZE(typeName));
-// Once C++17 has been introduced size_t can be replaced with auto for all integer non-type arguments
-#define AZ_TYPE_INFO_INTERNAL_AUTO__TYPE AZStd::size_t
+#define AZ_TYPE_INFO_INTERNAL_AUTO__TYPE auto
#define AZ_TYPE_INFO_INTERNAL_AUTO__ARG(A) A
#define AZ_TYPE_INFO_INTERNAL_AUTO__UUID(Tag, A) AZ::Internal::GetTypeId< A , Tag >()
#define AZ_TYPE_INFO_INTERNAL_AUTO__NAME(A) AZ::Internal::AzTypeInfoSafeCat(typeName, AZ_ARRAY_SIZE(typeName), AZ::Internal::GetTypeName< A >())
diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptContext.h b/Code/Framework/AzCore/AzCore/Script/ScriptContext.h
index 5a7fca704f..a90e62b139 100644
--- a/Code/Framework/AzCore/AzCore/Script/ScriptContext.h
+++ b/Code/Framework/AzCore/AzCore/Script/ScriptContext.h
@@ -796,7 +796,7 @@ namespace AZ
// Note: Always use l over context->NativeContext(), as require may be called from a thread.
using RequireHook = AZStd::function;
- using StackVariableAllocator = StackVariableAllocator;
+ using StackVariableAllocator = AZ::StackVariableAllocator;
/// Stack temporary memory
/**
diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/RegistrationContext.h b/Code/Framework/AzCore/AzCore/Serialization/Json/RegistrationContext.h
index 202efd3749..25a3bfedba 100644
--- a/Code/Framework/AzCore/AzCore/Serialization/Json/RegistrationContext.h
+++ b/Code/Framework/AzCore/AzCore/Serialization/Json/RegistrationContext.h
@@ -69,7 +69,13 @@ namespace AZ
return HandlesTypeId(azrtti_typeid(), overwriteExisting);
}
+#if defined(AZ_COMPILER_MSVC)
+ // There is a bug with the MSVC compiler when using the 'auto' keyword here. It appears that MSVC is unable to distinguish between a template
+ // template argument with a type variadic pack vs a template template argument with a non-type auto variadic pack.
template class T>
+#else
+ template class T>
+#endif // defined(AZ_COMPILER_MSVC)
SerializerBuilder* HandlesType(bool overwriteExisting = false)
{
return HandlesTypeId(azrtti_typeid(), overwriteExisting);
diff --git a/Code/Framework/AzCore/AzCore/UnitTest/TestTypes.h b/Code/Framework/AzCore/AzCore/UnitTest/TestTypes.h
index 0b1d7caefe..db8aaadaa1 100644
--- a/Code/Framework/AzCore/AzCore/UnitTest/TestTypes.h
+++ b/Code/Framework/AzCore/AzCore/UnitTest/TestTypes.h
@@ -17,16 +17,9 @@
#if defined(HAVE_BENCHMARK)
-#if defined(AZ_COMPILER_CLANG)
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-#endif // clang
-
+AZ_PUSH_DISABLE_WARNING(, "-Wdeprecated-declarations", "-Wdeprecated-declarations")
#include
-
-#if defined(AZ_COMPILER_CLANG)
-#pragma clang diagnostic pop
-#endif // clang
+AZ_POP_DISABLE_WARNING
#endif // HAVE_BENCHMARK
diff --git a/Code/Framework/AzCore/AzCore/azcore_files.cmake b/Code/Framework/AzCore/AzCore/azcore_files.cmake
index d25a28aa24..2c0c318648 100644
--- a/Code/Framework/AzCore/AzCore/azcore_files.cmake
+++ b/Code/Framework/AzCore/AzCore/azcore_files.cmake
@@ -9,6 +9,7 @@
set(FILES
base.h
Docs.h
+ variadic.h
Platform.cpp
Platform.h
PlatformDef.h
@@ -115,6 +116,8 @@ set(FILES
Debug/TraceReflection.h
DOM/DomBackend.cpp
DOM/DomBackend.h
+ DOM/DomPath.cpp
+ DOM/DomPath.h
DOM/DomUtils.cpp
DOM/DomUtils.h
DOM/DomValue.cpp
diff --git a/Code/Framework/AzCore/AzCore/base.h b/Code/Framework/AzCore/AzCore/base.h
index f2a64c3224..63a25ed7b1 100644
--- a/Code/Framework/AzCore/AzCore/base.h
+++ b/Code/Framework/AzCore/AzCore/base.h
@@ -7,6 +7,7 @@
*/
#pragma once
+#include
#include ///< Platform/compiler specific defines
#include