Merge remote-tracking branch 'upstream/development' into nvsickle/DomPatch

monroegm-disable-blank-issue-2
Nicholas Van Sickle 4 years ago
commit dec3def9eb

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bfc2ef8c6dbf2fba078e27e4e94384099e090468e679327dd826a5cbf22b04ed
size 1019

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:708b12d41229afab78e0f7d59097ae3de855fea8525a920c5c214fc0ce79f1bd
size 1209

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:fab63af9b50790dca25330058e70517987ea8bf11c00f9353dd951ebdbd1dbe5
size 5008

File diff suppressed because it is too large Load Diff

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7f94f2634eacb4d7bee20dacc45edef96e4d268f1adb7960b8aa8f3b6e2906ed
size 6867609

@ -0,0 +1,129 @@
{
"ContainerEntity": {
"Id": "ContainerEntity",
"Name": "Bush",
"Components": {
"Component_[1140272189295067758]": {
"$type": "EditorInspectorComponent",
"Id": 1140272189295067758
},
"Component_[13437832196484687256]": {
"$type": "EditorOnlyEntityComponent",
"Id": 13437832196484687256
},
"Component_[1553903646452669645]": {
"$type": "EditorDisabledCompositionComponent",
"Id": 1553903646452669645
},
"Component_[15914009348632444632]": {
"$type": "EditorEntitySortComponent",
"Id": 15914009348632444632,
"Child Entity Order": [
"Entity_[7511491868318]"
]
},
"Component_[18046340308818780248]": {
"$type": "EditorPrefabComponent",
"Id": 18046340308818780248
},
"Component_[1948833233489872938]": {
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
"Id": 1948833233489872938,
"Parent Entity": ""
},
"Component_[2903632350157981339]": {
"$type": "SelectionComponent",
"Id": 2903632350157981339
},
"Component_[48827510535192710]": {
"$type": "EditorPendingCompositionComponent",
"Id": 48827510535192710
},
"Component_[5609536793322429681]": {
"$type": "EditorLockComponent",
"Id": 5609536793322429681
},
"Component_[5859168386298620990]": {
"$type": "EditorEntityIconComponent",
"Id": 5859168386298620990
},
"Component_[6604616929271524505]": {
"$type": "EditorVisibilityComponent",
"Id": 6604616929271524505
}
}
},
"Entities": {
"Entity_[7511491868318]": {
"Id": "Entity_[7511491868318]",
"Name": "Bush",
"Components": {
"Component_[10227459330338484901]": {
"$type": "EditorInspectorComponent",
"Id": 10227459330338484901,
"ComponentOrderEntryArray": [
{
"ComponentId": 4998941225335869157
},
{
"ComponentId": 9922994635792843826,
"SortIndex": 1
}
]
},
"Component_[10972351222359420947]": {
"$type": "EditorOnlyEntityComponent",
"Id": 10972351222359420947
},
"Component_[12101122374155214392]": {
"$type": "EditorPendingCompositionComponent",
"Id": 12101122374155214392
},
"Component_[1535264614652988260]": {
"$type": "SelectionComponent",
"Id": 1535264614652988260
},
"Component_[16367811417907891218]": {
"$type": "EditorVisibilityComponent",
"Id": 16367811417907891218
},
"Component_[17044216787716682880]": {
"$type": "EditorEntitySortComponent",
"Id": 17044216787716682880
},
"Component_[2129822594969629430]": {
"$type": "EditorEntityIconComponent",
"Id": 2129822594969629430
},
"Component_[2838015156782745450]": {
"$type": "EditorLockComponent",
"Id": 2838015156782745450
},
"Component_[4998941225335869157]": {
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
"Id": 4998941225335869157,
"Parent Entity": "ContainerEntity"
},
"Component_[8773358049076362578]": {
"$type": "EditorDisabledCompositionComponent",
"Id": 8773358049076362578
},
"Component_[9922994635792843826]": {
"$type": "AZ::Render::EditorMeshComponent",
"Id": 9922994635792843826,
"Controller": {
"Configuration": {
"ModelAsset": {
"assetId": {
"guid": "{1201406D-FB20-5B5F-B9B5-6A6E8DE00A14}",
"subId": 276506120
},
"assetHint": "assets/objects/foliage/bush_privet_01.azmodel"
}
}
}
}
}
}
}
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,129 @@
{
"ContainerEntity": {
"Id": "ContainerEntity",
"Name": "PurpleFlower",
"Components": {
"Component_[10519928302743666073]": {
"$type": "EditorPrefabComponent",
"Id": 10519928302743666073
},
"Component_[13894087802180240181]": {
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
"Id": 13894087802180240181,
"Parent Entity": ""
},
"Component_[15788541052719571801]": {
"$type": "EditorEntityIconComponent",
"Id": 15788541052719571801
},
"Component_[15842981265136092481]": {
"$type": "SelectionComponent",
"Id": 15842981265136092481
},
"Component_[16360384897559021149]": {
"$type": "EditorInspectorComponent",
"Id": 16360384897559021149
},
"Component_[16713545675046303279]": {
"$type": "EditorVisibilityComponent",
"Id": 16713545675046303279
},
"Component_[1806734194268113785]": {
"$type": "EditorPendingCompositionComponent",
"Id": 1806734194268113785
},
"Component_[5392020700593853313]": {
"$type": "EditorEntitySortComponent",
"Id": 5392020700593853313,
"Child Entity Order": [
"Entity_[14335611090324]"
]
},
"Component_[5995854518752659458]": {
"$type": "EditorLockComponent",
"Id": 5995854518752659458
},
"Component_[6963022284400845376]": {
"$type": "EditorDisabledCompositionComponent",
"Id": 6963022284400845376
},
"Component_[8055275578170091546]": {
"$type": "EditorOnlyEntityComponent",
"Id": 8055275578170091546
}
}
},
"Entities": {
"Entity_[14335611090324]": {
"Id": "Entity_[14335611090324]",
"Name": "PurpleFlower",
"Components": {
"Component_[10887353073528055802]": {
"$type": "EditorPendingCompositionComponent",
"Id": 10887353073528055802
},
"Component_[12641127425852859189]": {
"$type": "AZ::Render::EditorMeshComponent",
"Id": 12641127425852859189,
"Controller": {
"Configuration": {
"ModelAsset": {
"assetId": {
"guid": "{D493A670-6D82-5AE9-A2C8-A2EB02684F71}",
"subId": 284799939
},
"assetHint": "assets/objects/foliage/grass_flower_purple.azmodel"
}
}
}
},
"Component_[14406733303466080015]": {
"$type": "EditorInspectorComponent",
"Id": 14406733303466080015,
"ComponentOrderEntryArray": [
{
"ComponentId": 9231452352781000222
},
{
"ComponentId": 12641127425852859189,
"SortIndex": 1
}
]
},
"Component_[1452384341905923012]": {
"$type": "EditorLockComponent",
"Id": 1452384341905923012
},
"Component_[2215454016415585892]": {
"$type": "EditorDisabledCompositionComponent",
"Id": 2215454016415585892
},
"Component_[4104108067383423623]": {
"$type": "EditorVisibilityComponent",
"Id": 4104108067383423623
},
"Component_[4197335450471807917]": {
"$type": "SelectionComponent",
"Id": 4197335450471807917
},
"Component_[6877680739064997650]": {
"$type": "EditorOnlyEntityComponent",
"Id": 6877680739064997650
},
"Component_[7372550507186490390]": {
"$type": "EditorEntityIconComponent",
"Id": 7372550507186490390
},
"Component_[7673532337364366244]": {
"$type": "EditorEntitySortComponent",
"Id": 7673532337364366244
},
"Component_[9231452352781000222]": {
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
"Id": 9231452352781000222,
"Parent Entity": "ContainerEntity"
}
}
}
}
}

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3789abdf439a6d70438fd4bb1e06881ae6686a4699209c6bc371d22d161e5347
size 26476

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c987d7d79685fda83efcffb7e1afbcd356c37fc68ec5c663a89b02d4df10caea
size 46412

@ -2,11 +2,11 @@
<Class name="DescriptorListAsset" type="{60961B36-E3CA-4877-B197-1462C1363F6E}"> <Class name="DescriptorListAsset" type="{60961B36-E3CA-4877-B197-1462C1363F6E}">
<Class name="AZStd::vector" field="Descriptors" type="{FC36C5E0-6152-5B06-AF30-3FC494B85FAB}"> <Class name="AZStd::vector" field="Descriptors" type="{FC36C5E0-6152-5B06-AF30-3FC494B85FAB}">
<Class name="Descriptor" field="element" version="8" type="{A5A5E7F7-FC36-4BD1-8A93-21362574B9DA}"> <Class name="Descriptor" field="element" version="8" type="{A5A5E7F7-FC36-4BD1-8A93-21362574B9DA}">
<Class name="AZ::Uuid" field="SpawnerType" value="{BBA5CC1E-B4CA-4792-89F7-93711E98FBD1}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/> <Class name="AZ::Uuid" field="SpawnerType" value="{74BEEDB5-81CF-409F-B375-0D93D81EF2E3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="AZStd::shared_ptr" field="InstanceSpawner" type="{7C7046DE-F8B1-529D-AD8C-829C6C0E2FCD}"> <Class name="AZStd::shared_ptr" field="InstanceSpawner" type="{7C7046DE-F8B1-529D-AD8C-829C6C0E2FCD}">
<Class name="DynamicSliceInstanceSpawner" field="element" type="{BBA5CC1E-B4CA-4792-89F7-93711E98FBD1}"> <Class name="PrefabInstanceSpawner" field="element" type="{74BEEDB5-81CF-409F-B375-0D93D81EF2E3}">
<Class name="InstanceSpawner" field="BaseClass1" type="{01AD0758-B04A-4B43-BC2B-BDCD77F4EF6A}"/> <Class name="InstanceSpawner" field="BaseClass1" type="{01AD0758-B04A-4B43-BC2B-BDCD77F4EF6A}"/>
<Class name="Asset" field="SliceAsset" value="id={EBFE34EB-D0A8-5E51-8234-3BE38082B28C}:2,type={78802ABF-9595-463A-8D2B-D022F906F9B1},hint={slices/pinkflower.dynamicslice}" version="1" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/> <Class name="Asset" field="SpawnableAsset" value="id={80C0CF4E-9A5E-544B-B89E-BC980175A259}:e6f903d2,type={855E3021-D305-4845-B284-20C3F7FDF16B},hint={Assets/Prefabs/PinkFlower.prefab},loadBehavior=1" version="2" type="{77A19D40-8731-4D3C-9041-1B43047366A4}"/>
</Class> </Class>
</Class> </Class>
<Class name="float" field="Weight" value="1.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/> <Class name="float" field="Weight" value="1.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>

@ -0,0 +1,15 @@
<?xml version="1.0"?>
<Component
Name="NetworkTestLevelEntityComponent"
Namespace="AutomatedTesting"
OverrideComponent="false"
OverrideController="false"
OverrideInclude=""
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ComponentRelation Constraint="Required" HasController="true" Name="NetworkTransformComponent" Namespace="Multiplayer" Include="Multiplayer/Components/NetworkTransformComponent.h" />
<RemoteProcedure Name="AuthorityToClientNoParams_PlayFx" InvokeFrom="Authority" HandleOn="Client" IsPublic="false" IsReliable="true" GenerateEventBindings="true" Description="" />
</Component>

@ -29,8 +29,6 @@
<Param Type="float" Name="SomeFloat" /> <Param Type="float" Name="SomeFloat" />
</RemoteProcedure> </RemoteProcedure>
<RemoteProcedure Name="AuthorityToClientNoParams_PlayFx" InvokeFrom="Authority" HandleOn="Client" IsPublic="false" IsReliable="true" GenerateEventBindings="true" Description="" />
<RemoteProcedure Name="ServerToAuthority_DealDamage" InvokeFrom="Server" HandleOn="Authority" IsPublic="false" IsReliable="true" GenerateEventBindings="true" Description="" > <RemoteProcedure Name="ServerToAuthority_DealDamage" InvokeFrom="Server" HandleOn="Authority" IsPublic="false" IsReliable="true" GenerateEventBindings="true" Description="" >
<Param Type="float" Name="damage" /> <Param Type="float" Name="damage" />
</RemoteProcedure> </RemoteProcedure>

@ -12,4 +12,5 @@ set(FILES
Source/AutomatedTestingSystemComponent.cpp Source/AutomatedTestingSystemComponent.cpp
Source/AutomatedTestingSystemComponent.h Source/AutomatedTestingSystemComponent.h
Source/AutoGen/NetworkTestPlayerComponent.AutoComponent.xml Source/AutoGen/NetworkTestPlayerComponent.AutoComponent.xml
Source/AutoGen/NetworkTestLevelEntityComponent.AutoComponent.xml
) )

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:6d6204c6730e5675791765ca194e9b1cbec282208e280507de830afc2805e5fa oid sha256:de0e6e480ece5b423222f4feacf56553d73713fe9afea8bbc9a2660a3cd54ec7
size 41127 size 1232

@ -12,12 +12,6 @@
################################################################################ ################################################################################
if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
# Only enable AWS automated tests on Windows
set(SUPPORTED_PLATFORMS "Windows" "Linux")
if (NOT "${PAL_PLATFORM_NAME}" IN_LIST SUPPORTED_PLATFORMS)
return()
endif()
ly_add_pytest( ly_add_pytest(
NAME AutomatedTesting::AWSTests NAME AutomatedTesting::AWSTests
TEST_SUITE awsi TEST_SUITE awsi

@ -3,7 +3,7 @@
## Prerequisites ## Prerequisites
1. Build the O3DE Editor and AutomatedTesting.GameLauncher in Profile. 1. Build the O3DE Editor and AutomatedTesting.GameLauncher in Profile.
2. Install the latest version of NodeJs. 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). 3. AWS CLI is installed and AWS crendentials are configured via [environment variables](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html) or [default profile](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. 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 ## Deploy CDK Applications

@ -69,6 +69,10 @@ class AwsCredentials:
os.remove(self._credentials_path) os.remove(self._credentials_path)
return return
credentials_file_dir = os.path.dirname(self._credentials_path)
if not os.path.isdir(credentials_file_dir):
os.makedirs(credentials_file_dir)
with open(self._credentials_path, 'w+') as credential_file: with open(self._credentials_path, 'w+') as credential_file:
self._credentials.write(credential_file) self._credentials.write(credential_file)

@ -16,7 +16,7 @@ logging.getLogger('nose').setLevel(logging.WARNING)
class AwsUtils: class AwsUtils:
def __init__(self, arn: str, session_name: str, region_name: str): def __init__(self, arn: str, session_name: str, region_name: str):
local_session = boto3.Session(profile_name='default') local_session = boto3.Session()
local_sts_client = local_session.client('sts') local_sts_client = local_session.client('sts')
self._local_account_id = local_sts_client.get_caller_identity()["Account"] self._local_account_id = local_sts_client.get_caller_identity()["Account"]
logger.info(f'Local Account Id: {self._local_account_id}') logger.info(f'Local Account Id: {self._local_account_id}')

@ -6,11 +6,13 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
""" """
import os import os
import platform
# ARN of the IAM role to assume for retrieving temporary AWS credentials # ARN of the IAM role to assume for retrieving temporary AWS credentials
ASSUME_ROLE_ARN = os.environ.get('ASSUME_ROLE_ARN', 'arn:aws:iam::645075835648:role/o3de-automation-tests') ASSUME_ROLE_ARN = os.environ.get('ASSUME_ROLE_ARN', 'arn:aws:iam::645075835648:role/o3de-automation-tests')
# Name of the AWS project deployed by the CDK applications # Name of the AWS project deployed by the CDK applications
AWS_PROJECT_NAME = os.environ.get('O3DE_AWS_PROJECT_NAME', 'AWSAUTO') AWS_PROJECT_NAME = os.environ.get('O3DE_AWS_PROJECT_NAME').upper() if os.environ.get('O3DE_AWS_PROJECT_NAME') else \
(os.environ.get('BRANCH_NAME', '') + '-' + os.environ.get('PIPELINE_NAME', '') + '-' + platform.system()).upper()
# Region for the existing CloudFormation stacks used by the automation tests # Region for the existing CloudFormation stacks used by the automation tests
AWS_REGION = os.environ.get('O3DE_AWS_DEPLOY_REGION', 'us-east-1') AWS_REGION = os.environ.get('O3DE_AWS_DEPLOY_REGION', 'us-east-1')
# Name of the default resource mapping config file used by the automation tests # Name of the default resource mapping config file used by the automation tests

@ -21,7 +21,11 @@ TEST_DIRECTORY = os.path.join(os.path.dirname(__file__), "tests")
@pytest.mark.parametrize("launcher_platform", ['windows_editor']) @pytest.mark.parametrize("launcher_platform", ['windows_editor'])
class TestAutomation(EditorTestSuite): class TestAutomation(EditorTestSuite):
enable_prefab_system = False enable_prefab_system = True
@pytest.mark.test_case_id("C36529679")
class AtomLevelLoadTest_Editor(EditorSharedTest):
from Atom.tests import hydra_Atom_LevelLoadTest as test_module
@pytest.mark.test_case_id("C36525657") @pytest.mark.test_case_id("C36525657")
class AtomEditorComponents_BloomAdded(EditorSharedTest): class AtomEditorComponents_BloomAdded(EditorSharedTest):
@ -120,6 +124,14 @@ class TestAutomation(EditorTestSuite):
class AtomEditorComponents_SSAOAdded(EditorSharedTest): class AtomEditorComponents_SSAOAdded(EditorSharedTest):
from Atom.tests import hydra_AtomEditorComponents_SSAOAdded as test_module from Atom.tests import hydra_AtomEditorComponents_SSAOAdded as test_module
@pytest.mark.test_case_id("C36529666")
class AtomEditorComponentsLevel_DiffuseGlobalIlluminationAdded(EditorSharedTest):
from Atom.tests import hydra_AtomEditorComponentsLevel_DiffuseGlobalIlluminationAdded as test_module
@pytest.mark.test_case_id("C36525660")
class AtomEditorComponentsLevel_DisplayMapperAdded(EditorSharedTest):
from Atom.tests import hydra_AtomEditorComponentsLevel_DisplayMapperAdded as test_module
class ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges(EditorSharedTest): class ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges(EditorSharedTest):
from Atom.tests import hydra_ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges as test_module from Atom.tests import hydra_ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges as test_module

@ -26,13 +26,3 @@ class TestAutomation(EditorTestSuite):
@pytest.mark.test_case_id("C36525660") @pytest.mark.test_case_id("C36525660")
class AtomEditorComponents_DisplayMapperAdded(EditorSharedTest): class AtomEditorComponents_DisplayMapperAdded(EditorSharedTest):
from Atom.tests import hydra_AtomEditorComponents_DisplayMapperAdded as test_module from Atom.tests import hydra_AtomEditorComponents_DisplayMapperAdded as test_module
# this test causes editor to crash when using slices. once automation transitions to prefabs it should pass
@pytest.mark.test_case_id("C36529666")
class AtomEditorComponentsLevel_DiffuseGlobalIlluminationAdded(EditorSharedTest):
from Atom.tests import hydra_AtomEditorComponentsLevel_DiffuseGlobalIlluminationAdded as test_module
# this test causes editor to crash when using slices. once automation transitions to prefabs it should pass
@pytest.mark.test_case_id("C36525660")
class AtomEditorComponentsLevel_DisplayMapperAdded(EditorSharedTest):
from Atom.tests import hydra_AtomEditorComponentsLevel_DisplayMapperAdded as test_module

@ -32,6 +32,8 @@ GLOBAL_ILLUMINATION_QUALITY = {
'High': 2, 'High': 2,
} }
# Level list used in Editor Level Load Test
LEVEL_LIST = ["hermanubis", "hermanubis_high", "macbeth_shaderballs", "PbrMaterialChart", "ShadowTest", "Sponza"]
class AtomComponentProperties: class AtomComponentProperties:
""" """
@ -85,12 +87,18 @@ class AtomComponentProperties:
def decal(property: str = 'name') -> str: def decal(property: str = 'name') -> str:
""" """
Decal component properties. Decal component properties.
- 'Attenuation Angle' controls how much the angle between geometry and decal impacts opacity. 0-1 Radians
- 'Opacity' where one is opaque and zero is transparent
- 'Sort Key' 0-255 stacking z-sort like key to define which decal is on top of another
- 'Material' the material Asset.id of the decal. - 'Material' the material Asset.id of the decal.
:param property: From the last element of the property tree path. Default 'name' for component name string. :param property: From the last element of the property tree path. Default 'name' for component name string.
:return: Full property path OR component name if no property specified. :return: Full property path OR component name if no property specified.
""" """
properties = { properties = {
'name': 'Decal', 'name': 'Decal',
'Attenuation Angle': 'Controller|Configuration|Attenuation Angle',
'Opacity': 'Controller|Configuration|Opacity',
'Sort Key': 'Controller|Configuration|Sort Key',
'Material': 'Controller|Configuration|Material', 'Material': 'Controller|Configuration|Material',
} }
return properties[property] return properties[property]
@ -195,11 +203,13 @@ class AtomComponentProperties:
def entity_reference(property: str = 'name') -> str: def entity_reference(property: str = 'name') -> str:
""" """
Entity Reference component properties. Entity Reference component properties.
- 'EntityIdReferences' component container of entityId references. Initially empty.
:param property: From the last element of the property tree path. Default 'name' for component name string. :param property: From the last element of the property tree path. Default 'name' for component name string.
:return: Full property path OR component name if no property specified. :return: Full property path OR component name if no property specified.
""" """
properties = { properties = {
'name': 'Entity Reference', 'name': 'Entity Reference',
'EntityIdReferences': 'Controller|Configuration|EntityIdReferences',
} }
return properties[property] return properties[property]
@ -238,12 +248,14 @@ class AtomComponentProperties:
def grid(property: str = 'name') -> str: def grid(property: str = 'name') -> str:
""" """
Grid component properties. Grid component properties.
- 'Grid Size': The size of the grid, default value is 32
- 'Secondary Grid Spacing': The spacing value for the secondary grid, i.e. 1.0 - 'Secondary Grid Spacing': The spacing value for the secondary grid, i.e. 1.0
:param property: From the last element of the property tree path. Default 'name' for component name string. :param property: From the last element of the property tree path. Default 'name' for component name string.
:return: Full property path OR component name if no property specified. :return: Full property path OR component name if no property specified.
""" """
properties = { properties = {
'name': 'Grid', 'name': 'Grid',
'Grid Size': 'Controller|Configuration|Grid Size',
'Secondary Grid Spacing': 'Controller|Configuration|Secondary Grid Spacing', 'Secondary Grid Spacing': 'Controller|Configuration|Secondary Grid Spacing',
} }
return properties[property] return properties[property]
@ -374,11 +386,13 @@ class AtomComponentProperties:
def physical_sky(property: str = 'name') -> str: def physical_sky(property: str = 'name') -> str:
""" """
Physical Sky component properties. Physical Sky component properties.
- 'Sky Intensity' float that determines sky intensity value, default value is 4.
:param property: From the last element of the property tree path. Default 'name' for component name string. :param property: From the last element of the property tree path. Default 'name' for component name string.
:return: Full property path OR component name if no property specified. :return: Full property path OR component name if no property specified.
""" """
properties = { properties = {
'name': 'Physical Sky', 'name': 'Physical Sky',
'Sky Intensity': 'Controller|Configuration|Sky Intensity',
} }
return properties[property] return properties[property]

@ -114,11 +114,11 @@ def get_property(document_id, property_name):
""" """
:return: property value or invalid value if the document is not open or the property_name can't be found :return: property value or invalid value if the document is not open or the property_name can't be found
""" """
return azlmbr.atomtools.AtomToolsDocumentRequestBus(bus.Event, "GetPropertyValue", document_id, property_name) return azlmbr.materialeditor.MaterialDocumentRequestBus(bus.Event, "GetPropertyValue", document_id, property_name)
def set_property(document_id, property_name, value): def set_property(document_id, property_name, value):
azlmbr.atomtools.AtomToolsDocumentRequestBus(bus.Event, "SetPropertyValue", document_id, property_name, value) azlmbr.materialeditor.MaterialDocumentRequestBus(bus.Event, "SetPropertyValue", document_id, property_name, value)
def is_pane_visible(pane_name): def is_pane_visible(pane_name):

@ -60,7 +60,7 @@ def AtomEditorComponentsLevel_DiffuseGlobalIllumination_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Add Diffuse Global Illumination level component to the level entity. # 1. Add Diffuse Global Illumination level component to the level entity.
@ -86,10 +86,10 @@ def AtomEditorComponentsLevel_DiffuseGlobalIllumination_AddedToEntity():
# 4. Set Quality Level property to Low # 4. Set Quality Level property to Low
diffuse_global_illumination_component.set_component_property_value( diffuse_global_illumination_component.set_component_property_value(
AtomComponentProperties.diffuse_global_illumination('Quality Level', GLOBAL_ILLUMINATION_QUALITY['Low'])) AtomComponentProperties.diffuse_global_illumination('Quality Level'), GLOBAL_ILLUMINATION_QUALITY['Low'])
quality = diffuse_global_illumination_component.get_component_property_value( quality = diffuse_global_illumination_component.get_component_property_value(
AtomComponentProperties.diffuse_global_illumination('Quality Level')) AtomComponentProperties.diffuse_global_illumination('Quality Level'))
Report.result(diffuse_global_illumination_quality, quality == GLOBAL_ILLUMINATION_QUALITY['Low']) Report.result(Tests.diffuse_global_illumination_quality, quality == GLOBAL_ILLUMINATION_QUALITY['Low'])
# 5. Enter/Exit game mode. # 5. Enter/Exit game mode.
TestHelper.enter_game_mode(Tests.enter_game_mode) TestHelper.enter_game_mode(Tests.enter_game_mode)

@ -67,7 +67,7 @@ def AtomEditorComponentsLevel_DisplayMapper_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Add Display Mapper level component to the level entity. # 1. Add Display Mapper level component to the level entity.
@ -102,7 +102,7 @@ def AtomEditorComponentsLevel_DisplayMapper_AddedToEntity():
display_mapper_component.set_component_property_value( display_mapper_component.set_component_property_value(
AtomComponentProperties.display_mapper('Enable LDR color grading LUT'), True) AtomComponentProperties.display_mapper('Enable LDR color grading LUT'), True)
Report.result( Report.result(
Test.enable_ldr_color_grading_lut, Tests.enable_ldr_color_grading_lut,
display_mapper_component.get_component_property_value( display_mapper_component.get_component_property_value(
AtomComponentProperties.display_mapper('Enable LDR color grading LUT')) is True) AtomComponentProperties.display_mapper('Enable LDR color grading LUT')) is True)

@ -97,7 +97,7 @@ def AtomEditorComponents_Bloom_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create an Bloom entity with no components. # 1. Create an Bloom entity with no components.
@ -170,10 +170,12 @@ def AtomEditorComponents_Bloom_AddedToEntity():
# 13. UNDO deletion. # 13. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, bloom_entity.exists()) Report.result(Tests.deletion_undo, bloom_entity.exists())
# 14. REDO deletion. # 14. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not bloom_entity.exists()) Report.result(Tests.deletion_redo, not bloom_entity.exists())
# 15. Look for errors and asserts. # 15. Look for errors and asserts.

@ -8,49 +8,61 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
class Tests: class Tests:
camera_creation = ( camera_creation = (
"Camera Entity successfully created", "Camera Entity successfully created",
"Camera Entity failed to be created") "P0: Camera Entity failed to be created")
camera_component_added = ( camera_component_added = (
"Camera component was added to entity", "Camera component was added to entity",
"Camera component failed to be added to entity") "P0: Camera component failed to be added to entity")
camera_component_check = ( camera_component_check = (
"Entity has a Camera component", "Entity has a Camera component",
"Entity failed to find Camera component") "P0: Entity failed to find Camera component")
creation_undo = ( creation_undo = (
"UNDO Entity creation success", "UNDO Entity creation success",
"UNDO Entity creation failed") "P0: UNDO Entity creation failed")
creation_redo = ( creation_redo = (
"REDO Entity creation success", "REDO Entity creation success",
"REDO Entity creation failed") "P0: REDO Entity creation failed")
decal_creation = ( decal_creation = (
"Decal Entity successfully created", "Decal Entity successfully created",
"Decal Entity failed to be created") "P0: Decal Entity failed to be created")
decal_component = ( decal_component = (
"Entity has a Decal component", "Entity has a Decal component",
"Entity failed to find Decal component") "P0: Entity failed to find Decal component")
decal_component_removed = (
"Decal component removed",
"P0: Decal component failed to be removed")
material_property_set = ( material_property_set = (
"Material property set on Decal component", "Material property set on Decal component",
"Couldn't set Material property on Decal component") "P0: Couldn't set Material property on Decal component")
attenuation_property_set = (
"Attenuation Angle property set on Decal component",
"P1: Couldn't set Attenuation Angle property on Decal component")
opacity_property_set = (
"Opacity property set on Decal component",
"P1: Coudn't set Opacity property on Decal component")
sort_key_property_set = (
"Sort Key property set on Decal component",
"P1: Couldn't set Sort Key property on Decal component")
enter_game_mode = ( enter_game_mode = (
"Entered game mode", "Entered game mode",
"Failed to enter game mode") "P0: Failed to enter game mode")
exit_game_mode = ( exit_game_mode = (
"Exited game mode", "Exited game mode",
"Couldn't exit game mode") "P0: Couldn't exit game mode")
is_visible = ( is_visible = (
"Entity is visible", "Entity is visible",
"Entity was not visible") "P0: Entity was not visible")
is_hidden = ( is_hidden = (
"Entity is hidden", "Entity is hidden",
"Entity was not hidden") "P0: Entity was not hidden")
entity_deleted = ( entity_deleted = (
"Entity deleted", "Entity deleted",
"Entity was not deleted") "P0: Entity was not deleted")
deletion_undo = ( deletion_undo = (
"UNDO deletion success", "UNDO deletion success",
"UNDO deletion failed") "P0: UNDO deletion failed")
deletion_redo = ( deletion_redo = (
"REDO deletion success", "REDO deletion success",
"REDO deletion failed") "P0: REDO deletion failed")
def AtomEditorComponents_Decal_AddedToEntity(): def AtomEditorComponents_Decal_AddedToEntity():
@ -71,14 +83,18 @@ def AtomEditorComponents_Decal_AddedToEntity():
2) Add Decal component to Decal entity. 2) Add Decal component to Decal entity.
3) UNDO the entity creation and component addition. 3) UNDO the entity creation and component addition.
4) REDO the entity creation and component addition. 4) REDO the entity creation and component addition.
5) Enter/Exit game mode. 5) Set Material property on Decal component.
6) Test IsHidden. 6) Set Attenuation Angle property on Decal component.
7) Test IsVisible. 7) Set Opacity property on Decal component
8) Set Material property on Decal component. 8) Set Sort Key property on Decal Component
9) Delete Decal entity. 9) Remove Decal component then UNDO the remove
10) UNDO deletion. 10) Enter/Exit game mode.
11) REDO deletion. 11) Test IsHidden.
12) Look for errors and asserts. 12) Test IsVisible.
13) Delete Decal entity.
14) UNDO deletion.
15) REDO deletion.
16) Look for errors and asserts.
:return: None :return: None
""" """
@ -95,7 +111,7 @@ def AtomEditorComponents_Decal_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a Decal entity with no components. # 1. Create a Decal entity with no components.
@ -130,41 +146,69 @@ def AtomEditorComponents_Decal_AddedToEntity():
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.creation_redo, decal_entity.exists()) Report.result(Tests.creation_redo, decal_entity.exists())
# 5. Enter/Exit game mode. # 5. Set Material property on Decal component.
decal_material_asset_path = os.path.join("materials", "decal", "airship_symbol_decal.azmaterial")
decal_material_asset = Asset.find_asset_by_path(decal_material_asset_path, False)
decal_component.set_component_property_value(AtomComponentProperties.decal('Material'), decal_material_asset.id)
get_material_property = decal_component.get_component_property_value(AtomComponentProperties.decal('Material'))
Report.result(Tests.material_property_set, get_material_property == decal_material_asset.id)
# 6. Set Attenuation Angle property on Decal component
decal_component.set_component_property_value(AtomComponentProperties.decal('Attenuation Angle'), value=0.75)
get_attenuation_property = decal_component.get_component_property_value(
AtomComponentProperties.decal('Attenuation Angle'))
Report.result(Tests.attenuation_property_set, get_attenuation_property == 0.75)
# 7. Set Opacity property on Decal component
decal_component.set_component_property_value(AtomComponentProperties.decal('Opacity'), value=0.5)
get_opacity_property = decal_component.get_component_property_value(AtomComponentProperties.decal('Opacity'))
Report.result(Tests.opacity_property_set, get_opacity_property == 0.5)
# 8. Set Sort Key property on Decal component
decal_component.set_component_property_value(AtomComponentProperties.decal('Sort Key'), value=255.0)
get_sort_key_property = decal_component.get_component_property_value(AtomComponentProperties.decal('Sort Key'))
Report.result(Tests.sort_key_property_set, get_sort_key_property == 255.0)
decal_component.set_component_property_value(AtomComponentProperties.decal('Sort Key'), value=0)
get_sort_key_property = decal_component.get_component_property_value(AtomComponentProperties.decal('Sort Key'))
Report.result(Tests.sort_key_property_set, get_sort_key_property == 0)
# 9. Remove Decal component then UNDO the remove
decal_component.remove()
general.idle_wait_frames(1)
Report.result(Tests.decal_component_removed, not decal_entity.has_component(AtomComponentProperties.decal()))
general.undo()
general.idle_wait_frames(1)
Report.result(Tests.decal_component, decal_entity.has_component(AtomComponentProperties.decal()))
# 10. Enter/Exit game mode.
TestHelper.enter_game_mode(Tests.enter_game_mode) TestHelper.enter_game_mode(Tests.enter_game_mode)
general.idle_wait_frames(1) general.idle_wait_frames(1)
TestHelper.exit_game_mode(Tests.exit_game_mode) TestHelper.exit_game_mode(Tests.exit_game_mode)
# 6. Test IsHidden. # 11. Test IsHidden.
decal_entity.set_visibility_state(False) decal_entity.set_visibility_state(False)
Report.result(Tests.is_hidden, decal_entity.is_hidden() is True) Report.result(Tests.is_hidden, decal_entity.is_hidden() is True)
# 7. Test IsVisible. # 12. Test IsVisible.
decal_entity.set_visibility_state(True) decal_entity.set_visibility_state(True)
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.is_visible, decal_entity.is_visible() is True) Report.result(Tests.is_visible, decal_entity.is_visible() is True)
# 8. Set Material property on Decal component. # 13. Delete Decal entity.
decal_material_asset_path = os.path.join("materials", "basic_grey.azmaterial")
decal_material_asset = Asset.find_asset_by_path(decal_material_asset_path, False)
decal_component.set_component_property_value(AtomComponentProperties.decal('Material'), decal_material_asset.id)
get_material_property = decal_component.get_component_property_value(AtomComponentProperties.decal('Material'))
Report.result(Tests.material_property_set, get_material_property == decal_material_asset.id)
# 9. Delete Decal entity.
decal_entity.delete() decal_entity.delete()
Report.result(Tests.entity_deleted, not decal_entity.exists()) Report.result(Tests.entity_deleted, not decal_entity.exists())
# 10. UNDO deletion. # 14. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, decal_entity.exists()) Report.result(Tests.deletion_undo, decal_entity.exists())
# 11. REDO deletion. # 15. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not decal_entity.exists()) Report.result(Tests.deletion_redo, not decal_entity.exists())
# 12. Look for errors and asserts. # 16. Look for errors and asserts.
TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0) TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0)
for error_info in error_tracer.errors: for error_info in error_tracer.errors:
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}") Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")

