diff --git a/.github/ISSUE_TEMPLATE/rfc-feature.md b/.github/ISSUE_TEMPLATE/rfc-feature.md
deleted file mode 100644
index 31a195f803..0000000000
--- a/.github/ISSUE_TEMPLATE/rfc-feature.md
+++ /dev/null
@@ -1,73 +0,0 @@
----
-name: RFC Feature request
-about: Create Feature RFC for this project
-title: Proposed RFC Feature =description=
-labels: 'rfc-feature'
-assignees: ''
-
----
-
-# O3DE RFC Feature Template
-
-### When using this template, you do not have to fill out every question below. The questions are there for guidance.
-
-This RFC feature template should be used for any feature that is not a bug or a substantial reorganization of the O3DE product.
-
-If you submit a pull request to implement a new feature without going through the RFC process, it may be closed with a polite request to submit an RFC first.
-
-A hastily proposed RFC can hurt its chances of acceptance. Low-quality proposals, proposals for previously-rejected features, or those that don't fit into the near-term roadmap may be quickly rejected, demotivating the unprepared contributor. Laying some groundwork ahead of the RFC can make the process smoother.
-
-Although there is no single way to prepare for submitting an RFC, it is generally a good idea to pursue feedback from other project developers beforehand to ascertain that the RFC may be desirable; having a consistent impact on the project requires concerted effort toward consensus-building.
-
-The most common preparations for writing and submitting an RFC include:
-- Talking the idea over on our Discord server.
-- Discussing the topic on our GitHub RFCs discussions page.
-- Occasionally posting "pre-RFCs" on the GitHub RFCs discussion page.
-You may file issues in the RFCs repo for discussion, but these are not actively looked at by the teams.
-
-As a rule of thumb, receiving encouraging feedback from long-standing project developers, and particularly members of the relevant sub-team, is a good indication that the RFC is worth pursuing.
-
-# ----- DELETE EVERYTHING FROM THE TOP TO THE SUMMARY LINE BELOW WHEN USING TEMPLATE ----- #
-
-### Summary:
-Single paragraph explanation of the feature
-
-### What is the relevance of this feature?
-Why is this important? What are the use cases? What will it do once completed?
-
-### Feature design description:
-- Explain the design of the feature with enough detail that someone familiar with the environment and framework can understand the concept and explain it to others.
-- It should include at least one end-to-end example of how a developer will use it along with specific details, including outlying use cases.
-
-- If there is any new terminology, it should be defined here.
-
-### Technical design description:
-- Explain the technical portion of the work in enough detail that members can implement the feature.
-
-- Explain any API or process changes required to implement this feature
-
-- This section should relate to the feature design description by reference and explain in greater detail how it makes the feature design examples work.
-
-- This should also provide detailed information on compatibility with different hardware platforms.
-
-
-### What are the advantages of the feature?
-- Explain the advantages for someone to use this feature
-
-### What are the disadvantages of the feature?
-- Explain any disadvantages for someone to use this feature
-
-### How will this be implemented or integrated into the O3DE environment?
-- Explain how a developer will integrate this into the codebase of O3DE and provide any specific library or technical stack requirements.
-
-### Are there any alternatives to this feature?
-- Provide any other designs that have been considered. Explain what the impact might be of not doing this.
-- If there is any prior art or approaches with other frameworks in the same domain, explain how they may have solved this problem or implemented this feature.
-
-### How will users learn this feature?
-- Detail how it can be best presented and how it is used as an extension or a standalone tool used with O3DE.
-- Explain if and how it may change how individuals would use the platform and if any documentation must be changed or reorganized.
-- Explain how it would be taught to new and existing O3DE users.
-
-### Are there any open questions?
-- What are some of the open questions and potential scenarios that should be considered?
diff --git a/.github/ISSUE_TEMPLATE/rfc-suggestion.md b/.github/ISSUE_TEMPLATE/rfc-suggestion.md
deleted file mode 100644
index 7c51bbc918..0000000000
--- a/.github/ISSUE_TEMPLATE/rfc-suggestion.md
+++ /dev/null
@@ -1,61 +0,0 @@
----
-name: RFC Suggestion request
-about: Create Suggestion RFC for this project
-title: Proposed RFC Suggestion =description=
-labels: 'rfc-suggestion'
-assignees: ''
-
----
-
-# O3DE Suggestion RFC Template
-
-### When using this template, you do not have to fill out every question below. The questions are there for guidance.
-
-This RFC template should be used for any suggestion that is not based upon code or content related to the O3DE product itself. This template is for proposing new process models, approaches, or ideas to improve the O3DE community.
-
-A hastily proposed RFC can hurt its chances of acceptance. Low-quality proposals, proposals for previously rejected features, or those that do not have any substantive value to the project may be quickly rejected, demotivating the unprepared contributor. Laying some groundwork with others in the community ahead of the RFC can make the process much smoother.
-
-Although there is no single way to prepare for submitting an RFC, it is generally a good idea to pursue feedback from other project members beforehand. Keep in mind that you want other members to contribute and back your suggestion, which can drastically improve the chances of implementation.
-
-The most common preparations for writing and submitting an RFC include:
-- Talking the idea over on our Discord server.
-- Creating a discussion on our GitHub RFCs discussions page.
-- Occasionally posting "pre-RFCs" on the GitHub RFCs discussion page.
-You may file issues in the RFCs repo for discussion, but these are not actively looked at by the teams.
-
-As a rule of thumb, receiving encouraging feedback from long-standing community members is a good indication that the RFC is worth pursuing.
-
-# ----- DELETE EVERYTHING FROM THE TOP TO THE SUMMARY LINE BELOW WHEN USING TEMPLATE ----- #
-
-### Summary:
-Single paragraph explanation of the suggestion
-
-### What is the motivation for this suggestion?
-Why is this important?
-What are the use cases for this suggestion?
-What should the outcome be if this suggestion is implemented?
-
-### Suggestion design description:
-- Explain the suggestion with enough detail that someone familiar with the process and environment of the project can understand the suggestion and explain it to others.
-- It should include at least one end-to-end example of how the community will use it along with the specific details with outlying use cases.
-
-- If there is any new terminology, it should be defined here.
-
-### What are the advantages of the suggestion?
-- Explain the advantages of using this suggestion
-
-### What are the disadvantages of the suggestion?
-- Explain any disadvantages or trade-offs to using this suggestion
-
-### How will this be work within the O3DE project?
-- Explain how this suggestion will be work within the O3DE project.
-
-### Are there any alternatives to this suggestion?
-- Provide any other alternative ways that have been considered.
-- Explain what the impact might be of not implementing this suggestion.
-- If there are other similar suggestions previously used, list them and explain which parts may have solved some or all of this problem.
-
-### What is the strategy for adoption?
-- Explain how new and existing users will adopt this suggestion.
-- Point out any efforts needed if it requires coordination with multiple SIGs or other projects.
-- Explain how it would be taught to new and existing O3DE users.
diff --git a/AutomatedTesting/Gem/Code/enabled_gems.cmake b/AutomatedTesting/Gem/Code/enabled_gems.cmake
index b712fec7ab..dd68e379dd 100644
--- a/AutomatedTesting/Gem/Code/enabled_gems.cmake
+++ b/AutomatedTesting/Gem/Code/enabled_gems.cmake
@@ -47,8 +47,7 @@ set(ENABLED_GEMS
LmbrCentral
LyShine
HttpRequestor
- Atom_AtomBridge
- PythonCoverage
+ Atom
AWSCore
AWSClientAuth
AWSMetrics
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py
index 902666ba10..e7c115d4dd 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py
@@ -15,10 +15,7 @@ import ly_test_tools.log.log_monitor
# fixture imports
from AWS.Windows.resource_mappings.resource_mappings import resource_mappings
-from AWS.Windows.cdk.cdk_utils import Cdk
-from AWS.common.aws_utils import AwsUtils
-from assetpipeline.ap_fixtures.asset_processor_fixture import asset_processor as asset_processor
-from AWS.common.aws_credentials import aws_credentials
+from assetpipeline.ap_fixtures.asset_processor_fixture import asset_processor
from .aws_metrics_utils import aws_metrics_utils
AWS_METRICS_FEATURE_NAME = 'AWSMetrics'
@@ -28,7 +25,7 @@ logger = logging.getLogger(__name__)
def setup(launcher: ly_test_tools.launchers.Launcher,
- cdk: Cdk,
+ cdk: pytest.fixture,
asset_processor: asset_processor,
resource_mappings: resource_mappings,
context_variable: str = '') -> typing.Tuple[ly_test_tools.log.log_monitor.LogMonitor, str, str]:
@@ -119,7 +116,7 @@ class TestAWSMetricsWindows(object):
asset_processor: pytest.fixture,
workspace: pytest.fixture,
aws_utils: pytest.fixture,
- aws_credentials: aws_credentials,
+ aws_credentials: pytest.fixture,
resource_mappings: pytest.fixture,
cdk: pytest.fixture,
aws_metrics_utils: aws_metrics_utils,
@@ -162,7 +159,7 @@ class TestAWSMetricsWindows(object):
level: str,
launcher: ly_test_tools.launchers.Launcher,
cdk: pytest.fixture,
- aws_credentials: aws_credentials,
+ aws_credentials: pytest.fixture,
asset_processor: pytest.fixture,
resource_mappings: pytest.fixture,
workspace: pytest.fixture):
@@ -187,7 +184,7 @@ class TestAWSMetricsWindows(object):
level: str,
launcher: ly_test_tools.launchers.Launcher,
cdk: pytest.fixture,
- aws_credentials: aws_credentials,
+ aws_credentials: pytest.fixture,
asset_processor: pytest.fixture,
resource_mappings: pytest.fixture,
aws_utils: pytest.fixture,
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/core/__init__.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/core/__init__.py
new file mode 100644
index 0000000000..e200fa77d0
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/core/__init__.py
@@ -0,0 +1,5 @@
+"""
+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
+"""
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/core/test_aws_resource_interaction.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/core/test_aws_resource_interaction.py
new file mode 100644
index 0000000000..935d8aa283
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/core/test_aws_resource_interaction.py
@@ -0,0 +1,186 @@
+"""
+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 logging
+import time
+
+import pytest
+import ly_test_tools
+import ly_test_tools.log.log_monitor
+import ly_test_tools.environment.process_utils as process_utils
+import ly_test_tools.o3de.asset_processor_utils as asset_processor_utils
+
+from botocore.exceptions import ClientError
+from AWS.Windows.resource_mappings.resource_mappings import resource_mappings
+from assetpipeline.ap_fixtures.asset_processor_fixture import asset_processor
+
+AWS_CORE_FEATURE_NAME = 'AWSCore'
+AWS_RESOURCE_MAPPING_FILE_NAME = 'default_aws_resource_mappings.json'
+
+process_utils.kill_processes_named("o3de", ignore_extensions=True) # Kill ProjectManager windows
+
+GAME_LOG_NAME = 'Game.log'
+
+logger = logging.getLogger(__name__)
+
+
+def setup(launcher: pytest.fixture, cdk: pytest.fixture, resource_mappings: pytest.fixture, asset_processor: pytest.fixture):
+ asset_processor_utils.kill_asset_processor()
+ logger.info(f'Cdk stack names:\n{cdk.list()}')
+ stacks = cdk.deploy(additonal_params=['--all'])
+ resource_mappings.populate_output_keys(stacks)
+ asset_processor.start()
+ asset_processor.wait_for_idle()
+
+ file_to_monitor = os.path.join(launcher.workspace.paths.project_log(), GAME_LOG_NAME)
+ log_monitor = ly_test_tools.log.log_monitor.LogMonitor(launcher=launcher, log_file_path=file_to_monitor)
+
+ return log_monitor
+
+
+@pytest.mark.SUITE_periodic
+@pytest.mark.usefixtures('automatic_process_killer')
+@pytest.mark.usefixtures('asset_processor')
+@pytest.mark.usefixtures('cdk')
+@pytest.mark.parametrize('feature_name', [AWS_CORE_FEATURE_NAME])
+@pytest.mark.parametrize('region_name', ['us-west-2'])
+@pytest.mark.parametrize('assume_role_arn', ['arn:aws:iam::645075835648:role/o3de-automation-tests'])
+@pytest.mark.parametrize('session_name', ['o3de-Automation-session'])
+@pytest.mark.usefixtures('workspace')
+@pytest.mark.parametrize('project', ['AutomatedTesting'])
+@pytest.mark.parametrize('level', ['AWS/Core'])
+@pytest.mark.usefixtures('resource_mappings')
+@pytest.mark.parametrize('resource_mappings_filename', [AWS_RESOURCE_MAPPING_FILE_NAME])
+@pytest.mark.usefixtures('aws_credentials')
+@pytest.mark.parametrize('profile_name', ['AWSAutomationTest'])
+class TestAWSCoreAWSResourceInteraction(object):
+ """
+ Test class to verify AWSCore can downloading a file from S3.
+ """
+ def test_download_from_s3(self,
+ level: str,
+ launcher: pytest.fixture,
+ cdk: pytest.fixture,
+ workspace: pytest.fixture,
+ asset_processor: pytest.fixture,
+ resource_mappings: pytest.fixture
+ ):
+ """
+ Setup: Deploys cdk and updates resource mapping file.
+ Tests: Getting AWS credentials for no signed in user.
+ Verification: Log monitor looks for success download. The existence and contents of the file are also verified.
+ """
+
+ log_monitor = setup(launcher, cdk, resource_mappings, asset_processor)
+
+ launcher.args = ['+LoadLevel', level]
+ launcher.args.extend(['-rhi=null'])
+
+ user_dir = os.path.join(workspace.paths.project(), 'user')
+ download_dir = os.path.join(user_dir, 's3_download')
+ if not os.path.exists(download_dir):
+ os.makedirs(download_dir)
+
+ with launcher.start(launch_ap=False):
+ result = log_monitor.monitor_log_for_lines(
+ expected_lines=['(Script) - [S3] Head object request is done',
+ '(Script) - [S3] Head object success: Object example.txt is found.',
+ '(Script) - [S3] Get object success: Object example.txt is downloaded.'],
+ unexpected_lines=['(Script) - [S3] Head object error: No response body.',
+ '(Script) - [S3] Get object error: Request validation failed, output file directory doesn\'t exist.'],
+ halt_on_unexpected=True
+ )
+
+ assert result, "Expected lines weren't found."
+
+ download_path = os.path.join(download_dir, 'output.txt')
+
+ file_was_downloaded = os.path.exists(download_path)
+ # clean up the file directories.
+ if file_was_downloaded:
+ os.remove(download_path)
+ os.rmdir(download_dir)
+
+ assert file_was_downloaded, 'The expected file wasn\'t successfully downloaded'
+
+ def test_invoke_lambda(self,
+ level: str,
+ launcher: pytest.fixture,
+ cdk: pytest.fixture,
+ resource_mappings: pytest.fixture,
+ workspace: pytest.fixture,
+ asset_processor: pytest.fixture
+ ):
+ """
+ Setup: Deploys the CDK.
+ Tests: Runs the test level.
+ Verification: Searches the logs for the expected output from the example lambda.
+ """
+
+ log_monitor = setup(launcher, cdk, resource_mappings, asset_processor)
+
+ launcher.args = ['+LoadLevel', level]
+ launcher.args.extend(['-rhi=null'])
+
+ with launcher.start(launch_ap=False):
+ result = log_monitor.monitor_log_for_lines(
+ expected_lines=['(Script) - [Lambda] Completed Invoke',
+ '(Script) - [Lambda] Invoke success: {"statusCode": 200, "body": {}}'],
+ unexpected_lines=['(Script) - Request validation failed, output file miss full path.',
+ '(Script) - '],
+ halt_on_unexpected=True
+ )
+
+ assert result
+
+ def test_get_dynamodb_value(self,
+ level: str,
+ launcher: pytest.fixture,
+ cdk: pytest.fixture,
+ resource_mappings: pytest.fixture,
+ workspace: pytest.fixture,
+ asset_processor: pytest.fixture,
+ aws_utils: pytest.fixture,
+ ):
+ """
+ Setup: Deploys the CDK application
+ Test: Runs a launcher with a level that loads a scriptcanvas that pulls a DynamoDB table value.
+ Verification: The value is output in the logs and verified by the test.
+ """
+
+ def write_test_table_data():
+ client = aws_utils.client('dynamodb')
+ table_name = resource_mappings.get_resource_name_id("AWSCore.ExampleDynamoTableOutput")
+ try:
+ client.put_item(
+ TableName=table_name,
+ Item={
+ 'id': {
+ 'S': 'Item1'
+ }
+ }
+ )
+ logger.info(f'Loaded data into table {table_name}')
+ except ClientError:
+ logger.exception(f'Failed to load data into table {table_name}')
+ raise
+
+ log_monitor = setup(launcher, cdk, resource_mappings, asset_processor)
+ write_test_table_data()
+
+ launcher.args = ['+LoadLevel', level]
+ launcher.args.extend(['-rhi=null'])
+
+ with launcher.start(launch_ap=False):
+ result = log_monitor.monitor_log_for_lines(
+ expected_lines=['(Script) - [DynamoDB] Results finished'],
+ unexpected_lines=['(Script) - Request validation failed, output file miss full path.',
+ '(Script) - '],
+ halt_on_unexpected=True
+ )
+
+ assert result
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/common/aws_credentials.py b/AutomatedTesting/Gem/PythonTests/AWS/common/aws_credentials.py
index 61523599a8..f74ae888d5 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/common/aws_credentials.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/common/aws_credentials.py
@@ -107,24 +107,3 @@ class AwsCredentials:
else:
self._credentials[self._profile_name][attribute_name] = attribute_value
-
-@pytest.fixture(scope='function')
-def aws_credentials(request: pytest.fixture, aws_utils: pytest.fixture, profile_name: str):
- """
- Fixture for setting up temporary AWS credentials from assume role.
-
- :param request: _pytest.fixtures.SubRequest class that handles getting
- a pytest fixture from a pytest function/fixture.
- :param aws_utils: aws_utils fixture.
- :param profile_name: Named AWS profile to store temporary credentials.
- """
- aws_credentials_obj = AwsCredentials(profile_name)
- original_access_key, original_secret_access_key, original_token = aws_credentials_obj.get_aws_credentials()
- aws_credentials_obj.set_aws_credentials_by_session(aws_utils.assume_session())
-
- def teardown():
- # Reset to the named profile using the original AWS credentials
- aws_credentials_obj.set_aws_credentials(original_access_key, original_secret_access_key, original_token)
- request.addfinalizer(teardown)
-
- return aws_credentials_obj
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/conftest.py b/AutomatedTesting/Gem/PythonTests/AWS/conftest.py
index 15217d4620..f6425dbab4 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/conftest.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/conftest.py
@@ -6,6 +6,7 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
import pytest
import logging
from AWS.common.aws_utils import AwsUtils
+from AWS.common.aws_credentials import AwsCredentials
from AWS.Windows.cdk.cdk_utils import Cdk
logger = logging.getLogger(__name__)
@@ -81,3 +82,26 @@ def cdk(
request.addfinalizer(teardown)
return pytest.cdk_obj
+
+
+
+@pytest.fixture(scope='function')
+def aws_credentials(request: pytest.fixture, aws_utils: pytest.fixture, profile_name: str):
+ """
+ Fixture for setting up temporary AWS credentials from assume role.
+
+ :param request: _pytest.fixtures.SubRequest class that handles getting
+ a pytest fixture from a pytest function/fixture.
+ :param aws_utils: aws_utils fixture.
+ :param profile_name: Named AWS profile to store temporary credentials.
+ """
+ aws_credentials_obj = AwsCredentials(profile_name)
+ original_access_key, original_secret_access_key, original_token = aws_credentials_obj.get_aws_credentials()
+ aws_credentials_obj.set_aws_credentials_by_session(aws_utils.assume_session())
+
+ def teardown():
+ # Reset to the named profile using the original AWS credentials
+ aws_credentials_obj.set_aws_credentials(original_access_key, original_secret_access_key, original_token)
+ request.addfinalizer(teardown)
+
+ return aws_credentials_obj
diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt
index ec150bd186..b851260639 100644
--- a/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt
@@ -38,7 +38,7 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_BUILD_TESTS_SUPPORTED AND AutomatedT
TEST_SUITE main
TEST_REQUIRES gpu
TEST_SERIAL
- TIMEOUT 400
+ TIMEOUT 800
PATH ${CMAKE_CURRENT_LIST_DIR}/test_Atom_GPUTests.py
RUNTIME_DEPENDENCIES
AssetProcessor
diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_GPUTests.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_GPUTests.py
index cb5ae709d1..05eff871c1 100644
--- a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_GPUTests.py
+++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_GPUTests.py
@@ -17,7 +17,7 @@ import editor_python_test_tools.hydra_test_utils as hydra
logger = logging.getLogger(__name__)
DEFAULT_SUBFOLDER_PATH = 'user/PythonTests/Automated/Screenshots'
-EDITOR_TIMEOUT = 300
+EDITOR_TIMEOUT = 600
TEST_DIRECTORY = os.path.join(os.path.dirname(__file__), "atom_hydra_scripts")
@@ -77,7 +77,6 @@ class TestAllComponentsIndepthTests(object):
unexpected_lines=unexpected_lines,
halt_on_unexpected=True,
cfg_args=[level],
- auto_test_mode=False,
null_renderer=False,
)
diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_EditMenuOptions.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_EditMenuOptions.py
index 26110cd954..c157c995c4 100644
--- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_EditMenuOptions.py
+++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_EditMenuOptions.py
@@ -60,24 +60,7 @@ class TestEditMenuOptions(EditorTestHelper):
("Modify", "Transform Mode", "Rotate"),
("Modify", "Transform Mode", "Scale"),
("Editor Settings", "Global Preferences"),
- ("Editor Settings", "Graphics Settings"),
("Editor Settings", "Editor Settings Manager"),
- ("Editor Settings", "Graphics Performance", "PC", "Very High"),
- ("Editor Settings", "Graphics Performance", "PC", "High"),
- ("Editor Settings", "Graphics Performance", "PC", "Medium"),
- ("Editor Settings", "Graphics Performance", "PC", "Low"),
- ("Editor Settings", "Graphics Performance", "OSX Metal", "Very High"),
- ("Editor Settings", "Graphics Performance", "OSX Metal", "High"),
- ("Editor Settings", "Graphics Performance", "OSX Metal", "Medium"),
- ("Editor Settings", "Graphics Performance", "OSX Metal", "Low"),
- ("Editor Settings", "Graphics Performance", "Android", "Very High"),
- ("Editor Settings", "Graphics Performance", "Android", "High"),
- ("Editor Settings", "Graphics Performance", "Android", "Medium"),
- ("Editor Settings", "Graphics Performance", "Android", "Low"),
- ("Editor Settings", "Graphics Performance", "iOS", "Very High"),
- ("Editor Settings", "Graphics Performance", "iOS", "High"),
- ("Editor Settings", "Graphics Performance", "iOS", "Medium"),
- ("Editor Settings", "Graphics Performance", "iOS", "Low"),
("Editor Settings", "Keyboard Customization", "Customize Keyboard"),
("Editor Settings", "Keyboard Customization", "Export Keyboard Settings"),
("Editor Settings", "Keyboard Customization", "Import Keyboard Settings"),
diff --git a/AutomatedTesting/Gem/PythonTests/editor/test_Menus.py b/AutomatedTesting/Gem/PythonTests/editor/test_Menus.py
index 982f3617b5..cc5385f4ba 100644
--- a/AutomatedTesting/Gem/PythonTests/editor/test_Menus.py
+++ b/AutomatedTesting/Gem/PythonTests/editor/test_Menus.py
@@ -55,12 +55,7 @@ class TestMenus(object):
"Rotate Action triggered",
"Scale Action triggered",
"Global Preferences Action triggered",
- "Graphics Settings Action triggered",
"Editor Settings Manager Action triggered",
- "Very High Action triggered",
- "High Action triggered",
- "Medium Action triggered",
- "Low Action triggered",
"Customize Keyboard Action triggered",
"Export Keyboard Settings Action triggered",
"Import Keyboard Settings Action triggered",
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt
index af9fc142e2..73af69b93a 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt
@@ -51,4 +51,18 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
AutomatedTesting.GameLauncher
AutomatedTesting.Assets
)
+
+ ly_add_pytest(
+ NAME AutomatedTesting::GameLauncherWithGPU
+ TEST_SUITE sandbox
+ TEST_REQUIRES gpu
+ PATH ${CMAKE_CURRENT_LIST_DIR}/test_GameLauncher_EnterExitGameMode_Works.py
+ TIMEOUT 100
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ AZ::PythonBindingsExample
+ Legacy::Editor
+ AutomatedTesting.GameLauncher
+ AutomatedTesting.Assets
+ )
endif()
diff --git a/AutomatedTesting/Levels/AWS/Core/Core.ly b/AutomatedTesting/Levels/AWS/Core/Core.ly
new file mode 100644
index 0000000000..8b01ee7abe
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/Core/Core.ly
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5242a9b598bc329ef2af2b114092e4e50c7c398cdde4605a0717b0b3ce66d797
+size 10030
diff --git a/AutomatedTesting/Levels/AWS/Core/filelist.xml b/AutomatedTesting/Levels/AWS/Core/filelist.xml
new file mode 100644
index 0000000000..9d1fcd2e83
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/Core/filelist.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/AutomatedTesting/Levels/AWS/Core/level.pak b/AutomatedTesting/Levels/AWS/Core/level.pak
new file mode 100644
index 0000000000..01b79da84e
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/Core/level.pak
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4ba2f409fc974c72b8ee8b660d200ed1d013ee8408419b0e91d6d487e71e4997
+size 3774
diff --git a/AutomatedTesting/Levels/AWS/Core/tags.txt b/AutomatedTesting/Levels/AWS/Core/tags.txt
new file mode 100644
index 0000000000..0d6c1880e7
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/Core/tags.txt
@@ -0,0 +1,12 @@
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
diff --git a/AutomatedTesting/ScriptCanvas/dynamodbdemo.scriptcanvas b/AutomatedTesting/ScriptCanvas/dynamodbdemo.scriptcanvas
new file mode 100644
index 0000000000..52654666f8
--- /dev/null
+++ b/AutomatedTesting/ScriptCanvas/dynamodbdemo.scriptcanvas
@@ -0,0 +1,3478 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AutomatedTesting/ScriptCanvas/lambdademo.scriptcanvas b/AutomatedTesting/ScriptCanvas/lambdademo.scriptcanvas
new file mode 100644
index 0000000000..d1ad940ccf
--- /dev/null
+++ b/AutomatedTesting/ScriptCanvas/lambdademo.scriptcanvas
@@ -0,0 +1,2484 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AutomatedTesting/ScriptCanvas/s3demo.scriptcanvas b/AutomatedTesting/ScriptCanvas/s3demo.scriptcanvas
new file mode 100644
index 0000000000..c87c647d60
--- /dev/null
+++ b/AutomatedTesting/ScriptCanvas/s3demo.scriptcanvas
@@ -0,0 +1,5358 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Editor/CMakeLists.txt b/Code/Editor/CMakeLists.txt
index 8a5f35fb92..13985cfb5e 100644
--- a/Code/Editor/CMakeLists.txt
+++ b/Code/Editor/CMakeLists.txt
@@ -111,7 +111,6 @@ ly_add_target(
AZ::AzCore
AZ::AzToolsFramework
Gem::LmbrCentral.Static
- Legacy::NewsShared
AZ::AWSNativeSDKInit
AZ::AtomCore
Gem::Atom_RPI.Edit
@@ -139,7 +138,6 @@ ly_add_source_properties(
ly_add_source_properties(
SOURCES
Core/LevelEditorMenuHandler.cpp
- GraphicsSettingsDialog.cpp
MainWindow.cpp
PROPERTY COMPILE_DEFINITIONS
VALUES ${LY_PAL_TOOLS_DEFINES}
diff --git a/Code/Editor/Core/LevelEditorMenuHandler.cpp b/Code/Editor/Core/LevelEditorMenuHandler.cpp
index ab1229dc6b..600691bdd6 100644
--- a/Code/Editor/Core/LevelEditorMenuHandler.cpp
+++ b/Code/Editor/Core/LevelEditorMenuHandler.cpp
@@ -497,9 +497,15 @@ void LevelEditorMenuHandler::PopulateEditMenu(ActionManager::MenuWrapper& editMe
// Hide Selection
editMenu.AddAction(AzToolsFramework::HideSelection);
- // Unhide All
+ // Show All
editMenu.AddAction(AzToolsFramework::ShowAll);
+ // Lock Selection
+ editMenu.AddAction(AzToolsFramework::LockSelection);
+
+ // UnLock All
+ editMenu.AddAction(AzToolsFramework::UnlockAll);
+
/*
* The following block of code is part of the feature "Isolation Mode" and is temporarily
* disabled for 1.10 release.
@@ -552,49 +558,9 @@ void LevelEditorMenuHandler::PopulateEditMenu(ActionManager::MenuWrapper& editMe
// Global Preferences...
editorSettingsMenu.AddAction(ID_TOOLS_PREFERENCES);
- // Graphics Settings...
- editorSettingsMenu.AddAction(ID_GRAPHICS_SETTINGS);
-
// Editor Settings Manager
AddOpenViewPaneAction(editorSettingsMenu, LyViewPane::EditorSettingsManager);
- // Graphics Performance
- auto graphicPerformanceSubMenu = editorSettingsMenu.AddMenu(QObject::tr("Graphics Performance"));
-
- auto pcMenu = graphicPerformanceSubMenu.AddMenu(tr("PC"));
- pcMenu.AddAction(ID_GAME_PC_ENABLEVERYHIGHSPEC);
- pcMenu.AddAction(ID_GAME_PC_ENABLEHIGHSPEC);
- pcMenu.AddAction(ID_GAME_PC_ENABLEMEDIUMSPEC);
- pcMenu.AddAction(ID_GAME_PC_ENABLELOWSPEC);
-
- auto osxmetalMenu = graphicPerformanceSubMenu.AddMenu(tr("OSX Metal"));
- osxmetalMenu.AddAction(ID_GAME_OSXMETAL_ENABLEVERYHIGHSPEC);
- osxmetalMenu.AddAction(ID_GAME_OSXMETAL_ENABLEHIGHSPEC);
- osxmetalMenu.AddAction(ID_GAME_OSXMETAL_ENABLEMEDIUMSPEC);
- osxmetalMenu.AddAction(ID_GAME_OSXMETAL_ENABLELOWSPEC);
-
- auto androidMenu = graphicPerformanceSubMenu.AddMenu(tr("Android"));
- androidMenu.AddAction(ID_GAME_ANDROID_ENABLEVERYHIGHSPEC);
- androidMenu.AddAction(ID_GAME_ANDROID_ENABLEHIGHSPEC);
- androidMenu.AddAction(ID_GAME_ANDROID_ENABLEMEDIUMSPEC);
- androidMenu.AddAction(ID_GAME_ANDROID_ENABLELOWSPEC);
-
- auto iosMenu = graphicPerformanceSubMenu.AddMenu(tr("iOS"));
- iosMenu.AddAction(ID_GAME_IOS_ENABLEVERYHIGHSPEC);
- iosMenu.AddAction(ID_GAME_IOS_ENABLEHIGHSPEC);
- iosMenu.AddAction(ID_GAME_IOS_ENABLEMEDIUMSPEC);
- iosMenu.AddAction(ID_GAME_IOS_ENABLELOWSPEC);
-
-#if defined(AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS)
-#define AZ_RESTRICTED_PLATFORM_EXPANSION(CodeName, CODENAME, codename, PrivateName, PRIVATENAME, privatename, PublicName, PUBLICNAME, publicname, PublicAuxName1, PublicAuxName2, PublicAuxName3)\
- auto publicname##Menu = graphicPerformanceSubMenu.AddMenu(tr(PublicAuxName2));\
- publicname##Menu.AddAction(ID_GAME_##CODENAME##_ENABLEHIGHSPEC);\
- publicname##Menu.AddAction(ID_GAME_##CODENAME##_ENABLEMEDIUMSPEC);\
- publicname##Menu.AddAction(ID_GAME_##CODENAME##_ENABLELOWSPEC);
- AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS
-#undef AZ_RESTRICTED_PLATFORM_EXPANSION
-#endif
-
// Keyboard Customization
auto keyboardCustomizationMenu = editorSettingsMenu.AddMenu(tr("Keyboard Customization"));
keyboardCustomizationMenu.AddAction(ID_TOOLS_CUSTOMIZEKEYBOARD);
diff --git a/Code/Editor/CryEdit.cpp b/Code/Editor/CryEdit.cpp
index 8efd4bc5b3..b0dddc94ae 100644
--- a/Code/Editor/CryEdit.cpp
+++ b/Code/Editor/CryEdit.cpp
@@ -111,7 +111,6 @@ AZ_POP_DISABLE_WARNING
#include "ToolBox.h"
#include "LevelInfo.h"
#include "EditorPreferencesDialog.h"
-#include "GraphicsSettingsDialog.h"
#include "AnimationContext.h"
#include "GotoPositionDlg.h"
@@ -440,7 +439,6 @@ void CCryEditApp::RegisterActionHandlers()
ON_COMMAND(ID_CLEAR_REGISTRY, OnClearRegistryData)
ON_COMMAND(ID_VALIDATELEVEL, OnValidatelevel)
ON_COMMAND(ID_TOOLS_PREFERENCES, OnToolsPreferences)
- ON_COMMAND(ID_GRAPHICS_SETTINGS, OnGraphicsSettings)
ON_COMMAND(ID_SWITCHCAMERA_DEFAULTCAMERA, OnSwitchToDefaultCamera)
ON_COMMAND(ID_SWITCHCAMERA_SEQUENCECAMERA, OnSwitchToSequenceCamera)
ON_COMMAND(ID_SWITCHCAMERA_SELECTEDCAMERA, OnSwitchToSelectedcamera)
@@ -453,14 +451,6 @@ void CCryEditApp::RegisterActionHandlers()
ON_COMMAND(ID_OPEN_TRACKVIEW, OnOpenTrackView)
ON_COMMAND(ID_OPEN_UICANVASEDITOR, OnOpenUICanvasEditor)
- ON_COMMAND_RANGE(ID_GAME_PC_ENABLELOWSPEC, ID_GAME_PC_ENABLEVERYHIGHSPEC, OnChangeGameSpec)
-
- ON_COMMAND_RANGE(ID_GAME_OSXMETAL_ENABLELOWSPEC, ID_GAME_OSXMETAL_ENABLEVERYHIGHSPEC, OnChangeGameSpec)
-
- ON_COMMAND_RANGE(ID_GAME_ANDROID_ENABLELOWSPEC, ID_GAME_ANDROID_ENABLEVERYHIGHSPEC, OnChangeGameSpec)
-
- ON_COMMAND_RANGE(ID_GAME_IOS_ENABLELOWSPEC, ID_GAME_IOS_ENABLEVERYHIGHSPEC, OnChangeGameSpec)
-
#if defined(AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS)
#define AZ_RESTRICTED_PLATFORM_EXPANSION(CodeName, CODENAME, codename, PrivateName, PRIVATENAME, privatename, PublicName, PUBLICNAME, publicname, PublicAuxName1, PublicAuxName2, PublicAuxName3)\
ON_COMMAND_RANGE(ID_GAME_##CODENAME##_ENABLELOWSPEC, ID_GAME_##CODENAME##_ENABLEHIGHSPEC, OnChangeGameSpec)
@@ -3674,13 +3664,6 @@ void CCryEditApp::OnToolsPreferences()
dlg.exec();
}
-//////////////////////////////////////////////////////////////////////////
-void CCryEditApp::OnGraphicsSettings()
-{
- GraphicsSettingsDialog dlg(MainWindow::instance());
- dlg.exec();
-}
-
//////////////////////////////////////////////////////////////////////////
void CCryEditApp::OnSwitchToDefaultCamera()
{
@@ -3815,91 +3798,6 @@ void CCryEditApp::OnOpenUICanvasEditor()
QtViewPaneManager::instance()->OpenPane(LyViewPane::UiEditor);
}
-//////////////////////////////////////////////////////////////////////////
-void CCryEditApp::SetGameSpecCheck(ESystemConfigSpec spec, ESystemConfigPlatform platform, int &nCheck, bool &enable)
-{
- if (GetIEditor()->GetEditorConfigSpec() == spec && GetIEditor()->GetEditorConfigPlatform() == platform)
- {
- nCheck = 1;
- }
- enable = spec <= GetIEditor()->GetSystem()->GetMaxConfigSpec();
-}
-
-//////////////////////////////////////////////////////////////////////////
-void CCryEditApp::OnUpdateGameSpec(QAction* action)
-{
- Q_ASSERT(action->isCheckable());
- int nCheck = 0;
- bool enable = true;
- switch (action->data().toInt())
- {
- case ID_GAME_PC_ENABLELOWSPEC:
- SetGameSpecCheck(CONFIG_LOW_SPEC, CONFIG_PC, nCheck, enable);
- break;
- case ID_GAME_PC_ENABLEMEDIUMSPEC:
- SetGameSpecCheck(CONFIG_MEDIUM_SPEC, CONFIG_PC, nCheck, enable);
- break;
- case ID_GAME_PC_ENABLEHIGHSPEC:
- SetGameSpecCheck(CONFIG_HIGH_SPEC, CONFIG_PC, nCheck, enable);
- break;
- case ID_GAME_PC_ENABLEVERYHIGHSPEC:
- SetGameSpecCheck(CONFIG_VERYHIGH_SPEC, CONFIG_PC, nCheck, enable);
- break;
- case ID_GAME_OSXMETAL_ENABLELOWSPEC:
- SetGameSpecCheck(CONFIG_LOW_SPEC, CONFIG_OSX_METAL, nCheck, enable);
- break;
- case ID_GAME_OSXMETAL_ENABLEMEDIUMSPEC:
- SetGameSpecCheck(CONFIG_MEDIUM_SPEC, CONFIG_OSX_METAL, nCheck, enable);
- break;
- case ID_GAME_OSXMETAL_ENABLEHIGHSPEC:
- SetGameSpecCheck(CONFIG_HIGH_SPEC, CONFIG_OSX_METAL, nCheck, enable);
- break;
- case ID_GAME_OSXMETAL_ENABLEVERYHIGHSPEC:
- SetGameSpecCheck(CONFIG_VERYHIGH_SPEC, CONFIG_OSX_METAL, nCheck, enable);
- break;
- case ID_GAME_ANDROID_ENABLELOWSPEC:
- SetGameSpecCheck(CONFIG_LOW_SPEC, CONFIG_ANDROID, nCheck, enable);
- break;
- case ID_GAME_ANDROID_ENABLEMEDIUMSPEC:
- SetGameSpecCheck(CONFIG_MEDIUM_SPEC, CONFIG_ANDROID, nCheck, enable);
- break;
- case ID_GAME_ANDROID_ENABLEHIGHSPEC:
- SetGameSpecCheck(CONFIG_HIGH_SPEC, CONFIG_ANDROID, nCheck, enable);
- break;
- case ID_GAME_ANDROID_ENABLEVERYHIGHSPEC:
- SetGameSpecCheck(CONFIG_VERYHIGH_SPEC, CONFIG_ANDROID, nCheck, enable);
- break;
- case ID_GAME_IOS_ENABLELOWSPEC:
- SetGameSpecCheck(CONFIG_LOW_SPEC, CONFIG_IOS, nCheck, enable);
- break;
- case ID_GAME_IOS_ENABLEMEDIUMSPEC:
- SetGameSpecCheck(CONFIG_MEDIUM_SPEC, CONFIG_IOS, nCheck, enable);
- break;
- case ID_GAME_IOS_ENABLEHIGHSPEC:
- SetGameSpecCheck(CONFIG_HIGH_SPEC, CONFIG_IOS, nCheck, enable);
- break;
- case ID_GAME_IOS_ENABLEVERYHIGHSPEC:
- SetGameSpecCheck(CONFIG_VERYHIGH_SPEC, CONFIG_IOS, nCheck, enable);
- break;
-#if defined(AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS)
-#define AZ_RESTRICTED_PLATFORM_EXPANSION(CodeName, CODENAME, codename, PrivateName, PRIVATENAME, privatename, PublicName, PUBLICNAME, publicname, PublicAuxName1, PublicAuxName2, PublicAuxName3)\
- case ID_GAME_##CODENAME##_ENABLELOWSPEC:\
- SetGameSpecCheck(CONFIG_LOW_SPEC, CONFIG_##CODENAME, nCheck, enable);\
- break;\
- case ID_GAME_##CODENAME##_ENABLEMEDIUMSPEC:\
- SetGameSpecCheck(CONFIG_MEDIUM_SPEC, CONFIG_##CODENAME, nCheck, enable);\
- break;\
- case ID_GAME_##CODENAME##_ENABLEHIGHSPEC:\
- SetGameSpecCheck(CONFIG_HIGH_SPEC, CONFIG_##CODENAME, nCheck, enable);\
- break;
- AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS
-#undef AZ_RESTRICTED_PLATFORM_EXPANSION
-#endif
- }
- action->setChecked(nCheck);
- action->setEnabled(enable);
-}
-
//////////////////////////////////////////////////////////////////////////
RecentFileList* CCryEditApp::GetRecentFileList()
{
diff --git a/Code/Editor/CryEdit.h b/Code/Editor/CryEdit.h
index 0628289897..5de8aa5e6c 100644
--- a/Code/Editor/CryEdit.h
+++ b/Code/Editor/CryEdit.h
@@ -403,7 +403,6 @@ private:
void OnClearRegistryData();
void OnValidatelevel();
void OnToolsPreferences();
- void OnGraphicsSettings();
void OnSwitchToDefaultCamera();
void OnUpdateSwitchToDefaultCamera(QAction* action);
void OnSwitchToSequenceCamera();
@@ -416,9 +415,6 @@ private:
void OnOpenTrackView();
void OnOpenAudioControlsEditor();
void OnOpenUICanvasEditor();
- void OnChangeGameSpec(UINT nID);
- void SetGameSpecCheck(ESystemConfigSpec spec, ESystemConfigPlatform platform, int &nCheck, bool &enable);
- void OnUpdateGameSpec(QAction* action);
void OnOpenQuickAccessBar();
public:
diff --git a/Code/Editor/CryEditPy.cpp b/Code/Editor/CryEditPy.cpp
index 02833a84e0..2e414da277 100644
--- a/Code/Editor/CryEditPy.cpp
+++ b/Code/Editor/CryEditPy.cpp
@@ -407,78 +407,6 @@ inline namespace Commands
}
}
-//////////////////////////////////////////////////////////////////////////
-void CCryEditApp::OnChangeGameSpec(UINT nID)
-{
- switch (nID)
- {
- case ID_GAME_PC_ENABLELOWSPEC:
- Commands::PySetConfigSpec(CONFIG_LOW_SPEC, CONFIG_PC);
- break;
- case ID_GAME_PC_ENABLEMEDIUMSPEC:
- Commands::PySetConfigSpec(CONFIG_MEDIUM_SPEC, CONFIG_PC);
- break;
- case ID_GAME_PC_ENABLEHIGHSPEC:
- Commands::PySetConfigSpec(CONFIG_HIGH_SPEC, CONFIG_PC);
- break;
- case ID_GAME_PC_ENABLEVERYHIGHSPEC:
- Commands::PySetConfigSpec(CONFIG_VERYHIGH_SPEC, CONFIG_PC);
- break;
- case ID_GAME_OSXMETAL_ENABLELOWSPEC:
- Commands::PySetConfigSpec(CONFIG_LOW_SPEC, CONFIG_OSX_METAL);
- break;
- case ID_GAME_OSXMETAL_ENABLEMEDIUMSPEC:
- Commands::PySetConfigSpec(CONFIG_MEDIUM_SPEC, CONFIG_OSX_METAL);
- break;
- case ID_GAME_OSXMETAL_ENABLEHIGHSPEC:
- Commands::PySetConfigSpec(CONFIG_HIGH_SPEC, CONFIG_OSX_METAL);
- break;
- case ID_GAME_OSXMETAL_ENABLEVERYHIGHSPEC:
- Commands::PySetConfigSpec(CONFIG_VERYHIGH_SPEC, CONFIG_OSX_METAL);
- break;
- case ID_GAME_ANDROID_ENABLELOWSPEC:
- Commands::PySetConfigSpec(CONFIG_LOW_SPEC, CONFIG_ANDROID);
- break;
- case ID_GAME_ANDROID_ENABLEMEDIUMSPEC:
- Commands::PySetConfigSpec(CONFIG_MEDIUM_SPEC, CONFIG_ANDROID);
- break;
- case ID_GAME_ANDROID_ENABLEHIGHSPEC:
- Commands::PySetConfigSpec(CONFIG_HIGH_SPEC, CONFIG_ANDROID);
- break;
- case ID_GAME_ANDROID_ENABLEVERYHIGHSPEC:
- Commands::PySetConfigSpec(CONFIG_VERYHIGH_SPEC, CONFIG_ANDROID);
- break;
- case ID_GAME_IOS_ENABLELOWSPEC:
- Commands::PySetConfigSpec(CONFIG_LOW_SPEC, CONFIG_IOS);
- break;
- case ID_GAME_IOS_ENABLEMEDIUMSPEC:
- Commands::PySetConfigSpec(CONFIG_MEDIUM_SPEC, CONFIG_IOS);
- break;
- case ID_GAME_IOS_ENABLEHIGHSPEC:
- Commands::PySetConfigSpec(CONFIG_HIGH_SPEC, CONFIG_IOS);
- break;
- case ID_GAME_IOS_ENABLEVERYHIGHSPEC:
- Commands::PySetConfigSpec(CONFIG_VERYHIGH_SPEC, CONFIG_IOS);
- break;
-#if defined(AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS)
-#define AZ_RESTRICTED_PLATFORM_EXPANSION(CodeName, CODENAME, codename, PrivateName, PRIVATENAME, privatename, PublicName, PUBLICNAME, publicname, PublicAuxName1, PublicAuxName2, PublicAuxName3)\
- case ID_GAME_##CODENAME##_ENABLELOWSPEC:\
- Commands::PySetConfigSpec(CONFIG_LOW_SPEC, CONFIG_##CODENAME);\
- break;\
- case ID_GAME_##CODENAME##_ENABLEMEDIUMSPEC:\
- Commands::PySetConfigSpec(CONFIG_MEDIUM_SPEC, CONFIG_##CODENAME);\
- break;\
- case ID_GAME_##CODENAME##_ENABLEHIGHSPEC:\
- Commands::PySetConfigSpec(CONFIG_HIGH_SPEC, CONFIG_##CODENAME);\
- break;
- AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS
-#undef AZ_RESTRICTED_PLATFORM_EXPANSION
-#endif
- }
-}
-
-
-
namespace AzToolsFramework
{
void CryEditPythonHandler::Reflect(AZ::ReflectContext* context)
diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp
index 1b461e1356..3f86260f8d 100644
--- a/Code/Editor/EditorViewportWidget.cpp
+++ b/Code/Editor/EditorViewportWidget.cpp
@@ -458,25 +458,7 @@ void EditorViewportWidget::Update()
SetFOV(cameraState.m_fovOrZoom);
m_Camera.SetZRange(cameraState.m_nearClip, cameraState.m_farClip);
}
- else if (!ed_useNewCameraSystem)
- {
- m_renderViewport->GetViewportContext()->SetCameraTransform(LYTransformToAZTransform(m_Camera.GetMatrix()));
- }
- // Don't override the game mode FOV
- if (!GetIEditor()->IsInGameMode())
- {
- AZ::Matrix4x4 clipMatrix;
- AZ::MakePerspectiveFovMatrixRH(
- clipMatrix,
- GetFOV(),
- aznumeric_cast(width()) / aznumeric_cast(height()),
- m_Camera.GetNearPlane(),
- m_Camera.GetFarPlane(),
- true
- );
- m_renderViewport->GetViewportContext()->SetCameraProjectionMatrix(clipMatrix);
- }
// Reset the camera update flag now that we're finished updating our viewport context
m_updateCameraPositionNextTick = false;
@@ -632,7 +614,6 @@ void EditorViewportWidget::SetViewEntity(const AZ::EntityId& viewEntityId, bool
void EditorViewportWidget::ResetToViewSourceType(const ViewSourceType& viewSourceType)
{
LockCameraMovement(true);
- m_pCameraFOVVariable = nullptr;
m_viewEntityId.SetInvalid();
m_cameraObjectId = GUID_NULL;
m_viewSourceType = viewSourceType;
@@ -2547,13 +2528,26 @@ void EditorViewportWidget::CenterOnSliceInstance()
//////////////////////////////////////////////////////////////////////////
void EditorViewportWidget::SetFOV(float fov)
{
- if (m_pCameraFOVVariable)
+ if (m_viewEntityId.IsValid())
{
- m_pCameraFOVVariable->Set(fov);
+ Camera::CameraRequestBus::Event(m_viewEntityId, &Camera::CameraComponentRequests::SetFov, AZ::RadToDeg(fov));
}
else
{
m_camFOV = fov;
+ // Set the active camera's FOV
+ {
+ AZ::Matrix4x4 clipMatrix;
+ AZ::MakePerspectiveFovMatrixRH(
+ clipMatrix,
+ GetFOV(),
+ aznumeric_cast(width()) / aznumeric_cast(height()),
+ m_Camera.GetNearPlane(),
+ m_Camera.GetFarPlane(),
+ true
+ );
+ m_renderViewport->GetViewportContext()->SetCameraProjectionMatrix(clipMatrix);
+ }
}
if (m_viewPane)
@@ -2580,13 +2574,7 @@ float EditorViewportWidget::GetFOV() const
}
}
- if (m_pCameraFOVVariable)
- {
- float fov;
- m_pCameraFOVVariable->Get(fov);
- return fov;
- }
- else if (m_viewEntityId.IsValid())
+ if (m_viewEntityId.IsValid())
{
float fov = AZ::RadToDeg(m_camFOV);
Camera::CameraRequestBus::EventResult(fov, m_viewEntityId, &Camera::CameraComponentRequests::GetFov);
@@ -2970,7 +2958,12 @@ void EditorViewportWidget::RestoreViewportAfterGameMode()
{
Matrix34 preGameModeViewTM = m_preGameModeViewTM;
- QString text = QString("You are exiting Game Mode. Would you like to restore the camera in the viewport to where it was before you entered Game Mode?
This option can always be changed in the General Preferences tab of the Editor Settings, by toggling the \"%1\" option.
").arg(EditorPreferencesGeneralRestoreViewportCameraSettingName);
+ QString text =
+ QString(
+ tr("When leaving \" Game Mode \" the engine will automatically restore your camera position to the default position before you "
+ "had entered Game mode.
If you dislike this setting you can always change this anytime in the global "
+ "preferences.
"))
+ .arg(EditorPreferencesGeneralRestoreViewportCameraSettingName);
QString restoreOnExitGameModePopupDisabledRegKey("Editor/AutoHide/ViewportCameraRestoreOnExitGameMode");
// Read the popup disabled registry value
@@ -2985,6 +2978,7 @@ void EditorViewportWidget::RestoreViewportAfterGameMode()
messageBox.setDefaultButton(QMessageBox::Yes);
QCheckBox* checkBox = new QCheckBox(QStringLiteral("Do not show this message again"));
+ checkBox->setChecked(true);
messageBox.setCheckBox(checkBox);
// Unconstrain the system cursor and make it visible before we show the dialog box, otherwise the user can't see the cursor.
diff --git a/Code/Editor/EditorViewportWidget.h b/Code/Editor/EditorViewportWidget.h
index a395ef50a4..69015dcc79 100644
--- a/Code/Editor/EditorViewportWidget.h
+++ b/Code/Editor/EditorViewportWidget.h
@@ -506,7 +506,6 @@ protected:
CPredefinedAspectRatios m_predefinedAspectRatios;
- IVariable* m_pCameraFOVVariable = nullptr;
bool m_bCursorHidden = false;
void OnMenuResolutionCustom();
diff --git a/Code/Editor/GraphicsSettingsDialog.cpp b/Code/Editor/GraphicsSettingsDialog.cpp
deleted file mode 100644
index dbd7a7fc1a..0000000000
--- a/Code/Editor/GraphicsSettingsDialog.cpp
+++ /dev/null
@@ -1,1392 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#include
-#include
-#include
-#include "ProjectDefines.h"
-#include "EditorDefs.h"
-
-#include "GraphicsSettingsDialog.h"
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-
-// AzFramework
-#include
-#include
-#include
-#include
-
-// Editor
-#include "Util/AutoDirectoryRestoreFileDialog.h"
-
-AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING
-#include "ui_graphicssettingsdialog.h"
-AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING
-
-QString groupNames[] =
-{
- "Game Effects",
- "Light",
- "Object Detail",
- "Particles",
- "Physics",
- "Post Processing",
- "Quality",
- "Shading",
- "Shadows",
- "Sound",
- "Texture",
- "Texture Resolution",
- "Volumetric Effects",
- "Water",
- "Miscellaneous"
-};
-
-GraphicsSettingsDialog::GraphicsSettingsDialog(QWidget* parent /* = nullptr */)
- : QDialog(parent)
- , m_ui(new Ui::GraphicsSettingsDialog())
-{
- //Update qlabel color when disabled
- setStyleSheet("QLabel::disabled{color: gray;}");
-
- // Start initialization the dialog
- m_ui->setupUi(this);
- setWindowTitle("Graphics Settings");
- m_ui->m_applyButton->setDefault(true);
- m_headerView = new GraphicsSettingsHeaderView(this, Qt::Horizontal);
- m_headerView->setMouseTracking(true);
- m_ui->m_graphicsSettingsTreeView->setHeader(m_headerView);
- /////////////////////////////////////////////
-
- m_currentPlatform = GetISystem()->GetConfigPlatform();
- m_currentSpecIndex = 0;
- m_dirtyCVarCount = 0;
-
- m_showCustomSpec = true;
- ShowCustomSpecOption(false);
-
- // Show categories, disable apply button
- m_showCategories = true;
- m_ui->m_applyButton->setEnabled(false);
-
- m_graphicsSettingsModel = new GraphicsSettingsModel(this);
- m_ui->m_graphicsSettingsTreeView->setModel(m_graphicsSettingsModel);
-
- m_cfgFiles[CONFIG_PC].push_back("pc_low.cfg");
- m_cfgFiles[CONFIG_PC].push_back("pc_medium.cfg");
- m_cfgFiles[CONFIG_PC].push_back("pc_high.cfg");
- m_cfgFiles[CONFIG_PC].push_back("pc_veryhigh.cfg");
- m_cfgFiles[CONFIG_OSX_METAL].push_back("osx_metal_low.cfg");
- m_cfgFiles[CONFIG_OSX_METAL].push_back("osx_metal_medium.cfg");
- m_cfgFiles[CONFIG_OSX_METAL].push_back("osx_metal_high.cfg");
- m_cfgFiles[CONFIG_OSX_METAL].push_back("osx_metal_veryhigh.cfg");
- m_cfgFiles[CONFIG_ANDROID].push_back("android_low.cfg");
- m_cfgFiles[CONFIG_ANDROID].push_back("android_medium.cfg");
- m_cfgFiles[CONFIG_ANDROID].push_back("android_high.cfg");
- m_cfgFiles[CONFIG_ANDROID].push_back("android_veryhigh.cfg");
- m_cfgFiles[CONFIG_IOS].push_back("ios_low.cfg");
- m_cfgFiles[CONFIG_IOS].push_back("ios_medium.cfg");
- m_cfgFiles[CONFIG_IOS].push_back("ios_high.cfg");
- m_cfgFiles[CONFIG_IOS].push_back("ios_veryhigh.cfg");
-#if defined(AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS)
-#define AZ_RESTRICTED_PLATFORM_EXPANSION(CodeName, CODENAME, codename, PrivateName, PRIVATENAME, privatename, PublicName, PUBLICNAME, publicname, PublicAuxName1, PublicAuxName2, PublicAuxName3)\
- m_cfgFiles[CONFIG_##CODENAME].push_back(#publicname "_low.cfg");\
- m_cfgFiles[CONFIG_##CODENAME].push_back(#publicname "_medium.cfg");\
- m_cfgFiles[CONFIG_##CODENAME].push_back(#publicname "_high.cfg");
- AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS
-#undef AZ_RESTRICTED_PLATFORM_EXPANSION
-#endif
- // Since the layout order is set by the .ui file we need to match the order here so that tabbing works correctly.
- m_cvarGroupOrder.push_back("Config/CVarGroups/sys_spec_gameeffects.cfg");
- m_cvarGroupOrder.push_back("Config/CVarGroups/sys_spec_light.cfg");
- m_cvarGroupOrder.push_back("Config/CVarGroups/sys_spec_objectdetail.cfg");
- m_cvarGroupOrder.push_back("Config/CVarGroups/sys_spec_particles.cfg");
- m_cvarGroupOrder.push_back("Config/CVarGroups/sys_spec_physics.cfg");
- m_cvarGroupOrder.push_back("Config/CVarGroups/sys_spec_postprocessing.cfg");
- m_cvarGroupOrder.push_back("Config/CVarGroups/sys_spec_quality.cfg");
- m_cvarGroupOrder.push_back("Config/CVarGroups/sys_spec_shading.cfg");
- m_cvarGroupOrder.push_back("Config/CVarGroups/sys_spec_shadows.cfg");
- m_cvarGroupOrder.push_back("Config/CVarGroups/sys_spec_sound.cfg");
- m_cvarGroupOrder.push_back("Config/CVarGroups/sys_spec_texture.cfg");
- m_cvarGroupOrder.push_back("Config/CVarGroups/sys_spec_textureresolution.cfg");
- m_cvarGroupOrder.push_back("Config/CVarGroups/sys_spec_volumetriceffects.cfg");
- m_cvarGroupOrder.push_back("Config/CVarGroups/sys_spec_water.cfg");
- m_cvarGroupOrder.push_back("miscellaneous");
-
- m_platformStrings.push_back(AZStd::make_pair("PC", CONFIG_PC));
- m_platformStrings.push_back(AZStd::make_pair("OSX Metal", CONFIG_OSX_METAL));
- m_platformStrings.push_back(AZStd::make_pair("Android", CONFIG_ANDROID));
- m_platformStrings.push_back(AZStd::make_pair("iOS", CONFIG_IOS));
-#if defined(AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS)
-#define AZ_RESTRICTED_PLATFORM_EXPANSION(CodeName, CODENAME, codename, PrivateName, PRIVATENAME, privatename, PublicName, PUBLICNAME, publicname, PublicAuxName1, PublicAuxName2, PublicAuxName3)\
- m_platformStrings.push_back(AZStd::make_pair(PublicAuxName2, CONFIG_##CODENAME));
- AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS
-#undef AZ_RESTRICTED_PLATFORM_EXPANSION
-#endif
- m_platformStrings.push_back(AZStd::make_pair("Custom", CONFIG_INVALID_PLATFORM));
-
- for (auto& platformString : m_platformStrings)
- {
- QString platform = platformString.first.c_str();
- m_ui->m_platformEntry->addItem(platform);
- }
-
- QSettings settings("O3DE", "O3DE");
- settings.beginGroup("GraphicsSettingsDialog");
-
- if (settings.contains("Platform"))
- {
- QString platformName = settings.value("Platform").toString();
- AZStd::string azPlatform = platformName.toUtf8().data();
- m_currentPlatform = GetConfigPlatformFromName(azPlatform);
- if (m_currentPlatform == CONFIG_INVALID_PLATFORM)
- {
- ShowCustomSpecOption(true);
- }
- }
-
- settings.endGroup();
-
- SetPlatformEntry(m_currentPlatform);
-
- BuildUI();
-
- connect(m_ui->m_graphicsSettingsTreeView, &QTreeView::collapsed, this, [&](const QModelIndex& index) { SetCollapsed(index, true); });
- connect(m_ui->m_graphicsSettingsTreeView, &QTreeView::expanded, this, [&](const QModelIndex& index) { SetCollapsed(index, false); });
-
- AzQtComponents::StyleManager::setStyleSheet(this, "style:GraphicsSettingsDialog.qss");
-}
-
-GraphicsSettingsDialog::~GraphicsSettingsDialog()
-{
- QSettings settings("O3DE", "O3DE");
- settings.beginGroup("GraphicsSettingsDialog");
-
- auto platformCheck = [this](AZStd::pair& stringConfigPair) { return stringConfigPair.second == m_currentPlatform; };
- auto platformStringsIterator = AZStd::find_if(m_platformStrings.begin(), m_platformStrings.end(), platformCheck);
- if (platformStringsIterator != m_platformStrings.end())
- {
- settings.setValue("Platform", platformStringsIterator->first.c_str());
- }
- else
- {
- settings.remove("Platform");
- }
-
- settings.beginGroup("cvarGroup");
-
- for (auto& collapseIterator : m_uiCollapseGroup)
- {
- settings.setValue(collapseIterator->m_groupName, collapseIterator->m_isCollapsed);
- }
-
- settings.endGroup();
- settings.endGroup();
- settings.sync();
-
- for (CollapseGroup* group : m_uiCollapseGroup)
- {
- // Destructor of CollapseGroup will set the members
- // pointing to nullptr. The actually destruction of the
- // widgets will be done on destruction of m_ui
- delete group;
- }
-
- for (ParameterWidget* widget : m_parameterWidgets)
- {
- // Destructor of ParameterWidget will set the members
- // pointing to nullptr. The actually destruction of the
- // widgets will be done on destruction of m_ui
- delete widget;
- }
-
- // Delete m_ui will destruct all the UI elements with in the ui file
- // Since m_ui is a QScopedPointer which will cleanup itself on the end
- // of the scope.
-}
-
-void GraphicsSettingsDialog::SetSettingsTree(int numColumns)
-{
- m_graphicsSettingsModel->clear();
- m_uiCollapseGroup.clear();
- m_graphicsSettingsModel->setColumnCount(numColumns);
-
- for (int i = 1; i < numColumns; ++i)
- {
- m_ui->m_graphicsSettingsTreeView->header()->setSectionResizeMode(i, QHeaderView::Stretch);
- }
-
- m_ui->m_graphicsSettingsTreeView->setColumnWidth(0, 200);
- m_ui->m_graphicsSettingsTreeView->header()->setMinimumSectionSize(100);
-
- m_graphicsSettingsModel->setHeaderData(0, Qt::Horizontal, "Properties");
-
- auto parentItem = m_graphicsSettingsModel->invisibleRootItem();
-
- for (int i = 0; i < aznumeric_cast(GraphicsSettings::numSettings); ++i)
- {
- QStandardItem* row = new QStandardItem();
- row->setData(groupNames[i], Qt::DisplayRole);
- parentItem->appendRow(row);
- SetCollapsedLayout(groupNames[i].replace(" ", ""), row);
- }
- m_numColumns = numColumns;
-
- m_cvarGroupData["Config/CVarGroups/sys_spec_gameeffects.cfg"].m_treeRowItem = m_graphicsSettingsModel->item(aznumeric_cast(GraphicsSettings::GameEffects));
- m_cvarGroupData["Config/CVarGroups/sys_spec_light.cfg"].m_treeRowItem = m_graphicsSettingsModel->item(aznumeric_cast(GraphicsSettings::Light));
- m_cvarGroupData["Config/CVarGroups/sys_spec_objectdetail.cfg"].m_treeRowItem = m_graphicsSettingsModel->item(aznumeric_cast(GraphicsSettings::ObjectDetail));
- m_cvarGroupData["Config/CVarGroups/sys_spec_particles.cfg"].m_treeRowItem = m_graphicsSettingsModel->item(aznumeric_cast(GraphicsSettings::Particles));
- m_cvarGroupData["Config/CVarGroups/sys_spec_physics.cfg"].m_treeRowItem = m_graphicsSettingsModel->item(aznumeric_cast(GraphicsSettings::Physics));
- m_cvarGroupData["Config/CVarGroups/sys_spec_postprocessing.cfg"].m_treeRowItem = m_graphicsSettingsModel->item(aznumeric_cast(GraphicsSettings::PostProcessing));
- m_cvarGroupData["Config/CVarGroups/sys_spec_quality.cfg"].m_treeRowItem = m_graphicsSettingsModel->item(aznumeric_cast(GraphicsSettings::Quality));
- m_cvarGroupData["Config/CVarGroups/sys_spec_shading.cfg"].m_treeRowItem = m_graphicsSettingsModel->item(aznumeric_cast(GraphicsSettings::Shading));
- m_cvarGroupData["Config/CVarGroups/sys_spec_shadows.cfg"].m_treeRowItem = m_graphicsSettingsModel->item(aznumeric_cast(GraphicsSettings::Shadows));
- m_cvarGroupData["Config/CVarGroups/sys_spec_sound.cfg"].m_treeRowItem = m_graphicsSettingsModel->item(aznumeric_cast(GraphicsSettings::Sound));
- m_cvarGroupData["Config/CVarGroups/sys_spec_texture.cfg"].m_treeRowItem = m_graphicsSettingsModel->item(aznumeric_cast(GraphicsSettings::Texture));
- m_cvarGroupData["Config/CVarGroups/sys_spec_textureresolution.cfg"].m_treeRowItem = m_graphicsSettingsModel->item(aznumeric_cast(GraphicsSettings::TextureResolution));
- m_cvarGroupData["Config/CVarGroups/sys_spec_volumetriceffects.cfg"].m_treeRowItem = m_graphicsSettingsModel->item(aznumeric_cast(GraphicsSettings::VolumetricEffects));
- m_cvarGroupData["Config/CVarGroups/sys_spec_water.cfg"].m_treeRowItem = m_graphicsSettingsModel->item(aznumeric_cast(GraphicsSettings::Water));
- m_cvarGroupData["miscellaneous"].m_treeRowItem = m_graphicsSettingsModel->item(aznumeric_cast(GraphicsSettings::Miscellaneous));
-}
-
-void GraphicsSettingsDialog::OnLoadConfigurationEntry(const char* strKey, const char* strValue, const char* strGroup)
-{
- AZStd::string key = strKey;
- ICVar* cvar = gEnv->pConsole->GetCVar(strKey);
-
- if (cvar)
- {
- AZStd::transform(key.begin(), key.end(), key.begin(), tolower);
- if (azstricmp(key.c_str(), "sys_spec_full") == 0 || key.find("sys_spec_") == key.npos)
- {
- int type = cvar->GetType();
- AZStd::any val;
- if (type == CVAR_INT)
- {
- val = atoi(strValue);
- }
- else if (type == CVAR_FLOAT)
- {
- val = static_cast(atof(strValue));
- }
- else
- {
- val = AZStd::string(strValue);
- }
-
- // Platform cfg file (ex. pc_veryhigh.cfg)
- if (strGroup[0] == '\0')
- {
- // New cvar loaded into map
- if (m_cVarTracker.find(key) == m_cVarTracker.end())
- {
- m_cVarTracker[key].type = type;
- m_cVarTracker[key].cvarGroup = "miscellaneous";
- AZStd::any empty;
- if (type == CVAR_INT)
- {
- empty = 0;
- }
- else if (type == CVAR_FLOAT)
- {
- empty = 0.0f;
- }
- else
- {
- empty = AZStd::string("");
- }
- m_cVarTracker[key].fileVals.resize(m_numSpecLevels, CVarFileStatus(empty, empty, empty));
- }
-
- m_cVarTracker[key].fileVals[m_currentSpecIndex].editedValue = val;
- m_cVarTracker[key].fileVals[m_currentSpecIndex].overwrittenValue = val;
- }
- // default group in sys_spec cfg file
- else if (azstricmp(strGroup, "default") == 0)
- {
- CVarFileStatus defaultVal(val, val, val);
- if (m_cVarTracker.find(key) == m_cVarTracker.end())
- {
- // New cvar loaded into map
- CVarInfo& currentCVar = m_cVarTracker[key];
- currentCVar.type = cvar->GetType();
- currentCVar.fileVals.resize(m_numSpecLevels, defaultVal);
- }
- else
- {
- // Reset values, if there's a platform override it always follows the sys_spec_*.cfg files.
- // Resetting avoids the issue where some spec levels are never set because of an extra platform
- // override load happening earlier just to store the value of sys_spec_full.
- for (int specLevel = 0; specLevel < m_numSpecLevels; ++specLevel)
- {
- m_cVarTracker[key].fileVals[specLevel] = defaultVal;
- }
- }
- // Overwrite miscellaneous if mentioned in platform config file
- m_cVarTracker[key].cvarGroup = m_currentConfigFilename;
- }
- // specific index in sys_spec cfg file
- else
- {
- int group = 0;
-
- if (azsscanf(strGroup, "%d", &group) == 1)
- {
- auto sysSpecFull = m_cVarTracker.find("sys_spec_full");
- if (sysSpecFull != m_cVarTracker.end())
- {
- CVarFileStatus indexAssignment(val, val, val);
- for (int specLevel = 0; specLevel < m_numSpecLevels; ++specLevel)
- {
- // Only apply cvar change to configurations with sys_spec_Full matching the index
- int overwrittenValue = 0;
- if (AZStd::any_numeric_cast(&sysSpecFull->second.fileVals[specLevel].overwrittenValue, overwrittenValue) && group == overwrittenValue)
- {
- m_cVarTracker[key].fileVals[specLevel] = indexAssignment;
- }
- }
- }
- }
- }
- }
- }
-}
-
-// Loads UI column for specific cfg file (ex. pc_low.cfg)
-void GraphicsSettingsDialog::BuildColumn(int specLevel)
-{
- if (specLevel < 0 || specLevel >= m_numSpecLevels)
- {
- return;
- }
-
- for (auto& it : m_cvarGroupData)
- {
- it.second.m_currentRow = 0;
- }
-
- for (auto& it : m_cVarTracker)
- {
- QString str = it.first.c_str();
- QWidget* input = nullptr;
- if (it.second.type == CVAR_INT)
- {
- AzQtComponents::SpinBox* intval = new AzQtComponents::SpinBox(nullptr);
- intval->setFocusPolicy(Qt::StrongFocus);
- intval->setMaximum(INT32_MAX);
- intval->setMinimum(INT32_MIN);
- int editedValue;
- if (AZStd::any_numeric_cast(&it.second.fileVals[specLevel].editedValue, editedValue))
- {
- intval->setValue(editedValue);
- }
- m_cvarGroupData[it.second.cvarGroup].m_cvarSpinBoxes.push_back(intval);
- connect(intval, SIGNAL(valueChanged(int)), this, SLOT(CVarChanged(int)));
- input = intval;
- }
- else if (it.second.type == CVAR_FLOAT)
- {
- AzQtComponents::DoubleSpinBox* doubleval = new AzQtComponents::DoubleSpinBox(nullptr);
- doubleval->setFocusPolicy(Qt::StrongFocus);
- doubleval->setMaximum(FLT_MAX);
- doubleval->setMinimum(-FLT_MAX);
- float editedValue;
- if (AZStd::any_numeric_cast(&it.second.fileVals[specLevel].editedValue, editedValue))
- {
- doubleval->setValue(editedValue);
- }
- m_cvarGroupData[it.second.cvarGroup].m_cvarDoubleSpinBoxes.push_back(doubleval);
- connect(doubleval, SIGNAL(valueChanged(double)), this, SLOT(CVarChanged(double)));
- input = doubleval;
- }
- else
- {
- QLineEdit* stringval = new QLineEdit(nullptr);
- AZStd::string* editedValue = AZStd::any_cast(&it.second.fileVals[specLevel].editedValue);
- stringval->setText(editedValue->c_str());
- m_cvarGroupData[it.second.cvarGroup].m_cvarLineEdits.push_back(stringval);
- connect(stringval, SIGNAL(textChanged(const QString&)), this, SLOT(CVarChanged(const QString&)));
- input = stringval;
- }
-
- if (input)
- {
- input->setObjectName(str);
- input->setProperty("specLevel", specLevel);
- QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
- sizePolicy.setHeightForWidth(input->sizePolicy().hasHeightForWidth());
- input->setSizePolicy(sizePolicy);
- input->setMinimumSize(QSize(INPUT_MIN_WIDTH, INPUT_MIN_HEIGHT));
- QStandardItem* parentItem = m_cvarGroupData[it.second.cvarGroup].m_treeRowItem;
- QModelIndex parentIndex = parentItem->index();
- QModelIndex thisIndex = m_graphicsSettingsModel->index(m_cvarGroupData[it.second.cvarGroup].m_currentRow++, specLevel + CVAR_VALUE_COLUMN_OFFSET, parentIndex);
- m_ui->m_graphicsSettingsTreeView->setIndexWidget(thisIndex, input);
- m_parameterWidgets.push_back(new ParameterWidget(input, it.first.c_str()));
- m_cvarGroupData[it.second.cvarGroup].m_widgetInsertOrder.push_back(input);
- }
- }
-}
-
-void GraphicsSettingsDialog::LoadPlatformConfigurations()
-{
- const int numColumns = m_cfgFiles[m_currentPlatform].size() + 1;
- SetSettingsTree(numColumns);
-
- for (ParameterWidget* widget : m_parameterWidgets)
- {
- delete widget;
- }
- m_parameterWidgets.clear();
-
- m_ui->m_applyButton->setEnabled(false);
- m_dirtyCVarCount = 0;
-
- // Load platform cfg files to load in sys_spec_Full
- for (size_t cfgFileIndex = 0; cfgFileIndex < m_cfgFiles[m_currentPlatform].size(); ++cfgFileIndex)
- {
- m_currentSpecIndex = cfgFileIndex;
- m_currentConfigFilename = m_cfgFiles[m_currentPlatform][cfgFileIndex];
- GetISystem()->LoadConfiguration(m_currentConfigFilename.c_str(), this, true);
- }
-
- if (m_cVarTracker.find("sys_spec_full") == m_cVarTracker.end())
- {
- m_cVarTracker.clear();
- CleanUI();
- ShowCategories(false);
- QMessageBox::warning(this, "Warning", "Invalid custom spec file (missing sys_spec_full).",
- QMessageBox::Ok);
- return;
- }
-
- // Load sys_spec cfgs based on sys_spec_Full values
- LoadCVarGroupDirectory(m_cvarGroupsFolder);
-
- setUpdatesEnabled(false);
-
- // Reload platform cfg files to override sys_spec index assignments and load rows with filenames of given platform
- for (size_t cfgFileIndex = 0; cfgFileIndex < m_cfgFiles[m_currentPlatform].size(); ++cfgFileIndex)
- {
- m_currentSpecIndex = cfgFileIndex;
- m_currentConfigFilename = m_cfgFiles[m_currentPlatform][cfgFileIndex];
- GetISystem()->LoadConfiguration(m_currentConfigFilename.c_str(), this, true);
-
- /*CVarGroupInfo& specFileGroup =*/ m_cvarGroupData["SpecFile"];
- m_graphicsSettingsModel->setHeaderData(cfgFileIndex + CVAR_VALUE_COLUMN_OFFSET, Qt::Horizontal, QApplication::translate("GraphicsSettingsDialog", m_cfgFiles[m_currentPlatform][cfgFileIndex].c_str()));
- }
-
- // Loads column of cvar names
- for (auto& it : m_cVarTracker)
- {
- QLabel* cVarLabel = new QLabel(nullptr);
- QString str = it.first.c_str();
- QString strLabel = str + "Label";
- cVarLabel->setObjectName(strLabel);
- QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
- sizePolicy.setHeightForWidth(cVarLabel->sizePolicy().hasHeightForWidth());
- cVarLabel->setSizePolicy(sizePolicy);
- cVarLabel->setMinimumSize(QSize(INPUT_MIN_WIDTH, INPUT_MIN_HEIGHT));
- cVarLabel->setAlignment(Qt::AlignLeading | Qt::AlignLeft | Qt::AlignVCenter);
- QStandardItem* cVarItem = new QStandardItem();
- cVarItem->setData(QApplication::translate("GraphicsSettingsDialog", it.first.c_str(), 0), Qt::DisplayRole);
- QList items{ cVarItem };
- for (int i = 1; i < numColumns; ++i)
- {
- items << new QStandardItem();
- }
- m_cvarGroupData[it.second.cvarGroup].m_treeRowItem->appendRow(items);
- cVarLabel->setText(QApplication::translate("GraphicsSettingsDialog", it.first.c_str(), 0));
- m_cvarGroupData[it.second.cvarGroup].m_cvarLabels.push_back(cVarLabel);
-
- if (ICVar* cvar = gEnv->pConsole->GetCVar(it.first.c_str()))
- {
- cVarLabel->setToolTip(cvar->GetHelp());
- }
- }
-
- // Loads columns of cvar values for each platform cfg file
- for (int cfgFileIndex = 0; cfgFileIndex < m_cfgFiles[m_currentPlatform].size(); ++cfgFileIndex)
- {
- BuildColumn(cfgFileIndex);
- }
-
- // Remove any section that has no visible controls
- for (auto& it : m_cvarGroupData)
- {
- int totalControlCount = 0;
- CVarGroupInfo& currentCvarGroupInfo = it.second;
- totalControlCount += currentCvarGroupInfo.m_cvarDoubleSpinBoxes.size();
- totalControlCount += currentCvarGroupInfo.m_cvarSpinBoxes.size();
- totalControlCount += currentCvarGroupInfo.m_cvarLineEdits.size();
- totalControlCount += currentCvarGroupInfo.m_platformLabels.size();
-
- if (totalControlCount == 0)
- {
- if (currentCvarGroupInfo.m_treeRowItem)
- {
- int i = 0;
- for (auto& collapseIterator : m_uiCollapseGroup)
- {
- if (collapseIterator->m_groupRow == currentCvarGroupInfo.m_treeRowItem)
- {
- m_uiCollapseGroup.remove(i);
- break;
- }
- ++i;
- }
- m_graphicsSettingsModel->removeRow(currentCvarGroupInfo.m_treeRowItem->row());
- }
- }
- }
-
- setUpdatesEnabled(true);
-
- QSettings settings("O3DE", "O3DE");
- settings.beginGroup("GraphicsSettingsDialog");
- settings.beginGroup("cvarGroup");
-
- for (auto& collapseIterator : m_uiCollapseGroup)
- {
- bool groupCollapsed = settings.value(collapseIterator->m_groupName, collapseIterator->m_isCollapsed).toBool();
- if (collapseIterator->m_isCollapsed != groupCollapsed)
- {
- collapseIterator->ToggleCollapsed();
- }
- }
-
- settings.endGroup();
- settings.endGroup();
-}
-
-void GraphicsSettingsDialog::LoadCVarGroupDirectory(const AZStd::string& path)
-{
- AZ::IO::LocalFileIO::FindFilesCallbackType fileFinderCb;
- fileFinderCb = [&](const char* fullPath) -> bool
- {
- if (gEnv->pFileIO->IsDirectory(fullPath))
- {
- // recurse into subdirectory
- gEnv->pFileIO->FindFiles(fullPath, "*.cfg", fileFinderCb);
- }
- else
- {
- m_currentConfigFilename = fullPath;
- GetISystem()->LoadConfiguration(fullPath, this, false);
- }
-
- return true; // keep searching
- };
-
- gEnv->pFileIO->FindFiles(path.c_str(), "*.cfg", fileFinderCb);
-}
-
-//Build UI, link signals and set the data for device list.
-void GraphicsSettingsDialog::BuildUI()
-{
- connect(m_ui->m_cancelButton, &QPushButton::clicked, this, &GraphicsSettingsDialog::reject);
- connect(m_ui->m_applyButton, &QPushButton::clicked, this, &GraphicsSettingsDialog::accept);
- connect(m_ui->m_platformEntry, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(PlatformChanged(const QString&)));
- connect(m_ui->m_selectCustomSpecButton, &QPushButton::clicked, this, &GraphicsSettingsDialog::OpenCustomSpecDialog);
-
- if (!m_cfgFiles[m_currentPlatform].empty())
- {
- LoadPlatformConfigurations();
- }
- else
- {
- m_cVarTracker.clear();
- CleanUI();
- ShowCategories(false);
- }
-}
-
-void GraphicsSettingsDialog::CleanUI()
-{
- setUpdatesEnabled(false);
-
- QSettings settings("O3DE", "O3DE");
- settings.beginGroup("GraphicsSettingsDialog");
- settings.beginGroup("cvarGroup");
-
- for (auto& collapseIterator : m_uiCollapseGroup)
- {
- settings.setValue(collapseIterator->m_groupName, collapseIterator->m_isCollapsed);
- }
-
- settings.endGroup();
- settings.endGroup();
- settings.sync();
-
- m_cVarTracker.clear();
-
- // Uncollapse groups
- for (auto& collapseIt : m_uiCollapseGroup)
- {
- if (collapseIt->m_isCollapsed)
- {
- collapseIt->ToggleCollapsed();
- }
- }
-
- setUpdatesEnabled(true);
-}
-
-void GraphicsSettingsDialog::ShowCategories(bool show)
-{
- if (m_showCategories == show)
- {
- return;
- }
-
- m_showCategories = show;
- m_ui->m_graphicsSettingsTreeView->setVisible(show);
-}
-
-void GraphicsSettingsDialog::ShowCustomSpecOption(bool show)
-{
- if (m_showCustomSpec == show)
- {
- return;
- }
-
- m_showCustomSpec = show;
- m_ui->m_selectCustomSpecButton->setVisible(m_showCustomSpec);
- m_ui->m_lineSpacer->setVisible(m_showCustomSpec);
-}
-
-void GraphicsSettingsDialog::PlatformChanged(const QString& platform)
-{
- bool change = true;
- if (m_dirtyCVarCount > 0 && !SendUnsavedChangesWarning(false))
- {
- change = false;
- }
-
- if (change)
- {
- AZStd::string azPlatform = platform.toStdString().c_str();
-
- m_currentPlatform = GetConfigPlatformFromName(azPlatform);
- if (m_currentPlatform == CONFIG_INVALID_PLATFORM) // "Custom" selected
- {
- ShowCustomSpecOption(true);
- CleanUI();
- if (m_cfgFiles[CONFIG_INVALID_PLATFORM].empty()) // if we don't have a custom spec
- {
- ShowCategories(false);
- m_ui->m_applyButton->setEnabled(false);
- m_dirtyCVarCount = 0;
- }
- else
- {
- ShowCategories(true);
- LoadPlatformConfigurations();
- }
- }
- else
- {
- ShowCustomSpecOption(false);
- ShowCategories(true);
- CleanUI();
- LoadPlatformConfigurations();
- }
- }
- else
- {
- m_ui->m_platformEntry->blockSignals(true);
- SetPlatformEntry(m_currentPlatform);
- m_ui->m_platformEntry->blockSignals(false);
- }
-}
-
-bool GraphicsSettingsDialog::SendUnsavedChangesWarning(bool cancel)
-{
- int result = QMessageBox::Yes;
-
- if (cancel)
- {
- result = QMessageBox::question(this, "Warning", "There are currently unsaved changed. Are you sure you want to cancel?",
- QMessageBox::Yes, QMessageBox::No);
- }
- else
- {
- result = QMessageBox::question(this, "Warning", "There are currently unsaved changed. Are you sure you want to change configurations?",
- QMessageBox::Yes, QMessageBox::No);
- }
-
- return (result == QMessageBox::Yes);
-}
-
-bool GraphicsSettingsDialog::CVarChanged(AZStd::any val, const char* cvarName, int specLevel)
-{
- // Checking if the edited value (before change) is equal to the overwritten value
- bool dirtyBefore = false;
- AZStd::string azcvarName = cvarName;
- AZStd::pair cvarInfo = AZStd::make_pair(azcvarName, m_cVarTracker[cvarName]);
- if (CheckCVarStatesForDiff(&cvarInfo, specLevel, EDITED_OVERWRITTEN_COMPARE))
- {
- dirtyBefore = true;
- }
-
- if (azstricmp(cvarName, "sys_spec_full") == 0)
- {
- //Pop out the warning dialog for sys_spec_Full since all cvars will be changed
- int result = QMessageBox::Ok;
-
- result = QMessageBox::question(this, "Warning", "Modifying sys_spec_full will override any unsaved changes.",
- QMessageBox::Ok, QMessageBox::Cancel);
-
- // Cancel - Change sys_spec_full qspinbox value back
- if (result == QMessageBox::Cancel)
- {
- return false;
- }
- else // OK - reload column
- {
- // Updating sys_spec_full for when adding cvargroup directory
- m_cVarTracker[cvarName].fileVals[specLevel].editedValue = val;
- gEnv->pSystem->AddCVarGroupDirectory(m_cvarGroupsFolder);
- m_currentConfigFilename = m_cfgFiles[m_currentPlatform][specLevel];
- m_currentSpecIndex = specLevel;
- GetISystem()->LoadConfiguration(m_currentConfigFilename.c_str(), this, true);
- // Updating sys_spec_full since overwritten from loading platform cfg
- m_cVarTracker[cvarName].fileVals[specLevel].editedValue = val;
- BuildColumn(specLevel);
- }
- }
- else
- {
- m_cVarTracker[cvarName].fileVals[specLevel].editedValue = val;
- }
-
- // Checking if the newly edited value is equal to the overwritten value
- cvarInfo = AZStd::make_pair(azcvarName, m_cVarTracker[cvarName]);
- if (CheckCVarStatesForDiff(&cvarInfo, specLevel, EDITED_OVERWRITTEN_COMPARE))
- {
- if (!dirtyBefore)
- {
- m_ui->m_applyButton->setEnabled(true);
- m_dirtyCVarCount++;
- }
- }
- else
- {
- if (dirtyBefore)
- {
- m_dirtyCVarCount--;
- if (m_dirtyCVarCount == 0)
- {
- m_ui->m_applyButton->setEnabled(false);
- }
- }
- }
-
- return true;
-}
-
-void GraphicsSettingsDialog::CVarChanged(int i)
-{
- AzQtComponents::SpinBox* box = static_cast(sender());
- QString str = box->objectName();
- QByteArray ba = str.toUtf8();
- const char* cvarName = ba.data();
-
- int specLevel = box->property("specLevel").toInt();
-
- AZStd::any val;
- val = i;
-
- if (!CVarChanged(val, cvarName, specLevel))
- {
- // sys_spec_full warning cancelled
- box->blockSignals(true);
- int editedValue;
- if (AZStd::any_numeric_cast(&m_cVarTracker[cvarName].fileVals[specLevel].editedValue, editedValue))
- {
- box->setValue(editedValue);
- }
- box->blockSignals(false);
- }
-}
-
-void GraphicsSettingsDialog::CVarChanged(double d)
-{
- AzQtComponents::DoubleSpinBox* box = static_cast(sender());
- QString str = box->objectName();
- QByteArray ba = str.toUtf8();
- const char* cvarName = ba.data();
-
- AZStd::any val;
- val = d;
-
- int specLevel = box->property("specLevel").toInt();
-
- if (!CVarChanged(val, cvarName, specLevel))
- {
- // only can return false from sys_spec_full, which is an int cvar
- }
-}
-
-void GraphicsSettingsDialog::CVarChanged(const QString& s)
-{
- QLineEdit* box = qobject_cast(sender());
- QString str = box->objectName();
- QByteArray ba = str.toUtf8();
- const char* cvarName = ba.data();
-
- AZStd::any val;
- val = AZStd::string(s.toStdString().c_str());
-
- int specLevel = box->property("specLevel").toInt();
-
- if (!CVarChanged(val, cvarName, specLevel))
- {
- // only can return false from sys_spec_full, which is an int cvar
- }
-}
-
-// Returns true if there is a difference between the two cvar states
-bool GraphicsSettingsDialog::CheckCVarStatesForDiff(AZStd::pair* it, int cfgFileIndex, CVarStateComparison cmp)
-{
- if (it->second.type == CVAR_INT)
- {
- int editedVal, overwrittenVal, originalVal;
- if (AZStd::any_numeric_cast(&it->second.fileVals[cfgFileIndex].editedValue, editedVal) &&
- AZStd::any_numeric_cast(&it->second.fileVals[cfgFileIndex].overwrittenValue, overwrittenVal) &&
- AZStd::any_numeric_cast(&it->second.fileVals[cfgFileIndex].originalValue, originalVal))
- {
- if ((cmp == EDITED_OVERWRITTEN_COMPARE && editedVal != overwrittenVal) ||
- (cmp == EDITED_ORIGINAL_COMPARE && editedVal != originalVal) ||
- (cmp == OVERWRITTEN_ORIGINAL_COMPARE && overwrittenVal != originalVal))
- {
- return true;
- }
- }
- }
- else if (it->second.type == CVAR_FLOAT)
- {
- float editedVal, overwrittenVal, originalVal;
- if (AZStd::any_numeric_cast(&it->second.fileVals[cfgFileIndex].editedValue, editedVal) &&
- AZStd::any_numeric_cast(&it->second.fileVals[cfgFileIndex].overwrittenValue, overwrittenVal) &&
- AZStd::any_numeric_cast(&it->second.fileVals[cfgFileIndex].originalValue, originalVal))
- {
- if ((cmp == EDITED_OVERWRITTEN_COMPARE && editedVal != overwrittenVal) ||
- (cmp == EDITED_ORIGINAL_COMPARE && editedVal != originalVal) ||
- (cmp == OVERWRITTEN_ORIGINAL_COMPARE && overwrittenVal != originalVal))
- {
- return true;
- }
- }
- }
- else
- {
- AZStd::string editedVal = *AZStd::any_cast(&it->second.fileVals[cfgFileIndex].editedValue);
- AZStd::string overwrittenVal = *AZStd::any_cast(&it->second.fileVals[cfgFileIndex].overwrittenValue);
- AZStd::string originalVal = *AZStd::any_cast(&it->second.fileVals[cfgFileIndex].originalValue);
- if ((cmp == EDITED_OVERWRITTEN_COMPARE && editedVal.compare(overwrittenVal) != 0) ||
- (cmp == EDITED_ORIGINAL_COMPARE && editedVal.compare(originalVal) != 0) ||
- (cmp == OVERWRITTEN_ORIGINAL_COMPARE && overwrittenVal.compare(originalVal) != 0))
- {
- return true;
- }
- }
- return false;
-}
-
-///////////////////////////////////////////////////////////////////////
-// settings file management
-void GraphicsSettingsDialog::reject()
-{
- if (m_dirtyCVarCount > 0)
- {
- if (SendUnsavedChangesWarning(true))
- {
- QDialog::reject();
- }
- }
- else
- {
- QDialog::reject();
- }
-}
-
-void GraphicsSettingsDialog::accept()
-{
- int result = QMessageBox::Yes;
-
- //Pop out the warning dialog for customized setting
- result = QMessageBox::question(this, "Warning", "A non-tested setting could potentially crash the game if the setting does not match the device. Are you sure you want to apply the customized setting?",
- QMessageBox::Yes, QMessageBox::No);
-
- //Save and exit
- if (result == QMessageBox::Yes)
- {
- SaveSystemSettings();
- }
-}
-
-void GraphicsSettingsDialog::OpenCustomSpecDialog()
-{
- AZ::IO::FixedMaxPath projectPath = AZ::Utils::GetProjectPath();
- projectPath /= SETTINGS_FILE_PATH.toUtf8().constData();
- QString settingsPath = QString::fromUtf8(projectPath.c_str(), aznumeric_cast(projectPath.Native().size()));
-
- CAutoDirectoryRestoreFileDialog importCustomSpecDialog(QFileDialog::AcceptOpen, QFileDialog::ExistingFile, ".cfg", settingsPath, CFG_FILEFILTER, {}, {}, this);
-
- if (importCustomSpecDialog.exec())
- {
- QString file = importCustomSpecDialog.selectedFiles().first();
- if (!file.isEmpty())
- {
- ApplyCustomSpec(file);
- }
- }
-}
-
-void GraphicsSettingsDialog::ApplyCustomSpec(const QString& customFilePath)
-{
- if (customFilePath.isEmpty())
- {
- return;
- }
-
- QFile customFile(customFilePath);
- if (!customFile.exists())
- {
- QMessageBox::warning(this, "Warning", "Could not find custom spec file.",
- QMessageBox::Ok);
- return;
- }
-
- bool change = true;
- if (m_dirtyCVarCount > 0 && !SendUnsavedChangesWarning(false))
- {
- change = false;
- }
-
- if (change)
- {
- AZStd::string filename = customFilePath.toStdString().c_str();
- filename = filename.substr(filename.find_last_of('/') + 1);
-
- m_currentPlatform = CONFIG_INVALID_PLATFORM;
-
- bool alreadyLoaded = IsCustomSpecAlreadyLoaded(filename);
- if (m_cfgFiles[CONFIG_INVALID_PLATFORM].size() < m_numSpecLevels && !alreadyLoaded)
- {
- m_cfgFiles[CONFIG_INVALID_PLATFORM].push_back(filename);
- }
- else if (alreadyLoaded)
- {
- QMessageBox::warning(this, "Warning", "The selected custom spec file is already loaded. No changes have been made.",
- QMessageBox::Ok);
- return;
- }
-
- if (m_cfgFiles[CONFIG_INVALID_PLATFORM].size() == m_numSpecLevels)
- {
- m_ui->m_selectCustomSpecButton->setEnabled(false);
- }
-
- ShowCategories(true);
-
- CleanUI();
-
- LoadPlatformConfigurations();
- }
-}
-
-void GraphicsSettingsDialog::UnloadCustomSpec(int specLevel)
-{
- if (specLevel < 0 || specLevel >= m_cfgFiles[CONFIG_INVALID_PLATFORM].size())
- {
- return;
- }
-
- bool shouldUnload = m_dirtyCVarCount <= 0 || SendUnsavedChangesWarning(false);
-
- if (shouldUnload)
- {
- m_cfgFiles[CONFIG_INVALID_PLATFORM].erase(m_cfgFiles[CONFIG_INVALID_PLATFORM].begin() + specLevel);
-
- CleanUI();
-
- if (!m_cfgFiles[CONFIG_INVALID_PLATFORM].empty())
- {
- LoadPlatformConfigurations();
- }
- else
- {
- ShowCategories(false);
- }
- }
-}
-
-bool GraphicsSettingsDialog::IsCustomSpecAlreadyLoaded(const AZStd::string& filename) const
-{
- auto& customConfigFilenames = m_cfgFiles.at(CONFIG_INVALID_PLATFORM);
- const auto& findResult = AZStd::find(customConfigFilenames.begin(), customConfigFilenames.end(), filename.c_str());
-
- return findResult != customConfigFilenames.end();
-}
-
-void GraphicsSettingsDialog::SetCollapsedLayout(const QString& groupName, QStandardItem* groupRow)
-{
- CollapseGroup* cgroup = new CollapseGroup(m_ui->m_graphicsSettingsTreeView);
- cgroup->m_groupName = groupName;
- cgroup->m_groupRow = groupRow;
- m_uiCollapseGroup.push_back(cgroup);
-}
-
-void GraphicsSettingsDialog::SetPlatformEntry(ESystemConfigPlatform platform)
-{
- auto platformCheck = [&platform](AZStd::pair& stringConfigPair) { return stringConfigPair.second == platform; };
- auto platformStringsIterator = AZStd::find_if(m_platformStrings.begin(), m_platformStrings.end(), platformCheck);
- if (platformStringsIterator != m_platformStrings.end())
- {
- int platformIndex = m_ui->m_platformEntry->findText(platformStringsIterator->first.c_str());
- m_ui->m_platformEntry->setCurrentIndex(platformIndex);
- }
- else
- {
- AZ_Assert(false, "Platform not found in platform strings vector.");
- }
-}
-
-ESystemConfigPlatform GraphicsSettingsDialog::GetConfigPlatformFromName(const AZStd::string& platformName)
-{
- ESystemConfigPlatform configPlatform = CONFIG_INVALID_PLATFORM;
-
- auto platformNameCheck = [&platformName](AZStd::pair& stringConfigPair) { return (stringConfigPair.first == platformName); };
- auto configPlatformIterator = AZStd::find_if(m_platformStrings.begin(), m_platformStrings.end(), platformNameCheck);
- if (configPlatformIterator != m_platformStrings.end())
- {
- configPlatform = configPlatformIterator->second;
- }
- else
- {
- AZ_Assert(false, "Platform name not found in platform strings vector.");
- }
-
- return configPlatform;
-}
-
-// Save the current UI options to system qsettings
-void GraphicsSettingsDialog::SaveSystemSettings()
-{
- AZStd::vector successFiles;
- AZStd::vector nochangeFiles;
-
- for (int cfgFileIndex = 0; cfgFileIndex < m_cfgFiles[m_currentPlatform].size(); ++cfgFileIndex)
- {
- const QString eq = " = ";
- const QString cvarGroupString1 = "\n------------------------\n-- ";
- const QString cvarGroupString2 = "\n------------------------\n";
- QString commandList = "";
-
- int sysSpecFull;
- if (AZStd::any_numeric_cast(&m_cVarTracker["sys_spec_full"].fileVals[cfgFileIndex].editedValue, sysSpecFull))
- {
- commandList += "sys_spec_full" + eq + QString::number(sysSpecFull) + '\n';
- }
-
- QMap cvarGroupStrings;
-
- // Set to true as soon as cvar is found which is unique from current cfg file and index assignment
- bool saveOut = false;
-
- // Adding any dirty cvars not equal to sys_spec_full or any cvar in miscellaneous to command list
- for (auto& it : m_cVarTracker)
- {
- if ((CheckCVarStatesForDiff(&it, cfgFileIndex, EDITED_ORIGINAL_COMPARE) || it.second.cvarGroup == "miscellaneous") && azstricmp(it.first.c_str(), "sys_spec_full"))
- {
- AZStd::string cvarGroup = it.second.cvarGroup;
- if (azstricmp(cvarGroup.c_str(), "miscellaneous") != 0)
- {
- int fileIndex = cvarGroup.find_last_of('/') + 1;
- cvarGroup = cvarGroup.substr(fileIndex, cvarGroup.size() - fileIndex - 4);
- }
- QString qcvarGroup = cvarGroup.c_str();
- if (cvarGroupStrings.find(qcvarGroup) == cvarGroupStrings.end())
- {
- cvarGroupStrings[qcvarGroup] = cvarGroupString1 + qcvarGroup + cvarGroupString2;
- }
-
- if (it.second.type == CVAR_INT)
- {
- int val;
- if (AZStd::any_numeric_cast(&it.second.fileVals[cfgFileIndex].editedValue, val))
- {
- cvarGroupStrings[qcvarGroup] += it.first.c_str() + eq + QString::number(val) + '\n';
- }
- }
- else if (it.second.type == CVAR_FLOAT)
- {
- float val;
- if (AZStd::any_numeric_cast(&it.second.fileVals[cfgFileIndex].editedValue, val))
- {
- cvarGroupStrings[qcvarGroup] += it.first.c_str() + eq + QString::number(val) + '\n';
- }
- }
- else
- {
- cvarGroupStrings[qcvarGroup] += it.first.c_str() + eq + AZStd::any_cast(it.second.fileVals[cfgFileIndex].editedValue).c_str() + '\n';
- }
- }
-
- if (!saveOut)
- {
- saveOut = CheckCVarStatesForDiff(&it, cfgFileIndex, EDITED_OVERWRITTEN_COMPARE);
- }
- }
-
- // Adding the project name to the path so that the file is created there if it doesn't already exist
- // as we don't want to modify the version in Engine/config.
- AZ::IO::FixedMaxPath projectPath = AZ::Utils::GetProjectPath();
- projectPath /= SETTINGS_FILE_PATH.toUtf8().constData();
- QString settingsPath = QString::fromUtf8(projectPath.c_str(), aznumeric_cast(projectPath.Native().size()));
-
- QString settingsFile = settingsPath + m_cfgFiles[m_currentPlatform][cfgFileIndex].c_str();
-
- // Check if current settings differ from existing cfg
- if (saveOut)
- {
- // Adding any dirty cvars not equal to sys_spec_full to command list
- for (auto& it : cvarGroupStrings)
- {
- commandList += it;
- }
-
- if (CFileUtil::OverwriteFile(settingsFile.toStdString().c_str()))
- {
- if (!CFileUtil::CreateDirectory(settingsPath.toStdString().c_str()))
- {
- QMessageBox::warning(this, "Warning", "Could not create the directory for file \"" + settingsFile + "\". Failed to apply Graphics Setting.",
- QMessageBox::Ok);
- continue;
- }
-
- QByteArray dataArray = commandList.toUtf8().data();
-
- QFile file(settingsFile);
- if (!file.open(QIODevice::WriteOnly) || file.write(dataArray) != dataArray.size())
- {
- QMessageBox::warning(this, "Warning", "Could not write settings to file \"" + settingsFile + ". Failed to apply Graphics Setting.",
- QMessageBox::Ok);
- file.close();
- continue;
- }
-
- successFiles.push_back(settingsFile);
-
- // Update platform cvars to reflect new values
- for (auto& it : m_cVarTracker)
- {
- it.second.fileVals[cfgFileIndex].overwrittenValue = it.second.fileVals[cfgFileIndex].editedValue;
- }
-
- file.close();
- }
- else
- {
- QMessageBox::warning(this, "Warning", "Could not check out or make file writable: \"" + settingsFile + "\". Failed to apply Graphics Setting.",
- QMessageBox::Ok);
- }
- }
- else
- {
- nochangeFiles.push_back(settingsFile);
- }
- }
-
- // Print list of files which had no changes made
- if (nochangeFiles.size() > 0)
- {
- QString message = "No changes have been made to the following files:\n";
- for (int i = 0; i < nochangeFiles.size(); ++i)
- {
- message += nochangeFiles[i] + "\n";
- }
- QMessageBox::information(this, "Log", message, QMessageBox::Ok);
- }
-
- // Print list of files which were successfully saved
- if (successFiles.size() > 0)
- {
- QString message = "Updated the graphics setting correctly for the following files:\n";
- for (int i = 0; i < successFiles.size(); ++i)
- {
- message += successFiles[i] + "\n";
- }
- QMessageBox::information(this, "Log", message, QMessageBox::Ok);
- }
-
- // if we saved all of the files that we needed to then disable the save button again
- if (nochangeFiles.size() + successFiles.size() == m_cfgFiles[m_currentPlatform].size())
- {
- m_dirtyCVarCount = 0;
- m_ui->m_applyButton->setEnabled(false);
- }
-}
-
-void GraphicsSettingsDialog::SetCollapsed(const QModelIndex& index, bool flags)
-{
- QStandardItem* item = m_graphicsSettingsModel->itemFromIndex(index);
-
- for (auto& collapseIterator : m_uiCollapseGroup)
- {
- if (collapseIterator->m_groupRow == item)
- {
- collapseIterator->m_isCollapsed = flags;
- break;
- }
- }
-}
-
-/////////////////////////////////////////////////////////////////////////
-// Collapse Group
-GraphicsSettingsDialog::CollapseGroup::CollapseGroup(QTreeView* treeView)
- : m_treeView(treeView)
- , m_isCollapsed(true)
-{
-}
-
-void GraphicsSettingsDialog::CollapseGroup::ToggleCollapsed()
-{
- m_isCollapsed = !m_isCollapsed;
- const QModelIndex index = m_groupRow->index();
- if (m_isCollapsed)
- {
- m_treeView->collapse(index);
- }
- else
- {
- m_treeView->expand(index);
- }
-}
-
-///////////////////////////////////////////////////////////////////
-// ParameterWidget
-GraphicsSettingsDialog::ParameterWidget::ParameterWidget(QWidget* widget, QString parameterName)
- : m_widget(widget)
- , m_parameterName(parameterName)
-{
- m_widget->setToolTip(GetToolTip());
-}
-
-QString GraphicsSettingsDialog::ParameterWidget::GetToolTip() const
-{
- if (!m_parameterName.isEmpty())
- {
- QString tooltipText = QString(PARAMETER_TOOLTIP).arg(m_parameterName);
- return tooltipText;
- }
- return "";
-}
-
-GraphicsSettingsTreeView::GraphicsSettingsTreeView(QWidget* parent)
- : QTreeView(parent)
-{
-}
-
-GraphicsSettingsHeaderView::GraphicsSettingsHeaderView(GraphicsSettingsDialog* dialog, Qt::Orientation orientation, QWidget* parent)
- : QHeaderView(orientation, parent)
- , m_dialog(dialog)
-{
- setDefaultAlignment(Qt::AlignLeft);
-}
-
-bool GraphicsSettingsHeaderView::event(QEvent* e)
-{
- if (m_dialog->IsCustom())
- {
- GraphicsSettingsTreeView* treeView = qobject_cast(parent());
- if (treeView)
- {
- switch (e->type())
- {
- case QEvent::Enter:
- m_index = logicalIndexAt(static_cast(e)->pos());
- if (m_index > 0)
- {
- treeView->setSortingEnabled(true);
- treeView->sortByColumn(m_index, Qt::AscendingOrder);
- }
- break;
- case QEvent::Leave:
- treeView->setSortingEnabled(false);
- break;
- }
- }
- }
- return QHeaderView::event(e);
-}
-
-void GraphicsSettingsHeaderView::mouseReleaseEvent(QMouseEvent* e)
-{
- AZ_UNUSED(e);
- if (QMessageBox::question(
- this, QObject::tr("Unload Resource"),
- QObject::tr("Are you sure you want to unload the resource?"),
- QMessageBox::Yes | QMessageBox::Cancel) == QMessageBox::Yes)
- {
- m_dialog->UnloadCustomSpec(m_index - 1);
- }
-
-}
-
-void GraphicsSettingsHeaderView::mouseMoveEvent(QMouseEvent* e)
-{
- AZ_UNUSED(e);
- if (m_dialog->IsCustom())
- {
- GraphicsSettingsTreeView* treeView = qobject_cast(parent());
- int index = logicalIndexAt(e->pos());
- if (index != m_index)
- {
- m_index = index;
- if (m_index > 0)
- {
- treeView->setSortingEnabled(true);
- treeView->sortByColumn(m_index, Qt::AscendingOrder);
- }
- else
- {
- treeView->setSortingEnabled(false);
- }
- }
- }
-}
-
-GraphicsSettingsModel::GraphicsSettingsModel(QObject* parent)
- : QStandardItemModel(parent)
-{
-}
-
-Qt::ItemFlags GraphicsSettingsModel::flags(const QModelIndex& index) const
-{
- Qt::ItemFlags flags = Qt::NoItemFlags;
-
- if (index.column() == 0)
- {
- flags |= Qt::ItemIsSelectable | Qt::ItemIsEnabled;
- }
- return flags;
-}
-
-#include
diff --git a/Code/Editor/GraphicsSettingsDialog.h b/Code/Editor/GraphicsSettingsDialog.h
deleted file mode 100644
index 66a498cd10..0000000000
--- a/Code/Editor/GraphicsSettingsDialog.h
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#pragma once
-
-#if !defined(Q_MOC_RUN)
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-
-#include
-#endif
-
-class QGridLayout;
-class QLabel;
-
-namespace Ui
-{
- class GraphicsSettingsDialog;
-}
-
-// Description:
-// Status of cvar for a specifc platform and spec level
-// editedValue - current setting within Graphics Settings Dialog box
-// overwrittenValue - original setting from platform config file (set to originalValue if not found)
-// originalValue - original settings from sys_spec config file index
-
-struct CVarFileStatus
-{
- AZStd::any editedValue;
- AZStd::any overwrittenValue;
- AZStd::any originalValue;
- CVarFileStatus(AZStd::any edit, AZStd::any over, AZStd::any orig) : editedValue(edit), overwrittenValue(over), originalValue(orig) {}
-};
-
-// Description:
-// Status of specific cvar for Editor mapping
-// type - CVAR_INT / CVAR_FLOAT / CVAR_STRING
-// cvarGroup - source of cvar (sys_spec_particles, sys_spec_physics, etc.) or "miscellaneous" if only specified in platform config file
-// fileVals = CVarFileStatus for each spec level of a specific platform
-
-struct CVarInfo
-{
- int type;
- AZStd::string cvarGroup;
- AZStd::vector fileVals;
-};
-
-enum class GraphicsSettings
-{
- GameEffects,
- Light,
- ObjectDetail,
- Particles,
- Physics,
- PostProcessing,
- Quality,
- Shading,
- Shadows,
- Sound,
- Texture,
- TextureResolution,
- VolumetricEffects,
- Water,
- Miscellaneous,
- numSettings
-};
-
-class GraphicsSettingsHeaderView;
-
-class GraphicsSettingsTreeView
- : public QTreeView
-{
- Q_OBJECT
-
-public:
- GraphicsSettingsTreeView(QWidget* parent = nullptr);
-
-};
-
-class GraphicsSettingsModel
- : public QStandardItemModel
-{
- Q_OBJECT
-
-public:
- explicit GraphicsSettingsModel(QObject* parent = 0);
-
- Qt::ItemFlags flags(const QModelIndex& index) const override;
-};
-
-class GraphicsSettingsDialog
- : public QDialog,
- public ILoadConfigurationEntrySink
-{
- Q_OBJECT
-
-public:
-
- explicit GraphicsSettingsDialog(QWidget* parent = nullptr);
- virtual ~GraphicsSettingsDialog();
-
- bool IsCustom(void) { return m_showCustomSpec; }
- void UnloadCustomSpec(int specLevel);
-
- // ILoadConfigurationEntrySink
- void OnLoadConfigurationEntry(const char* szKey, const char* szValue, const char* szGroup) override;
-
-public slots:
- //Accept and reject
- void reject() override;
- void accept() override;
-
-private slots:
- //Update UIs
- void PlatformChanged(const QString& platform);
- bool CVarChanged(AZStd::any val, const char* cvarName, int specLevel);
- void CVarChanged(int i);
- void CVarChanged(double d);
- void CVarChanged(const QString& s);
-
-private:
-
- // The struct ParameterWidget is used to store the parameter widget
- // m_parameterName will be the name of the parameter the widget represent.
- struct ParameterWidget
- {
- ParameterWidget(QWidget* widget, QString parameterName = "");
-
- QString GetToolTip() const;
-
- const char* PARAMETER_TOOLTIP = "The variable will update render parameter \"%1\".";
- QWidget* m_widget;
- QString m_parameterName;
- };
-
- struct CollapseGroup
- {
- QString m_groupName;
- QStandardItem* m_groupRow;
- QTreeView* m_treeView;
- bool m_isCollapsed;
-
- CollapseGroup(QTreeView* treeView);
-
- void ToggleCollapsed();
- };
-
- void OpenCustomSpecDialog();
- void ApplyCustomSpec(const QString& customFilePath);
- bool IsCustomSpecAlreadyLoaded(const AZStd::string& filename) const;
- void SetSettingsTree(int numColumns);
- void SetCollapsed(const QModelIndex& index, bool flag);
-
- enum CVarStateComparison
- {
- EDITED_OVERWRITTEN_COMPARE = 1,
- EDITED_ORIGINAL_COMPARE = 2,
- OVERWRITTEN_ORIGINAL_COMPARE = 3,
-
- END_CVARSTATE_COMPARE,
- };
-
- bool CheckCVarStatesForDiff(AZStd::pair* it, int cfgFileIndex, CVarStateComparison cmp);
-
- // Save out settings into project-level cfg files
- void SaveSystemSettings();
-
- // Load in project-level cfg files for current platform
- void LoadPlatformConfigurations();
- // Build UI column for spec level of current platform
- void BuildColumn(int specLevel);
- // Initial UI building
- void BuildUI();
- // Cleaning out UI before loading new platform information
- void CleanUI();
- // Shows/hides custom spec option
- void ShowCustomSpecOption(bool show);
- // Shows/hides category labels and dropdowns
- void ShowCategories(bool show);
- // Warns about unsaved changes (returns true if accepted)
- bool SendUnsavedChangesWarning(bool cancel);
-
- void LoadCVarGroupDirectory(const AZStd::string& path);
-
- /////////////////////////////////////////////
- // UI help functions
-
- // Setup collapsed buttons
- void SetCollapsedLayout(const QString& groupName, QStandardItem* groupItem);
- // Sets the platform entry index for the given platform
- void SetPlatformEntry(ESystemConfigPlatform platform);
- // Gets the platform enum given the platform name
- ESystemConfigPlatform GetConfigPlatformFromName(const AZStd::string& platformName);
-
- ////////////////////////////////////////////
- // Members
-
- // Qt values
- const int INPUT_MIN_WIDTH = 100;
- const int INPUT_MIN_HEIGHT = 20;
- const int INPUT_ROW_SPAN = 1;
- const int INPUT_COLUMN_SPAN = 1;
- const int CVAR_ROW_OFFSET = 2;
- const int CVAR_VALUE_COLUMN_OFFSET = 1;
- const int PLATFORM_LABEL_ROW = 1;
- const int CVAR_LABEL_COLUMN = 1;
-
- // Tool tips
- const QString SETTINGS_FILE_PATH = "Config/spec/";
- const char* CFG_FILEFILTER = "Cfg File(*.cfg);;All files(*)";
-
- const int m_numSpecLevels = 4;
-
- bool m_showCustomSpec;
- bool m_showCategories;
- GraphicsSettingsModel* m_graphicsSettingsModel;
- GraphicsSettingsHeaderView* m_headerView;
- int m_numColumns{ 0 };
-
- const char* m_cvarGroupsFolder = "Config/CVarGroups";
-
- QScopedPointer m_ui;
-
- QVector m_uiCollapseGroup;
-
- QVector m_parameterWidgets;
-
- AZStd::string m_currentConfigFilename;
- size_t m_currentSpecIndex;
-
- // cvar name --> pair(type, CVarStatus for each file)
- AZStd::unordered_map m_cVarTracker;
-
- AZStd::unordered_map > m_cfgFiles;
-
- AZStd::vector > m_platformStrings;
-
- struct CVarGroupInfo
- {
- QVector m_platformLabels;
- QVector m_cvarLabels;
- QVector m_cvarSpinBoxes;
- QVector m_cvarDoubleSpinBoxes;
- QVector m_cvarLineEdits;
- QVector m_specFileArea;
- QVector m_widgetInsertOrder;
- QStandardItem* m_treeRowItem;
- int m_currentRow;
- };
-
- AZStd::unordered_map m_cvarGroupData;
- AZStd::vector m_cvarGroupOrder;
-
- ESystemConfigPlatform m_currentPlatform;
-
- int m_dirtyCVarCount;
-};
-
-class GraphicsSettingsHeaderView
- : public QHeaderView
-{
- Q_OBJECT
-public:
- GraphicsSettingsHeaderView(GraphicsSettingsDialog* dialog, Qt::Orientation orientation, QWidget* parent = nullptr);
-
-private:
- bool event(QEvent* e) override;
- void mouseMoveEvent(QMouseEvent* e) override;
- void mouseReleaseEvent(QMouseEvent* e) override;
-
- GraphicsSettingsDialog* m_dialog;
- int m_index{ -1 };
-};
-
-
diff --git a/Code/Editor/LegacyViewportCameraController.cpp b/Code/Editor/LegacyViewportCameraController.cpp
index f437196548..b18e807942 100644
--- a/Code/Editor/LegacyViewportCameraController.cpp
+++ b/Code/Editor/LegacyViewportCameraController.cpp
@@ -83,9 +83,9 @@ AZ::RPI::ViewportContextPtr LegacyViewportCameraControllerInstance::GetViewportC
}
bool LegacyViewportCameraControllerInstance::HandleMouseMove(
- const AzFramework::ScreenPoint& currentMousePos, const AzFramework::ScreenPoint& previousMousePos)
+ int dx, int dy)
{
- if (previousMousePos == currentMousePos)
+ if (dx == 0 && dy == 0)
{
return false;
}
@@ -105,7 +105,7 @@ bool LegacyViewportCameraControllerInstance::HandleMouseMove(
if (m_inMoveMode || m_inOrbitMode || m_inRotateMode || m_inZoomMode)
{
- m_totalMouseMoveDelta += (QPoint(currentMousePos.m_x, currentMousePos.m_y)-QPoint(previousMousePos.m_x, previousMousePos.m_y)).manhattanLength();
+ m_totalMouseMoveDelta += AZStd::abs(dx) + AZStd::abs(dy);
}
if ((m_inRotateMode && m_inMoveMode) || m_inZoomMode)
@@ -115,7 +115,7 @@ bool LegacyViewportCameraControllerInstance::HandleMouseMove(
Vec3 ydir = m.GetColumn1().GetNormalized();
Vec3 pos = m.GetTranslation();
- const float posDelta = 0.2f * (previousMousePos.m_y - currentMousePos.m_y) * speedScale;
+ const float posDelta = 0.2f * dy * speedScale;
pos = pos - ydir * posDelta;
m_orbitDistance = m_orbitDistance + posDelta;
m_orbitDistance = fabs(m_orbitDistance);
@@ -126,7 +126,7 @@ bool LegacyViewportCameraControllerInstance::HandleMouseMove(
}
else if (m_inRotateMode)
{
- Ang3 angles(-currentMousePos.m_y + previousMousePos.m_y, 0, -currentMousePos.m_x + previousMousePos.m_x);
+ Ang3 angles(dy, 0, dx);
angles = angles * 0.002f * gSettings.cameraRotateSpeed;
if (gSettings.invertYRotation)
{
@@ -158,7 +158,7 @@ bool LegacyViewportCameraControllerInstance::HandleMouseMove(
}
Vec3 pos = m.GetTranslation();
- pos += 0.1f * xdir * (currentMousePos.m_x - previousMousePos.m_x) * speedScale + 0.1f * zdir * (previousMousePos.m_y - currentMousePos.m_y) * speedScale;
+ pos += 0.1f * xdir * dx * speedScale + 0.1f * zdir * dy * speedScale;
m.SetTranslation(pos);
AZ::Transform transform = viewportContext->GetCameraTransform();
@@ -168,7 +168,7 @@ bool LegacyViewportCameraControllerInstance::HandleMouseMove(
}
else if (m_inOrbitMode)
{
- Ang3 angles(-currentMousePos.m_y + previousMousePos.m_y, 0, -currentMousePos.m_x + previousMousePos.m_x);
+ Ang3 angles(dy, 0, dx);
angles = angles * 0.002f * gSettings.cameraRotateSpeed;
if (gSettings.invertPan)
@@ -302,20 +302,19 @@ bool LegacyViewportCameraControllerInstance::HandleInputChannelEvent(const AzFra
bool shouldCaptureCursor = m_capturingCursor;
bool shouldConsumeEvent = false;
- if (id == AzFramework::InputDeviceMouse::SystemCursorPosition)
+ if (id == AzFramework::InputDeviceMouse::Movement::X || id == AzFramework::InputDeviceMouse::Movement::Y)
{
- bool result = false;
- AzToolsFramework::ViewportInteraction::ViewportMouseCursorRequestBus::Event(
- GetViewportId(),
- [this, &result](AzToolsFramework::ViewportInteraction::ViewportMouseCursorRequests* mouseRequests)
- {
- if (auto previousMousePosition = mouseRequests->PreviousViewportCursorScreenPosition();
- previousMousePosition.has_value())
- {
- result = HandleMouseMove(mouseRequests->ViewportCursorScreenPosition(), previousMousePosition.value());
- }
- });
- return result;
+ int dx = 0;
+ int dy = 0;
+ if (id == AzFramework::InputDeviceMouse::Movement::X)
+ {
+ dx = -aznumeric_cast(event.m_inputChannel.GetValue());
+ }
+ else
+ {
+ dy = -aznumeric_cast(event.m_inputChannel.GetValue());
+ }
+ return HandleMouseMove(dx, dy);
}
else if (id == MouseButton::Left)
{
diff --git a/Code/Editor/LegacyViewportCameraController.h b/Code/Editor/LegacyViewportCameraController.h
index d3ff439b16..ff752e27ab 100644
--- a/Code/Editor/LegacyViewportCameraController.h
+++ b/Code/Editor/LegacyViewportCameraController.h
@@ -69,7 +69,7 @@ namespace SandboxEditor
AZ::RPI::ViewportContextPtr GetViewportContext();
- bool HandleMouseMove(const AzFramework::ScreenPoint& currentMousePos, const AzFramework::ScreenPoint& previousMousePos);
+ bool HandleMouseMove(int dx, int dy);
bool HandleMouseWheel(float zDelta);
bool IsKeyDown(Qt::Key key) const;
void UpdateCursorCapture(bool shouldCaptureCursor);
diff --git a/Code/Editor/MainWindow.cpp b/Code/Editor/MainWindow.cpp
index 261fab48d1..c7e32fb82a 100644
--- a/Code/Editor/MainWindow.cpp
+++ b/Code/Editor/MainWindow.cpp
@@ -41,6 +41,7 @@ AZ_POP_DISABLE_WARNING
// AzToolsFramework
#include
+#include
#include
#include
#include
@@ -93,6 +94,8 @@ AZ_POP_DISABLE_WARNING
#include "AssetEditor/AssetEditorWindow.h"
#include "ActionManager.h"
+#include
+
using namespace AZ;
using namespace AzQtComponents;
using namespace AzToolsFramework;
@@ -489,6 +492,16 @@ void MainWindow::Initialize()
ActionOverrideRequestBus::Event(
GetEntityContextId(), &ActionOverrideRequests::SetupActionOverrideHandler, this);
+ if (auto imGuiManager = AZ::Interface::Get())
+ {
+ auto handleImGuiStateChangeFn = [](bool enabled)
+ {
+ EditorWindowUIRequestBus::Broadcast(&EditorWindowUIRequests::SetEditorUiEnabled, enabled);
+ };
+ m_handleImGuiStateChangeHandler = ImGui::IImGuiManager::ImGuiSetEnabledEvent::Handler(handleImGuiStateChangeFn);
+ imGuiManager->ConnectImGuiSetEnabledChangedHandler(m_handleImGuiStateChangeHandler);
+ }
+
AzToolsFramework::EditorEventsBus::Broadcast(&AzToolsFramework::EditorEvents::NotifyMainWindowInitialized, this);
}
@@ -674,49 +687,6 @@ void MainWindow::InitActions()
am->AddAction(ID_FILE_PROJECT_MANAGER_SETTINGS, tr("Edit Project Settings..."));
am->AddAction(ID_FILE_PROJECT_MANAGER_NEW, tr("New Project..."));
am->AddAction(ID_FILE_PROJECT_MANAGER_OPEN, tr("Open Project..."));
- am->AddAction(ID_GAME_PC_ENABLEVERYHIGHSPEC, tr("Very High")).SetCheckable(true)
- .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateGameSpec);
- am->AddAction(ID_GAME_PC_ENABLEHIGHSPEC, tr("High")).SetCheckable(true)
- .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateGameSpec);
- am->AddAction(ID_GAME_PC_ENABLEMEDIUMSPEC, tr("Medium")).SetCheckable(true)
- .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateGameSpec);
- am->AddAction(ID_GAME_PC_ENABLELOWSPEC, tr("Low")).SetCheckable(true)
- .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateGameSpec);
- am->AddAction(ID_GAME_OSXMETAL_ENABLEVERYHIGHSPEC, tr("Very High")).SetCheckable(true)
- .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateGameSpec);
- am->AddAction(ID_GAME_OSXMETAL_ENABLEHIGHSPEC, tr("High")).SetCheckable(true)
- .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateGameSpec);
- am->AddAction(ID_GAME_OSXMETAL_ENABLEMEDIUMSPEC, tr("Medium")).SetCheckable(true)
- .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateGameSpec);
- am->AddAction(ID_GAME_OSXMETAL_ENABLELOWSPEC, tr("Low")).SetCheckable(true)
- .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateGameSpec);
- am->AddAction(ID_GAME_ANDROID_ENABLEVERYHIGHSPEC, tr("Very High")).SetCheckable(true)
- .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateGameSpec);
- am->AddAction(ID_GAME_ANDROID_ENABLEHIGHSPEC, tr("High")).SetCheckable(true)
- .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateGameSpec);
- am->AddAction(ID_GAME_ANDROID_ENABLEMEDIUMSPEC, tr("Medium")).SetCheckable(true)
- .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateGameSpec);
- am->AddAction(ID_GAME_ANDROID_ENABLELOWSPEC, tr("Low")).SetCheckable(true)
- .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateGameSpec);
- am->AddAction(ID_GAME_IOS_ENABLEVERYHIGHSPEC, tr("Very High")).SetCheckable(true)
- .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateGameSpec);
- am->AddAction(ID_GAME_IOS_ENABLEHIGHSPEC, tr("High")).SetCheckable(true)
- .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateGameSpec);
- am->AddAction(ID_GAME_IOS_ENABLEMEDIUMSPEC, tr("Medium")).SetCheckable(true)
- .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateGameSpec);
- am->AddAction(ID_GAME_IOS_ENABLELOWSPEC, tr("Low")).SetCheckable(true)
- .RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateGameSpec);
-#if defined(AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS)
-#if defined(TOOLS_SUPPORT_JASPER)
-#include AZ_RESTRICTED_FILE_EXPLICIT(MainWindow_cpp, jasper)
-#endif
-#if defined(TOOLS_SUPPORT_PROVO)
-#include AZ_RESTRICTED_FILE_EXPLICIT(MainWindow_cpp, provo)
-#endif
-#if defined(TOOLS_SUPPORT_SALEM)
-#include AZ_RESTRICTED_FILE_EXPLICIT(MainWindow_cpp, salem)
-#endif
-#endif
am->AddAction(ID_TOOLS_CUSTOMIZEKEYBOARD, tr("Customize &Keyboard..."))
.Connect(&QAction::triggered, this, &MainWindow::ShowKeyboardCustomization);
am->AddAction(ID_TOOLS_EXPORT_SHORTCUTS, tr("&Export Keyboard Settings..."))
@@ -724,7 +694,6 @@ void MainWindow::InitActions()
am->AddAction(ID_TOOLS_IMPORT_SHORTCUTS, tr("&Import Keyboard Settings..."))
.Connect(&QAction::triggered, this, &MainWindow::ImportKeyboardShortcuts);
am->AddAction(ID_TOOLS_PREFERENCES, tr("Global Preferences..."));
- am->AddAction(ID_GRAPHICS_SETTINGS, tr("&Graphics Settings..."));
for (int i = ID_FILE_MRU_FIRST; i <= ID_FILE_MRU_LAST; ++i)
{
diff --git a/Code/Editor/MainWindow.h b/Code/Editor/MainWindow.h
index 34b121537d..99af2ea326 100644
--- a/Code/Editor/MainWindow.h
+++ b/Code/Editor/MainWindow.h
@@ -249,6 +249,7 @@ private:
QPointer m_toolbarCustomizationDialog;
QScopedPointer m_sourceControlNotifHandler;
+ AZ::Event::Handler m_handleImGuiStateChangeHandler;
AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING
static MainWindow* m_instance;
diff --git a/Code/Editor/Plugins/ComponentEntityEditorPlugin/CMakeLists.txt b/Code/Editor/Plugins/ComponentEntityEditorPlugin/CMakeLists.txt
index 4744b4e174..5aab2a2056 100644
--- a/Code/Editor/Plugins/ComponentEntityEditorPlugin/CMakeLists.txt
+++ b/Code/Editor/Plugins/ComponentEntityEditorPlugin/CMakeLists.txt
@@ -27,6 +27,7 @@ ly_add_target(
BUILD_DEPENDENCIES
PRIVATE
3rdParty::Qt::Core
+ 3rdParty::Qt::Widgets
AZ::AzCore
AZ::AzToolsFramework
Legacy::CryCommon
diff --git a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerDisplayOptionsMenu.cpp b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerDisplayOptionsMenu.cpp
index c1af8d76d7..a6c1ed6598 100644
--- a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerDisplayOptionsMenu.cpp
+++ b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerDisplayOptionsMenu.cpp
@@ -66,3 +66,5 @@ namespace EntityOutliner
emit OnOptionToggled(DisplayOption::AutoExpand, checked);
}
}
+
+#include
diff --git a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerSortFilterProxyModel.cpp b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerSortFilterProxyModel.cpp
index 660ea137cf..89cd361fb6 100644
--- a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerSortFilterProxyModel.cpp
+++ b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerSortFilterProxyModel.cpp
@@ -32,7 +32,24 @@ bool OutlinerSortFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelI
bool OutlinerSortFilterProxyModel::lessThan(const QModelIndex& leftIndex, const QModelIndex& rightIndex) const
{
- return sourceModel()->data(leftIndex).toString() < sourceModel()->data(rightIndex).toString();
+ if (leftIndex.isValid() && rightIndex.isValid())
+ {
+ QVariant leftData = sourceModel()->data(leftIndex);
+ QVariant rightData = sourceModel()->data(rightIndex);
+
+ // make sure to compare the correct data types for sorting the current column
+ AZ_Assert(leftData.type() == rightData.type(), "OutlinerSortFilterProxyModel::lessThan types do not agree!");
+ if (static_cast(leftData.type()) == QMetaType::QString)
+ {
+ return leftData.toString() < rightData.toString();
+ }
+ else if (static_cast(leftData.type()) == QMetaType::ULongLong)
+ {
+ return leftData.toULongLong() < rightData.toULongLong();
+ }
+ AZ_Error("Editor", false, "Error! Unhandled type \"%s\" in OutlinerSortFilterProxyModel::lessThan", leftData.typeName());
+ }
+ return false;
}
void OutlinerSortFilterProxyModel::sort(int /*column*/, Qt::SortOrder /*order*/)
diff --git a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerWidget.cpp b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerWidget.cpp
index d69480b169..02dabb8b20 100644
--- a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerWidget.cpp
+++ b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerWidget.cpp
@@ -269,10 +269,12 @@ OutlinerWidget::OutlinerWidget(QWidget* pParent, Qt::WindowFlags flags)
AzToolsFramework::ComponentModeFramework::EditorComponentModeNotificationBus::Handler::BusConnect(
AzToolsFramework::GetEntityContextId());
AzToolsFramework::EditorEntityInfoNotificationBus::Handler::BusConnect();
+ AzToolsFramework::EditorWindowUIRequestBus::Handler::BusConnect();
}
OutlinerWidget::~OutlinerWidget()
{
+ AzToolsFramework::EditorWindowUIRequestBus::Handler::BusDisconnect();
AzToolsFramework::ComponentModeFramework::EditorComponentModeNotificationBus::Handler::BusDisconnect();
AzToolsFramework::EditorEntityInfoNotificationBus::Handler::BusDisconnect();
AzToolsFramework::EditorPickModeNotificationBus::Handler::BusDisconnect();
@@ -1321,16 +1323,25 @@ static void SetEntityOutlinerState(Ui::OutlinerWidgetUI* entityOutlinerUi, const
AzQtComponents::SetWidgetInteractEnabled(entityOutlinerUi->m_searchWidget, on);
}
+void OutlinerWidget::EnableUi(bool enable)
+{
+ SetEntityOutlinerState(m_gui, enable);
+ setEnabled(enable);
+}
+
+void OutlinerWidget::SetEditorUiEnabled(bool enable)
+{
+ EnableUi(enable);
+}
+
void OutlinerWidget::EnteredComponentMode([[maybe_unused]] const AZStd::vector& componentModeTypes)
{
- SetEntityOutlinerState(m_gui, false);
- setEnabled(false);
+ EnableUi(false);
}
void OutlinerWidget::LeftComponentMode([[maybe_unused]] const AZStd::vector& componentModeTypes)
{
- setEnabled(true);
- SetEntityOutlinerState(m_gui, true);
+ EnableUi(true);
}
void OutlinerWidget::OnSliceInstantiated(const AZ::Data::AssetId& /*sliceAssetId*/, AZ::SliceComponent::SliceInstanceAddress& sliceAddress, const AzFramework::SliceInstantiationTicket& /*ticket*/)
diff --git a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerWidget.hxx b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerWidget.hxx
index 75991424bb..aff305e0fe 100644
--- a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerWidget.hxx
+++ b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerWidget.hxx
@@ -13,6 +13,7 @@
#include
#include
+#include
#include
#include
#include
@@ -57,6 +58,7 @@ class OutlinerWidget
, private AzToolsFramework::SliceEditorEntityOwnershipServiceNotificationBus::Handler
, private AzToolsFramework::EditorEntityInfoNotificationBus::Handler
, private AzToolsFramework::ComponentModeFramework::EditorComponentModeNotificationBus::Handler
+ , private AzToolsFramework::EditorWindowUIRequestBus::Handler
{
Q_OBJECT;
public:
@@ -106,6 +108,9 @@ private:
void EnteredComponentMode(const AZStd::vector& componentModeTypes) override;
void LeftComponentMode(const AZStd::vector& componentModeTypes) override;
+ // EditorWindowUIRequestBus overrides
+ void SetEditorUiEnabled(bool enable) override;
+
// Build a selection object from the given entities. Entities already in the Widget's selection buffers are ignored.
template
QItemSelection BuildSelectionFromEntities(const EntityIdCollection& entityIds);
@@ -171,6 +176,7 @@ private:
AZ::EntityId GetEntityIdFromIndex(const QModelIndex& index) const;
QModelIndex GetIndexFromEntityId(const AZ::EntityId& entityId) const;
void ExtractEntityIdsFromSelection(const QItemSelection& selection, AzToolsFramework::EntityIdList& entityIdList) const;
+ void EnableUi(bool enable);
// AzToolsFramework::OutlinerModelNotificationBus::Handler
// Receive notification from the outliner model that we should scroll
diff --git a/Code/Editor/Plugins/FFMPEGPlugin/CMakeLists.txt b/Code/Editor/Plugins/FFMPEGPlugin/CMakeLists.txt
index 342151f24a..909ec193f3 100644
--- a/Code/Editor/Plugins/FFMPEGPlugin/CMakeLists.txt
+++ b/Code/Editor/Plugins/FFMPEGPlugin/CMakeLists.txt
@@ -23,6 +23,7 @@ ly_add_target(
.
BUILD_DEPENDENCIES
PRIVATE
+ 3rdParty::Qt::Core
AZ::AzCore
Legacy::CryCommon
Legacy::EditorLib
diff --git a/Code/Editor/Plugins/FFMPEGPlugin/FFMPEGPlugin_precompiled.h b/Code/Editor/Plugins/FFMPEGPlugin/FFMPEGPlugin_precompiled.h
index 3b015dd9a5..33ca3390f1 100644
--- a/Code/Editor/Plugins/FFMPEGPlugin/FFMPEGPlugin_precompiled.h
+++ b/Code/Editor/Plugins/FFMPEGPlugin/FFMPEGPlugin_precompiled.h
@@ -17,19 +17,8 @@
/////////////////////////////////////////////////////////////////////////////
#include
-
-/////////////////////////////////////////////////////////////////////////////
-// STL
-/////////////////////////////////////////////////////////////////////////////
-#include
-#include
-#include