Merge remote-tracking branch 'upstream/development' into nvsickle/DomPatch
This commit is contained in:
@@ -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
Binary file not shown.
@@ -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="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="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="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="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 name="float" field="Weight" value="1.0000000" type="{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}"/>
|
||||
|
||||
+15
@@ -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" />
|
||||
</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="" >
|
||||
<Param Type="float" Name="damage" />
|
||||
</RemoteProcedure>
|
||||
|
||||
@@ -12,4 +12,5 @@ set(FILES
|
||||
Source/AutomatedTestingSystemComponent.cpp
|
||||
Source/AutomatedTestingSystemComponent.h
|
||||
Source/AutoGen/NetworkTestPlayerComponent.AutoComponent.xml
|
||||
Source/AutoGen/NetworkTestLevelEntityComponent.AutoComponent.xml
|
||||
)
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6d6204c6730e5675791765ca194e9b1cbec282208e280507de830afc2805e5fa
|
||||
size 41127
|
||||
oid sha256:de0e6e480ece5b423222f4feacf56553d73713fe9afea8bbc9a2660a3cd54ec7
|
||||
size 1232
|
||||
|
||||
@@ -12,12 +12,6 @@
|
||||
################################################################################
|
||||
|
||||
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(
|
||||
NAME AutomatedTesting::AWSTests
|
||||
TEST_SUITE awsi
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
## Prerequisites
|
||||
1. Build the O3DE Editor and AutomatedTesting.GameLauncher in Profile.
|
||||
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.
|
||||
|
||||
## Deploy CDK Applications
|
||||
|
||||
@@ -68,6 +68,10 @@ class AwsCredentials:
|
||||
if (len(self._credentials.sections()) == 0) and (not self._credentials_file_exists):
|
||||
os.remove(self._credentials_path)
|
||||
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:
|
||||
self._credentials.write(credential_file)
|
||||
|
||||
@@ -16,7 +16,7 @@ logging.getLogger('nose').setLevel(logging.WARNING)
|
||||
class AwsUtils:
|
||||
|
||||
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')
|
||||
self._local_account_id = local_sts_client.get_caller_identity()["Account"]
|
||||
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 platform
|
||||
|
||||
# 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')
|
||||
# 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
|
||||
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
|
||||
|
||||
@@ -21,7 +21,11 @@ TEST_DIRECTORY = os.path.join(os.path.dirname(__file__), "tests")
|
||||
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
|
||||
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")
|
||||
class AtomEditorComponents_BloomAdded(EditorSharedTest):
|
||||
@@ -120,6 +124,14 @@ class TestAutomation(EditorTestSuite):
|
||||
class AtomEditorComponents_SSAOAdded(EditorSharedTest):
|
||||
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):
|
||||
from Atom.tests import hydra_ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges as test_module
|
||||
|
||||
|
||||
@@ -26,13 +26,3 @@ class TestAutomation(EditorTestSuite):
|
||||
@pytest.mark.test_case_id("C36525660")
|
||||
class AtomEditorComponents_DisplayMapperAdded(EditorSharedTest):
|
||||
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,
|
||||
}
|
||||
|
||||
# Level list used in Editor Level Load Test
|
||||
LEVEL_LIST = ["hermanubis", "hermanubis_high", "macbeth_shaderballs", "PbrMaterialChart", "ShadowTest", "Sponza"]
|
||||
|
||||
class AtomComponentProperties:
|
||||
"""
|
||||
@@ -85,12 +87,18 @@ class AtomComponentProperties:
|
||||
def decal(property: str = 'name') -> str:
|
||||
"""
|
||||
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.
|
||||
: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.
|
||||
"""
|
||||
properties = {
|
||||
'name': 'Decal',
|
||||
'Attenuation Angle': 'Controller|Configuration|Attenuation Angle',
|
||||
'Opacity': 'Controller|Configuration|Opacity',
|
||||
'Sort Key': 'Controller|Configuration|Sort Key',
|
||||
'Material': 'Controller|Configuration|Material',
|
||||
}
|
||||
return properties[property]
|
||||
@@ -195,11 +203,13 @@ class AtomComponentProperties:
|
||||
def entity_reference(property: str = 'name') -> str:
|
||||
"""
|
||||
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.
|
||||
:return: Full property path OR component name if no property specified.
|
||||
"""
|
||||
properties = {
|
||||
'name': 'Entity Reference',
|
||||
'EntityIdReferences': 'Controller|Configuration|EntityIdReferences',
|
||||
}
|
||||
return properties[property]
|
||||
|
||||
@@ -238,12 +248,14 @@ class AtomComponentProperties:
|
||||
def grid(property: str = 'name') -> str:
|
||||
"""
|
||||
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
|
||||
: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.
|
||||
"""
|
||||
properties = {
|
||||
'name': 'Grid',
|
||||
'Grid Size': 'Controller|Configuration|Grid Size',
|
||||
'Secondary Grid Spacing': 'Controller|Configuration|Secondary Grid Spacing',
|
||||
}
|
||||
return properties[property]
|
||||
@@ -374,11 +386,13 @@ class AtomComponentProperties:
|
||||
def physical_sky(property: str = 'name') -> str:
|
||||
"""
|
||||
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.
|
||||
:return: Full property path OR component name if no property specified.
|
||||
"""
|
||||
properties = {
|
||||
'name': 'Physical Sky',
|
||||
'Sky Intensity': 'Controller|Configuration|Sky Intensity',
|
||||
}
|
||||
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 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):
|
||||
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):
|
||||
|
||||
+3
-3
@@ -60,7 +60,7 @@ def AtomEditorComponentsLevel_DiffuseGlobalIllumination_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 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
|
||||
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(
|
||||
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.
|
||||
TestHelper.enter_game_mode(Tests.enter_game_mode)
|
||||
|
||||
+2
-2
@@ -67,7 +67,7 @@ def AtomEditorComponentsLevel_DisplayMapper_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 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(
|
||||
AtomComponentProperties.display_mapper('Enable LDR color grading LUT'), True)
|
||||
Report.result(
|
||||
Test.enable_ldr_color_grading_lut,
|
||||
Tests.enable_ldr_color_grading_lut,
|
||||
display_mapper_component.get_component_property_value(
|
||||
AtomComponentProperties.display_mapper('Enable LDR color grading LUT')) is True)
|
||||
|
||||
|
||||
+3
-1
@@ -97,7 +97,7 @@ def AtomEditorComponents_Bloom_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create an Bloom entity with no components.
|
||||
@@ -170,10 +170,12 @@ def AtomEditorComponents_Bloom_AddedToEntity():
|
||||
|
||||
# 13. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, bloom_entity.exists())
|
||||
|
||||
# 14. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not bloom_entity.exists())
|
||||
|
||||
# 15. Look for errors and asserts.
|
||||
|
||||
+88
-44
@@ -8,49 +8,61 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
class Tests:
|
||||
camera_creation = (
|
||||
"Camera Entity successfully created",
|
||||
"Camera Entity failed to be created")
|
||||
"P0: Camera Entity failed to be created")
|
||||
camera_component_added = (
|
||||
"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 = (
|
||||
"Entity has a Camera component",
|
||||
"Entity failed to find Camera component")
|
||||
"P0: Entity failed to find Camera component")
|
||||
creation_undo = (
|
||||
"UNDO Entity creation success",
|
||||
"UNDO Entity creation failed")
|
||||
"P0: UNDO Entity creation failed")
|
||||
creation_redo = (
|
||||
"REDO Entity creation success",
|
||||
"REDO Entity creation failed")
|
||||
"P0: REDO Entity creation failed")
|
||||
decal_creation = (
|
||||
"Decal Entity successfully created",
|
||||
"Decal Entity failed to be created")
|
||||
"P0: Decal Entity failed to be created")
|
||||
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 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 = (
|
||||
"Entered game mode",
|
||||
"Failed to enter game mode")
|
||||
"P0: Failed to enter game mode")
|
||||
exit_game_mode = (
|
||||
"Exited game mode",
|
||||
"Couldn't exit game mode")
|
||||
"P0: Couldn't exit game mode")
|
||||
is_visible = (
|
||||
"Entity is visible",
|
||||
"Entity was not visible")
|
||||
"P0: Entity was not visible")
|
||||
is_hidden = (
|
||||
"Entity is hidden",
|
||||
"Entity was not hidden")
|
||||
"P0: Entity was not hidden")
|
||||
entity_deleted = (
|
||||
"Entity deleted",
|
||||
"Entity was not deleted")
|
||||
"P0: Entity was not deleted")
|
||||
deletion_undo = (
|
||||
"UNDO deletion success",
|
||||
"UNDO deletion failed")
|
||||
"P0: UNDO deletion failed")
|
||||
deletion_redo = (
|
||||
"REDO deletion success",
|
||||
"REDO deletion failed")
|
||||
"P0: REDO deletion failed")
|
||||
|
||||
|
||||
def AtomEditorComponents_Decal_AddedToEntity():
|
||||
@@ -71,14 +83,18 @@ def AtomEditorComponents_Decal_AddedToEntity():
|
||||
2) Add Decal component to Decal entity.
|
||||
3) UNDO the entity creation and component addition.
|
||||
4) REDO the entity creation and component addition.
|
||||
5) Enter/Exit game mode.
|
||||
6) Test IsHidden.
|
||||
7) Test IsVisible.
|
||||
8) Set Material property on Decal component.
|
||||
9) Delete Decal entity.
|
||||
10) UNDO deletion.
|
||||
11) REDO deletion.
|
||||
12) Look for errors and asserts.
|
||||
5) Set Material property on Decal component.
|
||||
6) Set Attenuation Angle property on Decal component.
|
||||
7) Set Opacity property on Decal component
|
||||
8) Set Sort Key property on Decal Component
|
||||
9) Remove Decal component then UNDO the remove
|
||||
10) Enter/Exit game mode.
|
||||
11) Test IsHidden.
|
||||
12) Test IsVisible.
|
||||
13) Delete Decal entity.
|
||||
14) UNDO deletion.
|
||||
15) REDO deletion.
|
||||
16) Look for errors and asserts.
|
||||
|
||||
:return: None
|
||||
"""
|
||||
@@ -95,7 +111,7 @@ def AtomEditorComponents_Decal_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a Decal entity with no components.
|
||||
@@ -130,41 +146,69 @@ def AtomEditorComponents_Decal_AddedToEntity():
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.creation_redo, decal_entity.exists())
|
||||
|
||||
# 5. Enter/Exit game mode.
|
||||
TestHelper.enter_game_mode(Tests.enter_game_mode)
|
||||
general.idle_wait_frames(1)
|
||||
TestHelper.exit_game_mode(Tests.exit_game_mode)
|
||||
|
||||
# 6. Test IsHidden.
|
||||
decal_entity.set_visibility_state(False)
|
||||
Report.result(Tests.is_hidden, decal_entity.is_hidden() is True)
|
||||
|
||||
# 7. Test IsVisible.
|
||||
decal_entity.set_visibility_state(True)
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.is_visible, decal_entity.is_visible() is True)
|
||||
|
||||
# 8. Set Material property on Decal component.
|
||||
decal_material_asset_path = os.path.join("materials", "basic_grey.azmaterial")
|
||||
# 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)
|
||||
|
||||
# 9. Delete Decal entity.
|
||||
# 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)
|
||||
general.idle_wait_frames(1)
|
||||
TestHelper.exit_game_mode(Tests.exit_game_mode)
|
||||
|
||||
# 11. Test IsHidden.
|
||||
decal_entity.set_visibility_state(False)
|
||||
Report.result(Tests.is_hidden, decal_entity.is_hidden() is True)
|
||||
|
||||
# 12. Test IsVisible.
|
||||
decal_entity.set_visibility_state(True)
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.is_visible, decal_entity.is_visible() is True)
|
||||
|
||||
# 13. Delete Decal entity.
|
||||
decal_entity.delete()
|
||||
Report.result(Tests.entity_deleted, not decal_entity.exists())
|
||||
|
||||
# 10. UNDO deletion.
|
||||
# 14. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, decal_entity.exists())
|
||||
|
||||
# 11. REDO deletion.
|
||||
# 15. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
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)
|
||||
for error_info in error_tracer.errors:
|
||||
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")
|
||||
|
||||
+3
-1
@@ -97,7 +97,7 @@ def AtomEditorComponents_DeferredFog_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create an Deferred Fog entity with no components.
|
||||
@@ -174,10 +174,12 @@ def AtomEditorComponents_DeferredFog_AddedToEntity():
|
||||
|
||||
# 13. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, deferred_fog_entity.exists())
|
||||
|
||||
# 14. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not deferred_fog_entity.exists())
|
||||
|
||||
# 15. Look for errors and asserts.
|
||||
|
||||
+3
-1
@@ -107,7 +107,7 @@ def AtomEditorComponents_DepthOfField_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a DepthOfField entity with no components.
|
||||
@@ -189,10 +189,12 @@ def AtomEditorComponents_DepthOfField_AddedToEntity():
|
||||
|
||||
# 15. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, depth_of_field_entity.exists())
|
||||
|
||||
# 16. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not depth_of_field_entity.exists())
|
||||
|
||||
# 17. Look for errors and asserts.
|
||||
|
||||
+3
-1
@@ -90,7 +90,7 @@ def AtomEditorComponents_DiffuseProbeGrid_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a Diffuse Probe Grid entity with no components.
|
||||
@@ -168,10 +168,12 @@ def AtomEditorComponents_DiffuseProbeGrid_AddedToEntity():
|
||||
|
||||
# 12. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, diffuse_probe_grid_entity.exists())
|
||||
|
||||
# 13. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not diffuse_probe_grid_entity.exists())
|
||||
|
||||
# 14. Look for errors or asserts.
|
||||
|
||||
+3
-1
@@ -95,7 +95,7 @@ def AtomEditorComponents_DirectionalLight_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a Directional Light entity with no components.
|
||||
@@ -168,10 +168,12 @@ def AtomEditorComponents_DirectionalLight_AddedToEntity():
|
||||
|
||||
# 12. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, directional_light_entity.exists())
|
||||
|
||||
# 13. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not directional_light_entity.exists())
|
||||
|
||||
# 14. Look for errors and asserts.
|
||||
|
||||
+3
-1
@@ -91,7 +91,7 @@ def AtomEditorComponents_DisplayMapper_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a Display Mapper entity with no components.
|
||||
@@ -166,10 +166,12 @@ def AtomEditorComponents_DisplayMapper_AddedToEntity():
|
||||
|
||||
# 11. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, display_mapper_entity.exists())
|
||||
|
||||
# 12. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not display_mapper_entity.exists())
|
||||
|
||||
# 13. Look for errors and asserts.
|
||||
|
||||
+129
-26
@@ -9,37 +9,58 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
class Tests:
|
||||
creation_undo = (
|
||||
"UNDO Entity creation success",
|
||||
"UNDO Entity creation failed")
|
||||
"P0: UNDO Entity creation failed")
|
||||
creation_redo = (
|
||||
"REDO Entity creation success",
|
||||
"REDO Entity creation failed")
|
||||
"P0: REDO Entity creation failed")
|
||||
entity_reference_creation = (
|
||||
"Entity Reference Entity successfully created",
|
||||
"Entity Reference Entity failed to be created")
|
||||
"P0: Entity Reference Entity failed to be created")
|
||||
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 = (
|
||||
"Entered game mode",
|
||||
"Failed to enter game mode")
|
||||
"P0: Failed to enter game mode")
|
||||
exit_game_mode = (
|
||||
"Exited game mode",
|
||||
"Couldn't exit game mode")
|
||||
"P0: Couldn't exit game mode")
|
||||
is_visible = (
|
||||
"Entity is visible",
|
||||
"Entity was not visible")
|
||||
"P0: Entity was not visible")
|
||||
is_hidden = (
|
||||
"Entity is hidden",
|
||||
"Entity was not hidden")
|
||||
"P0: Entity was not hidden")
|
||||
entity_deleted = (
|
||||
"Entity deleted",
|
||||
"Entity was not deleted")
|
||||
"P0: Entity was not deleted")
|
||||
deletion_undo = (
|
||||
"UNDO deletion success",
|
||||
"UNDO deletion failed")
|
||||
"P0: UNDO deletion failed")
|
||||
deletion_redo = (
|
||||
"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():
|
||||
@@ -60,13 +81,21 @@ def AtomEditorComponents_EntityReference_AddedToEntity():
|
||||
2) Add Entity Reference component to Entity Reference entity.
|
||||
3) UNDO the entity creation and component addition.
|
||||
4) REDO the entity creation and component addition.
|
||||
5) Enter/Exit game mode.
|
||||
6) Test IsHidden.
|
||||
7) Test IsVisible.
|
||||
8) Delete Entity Reference entity.
|
||||
9) UNDO deletion.
|
||||
10) REDO deletion.
|
||||
11) Look for errors.
|
||||
5) 'EntityIdReferences' is a container property
|
||||
6) Append item to 'EntityIdReferences'
|
||||
7) Add item to 'EntityIdReferences'
|
||||
8) Update item in 'EntityIdReferences'
|
||||
9) Remove item from 'EntityIdReferences'
|
||||
10) Reset the container property then put one entity reference back for further tests
|
||||
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
|
||||
"""
|
||||
@@ -81,7 +110,7 @@ def AtomEditorComponents_EntityReference_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create an Entity Reference entity with no components.
|
||||
@@ -119,33 +148,107 @@ def AtomEditorComponents_EntityReference_AddedToEntity():
|
||||
general.idle_wait_frames(1)
|
||||
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)
|
||||
general.idle_wait_frames(1)
|
||||
TestHelper.exit_game_mode(Tests.exit_game_mode)
|
||||
|
||||
# 6. Test IsHidden.
|
||||
# 14. Test IsHidden.
|
||||
entity_reference_entity.set_visibility_state(False)
|
||||
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)
|
||||
general.idle_wait_frames(1)
|
||||
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()
|
||||
Report.result(Tests.entity_deleted, not entity_reference_entity.exists())
|
||||
|
||||
# 9. UNDO deletion.
|
||||
# 17. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, entity_reference_entity.exists())
|
||||
|
||||
# 10. REDO deletion.
|
||||
# 18. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
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)
|
||||
for error_info in error_tracer.errors:
|
||||
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")
|
||||
|
||||
+3
-1
@@ -101,7 +101,7 @@ def AtomEditorComponents_ExposureControl_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Creation of Exposure Control entity with no components.
|
||||
@@ -169,10 +169,12 @@ def AtomEditorComponents_ExposureControl_AddedToEntity():
|
||||
|
||||
# 12. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, exposure_control_entity.exists())
|
||||
|
||||
# 13. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not exposure_control_entity.exists())
|
||||
|
||||
# 14. Look for errors and asserts.
|
||||
|
||||
+3
-1
@@ -99,7 +99,7 @@ def AtomEditorComponents_GlobalSkylightIBL_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a Global Skylight (IBL) entity with no components.
|
||||
@@ -176,10 +176,12 @@ def AtomEditorComponents_GlobalSkylightIBL_AddedToEntity():
|
||||
|
||||
# 11. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, global_skylight_entity.exists())
|
||||
|
||||
# 12. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not global_skylight_entity.exists())
|
||||
|
||||
# 13. Look for errors and asserts.
|
||||
|
||||
+28
-15
@@ -18,6 +18,9 @@ class Tests:
|
||||
grid_component_added = (
|
||||
"Entity has a 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 = (
|
||||
"Entered game mode",
|
||||
"Failed to enter game mode")
|
||||
@@ -59,13 +62,14 @@ def AtomEditorComponents_Grid_AddedToEntity():
|
||||
2) Add a Grid component to Grid entity.
|
||||
3) UNDO the entity creation and component addition.
|
||||
4) REDO the entity creation and component addition.
|
||||
5) Enter/Exit game mode.
|
||||
6) Test IsHidden.
|
||||
7) Test IsVisible.
|
||||
8) Delete Grid entity.
|
||||
9) UNDO deletion.
|
||||
10) REDO deletion.
|
||||
11) Look for errors.
|
||||
5) Grid Size changed.
|
||||
6) Enter/Exit game mode.
|
||||
7) Test IsHidden.
|
||||
8) Test IsVisible.
|
||||
9) Delete Grid entity.
|
||||
10) UNDO deletion.
|
||||
11) REDO deletion.
|
||||
12) Look for errors.
|
||||
|
||||
:return: None
|
||||
"""
|
||||
@@ -82,7 +86,7 @@ def AtomEditorComponents_Grid_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a Grid entity with no components.
|
||||
@@ -119,33 +123,42 @@ def AtomEditorComponents_Grid_AddedToEntity():
|
||||
general.idle_wait_frames(1)
|
||||
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)
|
||||
general.idle_wait_frames(1)
|
||||
TestHelper.exit_game_mode(Tests.exit_game_mode)
|
||||
|
||||
# 6. Test IsHidden.
|
||||
# 7. Test IsHidden.
|
||||
grid_entity.set_visibility_state(False)
|
||||
Report.result(Tests.is_hidden, grid_entity.is_hidden() is True)
|
||||
|
||||
# 7. Test IsVisible.
|
||||
# 8. Test IsVisible.
|
||||
grid_entity.set_visibility_state(True)
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.is_visible, grid_entity.is_visible() is True)
|
||||
|
||||
# 8. Delete Grid entity.
|
||||
# 9. Delete Grid entity.
|
||||
grid_entity.delete()
|
||||
Report.result(Tests.entity_deleted, not grid_entity.exists())
|
||||
|
||||
# 9. UNDO deletion.
|
||||
# 10. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, grid_entity.exists())
|
||||
|
||||
# 10. REDO deletion.
|
||||
# 11. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
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)
|
||||
for error_info in error_tracer.errors:
|
||||
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")
|
||||
|
||||
+3
-1
@@ -96,7 +96,7 @@ def AtomEditorComponents_HDRColorGrading_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create an HDR Color Grading entity with no components.
|
||||
@@ -173,10 +173,12 @@ def AtomEditorComponents_HDRColorGrading_AddedToEntity():
|
||||
|
||||
# 13. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, hdr_color_grading_entity.exists())
|
||||
|
||||
# 14. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not hdr_color_grading_entity.exists())
|
||||
|
||||
# 15. Look for errors and asserts.
|
||||
|
||||
+3
-1
@@ -87,7 +87,7 @@ def AtomEditorComponents_HDRiSkybox_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create an HDRi Skybox with no components.
|
||||
@@ -158,10 +158,12 @@ def AtomEditorComponents_HDRiSkybox_AddedToEntity():
|
||||
|
||||
# 10. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, hdri_skybox_entity.exists())
|
||||
|
||||
# 11. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not hdri_skybox_entity.exists())
|
||||
|
||||
# 12. Look for errors or asserts.
|
||||
|
||||
+30
-16
@@ -68,13 +68,14 @@ def AtomEditorComponents_Light_AddedToEntity():
|
||||
2) Add Light component to the Light entity.
|
||||
3) UNDO the entity creation and component addition.
|
||||
4) REDO the entity creation and component addition.
|
||||
5) Enter/Exit game mode.
|
||||
6) Test IsHidden.
|
||||
7) Test IsVisible.
|
||||
8) Delete Light entity.
|
||||
9) UNDO deletion.
|
||||
10) REDO deletion.
|
||||
11) Look for errors.
|
||||
5) Cycle through all light types.
|
||||
6) Enter/Exit game mode.
|
||||
7) Test IsHidden.
|
||||
8) Test IsVisible.
|
||||
9) Delete Light entity.
|
||||
10) UNDO deletion.
|
||||
11) REDO deletion.
|
||||
12) Look for errors.
|
||||
|
||||
: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.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:
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a Light entity with no components.
|
||||
@@ -124,33 +125,46 @@ def AtomEditorComponents_Light_AddedToEntity():
|
||||
general.idle_wait_frames(1)
|
||||
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)
|
||||
general.idle_wait_frames(1)
|
||||
TestHelper.exit_game_mode(Tests.exit_game_mode)
|
||||
|
||||
# 6. Test IsHidden.
|
||||
# 7. Test IsHidden.
|
||||
light_entity.set_visibility_state(False)
|
||||
Report.result(Tests.is_hidden, light_entity.is_hidden() is True)
|
||||
|
||||
# 7. Test IsVisible.
|
||||
# 8. Test IsVisible.
|
||||
light_entity.set_visibility_state(True)
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.is_visible, light_entity.is_visible() is True)
|
||||
|
||||
# 8. Delete Light entity.
|
||||
# 9. Delete Light entity.
|
||||
light_entity.delete()
|
||||
Report.result(Tests.entity_deleted, not light_entity.exists())
|
||||
|
||||
# 9. UNDO deletion.
|
||||
# 10. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, light_entity.exists())
|
||||
|
||||
# 10. REDO deletion.
|
||||
# 11. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
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)
|
||||
for error_info in error_tracer.errors:
|
||||
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")
|
||||
|
||||
+3
-1
@@ -104,7 +104,7 @@ def AtomEditorComponents_LookModification_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create an Look Modification entity with no components.
|
||||
@@ -192,10 +192,12 @@ def AtomEditorComponents_LookModification_AddedToEntity():
|
||||
|
||||
# 14. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, look_modification_entity.exists())
|
||||
|
||||
# 15. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not look_modification_entity.exists())
|
||||
|
||||
# 16. Look for errors and asserts.
|
||||
|
||||
+3
-1
@@ -102,7 +102,7 @@ def AtomEditorComponents_Material_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a Material entity with no components.
|
||||
@@ -184,10 +184,12 @@ def AtomEditorComponents_Material_AddedToEntity():
|
||||
|
||||
# 16. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, material_entity.exists())
|
||||
|
||||
# 17. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not material_entity.exists())
|
||||
|
||||
# 18. Look for errors or asserts.
|
||||
|
||||
@@ -87,7 +87,7 @@ def AtomEditorComponents_Mesh_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a Mesh entity with no components.
|
||||
@@ -151,10 +151,12 @@ def AtomEditorComponents_Mesh_AddedToEntity():
|
||||
|
||||
# 10. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, mesh_entity.exists())
|
||||
|
||||
# 11. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not mesh_entity.exists())
|
||||
|
||||
# 12. Look for errors or asserts.
|
||||
|
||||
+3
-1
@@ -80,7 +80,7 @@ def AtomEditorComponents_OcclusionCullingPlane_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a occlusion culling plane entity with no components.
|
||||
@@ -140,10 +140,12 @@ def AtomEditorComponents_OcclusionCullingPlane_AddedToEntity():
|
||||
|
||||
# 9. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, occlusion_culling_plane_entity.exists())
|
||||
|
||||
# 10. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not occlusion_culling_plane_entity.exists())
|
||||
|
||||
# 11. Look for errors or asserts.
|
||||
|
||||
+28
-15
@@ -27,6 +27,9 @@ class Tests:
|
||||
physical_sky_component = (
|
||||
"Entity has a 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 = (
|
||||
"Entered game mode",
|
||||
"Failed to enter game mode")
|
||||
@@ -68,13 +71,14 @@ def AtomEditorComponents_PhysicalSky_AddedToEntity():
|
||||
2) Add Physical Sky component to Physical Sky entity.
|
||||
3) UNDO the entity creation and component addition.
|
||||
4) REDO the entity creation and component addition.
|
||||
5) Enter/Exit game mode.
|
||||
6) Test IsHidden.
|
||||
7) Test IsVisible.
|
||||
8) Delete Physical Sky entity.
|
||||
9) UNDO deletion.
|
||||
10) REDO deletion.
|
||||
11) Look for errors and asserts.
|
||||
5) Update Sky Intensity value.
|
||||
6) Enter/Exit game mode.
|
||||
7) Test IsHidden.
|
||||
8) Test IsVisible.
|
||||
9) Delete Physical Sky entity.
|
||||
10) UNDO deletion.
|
||||
11) REDO deletion.
|
||||
12) Look for errors and asserts.
|
||||
|
||||
:return: None
|
||||
"""
|
||||
@@ -89,7 +93,7 @@ def AtomEditorComponents_PhysicalSky_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a Physical Sky entity with no components.
|
||||
@@ -126,33 +130,42 @@ def AtomEditorComponents_PhysicalSky_AddedToEntity():
|
||||
general.idle_wait_frames(1)
|
||||
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)
|
||||
general.idle_wait_frames(1)
|
||||
TestHelper.exit_game_mode(Tests.exit_game_mode)
|
||||
|
||||
# 6. Test IsHidden.
|
||||
# 7. Test IsHidden.
|
||||
physical_sky_entity.set_visibility_state(False)
|
||||
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)
|
||||
general.idle_wait_frames(1)
|
||||
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()
|
||||
Report.result(Tests.entity_deleted, not physical_sky_entity.exists())
|
||||
|
||||
# 9. UNDO deletion.
|
||||
# 10. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, physical_sky_entity.exists())
|
||||
|
||||
# 10. REDO deletion.
|
||||
# 11. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
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)
|
||||
for error_info in error_tracer.errors:
|
||||
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")
|
||||
|
||||
+3
-1
@@ -92,7 +92,7 @@ def AtomEditorComponents_PostFXGradientWeightModifier_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a PostFX Gradient Weight Modifier entity with no components.
|
||||
@@ -162,10 +162,12 @@ def AtomEditorComponents_PostFXGradientWeightModifier_AddedToEntity():
|
||||
|
||||
# 12. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, postfx_gradient_weight_entity.exists())
|
||||
|
||||
# 13. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not postfx_gradient_weight_entity.exists())
|
||||
|
||||
# 14. Look for errors or asserts.
|
||||
|
||||
+3
-1
@@ -80,7 +80,7 @@ def AtomEditorComponents_postfx_layer_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a PostFX Layer entity with no components.
|
||||
@@ -137,10 +137,12 @@ def AtomEditorComponents_postfx_layer_AddedToEntity():
|
||||
|
||||
# 9. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, postfx_layer_entity.exists())
|
||||
|
||||
# 10. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not postfx_layer_entity.exists())
|
||||
|
||||
# 11. Look for errors or asserts.
|
||||
|
||||
+3
-1
@@ -92,7 +92,7 @@ def AtomEditorComponents_PostFXRadiusWeightModifier_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a Post FX Radius Weight Modifier entity with no components.
|
||||
@@ -161,10 +161,12 @@ def AtomEditorComponents_PostFXRadiusWeightModifier_AddedToEntity():
|
||||
|
||||
# 12. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, postfx_radius_weight_entity.exists())
|
||||
|
||||
# 13. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not postfx_radius_weight_entity.exists())
|
||||
|
||||
# 14. Look for errors and asserts.
|
||||
|
||||
+3
-1
@@ -98,7 +98,7 @@ def AtomEditorComponents_postfx_shape_weight_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a PostFx Shape Weight Modifier entity with no components.
|
||||
@@ -188,10 +188,12 @@ def AtomEditorComponents_postfx_shape_weight_AddedToEntity():
|
||||
|
||||
# 15. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, postfx_shape_weight_entity.exists())
|
||||
|
||||
# 16. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not postfx_shape_weight_entity.exists())
|
||||
|
||||
# 17. Look for errors or asserts.
|
||||
|
||||
+3
-1
@@ -97,7 +97,7 @@ def AtomEditorComponents_ReflectionProbe_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a Reflection Probe entity with no components.
|
||||
@@ -183,10 +183,12 @@ def AtomEditorComponents_ReflectionProbe_AddedToEntity():
|
||||
|
||||
# 13. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, reflection_probe_entity.exists())
|
||||
|
||||
# 14. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not reflection_probe_entity.exists())
|
||||
|
||||
# 15. Look for errors or asserts.
|
||||
|
||||
@@ -94,7 +94,7 @@ def AtomEditorComponents_SSAO_AddedToEntity():
|
||||
# Test setup begins.
|
||||
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
|
||||
TestHelper.init_idle()
|
||||
TestHelper.open_level("", "Base")
|
||||
TestHelper.open_level("Graphics", "base_empty")
|
||||
|
||||
# Test steps begin.
|
||||
# 1. Create a SSAO entity with no components.
|
||||
@@ -163,10 +163,12 @@ def AtomEditorComponents_SSAO_AddedToEntity():
|
||||
|
||||
# 12. UNDO deletion.
|
||||
general.undo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_undo, ssao_entity.exists())
|
||||
|
||||
# 13. REDO deletion.
|
||||
general.redo()
|
||||
general.idle_wait_frames(1)
|
||||
Report.result(Tests.deletion_redo, not ssao_entity.exists())
|
||||
|
||||
# 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)
|
||||
+13
-6
@@ -34,6 +34,7 @@ class EditorComponent:
|
||||
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.
|
||||
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):
|
||||
@@ -270,6 +271,13 @@ class EditorComponent:
|
||||
warnings.warn("disable_component is deprecated, use set_enabled(False) instead.", DeprecationWarning)
|
||||
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
|
||||
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
|
||||
:return: None
|
||||
"""
|
||||
type_ids = EditorComponent.get_type_ids(component_names, EditorEntityType.GAME)
|
||||
for type_id in type_ids:
|
||||
remove_outcome = editor.EditorComponentAPIBus(bus.Broadcast, "RemoveComponents", self.id, [type_id])
|
||||
assert (
|
||||
remove_outcome.IsSuccess()
|
||||
), f"Failure: could not remove component from '{self.get_name()}'"
|
||||
component_ids = [component.id for component in self.get_components_of_type(component_names)]
|
||||
remove_success = editor.EditorComponentAPIBus(bus.Broadcast, "RemoveComponents", component_ids)
|
||||
assert (
|
||||
remove_success
|
||||
), f"Failure: could not remove component from entity '{self.get_name()}'"
|
||||
|
||||
def get_components_of_type(self, component_names: list) -> List[EditorComponent]:
|
||||
"""
|
||||
|
||||
+1
-1
@@ -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
|
||||
"""
|
||||
|
||||
import collections.abc
|
||||
from typing import List
|
||||
from math import isclose
|
||||
import collections.abc
|
||||
|
||||
import azlmbr.bus as bus
|
||||
import azlmbr.editor as editor
|
||||
|
||||
+34
-34
@@ -48,8 +48,8 @@ def wait_for_propagation():
|
||||
# This is a helper class which contains some of the useful information about a prefab instance.
|
||||
class PrefabInstance:
|
||||
|
||||
def __init__(self, prefab_file_name: str = None, container_entity: EditorEntity = None):
|
||||
self.prefab_file_name: str = prefab_file_name
|
||||
def __init__(self, prefab_file_path: str = None, container_entity: EditorEntity = None):
|
||||
self.prefab_file_path: str = prefab_file_path
|
||||
self.container_entity: EditorEntity = container_entity
|
||||
|
||||
def __eq__(self, other):
|
||||
@@ -66,7 +66,7 @@ class PrefabInstance:
|
||||
See if this instance is valid to be used with other prefab operations.
|
||||
: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:
|
||||
"""
|
||||
@@ -131,7 +131,7 @@ class PrefabInstance:
|
||||
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"
|
||||
|
||||
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)
|
||||
|
||||
self.container_entity = reparented_container_entity
|
||||
@@ -161,46 +161,48 @@ class Prefab:
|
||||
:param file_path: A unique file path of the target prefab.
|
||||
: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
|
||||
def prefab_exists(cls, file_path: str) -> bool:
|
||||
"""
|
||||
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 path.exists(get_prefab_file_path(file_path))
|
||||
|
||||
@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.
|
||||
: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.
|
||||
"""
|
||||
assert file_name, "Received an empty file_name"
|
||||
if Prefab.is_prefab_loaded(file_name):
|
||||
return Prefab.existing_prefabs[file_name]
|
||||
assert file_path, "Received an empty file_path"
|
||||
if Prefab.is_prefab_loaded(file_path):
|
||||
return Prefab.existing_prefabs[get_prefab_file_path(file_path)]
|
||||
else:
|
||||
assert Prefab.prefab_exists(file_name), f"Attempted to get a prefab \"{file_name}\" that doesn't exist"
|
||||
new_prefab = Prefab(file_name)
|
||||
Prefab.existing_prefabs[file_name] = Prefab(file_name)
|
||||
assert Prefab.prefab_exists(file_path), f"Attempted to get a prefab \"{file_path}\" that doesn't exist"
|
||||
new_prefab = Prefab(file_path)
|
||||
Prefab.existing_prefabs[new_prefab.file_path] = new_prefab
|
||||
return new_prefab
|
||||
|
||||
@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.
|
||||
: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 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 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 the file name in file_path.
|
||||
: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]
|
||||
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()}"
|
||||
@@ -210,15 +212,14 @@ class Prefab:
|
||||
children_entity_ids = container_entity.get_children_ids()
|
||||
|
||||
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()
|
||||
|
||||
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)
|
||||
Prefab.existing_prefabs[file_name] = new_prefab
|
||||
Prefab.existing_prefabs[new_prefab.file_path] = new_prefab
|
||||
return new_prefab, new_prefab_instance
|
||||
|
||||
@classmethod
|
||||
@@ -250,7 +251,7 @@ class Prefab:
|
||||
assert False, "Not all entities and descendants in target prefabs are deleted."
|
||||
|
||||
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 = PrefabInstance()
|
||||
|
||||
@@ -290,8 +291,7 @@ class Prefab:
|
||||
prefab_file_path = prefab.PrefabPublicRequestBus(bus.Broadcast, 'GetOwningInstancePrefabPath', duplicate_container_entity_id)
|
||||
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_name)
|
||||
duplicate_instance_prefab = Prefab.get_prefab(prefab_file_path)
|
||||
duplicate_instance = PrefabInstance(prefab_file_path, EditorEntity(duplicate_container_entity_id))
|
||||
duplicate_instance_prefab.instances.add(duplicate_instance)
|
||||
duplicate_instances.append(duplicate_instance)
|
||||
@@ -324,7 +324,7 @@ class Prefab:
|
||||
|
||||
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)
|
||||
prefab_instance = PrefabInstance()
|
||||
|
||||
@@ -346,13 +346,13 @@ class Prefab:
|
||||
container_entity_id = instantiate_prefab_result.GetValue()
|
||||
container_entity = EditorEntity(container_entity_id)
|
||||
|
||||
if name:
|
||||
container_entity.set_name(name)
|
||||
|
||||
wait_for_propagation()
|
||||
|
||||
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)
|
||||
|
||||
assert new_prefab_instance.is_at_position(prefab_position), "This prefab instance is *not* at expected position."
|
||||
|
||||
@@ -31,7 +31,15 @@ class TestAutomation(TestAutomationBase):
|
||||
def test_Multiplayer_AutoComponent_NetworkInput(self, request, workspace, editor, launcher_platform):
|
||||
from .tests import Multiplayer_AutoComponent_NetworkInput as test_module
|
||||
self._run_prefab_test(request, workspace, editor, test_module)
|
||||
|
||||
|
||||
def test_Multiplayer_AutoComponent_RPC(self, request, workspace, editor, launcher_platform):
|
||||
from .tests import Multiplayer_AutoComponent_RPC as test_module
|
||||
self._run_prefab_test(request, workspace, editor, test_module)
|
||||
|
||||
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)
|
||||
|
||||
+20
-6
@@ -62,17 +62,31 @@ def Multiplayer_AutoComponent_RPC():
|
||||
Report.critical_result(TestSuccessFailTuples.find_network_player, player_id.IsValid())
|
||||
|
||||
# 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.
|
||||
helper.succeed_if_log_line_found('EditorServer', 'Script: AutoComponent_RPC: Sending client PlayerNumber 1', section_tracer.prints, PLAYERID_RPC_WAIT_TIME_SECONDS)
|
||||
helper.succeed_if_log_line_found('Script', "AutoComponent_RPC: I'm Player #1", section_tracer.prints, PLAYERID_RPC_WAIT_TIME_SECONDS)
|
||||
|
||||
# Uncomment once editor game-play mode supports level entities with net-binding
|
||||
#PLAYFX_RPC_WAIT_TIME_SECONDS = 1.1 # The server will send an RPC to play an fx on the client every second.
|
||||
#helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC_NetLevelEntity Activated on entity: NetLevelEntity", section_tracer.prints, PLAYFX_RPC_WAIT_TIME_SECONDS)
|
||||
#helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC_NetLevelEntity: Authority sending RPC to play some fx.", section_tracer.prints, PLAYFX_RPC_WAIT_TIME_SECONDS)
|
||||
#helper.succeed_if_log_line_found('Script', "AutoComponent_RPC_NetLevelEntity: I'm a client playing some superficial fx.", section_tracer.prints, PLAYFX_RPC_WAIT_TIME_SECONDS)
|
||||
# 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.
|
||||
helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC_NetLevelEntity Activated on entity: NetLevelEntity", section_tracer.prints, PLAYFX_RPC_WAIT_TIME_SECONDS)
|
||||
helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC_NetLevelEntity: Authority sending RPC to play some fx.", section_tracer.prints, PLAYFX_RPC_WAIT_TIME_SECONDS)
|
||||
helper.succeed_if_log_line_found('Script', "AutoComponent_RPC_NetLevelEntity: I'm a client playing some 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
|
||||
helper.exit_game_mode(TestSuccessFailTuples.exit_game_mode)
|
||||
|
||||
|
||||
+66
@@ -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)
|
||||
+76
@@ -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
|
||||
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):
|
||||
from Prefab.tests.delete_prefab import DeletePrefab_ContainingASingleEntity as test_module
|
||||
self._run_prefab_test(request, workspace, editor, test_module)
|
||||
|
||||
@@ -45,8 +45,12 @@ class TestAutomationNoAutoTestMode(EditorTestSuite):
|
||||
class test_InstantiatePrefab_ContainingASingleEntity(EditorSharedTest):
|
||||
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):
|
||||
from .tests.delete_prefab import DeletePrefab_ContainingASingleEntity as test_module
|
||||
|
||||
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
|
||||
|
||||
+2
-1
@@ -13,7 +13,8 @@ def CreatePrefab_UnderAnEntity():
|
||||
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.prefab_utils import Prefab
|
||||
|
||||
+2
-1
@@ -7,7 +7,8 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
|
||||
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.utils import Report
|
||||
|
||||
+2
-1
@@ -7,7 +7,8 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
|
||||
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.prefab_utils import Prefab
|
||||
|
||||
+3
-2
@@ -7,8 +7,9 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
|
||||
def DetachPrefab_UnderAnotherPrefab():
|
||||
|
||||
CAR_PREFAB_FILE_NAME = 'car_prefab2'
|
||||
WHEEL_PREFAB_FILE_NAME = 'wheel_prefab2'
|
||||
from pathlib import Path
|
||||
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
|
||||
|
||||
|
||||
+2
-1
@@ -7,7 +7,8 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
|
||||
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.prefab_utils import Prefab
|
||||
|
||||
+34
@@ -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)
|
||||
+3
-2
@@ -7,8 +7,9 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
|
||||
def ReparentPrefab_UnderAnotherPrefab():
|
||||
|
||||
CAR_PREFAB_FILE_NAME = 'car_prefab'
|
||||
WHEEL_PREFAB_FILE_NAME = 'wheel_prefab'
|
||||
from pathlib import Path
|
||||
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
|
||||
|
||||
|
||||
+6
-12
@@ -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
|
||||
"""
|
||||
|
||||
|
||||
class HeightTests:
|
||||
single_gradient_height_correct = (
|
||||
"Successfully retrieved height for gradient1.",
|
||||
@@ -22,6 +23,7 @@ class HeightTests:
|
||||
"OnTerrainDataChanged call count incorrect."
|
||||
)
|
||||
|
||||
|
||||
def TerrainHeightGradientList_AddRemoveGradientWorks():
|
||||
"""
|
||||
Summary:
|
||||
@@ -29,22 +31,16 @@ def TerrainHeightGradientList_AddRemoveGradientWorks():
|
||||
:return: None
|
||||
"""
|
||||
|
||||
import os
|
||||
import math as sys_math
|
||||
|
||||
import azlmbr.legacy.general as general
|
||||
import azlmbr.bus as bus
|
||||
import azlmbr.math as math
|
||||
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
|
||||
from editor_python_test_tools.utils import Report
|
||||
from editor_python_test_tools.utils import TestHelper as helper
|
||||
import editor_python_test_tools.pyside_utils as pyside_utils
|
||||
from editor_python_test_tools.editor_entity_utils import EditorEntity
|
||||
|
||||
terrain_changed_call_count = 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))
|
||||
|
||||
helper.init_idle()
|
||||
|
||||
# Open a level.
|
||||
helper.open_level("Physics", "Base")
|
||||
helper.wait_for_condition(lambda: general.get_current_level_name() == "Base", 2.0)
|
||||
hydra.open_base_level()
|
||||
|
||||
general.idle_wait_frames(1)
|
||||
|
||||
@@ -101,7 +94,7 @@ def TerrainHeightGradientList_AddRemoveGradientWorks():
|
||||
aabb_height = 1024.0
|
||||
box_dimensions = math.Vector3(1.0, 1.0, aabb_height);
|
||||
|
||||
# Create a main entity with a LayerSpawner, AAbb and HeightGradientList.
|
||||
# Create a main entity with a LayerSpawner, AAbb and HeightGradientList.
|
||||
main_entity = create_entity_at("entity2", [layerspawner_component_name, gradientlist_component_name, aabb_component_name], 0.0, 0.0, aabb_height/2.0)
|
||||
|
||||
# Create three gradient entities.
|
||||
@@ -138,7 +131,8 @@ def TerrainHeightGradientList_AddRemoveGradientWorks():
|
||||
# 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)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
from editor_python_test_tools.utils import Report
|
||||
Report.start_test(TerrainHeightGradientList_AddRemoveGradientWorks)
|
||||
Report.start_test(TerrainHeightGradientList_AddRemoveGradientWorks)
|
||||
|
||||
+5
-10
@@ -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
|
||||
"""
|
||||
|
||||
|
||||
class MacroMaterialTests:
|
||||
setup_test = (
|
||||
"Setup successful",
|
||||
@@ -30,6 +31,7 @@ class MacroMaterialTests:
|
||||
"Timed out waiting for OnTerrainMacroMaterialRegionChanged"
|
||||
)
|
||||
|
||||
|
||||
def TerrainMacroMaterialComponent_MacroMaterialActivates():
|
||||
"""
|
||||
Summary:
|
||||
@@ -38,7 +40,6 @@ def TerrainMacroMaterialComponent_MacroMaterialActivates():
|
||||
"""
|
||||
|
||||
import os
|
||||
import math as sys_math
|
||||
|
||||
import azlmbr.legacy.general as general
|
||||
import azlmbr.asset as asset
|
||||
@@ -46,15 +47,11 @@ def TerrainMacroMaterialComponent_MacroMaterialActivates():
|
||||
import azlmbr.math as math
|
||||
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
|
||||
from editor_python_test_tools.utils import Report
|
||||
from editor_python_test_tools.utils import TestHelper as helper
|
||||
import editor_python_test_tools.pyside_utils as pyside_utils
|
||||
from editor_python_test_tools.editor_entity_utils import EditorEntity
|
||||
from editor_python_test_tools.asset_utils import Asset
|
||||
|
||||
material_created_called = False
|
||||
material_changed_called = False
|
||||
@@ -84,11 +81,8 @@ def TerrainMacroMaterialComponent_MacroMaterialActivates():
|
||||
nonlocal material_destroyed_called
|
||||
material_destroyed_called = True
|
||||
|
||||
helper.init_idle()
|
||||
|
||||
# Open a level.
|
||||
helper.open_level("Physics", "Base")
|
||||
helper.wait_for_condition(lambda: general.get_current_level_name() == "Base", 2.0)
|
||||
hydra.open_base_level()
|
||||
|
||||
general.idle_wait_frames(1)
|
||||
|
||||
@@ -160,7 +154,8 @@ def TerrainMacroMaterialComponent_MacroMaterialActivates():
|
||||
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)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
from editor_python_test_tools.utils import Report
|
||||
Report.start_test(TerrainMacroMaterialComponent_MacroMaterialActivates)
|
||||
Report.start_test(TerrainMacroMaterialComponent_MacroMaterialActivates)
|
||||
|
||||
+7
-5
@@ -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
|
||||
"""
|
||||
|
||||
|
||||
#fmt: off
|
||||
class Tests():
|
||||
class Tests:
|
||||
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_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")
|
||||
#fmt: on
|
||||
|
||||
|
||||
def TerrainPhysicsCollider_ChangesSizeWithAxisAlignedBoxShapeChanges():
|
||||
"""
|
||||
Summary:
|
||||
@@ -36,24 +38,24 @@ def TerrainPhysicsCollider_ChangesSizeWithAxisAlignedBoxShapeChanges():
|
||||
: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.utils import TestHelper as helper
|
||||
from editor_python_test_tools.utils import Report, Tracer
|
||||
import azlmbr.legacy.general as general
|
||||
|
||||
import azlmbr.physics as physics
|
||||
import azlmbr.math as azmath
|
||||
import azlmbr.bus as bus
|
||||
import sys
|
||||
|
||||
import math
|
||||
|
||||
SET_BOX_X_SIZE = 5.0
|
||||
SET_BOX_Y_SIZE = 6.0
|
||||
EXPECTED_COLUMN_SIZE = SET_BOX_X_SIZE + 1
|
||||
EXPECTED_ROW_SIZE = SET_BOX_Y_SIZE + 1
|
||||
helper.init_idle()
|
||||
|
||||
# 1) Load the level
|
||||
helper.open_level("", "Base")
|
||||
hydra.open_base_level()
|
||||
|
||||
# 2) Create test entity
|
||||
test_entity = EditorEntity.create_editor_entity("TestEntity")
|
||||
|
||||
+3
-8
@@ -54,7 +54,6 @@ def TerrainSystem_VegetationSpawnsOnTerrainSurfaces():
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import math as sys_math
|
||||
|
||||
import azlmbr.legacy.general as general
|
||||
@@ -62,10 +61,8 @@ def TerrainSystem_VegetationSpawnsOnTerrainSurfaces():
|
||||
import azlmbr.math as math
|
||||
|
||||
import azlmbr.areasystem as areasystem
|
||||
import azlmbr.editor as editor
|
||||
import azlmbr.vegetation as vegetation
|
||||
import azlmbr.terrain as terrain
|
||||
import azlmbr.entity as EntityId
|
||||
import azlmbr.surface_data as surface_data
|
||||
|
||||
import editor_python_test_tools.hydra_editor_utils as hydra
|
||||
@@ -86,11 +83,8 @@ def TerrainSystem_VegetationSpawnsOnTerrainSurfaces():
|
||||
|
||||
return highest_z, lowest_z
|
||||
|
||||
helper.init_idle()
|
||||
|
||||
# Open an empty level.
|
||||
helper.open_level("Physics", "Base")
|
||||
helper.wait_for_condition(lambda: general.get_current_level_name() == "Base", 2.0)
|
||||
hydra.open_base_level()
|
||||
|
||||
general.idle_wait_frames(1)
|
||||
|
||||
@@ -208,7 +202,8 @@ def TerrainSystem_VegetationSpawnsOnTerrainSurfaces():
|
||||
|
||||
Report.result(VegetationTests.testTag3_excluded_vegetation_z_correct, highest_z < box_height * gradient_value_2)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
from editor_python_test_tools.utils import Report
|
||||
Report.start_test(TerrainSystem_VegetationSpawnsOnTerrainSurfaces)
|
||||
Report.start_test(TerrainSystem_VegetationSpawnsOnTerrainSurfaces)
|
||||
|
||||
@@ -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
|
||||
"""
|
||||
|
||||
|
||||
#fmt: off
|
||||
class Tests():
|
||||
class Tests:
|
||||
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_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")
|
||||
#fmt: on
|
||||
|
||||
|
||||
def Terrain_SupportsPhysics():
|
||||
"""
|
||||
Summary:
|
||||
@@ -46,8 +48,7 @@ def Terrain_SupportsPhysics():
|
||||
:return: None
|
||||
"""
|
||||
|
||||
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
|
||||
import editor_python_test_tools.hydra_editor_utils as hydra
|
||||
import azlmbr.math as azmath
|
||||
@@ -59,12 +60,9 @@ def Terrain_SupportsPhysics():
|
||||
SET_BOX_X_SIZE = 1024.0
|
||||
SET_BOX_Y_SIZE = 1024.0
|
||||
SET_BOX_Z_SIZE = 100.0
|
||||
|
||||
helper.init_idle()
|
||||
|
||||
|
||||
# 1) Load the level
|
||||
helper.open_level("", "Base")
|
||||
helper.wait_for_condition(lambda: general.get_current_level_name() == "Base", 2.0)
|
||||
hydra.open_base_level()
|
||||
|
||||
#1a) Load the level components
|
||||
hydra.add_level_component("Terrain World")
|
||||
|
||||
+6
-10
@@ -47,8 +47,8 @@ def Terrain_World_ConfigurationWorks():
|
||||
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
|
||||
"""
|
||||
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
|
||||
import editor_python_test_tools.hydra_editor_utils as hydra
|
||||
import azlmbr.math as azmath
|
||||
@@ -62,14 +62,11 @@ def Terrain_World_ConfigurationWorks():
|
||||
SET_BOX_Y_SIZE = 2048.0
|
||||
SET_BOX_Z_SIZE = 100.0
|
||||
CLAMP = 1
|
||||
|
||||
helper.init_idle()
|
||||
|
||||
|
||||
# 1) Start the Tracer to catch any errors and warnings
|
||||
with Tracer() as section_tracer:
|
||||
# 2) Load the level
|
||||
helper.open_level("", "Base")
|
||||
helper.wait_for_condition(lambda: general.get_current_level_name() == "Base", 2.0)
|
||||
hydra.open_base_level()
|
||||
|
||||
# 3) Load the level components
|
||||
terrain_world_component = hydra.add_level_component("Terrain World")
|
||||
@@ -93,7 +90,7 @@ def Terrain_World_ConfigurationWorks():
|
||||
# 5) Set the base Terrain World values
|
||||
world_bounds_max = azmath.Vector3(1100.0, 1100.0, 1100.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 (Min)", world_bounds_min)
|
||||
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
|
||||
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)
|
||||
general.idle_wait_frames(1)
|
||||
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
|
||||
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.
|
||||
|
||||
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 os
|
||||
import sys
|
||||
|
||||
from ly_test_tools import LAUNCHERS
|
||||
from ly_test_tools.o3de.editor_test import EditorTestSuite, EditorSharedTest
|
||||
|
||||
|
||||
@pytest.mark.SUITE_main
|
||||
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
|
||||
@pytest.mark.parametrize("project", ["AutomatedTesting"])
|
||||
class TestAutomation(EditorTestSuite):
|
||||
|
||||
enable_prefab_system = False
|
||||
|
||||
class test_AxisAlignedBoxShape_ConfigurationWorks(EditorSharedTest):
|
||||
from .EditorScripts import TerrainPhysicsCollider_ChangesSizeWithAxisAlignedBoxShapeChanges as test_module
|
||||
|
||||
|
||||
+5
-5
@@ -242,7 +242,7 @@ Node Type: BoneData
|
||||
BasisX: < 1.000000, -0.000000, 0.000000>
|
||||
BasisY: < 0.000000, 1.000000, 0.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 Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.animation
|
||||
@@ -544,7 +544,7 @@ Node Type: BoneData
|
||||
Node Name: animation
|
||||
Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_upArmRoll.animation
|
||||
Node Type: AnimationData
|
||||
KeyFrames: Count 195. Hash: 8781707605519483934
|
||||
KeyFrames: Count 195. Hash: 15529789169672670472
|
||||
TimeStepBetweenFrames: 0.033333
|
||||
|
||||
Node Name: transform
|
||||
@@ -710,7 +710,7 @@ Node Type: BoneData
|
||||
BasisX: < 0.514369, 0.855813, 0.054857>
|
||||
BasisY: < 0.088153, 0.010863, -0.996047>
|
||||
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 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>
|
||||
BasisY: < 0.465563, -0.180309, -0.866452>
|
||||
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 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>
|
||||
BasisY: < 0.928150, 0.286271, -0.237880>
|
||||
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 Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1.animation
|
||||
|
||||
+41
-41
@@ -114,7 +114,7 @@
|
||||
<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="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>
|
||||
@@ -191,7 +191,7 @@
|
||||
<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="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>
|
||||
@@ -204,7 +204,7 @@
|
||||
<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="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>
|
||||
@@ -268,7 +268,7 @@
|
||||
<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="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>
|
||||
@@ -319,7 +319,7 @@
|
||||
<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="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>
|
||||
@@ -408,7 +408,7 @@
|
||||
<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="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>
|
||||
@@ -497,7 +497,7 @@
|
||||
<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="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>
|
||||
@@ -548,7 +548,7 @@
|
||||
<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="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>
|
||||
@@ -650,7 +650,7 @@
|
||||
<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="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>
|
||||
@@ -701,7 +701,7 @@
|
||||
<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="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>
|
||||
@@ -727,7 +727,7 @@
|
||||
<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="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>
|
||||
@@ -854,7 +854,7 @@
|
||||
<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="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>
|
||||
@@ -905,7 +905,7 @@
|
||||
<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="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>
|
||||
@@ -1109,7 +1109,7 @@
|
||||
<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="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>
|
||||
@@ -1141,7 +1141,7 @@
|
||||
<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="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 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::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
|
||||
<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>
|
||||
@@ -1441,7 +1441,7 @@
|
||||
<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="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>
|
||||
@@ -1454,7 +1454,7 @@
|
||||
<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="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>
|
||||
@@ -1467,7 +1467,7 @@
|
||||
<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="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>
|
||||
@@ -1569,7 +1569,7 @@
|
||||
<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="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>
|
||||
@@ -1582,7 +1582,7 @@
|
||||
<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="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>
|
||||
@@ -1608,7 +1608,7 @@
|
||||
<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="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>
|
||||
@@ -1659,7 +1659,7 @@
|
||||
<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="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>
|
||||
@@ -1710,7 +1710,7 @@
|
||||
<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="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>
|
||||
@@ -1761,7 +1761,7 @@
|
||||
<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="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>
|
||||
@@ -1812,7 +1812,7 @@
|
||||
<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="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>
|
||||
@@ -1825,7 +1825,7 @@
|
||||
<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="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>
|
||||
@@ -1914,7 +1914,7 @@
|
||||
<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="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>
|
||||
@@ -1965,7 +1965,7 @@
|
||||
<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="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>
|
||||
@@ -2067,7 +2067,7 @@
|
||||
<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="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>
|
||||
@@ -2169,7 +2169,7 @@
|
||||
<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="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>
|
||||
@@ -2220,7 +2220,7 @@
|
||||
<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="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>
|
||||
@@ -2271,7 +2271,7 @@
|
||||
<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="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>
|
||||
@@ -2322,7 +2322,7 @@
|
||||
<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="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>
|
||||
@@ -2373,7 +2373,7 @@
|
||||
<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="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>
|
||||
@@ -2475,7 +2475,7 @@
|
||||
<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="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>
|
||||
@@ -2526,7 +2526,7 @@
|
||||
<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="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>
|
||||
@@ -2628,7 +2628,7 @@
|
||||
<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="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>
|
||||
@@ -2793,7 +2793,7 @@
|
||||
<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="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>
|
||||
@@ -2844,7 +2844,7 @@
|
||||
<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="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>
|
||||
@@ -3009,7 +3009,7 @@
|
||||
<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="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>
|
||||
|
||||
+6
-6
@@ -90,7 +90,7 @@ Node Path: RootNode.lodtest_lod1.lodtest_lod1_1
|
||||
Node Type: MeshData
|
||||
Positions: Count 192. Hash: 1283526254311745349
|
||||
Normals: Count 192. Hash: 1873340970602844856
|
||||
FaceList: Count 124. Hash: 3728991722746136013
|
||||
FaceList: Count 124. Hash: 8546457964849634958
|
||||
FaceMaterialIds: Count 124. Hash: 2372486708814455910
|
||||
|
||||
Node Name: lodtest_lod1_2
|
||||
@@ -107,7 +107,7 @@ Node Path: RootNode.lodtest_lod1.lodtest_lod1_1_optimized
|
||||
Node Type: MeshData
|
||||
Positions: Count 192. Hash: 7921557352486854444
|
||||
Normals: Count 192. Hash: 1873340970602844856
|
||||
FaceList: Count 124. Hash: 18311637590974204568
|
||||
FaceList: Count 124. Hash: 7602933716150163115
|
||||
FaceMaterialIds: Count 124. Hash: 2372486708814455910
|
||||
|
||||
Node Name: transform
|
||||
@@ -641,14 +641,14 @@ Node Type: MaterialData
|
||||
Node Name: TangentSet_0
|
||||
Node Path: RootNode.lodtest_lod1.lodtest_lod1_1.TangentSet_0
|
||||
Node Type: MeshVertexTangentData
|
||||
Tangents: Count 192. Hash: 11165448242141781141
|
||||
Tangents: Count 192. Hash: 13347865366302598201
|
||||
GenerationMethod: 1
|
||||
SetIndex: 0
|
||||
|
||||
Node Name: BitangentSet_0
|
||||
Node Path: RootNode.lodtest_lod1.lodtest_lod1_1.BitangentSet_0
|
||||
Node Type: MeshVertexBitangentData
|
||||
Bitangents: Count 192. Hash: 7987814487334449536
|
||||
Bitangents: Count 192. Hash: 11177881960262055002
|
||||
GenerationMethod: 1
|
||||
|
||||
Node Name: transform
|
||||
@@ -705,14 +705,14 @@ Node Type: MeshVertexUVData
|
||||
Node Name: TangentSet_0
|
||||
Node Path: RootNode.lodtest_lod1.lodtest_lod1_1_optimized.TangentSet_0
|
||||
Node Type: MeshVertexTangentData
|
||||
Tangents: Count 192. Hash: 7293001660047850407
|
||||
Tangents: Count 192. Hash: 13256424469303674766
|
||||
GenerationMethod: 1
|
||||
SetIndex: 0
|
||||
|
||||
Node Name: BitangentSet_0
|
||||
Node Path: RootNode.lodtest_lod1.lodtest_lod1_1_optimized.BitangentSet_0
|
||||
Node Type: MeshVertexBitangentData
|
||||
Bitangents: Count 192. Hash: 2874689498270494796
|
||||
Bitangents: Count 192. Hash: 12542581737782433115
|
||||
GenerationMethod: 1
|
||||
|
||||
Node Name: transform
|
||||
|
||||
+6
-6
@@ -424,7 +424,7 @@
|
||||
<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="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 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::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="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 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::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="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 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::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="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 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::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="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 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::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="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 name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
|
||||
|
||||
+6
-6
@@ -15,7 +15,7 @@ Node Path: RootNode.Cone.Cone_1
|
||||
Node Type: MeshData
|
||||
Positions: Count 128. Hash: 7714223793259938211
|
||||
Normals: Count 128. Hash: 2352668179264002707
|
||||
FaceList: Count 62. Hash: 14563017593520122982
|
||||
FaceList: Count 62. Hash: 9996709738915796379
|
||||
FaceMaterialIds: Count 62. Hash: 12234218120113875284
|
||||
|
||||
Node Name: Cone_2
|
||||
@@ -32,7 +32,7 @@ Node Path: RootNode.Cone.Cone_1_optimized
|
||||
Node Type: MeshData
|
||||
Positions: Count 128. Hash: 10174710861731544050
|
||||
Normals: Count 128. Hash: 2352668179264002707
|
||||
FaceList: Count 62. Hash: 11332459830831720586
|
||||
FaceList: Count 62. Hash: 16809217014760075539
|
||||
FaceMaterialIds: Count 62. Hash: 12234218120113875284
|
||||
|
||||
Node Name: Cube_phys_1
|
||||
@@ -100,14 +100,14 @@ Node Type: MaterialData
|
||||
Node Name: TangentSet_0
|
||||
Node Path: RootNode.Cone.Cone_1.TangentSet_0
|
||||
Node Type: MeshVertexTangentData
|
||||
Tangents: Count 128. Hash: 14351734474754285313
|
||||
Tangents: Count 128. Hash: 913385441694195840
|
||||
GenerationMethod: 1
|
||||
SetIndex: 0
|
||||
|
||||
Node Name: BitangentSet_0
|
||||
Node Path: RootNode.Cone.Cone_1.BitangentSet_0
|
||||
Node Type: MeshVertexBitangentData
|
||||
Bitangents: Count 128. Hash: 15997251922861304891
|
||||
Bitangents: Count 128. Hash: 16763868708150748964
|
||||
GenerationMethod: 1
|
||||
|
||||
Node Name: transform
|
||||
@@ -164,14 +164,14 @@ Node Type: MeshVertexUVData
|
||||
Node Name: TangentSet_0
|
||||
Node Path: RootNode.Cone.Cone_1_optimized.TangentSet_0
|
||||
Node Type: MeshVertexTangentData
|
||||
Tangents: Count 128. Hash: 12937806066914201637
|
||||
Tangents: Count 128. Hash: 11496565252852403390
|
||||
GenerationMethod: 1
|
||||
SetIndex: 0
|
||||
|
||||
Node Name: BitangentSet_0
|
||||
Node Path: RootNode.Cone.Cone_1_optimized.BitangentSet_0
|
||||
Node Type: MeshVertexBitangentData
|
||||
Bitangents: Count 128. Hash: 873786942732834087
|
||||
Bitangents: Count 128. Hash: 6810649909977646014
|
||||
GenerationMethod: 1
|
||||
|
||||
Node Name: transform
|
||||
|
||||
+6
-6
@@ -55,7 +55,7 @@
|
||||
<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="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 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::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="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 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::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="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 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::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="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 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::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="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 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::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="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 name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
|
||||
|
||||
+6
-6
@@ -40,7 +40,7 @@ Node Path: RootNode.Cone.Cone_1
|
||||
Node Type: MeshData
|
||||
Positions: Count 128. Hash: 12506421592104186200
|
||||
Normals: Count 128. Hash: 367461522682321485
|
||||
FaceList: Count 62. Hash: 13208951979626973193
|
||||
FaceList: Count 62. Hash: 5910399941817424750
|
||||
FaceMaterialIds: Count 62. Hash: 15454348664434923102
|
||||
|
||||
Node Name: Cone_2
|
||||
@@ -57,7 +57,7 @@ Node Path: RootNode.Cone.Cone_1_optimized
|
||||
Node Type: MeshData
|
||||
Positions: Count 128. Hash: 14946490408303214595
|
||||
Normals: Count 128. Hash: 367461522682321485
|
||||
FaceList: Count 62. Hash: 11102693598481718079
|
||||
FaceList: Count 62. Hash: 17210030509394354449
|
||||
FaceMaterialIds: Count 62. Hash: 15454348664434923102
|
||||
|
||||
Node Name: transform
|
||||
@@ -389,14 +389,14 @@ Node Type: MaterialData
|
||||
Node Name: TangentSet_0
|
||||
Node Path: RootNode.Cone.Cone_1.TangentSet_0
|
||||
Node Type: MeshVertexTangentData
|
||||
Tangents: Count 128. Hash: 12695232913942738512
|
||||
Tangents: Count 128. Hash: 11574815809363656385
|
||||
GenerationMethod: 1
|
||||
SetIndex: 0
|
||||
|
||||
Node Name: BitangentSet_0
|
||||
Node Path: RootNode.Cone.Cone_1.BitangentSet_0
|
||||
Node Type: MeshVertexBitangentData
|
||||
Bitangents: Count 128. Hash: 9034210764777745751
|
||||
Bitangents: Count 128. Hash: 1026129762512670051
|
||||
GenerationMethod: 1
|
||||
|
||||
Node Name: transform
|
||||
@@ -483,14 +483,14 @@ Node Type: MeshVertexUVData
|
||||
Node Name: TangentSet_0
|
||||
Node Path: RootNode.Cone.Cone_1_optimized.TangentSet_0
|
||||
Node Type: MeshVertexTangentData
|
||||
Tangents: Count 128. Hash: 10740776669168782230
|
||||
Tangents: Count 128. Hash: 5198081677141836233
|
||||
GenerationMethod: 1
|
||||
SetIndex: 0
|
||||
|
||||
Node Name: BitangentSet_0
|
||||
Node Path: RootNode.Cone.Cone_1_optimized.BitangentSet_0
|
||||
Node Type: MeshVertexBitangentData
|
||||
Bitangents: Count 128. Hash: 6990068477421150065
|
||||
Bitangents: Count 128. Hash: 6948605204859680167
|
||||
GenerationMethod: 1
|
||||
|
||||
Node Name: transform
|
||||
|
||||
+6
-6
@@ -178,7 +178,7 @@
|
||||
<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="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 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::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="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 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::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="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 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::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="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 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::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="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 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::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="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 name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
|
||||
|
||||
+6
-6
@@ -40,7 +40,7 @@ Node Path: RootNode.Cylinder.Cylinder_1
|
||||
Node Type: MeshData
|
||||
Positions: Count 192. Hash: 1283526254311745349
|
||||
Normals: Count 192. Hash: 1873340970602844856
|
||||
FaceList: Count 124. Hash: 3728991722746136013
|
||||
FaceList: Count 124. Hash: 8546457964849634958
|
||||
FaceMaterialIds: Count 124. Hash: 2372486708814455910
|
||||
|
||||
Node Name: Cylinder_2
|
||||
@@ -57,7 +57,7 @@ Node Path: RootNode.Cylinder.Cylinder_1_optimized
|
||||
Node Type: MeshData
|
||||
Positions: Count 192. Hash: 7921557352486854444
|
||||
Normals: Count 192. Hash: 1873340970602844856
|
||||
FaceList: Count 124. Hash: 18311637590974204568
|
||||
FaceList: Count 124. Hash: 7602933716150163115
|
||||
FaceMaterialIds: Count 124. Hash: 2372486708814455910
|
||||
|
||||
Node Name: transform
|
||||
@@ -269,14 +269,14 @@ Node Type: MaterialData
|
||||
Node Name: TangentSet_0
|
||||
Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0
|
||||
Node Type: MeshVertexTangentData
|
||||
Tangents: Count 192. Hash: 11165448242141781141
|
||||
Tangents: Count 192. Hash: 13347865366302598201
|
||||
GenerationMethod: 1
|
||||
SetIndex: 0
|
||||
|
||||
Node Name: BitangentSet_0
|
||||
Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0
|
||||
Node Type: MeshVertexBitangentData
|
||||
Bitangents: Count 192. Hash: 7987814487334449536
|
||||
Bitangents: Count 192. Hash: 11177881960262055002
|
||||
GenerationMethod: 1
|
||||
|
||||
Node Name: transform
|
||||
@@ -333,14 +333,14 @@ Node Type: MeshVertexUVData
|
||||
Node Name: TangentSet_0
|
||||
Node Path: RootNode.Cylinder.Cylinder_1_optimized.TangentSet_0
|
||||
Node Type: MeshVertexTangentData
|
||||
Tangents: Count 192. Hash: 7293001660047850407
|
||||
Tangents: Count 192. Hash: 13256424469303674766
|
||||
GenerationMethod: 1
|
||||
SetIndex: 0
|
||||
|
||||
Node Name: BitangentSet_0
|
||||
Node Path: RootNode.Cylinder.Cylinder_1_optimized.BitangentSet_0
|
||||
Node Type: MeshVertexBitangentData
|
||||
Bitangents: Count 192. Hash: 2874689498270494796
|
||||
Bitangents: Count 192. Hash: 12542581737782433115
|
||||
GenerationMethod: 1
|
||||
|
||||
Node Name: transform
|
||||
|
||||
+6
-6
@@ -178,7 +178,7 @@
|
||||
<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="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 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::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="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 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::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="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 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::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="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 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::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="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 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::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="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 name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
|
||||
|
||||
+6
-6
@@ -40,7 +40,7 @@ Node Path: RootNode.Cylinder.Cylinder_1
|
||||
Node Type: MeshData
|
||||
Positions: Count 192. Hash: 1283526254311745349
|
||||
Normals: Count 192. Hash: 1873340970602844856
|
||||
FaceList: Count 124. Hash: 3728991722746136013
|
||||
FaceList: Count 124. Hash: 8546457964849634958
|
||||
FaceMaterialIds: Count 124. Hash: 2372486708814455910
|
||||
|
||||
Node Name: Cylinder_2
|
||||
@@ -57,7 +57,7 @@ Node Path: RootNode.Cylinder.Cylinder_1_optimized
|
||||
Node Type: MeshData
|
||||
Positions: Count 192. Hash: 7921557352486854444
|
||||
Normals: Count 192. Hash: 1873340970602844856
|
||||
FaceList: Count 124. Hash: 18311637590974204568
|
||||
FaceList: Count 124. Hash: 7602933716150163115
|
||||
FaceMaterialIds: Count 124. Hash: 2372486708814455910
|
||||
|
||||
Node Name: transform
|
||||
@@ -269,14 +269,14 @@ Node Type: MaterialData
|
||||
Node Name: TangentSet_0
|
||||
Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0
|
||||
Node Type: MeshVertexTangentData
|
||||
Tangents: Count 192. Hash: 11165448242141781141
|
||||
Tangents: Count 192. Hash: 13347865366302598201
|
||||
GenerationMethod: 1
|
||||
SetIndex: 0
|
||||
|
||||
Node Name: BitangentSet_0
|
||||
Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0
|
||||
Node Type: MeshVertexBitangentData
|
||||
Bitangents: Count 192. Hash: 7987814487334449536
|
||||
Bitangents: Count 192. Hash: 11177881960262055002
|
||||
GenerationMethod: 1
|
||||
|
||||
Node Name: transform
|
||||
@@ -333,14 +333,14 @@ Node Type: MeshVertexUVData
|
||||
Node Name: TangentSet_0
|
||||
Node Path: RootNode.Cylinder.Cylinder_1_optimized.TangentSet_0
|
||||
Node Type: MeshVertexTangentData
|
||||
Tangents: Count 192. Hash: 7293001660047850407
|
||||
Tangents: Count 192. Hash: 13256424469303674766
|
||||
GenerationMethod: 1
|
||||
SetIndex: 0
|
||||
|
||||
Node Name: BitangentSet_0
|
||||
Node Path: RootNode.Cylinder.Cylinder_1_optimized.BitangentSet_0
|
||||
Node Type: MeshVertexBitangentData
|
||||
Bitangents: Count 192. Hash: 2874689498270494796
|
||||
Bitangents: Count 192. Hash: 12542581737782433115
|
||||
GenerationMethod: 1
|
||||
|
||||
Node Name: transform
|
||||
|
||||
+6
-6
@@ -178,7 +178,7 @@
|
||||
<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="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 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::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="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 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::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="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 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::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="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 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::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="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 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::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="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 name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
|
||||
|
||||
+3
-3
@@ -40,7 +40,7 @@ Node Path: RootNode.Cylinder.Cylinder_1
|
||||
Node Type: MeshData
|
||||
Positions: Count 192. Hash: 1283526254311745349
|
||||
Normals: Count 192. Hash: 1873340970602844856
|
||||
FaceList: Count 124. Hash: 3728991722746136013
|
||||
FaceList: Count 124. Hash: 8546457964849634958
|
||||
FaceMaterialIds: Count 124. Hash: 2372486708814455910
|
||||
|
||||
Node Name: Cylinder_2
|
||||
@@ -261,14 +261,14 @@ Node Type: MaterialData
|
||||
Node Name: TangentSet_0
|
||||
Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0
|
||||
Node Type: MeshVertexTangentData
|
||||
Tangents: Count 192. Hash: 11165448242141781141
|
||||
Tangents: Count 192. Hash: 13347865366302598201
|
||||
GenerationMethod: 1
|
||||
SetIndex: 0
|
||||
|
||||
Node Name: BitangentSet_0
|
||||
Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0
|
||||
Node Type: MeshVertexBitangentData
|
||||
Bitangents: Count 192. Hash: 7987814487334449536
|
||||
Bitangents: Count 192. Hash: 11177881960262055002
|
||||
GenerationMethod: 1
|
||||
|
||||
Node Name: transform
|
||||
|
||||
+3
-3
@@ -178,7 +178,7 @@
|
||||
<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="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 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::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="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 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::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="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 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())
|
||||
except FileNotFoundError as e:
|
||||
self.logger.debug(f"File restoration failed, editor log could not be found.\nError: {e}")
|
||||
editor.kill()
|
||||
editor.stop()
|
||||
|
||||
request.addfinalizer(teardown)
|
||||
|
||||
@@ -113,7 +113,7 @@ class TestAutomationBase:
|
||||
editor.wait(TestAutomationBase.MAX_TIMEOUT)
|
||||
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"))
|
||||
editor.kill()
|
||||
editor.stop()
|
||||
|
||||
output = editor.get_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
|
||||
:return List of matching nodes
|
||||
"""
|
||||
component_type_id = hydra.get_component_type_id(component_name)
|
||||
component = editor.EditorComponentAPIBus(bus.Broadcast, 'GetComponentOfType', entity_id,
|
||||
hydra.get_component_type_id(component_name))
|
||||
component_type_id)
|
||||
|
||||
if component.IsSuccess():
|
||||
component_id = component.GetValue()
|
||||
component_node = landscapecanvas.LandscapeCanvasRequestBus(bus.Broadcast, 'GetAllNodesMatchingEntityComponent',
|
||||
component_id)
|
||||
if component_node:
|
||||
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
|
||||
|
||||
@@ -32,13 +32,13 @@ def Menus_FileMenuOptions_Work():
|
||||
|
||||
file_menu_options = [
|
||||
("New Level",),
|
||||
#("Open Level",), Temporarily disabled due to https://github.com/o3de/o3de/issues/6605
|
||||
#("Import",), Temporarily disabled due to https://github.com/o3de/o3de/issues/6746
|
||||
("Open Level",),
|
||||
#("Import",), #Temporarily disabled due to https://github.com/o3de/o3de/issues/6746
|
||||
("Save",),
|
||||
#("Save As",), Temporarily disabled due to https://github.com/o3de/o3de/issues/6605
|
||||
("Save As",),
|
||||
("Save Level Statistics",),
|
||||
("Edit Project Settings",),
|
||||
#("Edit Platform Settings",), Temporarily disabled due to https://github.com/o3de/o3de/issues/6604
|
||||
("Edit Platform Settings",),
|
||||
("New Project",),
|
||||
("Open Project",),
|
||||
("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
|
||||
TEST_SERIAL
|
||||
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
|
||||
AZ::AssetProcessor
|
||||
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
|
||||
TEST_SERIAL
|
||||
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
|
||||
AZ::AssetProcessor
|
||||
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
|
||||
TEST_SERIAL
|
||||
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
|
||||
AZ::AssetProcessor
|
||||
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
|
||||
TEST_SERIAL
|
||||
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
|
||||
AZ::AssetProcessor
|
||||
Legacy::Editor
|
||||
|
||||
+3
-7
@@ -51,22 +51,18 @@ def AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude():
|
||||
|
||||
import os
|
||||
|
||||
import azlmbr.asset as asset
|
||||
import azlmbr.editor as editor
|
||||
import azlmbr.legacy.general as general
|
||||
import azlmbr.bus as bus
|
||||
import azlmbr.math as math
|
||||
import azlmbr.prefab as prefab
|
||||
|
||||
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 editor_python_test_tools.utils import Report
|
||||
from editor_python_test_tools.utils import TestHelper as helper
|
||||
|
||||
# 1) Open an existing simple level
|
||||
helper.init_idle()
|
||||
helper.open_level("", "Base")
|
||||
hydra.open_base_level()
|
||||
|
||||
# Set view of planting area for visual debugging
|
||||
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)
|
||||
|
||||
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
|
||||
spawner_entity.add_component("Vegetation Altitude Filter")
|
||||
|
||||
+3
-6
@@ -32,9 +32,7 @@ def AltitudeFilter_FilterStageToggle():
|
||||
import os
|
||||
|
||||
import azlmbr.legacy.general as general
|
||||
import azlmbr.bus as bus
|
||||
import azlmbr.math as math
|
||||
import azlmbr.prefab as prefab
|
||||
|
||||
import editor_python_test_tools.hydra_editor_utils as hydra
|
||||
from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg
|
||||
@@ -45,17 +43,16 @@ def AltitudeFilter_FilterStageToggle():
|
||||
POSTPROCESS_INSTANCE_COUNT = 34
|
||||
|
||||
# Open an existing simple level
|
||||
helper.init_idle()
|
||||
helper.open_level("", "Base")
|
||||
hydra.open_base_level()
|
||||
general.set_current_view_position(512.0, 480.0, 38.0)
|
||||
|
||||
# Create basic vegetation entity
|
||||
position = math.Vector3(512.0, 512.0, 32.0)
|
||||
|
||||
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
|
||||
vegetation.add_component("Vegetation Altitude Filter")
|
||||
|
||||
+3
-4
@@ -56,8 +56,7 @@ def AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude():
|
||||
from editor_python_test_tools.utils import TestHelper as helper
|
||||
|
||||
# 1) Open an existing simple level
|
||||
helper.init_idle()
|
||||
helper.open_level("", "Base")
|
||||
hydra.open_base_level()
|
||||
|
||||
# Set view of planting area for visual debugging
|
||||
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)
|
||||
|
||||
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
|
||||
spawner_entity.add_component("Vegetation Altitude Filter")
|
||||
|
||||
+32
-12
@@ -56,19 +56,21 @@ def AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea():
|
||||
"""
|
||||
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
import azlmbr.bus as bus
|
||||
import azlmbr.editor as editor
|
||||
import azlmbr.legacy.general as general
|
||||
import azlmbr.math as math
|
||||
import azlmbr.vegetation as vegetation
|
||||
import azlmbr.prefab as prefab
|
||||
|
||||
import editor_python_test_tools.hydra_editor_utils as hydra
|
||||
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 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.create_entity(
|
||||
center,
|
||||
@@ -77,18 +79,34 @@ def AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea():
|
||||
if asset_list_entity.id.IsValid():
|
||||
print(f"'{asset_list_entity.name}' created")
|
||||
|
||||
# Set the Asset List to a Dynamic Slice spawner with a specific slice asset selected
|
||||
dynamic_slice_spawner = vegetation.DynamicSliceInstanceSpawner()
|
||||
dynamic_slice_spawner.SetSliceAssetPath(dynamic_slice_asset_path)
|
||||
if target_prefab:
|
||||
# Get the in-memory spawnable asset id if exists
|
||||
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],
|
||||
"Configuration|Embedded Assets|[0]")
|
||||
descriptor.spawner = dynamic_slice_spawner
|
||||
'Configuration|Embedded Assets|[0]')
|
||||
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)
|
||||
return asset_list_entity
|
||||
|
||||
# 1) Open an existing simple level
|
||||
helper.init_idle()
|
||||
helper.open_level("Physics", "Base")
|
||||
hydra.open_base_level()
|
||||
|
||||
# Set view of planting area for visual debugging
|
||||
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
|
||||
center_point = math.Vector3(512.0, 512.0, 32.0)
|
||||
asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
|
||||
asset_path2 = os.path.join("Slices", "PurpleFlower.dynamicslice")
|
||||
asset_list_entity = create_asset_list_entity("Asset List 1", center_point, asset_path)
|
||||
pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
|
||||
pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "AssetList_PinkFlower")[0]
|
||||
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_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
|
||||
# on center instead of corner
|
||||
|
||||
+6
-6
@@ -56,8 +56,7 @@ def AssetWeightSelector_InstancesExpressBasedOnWeight():
|
||||
from editor_python_test_tools.utils import TestHelper as helper
|
||||
|
||||
# 1) Open an existing simple level
|
||||
helper.init_idle()
|
||||
helper.open_level("Physics", "Base")
|
||||
hydra.open_base_level()
|
||||
|
||||
# Set view of planting area for visual debugging
|
||||
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
|
||||
# valid slice entity, and one set to None
|
||||
spawner_center_point = math.Vector3(512.0, 512.0, 32.0)
|
||||
asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
|
||||
spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0, 16.0,
|
||||
asset_path)
|
||||
pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
|
||||
pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "AssetWeight_PinkFlower")[0]
|
||||
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],
|
||||
"Configuration|Embedded Assets")[0]
|
||||
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|[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
|
||||
spawner_entity.add_component("Vegetation Asset Weight Selector")
|
||||
|
||||
+5
-6
@@ -64,16 +64,15 @@ def DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius():
|
||||
instance_query_point_c = math.Vector3(515.0, 512.5, 32.0)
|
||||
|
||||
# 1) Open an existing simple level
|
||||
helper.init_idle()
|
||||
helper.open_level("Physics", "Base")
|
||||
|
||||
hydra.open_base_level()
|
||||
general.set_current_view_position(512.0, 480.0, 38.0)
|
||||
|
||||
# 2) Create a new entity with required vegetation area components
|
||||
spawner_center_point = math.Vector3(520.0, 520.0, 32.0)
|
||||
asset_path = os.path.join("Slices", "1m_cube.dynamicslice")
|
||||
spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0, 16.0,
|
||||
asset_path)
|
||||
cube_asset_path = os.path.join("testdata", "multi-mat_fbx", "multi-mat_1m_cube.azmodel")
|
||||
cube_prefab = dynveg.create_temp_mesh_prefab(cube_asset_path, "DistanceBetween_1m_cube2")[0]
|
||||
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
|
||||
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
Reference in New Issue
Block a user