@ -97,7 +97,7 @@ def AtomEditorComponents_DeferredFog_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create an Deferred Fog entity with no components. # 1. Create an Deferred Fog entity with no components.
@ -174,10 +174,12 @@ def AtomEditorComponents_DeferredFog_AddedToEntity():
# 13. UNDO deletion. # 13. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, deferred_fog_entity.exists()) Report.result(Tests.deletion_undo, deferred_fog_entity.exists())
# 14. REDO deletion. # 14. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not deferred_fog_entity.exists()) Report.result(Tests.deletion_redo, not deferred_fog_entity.exists())
# 15. Look for errors and asserts. # 15. Look for errors and asserts.

@ -107,7 +107,7 @@ def AtomEditorComponents_DepthOfField_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a DepthOfField entity with no components. # 1. Create a DepthOfField entity with no components.
@ -189,10 +189,12 @@ def AtomEditorComponents_DepthOfField_AddedToEntity():
# 15. UNDO deletion. # 15. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, depth_of_field_entity.exists()) Report.result(Tests.deletion_undo, depth_of_field_entity.exists())
# 16. REDO deletion. # 16. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not depth_of_field_entity.exists()) Report.result(Tests.deletion_redo, not depth_of_field_entity.exists())
# 17. Look for errors and asserts. # 17. Look for errors and asserts.

@ -90,7 +90,7 @@ def AtomEditorComponents_DiffuseProbeGrid_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a Diffuse Probe Grid entity with no components. # 1. Create a Diffuse Probe Grid entity with no components.
@ -168,10 +168,12 @@ def AtomEditorComponents_DiffuseProbeGrid_AddedToEntity():
# 12. UNDO deletion. # 12. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, diffuse_probe_grid_entity.exists()) Report.result(Tests.deletion_undo, diffuse_probe_grid_entity.exists())
# 13. REDO deletion. # 13. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not diffuse_probe_grid_entity.exists()) Report.result(Tests.deletion_redo, not diffuse_probe_grid_entity.exists())
# 14. Look for errors or asserts. # 14. Look for errors or asserts.

@ -95,7 +95,7 @@ def AtomEditorComponents_DirectionalLight_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a Directional Light entity with no components. # 1. Create a Directional Light entity with no components.
@ -168,10 +168,12 @@ def AtomEditorComponents_DirectionalLight_AddedToEntity():
# 12. UNDO deletion. # 12. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, directional_light_entity.exists()) Report.result(Tests.deletion_undo, directional_light_entity.exists())
# 13. REDO deletion. # 13. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not directional_light_entity.exists()) Report.result(Tests.deletion_redo, not directional_light_entity.exists())
# 14. Look for errors and asserts. # 14. Look for errors and asserts.

@ -91,7 +91,7 @@ def AtomEditorComponents_DisplayMapper_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a Display Mapper entity with no components. # 1. Create a Display Mapper entity with no components.
@ -166,10 +166,12 @@ def AtomEditorComponents_DisplayMapper_AddedToEntity():
# 11. UNDO deletion. # 11. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, display_mapper_entity.exists()) Report.result(Tests.deletion_undo, display_mapper_entity.exists())
# 12. REDO deletion. # 12. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not display_mapper_entity.exists()) Report.result(Tests.deletion_redo, not display_mapper_entity.exists())
# 13. Look for errors and asserts. # 13. Look for errors and asserts.

