diff --git a/AutomatedTesting/Gem/Code/Source/AutoGen/NetworkTestPlayerComponent.AutoComponent.xml b/AutomatedTesting/Gem/Code/Source/AutoGen/NetworkTestPlayerComponent.AutoComponent.xml
index 46d6191835..251d2b25af 100644
--- a/AutomatedTesting/Gem/Code/Source/AutoGen/NetworkTestPlayerComponent.AutoComponent.xml
+++ b/AutomatedTesting/Gem/Code/Source/AutoGen/NetworkTestPlayerComponent.AutoComponent.xml
@@ -19,8 +19,8 @@
-
-
+
+
@@ -29,10 +29,10 @@
-
+
-
-
+
+
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/AWS/CMakeLists.txt
index 2a5e1d7cab..c8629bbe8b 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/AWS/CMakeLists.txt
@@ -13,7 +13,8 @@
if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
# Only enable AWS automated tests on Windows
- if(NOT "${PAL_PLATFORM_NAME}" STREQUAL "Windows")
+ set(SUPPORTED_PLATFORMS "Windows" "Linux")
+ if (NOT "${PAL_PLATFORM_NAME}" IN_LIST SUPPORTED_PLATFORMS)
return()
endif()
@@ -21,9 +22,8 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
NAME AutomatedTesting::AWSTests
TEST_SUITE awsi
TEST_SERIAL
- PATH ${CMAKE_CURRENT_LIST_DIR}/${PAL_PLATFORM_NAME}/
+ PATH ${CMAKE_CURRENT_LIST_DIR}/
RUNTIME_DEPENDENCIES
- Legacy::Editor
AZ::AssetProcessor
AutomatedTesting.GameLauncher
AutomatedTesting.Assets
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/README.md b/AutomatedTesting/Gem/PythonTests/AWS/README.md
index 0d046cbe4c..a25f39d9c2 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/README.md
+++ b/AutomatedTesting/Gem/PythonTests/AWS/README.md
@@ -2,30 +2,61 @@
## Prerequisites
1. Build the O3DE Editor and AutomatedTesting.GameLauncher in Profile.
-2. AWS CLI is installed and configured following [Configuration and Credential File Settings](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html).
-3. [AWS Cloud Development Kit (CDK)](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html#getting_started_install) is installed.
+2. Install the latest version of NodeJs.
+3. AWS CLI is installed and configured following [Configuration and Credential File Settings](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html).
+4. [AWS Cloud Development Kit (CDK)](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html#getting_started_install) is installed.
## Deploy CDK Applications
1. Go to the AWS IAM console and create an IAM role called o3de-automation-tests which adds your own account as as a trusted entity and uses the "AdministratorAccess" permissions policy.
-2. Copy {engine_root}\scripts\build\Platform\Windows\deploy_cdk_applications.cmd to your engine root folder.
-3. Open a new Command Prompt window at the engine root and set the following environment variables:
-```
- Set O3DE_AWS_PROJECT_NAME=AWSAUTO
- Set O3DE_AWS_DEPLOY_REGION=us-east-1
- Set O3DE_AWS_DEPLOY_ACCOUNT={your_aws_account_id}
- Set ASSUME_ROLE_ARN=arn:aws:iam::{your_aws_account_id}:role/o3de-automation-tests
- Set COMMIT_ID=HEAD
-```
-4. In the same Command Prompt window, Deploy the CDK applications for AWS gems by running deploy_cdk_applications.cmd.
+2. Copy the following deployment script to your engine root folder:
+ * Windows (Command Prompt)
+ ```
+ {engine_root}\scripts\build\Platform\Windows\deploy_cdk_applications.cmd
+ ```
+ * Linux
+ ```
+ {engine_root}/scripts/build/Platform/Linux/deploy_cdk_applications.sh
+ ```
+3. Open a new CLI window at the engine root and set the following environment variables:
+ * Windows
+ ```
+ Set O3DE_AWS_PROJECT_NAME=AWSAUTO
+ Set O3DE_AWS_DEPLOY_REGION=us-east-1
+ Set ASSUME_ROLE_ARN=arn:aws:iam::{your_aws_account_id}:role/o3de-automation-tests
+ Set COMMIT_ID=HEAD
+ ```
+ * Linux
+ ```
+ export O3DE_AWS_PROJECT_NAME=AWSAUTO
+ export O3DE_AWS_DEPLOY_REGION=us-east-1
+ export ASSUME_ROLE_ARN=arn:aws:iam::{your_aws_account_id}:role/o3de-automation-tests
+ export COMMIT_ID=HEAD
+ ```
+4. In the same CLI window, Deploy the CDK applications for AWS gems by running deploy_cdk_applications.cmd.
## Run Automation Tests
### CLI
-In the same Command Prompt window, run the following CLI command:
-python\python.cmd -m pytest {path_to_the_test_file} --build-directory {directory_to_the_profile_build}
+1. In the same CLI window, run the following CLI command:
+ * Windows
+ ```
+ python\python.cmd -m pytest {path_to_the_test_file} --build-directory {directory_to_the_profile_build}
+ ```
+ * Linux
+ ```
+ python/python.sh -m pytest {path_to_the_test_file} --build-directory {directory_to_the_profile_build}
+ ```
### Pycharm
You can also run any specific automation test directly from Pycharm by providing the "--build-directory" argument in the Run Configuration.
## Destroy CDK Applications
-1. Copy {engine_root}\scripts\build\Platform\Windows\destroy_cdk_applications.cmd to your engine root folder.
-2. In the same Command Prompt window, destroy the CDK applications for AWS gems by running destroy_cdk_applications.cmd.
\ No newline at end of file
+1. Copy the following destruction script to your engine root folder:
+ * Windows
+ ```
+ {engine_root}\scripts\build\Platform\Windows\destroy_cdk_applications.cmd
+ ```
+ * Linux
+ ```
+ {engine_root}/scripts/build/Platform/Linux/destroy_cdk_applications.sh
+ ```
+2. In the same CLI window, destroy the CDK applications for AWS gems by running destroy_cdk_applications.cmd.
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/__init__.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/__init__.py
deleted file mode 100644
index 50cbb262dd..0000000000
--- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/__init__.py
+++ /dev/null
@@ -1,6 +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
-"""
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/core/__init__.py b/AutomatedTesting/Gem/PythonTests/AWS/aws_metrics/__init__.py
similarity index 100%
rename from AutomatedTesting/Gem/PythonTests/AWS/Windows/core/__init__.py
rename to AutomatedTesting/Gem/PythonTests/AWS/aws_metrics/__init__.py
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py b/AutomatedTesting/Gem/PythonTests/AWS/aws_metrics/aws_metrics_automation_test.py
similarity index 96%
rename from AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py
rename to AutomatedTesting/Gem/PythonTests/AWS/aws_metrics/aws_metrics_automation_test.py
index 6f3113d771..77d71df370 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/aws_metrics/aws_metrics_automation_test.py
@@ -1,289 +1,289 @@
-"""
-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 logging
-import os
-import pytest
-import typing
-from datetime import datetime
-
-import ly_test_tools.log.log_monitor
-
-from AWS.common import constants
-from AWS.common.resource_mappings import AWS_RESOURCE_MAPPINGS_ACCOUNT_ID_KEY
-from .aws_metrics_custom_thread import AWSMetricsThread
-
-# fixture imports
-from assetpipeline.ap_fixtures.asset_processor_fixture import asset_processor
-from .aws_metrics_utils import aws_metrics_utils
-
-AWS_METRICS_FEATURE_NAME = 'AWSMetrics'
-
-logger = logging.getLogger(__name__)
-
-
-def setup(launcher: pytest.fixture,
- asset_processor: pytest.fixture) -> pytest.fixture:
- """
- Set up the resource mapping configuration and start the log monitor.
- :param launcher: Client launcher for running the test level.
- :param asset_processor: asset_processor fixture.
- :return log monitor object.
- """
- asset_processor.start()
- asset_processor.wait_for_idle()
-
- file_to_monitor = os.path.join(launcher.workspace.paths.project_log(), constants.GAME_LOG_NAME)
-
- # Initialize the log monitor.
- log_monitor = ly_test_tools.log.log_monitor.LogMonitor(launcher=launcher, log_file_path=file_to_monitor)
-
- return log_monitor
-
-
-def monitor_metrics_submission(log_monitor: pytest.fixture) -> None:
- """
- Monitor the messages and notifications for submitting metrics.
- :param log_monitor: Log monitor to check the log messages.
- """
- expected_lines = [
- '(Script) - Submitted metrics without buffer.',
- '(Script) - Submitted metrics with buffer.',
- '(Script) - Flushed the buffered metrics.',
- '(Script) - Metrics is sent successfully.'
- ]
-
- unexpected_lines = [
- '(Script) - Failed to submit metrics without buffer.',
- '(Script) - Failed to submit metrics with buffer.',
- '(Script) - Failed to send metrics.'
- ]
-
- result = log_monitor.monitor_log_for_lines(
- expected_lines=expected_lines,
- unexpected_lines=unexpected_lines,
- halt_on_unexpected=True)
-
- # Assert the log monitor detected expected lines and did not detect any unexpected lines.
- assert result, (
- f'Log monitoring failed. Used expected_lines values: {expected_lines} & '
- f'unexpected_lines values: {unexpected_lines}')
-
-
-def query_metrics_from_s3(aws_metrics_utils: pytest.fixture, resource_mappings: pytest.fixture) -> None:
- """
- Verify that the metrics events are delivered to the S3 bucket and can be queried.
- :param aws_metrics_utils: aws_metrics_utils fixture.
- :param resource_mappings: resource_mappings fixture.
- """
- aws_metrics_utils.verify_s3_delivery(
- resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsBucketName')
- )
- logger.info('Metrics are sent to S3.')
-
- aws_metrics_utils.run_glue_crawler(
- resource_mappings.get_resource_name_id('AWSMetrics.EventsCrawlerName'))
-
- # Remove the events_json table if exists so that the sample query can create a table with the same name.
- aws_metrics_utils.delete_table(resource_mappings.get_resource_name_id('AWSMetrics.EventDatabaseName'), 'events_json')
- aws_metrics_utils.run_named_queries(resource_mappings.get_resource_name_id('AWSMetrics.AthenaWorkGroupName'))
- logger.info('Query metrics from S3 successfully.')
-
-
-def verify_operational_metrics(aws_metrics_utils: pytest.fixture,
- resource_mappings: pytest.fixture, start_time: datetime) -> None:
- """
- Verify that operational health metrics are delivered to CloudWatch.
- :param aws_metrics_utils: aws_metrics_utils fixture.
- :param resource_mappings: resource_mappings fixture.
- :param start_time: Time when the game launcher starts.
- """
- aws_metrics_utils.verify_cloud_watch_delivery(
- 'AWS/Lambda',
- 'Invocations',
- [{'Name': 'FunctionName',
- 'Value': resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsProcessingLambdaName')}],
- start_time)
- logger.info('AnalyticsProcessingLambda metrics are sent to CloudWatch.')
-
- aws_metrics_utils.verify_cloud_watch_delivery(
- 'AWS/Lambda',
- 'Invocations',
- [{'Name': 'FunctionName',
- 'Value': resource_mappings.get_resource_name_id('AWSMetrics.EventProcessingLambdaName')}],
- start_time)
- logger.info('EventsProcessingLambda metrics are sent to CloudWatch.')
-
-
-def update_kinesis_analytics_application_status(aws_metrics_utils: pytest.fixture,
- resource_mappings: pytest.fixture, start_application: bool) -> None:
- """
- Update the Kinesis analytics application to start or stop it.
- :param aws_metrics_utils: aws_metrics_utils fixture.
- :param resource_mappings: resource_mappings fixture.
- :param start_application: whether to start or stop the application.
- """
- if start_application:
- aws_metrics_utils.start_kinesis_data_analytics_application(
- resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsApplicationName'))
- else:
- aws_metrics_utils.stop_kinesis_data_analytics_application(
- resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsApplicationName'))
-
-@pytest.mark.SUITE_awsi
-@pytest.mark.usefixtures('automatic_process_killer')
-@pytest.mark.usefixtures('aws_credentials')
-@pytest.mark.usefixtures('resource_mappings')
-@pytest.mark.parametrize('assume_role_arn', [constants.ASSUME_ROLE_ARN])
-@pytest.mark.parametrize('feature_name', [AWS_METRICS_FEATURE_NAME])
-@pytest.mark.parametrize('profile_name', ['AWSAutomationTest'])
-@pytest.mark.parametrize('project', ['AutomatedTesting'])
-@pytest.mark.parametrize('region_name', [constants.AWS_REGION])
-@pytest.mark.parametrize('resource_mappings_filename', [constants.AWS_RESOURCE_MAPPING_FILE_NAME])
-@pytest.mark.parametrize('session_name', [constants.SESSION_NAME])
-@pytest.mark.parametrize('stacks', [[f'{constants.AWS_PROJECT_NAME}-{AWS_METRICS_FEATURE_NAME}-{constants.AWS_REGION}']])
-class TestAWSMetricsWindows(object):
- """
- Test class to verify the real-time and batch analytics for metrics.
- """
- @pytest.mark.parametrize('level', ['AWS/Metrics'])
- def test_realtime_and_batch_analytics(self,
- level: str,
- launcher: pytest.fixture,
- asset_processor: pytest.fixture,
- workspace: pytest.fixture,
- aws_utils: pytest.fixture,
- resource_mappings: pytest.fixture,
- aws_metrics_utils: pytest.fixture):
- """
- Verify that the metrics events are sent to CloudWatch and S3 for analytics.
- """
- # Start Kinesis analytics application on a separate thread to avoid blocking the test.
- kinesis_analytics_application_thread = AWSMetricsThread(target=update_kinesis_analytics_application_status,
- args=(aws_metrics_utils, resource_mappings, True))
- kinesis_analytics_application_thread.start()
-
- log_monitor = setup(launcher, asset_processor)
-
- # Kinesis analytics application needs to be in the running state before we start the game launcher.
- kinesis_analytics_application_thread.join()
- launcher.args = ['+LoadLevel', level]
- launcher.args.extend(['-rhi=null'])
- start_time = datetime.utcnow()
- with launcher.start(launch_ap=False):
- monitor_metrics_submission(log_monitor)
-
- # Verify that real-time analytics metrics are delivered to CloudWatch.
- aws_metrics_utils.verify_cloud_watch_delivery(
- AWS_METRICS_FEATURE_NAME,
- 'TotalLogins',
- [],
- start_time)
- logger.info('Real-time metrics are sent to CloudWatch.')
-
- # Run time-consuming operations on separate threads to avoid blocking the test.
- operational_threads = list()
- operational_threads.append(
- AWSMetricsThread(target=query_metrics_from_s3,
- args=(aws_metrics_utils, resource_mappings)))
- operational_threads.append(
- AWSMetricsThread(target=verify_operational_metrics,
- args=(aws_metrics_utils, resource_mappings, start_time)))
- operational_threads.append(
- AWSMetricsThread(target=update_kinesis_analytics_application_status,
- args=(aws_metrics_utils, resource_mappings, False)))
- for thread in operational_threads:
- thread.start()
- for thread in operational_threads:
- thread.join()
-
- @pytest.mark.parametrize('level', ['AWS/Metrics'])
- def test_realtime_and_batch_analytics_no_global_accountid(self,
- level: str,
- launcher: pytest.fixture,
- asset_processor: pytest.fixture,
- workspace: pytest.fixture,
- aws_utils: pytest.fixture,
- resource_mappings: pytest.fixture,
- aws_metrics_utils: pytest.fixture):
- """
- Verify that the metrics events are sent to CloudWatch and S3 for analytics.
- """
- # Remove top-level account ID from resource mappings
- resource_mappings.clear_select_keys([AWS_RESOURCE_MAPPINGS_ACCOUNT_ID_KEY])
- # Start Kinesis analytics application on a separate thread to avoid blocking the test.
- kinesis_analytics_application_thread = AWSMetricsThread(target=update_kinesis_analytics_application_status,
- args=(aws_metrics_utils, resource_mappings, True))
- kinesis_analytics_application_thread.start()
-
- log_monitor = setup(launcher, asset_processor)
-
- # Kinesis analytics application needs to be in the running state before we start the game launcher.
- kinesis_analytics_application_thread.join()
- launcher.args = ['+LoadLevel', level]
- launcher.args.extend(['-rhi=null'])
- start_time = datetime.utcnow()
- with launcher.start(launch_ap=False):
- monitor_metrics_submission(log_monitor)
-
- # Verify that real-time analytics metrics are delivered to CloudWatch.
- aws_metrics_utils.verify_cloud_watch_delivery(
- AWS_METRICS_FEATURE_NAME,
- 'TotalLogins',
- [],
- start_time)
- logger.info('Real-time metrics are sent to CloudWatch.')
-
- # Run time-consuming operations on separate threads to avoid blocking the test.
- operational_threads = list()
- operational_threads.append(
- AWSMetricsThread(target=query_metrics_from_s3,
- args=(aws_metrics_utils, resource_mappings)))
- operational_threads.append(
- AWSMetricsThread(target=verify_operational_metrics,
- args=(aws_metrics_utils, resource_mappings, start_time)))
- operational_threads.append(
- AWSMetricsThread(target=update_kinesis_analytics_application_status,
- args=(aws_metrics_utils, resource_mappings, False)))
- for thread in operational_threads:
- thread.start()
- for thread in operational_threads:
- thread.join()
-
- @pytest.mark.parametrize('level', ['AWS/Metrics'])
- def test_unauthorized_user_request_rejected(self,
- level: str,
- launcher: pytest.fixture,
- asset_processor: pytest.fixture,
- workspace: pytest.fixture):
- """
- Verify that unauthorized users cannot send metrics events to the AWS backed backend.
- """
- log_monitor = setup(launcher, asset_processor)
-
- # Set invalid AWS credentials.
- launcher.args = ['+LoadLevel', level, '+cl_awsAccessKey', 'AKIAIOSFODNN7EXAMPLE',
- '+cl_awsSecretKey', 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY']
- launcher.args.extend(['-rhi=null'])
-
- with launcher.start(launch_ap=False):
- result = log_monitor.monitor_log_for_lines(
- expected_lines=['(Script) - Failed to send metrics.'],
- unexpected_lines=['(Script) - Metrics is sent successfully.'],
- halt_on_unexpected=True)
- assert result, 'Metrics events are sent successfully by unauthorized user'
- logger.info('Unauthorized user is rejected to send metrics.')
-
- def test_clean_up_s3_bucket(self,
- aws_utils: pytest.fixture,
- resource_mappings: pytest.fixture,
- aws_metrics_utils: pytest.fixture):
- """
- Clear the analytics bucket objects so that the S3 bucket can be destroyed during tear down.
- """
- aws_metrics_utils.empty_bucket(
- resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsBucketName'))
+"""
+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 logging
+import os
+import pytest
+import typing
+from datetime import datetime
+
+import ly_test_tools.log.log_monitor
+
+from AWS.common import constants
+from AWS.common.resource_mappings import AWS_RESOURCE_MAPPINGS_ACCOUNT_ID_KEY
+from .aws_metrics_custom_thread import AWSMetricsThread
+
+# fixture imports
+from assetpipeline.ap_fixtures.asset_processor_fixture import asset_processor
+from .aws_metrics_utils import aws_metrics_utils
+
+AWS_METRICS_FEATURE_NAME = 'AWSMetrics'
+
+logger = logging.getLogger(__name__)
+
+
+def setup(launcher: pytest.fixture,
+ asset_processor: pytest.fixture) -> pytest.fixture:
+ """
+ Set up the resource mapping configuration and start the log monitor.
+ :param launcher: Client launcher for running the test level.
+ :param asset_processor: asset_processor fixture.
+ :return log monitor object.
+ """
+ asset_processor.start()
+ asset_processor.wait_for_idle()
+
+ file_to_monitor = os.path.join(launcher.workspace.paths.project_log(), constants.GAME_LOG_NAME)
+
+ # Initialize the log monitor.
+ log_monitor = ly_test_tools.log.log_monitor.LogMonitor(launcher=launcher, log_file_path=file_to_monitor)
+
+ return log_monitor
+
+
+def monitor_metrics_submission(log_monitor: pytest.fixture) -> None:
+ """
+ Monitor the messages and notifications for submitting metrics.
+ :param log_monitor: Log monitor to check the log messages.
+ """
+ expected_lines = [
+ '(Script) - Submitted metrics without buffer.',
+ '(Script) - Submitted metrics with buffer.',
+ '(Script) - Flushed the buffered metrics.',
+ '(Script) - Metrics is sent successfully.'
+ ]
+
+ unexpected_lines = [
+ '(Script) - Failed to submit metrics without buffer.',
+ '(Script) - Failed to submit metrics with buffer.',
+ '(Script) - Failed to send metrics.'
+ ]
+
+ result = log_monitor.monitor_log_for_lines(
+ expected_lines=expected_lines,
+ unexpected_lines=unexpected_lines,
+ halt_on_unexpected=True)
+
+ # Assert the log monitor detected expected lines and did not detect any unexpected lines.
+ assert result, (
+ f'Log monitoring failed. Used expected_lines values: {expected_lines} & '
+ f'unexpected_lines values: {unexpected_lines}')
+
+
+def query_metrics_from_s3(aws_metrics_utils: pytest.fixture, resource_mappings: pytest.fixture) -> None:
+ """
+ Verify that the metrics events are delivered to the S3 bucket and can be queried.
+ :param aws_metrics_utils: aws_metrics_utils fixture.
+ :param resource_mappings: resource_mappings fixture.
+ """
+ aws_metrics_utils.verify_s3_delivery(
+ resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsBucketName')
+ )
+ logger.info('Metrics are sent to S3.')
+
+ aws_metrics_utils.run_glue_crawler(
+ resource_mappings.get_resource_name_id('AWSMetrics.EventsCrawlerName'))
+
+ # Remove the events_json table if exists so that the sample query can create a table with the same name.
+ aws_metrics_utils.delete_table(resource_mappings.get_resource_name_id('AWSMetrics.EventDatabaseName'), 'events_json')
+ aws_metrics_utils.run_named_queries(resource_mappings.get_resource_name_id('AWSMetrics.AthenaWorkGroupName'))
+ logger.info('Query metrics from S3 successfully.')
+
+
+def verify_operational_metrics(aws_metrics_utils: pytest.fixture,
+ resource_mappings: pytest.fixture, start_time: datetime) -> None:
+ """
+ Verify that operational health metrics are delivered to CloudWatch.
+ :param aws_metrics_utils: aws_metrics_utils fixture.
+ :param resource_mappings: resource_mappings fixture.
+ :param start_time: Time when the game launcher starts.
+ """
+ aws_metrics_utils.verify_cloud_watch_delivery(
+ 'AWS/Lambda',
+ 'Invocations',
+ [{'Name': 'FunctionName',
+ 'Value': resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsProcessingLambdaName')}],
+ start_time)
+ logger.info('AnalyticsProcessingLambda metrics are sent to CloudWatch.')
+
+ aws_metrics_utils.verify_cloud_watch_delivery(
+ 'AWS/Lambda',
+ 'Invocations',
+ [{'Name': 'FunctionName',
+ 'Value': resource_mappings.get_resource_name_id('AWSMetrics.EventProcessingLambdaName')}],
+ start_time)
+ logger.info('EventsProcessingLambda metrics are sent to CloudWatch.')
+
+
+def update_kinesis_analytics_application_status(aws_metrics_utils: pytest.fixture,
+ resource_mappings: pytest.fixture, start_application: bool) -> None:
+ """
+ Update the Kinesis analytics application to start or stop it.
+ :param aws_metrics_utils: aws_metrics_utils fixture.
+ :param resource_mappings: resource_mappings fixture.
+ :param start_application: whether to start or stop the application.
+ """
+ if start_application:
+ aws_metrics_utils.start_kinesis_data_analytics_application(
+ resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsApplicationName'))
+ else:
+ aws_metrics_utils.stop_kinesis_data_analytics_application(
+ resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsApplicationName'))
+
+@pytest.mark.SUITE_awsi
+@pytest.mark.usefixtures('automatic_process_killer')
+@pytest.mark.usefixtures('aws_credentials')
+@pytest.mark.usefixtures('resource_mappings')
+@pytest.mark.parametrize('assume_role_arn', [constants.ASSUME_ROLE_ARN])
+@pytest.mark.parametrize('feature_name', [AWS_METRICS_FEATURE_NAME])
+@pytest.mark.parametrize('profile_name', ['AWSAutomationTest'])
+@pytest.mark.parametrize('project', ['AutomatedTesting'])
+@pytest.mark.parametrize('region_name', [constants.AWS_REGION])
+@pytest.mark.parametrize('resource_mappings_filename', [constants.AWS_RESOURCE_MAPPING_FILE_NAME])
+@pytest.mark.parametrize('session_name', [constants.SESSION_NAME])
+@pytest.mark.parametrize('stacks', [[f'{constants.AWS_PROJECT_NAME}-{AWS_METRICS_FEATURE_NAME}-{constants.AWS_REGION}']])
+class TestAWSMetricsWindows(object):
+ """
+ Test class to verify the real-time and batch analytics for metrics.
+ """
+ @pytest.mark.parametrize('level', ['levels/aws/metrics/metrics.spawnable'])
+ def test_realtime_and_batch_analytics(self,
+ level: str,
+ launcher: pytest.fixture,
+ asset_processor: pytest.fixture,
+ workspace: pytest.fixture,
+ aws_utils: pytest.fixture,
+ resource_mappings: pytest.fixture,
+ aws_metrics_utils: pytest.fixture):
+ """
+ Verify that the metrics events are sent to CloudWatch and S3 for analytics.
+ """
+ # Start Kinesis analytics application on a separate thread to avoid blocking the test.
+ kinesis_analytics_application_thread = AWSMetricsThread(target=update_kinesis_analytics_application_status,
+ args=(aws_metrics_utils, resource_mappings, True))
+ kinesis_analytics_application_thread.start()
+
+ log_monitor = setup(launcher, asset_processor)
+
+ # Kinesis analytics application needs to be in the running state before we start the game launcher.
+ kinesis_analytics_application_thread.join()
+ launcher.args = ['+LoadLevel', level]
+ launcher.args.extend(['-rhi=null'])
+ start_time = datetime.utcnow()
+ with launcher.start(launch_ap=False):
+ monitor_metrics_submission(log_monitor)
+
+ # Verify that real-time analytics metrics are delivered to CloudWatch.
+ aws_metrics_utils.verify_cloud_watch_delivery(
+ AWS_METRICS_FEATURE_NAME,
+ 'TotalLogins',
+ [],
+ start_time)
+ logger.info('Real-time metrics are sent to CloudWatch.')
+
+ # Run time-consuming operations on separate threads to avoid blocking the test.
+ operational_threads = list()
+ operational_threads.append(
+ AWSMetricsThread(target=query_metrics_from_s3,
+ args=(aws_metrics_utils, resource_mappings)))
+ operational_threads.append(
+ AWSMetricsThread(target=verify_operational_metrics,
+ args=(aws_metrics_utils, resource_mappings, start_time)))
+ operational_threads.append(
+ AWSMetricsThread(target=update_kinesis_analytics_application_status,
+ args=(aws_metrics_utils, resource_mappings, False)))
+ for thread in operational_threads:
+ thread.start()
+ for thread in operational_threads:
+ thread.join()
+
+ @pytest.mark.parametrize('level', ['levels/aws/metrics/metrics.spawnable'])
+ def test_realtime_and_batch_analytics_no_global_accountid(self,
+ level: str,
+ launcher: pytest.fixture,
+ asset_processor: pytest.fixture,
+ workspace: pytest.fixture,
+ aws_utils: pytest.fixture,
+ resource_mappings: pytest.fixture,
+ aws_metrics_utils: pytest.fixture):
+ """
+ Verify that the metrics events are sent to CloudWatch and S3 for analytics.
+ """
+ # Remove top-level account ID from resource mappings
+ resource_mappings.clear_select_keys([AWS_RESOURCE_MAPPINGS_ACCOUNT_ID_KEY])
+ # Start Kinesis analytics application on a separate thread to avoid blocking the test.
+ kinesis_analytics_application_thread = AWSMetricsThread(target=update_kinesis_analytics_application_status,
+ args=(aws_metrics_utils, resource_mappings, True))
+ kinesis_analytics_application_thread.start()
+
+ log_monitor = setup(launcher, asset_processor)
+
+ # Kinesis analytics application needs to be in the running state before we start the game launcher.
+ kinesis_analytics_application_thread.join()
+ launcher.args = ['+LoadLevel', level]
+ launcher.args.extend(['-rhi=null'])
+ start_time = datetime.utcnow()
+ with launcher.start(launch_ap=False):
+ monitor_metrics_submission(log_monitor)
+
+ # Verify that real-time analytics metrics are delivered to CloudWatch.
+ aws_metrics_utils.verify_cloud_watch_delivery(
+ AWS_METRICS_FEATURE_NAME,
+ 'TotalLogins',
+ [],
+ start_time)
+ logger.info('Real-time metrics are sent to CloudWatch.')
+
+ # Run time-consuming operations on separate threads to avoid blocking the test.
+ operational_threads = list()
+ operational_threads.append(
+ AWSMetricsThread(target=query_metrics_from_s3,
+ args=(aws_metrics_utils, resource_mappings)))
+ operational_threads.append(
+ AWSMetricsThread(target=verify_operational_metrics,
+ args=(aws_metrics_utils, resource_mappings, start_time)))
+ operational_threads.append(
+ AWSMetricsThread(target=update_kinesis_analytics_application_status,
+ args=(aws_metrics_utils, resource_mappings, False)))
+ for thread in operational_threads:
+ thread.start()
+ for thread in operational_threads:
+ thread.join()
+
+ @pytest.mark.parametrize('level', ['levels/aws/metrics/metrics.spawnable'])
+ def test_unauthorized_user_request_rejected(self,
+ level: str,
+ launcher: pytest.fixture,
+ asset_processor: pytest.fixture,
+ workspace: pytest.fixture):
+ """
+ Verify that unauthorized users cannot send metrics events to the AWS backed backend.
+ """
+ log_monitor = setup(launcher, asset_processor)
+
+ # Set invalid AWS credentials.
+ launcher.args = ['+LoadLevel', level, '+cl_awsAccessKey', 'AKIAIOSFODNN7EXAMPLE',
+ '+cl_awsSecretKey', 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY']
+ launcher.args.extend(['-rhi=null'])
+
+ with launcher.start(launch_ap=False):
+ result = log_monitor.monitor_log_for_lines(
+ expected_lines=['(Script) - Failed to send metrics.'],
+ unexpected_lines=['(Script) - Metrics is sent successfully.'],
+ halt_on_unexpected=True)
+ assert result, 'Metrics events are sent successfully by unauthorized user'
+ logger.info('Unauthorized user is rejected to send metrics.')
+
+ def test_clean_up_s3_bucket(self,
+ aws_utils: pytest.fixture,
+ resource_mappings: pytest.fixture,
+ aws_metrics_utils: pytest.fixture):
+ """
+ Clear the analytics bucket objects so that the S3 bucket can be destroyed during tear down.
+ """
+ aws_metrics_utils.empty_bucket(
+ resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsBucketName'))
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_custom_thread.py b/AutomatedTesting/Gem/PythonTests/AWS/aws_metrics/aws_metrics_custom_thread.py
similarity index 96%
rename from AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_custom_thread.py
rename to AutomatedTesting/Gem/PythonTests/AWS/aws_metrics/aws_metrics_custom_thread.py
index 1bba9c3e39..99f9072c4b 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_custom_thread.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/aws_metrics/aws_metrics_custom_thread.py
@@ -1,29 +1,29 @@
-"""
-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
-"""
-
-from threading import Thread
-
-
-class AWSMetricsThread(Thread):
- """
- Custom thread for raising assertion errors on the main thread.
- """
- def __init__(self, **kwargs):
- super().__init__(**kwargs)
- self._error = None
-
- def run(self) -> None:
- try:
- super().run()
- except AssertionError as e:
- self._error = e
-
- def join(self, **kwargs) -> None:
- super().join(**kwargs)
-
- if self._error:
- raise AssertionError(self._error)
+"""
+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
+"""
+
+from threading import Thread
+
+
+class AWSMetricsThread(Thread):
+ """
+ Custom thread for raising assertion errors on the main thread.
+ """
+ def __init__(self, **kwargs):
+ super().__init__(**kwargs)
+ self._error = None
+
+ def run(self) -> None:
+ try:
+ super().run()
+ except AssertionError as e:
+ self._error = e
+
+ def join(self, **kwargs) -> None:
+ super().join(**kwargs)
+
+ if self._error:
+ raise AssertionError(self._error)
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_utils.py b/AutomatedTesting/Gem/PythonTests/AWS/aws_metrics/aws_metrics_utils.py
similarity index 97%
rename from AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_utils.py
rename to AutomatedTesting/Gem/PythonTests/AWS/aws_metrics/aws_metrics_utils.py
index e7eb486d02..64ee224f4e 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_utils.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/aws_metrics/aws_metrics_utils.py
@@ -1,239 +1,239 @@
-"""
-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 logging
-import pathlib
-import pytest
-import typing
-
-from datetime import datetime
-from botocore.exceptions import WaiterError
-
-from .aws_metrics_waiters import KinesisAnalyticsApplicationUpdatedWaiter, \
- CloudWatchMetricsDeliveredWaiter, DataLakeMetricsDeliveredWaiter, GlueCrawlerReadyWaiter
-
-logging.getLogger('boto').setLevel(logging.CRITICAL)
-
-# Expected directory and file extension for the S3 objects.
-EXPECTED_S3_DIRECTORY = 'firehose_events/'
-EXPECTED_S3_OBJECT_EXTENSION = '.parquet'
-
-
-class AWSMetricsUtils:
- """
- Provide utils functions for the AWSMetrics gem to interact with the deployed resources.
- """
-
- def __init__(self, aws_utils: pytest.fixture):
- self._aws_util = aws_utils
-
- def start_kinesis_data_analytics_application(self, application_name: str) -> None:
- """
- Start the Kenisis Data Analytics application for real-time analytics.
- :param application_name: Name of the Kenisis Data Analytics application.
- """
- input_id = self.get_kinesis_analytics_application_input_id(application_name)
- assert input_id, 'invalid Kinesis Data Analytics application input.'
-
- client = self._aws_util.client('kinesisanalytics')
- try:
- client.start_application(
- ApplicationName=application_name,
- InputConfigurations=[
- {
- 'Id': input_id,
- 'InputStartingPositionConfiguration': {
- 'InputStartingPosition': 'NOW'
- }
- },
- ]
- )
- except client.exceptions.ResourceInUseException:
- # The application has been started.
- return
-
- try:
- KinesisAnalyticsApplicationUpdatedWaiter(client, 'RUNNING').wait(application_name=application_name)
- except WaiterError as e:
- assert False, f'Failed to start the Kinesis Data Analytics application: {str(e)}.'
-
- def get_kinesis_analytics_application_input_id(self, application_name: str) -> str:
- """
- Get the input ID for the Kenisis Data Analytics application.
- :param application_name: Name of the Kenisis Data Analytics application.
- :return: Input ID for the Kenisis Data Analytics application.
- """
- client = self._aws_util.client('kinesisanalytics')
- response = client.describe_application(
- ApplicationName=application_name
- )
- if not response:
- return ''
- input_descriptions = response.get('ApplicationDetail', {}).get('InputDescriptions', [])
- if len(input_descriptions) != 1:
- return ''
-
- return input_descriptions[0].get('InputId', '')
-
- def stop_kinesis_data_analytics_application(self, application_name: str) -> None:
- """
- Stop the Kenisis Data Analytics application.
- :param application_name: Name of the Kenisis Data Analytics application.
- """
- client = self._aws_util.client('kinesisanalytics')
- client.stop_application(
- ApplicationName=application_name
- )
-
- try:
- KinesisAnalyticsApplicationUpdatedWaiter(client, 'READY').wait(application_name=application_name)
- except WaiterError as e:
- assert False, f'Failed to stop the Kinesis Data Analytics application: {str(e)}.'
-
- def verify_cloud_watch_delivery(self, namespace: str, metrics_name: str,
- dimensions: typing.List[dict], start_time: datetime) -> None:
- """
- Verify that the expected metrics is delivered to CloudWatch.
- :param namespace: Namespace of the metrics.
- :param metrics_name: Name of the metrics.
- :param dimensions: Dimensions of the metrics.
- :param start_time: Start time for generating the metrics.
- """
- client = self._aws_util.client('cloudwatch')
-
- try:
- CloudWatchMetricsDeliveredWaiter(client).wait(
- namespace=namespace,
- metrics_name=metrics_name,
- dimensions=dimensions,
- start_time=start_time
- )
- except WaiterError as e:
- assert False, f'Failed to deliver metrics to CloudWatch: {str(e)}.'
-
- def verify_s3_delivery(self, analytics_bucket_name: str) -> None:
- """
- Verify that metrics are delivered to S3 for batch analytics successfully.
- :param analytics_bucket_name: Name of the deployed S3 bucket.
- """
- client = self._aws_util.client('s3')
- bucket_name = analytics_bucket_name
-
- try:
- DataLakeMetricsDeliveredWaiter(client).wait(bucket_name=bucket_name, prefix=EXPECTED_S3_DIRECTORY)
- except WaiterError as e:
- assert False, f'Failed to find the S3 directory for storing metrics data: {str(e)}.'
-
- # Check whether the data is converted to the expected data format.
- response = client.list_objects_v2(
- Bucket=bucket_name,
- Prefix=EXPECTED_S3_DIRECTORY
- )
- assert response.get('KeyCount', 0) != 0, f'Failed to deliver metrics to the S3 bucket {bucket_name}.'
-
- s3_objects = response.get('Contents', [])
- for s3_object in s3_objects:
- key = s3_object.get('Key', '')
- assert pathlib.Path(key).suffix == EXPECTED_S3_OBJECT_EXTENSION, \
- f'Invalid data format is found in the S3 bucket {bucket_name}'
-
- def run_glue_crawler(self, crawler_name: str) -> None:
- """
- Run the Glue crawler and wait for it to finish.
- :param crawler_name: Name of the Glue crawler
- """
- client = self._aws_util.client('glue')
- try:
- client.start_crawler(
- Name=crawler_name
- )
- except client.exceptions.CrawlerRunningException:
- # The crawler has already been started.
- return
-
- try:
- GlueCrawlerReadyWaiter(client).wait(crawler_name=crawler_name)
- except WaiterError as e:
- assert False, f'Failed to run the Glue crawler: {str(e)}.'
-
- def run_named_queries(self, work_group: str) -> None:
- """
- Run the named queries under the specific Athena work group.
- :param work_group: Name of the Athena work group.
- """
- client = self._aws_util.client('athena')
- # List all the named queries.
- response = client.list_named_queries(
- WorkGroup=work_group
- )
- named_query_ids = response.get('NamedQueryIds', [])
-
- # Run each of the queries.
- for named_query_id in named_query_ids:
- get_named_query_response = client.get_named_query(
- NamedQueryId=named_query_id
- )
- named_query = get_named_query_response.get('NamedQuery', {})
-
- start_query_execution_response = client.start_query_execution(
- QueryString=named_query.get('QueryString', ''),
- QueryExecutionContext={
- 'Database': named_query.get('Database', '')
- },
- WorkGroup=work_group
- )
-
- # Wait for the query to finish.
- state = 'RUNNING'
- while state == 'QUEUED' or state == 'RUNNING':
- get_query_execution_response = client.get_query_execution(
- QueryExecutionId=start_query_execution_response.get('QueryExecutionId', '')
- )
-
- state = get_query_execution_response.get('QueryExecution', {}).get('Status', {}).get('State', '')
-
- assert state == 'SUCCEEDED', f'Failed to run the named query {named_query.get("Name", {})}'
-
- def empty_bucket(self, bucket_name: str) -> None:
- """
- Empty the S3 bucket following:
- https://boto3.amazonaws.com/v1/documentation/api/latest/guide/migrations3.html
-
- :param bucket_name: Name of the S3 bucket.
- """
- s3 = self._aws_util.resource('s3')
- bucket = s3.Bucket(bucket_name)
-
- for key in bucket.objects.all():
- key.delete()
-
- def delete_table(self, database_name: str, table_name: str) -> None:
- """
- Delete an existing Glue table.
-
- :param database_name: Name of the Glue database.
- :param table_name: Name of the table to delete.
- """
- client = self._aws_util.client('glue')
- client.delete_table(
- DatabaseName=database_name,
- Name=table_name
- )
-
-
-@pytest.fixture(scope='function')
-def aws_metrics_utils(
- request: pytest.fixture,
- aws_utils: pytest.fixture):
- """
- Fixture for the AWS metrics util functions.
- :param request: _pytest.fixtures.SubRequest class that handles getting
- a pytest fixture from a pytest function/fixture.
- :param aws_utils: aws_utils fixture.
- """
- aws_utils_obj = AWSMetricsUtils(aws_utils)
- return aws_utils_obj
+"""
+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 logging
+import pathlib
+import pytest
+import typing
+
+from datetime import datetime
+from botocore.exceptions import WaiterError
+
+from .aws_metrics_waiters import KinesisAnalyticsApplicationUpdatedWaiter, \
+ CloudWatchMetricsDeliveredWaiter, DataLakeMetricsDeliveredWaiter, GlueCrawlerReadyWaiter
+
+logging.getLogger('boto').setLevel(logging.CRITICAL)
+
+# Expected directory and file extension for the S3 objects.
+EXPECTED_S3_DIRECTORY = 'firehose_events/'
+EXPECTED_S3_OBJECT_EXTENSION = '.parquet'
+
+
+class AWSMetricsUtils:
+ """
+ Provide utils functions for the AWSMetrics gem to interact with the deployed resources.
+ """
+
+ def __init__(self, aws_utils: pytest.fixture):
+ self._aws_util = aws_utils
+
+ def start_kinesis_data_analytics_application(self, application_name: str) -> None:
+ """
+ Start the Kenisis Data Analytics application for real-time analytics.
+ :param application_name: Name of the Kenisis Data Analytics application.
+ """
+ input_id = self.get_kinesis_analytics_application_input_id(application_name)
+ assert input_id, 'invalid Kinesis Data Analytics application input.'
+
+ client = self._aws_util.client('kinesisanalytics')
+ try:
+ client.start_application(
+ ApplicationName=application_name,
+ InputConfigurations=[
+ {
+ 'Id': input_id,
+ 'InputStartingPositionConfiguration': {
+ 'InputStartingPosition': 'NOW'
+ }
+ },
+ ]
+ )
+ except client.exceptions.ResourceInUseException:
+ # The application has been started.
+ return
+
+ try:
+ KinesisAnalyticsApplicationUpdatedWaiter(client, 'RUNNING').wait(application_name=application_name)
+ except WaiterError as e:
+ assert False, f'Failed to start the Kinesis Data Analytics application: {str(e)}.'
+
+ def get_kinesis_analytics_application_input_id(self, application_name: str) -> str:
+ """
+ Get the input ID for the Kenisis Data Analytics application.
+ :param application_name: Name of the Kenisis Data Analytics application.
+ :return: Input ID for the Kenisis Data Analytics application.
+ """
+ client = self._aws_util.client('kinesisanalytics')
+ response = client.describe_application(
+ ApplicationName=application_name
+ )
+ if not response:
+ return ''
+ input_descriptions = response.get('ApplicationDetail', {}).get('InputDescriptions', [])
+ if len(input_descriptions) != 1:
+ return ''
+
+ return input_descriptions[0].get('InputId', '')
+
+ def stop_kinesis_data_analytics_application(self, application_name: str) -> None:
+ """
+ Stop the Kenisis Data Analytics application.
+ :param application_name: Name of the Kenisis Data Analytics application.
+ """
+ client = self._aws_util.client('kinesisanalytics')
+ client.stop_application(
+ ApplicationName=application_name
+ )
+
+ try:
+ KinesisAnalyticsApplicationUpdatedWaiter(client, 'READY').wait(application_name=application_name)
+ except WaiterError as e:
+ assert False, f'Failed to stop the Kinesis Data Analytics application: {str(e)}.'
+
+ def verify_cloud_watch_delivery(self, namespace: str, metrics_name: str,
+ dimensions: typing.List[dict], start_time: datetime) -> None:
+ """
+ Verify that the expected metrics is delivered to CloudWatch.
+ :param namespace: Namespace of the metrics.
+ :param metrics_name: Name of the metrics.
+ :param dimensions: Dimensions of the metrics.
+ :param start_time: Start time for generating the metrics.
+ """
+ client = self._aws_util.client('cloudwatch')
+
+ try:
+ CloudWatchMetricsDeliveredWaiter(client).wait(
+ namespace=namespace,
+ metrics_name=metrics_name,
+ dimensions=dimensions,
+ start_time=start_time
+ )
+ except WaiterError as e:
+ assert False, f'Failed to deliver metrics to CloudWatch: {str(e)}.'
+
+ def verify_s3_delivery(self, analytics_bucket_name: str) -> None:
+ """
+ Verify that metrics are delivered to S3 for batch analytics successfully.
+ :param analytics_bucket_name: Name of the deployed S3 bucket.
+ """
+ client = self._aws_util.client('s3')
+ bucket_name = analytics_bucket_name
+
+ try:
+ DataLakeMetricsDeliveredWaiter(client).wait(bucket_name=bucket_name, prefix=EXPECTED_S3_DIRECTORY)
+ except WaiterError as e:
+ assert False, f'Failed to find the S3 directory for storing metrics data: {str(e)}.'
+
+ # Check whether the data is converted to the expected data format.
+ response = client.list_objects_v2(
+ Bucket=bucket_name,
+ Prefix=EXPECTED_S3_DIRECTORY
+ )
+ assert response.get('KeyCount', 0) != 0, f'Failed to deliver metrics to the S3 bucket {bucket_name}.'
+
+ s3_objects = response.get('Contents', [])
+ for s3_object in s3_objects:
+ key = s3_object.get('Key', '')
+ assert pathlib.Path(key).suffix == EXPECTED_S3_OBJECT_EXTENSION, \
+ f'Invalid data format is found in the S3 bucket {bucket_name}'
+
+ def run_glue_crawler(self, crawler_name: str) -> None:
+ """
+ Run the Glue crawler and wait for it to finish.
+ :param crawler_name: Name of the Glue crawler
+ """
+ client = self._aws_util.client('glue')
+ try:
+ client.start_crawler(
+ Name=crawler_name
+ )
+ except client.exceptions.CrawlerRunningException:
+ # The crawler has already been started.
+ return
+
+ try:
+ GlueCrawlerReadyWaiter(client).wait(crawler_name=crawler_name)
+ except WaiterError as e:
+ assert False, f'Failed to run the Glue crawler: {str(e)}.'
+
+ def run_named_queries(self, work_group: str) -> None:
+ """
+ Run the named queries under the specific Athena work group.
+ :param work_group: Name of the Athena work group.
+ """
+ client = self._aws_util.client('athena')
+ # List all the named queries.
+ response = client.list_named_queries(
+ WorkGroup=work_group
+ )
+ named_query_ids = response.get('NamedQueryIds', [])
+
+ # Run each of the queries.
+ for named_query_id in named_query_ids:
+ get_named_query_response = client.get_named_query(
+ NamedQueryId=named_query_id
+ )
+ named_query = get_named_query_response.get('NamedQuery', {})
+
+ start_query_execution_response = client.start_query_execution(
+ QueryString=named_query.get('QueryString', ''),
+ QueryExecutionContext={
+ 'Database': named_query.get('Database', '')
+ },
+ WorkGroup=work_group
+ )
+
+ # Wait for the query to finish.
+ state = 'RUNNING'
+ while state == 'QUEUED' or state == 'RUNNING':
+ get_query_execution_response = client.get_query_execution(
+ QueryExecutionId=start_query_execution_response.get('QueryExecutionId', '')
+ )
+
+ state = get_query_execution_response.get('QueryExecution', {}).get('Status', {}).get('State', '')
+
+ assert state == 'SUCCEEDED', f'Failed to run the named query {named_query.get("Name", {})}'
+
+ def empty_bucket(self, bucket_name: str) -> None:
+ """
+ Empty the S3 bucket following:
+ https://boto3.amazonaws.com/v1/documentation/api/latest/guide/migrations3.html
+
+ :param bucket_name: Name of the S3 bucket.
+ """
+ s3 = self._aws_util.resource('s3')
+ bucket = s3.Bucket(bucket_name)
+
+ for key in bucket.objects.all():
+ key.delete()
+
+ def delete_table(self, database_name: str, table_name: str) -> None:
+ """
+ Delete an existing Glue table.
+
+ :param database_name: Name of the Glue database.
+ :param table_name: Name of the table to delete.
+ """
+ client = self._aws_util.client('glue')
+ client.delete_table(
+ DatabaseName=database_name,
+ Name=table_name
+ )
+
+
+@pytest.fixture(scope='function')
+def aws_metrics_utils(
+ request: pytest.fixture,
+ aws_utils: pytest.fixture):
+ """
+ Fixture for the AWS metrics util functions.
+ :param request: _pytest.fixtures.SubRequest class that handles getting
+ a pytest fixture from a pytest function/fixture.
+ :param aws_utils: aws_utils fixture.
+ """
+ aws_utils_obj = AWSMetricsUtils(aws_utils)
+ return aws_utils_obj
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_waiters.py b/AutomatedTesting/Gem/PythonTests/AWS/aws_metrics/aws_metrics_waiters.py
similarity index 96%
rename from AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_waiters.py
rename to AutomatedTesting/Gem/PythonTests/AWS/aws_metrics/aws_metrics_waiters.py
index 46070a3a64..7b09557c79 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_waiters.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/aws_metrics/aws_metrics_waiters.py
@@ -1,139 +1,139 @@
-"""
-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 botocore.client
-import logging
-
-from datetime import timedelta
-from AWS.common.custom_waiter import CustomWaiter, WaitState
-
-logging.getLogger('boto').setLevel(logging.CRITICAL)
-
-
-class KinesisAnalyticsApplicationUpdatedWaiter(CustomWaiter):
- """
- Subclass of the base custom waiter class.
- Wait for the Kinesis analytics application being updated to a specific status.
- """
- def __init__(self, client: botocore.client, status: str):
- """
- Initialize the waiter.
-
- :param client: Boto3 client to use.
- :param status: Expected status.
- """
- super().__init__(
- 'KinesisAnalyticsApplicationUpdated',
- 'DescribeApplication',
- 'ApplicationDetail.ApplicationStatus',
- {status: WaitState.SUCCESS},
- client)
-
- def wait(self, application_name: str):
- """
- Wait for the expected status.
-
- :param application_name: Name of the Kinesis analytics application.
- """
- self._wait(ApplicationName=application_name)
-
-
-class GlueCrawlerReadyWaiter(CustomWaiter):
- """
- Subclass of the base custom waiter class.
- Wait for the Glue crawler to finish its processing. Return when the crawler is in the "Stopping" status
- to avoid wasting too much time in the automation tests on its shutdown process.
- """
- def __init__(self, client: botocore.client):
- """
- Initialize the waiter.
-
- :param client: Boto3 client to use.
- """
- super().__init__(
- 'GlueCrawlerReady',
- 'GetCrawler',
- 'Crawler.State',
- {'STOPPING': WaitState.SUCCESS},
- client)
-
- def wait(self, crawler_name):
- """
- Wait for the expected status.
-
- :param crawler_name: Name of the Glue crawler.
- """
- self._wait(Name=crawler_name)
-
-
-class DataLakeMetricsDeliveredWaiter(CustomWaiter):
- """
- Subclass of the base custom waiter class.
- Wait for the expected directory being created in the S3 bucket.
- """
- def __init__(self, client: botocore.client):
- """
- Initialize the waiter.
-
- :param client: Boto3 client to use.
- """
- super().__init__(
- 'DataLakeMetricsDelivered',
- 'ListObjectsV2',
- 'KeyCount > `0`',
- {True: WaitState.SUCCESS},
- client)
-
- def wait(self, bucket_name, prefix):
- """
- Wait for the expected directory being created.
-
- :param bucket_name: Name of the S3 bucket.
- :param prefix: Name of the expected directory prefix.
- """
- self._wait(Bucket=bucket_name, Prefix=prefix)
-
-
-class CloudWatchMetricsDeliveredWaiter(CustomWaiter):
- """
- Subclass of the base custom waiter class.
- Wait for the expected metrics being delivered to CloudWatch.
- """
- def __init__(self, client: botocore.client):
- """
- Initialize the waiter.
-
- :param client: Boto3 client to use.
- """
- super().__init__(
- 'CloudWatchMetricsDelivered',
- 'GetMetricStatistics',
- 'length(Datapoints) > `0`',
- {True: WaitState.SUCCESS},
- client)
-
- def wait(self, namespace, metrics_name, dimensions, start_time):
- """
- Wait for the expected metrics being delivered.
-
- :param namespace: Namespace of the metrics.
- :param metrics_name: Name of the metrics.
- :param dimensions: Dimensions of the metrics.
- :param start_time: Start time for generating the metrics.
- """
- self._wait(
- Namespace=namespace,
- MetricName=metrics_name,
- Dimensions=dimensions,
- StartTime=start_time,
- EndTime=start_time + timedelta(0, self.timeout),
- Period=60,
- Statistics=[
- 'SampleCount'
- ],
- Unit='Count'
- )
+"""
+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 botocore.client
+import logging
+
+from datetime import timedelta
+from AWS.common.custom_waiter import CustomWaiter, WaitState
+
+logging.getLogger('boto').setLevel(logging.CRITICAL)
+
+
+class KinesisAnalyticsApplicationUpdatedWaiter(CustomWaiter):
+ """
+ Subclass of the base custom waiter class.
+ Wait for the Kinesis analytics application being updated to a specific status.
+ """
+ def __init__(self, client: botocore.client, status: str):
+ """
+ Initialize the waiter.
+
+ :param client: Boto3 client to use.
+ :param status: Expected status.
+ """
+ super().__init__(
+ 'KinesisAnalyticsApplicationUpdated',
+ 'DescribeApplication',
+ 'ApplicationDetail.ApplicationStatus',
+ {status: WaitState.SUCCESS},
+ client)
+
+ def wait(self, application_name: str):
+ """
+ Wait for the expected status.
+
+ :param application_name: Name of the Kinesis analytics application.
+ """
+ self._wait(ApplicationName=application_name)
+
+
+class GlueCrawlerReadyWaiter(CustomWaiter):
+ """
+ Subclass of the base custom waiter class.
+ Wait for the Glue crawler to finish its processing. Return when the crawler is in the "Stopping" status
+ to avoid wasting too much time in the automation tests on its shutdown process.
+ """
+ def __init__(self, client: botocore.client):
+ """
+ Initialize the waiter.
+
+ :param client: Boto3 client to use.
+ """
+ super().__init__(
+ 'GlueCrawlerReady',
+ 'GetCrawler',
+ 'Crawler.State',
+ {'STOPPING': WaitState.SUCCESS},
+ client)
+
+ def wait(self, crawler_name):
+ """
+ Wait for the expected status.
+
+ :param crawler_name: Name of the Glue crawler.
+ """
+ self._wait(Name=crawler_name)
+
+
+class DataLakeMetricsDeliveredWaiter(CustomWaiter):
+ """
+ Subclass of the base custom waiter class.
+ Wait for the expected directory being created in the S3 bucket.
+ """
+ def __init__(self, client: botocore.client):
+ """
+ Initialize the waiter.
+
+ :param client: Boto3 client to use.
+ """
+ super().__init__(
+ 'DataLakeMetricsDelivered',
+ 'ListObjectsV2',
+ 'KeyCount > `0`',
+ {True: WaitState.SUCCESS},
+ client)
+
+ def wait(self, bucket_name, prefix):
+ """
+ Wait for the expected directory being created.
+
+ :param bucket_name: Name of the S3 bucket.
+ :param prefix: Name of the expected directory prefix.
+ """
+ self._wait(Bucket=bucket_name, Prefix=prefix)
+
+
+class CloudWatchMetricsDeliveredWaiter(CustomWaiter):
+ """
+ Subclass of the base custom waiter class.
+ Wait for the expected metrics being delivered to CloudWatch.
+ """
+ def __init__(self, client: botocore.client):
+ """
+ Initialize the waiter.
+
+ :param client: Boto3 client to use.
+ """
+ super().__init__(
+ 'CloudWatchMetricsDelivered',
+ 'GetMetricStatistics',
+ 'length(Datapoints) > `0`',
+ {True: WaitState.SUCCESS},
+ client)
+
+ def wait(self, namespace, metrics_name, dimensions, start_time):
+ """
+ Wait for the expected metrics being delivered.
+
+ :param namespace: Namespace of the metrics.
+ :param metrics_name: Name of the metrics.
+ :param dimensions: Dimensions of the metrics.
+ :param start_time: Start time for generating the metrics.
+ """
+ self._wait(
+ Namespace=namespace,
+ MetricName=metrics_name,
+ Dimensions=dimensions,
+ StartTime=start_time,
+ EndTime=start_time + timedelta(0, self.timeout),
+ Period=60,
+ Statistics=[
+ 'SampleCount'
+ ],
+ Unit='Count'
+ )
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/__init__.py b/AutomatedTesting/Gem/PythonTests/AWS/client_auth/__init__.py
similarity index 100%
rename from AutomatedTesting/Gem/PythonTests/AWS/Windows/__init__.py
rename to AutomatedTesting/Gem/PythonTests/AWS/client_auth/__init__.py
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/aws_client_auth_automation_test.py b/AutomatedTesting/Gem/PythonTests/AWS/client_auth/aws_client_auth_automation_test.py
similarity index 94%
rename from AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/aws_client_auth_automation_test.py
rename to AutomatedTesting/Gem/PythonTests/AWS/client_auth/aws_client_auth_automation_test.py
index 077a068a18..b185a155ed 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/aws_client_auth_automation_test.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/client_auth/aws_client_auth_automation_test.py
@@ -40,7 +40,7 @@ class TestAWSClientAuthWindows(object):
Test class to verify AWS Client Auth gem features on Windows.
"""
- @pytest.mark.parametrize('level', ['AWS/ClientAuth'])
+ @pytest.mark.parametrize('level', ['levels/aws/clientauth/clientauth.spawnable'])
def test_anonymous_credentials(self,
level: str,
launcher: pytest.fixture,
@@ -72,7 +72,7 @@ class TestAWSClientAuthWindows(object):
)
assert result, 'Anonymous credentials fetched successfully.'
- @pytest.mark.parametrize('level', ['AWS/ClientAuth'])
+ @pytest.mark.parametrize('level', ['levels/aws/clientauth/clientauth.spawnable'])
def test_anonymous_credentials_no_global_accountid(self,
level: str,
launcher: pytest.fixture,
@@ -140,7 +140,7 @@ class TestAWSClientAuthWindows(object):
except cognito_idp.exceptions.UserNotFoundException:
pass
- launcher.args = ['+LoadLevel', 'AWS/ClientAuthPasswordSignUp']
+ launcher.args = ['+LoadLevel', 'levels/aws/clientauthpasswordsignup/clientauthpasswordsignup.spawnable']
launcher.args.extend(['-rhi=null'])
with launcher.start(launch_ap=False):
@@ -158,7 +158,7 @@ class TestAWSClientAuthWindows(object):
Username='test1'
)
- launcher.args = ['+LoadLevel', 'AWS/ClientAuthPasswordSignIn']
+ launcher.args = ['+LoadLevel', 'levels/aws/clientauthpasswordsignin/clientauthpasswordsignin.spawnable']
launcher.args.extend(['-rhi=null'])
with launcher.start(launch_ap=False):
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/__init__.py b/AutomatedTesting/Gem/PythonTests/AWS/core/__init__.py
similarity index 99%
rename from AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/__init__.py
rename to AutomatedTesting/Gem/PythonTests/AWS/core/__init__.py
index bbcbcf1807..f5193b300e 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/__init__.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/core/__init__.py
@@ -4,4 +4,3 @@ For complete copyright and license terms please see the LICENSE at the root of t
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/core/test_aws_resource_interaction.py
similarity index 99%
rename from AutomatedTesting/Gem/PythonTests/AWS/Windows/core/test_aws_resource_interaction.py
rename to AutomatedTesting/Gem/PythonTests/AWS/core/test_aws_resource_interaction.py
index 59c517fd1c..367f02cac3 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/core/test_aws_resource_interaction.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/core/test_aws_resource_interaction.py
@@ -84,7 +84,7 @@ def write_test_data_to_dynamodb_table(resource_mappings: pytest.fixture, aws_uti
@pytest.mark.parametrize('session_name', [constants.SESSION_NAME])
@pytest.mark.usefixtures('workspace')
@pytest.mark.parametrize('project', ['AutomatedTesting'])
-@pytest.mark.parametrize('level', ['AWS/Core'])
+@pytest.mark.parametrize('level', ['levels/aws/core/core.spawnable'])
@pytest.mark.usefixtures('resource_mappings')
@pytest.mark.parametrize('resource_mappings_filename', [constants.AWS_RESOURCE_MAPPING_FILE_NAME])
@pytest.mark.parametrize('stacks', [[f'{constants.AWS_PROJECT_NAME}-{AWS_CORE_FEATURE_NAME}',
diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/utils.py
index 7b526033dd..35a50b6090 100644
--- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/utils.py
+++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/utils.py
@@ -100,6 +100,49 @@ class TestHelper:
TestHelper.wait_for_condition(lambda : general.is_in_game_mode(), 1.0)
Report.critical_result(msgtuple_success_fail, general.is_in_game_mode())
+ @staticmethod
+ def find_line(window, line, print_infos):
+ """
+ Looks for an expected line in a list of tracer log lines
+ :param window: The log's window name. For example, logs printed via script-canvas use the "Script" window.
+ :param line: The log message to search for.
+ :param print_infos: A list of PrintInfos collected by Tracer to search. Example options: your_tracer.warnings, your_tracer.errors, your_tracer.asserts, or your_tracer.prints
+
+ :return: True if the line is found, otherwise false.
+ """
+ for printInfo in print_infos:
+ if printInfo.window == window.strip() and printInfo.message.strip() == line:
+ return True
+ return False
+
+ @staticmethod
+ def succeed_if_log_line_found(window, line, print_infos, time_out):
+ """
+ Looks for a line in a list of tracer log lines and reports success if found.
+ :param window: The log's window name. For example, logs printed via script-canvas use the "Script" window.
+ :param line: The log message we're hoping to find.
+ :param print_infos: A list of PrintInfos collected by Tracer to search. Example options: your_tracer.warnings, your_tracer.errors, your_tracer.asserts, or your_tracer.prints
+ :param time_out: The total amount of time to wait before giving up looking for the expected line.
+
+ :return: No return value, but if the message is found, a successful critical result is reported; otherwise failure.
+ """
+ TestHelper.wait_for_condition(lambda : TestHelper.find_line(window, line, print_infos), time_out)
+ Report.critical_result(("Found expected line: " + line, "Failed to find expected line: " + line), TestHelper.find_line(window, line, print_infos))
+
+ @staticmethod
+ def fail_if_log_line_found(window, line, print_infos, time_out):
+ """
+ Reports a failure if a log line in a list of tracer log lines is found.
+ :param window: The log's window name. For example, logs printed via script-canvas use the "Script" window.
+ :param line: The log message we're hoping to not find.
+ :param print_infos: A list of PrintInfos collected by Tracer to search. Example options: your_tracer.warnings, your_tracer.errors, your_tracer.asserts, or your_tracer.prints
+ :param time_out: The total amount of time to wait before giving up looking for the unexpected line. If time runs out and we don't see the unexpected line then report a success.
+
+ :return: No return value, but if the line is found, a failed critical result is reported; otherwise success.
+ """
+ TestHelper.wait_for_condition(lambda : TestHelper.find_line(window, line, print_infos), time_out)
+ Report.critical_result(("Unexpected line not found: " + line, "Unexpected line found: " + line), not TestHelper.find_line(window, line, print_infos))
+
@staticmethod
def multiplayer_enter_game_mode(msgtuple_success_fail: Tuple[str, str], sv_default_player_spawn_asset: str) -> None:
"""
@@ -108,23 +151,6 @@ class TestHelper:
:return: None
"""
-
- # looks for an expected line in a list of tracers lines
- # lines: the tracer list of lines to search. options are section_tracer.warnings, section_tracer.errors, section_tracer.asserts, section_tracer.prints
- # return: true if the line is found, otherwise false
- def find_expected_line(expected_line, lines):
- found_lines = [printInfo.message.strip() for printInfo in lines]
- return expected_line in found_lines
-
- def wait_for_critical_expected_line(expected_line, lines, time_out):
- TestHelper.wait_for_condition(lambda : find_expected_line(expected_line, lines), time_out)
- Report.critical_result(("Found expected line: " + expected_line, "Failed to find expected line: " + expected_line), find_expected_line(expected_line, lines))
-
- def wait_for_critical_unexpected_line(unexpected_line, lines, time_out):
- TestHelper.wait_for_condition(lambda : find_expected_line(unexpected_line, lines), time_out)
- Report.critical_result(("Unexpected line not found: " + unexpected_line, "Unexpected line found: " + unexpected_line), not find_expected_line(unexpected_line, lines))
-
-
Report.info("Entering game mode")
if sv_default_player_spawn_asset :
general.set_cvar("sv_defaultPlayerSpawnAsset", sv_default_player_spawn_asset)
@@ -135,20 +161,20 @@ class TestHelper:
multiplayer.PythonEditorFuncs_enter_game_mode()
# make sure the server launcher binary exists
- wait_for_critical_unexpected_line("LaunchEditorServer failed! The ServerLauncher binary is missing!", section_tracer.errors, 0.5)
+ TestHelper.fail_if_log_line_found("MultiplayerEditor", "LaunchEditorServer failed! The ServerLauncher binary is missing!", section_tracer.errors, 0.5)
# make sure the server launcher is running
waiter.wait_for(lambda: process_utils.process_exists("AutomatedTesting.ServerLauncher", ignore_extensions=True), timeout=5.0, exc=AssertionError("AutomatedTesting.ServerLauncher has NOT launched!"), interval=1.0)
- wait_for_critical_expected_line("MultiplayerEditorConnection: Editor-server activation has found and connected to the editor.", section_tracer.prints, 15.0)
+ TestHelper.succeed_if_log_line_found("EditorServer", "MultiplayerEditorConnection: Editor-server activation has found and connected to the editor.", section_tracer.prints, 15.0)
- wait_for_critical_expected_line("Editor is sending the editor-server the level data packet.", section_tracer.prints, 5.0)
+ TestHelper.succeed_if_log_line_found("MultiplayerEditor", "Editor is sending the editor-server the level data packet.", section_tracer.prints, 5.0)
- wait_for_critical_expected_line("Logger: Editor Server completed receiving the editor's level assets, responding to Editor...", section_tracer.prints, 5.0)
+ TestHelper.succeed_if_log_line_found("EditorServer", "Logger: Editor Server completed receiving the editor's level assets, responding to Editor...", section_tracer.prints, 5.0)
- wait_for_critical_expected_line("Editor-server ready. Editor has successfully connected to the editor-server's network simulation.", section_tracer.prints, 5.0)
+ TestHelper.succeed_if_log_line_found("MultiplayerEditorConnection", "Editor-server ready. Editor has successfully connected to the editor-server's network simulation.", section_tracer.prints, 5.0)
- wait_for_critical_unexpected_line(f"MultiplayerSystemComponent: SpawnDefaultPlayerPrefab failed. Missing sv_defaultPlayerSpawnAsset at path '{sv_default_player_spawn_asset.lower()}'.", section_tracer.prints, 0.5)
+ TestHelper.fail_if_log_line_found("EditorServer", f"MultiplayerSystemComponent: SpawnDefaultPlayerPrefab failed. Missing sv_defaultPlayerSpawnAsset at path '{sv_default_player_spawn_asset.lower()}'.", section_tracer.prints, 0.5)
TestHelper.wait_for_condition(lambda : multiplayer.PythonEditorFuncs_is_in_game_mode(), 5.0)
Report.critical_result(msgtuple_success_fail, multiplayer.PythonEditorFuncs_is_in_game_mode())
diff --git a/AutomatedTesting/Gem/PythonTests/Multiplayer/TestSuite_Sandbox.py b/AutomatedTesting/Gem/PythonTests/Multiplayer/TestSuite_Sandbox.py
index 8f50d4d36d..8c5f33993d 100644
--- a/AutomatedTesting/Gem/PythonTests/Multiplayer/TestSuite_Sandbox.py
+++ b/AutomatedTesting/Gem/PythonTests/Multiplayer/TestSuite_Sandbox.py
@@ -32,3 +32,6 @@ class TestAutomation(TestAutomationBase):
from .tests import Multiplayer_AutoComponent_NetworkInput as test_module
self._run_prefab_test(request, workspace, editor, test_module)
+ def test_Multiplayer_AutoComponent_RPC(self, request, workspace, editor, launcher_platform):
+ from .tests import Multiplayer_AutoComponent_RPC as test_module
+ self._run_prefab_test(request, workspace, editor, test_module)
diff --git a/AutomatedTesting/Gem/PythonTests/Multiplayer/tests/Multiplayer_AutoComponent_RPC.py b/AutomatedTesting/Gem/PythonTests/Multiplayer/tests/Multiplayer_AutoComponent_RPC.py
new file mode 100644
index 0000000000..827826cbcc
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/Multiplayer/tests/Multiplayer_AutoComponent_RPC.py
@@ -0,0 +1,83 @@
+"""
+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
+"""
+
+
+# Test Case Title : Check that the four network RPCs can be sent and received
+
+
+# fmt: off
+class TestSuccessFailTuples():
+ enter_game_mode = ("Entered game mode", "Failed to enter game mode")
+ exit_game_mode = ("Exited game mode", "Couldn't exit game mode")
+ find_network_player = ("Found network player", "Couldn't find network player")
+# fmt: on
+
+
+def Multiplayer_AutoComponent_RPC():
+ r"""
+ Summary:
+ Runs a test to make sure that RPCs can be sent and received via script canvas
+
+ Level Description:
+ - Dynamic
+ 1. Although the level is nearly empty, when the server and editor connect the server will spawn and replicate the player network prefab.
+ a. The player network prefab has a NetworkTestPlayerComponent.AutoComponent and a script canvas attached which sends and receives various RPCs.
+ Print logs occur upon sending and receiving the RPCs; we are testing to make sure the expected events and values are received.
+ - Static
+ 1. NetLevelEntity. This is a networked entity which has a script attached. Used for cross-entity communication. The net-player prefab will send this level entity Server->Authority RPCs
+
+
+ Expected Outcome:
+ We should see editor logs stating that RPCs have been sent and received.
+ However, if the script receives unexpected values for the Process event we will see print logs for bad data as well.
+
+ :return:
+ """
+ import azlmbr.legacy.general as general
+ from editor_python_test_tools.utils import Report
+ from editor_python_test_tools.utils import Tracer
+
+ from editor_python_test_tools.utils import TestHelper as helper
+ from ly_remote_console.remote_console_commands import RemoteConsole as RemoteConsole
+
+ level_name = "AutoComponent_RPC"
+ player_prefab_name = "Player"
+ player_prefab_path = f"levels/multiplayer/{level_name}/{player_prefab_name}.network.spawnable"
+
+ helper.init_idle()
+
+ # 1) Open Level
+ helper.open_level("Multiplayer", level_name)
+
+ with Tracer() as section_tracer:
+ # 2) Enter game mode
+ helper.multiplayer_enter_game_mode(TestSuccessFailTuples.enter_game_mode, player_prefab_path.lower())
+
+ # 3) Make sure the network player was spawned
+ player_id = general.find_game_entity(player_prefab_name)
+ Report.critical_result(TestSuccessFailTuples.find_network_player, player_id.IsValid())
+
+ # 4) Check the editor logs for expected and unexpected log output
+ PLAYERID_RPC_WAIT_TIME_SECONDS = 1.0 # The player id is sent from the server as soon as the player script is spawned. 1 second should be more than enough time to send/receive that RPC.
+ helper.succeed_if_log_line_found('EditorServer', 'Script: AutoComponent_RPC: Sending client PlayerNumber 1', section_tracer.prints, PLAYERID_RPC_WAIT_TIME_SECONDS)
+ helper.succeed_if_log_line_found('Script', "AutoComponent_RPC: I'm Player #1", section_tracer.prints, PLAYERID_RPC_WAIT_TIME_SECONDS)
+
+ # Uncomment once editor game-play mode supports level entities with net-binding
+ #PLAYFX_RPC_WAIT_TIME_SECONDS = 1.1 # The server will send an RPC to play an fx on the client every second.
+ #helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC_NetLevelEntity Activated on entity: NetLevelEntity", section_tracer.prints, PLAYFX_RPC_WAIT_TIME_SECONDS)
+ #helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC_NetLevelEntity: Authority sending RPC to play some fx.", section_tracer.prints, PLAYFX_RPC_WAIT_TIME_SECONDS)
+ #helper.succeed_if_log_line_found('Script', "AutoComponent_RPC_NetLevelEntity: I'm a client playing some superficial fx.", section_tracer.prints, PLAYFX_RPC_WAIT_TIME_SECONDS)
+
+
+ # Exit game mode
+ helper.exit_game_mode(TestSuccessFailTuples.exit_game_mode)
+
+
+
+if __name__ == "__main__":
+ from editor_python_test_tools.utils import Report
+ Report.start_test(Multiplayer_AutoComponent_RPC)
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/ap_fixtures/clear_moveoutput_fixture.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/ap_fixtures/clear_moveoutput_fixture.py
index 30ecac9a65..4b23f52006 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/ap_fixtures/clear_moveoutput_fixture.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/ap_fixtures/clear_moveoutput_fixture.py
@@ -3,8 +3,6 @@ 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
-
-Fixture for clearing out 'MoveOutput' folders from \dev and \dev\PROJECT
"""
# Import builtin libraries
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_relocator_tests.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_relocator_tests.py
index 744720323e..42c83c7c25 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_relocator_tests.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_relocator_tests.py
@@ -169,17 +169,17 @@ class TestsAssetRelocator_WindowsAndMac(object):
@pytest.mark.test_case_id("C21968388")
@pytest.mark.assetpipeline
- def test_WindowsMacPlatforms_MoveCorruptedSliceFile_MoveSuccess(self, request, workspace, ap_setup_fixture,
+ def test_WindowsMacPlatforms_MoveCorruptedPrefabFile_MoveSuccess(self, request, workspace, ap_setup_fixture,
asset_processor):
"""
Asset with UUID/AssetId reference in non-standard format is
successfully scanned and relocated to the MoveOutput folder.
- This test uses a pre-corrupted .slice file.
+ This test uses a pre-corrupted .prefab file.
Test Steps:
- 1. Create temporary testing environment with a corrupted slice
- 2. Attempt to move the corrupted slice
- 3. Verify that corrupted slice was moved successfully
+ 1. Create temporary testing environment with a corrupted prefab
+ 2. Attempt to move the corrupted prefab
+ 3. Verify that corrupted prefab was moved successfully
"""
env = ap_setup_fixture
@@ -187,7 +187,7 @@ class TestsAssetRelocator_WindowsAndMac(object):
asset_folder = "C21968388"
source_dir, _ = asset_processor.prepare_test_environment(env["tests_dir"], asset_folder)
- filename = "DependencyScannerAsset.slice"
+ filename = "DependencyScannerAsset.prefab"
file_path = os.path.join(source_dir, filename)
dst_rel_path = os.path.join("MoveOutput", filename)
dst_full_path = os.path.join(source_dir, dst_rel_path)
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/assets/C21968388/DependencyScannerAsset.prefab b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/assets/C21968388/DependencyScannerAsset.prefab
new file mode 100644
index 0000000000..1ba25b4463
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/assets/C21968388/DependencyScannerAsset.prefab
@@ -0,0 +1,908 @@
+{
+ "ContainerEntity": {
+ "Id": "ContainerEntity",
+ "Name": "DependencyScannerAsset",
+ "Components": {
+ "Component_[10182366347512475253]": {
+ "$type": "EditorPrefabComponent",
+ "Id": 10182366347512475253
+ },
+ "Component_[12917798267488243668]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 12917798267488243668
+ },
+ "Component_[3261249813163778338]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3261249813163778338
+ },
+ "Component_[3837204912784440039]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 3837204912784440039
+ },
+ "Component_[4272963378099646759]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 4272963378099646759,
+ "Parent Entity": ""
+ },
+ "Component_[4848458548047175816]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 4848458548047175816
+ },
+ "Component_[5787060997243919943]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 5787060997243919943
+ },
+ "Component_[7804170251266531779]": {
+ "$type": "EditorLockComponent",
+ "Id": 7804170251266531779
+ },
+ "Component_[7874177159288365422]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 7874177159288365422
+ },
+ "Component_[8018146290632383969]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 8018146290632383969
+ },
+ "Component_[8452360690590857075]": {
+ "$type": "SelectionComponent",
+ "Id": 8452360690590857075
+ }
+ }
+ },
+ "Entities": {
+ "Entity_[274004659287]": {
+ "Id": "Entity_[274004659287]",
+ "Name": "DependencyScannerAsset",
+ "Components": {
+ "Component_[10849460799799271301]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 10849460799799271301
+ },
+ "Component_[11098142762746045658]": {
+ "$type": "SelectionComponent",
+ "Id": 11098142762746045658
+ },
+ "Component_[11154538629717040387]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 11154538629717040387,
+ "Child Entity Order": [
+ "Entity_[305822185575]",
+ "Entity_[278299626583]",
+ "Entity_[282594593879]",
+ "Entity_[286889561175]",
+ "Entity_[291184528471]"
+ ]
+ },
+ "Component_[1365196255752273753]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 1365196255752273753
+ },
+ "Component_[280906579560376421]": {
+ "$type": "EditorLockComponent",
+ "Id": 280906579560376421
+ },
+ "Component_[4629965429001113748]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 4629965429001113748
+ },
+ "Component_[4876910656129741263]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 4876910656129741263
+ },
+ "Component_[5763306492614623496]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 5763306492614623496,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 7514977506847036117
+ }
+ ]
+ },
+ "Component_[7327709568605458460]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 7327709568605458460
+ },
+ "Component_[7514977506847036117]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 7514977506847036117,
+ "Parent Entity": "ContainerEntity"
+ }
+ }
+ },
+ "Entity_[278299626583]": {
+ "Id": "Entity_[278299626583]",
+ "Name": "AssetIDMatch",
+ "Components": {
+ "Component_[10285740519857855186]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 10285740519857855186
+ },
+ "Component_[11273731016303624898]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 11273731016303624898,
+ "Parent Entity": "Entity_[274004659287]"
+ },
+ "Component_[1136790983026972010]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 1136790983026972010
+ },
+ "Component_[12777313618328131055]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 12777313618328131055
+ },
+ "Component_[13256044902558773795]": {
+ "$type": "EditorLockComponent",
+ "Id": 13256044902558773795
+ },
+ "Component_[15834551022302435776]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 15834551022302435776,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 11273731016303624898
+ },
+ {
+ "ComponentId": 9671522714018290727,
+ "SortIndex": 1
+ }
+ ]
+ },
+ "Component_[16345420368214930095]": {
+ "$type": "SelectionComponent",
+ "Id": 16345420368214930095
+ },
+ "Component_[5309075942188429052]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5309075942188429052
+ },
+ "Component_[8639731896786645938]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 8639731896786645938
+ },
+ "Component_[9844585173698551415]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 9844585173698551415
+ }
+ }
+ },
+ "Entity_[282594593879]": {
+ "Id": "Entity_[282594593879]",
+ "Name": "UUIDMatch",
+ "Components": {
+ "Component_[10379494986254888760]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 10379494986254888760
+ },
+ "Component_[10932830014545295552]": {
+ "$type": "SelectionComponent",
+ "Id": 10932830014545295552
+ },
+ "Component_[16077882919902242532]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 16077882919902242532
+ },
+ "Component_[2150375322459274584]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 2150375322459274584
+ },
+ "Component_[2645455411436465820]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 2645455411436465820
+ },
+ "Component_[5422214869037468733]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 5422214869037468733
+ },
+ "Component_[7238126895911071330]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 7238126895911071330,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 8407607000804893064
+ },
+ {
+ "ComponentId": 12952323341649885242,
+ "SortIndex": 1
+ }
+ ]
+ },
+ "Component_[7981670269715131988]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 7981670269715131988
+ },
+ "Component_[8407607000804893064]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 8407607000804893064,
+ "Parent Entity": "Entity_[274004659287]"
+ },
+ "Component_[8567641786004090803]": {
+ "$type": "EditorLockComponent",
+ "Id": 8567641786004090803
+ }
+ }
+ },
+ "Entity_[286889561175]": {
+ "Id": "Entity_[286889561175]",
+ "Name": "RelativeProductMatch",
+ "Components": {
+ "Component_[10180645282669228972]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 10180645282669228972,
+ "Parent Entity": "Entity_[274004659287]"
+ },
+ "Component_[10200807690182688147]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 10200807690182688147
+ },
+ "Component_[11014661873645081316]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 11014661873645081316,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 10180645282669228972
+ },
+ {
+ "ComponentId": 12869852248016369650,
+ "SortIndex": 1
+ }
+ ]
+ },
+ "Component_[12869852248016369650]": {
+ "$type": "{77CDE991-EC1A-B7C1-B112-7456ABAC81A1} EditorSpawnerComponent",
+ "Id": 12869852248016369650,
+ "Slice": {
+ "assetId": {
+ "guid": "{29F14025-3BD2-5CA9-A9DE-B8B349268C2F}",
+ "subId": 2
+ },
+ "assetHint": "slices/bullet.dynamicslice"
+ }
+ },
+ "Component_[15136448544716183259]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 15136448544716183259
+ },
+ "Component_[15966001894874626764]": {
+ "$type": "SelectionComponent",
+ "Id": 15966001894874626764
+ },
+ "Component_[16167982631516160155]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 16167982631516160155
+ },
+ "Component_[16672905198052847867]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 16672905198052847867
+ },
+ "Component_[4506946122562404190]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 4506946122562404190
+ },
+ "Component_[6836304267269231429]": {
+ "$type": "EditorLockComponent",
+ "Id": 6836304267269231429
+ },
+ "Component_[8756593519140349183]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 8756593519140349183
+ }
+ }
+ },
+ "Entity_[291184528471]": {
+ "Id": "Entity_[291184528471]",
+ "Name": "RelativeSourceMatch",
+ "Components": {
+ "Component_[11694027325905361034]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 11694027325905361034
+ },
+ "Component_[13891029613307790064]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 13891029613307790064
+ },
+ "Component_[15933511034411930900]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 15933511034411930900,
+ "Parent Entity": "Entity_[274004659287]"
+ },
+ "Component_[17540827492846961803]": {
+ "$type": "EditorLockComponent",
+ "Id": 17540827492846961803
+ },
+ "Component_[2850297705939373458]": {
+ "$type": "SelectionComponent",
+ "Id": 2850297705939373458
+ },
+ "Component_[4809103331004345812]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 4809103331004345812
+ },
+ "Component_[5654779331777839943]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 5654779331777839943,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 15933511034411930900
+ },
+ {
+ "ComponentId": 10284025539900054207,
+ "SortIndex": 1
+ }
+ ]
+ },
+ "Component_[6097019179005900386]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 6097019179005900386
+ },
+ "Component_[7748387730313625157]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 7748387730313625157
+ },
+ "Component_[9822265453841229082]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 9822265453841229082
+ }
+ }
+ },
+ "Entity_[297232250983]": {
+ "Id": "Entity_[297232250983]",
+ "Name": "1151F14D38A65579888ABE3139882E68:[0]",
+ "Components": {
+ "Component_[11936148741777754959]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 11936148741777754959
+ },
+ "Component_[12610073699988743015]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 12610073699988743015,
+ "Parent Entity": "Entity_[305822185575]"
+ },
+ "Component_[1603205169722765279]": {
+ "$type": "EditorLockComponent",
+ "Id": 1603205169722765279
+ },
+ "Component_[17691206348057560715]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 17691206348057560715
+ },
+ "Component_[2711821203680330048]": {
+ "$type": "SelectionComponent",
+ "Id": 2711821203680330048
+ },
+ "Component_[3887480309311474860]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 3887480309311474860
+ },
+ "Component_[5853968883842282450]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 5853968883842282450
+ },
+ "Component_[7679080692843343453]": {
+ "$type": "EditorCommentComponent",
+ "Id": 7679080692843343453,
+ "Configuration": "Asset ID that matches an existing dependency of this asset (am_grass1.mtl)"
+ },
+ "Component_[8024752235278898687]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 8024752235278898687
+ },
+ "Component_[8373296084678231042]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 8373296084678231042
+ },
+ "Component_[9782967158965587831]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 9782967158965587831,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 12610073699988743015
+ },
+ {
+ "ComponentId": 7679080692843343453,
+ "SortIndex": 1
+ }
+ ]
+ }
+ }
+ },
+ "Entity_[301527218279]": {
+ "Id": "Entity_[301527218279]",
+ "Name": "Slices/bullet.dynamicslice",
+ "Components": {
+ "Component_[15613078542630153866]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 15613078542630153866,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 2483032678718995164
+ },
+ {
+ "ComponentId": 9734604379060902193,
+ "SortIndex": 1
+ }
+ ]
+ },
+ "Component_[16098942854900817264]": {
+ "$type": "SelectionComponent",
+ "Id": 16098942854900817264
+ },
+ "Component_[16720139961856477500]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 16720139961856477500
+ },
+ "Component_[2483032678718995164]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 2483032678718995164,
+ "Parent Entity": "Entity_[305822185575]"
+ },
+ "Component_[2502984783426127018]": {
+ "$type": "EditorLockComponent",
+ "Id": 2502984783426127018
+ },
+ "Component_[46714013890147210]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 46714013890147210
+ },
+ "Component_[4907474530744780429]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 4907474530744780429
+ },
+ "Component_[5420332829198300813]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 5420332829198300813
+ },
+ "Component_[7683578164681693579]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 7683578164681693579
+ },
+ "Component_[8312115250363172310]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 8312115250363172310
+ },
+ "Component_[9734604379060902193]": {
+ "$type": "EditorCommentComponent",
+ "Id": 9734604379060902193,
+ "Configuration": "Relative product path that matches an existing dependency of this asset"
+ }
+ }
+ },
+ "Entity_[305822185575]": {
+ "Id": "Entity_[305822185575]",
+ "Name": "AssetReferences",
+ "Components": {
+ "Component_[13422135993444528172]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 13422135993444528172
+ },
+ "Component_[13988015667379021413]": {
+ "$type": "EditorLockComponent",
+ "Id": 13988015667379021413
+ },
+ "Component_[14885956487876614434]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 14885956487876614434
+ },
+ "Component_[15550715415947731915]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 15550715415947731915
+ },
+ "Component_[2576266145980379805]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 2576266145980379805,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 3176911836967955668
+ },
+ {
+ "ComponentId": 836721549453007197,
+ "SortIndex": 1
+ }
+ ]
+ },
+ "Component_[3176911836967955668]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 3176911836967955668,
+ "Parent Entity": "Entity_[274004659287]"
+ },
+ "Component_[5613459137294642234]": {
+ "$type": "SelectionComponent",
+ "Id": 5613459137294642234
+ },
+ "Component_[6400873582148097152]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 6400873582148097152
+ },
+ "Component_[684670817803453913]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 684670817803453913,
+ "Child Entity Order": [
+ "Entity_[323002054759]",
+ "Entity_[327297022055]",
+ "Entity_[301527218279]",
+ "Entity_[318707087463]",
+ "Entity_[297232250983]",
+ "Entity_[314412120167]",
+ "Entity_[331591989351]",
+ "Entity_[310117152871]"
+ ]
+ },
+ "Component_[8118206464926826097]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 8118206464926826097
+ },
+ "Component_[836721549453007197]": {
+ "$type": "EditorCommentComponent",
+ "Id": 836721549453007197,
+ "Configuration": "Entity names are used to trigger the missing dependency scanner. Comments are stripped from dynamic slices."
+ }
+ }
+ },
+ "Entity_[310117152871]": {
+ "Id": "Entity_[310117152871]",
+ "Name": "Materials/FakeMaterial.mtl",
+ "Components": {
+ "Component_[10593857511582714674]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 10593857511582714674,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 11797216659359478300
+ },
+ {
+ "ComponentId": 13816702107134233983,
+ "SortIndex": 1
+ }
+ ]
+ },
+ "Component_[11797216659359478300]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 11797216659359478300,
+ "Parent Entity": "Entity_[305822185575]"
+ },
+ "Component_[13816702107134233983]": {
+ "$type": "EditorCommentComponent",
+ "Id": 13816702107134233983,
+ "Configuration": "Invalid path that does not match an existing dependency of this asset"
+ },
+ "Component_[14868583012186337705]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 14868583012186337705
+ },
+ "Component_[14965348027145283648]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 14965348027145283648
+ },
+ "Component_[15075774238648121688]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 15075774238648121688
+ },
+ "Component_[16157883709857447266]": {
+ "$type": "EditorLockComponent",
+ "Id": 16157883709857447266
+ },
+ "Component_[17712080510249108208]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 17712080510249108208
+ },
+ "Component_[2247408514677946398]": {
+ "$type": "SelectionComponent",
+ "Id": 2247408514677946398
+ },
+ "Component_[5565369976544134481]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 5565369976544134481
+ },
+ "Component_[6044814215558788086]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 6044814215558788086
+ }
+ }
+ },
+ "Entity_[314412120167]": {
+ "Id": "Entity_[314412120167]",
+ "Name": "88888888-4444-4444-4444-CCCCCCCCCCCC",
+ "Components": {
+ "Component_[10072177500579430176]": {
+ "$type": "EditorLockComponent",
+ "Id": 10072177500579430176
+ },
+ "Component_[10853215476279564671]": {
+ "$type": "EditorCommentComponent",
+ "Id": 10853215476279564671,
+ "Configuration": "UUID that does not exist"
+ },
+ "Component_[13413154971272749631]": {
+ "$type": "SelectionComponent",
+ "Id": 13413154971272749631
+ },
+ "Component_[15316173756367163440]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 15316173756367163440,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 3266728630359207653
+ },
+ {
+ "ComponentId": 10853215476279564671,
+ "SortIndex": 1
+ }
+ ]
+ },
+ "Component_[15809307959802829291]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 15809307959802829291
+ },
+ "Component_[17649652752752487081]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 17649652752752487081
+ },
+ "Component_[2130036493438440377]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 2130036493438440377
+ },
+ "Component_[3266728630359207653]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 3266728630359207653,
+ "Parent Entity": "Entity_[305822185575]"
+ },
+ "Component_[5892125564582966187]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 5892125564582966187
+ },
+ "Component_[597602776660257245]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 597602776660257245
+ },
+ "Component_[8238652007701465495]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 8238652007701465495
+ }
+ }
+ },
+ "Entity_[318707087463]": {
+ "Id": "Entity_[318707087463]",
+ "Name": "BBA1A5494C73578894BF0692CDA5FC33",
+ "Components": {
+ "Component_[10222455787643359341]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 10222455787643359341
+ },
+ "Component_[11487845392038268864]": {
+ "$type": "SelectionComponent",
+ "Id": 11487845392038268864
+ },
+ "Component_[12135534290310046764]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 12135534290310046764
+ },
+ "Component_[14412623226519978498]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 14412623226519978498
+ },
+ "Component_[14516371382857751872]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 14516371382857751872
+ },
+ "Component_[16011611743122468576]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 16011611743122468576,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 4157328932578509254
+ },
+ {
+ "ComponentId": 8524796860605854850,
+ "SortIndex": 1
+ }
+ ]
+ },
+ "Component_[3813931698067937301]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 3813931698067937301
+ },
+ "Component_[4157328932578509254]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 4157328932578509254,
+ "Parent Entity": "Entity_[305822185575]"
+ },
+ "Component_[8524796860605854850]": {
+ "$type": "EditorCommentComponent",
+ "Id": 8524796860605854850,
+ "Configuration": "UUID that matches an existing dependency of this asset (lumbertank_body.cgf)"
+ },
+ "Component_[8660819596448699427]": {
+ "$type": "EditorLockComponent",
+ "Id": 8660819596448699427
+ },
+ "Component_[8768262795169819026]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 8768262795169819026
+ }
+ }
+ },
+ "Entity_[323002054759]": {
+ "Id": "Entity_[323002054759]",
+ "Name": "Materials/am_rockground.mtl",
+ "Components": {
+ "Component_[13459503224133892836]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 13459503224133892836
+ },
+ "Component_[1346698328271204385]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 1346698328271204385
+ },
+ "Component_[13662830241397426219]": {
+ "$type": "SelectionComponent",
+ "Id": 13662830241397426219
+ },
+ "Component_[14169735046939083706]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14169735046939083706,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 833157791612452820
+ },
+ {
+ "ComponentId": 3573928838741352115,
+ "SortIndex": 1
+ }
+ ]
+ },
+ "Component_[16049700338512950477]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 16049700338512950477
+ },
+ "Component_[16191253524853449302]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 16191253524853449302
+ },
+ "Component_[1737139665005484521]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 1737139665005484521
+ },
+ "Component_[17562284119637289685]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 17562284119637289685
+ },
+ "Component_[3573928838741352115]": {
+ "$type": "EditorCommentComponent",
+ "Id": 3573928838741352115,
+ "Configuration": "Relative source path that matches an existing dependency of this asset"
+ },
+ "Component_[485401015869338526]": {
+ "$type": "EditorLockComponent",
+ "Id": 485401015869338526
+ },
+ "Component_[833157791612452820]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 833157791612452820,
+ "Parent Entity": "Entity_[305822185575]"
+ }
+ }
+ },
+ "Entity_[327297022055]": {
+ "Id": "Entity_[327297022055]",
+ "Name": "Config/Game.xml",
+ "Components": {
+ "Component_[11848260632907964142]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 11848260632907964142,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 497869813123895830
+ },
+ {
+ "ComponentId": 5248857300320701553,
+ "SortIndex": 1
+ }
+ ]
+ },
+ "Component_[12842864953492512672]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 12842864953492512672
+ },
+ "Component_[16656501539883791157]": {
+ "$type": "EditorLockComponent",
+ "Id": 16656501539883791157
+ },
+ "Component_[17365661125603122123]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 17365661125603122123
+ },
+ "Component_[2967487135389707052]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 2967487135389707052
+ },
+ "Component_[3356294263684362888]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3356294263684362888
+ },
+ "Component_[497869813123895830]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 497869813123895830,
+ "Parent Entity": "Entity_[305822185575]"
+ },
+ "Component_[5248857300320701553]": {
+ "$type": "EditorCommentComponent",
+ "Id": 5248857300320701553,
+ "Configuration": "Valid path that does not match an existing dependency of this asset. Should report as a missing dependency"
+ },
+ "Component_[746309483212393367]": {
+ "$type": "SelectionComponent",
+ "Id": 746309483212393367
+ },
+ "Component_[8319831469290771470]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 8319831469290771470
+ },
+ "Component_[9369067377618608622]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9369067377618608622
+ }
+ }
+ },
+ "Entity_[331591989351]": {
+ "Id": "Entity_[331591989351]",
+ "Name": "1151F14D38A65579888ABE3139882E68:[333]",
+ "Components": {
+ "Component_[104857639379046106]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 104857639379046106,
+ "Parent Entity": "Entity_[305822185575]"
+ },
+ "Component_[1061601983221247493]": {
+ "$type": "EditorLockComponent",
+ "Id": 1061601983221247493
+ },
+ "Component_[11028443253330664986]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 11028443253330664986
+ },
+ "Component_[13806275118632081006]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 13806275118632081006
+ },
+ "Component_[13922573109551604801]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 13922573109551604801
+ },
+ "Component_[17027032709917108335]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 17027032709917108335
+ },
+ "Component_[17030988165269698825]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 17030988165269698825
+ },
+ "Component_[2294579021665535860]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 2294579021665535860
+ },
+ "Component_[5863078697041048226]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 5863078697041048226,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 104857639379046106
+ },
+ {
+ "ComponentId": 9466290982672370664,
+ "SortIndex": 1
+ }
+ ]
+ },
+ "Component_[7608263859116142496]": {
+ "$type": "SelectionComponent",
+ "Id": 7608263859116142496
+ },
+ "Component_[9466290982672370664]": {
+ "$type": "EditorCommentComponent",
+ "Id": 9466290982672370664,
+ "Configuration": "Asset ID that does not exist (am_grass1.mtl UUID, no matching product ID)"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt
index 3fc4f3db0e..5d0808adb6 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt
@@ -31,22 +31,6 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
Smoke
)
- ly_add_pytest(
- NAME AutomatedTesting::LoadLevelGPU
- TEST_SUITE smoke
- TEST_SERIAL
- TEST_REQUIRES gpu
- PATH ${CMAKE_CURRENT_LIST_DIR}/test_RemoteConsole_GPULoadLevel_Works.py
- TIMEOUT 100
- RUNTIME_DEPENDENCIES
- AZ::AssetProcessor
- AZ::PythonBindingsExample
- AutomatedTesting.GameLauncher
- AutomatedTesting.Assets
- COMPONENT
- Smoke
- )
-
ly_add_pytest(
NAME AutomatedTesting::EditorTestWithGPU
TEST_REQUIRES gpu
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_RemoteConsole_GPULoadLevel_Works.py b/AutomatedTesting/Gem/PythonTests/smoke/test_RemoteConsole_GPULoadLevel_Works.py
deleted file mode 100644
index 7debcab938..0000000000
--- a/AutomatedTesting/Gem/PythonTests/smoke/test_RemoteConsole_GPULoadLevel_Works.py
+++ /dev/null
@@ -1,43 +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
-
-
-UI Apps: AutomatedTesting.GameLauncher
-Launch AutomatedTesting.GameLauncher with Simple level
-Test should run in both gpu and non gpu
-"""
-
-import pytest
-import psutil
-
-import ly_test_tools.environment.waiter as waiter
-import editor_python_test_tools.hydra_test_utils as editor_test_utils
-from ly_remote_console.remote_console_commands import RemoteConsole as RemoteConsole
-from ly_remote_console.remote_console_commands import (
- send_command_and_expect_response as send_command_and_expect_response,
-)
-
-
-@pytest.mark.parametrize("launcher_platform", ["windows"])
-@pytest.mark.parametrize("project", ["AutomatedTesting"])
-@pytest.mark.parametrize("level", ["Simple"])
-class TestRemoteConsoleLoadLevelWorks(object):
- @pytest.fixture
- def remote_console_instance(self, request):
- console = RemoteConsole()
-
- def teardown():
- if console.connected:
- console.stop()
-
- request.addfinalizer(teardown)
-
- return console
-
- def test_RemoteConsole_LoadLevel_Works(self, launcher, level, remote_console_instance, launcher_platform):
- expected_lines = ['Level system is loading "Simple"']
-
- editor_test_utils.launch_and_validate_results_launcher(launcher, level, remote_console_instance, expected_lines, null_renderer=False)
diff --git a/AutomatedTesting/Levels/AWS/ClientAuth/ClientAuth.ly b/AutomatedTesting/Levels/AWS/ClientAuth/ClientAuth.ly
deleted file mode 100644
index b4a2d6cb3a..0000000000
--- a/AutomatedTesting/Levels/AWS/ClientAuth/ClientAuth.ly
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:19f2c4454bb395cdc0a36d1e45e6a384bbd23037af1a2fb93e088ecfa0f10e5b
-size 9343
diff --git a/AutomatedTesting/Levels/AWS/ClientAuth/ClientAuth.prefab b/AutomatedTesting/Levels/AWS/ClientAuth/ClientAuth.prefab
new file mode 100644
index 0000000000..8f2fb61c71
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/ClientAuth/ClientAuth.prefab
@@ -0,0 +1,620 @@
+{
+ "ContainerEntity": {
+ "Id": "Entity_[1146574390643]",
+ "Name": "Level",
+ "Components": {
+ "Component_[10641544592923449938]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 10641544592923449938
+ },
+ "Component_[12039882709170782873]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 12039882709170782873
+ },
+ "Component_[12265484671603697631]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 12265484671603697631
+ },
+ "Component_[14126657869720434043]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 14126657869720434043,
+ "Child Entity Order": [
+ "Entity_[1176639161715]",
+ "Entity_[2670735447885]",
+ "Entity_[2670735447885]"
+ ]
+ },
+ "Component_[15230859088967841193]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 15230859088967841193,
+ "Parent Entity": ""
+ },
+ "Component_[16239496886950819870]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 16239496886950819870
+ },
+ "Component_[5688118765544765547]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 5688118765544765547
+ },
+ "Component_[6545738857812235305]": {
+ "$type": "SelectionComponent",
+ "Id": 6545738857812235305
+ },
+ "Component_[7247035804068349658]": {
+ "$type": "EditorPrefabComponent",
+ "Id": 7247035804068349658
+ },
+ "Component_[9307224322037797205]": {
+ "$type": "EditorLockComponent",
+ "Id": 9307224322037797205
+ },
+ "Component_[9562516168917670048]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9562516168917670048
+ }
+ }
+ },
+ "Entities": {
+ "Entity_[1155164325235]": {
+ "Id": "Entity_[1155164325235]",
+ "Name": "Sun",
+ "Components": {
+ "Component_[10440557478882592717]": {
+ "$type": "SelectionComponent",
+ "Id": 10440557478882592717
+ },
+ "Component_[13620450453324765907]": {
+ "$type": "EditorLockComponent",
+ "Id": 13620450453324765907
+ },
+ "Component_[2134313378593666258]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 2134313378593666258
+ },
+ "Component_[234010807770404186]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 234010807770404186
+ },
+ "Component_[2970359110423865725]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 2970359110423865725
+ },
+ "Component_[3722854130373041803]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3722854130373041803
+ },
+ "Component_[5992533738676323195]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5992533738676323195
+ },
+ "Component_[7378860763541895402]": {
+ "$type": "AZ::Render::EditorDirectionalLightComponent",
+ "Id": 7378860763541895402,
+ "Controller": {
+ "Configuration": {
+ "Intensity": 1.0,
+ "CameraEntityId": "",
+ "ShadowFilterMethod": 1
+ }
+ }
+ },
+ "Component_[7892834440890947578]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 7892834440890947578,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 0.0,
+ 13.487043380737305
+ ],
+ "Rotate": [
+ -76.13099670410156,
+ -0.847000002861023,
+ -15.8100004196167
+ ]
+ }
+ },
+ "Component_[8599729549570828259]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 8599729549570828259
+ },
+ "Component_[952797371922080273]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 952797371922080273
+ }
+ }
+ },
+ "Entity_[1159459292531]": {
+ "Id": "Entity_[1159459292531]",
+ "Name": "Ground",
+ "Components": {
+ "Component_[11701138785793981042]": {
+ "$type": "SelectionComponent",
+ "Id": 11701138785793981042
+ },
+ "Component_[12260880513256986252]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 12260880513256986252
+ },
+ "Component_[13711420870643673468]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 13711420870643673468
+ },
+ "Component_[138002849734991713]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 138002849734991713
+ },
+ "Component_[16578565737331764849]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 16578565737331764849,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[16919232076966545697]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 16919232076966545697
+ },
+ "Component_[5182430712893438093]": {
+ "$type": "EditorMaterialComponent",
+ "Id": 5182430712893438093
+ },
+ "Component_[5675108321710651991]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 5675108321710651991,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{0CD745C0-6AA8-569A-A68A-73A3270986C4}",
+ "subId": 277889906
+ },
+ "assetHint": "objects/groudplane/groundplane_512x512m.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[5681893399601237518]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5681893399601237518
+ },
+ "Component_[592692962543397545]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 592692962543397545
+ },
+ "Component_[7090012899106946164]": {
+ "$type": "EditorLockComponent",
+ "Id": 7090012899106946164
+ },
+ "Component_[9410832619875640998]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9410832619875640998
+ }
+ }
+ },
+ "Entity_[1163754259827]": {
+ "Id": "Entity_[1163754259827]",
+ "Name": "Camera",
+ "Components": {
+ "Component_[11895140916889160460]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11895140916889160460
+ },
+ "Component_[16880285896855930892]": {
+ "$type": "{CA11DA46-29FF-4083-B5F6-E02C3A8C3A3D} EditorCameraComponent",
+ "Id": 16880285896855930892,
+ "Controller": {
+ "Configuration": {
+ "Field of View": 55.0,
+ "EditorEntityId": 6861302815203973165
+ }
+ }
+ },
+ "Component_[17187464423780271193]": {
+ "$type": "EditorLockComponent",
+ "Id": 17187464423780271193
+ },
+ "Component_[17495696818315413311]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 17495696818315413311
+ },
+ "Component_[18086214374043522055]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 18086214374043522055,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Translate": [
+ -2.3000001907348633,
+ -3.9368600845336914,
+ 1.0
+ ],
+ "Rotate": [
+ -2.050307512283325,
+ 1.9552897214889526,
+ -43.623355865478516
+ ]
+ }
+ },
+ "Component_[18387556550380114975]": {
+ "$type": "SelectionComponent",
+ "Id": 18387556550380114975
+ },
+ "Component_[2654521436129313160]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 2654521436129313160
+ },
+ "Component_[5265045084611556958]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5265045084611556958
+ },
+ "Component_[7169798125182238623]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7169798125182238623
+ },
+ "Component_[7255796294953281766]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 7255796294953281766,
+ "m_template": {
+ "$type": "FlyCameraInputComponent"
+ }
+ },
+ "Component_[8866210352157164042]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 8866210352157164042
+ },
+ "Component_[9129253381063760879]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 9129253381063760879
+ }
+ }
+ },
+ "Entity_[1168049227123]": {
+ "Id": "Entity_[1168049227123]",
+ "Name": "Grid",
+ "Components": {
+ "Component_[11443347433215807130]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11443347433215807130
+ },
+ "Component_[11779275529534764488]": {
+ "$type": "SelectionComponent",
+ "Id": 11779275529534764488
+ },
+ "Component_[14249419413039427459]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14249419413039427459
+ },
+ "Component_[15448581635946161318]": {
+ "$type": "AZ::Render::EditorGridComponent",
+ "Id": 15448581635946161318,
+ "Controller": {
+ "Configuration": {
+ "primarySpacing": 4.0,
+ "primaryColor": [
+ 0.501960813999176,
+ 0.501960813999176,
+ 0.501960813999176
+ ],
+ "secondarySpacing": 0.5,
+ "secondaryColor": [
+ 0.250980406999588,
+ 0.250980406999588,
+ 0.250980406999588
+ ]
+ }
+ }
+ },
+ "Component_[1843303322527297409]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 1843303322527297409
+ },
+ "Component_[380249072065273654]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 380249072065273654,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[7476660583684339787]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7476660583684339787
+ },
+ "Component_[7557626501215118375]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 7557626501215118375
+ },
+ "Component_[7984048488947365511]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 7984048488947365511
+ },
+ "Component_[8118181039276487398]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 8118181039276487398
+ },
+ "Component_[9189909764215270515]": {
+ "$type": "EditorLockComponent",
+ "Id": 9189909764215270515
+ }
+ }
+ },
+ "Entity_[1172344194419]": {
+ "Id": "Entity_[1172344194419]",
+ "Name": "Shader Ball",
+ "Components": {
+ "Component_[10789351944715265527]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 10789351944715265527
+ },
+ "Component_[12037033284781049225]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 12037033284781049225
+ },
+ "Component_[13759153306105970079]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 13759153306105970079
+ },
+ "Component_[14135560884830586279]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14135560884830586279
+ },
+ "Component_[16247165675903986673]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 16247165675903986673
+ },
+ "Component_[18082433625958885247]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 18082433625958885247
+ },
+ "Component_[6472623349872972660]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6472623349872972660,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Rotate": [
+ 0.0,
+ 0.10000000149011612,
+ 180.0
+ ]
+ }
+ },
+ "Component_[6495255223970673916]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 6495255223970673916,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{FD340C30-755C-5911-92A3-19A3F7A77931}",
+ "subId": 281415304
+ },
+ "assetHint": "objects/shaderball/shaderball_default_1m.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[8056625192494070973]": {
+ "$type": "SelectionComponent",
+ "Id": 8056625192494070973
+ },
+ "Component_[8550141614185782969]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 8550141614185782969
+ },
+ "Component_[9439770997198325425]": {
+ "$type": "EditorLockComponent",
+ "Id": 9439770997198325425
+ }
+ }
+ },
+ "Entity_[1176639161715]": {
+ "Id": "Entity_[1176639161715]",
+ "Name": "Atom Default Environment",
+ "Components": {
+ "Component_[10757302973393310045]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 10757302973393310045,
+ "Parent Entity": "Entity_[1146574390643]"
+ },
+ "Component_[14505817420424255464]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14505817420424255464,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 10757302973393310045
+ }
+ ]
+ },
+ "Component_[14988041764659020032]": {
+ "$type": "EditorLockComponent",
+ "Id": 14988041764659020032
+ },
+ "Component_[15808690248755038124]": {
+ "$type": "SelectionComponent",
+ "Id": 15808690248755038124
+ },
+ "Component_[15900837685796817138]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 15900837685796817138
+ },
+ "Component_[3298767348226484884]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3298767348226484884
+ },
+ "Component_[4076975109609220594]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 4076975109609220594
+ },
+ "Component_[5679760548946028854]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5679760548946028854
+ },
+ "Component_[5855590796136709437]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5855590796136709437,
+ "Child Entity Order": [
+ "Entity_[1155164325235]",
+ "Entity_[1180934129011]",
+ "Entity_[1172344194419]",
+ "Entity_[1168049227123]",
+ "Entity_[1163754259827]",
+ "Entity_[1159459292531]"
+ ]
+ },
+ "Component_[9277695270015777859]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 9277695270015777859
+ }
+ }
+ },
+ "Entity_[1180934129011]": {
+ "Id": "Entity_[1180934129011]",
+ "Name": "Global Sky",
+ "Components": {
+ "Component_[11231930600558681245]": {
+ "$type": "AZ::Render::EditorHDRiSkyboxComponent",
+ "Id": 11231930600558681245,
+ "Controller": {
+ "Configuration": {
+ "CubemapAsset": {
+ "assetId": {
+ "guid": "{215E47FD-D181-5832-B1AB-91673ABF6399}",
+ "subId": 1000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_skyboxcm.exr.streamingimage"
+ }
+ }
+ }
+ },
+ "Component_[11980494120202836095]": {
+ "$type": "SelectionComponent",
+ "Id": 11980494120202836095
+ },
+ "Component_[1428633914413949476]": {
+ "$type": "EditorLockComponent",
+ "Id": 1428633914413949476
+ },
+ "Component_[14936200426671614999]": {
+ "$type": "AZ::Render::EditorImageBasedLightComponent",
+ "Id": 14936200426671614999,
+ "Controller": {
+ "Configuration": {
+ "diffuseImageAsset": {
+ "assetId": {
+ "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+ "subId": 3000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_ibldiffuse.exr.streamingimage"
+ },
+ "specularImageAsset": {
+ "assetId": {
+ "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+ "subId": 2000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_iblspecular.exr.streamingimage"
+ }
+ }
+ }
+ },
+ "Component_[14994774102579326069]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 14994774102579326069
+ },
+ "Component_[15417479889044493340]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 15417479889044493340
+ },
+ "Component_[15826613364991382688]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 15826613364991382688
+ },
+ "Component_[1665003113283562343]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 1665003113283562343
+ },
+ "Component_[3704934735944502280]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 3704934735944502280
+ },
+ "Component_[5698542331457326479]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 5698542331457326479
+ },
+ "Component_[6644513399057217122]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6644513399057217122,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[931091830724002070]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 931091830724002070
+ }
+ }
+ },
+ "Entity_[2670735447885]": {
+ "Id": "Entity_[2670735447885]",
+ "Name": "AnonymousAuthorization",
+ "Components": {
+ "Component_[11400228652398928245]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 11400228652398928245
+ },
+ "Component_[15542812360906781451]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 15542812360906781451,
+ "Parent Entity": "Entity_[1146574390643]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 0.10000038146972656,
+ 4.005923748016357
+ ]
+ }
+ },
+ "Component_[16858205397479531670]": {
+ "$type": "EditorLockComponent",
+ "Id": 16858205397479531670
+ },
+ "Component_[1921474395300693283]": {
+ "$type": "EditorScriptCanvasComponent",
+ "Id": 1921474395300693283,
+ "m_name": "ConitoAnonymousAuthorization.scriptcanvas",
+ "runtimeDataIsValid": true,
+ "runtimeDataOverrides": {
+ "source": {
+ "id": "{C0B0CEBA-064E-580F-AD81-CFE8CE0D61B1}"
+ }
+ },
+ "sourceHandle": {
+ "id": "{C0B0CEBA-064E-580F-AD81-CFE8CE0D61B1}"
+ }
+ },
+ "Component_[2312432053711106201]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 2312432053711106201
+ },
+ "Component_[4066858233846929269]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 4066858233846929269
+ },
+ "Component_[6542133807409587028]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 6542133807409587028
+ },
+ "Component_[7002965736546436267]": {
+ "$type": "SelectionComponent",
+ "Id": 7002965736546436267
+ },
+ "Component_[7455250879152263787]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 7455250879152263787
+ },
+ "Component_[8081535907930415421]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 8081535907930415421
+ },
+ "Component_[9630473919092479415]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 9630473919092479415
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Levels/AWS/ClientAuth/filelist.xml b/AutomatedTesting/Levels/AWS/ClientAuth/filelist.xml
deleted file mode 100644
index 6b5b5a8727..0000000000
--- a/AutomatedTesting/Levels/AWS/ClientAuth/filelist.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/AutomatedTesting/Levels/AWS/ClientAuth/level.pak b/AutomatedTesting/Levels/AWS/ClientAuth/level.pak
deleted file mode 100644
index bd791070e9..0000000000
--- a/AutomatedTesting/Levels/AWS/ClientAuth/level.pak
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8a674e05824e5ceec13a0487b318923568710bc8269e5be84adad59c495a7ceb
-size 3610
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/ClientAuthPasswordSignIn.ly b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/ClientAuthPasswordSignIn.ly
deleted file mode 100644
index 40d9ad619c..0000000000
--- a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/ClientAuthPasswordSignIn.ly
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a1c0b621525b8e88c3775ea4c60c2197d1e1b060ace9bad9d6efcb0532817e44
-size 9356
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/ClientAuthPasswordSignIn.prefab b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/ClientAuthPasswordSignIn.prefab
new file mode 100644
index 0000000000..46c01bbb0f
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/ClientAuthPasswordSignIn.prefab
@@ -0,0 +1,620 @@
+{
+ "ContainerEntity": {
+ "Id": "Entity_[1146574390643]",
+ "Name": "Level",
+ "Components": {
+ "Component_[10641544592923449938]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 10641544592923449938
+ },
+ "Component_[12039882709170782873]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 12039882709170782873
+ },
+ "Component_[12265484671603697631]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 12265484671603697631
+ },
+ "Component_[14126657869720434043]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 14126657869720434043,
+ "Child Entity Order": [
+ "Entity_[1176639161715]",
+ "Entity_[3263440934733]",
+ "Entity_[3263440934733]"
+ ]
+ },
+ "Component_[15230859088967841193]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 15230859088967841193,
+ "Parent Entity": ""
+ },
+ "Component_[16239496886950819870]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 16239496886950819870
+ },
+ "Component_[5688118765544765547]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 5688118765544765547
+ },
+ "Component_[6545738857812235305]": {
+ "$type": "SelectionComponent",
+ "Id": 6545738857812235305
+ },
+ "Component_[7247035804068349658]": {
+ "$type": "EditorPrefabComponent",
+ "Id": 7247035804068349658
+ },
+ "Component_[9307224322037797205]": {
+ "$type": "EditorLockComponent",
+ "Id": 9307224322037797205
+ },
+ "Component_[9562516168917670048]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9562516168917670048
+ }
+ }
+ },
+ "Entities": {
+ "Entity_[1155164325235]": {
+ "Id": "Entity_[1155164325235]",
+ "Name": "Sun",
+ "Components": {
+ "Component_[10440557478882592717]": {
+ "$type": "SelectionComponent",
+ "Id": 10440557478882592717
+ },
+ "Component_[13620450453324765907]": {
+ "$type": "EditorLockComponent",
+ "Id": 13620450453324765907
+ },
+ "Component_[2134313378593666258]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 2134313378593666258
+ },
+ "Component_[234010807770404186]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 234010807770404186
+ },
+ "Component_[2970359110423865725]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 2970359110423865725
+ },
+ "Component_[3722854130373041803]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3722854130373041803
+ },
+ "Component_[5992533738676323195]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5992533738676323195
+ },
+ "Component_[7378860763541895402]": {
+ "$type": "AZ::Render::EditorDirectionalLightComponent",
+ "Id": 7378860763541895402,
+ "Controller": {
+ "Configuration": {
+ "Intensity": 1.0,
+ "CameraEntityId": "",
+ "ShadowFilterMethod": 1
+ }
+ }
+ },
+ "Component_[7892834440890947578]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 7892834440890947578,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 0.0,
+ 13.487043380737305
+ ],
+ "Rotate": [
+ -76.13099670410156,
+ -0.847000002861023,
+ -15.8100004196167
+ ]
+ }
+ },
+ "Component_[8599729549570828259]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 8599729549570828259
+ },
+ "Component_[952797371922080273]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 952797371922080273
+ }
+ }
+ },
+ "Entity_[1159459292531]": {
+ "Id": "Entity_[1159459292531]",
+ "Name": "Ground",
+ "Components": {
+ "Component_[11701138785793981042]": {
+ "$type": "SelectionComponent",
+ "Id": 11701138785793981042
+ },
+ "Component_[12260880513256986252]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 12260880513256986252
+ },
+ "Component_[13711420870643673468]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 13711420870643673468
+ },
+ "Component_[138002849734991713]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 138002849734991713
+ },
+ "Component_[16578565737331764849]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 16578565737331764849,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[16919232076966545697]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 16919232076966545697
+ },
+ "Component_[5182430712893438093]": {
+ "$type": "EditorMaterialComponent",
+ "Id": 5182430712893438093
+ },
+ "Component_[5675108321710651991]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 5675108321710651991,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{0CD745C0-6AA8-569A-A68A-73A3270986C4}",
+ "subId": 277889906
+ },
+ "assetHint": "objects/groudplane/groundplane_512x512m.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[5681893399601237518]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5681893399601237518
+ },
+ "Component_[592692962543397545]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 592692962543397545
+ },
+ "Component_[7090012899106946164]": {
+ "$type": "EditorLockComponent",
+ "Id": 7090012899106946164
+ },
+ "Component_[9410832619875640998]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9410832619875640998
+ }
+ }
+ },
+ "Entity_[1163754259827]": {
+ "Id": "Entity_[1163754259827]",
+ "Name": "Camera",
+ "Components": {
+ "Component_[11895140916889160460]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11895140916889160460
+ },
+ "Component_[16880285896855930892]": {
+ "$type": "{CA11DA46-29FF-4083-B5F6-E02C3A8C3A3D} EditorCameraComponent",
+ "Id": 16880285896855930892,
+ "Controller": {
+ "Configuration": {
+ "Field of View": 55.0,
+ "EditorEntityId": 6861302815203973165
+ }
+ }
+ },
+ "Component_[17187464423780271193]": {
+ "$type": "EditorLockComponent",
+ "Id": 17187464423780271193
+ },
+ "Component_[17495696818315413311]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 17495696818315413311
+ },
+ "Component_[18086214374043522055]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 18086214374043522055,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Translate": [
+ -2.3000001907348633,
+ -3.9368600845336914,
+ 1.0
+ ],
+ "Rotate": [
+ -2.050307512283325,
+ 1.9552897214889526,
+ -43.623355865478516
+ ]
+ }
+ },
+ "Component_[18387556550380114975]": {
+ "$type": "SelectionComponent",
+ "Id": 18387556550380114975
+ },
+ "Component_[2654521436129313160]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 2654521436129313160
+ },
+ "Component_[5265045084611556958]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5265045084611556958
+ },
+ "Component_[7169798125182238623]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7169798125182238623
+ },
+ "Component_[7255796294953281766]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 7255796294953281766,
+ "m_template": {
+ "$type": "FlyCameraInputComponent"
+ }
+ },
+ "Component_[8866210352157164042]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 8866210352157164042
+ },
+ "Component_[9129253381063760879]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 9129253381063760879
+ }
+ }
+ },
+ "Entity_[1168049227123]": {
+ "Id": "Entity_[1168049227123]",
+ "Name": "Grid",
+ "Components": {
+ "Component_[11443347433215807130]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11443347433215807130
+ },
+ "Component_[11779275529534764488]": {
+ "$type": "SelectionComponent",
+ "Id": 11779275529534764488
+ },
+ "Component_[14249419413039427459]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14249419413039427459
+ },
+ "Component_[15448581635946161318]": {
+ "$type": "AZ::Render::EditorGridComponent",
+ "Id": 15448581635946161318,
+ "Controller": {
+ "Configuration": {
+ "primarySpacing": 4.0,
+ "primaryColor": [
+ 0.501960813999176,
+ 0.501960813999176,
+ 0.501960813999176
+ ],
+ "secondarySpacing": 0.5,
+ "secondaryColor": [
+ 0.250980406999588,
+ 0.250980406999588,
+ 0.250980406999588
+ ]
+ }
+ }
+ },
+ "Component_[1843303322527297409]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 1843303322527297409
+ },
+ "Component_[380249072065273654]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 380249072065273654,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[7476660583684339787]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7476660583684339787
+ },
+ "Component_[7557626501215118375]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 7557626501215118375
+ },
+ "Component_[7984048488947365511]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 7984048488947365511
+ },
+ "Component_[8118181039276487398]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 8118181039276487398
+ },
+ "Component_[9189909764215270515]": {
+ "$type": "EditorLockComponent",
+ "Id": 9189909764215270515
+ }
+ }
+ },
+ "Entity_[1172344194419]": {
+ "Id": "Entity_[1172344194419]",
+ "Name": "Shader Ball",
+ "Components": {
+ "Component_[10789351944715265527]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 10789351944715265527
+ },
+ "Component_[12037033284781049225]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 12037033284781049225
+ },
+ "Component_[13759153306105970079]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 13759153306105970079
+ },
+ "Component_[14135560884830586279]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14135560884830586279
+ },
+ "Component_[16247165675903986673]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 16247165675903986673
+ },
+ "Component_[18082433625958885247]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 18082433625958885247
+ },
+ "Component_[6472623349872972660]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6472623349872972660,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Rotate": [
+ 0.0,
+ 0.10000000149011612,
+ 180.0
+ ]
+ }
+ },
+ "Component_[6495255223970673916]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 6495255223970673916,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{FD340C30-755C-5911-92A3-19A3F7A77931}",
+ "subId": 281415304
+ },
+ "assetHint": "objects/shaderball/shaderball_default_1m.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[8056625192494070973]": {
+ "$type": "SelectionComponent",
+ "Id": 8056625192494070973
+ },
+ "Component_[8550141614185782969]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 8550141614185782969
+ },
+ "Component_[9439770997198325425]": {
+ "$type": "EditorLockComponent",
+ "Id": 9439770997198325425
+ }
+ }
+ },
+ "Entity_[1176639161715]": {
+ "Id": "Entity_[1176639161715]",
+ "Name": "Atom Default Environment",
+ "Components": {
+ "Component_[10757302973393310045]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 10757302973393310045,
+ "Parent Entity": "Entity_[1146574390643]"
+ },
+ "Component_[14505817420424255464]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14505817420424255464,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 10757302973393310045
+ }
+ ]
+ },
+ "Component_[14988041764659020032]": {
+ "$type": "EditorLockComponent",
+ "Id": 14988041764659020032
+ },
+ "Component_[15808690248755038124]": {
+ "$type": "SelectionComponent",
+ "Id": 15808690248755038124
+ },
+ "Component_[15900837685796817138]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 15900837685796817138
+ },
+ "Component_[3298767348226484884]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3298767348226484884
+ },
+ "Component_[4076975109609220594]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 4076975109609220594
+ },
+ "Component_[5679760548946028854]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5679760548946028854
+ },
+ "Component_[5855590796136709437]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5855590796136709437,
+ "Child Entity Order": [
+ "Entity_[1155164325235]",
+ "Entity_[1180934129011]",
+ "Entity_[1172344194419]",
+ "Entity_[1168049227123]",
+ "Entity_[1163754259827]",
+ "Entity_[1159459292531]"
+ ]
+ },
+ "Component_[9277695270015777859]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 9277695270015777859
+ }
+ }
+ },
+ "Entity_[1180934129011]": {
+ "Id": "Entity_[1180934129011]",
+ "Name": "Global Sky",
+ "Components": {
+ "Component_[11231930600558681245]": {
+ "$type": "AZ::Render::EditorHDRiSkyboxComponent",
+ "Id": 11231930600558681245,
+ "Controller": {
+ "Configuration": {
+ "CubemapAsset": {
+ "assetId": {
+ "guid": "{215E47FD-D181-5832-B1AB-91673ABF6399}",
+ "subId": 1000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_skyboxcm.exr.streamingimage"
+ }
+ }
+ }
+ },
+ "Component_[11980494120202836095]": {
+ "$type": "SelectionComponent",
+ "Id": 11980494120202836095
+ },
+ "Component_[1428633914413949476]": {
+ "$type": "EditorLockComponent",
+ "Id": 1428633914413949476
+ },
+ "Component_[14936200426671614999]": {
+ "$type": "AZ::Render::EditorImageBasedLightComponent",
+ "Id": 14936200426671614999,
+ "Controller": {
+ "Configuration": {
+ "diffuseImageAsset": {
+ "assetId": {
+ "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+ "subId": 3000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_ibldiffuse.exr.streamingimage"
+ },
+ "specularImageAsset": {
+ "assetId": {
+ "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+ "subId": 2000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_iblspecular.exr.streamingimage"
+ }
+ }
+ }
+ },
+ "Component_[14994774102579326069]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 14994774102579326069
+ },
+ "Component_[15417479889044493340]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 15417479889044493340
+ },
+ "Component_[15826613364991382688]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 15826613364991382688
+ },
+ "Component_[1665003113283562343]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 1665003113283562343
+ },
+ "Component_[3704934735944502280]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 3704934735944502280
+ },
+ "Component_[5698542331457326479]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 5698542331457326479
+ },
+ "Component_[6644513399057217122]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6644513399057217122,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[931091830724002070]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 931091830724002070
+ }
+ }
+ },
+ "Entity_[3263440934733]": {
+ "Id": "Entity_[3263440934733]",
+ "Name": "Auth",
+ "Components": {
+ "Component_[10677660472305013611]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 10677660472305013611
+ },
+ "Component_[12020966173483420539]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 12020966173483420539
+ },
+ "Component_[1395011275436594572]": {
+ "$type": "EditorLockComponent",
+ "Id": 1395011275436594572
+ },
+ "Component_[14204408480276164321]": {
+ "$type": "EditorScriptCanvasComponent",
+ "Id": 14204408480276164321,
+ "m_name": "PasswordSignIn.scriptcanvas",
+ "runtimeDataIsValid": true,
+ "runtimeDataOverrides": {
+ "source": {
+ "id": "{DA0FCA2B-66E4-575B-802E-BA93F35690C1}"
+ }
+ },
+ "sourceHandle": {
+ "id": "{DA0FCA2B-66E4-575B-802E-BA93F35690C1}"
+ }
+ },
+ "Component_[15510129631063791276]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 15510129631063791276
+ },
+ "Component_[2829815269827202953]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 2829815269827202953
+ },
+ "Component_[4152540778425032559]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 4152540778425032559,
+ "Parent Entity": "Entity_[1146574390643]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 0.10000038146972656,
+ 4.005923748016357
+ ]
+ }
+ },
+ "Component_[4562090268412258507]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 4562090268412258507
+ },
+ "Component_[4826060551136971267]": {
+ "$type": "SelectionComponent",
+ "Id": 4826060551136971267
+ },
+ "Component_[8974703175361704047]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 8974703175361704047
+ },
+ "Component_[9513341577149946975]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 9513341577149946975
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/filelist.xml b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/filelist.xml
deleted file mode 100644
index ce3f3f3407..0000000000
--- a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/filelist.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/level.pak b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/level.pak
deleted file mode 100644
index 1af55520b6..0000000000
--- a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/level.pak
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f318a1787069385de291660f79e350cea2ca2c3ef3b5e0576686066bd9c49395
-size 3667
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/ClientAuthPasswordSignUp.ly b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/ClientAuthPasswordSignUp.ly
deleted file mode 100644
index b3f66ff34a..0000000000
--- a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/ClientAuthPasswordSignUp.ly
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:afc5d665128738e6bea09e78a16ee38acc923a8ecefff90d987858ce72c395fa
-size 9360
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/ClientAuthPasswordSignUp.prefab b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/ClientAuthPasswordSignUp.prefab
new file mode 100644
index 0000000000..3d85ec02a5
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/ClientAuthPasswordSignUp.prefab
@@ -0,0 +1,620 @@
+{
+ "ContainerEntity": {
+ "Id": "Entity_[1146574390643]",
+ "Name": "Level",
+ "Components": {
+ "Component_[10641544592923449938]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 10641544592923449938
+ },
+ "Component_[12039882709170782873]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 12039882709170782873
+ },
+ "Component_[12265484671603697631]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 12265484671603697631
+ },
+ "Component_[14126657869720434043]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 14126657869720434043,
+ "Child Entity Order": [
+ "Entity_[1176639161715]",
+ "Entity_[3851851454285]",
+ "Entity_[3851851454285]"
+ ]
+ },
+ "Component_[15230859088967841193]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 15230859088967841193,
+ "Parent Entity": ""
+ },
+ "Component_[16239496886950819870]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 16239496886950819870
+ },
+ "Component_[5688118765544765547]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 5688118765544765547
+ },
+ "Component_[6545738857812235305]": {
+ "$type": "SelectionComponent",
+ "Id": 6545738857812235305
+ },
+ "Component_[7247035804068349658]": {
+ "$type": "EditorPrefabComponent",
+ "Id": 7247035804068349658
+ },
+ "Component_[9307224322037797205]": {
+ "$type": "EditorLockComponent",
+ "Id": 9307224322037797205
+ },
+ "Component_[9562516168917670048]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9562516168917670048
+ }
+ }
+ },
+ "Entities": {
+ "Entity_[1155164325235]": {
+ "Id": "Entity_[1155164325235]",
+ "Name": "Sun",
+ "Components": {
+ "Component_[10440557478882592717]": {
+ "$type": "SelectionComponent",
+ "Id": 10440557478882592717
+ },
+ "Component_[13620450453324765907]": {
+ "$type": "EditorLockComponent",
+ "Id": 13620450453324765907
+ },
+ "Component_[2134313378593666258]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 2134313378593666258
+ },
+ "Component_[234010807770404186]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 234010807770404186
+ },
+ "Component_[2970359110423865725]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 2970359110423865725
+ },
+ "Component_[3722854130373041803]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3722854130373041803
+ },
+ "Component_[5992533738676323195]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5992533738676323195
+ },
+ "Component_[7378860763541895402]": {
+ "$type": "AZ::Render::EditorDirectionalLightComponent",
+ "Id": 7378860763541895402,
+ "Controller": {
+ "Configuration": {
+ "Intensity": 1.0,
+ "CameraEntityId": "",
+ "ShadowFilterMethod": 1
+ }
+ }
+ },
+ "Component_[7892834440890947578]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 7892834440890947578,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 0.0,
+ 13.487043380737305
+ ],
+ "Rotate": [
+ -76.13099670410156,
+ -0.847000002861023,
+ -15.8100004196167
+ ]
+ }
+ },
+ "Component_[8599729549570828259]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 8599729549570828259
+ },
+ "Component_[952797371922080273]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 952797371922080273
+ }
+ }
+ },
+ "Entity_[1159459292531]": {
+ "Id": "Entity_[1159459292531]",
+ "Name": "Ground",
+ "Components": {
+ "Component_[11701138785793981042]": {
+ "$type": "SelectionComponent",
+ "Id": 11701138785793981042
+ },
+ "Component_[12260880513256986252]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 12260880513256986252
+ },
+ "Component_[13711420870643673468]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 13711420870643673468
+ },
+ "Component_[138002849734991713]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 138002849734991713
+ },
+ "Component_[16578565737331764849]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 16578565737331764849,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[16919232076966545697]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 16919232076966545697
+ },
+ "Component_[5182430712893438093]": {
+ "$type": "EditorMaterialComponent",
+ "Id": 5182430712893438093
+ },
+ "Component_[5675108321710651991]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 5675108321710651991,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{0CD745C0-6AA8-569A-A68A-73A3270986C4}",
+ "subId": 277889906
+ },
+ "assetHint": "objects/groudplane/groundplane_512x512m.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[5681893399601237518]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5681893399601237518
+ },
+ "Component_[592692962543397545]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 592692962543397545
+ },
+ "Component_[7090012899106946164]": {
+ "$type": "EditorLockComponent",
+ "Id": 7090012899106946164
+ },
+ "Component_[9410832619875640998]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9410832619875640998
+ }
+ }
+ },
+ "Entity_[1163754259827]": {
+ "Id": "Entity_[1163754259827]",
+ "Name": "Camera",
+ "Components": {
+ "Component_[11895140916889160460]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11895140916889160460
+ },
+ "Component_[16880285896855930892]": {
+ "$type": "{CA11DA46-29FF-4083-B5F6-E02C3A8C3A3D} EditorCameraComponent",
+ "Id": 16880285896855930892,
+ "Controller": {
+ "Configuration": {
+ "Field of View": 55.0,
+ "EditorEntityId": 6861302815203973165
+ }
+ }
+ },
+ "Component_[17187464423780271193]": {
+ "$type": "EditorLockComponent",
+ "Id": 17187464423780271193
+ },
+ "Component_[17495696818315413311]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 17495696818315413311
+ },
+ "Component_[18086214374043522055]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 18086214374043522055,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Translate": [
+ -2.3000001907348633,
+ -3.9368600845336914,
+ 1.0
+ ],
+ "Rotate": [
+ -2.050307512283325,
+ 1.9552897214889526,
+ -43.623355865478516
+ ]
+ }
+ },
+ "Component_[18387556550380114975]": {
+ "$type": "SelectionComponent",
+ "Id": 18387556550380114975
+ },
+ "Component_[2654521436129313160]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 2654521436129313160
+ },
+ "Component_[5265045084611556958]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5265045084611556958
+ },
+ "Component_[7169798125182238623]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7169798125182238623
+ },
+ "Component_[7255796294953281766]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 7255796294953281766,
+ "m_template": {
+ "$type": "FlyCameraInputComponent"
+ }
+ },
+ "Component_[8866210352157164042]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 8866210352157164042
+ },
+ "Component_[9129253381063760879]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 9129253381063760879
+ }
+ }
+ },
+ "Entity_[1168049227123]": {
+ "Id": "Entity_[1168049227123]",
+ "Name": "Grid",
+ "Components": {
+ "Component_[11443347433215807130]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11443347433215807130
+ },
+ "Component_[11779275529534764488]": {
+ "$type": "SelectionComponent",
+ "Id": 11779275529534764488
+ },
+ "Component_[14249419413039427459]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14249419413039427459
+ },
+ "Component_[15448581635946161318]": {
+ "$type": "AZ::Render::EditorGridComponent",
+ "Id": 15448581635946161318,
+ "Controller": {
+ "Configuration": {
+ "primarySpacing": 4.0,
+ "primaryColor": [
+ 0.501960813999176,
+ 0.501960813999176,
+ 0.501960813999176
+ ],
+ "secondarySpacing": 0.5,
+ "secondaryColor": [
+ 0.250980406999588,
+ 0.250980406999588,
+ 0.250980406999588
+ ]
+ }
+ }
+ },
+ "Component_[1843303322527297409]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 1843303322527297409
+ },
+ "Component_[380249072065273654]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 380249072065273654,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[7476660583684339787]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7476660583684339787
+ },
+ "Component_[7557626501215118375]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 7557626501215118375
+ },
+ "Component_[7984048488947365511]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 7984048488947365511
+ },
+ "Component_[8118181039276487398]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 8118181039276487398
+ },
+ "Component_[9189909764215270515]": {
+ "$type": "EditorLockComponent",
+ "Id": 9189909764215270515
+ }
+ }
+ },
+ "Entity_[1172344194419]": {
+ "Id": "Entity_[1172344194419]",
+ "Name": "Shader Ball",
+ "Components": {
+ "Component_[10789351944715265527]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 10789351944715265527
+ },
+ "Component_[12037033284781049225]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 12037033284781049225
+ },
+ "Component_[13759153306105970079]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 13759153306105970079
+ },
+ "Component_[14135560884830586279]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14135560884830586279
+ },
+ "Component_[16247165675903986673]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 16247165675903986673
+ },
+ "Component_[18082433625958885247]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 18082433625958885247
+ },
+ "Component_[6472623349872972660]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6472623349872972660,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Rotate": [
+ 0.0,
+ 0.10000000149011612,
+ 180.0
+ ]
+ }
+ },
+ "Component_[6495255223970673916]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 6495255223970673916,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{FD340C30-755C-5911-92A3-19A3F7A77931}",
+ "subId": 281415304
+ },
+ "assetHint": "objects/shaderball/shaderball_default_1m.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[8056625192494070973]": {
+ "$type": "SelectionComponent",
+ "Id": 8056625192494070973
+ },
+ "Component_[8550141614185782969]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 8550141614185782969
+ },
+ "Component_[9439770997198325425]": {
+ "$type": "EditorLockComponent",
+ "Id": 9439770997198325425
+ }
+ }
+ },
+ "Entity_[1176639161715]": {
+ "Id": "Entity_[1176639161715]",
+ "Name": "Atom Default Environment",
+ "Components": {
+ "Component_[10757302973393310045]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 10757302973393310045,
+ "Parent Entity": "Entity_[1146574390643]"
+ },
+ "Component_[14505817420424255464]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14505817420424255464,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 10757302973393310045
+ }
+ ]
+ },
+ "Component_[14988041764659020032]": {
+ "$type": "EditorLockComponent",
+ "Id": 14988041764659020032
+ },
+ "Component_[15808690248755038124]": {
+ "$type": "SelectionComponent",
+ "Id": 15808690248755038124
+ },
+ "Component_[15900837685796817138]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 15900837685796817138
+ },
+ "Component_[3298767348226484884]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3298767348226484884
+ },
+ "Component_[4076975109609220594]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 4076975109609220594
+ },
+ "Component_[5679760548946028854]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5679760548946028854
+ },
+ "Component_[5855590796136709437]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5855590796136709437,
+ "Child Entity Order": [
+ "Entity_[1155164325235]",
+ "Entity_[1180934129011]",
+ "Entity_[1172344194419]",
+ "Entity_[1168049227123]",
+ "Entity_[1163754259827]",
+ "Entity_[1159459292531]"
+ ]
+ },
+ "Component_[9277695270015777859]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 9277695270015777859
+ }
+ }
+ },
+ "Entity_[1180934129011]": {
+ "Id": "Entity_[1180934129011]",
+ "Name": "Global Sky",
+ "Components": {
+ "Component_[11231930600558681245]": {
+ "$type": "AZ::Render::EditorHDRiSkyboxComponent",
+ "Id": 11231930600558681245,
+ "Controller": {
+ "Configuration": {
+ "CubemapAsset": {
+ "assetId": {
+ "guid": "{215E47FD-D181-5832-B1AB-91673ABF6399}",
+ "subId": 1000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_skyboxcm.exr.streamingimage"
+ }
+ }
+ }
+ },
+ "Component_[11980494120202836095]": {
+ "$type": "SelectionComponent",
+ "Id": 11980494120202836095
+ },
+ "Component_[1428633914413949476]": {
+ "$type": "EditorLockComponent",
+ "Id": 1428633914413949476
+ },
+ "Component_[14936200426671614999]": {
+ "$type": "AZ::Render::EditorImageBasedLightComponent",
+ "Id": 14936200426671614999,
+ "Controller": {
+ "Configuration": {
+ "diffuseImageAsset": {
+ "assetId": {
+ "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+ "subId": 3000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_ibldiffuse.exr.streamingimage"
+ },
+ "specularImageAsset": {
+ "assetId": {
+ "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+ "subId": 2000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_iblspecular.exr.streamingimage"
+ }
+ }
+ }
+ },
+ "Component_[14994774102579326069]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 14994774102579326069
+ },
+ "Component_[15417479889044493340]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 15417479889044493340
+ },
+ "Component_[15826613364991382688]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 15826613364991382688
+ },
+ "Component_[1665003113283562343]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 1665003113283562343
+ },
+ "Component_[3704934735944502280]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 3704934735944502280
+ },
+ "Component_[5698542331457326479]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 5698542331457326479
+ },
+ "Component_[6644513399057217122]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6644513399057217122,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[931091830724002070]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 931091830724002070
+ }
+ }
+ },
+ "Entity_[3851851454285]": {
+ "Id": "Entity_[3851851454285]",
+ "Name": "Auth",
+ "Components": {
+ "Component_[10199578265902796701]": {
+ "$type": "EditorScriptCanvasComponent",
+ "Id": 10199578265902796701,
+ "m_name": "PasswordSignUp.scriptcanvas",
+ "runtimeDataIsValid": true,
+ "runtimeDataOverrides": {
+ "source": {
+ "id": "{367CEE66-3A7D-549E-BD69-C63612B3F12D}"
+ }
+ },
+ "sourceHandle": {
+ "id": "{367CEE66-3A7D-549E-BD69-C63612B3F12D}"
+ }
+ },
+ "Component_[10665743855533689275]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 10665743855533689275
+ },
+ "Component_[15982638153420818774]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 15982638153420818774,
+ "Parent Entity": "Entity_[1146574390643]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 0.10000038146972656,
+ 4.005923748016357
+ ]
+ }
+ },
+ "Component_[17743308263820862394]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 17743308263820862394
+ },
+ "Component_[18074634570765223479]": {
+ "$type": "SelectionComponent",
+ "Id": 18074634570765223479
+ },
+ "Component_[3471158028107369345]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 3471158028107369345
+ },
+ "Component_[376079292001997684]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 376079292001997684
+ },
+ "Component_[4387781728620577034]": {
+ "$type": "EditorLockComponent",
+ "Id": 4387781728620577034
+ },
+ "Component_[8591645353763910598]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 8591645353763910598
+ },
+ "Component_[9373910525775599099]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9373910525775599099
+ },
+ "Component_[9394316863271268125]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 9394316863271268125
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/filelist.xml b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/filelist.xml
deleted file mode 100644
index 6565342dd4..0000000000
--- a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/filelist.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/level.pak b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/level.pak
deleted file mode 100644
index 781de219f7..0000000000
--- a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/level.pak
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:87882b64688a77815d93c6973929fa21b89dc6c13d4866c710124ce2cd0f411e
-size 3652
diff --git a/AutomatedTesting/Levels/AWS/Core/Core.ly b/AutomatedTesting/Levels/AWS/Core/Core.ly
deleted file mode 100644
index 8b01ee7abe..0000000000
--- a/AutomatedTesting/Levels/AWS/Core/Core.ly
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5242a9b598bc329ef2af2b114092e4e50c7c398cdde4605a0717b0b3ce66d797
-size 10030
diff --git a/AutomatedTesting/Levels/AWS/Core/Core.prefab b/AutomatedTesting/Levels/AWS/Core/Core.prefab
new file mode 100644
index 0000000000..3d2749849b
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/Core/Core.prefab
@@ -0,0 +1,758 @@
+{
+ "ContainerEntity": {
+ "Id": "Entity_[1146574390643]",
+ "Name": "Level",
+ "Components": {
+ "Component_[10641544592923449938]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 10641544592923449938
+ },
+ "Component_[12039882709170782873]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 12039882709170782873
+ },
+ "Component_[12265484671603697631]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 12265484671603697631
+ },
+ "Component_[14126657869720434043]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 14126657869720434043,
+ "Child Entity Order": [
+ "Entity_[1176639161715]",
+ "Entity_[1386540226381]",
+ "Entity_[1390835193677]",
+ "Entity_[1395130160973]",
+ "Entity_[1395130160973]"
+ ]
+ },
+ "Component_[15230859088967841193]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 15230859088967841193,
+ "Parent Entity": ""
+ },
+ "Component_[16239496886950819870]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 16239496886950819870
+ },
+ "Component_[5688118765544765547]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 5688118765544765547
+ },
+ "Component_[6545738857812235305]": {
+ "$type": "SelectionComponent",
+ "Id": 6545738857812235305
+ },
+ "Component_[7247035804068349658]": {
+ "$type": "EditorPrefabComponent",
+ "Id": 7247035804068349658
+ },
+ "Component_[9307224322037797205]": {
+ "$type": "EditorLockComponent",
+ "Id": 9307224322037797205
+ },
+ "Component_[9562516168917670048]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9562516168917670048
+ }
+ }
+ },
+ "Entities": {
+ "Entity_[1155164325235]": {
+ "Id": "Entity_[1155164325235]",
+ "Name": "Sun",
+ "Components": {
+ "Component_[10440557478882592717]": {
+ "$type": "SelectionComponent",
+ "Id": 10440557478882592717
+ },
+ "Component_[13620450453324765907]": {
+ "$type": "EditorLockComponent",
+ "Id": 13620450453324765907
+ },
+ "Component_[2134313378593666258]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 2134313378593666258
+ },
+ "Component_[234010807770404186]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 234010807770404186
+ },
+ "Component_[2970359110423865725]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 2970359110423865725
+ },
+ "Component_[3722854130373041803]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3722854130373041803
+ },
+ "Component_[5992533738676323195]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5992533738676323195
+ },
+ "Component_[7378860763541895402]": {
+ "$type": "AZ::Render::EditorDirectionalLightComponent",
+ "Id": 7378860763541895402,
+ "Controller": {
+ "Configuration": {
+ "Intensity": 1.0,
+ "CameraEntityId": "",
+ "ShadowFilterMethod": 1
+ }
+ }
+ },
+ "Component_[7892834440890947578]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 7892834440890947578,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 0.0,
+ 13.487043380737305
+ ],
+ "Rotate": [
+ -76.13099670410156,
+ -0.847000002861023,
+ -15.8100004196167
+ ]
+ }
+ },
+ "Component_[8599729549570828259]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 8599729549570828259
+ },
+ "Component_[952797371922080273]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 952797371922080273
+ }
+ }
+ },
+ "Entity_[1159459292531]": {
+ "Id": "Entity_[1159459292531]",
+ "Name": "Ground",
+ "Components": {
+ "Component_[11701138785793981042]": {
+ "$type": "SelectionComponent",
+ "Id": 11701138785793981042
+ },
+ "Component_[12260880513256986252]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 12260880513256986252
+ },
+ "Component_[13711420870643673468]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 13711420870643673468
+ },
+ "Component_[138002849734991713]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 138002849734991713
+ },
+ "Component_[16578565737331764849]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 16578565737331764849,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[16919232076966545697]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 16919232076966545697
+ },
+ "Component_[5182430712893438093]": {
+ "$type": "EditorMaterialComponent",
+ "Id": 5182430712893438093
+ },
+ "Component_[5675108321710651991]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 5675108321710651991,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{0CD745C0-6AA8-569A-A68A-73A3270986C4}",
+ "subId": 277889906
+ },
+ "assetHint": "objects/groudplane/groundplane_512x512m.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[5681893399601237518]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5681893399601237518
+ },
+ "Component_[592692962543397545]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 592692962543397545
+ },
+ "Component_[7090012899106946164]": {
+ "$type": "EditorLockComponent",
+ "Id": 7090012899106946164
+ },
+ "Component_[9410832619875640998]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9410832619875640998
+ }
+ }
+ },
+ "Entity_[1163754259827]": {
+ "Id": "Entity_[1163754259827]",
+ "Name": "Camera",
+ "Components": {
+ "Component_[11895140916889160460]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11895140916889160460
+ },
+ "Component_[16880285896855930892]": {
+ "$type": "{CA11DA46-29FF-4083-B5F6-E02C3A8C3A3D} EditorCameraComponent",
+ "Id": 16880285896855930892,
+ "Controller": {
+ "Configuration": {
+ "Field of View": 55.0,
+ "EditorEntityId": 6861302815203973165
+ }
+ }
+ },
+ "Component_[17187464423780271193]": {
+ "$type": "EditorLockComponent",
+ "Id": 17187464423780271193
+ },
+ "Component_[17495696818315413311]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 17495696818315413311
+ },
+ "Component_[18086214374043522055]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 18086214374043522055,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Translate": [
+ -2.3000001907348633,
+ -3.9368600845336914,
+ 1.0
+ ],
+ "Rotate": [
+ -2.050307512283325,
+ 1.9552897214889526,
+ -43.623355865478516
+ ]
+ }
+ },
+ "Component_[18387556550380114975]": {
+ "$type": "SelectionComponent",
+ "Id": 18387556550380114975
+ },
+ "Component_[2654521436129313160]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 2654521436129313160
+ },
+ "Component_[5265045084611556958]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5265045084611556958
+ },
+ "Component_[7169798125182238623]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7169798125182238623
+ },
+ "Component_[7255796294953281766]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 7255796294953281766,
+ "m_template": {
+ "$type": "FlyCameraInputComponent"
+ }
+ },
+ "Component_[8866210352157164042]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 8866210352157164042
+ },
+ "Component_[9129253381063760879]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 9129253381063760879
+ }
+ }
+ },
+ "Entity_[1168049227123]": {
+ "Id": "Entity_[1168049227123]",
+ "Name": "Grid",
+ "Components": {
+ "Component_[11443347433215807130]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11443347433215807130
+ },
+ "Component_[11779275529534764488]": {
+ "$type": "SelectionComponent",
+ "Id": 11779275529534764488
+ },
+ "Component_[14249419413039427459]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14249419413039427459
+ },
+ "Component_[15448581635946161318]": {
+ "$type": "AZ::Render::EditorGridComponent",
+ "Id": 15448581635946161318,
+ "Controller": {
+ "Configuration": {
+ "primarySpacing": 4.0,
+ "primaryColor": [
+ 0.501960813999176,
+ 0.501960813999176,
+ 0.501960813999176
+ ],
+ "secondarySpacing": 0.5,
+ "secondaryColor": [
+ 0.250980406999588,
+ 0.250980406999588,
+ 0.250980406999588
+ ]
+ }
+ }
+ },
+ "Component_[1843303322527297409]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 1843303322527297409
+ },
+ "Component_[380249072065273654]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 380249072065273654,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[7476660583684339787]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7476660583684339787
+ },
+ "Component_[7557626501215118375]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 7557626501215118375
+ },
+ "Component_[7984048488947365511]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 7984048488947365511
+ },
+ "Component_[8118181039276487398]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 8118181039276487398
+ },
+ "Component_[9189909764215270515]": {
+ "$type": "EditorLockComponent",
+ "Id": 9189909764215270515
+ }
+ }
+ },
+ "Entity_[1172344194419]": {
+ "Id": "Entity_[1172344194419]",
+ "Name": "Shader Ball",
+ "Components": {
+ "Component_[10789351944715265527]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 10789351944715265527
+ },
+ "Component_[12037033284781049225]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 12037033284781049225
+ },
+ "Component_[13759153306105970079]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 13759153306105970079
+ },
+ "Component_[14135560884830586279]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14135560884830586279
+ },
+ "Component_[16247165675903986673]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 16247165675903986673
+ },
+ "Component_[18082433625958885247]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 18082433625958885247
+ },
+ "Component_[6472623349872972660]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6472623349872972660,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Rotate": [
+ 0.0,
+ 0.10000000149011612,
+ 180.0
+ ]
+ }
+ },
+ "Component_[6495255223970673916]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 6495255223970673916,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{FD340C30-755C-5911-92A3-19A3F7A77931}",
+ "subId": 281415304
+ },
+ "assetHint": "objects/shaderball/shaderball_default_1m.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[8056625192494070973]": {
+ "$type": "SelectionComponent",
+ "Id": 8056625192494070973
+ },
+ "Component_[8550141614185782969]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 8550141614185782969
+ },
+ "Component_[9439770997198325425]": {
+ "$type": "EditorLockComponent",
+ "Id": 9439770997198325425
+ }
+ }
+ },
+ "Entity_[1176639161715]": {
+ "Id": "Entity_[1176639161715]",
+ "Name": "Atom Default Environment",
+ "Components": {
+ "Component_[10757302973393310045]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 10757302973393310045,
+ "Parent Entity": "Entity_[1146574390643]"
+ },
+ "Component_[14505817420424255464]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14505817420424255464,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 10757302973393310045
+ }
+ ]
+ },
+ "Component_[14988041764659020032]": {
+ "$type": "EditorLockComponent",
+ "Id": 14988041764659020032
+ },
+ "Component_[15808690248755038124]": {
+ "$type": "SelectionComponent",
+ "Id": 15808690248755038124
+ },
+ "Component_[15900837685796817138]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 15900837685796817138
+ },
+ "Component_[3298767348226484884]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3298767348226484884
+ },
+ "Component_[4076975109609220594]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 4076975109609220594
+ },
+ "Component_[5679760548946028854]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5679760548946028854
+ },
+ "Component_[5855590796136709437]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5855590796136709437,
+ "Child Entity Order": [
+ "Entity_[1155164325235]",
+ "Entity_[1180934129011]",
+ "Entity_[1172344194419]",
+ "Entity_[1168049227123]",
+ "Entity_[1163754259827]",
+ "Entity_[1159459292531]"
+ ]
+ },
+ "Component_[9277695270015777859]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 9277695270015777859
+ }
+ }
+ },
+ "Entity_[1180934129011]": {
+ "Id": "Entity_[1180934129011]",
+ "Name": "Global Sky",
+ "Components": {
+ "Component_[11231930600558681245]": {
+ "$type": "AZ::Render::EditorHDRiSkyboxComponent",
+ "Id": 11231930600558681245,
+ "Controller": {
+ "Configuration": {
+ "CubemapAsset": {
+ "assetId": {
+ "guid": "{215E47FD-D181-5832-B1AB-91673ABF6399}",
+ "subId": 1000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_skyboxcm.exr.streamingimage"
+ }
+ }
+ }
+ },
+ "Component_[11980494120202836095]": {
+ "$type": "SelectionComponent",
+ "Id": 11980494120202836095
+ },
+ "Component_[1428633914413949476]": {
+ "$type": "EditorLockComponent",
+ "Id": 1428633914413949476
+ },
+ "Component_[14936200426671614999]": {
+ "$type": "AZ::Render::EditorImageBasedLightComponent",
+ "Id": 14936200426671614999,
+ "Controller": {
+ "Configuration": {
+ "diffuseImageAsset": {
+ "assetId": {
+ "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+ "subId": 3000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_ibldiffuse.exr.streamingimage"
+ },
+ "specularImageAsset": {
+ "assetId": {
+ "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+ "subId": 2000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_iblspecular.exr.streamingimage"
+ }
+ }
+ }
+ },
+ "Component_[14994774102579326069]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 14994774102579326069
+ },
+ "Component_[15417479889044493340]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 15417479889044493340
+ },
+ "Component_[15826613364991382688]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 15826613364991382688
+ },
+ "Component_[1665003113283562343]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 1665003113283562343
+ },
+ "Component_[3704934735944502280]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 3704934735944502280
+ },
+ "Component_[5698542331457326479]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 5698542331457326479
+ },
+ "Component_[6644513399057217122]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6644513399057217122,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[931091830724002070]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 931091830724002070
+ }
+ }
+ },
+ "Entity_[1386540226381]": {
+ "Id": "Entity_[1386540226381]",
+ "Name": "s3",
+ "Components": {
+ "Component_[11158492000035348927]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 11158492000035348927
+ },
+ "Component_[13101294672800983417]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 13101294672800983417
+ },
+ "Component_[13312594438559441372]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 13312594438559441372
+ },
+ "Component_[14532086496432860950]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 14532086496432860950
+ },
+ "Component_[15284288439796123368]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 15284288439796123368
+ },
+ "Component_[17553238493971510581]": {
+ "$type": "EditorScriptCanvasComponent",
+ "Id": 17553238493971510581,
+ "m_name": "s3demo.scriptcanvas",
+ "runtimeDataIsValid": true,
+ "runtimeDataOverrides": {
+ "source": {
+ "id": "{D72821C5-1C31-5AE5-891D-30371C49B9E0}"
+ }
+ },
+ "sourceHandle": {
+ "id": "{D72821C5-1C31-5AE5-891D-30371C49B9E0}"
+ }
+ },
+ "Component_[17621265899133139471]": {
+ "$type": "EditorLockComponent",
+ "Id": 17621265899133139471
+ },
+ "Component_[2763569637558196086]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 2763569637558196086,
+ "Parent Entity": "Entity_[1146574390643]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 0.10000038146972656,
+ 4.005923748016357
+ ]
+ }
+ },
+ "Component_[3946146016045577093]": {
+ "$type": "SelectionComponent",
+ "Id": 3946146016045577093
+ },
+ "Component_[4521094551057628689]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 4521094551057628689
+ },
+ "Component_[5378520857609165944]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 5378520857609165944
+ }
+ }
+ },
+ "Entity_[1390835193677]": {
+ "Id": "Entity_[1390835193677]",
+ "Name": "dynamodb",
+ "Components": {
+ "Component_[13579073750136791325]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 13579073750136791325
+ },
+ "Component_[14581079376974874313]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 14581079376974874313
+ },
+ "Component_[15354545119837386836]": {
+ "$type": "SelectionComponent",
+ "Id": 15354545119837386836
+ },
+ "Component_[15913971829919706180]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 15913971829919706180
+ },
+ "Component_[17308449372189366987]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 17308449372189366987
+ },
+ "Component_[17741852956994822371]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 17741852956994822371
+ },
+ "Component_[4363122368868820254]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 4363122368868820254
+ },
+ "Component_[4890242568951925088]": {
+ "$type": "EditorScriptCanvasComponent",
+ "Id": 4890242568951925088,
+ "m_name": "dynamodbdemo.scriptcanvas",
+ "runtimeDataIsValid": true,
+ "runtimeDataOverrides": {
+ "source": {
+ "id": "{004B97C6-75F3-5B95-ADA4-EBF751EEF697}"
+ }
+ },
+ "sourceHandle": {
+ "id": "{004B97C6-75F3-5B95-ADA4-EBF751EEF697}"
+ }
+ },
+ "Component_[7140725680315799866]": {
+ "$type": "EditorLockComponent",
+ "Id": 7140725680315799866
+ },
+ "Component_[8431133659360426398]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 8431133659360426398,
+ "Parent Entity": "Entity_[1146574390643]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 0.10000038146972656,
+ 4.005923748016357
+ ]
+ }
+ },
+ "Component_[9486500593077263666]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 9486500593077263666
+ }
+ }
+ },
+ "Entity_[1395130160973]": {
+ "Id": "Entity_[1395130160973]",
+ "Name": "lambda",
+ "Components": {
+ "Component_[14224781635611846065]": {
+ "$type": "SelectionComponent",
+ "Id": 14224781635611846065
+ },
+ "Component_[14532864313352417822]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14532864313352417822
+ },
+ "Component_[14621438229914413040]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 14621438229914413040
+ },
+ "Component_[15642112885025274607]": {
+ "$type": "EditorLockComponent",
+ "Id": 15642112885025274607
+ },
+ "Component_[16340039184260739086]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 16340039184260739086
+ },
+ "Component_[17170806711467412600]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 17170806711467412600,
+ "Parent Entity": "Entity_[1146574390643]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 0.10000038146972656,
+ 4.005923748016357
+ ]
+ }
+ },
+ "Component_[18080677632538463069]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 18080677632538463069
+ },
+ "Component_[2663457305102263144]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 2663457305102263144
+ },
+ "Component_[4954526281430171003]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 4954526281430171003
+ },
+ "Component_[6251151424244415885]": {
+ "$type": "EditorScriptCanvasComponent",
+ "Id": 6251151424244415885,
+ "m_name": "lambdademo.scriptcanvas",
+ "runtimeDataIsValid": true,
+ "runtimeDataOverrides": {
+ "source": {
+ "id": "{3DCA213D-534E-5C86-9308-2F7675A08029}"
+ }
+ },
+ "sourceHandle": {
+ "id": "{3DCA213D-534E-5C86-9308-2F7675A08029}"
+ }
+ },
+ "Component_[6526999075003995619]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 6526999075003995619
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Levels/AWS/Core/filelist.xml b/AutomatedTesting/Levels/AWS/Core/filelist.xml
deleted file mode 100644
index 9d1fcd2e83..0000000000
--- a/AutomatedTesting/Levels/AWS/Core/filelist.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/AutomatedTesting/Levels/AWS/Core/level.pak b/AutomatedTesting/Levels/AWS/Core/level.pak
deleted file mode 100644
index 01b79da84e..0000000000
--- a/AutomatedTesting/Levels/AWS/Core/level.pak
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4ba2f409fc974c72b8ee8b660d200ed1d013ee8408419b0e91d6d487e71e4997
-size 3774
diff --git a/AutomatedTesting/Levels/AWS/Metrics/Metrics.ly b/AutomatedTesting/Levels/AWS/Metrics/Metrics.ly
deleted file mode 100644
index 12998e89be..0000000000
--- a/AutomatedTesting/Levels/AWS/Metrics/Metrics.ly
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:023992998ab5a1d64b38dacd1d5e1a9dc930ff704289c0656ed6eaba6951d660
-size 9066
diff --git a/AutomatedTesting/Levels/AWS/Metrics/Metrics.prefab b/AutomatedTesting/Levels/AWS/Metrics/Metrics.prefab
new file mode 100644
index 0000000000..7f4144d734
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/Metrics/Metrics.prefab
@@ -0,0 +1,627 @@
+{
+ "ContainerEntity": {
+ "Id": "Entity_[1146574390643]",
+ "Name": "Level",
+ "Components": {
+ "Component_[10641544592923449938]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 10641544592923449938
+ },
+ "Component_[12039882709170782873]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 12039882709170782873
+ },
+ "Component_[12265484671603697631]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 12265484671603697631
+ },
+ "Component_[14126657869720434043]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 14126657869720434043,
+ "Child Entity Order": [
+ "Entity_[1176639161715]",
+ "Entity_[2086619895629]",
+ "Entity_[2086619895629]"
+ ]
+ },
+ "Component_[15230859088967841193]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 15230859088967841193,
+ "Parent Entity": ""
+ },
+ "Component_[16239496886950819870]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 16239496886950819870
+ },
+ "Component_[5688118765544765547]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 5688118765544765547
+ },
+ "Component_[6545738857812235305]": {
+ "$type": "SelectionComponent",
+ "Id": 6545738857812235305
+ },
+ "Component_[7247035804068349658]": {
+ "$type": "EditorPrefabComponent",
+ "Id": 7247035804068349658
+ },
+ "Component_[9307224322037797205]": {
+ "$type": "EditorLockComponent",
+ "Id": 9307224322037797205
+ },
+ "Component_[9562516168917670048]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9562516168917670048
+ }
+ }
+ },
+ "Entities": {
+ "Entity_[1155164325235]": {
+ "Id": "Entity_[1155164325235]",
+ "Name": "Sun",
+ "Components": {
+ "Component_[10440557478882592717]": {
+ "$type": "SelectionComponent",
+ "Id": 10440557478882592717
+ },
+ "Component_[13620450453324765907]": {
+ "$type": "EditorLockComponent",
+ "Id": 13620450453324765907
+ },
+ "Component_[2134313378593666258]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 2134313378593666258
+ },
+ "Component_[234010807770404186]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 234010807770404186
+ },
+ "Component_[2970359110423865725]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 2970359110423865725
+ },
+ "Component_[3722854130373041803]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3722854130373041803
+ },
+ "Component_[5992533738676323195]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5992533738676323195
+ },
+ "Component_[7378860763541895402]": {
+ "$type": "AZ::Render::EditorDirectionalLightComponent",
+ "Id": 7378860763541895402,
+ "Controller": {
+ "Configuration": {
+ "Intensity": 1.0,
+ "CameraEntityId": "",
+ "ShadowFilterMethod": 1
+ }
+ }
+ },
+ "Component_[7892834440890947578]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 7892834440890947578,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 0.0,
+ 13.487043380737305
+ ],
+ "Rotate": [
+ -76.13099670410156,
+ -0.847000002861023,
+ -15.8100004196167
+ ]
+ }
+ },
+ "Component_[8599729549570828259]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 8599729549570828259
+ },
+ "Component_[952797371922080273]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 952797371922080273
+ }
+ }
+ },
+ "Entity_[1159459292531]": {
+ "Id": "Entity_[1159459292531]",
+ "Name": "Ground",
+ "Components": {
+ "Component_[11701138785793981042]": {
+ "$type": "SelectionComponent",
+ "Id": 11701138785793981042
+ },
+ "Component_[12260880513256986252]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 12260880513256986252
+ },
+ "Component_[13711420870643673468]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 13711420870643673468
+ },
+ "Component_[138002849734991713]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 138002849734991713
+ },
+ "Component_[16578565737331764849]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 16578565737331764849,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[16919232076966545697]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 16919232076966545697
+ },
+ "Component_[5182430712893438093]": {
+ "$type": "EditorMaterialComponent",
+ "Id": 5182430712893438093
+ },
+ "Component_[5675108321710651991]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 5675108321710651991,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{0CD745C0-6AA8-569A-A68A-73A3270986C4}",
+ "subId": 277889906
+ },
+ "assetHint": "objects/groudplane/groundplane_512x512m.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[5681893399601237518]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5681893399601237518
+ },
+ "Component_[592692962543397545]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 592692962543397545
+ },
+ "Component_[7090012899106946164]": {
+ "$type": "EditorLockComponent",
+ "Id": 7090012899106946164
+ },
+ "Component_[9410832619875640998]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9410832619875640998
+ }
+ }
+ },
+ "Entity_[1163754259827]": {
+ "Id": "Entity_[1163754259827]",
+ "Name": "Camera",
+ "Components": {
+ "Component_[11895140916889160460]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11895140916889160460
+ },
+ "Component_[16880285896855930892]": {
+ "$type": "{CA11DA46-29FF-4083-B5F6-E02C3A8C3A3D} EditorCameraComponent",
+ "Id": 16880285896855930892,
+ "Controller": {
+ "Configuration": {
+ "Field of View": 55.0,
+ "EditorEntityId": 6861302815203973165
+ }
+ }
+ },
+ "Component_[17187464423780271193]": {
+ "$type": "EditorLockComponent",
+ "Id": 17187464423780271193
+ },
+ "Component_[17495696818315413311]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 17495696818315413311
+ },
+ "Component_[18086214374043522055]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 18086214374043522055,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Translate": [
+ -2.3000001907348633,
+ -3.9368600845336914,
+ 1.0
+ ],
+ "Rotate": [
+ -2.050307512283325,
+ 1.9552897214889526,
+ -43.623355865478516
+ ]
+ }
+ },
+ "Component_[18387556550380114975]": {
+ "$type": "SelectionComponent",
+ "Id": 18387556550380114975
+ },
+ "Component_[2654521436129313160]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 2654521436129313160
+ },
+ "Component_[5265045084611556958]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5265045084611556958
+ },
+ "Component_[7169798125182238623]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7169798125182238623
+ },
+ "Component_[7255796294953281766]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 7255796294953281766,
+ "m_template": {
+ "$type": "FlyCameraInputComponent"
+ }
+ },
+ "Component_[8866210352157164042]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 8866210352157164042
+ },
+ "Component_[9129253381063760879]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 9129253381063760879
+ }
+ }
+ },
+ "Entity_[1168049227123]": {
+ "Id": "Entity_[1168049227123]",
+ "Name": "Grid",
+ "Components": {
+ "Component_[11443347433215807130]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11443347433215807130
+ },
+ "Component_[11779275529534764488]": {
+ "$type": "SelectionComponent",
+ "Id": 11779275529534764488
+ },
+ "Component_[14249419413039427459]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14249419413039427459
+ },
+ "Component_[15448581635946161318]": {
+ "$type": "AZ::Render::EditorGridComponent",
+ "Id": 15448581635946161318,
+ "Controller": {
+ "Configuration": {
+ "primarySpacing": 4.0,
+ "primaryColor": [
+ 0.501960813999176,
+ 0.501960813999176,
+ 0.501960813999176
+ ],
+ "secondarySpacing": 0.5,
+ "secondaryColor": [
+ 0.250980406999588,
+ 0.250980406999588,
+ 0.250980406999588
+ ]
+ }
+ }
+ },
+ "Component_[1843303322527297409]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 1843303322527297409
+ },
+ "Component_[380249072065273654]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 380249072065273654,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[7476660583684339787]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7476660583684339787
+ },
+ "Component_[7557626501215118375]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 7557626501215118375
+ },
+ "Component_[7984048488947365511]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 7984048488947365511
+ },
+ "Component_[8118181039276487398]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 8118181039276487398
+ },
+ "Component_[9189909764215270515]": {
+ "$type": "EditorLockComponent",
+ "Id": 9189909764215270515
+ }
+ }
+ },
+ "Entity_[1172344194419]": {
+ "Id": "Entity_[1172344194419]",
+ "Name": "Shader Ball",
+ "Components": {
+ "Component_[10789351944715265527]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 10789351944715265527
+ },
+ "Component_[12037033284781049225]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 12037033284781049225
+ },
+ "Component_[13759153306105970079]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 13759153306105970079
+ },
+ "Component_[14135560884830586279]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14135560884830586279
+ },
+ "Component_[16247165675903986673]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 16247165675903986673
+ },
+ "Component_[18082433625958885247]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 18082433625958885247
+ },
+ "Component_[6472623349872972660]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6472623349872972660,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Rotate": [
+ 0.0,
+ 0.10000000149011612,
+ 180.0
+ ]
+ }
+ },
+ "Component_[6495255223970673916]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 6495255223970673916,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{FD340C30-755C-5911-92A3-19A3F7A77931}",
+ "subId": 281415304
+ },
+ "assetHint": "objects/shaderball/shaderball_default_1m.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[8056625192494070973]": {
+ "$type": "SelectionComponent",
+ "Id": 8056625192494070973
+ },
+ "Component_[8550141614185782969]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 8550141614185782969
+ },
+ "Component_[9439770997198325425]": {
+ "$type": "EditorLockComponent",
+ "Id": 9439770997198325425
+ }
+ }
+ },
+ "Entity_[1176639161715]": {
+ "Id": "Entity_[1176639161715]",
+ "Name": "Atom Default Environment",
+ "Components": {
+ "Component_[10757302973393310045]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 10757302973393310045,
+ "Parent Entity": "Entity_[1146574390643]"
+ },
+ "Component_[14505817420424255464]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14505817420424255464,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 10757302973393310045
+ }
+ ]
+ },
+ "Component_[14988041764659020032]": {
+ "$type": "EditorLockComponent",
+ "Id": 14988041764659020032
+ },
+ "Component_[15808690248755038124]": {
+ "$type": "SelectionComponent",
+ "Id": 15808690248755038124
+ },
+ "Component_[15900837685796817138]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 15900837685796817138
+ },
+ "Component_[3298767348226484884]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3298767348226484884
+ },
+ "Component_[4076975109609220594]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 4076975109609220594
+ },
+ "Component_[5679760548946028854]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5679760548946028854
+ },
+ "Component_[5855590796136709437]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5855590796136709437,
+ "Child Entity Order": [
+ "Entity_[1155164325235]",
+ "Entity_[1180934129011]",
+ "Entity_[1172344194419]",
+ "Entity_[1168049227123]",
+ "Entity_[1163754259827]",
+ "Entity_[1159459292531]"
+ ]
+ },
+ "Component_[9277695270015777859]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 9277695270015777859
+ }
+ }
+ },
+ "Entity_[1180934129011]": {
+ "Id": "Entity_[1180934129011]",
+ "Name": "Global Sky",
+ "Components": {
+ "Component_[11231930600558681245]": {
+ "$type": "AZ::Render::EditorHDRiSkyboxComponent",
+ "Id": 11231930600558681245,
+ "Controller": {
+ "Configuration": {
+ "CubemapAsset": {
+ "assetId": {
+ "guid": "{215E47FD-D181-5832-B1AB-91673ABF6399}",
+ "subId": 1000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_skyboxcm.exr.streamingimage"
+ }
+ }
+ }
+ },
+ "Component_[11980494120202836095]": {
+ "$type": "SelectionComponent",
+ "Id": 11980494120202836095
+ },
+ "Component_[1428633914413949476]": {
+ "$type": "EditorLockComponent",
+ "Id": 1428633914413949476
+ },
+ "Component_[14936200426671614999]": {
+ "$type": "AZ::Render::EditorImageBasedLightComponent",
+ "Id": 14936200426671614999,
+ "Controller": {
+ "Configuration": {
+ "diffuseImageAsset": {
+ "assetId": {
+ "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+ "subId": 3000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_ibldiffuse.exr.streamingimage"
+ },
+ "specularImageAsset": {
+ "assetId": {
+ "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+ "subId": 2000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_iblspecular.exr.streamingimage"
+ }
+ }
+ }
+ },
+ "Component_[14994774102579326069]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 14994774102579326069
+ },
+ "Component_[15417479889044493340]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 15417479889044493340
+ },
+ "Component_[15826613364991382688]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 15826613364991382688
+ },
+ "Component_[1665003113283562343]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 1665003113283562343
+ },
+ "Component_[3704934735944502280]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 3704934735944502280
+ },
+ "Component_[5698542331457326479]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 5698542331457326479
+ },
+ "Component_[6644513399057217122]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6644513399057217122,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[931091830724002070]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 931091830724002070
+ }
+ }
+ },
+ "Entity_[2086619895629]": {
+ "Id": "Entity_[2086619895629]",
+ "Name": "metrics",
+ "Components": {
+ "Component_[10664937239001700943]": {
+ "$type": "SelectionComponent",
+ "Id": 10664937239001700943
+ },
+ "Component_[12411100785613400502]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 12411100785613400502
+ },
+ "Component_[13461617945403887462]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 13461617945403887462
+ },
+ "Component_[1398528805938487915]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 1398528805938487915
+ },
+ "Component_[15586634767575159325]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 15586634767575159325
+ },
+ "Component_[1737734807882912852]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 1737734807882912852
+ },
+ "Component_[2398400563175352537]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 2398400563175352537
+ },
+ "Component_[3845542252660517302]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 3845542252660517302
+ },
+ "Component_[3873433240186817282]": {
+ "$type": "EditorLockComponent",
+ "Id": 3873433240186817282
+ },
+ "Component_[4474288881478318615]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 4474288881478318615,
+ "Parent Entity": "Entity_[1146574390643]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 0.10000038146972656,
+ 4.005923748016357
+ ]
+ }
+ },
+ "Component_[5865591669658426602]": {
+ "$type": "ScriptEditorComponent",
+ "Id": 5865591669658426602,
+ "ScriptComponent": {
+ "Script": {
+ "assetId": {
+ "guid": "{50D66834-9277-5469-892E-DAD087FF4C0E}",
+ "subId": 1
+ },
+ "loadBehavior": "QueueLoad",
+ "assetHint": "levels/aws/metrics/script/metrics.luac"
+ }
+ },
+ "ScriptAsset": {
+ "assetId": {
+ "guid": "{50D66834-9277-5469-892E-DAD087FF4C0E}",
+ "subId": 1
+ },
+ "assetHint": "levels/aws/metrics/script/metrics.luac"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Levels/AWS/Metrics/filelist.xml b/AutomatedTesting/Levels/AWS/Metrics/filelist.xml
deleted file mode 100644
index 3539102346..0000000000
--- a/AutomatedTesting/Levels/AWS/Metrics/filelist.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/AutomatedTesting/Levels/AWS/Metrics/level.pak b/AutomatedTesting/Levels/AWS/Metrics/level.pak
deleted file mode 100644
index fd1f5ac6ad..0000000000
--- a/AutomatedTesting/Levels/AWS/Metrics/level.pak
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e7c0c07b13bb64db344b94d5712e1e802e607a9dee506768b34481f4a76d8505
-size 3593
diff --git a/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/AutoComponent_RPC.prefab b/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/AutoComponent_RPC.prefab
new file mode 100644
index 0000000000..758cb4fca8
--- /dev/null
+++ b/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/AutoComponent_RPC.prefab
@@ -0,0 +1,747 @@
+{
+ "ContainerEntity": {
+ "Id": "Entity_[1146574390643]",
+ "Name": "Level",
+ "Components": {
+ "Component_[10641544592923449938]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 10641544592923449938
+ },
+ "Component_[12039882709170782873]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 12039882709170782873
+ },
+ "Component_[12265484671603697631]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 12265484671603697631
+ },
+ "Component_[14126657869720434043]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 14126657869720434043,
+ "Child Entity Order": [
+ "Entity_[1176639161715]",
+ "Entity_[12685882829720]",
+ "Entity_[31145534614197]"
+ ]
+ },
+ "Component_[15230859088967841193]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 15230859088967841193,
+ "Parent Entity": ""
+ },
+ "Component_[16239496886950819870]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 16239496886950819870
+ },
+ "Component_[5688118765544765547]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 5688118765544765547
+ },
+ "Component_[6545738857812235305]": {
+ "$type": "SelectionComponent",
+ "Id": 6545738857812235305
+ },
+ "Component_[7247035804068349658]": {
+ "$type": "EditorPrefabComponent",
+ "Id": 7247035804068349658
+ },
+ "Component_[9307224322037797205]": {
+ "$type": "EditorLockComponent",
+ "Id": 9307224322037797205
+ },
+ "Component_[9562516168917670048]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9562516168917670048
+ }
+ }
+ },
+ "Entities": {
+ "Entity_[1155164325235]": {
+ "Id": "Entity_[1155164325235]",
+ "Name": "Sun",
+ "Components": {
+ "Component_[10440557478882592717]": {
+ "$type": "SelectionComponent",
+ "Id": 10440557478882592717
+ },
+ "Component_[13620450453324765907]": {
+ "$type": "EditorLockComponent",
+ "Id": 13620450453324765907
+ },
+ "Component_[2134313378593666258]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 2134313378593666258
+ },
+ "Component_[234010807770404186]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 234010807770404186
+ },
+ "Component_[2970359110423865725]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 2970359110423865725
+ },
+ "Component_[3722854130373041803]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3722854130373041803
+ },
+ "Component_[5992533738676323195]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5992533738676323195
+ },
+ "Component_[7378860763541895402]": {
+ "$type": "AZ::Render::EditorDirectionalLightComponent",
+ "Id": 7378860763541895402,
+ "Controller": {
+ "Configuration": {
+ "Intensity": 1.0,
+ "CameraEntityId": "",
+ "ShadowFilterMethod": 1
+ }
+ }
+ },
+ "Component_[7892834440890947578]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 7892834440890947578,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 0.0,
+ 13.487043380737305
+ ],
+ "Rotate": [
+ -76.13099670410156,
+ -0.847000002861023,
+ -15.8100004196167
+ ]
+ }
+ },
+ "Component_[8599729549570828259]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 8599729549570828259
+ },
+ "Component_[952797371922080273]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 952797371922080273
+ }
+ }
+ },
+ "Entity_[1159459292531]": {
+ "Id": "Entity_[1159459292531]",
+ "Name": "Ground",
+ "Components": {
+ "Component_[11701138785793981042]": {
+ "$type": "SelectionComponent",
+ "Id": 11701138785793981042
+ },
+ "Component_[12260880513256986252]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 12260880513256986252
+ },
+ "Component_[13711420870643673468]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 13711420870643673468
+ },
+ "Component_[138002849734991713]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 138002849734991713
+ },
+ "Component_[16578565737331764849]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 16578565737331764849,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[16919232076966545697]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 16919232076966545697
+ },
+ "Component_[5182430712893438093]": {
+ "$type": "EditorMaterialComponent",
+ "Id": 5182430712893438093
+ },
+ "Component_[5675108321710651991]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 5675108321710651991,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{0CD745C0-6AA8-569A-A68A-73A3270986C4}",
+ "subId": 277889906
+ },
+ "assetHint": "objects/groudplane/groundplane_512x512m.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[5681893399601237518]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5681893399601237518
+ },
+ "Component_[592692962543397545]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 592692962543397545
+ },
+ "Component_[7090012899106946164]": {
+ "$type": "EditorLockComponent",
+ "Id": 7090012899106946164
+ },
+ "Component_[9410832619875640998]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9410832619875640998
+ }
+ }
+ },
+ "Entity_[1163754259827]": {
+ "Id": "Entity_[1163754259827]",
+ "Name": "Camera",
+ "Components": {
+ "Component_[11895140916889160460]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11895140916889160460
+ },
+ "Component_[16880285896855930892]": {
+ "$type": "{CA11DA46-29FF-4083-B5F6-E02C3A8C3A3D} EditorCameraComponent",
+ "Id": 16880285896855930892,
+ "Controller": {
+ "Configuration": {
+ "Field of View": 55.0,
+ "EditorEntityId": 11050384689878106598
+ }
+ }
+ },
+ "Component_[17187464423780271193]": {
+ "$type": "EditorLockComponent",
+ "Id": 17187464423780271193
+ },
+ "Component_[17495696818315413311]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 17495696818315413311
+ },
+ "Component_[18086214374043522055]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 18086214374043522055,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Translate": [
+ -2.3000001907348633,
+ -3.9368600845336914,
+ 1.0
+ ],
+ "Rotate": [
+ -2.050307512283325,
+ 1.9552897214889526,
+ -43.623355865478516
+ ]
+ }
+ },
+ "Component_[18387556550380114975]": {
+ "$type": "SelectionComponent",
+ "Id": 18387556550380114975
+ },
+ "Component_[2654521436129313160]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 2654521436129313160
+ },
+ "Component_[5265045084611556958]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5265045084611556958
+ },
+ "Component_[7169798125182238623]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7169798125182238623
+ },
+ "Component_[7255796294953281766]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 7255796294953281766,
+ "m_template": {
+ "$type": "FlyCameraInputComponent"
+ }
+ },
+ "Component_[8866210352157164042]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 8866210352157164042
+ },
+ "Component_[9129253381063760879]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 9129253381063760879
+ }
+ }
+ },
+ "Entity_[1168049227123]": {
+ "Id": "Entity_[1168049227123]",
+ "Name": "Grid",
+ "Components": {
+ "Component_[11443347433215807130]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11443347433215807130
+ },
+ "Component_[11779275529534764488]": {
+ "$type": "SelectionComponent",
+ "Id": 11779275529534764488
+ },
+ "Component_[14249419413039427459]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14249419413039427459
+ },
+ "Component_[15448581635946161318]": {
+ "$type": "AZ::Render::EditorGridComponent",
+ "Id": 15448581635946161318,
+ "Controller": {
+ "Configuration": {
+ "primarySpacing": 4.0,
+ "primaryColor": [
+ 0.501960813999176,
+ 0.501960813999176,
+ 0.501960813999176
+ ],
+ "secondarySpacing": 0.5,
+ "secondaryColor": [
+ 0.250980406999588,
+ 0.250980406999588,
+ 0.250980406999588
+ ]
+ }
+ }
+ },
+ "Component_[1843303322527297409]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 1843303322527297409
+ },
+ "Component_[380249072065273654]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 380249072065273654,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[7476660583684339787]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7476660583684339787
+ },
+ "Component_[7557626501215118375]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 7557626501215118375
+ },
+ "Component_[7984048488947365511]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 7984048488947365511
+ },
+ "Component_[8118181039276487398]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 8118181039276487398
+ },
+ "Component_[9189909764215270515]": {
+ "$type": "EditorLockComponent",
+ "Id": 9189909764215270515
+ }
+ }
+ },
+ "Entity_[1172344194419]": {
+ "Id": "Entity_[1172344194419]",
+ "Name": "Shader Ball",
+ "Components": {
+ "Component_[10789351944715265527]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 10789351944715265527
+ },
+ "Component_[12037033284781049225]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 12037033284781049225
+ },
+ "Component_[13759153306105970079]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 13759153306105970079
+ },
+ "Component_[14135560884830586279]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14135560884830586279
+ },
+ "Component_[16247165675903986673]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 16247165675903986673
+ },
+ "Component_[18082433625958885247]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 18082433625958885247
+ },
+ "Component_[6472623349872972660]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6472623349872972660,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Rotate": [
+ 0.0,
+ 0.10000000149011612,
+ 180.0
+ ]
+ }
+ },
+ "Component_[6495255223970673916]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 6495255223970673916,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{FD340C30-755C-5911-92A3-19A3F7A77931}",
+ "subId": 281415304
+ },
+ "assetHint": "objects/shaderball/shaderball_default_1m.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[8056625192494070973]": {
+ "$type": "SelectionComponent",
+ "Id": 8056625192494070973
+ },
+ "Component_[8550141614185782969]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 8550141614185782969
+ },
+ "Component_[9439770997198325425]": {
+ "$type": "EditorLockComponent",
+ "Id": 9439770997198325425
+ }
+ }
+ },
+ "Entity_[1176639161715]": {
+ "Id": "Entity_[1176639161715]",
+ "Name": "Atom Default Environment",
+ "Components": {
+ "Component_[10757302973393310045]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 10757302973393310045,
+ "Parent Entity": "Entity_[1146574390643]"
+ },
+ "Component_[14505817420424255464]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14505817420424255464,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 10757302973393310045
+ }
+ ]
+ },
+ "Component_[14988041764659020032]": {
+ "$type": "EditorLockComponent",
+ "Id": 14988041764659020032
+ },
+ "Component_[15808690248755038124]": {
+ "$type": "SelectionComponent",
+ "Id": 15808690248755038124
+ },
+ "Component_[15900837685796817138]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 15900837685796817138
+ },
+ "Component_[3298767348226484884]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3298767348226484884
+ },
+ "Component_[4076975109609220594]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 4076975109609220594
+ },
+ "Component_[5679760548946028854]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5679760548946028854
+ },
+ "Component_[5855590796136709437]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5855590796136709437,
+ "Child Entity Order": [
+ "Entity_[1155164325235]",
+ "Entity_[1180934129011]",
+ "Entity_[1172344194419]",
+ "Entity_[1168049227123]",
+ "Entity_[1163754259827]",
+ "Entity_[1159459292531]"
+ ]
+ },
+ "Component_[9277695270015777859]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 9277695270015777859
+ }
+ }
+ },
+ "Entity_[1180934129011]": {
+ "Id": "Entity_[1180934129011]",
+ "Name": "Global Sky",
+ "Components": {
+ "Component_[11231930600558681245]": {
+ "$type": "AZ::Render::EditorHDRiSkyboxComponent",
+ "Id": 11231930600558681245,
+ "Controller": {
+ "Configuration": {
+ "CubemapAsset": {
+ "assetId": {
+ "guid": "{215E47FD-D181-5832-B1AB-91673ABF6399}",
+ "subId": 1000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_skyboxcm.exr.streamingimage"
+ }
+ }
+ }
+ },
+ "Component_[11980494120202836095]": {
+ "$type": "SelectionComponent",
+ "Id": 11980494120202836095
+ },
+ "Component_[1428633914413949476]": {
+ "$type": "EditorLockComponent",
+ "Id": 1428633914413949476
+ },
+ "Component_[14936200426671614999]": {
+ "$type": "AZ::Render::EditorImageBasedLightComponent",
+ "Id": 14936200426671614999,
+ "Controller": {
+ "Configuration": {
+ "diffuseImageAsset": {
+ "assetId": {
+ "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+ "subId": 3000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_ibldiffuse.exr.streamingimage"
+ },
+ "specularImageAsset": {
+ "assetId": {
+ "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+ "subId": 2000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_iblspecular.exr.streamingimage"
+ }
+ }
+ }
+ },
+ "Component_[14994774102579326069]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 14994774102579326069
+ },
+ "Component_[15417479889044493340]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 15417479889044493340
+ },
+ "Component_[15826613364991382688]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 15826613364991382688
+ },
+ "Component_[1665003113283562343]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 1665003113283562343
+ },
+ "Component_[3704934735944502280]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 3704934735944502280
+ },
+ "Component_[5698542331457326479]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 5698542331457326479
+ },
+ "Component_[6644513399057217122]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6644513399057217122,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[931091830724002070]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 931091830724002070
+ }
+ }
+ },
+ "Entity_[12685882829720]": {
+ "Id": "Entity_[12685882829720]",
+ "Name": "GlobalGameData",
+ "Components": {
+ "Component_[11240656689650225106]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 11240656689650225106
+ },
+ "Component_[13863201640354873385]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 13863201640354873385
+ },
+ "Component_[14671754037021562789]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14671754037021562789
+ },
+ "Component_[14750978061505735417]": {
+ "$type": "EditorScriptCanvasComponent",
+ "Id": 14750978061505735417,
+ "m_name": "GlobalGameData",
+ "m_assetHolder": {
+ "m_asset": {
+ "assetId": {
+ "guid": "{B16589A0-EA01-56BC-8141-91A3967FB95F}"
+ },
+ "assetHint": "levels/multiplayer/autocomponent_rpc/globalgamedata.scriptcanvas"
+ }
+ },
+ "runtimeDataIsValid": true,
+ "runtimeDataOverrides": {
+ "source": {
+ "assetId": {
+ "guid": "{B16589A0-EA01-56BC-8141-91A3967FB95F}"
+ },
+ "assetHint": "levels/multiplayer/autocomponent_rpc/globalgamedata.scriptcanvas"
+ }
+ }
+ },
+ "Component_[16436925042043744033]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 16436925042043744033,
+ "Parent Entity": "Entity_[1146574390643]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 0.10000038146972656,
+ 4.005393981933594
+ ]
+ }
+ },
+ "Component_[16974524495698916088]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 16974524495698916088
+ },
+ "Component_[2753700837834389204]": {
+ "$type": "EditorLockComponent",
+ "Id": 2753700837834389204
+ },
+ "Component_[3766473509503096065]": {
+ "$type": "SelectionComponent",
+ "Id": 3766473509503096065
+ },
+ "Component_[4025955184206569130]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 4025955184206569130
+ },
+ "Component_[7909743395732791573]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 7909743395732791573
+ },
+ "Component_[9550161640684119498]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 9550161640684119498
+ }
+ }
+ },
+ "Entity_[31145534614197]": {
+ "Id": "Entity_[31145534614197]",
+ "Name": "NetLevelEntity",
+ "Components": {
+ "Component_[12132849363414901338]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 12132849363414901338
+ },
+ "Component_[12302672911455629152]": {
+ "$type": "SelectionComponent",
+ "Id": 12302672911455629152
+ },
+ "Component_[14169903623243423134]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 14169903623243423134
+ },
+ "Component_[14607413934411389854]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14607413934411389854
+ },
+ "Component_[15396284312416541768]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 15396284312416541768,
+ "m_template": {
+ "$type": "Multiplayer::LocalPredictionPlayerInputComponent"
+ }
+ },
+ "Component_[15494977028055234270]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 15494977028055234270
+ },
+ "Component_[16325088972532345964]": {
+ "$type": "EditorLockComponent",
+ "Id": 16325088972532345964
+ },
+ "Component_[1986030426392465743]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 1986030426392465743
+ },
+ "Component_[4591476848838823508]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 4591476848838823508,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{80FA8BAF-4A5B-5937-9679-2E592E841A3A}",
+ "subId": 275306041
+ },
+ "assetHint": "assets/physics/collider_pxmeshautoassigned/spherebot/r0-b_body.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[7256163899440301540]": {
+ "$type": "EditorScriptCanvasComponent",
+ "Id": 7256163899440301540,
+ "m_name": "AutoComponent_RPC_NetLevelEntity",
+ "m_assetHolder": {
+ "m_asset": {
+ "assetId": {
+ "guid": "{1D517006-AC01-5ECA-AE66-0E007871F0CD}"
+ },
+ "assetHint": "levels/multiplayer/autocomponent_rpc/autocomponent_rpc_netlevelentity.scriptcanvas"
+ }
+ },
+ "runtimeDataIsValid": true,
+ "runtimeDataOverrides": {
+ "source": {
+ "assetId": {
+ "guid": "{1D517006-AC01-5ECA-AE66-0E007871F0CD}"
+ },
+ "assetHint": "levels/multiplayer/autocomponent_rpc/autocomponent_rpc_netlevelentity.scriptcanvas"
+ }
+ }
+ },
+ "Component_[731336627222243355]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 731336627222243355,
+ "Parent Entity": "Entity_[1146574390643]",
+ "Transform Data": {
+ "Translate": [
+ 2.561863899230957,
+ -1.038161277770996,
+ 0.1487259864807129
+ ]
+ }
+ },
+ "Component_[8012379125499217348]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 8012379125499217348
+ },
+ "Component_[8122568562140740597]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 8122568562140740597,
+ "m_template": {
+ "$type": "Multiplayer::NetworkTransformComponent"
+ }
+ },
+ "Component_[8805228647591404845]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 8805228647591404845,
+ "m_template": {
+ "$type": "NetBindComponent"
+ }
+ },
+ "Component_[9816897251206708579]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 9816897251206708579,
+ "m_template": {
+ "$type": "AutomatedTesting::NetworkTestPlayerComponent"
+ }
+ },
+ "Component_[9880860858035405475]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 9880860858035405475
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/AutoComponent_RPC.scriptcanvas b/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/AutoComponent_RPC.scriptcanvas
new file mode 100644
index 0000000000..c1c77b14fe
--- /dev/null
+++ b/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/AutoComponent_RPC.scriptcanvas
@@ -0,0 +1,5019 @@
+{
+ "Type": "JsonSerialization",
+ "Version": 1,
+ "ClassName": "ScriptCanvasData",
+ "ClassData": {
+ "m_scriptCanvas": {
+ "Id": {
+ "id": 2816238339133127497
+ },
+ "Name": "AutoComponent_RPC",
+ "Components": {
+ "Component_[6790521910463264404]": {
+ "$type": "EditorGraphVariableManagerComponent",
+ "Id": 6790521910463264404,
+ "m_variableData": {
+ "m_nameVariableMap": [
+ {
+ "Key": {
+ "m_id": "{71675BCB-6546-4B79-9D5E-912982945852}"
+ },
+ "Value": {
+ "Datum": {
+ "scriptCanvasType": {
+ "m_type": 3
+ },
+ "isNullPointer": false,
+ "$type": "double",
+ "value": 0.0
+ },
+ "VariableId": {
+ "m_id": "{71675BCB-6546-4B79-9D5E-912982945852}"
+ },
+ "VariableName": "PlayerNumber"
+ }
+ }
+ ]
+ }
+ },
+ "Component_[9755768666831861951]": {
+ "$type": "{4D755CA9-AB92-462C-B24F-0B3376F19967} Graph",
+ "Id": 9755768666831861951,
+ "m_graphData": {
+ "m_nodes": [
+ {
+ "Id": {
+ "id": 8706984967056
+ },
+ "Name": "SC-EventNode(AuthorityToAutonomous_PlayerNumber Notify Event)",
+ "Components": {
+ "Component_[10688723972761024546]": {
+ "$type": "AzEventHandler",
+ "Id": 10688723972761024546,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{46E6B649-CAA4-4318-960D-5E4854E21BB2}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ },
+ {
+ "$type": "ConnectionLimitContract",
+ "limit": 1
+ },
+ {
+ "$type": "RestrictedNodeContract",
+ "m_nodeId": {
+ "id": 8719869868944
+ }
+ }
+ ],
+ "slotName": "Connect",
+ "toolTip": "Connect the AZ Event to this AZ Event Handler.",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{221AFED2-BD9E-4CFF-8EC7-75ABA019134D}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Disconnect",
+ "toolTip": "Disconnect current AZ Event from this AZ Event Handler.",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{D139A8D2-F57B-4EBF-B7F8-1D65C2D97C25}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "On Connected",
+ "toolTip": "Signaled when a connection has taken place.",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{3F47A140-182E-4B32-AE14-467555A6640A}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "On Disconnected",
+ "toolTip": "Signaled when this event handler is disconnected.",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{586BE222-2DEA-4E08-968F-07CA4EB96C54}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "OnEvent",
+ "toolTip": "Triggered when the AZ Event invokes Signal() function.",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ },
+ "IsLatent": true
+ },
+ {
+ "id": {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "player_number",
+ "DisplayDataType": {
+ "m_type": 3
+ },
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{8C7E88EA-8FEE-45D0-9A2E-78BC4A18F508}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ },
+ {
+ "$type": "ConnectionLimitContract",
+ "limit": 1
+ },
+ {
+ "$type": "RestrictedNodeContract",
+ "m_nodeId": {
+ "id": 8719869868944
+ }
+ }
+ ],
+ "slotName": "AuthorityToAutonomous_PlayerNumber Notify Event",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ }
+ ],
+ "Datums": [
+ {
+ "scriptCanvasType": {
+ "m_type": 4,
+ "m_azType": "{DB613438-34F0-5B2E-A413-77424F4254CD}"
+ },
+ "isNullPointer": true,
+ "label": "AuthorityToAutonomous_PlayerNumber Notify Event"
+ }
+ ],
+ "m_azEventEntry": {
+ "m_eventName": "AuthorityToAutonomous_PlayerNumber Notify Event",
+ "m_parameterSlotIds": [
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ }
+ ],
+ "m_parameterNames": [
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ },
+ {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ }
+ ],
+ "m_eventSlotId": {
+ "m_id": "{8C7E88EA-8FEE-45D0-9A2E-78BC4A18F508}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8724164836240
+ },
+ "Name": "SC-Node(IsNetEntityRoleAuthority)",
+ "Components": {
+ "Component_[11076422520044215441]": {
+ "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method",
+ "Id": 11076422520044215441,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{4EAB8D16-C0B4-44E1-885D-8E6754CD1A55}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "EntityId: 0",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{B6C4BE5E-CDE4-4EC7-98D0-A019CD80041C}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{1071F455-D5A0-4C7A-AF91-648A0F197885}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{BA87B4ED-9A52-4A0D-8920-CD0ED4E839EA}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Is Role Authority",
+ "DisplayDataType": {
+ "m_type": 0
+ },
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 2
+ },
+ "DataType": 1
+ }
+ ],
+ "Datums": [
+ {
+ "scriptCanvasType": {
+ "m_type": 1
+ },
+ "isNullPointer": false,
+ "$type": "EntityId",
+ "value": {
+ "id": 2901262558
+ },
+ "label": "Entity Id"
+ }
+ ],
+ "methodType": 2,
+ "methodName": "IsNetEntityRoleAuthority",
+ "className": "NetBindComponent",
+ "resultSlotIDs": [
+ {}
+ ],
+ "inputSlots": [
+ {
+ "m_id": "{4EAB8D16-C0B4-44E1-885D-8E6754CD1A55}"
+ }
+ ],
+ "prettyClassName": "NetBindComponent"
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8737049738128
+ },
+ "Name": "SC-Node(Print)",
+ "Components": {
+ "Component_[15185116749844245504]": {
+ "$type": "Print",
+ "Id": 15185116749844245504,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{F3ED8C08-D751-492A-A39A-7B7734727A5A}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "toolTip": "Input signal",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{D4FA5CCA-34FB-412B-826E-BC7050E684A6}"
+ },
+ "DynamicTypeOverride": 3,
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Value",
+ "toolTip": "Value which replaces instances of {Value} in the resulting string.",
+ "DisplayDataType": {
+ "m_type": 3
+ },
+ "DisplayGroup": {
+ "Value": 1015031923
+ },
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1,
+ "IsReference": true,
+ "VariableReference": {
+ "m_id": "{71675BCB-6546-4B79-9D5E-912982945852}"
+ }
+ },
+ {
+ "id": {
+ "m_id": "{5A4FB037-120E-4BF8-A170-D827E5DC161B}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ }
+ ],
+ "Datums": [
+ {
+ "scriptCanvasType": {
+ "m_type": 3
+ },
+ "isNullPointer": false,
+ "$type": "double",
+ "value": 0.0,
+ "label": "Value"
+ }
+ ],
+ "m_format": "AutoComponent_RPC: Sending client PlayerNumber {Value}\n",
+ "m_numericPrecision": 0,
+ "m_arrayBindingMap": [
+ {
+ "Key": 1,
+ "Value": {
+ "m_id": "{D4FA5CCA-34FB-412B-826E-BC7050E684A6}"
+ }
+ }
+ ],
+ "m_unresolvedString": [
+ "AutoComponent_RPC: Sending client PlayerNumber ",
+ {},
+ "\n"
+ ],
+ "m_formatSlotMap": {
+ "Value": {
+ "m_id": "{D4FA5CCA-34FB-412B-826E-BC7050E684A6}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8719869868944
+ },
+ "Name": "SC-Node(GetAuthorityToAutonomous_PlayerNumberEventByEntityId)",
+ "Components": {
+ "Component_[1841271567102345236]": {
+ "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method",
+ "Id": 1841271567102345236,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{B556F66D-84DB-4118-8AFE-B3D88D6D75CA}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "EntityId: 0",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{211BD78B-E01E-44F8-B44E-2FD988047BE9}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{1A6BCB27-F99F-4B6B-89CC-F2BE2A698331}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{7262E6CD-BADF-4DD0-8FCE-3A02C3F31CC8}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Event",
+ "DisplayDataType": {
+ "m_type": 4,
+ "m_azType": "{DB613438-34F0-5B2E-A413-77424F4254CD}"
+ },
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 2
+ },
+ "DataType": 1
+ }
+ ],
+ "Datums": [
+ {
+ "scriptCanvasType": {
+ "m_type": 1
+ },
+ "isNullPointer": false,
+ "$type": "EntityId",
+ "value": {
+ "id": 2901262558
+ },
+ "label": "EntityId: 0"
+ }
+ ],
+ "methodType": 2,
+ "methodName": "GetAuthorityToAutonomous_PlayerNumberEventByEntityId",
+ "className": "NetworkTestPlayerComponent",
+ "resultSlotIDs": [
+ {}
+ ],
+ "inputSlots": [
+ {
+ "m_id": "{B556F66D-84DB-4118-8AFE-B3D88D6D75CA}"
+ }
+ ],
+ "prettyClassName": "NetworkTestPlayerComponent"
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8711279934352
+ },
+ "Name": "SendScriptEvent",
+ "Components": {
+ "Component_[5751772243856660980]": {
+ "$type": "SendScriptEvent",
+ "Id": 5751772243856660980,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{2FF1A0A1-59C6-4DCF-AE1D-296BD5964D4E}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "toolTip": "Fires the specified ScriptEvent when signaled",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{F2955681-A901-432D-99A3-53818F46CDE7}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "toolTip": "Trigged after the ScriptEvent has been signaled and returns",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ }
+ ],
+ "m_version": 1,
+ "m_scriptEventAssetId": {
+ "guid": "{FE1B1992-8220-5DD3-A60A-AEC85EB91C54}"
+ },
+ "m_asset": {
+ "assetId": {
+ "guid": "{FE1B1992-8220-5DD3-A60A-AEC85EB91C54}"
+ },
+ "assetHint": "levels/multiplayer/autocomponent_rpc/globalgamedata.scriptevents"
+ },
+ "m_busId": {
+ "Value": 1375178404
+ },
+ "m_eventId": {
+ "Value": 2930121176
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8749934640016
+ },
+ "Name": "SendScriptEvent",
+ "Components": {
+ "Component_[6456267108920901297]": {
+ "$type": "SendScriptEvent",
+ "Id": 6456267108920901297,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{23DBACD8-7784-4E18-A51C-258B25DF4C19}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "toolTip": "Fires the specified ScriptEvent when signaled",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{19C850D7-7F1E-4D41-AFD9-5A4FA03D54F0}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "toolTip": "Trigged after the ScriptEvent has been signaled and returns",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{B6CA4982-245A-45F1-8AA6-3295F49DC071}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Number",
+ "DisplayDataType": {
+ "m_type": 3
+ },
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 2
+ },
+ "DataType": 1,
+ "IsReference": true,
+ "VariableReference": {
+ "m_id": "{71675BCB-6546-4B79-9D5E-912982945852}"
+ }
+ }
+ ],
+ "m_version": 1,
+ "m_eventSlotMapping": {
+ "{C7E99974-D1C0-4108-B731-120AF000060C}": {
+ "m_id": "{B6CA4982-245A-45F1-8AA6-3295F49DC071}"
+ }
+ },
+ "m_scriptEventAssetId": {
+ "guid": "{FE1B1992-8220-5DD3-A60A-AEC85EB91C54}"
+ },
+ "m_asset": {
+ "assetId": {
+ "guid": "{FE1B1992-8220-5DD3-A60A-AEC85EB91C54}"
+ },
+ "assetHint": "levels/multiplayer/autocomponent_rpc/globalgamedata.scriptevents"
+ },
+ "m_busId": {
+ "Value": 1375178404
+ },
+ "m_eventId": {
+ "Value": 242067946
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8732754770832
+ },
+ "Name": "SC-Node(Print)",
+ "Components": {
+ "Component_[6838720237293185886]": {
+ "$type": "Print",
+ "Id": 6838720237293185886,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{D206E5BC-3746-4A18-80C7-DBD335FD05FE}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "toolTip": "Input signal",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{BA146872-FBFF-4662-A569-8F1B4C8774AC}"
+ },
+ "DynamicTypeOverride": 3,
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Value",
+ "toolTip": "Value which replaces instances of {Value} in the resulting string.",
+ "DisplayDataType": {
+ "m_type": 3
+ },
+ "DisplayGroup": {
+ "Value": 1015031923
+ },
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{A4555039-973F-43F6-BC9D-CCC0C9B34252}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ }
+ ],
+ "Datums": [
+ {
+ "scriptCanvasType": {
+ "m_type": 3
+ },
+ "isNullPointer": false,
+ "$type": "double",
+ "value": 0.0,
+ "label": "Value"
+ }
+ ],
+ "m_format": "AutoComponent_RPC: I'm Player #{Value}\n",
+ "m_numericPrecision": 0,
+ "m_arrayBindingMap": [
+ {
+ "Key": 1,
+ "Value": {
+ "m_id": "{BA146872-FBFF-4662-A569-8F1B4C8774AC}"
+ }
+ }
+ ],
+ "m_unresolvedString": [
+ "AutoComponent_RPC: I'm Player #",
+ {},
+ "\n"
+ ],
+ "m_formatSlotMap": {
+ "Value": {
+ "m_id": "{BA146872-FBFF-4662-A569-8F1B4C8774AC}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8715574901648
+ },
+ "Name": "SC-Node(TimeDelayNodeableNode)",
+ "Components": {
+ "Component_[8216689437045635826]": {
+ "$type": "TimeDelayNodeableNode",
+ "Id": 8216689437045635826,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{D2337DC6-F126-4254-B296-2DE6BA03993F}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Start",
+ "DisplayGroup": {
+ "Value": 2675529103
+ },
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{5809EA65-214B-43A9-8674-B89E9ADF1AE6}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Delay",
+ "toolTip": "The amount of time to delay before the Done is signalled.",
+ "DisplayGroup": {
+ "Value": 2675529103
+ },
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{AC3B9B74-5A7A-4AC9-89AA-B255879D6F63}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "On Start",
+ "DisplayGroup": {
+ "Value": 2675529103
+ },
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{25568B15-5372-4C2D-8280-2B433251EACA}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Done",
+ "toolTip": "Signaled after waiting for the specified amount of times.",
+ "DisplayGroup": {
+ "Value": 271442091
+ },
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ },
+ "IsLatent": true
+ }
+ ],
+ "Datums": [
+ {
+ "scriptCanvasType": {
+ "m_type": 3
+ },
+ "isNullPointer": false,
+ "$type": "double",
+ "value": 1.0,
+ "label": "Delay"
+ }
+ ],
+ "nodeable": {
+ "m_timeUnits": 2
+ },
+ "slotExecutionMap": {
+ "ins": [
+ {
+ "_slotId": {
+ "m_id": "{D2337DC6-F126-4254-B296-2DE6BA03993F}"
+ },
+ "_inputs": [
+ {
+ "_slotId": {
+ "m_id": "{5809EA65-214B-43A9-8674-B89E9ADF1AE6}"
+ }
+ }
+ ],
+ "_outs": [
+ {
+ "_slotId": {
+ "m_id": "{AC3B9B74-5A7A-4AC9-89AA-B255879D6F63}"
+ },
+ "_name": "On Start",
+ "_interfaceSourceId": "{C071AF8D-5D00-0000-E074-ECBC15020000}"
+ }
+ ],
+ "_interfaceSourceId": "{C3B60A69-2ADF-0000-4062-ABA615020000}"
+ }
+ ],
+ "latents": [
+ {
+ "_slotId": {
+ "m_id": "{25568B15-5372-4C2D-8280-2B433251EACA}"
+ },
+ "_name": "Done",
+ "_interfaceSourceId": "{C3B60A69-2ADF-0000-4062-ABA615020000}"
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8741344705424
+ },
+ "Name": "SC-Node(AuthorityToAutonomous_PlayerNumberByEntityId)",
+ "Components": {
+ "Component_[8243210565080727934]": {
+ "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method",
+ "Id": 8243210565080727934,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{D8767DB8-4BD8-4907-A3A4-BE0AE4F1A774}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Source",
+ "toolTip": "The Source containing the NetworkTestPlayerComponentController",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{2B948544-DD45-4DE1-A9FC-7AFBE1CAB202}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "player_number",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1,
+ "IsReference": true,
+ "VariableReference": {
+ "m_id": "{71675BCB-6546-4B79-9D5E-912982945852}"
+ }
+ },
+ {
+ "id": {
+ "m_id": "{1FDB4A9A-D46A-49E8-B734-475230EB7C06}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{964EAD23-8DF5-47A9-BF07-1E5C7CD0CC6C}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ }
+ ],
+ "Datums": [
+ {
+ "scriptCanvasType": {
+ "m_type": 1
+ },
+ "isNullPointer": false,
+ "$type": "EntityId",
+ "value": {
+ "id": 2901262558
+ },
+ "label": "Source"
+ },
+ {
+ "scriptCanvasType": {
+ "m_type": 3
+ },
+ "isNullPointer": false,
+ "$type": "double",
+ "value": 0.0,
+ "label": "player_number"
+ }
+ ],
+ "methodType": 2,
+ "methodName": "AuthorityToAutonomous_PlayerNumberByEntityId",
+ "className": "NetworkTestPlayerComponent",
+ "resultSlotIDs": [
+ {}
+ ],
+ "inputSlots": [
+ {
+ "m_id": "{D8767DB8-4BD8-4907-A3A4-BE0AE4F1A774}"
+ },
+ {
+ "m_id": "{2B948544-DD45-4DE1-A9FC-7AFBE1CAB202}"
+ }
+ ],
+ "prettyClassName": "NetworkTestPlayerComponent"
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8745639672720
+ },
+ "Name": "SC-Node(Start)",
+ "Components": {
+ "Component_[8447409406288787781]": {
+ "$type": "Start",
+ "Id": 8447409406288787781,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{A8EA9EF2-A3A6-46B5-8D43-08EF6B6B5B32}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "toolTip": "Signaled when the entity that owns this graph is fully activated.",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8728459803536
+ },
+ "Name": "SC-Node(Gate)",
+ "Components": {
+ "Component_[8679383768392231909]": {
+ "$type": "Gate",
+ "Id": 8679383768392231909,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{3E89B67B-1EF2-4DAB-8028-59A97527F3DF}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Condition",
+ "toolTip": "If true the node will signal the Output and proceed execution",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{8AE7F430-C4A9-444E-B42A-BDDFE96C387A}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "toolTip": "Input signal",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{78C92586-C0E1-449F-8EB2-B1CE3BFC8AE7}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "True",
+ "toolTip": "Signaled if the condition provided evaluates to true.",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{47D87C86-2D61-46D3-A0FC-138F84FD352B}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "False",
+ "toolTip": "Signaled if the condition provided evaluates to false.",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ }
+ ],
+ "Datums": [
+ {
+ "scriptCanvasType": {
+ "m_type": 0
+ },
+ "isNullPointer": false,
+ "$type": "bool",
+ "value": false,
+ "label": "Condition"
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "m_connections": [
+ {
+ "Id": {
+ "id": 8754229607312
+ },
+ "Name": "srcEndpoint=(IsNetEntityRoleAuthority: Out), destEndpoint=(If: In)",
+ "Components": {
+ "Component_[3645153988172561571]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 3645153988172561571,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8724164836240
+ },
+ "slotId": {
+ "m_id": "{1071F455-D5A0-4C7A-AF91-648A0F197885}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8728459803536
+ },
+ "slotId": {
+ "m_id": "{8AE7F430-C4A9-444E-B42A-BDDFE96C387A}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8758524574608
+ },
+ "Name": "srcEndpoint=(IsNetEntityRoleAuthority: Is Role Authority), destEndpoint=(If: Condition)",
+ "Components": {
+ "Component_[17942926291787646743]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 17942926291787646743,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8724164836240
+ },
+ "slotId": {
+ "m_id": "{BA87B4ED-9A52-4A0D-8920-CD0ED4E839EA}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8728459803536
+ },
+ "slotId": {
+ "m_id": "{3E89B67B-1EF2-4DAB-8028-59A97527F3DF}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8762819541904
+ },
+ "Name": "srcEndpoint=(If: True), destEndpoint=(Send Script Event: In)",
+ "Components": {
+ "Component_[3298020356088639785]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 3298020356088639785,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8728459803536
+ },
+ "slotId": {
+ "m_id": "{78C92586-C0E1-449F-8EB2-B1CE3BFC8AE7}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8711279934352
+ },
+ "slotId": {
+ "m_id": "{2FF1A0A1-59C6-4DCF-AE1D-296BD5964D4E}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8767114509200
+ },
+ "Name": "srcEndpoint=(Send Script Event: Out), destEndpoint=(Send Script Event: In)",
+ "Components": {
+ "Component_[5482500452520221078]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 5482500452520221078,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8711279934352
+ },
+ "slotId": {
+ "m_id": "{F2955681-A901-432D-99A3-53818F46CDE7}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8749934640016
+ },
+ "slotId": {
+ "m_id": "{23DBACD8-7784-4E18-A51C-258B25DF4C19}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8771409476496
+ },
+ "Name": "srcEndpoint=(Send Script Event: Out), destEndpoint=(AuthorityToAutonomous_PlayerNumberByEntityId: In)",
+ "Components": {
+ "Component_[16156808606878296902]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 16156808606878296902,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8749934640016
+ },
+ "slotId": {
+ "m_id": "{19C850D7-7F1E-4D41-AFD9-5A4FA03D54F0}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8741344705424
+ },
+ "slotId": {
+ "m_id": "{1FDB4A9A-D46A-49E8-B734-475230EB7C06}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8775704443792
+ },
+ "Name": "srcEndpoint=(AuthorityToAutonomous_PlayerNumberByEntityId: Out), destEndpoint=(Print: In)",
+ "Components": {
+ "Component_[17367899649716276273]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 17367899649716276273,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8741344705424
+ },
+ "slotId": {
+ "m_id": "{964EAD23-8DF5-47A9-BF07-1E5C7CD0CC6C}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8737049738128
+ },
+ "slotId": {
+ "m_id": "{F3ED8C08-D751-492A-A39A-7B7734727A5A}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8779999411088
+ },
+ "Name": "srcEndpoint=(On Graph Start: Out), destEndpoint=(TimeDelay: Start)",
+ "Components": {
+ "Component_[13463448697016307967]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 13463448697016307967,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8745639672720
+ },
+ "slotId": {
+ "m_id": "{A8EA9EF2-A3A6-46B5-8D43-08EF6B6B5B32}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8715574901648
+ },
+ "slotId": {
+ "m_id": "{D2337DC6-F126-4254-B296-2DE6BA03993F}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8784294378384
+ },
+ "Name": "srcEndpoint=(GetAuthorityToAutonomous_PlayerNumberEventByEntityId: Event), destEndpoint=(AuthorityToAutonomous_PlayerNumber Notify Event: AuthorityToAutonomous_PlayerNumber Notify Event)",
+ "Components": {
+ "Component_[9477060643694737434]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 9477060643694737434,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8719869868944
+ },
+ "slotId": {
+ "m_id": "{7262E6CD-BADF-4DD0-8FCE-3A02C3F31CC8}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8706984967056
+ },
+ "slotId": {
+ "m_id": "{8C7E88EA-8FEE-45D0-9A2E-78BC4A18F508}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8788589345680
+ },
+ "Name": "srcEndpoint=(GetAuthorityToAutonomous_PlayerNumberEventByEntityId: Out), destEndpoint=(AuthorityToAutonomous_PlayerNumber Notify Event: Connect)",
+ "Components": {
+ "Component_[16543380658701699472]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 16543380658701699472,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8719869868944
+ },
+ "slotId": {
+ "m_id": "{1A6BCB27-F99F-4B6B-89CC-F2BE2A698331}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8706984967056
+ },
+ "slotId": {
+ "m_id": "{46E6B649-CAA4-4318-960D-5E4854E21BB2}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8792884312976
+ },
+ "Name": "srcEndpoint=(AuthorityToAutonomous_PlayerNumber Notify Event: player_number), destEndpoint=(Print: Value)",
+ "Components": {
+ "Component_[864863482692400383]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 864863482692400383,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8706984967056
+ },
+ "slotId": {
+ "m_id": "{82D3E2FD-ADFA-47F7-A889-D1172BF2EC49}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8732754770832
+ },
+ "slotId": {
+ "m_id": "{BA146872-FBFF-4662-A569-8F1B4C8774AC}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8797179280272
+ },
+ "Name": "srcEndpoint=(AuthorityToAutonomous_PlayerNumber Notify Event: OnEvent), destEndpoint=(Print: In)",
+ "Components": {
+ "Component_[2451057837093425972]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 2451057837093425972,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8706984967056
+ },
+ "slotId": {
+ "m_id": "{586BE222-2DEA-4E08-968F-07CA4EB96C54}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8732754770832
+ },
+ "slotId": {
+ "m_id": "{D206E5BC-3746-4A18-80C7-DBD335FD05FE}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8801474247568
+ },
+ "Name": "srcEndpoint=(On Graph Start: Out), destEndpoint=(GetAuthorityToAutonomous_PlayerNumberEventByEntityId: In)",
+ "Components": {
+ "Component_[12180981889720748145]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 12180981889720748145,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8745639672720
+ },
+ "slotId": {
+ "m_id": "{A8EA9EF2-A3A6-46B5-8D43-08EF6B6B5B32}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8719869868944
+ },
+ "slotId": {
+ "m_id": "{211BD78B-E01E-44F8-B44E-2FD988047BE9}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8805769214864
+ },
+ "Name": "srcEndpoint=(TimeDelay: Done), destEndpoint=(IsNetEntityRoleAuthority: In)",
+ "Components": {
+ "Component_[5772191552099194657]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 5772191552099194657,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8715574901648
+ },
+ "slotId": {
+ "m_id": "{25568B15-5372-4C2D-8280-2B433251EACA}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8724164836240
+ },
+ "slotId": {
+ "m_id": "{B6C4BE5E-CDE4-4EC7-98D0-A019CD80041C}"
+ }
+ }
+ }
+ }
+ }
+ ],
+ "m_scriptEventAssets": [
+ [
+ {
+ "id": 8749934640016
+ },
+ {}
+ ],
+ [
+ {
+ "id": 8711279934352
+ },
+ {}
+ ]
+ ]
+ },
+ "m_assetType": "{3E2AC8CD-713F-453E-967F-29517F331784}",
+ "versionData": {
+ "_grammarVersion": 1,
+ "_runtimeVersion": 1,
+ "_fileVersion": 1
+ },
+ "m_variableCounter": 1,
+ "GraphCanvasData": [
+ {
+ "Key": {
+ "id": 8706984967056
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "HandlerNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 820.0,
+ 620.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData",
+ "SubStyle": ".azeventhandler"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{F112D217-FAC8-4577-B67A-DFDF47842F7D}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 8711279934352
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "MethodNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 1240.0,
+ 260.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData",
+ "SubStyle": ".method"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{13BD3C1C-EDBB-419E-8465-495935414A1A}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 8715574901648
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "TimeNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 200.0,
+ 260.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{5DF902FE-B0C4-4563-B2BA-17996B24E211}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 8719869868944
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "MethodNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 380.0,
+ 620.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData",
+ "SubStyle": ".method"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{BBBE60FC-0215-4A5A-BEBE-4FC869E5EECE}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 8724164836240
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "MethodNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 500.0,
+ 260.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData",
+ "SubStyle": ".method"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{348E780E-3A4E-47C7-ACF5-C7B2CB387517}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 8728459803536
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "LogicNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 940.0,
+ 260.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{53C8DAF1-FFF3-4AF8-A7FB-BC0B4E492B37}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 8732754770832
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "StringNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 1440.0,
+ 620.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{74ED5AE1-A269-46D4-B968-FEDF513C9CF1}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 8737049738128
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "StringNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 2280.0,
+ 260.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{B91C0E41-E6B5-46DE-885F-6BC6CFB2E813}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 8741344705424
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "MethodNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 1840.0,
+ 260.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData",
+ "SubStyle": ".method"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{59FFF3C1-2D7B-47EA-AE35-ED15DCB95CC8}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 8745639672720
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "TimeNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 40.0,
+ 280.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{B4CB62D9-9965-42E2-81FF-BDADDBD14CBE}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 8749934640016
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "MethodNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 1540.0,
+ 260.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData",
+ "SubStyle": ".method"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{FD844BFD-72DA-44BA-B92A-AFDB58263B91}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 2816238339133127497
+ },
+ "Value": {
+ "ComponentData": {
+ "{5F84B500-8C45-40D1-8EFC-A5306B241444}": {
+ "$type": "SceneComponentSaveData",
+ "ViewParams": {
+ "AnchorX": 260.0,
+ "AnchorY": 479.0
+ }
+ }
+ }
+ }
+ }
+ ],
+ "StatisticsHelper": {
+ "InstanceCounter": [
+ {
+ "Key": 4199610336680704683,
+ "Value": 1
+ },
+ {
+ "Key": 4847610523576971761,
+ "Value": 1
+ },
+ {
+ "Key": 6462358712820489356,
+ "Value": 1
+ },
+ {
+ "Key": 7760188923571293852,
+ "Value": 1
+ },
+ {
+ "Key": 8065262779685207188,
+ "Value": 1
+ },
+ {
+ "Key": 8452971738487658154,
+ "Value": 1
+ },
+ {
+ "Key": 10684225535275896474,
+ "Value": 2
+ },
+ {
+ "Key": 12248403816200817622,
+ "Value": 1
+ },
+ {
+ "Key": 12248403882232298424,
+ "Value": 1
+ },
+ {
+ "Key": 16232169425081397848,
+ "Value": 1
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/AutoComponent_RPC_NetLevelEntity.scriptcanvas b/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/AutoComponent_RPC_NetLevelEntity.scriptcanvas
new file mode 100644
index 0000000000..3869dfdfcb
--- /dev/null
+++ b/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/AutoComponent_RPC_NetLevelEntity.scriptcanvas
@@ -0,0 +1,1946 @@
+{
+ "Type": "JsonSerialization",
+ "Version": 1,
+ "ClassName": "ScriptCanvasData",
+ "ClassData": {
+ "m_scriptCanvas": {
+ "Id": {
+ "id": 1685762441320719908
+ },
+ "Name": "AutoComponent_RPC_NetLevelEntity",
+ "Components": {
+ "Component_[2936040539888065977]": {
+ "$type": "{4D755CA9-AB92-462C-B24F-0B3376F19967} Graph",
+ "Id": 2936040539888065977,
+ "m_graphData": {
+ "m_nodes": [
+ {
+ "Id": {
+ "id": 56986727032248
+ },
+ "Name": "SC-Node(RepeaterNodeableNode)",
+ "Components": {
+ "Component_[11069913642528675281]": {
+ "$type": "RepeaterNodeableNode",
+ "Id": 11069913642528675281,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{07267CBA-B377-4B57-8A04-E322F8BFC07F}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Start",
+ "DisplayGroup": {
+ "Value": 2675529103
+ },
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{A9CCCCF4-BC3E-44B8-B2BB-2EEFBF475F82}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Repetitions",
+ "toolTip": "How many times to repeat.",
+ "DisplayGroup": {
+ "Value": 2675529103
+ },
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{E490B225-8A15-4CA1-9F25-6D8F9F8E398F}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Interval",
+ "toolTip": "The Interval between repetitions. If zero, all repititions execute immediately, before On Start",
+ "DisplayGroup": {
+ "Value": 2675529103
+ },
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{92077333-D7F5-4E54-80FD-0363876B5510}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "On Start",
+ "DisplayGroup": {
+ "Value": 2675529103
+ },
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{91CF89F3-906C-4860-B84E-9BD7D6842CA8}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Complete",
+ "toolTip": "Signaled upon node exit",
+ "DisplayGroup": {
+ "Value": 1114099747
+ },
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ },
+ "IsLatent": true
+ },
+ {
+ "id": {
+ "m_id": "{C1CCBA7B-A13B-4FCE-99ED-8FD1A8F72869}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Action",
+ "toolTip": "Signaled every repetition",
+ "DisplayGroup": {
+ "Value": 1204587666
+ },
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ },
+ "IsLatent": true
+ }
+ ],
+ "Datums": [
+ {
+ "scriptCanvasType": {
+ "m_type": 3
+ },
+ "isNullPointer": false,
+ "$type": "double",
+ "value": 99.0,
+ "label": "Repetitions"
+ },
+ {
+ "scriptCanvasType": {
+ "m_type": 3
+ },
+ "isNullPointer": false,
+ "$type": "double",
+ "value": 1.0,
+ "label": "Interval"
+ }
+ ],
+ "nodeable": {
+ "m_timeUnits": 2
+ },
+ "slotExecutionMap": {
+ "ins": [
+ {
+ "_slotId": {
+ "m_id": "{07267CBA-B377-4B57-8A04-E322F8BFC07F}"
+ },
+ "_inputs": [
+ {
+ "_slotId": {
+ "m_id": "{A9CCCCF4-BC3E-44B8-B2BB-2EEFBF475F82}"
+ }
+ },
+ {
+ "_slotId": {
+ "m_id": "{E490B225-8A15-4CA1-9F25-6D8F9F8E398F}"
+ }
+ }
+ ],
+ "_outs": [
+ {
+ "_slotId": {
+ "m_id": "{92077333-D7F5-4E54-80FD-0363876B5510}"
+ },
+ "_name": "On Start",
+ "_interfaceSourceId": "{60330D5B-FB7F-0000-8039-14DD7C020000}"
+ }
+ ],
+ "_interfaceSourceId": "{E1D0AF7E-837B-0000-0033-BA267C020000}"
+ }
+ ],
+ "latents": [
+ {
+ "_slotId": {
+ "m_id": "{91CF89F3-906C-4860-B84E-9BD7D6842CA8}"
+ },
+ "_name": "Complete",
+ "_interfaceSourceId": "{E1D0AF7E-837B-0000-0033-BA267C020000}"
+ },
+ {
+ "_slotId": {
+ "m_id": "{C1CCBA7B-A13B-4FCE-99ED-8FD1A8F72869}"
+ },
+ "_name": "Action",
+ "_interfaceSourceId": "{E1D0AF7E-837B-0000-0033-BA267C020000}"
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 57003906901432
+ },
+ "Name": "SC-Node(DrawTextOnEntity)",
+ "Components": {
+ "Component_[14125366736968050670]": {
+ "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method",
+ "Id": 14125366736968050670,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{6BD7BF07-D1B6-4CC2-A861-C4334AA3A025}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "EntityId: 0",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{AB0304C4-CD52-4351-A009-CD959CDA6E2B}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "String: 1",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{EB877F87-C03A-4692-ABBB-2317E98E8C6F}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Color: 2",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{E2D11762-F47C-4341-806A-DBB4FBAEC235}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Number: 3",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{1673B8A0-D4EC-4CC7-8F80-0419BB5560EB}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{5F720C70-EA4F-4883-B5BE-4278E75370E8}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ }
+ ],
+ "Datums": [
+ {
+ "scriptCanvasType": {
+ "m_type": 1
+ },
+ "isNullPointer": false,
+ "$type": "EntityId",
+ "value": {
+ "id": 2901262558
+ },
+ "label": "Entity Id"
+ },
+ {
+ "scriptCanvasType": {
+ "m_type": 5
+ },
+ "isNullPointer": false,
+ "$type": "{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9} AZStd::string",
+ "value": "AutoComponent_RPC_NetLevelEntity: I'm a client playing some superficial fx",
+ "label": "Color"
+ },
+ {
+ "scriptCanvasType": {
+ "m_type": 12
+ },
+ "isNullPointer": false,
+ "$type": "Color",
+ "value": [
+ 1.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ],
+ "label": "Color: 2"
+ },
+ {
+ "scriptCanvasType": {
+ "m_type": 3
+ },
+ "isNullPointer": false,
+ "$type": "double",
+ "value": 2.0,
+ "label": "Number: 3"
+ }
+ ],
+ "methodType": 0,
+ "methodName": "DrawTextOnEntity",
+ "className": "DebugDrawRequestBus",
+ "resultSlotIDs": [
+ {}
+ ],
+ "inputSlots": [
+ {
+ "m_id": "{6BD7BF07-D1B6-4CC2-A861-C4334AA3A025}"
+ },
+ {
+ "m_id": "{AB0304C4-CD52-4351-A009-CD959CDA6E2B}"
+ },
+ {
+ "m_id": "{EB877F87-C03A-4692-ABBB-2317E98E8C6F}"
+ },
+ {
+ "m_id": "{E2D11762-F47C-4341-806A-DBB4FBAEC235}"
+ }
+ ],
+ "prettyClassName": "DebugDrawRequestBus"
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 56999611934136
+ },
+ "Name": "SC-Node(Print)",
+ "Components": {
+ "Component_[15472692142045278273]": {
+ "$type": "Print",
+ "Id": 15472692142045278273,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{2F11CF04-DC4B-4881-8D74-AB0E51B4A278}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "toolTip": "Input signal",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{6CE4DAB2-4D8E-461E-B9B2-34338EBBAD97}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ }
+ ],
+ "m_format": "AutoComponent_RPC_NetLevelEntity: Authority sending RPC to play some fx.\n",
+ "m_unresolvedString": [
+ "AutoComponent_RPC_NetLevelEntity: Authority sending RPC to play some fx.\n"
+ ]
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 56995316966840
+ },
+ "Name": "SC-Node(Print)",
+ "Components": {
+ "Component_[15717135232290736332]": {
+ "$type": "Print",
+ "Id": 15717135232290736332,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{7CAD6E31-6218-4326-8FFB-0523F545E250}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "toolTip": "Input signal",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{C38BB068-BF1B-4734-BFFA-10B258870349}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ }
+ ],
+ "m_format": "AutoComponent_RPC_NetLevelEntity: I'm a client playing some fx.\n",
+ "m_unresolvedString": [
+ "AutoComponent_RPC_NetLevelEntity: I'm a client playing some fx.\n"
+ ]
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8318619017825
+ },
+ "Name": "SC-EventNode(AuthorityToClientNoParams_PlayFx Notify Event)",
+ "Components": {
+ "Component_[15772128920819427182]": {
+ "$type": "AzEventHandler",
+ "Id": 15772128920819427182,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{2A42C379-8E3B-46EF-BC63-C1D5395CB583}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ },
+ {
+ "$type": "ConnectionLimitContract",
+ "limit": 1
+ },
+ {
+ "$type": "RestrictedNodeContract",
+ "m_nodeId": {
+ "id": 7820402811489
+ }
+ }
+ ],
+ "slotName": "Connect",
+ "toolTip": "Connect the AZ Event to this AZ Event Handler.",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{3DB9829E-6088-49B9-A56D-4D1884C679BD}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Disconnect",
+ "toolTip": "Disconnect current AZ Event from this AZ Event Handler.",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{9AC3CF57-B648-4B43-8FCA-8576B6EA350B}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "On Connected",
+ "toolTip": "Signaled when a connection has taken place.",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{5FB8D529-6FC6-4543-99B5-5B147EBD7BE6}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "On Disconnected",
+ "toolTip": "Signaled when this event handler is disconnected.",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{0481BBFE-D31E-421F-A6C2-8A7AF3012545}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "OnEvent",
+ "toolTip": "Triggered when the AZ Event invokes Signal() function.",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ },
+ "IsLatent": true
+ },
+ {
+ "id": {
+ "m_id": "{5F809F1C-ED4E-4391-9E33-AD3B64561A40}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ },
+ {
+ "$type": "ConnectionLimitContract",
+ "limit": 1
+ },
+ {
+ "$type": "RestrictedNodeContract",
+ "m_nodeId": {
+ "id": 7820402811489
+ }
+ }
+ ],
+ "slotName": "AuthorityToClientNoParams_PlayFx Notify Event",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ }
+ ],
+ "Datums": [
+ {
+ "scriptCanvasType": {
+ "m_type": 4,
+ "m_azType": "{F429F985-AF00-529B-8449-16E56694E5F9}"
+ },
+ "isNullPointer": true,
+ "label": "AuthorityToClientNoParams_PlayFx Notify Event"
+ }
+ ],
+ "m_azEventEntry": {
+ "m_eventName": "AuthorityToClientNoParams_PlayFx Notify Event",
+ "m_eventSlotId": {
+ "m_id": "{5F809F1C-ED4E-4391-9E33-AD3B64561A40}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 56991021999544
+ },
+ "Name": "SC-Node(Print)",
+ "Components": {
+ "Component_[15785913678997669879]": {
+ "$type": "Print",
+ "Id": 15785913678997669879,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{8E1B9705-148A-42E4-831E-D7B2877358E3}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "toolTip": "Input signal",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{CEBD2B9C-7DBA-486A-88DB-19F9C406B18E}"
+ },
+ "DynamicTypeOverride": 3,
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Value",
+ "toolTip": "Value which replaces instances of {Value} in the resulting string.",
+ "DisplayDataType": {
+ "m_type": 5
+ },
+ "DisplayGroup": {
+ "Value": 1015031923
+ },
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{E9B979F9-D682-4B58-8E88-6102387FE70B}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ }
+ ],
+ "Datums": [
+ {
+ "scriptCanvasType": {
+ "m_type": 5
+ },
+ "isNullPointer": false,
+ "$type": "{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9} AZStd::string",
+ "value": "",
+ "label": "Value"
+ }
+ ],
+ "m_format": "AutoComponent_RPC_NetLevelEntity Activated on entity: {Value}\n",
+ "m_arrayBindingMap": [
+ {
+ "Key": 1,
+ "Value": {
+ "m_id": "{CEBD2B9C-7DBA-486A-88DB-19F9C406B18E}"
+ }
+ }
+ ],
+ "m_unresolvedString": [
+ "AutoComponent_RPC_NetLevelEntity Activated on entity: ",
+ {},
+ "\n"
+ ],
+ "m_formatSlotMap": {
+ "Value": {
+ "m_id": "{CEBD2B9C-7DBA-486A-88DB-19F9C406B18E}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 57025381737912
+ },
+ "Name": "SC-Node(Start)",
+ "Components": {
+ "Component_[1888047318201703857]": {
+ "$type": "Start",
+ "Id": 1888047318201703857,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{28664064-2483-465A-9BB1-4E1890048CDF}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "toolTip": "Signaled when the entity that owns this graph is fully activated.",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8310662318335
+ },
+ "Name": "SC-Node(GetEntityName)",
+ "Components": {
+ "Component_[2232030369305027010]": {
+ "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method",
+ "Id": 2232030369305027010,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{F69C5762-0CAB-4A54-9C81-C99CDB73C834}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "EntityId: 0",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{03554C56-8237-4C19-B9F8-87DEA1AC3ED0}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{6ECBD749-25FE-4813-B34E-EF46BC09E616}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{36D47097-8F0C-4CBD-8DE2-32F4754C569F}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "String",
+ "DisplayDataType": {
+ "m_type": 5
+ },
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 2
+ },
+ "DataType": 1
+ }
+ ],
+ "Datums": [
+ {
+ "scriptCanvasType": {
+ "m_type": 1
+ },
+ "isNullPointer": false,
+ "$type": "EntityId",
+ "value": {
+ "id": 2901262558
+ },
+ "label": "Entity Id"
+ }
+ ],
+ "methodType": 0,
+ "methodName": "GetEntityName",
+ "className": "GameEntityContextRequestBus",
+ "resultSlotIDs": [
+ {}
+ ],
+ "inputSlots": [
+ {
+ "m_id": "{F69C5762-0CAB-4A54-9C81-C99CDB73C834}"
+ }
+ ],
+ "prettyClassName": "GameEntityContextRequestBus"
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 8400576252253
+ },
+ "Name": "SC-Node(AuthorityToClientNoParams_PlayFxByEntityId)",
+ "Components": {
+ "Component_[6332803108634970671]": {
+ "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method",
+ "Id": 6332803108634970671,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{87B7266B-D7B1-4CAD-9898-4D7F0274DAB0}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Source",
+ "toolTip": "The Source containing the NetworkTestPlayerComponentController",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{AB0D7C00-A334-449A-AC56-EA3167AB8900}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{A52302D6-9DF9-45C2-960D-19BF90A4A931}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ }
+ ],
+ "Datums": [
+ {
+ "scriptCanvasType": {
+ "m_type": 1
+ },
+ "isNullPointer": false,
+ "$type": "EntityId",
+ "value": {
+ "id": 2901262558
+ },
+ "label": "Source"
+ }
+ ],
+ "methodType": 2,
+ "methodName": "AuthorityToClientNoParams_PlayFxByEntityId",
+ "className": "NetworkTestPlayerComponent",
+ "resultSlotIDs": [
+ {}
+ ],
+ "inputSlots": [
+ {
+ "m_id": "{87B7266B-D7B1-4CAD-9898-4D7F0274DAB0}"
+ }
+ ],
+ "prettyClassName": "NetworkTestPlayerComponent"
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 57012496836024
+ },
+ "Name": "SC-Node(TimeDelayNodeableNode)",
+ "Components": {
+ "Component_[8951348653904382148]": {
+ "$type": "TimeDelayNodeableNode",
+ "Id": 8951348653904382148,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{EA0DF0AE-2FF7-4670-8D99-7CF863038E68}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Start",
+ "DisplayGroup": {
+ "Value": 2675529103
+ },
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{9C6D8500-B49B-4407-B2EB-40B1CD4CE762}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Delay",
+ "toolTip": "The amount of time to delay before the Done is signalled.",
+ "DisplayGroup": {
+ "Value": 2675529103
+ },
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{FE2A3D2F-7AC2-431D-B80C-C363DB475919}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "On Start",
+ "DisplayGroup": {
+ "Value": 2675529103
+ },
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{158B30BE-BD39-40AE-A8A8-F0E5694F0180}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Done",
+ "toolTip": "Signaled after waiting for the specified amount of times.",
+ "DisplayGroup": {
+ "Value": 271442091
+ },
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ },
+ "IsLatent": true
+ }
+ ],
+ "Datums": [
+ {
+ "scriptCanvasType": {
+ "m_type": 3
+ },
+ "isNullPointer": false,
+ "$type": "double",
+ "value": 1.0,
+ "label": "Delay"
+ }
+ ],
+ "nodeable": {
+ "m_timeUnits": 2
+ },
+ "slotExecutionMap": {
+ "ins": [
+ {
+ "_slotId": {
+ "m_id": "{EA0DF0AE-2FF7-4670-8D99-7CF863038E68}"
+ },
+ "_inputs": [
+ {
+ "_slotId": {
+ "m_id": "{9C6D8500-B49B-4407-B2EB-40B1CD4CE762}"
+ }
+ }
+ ],
+ "_outs": [
+ {
+ "_slotId": {
+ "m_id": "{FE2A3D2F-7AC2-431D-B80C-C363DB475919}"
+ },
+ "_name": "On Start",
+ "_interfaceSourceId": "{4C400000-7C02-0000-B86E-0FACE0000000}"
+ }
+ ],
+ "_interfaceSourceId": "{24000000-0000-0000-0000-F421FC7F0000}"
+ }
+ ],
+ "latents": [
+ {
+ "_slotId": {
+ "m_id": "{158B30BE-BD39-40AE-A8A8-F0E5694F0180}"
+ },
+ "_name": "Done",
+ "_interfaceSourceId": "{24000000-0000-0000-0000-F421FC7F0000}"
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 7820402811489
+ },
+ "Name": "SC-Node(GetAuthorityToClientNoParams_PlayFxEventByEntityId)",
+ "Components": {
+ "Component_[9263945554457190064]": {
+ "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method",
+ "Id": 9263945554457190064,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{F22A7438-E72F-4757-90D9-99F03C91E10D}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "EntityId: 0",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{510F56FD-6778-4DB8-BDDE-258335431CC6}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{94C2AF04-6BFA-4E5A-9490-C7479A7AF61E}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{9C6DDF96-6BF0-45ED-B15F-2E6C2FF5F886}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Event<>",
+ "DisplayDataType": {
+ "m_type": 4,
+ "m_azType": "{F429F985-AF00-529B-8449-16E56694E5F9}"
+ },
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 2
+ },
+ "DataType": 1
+ }
+ ],
+ "Datums": [
+ {
+ "scriptCanvasType": {
+ "m_type": 1
+ },
+ "isNullPointer": false,
+ "$type": "EntityId",
+ "value": {
+ "id": 2901262558
+ },
+ "label": "EntityId: 0"
+ }
+ ],
+ "methodType": 2,
+ "methodName": "GetAuthorityToClientNoParams_PlayFxEventByEntityId",
+ "className": "NetworkTestPlayerComponent",
+ "resultSlotIDs": [
+ {}
+ ],
+ "inputSlots": [
+ {
+ "m_id": "{F22A7438-E72F-4757-90D9-99F03C91E10D}"
+ }
+ ],
+ "prettyClassName": "NetworkTestPlayerComponent"
+ }
+ }
+ }
+ ],
+ "m_connections": [
+ {
+ "Id": {
+ "id": 57029676705208
+ },
+ "Name": "srcEndpoint=(On Graph Start: Out), destEndpoint=(TimeDelay: Start)",
+ "Components": {
+ "Component_[5204535376548158590]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 5204535376548158590,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 57025381737912
+ },
+ "slotId": {
+ "m_id": "{28664064-2483-465A-9BB1-4E1890048CDF}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 57012496836024
+ },
+ "slotId": {
+ "m_id": "{EA0DF0AE-2FF7-4670-8D99-7CF863038E68}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 57055446508984
+ },
+ "Name": "srcEndpoint=(TimeDelay: Done), destEndpoint=(Repeater: Start)",
+ "Components": {
+ "Component_[6292481678297438578]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 6292481678297438578,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 57012496836024
+ },
+ "slotId": {
+ "m_id": "{158B30BE-BD39-40AE-A8A8-F0E5694F0180}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 56986727032248
+ },
+ "slotId": {
+ "m_id": "{07267CBA-B377-4B57-8A04-E322F8BFC07F}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 9392713697629
+ },
+ "Name": "srcEndpoint=(Repeater: Action), destEndpoint=(AuthorityToClientNoParams_PlayFxByEntityId: In)",
+ "Components": {
+ "Component_[17811480012084226596]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 17811480012084226596,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 56986727032248
+ },
+ "slotId": {
+ "m_id": "{C1CCBA7B-A13B-4FCE-99ED-8FD1A8F72869}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8400576252253
+ },
+ "slotId": {
+ "m_id": "{AB0D7C00-A334-449A-AC56-EA3167AB8900}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 10269167405311
+ },
+ "Name": "srcEndpoint=(GetEntityName: String), destEndpoint=(Print: Value)",
+ "Components": {
+ "Component_[11931728297561282182]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 11931728297561282182,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8310662318335
+ },
+ "slotId": {
+ "m_id": "{36D47097-8F0C-4CBD-8DE2-32F4754C569F}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 56991021999544
+ },
+ "slotId": {
+ "m_id": "{CEBD2B9C-7DBA-486A-88DB-19F9C406B18E}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 11042261518591
+ },
+ "Name": "srcEndpoint=(GetEntityName: Out), destEndpoint=(Print: In)",
+ "Components": {
+ "Component_[5559381044656171146]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 5559381044656171146,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8310662318335
+ },
+ "slotId": {
+ "m_id": "{6ECBD749-25FE-4813-B34E-EF46BC09E616}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 56991021999544
+ },
+ "slotId": {
+ "m_id": "{8E1B9705-148A-42E4-831E-D7B2877358E3}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 36365388695807
+ },
+ "Name": "srcEndpoint=(TimeDelay: Done), destEndpoint=(GetEntityName: In)",
+ "Components": {
+ "Component_[5574600651313925988]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 5574600651313925988,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 57012496836024
+ },
+ "slotId": {
+ "m_id": "{158B30BE-BD39-40AE-A8A8-F0E5694F0180}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8310662318335
+ },
+ "slotId": {
+ "m_id": "{03554C56-8237-4C19-B9F8-87DEA1AC3ED0}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 9022993654369
+ },
+ "Name": "srcEndpoint=(GetAuthorityToClientNoParams_PlayFxEventByEntityId: Event<>), destEndpoint=(AuthorityToClientNoParams_PlayFx Notify Event: AuthorityToClientNoParams_PlayFx Notify Event)",
+ "Components": {
+ "Component_[4910818715692868417]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 4910818715692868417,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 7820402811489
+ },
+ "slotId": {
+ "m_id": "{9C6DDF96-6BF0-45ED-B15F-2E6C2FF5F886}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8318619017825
+ },
+ "slotId": {
+ "m_id": "{5F809F1C-ED4E-4391-9E33-AD3B64561A40}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 9078828229217
+ },
+ "Name": "srcEndpoint=(GetAuthorityToClientNoParams_PlayFxEventByEntityId: Out), destEndpoint=(AuthorityToClientNoParams_PlayFx Notify Event: Connect)",
+ "Components": {
+ "Component_[16758724763058723803]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 16758724763058723803,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 7820402811489
+ },
+ "slotId": {
+ "m_id": "{94C2AF04-6BFA-4E5A-9490-C7479A7AF61E}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 8318619017825
+ },
+ "slotId": {
+ "m_id": "{2A42C379-8E3B-46EF-BC63-C1D5395CB583}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 9808972669537
+ },
+ "Name": "srcEndpoint=(TimeDelay: Done), destEndpoint=(GetAuthorityToClientNoParams_PlayFxEventByEntityId: In)",
+ "Components": {
+ "Component_[597205010205160938]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 597205010205160938,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 57012496836024
+ },
+ "slotId": {
+ "m_id": "{158B30BE-BD39-40AE-A8A8-F0E5694F0180}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 7820402811489
+ },
+ "slotId": {
+ "m_id": "{510F56FD-6778-4DB8-BDDE-258335431CC6}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 10148275085921
+ },
+ "Name": "srcEndpoint=(AuthorityToClientNoParams_PlayFx Notify Event: OnEvent), destEndpoint=(Print: In)",
+ "Components": {
+ "Component_[1594149632687531010]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 1594149632687531010,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8318619017825
+ },
+ "slotId": {
+ "m_id": "{0481BBFE-D31E-421F-A6C2-8A7AF3012545}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 56995316966840
+ },
+ "slotId": {
+ "m_id": "{7CAD6E31-6218-4326-8FFB-0523F545E250}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 10629311423073
+ },
+ "Name": "srcEndpoint=(AuthorityToClientNoParams_PlayFx Notify Event: OnEvent), destEndpoint=(DrawTextOnEntity: In)",
+ "Components": {
+ "Component_[17976200298405988971]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 17976200298405988971,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 8318619017825
+ },
+ "slotId": {
+ "m_id": "{0481BBFE-D31E-421F-A6C2-8A7AF3012545}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 57003906901432
+ },
+ "slotId": {
+ "m_id": "{1673B8A0-D4EC-4CC7-8F80-0419BB5560EB}"
+ }
+ }
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 42045766425613
+ },
+ "Name": "srcEndpoint=(Repeater: Action), destEndpoint=(Print: In)",
+ "Components": {
+ "Component_[1911118463107071864]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 1911118463107071864,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 56986727032248
+ },
+ "slotId": {
+ "m_id": "{C1CCBA7B-A13B-4FCE-99ED-8FD1A8F72869}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 56999611934136
+ },
+ "slotId": {
+ "m_id": "{2F11CF04-DC4B-4881-8D74-AB0E51B4A278}"
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ "m_assetType": "{3E2AC8CD-713F-453E-967F-29517F331784}",
+ "versionData": {
+ "_grammarVersion": 1,
+ "_runtimeVersion": 1,
+ "_fileVersion": 1
+ },
+ "GraphCanvasData": [
+ {
+ "Key": {
+ "id": 7820402811489
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "MethodNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ -100.0,
+ 400.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData",
+ "SubStyle": ".method"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{F35F8202-B5EE-4ADD-9FF6-AF214A094266}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 8310662318335
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "MethodNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 80.0,
+ -320.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData",
+ "SubStyle": ".method"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{346AFC26-B2EF-4495-AA1A-347BF77CB99D}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 8318619017825
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "HandlerNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 340.0,
+ 400.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData",
+ "SubStyle": ".azeventhandler"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{67499699-CA73-48B4-87E0-C66F4A3EA7CB}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 8400576252253
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "MethodNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 420.0,
+ -60.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData",
+ "SubStyle": ".method"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{2B6329F7-4CE7-4E01-B1A4-1FFCAB2D0B72}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 56986727032248
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "DefaultNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 80.0,
+ -60.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{41B7477C-D5B9-49AC-AFA3-AAAE2A6ED7C5}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 56991021999544
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "StringNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 540.0,
+ -320.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{0CF0846C-1D21-4B33-8723-1538FD4FD04A}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 56995316966840
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "StringNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 800.0,
+ 260.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{0D04EBA6-E1E7-4DF7-BAA9-CC87F4689CD2}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 56999611934136
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "StringNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 420.0,
+ 100.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{A4FDCB87-B021-48B9-ABCB-AECA986B33D6}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 57003906901432
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "MethodNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 800.0,
+ 460.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData",
+ "SubStyle": ".method"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{82D0ED1B-98D3-4AEF-B1DA-2F27CACD3A4D}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 57012496836024
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "DefaultNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ -220.0,
+ -40.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{D3F081D7-40C1-4C31-B298-B18C6AFDFD25}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 57025381737912
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "TimeNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ -380.0,
+ -20.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{675C7E90-B89E-4347-A3C6-B8D12B6EA698}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 1685762441320719908
+ },
+ "Value": {
+ "ComponentData": {
+ "{5F84B500-8C45-40D1-8EFC-A5306B241444}": {
+ "$type": "SceneComponentSaveData",
+ "ViewParams": {
+ "AnchorX": -349.0,
+ "AnchorY": 10.0
+ }
+ }
+ }
+ }
+ }
+ ],
+ "StatisticsHelper": {
+ "InstanceCounter": [
+ {
+ "Key": 4199610336680704683,
+ "Value": 1
+ },
+ {
+ "Key": 4847610523576971761,
+ "Value": 1
+ },
+ {
+ "Key": 6462358712820489356,
+ "Value": 1
+ },
+ {
+ "Key": 7087687843968394353,
+ "Value": 1
+ },
+ {
+ "Key": 8679770052035517025,
+ "Value": 1
+ },
+ {
+ "Key": 10684225535275896474,
+ "Value": 3
+ },
+ {
+ "Key": 11983076003173356132,
+ "Value": 1
+ },
+ {
+ "Key": 13774516196858047560,
+ "Value": 1
+ },
+ {
+ "Key": 13774516226790665785,
+ "Value": 1
+ }
+ ]
+ }
+ },
+ "Component_[630514155173445772]": {
+ "$type": "EditorGraphVariableManagerComponent",
+ "Id": 630514155173445772
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/GlobalGameData.scriptcanvas b/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/GlobalGameData.scriptcanvas
new file mode 100644
index 0000000000..3ba5cc6b7d
--- /dev/null
+++ b/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/GlobalGameData.scriptcanvas
@@ -0,0 +1,662 @@
+{
+ "Type": "JsonSerialization",
+ "Version": 1,
+ "ClassName": "ScriptCanvasData",
+ "ClassData": {
+ "m_scriptCanvas": {
+ "Id": {
+ "id": 17732469402520
+ },
+ "Name": "Untitled-1",
+ "Components": {
+ "Component_[16492301523567686923]": {
+ "$type": "{4D755CA9-AB92-462C-B24F-0B3376F19967} Graph",
+ "Id": 16492301523567686923,
+ "m_graphData": {
+ "m_nodes": [
+ {
+ "Id": {
+ "id": 17741059337112
+ },
+ "Name": "SC-Node(OperatorAdd)",
+ "Components": {
+ "Component_[11612963594766700030]": {
+ "$type": "OperatorAdd",
+ "Id": 11612963594766700030,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{B7529112-C29F-45F0-811C-DB8EE18EB8B8}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{49618851-F6B2-4B90-BFDF-ADBAAA84BBA4}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{4612C904-82DF-4B48-8485-4C878AF9A4D1}"
+ },
+ "DynamicTypeOverride": 3,
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ },
+ {
+ "$type": "MathOperatorContract",
+ "NativeTypes": [
+ {
+ "m_type": 3
+ },
+ {
+ "m_type": 6
+ },
+ {
+ "m_type": 8
+ },
+ {
+ "m_type": 9
+ },
+ {
+ "m_type": 10
+ },
+ {
+ "m_type": 11
+ },
+ {
+ "m_type": 12
+ },
+ {
+ "m_type": 14
+ },
+ {
+ "m_type": 15
+ }
+ ]
+ }
+ ],
+ "slotName": "Number",
+ "toolTip": "An operand to use in performing the specified Operation",
+ "DisplayDataType": {
+ "m_type": 3
+ },
+ "DisplayGroup": {
+ "Value": 1114760223
+ },
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DynamicGroup": {
+ "Value": 1114760223
+ },
+ "DataType": 1,
+ "IsReference": true,
+ "VariableReference": {
+ "m_id": "{8451E795-6A0E-44CE-81FD-AEF0EE5B0400}"
+ }
+ },
+ {
+ "id": {
+ "m_id": "{610B3BFB-9043-47A0-9694-5F14A1947E36}"
+ },
+ "DynamicTypeOverride": 3,
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ },
+ {
+ "$type": "MathOperatorContract",
+ "NativeTypes": [
+ {
+ "m_type": 3
+ },
+ {
+ "m_type": 6
+ },
+ {
+ "m_type": 8
+ },
+ {
+ "m_type": 9
+ },
+ {
+ "m_type": 10
+ },
+ {
+ "m_type": 11
+ },
+ {
+ "m_type": 12
+ },
+ {
+ "m_type": 14
+ },
+ {
+ "m_type": 15
+ }
+ ]
+ }
+ ],
+ "slotName": "Number",
+ "toolTip": "An operand to use in performing the specified Operation",
+ "DisplayDataType": {
+ "m_type": 3
+ },
+ "DisplayGroup": {
+ "Value": 1114760223
+ },
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DynamicGroup": {
+ "Value": 1114760223
+ },
+ "DataType": 1
+ },
+ {
+ "id": {
+ "m_id": "{36FFF1AB-C208-47CB-8271-436C85E0AE42}"
+ },
+ "DynamicTypeOverride": 3,
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ },
+ {
+ "$type": "MathOperatorContract",
+ "NativeTypes": [
+ {
+ "m_type": 3
+ },
+ {
+ "m_type": 6
+ },
+ {
+ "m_type": 8
+ },
+ {
+ "m_type": 9
+ },
+ {
+ "m_type": 10
+ },
+ {
+ "m_type": 11
+ },
+ {
+ "m_type": 12
+ },
+ {
+ "m_type": 14
+ },
+ {
+ "m_type": 15
+ }
+ ]
+ }
+ ],
+ "slotName": "Result",
+ "toolTip": "The result of the specified operation",
+ "DisplayDataType": {
+ "m_type": 3
+ },
+ "DisplayGroup": {
+ "Value": 1114760223
+ },
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 2
+ },
+ "DynamicGroup": {
+ "Value": 1114760223
+ },
+ "DataType": 1,
+ "IsReference": true,
+ "VariableReference": {
+ "m_id": "{8451E795-6A0E-44CE-81FD-AEF0EE5B0400}"
+ }
+ }
+ ],
+ "Datums": [
+ {
+ "isOverloadedStorage": false,
+ "scriptCanvasType": {
+ "m_type": 3
+ },
+ "isNullPointer": false,
+ "$type": "double",
+ "value": 0.0,
+ "label": "Number"
+ },
+ {
+ "isOverloadedStorage": false,
+ "scriptCanvasType": {
+ "m_type": 3
+ },
+ "isNullPointer": false,
+ "$type": "double",
+ "value": 1.0,
+ "label": "Number"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 17736764369816
+ },
+ "Name": "ReceiveScriptEvent",
+ "Components": {
+ "Component_[16408183651077237195]": {
+ "$type": "ReceiveScriptEvent",
+ "Id": 16408183651077237195,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{8DC10581-B8DF-473C-9C75-996111DBF560}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Connect",
+ "toolTip": "Connect this event handler to the specified entity.",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{E60D1951-E56D-41F8-84C5-AD0BA803DD51}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Disconnect",
+ "toolTip": "Disconnect this event handler.",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{1BCE6CAC-B1C0-43FA-B4F5-E9A34D5064E5}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "OnConnected",
+ "toolTip": "Signaled when a connection has taken place.",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{FEB42E9A-D562-4BBD-90AB-32255124BFE8}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "OnDisconnected",
+ "toolTip": "Signaled when this event handler is disconnected.",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{C9EF936B-8C74-42B4-8793-67FC7FD3BCBC}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "OnFailure",
+ "toolTip": "Signaled when it is not possible to connect this handler.",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{76985C7A-761A-4CEF-9F55-6DD2B136317A}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "ExecutionSlot:NewPlayerScriptActive",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ },
+ "IsLatent": true
+ },
+ {
+ "id": {
+ "m_id": "{5CD8E1E9-6192-4B7D-9C2C-6C18BE99CF44}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Number",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 2
+ },
+ "DataType": 1,
+ "IsReference": true,
+ "VariableReference": {
+ "m_id": "{8451E795-6A0E-44CE-81FD-AEF0EE5B0400}"
+ }
+ },
+ {
+ "id": {
+ "m_id": "{9FDB71AA-0F19-406D-82CA-508A2CA10F95}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "ExecutionSlot:GetNumberOfActivePlayers",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ },
+ "IsLatent": true
+ }
+ ],
+ "Datums": [
+ {
+ "isOverloadedStorage": false,
+ "scriptCanvasType": {
+ "m_type": 3
+ },
+ "isNullPointer": false,
+ "$type": "double",
+ "value": 0.0,
+ "label": "Number"
+ }
+ ],
+ "m_version": 1,
+ "m_eventMap": [
+ {
+ "Key": {
+ "Value": 242067946
+ },
+ "Value": {
+ "m_scriptEventAssetId": {
+ "guid": "{FE1B1992-8220-5DD3-A60A-AEC85EB91C54}"
+ },
+ "m_eventName": "GetNumberOfActivePlayers",
+ "m_eventSlotId": {
+ "m_id": "{9FDB71AA-0F19-406D-82CA-508A2CA10F95}"
+ },
+ "m_resultSlotId": {
+ "m_id": "{5CD8E1E9-6192-4B7D-9C2C-6C18BE99CF44}"
+ }
+ }
+ },
+ {
+ "Key": {
+ "Value": 2930121176
+ },
+ "Value": {
+ "m_scriptEventAssetId": {
+ "guid": "{FE1B1992-8220-5DD3-A60A-AEC85EB91C54}"
+ },
+ "m_eventName": "NewPlayerScriptActive",
+ "m_eventSlotId": {
+ "m_id": "{76985C7A-761A-4CEF-9F55-6DD2B136317A}"
+ }
+ }
+ }
+ ],
+ "m_eventSlotMapping": {
+ "{155BF981-AD70-4D29-81A6-1517FAE59FB1}": {
+ "m_id": "{5CD8E1E9-6192-4B7D-9C2C-6C18BE99CF44}"
+ },
+ "{65D394D3-F90D-4F10-94BF-F5E1581CF2CF}": {
+ "m_id": "{76985C7A-761A-4CEF-9F55-6DD2B136317A}"
+ },
+ "{67784749-9B41-429C-9C97-3D296182EB67}": {
+ "m_id": "{9FDB71AA-0F19-406D-82CA-508A2CA10F95}"
+ }
+ },
+ "m_scriptEventAssetId": {
+ "guid": "{FE1B1992-8220-5DD3-A60A-AEC85EB91C54}"
+ },
+ "m_asset": {
+ "assetId": {
+ "guid": "{FE1B1992-8220-5DD3-A60A-AEC85EB91C54}"
+ },
+ "assetHint": "levels/multiplayer/autocomponent_rpc/globalgamedata.scriptevents"
+ }
+ }
+ }
+ }
+ ],
+ "m_connections": [
+ {
+ "Id": {
+ "id": 17745354304408
+ },
+ "Name": "srcEndpoint=(Receive Script Event: ExecutionSlot:NewPlayerScriptActive), destEndpoint=(Add (+): In)",
+ "Components": {
+ "Component_[8782209668839578826]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 8782209668839578826,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 17736764369816
+ },
+ "slotId": {
+ "m_id": "{76985C7A-761A-4CEF-9F55-6DD2B136317A}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 17741059337112
+ },
+ "slotId": {
+ "m_id": "{B7529112-C29F-45F0-811C-DB8EE18EB8B8}"
+ }
+ }
+ }
+ }
+ }
+ ],
+ "m_scriptEventAssets": [
+ [
+ {
+ "id": 17736764369816
+ },
+ {}
+ ]
+ ]
+ },
+ "m_assetType": "{3E2AC8CD-713F-453E-967F-29517F331784}",
+ "versionData": {
+ "_grammarVersion": 1,
+ "_runtimeVersion": 1,
+ "_fileVersion": 1
+ },
+ "m_variableCounter": 1,
+ "GraphCanvasData": [
+ {
+ "Key": {
+ "id": 17732469402520
+ },
+ "Value": {
+ "ComponentData": {
+ "{5F84B500-8C45-40D1-8EFC-A5306B241444}": {
+ "$type": "SceneComponentSaveData"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 17736764369816
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ -360.0,
+ -60.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{C419A1CF-CBA8-416B-BF6C-4B574C3E59E3}"
+ },
+ "{D8BBE799-7E4D-495A-B69A-1E3940670891}": {
+ "$type": "ScriptEventReceiverHandlerNodeDescriptorSaveData",
+ "EventNames": [
+ [
+ {
+ "Value": 242067946
+ },
+ "GetNumberOfActivePlayers"
+ ],
+ [
+ {
+ "Value": 2930121176
+ },
+ "NewPlayerScriptActive"
+ ]
+ ]
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 17741059337112
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "MathNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 120.0,
+ 100.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{0D0751AD-8164-4196-9C09-8CDB9AAA296F}"
+ }
+ }
+ }
+ }
+ ],
+ "StatisticsHelper": {
+ "InstanceCounter": [
+ {
+ "Key": 1244476766431948410,
+ "Value": 1
+ },
+ {
+ "Key": 1678857390775488101,
+ "Value": 1
+ },
+ {
+ "Key": 1678857392390856307,
+ "Value": 1
+ }
+ ]
+ }
+ },
+ "Component_[16498171485036643402]": {
+ "$type": "EditorGraphVariableManagerComponent",
+ "Id": 16498171485036643402,
+ "m_variableData": {
+ "m_nameVariableMap": [
+ {
+ "Key": {
+ "m_id": "{8451E795-6A0E-44CE-81FD-AEF0EE5B0400}"
+ },
+ "Value": {
+ "Datum": {
+ "isOverloadedStorage": false,
+ "scriptCanvasType": {
+ "m_type": 3
+ },
+ "isNullPointer": false,
+ "$type": "double",
+ "value": 0.0
+ },
+ "VariableId": {
+ "m_id": "{8451E795-6A0E-44CE-81FD-AEF0EE5B0400}"
+ },
+ "VariableName": "ActivePlayerCount"
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/GlobalGameData.scriptevents b/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/GlobalGameData.scriptevents
new file mode 100644
index 0000000000..059713e14b
--- /dev/null
+++ b/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/GlobalGameData.scriptevents
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/Player.prefab b/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/Player.prefab
new file mode 100644
index 0000000000..2653809dda
--- /dev/null
+++ b/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/Player.prefab
@@ -0,0 +1,195 @@
+{
+ "ContainerEntity": {
+ "Id": "ContainerEntity",
+ "Name": "Player",
+ "Components": {
+ "Component_[10603663676997462041]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 10603663676997462041
+ },
+ "Component_[11066377844757909329]": {
+ "$type": "EditorPrefabComponent",
+ "Id": 11066377844757909329
+ },
+ "Component_[11664640320098005944]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11664640320098005944
+ },
+ "Component_[12551690377468870725]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 12551690377468870725,
+ "Parent Entity": ""
+ },
+ "Component_[16402163080075698011]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 16402163080075698011
+ },
+ "Component_[3491366785918494447]": {
+ "$type": "EditorLockComponent",
+ "Id": 3491366785918494447
+ },
+ "Component_[4830373679514129871]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 4830373679514129871
+ },
+ "Component_[5144323498211834874]": {
+ "$type": "SelectionComponent",
+ "Id": 5144323498211834874
+ },
+ "Component_[5267607163086533733]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 5267607163086533733
+ },
+ "Component_[6678300504118618849]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 6678300504118618849
+ },
+ "Component_[8384628950786300469]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 8384628950786300469,
+ "Child Entity Order": [
+ "Entity_[10070247746456]"
+ ]
+ }
+ }
+ },
+ "Entities": {
+ "Entity_[10070247746456]": {
+ "Id": "Entity_[10070247746456]",
+ "Name": "Player",
+ "Components": {
+ "Component_[1059478843478789313]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 1059478843478789313,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 9878555871810913249
+ },
+ {
+ "ComponentId": 11481641385923146202,
+ "SortIndex": 1
+ },
+ {
+ "ComponentId": 11440172471478606933,
+ "SortIndex": 2
+ },
+ {
+ "ComponentId": 17461691807054668218,
+ "SortIndex": 3
+ },
+ {
+ "ComponentId": 15530420875454157766,
+ "SortIndex": 4
+ },
+ {
+ "ComponentId": 10596595655489113153,
+ "SortIndex": 5
+ }
+ ]
+ },
+ "Component_[10596595655489113153]": {
+ "$type": "EditorScriptCanvasComponent",
+ "Id": 10596595655489113153,
+ "m_name": "AutoComponent_RPC",
+ "m_assetHolder": {
+ "m_asset": {
+ "assetId": {
+ "guid": "{5ED120C4-07DC-56F1-80A7-37BFC98FD74E}"
+ },
+ "assetHint": "levels/multiplayer/autocomponent_rpc/autocomponent_rpc.scriptcanvas"
+ }
+ },
+ "runtimeDataIsValid": true,
+ "runtimeDataOverrides": {
+ "source": {
+ "assetId": {
+ "guid": "{5ED120C4-07DC-56F1-80A7-37BFC98FD74E}"
+ },
+ "assetHint": "levels/multiplayer/autocomponent_rpc/autocomponent_rpc.scriptcanvas"
+ }
+ }
+ },
+ "Component_[11440172471478606933]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 11440172471478606933,
+ "m_template": {
+ "$type": "Multiplayer::NetworkTransformComponent"
+ }
+ },
+ "Component_[11481641385923146202]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 11481641385923146202,
+ "m_template": {
+ "$type": "NetBindComponent"
+ }
+ },
+ "Component_[13110996849704981748]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 13110996849704981748
+ },
+ "Component_[1472895075383059499]": {
+ "$type": "EditorLockComponent",
+ "Id": 1472895075383059499
+ },
+ "Component_[1526920553231193509]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 1526920553231193509
+ },
+ "Component_[15530420875454157766]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 15530420875454157766,
+ "m_template": {
+ "$type": "Multiplayer::LocalPredictionPlayerInputComponent"
+ }
+ },
+ "Component_[1699895912837266792]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 1699895912837266792
+ },
+ "Component_[17461691807054668218]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 17461691807054668218,
+ "m_template": {
+ "$type": "AutomatedTesting::NetworkTestPlayerComponent"
+ }
+ },
+ "Component_[3622545398462507871]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3622545398462507871
+ },
+ "Component_[5778259918231688598]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 5778259918231688598,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{F322592F-43BC-50E7-903C-CC231846093F}",
+ "subId": 276443623
+ },
+ "assetHint": "objects/_primitives/_cylinder_1x1.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[7004633483882343256]": {
+ "$type": "SelectionComponent",
+ "Id": 7004633483882343256
+ },
+ "Component_[8469628382507693850]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 8469628382507693850
+ },
+ "Component_[9407892837096707905]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 9407892837096707905
+ },
+ "Component_[9878555871810913249]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 9878555871810913249,
+ "Parent Entity": "ContainerEntity"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/tags.txt b/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/tags.txt
new file mode 100644
index 0000000000..0d6c1880e7
--- /dev/null
+++ b/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/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/project.json b/AutomatedTesting/project.json
index 9222777ef3..fc14645d2b 100644
--- a/AutomatedTesting/project.json
+++ b/AutomatedTesting/project.json
@@ -7,7 +7,7 @@
"android_settings": {
"package_name": "com.lumberyard.yourgame",
"version_number": 1,
- "version_name": "1.0.0.0",
+ "version_name": "1.0.0",
"orientation": "landscape"
},
"engine": "o3de",
diff --git a/Code/Editor/AboutDialog.cpp b/Code/Editor/AboutDialog.cpp
index c0fd39e1ae..ba086cad5d 100644
--- a/Code/Editor/AboutDialog.cpp
+++ b/Code/Editor/AboutDialog.cpp
@@ -30,8 +30,6 @@ CAboutDialog::CAboutDialog(QString versionText, QString richTextCopyrightNotice,
m_ui->setupUi(this);
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
- connect(m_ui->m_transparentAgreement, &QLabel::linkActivated, this, &CAboutDialog::OnCustomerAgreement);
-
m_ui->m_transparentTrademarks->setText(versionText);
m_ui->m_transparentAllRightReserved->setObjectName("copyrightNotice");
@@ -84,9 +82,4 @@ void CAboutDialog::mouseReleaseEvent(QMouseEvent* event)
QDialog::mouseReleaseEvent(event);
}
-void CAboutDialog::OnCustomerAgreement()
-{
- QDesktopServices::openUrl(QUrl(QStringLiteral("https://www.o3debinaries.org/license")));
-}
-
#include
diff --git a/Code/Editor/AboutDialog.h b/Code/Editor/AboutDialog.h
index db079a6ec7..279d7cd399 100644
--- a/Code/Editor/AboutDialog.h
+++ b/Code/Editor/AboutDialog.h
@@ -30,8 +30,6 @@ public:
private:
- void OnCustomerAgreement();
-
void mouseReleaseEvent(QMouseEvent* event) override;
void paintEvent(QPaintEvent* event) override;
diff --git a/Code/Editor/AboutDialog.ui b/Code/Editor/AboutDialog.ui
index 09a7c18841..a7433c620f 100644
--- a/Code/Editor/AboutDialog.ui
+++ b/Code/Editor/AboutDialog.ui
@@ -181,14 +181,17 @@
-
-
+
- Terms of Use
+ <a href="https://www.o3debinaries.org/license">Terms of Use</a>
+
+
+ Qt::RichText
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
-
+
true
@@ -274,11 +277,6 @@
QWidget
-
- ClickableLabel
- QLabel
-
-
diff --git a/Code/Editor/Animation/AnimationBipedBoneNames.cpp b/Code/Editor/Animation/AnimationBipedBoneNames.cpp
deleted file mode 100644
index 72502fe61d..0000000000
--- a/Code/Editor/Animation/AnimationBipedBoneNames.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include "EditorDefs.h"
-
-#include "AnimationBipedBoneNames.h"
-
-namespace EditorAnimationBones::Biped
-{
- const char* Pelvis = "Bip01 Pelvis";
- const char* Head = "Bip01 Head";
- const char* Weapon = "weapon_bone";
-
- const char* LeftEye = "eye_bone_left";
- const char* RightEye = "eye_bone_right";
-
- const char* Spine[5] = { "Bip01 Spine", "Bip01 Spine1", "Bip01 Spine2", "Bip01 Spine3", "Bip01 Spine4" };
- const char* Neck[2] = { "Bip01 Neck", "Bip01 Neck1" };
-
- const char* LeftHeel = "Bip01 L Heel";
- const char* LeftToe[2] = { "Bip01 L Toe0", "Bip01 L Toe1" };
-
- const char* RightHeel = "Bip01 R Heel";
- const char* RightToe[2] = { "Bip01 R Toe0", "Bip01 R Toe1" };
-} // namespace EditorAnimationBones::Biped
diff --git a/Code/Editor/Animation/AnimationBipedBoneNames.h b/Code/Editor/Animation/AnimationBipedBoneNames.h
deleted file mode 100644
index fdcfff7c82..0000000000
--- a/Code/Editor/Animation/AnimationBipedBoneNames.h
+++ /dev/null
@@ -1,34 +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
- *
- */
-#ifndef CRYINCLUDE_EDITOR_ANIMATION_ANIMATIONBIPEDBONENAMES_H
-#define CRYINCLUDE_EDITOR_ANIMATION_ANIMATIONBIPEDBONENAMES_H
-#pragma once
-
-namespace EditorAnimationBones
-{
- namespace Biped
- {
- extern const char* Pelvis;
- extern const char* Head;
- extern const char* Weapon;
-
- extern const char* Spine[5];
- extern const char* Neck[2];
-
- extern const char* LeftEye;
- extern const char* RightEye;
-
- extern const char* LeftHeel;
- extern const char* RightHeel;
- extern const char* LeftToe[2];
- extern const char* RightToe[2];
- }
-}
-
-
-#endif // CRYINCLUDE_EDITOR_ANIMATION_ANIMATIONBIPEDBONENAMES_H
diff --git a/Code/Editor/Common/spline_edit-00.png b/Code/Editor/Common/spline_edit-00.png
deleted file mode 100644
index 0243becc2b..0000000000
--- a/Code/Editor/Common/spline_edit-00.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:58ef978b31b31df9aaf715a0e9b006fde414a17a3ff15a3bf680eaad7418867a
-size 364
diff --git a/Code/Editor/Common/spline_edit-01.png b/Code/Editor/Common/spline_edit-01.png
deleted file mode 100644
index 4789ee0820..0000000000
--- a/Code/Editor/Common/spline_edit-01.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:98a681ec3d89ee57c5d1057fe984dcf8ad45721f47ae4df57fa358fbee85e616
-size 385
diff --git a/Code/Editor/Common/spline_edit-02.png b/Code/Editor/Common/spline_edit-02.png
deleted file mode 100644
index 476883a514..0000000000
--- a/Code/Editor/Common/spline_edit-02.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:24a2b2c9242a841c20e7815dab0d80a575844055328aea413d28b7283b65a92e
-size 386
diff --git a/Code/Editor/Common/spline_edit-03.png b/Code/Editor/Common/spline_edit-03.png
deleted file mode 100644
index c1e79719a5..0000000000
--- a/Code/Editor/Common/spline_edit-03.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ce23a276fec849b8f832fab96d3b738793335c27d37ae3813158387f3415b508
-size 377
diff --git a/Code/Editor/Common/spline_edit-04.png b/Code/Editor/Common/spline_edit-04.png
deleted file mode 100644
index e9cfb9d79e..0000000000
--- a/Code/Editor/Common/spline_edit-04.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c03befab41765200f4f28dbf1e0b2a702d2244bfa79b0d463f5d58d0a26095fc
-size 386
diff --git a/Code/Editor/Common/spline_edit-05.png b/Code/Editor/Common/spline_edit-05.png
deleted file mode 100644
index 3046c6008d..0000000000
--- a/Code/Editor/Common/spline_edit-05.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:418c3f0f27854b3795841359014d87686a7bf94daf2568d9cfd3ffac22675f69
-size 386
diff --git a/Code/Editor/Common/spline_edit-06.png b/Code/Editor/Common/spline_edit-06.png
deleted file mode 100644
index 3c170baa3e..0000000000
--- a/Code/Editor/Common/spline_edit-06.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d3a831f34ac53c9b1f20037290e8a2b62a3cfb8a4f86467591f44fd2a0e3c15b
-size 379
diff --git a/Code/Editor/Common/spline_edit-07.png b/Code/Editor/Common/spline_edit-07.png
deleted file mode 100644
index 1c87d462ed..0000000000
--- a/Code/Editor/Common/spline_edit-07.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4267102ca7a889c34eff905480a68878d4d56e15bc723a5b0575cd472e259f5d
-size 389
diff --git a/Code/Editor/Common/spline_edit-08.png b/Code/Editor/Common/spline_edit-08.png
deleted file mode 100644
index 52c436f877..0000000000
--- a/Code/Editor/Common/spline_edit-08.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a0df013dd102b87348fba18b4da5443591309e9c40166d27ae928636924154ea
-size 388
diff --git a/Code/Editor/Common/spline_edit-09.png b/Code/Editor/Common/spline_edit-09.png
deleted file mode 100644
index 1223730915..0000000000
--- a/Code/Editor/Common/spline_edit-09.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e713076ab5abbbb2cf28da431a339e9905acc790e35295f025aa2e79e1c04141
-size 376
diff --git a/Code/Editor/Common/spline_edit-10.png b/Code/Editor/Common/spline_edit-10.png
deleted file mode 100644
index 3b2a27bdbf..0000000000
--- a/Code/Editor/Common/spline_edit-10.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9e5af9d62ceafc3b8a1dfc36772350cd623fcc86c68711b299e143ff133f79b6
-size 387
diff --git a/Code/Editor/Common/spline_edit-11.png b/Code/Editor/Common/spline_edit-11.png
deleted file mode 100644
index 7b68ead52b..0000000000
--- a/Code/Editor/Common/spline_edit-11.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:17c5fb3d7b87ea87a98934954c721573c641bc44005a34f1e16589d7f39b71e8
-size 409
diff --git a/Code/Editor/Common/spline_edit-12.png b/Code/Editor/Common/spline_edit-12.png
deleted file mode 100644
index 3c7abb2182..0000000000
--- a/Code/Editor/Common/spline_edit-12.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6f5c78d9f764b62fb7dcf400c91c1edea9d7f88a426ba513fbf70825c6bcd2ac
-size 383
diff --git a/Code/Editor/Common/spline_edit-13.png b/Code/Editor/Common/spline_edit-13.png
deleted file mode 100644
index f71a5ec300..0000000000
--- a/Code/Editor/Common/spline_edit-13.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:376b549602afffca407525b77c1a9821bf6a0e279792ae2e52fe0a4f7c3c5bd4
-size 364
diff --git a/Code/Editor/Common/spline_edit-14.png b/Code/Editor/Common/spline_edit-14.png
deleted file mode 100644
index 4a5f89b089..0000000000
--- a/Code/Editor/Common/spline_edit-14.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e7dc48f8d324b7563b168f27ebde1e00ee2bd11ba462f114a05b297913e285c5
-size 374
diff --git a/Code/Editor/Common/spline_edit-15.png b/Code/Editor/Common/spline_edit-15.png
deleted file mode 100644
index 8542318682..0000000000
--- a/Code/Editor/Common/spline_edit-15.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:66b73afbd6dba1caaedfaae161b277b460b5198f7fc00bec414530116c567276
-size 375
diff --git a/Code/Editor/Common/spline_edit-16.png b/Code/Editor/Common/spline_edit-16.png
deleted file mode 100644
index 6926024cbd..0000000000
--- a/Code/Editor/Common/spline_edit-16.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ae6e6714acf495246f4e59f6e5640f3a4417ea50100d37a116950d2b859aed0c
-size 417
diff --git a/Code/Editor/Core/LevelEditorMenuHandler.cpp b/Code/Editor/Core/LevelEditorMenuHandler.cpp
index a90b0a597a..05f06c87aa 100644
--- a/Code/Editor/Core/LevelEditorMenuHandler.cpp
+++ b/Code/Editor/Core/LevelEditorMenuHandler.cpp
@@ -104,6 +104,11 @@ namespace
}
}
+ // Currently (December 13, 2021), this function is only used by slice editor code.
+ // When the slice editor is not enabled, there are no references to the
+ // HideActionWhileEntitiesDeselected function, causing a compiler warning and
+ // subsequently a build error.
+#ifdef ENABLE_SLICE_EDITOR
void HideActionWhileEntitiesDeselected(QAction* action, EEditorNotifyEvent editorNotifyEvent)
{
if (action == nullptr)
@@ -127,6 +132,7 @@ namespace
break;
}
}
+#endif
void DisableActionWhileInSimMode(QAction* action, EEditorNotifyEvent editorNotifyEvent)
{
@@ -374,7 +380,6 @@ QMenu* LevelEditorMenuHandler::CreateFileMenu()
{
DisableActionWhileLevelChanges(fileOpenSlice, e);
}));
-#endif
// Save Selected Slice
auto saveSelectedSlice = fileMenu.AddAction(ID_FILE_SAVE_SELECTED_SLICE);
@@ -391,7 +396,7 @@ QMenu* LevelEditorMenuHandler::CreateFileMenu()
{
HideActionWhileEntitiesDeselected(saveSliceToRoot, e);
}));
-
+#endif
// Open Recent
m_mostRecentLevelsMenu = fileMenu.AddMenu(tr("Open Recent"));
connect(m_mostRecentLevelsMenu, &QMenu::aboutToShow, this, &LevelEditorMenuHandler::UpdateMRUFiles);
@@ -439,9 +444,10 @@ QMenu* LevelEditorMenuHandler::CreateFileMenu()
// Show Log File
fileMenu.AddAction(ID_FILE_EDITLOGFILE);
+#ifdef ENABLE_SLICE_EDITOR
fileMenu.AddSeparator();
-
fileMenu.AddAction(ID_FILE_RESAVESLICES);
+#endif
fileMenu.AddSeparator();
diff --git a/Code/Editor/CryEdit.cpp b/Code/Editor/CryEdit.cpp
index 4415308730..77099761c1 100644
--- a/Code/Editor/CryEdit.cpp
+++ b/Code/Editor/CryEdit.cpp
@@ -380,13 +380,13 @@ void CCryEditApp::RegisterActionHandlers()
ON_COMMAND(ID_IMPORT_ASSET, OnOpenAssetImporter)
ON_COMMAND(ID_EDIT_LEVELDATA, OnEditLevelData)
ON_COMMAND(ID_FILE_EDITLOGFILE, OnFileEditLogFile)
- ON_COMMAND(ID_FILE_RESAVESLICES, OnFileResaveSlices)
ON_COMMAND(ID_FILE_EDITEDITORINI, OnFileEditEditorini)
ON_COMMAND(ID_PREFERENCES, OnPreferences)
ON_COMMAND(ID_REDO, OnRedo)
ON_COMMAND(ID_TOOLBAR_WIDGET_REDO, OnRedo)
ON_COMMAND(ID_FILE_OPEN_LEVEL, OnOpenLevel)
#ifdef ENABLE_SLICE_EDITOR
+ ON_COMMAND(ID_FILE_RESAVESLICES, OnFileResaveSlices)
ON_COMMAND(ID_FILE_NEW_SLICE, OnCreateSlice)
ON_COMMAND(ID_FILE_OPEN_SLICE, OnOpenSlice)
#endif
@@ -2629,6 +2629,7 @@ void CCryEditApp::OnFileEditLogFile()
CFileUtil::EditTextFile(CLogFile::GetLogFileName(), 0, IFileUtil::FILE_TYPE_SCRIPT);
}
+#ifdef ENABLE_SLICE_EDITOR
void CCryEditApp::OnFileResaveSlices()
{
AZStd::vector sliceAssetInfos;
@@ -2759,6 +2760,7 @@ void CCryEditApp::OnFileResaveSlices()
}
}
+#endif
//////////////////////////////////////////////////////////////////////////
void CCryEditApp::OnFileEditEditorini()
diff --git a/Code/Editor/EditorPanelUtils.cpp b/Code/Editor/EditorPanelUtils.cpp
index a270de5978..1a3c9bcb4a 100644
--- a/Code/Editor/EditorPanelUtils.cpp
+++ b/Code/Editor/EditorPanelUtils.cpp
@@ -319,8 +319,8 @@ public:
keys.push_back(QPair("Edit Menu.Duplicate", "Ctrl+D"));
keys.push_back(QPair("Edit Menu.Undo", "Ctrl+Z"));
keys.push_back(QPair("Edit Menu.Redo", "Ctrl+Shift+Z"));
- keys.push_back(QPair("Edit Menu.Group", "Ctrl+G"));
- keys.push_back(QPair("Edit Menu.Ungroup", "Ctrl+Shift+G"));
+ keys.push_back(QPair("Edit Menu.Group", "Ctrl+Alt+O"));
+ keys.push_back(QPair("Edit Menu.Ungroup", "Ctrl+Alt+P"));
keys.push_back(QPair("Edit Menu.Rename", "Ctrl+R"));
keys.push_back(QPair("Edit Menu.Reset", ""));
keys.push_back(QPair("Edit Menu.Edit Hotkeys", ""));
diff --git a/Code/Editor/IEditorImpl.cpp b/Code/Editor/IEditorImpl.cpp
index e5df6be58e..5bd816174c 100644
--- a/Code/Editor/IEditorImpl.cpp
+++ b/Code/Editor/IEditorImpl.cpp
@@ -1445,7 +1445,7 @@ ISourceControl* CEditorImpl::GetSourceControl()
{
IClassDesc* pClass = classes[i];
ISourceControl* pSCM = nullptr;
- HRESULT hRes = pClass->QueryInterface(__uuidof(ISourceControl), (void**)&pSCM);
+ HRESULT hRes = pClass->QueryInterface(__az_uuidof(ISourceControl), (void**)&pSCM);
if (!FAILED(hRes) && pSCM)
{
m_pSourceControl = pSCM;
diff --git a/Code/Editor/Include/IEditorClassFactory.h b/Code/Editor/Include/IEditorClassFactory.h
index dd47f803e2..6c85192436 100644
--- a/Code/Editor/Include/IEditorClassFactory.h
+++ b/Code/Editor/Include/IEditorClassFactory.h
@@ -31,10 +31,7 @@ struct IUnknown
};
#endif
-#ifdef __uuidof
-#undef __uuidof
-#endif
-#define __uuidof(T) T::uuid()
+#define __az_uuidof(T) T::uuid()
#if defined(AZ_PLATFORM_LINUX) || defined(AZ_PLATFORM_MAC)
@@ -107,7 +104,7 @@ struct IClassDesc
template
HRESULT STDMETHODCALLTYPE QueryInterface(Q** pp)
{
- return QueryInterface(__uuidof(Q), (void**)pp);
+ return QueryInterface(__az_uuidof(Q), (void**)pp);
}
//////////////////////////////////////////////////////////////////////////
diff --git a/Code/Editor/Include/IViewPane.h b/Code/Editor/Include/IViewPane.h
index b4a25a87a9..f2425fb954 100644
--- a/Code/Editor/Include/IViewPane.h
+++ b/Code/Editor/Include/IViewPane.h
@@ -60,7 +60,7 @@ struct IViewPaneClass
//////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE QueryInterface(const IID& riid, void** ppvObj)
{
- if (riid == __uuidof(IViewPaneClass))
+ if (riid == __az_uuidof(IViewPaneClass))
{
*ppvObj = this;
return S_OK;
diff --git a/Code/Editor/Lib/Tests/test_ClickableLabel.cpp b/Code/Editor/Lib/Tests/test_ClickableLabel.cpp
deleted file mode 100644
index a676714992..0000000000
--- a/Code/Editor/Lib/Tests/test_ClickableLabel.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include "EditorDefs.h"
-#include
-#include
-#include
-
-#include
-
-using namespace AZ;
-using namespace ::testing;
-
-namespace UnitTest
-{
- class TestingClickableLabel
- : public ScopedAllocatorSetupFixture
- {
- public:
- ClickableLabel m_clickableLabel;
- };
-
- TEST_F(TestingClickableLabel, CursorDoesNotUpdateWhileDisabled)
- {
- m_clickableLabel.setEnabled(false);
-
- QApplication::setOverrideCursor(QCursor(Qt::BlankCursor));
- QEnterEvent enterEvent{ QPointF(), QPointF(), QPointF() };
- QApplication::sendEvent(&m_clickableLabel, &enterEvent);
-
- const Qt::CursorShape cursorShape = QApplication::overrideCursor()->shape();
- EXPECT_THAT(cursorShape, Ne(Qt::PointingHandCursor));
- EXPECT_THAT(cursorShape, Eq(Qt::BlankCursor));
- }
-
- TEST_F(TestingClickableLabel, DoesNotRespondToDblClickWhileDisabled)
- {
- m_clickableLabel.setEnabled(false);
-
- bool linkActivated = false;
- QObject::connect(&m_clickableLabel, &QLabel::linkActivated, [&linkActivated]()
- {
- linkActivated = true;
- });
-
- QMouseEvent mouseEvent {
- QEvent::MouseButtonDblClick, QPointF(),
- Qt::LeftButton, Qt::LeftButton, Qt::NoModifier };
- QApplication::sendEvent(&m_clickableLabel, &mouseEvent);
-
- EXPECT_THAT(linkActivated, Eq(false));
- }
-} // namespace UnitTest
diff --git a/Code/Editor/MainWindow.cpp b/Code/Editor/MainWindow.cpp
index f92e39f285..bbebac96a3 100644
--- a/Code/Editor/MainWindow.cpp
+++ b/Code/Editor/MainWindow.cpp
@@ -643,11 +643,11 @@ void MainWindow::InitActions()
.SetStatusTip(tr("Create a new slice"));
am->AddAction(ID_FILE_OPEN_SLICE, tr("Open Slice..."))
.SetStatusTip(tr("Open an existing slice"));
-#endif
am->AddAction(ID_FILE_SAVE_SELECTED_SLICE, tr("Save selected slice")).SetShortcut(tr("Alt+S"))
.SetStatusTip(tr("Save the selected slice to the first level root"));
am->AddAction(ID_FILE_SAVE_SLICE_TO_ROOT, tr("Save Slice to root")).SetShortcut(tr("Ctrl+Alt+S"))
.SetStatusTip(tr("Save the selected slice to the top level root"));
+#endif
am->AddAction(ID_FILE_SAVE_LEVEL, tr("&Save"))
.SetShortcut(tr("Ctrl+S"))
.SetReserved()
@@ -677,7 +677,9 @@ void MainWindow::InitActions()
.RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdateSelected);
am->AddAction(ID_FILE_EXPORTOCCLUSIONMESH, tr("Export Occlusion Mesh"));
am->AddAction(ID_FILE_EDITLOGFILE, tr("Show Log File"));
+#ifdef ENABLE_SLICE_EDITOR
am->AddAction(ID_FILE_RESAVESLICES, tr("Resave All Slices"));
+#endif
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..."));
diff --git a/Code/Editor/Plugin.cpp b/Code/Editor/Plugin.cpp
index 68f8d8833b..16c386e31c 100644
--- a/Code/Editor/Plugin.cpp
+++ b/Code/Editor/Plugin.cpp
@@ -155,7 +155,7 @@ IViewPaneClass* CClassFactory::FindViewPaneClassByTitle(const char* pPaneTitle)
{
IViewPaneClass* viewPane = nullptr;
IClassDesc* desc = m_classes[i];
- if (SUCCEEDED(desc->QueryInterface(__uuidof(IViewPaneClass), (void**)&viewPane)))
+ if (SUCCEEDED(desc->QueryInterface(__az_uuidof(IViewPaneClass), (void**)&viewPane)))
{
if (QString::compare(viewPane->GetPaneTitle(), pPaneTitle) == 0)
{
diff --git a/Code/Editor/Plugins/PerforcePlugin/PerforceSourceControl.h b/Code/Editor/Plugins/PerforcePlugin/PerforceSourceControl.h
index ec06fdc82a..794dca0f86 100644
--- a/Code/Editor/Plugins/PerforcePlugin/PerforceSourceControl.h
+++ b/Code/Editor/Plugins/PerforcePlugin/PerforceSourceControl.h
@@ -49,7 +49,7 @@ public:
// from IUnknown
HRESULT STDMETHODCALLTYPE QueryInterface(const IID& riid, void** ppvObj)
{
- if (riid == __uuidof(ISourceControl) /* && m_pIntegrator*/)
+ if (riid == __az_uuidof(ISourceControl) /* && m_pIntegrator*/)
{
*ppvObj = this;
return S_OK;
diff --git a/Code/Editor/PreferencesStdPages.cpp b/Code/Editor/PreferencesStdPages.cpp
index 1dd40702a7..77b912a44e 100644
--- a/Code/Editor/PreferencesStdPages.cpp
+++ b/Code/Editor/PreferencesStdPages.cpp
@@ -50,7 +50,7 @@ CStdPreferencesClassDesc::CStdPreferencesClassDesc()
HRESULT CStdPreferencesClassDesc::QueryInterface(const IID& riid, void** ppvObj)
{
- if (riid == __uuidof(IPreferencesPageCreator))
+ if (riid == __az_uuidof(IPreferencesPageCreator))
{
*ppvObj = (IPreferencesPageCreator*)this;
return S_OK;
diff --git a/Code/Editor/QtUI/ClickableLabel.cpp b/Code/Editor/QtUI/ClickableLabel.cpp
deleted file mode 100644
index b0694e5f18..0000000000
--- a/Code/Editor/QtUI/ClickableLabel.cpp
+++ /dev/null
@@ -1,101 +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 "EditorDefs.h"
-
-#include "ClickableLabel.h"
-
-
-ClickableLabel::ClickableLabel(const QString& text, QWidget* parent)
- : QLabel(parent)
- , m_text(text)
- , m_showDecoration(false)
-{
- setTextFormat(Qt::RichText);
- setTextInteractionFlags(Qt::TextBrowserInteraction);
-}
-
-ClickableLabel::ClickableLabel(QWidget* parent)
- : QLabel(parent)
- , m_showDecoration(false)
-{
- setTextFormat(Qt::RichText);
- setTextInteractionFlags(Qt::TextBrowserInteraction);
-}
-
-void ClickableLabel::showEvent([[maybe_unused]] QShowEvent* event)
-{
- updateFormatting(false);
-}
-
-void ClickableLabel::enterEvent(QEvent* ev)
-{
- if (!isEnabled())
- {
- return;
- }
-
- updateFormatting(true);
- QApplication::setOverrideCursor(QCursor(Qt::PointingHandCursor));
- QLabel::enterEvent(ev);
-}
-
-void ClickableLabel::leaveEvent(QEvent* ev)
-{
- if (!isEnabled())
- {
- return;
- }
-
- updateFormatting(false);
- QApplication::restoreOverrideCursor();
- QLabel::leaveEvent(ev);
-}
-
-void ClickableLabel::setText(const QString& text)
-{
- m_text = text;
- QLabel::setText(text);
- updateFormatting(false);
-}
-
-void ClickableLabel::setShowDecoration(bool b)
-{
- m_showDecoration = b;
- updateFormatting(false);
-}
-
-void ClickableLabel::updateFormatting(bool mouseOver)
-{
- //FIXME: this should be done differently. Using a style sheet would be easiest.
-
- QColor c = palette().color(QPalette::WindowText);
- if (mouseOver || m_showDecoration)
- {
- QLabel::setText(QString(R"(%2)").arg(c.name(), m_text));
- }
- else
- {
- QLabel::setText(m_text);
- }
-}
-
-bool ClickableLabel::event(QEvent* e)
-{
- if (isEnabled())
- {
- if (e->type() == QEvent::MouseButtonDblClick)
- {
- emit linkActivated(QString());
- return true; //ignore
- }
- }
-
- return QLabel::event(e);
-}
-
-#include
diff --git a/Code/Editor/QtUI/ClickableLabel.h b/Code/Editor/QtUI/ClickableLabel.h
deleted file mode 100644
index 2b14676eae..0000000000
--- a/Code/Editor/QtUI/ClickableLabel.h
+++ /dev/null
@@ -1,39 +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
-#ifndef CRYINCLUDE_EDITORCOMMON_CLICKABLELABEL_H
-#define CRYINCLUDE_EDITORCOMMON_CLICKABLELABEL_H
-
-#if !defined(Q_MOC_RUN)
-#include
-#endif
-
-class SANDBOX_API ClickableLabel
- : public QLabel
-{
- Q_OBJECT
-public:
- explicit ClickableLabel(const QString& text, QWidget* parent = nullptr);
- explicit ClickableLabel(QWidget* parent = nullptr);
- bool event(QEvent* e) override;
-
- void setText(const QString& text);
- void setShowDecoration(bool b);
-
-protected:
- void showEvent(QShowEvent* event) override;
- void enterEvent(QEvent* ev) override;
- void leaveEvent(QEvent* ev) override;
-
-private:
- void updateFormatting(bool mouseOver);
- QString m_text;
- bool m_showDecoration;
-};
-
-#endif
diff --git a/Code/Editor/Util/FileUtil.cpp b/Code/Editor/Util/FileUtil.cpp
index 9f96d45381..182a122ea8 100644
--- a/Code/Editor/Util/FileUtil.cpp
+++ b/Code/Editor/Util/FileUtil.cpp
@@ -251,7 +251,7 @@ bool CFileUtil::ExtractDccFilenameFromAssetDatabase(const QString& assetFilename
for (size_t i = 0; i < assetDatabasePlugins.size(); ++i)
{
- if (assetDatabasePlugins[i]->QueryInterface(__uuidof(IAssetItemDatabase), (void**)&pCurrentDatabaseInterface) == S_OK)
+ if (assetDatabasePlugins[i]->QueryInterface(__az_uuidof(IAssetItemDatabase), (void**)&pCurrentDatabaseInterface) == S_OK)
{
if (!pCurrentDatabaseInterface)
{
diff --git a/Code/Editor/editor_lib_files.cmake b/Code/Editor/editor_lib_files.cmake
index fa627176d8..a63a74f01d 100644
--- a/Code/Editor/editor_lib_files.cmake
+++ b/Code/Editor/editor_lib_files.cmake
@@ -297,8 +297,6 @@ set(FILES
Util/AffineParts.cpp
Objects/BaseObject.cpp
Objects/BaseObject.h
- Animation/AnimationBipedBoneNames.cpp
- Animation/AnimationBipedBoneNames.h
AnimationContext.cpp
AnimationContext.h
AzAssetBrowser/AzAssetBrowserRequestHandler.cpp
@@ -526,8 +524,6 @@ set(FILES
PythonEditorFuncs.h
QtUI/QCollapsibleGroupBox.h
QtUI/QCollapsibleGroupBox.cpp
- QtUI/ClickableLabel.h
- QtUI/ClickableLabel.cpp
QtUI/PixmapLabelPreview.h
QtUI/PixmapLabelPreview.cpp
QtUI/WaitCursor.h
diff --git a/Code/Editor/editor_lib_test_files.cmake b/Code/Editor/editor_lib_test_files.cmake
index 17f36228db..5b66357c41 100644
--- a/Code/Editor/editor_lib_test_files.cmake
+++ b/Code/Editor/editor_lib_test_files.cmake
@@ -8,7 +8,6 @@
set(FILES
Lib/Tests/IEditorMock.h
- Lib/Tests/test_ClickableLabel.cpp
Lib/Tests/test_CryEditPythonBindings.cpp
Lib/Tests/test_CryEditDocPythonBindings.cpp
Lib/Tests/test_EditorPythonBindings.cpp
diff --git a/Code/Framework/AzCore/AzCore/IO/Path/Path.h b/Code/Framework/AzCore/AzCore/IO/Path/Path.h
index 094dee16f2..7f89809294 100644
--- a/Code/Framework/AzCore/AzCore/IO/Path/Path.h
+++ b/Code/Framework/AzCore/AzCore/IO/Path/Path.h
@@ -484,6 +484,7 @@ namespace AZ::IO
// as_posix
//! Replicates the behavior of the Python pathlib as_posix method
//! by replacing the Windows Path Separator with the Posix Path Seperator
+ constexpr string_type AsPosix() const;
AZStd::string StringAsPosix() const;
constexpr AZStd::fixed_string FixedMaxPathStringAsPosix() const noexcept;
diff --git a/Code/Framework/AzCore/AzCore/IO/Path/Path.inl b/Code/Framework/AzCore/AzCore/IO/Path/Path.inl
index 5ac15fc728..0dc1799528 100644
--- a/Code/Framework/AzCore/AzCore/IO/Path/Path.inl
+++ b/Code/Framework/AzCore/AzCore/IO/Path/Path.inl
@@ -1043,6 +1043,13 @@ namespace AZ::IO
// as_posix
// Returns a copy of the path with the path separators converted to PosixPathSeparator
template
+ constexpr auto BasicPath::AsPosix() const -> string_type
+ {
+ string_type resultPath(m_path.begin(), m_path.end());
+ AZStd::replace(resultPath.begin(), resultPath.end(), WindowsPathSeparator, PosixPathSeparator);
+ return resultPath;
+ }
+ template
AZStd::string BasicPath::StringAsPosix() const
{
AZStd::string resultPath(m_path.begin(), m_path.end());
diff --git a/Code/Framework/AzCore/AzCore/IO/Path/PathReflect.cpp b/Code/Framework/AzCore/AzCore/IO/Path/PathReflect.cpp
index 55a991f19f..1d0cdba66c 100644
--- a/Code/Framework/AzCore/AzCore/IO/Path/PathReflect.cpp
+++ b/Code/Framework/AzCore/AzCore/IO/Path/PathReflect.cpp
@@ -7,6 +7,8 @@
*/
#include
+#include
+#include
#include
#include
@@ -35,10 +37,8 @@ namespace AZ::IO
size_t Save(const void* classPtr, IO::GenericStream& stream, bool) override
{
/// Save paths out using the PosixPathSeparator
- PathType path(reinterpret_cast(classPtr)->Native(), AZ::IO::PosixPathSeparator);
- path.MakePreferred();
-
- return static_cast(stream.Write(path.Native().size(), path.c_str()));
+ auto posixPathString{ reinterpret_cast(classPtr)->AsPosix() };
+ return static_cast(stream.Write(posixPathString.size(), posixPathString.c_str()));
}
bool Load(void* classPtr, IO::GenericStream& stream, unsigned int, bool) override
@@ -73,5 +73,11 @@ namespace AZ::IO
AZ::SerializeContext::IDataSerializer::CreateDefaultDeleteDeleter() })
;
}
+ else if (auto jsonContext = azrtti_cast(context))
+ {
+ jsonContext->Serializer()
+ ->HandlesType()
+ ->HandlesType();
+ }
}
}
diff --git a/Code/Framework/AzCore/AzCore/Interface/Interface.h b/Code/Framework/AzCore/AzCore/Interface/Interface.h
index 8664e2905f..8f72cfa109 100644
--- a/Code/Framework/AzCore/AzCore/Interface/Interface.h
+++ b/Code/Framework/AzCore/AzCore/Interface/Interface.h
@@ -109,6 +109,7 @@ namespace AZ
*/
static EnvironmentVariable s_instance;
static AZStd::shared_mutex s_mutex;
+ static bool s_instanceAssigned;
};
template
@@ -117,6 +118,9 @@ namespace AZ
template
AZStd::shared_mutex Interface::s_mutex;
+ template
+ bool Interface::s_instanceAssigned;
+
template
void Interface::Register(T* type)
{
@@ -135,18 +139,19 @@ namespace AZ
AZStd::unique_lock lock(s_mutex);
s_instance = Environment::CreateVariable(GetVariableName());
s_instance.Get() = type;
+ s_instanceAssigned = true;
}
template
void Interface::Unregister(T* type)
{
- if (!s_instance || !s_instance.Get())
+ if (!s_instanceAssigned)
{
AZ_Assert(false, "Interface '%s' not registered on this module!", AzTypeInfo::Name());
return;
}
- if (s_instance.Get() != type)
+ if (s_instance && s_instance.Get() != type)
{
AZ_Assert(false, "Interface '%s' is not the same instance that was registered! [Expected '%p', Found '%p']", AzTypeInfo::Name(), type, s_instance.Get());
return;
@@ -156,6 +161,7 @@ namespace AZ
AZStd::unique_lock lock(s_mutex);
*s_instance = nullptr;
s_instance.Reset();
+ s_instanceAssigned = false;
}
template
@@ -165,9 +171,9 @@ namespace AZ
// This is the fast path which won't block.
{
AZStd::shared_lock lock(s_mutex);
- if (s_instance)
+ if (s_instanceAssigned)
{
- return s_instance.Get();
+ return s_instance ? s_instance.Get() : nullptr;
}
}
@@ -175,6 +181,7 @@ namespace AZ
// take the full lock and request it.
AZStd::unique_lock lock(s_mutex);
s_instance = Environment::FindVariable(GetVariableName());
+ s_instanceAssigned = true;
return s_instance ? s_instance.Get() : nullptr;
}
diff --git a/Code/Framework/AzCore/AzCore/Math/IntersectSegment.cpp b/Code/Framework/AzCore/AzCore/Math/IntersectSegment.cpp
index 5d13acc34c..4f143cde53 100644
--- a/Code/Framework/AzCore/AzCore/Math/IntersectSegment.cpp
+++ b/Code/Framework/AzCore/AzCore/Math/IntersectSegment.cpp
@@ -8,778 +8,936 @@
#include
-using namespace AZ;
-using namespace Intersect;
-
-//=========================================================================
-// IntersectSegmentTriangleCCW
-// [10/21/2009]
-//=========================================================================
-bool Intersect::IntersectSegmentTriangleCCW(
- const Vector3& p, const Vector3& q, const Vector3& a, const Vector3& b, const Vector3& c,
- /*float &u, float &v, float &w,*/ Vector3& normal, float& t)
+namespace AZ
{
- float v, w; // comment this and enable input params if we need the barycentric coordinates
-
- Vector3 ab = b - a;
- Vector3 ac = c - a;
- Vector3 qp = p - q;
-
- // Compute triangle normal. Can be pre-calculated/cached if
- // intersecting multiple segments against the same triangle
- normal = ab.Cross(ac); // Right hand CCW
-
- // Compute denominator d. If d <= 0, segment is parallel to or points
- // away from triangle, so exit early
- float d = qp.Dot(normal);
- if (d <= 0.0f)
+ //=========================================================================
+ // IntersectSegmentTriangleCCW
+ // [10/21/2009]
+ //=========================================================================
+ bool Intersect::IntersectSegmentTriangleCCW(
+ const Vector3& p,
+ const Vector3& q,
+ const Vector3& a,
+ const Vector3& b,
+ const Vector3& c,
+ /*float &u, float &v, float &w,*/ Vector3& normal,
+ float& t)
{
- return false;
- }
+ float v, w; // comment this and enable input params if we need the barycentric coordinates
- // Compute intersection t value of pq with plane of triangle. A ray
- // intersects iff 0 <= t. Segment intersects iff 0 <= t <= 1. Delay
- // dividing by d until intersection has been found to pierce triangle
- Vector3 ap = p - a;
- t = ap.Dot(normal);
+ Vector3 ab = b - a;
+ Vector3 ac = c - a;
+ Vector3 qp = p - q;
- // range segment check t[0,1] (it this case [0,d])
- if (t < 0.0f || t > d)
- {
- return false;
- }
+ // Compute triangle normal. Can be pre-calculated/cached if
+ // intersecting multiple segments against the same triangle
+ normal = ab.Cross(ac); // Right hand CCW
- // Compute barycentric coordinate components and test if within bounds
- Vector3 e = qp.Cross(ap);
- v = ac.Dot(e);
- if (v < 0.0f || v > d)
- {
- return false;
- }
- w = -ab.Dot(e);
- if (w < 0.0f || v + w > d)
- {
- return false;
- }
-
- // Segment/ray intersects triangle. Perform delayed division and
- // compute the last barycentric coordinate component
- float ood = 1.0f / d;
- t *= ood;
- /*v *= ood;
- w *= ood;
- u = 1.0f - v - w;*/
-
- normal.Normalize();
-
- return true;
-}
-
-//=========================================================================
-// IntersectSegmentTriangle
-// [10/21/2009]
-//=========================================================================
-bool
-Intersect::IntersectSegmentTriangle(
- const Vector3& p, const Vector3& q, const Vector3& a, const Vector3& b, const Vector3& c,
- /*float &u, float &v, float &w,*/ Vector3& normal, float& t)
-{
- float v, w; // comment this and enable input params if we need the barycentric coordinates
-
- Vector3 ab = b - a;
- Vector3 ac = c - a;
- Vector3 qp = p - q;
- Vector3 ap = p - a;
-
- // Compute triangle normal. Can be pre-calculated or cached if
- // intersecting multiple segments against the same triangle
- normal = ab.Cross(ac); // Right hand CCW
-
- // Compute denominator d. If d <= 0, segment is parallel to or points
- // away from triangle, so exit early
- float d = qp.Dot(normal);
- Vector3 e;
- if (d > Constants::FloatEpsilon)
- {
- // the normal is on the right side
- e = qp.Cross(ap);
- }
- else
- {
- normal = -normal;
-
- // so either have a parallel ray or our normal is flipped
- if (d >= -Constants::FloatEpsilon)
+ // Compute denominator d. If d <= 0, segment is parallel to or points
+ // away from triangle, so exit early
+ float d = qp.Dot(normal);
+ if (d <= 0.0f)
{
- return false; // parallel
- }
- d = -d;
- e = ap.Cross(qp);
- }
-
- // Compute intersection t value of pq with plane of triangle. A ray
- // intersects iff 0 <= t. Segment intersects iff 0 <= t <= 1. Delay
- // dividing by d until intersection has been found to pierce triangle
- t = ap.Dot(normal);
-
- // range segment check t[0,1] (it this case [0,d])
- if (t < 0.0f || t > d)
- {
- return false;
- }
-
- // Compute barycentric coordinate components and test if within bounds
- v = ac.Dot(e);
- if (v < 0.0f || v > d)
- {
- return false;
- }
- w = -ab.Dot(e);
- if (w < 0.0f || v + w > d)
- {
- return false;
- }
-
- // Segment/ray intersects the triangle. Perform delayed division and
- // compute the last barycentric coordinate component
- float ood = 1.0f / d;
- t *= ood;
- //v *= ood;
- //w *= ood;
- //u = 1.0f - v - w;
-
- normal.Normalize();
-
- return true;
-}
-
-//=========================================================================
-// TestSegmentAABBOrigin
-// [10/21/2009]
-//=========================================================================
-bool
-AZ::Intersect::TestSegmentAABBOrigin(const Vector3& midPoint, const Vector3& halfVector, const Vector3& aabbExtends)
-{
- const Vector3 EPSILON(0.001f); // \todo this is slow load move to a const
- Vector3 absHalfVector = halfVector.GetAbs();
- Vector3 absMidpoint = midPoint.GetAbs();
- Vector3 absHalfMidpoint = absHalfVector + aabbExtends;
-
- // Try world coordinate axes as separating axes
- if (!absMidpoint.IsLessEqualThan(absHalfMidpoint))
- {
- return false;
- }
-
- // Add in an epsilon term to counteract arithmetic errors when segment is
- // (near) parallel to a coordinate axis (see text for detail)
- absHalfVector += EPSILON;
-
- // Try cross products of segment direction vector with coordinate axes
- Vector3 absMDCross = midPoint.Cross(halfVector).GetAbs();
- //Vector3 eaDCross = absHalfVector.Cross(aabbExtends);
- float ex = aabbExtends.GetX();
- float ey = aabbExtends.GetY();
- float ez = aabbExtends.GetZ();
- float adx = absHalfVector.GetX();
- float ady = absHalfVector.GetY();
- float adz = absHalfVector.GetZ();
-
- Vector3 ead(ey * adz + ez * ady, ex * adz + ez * adx, ex * ady + ey * adx);
- if (!absMDCross.IsLessEqualThan(ead))
- {
- return false;
- }
-
- // No separating axis found; segment must be overlapping AABB
- return true;
-}
-
-
-//=========================================================================
-// IntersectRayAABB
-// [10/21/2009]
-//=========================================================================
-RayAABBIsectTypes
-AZ::Intersect::IntersectRayAABB(
- const Vector3& rayStart, const Vector3& dir, const Vector3& dirRCP, const Aabb& aabb,
- float& tStart, float& tEnd, Vector3& startNormal /*, Vector3& inter*/)
-{
- // we don't need to test with all 6 normals (just 3)
-
- const float eps = 0.0001f; // \todo move to constant
- float tmin = 0.0f; // set to -RR_FLT_MAX to get first hit on line
- float tmax = std::numeric_limits::max(); // set to max distance ray can travel (for segment)
-
- const Vector3& aabbMin = aabb.GetMin();
- const Vector3& aabbMax = aabb.GetMax();
-
- // we unroll manually because there is no way to get in efficient way vectors for
- // each axis while getting it as a index
- Vector3 time1 = (aabbMin - rayStart) * dirRCP;
- Vector3 time2 = (aabbMax - rayStart) * dirRCP;
-
- // X
- if (std::fabs(dir.GetX()) < eps)
- {
- // Ray is parallel to slab. No hit if origin not within slab
- if (rayStart.GetX() < aabbMin.GetX() || rayStart.GetX() > aabbMax.GetX())
- {
- return ISECT_RAY_AABB_NONE;
- }
- }
- else
- {
- // Compute intersection t value of ray with near and far plane of slab
- float t1 = time1.GetX();
- float t2 = time2.GetX();
- float nSign = -1.0f;
-
- // Make t1 be intersection with near plane, t2 with far plane
- if (t1 > t2)
- {
- AZStd::swap(t1, t2);
- nSign = 1.0f;
+ return false;
}
- // Compute the intersection of slab intersections intervals
- if (tmin < t1)
- {
- tmin = t1;
+ // Compute intersection t value of pq with plane of triangle. A ray
+ // intersects iff 0 <= t. Segment intersects iff 0 <= t <= 1. Delay
+ // dividing by d until intersection has been found to pierce triangle
+ Vector3 ap = p - a;
+ t = ap.Dot(normal);
- startNormal.Set(nSign, 0.0f, 0.0f);
+ // range segment check t[0,1] (it this case [0,d])
+ if (t < 0.0f || t > d)
+ {
+ return false;
}
- tmax = AZ::GetMin(tmax, t2);
-
- // Exit with no collision as soon as slab intersection becomes empty
- if (tmin > tmax)
+ // Compute barycentric coordinate components and test if within bounds
+ Vector3 e = qp.Cross(ap);
+ v = ac.Dot(e);
+ if (v < 0.0f || v > d)
{
- return ISECT_RAY_AABB_NONE;
+ return false;
}
- }
-
- // Y
- if (std::fabs(dir.GetY()) < eps)
- {
- // Ray is parallel to slab. No hit if origin not within slab
- if (rayStart.GetY() < aabbMin.GetY() || rayStart.GetY() > aabbMax.GetY())
+ w = -ab.Dot(e);
+ if (w < 0.0f || v + w > d)
{
- return ISECT_RAY_AABB_NONE;
- }
- }
- else
- {
- // Compute intersection t value of ray with near and far plane of slab
- float t1 = time1.GetY();
- float t2 = time2.GetY();
- float nSign = -1.0f;
-
- // Make t1 be intersection with near plane, t2 with far plane
- if (t1 > t2)
- {
- AZStd::swap(t1, t2);
- nSign = 1.0f;
+ return false;
}
- // Compute the intersection of slab intersections intervals
- if (tmin < t1)
- {
- tmin = t1;
+ // Segment/ray intersects triangle. Perform delayed division and
+ // compute the last barycentric coordinate component
+ float ood = 1.0f / d;
+ t *= ood;
+ /*v *= ood;
+ w *= ood;
+ u = 1.0f - v - w;*/
- startNormal.Set(0.0f, nSign, 0.0f);
+ normal.Normalize();
+
+ return true;
+ }
+
+ //=========================================================================
+ // IntersectSegmentTriangle
+ // [10/21/2009]
+ //=========================================================================
+ bool Intersect::IntersectSegmentTriangle(
+ const Vector3& p,
+ const Vector3& q,
+ const Vector3& a,
+ const Vector3& b,
+ const Vector3& c,
+ /*float &u, float &v, float &w,*/ Vector3& normal,
+ float& t)
+ {
+ float v, w; // comment this and enable input params if we need the barycentric coordinates
+
+ Vector3 ab = b - a;
+ Vector3 ac = c - a;
+ Vector3 qp = p - q;
+ Vector3 ap = p - a;
+
+ // Compute triangle normal. Can be pre-calculated or cached if
+ // intersecting multiple segments against the same triangle
+ normal = ab.Cross(ac); // Right hand CCW
+
+ // Compute denominator d. If d <= 0, segment is parallel to or points
+ // away from triangle, so exit early
+ float d = qp.Dot(normal);
+ Vector3 e;
+ if (d > Constants::FloatEpsilon)
+ {
+ // the normal is on the right side
+ e = qp.Cross(ap);
}
-
- tmax = AZ::GetMin(tmax, t2);
-
- // Exit with no collision as soon as slab intersection becomes empty
- if (tmin > tmax)
+ else
{
- return ISECT_RAY_AABB_NONE;
- }
- }
+ normal = -normal;
- // Z
- if (std::fabs(dir.GetZ()) < eps)
- {
- // Ray is parallel to slab. No hit if origin not within slab
- if (rayStart.GetZ() < aabbMin.GetZ() || rayStart.GetZ() > aabbMax.GetZ())
- {
- return ISECT_RAY_AABB_NONE;
- }
- }
- else
- {
- // Compute intersection t value of ray with near and far plane of slab
- float t1 = time1.GetZ();
- float t2 = time2.GetZ();
- float nSign = -1.0f;
-
- // Make t1 be intersection with near plane, t2 with far plane
- if (t1 > t2)
- {
- AZStd::swap(t1, t2);
- nSign = 1.0f;
- }
-
- // Compute the intersection of slab intersections intervals
- if (tmin < t1)
- {
- tmin = t1;
-
- startNormal.Set(0.0f, 0.0f, nSign);
- }
-
- tmax = AZ::GetMin(tmax, t2);
-
- // Exit with no collision as soon as slab intersection becomes empty
- if (tmin > tmax)
- {
- return ISECT_RAY_AABB_NONE;
- }
- }
-
- tStart = tmin;
- tEnd = tmax;
-
- if (tmin == 0.0f) // no intersect if the segments starts inside or coincident the aabb
- {
- return ISECT_RAY_AABB_SA_INSIDE;
- }
-
- // Ray intersects all 3 slabs. Return point (q) and intersection t value (tmin)
- //inter = rayStart + dir * tmin;
- return ISECT_RAY_AABB_ISECT;
-}
-
-//=========================================================================
-// IntersectRayAABB2
-// [2/18/2011]
-//=========================================================================
-RayAABBIsectTypes
-AZ::Intersect::IntersectRayAABB2(const Vector3& rayStart, const Vector3& dirRCP, const Aabb& aabb, float& start, float& end)
-{
- float tmin, tmax, tymin, tymax, tzmin, tzmax;
- Vector3 vZero = Vector3::CreateZero();
-
- Vector3 min = (Vector3::CreateSelectCmpGreaterEqual(dirRCP, vZero, aabb.GetMin(), aabb.GetMax()) - rayStart) * dirRCP;
- Vector3 max = (Vector3::CreateSelectCmpGreaterEqual(dirRCP, vZero, aabb.GetMax(), aabb.GetMin()) - rayStart) * dirRCP;
-
- tmin = min.GetX();
- tmax = max.GetX();
- tymin = min.GetY();
- tymax = max.GetY();
-
- if (tmin > tymax || tymin > tmax)
- {
- return ISECT_RAY_AABB_NONE;
- }
-
- if (tymin > tmin)
- {
- tmin = tymin;
- }
-
- if (tymax < tmax)
- {
- tmax = tymax;
- }
-
- tzmin = min.GetZ();
- tzmax = max.GetZ();
-
- if (tmin > tzmax || tzmin > tmax)
- {
- return ISECT_RAY_AABB_NONE;
- }
-
- if (tzmin > tmin)
- {
- tmin = tzmin;
- }
- if (tzmax < tmax)
- {
- tmax = tzmax;
- }
-
- start = tmin;
- end = tmax;
-
- return ISECT_RAY_AABB_ISECT;
-}
-
-bool AZ::Intersect::IntersectRayDisk(
- const Vector3& rayOrigin, const Vector3& rayDir, const Vector3& diskCenter, const float diskRadius, const Vector3& diskNormal, float& t)
-{
- // First intersect with the plane of the disk
- float planeIntersectionDistance;
- int intersectionCount = IntersectRayPlane(rayOrigin, rayDir, diskCenter, diskNormal, planeIntersectionDistance);
- if (intersectionCount == 1)
- {
- // If the plane intersection point is inside the disk radius, then it intersected the disk.
- Vector3 pointOnPlane = rayOrigin + rayDir * planeIntersectionDistance;
- if (pointOnPlane.GetDistance(diskCenter) < diskRadius)
- {
- t = planeIntersectionDistance;
- return true;
- }
- }
- return false;
-}
-
-// Reference: Real-Time Collision Detection - 5.3.7 Intersecting Ray or Segment Against Cylinder, and the book's errata.
-int AZ::Intersect::IntersectRayCappedCylinder(
- const Vector3& rayOrigin, const Vector3& rayDir,
- const Vector3& cylinderEnd1, const Vector3& cylinderDir,
- float cylinderHeight, float cylinderRadius, float &t1, float &t2)
-{
- // dr = rayDir
- // dc = cylinderDir
- // r = cylinderRadius
- // Vector3 cylinderEnd2 = cylinderEnd1 + cylinderHeight * cylinderDir;
- Vector3 m = rayOrigin - cylinderEnd1; // vector from cylinderEnd1 to rayOrigin
- float dcm = cylinderDir.Dot(m); // projection of m on cylinderDir
- float dcdr = cylinderDir.Dot(rayDir); // projection of rayDir on cylinderDir
- float drm = rayDir.Dot(m); // projection of m on rayDir
- float r2 = cylinderRadius * cylinderRadius;
-
- if (dcm < 0.0f && dcdr <= 0.0f)
- {
- return 0; // rayOrigin is outside cylinderEnd1 and rayDir is pointing away from cylinderEnd1
- }
- if (dcm > cylinderHeight && dcdr >= 0.0f)
- {
- return 0; // rayOrigin is outside cylinderEnd2 and rayDir is pointing away from cylinderEnd2
- }
-
- // point RP on the ray: RP(t) = rayOrigin + t * rayDir
- // point CP on the cylinder surface: |(CP - cylinderEnd1) - cylinderDir.Dot(cp - cylinderEnd1) * cylinderDir|^2 = cylinderRadius^2
- // substitute RP(t) for CP: a*t^2 + 2b*t + c = 0, solving for t = [-2b +/- sqrt(4b^2 - 4ac)] / 2a
- float a = 1.0f - dcdr * dcdr; // always greater than or equal to 0
- float b = drm - dcm * dcdr;
- float c = m.Dot(m) - dcm * dcm - r2;
-
- const float EPSILON = 0.00001f;
-
- if (fabsf(a) < EPSILON) // the ray is parallel to the cylinder
- {
- if (c > EPSILON) // the ray is outside the cylinder
- {
- return 0;
- }
- else if (dcm < 0.0f) // the ray origin is on cylinderEnd1 side and ray is pointing to cylinderEnd2
- {
- t1 = -dcm;
- t2 = -dcm + cylinderHeight;
- return 2;
- }
- else if (dcm > cylinderHeight) // the ray origin is on cylinderEnd2 side and ray is pointing to cylinderEnd1
- {
- t1 = dcm - cylinderHeight;
- t2 = dcm;
- return 2;
- }
- else // (dcm > 0.0f && dcm < cylinderHeight) // the ray origin is inside the cylinder
- {
- if (dcdr > 0.0f) // the ray is pointing to cylinderEnd2
+ // so either have a parallel ray or our normal is flipped
+ if (d >= -Constants::FloatEpsilon)
{
- t1 = cylinderHeight - dcm;
- return 1;
+ return false; // parallel
}
- else if (dcdr < 0.0f) // the ray is pointing to cylinderEnd1
+ d = -d;
+ e = ap.Cross(qp);
+ }
+
+ // Compute intersection t value of pq with plane of triangle. A ray
+ // intersects iff 0 <= t. Segment intersects iff 0 <= t <= 1. Delay
+ // dividing by d until intersection has been found to pierce triangle
+ t = ap.Dot(normal);
+
+ // range segment check t[0,1] (it this case [0,d])
+ if (t < 0.0f || t > d)
+ {
+ return false;
+ }
+
+ // Compute barycentric coordinate components and test if within bounds
+ v = ac.Dot(e);
+ if (v < 0.0f || v > d)
+ {
+ return false;
+ }
+ w = -ab.Dot(e);
+ if (w < 0.0f || v + w > d)
+ {
+ return false;
+ }
+
+ // Segment/ray intersects the triangle. Perform delayed division and
+ // compute the last barycentric coordinate component
+ float ood = 1.0f / d;
+ t *= ood;
+ // v *= ood;
+ // w *= ood;
+ // u = 1.0f - v - w;
+
+ normal.Normalize();
+
+ return true;
+ }
+
+ //=========================================================================
+ // TestSegmentAABBOrigin
+ // [10/21/2009]
+ //=========================================================================
+ bool Intersect::TestSegmentAABBOrigin(const Vector3& midPoint, const Vector3& halfVector, const Vector3& aabbExtends)
+ {
+ const Vector3 EPSILON(0.001f); // \todo this is slow load move to a const
+ Vector3 absHalfVector = halfVector.GetAbs();
+ Vector3 absMidpoint = midPoint.GetAbs();
+ Vector3 absHalfMidpoint = absHalfVector + aabbExtends;
+
+ // Try world coordinate axes as separating axes
+ if (!absMidpoint.IsLessEqualThan(absHalfMidpoint))
+ {
+ return false;
+ }
+
+ // Add in an epsilon term to counteract arithmetic errors when segment is
+ // (near) parallel to a coordinate axis (see text for detail)
+ absHalfVector += EPSILON;
+
+ // Try cross products of segment direction vector with coordinate axes
+ Vector3 absMDCross = midPoint.Cross(halfVector).GetAbs();
+ // Vector3 eaDCross = absHalfVector.Cross(aabbExtends);
+ float ex = aabbExtends.GetX();
+ float ey = aabbExtends.GetY();
+ float ez = aabbExtends.GetZ();
+ float adx = absHalfVector.GetX();
+ float ady = absHalfVector.GetY();
+ float adz = absHalfVector.GetZ();
+
+ Vector3 ead(ey * adz + ez * ady, ex * adz + ez * adx, ex * ady + ey * adx);
+ if (!absMDCross.IsLessEqualThan(ead))
+ {
+ return false;
+ }
+
+ // No separating axis found; segment must be overlapping AABB
+ return true;
+ }
+
+ //=========================================================================
+ // IntersectRayAABB
+ // [10/21/2009]
+ //=========================================================================
+ Intersect::RayAABBIsectTypes Intersect::IntersectRayAABB(
+ const Vector3& rayStart,
+ const Vector3& dir,
+ const Vector3& dirRCP,
+ const Aabb& aabb,
+ float& tStart,
+ float& tEnd,
+ Vector3& startNormal /*, Vector3& inter*/)
+ {
+ // we don't need to test with all 6 normals (just 3)
+
+ const float eps = 0.0001f; // \todo move to constant
+ float tmin = 0.0f; // set to -RR_FLT_MAX to get first hit on line
+ float tmax = std::numeric_limits::max(); // set to max distance ray can travel (for segment)
+
+ const Vector3& aabbMin = aabb.GetMin();
+ const Vector3& aabbMax = aabb.GetMax();
+
+ // we unroll manually because there is no way to get in efficient way vectors for
+ // each axis while getting it as a index
+ Vector3 time1 = (aabbMin - rayStart) * dirRCP;
+ Vector3 time2 = (aabbMax - rayStart) * dirRCP;
+
+ // X
+ if (std::fabs(dir.GetX()) < eps)
+ {
+ // Ray is parallel to slab. No hit if origin not within slab
+ if (rayStart.GetX() < aabbMin.GetX() || rayStart.GetX() > aabbMax.GetX())
{
- t2 = dcm;
- return 1;
+ return ISECT_RAY_AABB_NONE;
}
- else // impossible in theory
+ }
+ else
+ {
+ // Compute intersection t value of ray with near and far plane of slab
+ float t1 = time1.GetX();
+ float t2 = time2.GetX();
+ float nSign = -1.0f;
+
+ // Make t1 be intersection with near plane, t2 with far plane
+ if (t1 > t2)
+ {
+ AZStd::swap(t1, t2);
+ nSign = 1.0f;
+ }
+
+ // Compute the intersection of slab intersections intervals
+ if (tmin < t1)
+ {
+ tmin = t1;
+
+ startNormal.Set(nSign, 0.0f, 0.0f);
+ }
+
+ tmax = AZ::GetMin(tmax, t2);
+
+ // Exit with no collision as soon as slab intersection becomes empty
+ if (tmin > tmax)
+ {
+ return ISECT_RAY_AABB_NONE;
+ }
+ }
+
+ // Y
+ if (std::fabs(dir.GetY()) < eps)
+ {
+ // Ray is parallel to slab. No hit if origin not within slab
+ if (rayStart.GetY() < aabbMin.GetY() || rayStart.GetY() > aabbMax.GetY())
+ {
+ return ISECT_RAY_AABB_NONE;
+ }
+ }
+ else
+ {
+ // Compute intersection t value of ray with near and far plane of slab
+ float t1 = time1.GetY();
+ float t2 = time2.GetY();
+ float nSign = -1.0f;
+
+ // Make t1 be intersection with near plane, t2 with far plane
+ if (t1 > t2)
+ {
+ AZStd::swap(t1, t2);
+ nSign = 1.0f;
+ }
+
+ // Compute the intersection of slab intersections intervals
+ if (tmin < t1)
+ {
+ tmin = t1;
+
+ startNormal.Set(0.0f, nSign, 0.0f);
+ }
+
+ tmax = AZ::GetMin(tmax, t2);
+
+ // Exit with no collision as soon as slab intersection becomes empty
+ if (tmin > tmax)
+ {
+ return ISECT_RAY_AABB_NONE;
+ }
+ }
+
+ // Z
+ if (std::fabs(dir.GetZ()) < eps)
+ {
+ // Ray is parallel to slab. No hit if origin not within slab
+ if (rayStart.GetZ() < aabbMin.GetZ() || rayStart.GetZ() > aabbMax.GetZ())
+ {
+ return ISECT_RAY_AABB_NONE;
+ }
+ }
+ else
+ {
+ // Compute intersection t value of ray with near and far plane of slab
+ float t1 = time1.GetZ();
+ float t2 = time2.GetZ();
+ float nSign = -1.0f;
+
+ // Make t1 be intersection with near plane, t2 with far plane
+ if (t1 > t2)
+ {
+ AZStd::swap(t1, t2);
+ nSign = 1.0f;
+ }
+
+ // Compute the intersection of slab intersections intervals
+ if (tmin < t1)
+ {
+ tmin = t1;
+
+ startNormal.Set(0.0f, 0.0f, nSign);
+ }
+
+ tmax = AZ::GetMin(tmax, t2);
+
+ // Exit with no collision as soon as slab intersection becomes empty
+ if (tmin > tmax)
+ {
+ return ISECT_RAY_AABB_NONE;
+ }
+ }
+
+ tStart = tmin;
+ tEnd = tmax;
+
+ if (tmin == 0.0f) // no intersect if the segments starts inside or coincident the aabb
+ {
+ return ISECT_RAY_AABB_SA_INSIDE;
+ }
+
+ // Ray intersects all 3 slabs. Return point (q) and intersection t value (tmin)
+ // inter = rayStart + dir * tmin;
+ return ISECT_RAY_AABB_ISECT;
+ }
+
+ //=========================================================================
+ // IntersectRayAABB2
+ // [2/18/2011]
+ //=========================================================================
+ Intersect::RayAABBIsectTypes Intersect::IntersectRayAABB2(
+ const Vector3& rayStart, const Vector3& dirRCP, const Aabb& aabb, float& start, float& end)
+ {
+ float tmin, tmax, tymin, tymax, tzmin, tzmax;
+ Vector3 vZero = Vector3::CreateZero();
+
+ Vector3 min = (Vector3::CreateSelectCmpGreaterEqual(dirRCP, vZero, aabb.GetMin(), aabb.GetMax()) - rayStart) * dirRCP;
+ Vector3 max = (Vector3::CreateSelectCmpGreaterEqual(dirRCP, vZero, aabb.GetMax(), aabb.GetMin()) - rayStart) * dirRCP;
+
+ tmin = min.GetX();
+ tmax = max.GetX();
+ tymin = min.GetY();
+ tymax = max.GetY();
+
+ if (tmin > tymax || tymin > tmax)
+ {
+ return ISECT_RAY_AABB_NONE;
+ }
+
+ if (tymin > tmin)
+ {
+ tmin = tymin;
+ }
+
+ if (tymax < tmax)
+ {
+ tmax = tymax;
+ }
+
+ tzmin = min.GetZ();
+ tzmax = max.GetZ();
+
+ if (tmin > tzmax || tzmin > tmax)
+ {
+ return ISECT_RAY_AABB_NONE;
+ }
+
+ if (tzmin > tmin)
+ {
+ tmin = tzmin;
+ }
+ if (tzmax < tmax)
+ {
+ tmax = tzmax;
+ }
+
+ start = tmin;
+ end = tmax;
+
+ return ISECT_RAY_AABB_ISECT;
+ }
+
+ bool Intersect::IntersectRayDisk(
+ const Vector3& rayOrigin,
+ const Vector3& rayDir,
+ const Vector3& diskCenter,
+ const float diskRadius,
+ const Vector3& diskNormal,
+ float& t)
+ {
+ // First intersect with the plane of the disk
+ float planeIntersectionDistance;
+ int intersectionCount = IntersectRayPlane(rayOrigin, rayDir, diskCenter, diskNormal, planeIntersectionDistance);
+ if (intersectionCount == 1)
+ {
+ // If the plane intersection point is inside the disk radius, then it intersected the disk.
+ Vector3 pointOnPlane = rayOrigin + rayDir * planeIntersectionDistance;
+ if (pointOnPlane.GetDistance(diskCenter) < diskRadius)
+ {
+ t = planeIntersectionDistance;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // Reference: Real-Time Collision Detection - 5.3.7 Intersecting Ray or Segment Against Cylinder, and the book's errata.
+ int Intersect::IntersectRayCappedCylinder(
+ const Vector3& rayOrigin,
+ const Vector3& rayDir,
+ const Vector3& cylinderEnd1,
+ const Vector3& cylinderDir,
+ float cylinderHeight,
+ float cylinderRadius,
+ float& t1,
+ float& t2)
+ {
+ // dr = rayDir
+ // dc = cylinderDir
+ // r = cylinderRadius
+ // Vector3 cylinderEnd2 = cylinderEnd1 + cylinderHeight * cylinderDir;
+ Vector3 m = rayOrigin - cylinderEnd1; // vector from cylinderEnd1 to rayOrigin
+ float dcm = cylinderDir.Dot(m); // projection of m on cylinderDir
+ float dcdr = cylinderDir.Dot(rayDir); // projection of rayDir on cylinderDir
+ float drm = rayDir.Dot(m); // projection of m on rayDir
+ float r2 = cylinderRadius * cylinderRadius;
+
+ if (dcm < 0.0f && dcdr <= 0.0f)
+ {
+ return 0; // rayOrigin is outside cylinderEnd1 and rayDir is pointing away from cylinderEnd1
+ }
+ if (dcm > cylinderHeight && dcdr >= 0.0f)
+ {
+ return 0; // rayOrigin is outside cylinderEnd2 and rayDir is pointing away from cylinderEnd2
+ }
+
+ // point RP on the ray: RP(t) = rayOrigin + t * rayDir
+ // point CP on the cylinder surface: |(CP - cylinderEnd1) - cylinderDir.Dot(cp - cylinderEnd1) * cylinderDir|^2 = cylinderRadius^2
+ // substitute RP(t) for CP: a*t^2 + 2b*t + c = 0, solving for t = [-2b +/- sqrt(4b^2 - 4ac)] / 2a
+ float a = 1.0f - dcdr * dcdr; // always greater than or equal to 0
+ float b = drm - dcm * dcdr;
+ float c = m.Dot(m) - dcm * dcm - r2;
+
+ const float EPSILON = 0.00001f;
+
+ if (fabsf(a) < EPSILON) // the ray is parallel to the cylinder
+ {
+ if (c > EPSILON) // the ray is outside the cylinder
{
return 0;
}
+ else if (dcm < 0.0f) // the ray origin is on cylinderEnd1 side and ray is pointing to cylinderEnd2
+ {
+ t1 = -dcm;
+ t2 = -dcm + cylinderHeight;
+ return 2;
+ }
+ else if (dcm > cylinderHeight) // the ray origin is on cylinderEnd2 side and ray is pointing to cylinderEnd1
+ {
+ t1 = dcm - cylinderHeight;
+ t2 = dcm;
+ return 2;
+ }
+ else // (dcm > 0.0f && dcm < cylinderHeight) // the ray origin is inside the cylinder
+ {
+ if (dcdr > 0.0f) // the ray is pointing to cylinderEnd2
+ {
+ t1 = cylinderHeight - dcm;
+ return 1;
+ }
+ else if (dcdr < 0.0f) // the ray is pointing to cylinderEnd1
+ {
+ t2 = dcm;
+ return 1;
+ }
+ else // impossible in theory
+ {
+ return 0;
+ }
+ }
}
- }
- float discr = b * b - a * c;
- if (discr < 0.0f)
- {
- return 0;
- }
-
- float sqrt_discr = sqrt(discr);
- float tt1 = (-b - sqrt_discr) / a;
- float tt2 = (-b + sqrt_discr) / a;
-
- if (tt2 < 0.0f) // both intersections are behind the ray origin
- {
- return 0;
- }
-
- // Vector3 AP2 = (rayOrigin + tt2 * rayDir) - cylinderEnd1; // vector from cylinderEnd1 to the intersecting point of parameter tt2
- // float s2 = cylinderDir.Dot(AP2);
- float s2 = dcm + tt2 * dcdr;
-
- if (discr < EPSILON) // tt1 == tt2
- {
- if (s2 >= 0.0f && s2 <= cylinderHeight)
- {
- t1 = tt1;
- return 1;
- }
- }
-
- // Vector3 AP1 = (rayOrigin + tt1 * rayDir) - cylinderEnd1; // vector from cylinderEnd1 to the intersecting point of parameter tt1
- // float s1 = cylinderDir.Dot(AP1);
- float s1 = dcm + tt1 * dcdr;
-
- if (s1 < 0.0f) // intersecting point of parameter tt1 is outside on cylinderEnd1 side
- {
- if (s2 < 0.0f) // intersecting point of parameter tt2 is outside on cylinderEnd1 side
+ float discr = b * b - a * c;
+ if (discr < 0.0f)
{
return 0;
}
- else if (s2 == 0.0f) // ray touching the brim of the cylinderEnd1
+
+ float sqrt_discr = sqrt(discr);
+ float tt1 = (-b - sqrt_discr) / a;
+ float tt2 = (-b + sqrt_discr) / a;
+
+ if (tt2 < 0.0f) // both intersections are behind the ray origin
{
- t1 = tt2;
- return 1;
+ return 0;
}
- else
+
+ // Vector3 AP2 = (rayOrigin + tt2 * rayDir) - cylinderEnd1; // vector from cylinderEnd1 to the intersecting point of parameter tt2
+ // float s2 = cylinderDir.Dot(AP2);
+ float s2 = dcm + tt2 * dcdr;
+
+ if (discr < EPSILON) // tt1 == tt2
{
- if (s2 > cylinderHeight) // intersecting point of parameter tt2 is outside on cylinderEnd2 side
+ if (s2 >= 0.0f && s2 <= cylinderHeight)
{
- // t2 can be computed from the equation: dot(rayOrigin + t2 * rayDir - cylinderEnd1, cylinderDir) = cylinderHeight
- t2 = (cylinderHeight - dcm) / dcdr;
+ t1 = tt1;
+ return 1;
}
- else
+ }
+
+ // Vector3 AP1 = (rayOrigin + tt1 * rayDir) - cylinderEnd1; // vector from cylinderEnd1 to the intersecting point of parameter tt1
+ // float s1 = cylinderDir.Dot(AP1);
+ float s1 = dcm + tt1 * dcdr;
+
+ if (s1 < 0.0f) // intersecting point of parameter tt1 is outside on cylinderEnd1 side
+ {
+ if (s2 < 0.0f) // intersecting point of parameter tt2 is outside on cylinderEnd1 side
{
- t2 = tt2;
+ return 0;
}
- if (dcm > 0.0f) // ray origin inside cylinder
+ else if (s2 == 0.0f) // ray touching the brim of the cylinderEnd1
{
- t1 = t2;
+ t1 = tt2;
return 1;
}
else
{
- // t1 can be computed from the equation: dot(rayOrigin + t1 * rayDir - cylinderEnd1, cylinderDir) = 0
- t1 = -dcm / dcdr;
- return 2;
+ if (s2 > cylinderHeight) // intersecting point of parameter tt2 is outside on cylinderEnd2 side
+ {
+ // t2 can be computed from the equation: dot(rayOrigin + t2 * rayDir - cylinderEnd1, cylinderDir) = cylinderHeight
+ t2 = (cylinderHeight - dcm) / dcdr;
+ }
+ else
+ {
+ t2 = tt2;
+ }
+ if (dcm > 0.0f) // ray origin inside cylinder
+ {
+ t1 = t2;
+ return 1;
+ }
+ else
+ {
+ // t1 can be computed from the equation: dot(rayOrigin + t1 * rayDir - cylinderEnd1, cylinderDir) = 0
+ t1 = -dcm / dcdr;
+ return 2;
+ }
}
}
- }
- else if (s1 > cylinderHeight) // intersecting point of parameter tt1 is outside on cylinderEnd2 side
- {
- if (s2 > cylinderHeight) // intersecting point of parameter tt2 is outside on cylinderEnd2 side
+ else if (s1 > cylinderHeight) // intersecting point of parameter tt1 is outside on cylinderEnd2 side
{
- return 0;
+ if (s2 > cylinderHeight) // intersecting point of parameter tt2 is outside on cylinderEnd2 side
+ {
+ return 0;
+ }
+ else if (s2 == cylinderHeight)
+ {
+ t1 = tt2;
+ return 1;
+ }
+ else
+ {
+ if (s2 < 0.0f)
+ {
+ t2 = -dcm / dcdr;
+ }
+ else
+ {
+ t2 = tt2;
+ }
+ if (dcm < cylinderHeight)
+ {
+ t1 = t2;
+ return 1;
+ }
+ else
+ {
+ t1 = (cylinderHeight - dcm) / dcdr;
+ return 2;
+ }
+ }
}
- else if (s2 == cylinderHeight)
- {
- t1 = tt2;
- return 1;
- }
- else
+ else // intersecting point of parameter tt1 is in between two cylinder ends
{
if (s2 < 0.0f)
{
t2 = -dcm / dcdr;
}
+ else if (s2 > cylinderHeight)
+ {
+ t2 = (cylinderHeight - dcm) / dcdr;
+ }
else
{
t2 = tt2;
}
- if (dcm < cylinderHeight)
+ if (tt1 > 0.0f)
+ {
+ t1 = tt1;
+ return 2;
+ }
+ else
{
t1 = t2;
return 1;
}
- else
- {
- t1 = (cylinderHeight - dcm) / dcdr;
- return 2;
- }
}
}
- else // intersecting point of parameter tt1 is in between two cylinder ends
+
+ int Intersect::IntersectRayCone(
+ const Vector3& rayOrigin,
+ const Vector3& rayDir,
+ const Vector3& coneApex,
+ const Vector3& coneDir,
+ float coneHeight,
+ float coneBaseRadius,
+ float& t1,
+ float& t2)
{
- if (s2 < 0.0f)
+ // Q = rayOrgin, A = coneApex
+ Vector3 AQ = rayOrigin - coneApex;
+ float m = coneDir.Dot(AQ); // projection of m on cylinderDir
+ float k = coneDir.Dot(rayDir); // projection of rayDir on cylinderDir
+
+ if (m < 0.0f && k <= 0.0f)
{
- t2 = -dcm / dcdr;
+ // rayOrigin is outside the cone on coneApex side and rayDir is pointing away
+ return 0;
}
- else if (s2 > cylinderHeight)
- {
- t2 = (cylinderHeight - dcm) / dcdr;
- }
- else
- {
- t2 = tt2;
- }
- if (tt1 > 0.0f)
- {
- t1 = tt1;
- return 2;
- }
- else
- {
- t1 = t2;
- return 1;
- }
- }
-}
-
-int AZ::Intersect::IntersectRayCone(
- const Vector3& rayOrigin, const Vector3& rayDir,
- const Vector3& coneApex, const Vector3& coneDir, float coneHeight,
- float coneBaseRadius, float& t1, float& t2)
-{
- // Q = rayOrgin, A = coneApex
- Vector3 AQ = rayOrigin - coneApex;
- float m = coneDir.Dot(AQ); // projection of m on cylinderDir
- float k = coneDir.Dot(rayDir); // projection of rayDir on cylinderDir
-
- if (m < 0.0f && k <= 0.0f)
- {
- // rayOrigin is outside the cone on coneApex side and rayDir is pointing away
- return 0;
- }
- if (m > coneHeight && k >= 0.0f)
- {
- // rayOrigin is outside the cone on coneBase side and rayDir is pointing away
- return 0;
- }
-
- float r2 = coneBaseRadius * coneBaseRadius;
- float h2 = coneHeight * coneHeight;
-
- float m2 = m * m;
- float k2 = k * k;
- float q2 = AQ.Dot(AQ);
-
- float n = rayDir.Dot(AQ);
-
- const float EPSILON = 0.00001f;
-
- // point RP on the ray: RP(t) = rayOrigin + t * rayDir
- // point CP on the cone surface: similar triangle property
- // |dot(CP - A, coneDir) * coneDir| / coneHeight = |(CP - A) - (dot(CP - A, coneDir) * coneDir)| coneRadius
- // substitute RP(t) for CP: a*t^2 + 2b*t + c = 0, solving for t
- float a = (r2 + h2) * k2 - h2;
- float b = (r2 + h2) * m * k - h2 * n;
- float c = (r2 + h2) * m2 - h2 * q2;
-
- float discriminant = b * b - a * c;
- if (discriminant < -EPSILON)
- {
- return 0;
- }
- discriminant = AZ::GetMax(discriminant, 0.0f);
-
- if (fabsf(a) < EPSILON) // the ray is parallel to the cone surface's tangent line
- {
- if (b < EPSILON && fabsf(c) < EPSILON) // ray overlapping with cone surface
- {
- t1 = rayDir.Dot(coneApex - rayOrigin);
- }
- else // ray has only one intersecting point with the cone
- {
- t1 = -c / (2 * b);
- }
-
- t2 = (coneHeight - m) / k; // t2 can be computed from the equation: dot(Q + t2 * rayDir - A, coneDir) = coneHeight
-
- if (t1 < 0.0f && t2 < 0.0f)
+ if (m > coneHeight && k >= 0.0f)
{
+ // rayOrigin is outside the cone on coneBase side and rayDir is pointing away
return 0;
}
- if (fabsf(t1 - t2) < EPSILON) // the ray intersects the brim of the circumference of the cone base
- {
- return 1;
- }
+ float r2 = coneBaseRadius * coneBaseRadius;
+ float h2 = coneHeight * coneHeight;
- float s1 = m + t1 * k; // coneDir.Dot(rayOrigin + t1 * rayDir - coneApex);
- if (s1 < 0.0f || s1 > coneHeight)
+ float m2 = m * m;
+ float k2 = k * k;
+ float q2 = AQ.Dot(AQ);
+
+ float n = rayDir.Dot(AQ);
+
+ const float EPSILON = 0.00001f;
+
+ // point RP on the ray: RP(t) = rayOrigin + t * rayDir
+ // point CP on the cone surface: similar triangle property
+ // |dot(CP - A, coneDir) * coneDir| / coneHeight = |(CP - A) - (dot(CP - A, coneDir) * coneDir)| coneRadius
+ // substitute RP(t) for CP: a*t^2 + 2b*t + c = 0, solving for t
+ float a = (r2 + h2) * k2 - h2;
+ float b = (r2 + h2) * m * k - h2 * n;
+ float c = (r2 + h2) * m2 - h2 * q2;
+
+ float discriminant = b * b - a * c;
+ if (discriminant < -EPSILON)
{
return 0;
}
- else
+ discriminant = AZ::GetMax(discriminant, 0.0f);
+
+ if (fabsf(a) < EPSILON) // the ray is parallel to the cone surface's tangent line
{
- if (k < 0.0f) // ray shooting from base to apex
+ if (b < EPSILON && fabsf(c) < EPSILON) // ray overlapping with cone surface
{
- if (m >= coneHeight) // ray origin outside cone
- {
- float temp = t1;
- t1 = t2;
- t2 = temp;
- return 2;
- }
- else if (t1 >= 0.0f) // ray origin inside cone
- {
- t1 = t2;
- return 1;
- }
- else
- {
- return 0;
- }
+ t1 = rayDir.Dot(coneApex - rayOrigin);
+ }
+ else // ray has only one intersecting point with the cone
+ {
+ t1 = -c / (2 * b);
+ }
+
+ t2 = (coneHeight - m) / k; // t2 can be computed from the equation: dot(Q + t2 * rayDir - A, coneDir) = coneHeight
+
+ if (t1 < 0.0f && t2 < 0.0f)
+ {
+ return 0;
+ }
+
+ if (fabsf(t1 - t2) < EPSILON) // the ray intersects the brim of the circumference of the cone base
+ {
+ return 1;
+ }
+
+ float s1 = m + t1 * k; // coneDir.Dot(rayOrigin + t1 * rayDir - coneApex);
+ if (s1 < 0.0f || s1 > coneHeight)
+ {
+ return 0;
}
else
{
- if (m > coneHeight)
+ if (k < 0.0f) // ray shooting from base to apex
{
- return 0;
- }
- if (t1 >= 0.0f) // ray origin outside cone
- {
- return 2;
- }
- else
- {
- t1 = t2;
- return 1;
- }
- }
- }
- }
-
- if (discriminant < EPSILON) // two intersecting points coincide
- {
- if (fabsf(n * n - q2) < EPSILON) // the ray is through the apex
- {
- float cosineA2 = h2 / (r2 + h2);
- float cosineAQ2 = cosineA2 * q2;
-
- if (m2 > cosineAQ2) // the ray origin is inside the cone or its mirroring counterpart
- {
- if (m <= 0.0f) // the ray origin outside the cone on the apex side, shooting towards the base
- {
- t1 = -b / a;
- t2 = (coneHeight - m) / k;
- return 2;
- }
- else if (m >= coneHeight) // the ray origin is outside the cone on the base side, shooting towards towards the apex
- {
- t1 = (coneHeight - m) / k;
- t2 = -b / a;
- return 2;
- }
- else
- {
- if (k > 0.0f) // the ray origin is inside the cone, shooting towards the base
+ if (m >= coneHeight) // ray origin outside cone
{
- t1 = (coneHeight - m) / k;
+ float temp = t1;
+ t1 = t2;
+ t2 = temp;
+ return 2;
+ }
+ else if (t1 >= 0.0f) // ray origin inside cone
+ {
+ t1 = t2;
return 1;
}
- else // the ray origin is inside the cone, shooting towards the apex
+ else
+ {
+ return 0;
+ }
+ }
+ else
+ {
+ if (m > coneHeight)
+ {
+ return 0;
+ }
+ if (t1 >= 0.0f) // ray origin outside cone
+ {
+ return 2;
+ }
+ else
+ {
+ t1 = t2;
+ return 1;
+ }
+ }
+ }
+ }
+
+ if (discriminant < EPSILON) // two intersecting points coincide
+ {
+ if (fabsf(n * n - q2) < EPSILON) // the ray is through the apex
+ {
+ float cosineA2 = h2 / (r2 + h2);
+ float cosineAQ2 = cosineA2 * q2;
+
+ if (m2 > cosineAQ2) // the ray origin is inside the cone or its mirroring counterpart
+ {
+ if (m <= 0.0f) // the ray origin outside the cone on the apex side, shooting towards the base
{
t1 = -b / a;
+ t2 = (coneHeight - m) / k;
+ return 2;
+ }
+ else if (m >= coneHeight) // the ray origin is outside the cone on the base side, shooting towards towards the apex
+ {
+ t1 = (coneHeight - m) / k;
+ t2 = -b / a;
+ return 2;
+ }
+ else
+ {
+ if (k > 0.0f) // the ray origin is inside the cone, shooting towards the base
+ {
+ t1 = (coneHeight - m) / k;
+ return 1;
+ }
+ else // the ray origin is inside the cone, shooting towards the apex
+ {
+ t1 = -b / a;
+ return 1;
+ }
+ }
+ }
+ else // the ray origin is outside the cone
+ {
+ t1 = -b / a;
+ if (t1 > 0.0f)
+ {
return 1;
}
+ else
+ {
+ return 0;
+ }
}
}
- else // the ray origin is outside the cone
+ else // the ray is touching the cone surface but not through the apex
{
t1 = -b / a;
if (t1 > 0.0f)
{
+ float s1 = m + t1 * k; // projection length of the line segment from the apex to intersection_t1 onto the coneDir
+ if (s1 >= 0.0f && s1 <= coneHeight)
+ {
+ return 1;
+ }
+ }
+ return 0;
+ }
+ }
+
+ float sqrtDiscr = sqrt(discriminant);
+ float tt1 = (-b - sqrtDiscr) / a;
+ float tt2 = (-b + sqrtDiscr) / a;
+
+ /* Test s1 and s2 to see the positions of the intersecting points relative to the cylinder's two ends. */
+
+ // s1 = coneDir.Dot(rayOrigin + tt1 * rayDir - coneApex), which expands into the following
+ float s1 = m + tt1 * k;
+ // s2 = coneDir.Dot(rayOrigin + tt2 * rayDir - coneApex), which expands into the following
+ float s2 = m + tt2 * k;
+
+ if (s1 < 0.0f)
+ {
+ if (s2 < 0.0f || s2 > coneHeight)
+ {
+ return 0;
+ }
+ else
+ {
+ if (tt2 >= 0.0f) // ray origin outside cone
+ {
+ t1 = tt2;
+ t2 = (coneHeight - m) / k;
+ return 2;
+ }
+ else if (m > coneHeight) // ray origin outside cone on the base side, the
+ {
+ return 0;
+ }
+ else
+ {
+ t1 = (coneHeight - m) / k;
+ return 1;
+ }
+ }
+ }
+ else if (s1 > coneHeight)
+ {
+ if (s2 < 0.0f || s2 > coneHeight)
+ {
+ return 0;
+ }
+ else
+ {
+ if (tt2 < 0.0f)
+ {
+ return 0;
+ }
+ else if (m >= coneHeight)
+ {
+ t1 = (coneHeight - m) / k;
+ t2 = tt2;
+ return 2;
+ }
+ else // ray origin inside cone
+ {
+ t1 = tt2;
+ return 1;
+ }
+ }
+ }
+ else
+ {
+ if (s2 < 0.0f)
+ {
+ if (m >= coneHeight)
+ {
+ t1 = (coneHeight - m) / k;
+ t2 = tt1;
+ return 2;
+ }
+ else if (tt1 >= 0.0f) // ray origin inside cone
+ {
+ t1 = tt1;
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ else if (s2 > coneHeight)
+ {
+ if (tt1 >= 0.0f)
+ {
+ t1 = tt1;
+ t2 = (coneHeight - m) / k;
+ return 2;
+ }
+ else if (m <= coneHeight)
+ {
+ t1 = (coneHeight - m) / k;
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ else
+ {
+ if (tt1 >= 0.0f)
+ {
+ t1 = tt1;
+ t2 = tt2;
+ return 2;
+ }
+ else if (tt2 >= 0.0f)
+ {
+ t1 = tt2;
return 1;
}
else
@@ -788,778 +946,670 @@ int AZ::Intersect::IntersectRayCone(
}
}
}
- else // the ray is touching the cone surface but not through the apex
+ }
+
+ int Intersect::IntersectRayPlane(
+ const Vector3& rayOrigin, const Vector3& rayDir, const Vector3& planePos, const Vector3& planeNormal, float& t)
+ {
+ // (rayOrigin + t * rayDir - planePos).dot(planeNormal) = 0
+
+ const float EPSILON = 0.00001f;
+
+ float n = rayDir.Dot(planeNormal);
+ if (fabsf(n) < EPSILON)
{
- t1 = -b / a;
- if (t1 > 0.0f)
- {
- float s1 = m + t1 * k; // projection length of the line segment from the apex to intersection_t1 onto the coneDir
- if (s1 >= 0.0f && s1 <= coneHeight)
- {
- return 1;
- }
- }
return 0;
}
- }
-
- float sqrtDiscr = sqrt(discriminant);
- float tt1 = (-b - sqrtDiscr) / a;
- float tt2 = (-b + sqrtDiscr) / a;
- /* Test s1 and s2 to see the positions of the intersecting points relative to the cylinder's two ends. */
-
- // s1 = coneDir.Dot(rayOrigin + tt1 * rayDir - coneApex), which expands into the following
- float s1 = m + tt1 * k;
- // s2 = coneDir.Dot(rayOrigin + tt2 * rayDir - coneApex), which expands into the following
- float s2 = m + tt2 * k;
-
- if (s1 < 0.0f)
- {
- if (s2 < 0.0f || s2 > coneHeight)
+ t = planeNormal.Dot(planePos - rayOrigin) / n;
+ if (t < 0.0f)
{
return 0;
}
else
{
- if (tt2 >= 0.0f) // ray origin outside cone
- {
- t1 = tt2;
- t2 = (coneHeight - m) / k;
- return 2;
- }
- else if (m > coneHeight) // ray origin outside cone on the base side, the
- {
- return 0;
- }
- else
- {
- t1 = (coneHeight - m) / k;
- return 1;
- }
+ return 1;
}
}
- else if (s1 > coneHeight)
+
+ int Intersect::IntersectRayQuad(
+ const Vector3& rayOrigin,
+ const Vector3& rayDir,
+ const Vector3& vertexA,
+ const Vector3& vertexB,
+ const Vector3& vertexC,
+ const Vector3& vertexD,
+ float& t)
{
- if (s2 < 0.0f || s2 > coneHeight )
+ const float EPSILON = 0.0001f;
+
+ Vector3 AC = vertexC - vertexA;
+ Vector3 AB = vertexB - vertexA;
+ Vector3 QA = vertexA - rayOrigin;
+
+ Vector3 triN = AB.Cross(AC); // the normal of the triangle ABC
+ float dn = rayDir.Dot(triN);
+
+ // Early-out if ray is facing away from ABC triangle
+ if (dn * triN.Dot(QA) < 0)
{
return 0;
}
- else
+
+ Vector3 E = rayDir.Cross(QA);
+ float dnAbs = 0.0f;
+
+ if (dn < -EPSILON) // vertices have counter-clock wise winding when looking at the quad from rayOrigin
{
- if (tt2 < 0.0f)
- {
- return 0;
- }
- else if (m >= coneHeight)
- {
- t1 = (coneHeight - m) / k;
- t2 = tt2;
- return 2;
- }
- else // ray origin inside cone
- {
- t1 = tt2;
- return 1;
- }
+ dnAbs = -dn;
}
- }
- else
- {
- if (s2 < 0.0f)
+ else if (dn > EPSILON)
{
- if (m >= coneHeight)
- {
- t1 = (coneHeight - m) / k;
- t2 = tt1;
- return 2;
- }
- else if (tt1 >= 0.0f) // ray origin inside cone
- {
- t1 = tt1;
- return 1;
- }
- else
+ E = -E;
+ dnAbs = dn;
+ }
+ else // the ray is parallel to the quad plane
+ {
+ return 0;
+ }
+
+ // compute barycentric coordinates
+ float v = E.Dot(AC);
+
+ if (v >= 0.0f && v < dnAbs)
+ {
+ float w = -E.Dot(AB);
+ if (w < 0.0f || v + w > dnAbs)
{
return 0;
}
}
- else if (s2 > coneHeight)
+ else if (v < 0.0f && v > -dnAbs)
{
- if (tt1 >= 0.0f)
- {
- t1 = tt1;
- t2 = (coneHeight - m) / k;
- return 2;
- }
- else if (m <= coneHeight)
- {
- t1 = (coneHeight - m) / k;
- return 1;
- }
- else
+ Vector3 DA = vertexA - vertexD;
+ float w = E.Dot(DA);
+ if (w > 0.0f || v + w < -dnAbs) // v, w are negative
{
return 0;
}
}
else
{
- if (tt1 >= 0.0f)
- {
- t1 = tt1;
- t2 = tt2;
- return 2;
- }
- else if (tt2 >= 0.0f)
- {
- t1 = tt2;
- return 1;
- }
- else
- {
- return 0;
- }
+ return 0;
}
- }
-}
-int AZ::Intersect::IntersectRayPlane(const Vector3& rayOrigin, const Vector3& rayDir, const Vector3& planePos, const Vector3& planeNormal, float& t)
-{
- // (rayOrigin + t * rayDir - planePos).dot(planeNormal) = 0
-
- const float EPSILON = 0.00001f;
-
- float n = rayDir.Dot(planeNormal);
- if (fabsf(n) < EPSILON)
- {
- return 0;
- }
-
- t = planeNormal.Dot(planePos - rayOrigin) / n;
- if (t < 0.0f)
- {
- return 0;
- }
- else
- {
+ t = triN.Dot(QA) / dn;
return 1;
}
-}
-int AZ::Intersect::IntersectRayQuad(
- const Vector3& rayOrigin, const Vector3& rayDir, const Vector3& vertexA,
- const Vector3& vertexB, const Vector3& vertexC, const Vector3& vertexD, float& t)
-{
- const float EPSILON = 0.0001f;
-
- Vector3 AC = vertexC - vertexA;
- Vector3 AB = vertexB - vertexA;
- Vector3 QA = vertexA - rayOrigin;
-
- Vector3 triN = AB.Cross(AC); // the normal of the triangle ABC
- float dn = rayDir.Dot(triN);
-
- // Early-out if ray is facing away from ABC triangle
- if (dn * triN.Dot(QA) < 0)
+ // reference: Real-Time Collision Detection, 5.3.3 Intersecting Ray or Segment Against Box
+ bool Intersect::IntersectRayBox(
+ const Vector3& rayOrigin,
+ const Vector3& rayDir,
+ const Vector3& boxCenter,
+ const Vector3& boxAxis1,
+ const Vector3& boxAxis2,
+ const Vector3& boxAxis3,
+ float boxHalfExtent1,
+ float boxHalfExtent2,
+ float boxHalfExtent3,
+ float& t)
{
- return 0;
- }
+ const float EPSILON = 0.00001f;
- Vector3 E = rayDir.Cross(QA);
- float dnAbs = 0.0f;
+ float tmin = 0.0f; // the nearest to the ray origin
+ float tmax = AZ::Constants::FloatMax; // the farthest from the ray origin
- if (dn < -EPSILON) // vertices have counter-clock wise winding when looking at the quad from rayOrigin
- {
- dnAbs = -dn;
- }
- else if (dn > EPSILON)
- {
- E = -E;
- dnAbs = dn;
- }
- else // the ray is parallel to the quad plane
- {
- return 0;
- }
+ Vector3 P = boxCenter - rayOrigin; // precomputed variable for calculating the vector from rayOrigin to a point on each box facet
+ Vector3 QAp; // vector from rayOrigin to the center of the facet of boxAxis
+ Vector3 QAn; // vector from rayOrigin to the center of the facet of -boxAxis
+ float tp = 0.0f;
+ float tn = 0.0f;
+ bool isRayOriginInsideBox = true;
- // compute barycentric coordinates
- float v = E.Dot(AC);
+ /* Test the slab_1 formed by the planes with normals boxAxis1 and -boxAxis1. */
- if (v >= 0.0f && v < dnAbs)
- {
- float w = -E.Dot(AB);
- if (w < 0.0f || v + w > dnAbs)
+ Vector3 axis1 = boxHalfExtent1 * boxAxis1;
+
+ QAp = P + axis1;
+ tp = QAp.Dot(boxAxis1);
+
+ QAn = P - axis1;
+ tn = -QAn.Dot(boxAxis1);
+
+ float n = rayDir.Dot(boxAxis1);
+ if (fabsf(n) < EPSILON)
{
- return 0;
- }
- }
- else if (v < 0.0f && v > -dnAbs)
- {
- Vector3 DA = vertexA - vertexD;
- float w = E.Dot(DA);
- if (w > 0.0f || v + w < -dnAbs) // v, w are negative
- {
- return 0;
- }
- }
- else
- {
- return 0;
- }
-
- t = triN.Dot(QA) / dn;
- return 1;
-}
-
-// reference: Real-Time Collision Detection, 5.3.3 Intersecting Ray or Segment Against Box
-bool AZ::Intersect::IntersectRayBox(
- const Vector3& rayOrigin, const Vector3& rayDir, const Vector3& boxCenter, const Vector3& boxAxis1,
- const Vector3& boxAxis2, const Vector3& boxAxis3, float boxHalfExtent1, float boxHalfExtent2, float boxHalfExtent3, float& t)
-{
- const float EPSILON = 0.00001f;
-
- float tmin = 0.0f; // the nearest to the ray origin
- float tmax = AZ::Constants::FloatMax; // the farthest from the ray origin
-
- Vector3 P = boxCenter - rayOrigin; // precomputed variable for calculating the vector from rayOrigin to a point on each box facet
- Vector3 QAp; // vector from rayOrigin to the center of the facet of boxAxis
- Vector3 QAn; // vector from rayOrigin to the center of the facet of -boxAxis
- float tp = 0.0f;
- float tn = 0.0f;
- bool isRayOriginInsideBox = true;
-
- /* Test the slab_1 formed by the planes with normals boxAxis1 and -boxAxis1. */
-
- Vector3 axis1 = boxHalfExtent1 * boxAxis1;
-
- QAp = P + axis1;
- tp = QAp.Dot(boxAxis1);
-
- QAn = P - axis1;
- tn = -QAn.Dot(boxAxis1);
-
- float n = rayDir.Dot(boxAxis1);
- if (fabsf(n) < EPSILON)
- {
- // If the ray is parallel to the slab and the ray origin is outside, return no intersection.
- if (tp < 0.0f || tn < 0.0f)
- {
- return false;
- }
- }
- else
- {
- if (tp < 0.0f || tn < 0.0f)
- {
- isRayOriginInsideBox = false;
- }
-
- float div = 1.0f / n;
- float t1 = tp * div;
- float t2 = tn * (-div);
- if (t1 > t2)
- {
- AZStd::swap(t1, t2);
- }
- tmin = AZ::GetMax(tmin, t1);
- tmax = AZ::GetMin(tmax, t2);
- if (tmin > tmax)
- {
- return false;
- }
- }
-
- /* test the slab_2 formed by plane with normals boxAxis2 and -boxAxis2 */
-
- Vector3 axis2 = boxHalfExtent2 * boxAxis2;
-
- QAp = P + axis2;
- tp = QAp.Dot(boxAxis2);
-
- QAn = P - axis2;
- tn = -QAn.Dot(boxAxis2);
-
- n = rayDir.Dot(boxAxis2);
- if (fabsf(n) < EPSILON)
- {
- // If the ray is parallel to the slab and the ray origin is outside, return no intersection.
- if (tp < 0.0f || tn < 0.0f)
- {
- return false;
- }
- }
- else
- {
- if (tp < 0.0f || tn < 0.0f)
- {
- isRayOriginInsideBox = false;
- }
-
- float div = 1.0f / n;
- float t1 = tp * div;
- float t2 = tn * (-div);
- if (t1 > t2)
- {
- AZStd::swap(t1, t2);
- }
- tmin = AZ::GetMax(tmin, t1);
- tmax = AZ::GetMin(tmax, t2);
- if (tmin > tmax)
- {
- return false;
- }
- }
-
- /* test the slab_3 formed by plane with normals boxAxis3 and -boxAxis3 */
-
- Vector3 axis3 = boxHalfExtent3 * boxAxis3;
-
- QAp = P + axis3;
- tp = QAp.Dot(boxAxis3);
-
- QAn = P - axis3;
- tn = -QAn.Dot(boxAxis3);
-
- n = rayDir.Dot(boxAxis3);
- if (fabsf(n) < EPSILON)
- {
- // If the ray is parallel to the slab and the ray origin is outside, return no intersection.
- if (tp < 0.0f || tn < 0.0f)
- {
- return false;
- }
- }
- else
- {
- if (tp < 0.0f || tn < 0.0f)
- {
- isRayOriginInsideBox = false;
- }
-
- float div = 1.0f / n;
- float t1 = tp * div;
- float t2 = tn * (-div);
- if (t1 > t2)
- {
- AZStd::swap(t1, t2);
- }
- tmin = AZ::GetMax(tmin, t1);
- tmax = AZ::GetMin(tmax, t2);
- if (tmin > tmax)
- {
- return false;
- }
- }
-
- t = (isRayOriginInsideBox ? tmax : tmin);
- return true;
-}
-
-bool AZ::Intersect::IntersectRayObb(const Vector3& rayOrigin, const Vector3& rayDir, const Obb& obb, float& t)
-{
- return AZ::Intersect::IntersectRayBox(rayOrigin, rayDir, obb.GetPosition(),
- obb.GetAxisX(), obb.GetAxisY(), obb.GetAxisZ(),
- obb.GetHalfLengthX(), obb.GetHalfLengthY(), obb.GetHalfLengthZ(), t);
-}
-
-//=========================================================================
-// IntersectSegmentCylinder
-// [10/21/2009]
-//=========================================================================
-CylinderIsectTypes
-AZ::Intersect::IntersectSegmentCylinder(
- const Vector3& sa, const Vector3& dir, const Vector3& p, const Vector3& q, const float r, float& t)
-{
- const float epsilon = 0.001f;
- Vector3 d = q - p; // can be cached
- Vector3 m = sa - p; // -"-
- Vector3 n = /*sb - sa*/ dir; // -"-
-
- float md = m.Dot(d);
- float nd = n.Dot(d);
- float dd = d.Dot(d);
-
- // Test if segment fully outside either endcap of cylinder
- if (md < 0.0f && md + nd < 0.0f)
- {
- return RR_ISECT_RAY_CYL_NONE; // Segment outside 'p' side of cylinder
- }
- if (md > dd && md + nd > dd)
- {
- return RR_ISECT_RAY_CYL_NONE; // Segment outside 'q' side of cylinder
- }
- float nn = n.Dot(n);
- float mn = m.Dot(n);
- float a = dd * nn - nd * nd;
- float k = m.Dot(m) - r * r;
- float c = dd * k - md * md;
- if (std::fabs(a) < epsilon)
- {
- // Segment runs parallel to cylinder axis
- if (c > 0.0f)
- {
- return RR_ISECT_RAY_CYL_NONE; // 'a' and thus the segment lie outside cylinder
- }
- // Now known that segment intersects cylinder; figure out how it intersects
- if (md < 0.0f)
- {
- t = -mn / nn; // Intersect segment against 'p' endcap
- return RR_ISECT_RAY_CYL_P_SIDE;
- }
- else if (md > dd)
- {
- t = (nd - mn) / nn; // Intersect segment against 'q' endcap
- return RR_ISECT_RAY_CYL_Q_SIDE;
+ // If the ray is parallel to the slab and the ray origin is outside, return no intersection.
+ if (tp < 0.0f || tn < 0.0f)
+ {
+ return false;
+ }
}
else
{
- // 'a' lies inside cylinder
- t = 0.0f;
- return RR_ISECT_RAY_CYL_SA_INSIDE;
- }
- }
- float b = dd * mn - nd * md;
- float discr = b * b - a * c;
- if (discr < 0.0f)
- {
- return RR_ISECT_RAY_CYL_NONE; // No real roots; no intersection
- }
- t = (-b - Sqrt(discr)) / a;
- CylinderIsectTypes result = RR_ISECT_RAY_CYL_PQ; // default along the PQ segment
+ if (tp < 0.0f || tn < 0.0f)
+ {
+ isRayOriginInsideBox = false;
+ }
- if (md + t * nd < 0.0f)
- {
- // Intersection outside cylinder on 'p' side
- if (nd <= 0.0f)
- {
- return RR_ISECT_RAY_CYL_NONE; // Segment pointing away from endcap
+ float div = 1.0f / n;
+ float t1 = tp * div;
+ float t2 = tn * (-div);
+ if (t1 > t2)
+ {
+ AZStd::swap(t1, t2);
+ }
+ tmin = AZ::GetMax(tmin, t1);
+ tmax = AZ::GetMin(tmax, t2);
+ if (tmin > tmax)
+ {
+ return false;
+ }
}
- float t0 = -md / nd;
- // Keep intersection if Dot(S(t) - p, S(t) - p) <= r^2
- if (k + t0 * (2.0f * mn + t0 * nn) <= 0.0f)
+
+ /* test the slab_2 formed by plane with normals boxAxis2 and -boxAxis2 */
+
+ Vector3 axis2 = boxHalfExtent2 * boxAxis2;
+
+ QAp = P + axis2;
+ tp = QAp.Dot(boxAxis2);
+
+ QAn = P - axis2;
+ tn = -QAn.Dot(boxAxis2);
+
+ n = rayDir.Dot(boxAxis2);
+ if (fabsf(n) < EPSILON)
{
- // if( t0 < 0.0f ) t0 = 0.0f; // it's inside the cylinder
- t = t0;
- result = RR_ISECT_RAY_CYL_P_SIDE;
+ // If the ray is parallel to the slab and the ray origin is outside, return no intersection.
+ if (tp < 0.0f || tn < 0.0f)
+ {
+ return false;
+ }
}
else
{
- return RR_ISECT_RAY_CYL_NONE;
+ if (tp < 0.0f || tn < 0.0f)
+ {
+ isRayOriginInsideBox = false;
+ }
+
+ float div = 1.0f / n;
+ float t1 = tp * div;
+ float t2 = tn * (-div);
+ if (t1 > t2)
+ {
+ AZStd::swap(t1, t2);
+ }
+ tmin = AZ::GetMax(tmin, t1);
+ tmax = AZ::GetMin(tmax, t2);
+ if (tmin > tmax)
+ {
+ return false;
+ }
}
- }
- else if (md + t * nd > dd)
- {
- // Intersection outside cylinder on 'q' side
- if (nd >= 0.0f)
+
+ /* test the slab_3 formed by plane with normals boxAxis3 and -boxAxis3 */
+
+ Vector3 axis3 = boxHalfExtent3 * boxAxis3;
+
+ QAp = P + axis3;
+ tp = QAp.Dot(boxAxis3);
+
+ QAn = P - axis3;
+ tn = -QAn.Dot(boxAxis3);
+
+ n = rayDir.Dot(boxAxis3);
+ if (fabsf(n) < EPSILON)
{
- return RR_ISECT_RAY_CYL_NONE; // Segment pointing away from endcap
- }
- float t0 = (dd - md) / nd;
- // Keep intersection if Dot(S(t) - q, S(t) - q) <= r^2
- if (k + dd - 2.0f * md + t0 * (2.0f * (mn - nd) + t0 * nn) <= 0.0f)
- {
- // if( t0 < 0.0f ) t0 = 0.0f; // it's inside the cylinder
- t = t0;
- result = RR_ISECT_RAY_CYL_Q_SIDE;
+ // If the ray is parallel to the slab and the ray origin is outside, return no intersection.
+ if (tp < 0.0f || tn < 0.0f)
+ {
+ return false;
+ }
}
else
{
- return RR_ISECT_RAY_CYL_NONE;
+ if (tp < 0.0f || tn < 0.0f)
+ {
+ isRayOriginInsideBox = false;
+ }
+
+ float div = 1.0f / n;
+ float t1 = tp * div;
+ float t2 = tn * (-div);
+ if (t1 > t2)
+ {
+ AZStd::swap(t1, t2);
+ }
+ tmin = AZ::GetMax(tmin, t1);
+ tmax = AZ::GetMin(tmax, t2);
+ if (tmin > tmax)
+ {
+ return false;
+ }
}
+
+ t = (isRayOriginInsideBox ? tmax : tmin);
+ return true;
}
- // Segment intersects cylinder between the end-caps; t is correct
- if (t > 1.0f)
+ bool Intersect::IntersectRayObb(const Vector3& rayOrigin, const Vector3& rayDir, const Obb& obb, float& t)
{
- return RR_ISECT_RAY_CYL_NONE; // Intersection lies outside segment
+ return Intersect::IntersectRayBox(
+ rayOrigin, rayDir, obb.GetPosition(), obb.GetAxisX(), obb.GetAxisY(), obb.GetAxisZ(), obb.GetHalfLengthX(),
+ obb.GetHalfLengthY(), obb.GetHalfLengthZ(), t);
}
- else if (t < 0.0f)
+
+ //=========================================================================
+ // IntersectSegmentCylinder
+ // [10/21/2009]
+ //=========================================================================
+ Intersect::CylinderIsectTypes Intersect::IntersectSegmentCylinder(
+ const Vector3& sa, const Vector3& dir, const Vector3& p, const Vector3& q, const float r, float& t)
{
- if (c <= 0.0f)
+ const float epsilon = 0.001f;
+ Vector3 d = q - p; // can be cached
+ Vector3 m = sa - p; // -"-
+ Vector3 n = /*sb - sa*/ dir; // -"-
+
+ float md = m.Dot(d);
+ float nd = n.Dot(d);
+ float dd = d.Dot(d);
+
+ // Test if segment fully outside either endcap of cylinder
+ if (md < 0.0f && md + nd < 0.0f)
{
- t = 0.0f;
- return RR_ISECT_RAY_CYL_SA_INSIDE; // Segment starts inside
+ return RR_ISECT_RAY_CYL_NONE; // Segment outside 'p' side of cylinder
}
- else
+ if (md > dd && md + nd > dd)
+ {
+ return RR_ISECT_RAY_CYL_NONE; // Segment outside 'q' side of cylinder
+ }
+ float nn = n.Dot(n);
+ float mn = m.Dot(n);
+ float a = dd * nn - nd * nd;
+ float k = m.Dot(m) - r * r;
+ float c = dd * k - md * md;
+ if (std::fabs(a) < epsilon)
+ {
+ // Segment runs parallel to cylinder axis
+ if (c > 0.0f)
+ {
+ return RR_ISECT_RAY_CYL_NONE; // 'a' and thus the segment lie outside cylinder
+ }
+ // Now known that segment intersects cylinder; figure out how it intersects
+ if (md < 0.0f)
+ {
+ t = -mn / nn; // Intersect segment against 'p' endcap
+ return RR_ISECT_RAY_CYL_P_SIDE;
+ }
+ else if (md > dd)
+ {
+ t = (nd - mn) / nn; // Intersect segment against 'q' endcap
+ return RR_ISECT_RAY_CYL_Q_SIDE;
+ }
+ else
+ {
+ // 'a' lies inside cylinder
+ t = 0.0f;
+ return RR_ISECT_RAY_CYL_SA_INSIDE;
+ }
+ }
+ float b = dd * mn - nd * md;
+ float discr = b * b - a * c;
+ if (discr < 0.0f)
+ {
+ return RR_ISECT_RAY_CYL_NONE; // No real roots; no intersection
+ }
+ t = (-b - Sqrt(discr)) / a;
+ CylinderIsectTypes result = RR_ISECT_RAY_CYL_PQ; // default along the PQ segment
+
+ if (md + t * nd < 0.0f)
+ {
+ // Intersection outside cylinder on 'p' side
+ if (nd <= 0.0f)
+ {
+ return RR_ISECT_RAY_CYL_NONE; // Segment pointing away from endcap
+ }
+ float t0 = -md / nd;
+ // Keep intersection if Dot(S(t) - p, S(t) - p) <= r^2
+ if (k + t0 * (2.0f * mn + t0 * nn) <= 0.0f)
+ {
+ // if( t0 < 0.0f ) t0 = 0.0f; // it's inside the cylinder
+ t = t0;
+ result = RR_ISECT_RAY_CYL_P_SIDE;
+ }
+ else
+ {
+ return RR_ISECT_RAY_CYL_NONE;
+ }
+ }
+ else if (md + t * nd > dd)
+ {
+ // Intersection outside cylinder on 'q' side
+ if (nd >= 0.0f)
+ {
+ return RR_ISECT_RAY_CYL_NONE; // Segment pointing away from endcap
+ }
+ float t0 = (dd - md) / nd;
+ // Keep intersection if Dot(S(t) - q, S(t) - q) <= r^2
+ if (k + dd - 2.0f * md + t0 * (2.0f * (mn - nd) + t0 * nn) <= 0.0f)
+ {
+ // if( t0 < 0.0f ) t0 = 0.0f; // it's inside the cylinder
+ t = t0;
+ result = RR_ISECT_RAY_CYL_Q_SIDE;
+ }
+ else
+ {
+ return RR_ISECT_RAY_CYL_NONE;
+ }
+ }
+
+ // Segment intersects cylinder between the end-caps; t is correct
+ if (t > 1.0f)
{
return RR_ISECT_RAY_CYL_NONE; // Intersection lies outside segment
}
- }
- else
- {
- return result;
- }
-}
-//=========================================================================
-// IntersectSegmentCapsule
-// [10/21/2009]
-//=========================================================================
-CapsuleIsectTypes
-AZ::Intersect::IntersectSegmentCapsule(const Vector3& sa, const Vector3& dir, const Vector3& p, const Vector3& q, const float r, float& t)
-{
- int result = IntersectSegmentCylinder(sa, dir, p, q, r, t);
-
- if (result == RR_ISECT_RAY_CYL_SA_INSIDE)
- {
- return ISECT_RAY_CAPSULE_SA_INSIDE;
- }
-
- if (result == RR_ISECT_RAY_CYL_PQ)
- {
- return ISECT_RAY_CAPSULE_PQ;
- }
-
- Vector3 dirNorm = dir;
- float len = dirNorm.NormalizeWithLength();
-
- // check spheres
- float timeLenTop, timeLenBottom;
- int resultTop = IntersectRaySphere(sa, dirNorm, p, r, timeLenTop);
- if (resultTop == ISECT_RAY_SPHERE_SA_INSIDE)
- {
- return ISECT_RAY_CAPSULE_SA_INSIDE;
- }
- int resultBottom = IntersectRaySphere(sa, dirNorm, q, r, timeLenBottom);
- if (resultBottom == ISECT_RAY_SPHERE_SA_INSIDE)
- {
- return ISECT_RAY_CAPSULE_SA_INSIDE;
- }
-
- if (resultTop == ISECT_RAY_SPHERE_ISECT)
- {
- if (resultBottom == ISECT_RAY_SPHERE_ISECT)
+ else if (t < 0.0f)
{
- // if we intersect both spheres pick the closest one
- if (timeLenTop < timeLenBottom)
+ if (c <= 0.0f)
+ {
+ t = 0.0f;
+ return RR_ISECT_RAY_CYL_SA_INSIDE; // Segment starts inside
+ }
+ else
+ {
+ return RR_ISECT_RAY_CYL_NONE; // Intersection lies outside segment
+ }
+ }
+ else
+ {
+ return result;
+ }
+ }
+ //=========================================================================
+ // IntersectSegmentCapsule
+ // [10/21/2009]
+ //=========================================================================
+ Intersect::CapsuleIsectTypes Intersect::IntersectSegmentCapsule(
+ const Vector3& sa, const Vector3& dir, const Vector3& p, const Vector3& q, const float r, float& t)
+ {
+ int result = IntersectSegmentCylinder(sa, dir, p, q, r, t);
+
+ if (result == RR_ISECT_RAY_CYL_SA_INSIDE)
+ {
+ return ISECT_RAY_CAPSULE_SA_INSIDE;
+ }
+
+ if (result == RR_ISECT_RAY_CYL_PQ)
+ {
+ return ISECT_RAY_CAPSULE_PQ;
+ }
+
+ Vector3 dirNorm = dir;
+ float len = dirNorm.NormalizeWithLength();
+
+ // check spheres
+ float timeLenTop, timeLenBottom;
+ int resultTop = IntersectRaySphere(sa, dirNorm, p, r, timeLenTop);
+ if (resultTop == ISECT_RAY_SPHERE_SA_INSIDE)
+ {
+ return ISECT_RAY_CAPSULE_SA_INSIDE;
+ }
+ int resultBottom = IntersectRaySphere(sa, dirNorm, q, r, timeLenBottom);
+ if (resultBottom == ISECT_RAY_SPHERE_SA_INSIDE)
+ {
+ return ISECT_RAY_CAPSULE_SA_INSIDE;
+ }
+
+ if (resultTop == ISECT_RAY_SPHERE_ISECT)
+ {
+ if (resultBottom == ISECT_RAY_SPHERE_ISECT)
+ {
+ // if we intersect both spheres pick the closest one
+ if (timeLenTop < timeLenBottom)
+ {
+ t = timeLenTop / len;
+ return ISECT_RAY_CAPSULE_P_SIDE;
+ }
+ else
+ {
+ t = timeLenBottom / len;
+ return ISECT_RAY_CAPSULE_Q_SIDE;
+ }
+ }
+ else
{
t = timeLenTop / len;
return ISECT_RAY_CAPSULE_P_SIDE;
}
- else
- {
- t = timeLenBottom / len;
- return ISECT_RAY_CAPSULE_Q_SIDE;
- }
}
- else
+
+ if (resultBottom == ISECT_RAY_SPHERE_ISECT)
{
- t = timeLenTop / len;
- return ISECT_RAY_CAPSULE_P_SIDE;
+ t = timeLenBottom / len;
+ return ISECT_RAY_CAPSULE_Q_SIDE;
}
+
+ return ISECT_RAY_CAPSULE_NONE;
}
- if (resultBottom == ISECT_RAY_SPHERE_ISECT)
+ //=========================================================================
+ // IntersectSegmentPolyhedron
+ // [10/21/2009]
+ //=========================================================================
+ bool Intersect::IntersectSegmentPolyhedron(
+ const Vector3& sa,
+ const Vector3& dir,
+ const Plane p[],
+ int numPlanes,
+ float& tfirst,
+ float& tlast,
+ int& iFirstPlane,
+ int& iLastPlane)
{
- t = timeLenBottom / len;
- return ISECT_RAY_CAPSULE_Q_SIDE;
- }
-
- return ISECT_RAY_CAPSULE_NONE;
-}
-
-//=========================================================================
-// IntersectSegmentPolyhedron
-// [10/21/2009]
-//=========================================================================
-bool
-AZ::Intersect::IntersectSegmentPolyhedron(
- const Vector3& sa, const Vector3& dir, const Plane p[], int numPlanes,
- float& tfirst, float& tlast, int& iFirstPlane, int& iLastPlane)
-{
- // Compute direction vector for the segment
- Vector3 d = /*b - a*/ dir;
- // Set initial interval to being the whole segment. For a ray, tlast should be
- // set to +RR_FLT_MAX. For a line, additionally tfirst should be set to -RR_FLT_MAX
- tfirst = 0.0f;
- tlast = 1.0f;
- iFirstPlane = -1;
- iLastPlane = -1;
- // Intersect segment against each plane
- for (int i = 0; i < numPlanes; i++)
- {
- const Vector4& plane = p[i].GetPlaneEquationCoefficients();
-
- float denom = plane.Dot3(d);
- // don't forget we store -D in the plane
- float dist = (-plane.GetW()) - plane.Dot3(sa);
- // Test if segment runs parallel to the plane
- if (denom == 0.0f)
+ // Compute direction vector for the segment
+ Vector3 d = /*b - a*/ dir;
+ // Set initial interval to being the whole segment. For a ray, tlast should be
+ // set to +RR_FLT_MAX. For a line, additionally tfirst should be set to -RR_FLT_MAX
+ tfirst = 0.0f;
+ tlast = 1.0f;
+ iFirstPlane = -1;
+ iLastPlane = -1;
+ // Intersect segment against each plane
+ for (int i = 0; i < numPlanes; i++)
{
- // If so, return "no intersection" if segment lies outside plane
- if (dist < 0.0f)
+ const Vector4& plane = p[i].GetPlaneEquationCoefficients();
+
+ float denom = plane.Dot3(d);
+ // don't forget we store -D in the plane
+ float dist = (-plane.GetW()) - plane.Dot3(sa);
+ // Test if segment runs parallel to the plane
+ if (denom == 0.0f)
{
- return false;
- }
- }
- else
- {
- // Compute parameterized t value for intersection with current plane
- float t = dist / denom;
- if (denom < 0.0f)
- {
- // When entering half space, update tfirst if t is larger
- if (t > tfirst)
+ // If so, return "no intersection" if segment lies outside plane
+ if (dist < 0.0f)
{
- tfirst = t;
- iFirstPlane = i;
+ return false;
}
}
else
{
- // When exiting half space, update tlast if t is smaller
- if (t < tlast)
+ // Compute parameterized t value for intersection with current plane
+ float t = dist / denom;
+ if (denom < 0.0f)
{
- tlast = t;
- iLastPlane = i;
+ // When entering half space, update tfirst if t is larger
+ if (t > tfirst)
+ {
+ tfirst = t;
+ iFirstPlane = i;
+ }
+ }
+ else
+ {
+ // When exiting half space, update tlast if t is smaller
+ if (t < tlast)
+ {
+ tlast = t;
+ iLastPlane = i;
+ }
+ }
+
+ // Exit with "no intersection" if intersection becomes empty
+ if (tfirst > tlast)
+ {
+ return false;
}
}
-
- // Exit with "no intersection" if intersection becomes empty
- if (tfirst > tlast)
- {
- return false;
- }
}
- }
- //DBG_Assert(iFirstPlane!=-1&&iLastPlane!=-1,("We have some bad border case to have only one plane, fix this function!"));
- if (iFirstPlane == -1 && iLastPlane == -1)
- {
- return false;
- }
-
- // A nonzero logical intersection, so the segment intersects the polyhedron
- return true;
-}
-
-//=========================================================================
-// ClosestSegmentSegment
-// [10/21/2009]
-//=========================================================================
-void
-AZ::Intersect::ClosestSegmentSegment(
- const Vector3& segment1Start, const Vector3& segment1End,
- const Vector3& segment2Start, const Vector3& segment2End,
- float& segment1Proportion, float& segment2Proportion,
- Vector3& closestPointSegment1, Vector3& closestPointSegment2,
- float epsilon)
-{
- const Vector3 segment1 = segment1End - segment1Start;
- const Vector3 segment2 = segment2End - segment2Start;
- const Vector3 segmentStartsVector = segment1Start - segment2Start;
- const float segment1LengthSquared = segment1.Dot(segment1);
- const float segment2LengthSquared = segment2.Dot(segment2);
-
- // Check if both segments degenerate into points
- if (segment1LengthSquared <= epsilon && segment2LengthSquared <= epsilon)
- {
- segment1Proportion = 0.0f;
- segment2Proportion = 0.0f;
- closestPointSegment1 = segment1Start;
- closestPointSegment2 = segment2Start;
- return;
- }
-
- float projSegment2SegmentStarts = segment2.Dot(segmentStartsVector);
-
- // Check if segment 1 degenerates into a point
- if (segment1LengthSquared <= epsilon)
- {
- segment1Proportion = 0.0f;
- segment2Proportion = AZ::GetClamp(projSegment2SegmentStarts / segment2LengthSquared, 0.0f, 1.0f);
- }
- else
- {
- float projSegment1SegmentStarts = segment1.Dot(segmentStartsVector);
- // Check if segment 2 degenerates into a point
- if (segment2LengthSquared <= epsilon)
+ // DBG_Assert(iFirstPlane!=-1&&iLastPlane!=-1,("We have some bad border case to have only one plane, fix this function!"));
+ if (iFirstPlane == -1 && iLastPlane == -1)
{
- segment1Proportion = AZ::GetClamp(-projSegment1SegmentStarts / segment1LengthSquared, 0.0f, 1.0f);
+ return false;
+ }
+
+ // A nonzero logical intersection, so the segment intersects the polyhedron
+ return true;
+ }
+
+ //=========================================================================
+ // ClosestSegmentSegment
+ // [10/21/2009]
+ //=========================================================================
+ void Intersect::ClosestSegmentSegment(
+ const Vector3& segment1Start,
+ const Vector3& segment1End,
+ const Vector3& segment2Start,
+ const Vector3& segment2End,
+ float& segment1Proportion,
+ float& segment2Proportion,
+ Vector3& closestPointSegment1,
+ Vector3& closestPointSegment2,
+ float epsilon)
+ {
+ const Vector3 segment1 = segment1End - segment1Start;
+ const Vector3 segment2 = segment2End - segment2Start;
+ const Vector3 segmentStartsVector = segment1Start - segment2Start;
+ const float segment1LengthSquared = segment1.Dot(segment1);
+ const float segment2LengthSquared = segment2.Dot(segment2);
+
+ // Check if both segments degenerate into points
+ if (segment1LengthSquared <= epsilon && segment2LengthSquared <= epsilon)
+ {
+ segment1Proportion = 0.0f;
segment2Proportion = 0.0f;
+ closestPointSegment1 = segment1Start;
+ closestPointSegment2 = segment2Start;
+ return;
+ }
+
+ float projSegment2SegmentStarts = segment2.Dot(segmentStartsVector);
+
+ // Check if segment 1 degenerates into a point
+ if (segment1LengthSquared <= epsilon)
+ {
+ segment1Proportion = 0.0f;
+ segment2Proportion = AZ::GetClamp(projSegment2SegmentStarts / segment2LengthSquared, 0.0f, 1.0f);
}
else
{
- // The general non-degenerate case starts here
- float projSegment1Segment2 = segment1.Dot(segment2);
- float denom = segment1LengthSquared * segment2LengthSquared - projSegment1Segment2 * projSegment1Segment2; // Always nonnegative
-
- // If segments not parallel, compute closest point on segment1 to segment2, and
- // clamp to segment1. Else pick arbitrary segment1Proportion (here 0)
- if (denom != 0.0f)
+ float projSegment1SegmentStarts = segment1.Dot(segmentStartsVector);
+ // Check if segment 2 degenerates into a point
+ if (segment2LengthSquared <= epsilon)
{
- segment1Proportion = AZ::GetClamp((projSegment1Segment2 * projSegment2SegmentStarts - projSegment1SegmentStarts * segment2LengthSquared) / denom, 0.0f, 1.0f);
+ segment1Proportion = AZ::GetClamp(-projSegment1SegmentStarts / segment1LengthSquared, 0.0f, 1.0f);
+ segment2Proportion = 0.0f;
}
else
{
- segment1Proportion = 0.0f;
- }
+ // The general non-degenerate case starts here
+ float projSegment1Segment2 = segment1.Dot(segment2);
+ float denom =
+ segment1LengthSquared * segment2LengthSquared - projSegment1Segment2 * projSegment1Segment2; // Always nonnegative
- // Compute point on segment2 closest to segment1 using
- segment2Proportion = (projSegment1Segment2 * segment1Proportion + projSegment2SegmentStarts) / segment2LengthSquared;
+ // If segments not parallel, compute closest point on segment1 to segment2, and
+ // clamp to segment1. Else pick arbitrary segment1Proportion (here 0)
+ if (denom != 0.0f)
+ {
+ segment1Proportion = AZ::GetClamp(
+ (projSegment1Segment2 * projSegment2SegmentStarts - projSegment1SegmentStarts * segment2LengthSquared) / denom,
+ 0.0f, 1.0f);
+ }
+ else
+ {
+ segment1Proportion = 0.0f;
+ }
- // If segment2Proportion in [0,1] done. Else clamp segment2Proportion, recompute segment1Proportion for the new value of segment2Proportion
- // and clamp segment1Proportion to [0, 1]
- if (segment2Proportion < 0.0f)
- {
- segment2Proportion = 0.0f;
- segment1Proportion = AZ::GetClamp(-projSegment1SegmentStarts / segment1LengthSquared, 0.0f, 1.0f);
- }
- else if (segment2Proportion > 1.0f)
- {
- segment2Proportion = 1.0f;
- segment1Proportion = AZ::GetClamp((projSegment1Segment2 - projSegment1SegmentStarts) / segment1LengthSquared, 0.0f, 1.0f);
+ // Compute point on segment2 closest to segment1 using
+ segment2Proportion = (projSegment1Segment2 * segment1Proportion + projSegment2SegmentStarts) / segment2LengthSquared;
+
+ // If segment2Proportion in [0,1] done. Else clamp segment2Proportion, recompute segment1Proportion for the new value of
+ // segment2Proportion and clamp segment1Proportion to [0, 1]
+ if (segment2Proportion < 0.0f)
+ {
+ segment2Proportion = 0.0f;
+ segment1Proportion = AZ::GetClamp(-projSegment1SegmentStarts / segment1LengthSquared, 0.0f, 1.0f);
+ }
+ else if (segment2Proportion > 1.0f)
+ {
+ segment2Proportion = 1.0f;
+ segment1Proportion =
+ AZ::GetClamp((projSegment1Segment2 - projSegment1SegmentStarts) / segment1LengthSquared, 0.0f, 1.0f);
+ }
}
}
+
+ closestPointSegment1 = segment1Start + segment1 * segment1Proportion;
+ closestPointSegment2 = segment2Start + segment2 * segment2Proportion;
}
- closestPointSegment1 = segment1Start + segment1 * segment1Proportion;
- closestPointSegment2 = segment2Start + segment2 * segment2Proportion;
-}
-
-void AZ::Intersect::ClosestSegmentSegment(
- const Vector3& segment1Start, const Vector3& segment1End,
- const Vector3& segment2Start, const Vector3& segment2End,
- Vector3& closestPointSegment1, Vector3& closestPointSegment2,
- float epsilon)
-{
- float proportion1, proportion2;
- AZ::Intersect::ClosestSegmentSegment(
- segment1Start, segment1End,
- segment2Start, segment2End,
- proportion1, proportion2,
- closestPointSegment1, closestPointSegment2, epsilon);
-}
-
-void AZ::Intersect::ClosestPointSegment(
- const Vector3& point, const Vector3& segmentStart, const Vector3& segmentEnd,
- float& proportion, Vector3& closestPointOnSegment)
-{
- Vector3 segment = segmentEnd - segmentStart;
- // Project point onto segment, but deferring divide by segment.Dot(segment)
- proportion = (point - segmentStart).Dot(segment);
- if (proportion <= 0.0f)
+ void Intersect::ClosestSegmentSegment(
+ const Vector3& segment1Start,
+ const Vector3& segment1End,
+ const Vector3& segment2Start,
+ const Vector3& segment2End,
+ Vector3& closestPointSegment1,
+ Vector3& closestPointSegment2,
+ float epsilon)
{
- // Point projects outside the [segmentStart, segmentEnd] interval, on the segmentStart side, clamp to segmentStart
- proportion = 0.0f;
- closestPointOnSegment = segmentStart;
+ float proportion1, proportion2;
+ Intersect::ClosestSegmentSegment(
+ segment1Start, segment1End, segment2Start, segment2End, proportion1, proportion2, closestPointSegment1, closestPointSegment2,
+ epsilon);
}
- else
+
+ void Intersect::ClosestPointSegment(
+ const Vector3& point, const Vector3& segmentStart, const Vector3& segmentEnd, float& proportion, Vector3& closestPointOnSegment)
{
- float segmentLengthSquared = segment.Dot(segment);
- if (proportion >= segmentLengthSquared)
+ Vector3 segment = segmentEnd - segmentStart;
+ // Project point onto segment, but deferring divide by segment.Dot(segment)
+ proportion = (point - segmentStart).Dot(segment);
+ if (proportion <= 0.0f)
{
- // Point projects outside the [segmentStart, segmentEnd] interval, on the segmentEnd side, clamp to segmentEnd
- proportion = 1.0f;
- closestPointOnSegment = segmentEnd;
+ // Point projects outside the [segmentStart, segmentEnd] interval, on the segmentStart side, clamp to segmentStart
+ proportion = 0.0f;
+ closestPointOnSegment = segmentStart;
}
else
{
- // Point projects inside the [segmentStart, segmentEnd] interval, must do deferred divide now
- proportion = proportion / segmentLengthSquared;
- closestPointOnSegment = segmentStart + (proportion * segment);
+ float segmentLengthSquared = segment.Dot(segment);
+ if (proportion >= segmentLengthSquared)
+ {
+ // Point projects outside the [segmentStart, segmentEnd] interval, on the segmentEnd side, clamp to segmentEnd
+ proportion = 1.0f;
+ closestPointOnSegment = segmentEnd;
+ }
+ else
+ {
+ // Point projects inside the [segmentStart, segmentEnd] interval, must do deferred divide now
+ proportion = proportion / segmentLengthSquared;
+ closestPointOnSegment = segmentStart + (proportion * segment);
+ }
}
}
-}
#if 0
//////////////////////////////////////////////////////////////////////////
@@ -2121,3 +2171,5 @@ namespace test
}
//////////////////////////////////////////////////////////////////////////
#endif
+
+} // namespace AZ
diff --git a/Code/Framework/AzCore/AzCore/Math/Plane.inl b/Code/Framework/AzCore/AzCore/Math/Plane.inl
index f33d356312..795ee8b4bc 100644
--- a/Code/Framework/AzCore/AzCore/Math/Plane.inl
+++ b/Code/Framework/AzCore/AzCore/Math/Plane.inl
@@ -19,12 +19,14 @@ namespace AZ
AZ_MATH_INLINE Plane Plane::CreateFromNormalAndPoint(const Vector3& normal, const Vector3& point)
{
+ AZ_MATH_ASSERT(normal.IsNormalized(), "This normal is not normalized");
return Plane(Simd::Vec4::ConstructPlane(normal.GetSimdValue(), point.GetSimdValue()));
}
AZ_MATH_INLINE Plane Plane::CreateFromNormalAndDistance(const Vector3& normal, float dist)
{
+ AZ_MATH_ASSERT(normal.IsNormalized(), "This normal is not normalized");
Plane result;
result.Set(normal, dist);
return result;
@@ -33,6 +35,7 @@ namespace AZ
AZ_MATH_INLINE Plane Plane::CreateFromCoefficients(const float a, const float b, const float c, const float d)
{
+ AZ_MATH_ASSERT(Vector3(a, b, c).IsNormalized(), "This normal is notormalized");
Plane result;
result.Set(a, b, c, d);
return result;
@@ -65,18 +68,21 @@ namespace AZ
AZ_MATH_INLINE void Plane::Set(const Vector3& normal, float d)
{
+ AZ_MATH_ASSERT(normal.IsNormalized(), "This normal is notormalized");
m_plane.Set(normal, d);
}
AZ_MATH_INLINE void Plane::Set(float a, float b, float c, float d)
{
+ AZ_MATH_ASSERT(Vector3(a, b, c).IsNormalized(), "This normal is notormalized");
m_plane.Set(a, b, c, d);
}
AZ_MATH_INLINE void Plane::SetNormal(const Vector3& normal)
{
+ AZ_MATH_ASSERT(normal.IsNormalized(), "This normal is notormalized");
m_plane.SetX(normal.GetX());
m_plane.SetY(normal.GetY());
m_plane.SetZ(normal.GetZ());
diff --git a/Code/Framework/AzCore/AzCore/Math/Quaternion.h b/Code/Framework/AzCore/AzCore/Math/Quaternion.h
index 83e8012a62..ad454aab4f 100644
--- a/Code/Framework/AzCore/AzCore/Math/Quaternion.h
+++ b/Code/Framework/AzCore/AzCore/Math/Quaternion.h
@@ -54,11 +54,11 @@ namespace AZ
//! Sets components using a Vector3 for the imaginary part and a float for the real part.
static Quaternion CreateFromVector3AndValue(const Vector3& v, float w);
- //! Sets the quaternion to be a rotation around a specified axis.
+ //! Sets the quaternion to be a rotation around a specified axis in radians.
//! @{
- static Quaternion CreateRotationX(float angle);
- static Quaternion CreateRotationY(float angle);
- static Quaternion CreateRotationZ(float angle);
+ static Quaternion CreateRotationX(float angleInRadians);
+ static Quaternion CreateRotationY(float angleInRadians);
+ static Quaternion CreateRotationZ(float angleInRadians);
//! @}
//! Creates a quaternion from a Matrix3x3
@@ -168,6 +168,14 @@ namespace AZ
float NormalizeWithLengthEstimate();
//! @}
+ //! Get the shortest equivalent of the rotation.
+ //! In case the w component of the quaternion is negative the rotation is > 180° and taking the longer path.
+ //! The quaternion will be inverted in that case to take the shortest path of rotation.
+ //! @{
+ Quaternion GetShortestEquivalent() const;
+ void ShortestEquivalent();
+ //! @}
+
//! Linearly interpolate towards a destination quaternion.
//! @param[in] dest The quaternion to interpolate towards.
//! @param[in] t Normalized interpolation value where 0.0 represents the current and 1.0 the destination value.
diff --git a/Code/Framework/AzCore/AzCore/Math/Quaternion.inl b/Code/Framework/AzCore/AzCore/Math/Quaternion.inl
index 37319ae146..bd51a90fca 100644
--- a/Code/Framework/AzCore/AzCore/Math/Quaternion.inl
+++ b/Code/Framework/AzCore/AzCore/Math/Quaternion.inl
@@ -73,27 +73,27 @@ namespace AZ
}
- AZ_MATH_INLINE Quaternion Quaternion::CreateRotationX(float angle)
+ AZ_MATH_INLINE Quaternion Quaternion::CreateRotationX(float angleInRadians)
{
- const float halfAngle = 0.5f * angle;
+ const float halfAngle = 0.5f * angleInRadians;
float sin, cos;
SinCos(halfAngle, sin, cos);
return Quaternion(sin, 0.0f, 0.0f, cos);
}
- AZ_MATH_INLINE Quaternion Quaternion::CreateRotationY(float angle)
+ AZ_MATH_INLINE Quaternion Quaternion::CreateRotationY(float angleInRadians)
{
- const float halfAngle = 0.5f * angle;
+ const float halfAngle = 0.5f * angleInRadians;
float sin, cos;
SinCos(halfAngle, sin, cos);
return Quaternion(0.0f, sin, 0.0f, cos);
}
- AZ_MATH_INLINE Quaternion Quaternion::CreateRotationZ(float angle)
+ AZ_MATH_INLINE Quaternion Quaternion::CreateRotationZ(float angleInRadians)
{
- const float halfAngle = 0.5f * angle;
+ const float halfAngle = 0.5f * angleInRadians;
float sin, cos;
SinCos(halfAngle, sin, cos);
return Quaternion(0.0f, 0.0f, sin, cos);
@@ -345,6 +345,23 @@ namespace AZ
}
+ AZ_MATH_INLINE Quaternion Quaternion::GetShortestEquivalent() const
+ {
+ if (GetW() < 0.0f)
+ {
+ return -(*this);
+ }
+
+ return *this;
+ }
+
+
+ AZ_MATH_INLINE void Quaternion::ShortestEquivalent()
+ {
+ *this = GetShortestEquivalent();
+ }
+
+
AZ_MATH_INLINE Quaternion Quaternion::Lerp(const Quaternion& dest, float t) const
{
if (Dot(dest) >= 0.0f)
diff --git a/Code/Framework/AzCore/AzCore/Math/Sfmt.cpp b/Code/Framework/AzCore/AzCore/Math/Sfmt.cpp
index 5f4dc9e5df..96c1a6a420 100644
--- a/Code/Framework/AzCore/AzCore/Math/Sfmt.cpp
+++ b/Code/Framework/AzCore/AzCore/Math/Sfmt.cpp
@@ -9,39 +9,38 @@
#include
#include
-#include
#include
+#include
#include // for memset
namespace AZ::SfmtInternal
{
- static const int N32 = N * 4;
- static const int N64 = N * 2;
- static const int POS1 = 122;
- static const int SL1 = 18;
- static const int SR1 = 11;
- static const int SL2 = 1;
- static const int SR2 = 1;
- static const unsigned int MSK1 = 0xdfffffefU;
- static const unsigned int MSK2 = 0xddfecb7fU;
- static const unsigned int MSK3 = 0xbffaffffU;
- static const unsigned int MSK4 = 0xbffffff6U;
- static const unsigned int PARITY1 = 0x00000001U;
- static const unsigned int PARITY2 = 0x00000000U;
- static const unsigned int PARITY3 = 0x00000000U;
- static const unsigned int PARITY4 = 0x13c9e684U;
+ static const int N32 = N * 4;
+ static const int N64 = N * 2;
+ static const int POS1 = 122;
+ static const int SL1 = 18;
+ static const int SR1 = 11;
+ static const int SL2 = 1;
+ static const int SR2 = 1;
+ static const unsigned int MSK1 = 0xdfffffefU;
+ static const unsigned int MSK2 = 0xddfecb7fU;
+ static const unsigned int MSK3 = 0xbffaffffU;
+ static const unsigned int MSK4 = 0xbffffff6U;
+ static const unsigned int PARITY1 = 0x00000001U;
+ static const unsigned int PARITY2 = 0x00000000U;
+ static const unsigned int PARITY3 = 0x00000000U;
+ static const unsigned int PARITY4 = 0x13c9e684U;
/** a parity check vector which certificate the period of 2^{MEXP} */
- static unsigned int parity[4] = {PARITY1, PARITY2, PARITY3, PARITY4};
+ static unsigned int parity[4] = { PARITY1, PARITY2, PARITY3, PARITY4 };
#ifdef ONLY64
-# define idxof(_i) (_i ^ 1)
+#define idxof(_i) (_i ^ 1)
#else
-# define idxof(_i) _i
+#define idxof(_i) _i
#endif // ONLY64
-
#if AZ_TRAIT_USE_PLATFORM_SIMD_SSE
/**
* This function represents the recursion formula.
@@ -52,7 +51,8 @@ namespace AZ::SfmtInternal
* @param mask 128-bit mask
* @return output
*/
- AZ_FORCE_INLINE static Simd::Vec4::Int32Type simd_recursion(Simd::Vec4::Int32Type* a, Simd::Vec4::Int32Type* b, Simd::Vec4::Int32Type c, Simd::Vec4::Int32Type d, Simd::Vec4::Int32Type mask)
+ AZ_FORCE_INLINE static Simd::Vec4::Int32Type simd_recursion(
+ Simd::Vec4::Int32Type* a, Simd::Vec4::Int32Type* b, Simd::Vec4::Int32Type c, Simd::Vec4::Int32Type d, Simd::Vec4::Int32Type mask)
{
Simd::Vec4::Int32Type v, x, y, z;
x = *a;
@@ -151,7 +151,7 @@ namespace AZ::SfmtInternal
inline void rshift128(w128_t* out, w128_t const* in, int shift)
{
AZ::u64 th, tl, oh, ol;
- #ifdef ONLY64
+#ifdef ONLY64
th = ((AZ::u64)in->u[2] << 32) | ((AZ::u64)in->u[3]);
tl = ((AZ::u64)in->u[0] << 32) | ((AZ::u64)in->u[1]);
@@ -204,7 +204,7 @@ namespace AZ::SfmtInternal
#endif
}
- inline void do_recursion(w128_t* r, w128_t* a, w128_t* b, w128_t* c, w128_t* d)
+ inline void do_recursion(w128_t* r, w128_t* a, w128_t* b, w128_t* c, w128_t* d)
{
w128_t x;
w128_t y;
@@ -229,7 +229,7 @@ namespace AZ::SfmtInternal
inline void gen_rand_all(Sfmt& g)
{
int i;
- w128_t* r1, * r2;
+ w128_t *r1, *r2;
r1 = &g.m_sfmt[N - 2];
r2 = &g.m_sfmt[N - 1];
@@ -257,7 +257,7 @@ namespace AZ::SfmtInternal
inline void gen_rand_array(Sfmt& g, w128_t* array, int size)
{
int i, j;
- w128_t* r1, * r2;
+ w128_t *r1, *r2;
r1 = &g.m_sfmt[N - 2];
r2 = &g.m_sfmt[N - 1];
@@ -295,82 +295,80 @@ namespace AZ::SfmtInternal
#endif
} // namespace AZ::SfmtInternal
-using namespace AZ;
-
//////////////////////////////////////////////////////////////////////////
// Statics
//////////////////////////////////////////////////////////////////////////
-
-static EnvironmentVariable s_sfmt;
-static const char* s_globalSfmtName = "GlobalSfmt";
-
-Sfmt& Sfmt::GetInstance()
+namespace AZ
{
- if (!s_sfmt)
+ static EnvironmentVariable s_sfmt;
+ static const char* s_globalSfmtName = "GlobalSfmt";
+
+ Sfmt& Sfmt::GetInstance()
{
- s_sfmt = AZ::Environment::FindVariable(s_globalSfmtName);
if (!s_sfmt)
{
- Sfmt::Create();
+ s_sfmt = AZ::Environment::FindVariable(s_globalSfmtName);
+ if (!s_sfmt)
+ {
+ Sfmt::Create();
+ }
+ }
+
+ return s_sfmt.Get();
+ }
+
+ void Sfmt::Create()
+ {
+ if (!s_sfmt)
+ {
+ s_sfmt = AZ::Environment::CreateVariable(s_globalSfmtName);
}
}
- return s_sfmt.Get();
-}
-
-void Sfmt::Create()
-{
- if (!s_sfmt)
+ void Sfmt::Destroy()
{
- s_sfmt = AZ::Environment::CreateVariable(s_globalSfmtName);
+ s_sfmt.Reset();
}
-}
-void Sfmt::Destroy()
-{
- s_sfmt.Reset();
-}
+ //=========================================================================
+ // Sfmt
+ // [4/10/2012]
+ //=========================================================================
+ Sfmt::Sfmt()
+ {
+ m_psfmt32 = &m_sfmt[0].u[0];
+ m_psfmt64 = reinterpret_cast(m_psfmt32);
-//=========================================================================
-// Sfmt
-// [4/10/2012]
-//=========================================================================
-Sfmt::Sfmt()
-{
- m_psfmt32 = &m_sfmt[0].u[0];
- m_psfmt64 = reinterpret_cast(m_psfmt32);
+ Seed();
+ }
- Seed();
-}
+ //=========================================================================
+ // Seed
+ // [4/10/2012]
+ //=========================================================================
+ Sfmt::Sfmt(AZ::u32* keys, int numKeys)
+ {
+ m_psfmt32 = &m_sfmt[0].u[0];
+ m_psfmt64 = reinterpret_cast(m_psfmt32);
-//=========================================================================
-// Seed
-// [4/10/2012]
-//=========================================================================
-Sfmt::Sfmt(AZ::u32* keys, int numKeys)
-{
- m_psfmt32 = &m_sfmt[0].u[0];
- m_psfmt64 = reinterpret_cast(m_psfmt32);
+ Seed(keys, numKeys);
+ }
- Seed(keys, numKeys);
-}
-
-//=========================================================================
-// Seed
-// [4/10/2012]
-//=========================================================================
-void
-Sfmt::Seed()
-{
- // buffer with random values
- AZ::u32 buffer[32];
- BetterPseudoRandom rnd;
- bool result = rnd.GetRandom(buffer, sizeof(buffer));
- (void)result;
- AZ_Warning("System", result, "Failed to seed properly the Smft generator!");
- Seed(buffer, AZ_ARRAY_SIZE(buffer));
-}
+ //=========================================================================
+ // Seed
+ // [4/10/2012]
+ //=========================================================================
+ void Sfmt::Seed()
+ {
+ // buffer with random values
+ AZ::u32 buffer[32];
+ BetterPseudoRandom rnd;
+ bool result = rnd.GetRandom(buffer, sizeof(buffer));
+ (void)result;
+ AZ_Warning("System", result, "Failed to seed properly the Smft generator!");
+ Seed(buffer, AZ_ARRAY_SIZE(buffer));
+ }
/**
* This function represents a function used in the initialization
@@ -388,226 +386,222 @@ Sfmt::Seed()
*/
#define azsfmt_func2(x) ((x ^ (x >> 27)) * (AZ::u32)1566083941UL)
-//=========================================================================
-// Seed
-// [4/10/2012]
-//=========================================================================
-void
-Sfmt::Seed(AZ::u32* keys, int numKeys)
-{
- using SfmtInternal::N;
- using SfmtInternal::N32;
- int i, j, count;
- AZ::u32 r;
- int lag;
- int mid;
- int size = N * 4;
+ //=========================================================================
+ // Seed
+ // [4/10/2012]
+ //=========================================================================
+ void Sfmt::Seed(AZ::u32* keys, int numKeys)
+ {
+ using SfmtInternal::N;
+ using SfmtInternal::N32;
+ int i, j, count;
+ AZ::u32 r;
+ int lag;
+ int mid;
+ int size = N * 4;
- if (size >= 623)
- {
- lag = 11;
- }
- else if (size >= 68)
- {
- lag = 7;
- }
- else if (size >= 39)
- {
- lag = 5;
- }
- else
- {
- lag = 3;
- }
- mid = (size - lag) / 2;
+ if (size >= 623)
+ {
+ lag = 11;
+ }
+ else if (size >= 68)
+ {
+ lag = 7;
+ }
+ else if (size >= 39)
+ {
+ lag = 5;
+ }
+ else
+ {
+ lag = 3;
+ }
+ mid = (size - lag) / 2;
- memset(m_sfmt, 0x8b, sizeof(m_sfmt));
- if (numKeys + 1 > SfmtInternal::N32)
- {
- count = numKeys + 1;
- }
- else
- {
- count = N32;
- }
- r = azsfmt_func1((m_psfmt32[idxof(0)] ^ m_psfmt32[idxof(mid)] ^ m_psfmt32[idxof(N32 - 1)]));
- m_psfmt32[idxof(mid)] += r;
- r += numKeys;
- m_psfmt32[idxof(mid + lag)] += r;
- m_psfmt32[idxof(0)] = r;
+ memset(m_sfmt, 0x8b, sizeof(m_sfmt));
+ if (numKeys + 1 > SfmtInternal::N32)
+ {
+ count = numKeys + 1;
+ }
+ else
+ {
+ count = N32;
+ }
+ r = azsfmt_func1((m_psfmt32[idxof(0)] ^ m_psfmt32[idxof(mid)] ^ m_psfmt32[idxof(N32 - 1)]));
+ m_psfmt32[idxof(mid)] += r;
+ r += numKeys;
+ m_psfmt32[idxof(mid + lag)] += r;
+ m_psfmt32[idxof(0)] = r;
- count--;
- for (i = 1, j = 0; (j < count) && (j < numKeys); j++)
- {
- r = azsfmt_func1((m_psfmt32[idxof(i)] ^ m_psfmt32[idxof((i + mid) % N32)] ^ m_psfmt32[idxof((i + N32 - 1) % N32)]));
- m_psfmt32[idxof((i + mid) % N32)] += r;
- r += keys[j] + i;
- m_psfmt32[idxof((i + mid + lag) % N32)] += r;
- m_psfmt32[idxof(i)] = r;
- i = (i + 1) % N32;
- }
- for (; j < count; j++)
- {
- r = azsfmt_func1((m_psfmt32[idxof(i)] ^ m_psfmt32[idxof((i + mid) % N32)] ^ m_psfmt32[idxof((i + N32 - 1) % N32)]));
- m_psfmt32[idxof((i + mid) % N32)] += r;
- r += i;
- m_psfmt32[idxof((i + mid + lag) % N32)] += r;
- m_psfmt32[idxof(i)] = r;
- i = (i + 1) % N32;
- }
- for (j = 0; j < N32; j++)
- {
- r = azsfmt_func2((m_psfmt32[idxof(i)] + m_psfmt32[idxof((i + mid) % N32)] + m_psfmt32[idxof((i + N32 - 1) % N32)]));
- m_psfmt32[idxof((i + mid) % N32)] ^= r;
- r -= i;
- m_psfmt32[idxof((i + mid + lag) % N32)] ^= r;
- m_psfmt32[idxof(i)] = r;
- i = (i + 1) % N32;
- }
+ count--;
+ for (i = 1, j = 0; (j < count) && (j < numKeys); j++)
+ {
+ r = azsfmt_func1((m_psfmt32[idxof(i)] ^ m_psfmt32[idxof((i + mid) % N32)] ^ m_psfmt32[idxof((i + N32 - 1) % N32)]));
+ m_psfmt32[idxof((i + mid) % N32)] += r;
+ r += keys[j] + i;
+ m_psfmt32[idxof((i + mid + lag) % N32)] += r;
+ m_psfmt32[idxof(i)] = r;
+ i = (i + 1) % N32;
+ }
+ for (; j < count; j++)
+ {
+ r = azsfmt_func1((m_psfmt32[idxof(i)] ^ m_psfmt32[idxof((i + mid) % N32)] ^ m_psfmt32[idxof((i + N32 - 1) % N32)]));
+ m_psfmt32[idxof((i + mid) % N32)] += r;
+ r += i;
+ m_psfmt32[idxof((i + mid + lag) % N32)] += r;
+ m_psfmt32[idxof(i)] = r;
+ i = (i + 1) % N32;
+ }
+ for (j = 0; j < N32; j++)
+ {
+ r = azsfmt_func2((m_psfmt32[idxof(i)] + m_psfmt32[idxof((i + mid) % N32)] + m_psfmt32[idxof((i + N32 - 1) % N32)]));
+ m_psfmt32[idxof((i + mid) % N32)] ^= r;
+ r -= i;
+ m_psfmt32[idxof((i + mid + lag) % N32)] ^= r;
+ m_psfmt32[idxof(i)] = r;
+ i = (i + 1) % N32;
+ }
- m_index = N32;
- PeriodCertification();
-}
+ m_index = N32;
+ PeriodCertification();
+ }
#undef azsfmt_func1
#undef azsfmt_func2
-//=========================================================================
-// PeriodCertification
-// [4/10/2012]
-//=========================================================================
-void
-Sfmt::PeriodCertification()
-{
- int inner = 0;
- int i, j;
- AZ::u32 work;
+ //=========================================================================
+ // PeriodCertification
+ // [4/10/2012]
+ //=========================================================================
+ void Sfmt::PeriodCertification()
+ {
+ int inner = 0;
+ int i, j;
+ AZ::u32 work;
- for (i = 0; i < 4; i++)
- {
- inner ^= m_psfmt32[idxof(i)] & SfmtInternal::parity[i];
- }
- for (i = 16; i > 0; i >>= 1)
- {
- inner ^= inner >> i;
- }
- inner &= 1;
- /* check OK */
- if (inner == 1)
- {
- return;
- }
- /* check NG, and modification */
- for (i = 0; i < 4; i++)
- {
- work = 1;
- for (j = 0; j < 32; j++)
+ for (i = 0; i < 4; i++)
{
- if ((work & SfmtInternal::parity[i]) != 0)
+ inner ^= m_psfmt32[idxof(i)] & SfmtInternal::parity[i];
+ }
+ for (i = 16; i > 0; i >>= 1)
+ {
+ inner ^= inner >> i;
+ }
+ inner &= 1;
+ /* check OK */
+ if (inner == 1)
+ {
+ return;
+ }
+ /* check NG, and modification */
+ for (i = 0; i < 4; i++)
+ {
+ work = 1;
+ for (j = 0; j < 32; j++)
{
- m_psfmt32[idxof(i)] ^= work;
- return;
+ if ((work & SfmtInternal::parity[i]) != 0)
+ {
+ m_psfmt32[idxof(i)] ^= work;
+ return;
+ }
+ work = work << 1;
}
- work = work << 1;
}
}
-}
-//=========================================================================
-// Rand32
-// [4/10/2012]
-//=========================================================================
-AZ::u32 Sfmt::Rand32()
-{
- int index = m_index.fetch_add(1);
- if (index >= SfmtInternal::N32)
+ //=========================================================================
+ // Rand32
+ // [4/10/2012]
+ //=========================================================================
+ AZ::u32 Sfmt::Rand32()
{
- AZStd::lock_guard lock(m_generationMutex);
- // if this thread is the one that sets m_index to 0, then this thread
- // does the generation
- index += 1; // compare against the result of fetch_add(1) above
- if (m_index.compare_exchange_strong(index, 0))
+ int index = m_index.fetch_add(1);
+ if (index >= SfmtInternal::N32)
{
- SfmtInternal::gen_rand_all(*this);
+ AZStd::lock_guard lock(m_generationMutex);
+ // if this thread is the one that sets m_index to 0, then this thread
+ // does the generation
+ index += 1; // compare against the result of fetch_add(1) above
+ if (m_index.compare_exchange_strong(index, 0))
+ {
+ SfmtInternal::gen_rand_all(*this);
+ }
+ // try again, with the new table
+ return Rand32();
}
- // try again, with the new table
- return Rand32();
+ return m_psfmt32[index];
}
- return m_psfmt32[index];
-}
-//=========================================================================
-// Rand64
-// [4/10/2012]
-//=========================================================================
-AZ::u64 Sfmt::Rand64()
-{
- int index = m_index.fetch_add(2);
- if (index >= (SfmtInternal::N32 - 1))
+ //=========================================================================
+ // Rand64
+ // [4/10/2012]
+ //=========================================================================
+ AZ::u64 Sfmt::Rand64()
{
- AZStd::lock_guard lock(m_generationMutex);
- // if this thread is the one that sets m_index to 0, then this thread
- // does the generation
- index += 2; // compare against the result of fetch_add(2) above
- if (m_index.compare_exchange_strong(index, 0))
+ int index = m_index.fetch_add(2);
+ if (index >= (SfmtInternal::N32 - 1))
{
- SfmtInternal::gen_rand_all(*this);
+ AZStd::lock_guard lock(m_generationMutex);
+ // if this thread is the one that sets m_index to 0, then this thread
+ // does the generation
+ index += 2; // compare against the result of fetch_add(2) above
+ if (m_index.compare_exchange_strong(index, 0))
+ {
+ SfmtInternal::gen_rand_all(*this);
+ }
+ // try again, with the new table
+ return Rand64();
}
- // try again, with the new table
- return Rand64();
+
+ AZ::u64 r;
+ r = m_psfmt64[index / 2];
+ return r;
}
- AZ::u64 r;
- r = m_psfmt64[index / 2];
- return r;
-}
+ //=========================================================================
+ // FillArray32
+ // [4/10/2012]
+ //=========================================================================
+ void Sfmt::FillArray32(AZ::u32* array, int size)
+ {
+ AZ_MATH_ASSERT(m_index == SfmtInternal::N32, "Invalid m_index! Reinitialize!");
+ AZ_MATH_ASSERT(size % 4 == 0, "Size must be multiple of 4!");
+ AZ_MATH_ASSERT(size >= SfmtInternal::N32, "Size must be bigger than %d GetMinArray32Size()!", SfmtInternal::N32);
-//=========================================================================
-// FillArray32
-// [4/10/2012]
-//=========================================================================
-void
-Sfmt::FillArray32(AZ::u32* array, int size)
-{
- AZ_MATH_ASSERT(m_index == SfmtInternal::N32, "Invalid m_index! Reinitialize!");
- AZ_MATH_ASSERT(size % 4 == 0, "Size must be multiple of 4!");
- AZ_MATH_ASSERT(size >= SfmtInternal::N32, "Size must be bigger than %d GetMinArray32Size()!", SfmtInternal::N32);
+ SfmtInternal::gen_rand_array(*this, (SfmtInternal::w128_t*)array, size / 4);
+ m_index = SfmtInternal::N32;
+ }
- SfmtInternal::gen_rand_array(*this, (SfmtInternal::w128_t*)array, size / 4);
- m_index = SfmtInternal::N32;
-}
+ //=========================================================================
+ // FillArray64
+ // [4/10/2012]
+ //=========================================================================
+ void Sfmt::FillArray64(AZ::u64* array, int size)
+ {
+ AZ_MATH_ASSERT(m_index == SfmtInternal::N32, "Invalid m_index! Reinitialize!");
+ AZ_MATH_ASSERT(size % 4 == 0, "Size must be multiple of 4!");
+ AZ_MATH_ASSERT(size >= SfmtInternal::N64, "Size must be bigger than %d GetMinArray64Size()!", SfmtInternal::N64);
-//=========================================================================
-// FillArray64
-// [4/10/2012]
-//=========================================================================
-void
-Sfmt::FillArray64(AZ::u64* array, int size)
-{
- AZ_MATH_ASSERT(m_index == SfmtInternal::N32, "Invalid m_index! Reinitialize!");
- AZ_MATH_ASSERT(size % 4 == 0, "Size must be multiple of 4!");
- AZ_MATH_ASSERT(size >= SfmtInternal::N64, "Size must be bigger than %d GetMinArray64Size()!", SfmtInternal::N64);
+ SfmtInternal::gen_rand_array(*this, (SfmtInternal::w128_t*)array, size / 2);
+ m_index = SfmtInternal::N32;
+ }
- SfmtInternal::gen_rand_array(*this, (SfmtInternal::w128_t*)array, size / 2);
- m_index = SfmtInternal::N32;
-}
+ //=========================================================================
+ // GetMinArray32Size
+ // [4/10/2012]
+ //=========================================================================
+ int Sfmt::GetMinArray32Size() const
+ {
+ return SfmtInternal::N32;
+ }
-//=========================================================================
-// GetMinArray32Size
-// [4/10/2012]
-//=========================================================================
-int
-Sfmt::GetMinArray32Size() const
-{
- return SfmtInternal::N32;
-}
+ //=========================================================================
+ // GetMinArray64Size
+ // [4/10/2012]
+ //=========================================================================
+ int Sfmt::GetMinArray64Size() const
+ {
+ return SfmtInternal::N64;
+ }
-//=========================================================================
-// GetMinArray64Size
-// [4/10/2012]
-//=========================================================================
-int
-Sfmt::GetMinArray64Size() const
-{
- return SfmtInternal::N64;
-}
+} // namespace AZ
diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp b/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp
index 841387f14d..64822684da 100644
--- a/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp
+++ b/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp
@@ -1424,7 +1424,8 @@ namespace AZ
}
}
-using namespace AZ;
+namespace AZ
+{
#ifndef AZ_USE_CUSTOM_SCRIPT_BIND
@@ -2254,6 +2255,7 @@ LUA_API const Node* lua_getDummyNode()
}
#endif // AZ_USE_CUSTOM_SCRIPT_BIND
+} // namespace AZ
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -5825,7 +5827,6 @@ LUA_API const Node* lua_getDummyNode()
AllocatorWrapper m_luaAllocator;
AZStd::thread::id m_ownerThreadId; // Check if Lua methods (including EBus handlers) are called from background threads.
};
- } // namespace AZ
ScriptContext::ScriptContext(ScriptContextId id, IAllocatorAllocate* allocator, lua_State* nativeContext)
{
@@ -6116,5 +6117,6 @@ LUA_API const Node* lua_getDummyNode()
{
return m_impl->ConstructScriptProperty(sdc, valueIndex, name, restrictToPropertyArrays);
}
+} // namespace AZ
#undef AZ_DBG_NAME_FIXER
diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptContext.h b/Code/Framework/AzCore/AzCore/Script/ScriptContext.h
index bb63a9368d..5a7fca704f 100644
--- a/Code/Framework/AzCore/AzCore/Script/ScriptContext.h
+++ b/Code/Framework/AzCore/AzCore/Script/ScriptContext.h
@@ -5,8 +5,7 @@
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
-#ifndef AZCORE_SCRIPT_CONTEXT_H
-#define AZCORE_SCRIPT_CONTEXT_H
+#pragma once
#include
#include
@@ -1032,4 +1031,3 @@ namespace AZ
}
} // namespace AZ
-#endif // AZCORE_SCRIPT_CONTEXT_H
diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptContextDebug.cpp b/Code/Framework/AzCore/AzCore/Script/ScriptContextDebug.cpp
index 81ede7a5d3..698c5a0043 100644
--- a/Code/Framework/AzCore/AzCore/Script/ScriptContextDebug.cpp
+++ b/Code/Framework/AzCore/AzCore/Script/ScriptContextDebug.cpp
@@ -25,10 +25,8 @@ extern "C" {
namespace AZ
{
+
void LuaHook(lua_State* l, lua_Debug* ar);
-}
-
-using namespace AZ;
/**
* A temp class that will override the current script context error handler and store the error (without any messages)
@@ -599,7 +597,7 @@ static ScriptContextDebug::BreakpointId MakeBreakpointId(const char* sourceName,
// LuaHook
// [6/28/2012]
//=========================================================================
-void AZ::LuaHook(lua_State* l, lua_Debug* ar)
+void LuaHook(lua_State* l, lua_Debug* ar)
{
// Read contexts
lua_rawgeti(l, LUA_REGISTRYINDEX, AZ_LUA_SCRIPT_CONTEXT_REF);
@@ -1543,4 +1541,6 @@ ScriptContextDebug::SetValue(const DebugValue& sourceValue)
return true;
}
+} // namespace AZ
+
#endif // #if !defined(AZCORE_EXCLUDE_LUA)
diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptContextDebug.h b/Code/Framework/AzCore/AzCore/Script/ScriptContextDebug.h
index a8f0ba643c..a1d73352c4 100644
--- a/Code/Framework/AzCore/AzCore/Script/ScriptContextDebug.h
+++ b/Code/Framework/AzCore/AzCore/Script/ScriptContextDebug.h
@@ -5,8 +5,7 @@
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
-#ifndef AZCORE_SCRIPT_CONTEXT_DEBUG_H
-#define AZCORE_SCRIPT_CONTEXT_DEBUG_H
+#pragma once
#include
#include
@@ -213,6 +212,3 @@ namespace AZ
ScriptContext& m_context;
};
}
-
-#endif // AZCORE_SCRIPT_CONTEXT_DEBUG_H
-#pragma once
diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptSystemComponent.cpp b/Code/Framework/AzCore/AzCore/Script/ScriptSystemComponent.cpp
index 4b71c57682..32081afce7 100644
--- a/Code/Framework/AzCore/AzCore/Script/ScriptSystemComponent.cpp
+++ b/Code/Framework/AzCore/AzCore/Script/ScriptSystemComponent.cpp
@@ -31,7 +31,8 @@
#include
#include
-using namespace AZ;
+namespace AZ
+{
/**
* Script lifecycle:
@@ -44,8 +45,7 @@ using namespace AZ;
* If the script was loaded by a ScriptComponent, Load will be called once reload is complete.
*/
-namespace
-{
+namespace LocalTU_ScriptSystemComponent {
// Called when a module has already been loaded
static int LuaRequireLoadedModule(lua_State* l)
{
@@ -54,8 +54,10 @@ namespace
return 1;
}
+
}
+
//=========================================================================
// ScriptSystemComponent
// [5/29/2012]
@@ -479,7 +481,7 @@ int ScriptSystemComponent::DefaultRequireHook(lua_State* lua, ScriptContext* con
scriptIt->second.m_scriptNames.emplace(module);
// Push the value to a closure that will just return it
lua_rawgeti(lua, LUA_REGISTRYINDEX, scriptIt->second.m_tableReference);
- lua_pushcclosure(lua, LuaRequireLoadedModule, 1);
+ lua_pushcclosure(lua, LocalTU_ScriptSystemComponent::LuaRequireLoadedModule, 1);
// If asset reference already populated, just return now. Otherwise, capture reference
if (scriptIt->second.m_scriptAsset.GetId().IsValid())
@@ -519,7 +521,7 @@ int ScriptSystemComponent::DefaultRequireHook(lua_State* lua, ScriptContext* con
}
// Push function returning the result
- lua_pushcclosure(lua, LuaRequireLoadedModule, 1);
+ lua_pushcclosure(lua, LocalTU_ScriptSystemComponent::LuaRequireLoadedModule, 1);
// Set asset reference on the loaded script
scriptIt = container->m_loadedScripts.find(scriptId.m_guid);
@@ -565,7 +567,7 @@ int ScriptSystemComponent::InMemoryRequireHook(lua_State* lua, ScriptContext* co
scriptIt->second.m_scriptNames.emplace(module);
// Push the value to a closure that will just return it
lua_rawgeti(lua, LUA_REGISTRYINDEX, scriptIt->second.m_tableReference);
- lua_pushcclosure(lua, LuaRequireLoadedModule, 1);
+ lua_pushcclosure(lua, LocalTU_ScriptSystemComponent::LuaRequireLoadedModule, 1);
// If asset reference already populated, just return now. Otherwise, capture reference
if (scriptIt->second.m_scriptAsset.GetId().IsValid())
@@ -591,7 +593,7 @@ int ScriptSystemComponent::InMemoryRequireHook(lua_State* lua, ScriptContext* co
}
// Push function returning the result
- lua_pushcclosure(lua, LuaRequireLoadedModule, 1);
+ lua_pushcclosure(lua, LocalTU_ScriptSystemComponent::LuaRequireLoadedModule, 1);
// Set asset reference on the loaded script
scriptIt = container->m_loadedScripts.find(scriptId.m_guid);
@@ -996,4 +998,5 @@ void ScriptSystemComponent::Reflect(ReflectContext* reflection)
}
}
+} // namespace AZ
#endif // #if !defined(AZCORE_EXCLUDE_LUA)
diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptSystemComponent.h b/Code/Framework/AzCore/AzCore/Script/ScriptSystemComponent.h
index eb2e968a95..a7b1245546 100644
--- a/Code/Framework/AzCore/AzCore/Script/ScriptSystemComponent.h
+++ b/Code/Framework/AzCore/AzCore/Script/ScriptSystemComponent.h
@@ -5,8 +5,7 @@
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
-#ifndef AZCORE_SCRIPT_SYSTEM_COMPONENT_H
-#define AZCORE_SCRIPT_SYSTEM_COMPONENT_H
+#pragma once
#include
#include
@@ -182,6 +181,3 @@ namespace AZ
void OnAssetReloaded(Data::Asset asset) override;
};
}
-
-#endif // AZCORE_SCRIPT_SYSTEM_COMPONENT_H
-#pragma once
diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonSerializer.cpp b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonSerializer.cpp
index 8b6c1d154c..46cc0443da 100644
--- a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonSerializer.cpp
+++ b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonSerializer.cpp
@@ -150,7 +150,7 @@ namespace AZ
{
// Not using InsertTypeId here to avoid needing to create the temporary value and swap it in that call.
node.AddMember(rapidjson::StringRef(JsonSerialization::TypeIdFieldIdentifier),
- StoreTypeName(classData, context), context.GetJsonAllocator());
+ StoreTypeName(classData, classData.m_typeId, context), context.GetJsonAllocator());
result = ResultCode(Tasks::WriteValue, Outcomes::Success);
}
return result.Combine(StoreClass(node, object, defaultObject, classData, context));
@@ -531,7 +531,7 @@ namespace AZ
return ResolvePointerResult::ContinueProcessing;
}
- rapidjson::Value JsonSerializer::StoreTypeName(const SerializeContext::ClassData& classData, JsonSerializerContext& context)
+ rapidjson::Value JsonSerializer::StoreTypeName(const SerializeContext::ClassData& classData, const Uuid& typeId, JsonSerializerContext& context)
{
rapidjson::Value result;
AZStd::vector ids = context.GetSerializeContext()->FindClassId(Crc32(classData.m_name));
@@ -544,7 +544,7 @@ namespace AZ
// Only write the Uuid for the class if there are multiple classes sharing the same name.
// In this case it wouldn't be enough to determine which class needs to be used. The
// class name is still added as a comment for be friendlier for users to read.
- AZStd::string fullName = classData.m_typeId.ToString();
+ AZStd::string fullName = typeId.ToString();
fullName += ' ';
fullName += classData.m_name;
result.SetString(fullName.c_str(), aznumeric_caster(fullName.size()), context.GetJsonAllocator());
@@ -560,7 +560,7 @@ namespace AZ
const SerializeContext::ClassData* data = context.GetSerializeContext()->FindClassData(typeId);
if (data)
{
- output = JsonSerializer::StoreTypeName(*data, context);
+ output = JsonSerializer::StoreTypeName(*data, typeId, context);
return context.Report(Tasks::WriteValue, Outcomes::Success, "Type id successfully stored to json value.");
}
else
@@ -580,7 +580,7 @@ namespace AZ
{
rapidjson::Value insertedObject(rapidjson::kObjectType);
insertedObject.AddMember(
- rapidjson::StringRef(JsonSerialization::TypeIdFieldIdentifier), StoreTypeName(classData, context),
+ rapidjson::StringRef(JsonSerialization::TypeIdFieldIdentifier), StoreTypeName(classData, classData.m_typeId, context),
context.GetJsonAllocator());
for (auto& element : output.GetObject())
diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonSerializer.h b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonSerializer.h
index 22dd768ec5..0b72fca529 100644
--- a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonSerializer.h
+++ b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonSerializer.h
@@ -79,7 +79,7 @@ namespace AZ
const void*& object, const void*& defaultObject, AZStd::any& defaultObjectStorage,
const SerializeContext::ClassData*& elementClassData, const AZ::IRttiHelper& rtti, JsonSerializerContext& context);
- static rapidjson::Value StoreTypeName(const SerializeContext::ClassData& classData, JsonSerializerContext& context);
+ static rapidjson::Value StoreTypeName(const SerializeContext::ClassData& classData, const Uuid& typeId, JsonSerializerContext& context);
static JsonSerializationResult::ResultCode StoreTypeName(rapidjson::Value& output,
const Uuid& typeId, JsonSerializerContext& context);
diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/PathSerializer.cpp b/Code/Framework/AzCore/AzCore/Serialization/Json/PathSerializer.cpp
new file mode 100644
index 0000000000..7c057730e8
--- /dev/null
+++ b/Code/Framework/AzCore/AzCore/Serialization/Json/PathSerializer.cpp
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace AZ::JsonPathSerializerInternal
+{
+ template
+ static JsonSerializationResult::Result Load(PathType* pathValue, const rapidjson::Value& inputValue,
+ JsonDeserializerContext& context)
+ {
+ namespace JSR = JsonSerializationResult; // Used remove name conflicts in AzCore in uber builds.
+
+ AZ_Assert(pathValue, "Expected a valid pointer to load from json value.");
+
+ switch (inputValue.GetType())
+ {
+ case rapidjson::kArrayType:
+ case rapidjson::kObjectType:
+ case rapidjson::kFalseType:
+ case rapidjson::kTrueType:
+ case rapidjson::kNumberType:
+ [[fallthrough]];
+ case rapidjson::kNullType:
+ return context.Report(JSR::Tasks::ReadField, JSR::Outcomes::Unsupported,
+ "Unsupported type. String values can't be read from arrays, objects or null.");
+ case rapidjson::kStringType:
+ {
+ size_t pathLength = inputValue.GetStringLength();
+ if (pathLength <= pathValue->Native().max_size())
+ {
+ *pathValue = PathType(AZStd::string_view(inputValue.GetString(), pathLength)).LexicallyNormal();
+ return context.Report(JSR::Tasks::ReadField, JSR::Outcomes::Success, "Successfully read path.");
+ }
+ using UuidString = AZStd::fixed_string;
+ using ErrorString = AZStd::fixed_string<256>;
+ return context.Report(JsonSerializationResult::Tasks::ReadField, JSR::Outcomes::Invalid,
+ ErrorString::format("Json string value is too large to fit within path type %s. It needs to be less than %zu code points",
+ azrtti_typeid().template ToString().c_str(), pathValue->Native().max_size()));
+ }
+ default:
+ return context.Report(JSR::Tasks::ReadField, JSR::Outcomes::Unknown, "Unknown json type encountered for string value.");
+ }
+ }
+ template
+ static JsonSerializationResult::Result StoreWithDefault(rapidjson::Value& outputValue, const PathType* pathValue,
+ const PathType* defaultPathValue, JsonSerializerContext& context)
+ {
+ namespace JSR = JsonSerializationResult; // Removes name conflicts in AzCore in uber builds.
+
+ if (context.ShouldKeepDefaults() || defaultPathValue == nullptr || *pathValue != *defaultPathValue)
+ {
+ auto posixPathString = pathValue->AsPosix();
+ outputValue.SetString(posixPathString.c_str(), aznumeric_caster(posixPathString.size()), context.GetJsonAllocator());
+ return context.Report(JSR::Tasks::WriteValue, JSR::Outcomes::Success, "Path successfully stored.");
+ }
+
+ return context.Report(JSR::Tasks::WriteValue, JSR::Outcomes::DefaultsUsed, "Default Path used.");
+ }
+}
+
+namespace AZ
+{
+ AZ_CLASS_ALLOCATOR_IMPL(JsonPathSerializer, SystemAllocator, 0);
+
+ JsonSerializationResult::Result JsonPathSerializer::Load(void* outputValue, const Uuid& outputValueTypeId,
+ const rapidjson::Value& inputValue, JsonDeserializerContext& context)
+ {
+ if (outputValueTypeId == azrtti_typeid())
+ {
+ return JsonPathSerializerInternal::Load(reinterpret_cast(outputValue), inputValue,
+ context);
+ }
+ else if (outputValueTypeId == azrtti_typeid())
+ {
+ return JsonPathSerializerInternal::Load(reinterpret_cast(outputValue), inputValue,
+ context);
+ }
+
+ using UuidString = AZStd::fixed_string;
+ auto errorTypeIdString = outputValueTypeId.ToString();
+ AZ_Assert(false, "Unable to serialize json string"
+ " to a path of type %s", errorTypeIdString.c_str());
+
+ using ErrorString = AZStd::fixed_string<256>;
+ return context.Report(JsonSerializationResult::Tasks::ReadField, JsonSerializationResult::Outcomes::TypeMismatch,
+ ErrorString::format("Output value type ID %s is not a valid Path type", errorTypeIdString.c_str()));
+ }
+
+ JsonSerializationResult::Result JsonPathSerializer::Store(rapidjson::Value& outputValue, const void* inputValue,
+ const void* defaultValue, const Uuid& valueTypeId, JsonSerializerContext& context)
+ {
+ if (valueTypeId == azrtti_typeid())
+ {
+ return JsonPathSerializerInternal::StoreWithDefault(outputValue,
+ reinterpret_cast(inputValue),
+ reinterpret_cast(defaultValue), context);
+ }
+ else if (valueTypeId == azrtti_typeid())
+ {
+ return JsonPathSerializerInternal::StoreWithDefault(outputValue,
+ reinterpret_cast(inputValue),
+ reinterpret_cast(defaultValue), context);
+ }
+
+ using UuidString = AZStd::fixed_string;
+ auto errorTypeIdString = valueTypeId.ToString();
+ AZ_Assert(false, "Unable to serialize path type %s to a json string",
+ errorTypeIdString.c_str());
+
+ using ErrorString = AZStd::fixed_string<256>;
+ return context.Report(JsonSerializationResult::Tasks::WriteValue, JsonSerializationResult::Outcomes::TypeMismatch,
+ ErrorString::format("Input value type ID %s is not a valid Path type", errorTypeIdString.c_str()));
+ }
+
+} // namespace AZ
diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/PathSerializer.h b/Code/Framework/AzCore/AzCore/Serialization/Json/PathSerializer.h
new file mode 100644
index 0000000000..609a489ec4
--- /dev/null
+++ b/Code/Framework/AzCore/AzCore/Serialization/Json/PathSerializer.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#pragma once
+
+#include
+
+namespace AZ
+{
+ class JsonPathSerializer
+ : public BaseJsonSerializer
+ {
+ public:
+ AZ_RTTI(JsonPathSerializer, "{F6FBA901-07E0-4F03-A0B6-72A9A6CE1E96}", BaseJsonSerializer);
+ AZ_CLASS_ALLOCATOR_DECL;
+ JsonSerializationResult::Result Load(void* outputValue, const Uuid& outputValueTypeId, const rapidjson::Value& inputValue,
+ JsonDeserializerContext& context) override;
+ JsonSerializationResult::Result Store(rapidjson::Value& outputValue, const void* inputValue, const void* defaultValue,
+ const Uuid& valueTypeId, JsonSerializerContext& context) override;
+ };
+} // namespace AZ
diff --git a/Code/Framework/AzCore/AzCore/azcore_files.cmake b/Code/Framework/AzCore/AzCore/azcore_files.cmake
index d48dff0796..d25a28aa24 100644
--- a/Code/Framework/AzCore/AzCore/azcore_files.cmake
+++ b/Code/Framework/AzCore/AzCore/azcore_files.cmake
@@ -537,6 +537,8 @@ set(FILES
Serialization/Json/JsonUtils.cpp
Serialization/Json/MapSerializer.h
Serialization/Json/MapSerializer.cpp
+ Serialization/Json/PathSerializer.h
+ Serialization/Json/PathSerializer.cpp
Serialization/Json/RegistrationContext.h
Serialization/Json/RegistrationContext.cpp
Serialization/Json/SmartPointerSerializer.h
diff --git a/Code/Framework/AzCore/Tests/Math/QuaternionTests.cpp b/Code/Framework/AzCore/Tests/Math/QuaternionTests.cpp
index 9ef38d7115..3de60a1fd4 100644
--- a/Code/Framework/AzCore/Tests/Math/QuaternionTests.cpp
+++ b/Code/Framework/AzCore/Tests/Math/QuaternionTests.cpp
@@ -11,6 +11,7 @@
#include
#include
#include
+#include
using namespace AZ;
@@ -453,7 +454,7 @@ namespace UnitTest
AZ::Quaternion backFromScaledAxisAngle = AZ::Quaternion::CreateFromScaledAxisAngle(scaledAxisAngle);
// Compare the original quaternion with the one after the conversion.
- EXPECT_TRUE(testQuat.IsClose(backFromScaledAxisAngle, 1e-6f));
+ EXPECT_THAT(testQuat, IsCloseTolerance(backFromScaledAxisAngle, 1e-6f));
}
TEST_P(QuaternionScaledAxisAngleConversionFixture, AxisAngleQuatRoundtripTests)
@@ -467,7 +468,7 @@ namespace UnitTest
// Convert the axis-angle back into a quaternion and compare the original quaternion with the one after the conversion.
const AZ::Quaternion backFromAxisAngle = AZ::Quaternion::CreateFromAxisAngle(axis, angle);
- EXPECT_TRUE(testQuat.IsClose(backFromAxisAngle, 1e-6f));
+ EXPECT_THAT(testQuat, IsCloseTolerance(backFromAxisAngle, 1e-6f));
}
TEST_P(QuaternionScaledAxisAngleConversionFixture, CompareAxisAngleConversionTests)
@@ -506,8 +507,20 @@ namespace UnitTest
}
const AZ::Quaternion backFromAxisAngle = AZ::Quaternion::CreateFromAxisAngle(axisFromScaledResult, angleFromScaledResult);
- EXPECT_TRUE(testQuat.IsClose(backFromAxisAngle, 1e-6f));
+ EXPECT_THAT(testQuat, IsCloseTolerance(backFromAxisAngle, 1e-6f));
}
INSTANTIATE_TEST_CASE_P(MATH_Quaternion, QuaternionScaledAxisAngleConversionFixture, ::testing::ValuesIn(RotationRepresentationConversionTestQuats));
+
+ TEST(MATH_Quaternion, ShortestEquivalent)
+ {
+ const AZ::Quaternion testQuat = AZ::Quaternion::CreateRotationX(AZ::Constants::HalfPi * 3.0f);
+
+ AZ::Quaternion absQuat = testQuat;
+ absQuat.ShortestEquivalent();
+ EXPECT_THAT(testQuat.GetShortestEquivalent(), IsCloseTolerance(absQuat, 1e-6f));
+
+ const float angle = absQuat.GetEulerRadians().GetX();
+ EXPECT_THAT(angle, testing::FloatEq(-AZ::Constants::HalfPi));
+ }
}
diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/PathSerializerTests.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/PathSerializerTests.cpp
new file mode 100644
index 0000000000..e00a4171a2
--- /dev/null
+++ b/Code/Framework/AzCore/Tests/Serialization/Json/PathSerializerTests.cpp
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#include
+#include
+#include
+#include
+#include
+
+namespace JsonSerializationTests
+{
+ template
+ class PathTestDescription
+ : public JsonSerializerConformityTestDescriptor
+ {
+ public:
+ using JsonSerializerConformityTestDescriptor::Reflect;
+ void Reflect(AZStd::unique_ptr& serializeContext) override
+ {
+ AZ::IO::PathReflect(serializeContext.get());
+ }
+ void Reflect(AZStd::unique_ptr& jsonContext) override
+ {
+ AZ::IO::PathReflect(jsonContext.get());
+ }
+ AZStd::shared_ptr CreateSerializer() override
+ {
+ return AZStd::make_shared();
+ }
+
+ AZStd::shared_ptr CreateDefaultInstance() override
+ {
+ return AZStd::make_shared();
+ }
+
+ AZStd::shared_ptr CreateFullySetInstance() override
+ {
+ return AZStd::make_shared("O3DE/Relative/Path");
+ }
+
+ AZStd::string_view GetJsonForFullySetInstance() override
+ {
+ return R"("O3DE/Relative/Path")";
+ }
+
+ void ConfigureFeatures(JsonSerializerConformityTestDescriptorFeatures& features) override
+ {
+ features.EnableJsonType(rapidjson::kStringType);
+ features.m_supportsPartialInitialization = false;
+ features.m_supportsInjection = false;
+ }
+
+ bool AreEqual(const PathType& lhs, const PathType& rhs) override
+ {
+ return lhs == rhs;
+ }
+ };
+
+ using PathConformityTestTypes = ::testing::Types<
+ PathTestDescription,
+ PathTestDescription
+ >;
+ INSTANTIATE_TYPED_TEST_CASE_P(Path, JsonSerializerConformityTests, PathConformityTestTypes);
+
+
+ class PathSerializerTests
+ : public BaseJsonSerializerFixture
+ {
+ public:
+ AZStd::unique_ptr m_serializer;
+
+ void SetUp() override
+ {
+ BaseJsonSerializerFixture::SetUp();
+ m_serializer = AZStd::make_unique();
+ }
+
+ void TearDown() override
+ {
+ m_serializer.reset();
+ BaseJsonSerializerFixture::TearDown();
+ }
+ };
+
+ TEST_F(PathSerializerTests, LoadingIntoFixedMaxPath_GreaterThanMaxPathLength_Fails)
+ {
+ AZ::IO::Path testPath;
+ // Fill a path greater than the AZ::IO::MaxPathLength in write it to Json
+ testPath.Native().append(AZ::IO::MaxPathLength + 2, 'a');
+
+ rapidjson::Value loadPathValue;
+ AZ::JsonSerializationResult::ResultCode resultCode = m_serializer->Store(loadPathValue,
+ &testPath, nullptr, azrtti_typeid(), *m_jsonSerializationContext);
+ EXPECT_EQ(AZ::JsonSerializationResult::Outcomes::Success, resultCode.GetOutcome());
+
+ AZ::IO::FixedMaxPath resultPath;
+ AZ::JsonSerializationResult::ResultCode result = m_serializer->Load(&resultPath, azrtti_typeid(),
+ loadPathValue, *m_jsonDeserializationContext);
+ EXPECT_GE(result.GetOutcome(), AZ::JsonSerializationResult::Outcomes::Invalid);
+ }
+} // namespace JsonSerializationTests
diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/TestCases_TypeId.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/TestCases_TypeId.cpp
index 60b8f55dce..b7362a5e61 100644
--- a/Code/Framework/AzCore/Tests/Serialization/Json/TestCases_TypeId.cpp
+++ b/Code/Framework/AzCore/Tests/Serialization/Json/TestCases_TypeId.cpp
@@ -10,6 +10,77 @@
#include
#include
#include
+#include
+
+namespace AZ
+{
+ template
+ struct SerializeGenericTypeInfo>
+ {
+ using ThisType = JsonSerializationTests::TemplatedClass;
+
+ class GenericTemplatedClassInfo : public GenericClassInfo
+ {
+ public:
+ GenericTemplatedClassInfo()
+ : m_classData{ SerializeContext::ClassData::Create(
+ "TemplatedClass", "{CA4ADF74-66E7-4D16-B4AC-F71278C60EC7}", nullptr, nullptr) }
+ {
+ }
+
+ SerializeContext::ClassData* GetClassData() override
+ {
+ return &m_classData;
+ }
+
+ size_t GetNumTemplatedArguments() override
+ {
+ return 1;
+ }
+
+ const Uuid& GetSpecializedTypeId() const override
+ {
+ return m_classData.m_typeId;
+ }
+
+ const Uuid& GetGenericTypeId() const override
+ {
+ return m_classData.m_typeId;
+ }
+
+ const Uuid& GetTemplatedTypeId(size_t element) override
+ {
+ (void)element;
+ return SerializeGenericTypeInfo::GetClassTypeId();
+ }
+
+ void Reflect(SerializeContext* serializeContext) override
+ {
+ if (serializeContext)
+ {
+ serializeContext->RegisterGenericClassInfo(
+ GetSpecializedTypeId(), this, &AZ::AnyTypeInfoConcept>::CreateAny);
+ serializeContext->RegisterGenericClassInfo(
+ azrtti_typeid(), this,
+ &AZ::AnyTypeInfoConcept::CreateAny);
+ }
+ }
+
+ SerializeContext::ClassData m_classData;
+ };
+
+ using ClassInfoType = GenericTemplatedClassInfo;
+ static ClassInfoType* GetGenericInfo()
+ {
+ return GetCurrentSerializeContextModule().CreateGenericClassInfo();
+ }
+
+ static const Uuid& GetClassTypeId()
+ {
+ return GetGenericInfo()->GetClassData()->m_typeId;
+ }
+ };
+} // namespace AZ
namespace JsonSerializationTests
{
@@ -286,4 +357,32 @@ namespace JsonSerializationTests
EXPECT_EQ(Processing::Halted, result.GetProcessing());
EXPECT_EQ(Outcomes::Unknown, result.GetOutcome());
}
+
+ TEST_F(JsonSerializationTests, StoreTypeId_TemplatedType_StoresUuidWithName)
+ {
+ using namespace AZ;
+ using namespace AZ::JsonSerializationResult;
+
+ m_serializeContext->RegisterGenericType>();
+ m_serializeContext->RegisterGenericType>();
+
+ Uuid input = azrtti_typeid>();
+ ResultCode result = JsonSerialization::StoreTypeId(
+ *m_jsonDocument, m_jsonDocument->GetAllocator(), input, AZStd::string_view{}, *m_serializationSettings);
+
+ EXPECT_EQ(Processing::Completed, result.GetProcessing());
+
+ AZStd::string expected =
+ AZStd::string::format(R"("%s TemplatedClass")", azrtti_typeid>().ToString().c_str());
+ Expect_DocStrEq(expected.c_str(), false);
+
+ input = azrtti_typeid>();
+ result = JsonSerialization::StoreTypeId(
+ *m_jsonDocument, m_jsonDocument->GetAllocator(), input, AZStd::string_view{}, *m_serializationSettings);
+
+ expected =
+ AZStd::string::format(R"("%s TemplatedClass")", azrtti_typeid>().ToString().c_str());
+ EXPECT_EQ(Processing::Completed, result.GetProcessing());
+ Expect_DocStrEq(expected.c_str(), false);
+ }
} // namespace JsonSerializationTests
diff --git a/Code/Framework/AzCore/Tests/Time/TimeTests.cpp b/Code/Framework/AzCore/Tests/Time/TimeTests.cpp
index 446368a8ca..164e72343b 100644
--- a/Code/Framework/AzCore/Tests/Time/TimeTests.cpp
+++ b/Code/Framework/AzCore/Tests/Time/TimeTests.cpp
@@ -76,192 +76,4 @@ namespace UnitTest
int64_t delta = static_cast(timeMs) - static_cast(timeUsToMs);
EXPECT_LT(abs(delta), 1);
}
-
- class TimeSystemTests : public AllocatorsTestFixture
- {
- public:
- void SetUp() override
- {
- SetupAllocator();
- m_controlTime = static_cast(AZStd::GetTimeNowMicroSecond());
- m_timeSystem = AZStd::make_unique();
- }
-
- void TearDown() override
- {
- m_controlTime = AZ::Time::ZeroTimeUs;
- m_timeSystem.reset();
- TeardownAllocator();
- }
-
- AZ::TimeUs GetDiff(AZ::TimeUs time1, AZ::TimeUs time2) const
- {
- // AZ::TimeUs is unsigned so make sure to not underflow.
- return time1 > time2 ? time1 - time2 : time2 - time1;
- }
-
- AZ::TimeUs m_controlTime;
- AZStd::unique_ptr m_timeSystem;
- };
-
- TEST_F(TimeSystemTests, GetRealElapsedTimeUs)
- {
- // sleep for a bit to advance time.
- AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(2));
-
- // find the delta for the control and from GetRealElapsedTimeUs
- const AZ::TimeUs baseline = static_cast(AZStd::GetTimeNowMicroSecond()) - m_controlTime;
- const AZ::TimeUs elapsedTime = m_timeSystem->GetRealElapsedTimeUs();
-
- const AZ::TimeUs diff = GetDiff(baseline, elapsedTime);
-
- // elapsedTime should be within 10 microseconds from baseline.
- EXPECT_LT(diff, AZ::TimeUs{ 10 });
- }
-
- TEST_F(TimeSystemTests, GetElapsedTimeUs)
- {
- // sleep for a bit to advance time.
- AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(2));
-
- // find the delta for the control and from GetElapsedTimeUs
- const AZ::TimeUs baseline = static_cast(AZStd::GetTimeNowMicroSecond()) - m_controlTime;
- const AZ::TimeUs elapsedTime = m_timeSystem->GetElapsedTimeUs();
-
- const AZ::TimeUs diff = GetDiff(baseline, elapsedTime);
-
- // elapsedTime should be within 10 microseconds from baseline.
- EXPECT_LT(diff, AZ::TimeUs{ 10 });
- }
-
- TEST_F(TimeSystemTests, ElapsedTimeScales)
- {
- // slow down 'time'
- m_timeSystem->SetSimulationTickScale(0.5f);
-
- // sleep for a bit to advance time.
- AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(2));
-
- // find the delta for the control and from GetElapsedTimeUs
- const AZ::TimeUs baseline = static_cast(AZStd::GetTimeNowMicroSecond()) - m_controlTime;
- const AZ::TimeUs elapsedTime = m_timeSystem->GetElapsedTimeUs();
- const AZ::TimeUs halfBaseline = (baseline / AZ::TimeUs{ 2 });
-
- // elapsedTime should be about half of the control.
- const AZ::TimeUs diff = GetDiff(halfBaseline, elapsedTime);
-
- // elapsedTime should be within 10 microseconds from baseline.
- EXPECT_LT(diff, AZ::TimeUs{ 10 });
-
- // reset time scale
- m_timeSystem->SetSimulationTickScale(1.0f);
- }
-
- TEST_F(TimeSystemTests, AdvanceTickDeltaTimes)
- {
- // advance the tick delta to get a clean base.
- m_timeSystem->AdvanceTickDeltaTimes();
- const AZ::TimeUs baselineStart = static_cast(AZStd::GetTimeNowMicroSecond());
-
- // sleep for a bit to advance time.
- AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(2));
-
- // advance the tick delta.
- const AZ::TimeUs delta = m_timeSystem->AdvanceTickDeltaTimes();
- const AZ::TimeUs baselineDelta = static_cast(AZStd::GetTimeNowMicroSecond()) - baselineStart;
-
- // the delta should be close to the baselineDelta.
- const AZ::TimeUs diff = GetDiff(delta, baselineDelta);
- EXPECT_LT(diff, AZ::TimeUs{ 10 });
- }
-
- TEST_F(TimeSystemTests, SimulationAndRealTickDeltaTimesWithNoTimeScale)
- {
- // advance the tick delta to get a clean base.
- m_timeSystem->AdvanceTickDeltaTimes();
- const AZ::TimeUs baselineStart = static_cast(AZStd::GetTimeNowMicroSecond());
-
- // sleep for a bit to advance time.
- AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(2));
-
- // advance the tick delta.
- const AZ::TimeUs delta = m_timeSystem->AdvanceTickDeltaTimes();
- const AZ::TimeUs baselineDelta = static_cast(AZStd::GetTimeNowMicroSecond()) - baselineStart;
-
- // the delta should be close to the baselineDelta.
- AZ::TimeUs diff = GetDiff(delta, baselineDelta);
- EXPECT_LT(diff, AZ::TimeUs{ 10 });
-
- // the delta should be the same as GetSimulationTickDeltaTimeUs and near GetRealTickDeltaTimeUs
- const AZ::TimeUs simDeltaTime = m_timeSystem->GetSimulationTickDeltaTimeUs();
- EXPECT_EQ(delta, simDeltaTime);
-
- const AZ::TimeUs realDeltaTime = m_timeSystem->GetRealTickDeltaTimeUs();
- diff = GetDiff(delta, realDeltaTime);
- EXPECT_LT(diff, AZ::TimeUs{ 10 });
- }
-
- TEST_F(TimeSystemTests, SimulationAndRealTickDeltaTimesWithTimeScale)
- {
- // advance the tick delta to get a clean base.
- m_timeSystem->AdvanceTickDeltaTimes();
- const AZ::TimeUs baselineStart = static_cast(AZStd::GetTimeNowMicroSecond());
-
- // slow down 'time';
- m_timeSystem->SetSimulationTickScale(0.5f);
-
- // sleep for a bit to advance time.
- AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(2));
-
- // advance the tick delta.
- const AZ::TimeUs delta = m_timeSystem->AdvanceTickDeltaTimes();
- const AZ::TimeUs baselineDelta = static_cast(AZStd::GetTimeNowMicroSecond()) - baselineStart;
- const AZ::TimeUs halfBaselineDelta = (baselineDelta / AZ::TimeUs{ 2 });
-
- // the delta should be half the baselineDelta
- AZ::TimeUs diff = GetDiff(delta, halfBaselineDelta);
- EXPECT_LT(diff, AZ::TimeUs{ 10 });
-
- // the delta should be the same as GetSimulationTickDeltaTimeUs
- const AZ::TimeUs simDeltaTime = m_timeSystem->GetSimulationTickDeltaTimeUs();
- EXPECT_EQ(delta, simDeltaTime);
-
- // the delta should be near half the GetRealTickDeltaTimeUs
- const AZ::TimeUs realDeltaTime = m_timeSystem->GetRealTickDeltaTimeUs();
- const AZ::TimeUs halfRealDeltaTime = (realDeltaTime / AZ::TimeUs{ 2 });
- diff = GetDiff(delta, halfRealDeltaTime);
- EXPECT_LT(diff, AZ::TimeUs{ 10 });
-
- // reset time scale
- m_timeSystem->SetSimulationTickScale(1.0f);
- }
-
- TEST_F(TimeSystemTests, SimulationTickDeltaOverride)
- {
- // advance the tick delta to get a clean base.
- m_timeSystem->AdvanceTickDeltaTimes();
- const AZ::TimeUs baselineStart = static_cast(AZStd::GetTimeNowMicroSecond());
-
- // set the tick delta override
- const AZ::TimeMs tickOverride = AZ::TimeMs{ 3462 };
- m_timeSystem->SetSimulationTickDeltaOverride(tickOverride);
-
- // sleep for a bit to advance time.
- AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(2));
-
- // advance the tick delta.
- const AZ::TimeUs delta = m_timeSystem->AdvanceTickDeltaTimes();
- const AZ::TimeUs baselineDelta = static_cast(AZStd::GetTimeNowMicroSecond()) - baselineStart;
-
- // the delta should be equal to the tickOverride
- EXPECT_EQ(delta, AZ::TimeMsToUs(tickOverride));
-
- // real tick delta should be near the baselineDelta
- const AZ::TimeUs realDeltaTime = m_timeSystem->GetRealTickDeltaTimeUs();
- const AZ::TimeUs diff = GetDiff(realDeltaTime, baselineDelta);
- EXPECT_LT(diff, AZ::TimeUs{ 10 });
-
- // reset the tick delta override
- m_timeSystem->SetSimulationTickDeltaOverride(AZ::Time::ZeroTimeMs);
- }
} // namespace UnitTest
diff --git a/Code/Framework/AzCore/Tests/azcoretests_files.cmake b/Code/Framework/AzCore/Tests/azcoretests_files.cmake
index 01e3b8c37d..ea1c2cb076 100644
--- a/Code/Framework/AzCore/Tests/azcoretests_files.cmake
+++ b/Code/Framework/AzCore/Tests/azcoretests_files.cmake
@@ -111,6 +111,7 @@ set(FILES
Serialization/Json/MapSerializerTests.cpp
Serialization/Json/MathVectorSerializerTests.cpp
Serialization/Json/MathMatrixSerializerTests.cpp
+ Serialization/Json/PathSerializerTests.cpp
Serialization/Json/SmartPointerSerializerTests.cpp
Serialization/Json/StringSerializerTests.cpp
Serialization/Json/TestCases.h
diff --git a/Code/Framework/AzFramework/AzFramework/azframework_files.cmake b/Code/Framework/AzFramework/AzFramework/azframework_files.cmake
index aac7bd8f14..73608d6a85 100644
--- a/Code/Framework/AzFramework/AzFramework/azframework_files.cmake
+++ b/Code/Framework/AzFramework/AzFramework/azframework_files.cmake
@@ -270,8 +270,6 @@ set(FILES
Physics/WindBus.h
Process/ProcessCommunicator.cpp
Process/ProcessCommunicator.h
- Process/ProcessWatcher.cpp
- Process/ProcessWatcher.h
Process/ProcessCommon_fwd.h
Process/ProcessCommunicator.h
Process/ProcessWatcher.cpp
diff --git a/Code/Framework/AzFramework/Platform/Common/Default/AzFramework/Process/ProcessWatcher_Default.cpp b/Code/Framework/AzFramework/Platform/Common/Default/AzFramework/Process/ProcessWatcher_Default.cpp
index f87c51bdc5..a30ab72420 100644
--- a/Code/Framework/AzFramework/Platform/Common/Default/AzFramework/Process/ProcessWatcher_Default.cpp
+++ b/Code/Framework/AzFramework/Platform/Common/Default/AzFramework/Process/ProcessWatcher_Default.cpp
@@ -83,4 +83,9 @@ namespace AzFramework
{
}
+
+ AZStd::string ProcessLauncher::ProcessLaunchInfo::GetCommandLineParametersAsString() const
+ {
+ return AZStd::string{};
+ }
} //namespace AzFramework
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SliderCombo.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SliderCombo.cpp
index 7b818459d6..6333d28365 100644
--- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SliderCombo.cpp
+++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SliderCombo.cpp
@@ -243,7 +243,7 @@ SliderDoubleCombo::SliderDoubleCombo(QWidget* parent)
InitialiseSliderCombo(this, layout, m_spinbox, m_slider);
- connect(m_slider, &SliderDouble::valueChanged, this, &SliderDoubleCombo::setValue);
+ connect(m_slider, &SliderDouble::valueChanged, this, &SliderDoubleCombo::setValueSlider);
connect(m_spinbox, QOverload::of(&DoubleSpinBox::valueChanged), this, &SliderDoubleCombo::setValue);
connect(m_slider, &SliderDouble::sliderReleased, this, &SliderDoubleCombo::editingFinished);
connect(m_spinbox, &DoubleSpinBox::editingFinished, this, &SliderDoubleCombo::editingFinished);
@@ -254,7 +254,7 @@ SliderDoubleCombo::~SliderDoubleCombo()
{
}
-void SliderDoubleCombo::setValue(double value)
+void SliderDoubleCombo::setValueSlider(double value)
{
const bool doEmit = m_value != value;
m_value = value;
@@ -264,10 +264,34 @@ void SliderDoubleCombo::setValue(double value)
if (doEmit)
{
+ // We don't want to update the slider from setValue as this
+ // causes rounding errors in the tooltip hint.
+ m_fromSlider = true;
Q_EMIT valueChanged();
}
}
+void SliderDoubleCombo::setValue(double value)
+{
+ const bool doEmit = m_value != value;
+ m_value = value;
+
+ updateSpinBox();
+ if (!m_fromSlider)
+ {
+ updateSlider();
+
+ if (doEmit)
+ {
+ Q_EMIT valueChanged();
+ }
+ }
+ else
+ {
+ m_fromSlider = false;
+ }
+}
+
SliderDouble* SliderDoubleCombo::slider() const
{
return m_slider;
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SliderCombo.h b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SliderCombo.h
index 2646162af4..05d0f7b51b 100644
--- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SliderCombo.h
+++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/SliderCombo.h
@@ -151,6 +151,8 @@ namespace AzQtComponents
//! Sets the current value.
void setValue(double value);
+ //! Sets the current value.
+ void setValueSlider(double value);
//! Return the current value.
Q_REQUIRED_RESULT double value() const;
@@ -235,5 +237,6 @@ namespace AzQtComponents
double m_softMinimum = 0.0;
double m_softMaximum = 100.0;
double m_value = 0.0;
+ bool m_fromSlider{ false };
};
} // namespace AzQtComponents
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.cpp
index feab9a9e5a..cfcac579ff 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.cpp
@@ -144,7 +144,10 @@ namespace AzToolsFramework
{
emit ClearStringFilter();
emit ClearTypeFilter();
- m_sourceFilterModel->FilterUpdatedSlotImmediate();
+ if (m_sourceFilterModel)
+ {
+ m_sourceFilterModel->FilterUpdatedSlotImmediate();
+ }
}
void AssetBrowserTableView::Update()
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceUtilities.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceUtilities.cpp
index c13f7dd848..93b1fce5b4 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceUtilities.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceUtilities.cpp
@@ -2666,19 +2666,15 @@ namespace AzToolsFramework
if (!isPathSafeForAssets)
{
// Put an error in the console, so the log files have info about this error, or the user can look up the error after dismissing it.
- AZStd::string errorMessage = "You can save slices only to your game project folder or the Gems folder. Update the location and try again.\n\n"
- "You can also review and update your save locations in the AssetProcessorPlatformConfig.ini file.";
+ AZStd::string errorMessage = "You can save slices only to your game project folder or the Gems folder. Update the location and try again.\n\n";
AZ_Error("Slice", false, errorMessage.c_str());
- QString learnMoreLink(QObject::tr(""));
- QString learnMoreDescription(QObject::tr(" Learn more").arg(learnMoreLink));
-
// Display a pop-up, the logs are easy to miss. This will make sure a user who encounters this error immediately knows their slice save has failed.
QMessageBox msgBox(activeWindow);
msgBox.setIcon(QMessageBox::Icon::Warning);
msgBox.setTextFormat(Qt::RichText);
msgBox.setWindowTitle(QObject::tr("Invalid save location"));
- msgBox.setText(QString("%1 %2").arg(QObject::tr(errorMessage.c_str())).arg(learnMoreDescription));
+ msgBox.setText(QString("%1").arg(QObject::tr(errorMessage.c_str())));
msgBox.setStandardButtons(QMessageBox::Cancel | QMessageBox::Retry);
msgBox.setDefaultButton(QMessageBox::Retry);
const int response = msgBox.exec();
@@ -2689,7 +2685,16 @@ namespace AzToolsFramework
// so set the suggested save path to a known valid location.
if (assetSafeFolders.size() > 0)
{
- retrySavePath = assetSafeFolders[0];
+ QStringList strList = slicePath.split("/");
+ if (strList.size() > 0)
+ {
+ retrySavePath = assetSafeFolders[0] + ("/" + strList[strList.size() - 1]).toUtf8().data();
+ }
+ else
+ {
+ retrySavePath = assetSafeFolders[0];
+ }
+
}
return SliceSaveResult::Retry;
case QMessageBox::Cancel:
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogPanel_Panel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogPanel_Panel.cpp
index ef8bf42713..a9449645c7 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogPanel_Panel.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogPanel_Panel.cpp
@@ -840,8 +840,6 @@ namespace AzToolsFramework
richLabel->setTextFormat(Qt::RichText);
}
- richLabel->setText(data);
-
richLabel->setGeometry(options.rect);
richLabel->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse);
richLabel->setPalette(options.palette);
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.cpp
index baf75eb978..c499d0f92f 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerWidget.cpp
@@ -1117,6 +1117,8 @@ namespace AzToolsFramework
m_listModel->SearchStringChanged(filterString);
m_proxyModel->UpdateFilter();
+
+ m_gui->m_objectTree->expandAll();
}
void EntityOutlinerWidget::OnFilterChanged(const AzQtComponents::SearchTypeFilterList& activeTypeFilters)
diff --git a/Code/Tools/AWSNativeSDKInit/include/AWSNativeSDKInit/AWSLogSystemInterface.h b/Code/Tools/AWSNativeSDKInit/include/AWSNativeSDKInit/AWSLogSystemInterface.h
index 4982d3efbd..901e37cd7b 100644
--- a/Code/Tools/AWSNativeSDKInit/include/AWSNativeSDKInit/AWSLogSystemInterface.h
+++ b/Code/Tools/AWSNativeSDKInit/include/AWSNativeSDKInit/AWSLogSystemInterface.h
@@ -10,7 +10,7 @@
#if defined(PLATFORM_SUPPORTS_AWS_NATIVE_SDK)
-#include
+#include
AZ_PUSH_DISABLE_WARNING(4251 4996, "-Wunknown-warning-option")
#include
diff --git a/Code/Tools/AWSNativeSDKInit/include/AWSNativeSDKInit/AWSMemoryInterface.h b/Code/Tools/AWSNativeSDKInit/include/AWSNativeSDKInit/AWSMemoryInterface.h
index 805088563f..26126057e2 100644
--- a/Code/Tools/AWSNativeSDKInit/include/AWSNativeSDKInit/AWSMemoryInterface.h
+++ b/Code/Tools/AWSNativeSDKInit/include/AWSNativeSDKInit/AWSMemoryInterface.h
@@ -8,6 +8,7 @@
#pragma once
+#include
#if defined(PLATFORM_SUPPORTS_AWS_NATIVE_SDK)
#include
#else
diff --git a/Code/Tools/AWSNativeSDKInit/include/AWSNativeSDKInit/AWSNativeSDKInit.h b/Code/Tools/AWSNativeSDKInit/include/AWSNativeSDKInit/AWSNativeSDKInit.h
index 32bf02a247..f50d7002eb 100644
--- a/Code/Tools/AWSNativeSDKInit/include/AWSNativeSDKInit/AWSNativeSDKInit.h
+++ b/Code/Tools/AWSNativeSDKInit/include/AWSNativeSDKInit/AWSNativeSDKInit.h
@@ -13,7 +13,7 @@
#include
#if defined(PLATFORM_SUPPORTS_AWS_NATIVE_SDK)
-
+#include
// The AWS Native SDK AWSAllocator triggers a warning due to accessing members of std::allocator directly.
// AWSAllocator.h(70): warning C4996: 'std::allocator::pointer': warning STL4010: Various members of std::allocator are deprecated in C++17.
// Use std::allocator_traits instead of accessing these members directly.
diff --git a/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderApplication.cpp b/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderApplication.cpp
index da2edcc51f..074138b324 100644
--- a/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderApplication.cpp
+++ b/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderApplication.cpp
@@ -37,6 +37,7 @@
#include
#include
#include
+#include
namespace AssetBuilder
{
@@ -165,6 +166,7 @@ void AssetBuilderApplication::StartCommon(AZ::Entity* systemEntity)
AssetBuilderSDK::InitializeSerializationContext();
AssetBuilderSDK::InitializeBehaviorContext();
+ AssetBuilder::InitializeSerializationContext();
// the asset builder app never writes source files, only assets, so there is no need to do any kind of asset upgrading
AZ::Data::AssetManager::Instance().SetAssetInfoUpgradingEnabled(false);
diff --git a/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderComponent.cpp b/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderComponent.cpp
index 78244ab02c..21b8c31cf4 100644
--- a/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderComponent.cpp
+++ b/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderComponent.cpp
@@ -34,6 +34,7 @@
#include
#include
#include
+#include
// Command-line parameter options:
static const char* const s_paramHelp = "help"; // Print help information.
@@ -51,10 +52,10 @@ static const char* const s_paramDebugCreate = "debug_create"; // Debug mode for
static const char* const s_paramDebugProcess = "debug_process"; // Debug mode for the process job of the specified file.
static const char* const s_paramPlatformTags = "tags"; // Additional list of tags to add platform tag list.
static const char* const s_paramPlatform = "platform"; // Platform to use
+static const char* const s_paramRegisterBuilders = "register"; // Indicates the AP is starting up and requesting a list of registered builders
// Task modes:
static const char* const s_taskResident = "resident"; // stays up and running indefinitely, accepting jobs via network connection
-static const char* const s_taskRegisterBuilder = "register"; // outputs all the builder descriptors
static const char* const s_taskCreateJob = "create"; // runs a builders createJobs function
static const char* const s_taskProcessJob = "process"; // runs processJob function
static const char* const s_taskDebug = "debug"; // runs a one shot job in a fake environment for a specified file.
@@ -204,6 +205,40 @@ void AssetBuilderComponent::Reflect(AZ::ReflectContext* context)
}
}
+bool AssetBuilderComponent::DoHelloPing()
+{
+ using namespace AssetBuilder;
+
+ BuilderHelloRequest request;
+ BuilderHelloResponse response;
+
+ AZStd::string id;
+
+ if (!GetParameter(s_paramId, id))
+ {
+ return false;
+ }
+
+ request.m_uuid = AZ::Uuid::CreateString(id.c_str());
+
+ AZ_TracePrintf(
+ "AssetBuilderComponent", "RunInResidentMode: Pinging asset processor with the builder UUID %s\n",
+ request.m_uuid.ToString().c_str());
+
+ bool result = AzFramework::AssetSystem::SendRequest(request, response);
+
+ AZ_Error("AssetBuilder", result, "Failed to send hello request to Asset Processor");
+ // This error is only shown if we successfully got a response AND the response explicitly indicates the AP rejected the builder
+ AZ_Error("AssetBuilder", !result || response.m_accepted, "Asset Processor rejected connection request");
+
+ if (result)
+ {
+ AZ_TracePrintf("AssetBuilder", "Builder ID: %s\n", response.m_uuid.ToString().c_str());
+ }
+
+ return result;
+}
+
bool AssetBuilderComponent::Run()
{
AZ_TracePrintf("AssetBuilderComponent", "Run: Parsing command line.\n");
@@ -217,8 +252,8 @@ bool AssetBuilderComponent::Run()
}
AZStd::string task;
-
AZStd::string debugFile;
+
if (GetParameter(s_paramDebug, debugFile, false))
{
task = s_taskDebug;
@@ -256,11 +291,13 @@ bool AssetBuilderComponent::Run()
AZ_TracePrintf("AssetBuilderComponent", "Run: Connecting back to Asset Processor...\n");
bool connectedToAssetProcessor = ConnectToAssetProcessor();
//AP connection is required to access the asset catalog
- AZ_Error("AssetBuilder", connectedToAssetProcessor, "Failed to establish a network connection to the AssetProcessor. Use -help for options.");;
+ AZ_Error("AssetBuilder", connectedToAssetProcessor, "Failed to establish a network connection to the AssetProcessor. Use -help for options.");
+
+ bool registerBuilders = commandLine->GetNumSwitchValues(s_paramRegisterBuilders) > 0;
IBuilderApplication* builderApplication = AZ::Interface::Get();
- if(!builderApplication)
+ if (!builderApplication)
{
AZ_Error("AssetBuilder", false, "Failed to retreive IBuilderApplication interface");
return false;
@@ -274,7 +311,7 @@ bool AssetBuilderComponent::Run()
{
if (task == s_taskResident)
{
- result = RunInResidentMode();
+ result = RunInResidentMode(registerBuilders);
}
else if (task == s_taskDebug)
{
@@ -370,43 +407,46 @@ bool AssetBuilderComponent::ConnectToAssetProcessor()
//////////////////////////////////////////////////////////////////////////
-bool AssetBuilderComponent::RunInResidentMode()
+bool AssetBuilderComponent::SendRegisteredBuildersToAp()
{
- using namespace AssetBuilderSDK;
+ AssetBuilder::BuilderRegistrationRequest registrationRequest;
+
+ for (const auto& [uuid, desc] : m_assetBuilderDescMap)
+ {
+ AssetBuilder::BuilderRegistration registration;
+
+ registration.m_name = desc->m_name;
+ registration.m_analysisFingerprint = desc->m_analysisFingerprint;
+ registration.m_flags = desc->m_flags;
+ registration.m_flagsByJobKey = desc->m_flagsByJobKey;
+ registration.m_version = desc->m_version;
+ registration.m_busId = desc->m_busId;
+ registration.m_patterns = desc->m_patterns;
+ registration.m_productsToKeepOnFailure = desc->m_productsToKeepOnFailure;
+
+ registrationRequest.m_builders.push_back(AZStd::move(registration));
+ }
+
+ bool result = SendRequest(registrationRequest);
+
+ AZ_Error("AssetBuilder", result, "Failed to send builder registration request to Asset Processor");
+
+ return result;
+}
+
+bool AssetBuilderComponent::RunInResidentMode(bool sendRegistration)
+{
+ using namespace AssetBuilder;
using namespace AZStd::placeholders;
AZ_TracePrintf("AssetBuilderComponent", "RunInResidentMode: Starting resident mode (waiting for commands to arrive)\n");
- AZStd::string port, id, builderFolder;
-
- if (!GetParameter(s_paramId, id)
- || !GetParameter(s_paramModule, builderFolder))
- {
- return false;
- }
-
- if (!LoadBuilders(builderFolder))
- {
- return false;
- }
-
AzFramework::SocketConnection::GetInstance()->AddMessageHandler(CreateJobsNetRequest::MessageType(), AZStd::bind(&AssetBuilderComponent::CreateJobsResidentHandler, this, _1, _2, _3, _4));
AzFramework::SocketConnection::GetInstance()->AddMessageHandler(ProcessJobNetRequest::MessageType(), AZStd::bind(&AssetBuilderComponent::ProcessJobResidentHandler, this, _1, _2, _3, _4));
- BuilderHelloRequest request;
- BuilderHelloResponse response;
+ bool result = DoHelloPing() && ((sendRegistration && SendRegisteredBuildersToAp()) || !sendRegistration);
- request.m_uuid = AZ::Uuid::CreateString(id.c_str());
-
- AZ_TracePrintf("AssetBuilderComponent", "RunInResidentMode: Pinging asset processor with the builder UUID %s\n", request.m_uuid.ToString().c_str());
-
- bool result = AzFramework::AssetSystem::SendRequest(request, response);
-
- AZ_Error("AssetBuilder", result, "Failed to send hello request to Asset Processor");
- // This error is only shown if we successfully got a response AND the response explicitly indicates the AP rejected the builder
- AZ_Error("AssetBuilder", !result || response.m_accepted, "Asset Processor rejected connection request");
-
- if (result && response.m_accepted)
+ if (result)
{
m_running = true;
@@ -415,7 +455,6 @@ bool AssetBuilderComponent::RunInResidentMode()
AzFramework::EngineConnectionEvents::Bus::Handler::BusConnect(); // Listen for disconnects
- AZ_TracePrintf("AssetBuilder", "Builder ID: %s\n", response.m_uuid.ToString().c_str());
AZ_TracePrintf("AssetBuilder", "Resident mode ready\n");
m_mainEvent.acquire();
AZ_TracePrintf("AssetBuilder", "Shutting down\n");
@@ -736,11 +775,7 @@ bool AssetBuilderComponent::RunOneShotTask(const AZStd::string& task)
AZ::StringFunc::Path::Normalize(inputFilePath);
AZ::StringFunc::Path::Normalize(outputFilePath);
- if (task == s_taskRegisterBuilder)
- {
- return HandleRegisterBuilder(inputFilePath, outputFilePath);
- }
- else if (task == s_taskCreateJob)
+ if (task == s_taskCreateJob)
{
auto func = [this](const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response)
{
@@ -896,7 +931,7 @@ void AssetBuilderComponent::JobThread()
{
case JobType::Create:
{
- using namespace AssetBuilderSDK;
+ using namespace AssetBuilder;
auto* netRequest = azrtti_cast(job->m_netRequest.get());
auto* netResponse = azrtti_cast(job->m_netResponse.get());
@@ -922,7 +957,7 @@ void AssetBuilderComponent::JobThread()
}
case JobType::Process:
{
- using namespace AssetBuilderSDK;
+ using namespace AssetBuilder;
AZ_TracePrintf("AssetBuilder", "Running processJob task\n");
@@ -981,14 +1016,14 @@ void AssetBuilderComponent::JobThread()
void AssetBuilderComponent::CreateJobsResidentHandler(AZ::u32 /*typeId*/, AZ::u32 serial, const void* data, AZ::u32 dataLength)
{
- using namespace AssetBuilderSDK;
+ using namespace AssetBuilder;
ResidentJobHandler(serial, data, dataLength, JobType::Create);
}
void AssetBuilderComponent::ProcessJobResidentHandler(AZ::u32 /*typeId*/, AZ::u32 serial, const void* data, AZ::u32 dataLength)
{
- using namespace AssetBuilderSDK;
+ using namespace AssetBuilder;
ResidentJobHandler(serial, data, dataLength, JobType::Process);
}
@@ -1018,18 +1053,6 @@ bool AssetBuilderComponent::HandleTask(const AZStd::string& inputFilePath, const
return true;
}
-bool AssetBuilderComponent::HandleRegisterBuilder(const AZStd::string& /*inputFilePath*/, const AZStd::string& outputFilePath) const
-{
- AssetBuilderSDK::RegisterBuilderResponse response;
-
- for (const auto& pair : m_assetBuilderDescMap)
- {
- response.m_assetBuilderDescList.push_back(*pair.second);
- }
-
- return AZ::Utils::SaveObjectToFile(outputFilePath, AZ::DataStream::ST_XML, &response);
-}
-
void AssetBuilderComponent::UpdateResultCode(const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response) const
{
if (request.m_jobDescription.m_failOnError)
diff --git a/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderComponent.h b/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderComponent.h
index 2014be41aa..2172e9093e 100644
--- a/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderComponent.h
+++ b/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderComponent.h
@@ -46,6 +46,7 @@ class AssetBuilderComponent
public:
AZ_COMPONENT(AssetBuilderComponent, "{04332899-5d73-4d41-86b7-b1017d349673}")
static void Reflect(AZ::ReflectContext* context);
+ bool DoHelloPing();
AssetBuilderComponent() = default;
~AssetBuilderComponent() override = default;
@@ -64,7 +65,7 @@ public:
void RegisterBuilderInformation(const AssetBuilderSDK::AssetBuilderDesc& builderDesc) override;
void RegisterComponentDescriptor(AZ::ComponentDescriptor* descriptor) override;
-
+
//EngineConnectionEvents Handler
void Disconnected(AzFramework::SocketConnection* connection) override;
@@ -98,12 +99,13 @@ protected:
static const char* GetLibraryExtension();
bool ConnectToAssetProcessor();
+ bool SendRegisteredBuildersToAp();
bool LoadBuilders(const AZStd::string& builderFolder);
bool LoadBuilder(const AZStd::string& filePath);
void UnloadBuilders();
//! Hooks up net job request handling and keeps the AssetBuilder running indefinitely
- bool RunInResidentMode();
+ bool RunInResidentMode(bool sendRegistration);
bool RunDebugTask(AZStd::string&& debugFile, bool runCreateJobs, bool runProcessJob);
bool RunOneShotTask(const AZStd::string& task);
@@ -120,9 +122,6 @@ protected:
void ProcessJob(const AssetBuilderSDK::ProcessJobFunction& job, const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& outResponse);
- //! Handles a builder registration request
- bool HandleRegisterBuilder(const AZStd::string& inputFilePath, const AZStd::string& outputFilePath) const;
-
//! If needed looks at collected data and updates the result code from the job accordingly.
void UpdateResultCode(const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response) const;
@@ -141,7 +140,7 @@ protected:
//! Currently loading builder
AssetBuilder::ExternalModuleAssetBuilderInfo* m_currentAssetBuilder = nullptr;
-
+
//! Thread for running a job, so we don't block the network thread while doing work
AZStd::thread_desc m_jobThreadDesc;
AZStd::thread m_jobThread;
@@ -153,7 +152,7 @@ protected:
AZStd::binary_semaphore m_mainEvent;
//! Use to signal a new job is ready to be processed
AZStd::binary_semaphore m_jobEvent;
-
+
//! Lock for m_queuedJob
AZStd::mutex m_jobMutex;
diff --git a/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderStatic.cpp b/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderStatic.cpp
new file mode 100644
index 0000000000..6a67fbe425
--- /dev/null
+++ b/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderStatic.cpp
@@ -0,0 +1,182 @@
+/*
+ * 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
+
+namespace AssetBuilder
+{
+ void Reflect(AZ::ReflectContext* context)
+ {
+ BuilderRegistrationRequest::Reflect(context);
+
+ BuilderHelloRequest::Reflect(context);
+ BuilderHelloResponse::Reflect(context);
+ CreateJobsNetRequest::Reflect(context);
+ CreateJobsNetResponse::Reflect(context);
+ ProcessJobNetRequest::Reflect(context);
+ ProcessJobNetResponse::Reflect(context);
+ }
+
+ void InitializeSerializationContext()
+ {
+ AZ::SerializeContext* serializeContext = nullptr;
+
+ AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationBus::Events::GetSerializeContext);
+ AZ_Assert(serializeContext, "Unable to retrieve serialize context.");
+
+ Reflect(serializeContext);
+ }
+
+ void BuilderHelloRequest::Reflect(AZ::ReflectContext* context)
+ {
+ auto serialize = azrtti_cast(context);
+ if (serialize)
+ {
+ serialize->Class()->Version(1)->Field("UUID", &BuilderHelloRequest::m_uuid);
+ }
+ }
+
+ unsigned int BuilderHelloRequest::MessageType()
+ {
+ static unsigned int messageType = AZ_CRC("AssetBuilderSDK::BuilderHelloRequest", 0x213a7248);
+
+ return messageType;
+ }
+
+ unsigned int BuilderHelloRequest::GetMessageType() const
+ {
+ return MessageType();
+ }
+
+ void BuilderHelloResponse::Reflect(AZ::ReflectContext* context)
+ {
+ auto serialize = azrtti_cast(context);
+ if (serialize)
+ {
+ serialize->Class()
+ ->Version(1)
+ ->Field("Accepted", &BuilderHelloResponse::m_accepted)
+ ->Field("UUID", &BuilderHelloResponse::m_uuid);
+ }
+ }
+
+ unsigned int BuilderHelloResponse::GetMessageType() const
+ {
+ return BuilderHelloRequest::MessageType();
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+
+ void CreateJobsNetRequest::Reflect(AZ::ReflectContext* context)
+ {
+ auto serialize = azrtti_cast(context);
+ if (serialize)
+ {
+ serialize->Class()->Version(1)->Field("Request", &CreateJobsNetRequest::m_request);
+ }
+ }
+
+ unsigned int CreateJobsNetRequest::MessageType()
+ {
+ static unsigned int messageType = AZ_CRC("AssetBuilderSDK::CreateJobsNetRequest", 0xc48209c0);
+
+ return messageType;
+ }
+
+ unsigned int CreateJobsNetRequest::GetMessageType() const
+ {
+ return MessageType();
+ }
+
+ void CreateJobsNetResponse::Reflect(AZ::ReflectContext* context)
+ {
+ auto serialize = azrtti_cast(context);
+ if (serialize)
+ {
+ serialize->Class()->Version(1)->Field("Response", &CreateJobsNetResponse::m_response);
+ }
+ }
+
+ unsigned int CreateJobsNetResponse::GetMessageType() const
+ {
+ return CreateJobsNetRequest::MessageType();
+ }
+
+ void ProcessJobNetRequest::Reflect(AZ::ReflectContext* context)
+ {
+ auto serialize = azrtti_cast(context);
+ if (serialize)
+ {
+ serialize->Class()->Version(1)->Field("Request", &ProcessJobNetRequest::m_request);
+ }
+ }
+
+ unsigned int ProcessJobNetRequest::MessageType()
+ {
+ static unsigned int messageType = AZ_CRC("AssetBuilderSDK::ProcessJobNetRequest", 0x479f340f);
+
+ return messageType;
+ }
+
+ unsigned int ProcessJobNetRequest::GetMessageType() const
+ {
+ return MessageType();
+ }
+
+ void ProcessJobNetResponse::Reflect(AZ::ReflectContext* context)
+ {
+ auto serialize = azrtti_cast(context);
+ if (serialize)
+ {
+ serialize->Class()->Version(1)->Field("Response", &ProcessJobNetResponse::m_response);
+ }
+ }
+
+ unsigned int ProcessJobNetResponse::GetMessageType() const
+ {
+ return ProcessJobNetRequest::MessageType();
+ }
+
+ //---------------------------------------------------------------------
+ void BuilderRegistration::Reflect(AZ::ReflectContext* context)
+ {
+ auto serialize = azrtti_cast(context);
+ if (serialize)
+ {
+ serialize->Class()
+ ->Version(1)
+ ->Field("Name", &BuilderRegistration::m_name)
+ ->Field("Patterns", &BuilderRegistration::m_patterns)
+ ->Field("BusId", &BuilderRegistration::m_busId)
+ ->Field("Version", &BuilderRegistration::m_version)
+ ->Field("AnalysisFingerprint", &BuilderRegistration::m_analysisFingerprint)
+ ->Field("Flags", &BuilderRegistration::m_flags)
+ ->Field("FlagsByJobKey", &BuilderRegistration::m_flagsByJobKey)
+ ->Field("ProductsToKeepOnFailure", &BuilderRegistration::m_productsToKeepOnFailure);
+ }
+ }
+
+ void BuilderRegistrationRequest::Reflect(AZ::ReflectContext* context)
+ {
+ BuilderRegistration::Reflect(context);
+
+ auto serialize = azrtti_cast(context);
+ if (serialize)
+ {
+ serialize->Class()->Version(1)->Field(
+ "Builders", &BuilderRegistrationRequest::m_builders);
+ }
+ }
+
+ unsigned int BuilderRegistrationRequest::GetMessageType() const
+ {
+ return BuilderRegistrationRequest::MessageType;
+ }
+
+} // namespace AssetBuilder
diff --git a/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderStatic.h b/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderStatic.h
new file mode 100644
index 0000000000..41b6531116
--- /dev/null
+++ b/Code/Tools/AssetProcessor/AssetBuilder/AssetBuilderStatic.h
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#pragma once
+
+#include
+#include
+
+namespace AssetBuilder
+{
+ void Reflect(AZ::ReflectContext* context);
+
+ void InitializeSerializationContext();
+
+ //! BuilderHelloRequest is sent by an AssetBuilder that is attempting to connect to the AssetProcessor to register itself as a worker
+ class BuilderHelloRequest : public AzFramework::AssetSystem::BaseAssetProcessorMessage
+ {
+ public:
+ AZ_CLASS_ALLOCATOR(BuilderHelloRequest, AZ::OSAllocator, 0);
+ AZ_RTTI(BuilderHelloRequest, "{5fab5962-a1d8-42a5-bf7a-fb1a8c5a9588}", BaseAssetProcessorMessage);
+
+ static void Reflect(AZ::ReflectContext* context);
+ static unsigned int MessageType();
+
+ unsigned int GetMessageType() const override;
+
+ //! Unique ID assigned to this builder to identify it
+ AZ::Uuid m_uuid = AZ::Uuid::CreateNull();
+ };
+
+ //! BuilderHelloResponse contains the AssetProcessor's response to a builder connection attempt, indicating if it is accepted and the ID
+ //! that it was assigned
+ class BuilderHelloResponse : public AzFramework::AssetSystem::BaseAssetProcessorMessage
+ {
+ public:
+ AZ_CLASS_ALLOCATOR(BuilderHelloResponse, AZ::OSAllocator, 0);
+ AZ_RTTI(BuilderHelloResponse, "{5f3d7c11-6639-4c6f-980a-32be546903c2}", BaseAssetProcessorMessage);
+
+ static void Reflect(AZ::ReflectContext* context);
+
+ unsigned int GetMessageType() const override;
+
+ //! Indicates if the builder was accepted by the AP
+ bool m_accepted = false;
+
+ //! Unique ID assigned to the builder. If the builder isn't a local process, this is the ID assigned by the AP
+ AZ::Uuid m_uuid = AZ::Uuid::CreateNull();
+ };
+
+ class CreateJobsNetRequest : public AzFramework::AssetSystem::BaseAssetProcessorMessage
+ {
+ public:
+ AZ_CLASS_ALLOCATOR(CreateJobsNetRequest, AZ::OSAllocator, 0);
+ AZ_RTTI(CreateJobsNetRequest, "{97fa717d-3a09-4d21-95c6-b2eafd773f1c}", BaseAssetProcessorMessage);
+
+ static void Reflect(AZ::ReflectContext* context);
+ static unsigned int MessageType();
+
+ unsigned int GetMessageType() const override;
+
+ AssetBuilderSDK::CreateJobsRequest m_request;
+ };
+
+ class CreateJobsNetResponse : public AzFramework::AssetSystem::BaseAssetProcessorMessage
+ {
+ public:
+ AZ_CLASS_ALLOCATOR(CreateJobsNetResponse, AZ::OSAllocator, 0);
+ AZ_RTTI(CreateJobsNetResponse, "{b2c7c2d3-b60e-4b27-b699-43e0ba991c33}", BaseAssetProcessorMessage);
+
+ static void Reflect(AZ::ReflectContext* context);
+
+ unsigned int GetMessageType() const override;
+
+ AssetBuilderSDK::CreateJobsResponse m_response;
+ };
+
+ class ProcessJobNetRequest : public AzFramework::AssetSystem::BaseAssetProcessorMessage
+ {
+ public:
+ AZ_CLASS_ALLOCATOR(ProcessJobNetRequest, AZ::OSAllocator, 0);
+ AZ_RTTI(ProcessJobNetRequest, "{05288de1-020b-48db-b9de-715f17284efa}", BaseAssetProcessorMessage);
+
+ static void Reflect(AZ::ReflectContext* context);
+ static unsigned int MessageType();
+
+ unsigned int GetMessageType() const override;
+
+ AssetBuilderSDK::ProcessJobRequest m_request;
+ };
+
+ class ProcessJobNetResponse : public AzFramework::AssetSystem::BaseAssetProcessorMessage
+ {
+ public:
+ AZ_CLASS_ALLOCATOR(ProcessJobNetResponse, AZ::OSAllocator, 0);
+ AZ_RTTI(ProcessJobNetResponse, "{26ddf882-246c-4cfb-912f-9b8e389df4f6}", BaseAssetProcessorMessage);
+
+ static void Reflect(AZ::ReflectContext* context);
+
+ unsigned int GetMessageType() const override;
+
+ AssetBuilderSDK::ProcessJobResponse m_response;
+ };
+
+ //////////////////////////////////////////////////////////////////////////
+ struct BuilderRegistration
+ {
+ AZ_CLASS_ALLOCATOR(BuilderRegistration, AZ::OSAllocator, 0);
+ AZ_TYPE_INFO(BuilderRegistration, "{36E785C3-5046-4568-870A-336C8249E453}");
+
+ static void Reflect(AZ::ReflectContext* context);
+
+ AZStd::string m_name;
+ AZStd::vector m_patterns;
+ AZ::Uuid m_busId;
+ int m_version = 0;
+ AZStd::string m_analysisFingerprint;
+ AZ::u8 m_flags = 0;
+ AZStd::unordered_map m_flagsByJobKey;
+ AZStd::unordered_map> m_productsToKeepOnFailure;
+ };
+
+ class BuilderRegistrationRequest : public AzFramework::AssetSystem::BaseAssetProcessorMessage
+ {
+ public:
+ AZ_CLASS_ALLOCATOR(BuilderRegistrationRequest, AZ::OSAllocator, 0);
+ AZ_RTTI(BuilderRegistrationRequest, "{FA9CF2D5-C847-47F3-979D-6C3AE061715C}", BaseAssetProcessorMessage);
+ static void Reflect(AZ::ReflectContext* context);
+ static constexpr unsigned int MessageType = AZ_CRC_CE("AssetSystem::BuilderRegistrationRequest");
+
+ BuilderRegistrationRequest() = default;
+ unsigned int GetMessageType() const override;
+
+ AZStd::vector m_builders;
+ };
+} // namespace AssetBuilder
diff --git a/Code/Tools/AssetProcessor/AssetBuilder/CMakeLists.txt b/Code/Tools/AssetProcessor/AssetBuilder/CMakeLists.txt
index 6baa99d43b..f23e749169 100644
--- a/Code/Tools/AssetProcessor/AssetBuilder/CMakeLists.txt
+++ b/Code/Tools/AssetProcessor/AssetBuilder/CMakeLists.txt
@@ -6,6 +6,22 @@
#
#
+ly_add_target(
+ NAME AssetBuilder.Static STATIC
+ NAMESPACE AZ
+ FILES_CMAKE
+ asset_builder_static_files.cmake
+ INCLUDE_DIRECTORIES
+ PUBLIC
+ .
+ BUILD_DEPENDENCIES
+ PUBLIC
+ AZ::AzCore
+ AZ::AzFramework
+ AZ::AzToolsFramework
+ AZ::AssetBuilderSDK
+)
+
ly_add_target(
NAME AssetBuilder EXECUTABLE
NAMESPACE AZ
@@ -17,6 +33,7 @@ ly_add_target(
.
BUILD_DEPENDENCIES
PRIVATE
+ AssetBuilder.Static
3rdParty::Qt::Core
3rdParty::Qt::Gui
3rdParty::Qt::Network
diff --git a/Code/Tools/AssetProcessor/AssetBuilder/asset_builder_static_files.cmake b/Code/Tools/AssetProcessor/AssetBuilder/asset_builder_static_files.cmake
new file mode 100644
index 0000000000..48de742704
--- /dev/null
+++ b/Code/Tools/AssetProcessor/AssetBuilder/asset_builder_static_files.cmake
@@ -0,0 +1,12 @@
+#
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+#
+
+set(FILES
+ AssetBuilderStatic.h
+ AssetBuilderStatic.cpp
+)
diff --git a/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderSDK.cpp b/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderSDK.cpp
index b5323dd419..43126dd673 100644
--- a/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderSDK.cpp
+++ b/Code/Tools/AssetProcessor/AssetBuilderSDK/AssetBuilderSDK/AssetBuilderSDK.cpp
@@ -1172,19 +1172,10 @@ namespace AssetBuilderSDK
JobProduct::Reflect(context);
AssetBuilderDesc::Reflect(context);
- RegisterBuilderRequest::Reflect(context);
- RegisterBuilderResponse::Reflect(context);
CreateJobsRequest::Reflect(context);
CreateJobsResponse::Reflect(context);
ProcessJobRequest::Reflect(context);
ProcessJobResponse::Reflect(context);
-
- BuilderHelloRequest::Reflect(context);
- BuilderHelloResponse::Reflect(context);
- CreateJobsNetRequest::Reflect(context);
- CreateJobsNetResponse::Reflect(context);
- ProcessJobNetRequest::Reflect(context);
- ProcessJobNetResponse::Reflect(context);
}
void InitializeSerializationContext()
@@ -1263,24 +1254,6 @@ namespace AssetBuilderSDK
}
}
- void RegisterBuilderRequest::Reflect(AZ::ReflectContext* context)
- {
- if (AZ::SerializeContext* serializeContext = azrtti_cast(context))
- {
- serializeContext->Class()->
- Version(1)->
- Field("FilePath", &RegisterBuilderRequest::m_filePath);
- }
-
- if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context))
- {
- behaviorContext->Class("RegisterBuilderRequest")
- ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation)
- ->Attribute(AZ::Script::Attributes::Module, "asset.builder")
- ->Property("filePath", BehaviorValueProperty(&RegisterBuilderRequest::m_filePath));
- }
- }
-
void AssetBuilderDesc::Reflect(AZ::ReflectContext* context)
{
if (AZ::SerializeContext* serializeContext = azrtti_cast(context))
@@ -1313,25 +1286,6 @@ namespace AssetBuilderSDK
}
}
- void RegisterBuilderResponse::Reflect(AZ::ReflectContext* context)
- {
- if (AZ::SerializeContext* serializeContext = azrtti_cast(context))
- {
- serializeContext->Class()
- ->Version(1)
- ->Field("Asset Builder Desc List", &RegisterBuilderResponse::m_assetBuilderDescList);
- }
-
- if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context))
- {
- behaviorContext->Class("RegisterBuilderResponse")
- ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation)
- ->Attribute(AZ::Script::Attributes::Module, "asset.builder")
- ->Constructor()
- ->Property("assetBuilderDescList", BehaviorValueProperty(&RegisterBuilderResponse::m_assetBuilderDescList));
- }
- }
-
bool CreateJobsResponse::Succeeded() const
{
return m_result == CreateJobsResultCode::Success;
@@ -1362,128 +1316,6 @@ namespace AssetBuilderSDK
}
}
- void BuilderHelloRequest::Reflect(AZ::ReflectContext* context)
- {
- auto serialize = azrtti_cast(context);
- if (serialize)
- {
- serialize->Class()
- ->Version(1)
- ->Field("UUID", &BuilderHelloRequest::m_uuid);
- }
- }
-
- unsigned int BuilderHelloRequest::MessageType()
- {
- static unsigned int messageType = AZ_CRC("AssetBuilderSDK::BuilderHelloRequest", 0x213a7248);
-
- return messageType;
- }
-
- unsigned int BuilderHelloRequest::GetMessageType() const
- {
- return MessageType();
- }
-
- void BuilderHelloResponse::Reflect(AZ::ReflectContext* context)
- {
- auto serialize = azrtti_cast(context);
- if (serialize)
- {
- serialize->Class()
- ->Version(1)
- ->Field("Accepted", &BuilderHelloResponse::m_accepted)
- ->Field("UUID", &BuilderHelloResponse::m_uuid);
- }
- }
-
- unsigned int BuilderHelloResponse::GetMessageType() const
- {
- return BuilderHelloRequest::MessageType();
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- void CreateJobsNetRequest::Reflect(AZ::ReflectContext* context)
- {
- auto serialize = azrtti_cast(context);
- if (serialize)
- {
- serialize->Class()
- ->Version(1)
- ->Field("Request", &CreateJobsNetRequest::m_request);
- }
- }
-
- unsigned int CreateJobsNetRequest::MessageType()
- {
- static unsigned int messageType = AZ_CRC("AssetBuilderSDK::CreateJobsNetRequest", 0xc48209c0);
-
- return messageType;
- }
-
- unsigned int CreateJobsNetRequest::GetMessageType() const
- {
- return MessageType();
- }
-
- void CreateJobsNetResponse::Reflect(AZ::ReflectContext* context)
- {
- auto serialize = azrtti_cast(context);
- if (serialize)
- {
- serialize->Class()
- ->Version(1)
- ->Field("Response", &CreateJobsNetResponse::m_response);
- }
- }
-
- unsigned int CreateJobsNetResponse::GetMessageType() const
- {
- return CreateJobsNetRequest::MessageType();
- }
-
-
-
- void ProcessJobNetRequest::Reflect(AZ::ReflectContext* context)
- {
- auto serialize = azrtti_cast