@ -9,37 +9,58 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
class Tests: class Tests:
creation_undo = ( creation_undo = (
"UNDO Entity creation success", "UNDO Entity creation success",
"UNDO Entity creation failed") "P0: UNDO Entity creation failed")
creation_redo = ( creation_redo = (
"REDO Entity creation success", "REDO Entity creation success",
"REDO Entity creation failed") "P0: REDO Entity creation failed")
entity_reference_creation = ( entity_reference_creation = (
"Entity Reference Entity successfully created", "Entity Reference Entity successfully created",
"Entity Reference Entity failed to be created") "P0: Entity Reference Entity failed to be created")
entity_reference_component = ( entity_reference_component = (
"Entity has an Entity Reference component", "Entity has an Entity Reference component",
"Entity failed to find Entity Reference component") "P0: Entity failed to find Entity Reference component")
enter_game_mode = ( enter_game_mode = (
"Entered game mode", "Entered game mode",
"Failed to enter game mode") "P0: Failed to enter game mode")
exit_game_mode = ( exit_game_mode = (
"Exited game mode", "Exited game mode",
"Couldn't exit game mode") "P0: Couldn't exit game mode")
is_visible = ( is_visible = (
"Entity is visible", "Entity is visible",
"Entity was not visible") "P0: Entity was not visible")
is_hidden = ( is_hidden = (
"Entity is hidden", "Entity is hidden",
"Entity was not hidden") "P0: Entity was not hidden")
entity_deleted = ( entity_deleted = (
"Entity deleted", "Entity deleted",
"Entity was not deleted") "P0: Entity was not deleted")
deletion_undo = ( deletion_undo = (
"UNDO deletion success", "UNDO deletion success",
"UNDO deletion failed") "P0: UNDO deletion failed")
deletion_redo = ( deletion_redo = (
"REDO deletion success", "REDO deletion success",
"REDO deletion failed") "P0: REDO deletion failed")
entity_id_references_is_container = (
"EntityIdReferences is a container property",
"P1: EntityIdReferences is NOT a container property")
container_append = (
"EntityIdReferences append succeeded",
"P1: EntityIdReferences append did not succeed")
container_add = (
"EntityIdReferences add succeeded",
"P1: EntityIdReferences add did not succeed")
container_update = (
"EntityIdReferences update succeeded",
"P1: EntityIdReferences update did not succeed")
container_remove = (
"EntityIdReferences remove succeeded",
"P1: EntityIdReferences remove did not succeed")
container_reset = (
"EntityIdReferences reset succeeded",
"P1: EntityIdReferences reset did not succeed")
entity_reference_component_removed = (
"Entity Reference component removed from entity",
"P1: Entity Reference component NOT removed from entity")
def AtomEditorComponents_EntityReference_AddedToEntity(): def AtomEditorComponents_EntityReference_AddedToEntity():
@ -60,13 +81,21 @@ def AtomEditorComponents_EntityReference_AddedToEntity():
2) Add Entity Reference component to Entity Reference entity. 2) Add Entity Reference component to Entity Reference entity.
3) UNDO the entity creation and component addition. 3) UNDO the entity creation and component addition.
4) REDO the entity creation and component addition. 4) REDO the entity creation and component addition.
5) Enter/Exit game mode. 5) 'EntityIdReferences' is a container property
6) Test IsHidden. 6) Append item to 'EntityIdReferences'
7) Test IsVisible. 7) Add item to 'EntityIdReferences'
8) Delete Entity Reference entity. 8) Update item in 'EntityIdReferences'
9) UNDO deletion. 9) Remove item from 'EntityIdReferences'
10) REDO deletion. 10) Reset the container property then put one entity reference back for further tests
11) Look for errors. 11) Remove component
12) UNDO component remove
13) Enter/Exit game mode.
14) Test IsHidden.
15) Test IsVisible.
16) Delete Entity Reference entity.
17) UNDO deletion.
18) REDO deletion.
19) Look for errors.
:return: None :return: None
""" """
@ -81,7 +110,7 @@ def AtomEditorComponents_EntityReference_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create an Entity Reference entity with no components. # 1. Create an Entity Reference entity with no components.
@ -119,33 +148,107 @@ def AtomEditorComponents_EntityReference_AddedToEntity():
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.creation_redo, entity_reference_entity.exists()) Report.result(Tests.creation_redo, entity_reference_entity.exists())
# 5. Enter/Exit game mode. # Entities for EntityIdReferences tests
test_1 = EditorEntity.create_editor_entity('test_1')
test_2 = EditorEntity.create_editor_entity('test_2')
test_3 = EditorEntity.create_editor_entity('test_3')
# 5. 'EntityIdReferences' is a container property
Report.result(
Tests.entity_id_references_is_container,
entity_reference_component.is_property_container(
AtomComponentProperties.entity_reference('EntityIdReferences')))
# 6. Append item to 'EntityIdReferences'
entity_reference_component.append_container_item(
AtomComponentProperties.entity_reference('EntityIdReferences'), test_1.id)
Report.result(
Tests.container_append,
entity_reference_component.get_container_item(
AtomComponentProperties.entity_reference('EntityIdReferences'), 0) == test_1.id)
# 7. Add item to 'EntityIdReferences'
entity_reference_component.add_container_item(
AtomComponentProperties.entity_reference('EntityIdReferences'), 1, test_1.id)
Report.result(
Tests.container_add,
entity_reference_component.get_container_count(
AtomComponentProperties.entity_reference('EntityIdReferences')) == 2)
# 8. Update item in 'EntityIdReferences'
entity_reference_component.update_container_item(
AtomComponentProperties.entity_reference('EntityIdReferences'), 1, test_2.id)
Report.result(
Tests.container_update,
entity_reference_component.get_container_item(
AtomComponentProperties.entity_reference('EntityIdReferences'), 1) == test_2.id)
# 9. Remove item from 'EntityIdReferences'
entity_reference_component.append_container_item(
AtomComponentProperties.entity_reference('EntityIdReferences'), test_3.id)
count_before = entity_reference_component.get_container_count(
AtomComponentProperties.entity_reference('EntityIdReferences'))
entity_reference_component.remove_container_item(
AtomComponentProperties.entity_reference('EntityIdReferences'), 1)
count_after = entity_reference_component.get_container_count(
AtomComponentProperties.entity_reference('EntityIdReferences'))
Report.result(
Tests.container_remove,
((count_before == 3) and (count_after == 2) and
(entity_reference_component.get_container_item(
AtomComponentProperties.entity_reference('EntityIdReferences'), 1) == test_3.id)))
# 10. Reset the container property then put one entity reference back for further tests
entity_reference_component.reset_container(AtomComponentProperties.entity_reference('EntityIdReferences'))
general.idle_wait_frames(1)
Report.result(
Tests.container_reset,
entity_reference_component.get_container_count(
AtomComponentProperties.entity_reference('EntityIdReferences')) == 0)
entity_reference_component.append_container_item(
AtomComponentProperties.entity_reference('EntityIdReferences'), test_1.id)
# 11. Remove component
entity_reference_entity.remove_component(AtomComponentProperties.entity_reference())
general.idle_wait_frames(1)
Report.result(Tests.entity_reference_component_removed, not entity_reference_entity.has_component(
AtomComponentProperties.entity_reference()))
# 12. UNDO component remove
general.undo()
general.idle_wait_frames(1)
Report.result(Tests.entity_reference_component, entity_reference_entity.has_component(
AtomComponentProperties.entity_reference()))
# 13. Enter/Exit game mode.
TestHelper.enter_game_mode(Tests.enter_game_mode) TestHelper.enter_game_mode(Tests.enter_game_mode)
general.idle_wait_frames(1) general.idle_wait_frames(1)
TestHelper.exit_game_mode(Tests.exit_game_mode) TestHelper.exit_game_mode(Tests.exit_game_mode)
# 6. Test IsHidden. # 14. Test IsHidden.
entity_reference_entity.set_visibility_state(False) entity_reference_entity.set_visibility_state(False)
Report.result(Tests.is_hidden, entity_reference_entity.is_hidden() is True) Report.result(Tests.is_hidden, entity_reference_entity.is_hidden() is True)
# 7. Test IsVisible. # 15. Test IsVisible.
entity_reference_entity.set_visibility_state(True) entity_reference_entity.set_visibility_state(True)
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.is_visible, entity_reference_entity.is_visible() is True) Report.result(Tests.is_visible, entity_reference_entity.is_visible() is True)
# 8. Delete Entity Reference entity. # 16. Delete Entity Reference entity.
entity_reference_entity.delete() entity_reference_entity.delete()
Report.result(Tests.entity_deleted, not entity_reference_entity.exists()) Report.result(Tests.entity_deleted, not entity_reference_entity.exists())
# 9. UNDO deletion. # 17. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, entity_reference_entity.exists()) Report.result(Tests.deletion_undo, entity_reference_entity.exists())
# 10. REDO deletion. # 18. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not entity_reference_entity.exists()) Report.result(Tests.deletion_redo, not entity_reference_entity.exists())
# 11. Look for errors and asserts. # 19. Look for errors and asserts.
TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0) TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0)
for error_info in error_tracer.errors: for error_info in error_tracer.errors:
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}") Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")

@ -101,7 +101,7 @@ def AtomEditorComponents_ExposureControl_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Creation of Exposure Control entity with no components. # 1. Creation of Exposure Control entity with no components.
@ -169,10 +169,12 @@ def AtomEditorComponents_ExposureControl_AddedToEntity():
# 12. UNDO deletion. # 12. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, exposure_control_entity.exists()) Report.result(Tests.deletion_undo, exposure_control_entity.exists())
# 13. REDO deletion. # 13. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not exposure_control_entity.exists()) Report.result(Tests.deletion_redo, not exposure_control_entity.exists())
# 14. Look for errors and asserts. # 14. Look for errors and asserts.

@ -99,7 +99,7 @@ def AtomEditorComponents_GlobalSkylightIBL_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a Global Skylight (IBL) entity with no components. # 1. Create a Global Skylight (IBL) entity with no components.
@ -176,10 +176,12 @@ def AtomEditorComponents_GlobalSkylightIBL_AddedToEntity():
# 11. UNDO deletion. # 11. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, global_skylight_entity.exists()) Report.result(Tests.deletion_undo, global_skylight_entity.exists())
# 12. REDO deletion. # 12. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not global_skylight_entity.exists()) Report.result(Tests.deletion_redo, not global_skylight_entity.exists())
# 13. Look for errors and asserts. # 13. Look for errors and asserts.

@ -18,6 +18,9 @@ class Tests:
grid_component_added = ( grid_component_added = (
"Entity has a Grid component", "Entity has a Grid component",
"Entity failed to find Grid component") "Entity failed to find Grid component")
grid_size = (
"Grid Size value set successfully",
"Grid Size value could not be set")
enter_game_mode = ( enter_game_mode = (
"Entered game mode", "Entered game mode",
"Failed to enter game mode") "Failed to enter game mode")
@ -59,13 +62,14 @@ def AtomEditorComponents_Grid_AddedToEntity():
2) Add a Grid component to Grid entity. 2) Add a Grid component to Grid entity.
3) UNDO the entity creation and component addition. 3) UNDO the entity creation and component addition.
4) REDO the entity creation and component addition. 4) REDO the entity creation and component addition.
5) Enter/Exit game mode. 5) Grid Size changed.
6) Test IsHidden. 6) Enter/Exit game mode.
7) Test IsVisible. 7) Test IsHidden.
8) Delete Grid entity. 8) Test IsVisible.
9) UNDO deletion. 9) Delete Grid entity.
10) REDO deletion. 10) UNDO deletion.
11) Look for errors. 11) REDO deletion.
12) Look for errors.
:return: None :return: None
""" """
@ -82,7 +86,7 @@ def AtomEditorComponents_Grid_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a Grid entity with no components. # 1. Create a Grid entity with no components.
@ -119,33 +123,42 @@ def AtomEditorComponents_Grid_AddedToEntity():
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.creation_redo, grid_entity.exists()) Report.result(Tests.creation_redo, grid_entity.exists())
# 5. Enter/Exit game mode. # 5. Grid Size changed
grid_component.set_component_property_value(
AtomComponentProperties.grid('Grid Size'), value=64)
current_grid_size = grid_component.get_component_property_value(
AtomComponentProperties.grid('Grid Size'))
Report.result(Tests.grid_size, current_grid_size == 64)
# 6. Enter/Exit game mode.
TestHelper.enter_game_mode(Tests.enter_game_mode) TestHelper.enter_game_mode(Tests.enter_game_mode)
general.idle_wait_frames(1) general.idle_wait_frames(1)
TestHelper.exit_game_mode(Tests.exit_game_mode) TestHelper.exit_game_mode(Tests.exit_game_mode)
# 6. Test IsHidden. # 7. Test IsHidden.
grid_entity.set_visibility_state(False) grid_entity.set_visibility_state(False)
Report.result(Tests.is_hidden, grid_entity.is_hidden() is True) Report.result(Tests.is_hidden, grid_entity.is_hidden() is True)
# 7. Test IsVisible. # 8. Test IsVisible.
grid_entity.set_visibility_state(True) grid_entity.set_visibility_state(True)
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.is_visible, grid_entity.is_visible() is True) Report.result(Tests.is_visible, grid_entity.is_visible() is True)
# 8. Delete Grid entity. # 9. Delete Grid entity.
grid_entity.delete() grid_entity.delete()
Report.result(Tests.entity_deleted, not grid_entity.exists()) Report.result(Tests.entity_deleted, not grid_entity.exists())
# 9. UNDO deletion. # 10. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, grid_entity.exists()) Report.result(Tests.deletion_undo, grid_entity.exists())
# 10. REDO deletion. # 11. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not grid_entity.exists()) Report.result(Tests.deletion_redo, not grid_entity.exists())
# 11. Look for errors or asserts. # 12. Look for errors or asserts.
TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0) TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0)
for error_info in error_tracer.errors: for error_info in error_tracer.errors:
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}") Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")

@ -96,7 +96,7 @@ def AtomEditorComponents_HDRColorGrading_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create an HDR Color Grading entity with no components. # 1. Create an HDR Color Grading entity with no components.
@ -173,10 +173,12 @@ def AtomEditorComponents_HDRColorGrading_AddedToEntity():
# 13. UNDO deletion. # 13. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, hdr_color_grading_entity.exists()) Report.result(Tests.deletion_undo, hdr_color_grading_entity.exists())
# 14. REDO deletion. # 14. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not hdr_color_grading_entity.exists()) Report.result(Tests.deletion_redo, not hdr_color_grading_entity.exists())
# 15. Look for errors and asserts. # 15. Look for errors and asserts.

@ -87,7 +87,7 @@ def AtomEditorComponents_HDRiSkybox_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create an HDRi Skybox with no components. # 1. Create an HDRi Skybox with no components.
@ -158,10 +158,12 @@ def AtomEditorComponents_HDRiSkybox_AddedToEntity():
# 10. UNDO deletion. # 10. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, hdri_skybox_entity.exists()) Report.result(Tests.deletion_undo, hdri_skybox_entity.exists())
# 11. REDO deletion. # 11. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not hdri_skybox_entity.exists()) Report.result(Tests.deletion_redo, not hdri_skybox_entity.exists())
# 12. Look for errors or asserts. # 12. Look for errors or asserts.

@ -68,13 +68,14 @@ def AtomEditorComponents_Light_AddedToEntity():
2) Add Light component to the Light entity. 2) Add Light component to the Light entity.
3) UNDO the entity creation and component addition. 3) UNDO the entity creation and component addition.
4) REDO the entity creation and component addition. 4) REDO the entity creation and component addition.
5) Enter/Exit game mode. 5) Cycle through all light types.
6) Test IsHidden. 6) Enter/Exit game mode.
7) Test IsVisible. 7) Test IsHidden.
8) Delete Light entity. 8) Test IsVisible.
9) UNDO deletion. 9) Delete Light entity.
10) REDO deletion. 10) UNDO deletion.
11) Look for errors. 11) REDO deletion.
12) Look for errors.
:return: None :return: None
""" """
@ -83,13 +84,13 @@ def AtomEditorComponents_Light_AddedToEntity():
from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.utils import Report, Tracer, TestHelper from editor_python_test_tools.utils import Report, Tracer, TestHelper
from Atom.atom_utils.atom_constants import AtomComponentProperties from Atom.atom_utils.atom_constants import AtomComponentProperties, LIGHT_TYPES
with Tracer() as error_tracer: with Tracer() as error_tracer:
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a Light entity with no components. # 1. Create a Light entity with no components.
@ -124,33 +125,46 @@ def AtomEditorComponents_Light_AddedToEntity():
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.creation_redo, light_entity.exists()) Report.result(Tests.creation_redo, light_entity.exists())
# 5. Enter/Exit game mode. # 5. Cycle through all light types.
for light_type in LIGHT_TYPES.keys():
light_component.set_component_property_value(
AtomComponentProperties.light('Light type'), LIGHT_TYPES[light_type])
current_light_type = light_component.get_component_property_value(
AtomComponentProperties.light('Light type'))
test_light_type = (
f"Light component has {light_type} type set",
f"Light component failed to set {light_type} type")
Report.result(test_light_type, current_light_type == LIGHT_TYPES[light_type])
# 6. Enter/Exit game mode.
TestHelper.enter_game_mode(Tests.enter_game_mode) TestHelper.enter_game_mode(Tests.enter_game_mode)
general.idle_wait_frames(1) general.idle_wait_frames(1)
TestHelper.exit_game_mode(Tests.exit_game_mode) TestHelper.exit_game_mode(Tests.exit_game_mode)
# 6. Test IsHidden. # 7. Test IsHidden.
light_entity.set_visibility_state(False) light_entity.set_visibility_state(False)
Report.result(Tests.is_hidden, light_entity.is_hidden() is True) Report.result(Tests.is_hidden, light_entity.is_hidden() is True)
# 7. Test IsVisible. # 8. Test IsVisible.
light_entity.set_visibility_state(True) light_entity.set_visibility_state(True)
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.is_visible, light_entity.is_visible() is True) Report.result(Tests.is_visible, light_entity.is_visible() is True)
# 8. Delete Light entity. # 9. Delete Light entity.
light_entity.delete() light_entity.delete()
Report.result(Tests.entity_deleted, not light_entity.exists()) Report.result(Tests.entity_deleted, not light_entity.exists())
# 9. UNDO deletion. # 10. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, light_entity.exists()) Report.result(Tests.deletion_undo, light_entity.exists())
# 10. REDO deletion. # 11. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not light_entity.exists()) Report.result(Tests.deletion_redo, not light_entity.exists())
# 11. Look for errors asserts. # 12. Look for errors asserts.
TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0) TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0)
for error_info in error_tracer.errors: for error_info in error_tracer.errors:
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}") Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")

@ -104,7 +104,7 @@ def AtomEditorComponents_LookModification_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create an Look Modification entity with no components. # 1. Create an Look Modification entity with no components.
@ -192,10 +192,12 @@ def AtomEditorComponents_LookModification_AddedToEntity():
# 14. UNDO deletion. # 14. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, look_modification_entity.exists()) Report.result(Tests.deletion_undo, look_modification_entity.exists())
# 15. REDO deletion. # 15. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not look_modification_entity.exists()) Report.result(Tests.deletion_redo, not look_modification_entity.exists())
# 16. Look for errors and asserts. # 16. Look for errors and asserts.

@ -102,7 +102,7 @@ def AtomEditorComponents_Material_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a Material entity with no components. # 1. Create a Material entity with no components.
@ -184,10 +184,12 @@ def AtomEditorComponents_Material_AddedToEntity():
# 16. UNDO deletion. # 16. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, material_entity.exists()) Report.result(Tests.deletion_undo, material_entity.exists())
# 17. REDO deletion. # 17. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not material_entity.exists()) Report.result(Tests.deletion_redo, not material_entity.exists())
# 18. Look for errors or asserts. # 18. Look for errors or asserts.

@ -87,7 +87,7 @@ def AtomEditorComponents_Mesh_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a Mesh entity with no components. # 1. Create a Mesh entity with no components.
@ -151,10 +151,12 @@ def AtomEditorComponents_Mesh_AddedToEntity():
# 10. UNDO deletion. # 10. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, mesh_entity.exists()) Report.result(Tests.deletion_undo, mesh_entity.exists())
# 11. REDO deletion. # 11. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not mesh_entity.exists()) Report.result(Tests.deletion_redo, not mesh_entity.exists())
# 12. Look for errors or asserts. # 12. Look for errors or asserts.

@ -80,7 +80,7 @@ def AtomEditorComponents_OcclusionCullingPlane_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a occlusion culling plane entity with no components. # 1. Create a occlusion culling plane entity with no components.
@ -140,10 +140,12 @@ def AtomEditorComponents_OcclusionCullingPlane_AddedToEntity():
# 9. UNDO deletion. # 9. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, occlusion_culling_plane_entity.exists()) Report.result(Tests.deletion_undo, occlusion_culling_plane_entity.exists())
# 10. REDO deletion. # 10. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not occlusion_culling_plane_entity.exists()) Report.result(Tests.deletion_redo, not occlusion_culling_plane_entity.exists())
# 11. Look for errors or asserts. # 11. Look for errors or asserts.

@ -27,6 +27,9 @@ class Tests:
physical_sky_component = ( physical_sky_component = (
"Entity has a Physical Sky component", "Entity has a Physical Sky component",
"Entity failed to find Physical Sky component") "Entity failed to find Physical Sky component")
sky_intensity = (
"Sky Intensity value updated successfully",
"Sky Intensity value could not be set")
enter_game_mode = ( enter_game_mode = (
"Entered game mode", "Entered game mode",
"Failed to enter game mode") "Failed to enter game mode")
@ -68,13 +71,14 @@ def AtomEditorComponents_PhysicalSky_AddedToEntity():
2) Add Physical Sky component to Physical Sky entity. 2) Add Physical Sky component to Physical Sky entity.
3) UNDO the entity creation and component addition. 3) UNDO the entity creation and component addition.
4) REDO the entity creation and component addition. 4) REDO the entity creation and component addition.
5) Enter/Exit game mode. 5) Update Sky Intensity value.
6) Test IsHidden. 6) Enter/Exit game mode.
7) Test IsVisible. 7) Test IsHidden.
8) Delete Physical Sky entity. 8) Test IsVisible.
9) UNDO deletion. 9) Delete Physical Sky entity.
10) REDO deletion. 10) UNDO deletion.
11) Look for errors and asserts. 11) REDO deletion.
12) Look for errors and asserts.
:return: None :return: None
""" """
@ -89,7 +93,7 @@ def AtomEditorComponents_PhysicalSky_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a Physical Sky entity with no components. # 1. Create a Physical Sky entity with no components.
@ -126,33 +130,42 @@ def AtomEditorComponents_PhysicalSky_AddedToEntity():
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.creation_redo, physical_sky_entity.exists()) Report.result(Tests.creation_redo, physical_sky_entity.exists())
# 5. Enter/Exit game mode. # 5. Set Sky Intensity value
physical_sky_component.set_component_property_value(
AtomComponentProperties.physical_sky('Sky Intensity'), value=2)
current_sky_intensity = physical_sky_component.get_component_property_value(
AtomComponentProperties.physical_sky('Sky Intensity'))
Report.result(Tests.sky_intensity, current_sky_intensity == 2)
# 6. Enter/Exit game mode.
TestHelper.enter_game_mode(Tests.enter_game_mode) TestHelper.enter_game_mode(Tests.enter_game_mode)
general.idle_wait_frames(1) general.idle_wait_frames(1)
TestHelper.exit_game_mode(Tests.exit_game_mode) TestHelper.exit_game_mode(Tests.exit_game_mode)
# 6. Test IsHidden. # 7. Test IsHidden.
physical_sky_entity.set_visibility_state(False) physical_sky_entity.set_visibility_state(False)
Report.result(Tests.is_hidden, physical_sky_entity.is_hidden() is True) Report.result(Tests.is_hidden, physical_sky_entity.is_hidden() is True)
# 7. Test IsVisible. # 8. Test IsVisible.
physical_sky_entity.set_visibility_state(True) physical_sky_entity.set_visibility_state(True)
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.is_visible, physical_sky_entity.is_visible() is True) Report.result(Tests.is_visible, physical_sky_entity.is_visible() is True)
# 8. Delete Physical Sky entity. # 9. Delete Physical Sky entity.
physical_sky_entity.delete() physical_sky_entity.delete()
Report.result(Tests.entity_deleted, not physical_sky_entity.exists()) Report.result(Tests.entity_deleted, not physical_sky_entity.exists())
# 9. UNDO deletion. # 10. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, physical_sky_entity.exists()) Report.result(Tests.deletion_undo, physical_sky_entity.exists())
# 10. REDO deletion. # 11. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not physical_sky_entity.exists()) Report.result(Tests.deletion_redo, not physical_sky_entity.exists())
# 11. Look for errors and asserts. # 12. Look for errors and asserts.
TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0) TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0)
for error_info in error_tracer.errors: for error_info in error_tracer.errors:
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}") Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")

@ -92,7 +92,7 @@ def AtomEditorComponents_PostFXGradientWeightModifier_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a PostFX Gradient Weight Modifier entity with no components. # 1. Create a PostFX Gradient Weight Modifier entity with no components.
@ -162,10 +162,12 @@ def AtomEditorComponents_PostFXGradientWeightModifier_AddedToEntity():
# 12. UNDO deletion. # 12. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, postfx_gradient_weight_entity.exists()) Report.result(Tests.deletion_undo, postfx_gradient_weight_entity.exists())
# 13. REDO deletion. # 13. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not postfx_gradient_weight_entity.exists()) Report.result(Tests.deletion_redo, not postfx_gradient_weight_entity.exists())
# 14. Look for errors or asserts. # 14. Look for errors or asserts.

@ -80,7 +80,7 @@ def AtomEditorComponents_postfx_layer_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a PostFX Layer entity with no components. # 1. Create a PostFX Layer entity with no components.
@ -137,10 +137,12 @@ def AtomEditorComponents_postfx_layer_AddedToEntity():
# 9. UNDO deletion. # 9. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, postfx_layer_entity.exists()) Report.result(Tests.deletion_undo, postfx_layer_entity.exists())
# 10. REDO deletion. # 10. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not postfx_layer_entity.exists()) Report.result(Tests.deletion_redo, not postfx_layer_entity.exists())
# 11. Look for errors or asserts. # 11. Look for errors or asserts.

@ -92,7 +92,7 @@ def AtomEditorComponents_PostFXRadiusWeightModifier_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a Post FX Radius Weight Modifier entity with no components. # 1. Create a Post FX Radius Weight Modifier entity with no components.
@ -161,10 +161,12 @@ def AtomEditorComponents_PostFXRadiusWeightModifier_AddedToEntity():
# 12. UNDO deletion. # 12. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, postfx_radius_weight_entity.exists()) Report.result(Tests.deletion_undo, postfx_radius_weight_entity.exists())
# 13. REDO deletion. # 13. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not postfx_radius_weight_entity.exists()) Report.result(Tests.deletion_redo, not postfx_radius_weight_entity.exists())
# 14. Look for errors and asserts. # 14. Look for errors and asserts.

@ -98,7 +98,7 @@ def AtomEditorComponents_postfx_shape_weight_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a PostFx Shape Weight Modifier entity with no components. # 1. Create a PostFx Shape Weight Modifier entity with no components.
@ -188,10 +188,12 @@ def AtomEditorComponents_postfx_shape_weight_AddedToEntity():
# 15. UNDO deletion. # 15. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, postfx_shape_weight_entity.exists()) Report.result(Tests.deletion_undo, postfx_shape_weight_entity.exists())
# 16. REDO deletion. # 16. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not postfx_shape_weight_entity.exists()) Report.result(Tests.deletion_redo, not postfx_shape_weight_entity.exists())
# 17. Look for errors or asserts. # 17. Look for errors or asserts.

@ -97,7 +97,7 @@ def AtomEditorComponents_ReflectionProbe_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a Reflection Probe entity with no components. # 1. Create a Reflection Probe entity with no components.
@ -183,10 +183,12 @@ def AtomEditorComponents_ReflectionProbe_AddedToEntity():
# 13. UNDO deletion. # 13. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, reflection_probe_entity.exists()) Report.result(Tests.deletion_undo, reflection_probe_entity.exists())
# 14. REDO deletion. # 14. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not reflection_probe_entity.exists()) Report.result(Tests.deletion_redo, not reflection_probe_entity.exists())
# 15. Look for errors or asserts. # 15. Look for errors or asserts.

@ -94,7 +94,7 @@ def AtomEditorComponents_SSAO_AddedToEntity():
# Test setup begins. # Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle() TestHelper.init_idle()
TestHelper.open_level("", "Base") TestHelper.open_level("Graphics", "base_empty")
# Test steps begin. # Test steps begin.
# 1. Create a SSAO entity with no components. # 1. Create a SSAO entity with no components.
@ -163,10 +163,12 @@ def AtomEditorComponents_SSAO_AddedToEntity():
# 12. UNDO deletion. # 12. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, ssao_entity.exists()) Report.result(Tests.deletion_undo, ssao_entity.exists())
# 13. REDO deletion. # 13. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not ssao_entity.exists()) Report.result(Tests.deletion_redo, not ssao_entity.exists())
# 14. Look for errors and asserts. # 14. Look for errors and asserts.

@ -0,0 +1,72 @@
"""
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
"""
def Atom_LevelLoadTest():
"""
Summary:
Loads all graphics levels within the AutomatedTesting project in editor. For each level this script will verify that
the level loads, and can enter/exit gameplay without crashing the editor.
Test setup:
- Store all available levels in a list.
- Set up a for loop to run all checks for each level.
Expected Behavior:
Test verifies that each level loads, enters/exits game mode, and reports success for all test actions.
Test Steps for each level:
1) Create tuple with level load success and failure messages
2) Open the level using the python test tools command
3) Verify level is loaded using a separate command, and report success/failure
4) Enter gameplay and report result using a tuple
5) Exit Gameplay and report result using a tuple
6) Look for errors or asserts.
:return: None
"""
import azlmbr.legacy.general as general
from editor_python_test_tools.utils import Report, Tracer, TestHelper
from Atom.atom_utils.atom_constants import LEVEL_LIST
with Tracer() as error_tracer:
for level in LEVEL_LIST:
# 1. Create tuple with level load success and failure messages
level_check_tuple = (f"loaded {level}", f"failed to load {level}")
# 2. Open the level using the python test tools command
TestHelper.init_idle()
TestHelper.open_level("Graphics", level)
# 3. Verify level is loaded using a separate command, and report success/failure
Report.result(level_check_tuple, level == general.get_current_level_name())
# 4. Enter gameplay and report result using a tuple
enter_game_mode_tuple = (f"{level} entered gameplay successfully ", f"{level} failed to enter gameplay")
TestHelper.enter_game_mode(enter_game_mode_tuple)
general.idle_wait_frames(1)
# 5. Exit gameplay and report result using a tuple
exit_game_mode_tuple = (f"{level} exited gameplay successfully ", f"{level} failed to exit gameplay")
TestHelper.exit_game_mode(exit_game_mode_tuple)
# 6. Look for errors or asserts.
TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0)
for error_info in error_tracer.errors:
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")
for assert_info in error_tracer.asserts:
Report.info(f"Assert: {assert_info.filename} {assert_info.function} | {assert_info.message}")
if __name__ == "__main__":
from editor_python_test_tools.utils import Report
Report.start_test(Atom_LevelLoadTest)

@ -34,6 +34,7 @@ class EditorComponent:
EditorEntity.add_component() or Entity.add_components() or EditorEntity.get_components_of_type() EditorEntity.add_component() or Entity.add_components() or EditorEntity.get_components_of_type()
which also assigns self.id and self.type_id to the EditorComponent object. which also assigns self.id and self.type_id to the EditorComponent object.
self.type_id is the UUID for the component type as provided by an ebus call. self.type_id is the UUID for the component type as provided by an ebus call.
self.id is an azlmbr.entity.EntityComponentIdPair which contains both entity and component id's
""" """
def __init__(self, type_id: uuid): def __init__(self, type_id: uuid):
@ -270,6 +271,13 @@ class EditorComponent:
warnings.warn("disable_component is deprecated, use set_enabled(False) instead.", DeprecationWarning) warnings.warn("disable_component is deprecated, use set_enabled(False) instead.", DeprecationWarning)
editor.EditorComponentAPIBus(bus.Broadcast, "DisableComponents", [self.id]) editor.EditorComponentAPIBus(bus.Broadcast, "DisableComponents", [self.id])
def remove(self):
"""
Removes the component from its associated entity. Essentially a delete since only UNDO can return it.
:return: None
"""
editor.EditorComponentAPIBus(bus.Broadcast, "RemoveComponents", [self.id])
@staticmethod @staticmethod
def get_type_ids(component_names: list, entity_type: EditorEntityType = EditorEntityType.GAME) -> list: def get_type_ids(component_names: list, entity_type: EditorEntityType = EditorEntityType.GAME) -> list:
""" """
@ -473,12 +481,11 @@ class EditorEntity:
:param component_names: List of component names to remove :param component_names: List of component names to remove
:return: None :return: None
""" """
type_ids = EditorComponent.get_type_ids(component_names, EditorEntityType.GAME) component_ids = [component.id for component in self.get_components_of_type(component_names)]
for type_id in type_ids: remove_success = editor.EditorComponentAPIBus(bus.Broadcast, "RemoveComponents", component_ids)
remove_outcome = editor.EditorComponentAPIBus(bus.Broadcast, "RemoveComponents", self.id, [type_id])
assert ( assert (
remove_outcome.IsSuccess() remove_success
), f"Failure: could not remove component from '{self.get_name()}'" ), f"Failure: could not remove component from entity '{self.get_name()}'"
def get_components_of_type(self, component_names: list) -> List[EditorComponent]: def get_components_of_type(self, component_names: list) -> List[EditorComponent]:
""" """

@ -5,9 +5,9 @@ For complete copyright and license terms please see the LICENSE at the root of t
SPDX-License-Identifier: Apache-2.0 OR MIT SPDX-License-Identifier: Apache-2.0 OR MIT
""" """
import collections.abc
from typing import List from typing import List
from math import isclose from math import isclose
import collections.abc
import azlmbr.bus as bus import azlmbr.bus as bus
import azlmbr.editor as editor import azlmbr.editor as editor

@ -48,8 +48,8 @@ def wait_for_propagation():
# This is a helper class which contains some of the useful information about a prefab instance. # This is a helper class which contains some of the useful information about a prefab instance.
class PrefabInstance: class PrefabInstance:
def __init__(self, prefab_file_name: str = None, container_entity: EditorEntity = None): def __init__(self, prefab_file_path: str = None, container_entity: EditorEntity = None):
self.prefab_file_name: str = prefab_file_name self.prefab_file_path: str = prefab_file_path
self.container_entity: EditorEntity = container_entity self.container_entity: EditorEntity = container_entity
def __eq__(self, other): def __eq__(self, other):
@ -66,7 +66,7 @@ class PrefabInstance:
See if this instance is valid to be used with other prefab operations. See if this instance is valid to be used with other prefab operations.
:return: Whether the target instance is valid or not. :return: Whether the target instance is valid or not.
""" """
return self.container_entity.id.IsValid() and self.prefab_file_name in Prefab.existing_prefabs return self.container_entity.id.IsValid() and self.prefab_file_path in Prefab.existing_prefabs
def has_editor_prefab_component(self) -> bool: def has_editor_prefab_component(self) -> bool:
""" """
@ -131,7 +131,7 @@ class PrefabInstance:
has_correct_parent = reparented_container_entity_parent_id.ToString() == parent_entity_id.ToString() has_correct_parent = reparented_container_entity_parent_id.ToString() == parent_entity_id.ToString()
assert has_correct_parent, "Prefab Instance reparented is *not* under the expected parent entity" assert has_correct_parent, "Prefab Instance reparented is *not* under the expected parent entity"
current_instance_prefab = Prefab.get_prefab(self.prefab_file_name) current_instance_prefab = Prefab.get_prefab(self.prefab_file_path)
current_instance_prefab.instances.remove(self) current_instance_prefab.instances.remove(self)
self.container_entity = reparented_container_entity self.container_entity = reparented_container_entity
@ -161,46 +161,48 @@ class Prefab:
:param file_path: A unique file path of the target prefab. :param file_path: A unique file path of the target prefab.
:return: Whether the target prefab is loaded or not. :return: Whether the target prefab is loaded or not.
""" """
return file_path in Prefab.existing_prefabs for entry in Prefab.existing_prefabs:
Report.info(f"PrefabPath: '{entry}'")
return get_prefab_file_path(file_path) in Prefab.existing_prefabs
@classmethod @classmethod
def prefab_exists(cls, file_path: str) -> bool: def prefab_exists(cls, file_path: str) -> bool:
""" """
Check if a prefab exists in the directory for files of prefab tests. Check if a prefab exists in the directory for files of prefab tests.
:param file_name: A unique file name of the target prefab. :param file_path: A unique file path of the target prefab.
:return: Whether the target prefab exists or not. :return: Whether the target prefab exists or not.
""" """
return path.exists(get_prefab_file_path(file_path)) return path.exists(get_prefab_file_path(file_path))
@classmethod @classmethod
def get_prefab(cls, file_name: str) -> Prefab: def get_prefab(cls, file_path: str) -> Prefab:
""" """
Return a prefab which can be used immediately. Return a prefab which can be used immediately.
:param file_name: A unique file name of the target prefab. :param file_path: A unique file path of the target prefab.
:return: The prefab with given file name. :return: The prefab with given file name.
""" """
assert file_name, "Received an empty file_name" assert file_path, "Received an empty file_path"
if Prefab.is_prefab_loaded(file_name): if Prefab.is_prefab_loaded(file_path):
return Prefab.existing_prefabs[file_name] return Prefab.existing_prefabs[get_prefab_file_path(file_path)]
else: else:
assert Prefab.prefab_exists(file_name), f"Attempted to get a prefab \"{file_name}\" that doesn't exist" assert Prefab.prefab_exists(file_path), f"Attempted to get a prefab \"{file_path}\" that doesn't exist"
new_prefab = Prefab(file_name) new_prefab = Prefab(file_path)
Prefab.existing_prefabs[file_name] = Prefab(file_name) Prefab.existing_prefabs[new_prefab.file_path] = new_prefab
return new_prefab return new_prefab
@classmethod @classmethod
def create_prefab(cls, entities: list[EditorEntity], file_name: str, prefab_instance_name: str=None) -> tuple(Prefab, PrefabInstance): def create_prefab(cls, entities: list[EditorEntity], file_path: str, prefab_instance_name: str=None) -> tuple(Prefab, PrefabInstance):
""" """
Create a prefab in memory and return it. The very first instance of this prefab will also be created. Create a prefab in memory and return it. The very first instance of this prefab will also be created.
:param entities: The entities that should form the new prefab (along with their descendants). :param entities: The entities that should form the new prefab (along with their descendants).
:param file_name: A unique file name of new prefab. :param file_path: A unique file path for new prefab.
:param prefab_instance_name: A name for the very first instance generated while prefab creation. The default instance name is the same as file_name. :param prefab_instance_name: A name for the very first instance generated while prefab creation. The default instance name is the same as the file name in file_path.
:return: Created Prefab object and the very first PrefabInstance object owned by the prefab. :return: Created Prefab object and the very first PrefabInstance object owned by the prefab.
""" """
assert not Prefab.is_prefab_loaded(file_name), f"Can't create Prefab '{file_name}' since the prefab already exists" assert not Prefab.is_prefab_loaded(file_path), f"Can't create Prefab '{file_path}' since the prefab already exists"
new_prefab = Prefab(file_name) new_prefab = Prefab(file_path)
entity_ids = [entity.id for entity in entities] entity_ids = [entity.id for entity in entities]
create_prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'CreatePrefabInMemory', entity_ids, new_prefab.file_path) create_prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'CreatePrefabInMemory', entity_ids, new_prefab.file_path)
assert create_prefab_result.IsSuccess(), f"Prefab operation 'CreatePrefab' failed. Error: {create_prefab_result.GetError()}" assert create_prefab_result.IsSuccess(), f"Prefab operation 'CreatePrefab' failed. Error: {create_prefab_result.GetError()}"
@ -211,14 +213,13 @@ class Prefab:
assert len(children_entity_ids) == len(entities), f"Entity count of created prefab instance does *not* match the count of given entities." assert len(children_entity_ids) == len(entities), f"Entity count of created prefab instance does *not* match the count of given entities."
if prefab_instance_name:
container_entity.set_name(prefab_instance_name)
wait_for_propagation() wait_for_propagation()
new_prefab_instance = PrefabInstance(file_name, EditorEntity(container_entity_id)) new_prefab_instance = PrefabInstance(new_prefab.file_path, EditorEntity(container_entity_id))
if prefab_instance_name:
new_prefab_instance.container_entity.set_name(prefab_instance_name)
new_prefab.instances.add(new_prefab_instance) new_prefab.instances.add(new_prefab_instance)
Prefab.existing_prefabs[file_name] = new_prefab Prefab.existing_prefabs[new_prefab.file_path] = new_prefab
return new_prefab, new_prefab_instance return new_prefab, new_prefab_instance
@classmethod @classmethod
@ -250,7 +251,7 @@ class Prefab:
assert False, "Not all entities and descendants in target prefabs are deleted." assert False, "Not all entities and descendants in target prefabs are deleted."
for instance in prefab_instances: for instance in prefab_instances:
instance_deleted_prefab = Prefab.get_prefab(instance.prefab_file_name) instance_deleted_prefab = Prefab.get_prefab(instance.prefab_file_path)
instance_deleted_prefab.instances.remove(instance) instance_deleted_prefab.instances.remove(instance)
instance = PrefabInstance() instance = PrefabInstance()
@ -290,8 +291,7 @@ class Prefab:
prefab_file_path = prefab.PrefabPublicRequestBus(bus.Broadcast, 'GetOwningInstancePrefabPath', duplicate_container_entity_id) prefab_file_path = prefab.PrefabPublicRequestBus(bus.Broadcast, 'GetOwningInstancePrefabPath', duplicate_container_entity_id)
assert prefab_file_path, "Returned file path should *not* be empty." assert prefab_file_path, "Returned file path should *not* be empty."
prefab_file_name = Path(prefab_file_path).stem duplicate_instance_prefab = Prefab.get_prefab(prefab_file_path)
duplicate_instance_prefab = Prefab.get_prefab(prefab_file_name)
duplicate_instance = PrefabInstance(prefab_file_path, EditorEntity(duplicate_container_entity_id)) duplicate_instance = PrefabInstance(prefab_file_path, EditorEntity(duplicate_container_entity_id))
duplicate_instance_prefab.instances.add(duplicate_instance) duplicate_instance_prefab.instances.add(duplicate_instance)
duplicate_instances.append(duplicate_instance) duplicate_instances.append(duplicate_instance)
@ -324,7 +324,7 @@ class Prefab:
wait_for_propagation() wait_for_propagation()
instance_owner_prefab = Prefab.get_prefab(prefab_instance.prefab_file_name) instance_owner_prefab = Prefab.get_prefab(prefab_instance.prefab_file_path)
instance_owner_prefab.instances.remove(prefab_instance) instance_owner_prefab.instances.remove(prefab_instance)
prefab_instance = PrefabInstance() prefab_instance = PrefabInstance()
@ -346,13 +346,13 @@ class Prefab:
container_entity_id = instantiate_prefab_result.GetValue() container_entity_id = instantiate_prefab_result.GetValue()
container_entity = EditorEntity(container_entity_id) container_entity = EditorEntity(container_entity_id)
if name:
container_entity.set_name(name)
wait_for_propagation() wait_for_propagation()
new_prefab_instance = PrefabInstance(self.file_path, EditorEntity(container_entity_id)) new_prefab_instance = PrefabInstance(self.file_path, EditorEntity(container_entity_id))
assert not new_prefab_instance in self.instances, "This prefab instance is already existed before this instantiation." assert not new_prefab_instance in self.instances, "This prefab instance already existed before this instantiation."
if name:
new_prefab_instance.container_entity.set_name(name)
self.instances.add(new_prefab_instance) self.instances.add(new_prefab_instance)
assert new_prefab_instance.is_at_position(prefab_position), "This prefab instance is *not* at expected position." assert new_prefab_instance.is_at_position(prefab_position), "This prefab instance is *not* at expected position."

@ -35,3 +35,11 @@ class TestAutomation(TestAutomationBase):
def test_Multiplayer_AutoComponent_RPC(self, request, workspace, editor, launcher_platform): def test_Multiplayer_AutoComponent_RPC(self, request, workspace, editor, launcher_platform):
from .tests import Multiplayer_AutoComponent_RPC as test_module from .tests import Multiplayer_AutoComponent_RPC as test_module
self._run_prefab_test(request, workspace, editor, test_module) self._run_prefab_test(request, workspace, editor, test_module)
def test_Multiplayer_BasicConnectivity_Connects(self, request, workspace, editor, launcher_platform):
from .tests import Multiplayer_BasicConnectivity_Connects as test_module
self._run_prefab_test(request, workspace, editor, test_module)
def test_Multiplayer_SimpleNetworkLevelEntity(self, request, workspace, editor, launcher_platform):
from .tests import Multiplayer_SimpleNetworkLevelEntity as test_module
self._run_prefab_test(request, workspace, editor, test_module)

@ -62,15 +62,29 @@ def Multiplayer_AutoComponent_RPC():
Report.critical_result(TestSuccessFailTuples.find_network_player, player_id.IsValid()) Report.critical_result(TestSuccessFailTuples.find_network_player, player_id.IsValid())
# 4) Check the editor logs for expected and unexpected log output # 4) Check the editor logs for expected and unexpected log output
# Authority->Autonomous RPC
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. 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('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) 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 # Authority->Client RPC
#PLAYFX_RPC_WAIT_TIME_SECONDS = 1.1 # The server will send an RPC to play an fx on the client every second. 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 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('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) helper.succeed_if_log_line_found('Script', "AutoComponent_RPC_NetLevelEntity: I'm a client playing some fx.", section_tracer.prints, PLAYFX_RPC_WAIT_TIME_SECONDS)
# Autonomous->Authority RPC
# Sending 2 RPCs: 1 containing a parameter and 1 without
AUTONOMOUS_TO_AUTHORITY_RPC_WAIT_TIME_SECONDS = 1.0 # This RPC is sent as soon as the autonomous player script is spawned. 1 second should be more than enough time to send/receive that RPC.
helper.succeed_if_log_line_found('Script', "AutoComponent_RPC: Sending AutonomousToAuthorityNoParam RPC.", section_tracer.prints, AUTONOMOUS_TO_AUTHORITY_RPC_WAIT_TIME_SECONDS)
helper.succeed_if_log_line_found('Script', "AutoComponent_RPC: Sending AutonomousToAuthority RPC (with float param).", section_tracer.prints, AUTONOMOUS_TO_AUTHORITY_RPC_WAIT_TIME_SECONDS)
helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC: Successfully received AutonomousToAuthorityNoParams RPC.", section_tracer.prints, AUTONOMOUS_TO_AUTHORITY_RPC_WAIT_TIME_SECONDS)
helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC: Successfully received AutonomousToAuthority RPC (with expected float param).", section_tracer.prints, AUTONOMOUS_TO_AUTHORITY_RPC_WAIT_TIME_SECONDS)
# Server->Authority RPC. Inter-Entity Communication.
SERVER_TO_AUTHORITY_RPC_WAIT_TIME_SECONDS = 1.0 # This RPC is sent as soon as the networked level entity finds the player in the level, and previous tests are relying on the player's existence. 1 second should be more than enough time to send/receive that RPC.
helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC_NetLevelEntity: Send ServerToAuthority RPC.", section_tracer.prints, SERVER_TO_AUTHORITY_RPC_WAIT_TIME_SECONDS)
helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC: Received ServerToAuthority RPC. Damage=42.", section_tracer.prints, SERVER_TO_AUTHORITY_RPC_WAIT_TIME_SECONDS)
# Exit game mode # Exit game mode

@ -0,0 +1,66 @@
"""
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 basic client connect test works
# fmt: off
class TestConstants:
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_BasicConnectivity_Connects():
r"""
Summary:
Runs a test to make sure that a networked player can be spawned
Level Description:
- Dynamic
1. Although the level is empty, when the server and editor connect the server will spawn the player prefab.
- Static
1. This is an empty level.
Expected Outcome:
We should see the player connect and spawn with no errors.
: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
level_name = "BasicConnectivity_Connects"
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(TestConstants.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(TestConstants.find_network_player, player_id.IsValid())
# Exit game mode
helper.exit_game_mode(TestConstants.exit_game_mode)
if __name__ == "__main__":
from editor_python_test_tools.utils import Report
Report.start_test(Multiplayer_BasicConnectivity_Connects)

@ -0,0 +1,76 @@
"""
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 level entities with network bindings are properly replicated.
# Note: This test should be ran on a fresh editor run; some bugs with spawnables occur only on the first editor play-mode.
# 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_SimpleNetworkLevelEntity():
r"""
Summary:
Test to make sure that network entities in a level function and are replicated to clients as expected
Level Description:
- Static
1. NetLevelEntity. This is a networked entity which has a script attached which prints logs to ensure it's replicated.
Expected Outcome:
We should see logs stating that the net-sync'd level entity exists on both server and client.
: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 = "SimpleNetworkLevelEntity"
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 network spawnable errors
ATTEMPTING_INVALID_NETSPAWN_WAIT_TIME_SECONDS = 0.0 # The editor will try to net-spawn its networked level entity before it's even a client. Make sure this didn't happen.
helper.fail_if_log_line_found('NetworkEntityManager', "RequestNetSpawnableInstantiation: Requested spawnable Root.network.spawnable doesn't exist in the NetworkSpawnableLibrary. Please make sure it is a network spawnable", section_tracer.errors, ATTEMPTING_INVALID_NETSPAWN_WAIT_TIME_SECONDS)
# 5) Ensure the script graph attached to the level entity is running on the server
SCRIPTGRAPH_ENABLED_WAIT_TIME_SECONDS = 0.25
helper.succeed_if_log_line_found('EditorServer', "Script: SimpleNetworkLevelEntity: On Graph Start", section_tracer.prints, SCRIPTGRAPH_ENABLED_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_SimpleNetworkLevelEntity)

@ -38,6 +38,10 @@ class TestAutomation(TestAutomationBase):
from Prefab.tests.instantiate_prefab import InstantiatePrefab_ContainingASingleEntity as test_module from Prefab.tests.instantiate_prefab import InstantiatePrefab_ContainingASingleEntity as test_module
self._run_prefab_test(request, workspace, editor, test_module) self._run_prefab_test(request, workspace, editor, test_module)
def test_InstantiatePrefab_FromCreatedPrefabWithSingleEntity(self, request, workspace, editor, launcher_platform):
from Prefab.tests.instantiate_prefab import InstantiatePrefab_FromCreatedPrefabWithSingleEntity as test_module
self._run_prefab_test(request, workspace, editor, test_module)
def test_DeletePrefab_ContainingASingleEntity(self, request, workspace, editor, launcher_platform): def test_DeletePrefab_ContainingASingleEntity(self, request, workspace, editor, launcher_platform):
from Prefab.tests.delete_prefab import DeletePrefab_ContainingASingleEntity as test_module from Prefab.tests.delete_prefab import DeletePrefab_ContainingASingleEntity as test_module
self._run_prefab_test(request, workspace, editor, test_module) self._run_prefab_test(request, workspace, editor, test_module)

@ -45,8 +45,12 @@ class TestAutomationNoAutoTestMode(EditorTestSuite):
class test_InstantiatePrefab_ContainingASingleEntity(EditorSharedTest): class test_InstantiatePrefab_ContainingASingleEntity(EditorSharedTest):
from .tests.instantiate_prefab import InstantiatePrefab_ContainingASingleEntity as test_module from .tests.instantiate_prefab import InstantiatePrefab_ContainingASingleEntity as test_module
class test_InstantiatePrefab_FromCreatedPrefabWithSingleEntity(EditorSharedTest):
from .tests.instantiate_prefab import InstantiatePrefab_FromCreatedPrefabWithSingleEntity as test_module
class test_DeletePrefab_ContainingASingleEntity(EditorSharedTest): class test_DeletePrefab_ContainingASingleEntity(EditorSharedTest):
from .tests.delete_prefab import DeletePrefab_ContainingASingleEntity as test_module from .tests.delete_prefab import DeletePrefab_ContainingASingleEntity as test_module
class test_DuplicatePrefab_ContainingASingleEntity(EditorSharedTest): class test_DuplicatePrefab_ContainingASingleEntity(EditorSharedTest):
from .tests.duplicate_prefab import DuplicatePrefab_ContainingASingleEntity as test_module from .tests.duplicate_prefab import DuplicatePrefab_ContainingASingleEntity as test_module

@ -13,7 +13,8 @@ def CreatePrefab_UnderAnEntity():
Test is successful if the new instanced prefab of the child has the parent entity id Test is successful if the new instanced prefab of the child has the parent entity id
""" """
CAR_PREFAB_FILE_NAME = 'car_prefab' from pathlib import Path
CAR_PREFAB_FILE_NAME = Path(__file__).stem + 'car_prefab'
from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.prefab_utils import Prefab from editor_python_test_tools.prefab_utils import Prefab

@ -7,7 +7,8 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
def CreatePrefab_WithSingleEntity(): def CreatePrefab_WithSingleEntity():
CAR_PREFAB_FILE_NAME = 'car_prefab' from pathlib import Path
CAR_PREFAB_FILE_NAME = Path(__file__).stem + 'car_prefab'
from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import Report

@ -7,7 +7,8 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
def DeletePrefab_ContainingASingleEntity(): def DeletePrefab_ContainingASingleEntity():
CAR_PREFAB_FILE_NAME = 'car_prefab' from pathlib import Path
CAR_PREFAB_FILE_NAME = Path(__file__).stem + 'car_prefab'
from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.prefab_utils import Prefab from editor_python_test_tools.prefab_utils import Prefab

@ -7,8 +7,9 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
def DetachPrefab_UnderAnotherPrefab(): def DetachPrefab_UnderAnotherPrefab():
CAR_PREFAB_FILE_NAME = 'car_prefab2' from pathlib import Path
WHEEL_PREFAB_FILE_NAME = 'wheel_prefab2' CAR_PREFAB_FILE_NAME = Path(__file__).stem + 'car_prefab'
WHEEL_PREFAB_FILE_NAME = Path(__file__).stem + 'wheel_prefab'
import editor_python_test_tools.pyside_utils as pyside_utils import editor_python_test_tools.pyside_utils as pyside_utils

@ -7,7 +7,8 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
def DuplicatePrefab_ContainingASingleEntity(): def DuplicatePrefab_ContainingASingleEntity():
CAR_PREFAB_FILE_NAME = 'car_prefab' from pathlib import Path
CAR_PREFAB_FILE_NAME = Path(__file__).stem + 'car_prefab'
from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.prefab_utils import Prefab from editor_python_test_tools.prefab_utils import Prefab

@ -0,0 +1,34 @@
"""
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
"""
def InstantiatePrefab_FromCreatedPrefabWithSingleEntity():
from pathlib import Path
CAR_PREFAB_FILE_NAME = Path(__file__).stem + 'car_prefab'
from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.utils import Report
from editor_python_test_tools.prefab_utils import Prefab
import Prefab.tests.PrefabTestUtils as prefab_test_utils
prefab_test_utils.open_base_tests_level()
# Creates a new entity at the root level
car_entity = EditorEntity.create_editor_entity()
car_prefab_entities = [car_entity]
# Creates a prefab from the new entity
car_prefab, car_prefab_instance = Prefab.create_prefab(car_prefab_entities, CAR_PREFAB_FILE_NAME)
# Instantiate another instance and verify
car_prefab_instance_2 = car_prefab.instantiate()
assert car_prefab_instance_2.is_valid(), "Failed to instantiate prefab"
if __name__ == "__main__":
from editor_python_test_tools.utils import Report
Report.start_test(InstantiatePrefab_FromCreatedPrefabWithSingleEntity)

@ -7,8 +7,9 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
def ReparentPrefab_UnderAnotherPrefab(): def ReparentPrefab_UnderAnotherPrefab():
CAR_PREFAB_FILE_NAME = 'car_prefab' from pathlib import Path
WHEEL_PREFAB_FILE_NAME = 'wheel_prefab' CAR_PREFAB_FILE_NAME = Path(__file__).stem + 'car_prefab'
WHEEL_PREFAB_FILE_NAME = Path(__file__).stem + 'wheel_prefab'
import editor_python_test_tools.pyside_utils as pyside_utils import editor_python_test_tools.pyside_utils as pyside_utils

@ -4,6 +4,7 @@ For complete copyright and license terms please see the LICENSE at the root of t
SPDX-License-Identifier: Apache-2.0 OR MIT SPDX-License-Identifier: Apache-2.0 OR MIT
""" """
class HeightTests: class HeightTests:
single_gradient_height_correct = ( single_gradient_height_correct = (
"Successfully retrieved height for gradient1.", "Successfully retrieved height for gradient1.",
@ -22,6 +23,7 @@ class HeightTests:
"OnTerrainDataChanged call count incorrect." "OnTerrainDataChanged call count incorrect."
) )
def TerrainHeightGradientList_AddRemoveGradientWorks(): def TerrainHeightGradientList_AddRemoveGradientWorks():
""" """
Summary: Summary:
@ -29,22 +31,16 @@ def TerrainHeightGradientList_AddRemoveGradientWorks():
:return: None :return: None
""" """
import os
import math as sys_math import math as sys_math
import azlmbr.legacy.general as general import azlmbr.legacy.general as general
import azlmbr.bus as bus import azlmbr.bus as bus
import azlmbr.math as math import azlmbr.math as math
import azlmbr.terrain as terrain import azlmbr.terrain as terrain
import azlmbr.editor as editor
import azlmbr.vegetation as vegetation
import azlmbr.entity as EntityId
import editor_python_test_tools.hydra_editor_utils as hydra import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import TestHelper as helper
import editor_python_test_tools.pyside_utils as pyside_utils
from editor_python_test_tools.editor_entity_utils import EditorEntity
terrain_changed_call_count = 0 terrain_changed_call_count = 0
expected_terrain_changed_calls = 0 expected_terrain_changed_calls = 0
@ -87,11 +83,8 @@ def TerrainHeightGradientList_AddRemoveGradientWorks():
Report.result(test_results, sys_math.isclose(height, expected_height, abs_tol=test_tolerance)) Report.result(test_results, sys_math.isclose(height, expected_height, abs_tol=test_tolerance))
helper.init_idle()
# Open a level. # Open a level.
helper.open_level("Physics", "Base") hydra.open_base_level()
helper.wait_for_condition(lambda: general.get_current_level_name() == "Base", 2.0)
general.idle_wait_frames(1) general.idle_wait_frames(1)
@ -138,6 +131,7 @@ def TerrainHeightGradientList_AddRemoveGradientWorks():
# Add gradient3, the height should still be the second value, as that was the highest. # Add gradient3, the height should still be the second value, as that was the highest.
set_gradients_check_height(main_entity, [gradient_entity1.id, gradient_entity2.id, gradient_entity3.id], aabb_height * gradient_values[1], HeightTests.triple_gradient_height_correct) set_gradients_check_height(main_entity, [gradient_entity1.id, gradient_entity2.id, gradient_entity3.id], aabb_height * gradient_values[1], HeightTests.triple_gradient_height_correct)
if __name__ == "__main__": if __name__ == "__main__":
from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import Report

@ -4,6 +4,7 @@ For complete copyright and license terms please see the LICENSE at the root of t
SPDX-License-Identifier: Apache-2.0 OR MIT SPDX-License-Identifier: Apache-2.0 OR MIT
""" """
class MacroMaterialTests: class MacroMaterialTests:
setup_test = ( setup_test = (
"Setup successful", "Setup successful",
@ -30,6 +31,7 @@ class MacroMaterialTests:
"Timed out waiting for OnTerrainMacroMaterialRegionChanged" "Timed out waiting for OnTerrainMacroMaterialRegionChanged"
) )
def TerrainMacroMaterialComponent_MacroMaterialActivates(): def TerrainMacroMaterialComponent_MacroMaterialActivates():
""" """
Summary: Summary:
@ -38,7 +40,6 @@ def TerrainMacroMaterialComponent_MacroMaterialActivates():
""" """
import os import os
import math as sys_math
import azlmbr.legacy.general as general import azlmbr.legacy.general as general
import azlmbr.asset as asset import azlmbr.asset as asset
@ -46,15 +47,11 @@ def TerrainMacroMaterialComponent_MacroMaterialActivates():
import azlmbr.math as math import azlmbr.math as math
import azlmbr.terrain as terrain import azlmbr.terrain as terrain
import azlmbr.editor as editor import azlmbr.editor as editor
import azlmbr.vegetation as vegetation
import azlmbr.entity as EntityId
import editor_python_test_tools.hydra_editor_utils as hydra import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import TestHelper as helper
import editor_python_test_tools.pyside_utils as pyside_utils
from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.asset_utils import Asset
material_created_called = False material_created_called = False
material_changed_called = False material_changed_called = False
@ -84,11 +81,8 @@ def TerrainMacroMaterialComponent_MacroMaterialActivates():
nonlocal material_destroyed_called nonlocal material_destroyed_called
material_destroyed_called = True material_destroyed_called = True
helper.init_idle()
# Open a level. # Open a level.
helper.open_level("Physics", "Base") hydra.open_base_level()
helper.wait_for_condition(lambda: general.get_current_level_name() == "Base", 2.0)
general.idle_wait_frames(1) general.idle_wait_frames(1)
@ -160,6 +154,7 @@ def TerrainMacroMaterialComponent_MacroMaterialActivates():
region_changed_call_result = helper.wait_for_condition(lambda: material_region_changed_called == True, 2.0) region_changed_call_result = helper.wait_for_condition(lambda: material_region_changed_called == True, 2.0)
Report.result(MacroMaterialTests.material_changed_call_on_aabb_change, region_changed_call_result) Report.result(MacroMaterialTests.material_changed_call_on_aabb_change, region_changed_call_result)
if __name__ == "__main__": if __name__ == "__main__":
from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import Report

@ -5,8 +5,9 @@ For complete copyright and license terms please see the LICENSE at the root of t
SPDX-License-Identifier: Apache-2.0 OR MIT SPDX-License-Identifier: Apache-2.0 OR MIT
""" """
#fmt: off #fmt: off
class Tests(): class Tests:
create_test_entity = ("Entity created successfully", "Failed to create Entity") create_test_entity = ("Entity created successfully", "Failed to create Entity")
add_axis_aligned_box_shape = ("Axis Aligned Box Shape component added", "Failed to add Axis Aligned Box Shape component") add_axis_aligned_box_shape = ("Axis Aligned Box Shape component added", "Failed to add Axis Aligned Box Shape component")
add_terrain_collider = ("Terrain Physics Heightfield Collider component added", "Failed to add a Terrain Physics Heightfield Collider component") add_terrain_collider = ("Terrain Physics Heightfield Collider component added", "Failed to add a Terrain Physics Heightfield Collider component")
@ -14,6 +15,7 @@ class Tests():
configuration_changed = ("Terrain size changed successfully", "Failed terrain size change") configuration_changed = ("Terrain size changed successfully", "Failed terrain size change")
#fmt: on #fmt: on
def TerrainPhysicsCollider_ChangesSizeWithAxisAlignedBoxShapeChanges(): def TerrainPhysicsCollider_ChangesSizeWithAxisAlignedBoxShapeChanges():
""" """
Summary: Summary:
@ -36,24 +38,24 @@ def TerrainPhysicsCollider_ChangesSizeWithAxisAlignedBoxShapeChanges():
:return: None :return: None
""" """
import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import TestHelper as helper
from editor_python_test_tools.utils import Report, Tracer from editor_python_test_tools.utils import Report, Tracer
import azlmbr.legacy.general as general
import azlmbr.physics as physics import azlmbr.physics as physics
import azlmbr.math as azmath import azlmbr.math as azmath
import azlmbr.bus as bus import azlmbr.bus as bus
import sys
import math import math
SET_BOX_X_SIZE = 5.0 SET_BOX_X_SIZE = 5.0
SET_BOX_Y_SIZE = 6.0 SET_BOX_Y_SIZE = 6.0
EXPECTED_COLUMN_SIZE = SET_BOX_X_SIZE + 1 EXPECTED_COLUMN_SIZE = SET_BOX_X_SIZE + 1
EXPECTED_ROW_SIZE = SET_BOX_Y_SIZE + 1 EXPECTED_ROW_SIZE = SET_BOX_Y_SIZE + 1
helper.init_idle()
# 1) Load the level # 1) Load the level
helper.open_level("", "Base") hydra.open_base_level()
# 2) Create test entity # 2) Create test entity
test_entity = EditorEntity.create_editor_entity("TestEntity") test_entity = EditorEntity.create_editor_entity("TestEntity")

@ -54,7 +54,6 @@ def TerrainSystem_VegetationSpawnsOnTerrainSurfaces():
""" """
import os import os
import sys
import math as sys_math import math as sys_math
import azlmbr.legacy.general as general import azlmbr.legacy.general as general
@ -62,10 +61,8 @@ def TerrainSystem_VegetationSpawnsOnTerrainSurfaces():
import azlmbr.math as math import azlmbr.math as math
import azlmbr.areasystem as areasystem import azlmbr.areasystem as areasystem
import azlmbr.editor as editor
import azlmbr.vegetation as vegetation import azlmbr.vegetation as vegetation
import azlmbr.terrain as terrain import azlmbr.terrain as terrain
import azlmbr.entity as EntityId
import azlmbr.surface_data as surface_data import azlmbr.surface_data as surface_data
import editor_python_test_tools.hydra_editor_utils as hydra import editor_python_test_tools.hydra_editor_utils as hydra
@ -86,11 +83,8 @@ def TerrainSystem_VegetationSpawnsOnTerrainSurfaces():
return highest_z, lowest_z return highest_z, lowest_z
helper.init_idle()
# Open an empty level. # Open an empty level.
helper.open_level("Physics", "Base") hydra.open_base_level()
helper.wait_for_condition(lambda: general.get_current_level_name() == "Base", 2.0)
general.idle_wait_frames(1) general.idle_wait_frames(1)
@ -208,6 +202,7 @@ def TerrainSystem_VegetationSpawnsOnTerrainSurfaces():
Report.result(VegetationTests.testTag3_excluded_vegetation_z_correct, highest_z < box_height * gradient_value_2) Report.result(VegetationTests.testTag3_excluded_vegetation_z_correct, highest_z < box_height * gradient_value_2)
if __name__ == "__main__": if __name__ == "__main__":
from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import Report

@ -5,8 +5,9 @@ For complete copyright and license terms please see the LICENSE at the root of t
SPDX-License-Identifier: Apache-2.0 OR MIT SPDX-License-Identifier: Apache-2.0 OR MIT
""" """
#fmt: off #fmt: off
class Tests(): class Tests:
create_terrain_spawner_entity = ("Terrain_spawner_entity created successfully", "Failed to create terrain_spawner_entity") create_terrain_spawner_entity = ("Terrain_spawner_entity created successfully", "Failed to create terrain_spawner_entity")
create_height_provider_entity = ("Height_provider_entity created successfully", "Failed to create height_provider_entity") create_height_provider_entity = ("Height_provider_entity created successfully", "Failed to create height_provider_entity")
create_test_ball = ("Ball created successfully", "Failed to create Ball") create_test_ball = ("Ball created successfully", "Failed to create Ball")
@ -19,6 +20,7 @@ class Tests():
no_errors_and_warnings_found = ("No errors and warnings found", "Found errors and warnings") no_errors_and_warnings_found = ("No errors and warnings found", "Found errors and warnings")
#fmt: on #fmt: on
def Terrain_SupportsPhysics(): def Terrain_SupportsPhysics():
""" """
Summary: Summary:
@ -46,8 +48,7 @@ def Terrain_SupportsPhysics():
:return: None :return: None
""" """
from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.utils import TestHelper as helper
from editor_python_test_tools.utils import TestHelper as helper, Report
from editor_python_test_tools.utils import Report, Tracer from editor_python_test_tools.utils import Report, Tracer
import editor_python_test_tools.hydra_editor_utils as hydra import editor_python_test_tools.hydra_editor_utils as hydra
import azlmbr.math as azmath import azlmbr.math as azmath
@ -60,11 +61,8 @@ def Terrain_SupportsPhysics():
SET_BOX_Y_SIZE = 1024.0 SET_BOX_Y_SIZE = 1024.0
SET_BOX_Z_SIZE = 100.0 SET_BOX_Z_SIZE = 100.0
helper.init_idle()
# 1) Load the level # 1) Load the level
helper.open_level("", "Base") hydra.open_base_level()
helper.wait_for_condition(lambda: general.get_current_level_name() == "Base", 2.0)
#1a) Load the level components #1a) Load the level components
hydra.add_level_component("Terrain World") hydra.add_level_component("Terrain World")

@ -47,8 +47,8 @@ def Terrain_World_ConfigurationWorks():
12) Check terrain does not exist at a known position outside the world 12) Check terrain does not exist at a known position outside the world
13) Check height value is the expected one when query resolution is changed 13) Check height value is the expected one when query resolution is changed
""" """
from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.utils import TestHelper as helper, Report from editor_python_test_tools.utils import TestHelper as helper
from editor_python_test_tools.utils import Report, Tracer from editor_python_test_tools.utils import Report, Tracer
import editor_python_test_tools.hydra_editor_utils as hydra import editor_python_test_tools.hydra_editor_utils as hydra
import azlmbr.math as azmath import azlmbr.math as azmath
@ -63,13 +63,10 @@ def Terrain_World_ConfigurationWorks():
SET_BOX_Z_SIZE = 100.0 SET_BOX_Z_SIZE = 100.0
CLAMP = 1 CLAMP = 1
helper.init_idle()
# 1) Start the Tracer to catch any errors and warnings # 1) Start the Tracer to catch any errors and warnings
with Tracer() as section_tracer: with Tracer() as section_tracer:
# 2) Load the level # 2) Load the level
helper.open_level("", "Base") hydra.open_base_level()
helper.wait_for_condition(lambda: general.get_current_level_name() == "Base", 2.0)
# 3) Load the level components # 3) Load the level components
terrain_world_component = hydra.add_level_component("Terrain World") terrain_world_component = hydra.add_level_component("Terrain World")
@ -93,7 +90,7 @@ def Terrain_World_ConfigurationWorks():
# 5) Set the base Terrain World values # 5) Set the base Terrain World values
world_bounds_max = azmath.Vector3(1100.0, 1100.0, 1100.0) world_bounds_max = azmath.Vector3(1100.0, 1100.0, 1100.0)
world_bounds_min = azmath.Vector3(10.0, 10.0, 10.0) world_bounds_min = azmath.Vector3(10.0, 10.0, 10.0)
height_query_resolution = azmath.Vector2(1.0, 1.0) height_query_resolution = 1.0
hydra.set_component_property_value(terrain_world_component, "Configuration|World Bounds (Max)", world_bounds_max) hydra.set_component_property_value(terrain_world_component, "Configuration|World Bounds (Max)", world_bounds_max)
hydra.set_component_property_value(terrain_world_component, "Configuration|World Bounds (Min)", world_bounds_min) hydra.set_component_property_value(terrain_world_component, "Configuration|World Bounds (Min)", world_bounds_min)
hydra.set_component_property_value(terrain_world_component, "Configuration|Height Query Resolution (m)", height_query_resolution) hydra.set_component_property_value(terrain_world_component, "Configuration|Height Query Resolution (m)", height_query_resolution)
@ -148,7 +145,7 @@ def Terrain_World_ConfigurationWorks():
# 13) Check height value is the expected one when query resolution is changed # 13) Check height value is the expected one when query resolution is changed
testpoint = terrain.TerrainDataRequestBus(bus.Broadcast, 'GetHeightFromFloats', 10.5, 10.5, CLAMP) testpoint = terrain.TerrainDataRequestBus(bus.Broadcast, 'GetHeightFromFloats', 10.5, 10.5, CLAMP)
height_query_resolution = azmath.Vector2(0.5, 0.5) height_query_resolution = 0.5
hydra.set_component_property_value(terrain_world_component, "Configuration|Height Query Resolution (m)", height_query_resolution) hydra.set_component_property_value(terrain_world_component, "Configuration|Height Query Resolution (m)", height_query_resolution)
general.idle_wait_frames(1) general.idle_wait_frames(1)
testpoint2 = terrain.TerrainDataRequestBus(bus.Broadcast, 'GetHeightFromFloats', 10.5, 10.5, CLAMP) testpoint2 = terrain.TerrainDataRequestBus(bus.Broadcast, 'GetHeightFromFloats', 10.5, 10.5, CLAMP)
@ -165,4 +162,3 @@ if __name__ == "__main__":
from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import Report
Report.start_test(Terrain_World_ConfigurationWorks) Report.start_test(Terrain_World_ConfigurationWorks)

@ -3,25 +3,18 @@ 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. For complete copyright and license terms please see the LICENSE at the root of this distribution.
SPDX-License-Identifier: Apache-2.0 OR MIT SPDX-License-Identifier: Apache-2.0 OR MIT
""" """
# This suite consists of all test cases that are passing and have been verified.
import pytest import pytest
import os
import sys
from ly_test_tools import LAUNCHERS
from ly_test_tools.o3de.editor_test import EditorTestSuite, EditorSharedTest from ly_test_tools.o3de.editor_test import EditorTestSuite, EditorSharedTest
@pytest.mark.SUITE_main @pytest.mark.SUITE_main
@pytest.mark.parametrize("launcher_platform", ['windows_editor']) @pytest.mark.parametrize("launcher_platform", ['windows_editor'])
@pytest.mark.parametrize("project", ["AutomatedTesting"]) @pytest.mark.parametrize("project", ["AutomatedTesting"])
class TestAutomation(EditorTestSuite): class TestAutomation(EditorTestSuite):
enable_prefab_system = False
class test_AxisAlignedBoxShape_ConfigurationWorks(EditorSharedTest): class test_AxisAlignedBoxShape_ConfigurationWorks(EditorSharedTest):
from .EditorScripts import TerrainPhysicsCollider_ChangesSizeWithAxisAlignedBoxShapeChanges as test_module from .EditorScripts import TerrainPhysicsCollider_ChangesSizeWithAxisAlignedBoxShapeChanges as test_module

@ -242,7 +242,7 @@ Node Type: BoneData
BasisX: < 1.000000, -0.000000, 0.000000> BasisX: < 1.000000, -0.000000, 0.000000>
BasisY: < 0.000000, 1.000000, 0.000000> BasisY: < 0.000000, 1.000000, 0.000000>
BasisZ: <-0.000000, -0.000000, 1.000000> BasisZ: <-0.000000, -0.000000, 1.000000>
Transl: < 0.152547, 0.043345, 0.090954> Transl: < 0.152547, 0.043345, 0.090955>
Node Name: animation Node Name: animation
Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.animation Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.animation
@ -544,7 +544,7 @@ Node Type: BoneData
Node Name: animation Node Name: animation
Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_upArmRoll.animation Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_upArmRoll.animation
Node Type: AnimationData Node Type: AnimationData
KeyFrames: Count 195. Hash: 8781707605519483934 KeyFrames: Count 195. Hash: 15529789169672670472
TimeStepBetweenFrames: 0.033333 TimeStepBetweenFrames: 0.033333
Node Name: transform Node Name: transform
@ -710,7 +710,7 @@ Node Type: BoneData
BasisX: < 0.514369, 0.855813, 0.054857> BasisX: < 0.514369, 0.855813, 0.054857>
BasisY: < 0.088153, 0.010863, -0.996047> BasisY: < 0.088153, 0.010863, -0.996047>
BasisZ: <-0.853026, 0.517172, -0.069855> BasisZ: <-0.853026, 0.517172, -0.069855>
Transl: <-0.247306, -0.062325, 0.878372> Transl: <-0.247306, -0.062325, 0.878373>
Node Name: animation Node Name: animation
Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_loArmRoll.animation Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_loArmRoll.animation
@ -857,7 +857,7 @@ Node Type: BoneData
BasisX: < 0.329257, 0.944038, -0.019538> BasisX: < 0.329257, 0.944038, -0.019538>
BasisY: < 0.465563, -0.180309, -0.866452> BasisY: < 0.465563, -0.180309, -0.866452>
BasisZ: <-0.821487, 0.276189, -0.498877> BasisZ: <-0.821487, 0.276189, -0.498877>
Transl: <-0.255124, -0.049696, 0.794466> Transl: <-0.255124, -0.049696, 0.794467>
Node Name: animation Node Name: animation
Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.animation Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.animation
@ -953,7 +953,7 @@ Node Type: BoneData
BasisX: <-0.102387, -0.418082, -0.902621> BasisX: <-0.102387, -0.418082, -0.902621>
BasisY: < 0.928150, 0.286271, -0.237880> BasisY: < 0.928150, 0.286271, -0.237880>
BasisZ: < 0.357847, -0.862123, 0.358732> BasisZ: < 0.357847, -0.862123, 0.358732>
Transl: < 0.187367, 0.698323, 1.467209> Transl: < 0.187367, 0.698324, 1.467209>
Node Name: animation Node Name: animation
Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1.animation Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1.animation

@ -114,7 +114,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.9225030 0.3829492 -0.0483544 -0.3849890 0.9218784 -0.0438619 0.0277800 0.0590787 0.9978667 -0.0995240 0.0035963 0.9837443" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.9225030 0.3829492 -0.0483544 -0.3849890 0.9218784 -0.0438619 0.0277800 0.0590787 0.9978667 -0.0995240 0.0035963 0.9837442" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -191,7 +191,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.9225030 0.3829492 -0.0483544 -0.3849890 0.9218784 -0.0438619 0.0277800 0.0590787 0.9978667 -0.1057190 -0.0095780 0.7612199" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.9225030 0.3829492 -0.0483544 -0.3849890 0.9218784 -0.0438619 0.0277800 0.0590787 0.9978667 -0.1057190 -0.0095780 0.7612200" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -204,7 +204,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.9225030 0.3829492 -0.0483545 -0.3857441 0.9101822 -0.1508971 -0.0137745 0.1578555 0.9873661 -0.1119141 -0.0227522 0.5386958" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.9225030 0.3829492 -0.0483545 -0.3857441 0.9101822 -0.1508971 -0.0137745 0.1578555 0.9873661 -0.1119141 -0.0227522 0.5386957" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -268,7 +268,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.9918931 -0.1127676 0.0585800 0.1181807 0.9880368 -0.0990792 -0.0467063 0.1051989 0.9933537 0.1314755 0.0908038 0.5390974" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.9918931 -0.1127676 0.0585800 0.1181807 0.9880368 -0.0990792 -0.0467063 0.1051989 0.9933537 0.1314754 0.0908038 0.5390974" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -319,7 +319,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.9846771 -0.1743657 -0.0027636 -0.0040787 0.0071844 0.9999658 -0.1743399 0.9846547 -0.0077855 -0.0024987 0.0198645 1.2316585" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.9846771 -0.1743657 -0.0027636 -0.0040787 0.0071844 0.9999658 -0.1743399 0.9846547 -0.0077855 -0.0024987 0.0198645 1.2316583" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -408,7 +408,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.9636059 0.2673270 0.0000002 -0.2673270 0.9636059 0.0000004 -0.0000001 -0.0000005 0.9999999 -0.1057001 -0.0939669 0.0932542" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.9636059 0.2673270 0.0000002 -0.2673270 0.9636059 0.0000004 -0.0000001 -0.0000005 0.9999999 -0.1057001 -0.0939668 0.0932542" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -497,7 +497,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="1.0000000 -0.0000001 0.0000001 0.0000001 1.0000000 0.0000005 -0.0000001 -0.0000005 1.0000000 0.1525467 0.0433452 0.0909544" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="1.0000000 -0.0000001 0.0000001 0.0000001 1.0000000 0.0000005 -0.0000001 -0.0000005 1.0000000 0.1525467 0.0433452 0.0909545" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -548,7 +548,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.9795371 -0.2012138 -0.0044671 0.0088889 -0.0654249 0.9978178 -0.2010670 0.9773599 0.0658747 -0.0031105 0.0209422 1.3816533" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.9795371 -0.2012138 -0.0044671 0.0088889 -0.0654249 0.9978178 -0.2010670 0.9773599 0.0658747 -0.0031105 0.0209422 1.3816534" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -650,7 +650,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="1.0000000 -0.0000001 0.0000001 0.0000001 1.0000000 0.0000005 -0.0000001 -0.0000005 1.0000000 0.1525467 0.1935186 0.0237662" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="1.0000000 -0.0000001 0.0000001 0.0000001 1.0000000 0.0000005 -0.0000001 -0.0000005 1.0000000 0.1525467 0.1935186 0.0237663" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -701,7 +701,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.9948647 -0.0988443 0.0217715 0.0113319 0.1049736 0.9944103 -0.1005772 0.9895505 -0.1033145 -0.0014216 0.0085115 1.5712386" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.9948647 -0.0988443 0.0217715 0.0113319 0.1049736 0.9944103 -0.1005772 0.9895505 -0.1033145 -0.0014216 0.0085115 1.5712385" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -727,7 +727,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3913002 -0.9108952 0.1309726 -0.9019646 -0.4078557 -0.1418229 0.1826037 -0.0626373 -0.9811893 0.0803188 0.0196155 1.4967986" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3913002 -0.9108952 0.1309726 -0.9019646 -0.4078557 -0.1418229 0.1826037 -0.0626373 -0.9811893 0.0803188 0.0196155 1.4967985" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -854,7 +854,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.9994818 -0.0310398 -0.0085214 -0.0078972 -0.0201766 0.9997651 -0.0312043 0.9993144 0.0199210 -0.0020550 0.0351172 1.6630899" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.9994818 -0.0310398 -0.0085214 -0.0078972 -0.0201766 0.9997651 -0.0312043 0.9993144 0.0199210 -0.0020550 0.0351172 1.6630900" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -905,7 +905,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.1350640 0.9784527 -0.1561655 0.9639030 0.0932519 -0.2493893 -0.2294530 -0.1842118 -0.9557285 -0.1881499 -0.0555908 1.4517218" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.1350640 0.9784527 -0.1561655 0.9639030 0.0932519 -0.2493893 -0.2294530 -0.1842118 -0.9557285 -0.1881499 -0.0555909 1.4517218" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1109,7 +1109,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.0534004 -0.3009000 -0.9521595 -0.9985610 0.0208024 0.0494289 0.0049341 0.9534288 -0.3015778 0.1978613 0.1747155 1.4348212" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.0534004 -0.3009000 -0.9521595 -0.9985610 0.0208024 0.0494289 0.0049341 0.9534288 -0.3015778 0.1978613 0.1747155 1.4348211" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1141,7 +1141,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="KeyFrames - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="KeyFrames - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="8781707605519483934" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="15529789169672670472" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -1415,7 +1415,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.9665319 -0.0616776 0.2490221 0.2565261 0.2200654 -0.9411510 0.0032468 0.9735332 0.2285221 -0.2390312 -0.0175187 0.9024240" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.9665319 -0.0616776 0.2490221 0.2565261 0.2200654 -0.9411510 0.0032468 0.9735332 0.2285221 -0.2390311 -0.0175187 0.9024240" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1441,7 +1441,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3292569 0.9440380 -0.0195383 0.1345730 -0.0673964 -0.9886089 -0.9346014 0.3228769 -0.1492327 -0.2613609 -0.0465721 0.8402831" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3292569 0.9440380 -0.0195383 0.1345730 -0.0673964 -0.9886089 -0.9346014 0.3228769 -0.1492327 -0.2613609 -0.0465721 0.8402832" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1454,7 +1454,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.5215136 0.8398412 -0.1506330 -0.0192358 -0.1649243 -0.9861184 -0.8530262 0.5171716 -0.0698552 -0.2693057 -0.0706829 0.8937123" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.5215136 0.8398412 -0.1506330 -0.0192358 -0.1649243 -0.9861184 -0.8530262 0.5171716 -0.0698552 -0.2693058 -0.0706829 0.8937123" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1467,7 +1467,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.5143689 0.8558125 0.0548569 0.0881534 0.0108630 -0.9960474 -0.8530262 0.5171716 -0.0698552 -0.2473062 -0.0623250 0.8783725" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.5143689 0.8558125 0.0548569 0.0881534 0.0108630 -0.9960474 -0.8530262 0.5171716 -0.0698552 -0.2473062 -0.0623250 0.8783726" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1569,7 +1569,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.0802934 -0.4308499 -0.8988443 0.5990614 -0.7415851 0.3019556 -0.7966672 -0.5142179 0.3176499 0.2168119 0.6618763 1.4820503" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.0802934 -0.4308499 -0.8988443 0.5990614 -0.7415851 0.3019556 -0.7966672 -0.5142179 0.3176499 0.2168119 0.6618764 1.4820503" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1582,7 +1582,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.0260422 -0.4643564 -0.8852653 0.9706670 -0.2234796 0.0886692 -0.2390129 -0.8569889 0.4565554 0.2131762 0.6597862 1.4626874" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.0260422 -0.4643564 -0.8852653 0.9706670 -0.2234796 0.0886692 -0.2390129 -0.8569889 0.4565554 0.2131762 0.6597863 1.4626874" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1608,7 +1608,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.0557957 -0.0005854 -0.9984418 -0.9981855 -0.0227144 -0.0557681 -0.0226463 0.9997417 -0.0018517 0.1809568 0.7018137 1.4945196" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.0557957 -0.0005854 -0.9984418 -0.9981855 -0.0227144 -0.0557681 -0.0226463 0.9997417 -0.0018517 0.1809568 0.7018138 1.4945196" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1659,7 +1659,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.9665319 -0.0616776 0.2490221 0.2373489 -0.1534441 -0.9592289 0.0973740 0.9862305 -0.1336694 -0.2288372 -0.0087736 0.8650238" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.9665319 -0.0616776 0.2490221 0.2373489 -0.1534441 -0.9592289 0.0973740 0.9862305 -0.1336694 -0.2288371 -0.0087736 0.8650237" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1710,7 +1710,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3615634 0.9298344 0.0684081 0.4901183 -0.1271389 -0.8623338 -0.7931304 0.3453165 -0.5016975 -0.2471175 -0.0273644 0.7929417" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3615634 0.9298344 0.0684081 0.4901183 -0.1271389 -0.8623338 -0.7931304 0.3453165 -0.5016975 -0.2471175 -0.0273644 0.7929418" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1761,7 +1761,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3292569 0.9440380 -0.0195383 0.4655626 -0.1803091 -0.8664525 -0.8214875 0.2761891 -0.4988768 -0.2551242 -0.0496955 0.7944664" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3292569 0.9440380 -0.0195383 0.4655626 -0.1803091 -0.8664525 -0.8214875 0.2761891 -0.4988768 -0.2551242 -0.0496955 0.7944666" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1812,7 +1812,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3559713 0.9329765 -0.0532857 0.1359657 -0.1081222 -0.9847956 -0.9245527 0.3433140 -0.1653412 -0.2679712 -0.0667890 0.8432873" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3559713 0.9329765 -0.0532857 0.1359657 -0.1081222 -0.9847956 -0.9245527 0.3433140 -0.1653412 -0.2679712 -0.0667891 0.8432874" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1825,7 +1825,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3169729 0.9297552 -0.1873048 0.2697999 -0.2777221 -0.9219966 -0.9092504 0.2417132 -0.3388780 -0.2744931 -0.0856099 0.8500432" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3169729 0.9297552 -0.1873048 0.2697999 -0.2777221 -0.9219966 -0.9092504 0.2417132 -0.3388780 -0.2744932 -0.0856099 0.8500431" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1914,7 +1914,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.0052020 0.3264090 0.9452143 0.5280435 -0.8035957 0.2745980 0.8492015 0.4976858 -0.1765385 0.1653490 0.6116705 1.5069345" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.0052020 0.3264090 0.9452143 0.5280435 -0.8035957 0.2745980 0.8492015 0.4976858 -0.1765385 0.1653489 0.6116704 1.5069345" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1965,7 +1965,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.1023873 -0.4180822 -0.9026206 0.9281499 0.2862708 -0.2378801 0.3578474 -0.8621231 0.3587325 0.1873666 0.6983235 1.4672089" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.1023873 -0.4180822 -0.9026206 0.9281499 0.2862708 -0.2378801 0.3578474 -0.8621231 0.3587325 0.1873666 0.6983237 1.4672090" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2067,7 +2067,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.0656088 -0.4626088 -0.8841316 0.9937954 -0.1100428 -0.0161683 -0.0898128 -0.8797066 0.4669581 0.1996420 0.6531383 1.4435714" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.0656088 -0.4626088 -0.8841316 0.9937954 -0.1100428 -0.0161683 -0.0898128 -0.8797066 0.4669581 0.1996421 0.6531384 1.4435714" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2169,7 +2169,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.9665319 -0.0616776 0.2490221 0.2373489 -0.1534441 -0.9592289 0.0973740 0.9862305 -0.1336694 -0.2218228 -0.0133082 0.8366759" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.9665319 -0.0616776 0.2490221 0.2373489 -0.1534441 -0.9592289 0.0973740 0.9862305 -0.1336694 -0.2218228 -0.0133083 0.8366759" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2220,7 +2220,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3615634 0.9298344 0.0684081 0.7452133 -0.2441212 -0.6205335 -0.5602937 0.2753409 -0.7811900 -0.2311346 -0.0315104 0.7648208" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3615634 0.9298344 0.0684081 0.7452133 -0.2441212 -0.6205335 -0.5602937 0.2753409 -0.7811900 -0.2311346 -0.0315104 0.7648209" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2271,7 +2271,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3292569 0.9440380 -0.0195383 0.7326652 -0.2684788 -0.6253964 -0.5956439 0.1916010 -0.7800621 -0.2399473 -0.0555735 0.7662210" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3292569 0.9440380 -0.0195383 0.7326652 -0.2684788 -0.6253964 -0.5956439 0.1916010 -0.7800621 -0.2399472 -0.0555734 0.7662212" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2322,7 +2322,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3559713 0.9329765 -0.0532857 0.5122607 -0.2425047 -0.8238812 -0.7815840 0.2659818 -0.5642518 -0.2625020 -0.0711384 0.8036732" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3559713 0.9329765 -0.0532857 0.5122607 -0.2425047 -0.8238812 -0.7815840 0.2659818 -0.5642518 -0.2625019 -0.0711384 0.8036732" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2373,7 +2373,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3169729 0.9297552 -0.1873048 0.6083978 -0.3508277 -0.7118790 -0.7275853 0.1116905 -0.6768638 -0.2653106 -0.0950621 0.8186633" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3169729 0.9297552 -0.1873048 0.6083978 -0.3508277 -0.7118790 -0.7275853 0.1116905 -0.6768638 -0.2653105 -0.0950620 0.8186634" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2475,7 +2475,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.1023873 -0.4180822 -0.9026206 0.0986766 0.8986452 -0.4274341 0.9898382 -0.1328314 -0.0507549 0.1570989 0.6889878 1.4749659" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.1023873 -0.4180822 -0.9026206 0.0986766 0.8986452 -0.4274341 0.9898382 -0.1328314 -0.0507549 0.1570989 0.6889879 1.4749659" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2526,7 +2526,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.0260422 -0.4643564 -0.8852653 -0.5639869 0.7379948 -0.3705161 0.8253731 0.4896291 -0.2811100 0.1495006 0.6467174 1.4714146" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.0260422 -0.4643564 -0.8852653 -0.5639869 0.7379948 -0.3705161 0.8253731 0.4896291 -0.2811100 0.1495006 0.6467175 1.4714146" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2628,7 +2628,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.1100348 -0.4672045 -0.8772753 0.2567038 0.8393306 -0.4791943 0.9602060 -0.2779281 0.0275776 0.1585392 0.6416523 1.4316828" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.1100348 -0.4672045 -0.8772753 0.2567038 0.8393306 -0.4791943 0.9602060 -0.2779281 0.0275776 0.1585393 0.6416522 1.4316828" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2793,7 +2793,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3559713 0.9329765 -0.0532857 0.7935058 -0.3318905 -0.5100955 -0.4935922 0.1392968 -0.8584654 -0.2455191 -0.0791781 0.7763593" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3559713 0.9329765 -0.0532857 0.7935058 -0.3318905 -0.5100955 -0.4935922 0.1392968 -0.8584654 -0.2455190 -0.0791781 0.7763594" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2844,7 +2844,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3169729 0.9297552 -0.1873048 0.8471319 -0.3663475 -0.3849116 -0.4264922 -0.0366653 -0.9037473 -0.2508485 -0.1034015 0.8017413" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3169729 0.9297552 -0.1873048 0.8471319 -0.3663475 -0.3849116 -0.4264922 -0.0366653 -0.9037473 -0.2508485 -0.1034015 0.8017412" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -3009,7 +3009,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.0656088 -0.4626088 -0.8841316 -0.8307251 0.5161862 -0.2084411 0.5528033 0.7207946 -0.4181670 0.1489982 0.6300828 1.4593928" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.0656088 -0.4626088 -0.8841316 -0.8307251 0.5161862 -0.2084411 0.5528033 0.7207946 -0.4181670 0.1489982 0.6300829 1.4593928" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>

@ -90,7 +90,7 @@ Node Path: RootNode.lodtest_lod1.lodtest_lod1_1
Node Type: MeshData Node Type: MeshData
Positions: Count 192. Hash: 1283526254311745349 Positions: Count 192. Hash: 1283526254311745349
Normals: Count 192. Hash: 1873340970602844856 Normals: Count 192. Hash: 1873340970602844856
FaceList: Count 124. Hash: 3728991722746136013 FaceList: Count 124. Hash: 8546457964849634958
FaceMaterialIds: Count 124. Hash: 2372486708814455910 FaceMaterialIds: Count 124. Hash: 2372486708814455910
Node Name: lodtest_lod1_2 Node Name: lodtest_lod1_2
@ -107,7 +107,7 @@ Node Path: RootNode.lodtest_lod1.lodtest_lod1_1_optimized
Node Type: MeshData Node Type: MeshData
Positions: Count 192. Hash: 7921557352486854444 Positions: Count 192. Hash: 7921557352486854444
Normals: Count 192. Hash: 1873340970602844856 Normals: Count 192. Hash: 1873340970602844856
FaceList: Count 124. Hash: 18311637590974204568 FaceList: Count 124. Hash: 7602933716150163115
FaceMaterialIds: Count 124. Hash: 2372486708814455910 FaceMaterialIds: Count 124. Hash: 2372486708814455910
Node Name: transform Node Name: transform
@ -641,14 +641,14 @@ Node Type: MaterialData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.lodtest_lod1.lodtest_lod1_1.TangentSet_0 Node Path: RootNode.lodtest_lod1.lodtest_lod1_1.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 192. Hash: 11165448242141781141 Tangents: Count 192. Hash: 13347865366302598201
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.lodtest_lod1.lodtest_lod1_1.BitangentSet_0 Node Path: RootNode.lodtest_lod1.lodtest_lod1_1.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 192. Hash: 7987814487334449536 Bitangents: Count 192. Hash: 11177881960262055002
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform
@ -705,14 +705,14 @@ Node Type: MeshVertexUVData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.lodtest_lod1.lodtest_lod1_1_optimized.TangentSet_0 Node Path: RootNode.lodtest_lod1.lodtest_lod1_1_optimized.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 192. Hash: 7293001660047850407 Tangents: Count 192. Hash: 13256424469303674766
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.lodtest_lod1.lodtest_lod1_1_optimized.BitangentSet_0 Node Path: RootNode.lodtest_lod1.lodtest_lod1_1_optimized.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 192. Hash: 2874689498270494796 Bitangents: Count 192. Hash: 12542581737782433115
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform

@ -424,7 +424,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="3728991722746136013" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="8546457964849634958" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -492,7 +492,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="18311637590974204568" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="7602933716150163115" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -1729,7 +1729,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="11165448242141781141" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="13347865366302598201" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -1760,7 +1760,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="7987814487334449536" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="11177881960262055002" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -1891,7 +1891,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="7293001660047850407" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="13256424469303674766" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -1922,7 +1922,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="2874689498270494796" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="12542581737782433115" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">

@ -15,7 +15,7 @@ Node Path: RootNode.Cone.Cone_1
Node Type: MeshData Node Type: MeshData
Positions: Count 128. Hash: 7714223793259938211 Positions: Count 128. Hash: 7714223793259938211
Normals: Count 128. Hash: 2352668179264002707 Normals: Count 128. Hash: 2352668179264002707
FaceList: Count 62. Hash: 14563017593520122982 FaceList: Count 62. Hash: 9996709738915796379
FaceMaterialIds: Count 62. Hash: 12234218120113875284 FaceMaterialIds: Count 62. Hash: 12234218120113875284
Node Name: Cone_2 Node Name: Cone_2
@ -32,7 +32,7 @@ Node Path: RootNode.Cone.Cone_1_optimized
Node Type: MeshData Node Type: MeshData
Positions: Count 128. Hash: 10174710861731544050 Positions: Count 128. Hash: 10174710861731544050
Normals: Count 128. Hash: 2352668179264002707 Normals: Count 128. Hash: 2352668179264002707
FaceList: Count 62. Hash: 11332459830831720586 FaceList: Count 62. Hash: 16809217014760075539
FaceMaterialIds: Count 62. Hash: 12234218120113875284 FaceMaterialIds: Count 62. Hash: 12234218120113875284
Node Name: Cube_phys_1 Node Name: Cube_phys_1
@ -100,14 +100,14 @@ Node Type: MaterialData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cone.Cone_1.TangentSet_0 Node Path: RootNode.Cone.Cone_1.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 128. Hash: 14351734474754285313 Tangents: Count 128. Hash: 913385441694195840
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cone.Cone_1.BitangentSet_0 Node Path: RootNode.Cone.Cone_1.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 128. Hash: 15997251922861304891 Bitangents: Count 128. Hash: 16763868708150748964
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform
@ -164,14 +164,14 @@ Node Type: MeshVertexUVData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cone.Cone_1_optimized.TangentSet_0 Node Path: RootNode.Cone.Cone_1_optimized.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 128. Hash: 12937806066914201637 Tangents: Count 128. Hash: 11496565252852403390
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cone.Cone_1_optimized.BitangentSet_0 Node Path: RootNode.Cone.Cone_1_optimized.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 128. Hash: 873786942732834087 Bitangents: Count 128. Hash: 6810649909977646014
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform

@ -55,7 +55,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="14563017593520122982" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="9996709738915796379" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -123,7 +123,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="11332459830831720586" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="16809217014760075539" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -309,7 +309,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="14351734474754285313" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="913385441694195840" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -340,7 +340,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="15997251922861304891" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="16763868708150748964" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -471,7 +471,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="12937806066914201637" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="11496565252852403390" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -502,7 +502,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="873786942732834087" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="6810649909977646014" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">

@ -40,7 +40,7 @@ Node Path: RootNode.Cone.Cone_1
Node Type: MeshData Node Type: MeshData
Positions: Count 128. Hash: 12506421592104186200 Positions: Count 128. Hash: 12506421592104186200
Normals: Count 128. Hash: 367461522682321485 Normals: Count 128. Hash: 367461522682321485
FaceList: Count 62. Hash: 13208951979626973193 FaceList: Count 62. Hash: 5910399941817424750
FaceMaterialIds: Count 62. Hash: 15454348664434923102 FaceMaterialIds: Count 62. Hash: 15454348664434923102
Node Name: Cone_2 Node Name: Cone_2
@ -57,7 +57,7 @@ Node Path: RootNode.Cone.Cone_1_optimized
Node Type: MeshData Node Type: MeshData
Positions: Count 128. Hash: 14946490408303214595 Positions: Count 128. Hash: 14946490408303214595
Normals: Count 128. Hash: 367461522682321485 Normals: Count 128. Hash: 367461522682321485
FaceList: Count 62. Hash: 11102693598481718079 FaceList: Count 62. Hash: 17210030509394354449
FaceMaterialIds: Count 62. Hash: 15454348664434923102 FaceMaterialIds: Count 62. Hash: 15454348664434923102
Node Name: transform Node Name: transform
@ -389,14 +389,14 @@ Node Type: MaterialData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cone.Cone_1.TangentSet_0 Node Path: RootNode.Cone.Cone_1.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 128. Hash: 12695232913942738512 Tangents: Count 128. Hash: 11574815809363656385
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cone.Cone_1.BitangentSet_0 Node Path: RootNode.Cone.Cone_1.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 128. Hash: 9034210764777745751 Bitangents: Count 128. Hash: 1026129762512670051
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform
@ -483,14 +483,14 @@ Node Type: MeshVertexUVData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cone.Cone_1_optimized.TangentSet_0 Node Path: RootNode.Cone.Cone_1_optimized.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 128. Hash: 10740776669168782230 Tangents: Count 128. Hash: 5198081677141836233
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cone.Cone_1_optimized.BitangentSet_0 Node Path: RootNode.Cone.Cone_1_optimized.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 128. Hash: 6990068477421150065 Bitangents: Count 128. Hash: 6948605204859680167
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform

@ -178,7 +178,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="13208951979626973193" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="5910399941817424750" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -246,7 +246,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="11102693598481718079" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="17210030509394354449" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -957,7 +957,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="12695232913942738512" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="11574815809363656385" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -988,7 +988,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="9034210764777745751" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="1026129762512670051" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -1174,7 +1174,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="10740776669168782230" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="5198081677141836233" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -1205,7 +1205,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="6990068477421150065" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="6948605204859680167" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">

@ -40,7 +40,7 @@ Node Path: RootNode.Cylinder.Cylinder_1
Node Type: MeshData Node Type: MeshData
Positions: Count 192. Hash: 1283526254311745349 Positions: Count 192. Hash: 1283526254311745349
Normals: Count 192. Hash: 1873340970602844856 Normals: Count 192. Hash: 1873340970602844856
FaceList: Count 124. Hash: 3728991722746136013 FaceList: Count 124. Hash: 8546457964849634958
FaceMaterialIds: Count 124. Hash: 2372486708814455910 FaceMaterialIds: Count 124. Hash: 2372486708814455910
Node Name: Cylinder_2 Node Name: Cylinder_2
@ -57,7 +57,7 @@ Node Path: RootNode.Cylinder.Cylinder_1_optimized
Node Type: MeshData Node Type: MeshData
Positions: Count 192. Hash: 7921557352486854444 Positions: Count 192. Hash: 7921557352486854444
Normals: Count 192. Hash: 1873340970602844856 Normals: Count 192. Hash: 1873340970602844856
FaceList: Count 124. Hash: 18311637590974204568 FaceList: Count 124. Hash: 7602933716150163115
FaceMaterialIds: Count 124. Hash: 2372486708814455910 FaceMaterialIds: Count 124. Hash: 2372486708814455910
Node Name: transform Node Name: transform
@ -269,14 +269,14 @@ Node Type: MaterialData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 192. Hash: 11165448242141781141 Tangents: Count 192. Hash: 13347865366302598201
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 192. Hash: 7987814487334449536 Bitangents: Count 192. Hash: 11177881960262055002
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform
@ -333,14 +333,14 @@ Node Type: MeshVertexUVData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1_optimized.TangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1_optimized.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 192. Hash: 7293001660047850407 Tangents: Count 192. Hash: 13256424469303674766
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1_optimized.BitangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1_optimized.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 192. Hash: 2874689498270494796 Bitangents: Count 192. Hash: 12542581737782433115
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform

@ -178,7 +178,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="3728991722746136013" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="8546457964849634958" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -246,7 +246,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="18311637590974204568" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="7602933716150163115" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -737,7 +737,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="11165448242141781141" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="13347865366302598201" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -768,7 +768,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="7987814487334449536" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="11177881960262055002" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -899,7 +899,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="7293001660047850407" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="13256424469303674766" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -930,7 +930,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="2874689498270494796" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="12542581737782433115" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">

@ -40,7 +40,7 @@ Node Path: RootNode.Cylinder.Cylinder_1
Node Type: MeshData Node Type: MeshData
Positions: Count 192. Hash: 1283526254311745349 Positions: Count 192. Hash: 1283526254311745349
Normals: Count 192. Hash: 1873340970602844856 Normals: Count 192. Hash: 1873340970602844856
FaceList: Count 124. Hash: 3728991722746136013 FaceList: Count 124. Hash: 8546457964849634958
FaceMaterialIds: Count 124. Hash: 2372486708814455910 FaceMaterialIds: Count 124. Hash: 2372486708814455910
Node Name: Cylinder_2 Node Name: Cylinder_2
@ -57,7 +57,7 @@ Node Path: RootNode.Cylinder.Cylinder_1_optimized
Node Type: MeshData Node Type: MeshData
Positions: Count 192. Hash: 7921557352486854444 Positions: Count 192. Hash: 7921557352486854444
Normals: Count 192. Hash: 1873340970602844856 Normals: Count 192. Hash: 1873340970602844856
FaceList: Count 124. Hash: 18311637590974204568 FaceList: Count 124. Hash: 7602933716150163115
FaceMaterialIds: Count 124. Hash: 2372486708814455910 FaceMaterialIds: Count 124. Hash: 2372486708814455910
Node Name: transform Node Name: transform
@ -269,14 +269,14 @@ Node Type: MaterialData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 192. Hash: 11165448242141781141 Tangents: Count 192. Hash: 13347865366302598201
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 192. Hash: 7987814487334449536 Bitangents: Count 192. Hash: 11177881960262055002
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform
@ -333,14 +333,14 @@ Node Type: MeshVertexUVData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1_optimized.TangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1_optimized.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 192. Hash: 7293001660047850407 Tangents: Count 192. Hash: 13256424469303674766
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1_optimized.BitangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1_optimized.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 192. Hash: 2874689498270494796 Bitangents: Count 192. Hash: 12542581737782433115
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform

@ -178,7 +178,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="3728991722746136013" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="8546457964849634958" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -246,7 +246,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="18311637590974204568" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="7602933716150163115" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -737,7 +737,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="11165448242141781141" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="13347865366302598201" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -768,7 +768,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="7987814487334449536" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="11177881960262055002" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -899,7 +899,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="7293001660047850407" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="13256424469303674766" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -930,7 +930,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="2874689498270494796" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="12542581737782433115" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">

@ -40,7 +40,7 @@ Node Path: RootNode.Cylinder.Cylinder_1
Node Type: MeshData Node Type: MeshData
Positions: Count 192. Hash: 1283526254311745349 Positions: Count 192. Hash: 1283526254311745349
Normals: Count 192. Hash: 1873340970602844856 Normals: Count 192. Hash: 1873340970602844856
FaceList: Count 124. Hash: 3728991722746136013 FaceList: Count 124. Hash: 8546457964849634958
FaceMaterialIds: Count 124. Hash: 2372486708814455910 FaceMaterialIds: Count 124. Hash: 2372486708814455910
Node Name: Cylinder_2 Node Name: Cylinder_2
@ -261,14 +261,14 @@ Node Type: MaterialData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 192. Hash: 11165448242141781141 Tangents: Count 192. Hash: 13347865366302598201
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 192. Hash: 7987814487334449536 Bitangents: Count 192. Hash: 11177881960262055002
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform

@ -178,7 +178,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="3728991722746136013" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="8546457964849634958" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -682,7 +682,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="11165448242141781141" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="13347865366302598201" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -713,7 +713,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="7987814487334449536" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="11177881960262055002" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">

@ -78,7 +78,7 @@ class TestAutomationBase:
file_system.restore_backup(workspace.paths.editor_log(), workspace.paths.project_log()) file_system.restore_backup(workspace.paths.editor_log(), workspace.paths.project_log())
except FileNotFoundError as e: except FileNotFoundError as e:
self.logger.debug(f"File restoration failed, editor log could not be found.\nError: {e}") self.logger.debug(f"File restoration failed, editor log could not be found.\nError: {e}")
editor.kill() editor.stop()
request.addfinalizer(teardown) request.addfinalizer(teardown)
@ -113,7 +113,7 @@ class TestAutomationBase:
editor.wait(TestAutomationBase.MAX_TIMEOUT) editor.wait(TestAutomationBase.MAX_TIMEOUT)
except WaitTimeoutError: except WaitTimeoutError:
errors.append(TestRunError("TIMEOUT", f"Editor did not close after {TestAutomationBase.MAX_TIMEOUT} seconds, verify the test is ending and the application didn't freeze")) errors.append(TestRunError("TIMEOUT", f"Editor did not close after {TestAutomationBase.MAX_TIMEOUT} seconds, verify the test is ending and the application didn't freeze"))
editor.kill() editor.stop()
output = editor.get_output() output = editor.get_output()
self.logger.debug("Test output:\n" + output) self.logger.debug("Test output:\n" + output)

@ -19,12 +19,16 @@ def find_nodes_matching_entity_component(component_name, entity_id):
:param entity_id: The entity ID to search for the given component node on :param entity_id: The entity ID to search for the given component node on
:return List of matching nodes :return List of matching nodes
""" """
component_type_id = hydra.get_component_type_id(component_name)
component = editor.EditorComponentAPIBus(bus.Broadcast, 'GetComponentOfType', entity_id, component = editor.EditorComponentAPIBus(bus.Broadcast, 'GetComponentOfType', entity_id,
hydra.get_component_type_id(component_name)) component_type_id)
if component.IsSuccess(): if component.IsSuccess():
component_id = component.GetValue() component_id = component.GetValue()
component_node = landscapecanvas.LandscapeCanvasRequestBus(bus.Broadcast, 'GetAllNodesMatchingEntityComponent', component_node = landscapecanvas.LandscapeCanvasRequestBus(bus.Broadcast, 'GetAllNodesMatchingEntityComponent',
component_id) component_id)
if component_node: if component_node:
print(f"{component_name} node found on entity {entity_id.ToString()}") print(f"{component_name} node found on entity {entity_id.ToString()}")
else:
print(f"Failed to find {component_name} node on entity {entity_id.ToString()}")
return component_node return component_node

@ -32,13 +32,13 @@ def Menus_FileMenuOptions_Work():
file_menu_options = [ file_menu_options = [
("New Level",), ("New Level",),
#("Open Level",), Temporarily disabled due to https://github.com/o3de/o3de/issues/6605 ("Open Level",),
#("Import",), Temporarily disabled due to https://github.com/o3de/o3de/issues/6746 #("Import",), #Temporarily disabled due to https://github.com/o3de/o3de/issues/6746
("Save",), ("Save",),
#("Save As",), Temporarily disabled due to https://github.com/o3de/o3de/issues/6605 ("Save As",),
("Save Level Statistics",), ("Save Level Statistics",),
("Edit Project Settings",), ("Edit Project Settings",),
#("Edit Platform Settings",), Temporarily disabled due to https://github.com/o3de/o3de/issues/6604 ("Edit Platform Settings",),
("New Project",), ("New Project",),
("Open Project",), ("Open Project",),
("Show Log File",), ("Show Log File",),

@ -14,7 +14,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
NAME AutomatedTesting::DynamicVegetationTests_Main_Optimized NAME AutomatedTesting::DynamicVegetationTests_Main_Optimized
TEST_SERIAL TEST_SERIAL
TEST_SUITE main TEST_SUITE main
PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg/TestSuite_Main_Optimized.py PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg/TestSuite_Main.py
RUNTIME_DEPENDENCIES RUNTIME_DEPENDENCIES
AZ::AssetProcessor AZ::AssetProcessor
Legacy::Editor Legacy::Editor
@ -27,7 +27,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
NAME AutomatedTesting::DynamicVegetationTests_Periodic_Optimized NAME AutomatedTesting::DynamicVegetationTests_Periodic_Optimized
TEST_SERIAL TEST_SERIAL
TEST_SUITE periodic TEST_SUITE periodic
PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg/TestSuite_Periodic_Optimized.py PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg/TestSuite_Periodic.py
RUNTIME_DEPENDENCIES RUNTIME_DEPENDENCIES
AZ::AssetProcessor AZ::AssetProcessor
Legacy::Editor Legacy::Editor
@ -43,7 +43,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
NAME AutomatedTesting::LandscapeCanvasTests_Main_Optimized NAME AutomatedTesting::LandscapeCanvasTests_Main_Optimized
TEST_SERIAL TEST_SERIAL
TEST_SUITE main TEST_SUITE main
PATH ${CMAKE_CURRENT_LIST_DIR}/landscape_canvas/TestSuite_Main_Optimized.py PATH ${CMAKE_CURRENT_LIST_DIR}/landscape_canvas/TestSuite_Main.py
RUNTIME_DEPENDENCIES RUNTIME_DEPENDENCIES
AZ::AssetProcessor AZ::AssetProcessor
Legacy::Editor Legacy::Editor
@ -58,7 +58,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
NAME AutomatedTesting::GradientSignalTests_Periodic_Optimized NAME AutomatedTesting::GradientSignalTests_Periodic_Optimized
TEST_SERIAL TEST_SERIAL
TEST_SUITE periodic TEST_SUITE periodic
PATH ${CMAKE_CURRENT_LIST_DIR}/gradient_signal/TestSuite_Periodic_Optimized.py PATH ${CMAKE_CURRENT_LIST_DIR}/gradient_signal/TestSuite_Periodic.py
RUNTIME_DEPENDENCIES RUNTIME_DEPENDENCIES
AZ::AssetProcessor AZ::AssetProcessor
Legacy::Editor Legacy::Editor

@ -51,22 +51,18 @@ def AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude():
import os import os
import azlmbr.asset as asset
import azlmbr.editor as editor import azlmbr.editor as editor
import azlmbr.legacy.general as general import azlmbr.legacy.general as general
import azlmbr.bus as bus import azlmbr.bus as bus
import azlmbr.math as math import azlmbr.math as math
import azlmbr.prefab as prefab
import editor_python_test_tools.hydra_editor_utils as hydra import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.prefab_utils import Prefab
from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg
from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level # 1) Open an existing simple level
helper.init_idle() hydra.open_base_level()
helper.open_level("", "Base")
# Set view of planting area for visual debugging # Set view of planting area for visual debugging
general.set_current_view_position(512.0, 500.0, 38.0) general.set_current_view_position(512.0, 500.0, 38.0)
@ -76,9 +72,9 @@ def AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude():
center_point = math.Vector3(512.0, 512.0, 32.0) center_point = math.Vector3(512.0, 512.0, 32.0)
flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel") flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
flower_prefab = dynveg.create_temp_mesh_prefab(flower_asset_path, "PinkFlower")[0] flower_prefab = dynveg.create_temp_mesh_prefab(flower_asset_path, "AltFilter_PinkFlower")[0]
spawner_entity = dynveg.create_prefab_vegetation_area("Instance Spawner", center_point, 32.0, 32.0, 32.0, flower_prefab) spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", center_point, 32.0, 32.0, 32.0, flower_prefab)
# Add a Vegetation Altitude Filter # Add a Vegetation Altitude Filter
spawner_entity.add_component("Vegetation Altitude Filter") spawner_entity.add_component("Vegetation Altitude Filter")

@ -32,9 +32,7 @@ def AltitudeFilter_FilterStageToggle():
import os import os
import azlmbr.legacy.general as general import azlmbr.legacy.general as general
import azlmbr.bus as bus
import azlmbr.math as math import azlmbr.math as math
import azlmbr.prefab as prefab
import editor_python_test_tools.hydra_editor_utils as hydra import editor_python_test_tools.hydra_editor_utils as hydra
from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg
@ -45,17 +43,16 @@ def AltitudeFilter_FilterStageToggle():
POSTPROCESS_INSTANCE_COUNT = 34 POSTPROCESS_INSTANCE_COUNT = 34
# Open an existing simple level # Open an existing simple level
helper.init_idle() hydra.open_base_level()
helper.open_level("", "Base")
general.set_current_view_position(512.0, 480.0, 38.0) general.set_current_view_position(512.0, 480.0, 38.0)
# Create basic vegetation entity # Create basic vegetation entity
position = math.Vector3(512.0, 512.0, 32.0) position = math.Vector3(512.0, 512.0, 32.0)
flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel") flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
flower_prefab = dynveg.create_temp_mesh_prefab(flower_asset_path, "PinkFlower")[0] flower_prefab = dynveg.create_temp_mesh_prefab(flower_asset_path, "AltFilter_PinkFlower2")[0]
vegetation = dynveg.create_prefab_vegetation_area("vegetation", position, 16.0, 16.0, 16.0, flower_prefab) vegetation = dynveg.create_temp_prefab_vegetation_area("vegetation", position, 16.0, 16.0, 16.0, flower_prefab)
# Add a Vegetation Altitude Filter to the vegetation area entity # Add a Vegetation Altitude Filter to the vegetation area entity
vegetation.add_component("Vegetation Altitude Filter") vegetation.add_component("Vegetation Altitude Filter")

@ -56,8 +56,7 @@ def AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude():
from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level # 1) Open an existing simple level
helper.init_idle() hydra.open_base_level()
helper.open_level("", "Base")
# Set view of planting area for visual debugging # Set view of planting area for visual debugging
general.set_current_view_position(512.0, 500.0, 38.0) general.set_current_view_position(512.0, 500.0, 38.0)
@ -67,9 +66,9 @@ def AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude():
center_point = math.Vector3(512.0, 512.0, 32.0) center_point = math.Vector3(512.0, 512.0, 32.0)
flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel") flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
flower_prefab = dynveg.create_temp_mesh_prefab(flower_asset_path, "PinkFlower")[0] flower_prefab = dynveg.create_temp_mesh_prefab(flower_asset_path, "AltFilter_PinkFlower3")[0]
spawner_entity = dynveg.create_prefab_vegetation_area("Instance Spawner", center_point, 16.0, 16.0, 16.0, flower_prefab) spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", center_point, 16.0, 16.0, 16.0, flower_prefab)
# Add a Vegetation Altitude Filter # Add a Vegetation Altitude Filter
spawner_entity.add_component("Vegetation Altitude Filter") spawner_entity.add_component("Vegetation Altitude Filter")

@ -56,19 +56,21 @@ def AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea():
""" """
import os import os
from pathlib import Path
import azlmbr.bus as bus import azlmbr.bus as bus
import azlmbr.editor as editor import azlmbr.editor as editor
import azlmbr.legacy.general as general import azlmbr.legacy.general as general
import azlmbr.math as math import azlmbr.math as math
import azlmbr.vegetation as vegetation import azlmbr.vegetation as vegetation
import azlmbr.prefab as prefab
import editor_python_test_tools.hydra_editor_utils as hydra import editor_python_test_tools.hydra_editor_utils as hydra
from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg
from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import TestHelper as helper
def create_asset_list_entity(name, center, dynamic_slice_asset_path): def create_asset_list_entity(name, center, target_prefab):
asset_list_entity = hydra.Entity(name) asset_list_entity = hydra.Entity(name)
asset_list_entity.create_entity( asset_list_entity.create_entity(
center, center,
@ -77,18 +79,34 @@ def AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea():
if asset_list_entity.id.IsValid(): if asset_list_entity.id.IsValid():
print(f"'{asset_list_entity.name}' created") print(f"'{asset_list_entity.name}' created")
# Set the Asset List to a Dynamic Slice spawner with a specific slice asset selected if target_prefab:
dynamic_slice_spawner = vegetation.DynamicSliceInstanceSpawner() # Get the in-memory spawnable asset id if exists
dynamic_slice_spawner.SetSliceAssetPath(dynamic_slice_asset_path) spawnable_name = Path(target_prefab.file_path).stem
spawnable_asset_id = prefab.PrefabPublicRequestBus(bus.Broadcast, 'GetInMemorySpawnableAssetId',
spawnable_name)
# Create the in-memory spawnable asset from given prefab if the spawnable does not exist
if not spawnable_asset_id.is_valid():
create_spawnable_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'CreateInMemorySpawnableAsset',
target_prefab.file_path,
spawnable_name)
assert create_spawnable_result.IsSuccess(), \
f"Prefab operation 'CreateInMemorySpawnableAssets' failed. Error: {create_spawnable_result.GetError()}"
spawnable_asset_id = create_spawnable_result.GetValue()
else:
spawnable_asset_id = None
# Set the vegetation area to a prefab instance spawner with a specific prefab asset selected
descriptor = hydra.get_component_property_value(asset_list_entity.components[0], descriptor = hydra.get_component_property_value(asset_list_entity.components[0],
"Configuration|Embedded Assets|[0]") 'Configuration|Embedded Assets|[0]')
descriptor.spawner = dynamic_slice_spawner prefab_spawner = vegetation.PrefabInstanceSpawner()
prefab_spawner.SetPrefabAssetId(spawnable_asset_id)
descriptor.spawner = prefab_spawner
asset_list_entity.get_set_test(0, "Configuration|Embedded Assets|[0]", descriptor) asset_list_entity.get_set_test(0, "Configuration|Embedded Assets|[0]", descriptor)
return asset_list_entity return asset_list_entity
# 1) Open an existing simple level # 1) Open an existing simple level
helper.init_idle() hydra.open_base_level()
helper.open_level("Physics", "Base")
# Set view of planting area for visual debugging # Set view of planting area for visual debugging
general.set_current_view_position(512.0, 500.0, 38.0) general.set_current_view_position(512.0, 500.0, 38.0)
@ -96,11 +114,13 @@ def AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea():
# 2) Create 3 entities with Vegetation Asset List components set to spawn different descriptors # 2) Create 3 entities with Vegetation Asset List components set to spawn different descriptors
center_point = math.Vector3(512.0, 512.0, 32.0) center_point = math.Vector3(512.0, 512.0, 32.0)
asset_path = os.path.join("Slices", "PinkFlower.dynamicslice") pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
asset_path2 = os.path.join("Slices", "PurpleFlower.dynamicslice") pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "AssetList_PinkFlower")[0]
asset_list_entity = create_asset_list_entity("Asset List 1", center_point, asset_path) purple_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
purple_flower_prefab = dynveg.create_temp_mesh_prefab(purple_flower_asset_path, "AssetList_PurpleFlower")[0]
asset_list_entity = create_asset_list_entity("Asset List 1", center_point, pink_flower_prefab)
asset_list_entity2 = create_asset_list_entity("Asset List 2", center_point, None) asset_list_entity2 = create_asset_list_entity("Asset List 2", center_point, None)
asset_list_entity3 = create_asset_list_entity("Asset List 3", center_point, asset_path2) asset_list_entity3 = create_asset_list_entity("Asset List 3", center_point, purple_flower_prefab)
# 3) Create a planting surface and add a Vegetation System Settings level component with instances set to spawn # 3) Create a planting surface and add a Vegetation System Settings level component with instances set to spawn
# on center instead of corner # on center instead of corner

@ -56,8 +56,7 @@ def AssetWeightSelector_InstancesExpressBasedOnWeight():
from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level # 1) Open an existing simple level
helper.init_idle() hydra.open_base_level()
helper.open_level("Physics", "Base")
# Set view of planting area for visual debugging # Set view of planting area for visual debugging
general.set_current_view_position(512.0, 500.0, 38.0) general.set_current_view_position(512.0, 500.0, 38.0)
@ -66,14 +65,15 @@ def AssetWeightSelector_InstancesExpressBasedOnWeight():
# 2) Create a new instance spawner entity with multiple Dynamic Slice Instance Spawner descriptors, one set to a # 2) Create a new instance spawner entity with multiple Dynamic Slice Instance Spawner descriptors, one set to a
# valid slice entity, and one set to None # valid slice entity, and one set to None
spawner_center_point = math.Vector3(512.0, 512.0, 32.0) spawner_center_point = math.Vector3(512.0, 512.0, 32.0)
asset_path = os.path.join("Slices", "PinkFlower.dynamicslice") pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0, 16.0, pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "AssetWeight_PinkFlower")[0]
asset_path) spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0, 16.0,
pink_flower_prefab)
desc_asset = hydra.get_component_property_value(spawner_entity.components[2], desc_asset = hydra.get_component_property_value(spawner_entity.components[2],
"Configuration|Embedded Assets")[0] "Configuration|Embedded Assets")[0]
desc_list = [desc_asset, desc_asset] desc_list = [desc_asset, desc_asset]
spawner_entity.get_set_test(2, "Configuration|Embedded Assets", desc_list) spawner_entity.get_set_test(2, "Configuration|Embedded Assets", desc_list)
spawner_entity.get_set_test(2, "Configuration|Embedded Assets|[1]|Instance|Slice Asset", None) spawner_entity.get_set_test(2, "Configuration|Embedded Assets|[1]|Instance|Prefab Asset", None)
# Add an Asset Weight Selector component to the spawner entity # Add an Asset Weight Selector component to the spawner entity
spawner_entity.add_component("Vegetation Asset Weight Selector") spawner_entity.add_component("Vegetation Asset Weight Selector")

@ -64,16 +64,15 @@ def DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius():
instance_query_point_c = math.Vector3(515.0, 512.5, 32.0) instance_query_point_c = math.Vector3(515.0, 512.5, 32.0)
# 1) Open an existing simple level # 1) Open an existing simple level
helper.init_idle() hydra.open_base_level()
helper.open_level("Physics", "Base")
general.set_current_view_position(512.0, 480.0, 38.0) general.set_current_view_position(512.0, 480.0, 38.0)
# 2) Create a new entity with required vegetation area components # 2) Create a new entity with required vegetation area components
spawner_center_point = math.Vector3(520.0, 520.0, 32.0) spawner_center_point = math.Vector3(520.0, 520.0, 32.0)
asset_path = os.path.join("Slices", "1m_cube.dynamicslice") cube_asset_path = os.path.join("testdata", "multi-mat_fbx", "multi-mat_1m_cube.azmodel")
spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0, 16.0, cube_prefab = dynveg.create_temp_mesh_prefab(cube_asset_path, "DistanceBetween_1m_cube2")[0]
asset_path) spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0, 16.0,
cube_prefab)
# 3) Create a surface to plant on # 3) Create a surface to plant on
surface_center_point = math.Vector3(512.0, 512.0, 32.0) surface_center_point = math.Vector3(512.0, 512.0, 32.0)

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save