diff --git a/.clang-format b/.clang-format
index 2a9205219a..ef3ce64192 100644
--- a/.clang-format
+++ b/.clang-format
@@ -7,28 +7,34 @@ AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Right
AlignOperands: false
AlignTrailingComments: false
+AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortFunctionsOnASingleLine: None
+AllowShortLambdasOnASingleLine: None
AlwaysBreakAfterReturnType: None
AlwaysBreakTemplateDeclarations: true
+BinPackParameters: false
BreakBeforeBraces: Custom
BraceWrapping:
AfterClass: true
+ AfterControlStatement: true
AfterEnum: true
AfterFunction: true
AfterNamespace: true
+ BeforeLambdaBody: true
AfterStruct: true
- SplitEmptyFunction: true
- AfterControlStatement: true
BeforeElse: true
+ SplitEmptyFunction: true
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeComma
+BreakInheritanceList: BeforeComma
ColumnLimit: 140
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
-Cpp11BracedListStyle: true
+Cpp11BracedListStyle: false
FixNamespaceComments: true
IncludeBlocks: Preserve
+IndentCaseBlocks: true
IndentCaseLabels: false
IndentPPDirectives: None
IndentWidth: 4
@@ -38,27 +44,17 @@ NamespaceIndentation: All
PenaltyReturnTypeOnItsOwnLine: 1000
PointerAlignment: Left
SortIncludes: true
+SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: false
SpaceBeforeAssignmentOperators: true
+SpaceBeforeCpp11BracedList: false
+SpaceBeforeCtorInitializerColon: true
+SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
+SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyParentheses: false
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
+Standard: c++17
UseTab: Never
-
-# Not available in clang-format version 6.0.0
-# BasedOnStyle: Microsoft
-# Standard: c++17
-# AllowAllArgumentsOnNextLine: true
-# AllowShortLambdasOnASingleLine: None
-# BreakInheritanceList: BeforeComma
-# SpaceAfterLogicalNot: false
-# SpaceBeforeCpp11BracedList: false
-# SpaceBeforeCtorInitializerColon: true
-# SpaceBeforeInheritanceColon: true
-# SpaceBeforeRangeBasedForLoopColon: true
-
-# Not available in clang-format version 10.0.0
-# BeforeLambdaBody: true (BraceWrapping)
-# IndentCaseBlocks: true
diff --git a/.gitattributes b/.gitattributes
index 1755def66a..2037909dbd 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -115,5 +115,12 @@
*.wav filter=lfs diff=lfs merge=lfs -text
*.webm filter=lfs diff=lfs merge=lfs -text
*.wem filter=lfs diff=lfs merge=lfs -text
-*.wxs filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
+*.tbscene filter=lfs diff=lfs merge=lfs -text
+*.spp filter=lfs diff=lfs merge=lfs -text
+Gems/Atom/Tools/MaterialEditor/Assets/MaterialEditor/ViewportModels/Hermanubis.fbx filter=lfs diff=lfs merge=lfs -text
+Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_High.fbx filter=lfs diff=lfs merge=lfs -text
+Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/Lucy_low.fbx filter=lfs diff=lfs merge=lfs -text
+Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/marmoset_bake.tbscene filter=lfs diff=lfs merge=lfs -text
+Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/Brass/brass_bake.spp filter=lfs diff=lfs merge=lfs -text
+Gems/AtomLyIntegration/CommonFeatures/Assets/Objects/Lucy/.wip/stone/stone_bake.spp filter=lfs diff=lfs merge=lfs -text
diff --git a/.gitignore b/.gitignore
index c3af907e97..664680c5bf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@ __pycache__
AssetProcessorTemp/**
[Bb]uild/**
[Cc]ache/
+/install/
Editor/EditorEventLog.xml
Editor/EditorLayout.xml
**/*egg-info/**
@@ -19,3 +20,4 @@ _savebackup/
TestResults/**
*.swatches
/imgui.ini
+/scripts/project_manager/logs/
diff --git a/Assets/Editor/Icons/Components/NonUniformScale.svg b/Assets/Editor/Icons/Components/NonUniformScale.svg
new file mode 100644
index 0000000000..f377232d62
--- /dev/null
+++ b/Assets/Editor/Icons/Components/NonUniformScale.svg
@@ -0,0 +1,27 @@
+
+
\ No newline at end of file
diff --git a/Assets/Editor/Prefabs/Default_Level.prefab b/Assets/Editor/Prefabs/Default_Level.prefab
new file mode 100644
index 0000000000..fb82c5ab03
--- /dev/null
+++ b/Assets/Editor/Prefabs/Default_Level.prefab
@@ -0,0 +1,666 @@
+{
+ "Source": "Default_Level.prefab",
+ "ContainerEntity": {
+ "Id": "Entity_[1146574390643]",
+ "Name": "Level",
+ "Components": {
+ "Component_[10641544592923449938]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 10641544592923449938
+ },
+ "Component_[12039882709170782873]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 12039882709170782873
+ },
+ "Component_[12265484671603697631]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 12265484671603697631
+ },
+ "Component_[14126657869720434043]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 14126657869720434043
+ },
+ "Component_[15230859088967841193]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 15230859088967841193,
+ "Parent Entity": "",
+ "Cached World Transform Parent": ""
+ },
+ "Component_[16239496886950819870]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 16239496886950819870
+ },
+ "Component_[5688118765544765547]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 5688118765544765547
+ },
+ "Component_[6545738857812235305]": {
+ "$type": "SelectionComponent",
+ "Id": 6545738857812235305
+ },
+ "Component_[7247035804068349658]": {
+ "$type": "EditorPrefabComponent",
+ "Id": 7247035804068349658
+ },
+ "Component_[9307224322037797205]": {
+ "$type": "EditorLockComponent",
+ "Id": 9307224322037797205
+ },
+ "Component_[9562516168917670048]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9562516168917670048
+ }
+ },
+ "IsDependencyReady": true
+ },
+ "Entities": {
+ "Entity_[1155164325235]": {
+ "Id": "Entity_[1155164325235]",
+ "Name": "Sun",
+ "Components": {
+ "Component_[10440557478882592717]": {
+ "$type": "SelectionComponent",
+ "Id": 10440557478882592717
+ },
+ "Component_[13620450453324765907]": {
+ "$type": "EditorLockComponent",
+ "Id": 13620450453324765907
+ },
+ "Component_[2134313378593666258]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 2134313378593666258
+ },
+ "Component_[234010807770404186]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 234010807770404186
+ },
+ "Component_[2970359110423865725]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 2970359110423865725
+ },
+ "Component_[3722854130373041803]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3722854130373041803
+ },
+ "Component_[5992533738676323195]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5992533738676323195
+ },
+ "Component_[7378860763541895402]": {
+ "$type": "AZ::Render::EditorDirectionalLightComponent",
+ "Id": 7378860763541895402,
+ "Controller": {
+ "Configuration": {
+ "Intensity": 1.0,
+ "CameraEntityId": "",
+ "ShadowFilterMethod": 1,
+ "ShadowmapSize": "Size1024",
+ "Pcf Method": 1
+ }
+ }
+ },
+ "Component_[7892834440890947578]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 7892834440890947578,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 0.0,
+ 13.487043380737305
+ ],
+ "Rotate": [
+ -76.13099670410156,
+ -0.847000002861023,
+ -15.8100004196167
+ ]
+ },
+ "Cached World Transform": {
+ "Translation": [
+ 0.0,
+ 0.0,
+ 9.442070960998536
+ ],
+ "Rotation": [
+ -0.6098860502243042,
+ -0.09055805951356888,
+ -0.10376212745904924,
+ 0.7804304361343384
+ ]
+ },
+ "Cached World Transform Parent": "Entity_[1176639161715]"
+ },
+ "Component_[8599729549570828259]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 8599729549570828259
+ },
+ "Component_[952797371922080273]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 952797371922080273
+ }
+ },
+ "IsDependencyReady": true
+ },
+ "Entity_[1159459292531]": {
+ "Id": "Entity_[1159459292531]",
+ "Name": "Ground",
+ "Components": {
+ "Component_[11701138785793981042]": {
+ "$type": "SelectionComponent",
+ "Id": 11701138785793981042
+ },
+ "Component_[12260880513256986252]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 12260880513256986252
+ },
+ "Component_[13711420870643673468]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 13711420870643673468
+ },
+ "Component_[138002849734991713]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 138002849734991713
+ },
+ "Component_[16578565737331764849]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 16578565737331764849,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Cached World Transform": {
+ "Translation": [
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ },
+ "Cached World Transform Parent": "Entity_[1176639161715]"
+ },
+ "Component_[16919232076966545697]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 16919232076966545697
+ },
+ "Component_[5182430712893438093]": {
+ "$type": "EditorMaterialComponent",
+ "Id": 5182430712893438093,
+ "materialSlots": [
+ {
+ "id": {
+ "materialAssetId": {
+ "guid": "{935F694A-8639-515B-8133-81CDC7948E5B}",
+ "subId": 803645540
+ }
+ }
+ }
+ ],
+ "materialSlotsByLod": [
+ [
+ {
+ "id": {
+ "lodIndex": 0,
+ "materialAssetId": {
+ "guid": "{935F694A-8639-515B-8133-81CDC7948E5B}",
+ "subId": 803645540
+ }
+ }
+ }
+ ]
+ ]
+ },
+ "Component_[5675108321710651991]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 5675108321710651991,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{935F694A-8639-515B-8133-81CDC7948E5B}",
+ "subId": 277333723
+ },
+ "assetHint": "objects/groudplane/groundplane_521x521m.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[5681893399601237518]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5681893399601237518
+ },
+ "Component_[592692962543397545]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 592692962543397545
+ },
+ "Component_[7090012899106946164]": {
+ "$type": "EditorLockComponent",
+ "Id": 7090012899106946164
+ },
+ "Component_[9410832619875640998]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9410832619875640998
+ }
+ },
+ "IsDependencyReady": true
+ },
+ "Entity_[1163754259827]": {
+ "Id": "Entity_[1163754259827]",
+ "Name": "Camera",
+ "Components": {
+ "Component_[11895140916889160460]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11895140916889160460
+ },
+ "Component_[16880285896855930892]": {
+ "$type": "{CA11DA46-29FF-4083-B5F6-E02C3A8C3A3D} EditorCameraComponent",
+ "Id": 16880285896855930892,
+ "Controller": {
+ "Configuration": {
+ "Field of View": 55.0,
+ "EditorEntityId": 8929576024571800510
+ }
+ }
+ },
+ "Component_[17187464423780271193]": {
+ "$type": "EditorLockComponent",
+ "Id": 17187464423780271193
+ },
+ "Component_[17495696818315413311]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 17495696818315413311
+ },
+ "Component_[18086214374043522055]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 18086214374043522055,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Translate": [
+ -2.300000190734864,
+ -3.9368600845336916,
+ 1.0
+ ],
+ "Rotate": [
+ -2.050307512283325,
+ 1.9552897214889529,
+ -43.62335586547852
+ ]
+ },
+ "Cached World Transform": {
+ "Translation": [
+ -11.904647827148438,
+ 13.392678260803223,
+ -3.0449724197387697
+ ],
+ "Rotation": [
+ -0.02294669672846794,
+ 0.00919158011674881,
+ -0.37172695994377139,
+ 0.9280129671096802
+ ]
+ },
+ "Cached World Transform Parent": "Entity_[1176639161715]"
+ },
+ "Component_[18387556550380114975]": {
+ "$type": "SelectionComponent",
+ "Id": 18387556550380114975
+ },
+ "Component_[2654521436129313160]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 2654521436129313160
+ },
+ "Component_[5265045084611556958]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5265045084611556958
+ },
+ "Component_[7169798125182238623]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7169798125182238623
+ },
+ "Component_[8866210352157164042]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 8866210352157164042
+ },
+ "Component_[9129253381063760879]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 9129253381063760879
+ }
+ },
+ "IsDependencyReady": true
+ },
+ "Entity_[1168049227123]": {
+ "Id": "Entity_[1168049227123]",
+ "Name": "Grid",
+ "Components": {
+ "Component_[11443347433215807130]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11443347433215807130
+ },
+ "Component_[11779275529534764488]": {
+ "$type": "SelectionComponent",
+ "Id": 11779275529534764488
+ },
+ "Component_[14249419413039427459]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14249419413039427459
+ },
+ "Component_[15448581635946161318]": {
+ "$type": "AZ::Render::EditorGridComponent",
+ "Id": 15448581635946161318,
+ "Controller": {
+ "Configuration": {
+ "primarySpacing": 4.0,
+ "primaryColor": [
+ 0.501960813999176,
+ 0.501960813999176,
+ 0.501960813999176
+ ],
+ "secondarySpacing": 0.5,
+ "secondaryColor": [
+ 0.250980406999588,
+ 0.250980406999588,
+ 0.250980406999588
+ ]
+ }
+ }
+ },
+ "Component_[1843303322527297409]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 1843303322527297409
+ },
+ "Component_[380249072065273654]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 380249072065273654,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Cached World Transform": {
+ "Translation": [
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ },
+ "Cached World Transform Parent": "Entity_[1176639161715]"
+ },
+ "Component_[7476660583684339787]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7476660583684339787
+ },
+ "Component_[7557626501215118375]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 7557626501215118375
+ },
+ "Component_[7984048488947365511]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 7984048488947365511
+ },
+ "Component_[8118181039276487398]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 8118181039276487398
+ },
+ "Component_[9189909764215270515]": {
+ "$type": "EditorLockComponent",
+ "Id": 9189909764215270515
+ }
+ },
+ "IsDependencyReady": true
+ },
+ "Entity_[1172344194419]": {
+ "Id": "Entity_[1172344194419]",
+ "Name": "Shader Ball",
+ "Components": {
+ "Component_[10789351944715265527]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 10789351944715265527
+ },
+ "Component_[12037033284781049225]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 12037033284781049225
+ },
+ "Component_[13759153306105970079]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 13759153306105970079
+ },
+ "Component_[14135560884830586279]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14135560884830586279
+ },
+ "Component_[16247165675903986673]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 16247165675903986673
+ },
+ "Component_[18082433625958885247]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 18082433625958885247
+ },
+ "Component_[6472623349872972660]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6472623349872972660,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Rotate": [
+ 0.0,
+ 0.10000000149011612,
+ 180.0
+ ]
+ },
+ "Cached World Transform": {
+ "Translation": [
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "Rotation": [
+ 0.0008726645028218627,
+ 0.0,
+ 0.9999996423721314,
+ 0.0
+ ]
+ },
+ "Cached World Transform Parent": "Entity_[1176639161715]"
+ },
+ "Component_[6495255223970673916]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 6495255223970673916,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{FD340C30-755C-5911-92A3-19A3F7A77931}",
+ "subId": 281415304
+ },
+ "assetHint": "objects/shaderball/shaderball_default_1m.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[8056625192494070973]": {
+ "$type": "SelectionComponent",
+ "Id": 8056625192494070973
+ },
+ "Component_[8550141614185782969]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 8550141614185782969
+ },
+ "Component_[9439770997198325425]": {
+ "$type": "EditorLockComponent",
+ "Id": 9439770997198325425
+ }
+ },
+ "IsDependencyReady": true
+ },
+ "Entity_[1176639161715]": {
+ "Id": "Entity_[1176639161715]",
+ "Name": "Atom Default Environment",
+ "Components": {
+ "Component_[10757302973393310045]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 10757302973393310045,
+ "Parent Entity": "Entity_[1146574390643]",
+ "Cached World Transform": {
+ "Translation": [
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ },
+ "Cached World Transform Parent": "Entity_[1146574390643]"
+ },
+ "Component_[14505817420424255464]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14505817420424255464,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 10757302973393310045
+ }
+ ]
+ },
+ "Component_[14988041764659020032]": {
+ "$type": "EditorLockComponent",
+ "Id": 14988041764659020032
+ },
+ "Component_[15808690248755038124]": {
+ "$type": "SelectionComponent",
+ "Id": 15808690248755038124
+ },
+ "Component_[15900837685796817138]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 15900837685796817138
+ },
+ "Component_[3298767348226484884]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3298767348226484884
+ },
+ "Component_[4076975109609220594]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 4076975109609220594
+ },
+ "Component_[5679760548946028854]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5679760548946028854
+ },
+ "Component_[5855590796136709437]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5855590796136709437,
+ "ChildEntityOrderEntryArray": [
+ {
+ "EntityId": "Entity_[1155164325235]"
+ },
+ {
+ "EntityId": "Entity_[1180934129011]",
+ "SortIndex": 1
+ },
+ {
+ "EntityId": "Entity_[1172344194419]",
+ "SortIndex": 2
+ },
+ {
+ "EntityId": "Entity_[1168049227123]",
+ "SortIndex": 3
+ },
+ {
+ "EntityId": "Entity_[1163754259827]",
+ "SortIndex": 4
+ },
+ {
+ "EntityId": "Entity_[1159459292531]",
+ "SortIndex": 5
+ }
+ ]
+ },
+ "Component_[9277695270015777859]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 9277695270015777859
+ }
+ },
+ "IsDependencyReady": true
+ },
+ "Entity_[1180934129011]": {
+ "Id": "Entity_[1180934129011]",
+ "Name": "Global Sky",
+ "Components": {
+ "Component_[11231930600558681245]": {
+ "$type": "AZ::Render::EditorHDRiSkyboxComponent",
+ "Id": 11231930600558681245,
+ "Controller": {
+ "Configuration": {
+ "CubemapAsset": {
+ "assetId": {
+ "guid": "{215E47FD-D181-5832-B1AB-91673ABF6399}",
+ "subId": 1000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_skyboxcm.exr.streamingimage"
+ }
+ }
+ }
+ },
+ "Component_[11980494120202836095]": {
+ "$type": "SelectionComponent",
+ "Id": 11980494120202836095
+ },
+ "Component_[1428633914413949476]": {
+ "$type": "EditorLockComponent",
+ "Id": 1428633914413949476
+ },
+ "Component_[14936200426671614999]": {
+ "$type": "AZ::Render::EditorImageBasedLightComponent",
+ "Id": 14936200426671614999,
+ "Controller": {
+ "Configuration": {
+ "diffuseImageAsset": {
+ "assetId": {
+ "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+ "subId": 3000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_ibldiffuse.exr.streamingimage"
+ },
+ "specularImageAsset": {
+ "assetId": {
+ "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+ "subId": 2000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_iblspecular.exr.streamingimage"
+ }
+ }
+ }
+ },
+ "Component_[14994774102579326069]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 14994774102579326069
+ },
+ "Component_[15417479889044493340]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 15417479889044493340
+ },
+ "Component_[15826613364991382688]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 15826613364991382688
+ },
+ "Component_[1665003113283562343]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 1665003113283562343
+ },
+ "Component_[3704934735944502280]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 3704934735944502280
+ },
+ "Component_[5698542331457326479]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 5698542331457326479
+ },
+ "Component_[6644513399057217122]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6644513399057217122,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Cached World Transform": {
+ "Translation": [
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ },
+ "Cached World Transform Parent": "Entity_[1176639161715]"
+ },
+ "Component_[931091830724002070]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 931091830724002070
+ }
+ },
+ "IsDependencyReady": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Engine/Config/engine_core.thread_config b/Assets/Engine/Config/engine_core.thread_config
deleted file mode 100644
index f9183d9174..0000000000
--- a/Assets/Engine/Config/engine_core.thread_config
+++ /dev/null
@@ -1,402 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Assets/Engine/Config/engine_sandbox.thread_config b/Assets/Engine/Config/engine_sandbox.thread_config
deleted file mode 100644
index 7c0dc00b71..0000000000
--- a/Assets/Engine/Config/engine_sandbox.thread_config
+++ /dev/null
@@ -1,128 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Assets/Engine/SeedAssetList.seed b/Assets/Engine/SeedAssetList.seed
index 45a02f7682..77ec509721 100644
--- a/Assets/Engine/SeedAssetList.seed
+++ b/Assets/Engine/SeedAssetList.seed
@@ -67,106 +67,98 @@
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -264,109 +256,101 @@
-
-
-
-
-
-
-
-
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -387,498 +371,474 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -896,14 +856,6 @@
-
-
-
-
-
-
-
-
@@ -928,29 +880,13 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
@@ -1451,146 +1387,146 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -1699,42 +1635,42 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/Assets/Engine/Shaders/DistanceClouds.ext b/Assets/Engine/Shaders/DistanceClouds.ext
deleted file mode 100644
index 322acef5f3..0000000000
--- a/Assets/Engine/Shaders/DistanceClouds.ext
+++ /dev/null
@@ -1,51 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Particles shader extension used by the editor
-// for automatic shader generation (based on "Particles" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %DIFFUSE
- Mask = 0x1
- Hidden
-}
-
-Property
-{
- Name = %SIMPLE
- Mask = 0x2
- Property (Simple distance clouds)
- Description (Use distance clouds with no volumetric shading computations)
-}
-
-Property
-{
- Name = %ADVANCED
- Mask = 0x4
- Property (Advanced distance clouds)
- Description (Use distance clouds with more accurate shading computations)
-}
-
-Property
-{
- Name = %DEPTH_FADE
- Mask = 0x8
- Property (Depth Fade)
- Description (Fades the output based on closeness of objects behind it)
-}
diff --git a/Assets/Engine/Shaders/Eye.ext b/Assets/Engine/Shaders/Eye.ext
deleted file mode 100644
index 28df961f79..0000000000
--- a/Assets/Engine/Shaders/Eye.ext
+++ /dev/null
@@ -1,74 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Eye shader extension used by the editor
-// for automatic shader generation (based on "Eye" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %ENVIRONMENT_MAP
- Mask = 0x2
- Property (Environment map)
- Description (Use environment map as separate texture)
- DependencyReset = $TEX_EnvCM
-}
-
-Property
-{
- Name = %EYE_AO_OVERLAY
- Mask = 0x4
- Property (Ambient occlusion overlay)
- Description (Use for ambient occlusion overlay rendering)
-}
-
-Property
-{
- Name = %EYE_SPECULAR_OVERLAY
- Mask = 0x8
- Property (Specular overlay)
- Description (Use for specular overlay rendering)
-}
-
-Property
-{
- Name = %VERTCOLORS
- Mask = 0x400000
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %TEMP_EYES
- Mask = 0x80000000
- DependencySet = $UserEnabled
- Hidden
-}
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/Fur.ext b/Assets/Engine/Shaders/Fur.ext
deleted file mode 100644
index 067c85d274..0000000000
--- a/Assets/Engine/Shaders/Fur.ext
+++ /dev/null
@@ -1,126 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-
-// Description: Fur shader extension used by the editor
-// for automatic shader generation (based on "Fur" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %SPECULAR_MAP
- Mask = 0x2
- Property (Specular map)
- Description (Use specular map as separate texture)
- DependencySet = $TEX_Specular
- DependencyReset = $TEX_Specular
- Hidden
-}
-
-Property
-{
- Name = %CUSTOM_MODIFICATOR
- Mask = 0x4
- Property (Call CustomModificator function in vertex shader)
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %FUR_VERT_COLORS
- Mask = 0x8
- Property (Fur Color Data)
- Description (Vertex color channel contains fur combing and scaling info)
-}
-
-Property
-{
- Name = %FUR_WIND_BENDING
- Mask = 0x10
- Property (Wind bending)
- Description (Enable wind bending for fur)
-}
-
-Property
-{
- Name = %FUR_BLENDLAYER
- Mask = 0x20
- Property (Fur Blendlayer)
- Description (Diffuse layer blended into fur as it grows from base to tip)
-}
-
-Property
-{
- Name = %FUR_BLENDCOLOR
- Mask = 0x40
- Property (Fur Blend color)
- Description (Specified color blended into fur diffuse as it grows from base to tip)
-}
-
-Property
-{
- Name = %FUR_LENGTH_SCALED
- Mask = 0x80
- Property (Scale fur length)
- Description (Fur length scales with object scale)
-}
-
-Property
-{
- Name = %MODEL_SPACE_Z_UP
- Mask = 0x100
- Property (Model Space Z Up)
- Description (Check if model was generated with Z up, if unchecked, assumes Y up)
-}
-
-Property
-{
- Name = %DEPTH_FIXUP
- Mask = 0x200
- Property (Depth Fixup)
- Description (Write depth for depth of field and postprocessing)
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %ZPASS_CUSTOM_DIFFUSE
- Mask = 0x400
- Property (Calls GetZPassDiffuse function in z pass pixel shader for custom diffuse handling)
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %FUR_MULTI_LAYER_ALPHA_BLEND
- Mask = 0x800
- Property(Enable OIT)
- Description(Use OIT for accurate alpha blending - performance penalty expected)
-}
diff --git a/Assets/Engine/Shaders/GeometryBeam.ext b/Assets/Engine/Shaders/GeometryBeam.ext
deleted file mode 100644
index 25e395f42d..0000000000
--- a/Assets/Engine/Shaders/GeometryBeam.ext
+++ /dev/null
@@ -1,43 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-//
-////////////////////////////////////////////////////////////////////////////
-
-
-Property
-{
- Name = %NOISE
- Mask = 0x1
- Property (Dust & Turbulence)
- Description (Add a dust overlay [spec map for dust, bump map for turbulence] )
-}
-
-
-Property
-{
- Name = %RECEIVE_SHADOWS
- Mask = 0x2
- Property (Receive Shadows)
- Description (Enable shadow receiving)
-}
-
-
-Property
-{
- Name = %UV_VIGNETTING
- Mask = 0x4
- Property (UV Vignetting)
- Description (Enabling this will cause contents to fade out at UV boundaries)
-}
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/Glass.ext b/Assets/Engine/Shaders/Glass.ext
deleted file mode 100644
index 1070d4e5c9..0000000000
--- a/Assets/Engine/Shaders/Glass.ext
+++ /dev/null
@@ -1,111 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Glass shader extension used by the editor
-// for automatic shader generation (based on "Glass" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-
-Version (2.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %DIRT_MAP
- Mask = 0x100000
- Property (Use Diffuse map)
- Description (Use Diffuse map for dirt, etc. Requires Alpha channel)
-}
-
-Property
-{
- Name = %SPECULAR_MAP
- Mask = 0x200000
- Property (Specular map)
- Description (Use specular map as separate texture)
- DependencySet = $TEX_Specular
- DependencyReset = $TEX_Specular
- Hidden
-}
-
-Property
-{
- Name = %ENVIRONMENT_MAP
- Mask = 0x10
- Property (Environment map)
- Description (Use environment map as separate texture)
- DependencyReset = $TEX_EnvCM
-}
-
-
-Property
-{
- Name = %TINT_MAP
- Mask = 0x200
- Property (Tint map - Tint/Gloss/Spec)
- Description (Use RGB Spec Map to control Tinting in Red channel / Cloudiness in Green channel / Specular in Blue channel)
-
-}
-
-Property
-{
- Name = %TINT_COLOR_MAP
- Mask = 0x400
- Property (Use Tint Color Map)
- Description (Use Tint Color Map for multi-colored glass, goes in the custom Tint Color Map slot)
- DependencyReset = $TEX_Custom
- DependencySet = $TEX_Custom
-}
-
-Property
-{
- Name = %BLUR_REFRACTION
- Mask = 0x2000
- Property (Blur refraction - PC Only)
- Description (Blur objects seen through the glass)
-}
-
-Property
-{
- Name = %DEPTH_FOG
- Mask = 0x4000
- Property (Depth Fog)
- Description (Enables depth fog behind glass surface)
-}
-
-Property
-{
- Name = %UNLIT
- Mask = 0x8000
- Property (Disable Lights)
- Description (Disables the reflection of lights)
-}
-
-Property
-{
- Name = %DEPTH_FIXUP
- Mask = 0x4000000
- Property (Depth Fixup)
- Description (Write depth for depth of field and postprocessing)
-}
-
-Property
-{
- Name = %SAA_FILTERING
- Mask = 0x80000000
- Property (Specular Antialiasing)
- Description (Perform specular Antialiasing)
-}
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/AuxGeom.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/AuxGeom.cfx
deleted file mode 100644
index ac64ed293a..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/AuxGeom.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d924c59739f63724999b1bf6cd326d10024b031bdfbf02fe8e09cb0b783dfe67
-size 2891
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Clouds.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Clouds.cfx
deleted file mode 100644
index cf8ee86492..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Clouds.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:045f6506425364221f9dbf0b359e38877f276300770ef7a5ab694f1055eb0d02
-size 1569
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Common.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/Common.cfi
deleted file mode 100644
index 644826685e..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Common.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f25999b453c3e91c8237d28ccc1ef3baefaa2a7ec8f9aad65adb95042e25e435
-size 56582
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Common.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Common.cfx
deleted file mode 100644
index d347b5c967..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Common.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:396a70d86a4678b16fa110b3eceacbd5b515aa85090d16bdb6a8562d7c94e4a8
-size 17205
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonDebugPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonDebugPass.cfi
deleted file mode 100644
index 95abf99bbf..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonDebugPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b05841cd01ec853455ad792e80302cf5ffbbd104c5ecf46699f5ecd4b0624c09
-size 983
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonMotionBlurPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonMotionBlurPass.cfi
deleted file mode 100644
index 54f160e01b..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonMotionBlurPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:725006c2f2844e49b691506cbc3d015466cdfbad19209a63964acc264b78c782
-size 4096
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonMotionBlurPassTess.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonMotionBlurPassTess.cfi
deleted file mode 100644
index 4d74269d97..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonMotionBlurPassTess.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5886e0be4d4047a9b41431c141738cb0a13a3b3a4033cc262f173b5e9e195707
-size 4734
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonSVO.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonSVO.cfi
deleted file mode 100644
index 023437ec3c..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonSVO.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:57682432ba4de87ddc5ba542b6630ad512f75dbaca2a0c1402fb2a59ed35804c
-size 111615
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonShadowGenPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonShadowGenPass.cfi
deleted file mode 100644
index 7907e3913d..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonShadowGenPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:01bbe928766a8c75bc3d990747f91e5becfbed6a59d58b71d2a2922f6d14bc1f
-size 6970
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonShadowGenPassTess.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonShadowGenPassTess.cfi
deleted file mode 100644
index ccb63377d1..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonShadowGenPassTess.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8c4c004afe3782ae58fa4ac90dd7f16e026d0c38e4bf66ed475beaa1ce3fcf98
-size 3363
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonTessellation.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonTessellation.cfi
deleted file mode 100644
index 33aa6974cf..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonTessellation.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:86f594a6f8fb6e1328b95e6b03a04109ea3e9e8b8642d30c674281ea916dbf41
-size 19522
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonViewsPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonViewsPass.cfi
deleted file mode 100644
index 71876eddd2..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonViewsPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:04850ac23185147fd8e97303efad70cbb876c6589c71cb413b0429d267705cd3
-size 8020
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonViewsPassTess.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonViewsPassTess.cfi
deleted file mode 100644
index 96cbad4a40..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonViewsPassTess.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6c660b79e7532b5a9513341d3f37215a742d3ee99532ba0003e2c13381d55bc6
-size 4238
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPass.cfi
deleted file mode 100644
index 8a9f7ef4f1..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8fe036b79e16737499920500c87997567d8ee32534748df4ea617c4118237cb5
-size 32052
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPassTess.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPassTess.cfi
deleted file mode 100644
index adc03e7945..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPassTess.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a30f1c7b94eb1bcb0261e518062da6eb69987698d65e6dd786bfe29be32d749e
-size 4995
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPrePass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPrePass.cfi
deleted file mode 100644
index 43481f75fe..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/CommonZPrePass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3c4ac5b9fa8a288f8fdfc4110599b25742b19ddd3a251d638e5e1da9284310d6
-size 2814
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DXTCompress.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/DXTCompress.cfx
deleted file mode 100644
index 26545c6531..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DXTCompress.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a2b214f2873a3a99bcaccc120d6a397c708a4b3309c9b953860f8f9cf93461c8
-size 8591
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Debug.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Debug.cfx
deleted file mode 100644
index 71ab497cc5..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Debug.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f26436234a598c2aa906653e711eb0e8ae14f99b65fc25eea0d238d9f56d914a
-size 4345
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DebugLight.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/DebugLight.cfx
deleted file mode 100644
index cc9a79a324..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DebugLight.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bb0a8212530051bd6e4ac5646f6ab2f0a59f43a349ce8e03e544f6cf6d87ba4b
-size 1929
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredCaustics.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/DeferredCaustics.cfx
deleted file mode 100644
index f477baa00c..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredCaustics.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:24e1f7c4242c708a638a1069908f258fa26aa77152330a2c8da72260dd192209
-size 14703
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredRain.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/DeferredRain.cfx
deleted file mode 100644
index 2e771c73bf..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredRain.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:77910f05ea15757e24201187a68a9a0db924f7951dadd4b7c7330f0845bd5944
-size 14043
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredShading.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/DeferredShading.cfx
deleted file mode 100644
index 9252e1b06e..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredShading.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4ab94af4462722c1a111f4199714fabd0addf095aba82840f92e6ef8b056d78c
-size 94446
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredShadows.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/DeferredShadows.cfi
deleted file mode 100644
index 63c8b33c21..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredShadows.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0641726ad6140704434896912f0e57e29e6f5e28ac2653bc97bbe7e2d444fbc2
-size 2828
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredSnow.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/DeferredSnow.cfx
deleted file mode 100644
index 0789202955..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DeferredSnow.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6ea4c40161f4f628fbf9cd1a3b7df445615dfa8ca15761a4fec15d0c2276b369
-size 22312
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DepthOfField.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/DepthOfField.cfx
deleted file mode 100644
index 9a431fb20a..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DepthOfField.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b67ece889d68d8ed6f891ca5cfb1f951a777616ea928b0e6f91bd541b35c62ff
-size 13136
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/DistanceClouds.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/DistanceClouds.cfx
deleted file mode 100644
index 7448f0304a..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/DistanceClouds.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a06a4a972542f51bea726578b26ef0fc711c4b6f4a77a31a383690717c5ccba2
-size 10622
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Eye.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Eye.cfx
deleted file mode 100644
index a3cb1227ea..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Eye.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fed5c2b72b2b4769954f2fad9573c6e35581c556e3a96685d449eea5576cf433
-size 19244
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FXConstantDefs.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/FXConstantDefs.cfi
deleted file mode 100644
index 7b0d7202e7..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FXConstantDefs.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1b6aa7281d2174f24b510a7ac820b4ab308a215d6b3eae4a039bc01e34b131ec
-size 9922
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FXSamplerDefs.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/FXSamplerDefs.cfi
deleted file mode 100644
index 7f5b097148..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FXSamplerDefs.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:750ac5a4ef25f1379121c7346dad0230d389c7c889ffdccbe6281a511b021cea
-size 4044
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FXStreamDefs.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/FXStreamDefs.cfi
deleted file mode 100644
index 4d05f905c1..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FXStreamDefs.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:073303aa45adc5ca237f33f29fb4de52f8b3c935912298cdec611128c510399c
-size 9279
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FallBack.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/FallBack.cfx
deleted file mode 100644
index 321440401b..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FallBack.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:052a458b7bdef6d7e1fa1a26d4cb66f6e24f91b9e42451a8e48045d3779aef1c
-size 2383
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FixedPipelineEmu.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/FixedPipelineEmu.cfx
deleted file mode 100644
index 8b92aa7399..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FixedPipelineEmu.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ab757a0df8246a0e9d20839a89219a6c616d6df054d72b21b79e459b8503ade8
-size 10188
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FogVolume.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/FogVolume.cfx
deleted file mode 100644
index 929d89ab5b..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FogVolume.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a37c2ab18b0ad1da90005c0ff9fea89d7c78ade9fd51b28b665cf42b814ecd8d
-size 23690
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Fur.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Fur.cfx
deleted file mode 100644
index 7d7405cc5e..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Fur.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2f429a8537df95455e32da7fd480e79ef46751d6bc880c34b746c21515aa012a
-size 31609
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FurFinPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/FurFinPass.cfi
deleted file mode 100644
index 84149cb0f6..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FurFinPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e3f25ea475310f699442a160ffcc9f58c40e54b6570210dafbe41746a010b821
-size 15002
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FurObliteratePass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/FurObliteratePass.cfi
deleted file mode 100644
index 3ffe779a54..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FurObliteratePass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f6246f93aa73fdab460c1c82a33f2588a0ae83a162acdcdb12cec86ddac332b6
-size 5142
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/FurZPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/FurZPass.cfi
deleted file mode 100644
index 5735035e49..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/FurZPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fb0d83cc48ebee33b3d3db2b1a5c27636d35dfb7ce720e5391a28ff70ca0d729
-size 9023
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticle.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticle.cfi
deleted file mode 100644
index 6cd187c993..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticle.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b690c770f90e33dc78604b5beca3453aba4fbb4db8014b730680c33b5cef5120
-size 2299
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBegin.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBegin.cfx
deleted file mode 100644
index 3bc0dd3e01..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBegin.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:64c184691014423f2f6c518d34ff9657acc1dc8867e0e43d20b5526491d35d5b
-size 462
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSort.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSort.cfx
deleted file mode 100644
index 14c0b06c58..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSort.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a71929dda4a7b4516754286da5494546a0ea2075b9fde5cefef68f0a99d37381
-size 1520
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSortGlobal2048.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSortGlobal2048.cfx
deleted file mode 100644
index b8ff2e6afc..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSortGlobal2048.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a50144544a4c292d172d4bb9586a6016de4cc5b0a39958abfb00bc720e8c23e9
-size 1989
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSortLocal.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSortLocal.cfx
deleted file mode 100644
index 6ee0b7b645..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleBitonicSortLocal.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:25d51818120964a1576f35727c0f13bc10a01727ab793f5fdf79cb9c1f7bf563
-size 2055
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleCurves.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleCurves.cfi
deleted file mode 100644
index a565d62cc4..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleCurves.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4308e81d4ee4c65480a1cf110f3f602d347f2899b4cf299f334c2659904329dd
-size 553
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleEmit.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleEmit.cfx
deleted file mode 100644
index 8d417c29ac..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleEmit.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bfe3a765c1057d5dfae514ba17d0ce99d6598693035df2037314da5f38e4c305
-size 19142
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleGatherSortDistance.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleGatherSortDistance.cfx
deleted file mode 100644
index 0a223398ff..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleGatherSortDistance.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f94a71dd8cbe95080f2de1bfa8cbd9443bea18106cc7bcae2c5c7225d113f2b4
-size 644
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleHelpers.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleHelpers.cfi
deleted file mode 100644
index a3b10d582b..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleHelpers.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cf39d59eefe2c6641437e9d535528edb29e1e0dad6d1b84b20662c7075928fe8
-size 6969
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleOddEvenSort.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleOddEvenSort.cfx
deleted file mode 100644
index be1e36e5db..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleOddEvenSort.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5cbcdd1c83247233dce9fb5c32e9d4530b23b825b284591a921a0b7e81d230ea
-size 1817
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleRenderNoGS.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleRenderNoGS.cfx
deleted file mode 100644
index 2d8fc2a1d0..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleRenderNoGS.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cae99346703f5ebc9bb59edb61c17b86184ae7659af78395ec4cba11cb6da471
-size 37741
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleUpdate.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleUpdate.cfx
deleted file mode 100644
index 7524f13c6f..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GPUParticleUpdate.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8a3a7bb8ad18d99c7490d15ce24b3c4867d9668b1539014a31b3ba5e80ebb00e
-size 25753
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/GeometryBeam.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/GeometryBeam.cfx
deleted file mode 100644
index 364f613063..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/GeometryBeam.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:45e7f387bb7cc9d7a489916b27ea6bff816510664099008ebbeaa0d10a26faa7
-size 12612
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Glass.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Glass.cfx
deleted file mode 100644
index 38226fedec..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Glass.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:49aa341aa2563ced85aa4f62f74865c558238c91ba9d8d62ad21392088755820
-size 26913
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/HDRDolbyMetadataPass0.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/HDRDolbyMetadataPass0.cfx
deleted file mode 100644
index b2df095b8a..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/HDRDolbyMetadataPass0.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c7f9297a483fd7d7b91a3f06f1a3eb83e77192b967691f4e2119d41b7a7afdd2
-size 2707
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/HDRDolbyMetadataPass1.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/HDRDolbyMetadataPass1.cfx
deleted file mode 100644
index 25c959c8f6..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/HDRDolbyMetadataPass1.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:52d68438b25fbd2d88a7247295a021680a9b95a6f3ed07c3ae066cb3d44b25ed
-size 2530
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/HDRPostProcess.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/HDRPostProcess.cfx
deleted file mode 100644
index 76e692fa63..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/HDRPostProcess.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5cf8d27075f4aa76e5814d1c4a9718d7106df50229f33e1d8d7d7a4532d1e5f3
-size 40838
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/HDRPostProcessDolby.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/HDRPostProcessDolby.cfi
deleted file mode 100644
index b8c0c3043c..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/HDRPostProcessDolby.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2e62a2aa829af58b2ba19a9920bd87d64a27854d24de5a51842740c7ec1e9ae8
-size 33567
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Hair.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Hair.cfx
deleted file mode 100644
index 4788d26a0e..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Hair.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:eb56b0070f3811f1b8780e70d4b9410a08f3aac9f8fa3e947194a4d902c9d8ef
-size 33265
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Helper.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Helper.cfx
deleted file mode 100644
index 5c19cc54e0..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Helper.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9764bb3ab6d2895a355466f3c53f735c3500006420bac211bc9a0b7c29a605c6
-size 2168
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Hud3D.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Hud3D.cfx
deleted file mode 100644
index c460d0468c..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Hud3D.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c63de566d2a5a69781a4c1e16958d64d187e057f3447afb4ec9aa47455ef7a5c
-size 9617
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkin.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkin.cfx
deleted file mode 100644
index ff2a2b894a..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkin.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b81300b59d42b38b7669016cc8920db9adbf07b612f12d520d9480a6de59aa73
-size 18648
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkinTess.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkinTess.cfi
deleted file mode 100644
index 8f7ce5f8c9..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkinTess.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a79996ad61013920dcccd254f23e05fb4089879d477d8f3ce00ff98ee04d6ec1
-size 7783
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkinValidations.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkinValidations.cfi
deleted file mode 100644
index 9743568b4d..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/HumanSkinValidations.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:548f2cc401046358ef4f4edeb37532f06437b99b2fe5bff70100e66a6ecb281a
-size 986
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Illum.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Illum.cfx
deleted file mode 100644
index 6de2f49547..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Illum.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3c110e0891fbe46a10f2fbcf4ffb8f82c0711ffaa943fac5ca92c96f7e63d051
-size 28796
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/IllumTess.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/IllumTess.cfi
deleted file mode 100644
index ef66d513a9..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/IllumTess.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9a52e2256a43707dfab74c680e96249d27e7eb38a2984c9d4dcff83ffe7dd15b
-size 5194
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/IllumValidations.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/IllumValidations.cfi
deleted file mode 100644
index 7af7a4748c..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/IllumValidations.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4155e44e6687796095b5e2401c93a09e527c61a48830e8a35d4ab16d849d8159
-size 2031
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/LensOptics.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/LensOptics.cfx
deleted file mode 100644
index ab20cc3bc7..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/LensOptics.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7acdc1aaa28aea83d9af53547f65c5686b2fc43be988068d8f4f88c87c4359a7
-size 16847
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Light.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Light.cfx
deleted file mode 100644
index ebbe8183bf..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Light.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4436686d0f3e735973df2dd56523269683c66b3ae01da67fa7f41e5f9e1b1234
-size 12760
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/LightBeam.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/LightBeam.cfx
deleted file mode 100644
index e19414deef..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/LightBeam.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:13c69186729534dcd2676d1740a530fb5d5a3307d7b713f5c08704220186ba6d
-size 14169
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/LightVolumes.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/LightVolumes.cfi
deleted file mode 100644
index 4ab290bb32..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/LightVolumes.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f79e6c1e182e86afd295758f0afefc901407e69eb3f93422d8a3089451e49c7d
-size 5526
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/MeshBaker.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/MeshBaker.cfi
deleted file mode 100644
index 5f019eca9a..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/MeshBaker.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0ca1d710fd2b0937a04ded739ab4dc35ff48e3ff0c07d6a5d4df95f32a1947a4
-size 5032
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/MeshBakerDilate.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/MeshBakerDilate.cfx
deleted file mode 100644
index 59ff9363a5..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/MeshBakerDilate.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7a7db4ca9b7d87e4c3410df26f3045a18fb96a2535b88ab8afe00dcf1d621943
-size 4173
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ModificatorTC.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/ModificatorTC.cfi
deleted file mode 100644
index 6d0fd6bb42..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ModificatorTC.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0eb9c63a60a3d2afb78d6e4077ac81322dbd1a0537f5551c638d57c353381e15
-size 5256
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ModificatorVT.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/ModificatorVT.cfi
deleted file mode 100644
index fff9af0b52..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ModificatorVT.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:dd0aecf5b1620c49a9b08c35865ea8de5487098f1eed8374fa4fc85e4a87e886
-size 52858
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Monitor.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Monitor.cfx
deleted file mode 100644
index 840da6f035..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Monitor.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:758aa594628cd94f10d379f08a9a0a63478cc69eb9a093404d57c46e6830150a
-size 19450
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/MotionBlur.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/MotionBlur.cfx
deleted file mode 100644
index b6ba57f9f3..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/MotionBlur.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8b4f6c44e52297c1dfe02040a7e63739aeed73f2c2c4930053f5a83c3c73f816
-size 8716
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/MultiLayerAlphaBlend.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/MultiLayerAlphaBlend.cfi
deleted file mode 100644
index 751d38bde8..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/MultiLayerAlphaBlend.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:01f08e32bfb1f8690759da687114e66bf6652b6d17b208ed1b316315f0a66a1b
-size 6435
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/NoDraw.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/NoDraw.cfx
deleted file mode 100644
index a4a038ac28..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/NoDraw.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1d183abe91463d2ab90f56c055a44aa8c3cad1d731f51c9f56bd6f9df3d7eba1
-size 180
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/OcclusionTest.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/OcclusionTest.cfx
deleted file mode 100644
index 7f1b7bf522..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/OcclusionTest.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1ceef3fd50e977ba168e2f80803bc0a09542aa3c55721e0e6e27bbab45454607
-size 1545
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ParticleImposter.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/ParticleImposter.cfx
deleted file mode 100644
index 0506b14d5e..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ParticleImposter.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b67b9997024270cfdede2d057220078029db61ab5dff6d522a39c99d08420245
-size 8657
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ParticleVT.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/ParticleVT.cfi
deleted file mode 100644
index bbe4d0c261..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ParticleVT.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:670e9dd98f131fa0375ddcc4df8fe850eeabb43f9771d302b5c8e2fd7022d78d
-size 8534
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Particles.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/Particles.cfi
deleted file mode 100644
index 6f38a8eae7..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Particles.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:98f62a7869360e63083eea9a784652ad0fca13a9cd741930940be75c10ca83e7
-size 40918
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Particles.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Particles.cfx
deleted file mode 100644
index 728135d83c..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Particles.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:55bcc8a634262b6001193fabf318cdf2960904dd47e915fa17de3a60c620639d
-size 4613
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesCustomPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesCustomPass.cfi
deleted file mode 100644
index 7f90f9f1a5..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesCustomPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:af77abd5a2d462e4b533e6e5b489bc8e39909527c64a9cd599bbf5312b3aa17a
-size 6052
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesNoMat.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesNoMat.cfx
deleted file mode 100644
index 3728b1f379..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesNoMat.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:db6f21607b4ce4e0d0a48ffa0a7db81f29ac0546c76846dd39f1fc584f7d23e5
-size 1517
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesNoMatMirror.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesNoMatMirror.cfx
deleted file mode 100644
index 955c99c3e9..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesNoMatMirror.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4f8178b44fc27aacde3600b86bc06038aefbac6ca4fbf4fbe29f32ca6e8e0584
-size 1603
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesShadowPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesShadowPass.cfi
deleted file mode 100644
index 461f4d40ac..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ParticlesShadowPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0c7c5e176c6f0a5f689bc433dd23d5bb998f8f10d4185c30cb9788022ebb38a0
-size 6464
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/PostAA.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/PostAA.cfx
deleted file mode 100644
index d8ae4939e4..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/PostAA.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7a10320d3b31738cc0154de2c973fcaf912885209a7e729e3f6bd372f7633354
-size 67647
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/PostEffects.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/PostEffects.cfx
deleted file mode 100644
index 95269fe06c..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/PostEffects.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ec164683d3fe45a512c0e9a2314c5b450602ee8c8a8281d99d43c1d76a761df3
-size 60596
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/PostEffectsGame.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/PostEffectsGame.cfx
deleted file mode 100644
index efaa765189..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/PostEffectsGame.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a6d66a0aed7f39e3848ee4763c408c390ec7021205cf2f0f07459b99d84f1d27
-size 80783
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/PostEffectsLib.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/PostEffectsLib.cfi
deleted file mode 100644
index 90ce479d4a..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/PostEffectsLib.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b73c3ae905c1833cade569500b647dc504e83b34f15a4584f72a372d254d884f
-size 8502
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ReferenceImage.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/ReferenceImage.cfx
deleted file mode 100644
index 08b3c94d06..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ReferenceImage.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:12d61af66003a6ab90e24574925fd94bc03622386da142fcaa655df21b0fd5bd
-size 2033
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ReferenceImageHDR.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/ReferenceImageHDR.cfx
deleted file mode 100644
index aaa0a26a21..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ReferenceImageHDR.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1c4913b73fec9ebdcd5b8e7c86d495b7dc9a135e7f8a77ee90b9e62a78d3cc47
-size 1819
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Scopes.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Scopes.cfx
deleted file mode 100644
index 7be1e74629..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Scopes.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4565c5415b0a68ced049335d803fcfdbf899db4ea914b8fbc5ba34620e4c4045
-size 10709
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ShadowBlur.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/ShadowBlur.cfx
deleted file mode 100644
index ad707f2932..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ShadowBlur.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3a6eafe0f42be55811eda4ac6b164bd01e22b6cc2b77723a8693549b26939871
-size 10768
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ShadowCommon.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/ShadowCommon.cfi
deleted file mode 100644
index fbaa4d7f65..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ShadowCommon.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ddac405a61300a0857cba4ea7dabcb6d5aef5253ada53d09ec4ab591ed3cfbce
-size 25680
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/ShadowMaskGen.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/ShadowMaskGen.cfx
deleted file mode 100644
index 36b7604c43..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/ShadowMaskGen.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2aec8020aa2454b8a0cd406198bd2c067f878cb697dad2e2059e88c7cb2e5e87
-size 32118
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Sketch.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Sketch.cfx
deleted file mode 100644
index 60d4aa0f4a..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Sketch.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1ba3cc8b5127ccb8a446e0ac85daf0b13c700092bcdcbdd92d5fbf45dfd430dc
-size 11176
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/SketchTerrain.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/SketchTerrain.cfx
deleted file mode 100644
index f8ff66d760..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/SketchTerrain.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b247b792e8e26abb50c2c01e9bc6c341216f6a84fc3fac67088294cf868428ab
-size 2992
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Sky.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Sky.cfx
deleted file mode 100644
index 06ec9fc6f1..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Sky.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7fec7735636fa7a4c2387e216918ec92414bc29ec6ecbd89605677214f829403
-size 4830
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/SkyHDR.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/SkyHDR.cfx
deleted file mode 100644
index 48b47a9ae1..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/SkyHDR.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3195bdf90fa2a0b1539f0cac7471dc31ec7aa783d138f9c0455a32354ead3874
-size 8548
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/SoftOcclusionQuery.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/SoftOcclusionQuery.cfx
deleted file mode 100644
index 425102e21d..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/SoftOcclusionQuery.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c82e35c6af179bb2405bbfe1d452ae2a8c5479934c0c9d8e8119d04db35d8cf5
-size 3546
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Stars.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Stars.cfx
deleted file mode 100644
index 4fdbddb2c6..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Stars.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c5f191743c706e8531bada03abab8700c01cc9afbff0c9ea22c41d509b11ee76
-size 4075
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/StarterGame_GeometryBeamScaling.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/StarterGame_GeometryBeamScaling.cfx
deleted file mode 100644
index a5a51340fc..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/StarterGame_GeometryBeamScaling.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:888486a516d3052e6b8b01cc0d36f01a68985ed482db683a25527c220290cc6c
-size 13217
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Stereo.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Stereo.cfx
deleted file mode 100644
index 8ef249a60f..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Stereo.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:761402eba9c7256a79fe78869b0287b95a8be8f810b48e41222049425b2eb535
-size 5422
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Sunshafts.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Sunshafts.cfx
deleted file mode 100644
index 2274352ec3..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Sunshafts.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9a162b22e9ee5dc42559c8bcd4a6160c8b227bfeb6a5b367b62b8256109b99b5
-size 8884
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/TemplBeamProc.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/TemplBeamProc.cfx
deleted file mode 100644
index 1a2de2a0dd..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/TemplBeamProc.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:aed5eeb5e7467884319e268f985134f0d50482408cdbda6359873d211387737c
-size 7182
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Terrain.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Terrain.cfx
deleted file mode 100644
index 22abec6b24..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Terrain.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e4d2246d81afaad43e267addffdc01ce201dc4032bf5e05131cfb9f56ebc5ed0
-size 19043
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/TerrainValidations.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/TerrainValidations.cfi
deleted file mode 100644
index 1c8349f673..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/TerrainValidations.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3956d70a7eff854ab02d44f6c712cdb694045e87e9a0201ad8427436c693897a
-size 707
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/TiledShading.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/TiledShading.cfi
deleted file mode 100644
index ebc1521531..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/TiledShading.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:72448b07701ad745e35d98de2229f0675cbb74bd6d40095ec4625929da906c5f
-size 50201
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Total_Illumination.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Total_Illumination.cfx
deleted file mode 100644
index 9b2c8e38dc..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Total_Illumination.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c73e03d1e09efd2e8cdb9292debb5260a0690772c81a9dbb085502f822b7f91b
-size 38227
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/UI.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/UI.cfx
deleted file mode 100644
index e98a5a2fae..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/UI.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c2b7a3ff846dde2ba481e46180e67e81528fa2a984ba6bb1a5c83304c301551d
-size 7717
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Vegetation.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Vegetation.cfx
deleted file mode 100644
index 0bca5a3e53..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Vegetation.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6c330b2ecb3d850e5eeb3673500cdebb95bee46b92eb93c3274291dbf96b2c98
-size 25807
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/VegetationTess.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/VegetationTess.cfi
deleted file mode 100644
index 5abc5af104..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/VegetationTess.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:28aadc74c027782d5971e8145d3286f733fcbb571872447f638397df4f957765
-size 5746
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/VegetationValidations.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/VegetationValidations.cfi
deleted file mode 100644
index 00d2e11b8f..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/VegetationValidations.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c05fb764a9fbc9cf7ea7b225680880c32847f4d355cab27f958564d5adcfc21b
-size 1167
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Video.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Video.cfx
deleted file mode 100644
index 966c5d92f6..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Video.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8c1c4e2eed305e2319127d12349754819350301b42d33cb109def7237c3591f1
-size 2123
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/VolumeLighting.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/VolumeLighting.cfi
deleted file mode 100644
index 77cb40a98f..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/VolumeLighting.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:515e3218c9b23e8ff4d67a200ca11b3c833ad3999500f7f8be4ecdc5c01d5565
-size 82057
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/VolumeObject.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/VolumeObject.cfx
deleted file mode 100644
index 2ca573741e..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/VolumeObject.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a1fa34bd8cd7d8df9089739c7adf62b95c64f3d0993dcb2ee3892e05e118e83c
-size 6700
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/VolumetricFog.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/VolumetricFog.cfi
deleted file mode 100644
index 2556067f04..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/VolumetricFog.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3dd1721686abf6fe824df07a5e8ee1505b0fbcbaec6dc1a8ded98274d6ea4058
-size 25814
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Water.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Water.cfx
deleted file mode 100644
index 175960ffc2..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Water.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d3ebab64f075124eb4cf426fee1c9ac446225ed647db3f10a28a28b1efaa5e63
-size 41727
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/WaterCausticsPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/WaterCausticsPass.cfi
deleted file mode 100644
index 5aa4d40dff..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/WaterCausticsPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9f73053b56ef452bf8ae72a4cc6fed59876562d9f4541172265ce6c8d5740711
-size 3340
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/WaterFogVolume.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/WaterFogVolume.cfx
deleted file mode 100644
index eda54be33e..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/WaterFogVolume.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9f9d26a36eb0fa05b58991aaaa6a073621309aa8a4a06a5bb4a6048b507a3fe1
-size 18306
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/WaterOceanBottom.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/WaterOceanBottom.cfx
deleted file mode 100644
index 90cf67ba52..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/WaterOceanBottom.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5266c69503cb72e831e5c488332237fbfd343f96708ea3c75037780bd62fed60
-size 5280
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/WaterReflectionsPass.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/WaterReflectionsPass.cfi
deleted file mode 100644
index a2ffd3d2a8..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/WaterReflectionsPass.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bb1ba5273a487655f813688f0a8500c662348639414ac53a0b0ee3d911010eab
-size 10008
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/WaterVolume.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/WaterVolume.cfx
deleted file mode 100644
index 7985e3dab0..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/WaterVolume.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:41c19dceb8daa6e9a9102b83c78208d6f0681066f5d6c2cf2e657a82e1ce695c
-size 39737
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/Waterfall.cfx b/Assets/Engine/Shaders/HWScripts/CryFX/Waterfall.cfx
deleted file mode 100644
index d09922f322..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/Waterfall.cfx
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ebece6e3b0115174da434ed1b166b7209c012a6013e219e2421ffee5ebd6dda1
-size 11237
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/fragLib.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/fragLib.cfi
deleted file mode 100644
index ffba873be1..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/fragLib.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3a340c8cbb76900b02bc171e680cfdc628900a5c38ecd3ce6a7b9eecbafa72ef
-size 23148
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/shadeLib.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/shadeLib.cfi
deleted file mode 100644
index b2633fd0da..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/shadeLib.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b33f5a65661f977c15047dea6b01809a1ebab5dbd6c7299a0e2888c2de8a911b
-size 59794
diff --git a/Assets/Engine/Shaders/HWScripts/CryFX/vertexLib.cfi b/Assets/Engine/Shaders/HWScripts/CryFX/vertexLib.cfi
deleted file mode 100644
index 66def251da..0000000000
--- a/Assets/Engine/Shaders/HWScripts/CryFX/vertexLib.cfi
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8b577a8c20b7cc94e1c97909487b3a0986b47882502e120fc518880883e04435
-size 15666
diff --git a/Assets/Engine/Shaders/Hair.ext b/Assets/Engine/Shaders/Hair.ext
deleted file mode 100644
index 975e29323e..0000000000
--- a/Assets/Engine/Shaders/Hair.ext
+++ /dev/null
@@ -1,111 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Hair shader extension used by the editor
-// for automatic shader generation (based on "Hair" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %VERTCOLORS
- Mask = 0x10
- Property (Vertex Colors)
- Description (Use vertex colors)
-}
-
-Property
-{
- Name = %HAIR_PASS
- Mask = 0x20
- Property (Hair Pass)
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %ANISO_SPECULAR
- Mask = 0x40
- Property (Anisotropic specular)
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %DIRECTION_MAP
- Mask = 0x200
- Property (Direction map)
- Description (Use direction map as separate texture)
- DependencySet = $TEX_Detail
- DependencyReset = $TEX_Detail
- Hidden
-}
-
-Property
-{
- Name = %VIEW_ALIGNED_STRANDS
- Mask = 0x800
- Property (View aligned strands)
- Description (View aligned cards that get extruded from thin quads with texture u-coords 0 and 1)
-}
-
-Property
-{
- Name = %THIN_HAIR
- Mask = 0x1000
- Property (Thin hair)
- Description (Thin alpha-blended hair)
-}
-
-Property
-{
- Name = %HAIR_AMBIENT
- Mask = 0x2000
- Property (Ambient cubemap)
- Description (Use (nearest) cubemap specified in environment map slot for ambient lighting)
- DependencyReset = $TEX_EnvCM
-}
-
-Property
-{
- Name = %ENFORCE_TILED_SHADING
- Mask = 0x4000
- Property (Enforce tiled shading)
- Description (Force hair to be fully affected by tiled shading. This can be expensive for dense hair meshes.)
-}
-
-Property
-{
- Name = %WIND_BENDING
- Mask = 0x40000000
- Property (Wind bending)
- Description (Gets affected by wind entities. Use extra shader parameters to tweak look.)
-}
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/HumanSkin.ext b/Assets/Engine/Shaders/HumanSkin.ext
deleted file mode 100644
index 92429316ea..0000000000
--- a/Assets/Engine/Shaders/HumanSkin.ext
+++ /dev/null
@@ -1,116 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Skin shader extension used by the editor
-// for automatic shader generation (based on "Skin" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-
-
-Version (1.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %SPECULAR_MAP
- Mask = 0x2
- Property (Specular map)
- Description (Use specular map as separate texture)
- DependencySet = $TEX_Specular
- DependencyReset = $TEX_Specular
- Hidden
-}
-
-Property
-{
- Name = %WRINKLE_BLENDING
- Mask = 0x200
- Property (Wrinkle blending)
- Description (Use subsurface map alpha for wrinkle blending)
- DependencyReset = $TEX_Custom
- DependencyReset = $TEX_CustomSecondary
-}
-
-Property
-{
- Name = %TEMP_SKIN
- Mask = 0x1000
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %DECAL_MAP
- Mask = 0x2000
- Property (Decal map)
- Description (Use a decal map which is blended on top of the diffuse map)
-}
-
-Property
-{
- Name = %DETAIL_MAPPING
- Mask = 0x20000
- Property (Detail normal-map)
- Description (Tiled detail normal-map for pores and tiny details (_ddn))
-}
-
-Property
-{
- Name = %SUBSURFACE_SCATTERING_MASK
- Mask = 0x40000
- Property (Subsurface Scattering Mask)
- Description (Use diffuse map alpha as subsurface scattering amount multiplier)
-}
-
-#ifdef FEATURE_MESH_TESSELLATION
-Property
-{
- Name = %DISPLACEMENT_MAPPING
- Mask = 0x10000000
- Property (Displacement mapping)
- Description (Use displacement mapping (requires height map (_displ)))
- //DependencySet = $TEX_Height
- DependencyReset = $TEX_Normals
-}
-
-Property
-{
- Name = %PHONG_TESSELLATION
- Mask = 0x20000000
- Property (Phong tessellation)
- Description (Use rough approximation of smooth surface subdivision)
-}
-
-Property
-{
- Name = %PN_TESSELLATION
- Mask = 0x40000000
- Property (PN triangles tessellation)
- Description (Use rough approximation of smooth surface subdivision)
-}
-#endif
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/Illum.ext b/Assets/Engine/Shaders/Illum.ext
deleted file mode 100644
index edce2900d2..0000000000
--- a/Assets/Engine/Shaders/Illum.ext
+++ /dev/null
@@ -1,243 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Illumination shader extension used by the editor
-// for automatic shader generation (based on "Illumination" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-
-
-Version (1.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %SPECULAR_MAP
- Mask = 0x10
- Property (Specular map)
- Description (Use specular map as separate texture)
- DependencySet = $TEX_Specular
- DependencyReset = $TEX_Specular
- Hidden
-}
-
-Property
-{
- Name = %DETAIL_MAPPING
- Mask = 0x4000
- Property (Detail mapping)
- Description (Enables Detail Map texture to increase surface detail. Requires Detail map before enabling.)
- DependencyReset = $TEX_Detail
-}
-
-Property
-{
- Name = %DETAIL_MAPPING_UV_SET_2
- Mask = 0x8000
- Property (Use uv set 2 for detail map)
- Description (Detail map will be applied to second UV set on mesh)
-}
-
-Property
-{
- Name = %OFFSET_BUMP_MAPPING
- Mask = 0x20000
- Property (Offset bump mapping)
- Description (Simulates surface bump detail. Used in place of POM for lower spec configs. Requires height and normal maps before enabling.)
- DependencyReset = $TEX_Normals
-}
-
-Property
-{
- Name = %FX_DISSOLVE
- Mask = 0x20
- Property (Dissolve FX)
- Description (Enables the use of an animated dissolve effect on the material)
-}
-
-Property
-{
- Name = %VERTCOLORS
- Mask = 0x400000
- Property (Vertex Colors)
- Description (Enables the use of vertex colors added to the mesh in the DCC tool)
-}
-
-Property
-{
- Name = %DECAL
- Mask = 0x2000000
- Property (Decal)
- Description (Enables the decal opacity map and used to prevent flickering and z-fighting)
-}
-
-Property
-{
- Name = %PARALLAX_OCCLUSION_MAPPING
- Mask = 0x8000000
- Property (Parallax occlusion mapping)
- Description (Simulates surface depth by parallaxing bump detail from camera view. Requires height and normal maps before enabling.)
- DependencyReset = $TEX_Normals
-}
-
-#ifdef FEATURE_MESH_TESSELLATION
-Property
-{
- Name = %DISPLACEMENT_MAPPING
- Mask = 0x10000000
- Property (Displacement mapping)
- Description (Displaces the vertices on the mesh to add depth. Requires height and normal maps before enabling.)
- //DependencySet = $TEX_Height
- DependencyReset = $TEX_Normals
-}
-
-Property
-{
- Name = %PHONG_TESSELLATION
- Mask = 0x20000000
- Property (Phong tessellation)
- Description (Tesselates geometry for smoother faces and displacement. Can suffer from inflation.)
-}
-
-Property
-{
- Name = %PN_TESSELLATION
- Mask = 0x40000000
- Property (PN triangles tessellation)
- Description (Best geometry tesselation for smoother faces and displacement at the cost of perfornmance)
-}
-#endif
-
-Property
-{
- Name = %BLENDLAYER
- Mask = 0x100
- Property (Blendlayer)
- Description (Enables a second set of texture inputs and mask to be used for a layered material)
-}
-
-Property
-{
- Name = %BLENDLAYER_UV_SET_2
- Mask = 0x200
- Property (Use uv set 2 for blendlayer maps)
- Description (Second blend layer maps will be applied to second UV set on mesh)
-}
-
-Property
-{
- Name = %EMITTANCE_MAP
- Mask = 0x400
- Property (Emittance Map)
- Description (Use emittance map texture)
- DependencySet = $TEX_Emittance
- DependencyReset = $TEX_Emittance
- Hidden
-}
-
-Property
-{
- Name = %EMITTANCE_MAP_UV_SET_2
- Mask = 0x800
- Property (Use uv set 2 for emittance map)
- Description (Emittance map will be applied to second UV set on mesh)
-}
-
-Property
-{
- Name = %ALPHAMASK_DETAILMAP
- Mask = 0x800000
- Property (DetailMap mask in Diffuse alpha)
- Description (Enables the diffuse map alpha to mask the detail map)
-}
-
-Property
-{
- Name = %SILHOUETTE_PARALLAX_OCCLUSION_MAPPING
- Mask = 0x10000
- Property (Silhouette POM)
- Description (Simulates surface depth by parallaxing bump detail and adds silhouette displacement to the mesh edge. Requires height and normal maps before enabling.)
- DependencyReset = $TEX_Normals
-}
-
-Property
-{
- Name = %ALLOW_SILHOUETTE_POM
- Mask = 0x40000
- DependencySet = $HW_SilhouettePom
- DependencyReset = $HW_SilhouettePom
- Hidden
-}
-
-Property
-{
- Name = %SUBSURFACE_SCATTERING
- Mask = 0x80000
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %DEPTH_FIXUP
- Mask = 0x4000000
- Property (Depth Fixup)
- Description (Enables to write and control depth for post-processing like depth of field)
-}
-
-Property
-{
- Name = %SAA_FILTERING
- Mask = 0x80000000
- Property (Specular Antialiasing)
- Description (Reduces antialiasing on bright specular meshes)
-}
-
-Property
-{
- Name = %ALLOW_SPECULAR_ANTIALIASING
- Mask = 0x200000000
- DependencySet = $HW_SpecularAntialiasing
- DependencyReset = $HW_SpecularAntialiasing
- Hidden
-}
-
-Property
-{
- Name = %OCCLUSION_MAP
- Mask = 0x40
- Property (Occlusion Map)
- Description (Adds an additional texture slot for ambient occlusion)
-}
-
-Property
-{
- Name = %APPLY_FORWARD_DYNAMIC_LIGHTING
- Mask = 0x400000000
- Property(Dynamic Lighting for Transparency)
- Description(Adds a full forward lighting pass for transparent objects - less performant)
-}
diff --git a/Assets/Engine/Shaders/LensOptics.ext b/Assets/Engine/Shaders/LensOptics.ext
deleted file mode 100644
index 5bd18e3895..0000000000
--- a/Assets/Engine/Shaders/LensOptics.ext
+++ /dev/null
@@ -1,16 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-//
-////////////////////////////////////////////////////////////////////////////
diff --git a/Assets/Engine/Shaders/LightBeam.ext b/Assets/Engine/Shaders/LightBeam.ext
deleted file mode 100644
index 835a0dbc99..0000000000
--- a/Assets/Engine/Shaders/LightBeam.ext
+++ /dev/null
@@ -1,44 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: LightBeam shader extension used by the editor
-// for automatic shader generation (based on "LightBeam" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %NOISE
- Mask = 0x1
- Property (Noise map)
- Description (Use 3D noise)
-}
-
-Property
-{
- Name = %FALLOFF
- Mask = 0x2
- Property (Use Falloff)
- Description (Use Falloff)
-}
-
-Property
-{
- Name = %DOUBLE_SAMPLING
- Mask = 0x4
- Property (Extra Sampling)
- Description (Add expense to reduce aliasing)
-}
diff --git a/Assets/Engine/Shaders/Monitor.ext b/Assets/Engine/Shaders/Monitor.ext
deleted file mode 100644
index 2a20138c1f..0000000000
--- a/Assets/Engine/Shaders/Monitor.ext
+++ /dev/null
@@ -1,53 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Monitor shader extension used by the editor
-// for automatic shader generation
-//
-////////////////////////////////////////////////////////////////////////////
-
-
-
-Version (1.00)
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %SPECULAR_MAP
- Mask = 0x2
- Property (Specular map)
- Description (Use specular map as separate texture)
- DependencySet = $TEX_Specular
- DependencyReset = $TEX_Specular
- Hidden
-}
-
-Property
-{
- Name = %PIXELIZE
- Mask = 0x4
- Property (Pixelized)
- Description (Pixelize the diffuse texture.)
-}
-
diff --git a/Assets/Engine/Shaders/ParticleImposter.ext b/Assets/Engine/Shaders/ParticleImposter.ext
deleted file mode 100644
index 650541cfa3..0000000000
--- a/Assets/Engine/Shaders/ParticleImposter.ext
+++ /dev/null
@@ -1,37 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %SOFT_PARTICLE
- Mask = 0x2
- Property (Soft Particle)
- Description (Soften particle intersections with world)
-}
diff --git a/Assets/Engine/Shaders/Particles.ext b/Assets/Engine/Shaders/Particles.ext
deleted file mode 100644
index 3f24ea84b7..0000000000
--- a/Assets/Engine/Shaders/Particles.ext
+++ /dev/null
@@ -1,102 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Particles shader extension used by the editor
-// for automatic shader generation (based on "Particles" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %REFRACTION
- Mask = 0x4
- Property (Refraction)
- Description (Use normal-map texture as displacement for refraction)
-}
-
-Property
-{
- Name = %REFRACTION_TINTING
- Mask = 0x800
- Property (Refraction Tinting)
- Description (Use color texture to tint refraction)
-}
-
-Property
-{
- Name = %SCREEN_SPACE_DEFORMATION
- Mask = 0x10
- Property (Screen space deformation)
- Description (Use custom slot map for screen space particles deformation)
- DependencyReset = $TEX_Custom
-}
-
-Property
-{
- Name = %DEFORMATION
- Mask = 0x20
- Property (Deformation)
- Description (Use custom slot map for per-particle deformation)
- DependencyReset = $TEX_Custom
-}
-
-Property
-{
- Name = %COLOR_LOOKUP
- Mask = 0x40
- Property (Color lookup)
- Description (Use custom slot [1] map for applying color lookup)
- DependencyReset = $TEX_CustomSecondary
-}
-
-Property
-{
- Name = %SPECULAR_LIGHTING
- Mask = 0x100
- Property (Specular Lighting)
- Description (Calculate specular lighting in addition to diffuse lighting)
- DependencyReset = $TEX_Normals
-}
-
-Property
-{
- Name = %DEPTH_FIXUP
- Mask = 0x200
- Property (Depth Fixup)
- Description (Write depth for depth of field and postprocessing)
-}
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x400
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %GLOW_MAP
- Mask = 0x1000
- Property (Emissive map)
- Description (Use this map to mask the particle emissive intensity)
- DependencySet = $TEX_Detail
- DependencyReset = $TEX_Detail
- Hidden
-}
diff --git a/Assets/Engine/Shaders/RunTime.ext b/Assets/Engine/Shaders/RunTime.ext
deleted file mode 100644
index 9cc96769d5..0000000000
--- a/Assets/Engine/Shaders/RunTime.ext
+++ /dev/null
@@ -1,1259 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description:
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %_RT_FOG
- Mask = 0x1 // 1 << 0
- Precache = GeneralPS
- Precache = GeneralVS
- Precache = GeneralGS
- Precache = GeneralDS
- Precache = GeneralHS
- Precache = TerrainPS
- Precache = TerrainVS
- Precache = VegetationVS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationPS
- Precache = SkinPS
- Precache = SkinVS
- Precache = HairPS
- Precache = HairVS
- Precache = EyePS
- Precache = EyeVS
- Precache = GlassPS
- Precache = GlassVS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
- Precache = CustomRenderHS
- Precache = CustomRenderDS
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
- Precache = WaterSurfaceHS
- Precache = WaterSurfaceDS
- Precache = WaterFogVolume_VS
- Precache = WaterFogVolume_PS
- Precache = MeshBakerPS
- Precache = ParticleImposterVS
- Precache = ParticleImposterPS
-}
-
-Property
-{
- Name = %_RT_AMBIENT
- Mask = 0x2 // 1 << 1
- Precache = GeneralPS
- Precache = SkinPS
- Precache = HairPS
- Precache = EyePS
- Precache = GlassPS
- Precache = TerrainPS
- Precache = VegetationPS
- Precache = ParticlePS
- Precache = MeshBakerPS
-}
-
-Property
-{
- Name = %_RT_OCEAN_PARTICLE
- Mask = 0x4 // 1 << 2
- Precache = PostProcessGamePS
- Precache = DeferredLightPassPS
- Precache = DeferredPassPS
-
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
- Precache = WaterSurfaceHS
- Precache = WaterSurfaceDS
- Precache = WaterFogVolume_PS
-}
-
-Property
-{
- //Using the same mask as _RT_OCEAN_PARTICLE as we have run out of them.
- //It should be safe to do this as this flag is not used in water rendering
- Name = %_RT_DEPTHFIXUP
- Mask = 0x4 // 1 << 2
- Precache = FurShellPS
- Precache = GlassPS
- Precache = IlluminationPS
- Precache = GeneralPS
-}
-
-Property
-{
- Name = %_RT_DECAL_TEXGEN_2D
- Mask = 0x8 // 1 << 3
- Precache = GeneralVS
- Precache = GeneralDS
- Precache = GeneralHS
- Precache = ShadowGenVS
- Precache = CausticsVS
- Precache = GeneralPS
- Precache = CustomRenderHS
- Precache = CustomRenderDS
- Precache = ZVS
- Precache = ZPS
- Precache = MeshBakerPS
- Precache = TiledShadingCS
-}
-
-Property
-{
- Name = %_RT_DISSOLVE
- Mask = 0x10 // 1 << 4
- Precache = ZPS
- Precache = ZVS
- Precache = ShadowGenVS
- Precache = ShadowGenPS
- Precache = GeneralPS
- Precache = GeneralVS
-}
-
-Property
-{
- Name = %_RT_VOLUMETRIC_FOG
- Mask = 0x20 // 1 << 5
- Precache = GeneralPS
- Precache = GeneralVS
- Precache = GeneralGS
- Precache = GeneralDS
- Precache = GeneralHS
- Precache = TerrainPS
- Precache = TerrainVS
- Precache = VegetationVS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationPS
- Precache = SkinPS
- Precache = SkinVS
- Precache = HairPS
- Precache = HairVS
- Precache = EyePS
- Precache = EyeVS
- Precache = GlassPS
- Precache = GlassVS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
- Precache = WaterSurfacePS
- Precache = WaterFogVolume_VS
- Precache = WaterFogVolume_PS
- Precache = MeshBakerPS
- Precache = CloudVS
- Precache = CloudPS
- Precache = FogPostProcessPS
- Precache = ParticleImposterVS
- Precache = ParticleImposterPS
-}
-
-Property
-{
- Name = %_RT_NEAREST
- Mask = 0x40 // 1 << 6
- Precache = ShadowGenVS
- Precache = ShadowMaskGenVS
- Precache = ShadowMaskGenPS
- Precache = ZVS
- Precache = MotionBlurVS
- Precache = SkinVS
- Precache = GeneralVS
- Precache = VegetationVS
- Precache = CausticsVS
- Precache = CustomRenderVS
- Precache = DebugPassVS
-}
-
-Property
-{
- Name = %_RT_GLOBAL_ILLUMINATION
- Mask = 0x80 // 1 << 7
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_ALPHATEST
- Mask = 0x100 // 1 << 8
- Precache = ShadowGenVS
- Precache = ShadowGenPS
- Precache = ZPS
- Precache = ZVS
- Precache = MotionBlurPS
- Precache = CustomRenderPS
- Precache = VegetationVS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationPS
- Precache = GeneralPS
- Precache = GlassPS
- Precache = GlassVS
- Precache = MotionBlurVS
- Precache = MeshBakerPS
-}
-
-Property
-{
- Name = %_RT_SOFT_PARTICLE
- Mask = 0x200 // 1 << 9
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_HDR_MODE
- Mask = 0x400 // 1 << 10
- Precache = GeneralPS
- Precache = TerrainPS
- Precache = VegetationPS
- Precache = SkinPS
- Precache = HairPS
- Precache = EyePS
- Precache = GlassPS
- Precache = ParticlePS
- Precache = WaterSurfacePS
- Precache = ParticleImposterPS
-}
-
-Property
-{
- Name = %_RT_PARTICLE_SHADOW
- Mask = 0x800 // 1 << 11
- Precache = ParticlePS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
-}
-
-Property
-{
- Name = %_RT_SAMPLE1
- Mask = 0x1000 // 1 << 12
- Precache = CustomRenderHS
- Precache = CustomRenderDS
- Precache = CustomRenderVS
- Precache = CustomRenderPS
- Precache = SkinPS
- Precache = HDRPostProcessPS
- Precache = PostMotionBlurVS
- Precache = PostMotionBlurPS
- Precache = PostSunShaftsPS
- Precache = PostProcessGamePS
- Precache = PostDofPS
- Precache = PostEffectsVS
- Precache = PostEffectsPS
- Precache = PostAA_PS
- Precache = DeferredLightPassPS
- Precache = DeferredPassPS
- Precache = PostHUD3D_VS
- Precache = PostHUD3D_PS
- Precache = ParticlePS
- Precache = ParticleVS
- Precache = DeferredRainPS
- Precache = ShadowMaskGenPS
-
- Precache = WaterFogVolume_VS
- Precache = WaterFogVolume_PS
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
- Precache = WaterSurfaceHS
- Precache = WaterSurfaceDS
-
- Precache = BeamPS
- Precache = ParticleHS
- Precache = ParticleDS
-
- Precache = TiledShadingCS
- Precache = VolumeLightInjectionCS
- Precache = ResolvePS
- Precache = VideoPS
-}
-
-Property
-{
- Name = %_RT_SAMPLE2
- Mask = 0x2000 // 1 << 13
-
- Precache = HDRPostProcessPS
- Precache = PostMotionBlurVS
- Precache = PostMotionBlurPS
- Precache = PostAA_PS
- Precache = PostSunShaftsPS
- Precache = PostProcessGamePS
- Precache = DeferredDecalPassPS
- Precache = DeferredLightPassPS
- Precache = DeferredPassPS
- Precache = CustomRenderPS
- Precache = DeferredRainPS
-
- Precache = ShadowMaskGenVS
- Precache = ShadowMaskGenPS
- Precache = ParticlePS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
-
- Precache = BeamPS
- Precache = LensOpticsPS
- Precache = WaterFogVolume_PS
- Precache = TiledShadingCS
- Precache = FogPostProcessPS
- Precache = VideoPS
-}
-
-Property
-{
- Name = %_RT_SAMPLE3
- Mask = 0x4000 // 1 << 14
- Precache = ParticlePS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = PostAA_PS
- Precache = HDRPostProcessPS
- Precache = BeamPS
- Precache = DeferredLightPassPS
- Precache = DeferredPassPS
- Precache = DeferredRainPS
- Precache = ShadowMaskGenVS
- Precache = ShadowMaskGenPS
- Precache = DeferredDecalPassPS
- Precache = DeferredDecalEmissivePassPS
- Precache = ResolvePS
-
- Precache = LensOpticsPS
- Precache = WaterFogVolume_PS
- Precache = TiledShadingCS
- Precache = VideoPS
-}
-
-Property
-{
- Name = %_RT_POINT_LIGHT
- Mask = 0x8000 // 1 << 15
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = WaterFogVolume_PS
- Precache = ConeTraceDiffusePS
-}
-
-Property
-{
- Name = %_RT_ALPHABLEND
- Mask = 0x10000 // 1 << 16
- Precache = GeneralHS
- Precache = GeneralDS
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = ParticlePS
- Precache = ParticleVS
- Precache = HairVS
- Precache = EyeVS
- Precache = VegetationVS
- Precache = GeneralVS
- Precache = GlassVS
- Precache = CustomRenderHS
- Precache = CustomRenderDS
- Precache = ZVS
- Precache = ZPS
- Precache = MotionBlurPS
-}
-
-Property
-{
- Name = %_RT_ANIM_BLEND
- Mask = 0x20000 // 1 << 17
- Precache = ParticlePS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticleGS
-}
-
-Property
-{
- Name = %_RT_QUALITY
- Mask = 0x40000 // 1 << 18
- AutoPrecache
- Precache = ShadowGenVS
- Precache = ShadowGenPS
- Precache = ZVS
- Precache = ZPS
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = GeneralPS
- Precache = GeneralVS
- Precache = SkinPS
- Precache = SkinVS
- Precache = HairPS
- Precache = HairVS
- Precache = EyePS
- Precache = EyeVS
- Precache = GlassPS
- Precache = GlassVS
- Precache = TerrainPS
- Precache = TerrainVS
- Precache = VegetationPS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationVS
- Precache = MotionBlurVS
- Precache = MotionBlurPS
- Precache = CausticsVS
- Precache = ParticlePS
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
-
- Precache = PostMotionBlurVS
- Precache = PostMotionBlurPS
- Precache = PostSunShaftsPS
- Precache = SpriteDilatePS
- Precache = ShadowMaskGenPS
-
- Precache = HDRPostProcessVS
- Precache = HDRPostProcessPS
- Precache = FogPostProcessPS
- Precache = PostProcessGameVS
- Precache = PostProcessGamePS
-
- Precache = DistanceCloudsPS
- Precache = DeferredLightPassPS
- Precache = VolumeLightInjectionCS
-}
-
-Property
-{
- Name = %_RT_QUALITY1
- Mask = 0x80000 // 1 << 19
- AutoPrecache
- Precache = ShadowGenVS
- Precache = ShadowGenPS
- Precache = ZVS
- Precache = ZPS
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = GeneralPS
- Precache = GeneralVS
- Precache = SkinPS
- Precache = SkinVS
- Precache = HairPS
- Precache = HairVS
- Precache = EyePS
- Precache = EyeVS
- Precache = GlassPS
- Precache = GlassVS
- Precache = TerrainPS
- Precache = TerrainVS
- Precache = VegetationPS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationVS
- Precache = MotionBlurVS
- Precache = MotionBlurPS
- Precache = CausticsVS
- Precache = ParticlePS
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
-
- Precache = PostMotionBlurVS
- Precache = PostMotionBlurPS
- Precache = PostSunShaftsPS
- Precache = SpriteDilatePS
- Precache = ShadowMaskGenPS
-
- Precache = HDRPostProcessVS
- Precache = HDRPostProcessPS
- Precache = FogPostProcessPS
- Precache = PostProcessGameVS
- Precache = PostProcessGamePS
-
- Precache = DistanceCloudsPS
- Precache = DeferredLightPassPS
- Precache = VolumeLightInjectionCS
-}
-
-Property
-{
- Name = %_RT_INSTANCING_ATTR
- Mask = 0x100000 // 1 << 20
- Precache = GeneralVS
- Precache = SkinVS
- Precache = HairVS
- Precache = EyeVS
- Precache = GlassVS
- Precache = VegetationVS
- Precache = ShadowGenVS
- Precache = ZVS
- Precache = MotionBlurVS
- Precache = CausticsVS
- Precache = CustomRenderVS
- Precache = DebugPassVS
-}
-
-Property
-{
- Name = %_RT_ENVIRONMENT_CUBEMAP
- Mask = 0x200000 // 1 << 21
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_TILED_SHADING
- Mask = 0x400000 // 1 << 22
- Precache = EyePS
- Precache = HairPS
- Precache = GlassPS
- Precache = IlluminationPS
-}
-
-Property
-{
- Name = %_RT_NO_TESSELLATION
- Mask = 0x800000 // 1 << 23
- Precache = GeneralVS
- Precache = GeneralPS
- Precache = ShadowGenVS
- Precache = ShadowGenPS
- Precache = ZVS
- Precache = ZPS
- Precache = MotionBlurVS
- Precache = MotionBlurPS
- Precache = CustomRenderVS
- Precache = SkinVS
- Precache = SkinPS
- Precache = VegetationVS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationPS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
- Precache = DebugPassVS
-}
-
-Property
-{
- Name = %_RT_APPLY_TOON_SHADING
- Mask = 0x1000000 // 1 << 24
- Precache = DeferredLightPassPS
- Precache = TiledShadingCS
-}
-
-
-Property
-{
- Name = %_RT_LIGHT_TEX_PROJ
- Mask = 0x2000000 // 1 << 25
- Precache = DeferredLightPassPS
- Precache = ParticleVS
- Precache = ParticleDS
- Precache = ConeTraceDiffusePS
-}
-
-Property
-{
- Name = %_RT_VERTEX_VELOCITY
- Mask = 0x4000000 // 1 << 26
- Precache = ZVS
- Precache = MotionBlurVS
-}
-
-Property
-{
- Name = %_RT_SKINNING_DUAL_QUAT
- Mask = 0x8000000 // 1 << 27
- Precache = GeneralVS
- Precache = SkinVS
- Precache = HairVS
- Precache = EyeVS
- Precache = GlassVS
- Precache = VegetationVS
- Precache = ShadowGenVS
- Precache = ZVS
- Precache = MotionBlurVS
- Precache = CausticsVS
- Precache = CustomRenderVS
- Precache = DebugPassVS
-}
-
-Property
-{
- Name = %_RT_SKINNING_DQ_LINEAR
- Mask = 0x10000000 // 1 << 28
- Precache = GeneralVS
- Precache = SkinVS
- Precache = HairVS
- Precache = EyeVS
- Precache = GlassVS
- Precache = VegetationVS
- Precache = ShadowGenVS
- Precache = ZVS
- Precache = MotionBlurVS
- Precache = CausticsVS
- Precache = CustomRenderVS
- Precache = DebugPassVS
-}
-
-Property
-{
- Name = %_RT_BLEND_WITH_TERRAIN_COLOR
- Mask = 0x20000000 // 1 << 29
- Precache = ZVS
- Precache = ZPS
- Precache = GeneralHS
- Precache = GeneralDS
- Precache = VegetationVS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationPS
- Precache = ConeTraceDiffusePS
-}
-
-Property
-{
- Name = %_RT_MOTION_BLUR
- Mask = 0x40000000 // 1 << 30
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = GPUParticleCS
- Precache = ParticleDS
- Precache = ParticlePS
- Precache = ZVS
- Precache = ZGS
- Precache = ZPS
- Precache = GeneralHS
- Precache = GeneralDS
-}
-
-Property
-{
- Name = %_RT_LIGHTVOLUME0
- Mask = 0x80000000 // 1 << 31
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
- Precache = DeferredLightPassPS
- Precache = DeferredPassPS
- Precache = VolumeLightInjectionCS
- Precache = RenderDownscaledShadowMapPS
-}
-
-Property
-{
- //Using the same mask as _RT_LIGHTVOLUME0 as we have run out of them.
- //It should be safe to do this as this flag is not used in the deferred lighting pass or particles.
-
- Name = %_RT_SRGB0
- Mask = 0x80000000 // 1 << 31
- Precache = PostAA_PS
- Precache = ResolvePS
- Precache = HDRPostProcessPS
-}
-
-Property
-{
- Name = %_RT_LIGHTVOLUME1
- Mask = 0x100000000 // 1 << 32
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
- Precache = VolumeLightInjectionCS
- Precache = RenderDownscaledShadowMapPS
-}
-
-Property
-{
- //Using the same mask as _RT_LIGHTVOLUME1 as we have run out of them.
- //It should be safe to do this as this flag is not used in the deferred lighting pass or particles.
-
- Name = %_RT_SRGB1
- Mask = 0x100000000 // 1 << 32
- Precache = PostAA_PS
- Precache = ResolvePS
- Precache = HDRPostProcessPS
-}
-
-Property
-{
- Name = %_RT_NOZPASS
- Mask = 0x200000000 // 1 << 33
- Precache = VegetationVS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationPS
-}
-
-Property
-{
- //Using the same mask as _RT_NOZPASS as we have run out of them.
- //It should be safe to do this as this flag is not used in vegetation pass.
-
- Name = %_RT_SRGB2
- Mask = 0x200000000 // 1 << 33
- Precache = PostAA_PS
- Precache = ResolvePS
- Precache = HDRPostProcessPS
-}
-
-Property
-{
- Name = %_RT_SHADOW_MIXED_MAP_G16R16
- Mask = 0x400000000 // 1 << 34
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = WaterFogVolume_PS
-
- Precache = ShadowMaskGenVS
- Precache = ShadowMaskGenPS
-}
-
-Property
-{
- Name = %_RT_SHADOW_JITTERING
- Mask = 0x800000000 // 1 << 35
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = TerrainPS
- Precache = WaterFogVolume_PS
-
- Precache = ShadowMaskGenVS
- Precache = ShadowMaskGenPS
-
- Precache = HairPS
- Precache = EyePS
-}
-
-Property
-{
- Name = %_RT_ADDITIVE_BLENDING
- Mask = 0x1000000000 // 1 << 36
- Precache = GlassPS
- Precache = GeneralPS
- Precache = HairPS
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_SAMPLE0
- Mask = 0x2000000000 // 1 << 37
- Precache = CustomRenderVS
- Precache = CustomRenderPS
- Precache = SkinPS
- Precache = GlassPS
-
- Precache = FogPostProcessPS
- Precache = HDRPostProcessPS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
- Precache = PostHUD3D_VS
- Precache = PostHUD3D_PS
- Precache = PostMotionBlurVS
- Precache = PostMotionBlurPS
- Precache = PostAA_PS
- Precache = PostSunShaftsPS
- Precache = PostProcessGameVS
- Precache = PostProcessGamePS
- Precache = PostDofPS
- Precache = PostEffectsVS
- Precache = PostEffectsPS
- Precache = DeferredDecalPassPS
- Precache = DeferredDecalEmissivePassPS
- Precache = DeferredLightPassPS
- Precache = DeferredPassPS
- Precache = SceneRainVS
- Precache = SceneRainPS
- Precache = DeferredRainPS
- Precache = ResolveVS
- Precache = ResolvePS
-
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
- Precache = WaterSurfaceHS
- Precache = WaterSurfaceDS
- Precache = WaterFogVolume_PS
-
- Precache = BeamPS
- Precache = LensOpticsVS
- Precache = TiledShadingCS
- Precache = VolumeLightInjectionCS
- Precache = VideoPS
-}
-
-// Reserved for post processes/deferred - do not use for light/common shaders
-Property
-{
- Name = %_RT_SAMPLE5
- Mask = 0x4000000000 // 1 << 38
-
- Precache = ZVS
- Precache = GeneralVS
- Precache = GeneralHS
- Precache = GeneralDS
-
- Precache = HDRPostProcessPS
- Precache = PostSunShaftsPS
- Precache = PostProcessGamePS
- Precache = DeferredPassPS
- Precache = DeferredPassVS
- Precache = DeferredLightPassPS
- Precache = PostMotionBlurPS
- Precache = DeferredDecalPassPS
- Precache = DeferredDecalEmissivePassPS
- Precache = ResolvePS
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = CustomRenderHS
- Precache = CustomRenderDS
- Precache = CustomRenderPS
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
- Precache = WaterSurfaceHS
- Precache = WaterSurfaceDS
- Precache = WaterFogVolume_PS
- Precache = PostAA_PS
-
- Precache = BeamPS
- Precache = LensOpticsVS
- Precache = TiledShadingCS
- Precache = VolumeLightInjectionCS
- Precache = ReprojectVolumetricFogCS
-}
-
-Property
-{
- Name = %_RT_HW_PCF_COMPARE
- Mask = 0x8000000000 // 1 << 39
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = ShadowGenVS
- Precache = ShadowGenPS
-
- Precache = DeferredLightPassPS
- Precache = ShadowMaskGenVS
- Precache = ShadowMaskGenPS
-
- Precache = WaterFogVolume_PS
- Precache = ConeTraceDiffusePS
-}
-
-Property
-{
- Name = %_RT_REVERSE_DEPTH
- Mask = 0x10000000000 // 1 << 40
- Precache = DistanceCloudsVS
- Precache = PostProcessGamePS
- Precache = TerrainVS
- Precache = ZVS
- Precache = ZPS
- Precache = UnderwaterGodRays
- Precache = WaterSurfaceVS
- Precache = WaterFogVolume_VS
- Precache = GeneralVS
- Precache = LensOpticsVS
-}
-
-Property
-{
- Name = %_RT_DEBUG0
- Mask = 0x20000000000 // 1 << 41
-
- Runtime
-}
-
-Property
-{
- Name = %_RT_DEBUG1
- Mask = 0x40000000000 // 1 << 42
- Runtime
-}
-
-Property
-{
- Name = %_RT_DEBUG2
- Mask = 0x80000000000 // 1 << 43
- Runtime
-}
-
-Property
-{
- Name = %_RT_DEBUG3
- Mask = 0x100000000000 // 1 << 44
- Runtime
-}
-
-Property
-{
- Name = %_RT_CUBEMAP0
- Mask = 0x200000000000 // 1 << 45
- Precache = ShadowGenPS
- Precache = ShadowGenVS
-
- Precache = PostSunShaftsPS
- Precache = PostProcessGamePS
-
- Precache = DeferredDecalPassVS
- Precache = DeferredDecalPassPS
- Precache = DeferredDecalEmissivePassPS
- Precache = DeferredLightPassVS
- Precache = DeferredLightPassPS
- Precache = DeferredPassVS
- Precache = DeferredPassPS
-
- Precache = WaterFogVolume_PS
- Precache = TiledShadingCS
-}
-
-Property
-{
- Name = %_RT_SAMPLE4
- Mask = 0x400000000000 // 1 << 46
- Precache = ShadowGenVS
- Precache = ShadowGenPS
- Precache = PostAA_PS
-
- Precache = HDRPostProcessPS
- Precache = PostProcessGamePS
- Precache = DeferredLightPassPS
- Precache = DeferredPassPS
- Precache = PostSunShaftsPS
- Precache = PostMotionBlurPS
-
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
- Precache = WaterSurfaceHS
- Precache = WaterSurfaceDS
- Precache = WaterFogVolume_PS
- Precache = DeferredDecalPassPS
- Precache = DeferredDecalEmissivePassPS
-
- Precache = BeamPS
- Precache = LensOpticsPS
-
- Precache = TiledShadingCS
-
- Precache = ConeTraceDiffusePS
- Precache = VolumeLightInjectionCS
-}
-
-Property
-{
- Name = %_RT_SPRITE
- Mask = 0x800000000000 // 1 << 47
- Precache = VegetationVS
- Precache = VegetationPS
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_SHADOW_PASS
- Mask = 0x1000000000000 // 1 << 48
- Precache = ParticleVS
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_DEPTH_COLLISION
- Mask = 0x2000000000000 // 1 << 49
- Precache = GPUParticleCS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_TURBULENCE
- Mask = 0x4000000000000 // 1 << 50
- Precache = GPUParticleCS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_UV_ANIMATION
- Mask = 0x8000000000000 // 1 << 51
- Precache = ParticleVS
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_NORMAL_MAP
- Mask = 0x10000000000000 // 1 << 52
- Precache = ParticleVS
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_GLOW_MAP
- Mask = 0x20000000000000 // 1 << 53
- Precache = ParticleVS
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_CUBEMAP_DEPTH_COLLISION
- Mask = 0x40000000000000 // 1 << 54
- Precache = GPUParticleCS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_WRITEBACK_DEATH_LOCATIONS
- Mask = 0x80000000000000 // 1 << 55
- Precache = GPUParticleCS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_TARGET_ATTRACTION
- Mask = 0x100000000000000 // 1<< 56
- Precache = GPUParticleCS
-}
-
-Property
-{
- // Using the same mask as _RT_GPU_PARTICLE_TARGET_ATTRACTION as we have run out of them.
- //It should be safe to do this as this flag is not used in the deferred lighting pass.
-
- Name = %_RT_DEFERRED_RENDER_TARGET_OPTIMIZATION
- Mask = 0x100000000000000 // 1<< 56
-
- Precache = DeferredPassPS
- Precache = DeferredPassVS
- Precache = DeferredLightPassPS
- Precache = TiledShadingCS
- Precache = LightPassPS
- Precache = LightPassGmemPS
- Precache = ConeTraceDiffusePS
- Precache = VolumeLightInjectionCS
- Precache = CubemapPassPS
- Precache = CubemapPassGmemPS
- Precache = DeferredShadowGmemPS
- Precache = DeferredShadingPassPS
- Precache = DeferredShadingPassGmemPS
- Precache = AmbientPS
- Precache = ShadowMaskGenVS
- Precache = ShadowMaskGenPS
- Precache = DeferredDecalPassPS
- Precache = DeferredDecalEmissivePassPS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_SHAPE_ANGLE
- Mask = 0x200000000000000 // 1 << 57
- Precache = GPUParticleCS
-}
-
-Property
-{
-
- // Using the same mask as _RT_GPU_PARTICLE_SHAPE_ANGLE as we have run out of them.
- //It should be safe to do this as this flag is not used in the deferred lighting pass.
-
- Name = %_RT_SLIM_GBUFFER
- Mask = 0x200000000000000 // 1 << 57
- AutoPrecache
- Precache = ShadowGenVS
- Precache = ShadowGenPS
- Precache = ZVS
- Precache = ZPS
- Precache = FogPassVolShadowsInterleavePassPS
- Precache = GeneralPS
- Precache = GeneralVS
- Precache = SkinPS
- Precache = SkinVS
- Precache = HairPS
- Precache = HairVS
- Precache = EyePS
- Precache = EyeVS
- Precache = GlassPS
- Precache = GlassVS
- Precache = TerrainPS
- Precache = TerrainVS
- Precache = VegetationPS
- Precache = VegetationHS
- Precache = VegetationDS
- Precache = VegetationVS
- Precache = MotionBlurVS
- Precache = MotionBlurPS
- Precache = CausticsVS
- Precache = ParticlePS
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
-
- Precache = PostMotionBlurVS
- Precache = PostMotionBlurPS
- Precache = PostSunShaftsPS
- Precache = SpriteDilatePS
- Precache = ShadowMaskGenPS
-
- Precache = HDRPostProcessVS
- Precache = HDRPostProcessPS
- Precache = FogPostProcessPS
- Precache = PostProcessGameVS
- Precache = PostProcessGamePS
-
- Precache = DistanceCloudsPS
- Precache = DeferredLightPassPS
- Precache = VolumeLightInjectionCS
- Precache = HDRPostProcessPS
- Precache = PostProcessGamePS
- Precache = DeferredLightPassPS
- Precache = DeferredPassPS
- Precache = PostSunShaftsPS
- Precache = PostMotionBlurPS
-
- Precache = WaterSurfaceVS
- Precache = WaterSurfacePS
- Precache = WaterSurfaceHS
- Precache = WaterSurfaceDS
- Precache = WaterFogVolume_PS
- Precache = DeferredDecalPassPS
- Precache = DeferredDecalEmissivePassPS
-
- Precache = BeamPS
- Precache = LensOpticsPS
-
- Precache = DeferredShadingPassPS
- Precache = DeferredPassVS
- Precache = DeferredLightPassPS
- Precache = TiledShadingCS
- Precache = LightPassPS
- Precache = ConeTraceDiffusePS
- Precache = VolumeLightInjectionCS
- Precache = CubemapPassPS
- Precache = CubemapPassGmemPS
-
- Precache = DeferredSnowPS
- Precache = DeferredRainPS
- Precache = SSRCompositionPS
- Precache = SSRRaytracePS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_SHAPE_BOX
- Mask = 0x400000000000000 // 1 << 58
- Precache = GPUParticleCS
- Precache = ParticleVS
-}
-
-Property
-{
- // Using the same mask as _RT_GPU_PARTICLE_SHAPE_BOX as we have run out of them.
- // It should be safe to do this as this (GPU Particles shouldn't have skinning)
-
- Name = %_RT_SKINNING_MATRIX
- Mask = 0x400000000000000 // 1 << 58
- Precache = GeneralVS
- Precache = SkinVS
- Precache = HairVS
- Precache = EyeVS
- Precache = GlassVS
- Precache = VegetationVS
- Precache = ShadowGenVS
- Precache = ZVS
- Precache = MotionBlurVS
- Precache = CausticsVS
- Precache = CustomRenderVS
- Precache = DebugPassVS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_SHAPE_POINT
- Mask = 0x800000000000000 // 1 << 59
- Precache = GPUParticleCS
-}
-
-Property
-{
- //Using the same mask as _RT_GPU_PARTICLE_SHAPE_POINT as we have run out of them.
- //It should be safe to do this as this flag is not used in the deferred lighting pass.
- Name = %_RT_APPLY_SSDO
- Mask = 0x800000000000000 // 1 << 59.
- Precache = DeferredPassPS
- Precache = DeferredPassVS
- Precache = DeferredLightPassPS
- Precache = TiledShadingCS
-}
-
-//Using the same mask as _RT_APPLY_SSDO as we have run out of them.
-//It should be safe to do this as this flag is not used in particle shaders.
-Property
-{
- Name = %_RT_FOG_VOLUME_HIGH_QUALITY_SHADER
- Mask = 0x800000000000000 // 1 << 59
- Precache = ParticleVS
- Precache = ParticleHS
- Precache = ParticleDS
- Precache = ParticlePS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_SHAPE_CIRCLE
- Mask = 0x1000000000000000 // 1 << 60
- Precache = GPUParticleCS
- Precache = ParticleVS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_SHAPE_SPHERE
- Mask = 0x2000000000000000 // 1 << 61
- Precache = GPUParticleCS
- Precache = ParticleVS
-}
-
-Property
-{
- Name = %_RT_GPU_PARTICLE_WIND
- Mask = 0x4000000000000000 // 1 << 62
- Precache = GPUParticleCS
-
-}
-Property
-{
- Name = %_RT_MULTI_LAYER_ALPHA_BLEND
- Mask = 0x8000000000000000 // 1 << 63
- Precache = FurShellPS
- Precache = FurFinsPS
- Precache = GlassPS
- Precache = GeneralPS
- Precache = HairPS
- Precache = ParticlePS
- Precache = MultiLayerAlphaBlendResolvePS
-}
-
-
diff --git a/Assets/Engine/Shaders/Scopes.ext b/Assets/Engine/Shaders/Scopes.ext
deleted file mode 100644
index ae84db49ca..0000000000
--- a/Assets/Engine/Shaders/Scopes.ext
+++ /dev/null
@@ -1,42 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %REFLEX_SIGHT
- Mask = 0x2
- Property (Reflex sight)
- Description (New reflex sight version)
-}
-
-Property
-{
- Name = %SCOPE_ZOOMED_REFRACTION
- Mask = 0x4
- Property (Scope zoomed refraction)
- Description (Scope zoomed in refraction)
-}
-
-Property
-{
- Name = %HOLO_SIGHT
- Mask = 0x8
- Property (Use holo sight depth)
- Description (Holographic sight with depth modifier)
-}
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/ShaderProfiles.txt b/Assets/Engine/Shaders/ShaderProfiles.txt
deleted file mode 100644
index ae5178118e..0000000000
--- a/Assets/Engine/Shaders/ShaderProfiles.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-
-Version (1.00)
-
-Profile 'Low'
-{
-}
-
-Profile 'High'
-{
- UseNormalAlpha
-}
diff --git a/Assets/Engine/Shaders/ShadowMaskGen.ext b/Assets/Engine/Shaders/ShadowMaskGen.ext
deleted file mode 100644
index 6c65742d63..0000000000
--- a/Assets/Engine/Shaders/ShadowMaskGen.ext
+++ /dev/null
@@ -1,21 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description:
-//
-////////////////////////////////////////////////////////////////////////////
-
-
-
-Version (1.00)
diff --git a/Assets/Engine/Shaders/SketchTerrain.ext b/Assets/Engine/Shaders/SketchTerrain.ext
deleted file mode 100644
index 3dfad9d1cf..0000000000
--- a/Assets/Engine/Shaders/SketchTerrain.ext
+++ /dev/null
@@ -1,27 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-//
-////////////////////////////////////////////////////////////////////////////
-Version (1.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %TEMP_TERRAIN
- Mask = 0x40000000
- DependencySet = $UserEnabled
- Hidden
-}
diff --git a/Assets/Engine/Shaders/SkyHDR.ext b/Assets/Engine/Shaders/SkyHDR.ext
deleted file mode 100644
index 87d1a00ca5..0000000000
--- a/Assets/Engine/Shaders/SkyHDR.ext
+++ /dev/null
@@ -1,39 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-//
-////////////////////////////////////////////////////////////////////////////
-Version (1.00)
-
-Property
-{
- Name = %NO_MOON
- Mask = 0x02
- Property (No moon)
- Description (Sky dome doesn't render moon)
-}
-Property
-{
- Name = %NO_NIGHT_SKY_GRADIENT
- Mask = 0x04
- Property (No night sky gradient)
- Description (Sky dome doesn't render night sky gradient)
-}
-Property
-{
- Name = %NO_DAY_SKY_GRADIENT
- Mask = 0x08
- Property (No day sky gradient)
- Description (Sky dome doesn't render day sky gradient)
-}
diff --git a/Assets/Engine/Shaders/StarterGame_GeometryBeamScaling.ext b/Assets/Engine/Shaders/StarterGame_GeometryBeamScaling.ext
deleted file mode 100644
index 25e395f42d..0000000000
--- a/Assets/Engine/Shaders/StarterGame_GeometryBeamScaling.ext
+++ /dev/null
@@ -1,43 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-//
-////////////////////////////////////////////////////////////////////////////
-
-
-Property
-{
- Name = %NOISE
- Mask = 0x1
- Property (Dust & Turbulence)
- Description (Add a dust overlay [spec map for dust, bump map for turbulence] )
-}
-
-
-Property
-{
- Name = %RECEIVE_SHADOWS
- Mask = 0x2
- Property (Receive Shadows)
- Description (Enable shadow receiving)
-}
-
-
-Property
-{
- Name = %UV_VIGNETTING
- Mask = 0x4
- Property (UV Vignetting)
- Description (Enabling this will cause contents to fade out at UV boundaries)
-}
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/Statics.ext b/Assets/Engine/Shaders/Statics.ext
deleted file mode 100644
index e7d93fbeaf..0000000000
--- a/Assets/Engine/Shaders/Statics.ext
+++ /dev/null
@@ -1,74 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %ST_GMEM_128BPP
- Mask = 0x1 // 1 << 0
-}
-
-Property
-{
- Name = %ST_GMEM_256BPP
- Mask = 0x2 // 1 << 1
-}
-
-Property
-{
- Name = %ST_GMEM_PLS
- Mask = 0x4 // 1 << 2
-}
-
-Property
-{
- Name = %ST_LLVM_DIRECTX_SHADER_COMPILER
- Mask = 0x8 // 1 << 3
-}
-
-Property
-{
- Name = %ST_FIXED_POINT
- Mask = 0x10 // 1 << 4
-}
-
-Property
-{
- Name = %ST_GMEM_RT_GREATER_FOUR
- Mask = 0x20 // 1 << 5
-}
-
-Property
-{
- Name = %ST_NO_DEPTH_CLIPPING
- Mask = 0x40 // 1 << 6
-}
-
-Property
-{
- Name = %ST_FEATURE_FETCH_DEPTHSTENCIL
- Mask = 0x80 // 1 << 7
-}
-
-property
-{
- Name = %ST_GMEM_VELOCITY_BUFFER
- Mask = 0x100 // 1 << 8
-}
-
-property
-{
- Name = %ST_GLES3_0
- Mask = 0x200 // 1 << 9
-}
diff --git a/Assets/Engine/Shaders/TemplBeamProc.ext b/Assets/Engine/Shaders/TemplBeamProc.ext
deleted file mode 100644
index 485702ace7..0000000000
--- a/Assets/Engine/Shaders/TemplBeamProc.ext
+++ /dev/null
@@ -1,34 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %NOISE
- Mask = 0x1
- Property (Noise map)
- Description (Use animated 3D noise)
-}
-
-Property
-{
- Name = %MUZZLEFLASH
- Mask = 0x2
- Property (Muzzleflash)
- Description (Use as muzzle flash)
-}
diff --git a/Assets/Engine/Shaders/Terrain.ext b/Assets/Engine/Shaders/Terrain.ext
deleted file mode 100644
index 6e8b5dc6f3..0000000000
--- a/Assets/Engine/Shaders/Terrain.ext
+++ /dev/null
@@ -1,79 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: TerrainLayer shader extension used by the editor
-// for automatic shader generation (based on "TerrainLayer" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %SPECULAR_MAP
- Mask = 0x200
- Property (Specular map)
- Description (Use specular map as separate texture)
- DependencySet = $TEX_Specular
- DependencyReset = $TEX_Specular
- Hidden
-}
-
-Property
-{
- Name = %OFFSET_BUMP_MAPPING
- Mask = 0x1000
- Property (Offset bump mapping)
- Description (Use offset bump mapping (requires height map (_displ)))
- DependencyReset = $TEX_Normals
-}
-
-Property
-{
- Name = %DETAIL_MAPPING
- Mask = 0x8000
- Property (Detail mapping)
- Description (Use detail mapping)
- DependencyReset = $TEX_Detail
-}
-
-Property
-{
- Name = %PARALLAX_OCCLUSION_MAPPING
- Mask = 0x8000000
- Property (Parallax occlusion mapping)
- Description (Use parallax occlusion mapping (requires height map (_displ)))
- DependencyReset = $TEX_Normals
-}
-
-Property
-{
- Name = %TEMP_TERRAIN
- Mask = 0x40000000
- DependencySet = $UserEnabled
- Hidden
-}
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/Vegetation.ext b/Assets/Engine/Shaders/Vegetation.ext
deleted file mode 100644
index 5f98ec49e6..0000000000
--- a/Assets/Engine/Shaders/Vegetation.ext
+++ /dev/null
@@ -1,137 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Vegetation extension used by the editor
-// for automatic shader generation (based on "Vegetation" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-UsesCommonGlobalFlags
-
-Property
-{
- Name = %NORMAL_MAP
- Mask = 0x1
- Property (Normal map)
- Description (Use normal-map texture)
- DependencySet = $TEX_Normals
- DependencyReset = $TEX_Normals
- Hidden
-}
-
-Property
-{
- Name = %SPECULAR_MAP
- Mask = 0x10
- Property (Specular map)
- Description (Use specular map as separate texture)
- DependencySet = $TEX_Specular
- DependencyReset = $TEX_Specular
- Hidden
-}
-
-Property
-{
- Name = %LEAVES
- Mask = 0x100
- Property (Leaves)
- Description (Activate for leaves only ! Use leaf shading and leaves animation)
-}
-
-Property
-{
- Name = %GRASS
- Mask = 0x2000
- Property (Grass)
- Description (Activate for grass only ! Use simple grass rendering)
-}
-
-Property
-{
- Name = %SPEEDTREE_BILLBOARD
- Mask = 0x40000
- Property (SpeedTree billboard)
- Description (Activate for SpeedTree billboards only! Enables removal of non-camera-facing geometry from the billboard mesh)
-}
-
-Property
-{
- Name = %DETAIL_BENDING
- Mask = 0x10000
- Property (Detail bending)
- Description (Activate for leaves and grass only. Make sure to paint required vertex colors also)
-}
-
-Property
-{
- Name = %DETAIL_MAPPING
- Mask = 0x20000
- Property (Detail mapping)
- Description (Use detail mapping)
- DependencyReset = $TEX_Detail
-}
-
-Property
-{
- Name = %BLENDLAYER
- Mask = 0x80000
- Property (Blendlayer)
- Description (Normal-mapped diffuse layer blended on top of base material)
-}
-
-Property
-{
- Name = %VERTCOLORS
- Mask = 0x100000
- DependencySet = $UserEnabled
- Hidden
-}
-
-Property
-{
- Name = %TEMP_VEGETATION
- Mask = 0x8000000
- DependencySet = $UserEnabled
- Hidden
-}
-
-#ifdef FEATURE_MESH_TESSELLATION
-Property
-{
- Name = %DISPLACEMENT_MAPPING
- Mask = 0x10000000
- Property (Displacement mapping)
- Description (Use displacement mapping (requires height map (_displ)))
- //DependencySet = $TEX_Height
- DependencyReset = $TEX_Normals
-}
-
-Property
-{
- Name = %PHONG_TESSELLATION
- Mask = 0x20000000
- Property (Phong tessellation)
- Description (Use rough approximation of smooth surface subdivision)
-}
-
-Property
-{
- Name = %PN_TESSELLATION
- Mask = 0x40000000
- Property (PN triangles tessellation)
- Description (Use rough approximation of smooth surface subdivision)
-}
-#endif
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/VolumeObject.ext b/Assets/Engine/Shaders/VolumeObject.ext
deleted file mode 100644
index 8cab9b4270..0000000000
--- a/Assets/Engine/Shaders/VolumeObject.ext
+++ /dev/null
@@ -1,57 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description:
-//
-////////////////////////////////////////////////////////////////////////////
-
-
-
-Version (1.00)
-
-Property
-{
- Name = %SOFT_OBJECT_INTERSECTION
- Mask = 0x1
- Property (Soft Intersections)
- Description (Enables soft intersections with opaque scene geometry)
-}
-Property
-{
- Name = %BACK_LIGHTING
- Mask = 0x2
- Property (Back Lighting)
- Description (Adds back lighting to volume silhouette when viewing against sun)
-}
-Property
-{
- Name = %JITTERING
- Mask = 0x4
- Property (Jittering)
- Description (Enables jittering on cloud steps)
-}
-Property
-{
- Name = %SOFT_JITTERING
- Mask = 0x8
- Property (Soft Jittering)
- Description (Softens the effect of jittering on volume objects)
-}
-Property
-{
- Name = %CUSTOM_SETTINGS
- Mask = 0x10
- Property (Use TOD Settings)
- Description (Use the custom cloud settings from the TOD for lighting)
-}
\ No newline at end of file
diff --git a/Assets/Engine/Shaders/Water.ext b/Assets/Engine/Shaders/Water.ext
deleted file mode 100644
index d44e3598e5..0000000000
--- a/Assets/Engine/Shaders/Water.ext
+++ /dev/null
@@ -1,62 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Water extension used by the editor
-// for automatic shader generation (based on "Water" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %ENVIRONMENT_MAP
- Mask = 0x4
- Property (Environment map)
- Description (Use environment map instead of reflection)
- DependencyReset = $TEX_EnvCM
-}
-
-Property
-{
- Name = %SUN_SHINE
- Mask = 0x20
- Property (Sunshine)
- Description (Activate for water sunshine)
-}
-
-Property
-{
- Name = %NO_REFRACTION_BUMP
- Mask = 0x200
- Property (No refraction bump)
- Description (Disables refraction bump)
-}
-
-Property
-{
- Name = %FOAM
- Mask = 0x400
- Property (Foam)
- Description (Enables foam)
-}
-
-Property
-{
- Name = %WATER_TESSELLATION_DX11
- Mask = 0x800
- DependencySet = $HW_WaterTessellation
- DependencyReset = $HW_WaterTessellation
- Hidden
-}
diff --git a/Assets/Engine/Shaders/WaterVolume.ext b/Assets/Engine/Shaders/WaterVolume.ext
deleted file mode 100644
index dec9d1a531..0000000000
--- a/Assets/Engine/Shaders/WaterVolume.ext
+++ /dev/null
@@ -1,107 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Water extension used by the editor
-// for automatic shader generation (based on "Water" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %SSREFL
- Mask = 0x1
- Property (Realtime Reflection)
- Description (Approximate realtime reflections)
-}
-
-Property
-{
- Name = %FLOW
- Mask = 0x2
- Property (Water flow)
- Description (Enable water to flow along geometry uvs)
-}
-
-Property
-{
- Name = %FLOW_MAP
- Mask = 0x4
- Property (Water flow map)
- Description (Enable water flow along a flow map)
-}
-
-Property
-{
- Name = %FLOW_MAP_STRENGTH
- Mask = 0x100
- Property (Water flow map strength)
- Description (Enable additional water flow strength controls - requires blue channel for strength)
-}
-
-Property
-{
- Name = %SUN_SPECULAR
- Mask = 0x8
- Property (Sun specular)
- Description (Activate for water sunshine)
-}
-
-Property
-{
- Name = %SPECULAR_MAP
- Mask = 0x10
- Property (Specular map)
- Description (Use specular map as separate texture)
- DependencySet = $TEX_Specular
- DependencyReset = $TEX_Specular
- Hidden
-}
-
-Property
-{
- Name = %DEBUG_FLOW_MAP
- Mask = 0x20
- Property (Debug flow map)
- Description (Enable visualizing flow map)
-}
-
-Property
-{
- Name = %FOAM
- Mask = 0x40
- Property (Foam)
- Description (Enables foam)
-}
-
-Property
-{
- Name = %DECAL_MAP
- Mask = 0x80
- Property (Decal map)
- Description (Use tiling decal map as separate texture)
- DependencySet = $TEX_Custom
- DependencyReset = $TEX_Custom
- Hidden
-}
-
-Property
-{
- Name = %WATER_TESSELLATION_DX11
- Mask = 0x80000000
- DependencySet = $HW_WaterTessellation
- DependencyReset = $HW_WaterTessellation
- Hidden
-}
diff --git a/Assets/Engine/Shaders/Waterfall.ext b/Assets/Engine/Shaders/Waterfall.ext
deleted file mode 100644
index 8d0ff2cc73..0000000000
--- a/Assets/Engine/Shaders/Waterfall.ext
+++ /dev/null
@@ -1,45 +0,0 @@
-////////////////////////////////////////////////////////////////////////////
-//
-// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-// its licensors.
-//
-// For complete copyright and license terms please see the LICENSE at the root of this
-// distribution (the "License"). All use of this software is governed by the License,
-// or, if provided, by the license below or the license accompanying this file. Do not
-// remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-//
-
-// Description: Water extension used by the editor
-// for automatic shader generation (based on "Water" shader template)
-//
-////////////////////////////////////////////////////////////////////////////
-
-Version (1.00)
-
-Property
-{
- Name = %ENVIRONMENT_MAP
- Mask = 0x1
- Property (Environment map)
- Description (Use environment map as separate texture)
- DependencyReset = $TEX_EnvCM
-}
-
-Property
-{
- Name = %SUN_SHADING
- Mask = 0x2
- Property (Sun shading)
- Description (Activate for water sunshading - for outdoors)
-}
-
-Property
-{
- Name = %FOAM
- Mask = 0x4
- Property (Foam)
- Description (Enables foam rendering)
-}
diff --git a/AutomatedTesting/AssetProcessorGamePlatformConfig.setreg b/AutomatedTesting/AssetProcessorGamePlatformConfig.setreg
deleted file mode 100644
index c9876cb1f9..0000000000
--- a/AutomatedTesting/AssetProcessorGamePlatformConfig.setreg
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "Amazon": {
- "AssetProcessor": {
- "Settings": {
- "RC cgf": {
- "ignore": true
- },
- "RC fbx": {
- "ignore": true
- }
- }
- }
- }
-}
diff --git a/AutomatedTesting/Assets/BadAssets/three_same_named_nodes.fbx b/AutomatedTesting/Assets/BadAssets/three_same_named_nodes.fbx
new file mode 100644
index 0000000000..8eadb16d86
--- /dev/null
+++ b/AutomatedTesting/Assets/BadAssets/three_same_named_nodes.fbx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:45b58009dc2f9340e08cafd5e68f142d15d77e19e7cef142933f2dff3cfb9293
+size 38352
diff --git a/AutomatedTesting/Assets/Objects/Foliage/Textures/grass_atlas_diff.tif.exportsettings b/AutomatedTesting/Assets/Objects/Foliage/Textures/grass_atlas_diff.tif.exportsettings
index 5c4c862583..b65133fbb0 100644
--- a/AutomatedTesting/Assets/Objects/Foliage/Textures/grass_atlas_diff.tif.exportsettings
+++ b/AutomatedTesting/Assets/Objects/Foliage/Textures/grass_atlas_diff.tif.exportsettings
@@ -1 +1 @@
-/autooptimizefile=0 /preset=AlbedoWithGenericAlpha /reduce="es3:2,ios:2,osx_gl:0,pc:0,provo:0"
\ No newline at end of file
+/autooptimizefile=0 /preset=AlbedoWithGenericAlpha /reduce="android:2,ios:2,mac:0,pc:0,provo:0"
\ No newline at end of file
diff --git a/AutomatedTesting/Assets/Objects/Foliage/Textures/grass_atlas_sss.tif.exportsettings b/AutomatedTesting/Assets/Objects/Foliage/Textures/grass_atlas_sss.tif.exportsettings
index 441a11bc68..e8da408b36 100644
--- a/AutomatedTesting/Assets/Objects/Foliage/Textures/grass_atlas_sss.tif.exportsettings
+++ b/AutomatedTesting/Assets/Objects/Foliage/Textures/grass_atlas_sss.tif.exportsettings
@@ -1 +1 @@
-/autooptimizefile=0 /preset=Albedo /reduce="es3:3,ios:3,osx_gl:0,pc:0,provo:0"
\ No newline at end of file
+/autooptimizefile=0 /preset=Albedo /reduce="android:3,ios:3,mac:0,pc:0,provo:0"
\ No newline at end of file
diff --git a/AutomatedTesting/Config/aws_resource_mappings.json b/AutomatedTesting/Config/aws_resource_mappings.json
new file mode 100644
index 0000000000..03a611b749
--- /dev/null
+++ b/AutomatedTesting/Config/aws_resource_mappings.json
@@ -0,0 +1,6 @@
+{
+ "AWSResourceMappings": {},
+ "AccountId": "",
+ "Region": "us-west-2",
+ "Version": "1.0.0"
+}
\ No newline at end of file
diff --git a/AutomatedTesting/EngineFinder.cmake b/AutomatedTesting/EngineFinder.cmake
index 1fdcef2b56..fbbe3d8cfe 100644
--- a/AutomatedTesting/EngineFinder.cmake
+++ b/AutomatedTesting/EngineFinder.cmake
@@ -20,31 +20,49 @@ if(json_error)
message(FATAL_ERROR "Unable to read key 'engine' from 'project.json', error: ${json_error}")
endif()
-# Read the list of paths from ~.o3de/o3de_manifest.json
-file(TO_CMAKE_PATH "$ENV{USERPROFILE}" home_directory) # Windows
-if((NOT home_directory) OR (NOT EXISTS ${home_directory}))
- file(TO_CMAKE_PATH "$ENV{HOME}" home_directory)# Unix
+if(DEFINED ENV{USERPROFILE} AND EXISTS $ENV{USERPROFILE})
+ set(manifest_path $ENV{USERPROFILE}/.o3de/o3de_manifest.json) # Windows
+else()
+ set(manifest_path $ENV{HOME}/.o3de/o3de_manifest.json) # Unix
endif()
-if (NOT home_directory)
- message(FATAL_ERROR "Cannot find user home directory, the o3de manifest cannot be found")
-endif()
-# Set manifest path to path in the user home directory
-set(manifest_path ${home_directory}/.o3de/o3de_manifest.json)
-
+# Read the ~/.o3de/o3de_manifest.json file and look through the 'engines_path' object.
+# Find a key that matches LY_ENGINE_NAME_TO_USE and use that as the engine path.
if(EXISTS ${manifest_path})
file(READ ${manifest_path} manifest_json)
- string(JSON engines_count ERROR_VARIABLE json_error LENGTH ${manifest_json} engines)
+
+ string(JSON engines_path_count ERROR_VARIABLE json_error LENGTH ${manifest_json} engines_path)
if(json_error)
- message(FATAL_ERROR "Unable to read key 'engines' from '${manifest_path}', error: ${json_error}")
+ message(FATAL_ERROR "Unable to read key 'engines_path' from '${manifest_path}', error: ${json_error}")
endif()
- math(EXPR engines_count "${engines_count}-1")
- foreach(engine_path_index RANGE ${engines_count})
- string(JSON engine_path ERROR_VARIABLE json_error GET ${manifest_json} engines ${engine_path_index})
- if(${json_error})
- message(FATAL_ERROR "Unable to read engines[${engine_path_index}] '${manifest_path}', error: ${json_error}")
+ string(JSON engines_path_type ERROR_VARIABLE json_error TYPE ${manifest_json} engines_path)
+ if(json_error OR NOT ${engines_path_type} STREQUAL "OBJECT")
+ message(FATAL_ERROR "Type of 'engines_path' in '${manifest_path}' is not a JSON Object, error: ${json_error}")
+ endif()
+
+ math(EXPR engines_path_count "${engines_path_count}-1")
+ foreach(engine_path_index RANGE ${engines_path_count})
+ string(JSON engine_name ERROR_VARIABLE json_error MEMBER ${manifest_json} engines_path ${engine_path_index})
+ if(json_error)
+ message(FATAL_ERROR "Unable to read 'engines_path/${engine_path_index}' from '${manifest_path}', error: ${json_error}")
+ endif()
+
+ if(LY_ENGINE_NAME_TO_USE STREQUAL engine_name)
+ string(JSON engine_path ERROR_VARIABLE json_error GET ${manifest_json} engines_path ${engine_name})
+ if(json_error)
+ message(FATAL_ERROR "Unable to read value from 'engines_path/${engine_name}', error: ${json_error}")
+ endif()
+
+ if(engine_path)
+ list(APPEND CMAKE_MODULE_PATH "${engine_path}/cmake")
+ break()
+ endif()
endif()
- list(APPEND CMAKE_MODULE_PATH "${engine_path}/cmake")
endforeach()
+else()
+ # If the user is passing CMAKE_MODULE_PATH we assume thats where we will find the engine
+ if(NOT CMAKE_MODULE_PATH)
+ message(FATAL_ERROR "Engine registration is required before configuring a project. Please register an engine by running 'scripts/o3de register --this-engine'")
+ endif()
endif()
diff --git a/AutomatedTesting/Gem/Code/CMakeLists.txt b/AutomatedTesting/Gem/Code/CMakeLists.txt
index 2bcc304bde..548aa51ad1 100644
--- a/AutomatedTesting/Gem/Code/CMakeLists.txt
+++ b/AutomatedTesting/Gem/Code/CMakeLists.txt
@@ -28,30 +28,41 @@ ly_add_target(
Gem::Atom_AtomBridge.Static
)
+# if enabled, AutomatedTesting is used by all kinds of applications
+ly_create_alias(NAME AutomatedTesting.Builders NAMESPACE Gem TARGETS Gem::AutomatedTesting)
+ly_create_alias(NAME AutomatedTesting.Tools NAMESPACE Gem TARGETS Gem::AutomatedTesting)
+ly_create_alias(NAME AutomatedTesting.Clients NAMESPACE Gem TARGETS Gem::AutomatedTesting)
+ly_create_alias(NAME AutomatedTesting.Servers NAMESPACE Gem TARGETS Gem::AutomatedTesting)
+
################################################################################
# Gem dependencies
################################################################################
-ly_add_project_dependencies(
- PROJECT_NAME
- AutomatedTesting
- TARGETS
- AutomatedTesting.GameLauncher
- DEPENDENCIES_FILES
- runtime_dependencies.cmake
- ${pal_dir}/runtime_dependencies.cmake
-)
-if(PAL_TRAIT_BUILD_HOST_TOOLS)
- ly_add_project_dependencies(
- PROJECT_NAME
- AutomatedTesting
- TARGETS
- AssetBuilder
- AssetProcessor
- AssetProcessorBatch
- Editor
- DEPENDENCIES_FILES
- tool_dependencies.cmake
- ${pal_dir}/tool_dependencies.cmake
- )
+# The GameLauncher uses "Clients" gem variants:
+ly_enable_gems(PROJECT_NAME AutomatedTesting GEM_FILE enabled_gems.cmake
+ TARGETS AutomatedTesting.GameLauncher
+ VARIANTS Clients)
+
+# If we build a server, then apply the gems to the server
+if(PAL_TRAIT_BUILD_SERVER_SUPPORTED)
+ # if we're making a server, then add the "Server" gem variants to it:
+ ly_enable_gems(PROJECT_NAME AutomatedTesting GEM_FILE enabled_gems.cmake
+ TARGETS AutomatedTesting.ServerLauncher
+ VARIANTS Servers)
+
+ set_property(GLOBAL APPEND PROPERTY LY_LAUNCHER_SERVER_PROJECTS AutomatedTesting)
+endif()
+
+if (PAL_TRAIT_BUILD_HOST_TOOLS)
+ # The Editor uses "Tools" gem variants:
+ ly_enable_gems(
+ PROJECT_NAME AutomatedTesting GEM_FILE enabled_gems.cmake
+ TARGETS Editor
+ VARIANTS Tools)
+
+ # The pipeline tools use "Builders" gem variants:
+ ly_enable_gems(
+ PROJECT_NAME AutomatedTesting GEM_FILE enabled_gems.cmake
+ TARGETS AssetBuilder AssetProcessor AssetProcessorBatch
+ VARIANTS Builders)
endif()
diff --git a/AutomatedTesting/Gem/Code/Platform/Mac/runtime_dependencies.cmake b/AutomatedTesting/Gem/Code/Platform/Mac/runtime_dependencies.cmake
index f9d1e60dda..ffcaf7293a 100644
--- a/AutomatedTesting/Gem/Code/Platform/Mac/runtime_dependencies.cmake
+++ b/AutomatedTesting/Gem/Code/Platform/Mac/runtime_dependencies.cmake
@@ -10,6 +10,4 @@
#
set(GEM_DEPENDENCIES
- Gem::Atom_RHI_Metal.Private
- Gem::Atom_RHI_Null.Private
)
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/Code/Platform/Mac/tool_dependencies.cmake b/AutomatedTesting/Gem/Code/Platform/Mac/tool_dependencies.cmake
index 2e9d450ab8..ffcaf7293a 100644
--- a/AutomatedTesting/Gem/Code/Platform/Mac/tool_dependencies.cmake
+++ b/AutomatedTesting/Gem/Code/Platform/Mac/tool_dependencies.cmake
@@ -10,10 +10,4 @@
#
set(GEM_DEPENDENCIES
- Gem::Atom_RHI_Null.Private
- Gem::Atom_RHI_Null.Builders
- Gem::Atom_RHI_Metal.Private
- Gem::Atom_RHI_Metal.Builders
- Gem::Atom_RHI_Vulkan.Builders
- Gem::Atom_RHI_DX12.Builders
)
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/Code/Platform/Windows/runtime_dependencies.cmake b/AutomatedTesting/Gem/Code/Platform/Windows/runtime_dependencies.cmake
deleted file mode 100644
index 0a1541bcfc..0000000000
--- a/AutomatedTesting/Gem/Code/Platform/Windows/runtime_dependencies.cmake
+++ /dev/null
@@ -1,16 +0,0 @@
-#
-# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-# its licensors.
-#
-# For complete copyright and license terms please see the LICENSE at the root of this
-# distribution (the "License"). All use of this software is governed by the License,
-# or, if provided, by the license below or the license accompanying this file. Do not
-# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#
-
-set(GEM_DEPENDENCIES
- Gem::Atom_RHI_Vulkan.Private
- Gem::Atom_RHI_DX12.Private
- Gem::Atom_RHI_Null.Private
-)
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/Code/Platform/Windows/tool_dependencies.cmake b/AutomatedTesting/Gem/Code/Platform/Windows/tool_dependencies.cmake
deleted file mode 100644
index ddd3bfa6a7..0000000000
--- a/AutomatedTesting/Gem/Code/Platform/Windows/tool_dependencies.cmake
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-# its licensors.
-#
-# For complete copyright and license terms please see the LICENSE at the root of this
-# distribution (the "License"). All use of this software is governed by the License,
-# or, if provided, by the license below or the license accompanying this file. Do not
-# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#
-
-set(GEM_DEPENDENCIES
- Gem::QtForPython.Editor
- Gem::Atom_RHI_Vulkan.Private
- Gem::Atom_RHI_Vulkan.Builders
- Gem::Atom_RHI_DX12.Private
- Gem::Atom_RHI_DX12.Builders
- Gem::Atom_RHI_Null.Private
- Gem::Atom_RHI_Null.Builders
- Gem::Atom_RHI_Metal.Builders
-)
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/Code/enabled_gems.cmake b/AutomatedTesting/Gem/Code/enabled_gems.cmake
new file mode 100644
index 0000000000..d99d17b55e
--- /dev/null
+++ b/AutomatedTesting/Gem/Code/enabled_gems.cmake
@@ -0,0 +1,58 @@
+#
+# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+# its licensors.
+#
+# For complete copyright and license terms please see the LICENSE at the root of this
+# distribution (the "License"). All use of this software is governed by the License,
+# or, if provided, by the license below or the license accompanying this file. Do not
+# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+
+set(ENABLED_GEMS
+ ImGui
+ ScriptEvents
+ ExpressionEvaluation
+ Gestures
+ CertificateManager
+ DebugDraw
+ SceneProcessing
+ GraphCanvas
+ InAppPurchases
+ AutomatedTesting
+ EditorPythonBindings
+ QtForPython
+ PythonAssetBuilder
+ Metastream
+ AudioSystem
+ Camera
+ EMotionFX
+ PhysX
+ CameraFramework
+ StartingPointMovement
+ StartingPointCamera
+ ScriptCanvas
+ ScriptCanvasPhysics
+ ScriptCanvasTesting
+ LyShineExamples
+ StartingPointInput
+ PhysXDebug
+ WhiteBox
+ FastNoise
+ SurfaceData
+ GradientSignal
+ Vegetation
+ GraphModel
+ LandscapeCanvas
+ NvCloth
+ Blast
+ Maestro
+ TextureAtlas
+ LmbrCentral
+ LyShine
+ HttpRequestor
+ Atom_AtomBridge
+ AWSCore
+ AWSClientAuth
+ AWSMetrics
+)
diff --git a/AutomatedTesting/Gem/Code/runtime_dependencies.cmake b/AutomatedTesting/Gem/Code/runtime_dependencies.cmake
deleted file mode 100644
index c8e66740e4..0000000000
--- a/AutomatedTesting/Gem/Code/runtime_dependencies.cmake
+++ /dev/null
@@ -1,57 +0,0 @@
-#
-# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-# its licensors.
-#
-# For complete copyright and license terms please see the LICENSE at the root of this
-# distribution (the License). All use of this software is governed by the License,
-# or, if provided, by the license below or the license accompanying this file. Do not
-# remove or modify any license notices. This file is distributed on an AS IS BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#
-
-# Extracted from Game
-set(GEM_DEPENDENCIES
- Gem::Maestro
- Gem::TextureAtlas
- Gem::LmbrCentral
- Gem::LyShine
- Gem::HttpRequestor
- Gem::ScriptEvents
- Gem::ExpressionEvaluation
- Gem::Gestures
- Gem::CertificateManager
- Gem::DebugDraw
- Gem::AudioSystem
- Gem::InAppPurchases
- Gem::AutomatedTesting
- Gem::Metastream
- Gem::Camera
- Gem::EMotionFX
- Gem::PhysX
- Gem::CameraFramework
- Gem::StartingPointMovement
- Gem::StartingPointCamera
- Gem::ScriptCanvas
- Gem::ImGui
- Gem::LyShineExamples
- Gem::StartingPointInput
- Gem::ScriptCanvasPhysics
- Gem::PhysXDebug
- Gem::WhiteBox
- Gem::FastNoise
- Gem::SurfaceData
- Gem::GradientSignal
- Gem::Vegetation
- Gem::Atom_RHI.Private
- Gem::Atom_RPI.Private
- Gem::Atom_Feature_Common
- Gem::Atom_Bootstrap
- Gem::Atom_Component_DebugCamera
- Gem::AtomImGuiTools
- Gem::AtomLyIntegration_CommonFeatures
- Gem::EMotionFX_Atom
- Gem::ImguiAtom
- Gem::Atom_AtomBridge
- Gem::AtomFont
- Gem::Blast
-)
diff --git a/AutomatedTesting/Gem/Code/tool_dependencies.cmake b/AutomatedTesting/Gem/Code/tool_dependencies.cmake
deleted file mode 100644
index 8c5da63f42..0000000000
--- a/AutomatedTesting/Gem/Code/tool_dependencies.cmake
+++ /dev/null
@@ -1,72 +0,0 @@
-#
-# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-# its licensors.
-#
-# For complete copyright and license terms please see the LICENSE at the root of this
-# distribution (the License). All use of this software is governed by the License,
-# or, if provided, by the license below or the license accompanying this file. Do not
-# remove or modify any license notices. This file is distributed on an AS IS BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#
-
-# Extracted from Editor.xml
-set(GEM_DEPENDENCIES
- Gem::Maestro.Editor
- Gem::TextureAtlas
- Gem::LmbrCentral.Editor
- Gem::LyShine.Editor
- Gem::HttpRequestor
- Gem::ScriptEvents.Editor
- Gem::ExpressionEvaluation
- Gem::Gestures
- Gem::CertificateManager
- Gem::DebugDraw.Editor
- Gem::SceneProcessing.Editor
- Gem::GraphCanvas.Editor
- Gem::InAppPurchases
- Gem::AutomatedTesting
- Gem::EditorPythonBindings.Editor
- Gem::PythonAssetBuilder.Editor
- Gem::Metastream
- Gem::AudioSystem.Editor
- Gem::Camera.Editor
- Gem::EMotionFX.Editor
- Gem::PhysX.Editor
- Gem::CameraFramework
- Gem::StartingPointMovement
- Gem::StartingPointCamera
- Gem::ScriptCanvas.Editor
- Gem::ScriptEvents.Editor
- Gem::ImGui.Editor
- Gem::LyShineExamples
- Gem::StartingPointInput.Editor
- Gem::ScriptCanvasPhysics
- Gem::ScriptCanvasTesting.Editor
- Gem::PhysXDebug.Editor
- Gem::WhiteBox.Editor
- Gem::FastNoise.Editor
- Gem::SurfaceData.Editor
- Gem::GradientSignal.Editor
- Gem::Vegetation.Editor
- Gem::GraphModel.Editor
- Gem::LandscapeCanvas.Editor
- Gem::Atom_RHI.Private
- Gem::EMotionFX.Editor
- Gem::Atom_RPI.Builders
- Gem::Atom_RPI.Editor
- Gem::Atom_Feature_Common.Builders
- Gem::Atom_Feature_Common.Editor
- Gem::ImGui.Editor
- Gem::Atom_Bootstrap
- Gem::Atom_Asset_Shader.Builders
- Gem::Atom_Component_DebugCamera
- Gem::AtomImGuiTools
- Gem::AtomLyIntegration_CommonFeatures.Editor
- Gem::EMotionFX_Atom.Editor
- Gem::ImageProcessingAtom.Editor
- Gem::Atom_AtomBridge.Editor
- Gem::ImguiAtom
- Gem::AtomFont
- Gem::AtomToolsFramework.Editor
- Gem::Blast.Editor
-)
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/AWS/CMakeLists.txt
new file mode 100644
index 0000000000..f463210cb0
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+# its licensors.
+#
+# For complete copyright and license terms please see the LICENSE at the root of this
+# distribution (the "License"). All use of this software is governed by the License,
+# or, if provided, by the license below or the license accompanying this file. Do not
+# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+
+################################################################################
+# AWS Automated Tests
+# Runs AWS Gems automation tests.
+################################################################################
+
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
+ # Enable after installing NodeJS and CDK on jenkins Windows AMI.
+ ly_add_pytest(
+ NAME AutomatedTesting::AWSTests
+ TEST_SUITE periodic
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}/${PAL_PLATFORM_NAME}/
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ COMPONENT
+ AWS
+ )
+endif()
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/__init__.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/__init__.py
new file mode 100644
index 0000000000..8caef52682
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/__init__.py
@@ -0,0 +1,11 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/__init__.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/__init__.py
new file mode 100644
index 0000000000..cdee4b5a56
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/__init__.py
@@ -0,0 +1,10 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py
new file mode 100644
index 0000000000..04be31759d
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py
@@ -0,0 +1,237 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+import logging
+import os
+import pytest
+import time
+import typing
+
+from datetime import datetime
+import ly_test_tools.log.log_monitor
+
+from assetpipeline.ap_fixtures.asset_processor_fixture import asset_processor as asset_processor
+from AWS.common.aws_utils import aws_utils
+from AWS.common.aws_credentials import aws_credentials
+from AWS.Windows.resource_mappings.resource_mappings import resource_mappings
+from AWS.Windows.cdk.cdk import cdk
+from .aws_metrics_utils import aws_metrics_utils
+
+AWS_METRICS_FEATURE_NAME = 'AWSMetrics'
+GAME_LOG_NAME = 'Game.log'
+
+logger = logging.getLogger(__name__)
+
+
+def setup(launcher: ly_test_tools.launchers.Launcher,
+ cdk: cdk,
+ asset_processor: asset_processor,
+ resource_mappings: resource_mappings,
+ context_variable: str = '') -> typing.Tuple[ly_test_tools.log.log_monitor.LogMonitor, str, str]:
+ """
+ Set up the CDK application and start the log monitor.
+ :param launcher: Client launcher for running the test level.
+ :param cdk: CDK application for deploying the AWS resources.
+ :param asset_processor: asset_processor fixture.
+ :param resource_mappings: resource_mappings fixture.
+ :param context_variable: context_variable for enable optional CDK feature.
+ :return log monitor object, metrics file path and the metrics stack name.
+ """
+ logger.info(f'Cdk stack names:\n{cdk.list()}')
+ stacks = cdk.deploy(context_variable=context_variable)
+ resource_mappings.populate_output_keys(stacks)
+
+ asset_processor.start()
+ asset_processor.wait_for_idle()
+
+ metrics_file_path = os.path.join(launcher.workspace.paths.project(), 'user',
+ AWS_METRICS_FEATURE_NAME, 'metrics.json')
+ remove_file(metrics_file_path)
+
+ file_to_monitor = os.path.join(launcher.workspace.paths.project_log(), GAME_LOG_NAME)
+ remove_file(file_to_monitor)
+
+ # Initialize the log monitor.
+ log_monitor = ly_test_tools.log.log_monitor.LogMonitor(launcher=launcher, log_file_path=file_to_monitor)
+
+ return log_monitor, metrics_file_path, stacks[0]
+
+
+def monitor_metrics_submission(log_monitor: ly_test_tools.log.log_monitor.LogMonitor) -> None:
+ """
+ Monitor the messages and notifications for submitting metrics.
+ :param log_monitor: Log monitor to check the log messages.
+ """
+ expected_lines = [
+ '(Script) - Submitted metrics without buffer.',
+ '(Script) - Submitted metrics with buffer.',
+ '(Script) - Metrics is sent successfully.'
+ ]
+
+ unexpected_lines = [
+ '(Script) - Failed to submit metrics without buffer.',
+ '(Script) - Failed to submit metrics with buffer.',
+ '(Script) - Failed to send metrics.'
+ ]
+
+ result = log_monitor.monitor_log_for_lines(
+ expected_lines=expected_lines,
+ unexpected_lines=unexpected_lines,
+ halt_on_unexpected=True)
+
+ # Assert the log monitor detected expected lines and did not detect any unexpected lines.
+ assert result, (
+ f'Log monitoring failed. Used expected_lines values: {expected_lines} & '
+ f'unexpected_lines values: {unexpected_lines}')
+
+
+def remove_file(file_path: str) -> None:
+ """
+ Remove a local file and its directory.
+ :param file_path: Path to the local file.
+ """
+ if os.path.exists(file_path):
+ os.remove(file_path)
+
+ file_dir = os.path.dirname(file_path)
+ if os.path.exists(file_dir) and len(os.listdir(file_dir)) == 0:
+ os.rmdir(file_dir)
+
+
+@pytest.mark.SUITE_periodic
+@pytest.mark.usefixtures('automatic_process_killer')
+@pytest.mark.parametrize('project', ['AutomatedTesting'])
+@pytest.mark.parametrize('level', ['AWS/Metrics'])
+@pytest.mark.parametrize('feature_name', [AWS_METRICS_FEATURE_NAME])
+@pytest.mark.parametrize('resource_mappings_filename', ['aws_resource_mappings.json'])
+@pytest.mark.parametrize('profile_name', ['AWSAutomationTest'])
+@pytest.mark.parametrize('region_name', ['us-west-2'])
+@pytest.mark.parametrize('assume_role_arn', ['arn:aws:iam::645075835648:role/o3de-automation-tests'])
+@pytest.mark.parametrize('session_name', ['o3de-Automation-session'])
+class TestAWSMetrics_Windows(object):
+ def test_AWSMetrics_RealTimeAnalytics_MetricsSentToCloudWatch(self,
+ level: str,
+ launcher: ly_test_tools.launchers.Launcher,
+ asset_processor: pytest.fixture,
+ workspace: pytest.fixture,
+ aws_utils: aws_utils,
+ aws_credentials: aws_credentials,
+ resource_mappings: resource_mappings,
+ cdk: cdk,
+ aws_metrics_utils: aws_metrics_utils,
+ ):
+ """
+ Tests that the submitted metrics are sent to CloudWatch for real-time analytics.
+ """
+ log_monitor, metrics_file_path, stack_name = setup(launcher, cdk, asset_processor, resource_mappings)
+
+ # Start the Kinesis Data Analytics application for real-time analytics.
+ analytics_application_name = f'{stack_name}-AnalyticsApplication'
+ aws_metrics_utils.start_kinesis_data_analytics_application(analytics_application_name)
+
+ launcher.args = ['+LoadLevel', level]
+ launcher.args.extend(['-rhi=null'])
+
+ with launcher.start(launch_ap=False):
+ start_time = datetime.utcnow()
+ monitor_metrics_submission(log_monitor)
+ # Verify that operational health metrics are delivered to CloudWatch.
+ aws_metrics_utils.verify_cloud_watch_delivery(
+ 'AWS/Lambda',
+ 'Invocations',
+ [{'Name': 'FunctionName',
+ 'Value': f'{stack_name}-AnalyticsProcessingLambda'}],
+ start_time)
+ logger.info('Operational health metrics sent to CloudWatch.')
+
+ aws_metrics_utils.verify_cloud_watch_delivery(
+ AWS_METRICS_FEATURE_NAME,
+ 'TotalLogins',
+ [],
+ start_time)
+ logger.info('Real-time metrics sent to CloudWatch.')
+
+ # Stop the Kinesis Data Analytics application.
+ aws_metrics_utils.stop_kinesis_data_analytics_application(analytics_application_name)
+
+ def test_AWSMetrics_UnauthorizedUser_RequestRejected(self,
+ level: str,
+ launcher: ly_test_tools.launchers.Launcher,
+ cdk: cdk,
+ aws_credentials: aws_credentials,
+ asset_processor: pytest.fixture,
+ resource_mappings: resource_mappings,
+ workspace: pytest.fixture):
+ """
+ Tests that unauthorized users cannot send metrics events to the AWS backed backend.
+ """
+ log_monitor, metrics_file_path, stack_name = setup(launcher, cdk, asset_processor, resource_mappings)
+ # Set invalid AWS credentials.
+ launcher.args = ['+LoadLevel', level, '+cl_awsAccessKey', 'AKIAIOSFODNN7EXAMPLE',
+ '+cl_awsSecretKey', 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY']
+ launcher.args.extend(['-rhi=null'])
+
+ with launcher.start(launch_ap=False):
+ result = log_monitor.monitor_log_for_lines(
+ expected_lines=['(Script) - Failed to send metrics.'],
+ unexpected_lines=['(Script) - Metrics is sent successfully.'],
+ halt_on_unexpected=True)
+ assert result, 'Metrics events are sent successfully by unauthorized user'
+ logger.info('Unauthorized user is rejected to send metrics.')
+
+ def test_AWSMetrics_BatchAnalytics_MetricsDeliveredToS3(self,
+ level: str,
+ launcher: ly_test_tools.launchers.Launcher,
+ cdk: cdk,
+ aws_credentials: aws_credentials,
+ asset_processor: pytest.fixture,
+ resource_mappings: resource_mappings,
+ aws_utils: aws_utils,
+ aws_metrics_utils: aws_metrics_utils,
+ workspace: pytest.fixture):
+ """
+ Tests that the submitted metrics are sent to the data lake for batch analytics.
+ """
+ log_monitor, metrics_file_path, stack_name = setup(launcher, cdk, asset_processor, resource_mappings,
+ context_variable='batch_processing=true')
+
+ analytics_bucket_name = aws_metrics_utils.get_analytics_bucket_name(stack_name)
+
+ launcher.args = ['+LoadLevel', level]
+ launcher.args.extend(['-rhi=null'])
+
+ with launcher.start(launch_ap=False):
+ start_time = datetime.utcnow()
+ monitor_metrics_submission(log_monitor)
+ # Verify that operational health metrics are delivered to CloudWatch.
+ aws_metrics_utils.verify_cloud_watch_delivery(
+ 'AWS/Lambda',
+ 'Invocations',
+ [{'Name': 'FunctionName',
+ 'Value': f'{stack_name}-EventsProcessingLambda'}],
+ start_time)
+ logger.info('Operational health metrics sent to CloudWatch.')
+
+ aws_metrics_utils.verify_s3_delivery(analytics_bucket_name)
+ logger.info('Metrics sent to S3.')
+
+ # Run the glue crawler to populate the AWS Glue Data Catalog with tables.
+ aws_metrics_utils.run_glue_crawler(f'{stack_name}-EventsCrawler')
+ # Run named queries on the table to verify the batch analytics.
+ aws_metrics_utils.run_named_queries(f'{stack_name}-AthenaWorkGroup')
+ logger.info('Query metrics from S3 successfully.')
+
+ # Kinesis Data Firehose buffers incoming data before it delivers it to Amazon S3. Sleep for the
+ # default interval (60s) to make sure that all the metrics are sent to the bucket before cleanup.
+ time.sleep(60)
+ # Empty the S3 bucket. S3 buckets can only be deleted successfully when it doesn't contain any object.
+ aws_metrics_utils.empty_s3_bucket(analytics_bucket_name)
+
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_utils.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_utils.py
new file mode 100644
index 0000000000..686feda3d9
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_utils.py
@@ -0,0 +1,252 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+import logging
+import pathlib
+import pytest
+import typing
+
+from datetime import datetime
+from botocore.exceptions import WaiterError
+
+from AWS.common.aws_utils import AwsUtils
+from .aws_metrics_waiters import KinesisAnalyticsApplicationUpdatedWaiter, \
+ CloudWatchMetricsDeliveredWaiter, DataLakeMetricsDeliveredWaiter, GlueCrawlerReadyWaiter
+
+logging.getLogger('boto').setLevel(logging.CRITICAL)
+
+# Expected directory and file extension for the S3 objects.
+EXPECTED_S3_DIRECTORY = 'firehose_events/'
+EXPECTED_S3_OBJECT_EXTENSION = '.parquet'
+
+
+class AWSMetricsUtils:
+ """
+ Provide utils functions for the AWSMetrics gem to interact with the deployed resources.
+ """
+
+ def __init__(self, aws_utils: AwsUtils):
+ self._aws_util = aws_utils
+
+ def start_kinesis_data_analytics_application(self, application_name: str) -> None:
+ """
+ Start the Kenisis Data Analytics application for real-time analytics.
+ :param application_name: Name of the Kenisis Data Analytics application.
+ """
+ input_id = self.get_kinesis_analytics_application_input_id(application_name)
+ assert input_id, 'invalid Kinesis Data Analytics application input.'
+
+ client = self._aws_util.client('kinesisanalytics')
+ try:
+ client.start_application(
+ ApplicationName=application_name,
+ InputConfigurations=[
+ {
+ 'Id': input_id,
+ 'InputStartingPositionConfiguration': {
+ 'InputStartingPosition': 'NOW'
+ }
+ },
+ ]
+ )
+ except client.exceptions.ResourceInUseException:
+ # The application has been started.
+ return
+
+ try:
+ KinesisAnalyticsApplicationUpdatedWaiter(client, 'RUNNING').wait(application_name=application_name)
+ except WaiterError as e:
+ assert False, f'Failed to start the Kinesis Data Analytics application: {str(e)}.'
+
+ def get_kinesis_analytics_application_input_id(self, application_name: str) -> str:
+ """
+ Get the input ID for the Kenisis Data Analytics application.
+ :param application_name: Name of the Kenisis Data Analytics application.
+ :return: Input ID for the Kenisis Data Analytics application.
+ """
+ client = self._aws_util.client('kinesisanalytics')
+ response = client.describe_application(
+ ApplicationName=application_name
+ )
+ if not response:
+ return ''
+ input_descriptions = response.get('ApplicationDetail', {}).get('InputDescriptions', [])
+ if len(input_descriptions) != 1:
+ return ''
+
+ return input_descriptions[0].get('InputId', '')
+
+ def stop_kinesis_data_analytics_application(self, application_name: str) -> None:
+ """
+ Stop the Kenisis Data Analytics application.
+ :param application_name: Name of the Kenisis Data Analytics application.
+ """
+ client = self._aws_util.client('kinesisanalytics')
+ client.stop_application(
+ ApplicationName=application_name
+ )
+
+ try:
+ KinesisAnalyticsApplicationUpdatedWaiter(client, 'READY').wait(application_name=application_name)
+ except WaiterError as e:
+ assert False, f'Failed to stop the Kinesis Data Analytics application: {str(e)}.'
+
+ def verify_cloud_watch_delivery(self, namespace: str, metrics_name: str,
+ dimensions: typing.List[dict], start_time: datetime) -> None:
+ """
+ Verify that the expected metrics is delivered to CloudWatch.
+ :param namespace: Namespace of the metrics.
+ :param metrics_name: Name of the metrics.
+ :param dimensions: Dimensions of the metrics.
+ :param start_time: Start time for generating the metrics.
+ """
+ client = self._aws_util.client('cloudwatch')
+
+ try:
+ CloudWatchMetricsDeliveredWaiter(client).wait(
+ namespace=namespace,
+ metrics_name=metrics_name,
+ dimensions=dimensions,
+ start_time=start_time
+ )
+ except WaiterError as e:
+ assert False, f'Failed to deliver metrics to CloudWatch: {str(e)}.'
+
+ def verify_s3_delivery(self, analytics_bucket_name: str) -> None:
+ """
+ Verify that metrics are delivered to S3 for batch analytics successfully.
+ :param analytics_bucket_name: Name of the deployed S3 bucket.
+ """
+ client = self._aws_util.client('s3')
+ bucket_name = analytics_bucket_name
+
+ try:
+ DataLakeMetricsDeliveredWaiter(client).wait(bucket_name=bucket_name, prefix=EXPECTED_S3_DIRECTORY)
+ except WaiterError as e:
+ assert False, f'Failed to find the S3 directory for storing metrics data: {str(e)}.'
+
+ # Check whether the data is converted to the expected data format.
+ response = client.list_objects_v2(
+ Bucket=bucket_name,
+ Prefix=EXPECTED_S3_DIRECTORY
+ )
+ assert response.get('KeyCount', 0) != 0, f'Failed to deliver metrics to the S3 bucket {bucket_name}.'
+
+ s3_objects = response.get('Contents', [])
+ for s3_object in s3_objects:
+ key = s3_object.get('Key', '')
+ assert pathlib.Path(key).suffix == EXPECTED_S3_OBJECT_EXTENSION, \
+ f'Invalid data format is found in the S3 bucket {bucket_name}'
+
+ def run_glue_crawler(self, crawler_name: str) -> None:
+ """
+ Run the Glue crawler and wait for it to finish.
+ :param crawler_name: Name of the Glue crawler
+ """
+ client = self._aws_util.client('glue')
+ try:
+ client.start_crawler(
+ Name=crawler_name
+ )
+ except client.exceptions.CrawlerRunningException:
+ # The crawler has already been started.
+ return
+
+ try:
+ GlueCrawlerReadyWaiter(client).wait(crawler_name=crawler_name)
+ except WaiterError as e:
+ assert False, f'Failed to run the Glue crawler: {str(e)}.'
+
+ def run_named_queries(self, work_group: str) -> None:
+ """
+ Run the named queries under the specific Athena work group.
+ :param work_group: Name of the Athena work group.
+ """
+ client = self._aws_util.client('athena')
+ # List all the named queries.
+ response = client.list_named_queries(
+ WorkGroup=work_group
+ )
+ named_query_ids = response.get('NamedQueryIds', [])
+
+ # Run each of the queries.
+ for named_query_id in named_query_ids:
+ get_named_query_response = client.get_named_query(
+ NamedQueryId=named_query_id
+ )
+ named_query = get_named_query_response.get('NamedQuery', {})
+
+ start_query_execution_response = client.start_query_execution(
+ QueryString=named_query.get('QueryString', ''),
+ QueryExecutionContext={
+ 'Database': named_query.get('Database', '')
+ },
+ WorkGroup=work_group
+ )
+
+ # Wait for the query to finish.
+ state = 'RUNNING'
+ while state == 'QUEUED' or state == 'RUNNING':
+ get_query_execution_response = client.get_query_execution(
+ QueryExecutionId=start_query_execution_response.get('QueryExecutionId', '')
+ )
+
+ state = get_query_execution_response.get('QueryExecution', {}).get('Status', {}).get('State', '')
+
+ assert state == 'SUCCEEDED', f'Failed to run the named query {named_query.get("Name", {})}'
+
+ def empty_s3_bucket(self, bucket_name: str) -> None:
+ """
+ Empty the S3 bucket following:
+ https://boto3.amazonaws.com/v1/documentation/api/latest/guide/migrations3.html
+
+ :param bucket_name: Name of the S3 bucket.
+ """
+
+ s3 = self._aws_util.resource('s3')
+ bucket = s3.Bucket(bucket_name)
+
+ for key in bucket.objects.all():
+ key.delete()
+
+ def get_analytics_bucket_name(self, stack_name: str) -> str:
+ """
+ Get the name of the deployed S3 bucket.
+ :param stack_name: Name of the CloudFormation stack.
+ :return: Name of the deployed S3 bucket.
+ """
+
+ client = self._aws_util.client('cloudformation')
+
+ response = client.describe_stack_resources(
+ StackName=stack_name
+ )
+ resources = response.get('StackResources', [])
+
+ for resource in resources:
+ if resource.get('ResourceType') == 'AWS::S3::Bucket':
+ return resource.get('PhysicalResourceId', '')
+
+ return ''
+
+
+@pytest.fixture(scope='function')
+def aws_metrics_utils(
+ request: pytest.fixture,
+ aws_utils: pytest.fixture):
+ """
+ Fixture for the AWS metrics util functions.
+ :param request: _pytest.fixtures.SubRequest class that handles getting
+ a pytest fixture from a pytest function/fixture.
+ :param aws_utils: aws_utils fixture.
+ """
+ aws_utils_obj = AWSMetricsUtils(aws_utils)
+ return aws_utils_obj
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_waiters.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_waiters.py
new file mode 100644
index 0000000000..7ce5551fd4
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_waiters.py
@@ -0,0 +1,142 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+import botocore.client
+import logging
+
+from datetime import timedelta
+from AWS.common.custom_waiter import CustomWaiter, WaitState
+
+logging.getLogger('boto').setLevel(logging.CRITICAL)
+
+
+class KinesisAnalyticsApplicationUpdatedWaiter(CustomWaiter):
+ """
+ Subclass of the base custom waiter class.
+ Wait for the Kinesis analytics application being updated to a specific status.
+ """
+ def __init__(self, client: botocore.client, status: str):
+ """
+ Initialize the waiter.
+
+ :param client: Boto3 client to use.
+ :param status: Expected status.
+ """
+ super().__init__(
+ 'KinesisAnalyticsApplicationUpdated',
+ 'DescribeApplication',
+ 'ApplicationDetail.ApplicationStatus',
+ {status: WaitState.SUCCESS},
+ client)
+
+ def wait(self, application_name: str):
+ """
+ Wait for the expected status.
+
+ :param application_name: Name of the Kinesis analytics application.
+ """
+ self._wait(ApplicationName=application_name)
+
+
+class GlueCrawlerReadyWaiter(CustomWaiter):
+ """
+ Subclass of the base custom waiter class.
+ Wait for the Glue crawler to finish its processing.
+ """
+ def __init__(self, client: botocore.client):
+ """
+ Initialize the waiter.
+
+ :param client: Boto3 client to use.
+ """
+ super().__init__(
+ 'GlueCrawlerReady',
+ 'GetCrawler',
+ 'Crawler.State',
+ {'READY': WaitState.SUCCESS},
+ client)
+
+ def wait(self, crawler_name):
+ """
+ Wait for the expected status.
+
+ :param crawler_name: Name of the Glue crawler.
+ """
+ self._wait(Name=crawler_name)
+
+
+class DataLakeMetricsDeliveredWaiter(CustomWaiter):
+ """
+ Subclass of the base custom waiter class.
+ Wait for the expected directory being created in the S3 bucket.
+ """
+ def __init__(self, client: botocore.client):
+ """
+ Initialize the waiter.
+
+ :param client: Boto3 client to use.
+ """
+ super().__init__(
+ 'DataLakeMetricsDelivered',
+ 'ListObjectsV2',
+ 'KeyCount > `0`',
+ {True: WaitState.SUCCESS},
+ client)
+
+ def wait(self, bucket_name, prefix):
+ """
+ Wait for the expected directory being created.
+
+ :param bucket_name: Name of the S3 bucket.
+ :param prefix: Name of the expected directory prefix.
+ """
+ self._wait(Bucket=bucket_name, Prefix=prefix)
+
+
+class CloudWatchMetricsDeliveredWaiter(CustomWaiter):
+ """
+ Subclass of the base custom waiter class.
+ Wait for the expected metrics being delivered to CloudWatch.
+ """
+ def __init__(self, client: botocore.client):
+ """
+ Initialize the waiter.
+
+ :param client: Boto3 client to use.
+ """
+ super().__init__(
+ 'CloudWatchMetricsDelivered',
+ 'GetMetricStatistics',
+ 'length(Datapoints) > `0`',
+ {True: WaitState.SUCCESS},
+ client)
+
+ def wait(self, namespace, metrics_name, dimensions, start_time):
+ """
+ Wait for the expected metrics being delivered.
+
+ :param namespace: Namespace of the metrics.
+ :param metrics_name: Name of the metrics.
+ :param dimensions: Dimensions of the metrics.
+ :param start_time: Start time for generating the metrics.
+ """
+ self._wait(
+ Namespace=namespace,
+ MetricName=metrics_name,
+ Dimensions=dimensions,
+ StartTime=start_time,
+ EndTime=start_time + timedelta(0, self.timeout),
+ Period=60,
+ Statistics=[
+ 'SampleCount'
+ ],
+ Unit='Count'
+ )
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/cdk/__init__.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/cdk/__init__.py
new file mode 100644
index 0000000000..8caef52682
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/cdk/__init__.py
@@ -0,0 +1,11 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/cdk/cdk.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/cdk/cdk.py
new file mode 100644
index 0000000000..9254c3d4eb
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/cdk/cdk.py
@@ -0,0 +1,213 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+import os
+import pytest
+import boto3
+
+import ly_test_tools.environment.process_utils as process_utils
+from typing import List
+
+BOOTSTRAP_STACK_NAME = 'CDKToolkit'
+BOOTSTRAP_STAGING_BUCKET_LOGIC_ID = 'StagingBucket'
+
+class Cdk:
+ """
+ Cdk class that provides methods to run cdk application commands.
+ Expects system to have NodeJS, AWS CLI and CDK installed globally and have their paths setup as env variables.
+ """
+
+ def __init__(self, cdk_path: str, project: str, account_id: str,
+ workspace: pytest.fixture, session: boto3.session.Session):
+ """
+ :param cdk_path: Path where cdk app.py is stored.
+ :param project: Project name used for cdk project name env variable.
+ :param account_id: AWS account id to use with cdk application.
+ :param workspace: ly_test_tools workspace fixture.
+ """
+ self._cdk_env = os.environ.copy()
+ self._cdk_env['O3DE_AWS_PROJECT_NAME'] = project
+ self._cdk_env['O3DE_AWS_DEPLOY_REGION'] = session.region_name
+ self._cdk_env['O3DE_AWS_DEPLOY_ACCOUNT'] = account_id
+ self._cdk_env['PATH'] = f'{workspace.paths.engine_root()}\\python;' + self._cdk_env['PATH']
+
+ credentials = session.get_credentials().get_frozen_credentials()
+ self._cdk_env['AWS_ACCESS_KEY_ID'] = credentials.access_key
+ self._cdk_env['AWS_SECRET_ACCESS_KEY'] = credentials.secret_key
+ self._cdk_env['AWS_SESSION_TOKEN'] = credentials.token
+ self._stacks = []
+ self._cdk_path = cdk_path
+
+ output = process_utils.check_output(
+ 'python -m pip install -r requirements.txt',
+ cwd=self._cdk_path,
+ env=self._cdk_env,
+ shell=True)
+
+ def bootstrap(self) -> None:
+ """
+ Deploy the bootstrap stack.
+ """
+ bootstrap_cmd = ['cdk', 'bootstrap',
+ f'aws://{self._cdk_env["O3DE_AWS_DEPLOY_ACCOUNT"]}/{self._cdk_env["O3DE_AWS_DEPLOY_REGION"]}']
+
+ process_utils.check_call(
+ bootstrap_cmd,
+ cwd=self._cdk_path,
+ env=self._cdk_env,
+ shell=True)
+
+ def list(self) -> List[str]:
+ """
+ lists cdk stack names
+ :return List of cdk stack names
+ """
+ if not self._cdk_path:
+ return []
+
+ list_cdk_application_cmd = ['cdk', 'list']
+ output = process_utils.check_output(
+ list_cdk_application_cmd,
+ cwd=self._cdk_path,
+ env=self._cdk_env,
+ shell=True)
+
+ return output.splitlines()
+
+ def synthesize(self) -> None:
+ """
+ Synthesizes all cdk stacks
+ """
+ if not self._cdk_path:
+ return
+
+ list_cdk_application_cmd = ['cdk', 'synth']
+
+ process_utils.check_output(
+ list_cdk_application_cmd,
+ cwd=self._cdk_path,
+ env=self._cdk_env,
+ shell=True)
+
+ def deploy(self, context_variable: str = '', additonal_params: List[str] = None) -> List[str]:
+ """
+ Deploys all the CDK stacks.
+ :param context_variable: Context variable for enabling optional features.
+ :param additonal_params: Additonal parameters like --all can be passed in this way.
+ :return List of deployed stack arns.
+ """
+ if not self._cdk_path:
+ return []
+
+ deploy_cdk_application_cmd = ['cdk', 'deploy', '--require-approval', 'never']
+ if additonal_params:
+ deploy_cdk_application_cmd.extend(additonal_params)
+ if context_variable:
+ deploy_cdk_application_cmd.extend(['-c', f'{context_variable}'])
+
+ output = process_utils.check_output(
+ deploy_cdk_application_cmd,
+ cwd=self._cdk_path,
+ env=self._cdk_env,
+ shell=True)
+
+ stacks = []
+ for line in output.splitlines():
+ line_sections = line.split('/')
+ assert len(line_sections), 3
+ stacks.append(line.split('/')[-2])
+
+ return stacks
+
+ def destroy(self) -> None:
+ """
+ Destroys the cdk application.
+ """
+ destroy_cdk_application_cmd = ['cdk', 'destroy', '-f']
+ process_utils.check_output(
+ destroy_cdk_application_cmd,
+ cwd=self._cdk_path,
+ env=self._cdk_env,
+ shell=True)
+
+ self._stacks = []
+ self._cdk_path = ''
+
+ @staticmethod
+ def remove_bootstrap_stack(aws_utils: pytest.fixture) -> None:
+ """
+ Remove the CDK bootstrap stack.
+ :param aws_utils: aws_utils fixture.
+ """
+ # Check if the bootstrap stack exists.
+ response = aws_utils.client('cloudformation').describe_stacks(
+ StackName=BOOTSTRAP_STACK_NAME
+ )
+ stacks = response.get('Stacks', [])
+ if not stacks:
+ return
+
+ # Clear the bootstrap staging bucket before deleting the bootstrap stack.
+ response = aws_utils.client('cloudformation').describe_stack_resource(
+ StackName=BOOTSTRAP_STACK_NAME,
+ LogicalResourceId=BOOTSTRAP_STAGING_BUCKET_LOGIC_ID
+ )
+
+ staging_bucket_name = response.get('StackResourceDetail', {}).get('PhysicalResourceId', '')
+ if staging_bucket_name:
+ s3 = aws_utils.resource('s3')
+ bucket = s3.Bucket(staging_bucket_name)
+ for key in bucket.objects.all():
+ key.delete()
+
+ # Delete the bootstrap stack.
+ aws_utils.client('cloudformation').delete_stack(
+ StackName=BOOTSTRAP_STACK_NAME
+ )
+
+
+@pytest.fixture(scope='function')
+def cdk(
+ request: pytest.fixture,
+ project: str,
+ feature_name: str,
+ workspace: pytest.fixture,
+ aws_utils: pytest.fixture,
+ bootstrap_required: bool = True,
+ destroy_stacks_on_teardown: bool = True) -> Cdk:
+ """
+ Fixture for setting up a Cdk
+ :param request: _pytest.fixtures.SubRequest class that handles getting
+ a pytest fixture from a pytest function/fixture.
+ :param project: Project name used for cdk project name env variable.
+ :param feature_name: Feature gem name to expect cdk folder in.
+ :param workspace: ly_test_tools workspace fixture.
+ :param aws_utils: aws_utils fixture.
+ :param bootstrap_required: Whether the bootstrap stack needs to be created to
+ provision resources the AWS CDK needs to perform the deployment.
+ :param destroy_stacks_on_teardown: option to control calling destroy ot the end of test.
+ :return Cdk class object.
+ """
+
+ cdk_path = f'{workspace.paths.engine_root()}/Gems/{feature_name}/cdk'
+ cdk_obj = Cdk(cdk_path, project, aws_utils.assume_account_id(), workspace, aws_utils.assume_session())
+
+ if bootstrap_required:
+ cdk_obj.bootstrap()
+
+ def teardown():
+ if destroy_stacks_on_teardown:
+ cdk_obj.destroy()
+ cdk_obj.remove_bootstrap_stack(aws_utils)
+
+ request.addfinalizer(teardown)
+
+ return cdk_obj
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/__init__.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/__init__.py
new file mode 100644
index 0000000000..8caef52682
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/__init__.py
@@ -0,0 +1,11 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/test_anonymous_credentials.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/test_anonymous_credentials.py
new file mode 100644
index 0000000000..7b9c549f6c
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/test_anonymous_credentials.py
@@ -0,0 +1,79 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+import pytest
+import os
+import logging
+import ly_test_tools.log.log_monitor
+
+from AWS.Windows.resource_mappings.resource_mappings import resource_mappings
+from AWS.Windows.cdk.cdk import cdk
+from AWS.common.aws_utils import aws_utils
+from assetpipeline.ap_fixtures.asset_processor_fixture import asset_processor as asset_processor
+
+AWS_PROJECT_NAME = 'AWS-AutomationTest'
+AWS_CLIENT_AUTH_FEATURE_NAME = 'AWSClientAuth'
+AWS_CLIENT_AUTH_DEFAULT_PROFILE_NAME = 'default'
+
+GAME_LOG_NAME = 'Game.log'
+
+logger = logging.getLogger(__name__)
+
+
+@pytest.mark.SUITE_periodic
+@pytest.mark.usefixtures('automatic_process_killer')
+@pytest.mark.usefixtures('asset_processor')
+@pytest.mark.usefixtures('workspace')
+@pytest.mark.parametrize('project', ['AutomatedTesting'])
+@pytest.mark.parametrize('level', ['AWS/ClientAuth'])
+@pytest.mark.usefixtures('cdk')
+@pytest.mark.parametrize('feature_name', [AWS_CLIENT_AUTH_FEATURE_NAME])
+@pytest.mark.usefixtures('resource_mappings')
+@pytest.mark.parametrize('resource_mappings_filename', ['aws_resource_mappings.json'])
+@pytest.mark.usefixtures('aws_utils')
+@pytest.mark.parametrize('region_name', ['us-west-2'])
+@pytest.mark.parametrize('assume_role_arn', ['arn:aws:iam::645075835648:role/o3de-automation-tests'])
+@pytest.mark.parametrize('session_name', ['o3de-Automation-session'])
+class TestAWSClientAuthAnonymousCredentials(object):
+ """
+ Test class to verify AWS Cognito Identity pool anonymous authorization.
+ """
+
+ def test_anonymous_credentials(self,
+ level: str,
+ launcher: pytest.fixture,
+ cdk: pytest.fixture,
+ resource_mappings: pytest.fixture,
+ workspace: pytest.fixture,
+ asset_processor: pytest.fixture
+ ):
+ """
+ Setup: Deploys cdk and updates resource mapping file.
+ Tests: Getting AWS credentials for no signed in user.
+ Verification: Log monitor looks for success credentials log.
+ """
+ logger.info(f'Cdk stack names:\n{cdk.list()}')
+ stacks = cdk.deploy()
+ resource_mappings.populate_output_keys(stacks)
+ asset_processor.start()
+ asset_processor.wait_for_idle()
+
+ file_to_monitor = os.path.join(launcher.workspace.paths.project_log(), GAME_LOG_NAME)
+ log_monitor = ly_test_tools.log.log_monitor.LogMonitor(launcher=launcher, log_file_path=file_to_monitor)
+
+ launcher.args = ['+LoadLevel', level]
+ launcher.args.extend(['-rhi=null'])
+
+ with launcher.start(launch_ap=False):
+ result = log_monitor.monitor_log_for_lines(
+ expected_lines=['(Script) - Success anonymous credentials'],
+ unexpected_lines=['(Script) - Fail anonymous credentials'],
+ halt_on_unexpected=True,
+ )
+ assert result, 'Anonymous credentials fetched successfully.'
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/test_password_signin.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/test_password_signin.py
new file mode 100644
index 0000000000..89b859dd0f
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/test_password_signin.py
@@ -0,0 +1,99 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+import pytest
+import os
+import logging
+import ly_test_tools.log.log_monitor
+
+from AWS.Windows.resource_mappings.resource_mappings import resource_mappings
+from AWS.Windows.cdk.cdk import cdk
+from AWS.common.aws_utils import aws_utils
+from assetpipeline.ap_fixtures.asset_processor_fixture import asset_processor as asset_processor
+
+AWS_PROJECT_NAME = 'AWS-AutomationTest'
+AWS_CLIENT_AUTH_FEATURE_NAME = 'AWSClientAuth'
+AWS_CLIENT_AUTH_DEFAULT_PROFILE_NAME = 'default'
+
+GAME_LOG_NAME = 'Game.log'
+
+logger = logging.getLogger(__name__)
+
+
+@pytest.mark.SUITE_periodic
+@pytest.mark.usefixtures('automatic_process_killer')
+@pytest.mark.usefixtures('asset_processor')
+@pytest.mark.usefixtures('workspace')
+@pytest.mark.parametrize('project', ['AutomatedTesting'])
+@pytest.mark.usefixtures('cdk')
+@pytest.mark.parametrize('feature_name', [AWS_CLIENT_AUTH_FEATURE_NAME])
+@pytest.mark.usefixtures('resource_mappings')
+@pytest.mark.parametrize('resource_mappings_filename', ['aws_resource_mappings.json'])
+@pytest.mark.usefixtures('aws_utils')
+@pytest.mark.parametrize('region_name', ['us-west-2'])
+@pytest.mark.parametrize('assume_role_arn', ['arn:aws:iam::645075835648:role/o3de-automation-tests'])
+@pytest.mark.parametrize('session_name', ['o3de-Automation-session'])
+class TestAWSClientAuthPasswordSignIn(object):
+ """
+ Test class to verify AWS Cognito IDP Password sign in and Cognito Identity pool authenticated authorization.
+ """
+
+ def test_password_signin_credentials(self,
+ launcher: pytest.fixture,
+ cdk: pytest.fixture,
+ resource_mappings: pytest.fixture,
+ workspace: pytest.fixture,
+ asset_processor: pytest.fixture,
+ aws_utils: pytest.fixture
+ ):
+ """
+ Setup: Deploys cdk and updates resource mapping file.
+ Tests: Sign up new test user, admin confirm the user, sign in and get aws credentials.
+ Verification: Log monitor looks for success credentials log.
+ """
+ logger.info(f'Cdk stack names:\n{cdk.list()}')
+ stacks = cdk.deploy()
+ resource_mappings.populate_output_keys(stacks)
+ asset_processor.start()
+ asset_processor.wait_for_idle()
+
+ file_to_monitor = os.path.join(launcher.workspace.paths.project_log(), GAME_LOG_NAME)
+ log_monitor = ly_test_tools.log.log_monitor.LogMonitor(launcher=launcher, log_file_path=file_to_monitor)
+
+ launcher.args = ['+LoadLevel', 'AWS/ClientAuthPasswordSignUp']
+ launcher.args.extend(['-rhi=null'])
+
+ with launcher.start(launch_ap=False):
+ result = log_monitor.monitor_log_for_lines(
+ expected_lines=['(Script) - Signup Success'],
+ unexpected_lines=['(Script) - Signup Fail'],
+ halt_on_unexpected=True,
+ )
+ assert result, 'Sign Up Success.'
+
+ launcher.stop()
+
+ cognito_idp = aws_utils.client('cognito-idp')
+ user_pool_id = resource_mappings.get_resource_name_id(f'{AWS_CLIENT_AUTH_FEATURE_NAME}.CognitoUserPoolId')
+ print(f'UserPoolId:{user_pool_id}')
+ cognito_idp.admin_confirm_sign_up(
+ UserPoolId=user_pool_id,
+ Username='test1'
+ )
+
+ launcher.args = ['+LoadLevel', 'AWS/ClientAuthPasswordSignIn']
+ launcher.args.extend(['-rhi=null'])
+
+ with launcher.start(launch_ap=False):
+ result = log_monitor.monitor_log_for_lines(
+ expected_lines=['(Script) - SignIn Success', '(Script) - Success credentials'],
+ unexpected_lines=['(Script) - SignIn Fail', '(Script) - Fail credentials'],
+ halt_on_unexpected=True,
+ )
+ assert result, 'Sign in Success, fetched authenticated AWS temp credentials.'
diff --git a/Tests/BuildSystems/__init__.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/resource_mappings/__init__.py
old mode 100755
new mode 100644
similarity index 100%
rename from Tests/BuildSystems/__init__.py
rename to AutomatedTesting/Gem/PythonTests/AWS/Windows/resource_mappings/__init__.py
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/resource_mappings/resource_mappings.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/resource_mappings/resource_mappings.py
new file mode 100644
index 0000000000..dc462e0556
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/resource_mappings/resource_mappings.py
@@ -0,0 +1,148 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+import os
+from os.path import abspath
+import pytest
+import json
+import logging
+
+logger = logging.getLogger(__name__)
+
+AWS_RESOURCE_MAPPINGS_KEY = 'AWSResourceMappings'
+AWS_RESOURCE_MAPPINGS_ACCOUNT_ID_KEY = 'AccountId'
+AWS_RESOURCE_MAPPINGS_REGION_KEY = 'Region'
+
+
+class ResourceMappings:
+ """
+ ResourceMappings class that handles writing Cloud formation outputs to resource mappings json file in a project.
+ """
+
+ def __init__(self, file_path: str, region: str, feature_name: str, account_id: str, workspace: pytest.fixture,
+ cloud_formation_client):
+ """
+ :param file_path: Path for the resource mapping file.
+ :param region: Region value for the resource mapping file.
+ :param feature_name: Feature gem name to use to append name to mappings key.
+ :param account_id: AWS account id value for the resource mapping file.
+ :param workspace: ly_test_tools workspace fixture.
+ :param cloud_formation_client: AWS cloud formation client.
+ """
+ self._cdk_env = os.environ.copy()
+ self._cdk_env['PATH'] = f'{workspace.paths.engine_root()}\\python;' + self._cdk_env['PATH']
+ self._resource_mapping_file_path = file_path
+ self._region = region
+ self._feature_name = feature_name
+ self._account_id = account_id
+ self._resource_mappings = {}
+
+ assert os.path.exists(self._resource_mapping_file_path), \
+ f'Invalid resource mapping file path {self._resource_mapping_file_path}'
+ self._client = cloud_formation_client
+
+ def populate_output_keys(self, stacks=[]) -> None:
+ """
+ Calls describe stacks on cloud formation service and persists outputs to resource mappings file.
+ :param stacks List of stack arns to describe and populate resource mappings with.
+ """
+ for stack_name in stacks:
+ response = self._client.describe_stacks(
+ StackName=stack_name
+ )
+ stacks = response.get('Stacks', [])
+ assert len(stacks) == 1, f'{stack_name} is invalid.'
+
+ self._write_resource_mappings(stacks[0].get('Outputs', []))
+
+ def _write_resource_mappings(self, outputs, append_feature_name = True) -> None:
+ with open(self._resource_mapping_file_path) as file_content:
+ resource_mappings = json.load(file_content)
+
+ resource_mappings[AWS_RESOURCE_MAPPINGS_ACCOUNT_ID_KEY] = self._account_id
+ resource_mappings[AWS_RESOURCE_MAPPINGS_REGION_KEY] = self._region
+
+ # Append new mappings.
+ resource_mappings[AWS_RESOURCE_MAPPINGS_KEY] = resource_mappings.get(AWS_RESOURCE_MAPPINGS_KEY, {})
+
+ for output in outputs:
+ if append_feature_name:
+ resource_key = f'{self._feature_name}.{output.get("OutputKey", "InvalidKey")}'
+ else:
+ resource_key = output.get("OutputKey", "InvalidKey")
+ resource_mappings[AWS_RESOURCE_MAPPINGS_KEY][resource_key] = resource_mappings[
+ AWS_RESOURCE_MAPPINGS_KEY].get(resource_key, {})
+ resource_mappings[AWS_RESOURCE_MAPPINGS_KEY][resource_key]['Type'] = 'AutomationTestType'
+ resource_mappings[AWS_RESOURCE_MAPPINGS_KEY][resource_key]['Name/ID'] = output.get('OutputValue',
+ 'InvalidId')
+
+ self._resource_mappings = resource_mappings
+ with open(self._resource_mapping_file_path, 'w') as file_content:
+ json.dump(resource_mappings, file_content, indent=4)
+
+ def clear_output_keys(self) -> None:
+ """
+ Clears values of all resource mapping keys. Sets region to default to us-west-2
+ """
+ with open(self._resource_mapping_file_path) as file_content:
+ resource_mappings = json.load(file_content)
+
+ resource_mappings[AWS_RESOURCE_MAPPINGS_ACCOUNT_ID_KEY] = ''
+ resource_mappings[AWS_RESOURCE_MAPPINGS_REGION_KEY] = 'us-west-2'
+
+ # Append new mappings.
+ resource_mappings[AWS_RESOURCE_MAPPINGS_KEY] = resource_mappings.get(AWS_RESOURCE_MAPPINGS_KEY, {})
+ resource_mappings[AWS_RESOURCE_MAPPINGS_KEY] = {}
+
+ with open(self._resource_mapping_file_path, 'w') as file_content:
+ json.dump(resource_mappings, file_content, indent=4)
+
+ self._resource_mapping_file_path = ''
+ self._region = ''
+ self._client = None
+
+ def get_resource_name_id(self, resource_key: str):
+ return self._resource_mappings[AWS_RESOURCE_MAPPINGS_KEY][resource_key]['Name/ID']
+
+
+@pytest.fixture(scope='function')
+def resource_mappings(
+ request: pytest.fixture,
+ project: str,
+ feature_name: str,
+ resource_mappings_filename: str,
+ workspace: pytest.fixture,
+ aws_utils: pytest.fixture) -> ResourceMappings:
+ """
+ Fixture for setting up resource mappings file.
+ :param request: _pytest.fixtures.SubRequest class that handles getting
+ a pytest fixture from a pytest function/fixture.
+ :param project: Project to find resource mapping file.
+ :param feature_name: AWS Gem name that is prepended to resource mapping keys.
+ :param resource_mappings_filename: Name of resource mapping file.
+ :param workspace: ly_test_tools workspace fixture.
+ :param aws_utils: AWS utils fixture.
+ :return: ResourceMappings class object.
+ """
+
+ path = f'{workspace.paths.engine_root()}/{project}/Config/{resource_mappings_filename}'
+ logger.info(f'Resource mapping path : {path}')
+ logger.info(f'Resource mapping resolved path : {abspath(path)}')
+ resource_mappings_obj = ResourceMappings(abspath(path), aws_utils.assume_session().region_name, feature_name,
+ aws_utils.assume_account_id(), workspace,
+ aws_utils.client('cloudformation'))
+
+ def teardown():
+ resource_mappings_obj.clear_output_keys()
+
+ request.addfinalizer(teardown)
+
+ return resource_mappings_obj
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/__init__.py b/AutomatedTesting/Gem/PythonTests/AWS/__init__.py
new file mode 100644
index 0000000000..8caef52682
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/__init__.py
@@ -0,0 +1,11 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/common/__init__.py b/AutomatedTesting/Gem/PythonTests/AWS/common/__init__.py
new file mode 100644
index 0000000000..8caef52682
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/common/__init__.py
@@ -0,0 +1,11 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/common/aws_credentials.py b/AutomatedTesting/Gem/PythonTests/AWS/common/aws_credentials.py
new file mode 100644
index 0000000000..fbce772d40
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/common/aws_credentials.py
@@ -0,0 +1,134 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+import boto3
+import configparser
+import logging
+import os
+import pytest
+import typing
+
+logger = logging.getLogger(__name__)
+logging.getLogger('boto').setLevel(logging.CRITICAL)
+
+
+class AwsCredentials:
+ def __init__(self, profile_name: str):
+ self._profile_name = profile_name
+
+ self._credentials_path = os.environ.get('AWS_SHARED_CREDENTIALS_FILE')
+ if not self._credentials_path:
+ # Home directory location varies based on the operating system, but is referred to using the environment
+ # variables %UserProfile% in Windows and $HOME or ~ (tilde) in Unix-based systems.
+ self._credentials_path = os.path.join(os.environ.get('UserProfile', os.path.expanduser('~')),
+ '.aws', 'credentials')
+ self._credentials_file_exists = os.path.exists(self._credentials_path)
+
+ self._credentials = configparser.ConfigParser()
+ self._credentials.read(self._credentials_path)
+
+ def get_aws_credentials(self) -> typing.Tuple[str, str, str]:
+ """
+ Get aws credentials stored in the specific named profile.
+
+ :return AWS credentials.
+ """
+ access_key_id = self._get_aws_credential_attribute_value('aws_access_key_id')
+ secret_access_key = self._get_aws_credential_attribute_value('aws_secret_access_key')
+ session_token = self._get_aws_credential_attribute_value('aws_session_token')
+
+ return access_key_id, secret_access_key, session_token
+
+ def set_aws_credentials_by_session(self, session: boto3.Session) -> None:
+ """
+ Set AWS credentials stored in the specific named profile using an assumed role session.
+
+ :param session: assumed role session.
+ """
+ credentials = session.get_credentials().get_frozen_credentials()
+ self.set_aws_credentials(credentials.access_key, credentials.secret_key, credentials.token)
+
+ def set_aws_credentials(self, aws_access_key_id: str, aws_secret_access_key: str,
+ aws_session_token: str) -> None:
+ """
+ Set AWS credentials stored in the specific named profile.
+
+ :param aws_access_key_id: AWS access key id.
+ :param aws_secret_access_key: AWS secrete access key.
+ :param aws_session_token: AWS assumed role session.
+ """
+ self._set_aws_credential_attribute_value('aws_access_key_id', aws_access_key_id)
+ self._set_aws_credential_attribute_value('aws_secret_access_key', aws_secret_access_key)
+ self._set_aws_credential_attribute_value('aws_session_token', aws_session_token)
+
+ if (len(self._credentials.sections()) == 0) and (not self._credentials_file_exists):
+ os.remove(self._credentials_path)
+ return
+
+ with open(self._credentials_path, 'w+') as credential_file:
+ self._credentials.write(credential_file)
+
+ def _get_aws_credential_attribute_value(self, attribute_name: str) -> str:
+ """
+ Get the value of an AWS credential attribute stored in the specific named profile.
+
+ :param attribute_name: Name of the AWS credential attribute.
+ :return Value of the AWS credential attribute.
+ """
+ try:
+ value = self._credentials.get(self._profile_name, attribute_name)
+ except configparser.NoSectionError:
+ # Named profile or key doesn't exist
+ value = None
+ except configparser.NoOptionError:
+ # Named profile doesn't have the specified attribute
+ value = None
+
+ return value
+
+ def _set_aws_credential_attribute_value(self, attribute_name: str, attribute_value: str) -> None:
+ """
+ Set the value of an AWS credential attribute stored in the specific named profile.
+
+ :param attribute_name: Name of the AWS credential attribute.
+ :param attribute_value: Value of the AWS credential attribute.
+ """
+ if self._profile_name not in self._credentials:
+ self._credentials[self._profile_name] = {}
+
+ if attribute_value is None:
+ self._credentials.remove_option(self._profile_name, attribute_name)
+ # Remove the named profile if it doesn't have any AWS credential attribute.
+ if len(self._credentials[self._profile_name]) == 0:
+ self._credentials.remove_section(self._profile_name)
+ else:
+ self._credentials[self._profile_name][attribute_name] = attribute_value
+
+
+@pytest.fixture(scope='function')
+def aws_credentials(request: pytest.fixture, aws_utils: pytest.fixture, profile_name: str):
+ """
+ Fixture for setting up temporary AWS credentials from assume role.
+
+ :param request: _pytest.fixtures.SubRequest class that handles getting
+ a pytest fixture from a pytest function/fixture.
+ :param aws_utils: aws_utils fixture.
+ :param profile_name: Named AWS profile to store temporary credentials.
+ """
+ aws_credentials_obj = AwsCredentials(profile_name)
+ original_access_key, original_secret_access_key, original_token = aws_credentials_obj.get_aws_credentials()
+ aws_credentials_obj.set_aws_credentials_by_session(aws_utils.assume_session())
+
+ def teardown():
+ # Reset to the named profile using the original AWS credentials
+ aws_credentials_obj.set_aws_credentials(original_access_key, original_secret_access_key, original_token)
+ request.addfinalizer(teardown)
+
+ return aws_credentials_obj
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/common/aws_utils.py b/AutomatedTesting/Gem/PythonTests/AWS/common/aws_utils.py
new file mode 100644
index 0000000000..ff33f58d1d
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/common/aws_utils.py
@@ -0,0 +1,90 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+import boto3
+import pytest
+import logging
+
+logger = logging.getLogger(__name__)
+logging.getLogger('boto').setLevel(logging.CRITICAL)
+
+
+class AwsUtils:
+
+ def __init__(self, arn: str, session_name: str, region_name: str):
+ local_session = boto3.Session(profile_name='default')
+ 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}')
+
+ response = local_sts_client.assume_role(RoleArn=arn, RoleSessionName=session_name)
+
+ self._assume_session = boto3.Session(aws_access_key_id=response['Credentials']['AccessKeyId'],
+ aws_secret_access_key=response['Credentials']['SecretAccessKey'],
+ aws_session_token=response['Credentials']['SessionToken'],
+ region_name=region_name)
+
+ assume_sts_client = self._assume_session.client('sts')
+ assume_account_id = assume_sts_client.get_caller_identity()["Account"]
+ logger.info(f'Assume Account Id: {assume_account_id}')
+ self._assume_account_id = assume_account_id
+
+ def client(self, service: str):
+ """
+ Get the client for a specific AWS service from configured session
+ :return: Client for the AWS service.
+ """
+ return self._assume_session.client(service)
+
+ def resource(self, service: str):
+ """
+ Get the resource for a specific AWS service from configured session
+ :return: Client for the AWS service.
+ """
+ return self._assume_session.resource(service)
+
+ def assume_session(self):
+ return self._assume_session
+
+ def local_account_id(self):
+ return self._local_account_id
+
+ def assume_account_id(self):
+ return self._assume_account_id
+
+ def destroy(self) -> None:
+ """
+ clears stored session
+ """
+ self._assume_session = None
+
+
+@pytest.fixture(scope='function')
+def aws_utils(
+ request: pytest.fixture,
+ assume_role_arn: str,
+ session_name: str,
+ region_name: str):
+ """
+ Fixture for AWS util functions
+ :param request: _pytest.fixtures.SubRequest class that handles getting
+ a pytest fixture from a pytest function/fixture.
+ :param assume_role_arn: Role used to fetch temporary aws credentials, configure service clients with obtained credentials.
+ :param session_name: Session name to set.
+ :param region_name: AWS account region to set for session.
+ :return AWSUtils class object.
+ """
+ aws_utils_obj = AwsUtils(assume_role_arn, session_name, region_name)
+
+ def teardown():
+ aws_utils_obj.destroy()
+
+ request.addfinalizer(teardown)
+
+ return aws_utils_obj
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/common/custom_waiter.py b/AutomatedTesting/Gem/PythonTests/AWS/common/custom_waiter.py
new file mode 100644
index 0000000000..7c0a65e8a3
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/common/custom_waiter.py
@@ -0,0 +1,91 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+from enum import Enum
+import botocore.client
+import botocore.waiter
+import logging
+
+logging.getLogger('boto').setLevel(logging.CRITICAL)
+
+
+class WaitState(Enum):
+ SUCCESS = 'success'
+ FAILURE = 'failure'
+
+
+class CustomWaiter:
+ """
+ Base class for a custom waiter.
+
+ Modified from:
+ https://docs.aws.amazon.com/code-samples/latest/catalog/python-demo_tools-custom_waiter.py.html
+ """
+ def __init__(
+ self, name: str, operation: str, argument: str,
+ acceptors: dict, client: botocore.client, delay: int = 30, max_tries: int = 10,
+ matcher='path'):
+ """
+ Subclasses should pass specific operations, arguments, and acceptors to
+ their superclass.
+
+ :param name: The name of the waiter. This can be any descriptive string.
+ :param operation: The operation to wait for. This must match the casing of
+ the underlying operation model, which is typically in
+ CamelCase.
+ :param argument: The dict keys used to access the result of the operation, in
+ dot notation. For example, 'Job.Status' will access
+ result['Job']['Status'].
+ :param acceptors: The list of acceptors that indicate the wait is over. These
+ can indicate either success or failure. The acceptor values
+ are compared to the result of the operation after the
+ argument keys are applied.
+ :param client: The Boto3 client.
+ :param delay: The number of seconds to wait between each call to the operation. Default to 30 seconds.
+ :param max_tries: The maximum number of tries before exiting. Default to 10.
+ :param matcher: The kind of matcher to use. Default to 'path'.
+ """
+ self.name = name
+ self.operation = operation
+ self.argument = argument
+ self.client = client
+ self.waiter_model = botocore.waiter.WaiterModel({
+ 'version': 2,
+ 'waiters': {
+ name: {
+ "delay": delay,
+ "operation": operation,
+ "maxAttempts": max_tries,
+ "acceptors": [{
+ "state": state.value,
+ "matcher": matcher,
+ "argument": argument,
+ "expected": expected
+ } for expected, state in acceptors.items()]
+ }}})
+ self.waiter = botocore.waiter.create_waiter_with_client(
+ self.name, self.waiter_model, self.client)
+
+ self._timeout = delay * max_tries
+
+ def _wait(self, **kwargs):
+ """
+ Starts the botocore wait loop.
+
+ :param kwargs: Keyword arguments that are passed to the operation being polled.
+ """
+ self.waiter.wait(**kwargs)
+
+ @property
+ def timeout(self):
+ return self._timeout
+
+
diff --git a/AutomatedTesting/Gem/PythonTests/Blast/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/Blast/CMakeLists.txt
new file mode 100644
index 0000000000..61bb2e8355
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/Blast/CMakeLists.txt
@@ -0,0 +1,25 @@
+#
+# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+# its licensors.
+#
+# For complete copyright and license terms please see the LICENSE at the root of this
+# distribution (the "License"). All use of this software is governed by the License,
+# or, if provided, by the license below or the license accompanying this file. Do not
+# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
+ ly_add_pytest(
+ NAME AutomatedTesting::BlastTests
+ TEST_SUITE main
+ TEST_SERIAL TRUE
+ PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Active.py
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ COMPONENT Blast
+ )
+endif()
diff --git a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
index 7931aa7178..8142691464 100644
--- a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
@@ -15,372 +15,50 @@
ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME})
+include(${pal_dir}/PAL_traits_${PAL_PLATFORM_NAME_LOWERCASE}.cmake)
+
+## Asset pipeline ##
add_subdirectory(assetpipeline)
+
+## Atom Renderer ##
add_subdirectory(atom_renderer)
## Physics ##
-if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
- ly_add_pytest(
- NAME AutomatedTesting::PhysicsTests_Main
- TEST_SUITE main
- TEST_SERIAL
- PATH ${CMAKE_CURRENT_LIST_DIR}/physics/TestSuite_Main.py
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- Legacy::Editor
- AZ::AssetProcessor
- AutomatedTesting.Assets
- COMPONENT
- Physics
- )
- ly_add_pytest(
- NAME AutomatedTesting::PhysicsTests_Periodic
- TEST_SUITE periodic
- TEST_SERIAL
- PATH ${CMAKE_CURRENT_LIST_DIR}/physics/TestSuite_Periodic.py
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- Legacy::Editor
- AZ::AssetProcessor
- AutomatedTesting.Assets
- COMPONENT
- Physics
- )
- ly_add_pytest(
- NAME AutomatedTesting::PhysicsTests_Sandbox
- TEST_SUITE sandbox
- TEST_SERIAL
- PATH ${CMAKE_CURRENT_LIST_DIR}/physics/TestSuite_Sandbox.py
- TIMEOUT 3600
- RUNTIME_DEPENDENCIES
- Legacy::Editor
- AZ::AssetProcessor
- AutomatedTesting.Assets
- COMPONENT
- Physics
- )
-endif()
+add_subdirectory(physics)
## ScriptCanvas ##
-if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
- ly_add_pytest(
- NAME AutomatedTesting::ScriptCanvasTests
- TEST_SUITE periodic
- TEST_SERIAL
- PATH ${CMAKE_CURRENT_LIST_DIR}/scripting/TestSuite_Active.py
- TIMEOUT 3000
- RUNTIME_DEPENDENCIES
- Legacy::Editor
- AZ::AssetProcessor
- AutomatedTesting.Assets
- COMPONENT
- ScriptCanvas
- )
- ly_add_pytest(
- NAME AutomatedTesting::ScriptCanvasTests_Sandbox
- TEST_SUITE sandbox
- TEST_SERIAL
- PATH ${CMAKE_CURRENT_LIST_DIR}/scripting/TestSuite_Sandbox.py
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- Legacy::Editor
- AZ::AssetProcessor
- AutomatedTesting.Assets
- )
-endif()
+add_subdirectory(scripting)
## White Box ##
-if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
- ly_add_pytest(
- NAME AutomatedTesting::WhiteBoxTests
- TEST_SUITE main
- TEST_SERIAL
- PATH ${CMAKE_CURRENT_LIST_DIR}/WhiteBox/TestSuite_Active.py
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- Legacy::Editor
- AZ::AssetProcessor
- AutomatedTesting.Assets
- COMPONENT
- WhiteBox
- )
-endif()
+add_subdirectory(WhiteBox)
## NvCloth ##
-# [TODO LYN-1928] Enable when AutomatedTesting runs with Atom
-#if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
-# ly_add_pytest(
-# NAME AutomatedTesting::NvClothTests
-# TEST_SUITE main
-# TEST_SERIAL
-# PATH ${CMAKE_CURRENT_LIST_DIR}/NvCloth/TestSuite_Active.py
-# TIMEOUT 1500
-# RUNTIME_DEPENDENCIES
-# Legacy::Editor
-# AZ::AssetProcessor
-# AutomatedTesting.Assets
-# )
-#endif()
+add_subdirectory(NvCloth)
+
+## Prefab ##
+add_subdirectory(prefab)
## Editor Python Bindings ##
-if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
- ly_add_pytest(
- NAME AutomatedTesting::EditorPythonBindings
- TEST_SUITE sandbox
- TEST_SERIAL
- PATH ${CMAKE_CURRENT_LIST_DIR}/EditorPythonBindings
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- Legacy::Editor
- AZ::AssetProcessor
- AutomatedTesting.Assets
- Gem::EditorPythonBindings.Editor
- COMPONENT TestTools
- )
-endif()
+add_subdirectory(EditorPythonBindings)
## Python Asset Builder ##
-if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
- ly_add_pytest(
- NAME AutomatedTesting::PythonAssetBuilder
- TEST_SUITE periodic
- TEST_SERIAL
- PATH ${CMAKE_CURRENT_LIST_DIR}/PythonAssetBuilder
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- Legacy::Editor
- AZ::AssetProcessor
- AutomatedTesting.Assets
- Gem::EditorPythonBindings.Editor
- Gem::PythonAssetBuilder.Editor
- COMPONENT TestTools
- )
-endif()
+add_subdirectory(PythonAssetBuilder)
## Blast ##
-if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
- ly_add_pytest(
- NAME AutomatedTesting::BlastTests
- TEST_SUITE main
- TEST_SERIAL TRUE
- PATH ${CMAKE_CURRENT_LIST_DIR}/Blast/TestSuite_Active.py
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- Legacy::Editor
- AZ::AssetProcessor
- AutomatedTesting.Assets
- COMPONENT Blast
- )
-endif()
-
-#############
+add_subdirectory(Blast)
## Large Worlds ##
-
-include(${pal_dir}/PAL_traits_${PAL_PLATFORM_NAME_LOWERCASE}.cmake)
-if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_LARGE_WORLDS_TEST_SUPPORTED)
-
-## DynVeg ##
- # Temporarily moving all tests to periodic suite - SPEC-6553
- #ly_add_pytest(
- # NAME AutomatedTesting::DynamicVegetationTests_Main
- # TEST_SERIAL
- # TEST_SUITE main
- # PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/dyn_veg
- # PYTEST_MARKS "not SUITE_sandbox and not SUITE_periodic and not SUITE_benchmark"
- # TIMEOUT 1500
- # RUNTIME_DEPENDENCIES
- # AZ::AssetProcessor
- # Legacy::Editor
- # AutomatedTesting.GameLauncher
- # AutomatedTesting.Assets
- # COMPONENT
- # LargeWorlds
- #)
-
-
- ly_add_pytest(
- NAME AutomatedTesting::DynamicVegetationTests_Sandbox
- TEST_SERIAL
- TEST_SUITE sandbox
- PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/dyn_veg
- PYTEST_MARKS "SUITE_sandbox"
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- AZ::AssetProcessor
- Legacy::Editor
- AutomatedTesting.GameLauncher
- AutomatedTesting.Assets
- COMPONENT
- LargeWorlds
- )
-
- ly_add_pytest(
- NAME AutomatedTesting::DynamicVegetationFilterTests_Periodic
- TEST_SERIAL
- TEST_SUITE periodic
- PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/dyn_veg
- PYTEST_MARKS "SUITE_periodic and dynveg_filter"
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- AZ::AssetProcessor
- Legacy::Editor
- AutomatedTesting.Assets
- COMPONENT
- LargeWorlds
- )
-
- ly_add_pytest(
- NAME AutomatedTesting::DynamicVegetationModifierTests_Periodic
- TEST_SERIAL
- TEST_SUITE periodic
- PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/dyn_veg
- PYTEST_MARKS "SUITE_periodic and dynveg_modifier"
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- AZ::AssetProcessor
- Legacy::Editor
- AutomatedTesting.Assets
- COMPONENT
- LargeWorlds
- )
-
- ly_add_pytest(
- NAME AutomatedTesting::DynamicVegetationRegressionTests_Periodic
- TEST_SERIAL
- TEST_SUITE periodic
- PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/dyn_veg
- PYTEST_MARKS "SUITE_periodic and dynveg_regression"
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- AZ::AssetProcessor
- Legacy::Editor
- AutomatedTesting.Assets
- COMPONENT
- LargeWorlds
- )
-
- ly_add_pytest(
- NAME AutomatedTesting::DynamicVegetationAreaTests_Periodic
- TEST_SERIAL
- TEST_SUITE periodic
- PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/dyn_veg
- PYTEST_MARKS "SUITE_periodic and dynveg_area"
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- AZ::AssetProcessor
- Legacy::Editor
- AutomatedTesting.Assets
- COMPONENT
- LargeWorlds
- )
-
- ly_add_pytest(
- NAME AutomatedTesting::DynamicVegetationMiscTests_Periodic
- TEST_SERIAL
- TEST_SUITE periodic
- PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/dyn_veg
- PYTEST_MARKS "SUITE_periodic and dynveg_misc"
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- AZ::AssetProcessor
- Legacy::Editor
- AutomatedTesting.Assets
- COMPONENT
- LargeWorlds
- )
-
- ly_add_pytest(
- NAME AutomatedTesting::DynamicVegetationSurfaceTagTests_Periodic
- TEST_SERIAL
- TEST_SUITE periodic
- PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/dyn_veg
- PYTEST_MARKS "SUITE_periodic and dynveg_surfacetagemitter"
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- AZ::AssetProcessor
- Legacy::Editor
- AutomatedTesting.Assets
- COMPONENT
- LargeWorlds
- )
-## LandscapeCanvas ##
- # Temporarily moving all tests to periodic suite - SPEC-6553
- #ly_add_pytest(
- # NAME AutomatedTesting::LandscapeCanvasTests_Main
- # TEST_SERIAL
- # TEST_SUITE main
- # PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/landscape_canvas
- # PYTEST_MARKS "not SUITE_sandbox and not SUITE_periodic and not SUITE_benchmark"
- # TIMEOUT 1500
- # RUNTIME_DEPENDENCIES
- # AZ::AssetProcessor
- # Legacy::Editor
- # AutomatedTesting.Assets
- # COMPONENT
- # LargeWorlds
- #)
-
- ly_add_pytest(
- NAME AutomatedTesting::LandscapeCanvasTests_Periodic
- TEST_SERIAL
- TEST_SUITE periodic
- PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/landscape_canvas
- PYTEST_MARKS "SUITE_periodic"
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- AZ::AssetProcessor
- Legacy::Editor
- AutomatedTesting.Assets
- COMPONENT
- LargeWorlds
- )
-
-## GradientSignal ##
- ly_add_pytest(
- NAME AutomatedTesting::GradientSignalTests_Periodic
- TEST_SERIAL
- TEST_SUITE periodic
- PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/gradient_signal
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- AZ::AssetProcessor
- Legacy::Editor
- AutomatedTesting.Assets
- COMPONENT
- LargeWorlds
- )
-
-endif()
+add_subdirectory(largeworlds)
## Editor ##
-if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_FOUNDATION_TEST_SUPPORTED)
- ly_add_pytest(
- NAME AutomatedTesting::EditorTests_Periodic
- TEST_SUITE periodic
- TEST_SERIAL
- PATH ${CMAKE_CURRENT_LIST_DIR}/editor
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- Legacy::Editor
- AZ::AssetProcessor
- AutomatedTesting.Assets
- COMPONENT
- Editor
- )
-endif()
+add_subdirectory(editor)
-if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
- # Unstable, SPEC-3838 will restore
- #ly_add_pytest(
- # NAME AutomatedTesting::asset_load_benchmark_test
- # TEST_SERIAL
- # TEST_SUITE benchmark
- # PATH ${CMAKE_CURRENT_LIST_DIR}/streaming/benchmark/asset_load_benchmark_test.py
- # RUNTIME_DEPENDENCIES
- # AZ::AssetProcessor
- # AZ::AssetProcessorBatch
- # AutomatedTesting.GameLauncher
- #)
-endif()
+## Streaming ##
+add_subdirectory(streaming)
+## Smoke ##
+add_subdirectory(smoke)
+
+## AWS ##
+# Enable when AWS Gems work on Linux and Android.
+# add_subdirectory(AWS)
diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/CMakeLists.txt
new file mode 100644
index 0000000000..20a0ca8e65
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/CMakeLists.txt
@@ -0,0 +1,26 @@
+#
+# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+# its licensors.
+#
+# For complete copyright and license terms please see the LICENSE at the root of this
+# distribution (the "License"). All use of this software is governed by the License,
+# or, if provided, by the license below or the license accompanying this file. Do not
+# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
+ ly_add_pytest(
+ NAME AutomatedTesting::EditorPythonBindings
+ TEST_SUITE sandbox
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ Gem::EditorPythonBindings.Editor
+ COMPONENT TestTools
+ )
+endif()
diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_test_helper.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_test_helper.py
index 74f34659c0..d375e69ac2 100644
--- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_test_helper.py
+++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_test_helper.py
@@ -98,11 +98,6 @@ class EditorTestHelper:
self.test_success = False
success = False
- # Turn off any display info like FPS, as that will mess up our image comparisons
- # Turn off antialiasing as well
- general.run_console("r_displayInfo=0")
- general.run_console("r_antialiasingmode=0")
- general.idle_wait(1.0)
return success
# Test Teardown
diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_editor_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_editor_utils.py
index 05614296b1..2feab75464 100644
--- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_editor_utils.py
+++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_editor_utils.py
@@ -74,15 +74,23 @@ def add_component(componentName, entityId):
typeIdsList = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeIdsByEntityType', [componentName],
entity.EntityType().Game)
typeNamesList = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeNames', typeIdsList)
+
+ # If the type name comes back as empty, then it means componentName is invalid
+ if len(typeNamesList) != 1 or not typeNamesList[0]:
+ print('Unable to find component TypeId for {}'.format(componentName))
+ return None
+
componentOutcome = editor.EditorComponentAPIBus(bus.Broadcast, 'AddComponentsOfType', entityId, typeIdsList)
+ if not componentOutcome.IsSuccess():
+ print('Failed to add {} component to entity'.format(typeNamesList[0]))
+ return None
+
isActive = editor.EditorComponentAPIBus(bus.Broadcast, 'IsComponentEnabled', componentOutcome.GetValue()[0])
hasComponent = editor.EditorComponentAPIBus(bus.Broadcast, 'HasComponentOfType', entityId, typeIdsList[0])
- if componentOutcome.IsSuccess() and isActive:
+ if isActive:
print('{} component was added to entity'.format(typeNamesList[0]))
- elif componentOutcome.IsSuccess() and not isActive:
+ else:
print('{} component was added to entity, but the component is disabled'.format(typeNamesList[0]))
- elif not componentOutcome.IsSuccess():
- print('Failed to add {} component to entity'.format(typeNamesList[0]))
if hasComponent:
print('Entity has a {} component'.format(typeNamesList[0]))
return componentOutcome.GetValue()[0]
@@ -218,7 +226,8 @@ class Entity:
def add_component(self, component):
new_component = add_component(component, self.id)
- self.components.append(new_component)
+ if new_component:
+ self.components.append(new_component)
def add_component_of_type(self, componentTypeId):
new_component = add_component_of_type(componentTypeId, self.id)
diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_utils.py
index 10f060bba6..eed6a18614 100644
--- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_utils.py
+++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_utils.py
@@ -18,7 +18,6 @@ from PySide2 import QtCore, QtWidgets, QtGui, QtTest
from PySide2.QtWidgets import QAction, QWidget
from PySide2.QtCore import Qt
from PySide2.QtTest import QTest
-import azlmbr.legacy.general as general
import traceback
import threading
import types
diff --git a/AutomatedTesting/Gem/PythonTests/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh.py b/AutomatedTesting/Gem/PythonTests/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh.py
index 2677ba5605..5cfc57fd5f 100755
--- a/AutomatedTesting/Gem/PythonTests/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh.py
+++ b/AutomatedTesting/Gem/PythonTests/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh.py
@@ -11,7 +11,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# Test case ID : C18977329
# Test Case Title : Add cloth simulation to a Mesh
-# URL of the test case : https://testrail.agscollab.com/index.php?/cases/view/18977329
# fmt: off
class Tests:
@@ -20,7 +19,7 @@ class Tests:
exit_game_mode = ("Exited game mode", "Failed to exit game mode")
# fmt: on
-def run():
+def C18977329_NvCloth_AddClothSimulationToMesh():
"""
Summary:
Load level with Entity having Mesh and Cloth components already setup. Verify that editor remains stable in Game mode.
@@ -89,4 +88,7 @@ def run():
helper.close_editor()
if __name__ == "__main__":
- run()
+ import ImportPathHelper as imports
+ imports.init()
+ from editor_python_test_tools.utils import Report
+ Report.start_test(C18977329_NvCloth_AddClothSimulationToMesh)
diff --git a/AutomatedTesting/Gem/PythonTests/NvCloth/C18977330_NvCloth_AddClothSimulationToActor.py b/AutomatedTesting/Gem/PythonTests/NvCloth/C18977330_NvCloth_AddClothSimulationToActor.py
index 2d4fa4e325..c21df8ea4c 100755
--- a/AutomatedTesting/Gem/PythonTests/NvCloth/C18977330_NvCloth_AddClothSimulationToActor.py
+++ b/AutomatedTesting/Gem/PythonTests/NvCloth/C18977330_NvCloth_AddClothSimulationToActor.py
@@ -11,7 +11,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# Test case ID : C18977330
# Test Case Title : Add cloth simulation to an Actor
-# URL of the test case : https://testrail.agscollab.com/index.php?/cases/view/18977330
# fmt: off
class Tests:
@@ -20,7 +19,7 @@ class Tests:
exit_game_mode = ("Exited game mode", "Failed to exit game mode")
# fmt: on
-def run():
+def C18977330_NvCloth_AddClothSimulationToActor():
"""
Summary:
Load level with Entity having Actor and Cloth components already setup. Verify that editor remains stable in Game mode.
@@ -89,4 +88,7 @@ def run():
helper.close_editor()
if __name__ == "__main__":
- run()
+ import ImportPathHelper as imports
+ imports.init()
+ from editor_python_test_tools.utils import Report
+ Report.start_test(C18977330_NvCloth_AddClothSimulationToActor)
diff --git a/AutomatedTesting/Gem/PythonTests/NvCloth/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/NvCloth/CMakeLists.txt
new file mode 100644
index 0000000000..058cc9ad94
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/NvCloth/CMakeLists.txt
@@ -0,0 +1,26 @@
+#
+# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+# its licensors.
+#
+# For complete copyright and license terms please see the LICENSE at the root of this
+# distribution (the "License"). All use of this software is governed by the License,
+# or, if provided, by the license below or the license accompanying this file. Do not
+# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
+ ly_add_pytest(
+ NAME AutomatedTesting::NvClothTests_Main
+ TEST_SUITE main
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Active.py
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ COMPONENT
+ NvCloth
+ )
+endif()
diff --git a/AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Active.py b/AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Active.py
index 162c54afc8..86bfc48636 100755
--- a/AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Active.py
+++ b/AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Active.py
@@ -21,14 +21,15 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesti
from base import TestAutomationBase
-@pytest.mark.SUITE_main
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
@pytest.mark.parametrize("project", ["AutomatedTesting"])
class TestAutomation(TestAutomationBase):
+ @pytest.mark.xfail(reason="Running with atom null renderer is causing this test to fail")
def test_C18977329_NvCloth_AddClothSimulationToMesh(self, request, workspace, editor, launcher_platform):
from . import C18977329_NvCloth_AddClothSimulationToMesh as test_module
self._run_test(request, workspace, editor, test_module)
+ @pytest.mark.xfail(reason="Running with atom null renderer is causing this test to fail")
def test_C18977330_NvCloth_AddClothSimulationToActor(self, request, workspace, editor, launcher_platform):
from . import C18977330_NvCloth_AddClothSimulationToActor as test_module
self._run_test(request, workspace, editor, test_module)
diff --git a/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/AssetBuilder_test.py b/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/AssetBuilder_test.py
index 818dc23079..ecf08cfcbd 100644
--- a/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/AssetBuilder_test.py
+++ b/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/AssetBuilder_test.py
@@ -31,13 +31,13 @@ class TestPythonAssetProcessing(object):
unexpected_lines = []
expected_lines = [
'Mock asset exists',
- 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_z_positive_1.azmodel) found',
- 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_z_negative_1.azmodel) found',
- 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_y_positive_1.azmodel) found',
- 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_y_negative_1.azmodel) found',
- 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_x_positive_1.azmodel) found',
- 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_x_negative_1.azmodel) found',
- 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_center_1.azmodel) found'
+ 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_z_positive.azmodel) found',
+ 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_z_negative.azmodel) found',
+ 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_y_positive.azmodel) found',
+ 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_y_negative.azmodel) found',
+ 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_x_positive.azmodel) found',
+ 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_x_negative.azmodel) found',
+ 'Expected subId for asset (gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_center.azmodel) found'
]
timeout = 180
halt_on_unexpected = False
diff --git a/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/AssetBuilder_test_case.py b/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/AssetBuilder_test_case.py
index cd9adfdbcf..a7907778b2 100644
--- a/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/AssetBuilder_test_case.py
+++ b/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/AssetBuilder_test_case.py
@@ -38,16 +38,16 @@ def test_azmodel_product(generatedModelAssetPath, expectedSubId):
assetId = azlmbr.asset.AssetCatalogRequestBus(azlmbr.bus.Broadcast, 'GetAssetIdByPath', generatedModelAssetPath, azModelAssetType, False)
assetIdString = assetId.to_string()
if (assetIdString.endswith(':' + expectedSubId) is False):
- raise_and_stop(f'Asset has unexpected asset ID ({assetIdString}) for ({generatedModelAssetPath})!')
+ raise_and_stop(f'Asset at path {generatedModelAssetPath} has unexpected asset ID ({assetIdString}) for ({generatedModelAssetPath}), expected {expectedSubId}!')
else:
print(f'Expected subId for asset ({generatedModelAssetPath}) found')
-test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_z_positive_1.azmodel', '10315ae0')
-test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_z_negative_1.azmodel', '10661093')
-test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_y_positive_1.azmodel', '10af8810')
-test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_y_negative_1.azmodel', '10f8c263')
-test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_x_positive_1.azmodel', '100ac47f')
-test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_x_negative_1.azmodel', '105d8e0c')
-test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_center_1.azmodel', '1002d464')
+test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_z_positive.azmodel', '1024be55')
+test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_z_negative.azmodel', '1052c94e')
+test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_y_positive.azmodel', '10130556')
+test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_y_negative.azmodel', '1065724d')
+test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_x_positive.azmodel', '10d16e68')
+test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_x_negative.azmodel', '10a71973')
+test_azmodel_product('gem/pythontests/pythonassetbuilder/geom_group_fbx_cube_100cm_center.azmodel', '10412075')
azlmbr.editor.EditorToolsApplicationRequestBus(azlmbr.bus.Broadcast, 'ExitNoPrompt')
diff --git a/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/CMakeLists.txt
new file mode 100644
index 0000000000..0a550de539
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/PythonAssetBuilder/CMakeLists.txt
@@ -0,0 +1,27 @@
+#
+# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+# its licensors.
+#
+# For complete copyright and license terms please see the LICENSE at the root of this
+# distribution (the "License"). All use of this software is governed by the License,
+# or, if provided, by the license below or the license accompanying this file. Do not
+# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
+ ly_add_pytest(
+ NAME AutomatedTesting::PythonAssetBuilder
+ TEST_SUITE periodic
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ Gem::EditorPythonBindings.Editor
+ Gem::PythonAssetBuilder.Editor
+ COMPONENT TestTools
+ )
+endif()
diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798177_WhiteBox_AddComponentToEntity.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798177_WhiteBox_AddComponentToEntity.py
index dabc04575f..86a27e588e 100755
--- a/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798177_WhiteBox_AddComponentToEntity.py
+++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798177_WhiteBox_AddComponentToEntity.py
@@ -12,7 +12,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# Test case ID : C28798177
# Test Case Title : White Box Tool Component can be added to an Entity
-# URL of the test case : https://testrail.agscollab.com/index.php?/cases/view/28798177
# fmt:off
diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798205_WhiteBox_SetInvisible.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798205_WhiteBox_SetInvisible.py
index 18a5c3164e..7a2a08a8ce 100755
--- a/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798205_WhiteBox_SetInvisible.py
+++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798205_WhiteBox_SetInvisible.py
@@ -12,7 +12,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# Test case ID : C28798205
# Test Case Title : From the White Box Component Card the White Box Mesh can be set to be invisible in Game View
-# URL of the test case : https://testrail.agscollab.com/index.php?/cases/view/28798205
# fmt:off
diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/C29279329_WhiteBox_SetDefaultShape.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/C29279329_WhiteBox_SetDefaultShape.py
index e892285dde..635c804914 100755
--- a/AutomatedTesting/Gem/PythonTests/WhiteBox/C29279329_WhiteBox_SetDefaultShape.py
+++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/C29279329_WhiteBox_SetDefaultShape.py
@@ -12,7 +12,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# Test case ID : C29279329
# Test Case Title : White Box mesh shape can be changed with the Default Shape dropdown on the Component
-# URL of the test case : https://testrail.agscollab.com/index.php?/cases/view/29279329
# fmt:off
diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/WhiteBox/CMakeLists.txt
new file mode 100644
index 0000000000..a6c0a9aa21
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/CMakeLists.txt
@@ -0,0 +1,26 @@
+#
+# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+# its licensors.
+#
+# For complete copyright and license terms please see the LICENSE at the root of this
+# distribution (the "License"). All use of this software is governed by the License,
+# or, if provided, by the license below or the license accompanying this file. Do not
+# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
+ ly_add_pytest(
+ NAME AutomatedTesting::WhiteBoxTests
+ TEST_SUITE main
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Active.py
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ COMPONENT
+ WhiteBox
+ )
+endif()
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/assetpipeline/CMakeLists.txt
index 74ef6c97a7..f453a38486 100644
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/CMakeLists.txt
@@ -13,8 +13,6 @@ add_subdirectory(asset_processor_tests)
if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
## AP Python Tests ##
-
-
ly_add_pytest(
NAME AssetPipelineTests.AuxiliaryContent
PATH ${CMAKE_CURRENT_LIST_DIR}/auxiliary_content_tests/auxiliary_content_tests.py
@@ -22,7 +20,6 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
TEST_SUITE periodic
)
-
ly_add_pytest(
NAME AssetPipelineTests.BankInfoParser
PATH ${CMAKE_CURRENT_LIST_DIR}/wwise_bank_dependency_tests/bank_info_parser_tests.py
@@ -33,4 +30,3 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
)
endif()
-
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/ap_fixtures/ap_all_platforms_setup_fixture.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/ap_fixtures/ap_all_platforms_setup_fixture.py
index e729ee9882..9a5b93ca80 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/ap_fixtures/ap_all_platforms_setup_fixture.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/ap_fixtures/ap_all_platforms_setup_fixture.py
@@ -34,10 +34,10 @@ def ap_all_platforms_setup_fixture(request, workspace, ap_setup_fixture) -> Dict
# Specific platform cache locations
resources["pc_cache_location"] = os.path.join(cache_dir, "pc")
- resources["es3_cache_location"] = os.path.join(cache_dir, "es3")
+ resources["android_cache_location"] = os.path.join(cache_dir, "android")
resources["ios_cache_location"] = os.path.join(cache_dir, "ios")
- resources["osx_gl_cache_location"] = os.path.join(cache_dir, "osx_gl")
+ resources["mac_cache_location"] = os.path.join(cache_dir, "mac")
resources["provo_cache_location"] = os.path.join(cache_dir, "provo")
- resources["all_platforms"] = ["pc", "es3", "ios", "osx_gl", "provo"]
+ resources["all_platforms"] = ["pc", "android", "ios", "mac", "provo"]
return resources
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/ap_fixtures/bundler_batch_setup_fixture.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/ap_fixtures/bundler_batch_setup_fixture.py
index 580816e7b5..34af4d9115 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/ap_fixtures/bundler_batch_setup_fixture.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/ap_fixtures/bundler_batch_setup_fixture.py
@@ -54,7 +54,7 @@ def bundler_batch_setup_fixture(request, workspace, asset_processor, timeout) ->
platforms = [platform.strip() for platform in platforms.split(",")]
else:
# No commandline argument provided, default to mac and pc
- platforms = ["pc", "osx_gl"]
+ platforms = ["pc", "mac"]
class BundlerBatchFixture:
"""
@@ -162,7 +162,7 @@ def bundler_batch_setup_fixture(request, workspace, asset_processor, timeout) ->
else:
cmd.append(f"--{key}")
if append_defaults:
- cmd.append(f"--project={workspace.project}")
+ cmd.append(f"--project-path={workspace.project}")
return cmd
# ******
@@ -241,11 +241,11 @@ def bundler_batch_setup_fixture(request, workspace, asset_processor, timeout) ->
def get_platform_flag(self, platform_name: str) -> int:
if (platform_name == "pc"):
return 1
- elif (platform_name == "es3"):
+ elif (platform_name == "android"):
return 2
elif (platform_name == "ios"):
return 4
- elif (platform_name == "osx_gl"):
+ elif (platform_name == "mac"):
return 8
elif (platform_name == "server"):
return 128
@@ -300,9 +300,9 @@ def bundler_batch_setup_fixture(request, workspace, asset_processor, timeout) ->
workspace.paths.engine_root(),
"Code",
"Framework",
- "AzFramework",
- "AzFramework",
- "Platform",
+ "AzCore",
+ "AzCore",
+ "PlatformId",
"PlatformDefaults.h",
)
@@ -318,7 +318,7 @@ def bundler_batch_setup_fixture(request, workspace, asset_processor, timeout) ->
if start_gathering:
result = get_platform.match(line) # Try the regex
if result:
- platform_values[result.group(1).lower()] = counter
+ platform_values[result.group(1).replace("_ID", "").lower()] = counter
counter = counter << 1
elif "(Invalid, -1)" in line: # The line right before the first platform
start_gathering = True
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/CMakeLists.txt
index 6a865ee690..2e7516db27 100644
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/CMakeLists.txt
@@ -128,17 +128,5 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
RUNTIME_DEPENDENCIES
AZ::AssetProcessorBatch
)
-
-# Need performance improvements LYN-1218
-# ly_add_pytest(
-# NAME AssetPipelineTests.AssetRelocator
-# PATH ${CMAKE_CURRENT_LIST_DIR}/asset_relocator_tests.py
-# EXCLUDE_TEST_RUN_TARGET_FROM_IDE
-# TEST_SUITE periodic
-# TEST_SERIAL
-# RUNTIME_DEPENDENCIES
-# AZ::AssetProcessorBatch
-# )
endif()
-
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_builder_tests.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_builder_tests.py
index e3d52e8260..fb82f180c6 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_builder_tests.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_builder_tests.py
@@ -64,6 +64,15 @@ class TestsAssetBuilder_WindowsAndMac(object):
):
"""
Verifying -debug parameter for AssetBuilder
+
+ Test Steps:
+ 1. Create temporary workspace
+ 2. Launch Asset Processor GUI
+ 3. Add test assets to workspace
+ 4. Run Asset Builder with debug on an intact slice
+ 5. Check Asset Builder didn't fail to build
+ 6. Run Asset Builder with debug on a corrupted slice
+ 7. Verify corrupted slice produced an error
"""
env = ap_setup_fixture
intact_slice_failed = False
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_bundler_batch_tests.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_bundler_batch_tests.py
index d236e87aa2..e1091b9b82 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_bundler_batch_tests.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_bundler_batch_tests.py
@@ -80,6 +80,8 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
def test_WindowsAndMac_RunHelpCmd_ZeroExitCode(self, workspace, bundler_batch_helper):
"""
Simple calls to all AssetBundlerBatch --help to make sure a non-zero exit codes are returned.
+
+ Test will call each Asset Bundler Batch sub-command with help and will error on a non-0 exit code
"""
bundler_batch_helper.call_bundlerbatch(help="")
bundler_batch_helper.call_seeds(help="")
@@ -98,6 +100,12 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
r"""
Tests that an asset list created maps dependencies correctly.
testdependencieslevel\level.pak and lists of known dependencies are used for validation
+
+ Test Steps:
+ 1. Create an asset list from the level.pak
+ 2. Create Lists of expected assets in the level.pak
+ 3. Add lists of expected assets to a single list
+ 4. Compare list of expected assets to actual assets
"""
helper = bundler_batch_helper
@@ -300,9 +308,18 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
"""
Validates destructive overwriting for asset lists and
that generating debug information does not affect asset list creation
+
+ 1. Create an asset list from seed_list
+ 2. Validate asset list was created
+ 3. Read and store contents of asset list into memory
+ 4. Attempt to create a new asset list in without using --allowOverwrites
+ 5. Verify that Asset Bundler returns false
+ 6. Verify that file contents of the orignally created asset list did not change from what was stored in memory
+ 7. Attempt to create a new asset list without debug while allowing overwrites
+ 8. Verify that file contents of the orignally created asset list changed from what was stored in memory
"""
helper = bundler_batch_helper
- seed_list = os.path.join(workspace.paths.engine_root(), "Engine", "SeedAssetList.seed") # Engine seed list
+ seed_list = os.path.join(workspace.paths.engine_root(), "Assets", "Engine", "SeedAssetList.seed") # Engine seed list
asset = r"levels\testdependencieslevel\level.pak"
# Create Asset list
@@ -375,9 +392,17 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
"""
Validates bundle creation both through the 'bundles' and 'bundlesettings'
subcommands.
+
+ Test Steps:
+ 1. Create an asset list
+ 2. Create a bundle with the asset list and without a bundle settings file
+ 3. Create a bundle with the asset list and a bundle settings file
+ 4. Validate calling bundle doesn't perform destructive overwrite without --allowOverwrites
+ 5. Calling bundle again with --alowOverwrites performs destructive overwrite
+ 6. Validate contents of original bundle and overwritten bundle
"""
helper = bundler_batch_helper
- seed_list = os.path.join(workspace.paths.engine_root(), "Engine", "SeedAssetList.seed") # Engine seed list
+ seed_list = os.path.join(workspace.paths.engine_root(), "Assets", "Engine", "SeedAssetList.seed") # Engine seed list
asset = r"levels\testdependencieslevel\level.pak"
# Useful bundle locations / names (2 for comparing contents)
@@ -457,15 +482,25 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
"""
Creates bundles using the same asset list and compares that they are created equally. Also
validates that platform bundles exclude/include an expected file. (excluded for WIN, included for MAC)
+
+ Test Steps:
+ 1. Create an asset list
+ 2. Create bundles for both PC & Mac
+ 3. Validate that bundles were created
+ 4. Verify that expected missing file is not in windows bundle
+ 5. Verify that expected file is in the mac bundle
+ 6. Create duplicate bundles with allowOverwrites
+ 7. Verify that files were generated
+ 8. Verify original bundle checksums are equal to new bundle checksums
"""
helper = bundler_batch_helper
# fmt:off
- assert "pc" in helper["platforms"] and "osx_gl" in helper["platforms"], \
+ assert "pc" in helper["platforms"] and "mac" in helper["platforms"], \
"This test requires both PC and MAC platforms to be enabled. " \
- "Please rerun with commandline option: '--bundle_platforms=pc,osx_gl'"
+ "Please rerun with commandline option: '--bundle_platforms=pc,mac'"
# fmt:on
- seed_list = os.path.join(workspace.paths.engine_root(), "Engine", "SeedAssetList.seed") # Engine seed list
+ seed_list = os.path.join(workspace.paths.engine_root(), "Assets", "Engine", "SeedAssetList.seed") # Engine seed list
# Useful bundle / asset list locations
bundle_dir = os.path.dirname(helper["bundle_file"])
@@ -502,21 +537,21 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
for bundle_file in bundle_files.values():
assert os.path.isfile(bundle_file)
- # This asset is created on osx_gl platform but not on windows
- file_to_check = b"engineassets/shading/defaultprobe_cm.dds.5" # [use byte str because file is in binary]
+ # This asset is created both on mac and windows platform
+ file_to_check = b"engineassets/shading/defaultprobe_cm_ibldiffuse.tif.streamingimage" # [use byte str because file is in binary]
# Extract the delta catalog file from pc archive. {file_to_check} SHOULD NOT be present for PC
file_contents = helper.extract_file_content(bundle_files["pc"], "DeltaCatalog.xml")
# fmt:off
- assert file_to_check not in file_contents, \
+ assert file_to_check in file_contents, \
f"{file_to_check} was found in DeltaCatalog.xml in pc bundle file {bundle_files['pc']}"
# fmt:on
- # Extract the delta catalog file from osx_gl archive. {file_to_check} SHOULD be present for MAC
- file_contents = helper.extract_file_content(bundle_files["osx_gl"], "DeltaCatalog.xml")
+ # Extract the delta catalog file from mac archive. {file_to_check} SHOULD be present for MAC
+ file_contents = helper.extract_file_content(bundle_files["mac"], "DeltaCatalog.xml")
# fmt:off
assert file_to_check in file_contents, \
- f"{file_to_check} was not found in DeltaCatalog.xml in darwin bundle file {bundle_files['osx_gl']}"
+ f"{file_to_check} was not found in DeltaCatalog.xml in darwin bundle file {bundle_files['mac']}"
# fmt:on
# Gather checksums for first set of bundles
@@ -571,6 +606,24 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
"""
Validates that the 'seeds' subcommand can add and remove seeds and seed platforms properly.
Also checks that destructive overwrites require the --allowOverwrites flag
+
+ Test Steps:
+
+ 1. Create a PC Seed List from a test asset
+ 2. Validate that seed list was generated with proper platform flag
+ 3. Add Mac & PC as platforms to the seed list
+ 4. Verify that seed has both Mac & PC platform flags
+ 5. Remove Mac as a platform from the seed list
+ 6. Verify that seed only has PC as a platform flag
+ 7. Attempt to add a platform without using the --platform argument
+ 8. Verify that asset bundler returns False and file contents did not change
+ 9. Add Mac platform via --addPlatformToSeeds
+ 10. Validate that seed has both Mac & PC platform flags
+ 11. Attempt to remove platform without specifying a platform
+ 12. Validate that seed has both Mac & PC platform flags
+ 13. Validate that seed list contents did not change
+ 14. Remove seed
+ 15. Validate that seed was removed from the seed list
"""
helper = bundler_batch_helper
@@ -613,20 +666,20 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
helper.call_seeds(
seedListFile=helper["seed_list_file"],
addSeed=test_asset,
- platform="pc,osx_gl",
+ platform="pc,mac",
)
# Validate both mac and pc are activated for seed
# fmt:off
check_seed_platform(helper["seed_list_file"], test_asset,
- helper["platform_values"]["pc"] + helper["platform_values"]["osx"])
+ helper["platform_values"]["pc"] + helper["platform_values"]["mac"])
# fmt:on
# Remove MAC platform
helper.call_seeds(
seedListFile=helper["seed_list_file"],
removePlatformFromSeeds="",
- platform="osx_gl",
+ platform="mac",
)
# Validate only pc platform for seed. Save file contents to variable
all_lines = check_seed_platform(helper["seed_list_file"], test_asset, helper["platform_values"]["pc"])
@@ -646,12 +699,12 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
helper.call_seeds(
seedListFile=helper["seed_list_file"],
addPlatformToSeeds="",
- platform="osx_gl",
+ platform="mac",
)
# Validate Mac platform was added back on. Save file contents
# fmt:off
all_lines = check_seed_platform(helper["seed_list_file"], test_asset,
- helper["platform_values"]["pc"] + helper["platform_values"]["osx"])
+ helper["platform_values"]["pc"] + helper["platform_values"]["mac"])
# fmt:on
# Try to remove platform without specifying a platform to remove (should fail)
@@ -670,7 +723,7 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
helper.call_seeds(
seedListFile=helper["seed_list_file"],
removeSeed=test_asset,
- platform="pc,osx_gl",
+ platform="pc,mac",
)
# Validate seed was removed from file
@@ -692,14 +745,20 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
"""
Tests asset list comparison, both by file and by comparison type. Uses a set
of controlled test assets to compare resulting output asset lists
+
+ 1. Create comparison rules files
+ 2. Create seed files for different sets of test assets
+ 3. Create assetlist files for seed files
+ 4. Validate assetlists were created properly
+ 5. Compare using comparison rules files and just command line arguments
"""
helper = bundler_batch_helper
env = ap_setup_fixture
# fmt:off
- assert "pc" in helper["platforms"] and "osx_gl" in helper["platforms"], \
+ assert "pc" in helper["platforms"] and "mac" in helper["platforms"], \
"This test requires both PC and MAC platforms to be enabled. " \
- "Please rerun with commandline option: '--bundle_platforms=pc,osx_gl'"
+ "Please rerun with commandline option: '--bundle_platforms=pc,mac'"
# fmt:on
# Test assets arranged in common lists: six (0-5) .txt files and .dat files
@@ -717,16 +776,16 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
file_platforms = {
"txtfile_0.txt": "pc",
"txtfile_1.txt": "pc",
- "txtfile_2.txt": "pc,osx_gl",
- "txtfile_3.txt": "pc,osx_gl",
- "txtfile_4.txt": "osx_gl",
- "txtfile_5.txt": "osx_gl",
+ "txtfile_2.txt": "pc,mac",
+ "txtfile_3.txt": "pc,mac",
+ "txtfile_4.txt": "mac",
+ "txtfile_5.txt": "mac",
"datfile_0.dat": "pc",
"datfile_1.dat": "pc",
- "datfile_2.dat": "pc,osx_gl",
- "datfile_3.dat": "pc,osx_gl",
- "datfile_4.dat": "osx_gl",
- "datfile_5.dat": "osx_gl",
+ "datfile_2.dat": "pc,mac",
+ "datfile_3.dat": "pc,mac",
+ "datfile_4.dat": "mac",
+ "datfile_5.dat": "mac",
}
# Comparison rules files and their associated 'comparisonType' flags
@@ -741,7 +800,7 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
# Get our test assets ready and processed
utils.prepare_test_assets(env["tests_dir"], "C16877178", env["project_test_assets_dir"])
- asset_processor.batch_process(timeout=timeout, fastscan=False, platforms="pc,osx_gl")
+ asset_processor.batch_process(timeout=timeout, fastscan=False, platforms="pc,mac")
# *** Some helper functions *** #
@@ -759,7 +818,7 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
helper.call_assetLists(
assetListFile=os.path.join(helper["test_dir"], asset_list_file_name),
seedListFile=os.path.join(helper["test_dir"], seed_file_name),
- platform="pc,osx_gl",
+ platform="pc,mac",
)
def get_platform_assets(asset_name_list: List[str]) -> Dict[str, List[str]]:
@@ -769,7 +828,7 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
for asset_name in asset_name_list:
if "pc" in file_platforms[asset_name]:
win_assets.append(asset_name)
- if "osx_gl" in file_platforms[asset_name]:
+ if "mac" in file_platforms[asset_name]:
mac_assets.append(asset_name)
return {"win": win_assets, "mac": mac_assets}
@@ -798,7 +857,7 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
# Get platform result file names
win_asset_list_file = helper.platform_file_name(request_file, platforms["pc"])
- mac_asset_list_file = helper.platform_file_name(request_file, platforms["osx_gl"])
+ mac_asset_list_file = helper.platform_file_name(request_file, platforms["mac"])
# Get expected platforms for each asset in asset_names
platform_files = get_platform_assets(asset_names)
@@ -879,14 +938,14 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
# fmt:on
# End verify_asset_list_contents()
- def run_compare_command_and_verify(platform_arg: str, expect_pc_output: bool, expect_osx_gl_output: bool) -> None:
+ def run_compare_command_and_verify(platform_arg: str, expect_pc_output: bool, expect_mac_output: bool) -> None:
# Expected asset list to equal result of comparison
expected_pc_asset_list = None
- expected_osx_gl_asset_list = None
+ expected_mac_asset_list = None
# Last output file. Use this for comparison to 'expected'
output_pc_asset_list = None
- output_osx_gl_asset_list = None
+ output_mac_asset_list = None
# Add the platform to the file name to match what the Bundler will create
last_output_arg = output_arg.split(",")[-1]
@@ -895,10 +954,10 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
expected_pc_asset_list = os.path.join(helper["test_dir"], helper.platform_file_name(expected_asset_list, platform))
output_pc_asset_list = helper.platform_file_name(last_output_arg, platform)
- if expect_osx_gl_output:
- platform = platforms["osx_gl"]
- expected_osx_gl_asset_list = os.path.join(helper["test_dir"], helper.platform_file_name(expected_asset_list, platform))
- output_osx_gl_asset_list = helper.platform_file_name(last_output_arg, platform)
+ if expect_mac_output:
+ platform = platforms["mac"]
+ expected_mac_asset_list = os.path.join(helper["test_dir"], helper.platform_file_name(expected_asset_list, platform))
+ output_mac_asset_list = helper.platform_file_name(last_output_arg, platform)
# Build execution command
cmd = generate_compare_command(platform_arg)
@@ -911,15 +970,15 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
verify_asset_list_contents(expected_pc_asset_list, output_pc_asset_list)
fs.delete([output_pc_asset_list], True, True)
- if expect_osx_gl_output:
- verify_asset_list_contents(expected_osx_gl_asset_list, output_osx_gl_asset_list)
- fs.delete([output_osx_gl_asset_list], True, True)
+ if expect_mac_output:
+ verify_asset_list_contents(expected_mac_asset_list, output_mac_asset_list)
+ fs.delete([output_mac_asset_list], True, True)
# End run_compare_command_and_verify()
# Generate command, run and validate for each platform
run_compare_command_and_verify("pc", True, False)
- run_compare_command_and_verify("osx_gl", False, True)
- run_compare_command_and_verify("pc,osx_gl", True, True)
+ run_compare_command_and_verify("mac", False, True)
+ run_compare_command_and_verify("pc,mac", True, True)
#run_compare_command_and_verify(None, True, True)
# End compare_and_check()
@@ -1021,6 +1080,16 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
"""
Tests that assetlists are created equivalent to the output while being created, and
makes sure overwriting an existing file without the --allowOverwrites fails
+
+ Test Steps:
+ 1. Check that Asset List creation requires PC platform flag
+ 2. Create a PC Asset List using asset info file and default seed lists using --print
+ 3. Validate all assets output are present in the asset list
+ 4. Create a seed file
+ 5. Attempt to overwrite Asset List without using --allowOverwrites
+ 6. Validate that command returned an error and file contents did not change
+ 7. Specifying platform but not "add" or "remove" should fail
+ 8. Verify file Has changed
"""
helper = bundler_batch_helper
@@ -1046,7 +1115,7 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
"--addDefaultSeedListFiles",
"--platform=pc",
"--print",
- f"--project={workspace.project}"
+ f"--project-path={workspace.project}"
],
universal_newlines=True,
)
@@ -1102,7 +1171,16 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
def test_WindowsAndMac_AP_BundleProcessing_BundleProcessedAtRuntime(self, workspace, bundler_batch_helper,
asset_processor, request):
# fmt:on
- """Test to make sure the AP GUI will process a newly created bundle file"""
+ """
+ Test to make sure the AP GUI will process a newly created bundle file
+
+ Test Steps:
+ 1. Make asset list file (used for bundle creation)
+ 2. Start Asset Processor GUI
+ 3. Make bundle in /Bundles
+ 4. Validate file was created in Bundles folder
+ 5. Make sure bundle now exists in cache
+ """
# Set up helpers and variables
helper = bundler_batch_helper
@@ -1115,7 +1193,7 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
bundle_result_path = os.path.join(bundles_folder,
helper.platform_file_name("bundle.pak", workspace.asset_processor_platform))
- bundle_cache_path = os.path.join(workspace.paths.platform_cache(), workspace.project,
+ bundle_cache_path = os.path.join(workspace.paths.platform_cache(),
"Bundles",
helper.platform_file_name("bundle.pak", workspace.asset_processor_platform))
@@ -1131,6 +1209,8 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
addSeed=level_pak,
assetListFile=helper["asset_info_file_request"],
)
+
+ # Run Asset Processor GUI
result, _ = asset_processor.gui_process()
assert result, "AP GUI failed"
@@ -1155,14 +1235,22 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
@pytest.mark.assetpipeline
# fmt:off
def test_WindowsAndMac_FilesMarkedSkip_FilesAreSkipped(self, workspace, bundler_batch_helper):
+ """
+ Test Steps:
+ 1. Create an asset list with a file marked as skip
+ 2. Verify file was created
+ 3. Verify that only the expected assets are present in the created asset list
+ """
expected_assets = [
- "libs/particles/milestone2particles.xml",
- "textures/milestone2/particles/fx_sparkstreak_01.dds"
+ "ui/canvases/lyshineexamples/animation/multiplesequences.uicanvas",
+ "ui/textures/prefab/button_normal.sprite"
]
bundler_batch_helper.call_assetLists(
assetListFile=bundler_batch_helper['asset_info_file_request'],
- addSeed="libs/particles/milestone2particles.xml",
- skip="textures/milestone2/particles/fx_launchermuzzlering_01.dds,textures/milestone2/particles/fx_launchermuzzlefront_01.dds"
+ addSeed="ui/canvases/lyshineexamples/animation/multiplesequences.uicanvas",
+ skip="ui/textures/prefab/button_disabled.sprite,ui/scripts/lyshineexamples/animation/multiplesequences.luac,"
+ "ui/textures/prefab/tooltip_sliced.sprite,ui/scripts/lyshineexamples/unloadthiscanvasbutton.luac,fonts/vera.fontfamily,fonts/vera-italic.font,"
+ "fonts/vera.font,fonts/vera-bold.font,fonts/vera-bold-italic.font,fonts/vera-italic.ttf,fonts/vera.ttf,fonts/vera-bold.ttf,fonts/vera-bold-italic.ttf"
)
assert os.path.isfile(bundler_batch_helper["asset_info_file_result"])
assets_in_list = []
@@ -1176,6 +1264,12 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
# fmt:off
def test_WindowsAndMac_AssetListSkipOneOfTwoParents_SharedDependencyIsIncluded(self, workspace,
bundler_batch_helper):
+ """
+ Test Steps:
+ 1. Create Asset List with a parent asset that is skipped
+ 2. Verify that Asset List was created
+ 3. Verify that only the expected assets are present in the asset list
+ """
expected_assets = [
"testassets/bundlerskiptest_grandparent.dynamicslice",
"testassets/bundlerskiptest_parenta.dynamicslice",
@@ -1204,6 +1298,13 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
@pytest.mark.assetpipeline
# fmt:off
def test_WindowsAndMac_AssetLists_SkipRoot_ExcludesAll(self, workspace, bundler_batch_helper):
+ """
+ Negative scenario test that skips the same file being used as the parent seed.
+
+ Test Steps:
+ 1. Create an asset list that skips the root asset
+ 2. Verify that asset list was not generated
+ """
result, _ = bundler_batch_helper.call_assetLists(
assetListFile=bundler_batch_helper['asset_info_file_request'],
@@ -1220,6 +1321,13 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
@pytest.mark.assetpipeline
# fmt:off
def test_WindowsAndMac_AssetLists_SkipUniversalWildcard_ExcludesAll(self, workspace, bundler_batch_helper):
+ """
+ Negative scenario test that uses the all wildcard when generating an asset list.
+
+ Test Steps:
+ 1. Create an Asset List while using the universal all wildcard "*"
+ 2. Verify that asset list was not generated
+ """
result, _ = bundler_batch_helper.call_assetLists(
assetListFile=bundler_batch_helper['asset_info_file_request'],
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_batch_dependency_tests.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_batch_dependency_tests.py
index e329846554..0c6924f3a2 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_batch_dependency_tests.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_batch_dependency_tests.py
@@ -67,7 +67,19 @@ class TestsAssetProcessorBatch_DependenycyTests(object):
libs/materialeffects/surfacetypes.xml is listed as an entry engine_dependencies.xml
libs/materialeffects/surfacetypes.xml is not listed as a missing dependency
in the 'assetprocessorbatch' console output
+
+ Test Steps:
+ 1. Assets are pre-processed
+ 2. Verify that engine_dependencies.xml exists
+ 3. Verify engine_dependencies.xml has surfacetypes.xml present
+ 4. Run Missing Dependency scanner against the engine_dependenciese.xml
+ 5. Verify that Surfacetypes.xml is NOT in the missing depdencies output
+ 6. Add the schema file which allows our xml parser to understand dependencies for our engine_dependencies file
+ 7. Process assets
+ 8. Run Missing Dependency scanner against the engine_dependenciese.xml
+ 9. Verify that surfacetypes.xml is in the missing dependencies out
"""
+
env = ap_setup_fixture
BATCH_LOG_PATH = env["ap_batch_log_file"]
asset_processor.create_temp_asset_root()
@@ -137,6 +149,11 @@ class TestsAssetProcessorBatch_DependenycyTests(object):
def test_WindowsMacPlatforms_BatchCheckSchema_ValidateErrorChecking(self, workspace, asset_processor,
ap_setup_fixture, folder, schema):
# fmt:on
+ """
+ Test Steps:
+ 1. Run the Missing Dependency Scanner against everything
+ 2. Verify that there are no missing dependencies.
+ """
env = ap_setup_fixture
def missing_dependency_log_lines(log) -> [str]:
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_batch_dependency_tests2.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_batch_dependency_tests2.py
index 4f33e0df4e..f184ff2392 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_batch_dependency_tests2.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_batch_dependency_tests2.py
@@ -60,6 +60,15 @@ class TestsAssetProcessorBatch_DependenycyTests(object):
Verify that Schemas can be loaded via Gems utilizing the fonts schema
:returns: None
+
+ Test Steps:
+ 1. Run Missing Dependency Scanner against %fonts%.xml when no fonts are present
+ 2. Verify fonts are scanned
+ 3. Verify that missing dependencies are found for fonts
+ 4. Add fonts to game project
+ 5. Run Missing Dependency Scanner against %fonts%.xml when fonts are present
+ 6. Verify that same amount of fonts are scanned
+ 7. Verify that there are no missing dependencies.
"""
schema_name = "Font.xmlschema"
asset_processor.create_temp_asset_root()
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_batch_tests.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_batch_tests.py
index 50b3af1438..3efd9e7fce 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_batch_tests.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_batch_tests.py
@@ -100,9 +100,17 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
@pytest.mark.BAT
@pytest.mark.assetpipeline
def test_RunAPBatch_TwoPlatforms_ExitCodeZero(self, asset_processor):
+ """
+ Tests Process assets for PC & Mac and verifies that processing exited without error
+
+ Test Steps:
+ 1. Add Mac and PC as enabled platforms
+ 2. Process Assets
+ 3. Validate that AP exited cleanly
+ """
asset_processor.create_temp_asset_root()
asset_processor.enable_asset_processor_platform("pc")
- asset_processor.enable_asset_processor_platform("osx_gl")
+ asset_processor.enable_asset_processor_platform("mac")
result, _ = asset_processor.batch_process()
assert result, "AP Batch failed"
@@ -111,6 +119,14 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
@pytest.mark.assetpipeline
@pytest.mark.test_case_id('C1571826')
def test_RunAPBatch_OnlyIncludeInvalidAssets_NoAssetsAdded(self, asset_processor, ap_setup_fixture):
+ """
+ Tests processing invalid assets and validating that no assets were moved to the cache
+
+ Test Steps:
+ 1. Create a test environment with invalid assets
+ 2. Run asset processor
+ 3. Validate that no assets were found in the cache
+ """
asset_processor.prepare_test_environment(ap_setup_fixture["tests_dir"], "test_ProcessAssets_OnlyIncludeInvalidAssets_NoAssetsAdded")
result, _ = asset_processor.batch_process()
@@ -127,6 +143,16 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
"recognized as failing in the logs. There appears to be a window where the AutoFailJob doesn't complete"
"before the shutdown completes and the failure doesn't end up counting")
def test_ProcessAssets_IncludeTwoAssetsWithSameProduct_FailingOnSecondAsset(self, asset_processor, ap_setup_fixture):
+ """
+ Tests processing two source assets with the same product file and validates that the second source will error
+
+ Test Steps:
+ 1. Create a test environment that has two source files with the same product
+ 2. Run asset processor
+ 3. Validate that 1 asset failed to process
+ 4. Validate that only one product file with the expected name is found in the cache
+ """
+
asset_processor.prepare_test_environment(ap_setup_fixture["tests_dir"], "test_ProcessAssets_IncludeTwoAssetsWithSameProduct_FailingOnSecondAsset")
result, output = asset_processor.batch_process(capture_output = True, expect_failure = True)
@@ -143,6 +169,17 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
@pytest.mark.assetpipeline
@pytest.mark.test_case_id('C1587615')
def test_ProcessAndDeleteCache_APBatchShouldReprocess(self, asset_processor, ap_setup_fixture):
+ """
+ Tests processing once, deleting the generated cache, then processing again and validates the cache is created
+
+ Test Steps:
+ 1. Run asset processor
+ 2. Compare the cache with expected output
+ 3. Delete Cache
+ 4. Compare the cache with expected output to verify that cache is gone
+ 5. Run asset processor with fastscan disabled
+ 6. Compare the cache with expected output
+ """
# Deleting assets from Cache will make them re-processed in AP (after start)
# Copying test assets to project folder and deleting them from cache to make sure APBatch will process them
@@ -174,6 +211,18 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
@pytest.mark.assetpipeline
@pytest.mark.test_case_id('C1591564')
def test_ProcessAndChangeSource_APBatchShouldReprocess(self, asset_processor, ap_setup_fixture):
+ """
+ Tests reprocessing of a modified asset and verifies that it was reprocessed
+
+ Test Steps:
+ 1. Prepare test environment and copy test asset over
+ 2. Run asset processor
+ 3. Verify asset processed
+ 4. Verify asset is in cache
+ 4. Modify asset
+ 5. Re-run asset processor
+ 6. Verify asset was processed
+ """
# AP Batch Processing changed files (after start)
# Copying test assets to project folder and deleting them from cache to make sure APBatch will process them
@@ -208,6 +257,18 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
@pytest.mark.BAT
@pytest.mark.assetpipeline
def test_ProcessByBothApAndBatch_Md5ShouldMatch(self, asset_processor, ap_setup_fixture):
+ """
+ Tests that a cache generated by AP GUI is the same as AP Batch
+
+ Test Steps:
+ 1. Create test environment with test assets
+ 2. Call asset processor batch
+ 3. Get checksum for file cache
+ 4. Clean up test environment
+ 5. Call asset processor gui with quitonidle
+ 6. Get checksum for file cache
+ 7. Verify that checksums are equal
+ """
# AP Batch and AP app processed assets MD5 sums should be the same
# Copying test assets to project folder and deleting them from cache to make sure APBatch will process them
@@ -240,6 +301,16 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
@pytest.mark.assetpipeline
@pytest.mark.test_case_id('C1612446')
def test_AddSameAssetsDifferentNames_ShouldProcess(self, asset_processor, ap_setup_fixture):
+ """
+ Tests Asset Processing of duplicate assets with different names and verifies that both assets are processed
+
+ Test Steps:
+ 1. Create test environment with two identical source assets with different names
+ 2. Run asset processor
+ 3. Verify that assets didn't fail to process
+ 4. Verify the correct number of jobs were performed
+ 5. Verify that product files are in the cache
+ """
# Feed two similar slices and texture with different names - should process without any issues
# Copying test assets to project folder and deleting them from cache to make sure APBatch will process them
@@ -277,6 +348,19 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
"recognized as failing in the logs. There appears to be a window where the AutoFailJob doesn't complete"
"before the shutdown completes and the failure doesn't end up counting")
def test_AddTwoTexturesWithSameName_ShouldProcessAfterRename(self, asset_processor, ap_setup_fixture):
+ """
+ Tests processing of two textures with the same name then verifies that AP will successfully process after
+ renaming one of the textures
+
+ Test Steps:
+ 1. Create test environment with two textures that have the same name
+ 2. Launch Asset Processor
+ 3. Validate that Asset Processor generates an error
+ 4. Rename texture files
+ 5. Run asset processor
+ 6. Verify that asset processor does not error
+ 7. Verify that expected product files are in the cache
+ """
# Feed two different textures with same name (but different extensions) - ap will fail
# Rename one of textures and failure should go away
@@ -312,6 +396,15 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
@pytest.mark.BAT
@pytest.mark.assetpipeline
def test_InvalidServerAddress_Warning_Logs(self, asset_processor):
+ """
+ Tests running Asset Processor with an invalid server address and verifies that AP returns a warning about
+ an invalid server address
+
+ Test Steps:
+ 1. Launch asset processor while providing an invalid server address
+ 2. Verify asset processor does not fail
+ 3. Verify that asset processor generated a warning informing the user about an invalid server address
+ """
asset_processor.create_temp_asset_root()
# Launching AP and making sure that the warning exists
@@ -327,6 +420,12 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
def test_AllSupportedPlatforms_IncludeValidAssets_AssetsProcessed(self, asset_processor, ap_setup_fixture):
"""
AssetProcessorBatch is successfully processing newly added assets
+
+ Test Steps:
+ 1. Create a test environment with test assets
+ 2. Launch Asset Processor
+ 3. Verify that asset processor does not fail to process
+ 4. Verify assets are not missing from the cache
"""
env = ap_setup_fixture
@@ -350,6 +449,14 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
def test_AllSupportedPlatforms_DeletedAssets_DeletedFromCache(self, asset_processor, ap_setup_fixture):
"""
AssetProcessor successfully deletes cached items when removed from project
+
+ Test Steps:
+ 1. Create a test environment with test assets
+ 2. Run asset processor
+ 3. Verify expected assets are in the cache
+ 4. Delete test assets
+ 5. Run asset processor
+ 6. Verify expected assets are in the cache
"""
env = ap_setup_fixture
@@ -385,6 +492,10 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
"""
Tests that when cache is deleted (no cache) and AssetProcessorBatch runs,
it successfully starts and processes assets.
+
+ Test Steps:
+ 1. Run asset processor
+ 2. Verify asset processor exits cleanly
"""
asset_processor.create_temp_asset_root()
@@ -402,6 +513,14 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
# fmt:on
"""
AssetProcessor successfully recovers assets from cache when deleted.
+
+ Test Steps:
+ 1. Create test enviornment with test assets
+ 2. Run Asset Processor and verify it exits cleanly
+ 3. Make sure cache folder was generated
+ 4. Delete temp cache assets but leave database behind
+ 5. Run asset processor and verify it exits cleanly
+ 6. Verify expected files were generated in the cache
"""
env = ap_setup_fixture
@@ -434,6 +553,14 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
@pytest.mark.assetpipeline
# fmt:off
def test_AllSupportedPlatforms_RunFastScanOnEmptyCache_FullScanRuns(self, ap_setup_fixture, asset_processor):
+ """
+ Tests fast scan processing on an empty cache and verifies that a full analyis will be peformed
+
+ Test Steps:
+ 1. Create a test environment
+ 2. Execute asset processor batch with fast scan enabled
+ 3. Verify that a full analysis is performed
+ """
# fmt:on
env = ap_setup_fixture
asset_processor.create_temp_asset_root()
@@ -455,6 +582,11 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
"""
After running the APBatch and AP GUI, Logs directory should exist (C1564055),
JobLogs, Batch log, and GUI log should exist in the logs directory (C1564056)
+
+ Test Steps:
+ 1. Run asset processor batch
+ 2. Run asset processor gui with quit on idle
+ 3. Verify that logs exist for both AP Batch & AP GUI
"""
asset_processor.create_temp_asset_root()
LOG_PATH = {
@@ -536,6 +668,11 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
"""
Utilizing corrupted test assets, run the batch process to verify the
AP logs the failure to process the corrupted file.
+
+ Test Steps:
+ 1. Create test environment with corrupted slice
+ 2. Launch Asset Processor
+ 3. Verify that asset processor fails to process corrupted slice
"""
env = ap_setup_fixture
error_line_found = False
@@ -552,6 +689,15 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
@pytest.mark.BAT
@pytest.mark.assetpipeline
def test_validateDirectPreloadDependency_Found(self, asset_processor, ap_setup_fixture, workspace):
+ """
+ Tests processing an asset with a circular dependency and verifies that Asset Processor will return an error
+ notifying the user about a circular dependency.
+
+ Test Steps:
+ 1. Create test environment with an asset that has a circular dependency
+ 2. Launch asset processor
+ 3. Verify that error is returned informing the user that the asset has a circular dependency
+ """
env = ap_setup_fixture
error_line_found = False
@@ -567,6 +713,15 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
@pytest.mark.BAT
@pytest.mark.assetpipeline
def test_validateNestedPreloadDependency_Found(self, asset_processor, ap_setup_fixture, workspace):
+ """
+ Tests processing of a nested circular dependency and verifies that Asset Processor will return an error
+ notifying the user about a circular depdency
+
+ Test Steps:
+ 1. Create test environment with an asset that has a nested circular dependency
+ 2. Launch asset processor
+ 3. Verify that error is returned informing the user that the asset has a circular dependency
+ """
env = ap_setup_fixture
error_line_found = False
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_batch_tests_2.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_batch_tests_2.py
index 5c42af2139..fec5df8eb7 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_batch_tests_2.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_batch_tests_2.py
@@ -80,6 +80,15 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
# fmt:on
"""
Tests that fast scan mode can be used and is faster than full scan mode.
+
+ Test Steps:
+ 1. Ensure all assets are processed
+ 2. Run Asset Processor without fast scan and measure the time it takes to run
+ 3. Capture Full Analysis was performed and number of assets processed
+ 4. Run Asset Processor with full scan and measure the time it takes to run
+ 5. Capture Full Analysis wans't performed and number of assets processed
+ 6. Verify that fast scan was faster than full scan
+ 7. Verify that full scan scanned more assets
"""
asset_processor.create_temp_asset_root()
@@ -111,76 +120,23 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
assert full_scan_time > fast_scan_time, "Fast scan was slower that full scan"
assert full_scan_analysis[0] > fast_scan_analysis[0], "Full scan did not process more assets than fast scan"
- @pytest.mark.test_case_id("C18787404")
- @pytest.mark.BAT
- @pytest.mark.assetpipeline
- @pytest.mark.skip(reason="External project is currently broken.") # LY-119863
- def test_AllSupportedPlatforms_ExternalProject_APRuns(self, workspace, ap_external_project_setup_fixture):
-
- external_resources = ap_external_project_setup_fixture
- logger.info(f"Running external project test at path {external_resources['project_dir']}")
- # Delete existing "external project" build if it exists
- if os.path.exists(external_resources["project_dir"]):
- fs.delete([external_resources["project_dir"]], True, True)
-
- # fmt:off
- assert not os.path.exists(external_resources["project_dir"]), \
- f'{external_resources["project_dir"]} was not deleted'
- # fmt:on
-
- lmbr_cmd = [
- workspace.paths.lmbr(),
- "projects",
- "create",
- external_resources["project_name"],
- "--template",
- "EmptyTemplate",
- "--app-root",
- external_resources["project_dir"],
- ]
-
- logger.info(f"Running lmbr projects create command '{lmbr_cmd}'")
-
- try:
- subprocess.check_call(lmbr_cmd)
- except subprocess.CalledProcessError as e:
- assert False, f"lmbr projects create failed\n{e.stderr}"
-
- logger.info("...lmbr finished")
- assert os.path.exists(external_resources["project_dir"]), "Project folder was not created"
-
- # AssetProcessor for new External project. Uses mock workspace to emulate external project workspace
- external_ap = AssetProcessor(external_resources["external_workspace"])
-
- # fmt:off
- assert external_ap.batch_process(fastscan=False), \
- "Asset Processor Batch failed on external project"
- # fmt:on
-
- # Parse log looking for errors or failures
- log = APLogParser(workspace.paths.ap_batch_log())
- failures, errors = log.runs[-1]["Failures"], log.runs[-1]["Errors"]
- assert failures == 0, f"There were {failures} asset processing failures"
- assert errors == 0, f"There were {errors} asset processing errors"
-
- # Check that project cache was created (DNE until AP makes it)
- project_cache = os.path.join(external_resources["project_dir"], "Cache")
- assert os.path.exists(project_cache), f"{project_cache} was not created by AP"
-
- # Clean up external project
- fs.delete([external_resources["project_dir"]], True, True)
-
- # fmt:off
- assert not os.path.exists(external_resources["project_dir"]), \
- f"{external_resources['project_dir']} was not deleted"
- # fmt:on
-
@pytest.mark.test_case_id("C4874121")
@pytest.mark.BAT
@pytest.mark.assetpipeline
@pytest.mark.parametrize("clear_type", ["rewrite", "delete_asset", "delete_dir"])
def test_AllSupportedPlatforms_DeleteBadAssets_BatchFailedJobsCleared(
self, workspace, request, ap_setup_fixture, asset_processor, clear_type):
+ """
+ Tests the ability of Asset Processor to recover from processing of bad assets by removing them from scan folder
+
+ Test Steps:
+ 1. Create testing environment with good and multiple bad assets
+ 2. Run Asset Processor
+ 3. Verify that bad assets fail to process
+ 4. Fix a bad asset & delete the others
+ 5. Run Asset Processor
+ 6. Verify Asset Processor does not have any asset failues
+ """
env = ap_setup_fixture
error_search_terms = ["WWWWWWWWWWWW"]
@@ -250,6 +206,14 @@ class TestsAssetProcessorBatch_Windows(object):
Verify the AP batch and Gui can run and process assets independent of the Editor
We do not want or need to kill running Editors here as they can be involved in other tests
or simply being run locally in this branch or another
+
+ Test Steps:
+ 1. Create temporary testing environment
+ 2. Run asset processor GUI
+ 3. Verify AP GUI doesn't error
+ 4. Stop AP GUI
+ 5. Run Asset Processor Batch with Fast Scan
+ 5. Verify Asset Processor Batch exits cleanly
"""
asset_processor.create_temp_asset_root()
@@ -272,6 +236,11 @@ class TestsAssetProcessorBatch_Windows(object):
"""
Request a run for an invalid platform
"AssetProcessor: Error: Platform in config file or command line 'notaplatform'" should be present in the logs
+
+ Test Steps:
+ 1. Create temporary testing environment
+ 2. Run Asset Processor with an invalid platform
+ 3. Check that asset processor returns an Error notifying the user that the invalid platform is not supported
"""
asset_processor.create_temp_asset_root()
error_search_terms = 'AssetProcessor: Error: The list of enabled platforms in the settings registry does not contain platform ' \
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_gui_tests.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_gui_tests.py
index ed5651755c..88fa1a77b4 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_gui_tests.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_gui_tests.py
@@ -77,6 +77,13 @@ class TestsAssetProcessorGUI_Windows(object):
def test_SendInputOnControlChannel_ReceivedAndResponded(self, asset_processor):
"""
Test that the control channel connects and that communication works both directions
+
+ Test Steps:
+ 1. Start Asset Processor
+ 2. Send a Ping message to Asset Processor
+ 3. Listen for Asset Processor response
+ 4. Verify Asset Processor responds
+ 5. Stop asset Processor
"""
asset_processor.create_temp_asset_root()
@@ -129,7 +136,15 @@ class TestsAssetProcessorGUI_Windows(object):
# fmt:on
"""
Asset Processor Deletes processed assets when source is removed from project folder (while running)
+
+ Test Steps:
+ 1. Create a temporary test environment
+ 2. Run Asset Processor GUI set to stay open on idle and verify that it does not fail
+ 3. Verify that assets were copied to the cache
+ 4. Delete the source test asset directory
+ 5. Verify assets are deleted from the cache
"""
+
env = ap_setup_fixture
# Copy test assets to project folder and verify test assets folder exists
@@ -170,7 +185,18 @@ class TestsAssetProcessorGUI_Windows(object):
# fmt:on
"""
Processing changed files (while running)
+
+ Test Steps:
+ 1. Create temporary test environment with test assets
+ 2. Open Asset Processor GUI with set to stay open after idle and verify it does not fail
+ 3. Verify contents of source asset for later comparison
+ 4. Verify contents of product asset for later comparison
+ 5. Modify contents of source asset
+ 6. Wait for Asset Processor to go back to idle state
+ 7. Verify contents of source asset are the modified version
+ 8. Verify contents of product asset are the modified version
"""
+
env = ap_setup_fixture
# Copy test assets to project folder and verify test assets folder exists
@@ -184,7 +210,7 @@ class TestsAssetProcessorGUI_Windows(object):
result, _ = asset_processor.gui_process(quitonidle=False)
assert result, "AP GUI failed"
- # Verify contents of test asset in project folder before modication
+ # Verify contents of test asset in project folder before modification
with open(project_asset_path, "r") as project_asset_file:
assert project_asset_file.read() == "before_state"
@@ -217,7 +243,14 @@ class TestsAssetProcessorGUI_Windows(object):
def test_WindowsPlatforms_RunAP_ProcessesIdle(self, asset_processor):
"""
Asset Processor goes idle
+
+ Test Steps:
+ 1. Create a temporary testing evnironment
+ 2. Run Asset Processor GUI without quitonidle
+ 3. Verify AP Goes Idle
+ 4. Verify AP goes below 1% CPU usage
"""
+
CPU_USAGE_THRESHOLD = 1.0 # CPU usage percentage delimiting idle from active
CPU_USAGE_WIND_DOWN = 10 # Time allowed in seconds for idle processes to stop using CPU
@@ -245,7 +278,16 @@ class TestsAssetProcessorGUI_Windows(object):
):
"""
Processing newly added files to project folder (while running)
+
+ Test Steps:
+ 1. Create a temporary testing environment with test assets
+ 2. Create a secondary set of testing assets that have not been copied into the the testing environment
+ 3. Start Asset Processor without quitonidle
+ 4. While Asset Processor is running add secondary set of testing assets to the testing environment
+ 5. Wait for Asset Processor to go idle
+ 6. Verify that all assets are in the cache
"""
+
env = ap_setup_fixture
level_name = "C1564064_level"
new_asset = "C1564064.scriptcanvas"
@@ -316,7 +358,14 @@ class TestsAssetProcessorGUI_Windows(object):
def test_WindowsPlatforms_LaunchAP_LogReportsIdle(self, asset_processor, workspace, ap_idle):
"""
Asset Processor creates a log entry when it goes idle
+
+ Test Steps:
+ 1. Create temporary testing environment
+ 2. Run Asset Processor batch to pre-process assets
+ 3. Run Asset Processor GUI
+ 4. Check if Asset Processor GUI reports that it has gone idle
"""
+
asset_processor.create_temp_asset_root()
# Run batch process to ensure project assets are processed
assert asset_processor.batch_process(), "AP Batch failed"
@@ -331,6 +380,17 @@ class TestsAssetProcessorGUI_Windows(object):
@pytest.mark.assetpipeline
def test_APStopTimesOut_ExceptionThrown(self, ap_setup_fixture, asset_processor):
+ """
+ Tests whether or not Asset Processor will Time Out
+
+ Test Steps:
+ 1. Create a temporary testing environment
+ 2. Start the Asset Processor
+ 3. Copy in assets to the test environment
+ 4. Try to stop the Asset Processor with a timeout of 1 second (This cannot be done manually).
+ 5. Verify that Asset Processor times out and returns the expected error
+ """
+
asset_processor.create_temp_asset_root()
asset_processor.start()
@@ -347,9 +407,20 @@ class TestsAssetProcessorGUI_Windows(object):
@pytest.mark.assetpipeline
def test_APStopDefaultTimeout_NoException(self, asset_processor):
- # If this test fails, it means other tests using the default timeout may have issues.
- # In that case, either the default timeout should either be raised, or the performance
- # of AP launching should be improved.
+ """
+ Tests the default timeout of the Asset Processor
+
+ If this test fails, it means other tests using the default timeout may have issues.
+ In that case, either the default timeout should either be raised, or the performance
+ of AP launching should be improved.
+
+ Test Steps:
+ 1. Create a temporary testing environment
+ 2. Start the Asset Processor
+ 3. Stop the asset Processor without sending a timeout to it
+ 4. Verify that the asset processor times out and returns the expected error
+ """
+
asset_processor.create_temp_asset_root()
asset_processor.start()
ap_quit_timed_out = False
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_gui_tests_2.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_gui_tests_2.py
index b25ee081a1..3fb9ae5a81 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_gui_tests_2.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_processor_gui_tests_2.py
@@ -75,10 +75,17 @@ class TestsAssetProcessorGUI_WindowsAndMac(object):
@pytest.mark.test_case_id("C3540434")
@pytest.mark.BAT
@pytest.mark.assetpipeline
- def test_WindowsAndMacPlatforms_AP_GUI_FastScanSettingCreated(self, asset_processor, fast_scan_backup):
+ def test_WindowsAndMacPlatforms_GUIFastScanNoSettingSet_FastScanSettingCreated(self, asset_processor, fast_scan_backup):
"""
Tests that a fast scan settings entry gets created for the AP if it does not exist
and ensures that the entry is defaulted to fast-scan enabled
+
+ Test Steps:
+ 1. Create temporary testing environment
+ 2. Delete existing fast scan setting if exists
+ 3. Run Asset Processor GUI without setting FastScan setting (default:true) and without quitonidle
+ 4. Wait and check to see if Windows Registry fast scan setting is created
+ 5. Verify that Fast Scan setting is set to true
"""
asset_processor.create_temp_asset_root()
@@ -119,6 +126,14 @@ class TestsAssetProcessorGUI_WindowsAndMac(object):
Make sure game launcher working with Asset Processor set to turbo mode
Validate that no fatal errors (crashes) are reported within a certain
time frame for the AP and the GameLauncher
+
+ Test Steps:
+ 1. Create temporary testing environment
+ 2. Set fast scan to true
+ 3. Verify fast scan is set to true
+ 4. Launch game launcher
+ 5. Verify launcher has launched without error
+ 6. Verify that asset processor has launched
"""
CHECK_ALIVE_SECONDS = 15
@@ -166,6 +181,14 @@ class TestsAssetProcessorGUI_AllPlatforms(object):
# fmt:on
"""
Deleting slices and uicanvases while AP is running
+
+ Test Steps:
+ 1. Create temporary testing environment with test assets
+ 2. Launch Asset Processor and wait for it to go idle
+ 3. Verify product assets were created in the cache
+ 4. Delete test assets from the cache
+ 5. Wait for Asset Processor to go idle
+ 6. Verify product assets were regenerated in the cache
"""
env = ap_setup_fixture
@@ -201,6 +224,15 @@ class TestsAssetProcessorGUI_AllPlatforms(object):
):
"""
Process slice files and uicanvas files from the additional scanfolder
+
+ Test Steps:
+ 1. Create temporary testing environment
+ 2. Run asset processor batch
+ 3. Validate that product assets were generated in the cache
+ 4. Create an additional scan folder with assets
+ 5. Create additional scan folder params to pass to Asset Processor
+ 6. Run Asset Processor GUI with QuitOnIdle and pass in params for the additional scan folder settings
+ 7. Verify additional product assets from additional scan folder are present in the cache
"""
env = ap_setup_fixture
# Copy test assets to new folder in dev folder
@@ -250,6 +282,12 @@ class TestsAssetProcessorGUI_AllPlatforms(object):
"""
Launch AP with invalid address in bootstrap.cfg
Assets should process regardless of the new address
+
+ Test Steps:
+ 1. Create a temporary testing environment
+ 2. Set an invalid ip address in Asset Processor settings file
+ 3. Launch Asset Processor GUI
+ 4. Verify that it processes assets and exits cleanly even though it has an invalid IP.
"""
test_ip_address = "1.1.1.1" # an IP address without Asset Processor
@@ -269,6 +307,14 @@ class TestsAssetProcessorGUI_AllPlatforms(object):
def test_AllSupportedPlatforms_ModifyAssetInfo_AssetsReprocessed(self, ap_setup_fixture, asset_processor):
"""
Modifying assetinfo files triggers file reprocessing
+
+ Test Steps:
+ 1. Create temporary testing environment with test assets
+ 2. Run Asset Processor GUI
+ 3. Verify that Asset Processor exited cleanly and product assets are in the cache
+ 4. Modify the .assetinfo file by adding a newline
+ 5. Wait for Asset Processor to go idle
+ 6. Verify that product files were regenerated (Time Stamp compare)
"""
env = ap_setup_fixture
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_relocator_tests.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_relocator_tests.py
index 2d3872bf31..30044fa9e2 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_relocator_tests.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/asset_relocator_tests.py
@@ -85,6 +85,18 @@ class TestsAssetRelocator_WindowsAndMac(object):
def test_WindowsMacPlatforms_RelocatorMoveFileWithConfirm_MoveSuccess(self, request, workspace, asset_processor,
ap_setup_fixture, testId, readonly, confirm,
success):
+ """
+ Tests whether tests with Move File Confirm are successful
+
+ Test Steps:
+ 1. Create temporary testing environment
+ 2. Set move location
+ 3. Determine if confirm flag is set
+ 4. Attempt to move the files
+ 5. If confirm flag set:
+ * Validate Move was successful
+ * Else: Validate move was not successful
+ """
env = ap_setup_fixture
copied_asset = ''
@@ -141,6 +153,11 @@ class TestsAssetRelocator_WindowsAndMac(object):
User should be warned that LeaveEmptyFolders needs to be used with the move or delete command
:return: None
+
+ Test Steps:
+ 1. Create temporary testing environment
+ 2. Attempt to move with --LeaveEmptyFolders set
+ 3. Verify user is given a message that command requires to be used with --move or --delete
"""
env = ap_setup_fixture
expected_message = "Command --leaveEmptyFolders must be used with command --move or --delete"
@@ -162,6 +179,11 @@ class TestsAssetRelocator_WindowsAndMac(object):
Asset with UUID/AssetId reference in non-standard format is
successfully scanned and relocated to the MoveOutput folder.
This test uses a pre-corrupted .slice file.
+
+ Test Steps:
+ 1. Create temporary testing environment with a corrupted slice
+ 2. Attempt to move the corrupted slice
+ 3. Verify that corrupted slice was moved successfully
"""
env = ap_setup_fixture
@@ -194,6 +216,11 @@ class TestsAssetRelocator_WindowsAndMac(object):
def test_WindowsMacPlatforms_UpdateReferences_MoveCommandMessage(self, ap_setup_fixture, asset_processor):
"""
UpdateReferences without move or delete
+
+ Test Steps:
+ 1. Create temporary testing environment
+ 2. Attempt to move with UpdateReferences but without move or delete flags
+ 3. Verify that message is returned to the user that additional flags are required
"""
env = ap_setup_fixture
expected_message = "Command --updateReferences must be used with command --move"
@@ -215,6 +242,11 @@ class TestsAssetRelocator_WindowsAndMac(object):
"""
When running the relocator command --AllowBrokenDependencies without the move or delete flags, the user should
be warned that the flags are necessary for the functionality to be used
+
+ Test Steps:
+ 1. Create temporary testing environment
+ 2. Attempt to move with AllowBrokenDependencies without the move or delete flag
+ 3. Verify that message is returned to the user that additional flags are required
"""
env = ap_setup_fixture
@@ -302,10 +334,19 @@ class TestsAssetRelocator_WindowsAndMac(object):
project
):
"""
+ Dynamic data test for deleting a file with Asset Relocator:
+
C21968355 Delete a file with confirm
C21968356 Delete a file without confirm
C21968359 Delete a file that is marked as ReadOnly
C21968360 Delete a file that is not marked as ReadOnly
+
+ Test Steps:
+ 1. Create temporary testing environment
+ 2. Set the read-only status of the file based on the test case
+ 3. Run asset relocator with --delete and the confirm status based on the test case
+ 4. Assert file existence or nonexistence based on the test case
+ 5. Validate the relocation report based on expected and unexpected messages
"""
env = ap_setup_fixture
test_file = "testFile.txt"
@@ -430,6 +471,15 @@ class TestsAssetRelocator_WindowsAndMac(object):
Test the LeaveEmptyFolders flag in various configurations
:returns: None
+
+ Test Steps:
+ 1. Create temporary testing environment
+ 2. Build the various move/delete commands here based on test data
+ 3. Run the move command with the various triggers based on test data
+ 4. Verify the original assets folder still exists based on test data
+ 5. Verify the files successfully moved to new location based on test data
+ 6. Verify that the files were removed from original location based on test data
+ 7. Verify the files have not been deleted or moved from original location based on test data
"""
# # Start test setup # #
env = ap_setup_fixture
@@ -517,6 +567,12 @@ class TestsAssetRelocator_WindowsAndMac(object):
"""
The test will attempt to move test assets that are not tracked under P4 source control using the EnableSCM flag
Because the files are not tracked by source control, the relocation should fail
+
+ Test Steps:
+ 1. Create temporary testing environment
+ 2. Set ReadOnly or Not-ReadOnly for the test files based on test data
+ 3. Generate and run the enableSCM command
+ 4. Verify the move failed and expected messages are present
"""
# Move the test assets into the project folder
env = ap_setup_fixture
@@ -1037,6 +1093,13 @@ class TestsAssetRelocator_WindowsAndMac(object):
C21968370 AllowBrokenDependencies with move and confirm
C21968371 AllowBrokenDependencies with move and without confirm
C21968375 AllowBrokenDependencies with delete
+
+ Test Steps:
+ 1. Create temporary testing environment
+ 2. Run Asset Processor to Process Assets
+ 3. Build primary AP Batch parameter value and destination paths
+ 4. Validate resulting file paths in source and output directories
+ 5. Validate the log based on expected and unexpected messages
"""
env = ap_setup_fixture
all_test_asset_rel_paths = [
@@ -1254,6 +1317,18 @@ class TestsAssetRelocator_WindowsAndMac(object):
@pytest.mark.parametrize("test", tests)
def test_WindowsAndMac_MoveMetadataFiles_PathExistenceAndMessage(self, workspace, request, ap_setup_fixture,
asset_processor, test):
+ """
+ Tests whether moving metadata files can be moved
+
+ Test Steps:
+ 1. Create temporary testing environment
+ 2. Determine if using wildcards on paths or not
+ 3. Determine if excludeMetaDataFiles is set or not
+ 4. Build primary AP Batch parameter value and destination paths
+ 5. Build and run the AP Batch command with parameters
+ 6. Validate resulting file paths in source and output directories
+ 7. Validate the log based on expected and unexpected messages
+ """
env = ap_setup_fixture
def teardown():
@@ -1342,7 +1417,7 @@ class TestsAssetRelocator_WindowsAndMac(object):
@dataclass
class MoveTest:
- description: str # test case title directly copied from Testrail
+ description: str # test case title
asset_folder: str # which folder in ./assets will be used for this test
encoded_command: str # the command to execute
encoded_output_dir: str # the destination directory to validate
@@ -1350,7 +1425,7 @@ class MoveTest:
name_change_map: dict = None
files_that_stay: List[str] = field(default_factory=lambda: [])
output_messages: List[str] = field(default_factory=lambda: [])
- step: str = None # the step of the test from Testrail
+ step: str = None # the step of the test from test repository
prefix_commands: List[str] = field(default_factory=lambda: ["AssetProcessorBatch", "--zeroAnalysisMode"])
suffix_commands: List[str] = field(default_factory=lambda: ["--confirm"])
env: dict = field(init=False, default=None) # inject the ap_setup_fixture at runtime
@@ -3718,7 +3793,18 @@ class TestsAssetProcessorMove_WindowsAndMac:
# -k C19462747
@pytest.mark.parametrize("test", move_a_file_tests + move_a_folder_tests)
- def test_WindowsMacPlatforms_MoveCommand(self, asset_processor, ap_setup_fixture, test: MoveTest, project):
+ def test_WindowsMacPlatforms_MoveCommand_CommandResult(self, asset_processor, ap_setup_fixture, test: MoveTest, project):
+ """
+
+ Test Steps:
+ 1. Create temporary testing environment based on test data
+ 2. Validate that temporary testing environment was created successfully
+ 3. Execute the move command based upon the test data
+ 4. Validate that files are where they're expected according to the test data
+ 5. Validate unexpected files are not found according to the test data
+ 6. Validate output messages according to the test data
+ 7. Validate move status according to the test data
+ """
source_folder, _ = asset_processor.prepare_test_environment(ap_setup_fixture["tests_dir"], test.asset_folder)
test.map_env(ap_setup_fixture, source_folder)
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/missing_dependency_tests.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/missing_dependency_tests.py
index 6cc3484d96..74f6de1129 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/missing_dependency_tests.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/missing_dependency_tests.py
@@ -75,6 +75,15 @@ class TestsMissingDependencies_WindowsAndMac(object):
def do_missing_dependency_test(self, source_product, expected_dependencies,
dsp_param,
platforms=None, max_iterations=0):
+ """
+ Test Steps:
+ 1. Determine what platforms to run against
+ 2. Process assets for that platform
+ 3. Determine the missing dependency params to set
+ 4. Set the max iteration param
+ 5. Run missing dependency scanner against target platforms and search params based on test data
+ 6. Validate missing dependencies against test data
+ """
platforms = platforms or ASSET_PROCESSOR_PLATFORM_MAP[self._workspace.asset_processor_platform]
if not isinstance(platforms, list):
@@ -84,10 +93,11 @@ class TestsMissingDependencies_WindowsAndMac(object):
"""Run a single test"""
for asset_platform in platforms:
- db_product = db_utils.get_product_id_from_relative(self._workspace, source_product, asset_platform)
+ db_product_path = db_utils.get_db_product_path(self._workspace, source_product, asset_platform)
+ db_product = db_utils.get_product_id(self._missing_dep_helper.asset_db, db_product_path)
if db_product:
db_utils.clear_missing_dependencies(self._missing_dep_helper.asset_db, db_product)
- expected_product = os.path.join(self._workspace.project, source_product).lower()
+ expected_product = source_product.lower()
dependency_search_params = [f"--dsp={dsp_param}", "--zeroAnalysisMode"]
if max_iterations:
@@ -103,7 +113,14 @@ class TestsMissingDependencies_WindowsAndMac(object):
@pytest.mark.assetpipeline
@pytest.mark.test_case_id("C17226567")
def test_WindowsAndMac_ValidUUIDNotDependency_ReportsMissingDependency(self):
- """Tests that a valid UUID referenced in a file will report any missing dependencies"""
+ """
+ Tests that a valid UUID referenced in a file will report any missing dependencies
+
+ Test Steps:
+ 1. Set the expected product
+ 2. Set the expected missing dependencies
+ 3. Execute test
+ """
# Relative path to the txt file with missing dependencies
expected_product = f"testassets\\validuuidsnotdependency.txt"
@@ -112,17 +129,26 @@ class TestsMissingDependencies_WindowsAndMac(object):
# Expected missing dependencies
expected_dependencies = [
# String Asset #
- ("06E9D6633C875400A532BCB2C0CA19D6", "{06E9D663-3C87-5400-A532-BCB2C0CA19D6}:0"),
- ("1CB10C43F3245B93A294C602ADEF95F9:[0", "{1CB10C43-F324-5B93-A294-C602ADEF95F9}:0"),
- ("58BE9DA51F1753B98CEEEEB10E63454D", "{58BE9DA5-1F17-53B9-8CEE-EEB10E63454D}:914f19b7"),
- ("6BDE282B49C957F7B0714B26579BCA9A", "{6BDE282B-49C9-57F7-B071-4B26579BCA9A}:0"),
- ("747D31D71E62553592226173C49CF97E", "{747D31D7-1E62-5535-9222-6173C49CF97E}:1"),
- ("747D31D71E62553592226173C49CF97E", "{747D31D7-1E62-5535-9222-6173C49CF97E}:2"),
- ("9886E132-572D-5746-9377-E629AB6C1981", "{9886E132-572D-5746-9377-E629AB6C1981}:0"),
- ("33bcee02F3225688ABEE534F6058593F", "{33BCEE02-F322-5688-ABEE-534F6058593F}:0"),
- ("B92667DC-9F5B-5D72-A29D-99219DD9B691", "{B92667DC-9F5B-5D72-A29D-99219DD9B691}:0"),
- ("D92C4661C8985E19BD3597CB2318CFA6:[0", "{D92C4661-C898-5E19-BD35-97CB2318CFA6}:0"),
- ("7364AB2B092F5B0B80601BBC6E53087C", "{7364AB2B-092F-5B0B-8060-1BBC6E53087C}:0"),
+ ('1CB10C43F3245B93A294C602ADEF95F9:[0', '{1CB10C43-F324-5B93-A294-C602ADEF95F9}:0'),
+ ('33bcee02F3225688ABEE534F6058593F', '{33BCEE02-F322-5688-ABEE-534F6058593F}:0'),
+ ('345E5C660D6254FF8D0F7C8EE66A2249', '{345E5C66-0D62-54FF-8D0F-7C8EE66A2249}:3e8'),
+ ('345E5C660D6254FF8D0F7C8EE66A2249', '{345E5C66-0D62-54FF-8D0F-7C8EE66A2249}:3ea'),
+ ('345E5C660D6254FF8D0F7C8EE66A2249', '{345E5C66-0D62-54FF-8D0F-7C8EE66A2249}:3eb'),
+ ('37108522F50459499CD6C8D47A960CF1', '{37108522-F504-5949-9CD6-C8D47A960CF1}:3e8'),
+ ('37108522F50459499CD6C8D47A960CF1', '{37108522-F504-5949-9CD6-C8D47A960CF1}:3ea'),
+ ('37108522F50459499CD6C8D47A960CF1', '{37108522-F504-5949-9CD6-C8D47A960CF1}:3eb'),
+ ('6BDE282B49C957F7B0714B26579BCA9A', '{6BDE282B-49C9-57F7-B071-4B26579BCA9A}:0'),
+ ('747D31D71E62553592226173C49CF97E', '{747D31D7-1E62-5535-9222-6173C49CF97E}:1'),
+ ('747D31D71E62553592226173C49CF97E', '{747D31D7-1E62-5535-9222-6173C49CF97E}:2'),
+ ('A26C73D1837E5AE59E68F916FA7C3699', '{A26C73D1-837E-5AE5-9E68-F916FA7C3699}:3e8'),
+ ('A26C73D1837E5AE59E68F916FA7C3699', '{A26C73D1-837E-5AE5-9E68-F916FA7C3699}:3ea'),
+ ('A26C73D1837E5AE59E68F916FA7C3699', '{A26C73D1-837E-5AE5-9E68-F916FA7C3699}:3eb'),
+ ('B076CDDC-14DF-50F4-A5E9-7518ABB3E851', '{B076CDDC-14DF-50F4-A5E9-7518ABB3E851}:0'),
+ ('C67BEA9F-09FF-59AA-A7F0-A52B8F987508', '{C67BEA9F-09FF-59AA-A7F0-A52B8F987508}:3e8'),
+ ('C67BEA9F-09FF-59AA-A7F0-A52B8F987508', '{C67BEA9F-09FF-59AA-A7F0-A52B8F987508}:3ea'),
+ ('C67BEA9F-09FF-59AA-A7F0-A52B8F987508', '{C67BEA9F-09FF-59AA-A7F0-A52B8F987508}:3eb'),
+ ('C67BEA9F-09FF-59AA-A7F0-A52B8F987508', '{C67BEA9F-09FF-59AA-A7F0-A52B8F987508}:3ec'),
+ ('D92C4661C8985E19BD3597CB2318CFA6:[0', '{D92C4661-C898-5E19-BD35-97CB2318CFA6}:0'),
]
self.do_missing_dependency_test(expected_product, expected_dependencies,
"%ValidUUIDsNotDependency.txt")
@@ -131,7 +157,14 @@ class TestsMissingDependencies_WindowsAndMac(object):
@pytest.mark.assetpipeline
@pytest.mark.test_case_id("C17226567")
def test_WindowsAndMac_InvalidUUIDsNotDependencies_NoReportedMessage(self):
- """Tests that invalid UUIDs do not count as missing dependencies"""
+ """
+ Tests that invalid UUIDs do not count as missing dependencies
+
+ Test Steps:
+ 1. Set the expected product
+ 2. Set the expected missing dependencies
+ 3. Execute test
+ """
# Relative path to the txt file with invalid UUIDs
expected_product = f"testassets\\invaliduuidnoreport.txt"
expected_dependencies = [] # No expected missing dependencies
@@ -143,7 +176,14 @@ class TestsMissingDependencies_WindowsAndMac(object):
@pytest.mark.assetpipeline
@pytest.mark.test_case_id("C17226567")
def test_WindowsAndMac_ValidAssetIdsNotDependencies_ReportsMissingDependency(self):
- """Tests that valid asset IDs but not dependencies, show missing dependencies"""
+ """
+ Tests that valid asset IDs but not dependencies, show missing dependencies
+
+ Test Steps:
+ 1. Set the expected product
+ 2. Set the expected missing dependencies
+ 3. Execute test
+ """
# Relative path to the txt file with valid asset ids but not dependencies
expected_product = f"testassets\\validassetidnotdependency.txt"
@@ -151,9 +191,9 @@ class TestsMissingDependencies_WindowsAndMac(object):
# Expected missing dependencies
expected_dependencies = [
# String Asset #
- ("2ef92b8D044E5C278E2BB1AC0374A4E7:131072", "{2EF92B8D-044E-5C27-8E2B-B1AC0374A4E7}:20000"),
- ("A2482826-053D-5634-A27B-084B1326AAE5}:[196608", "{A2482826-053D-5634-A27B-084B1326AAE5}:30000"),
- ("D83B36F1-61A6-5001-B191-4D0CE282E236}-327680", "{D83B36F1-61A6-5001-B191-4D0CE282E236}:50000"),
+ ('2ef92b8D044E5C278E2BB1AC0374A4E7:1003', '{2EF92B8D-044E-5C27-8E2B-B1AC0374A4E7}:3eb'),
+ ('A2482826-053D-5634-A27B-084B1326AAE5}:[1002', '{A2482826-053D-5634-A27B-084B1326AAE5}:3ea'),
+ ('D83B36F1-61A6-5001-B191-4D0CE282E236}-1002', '{D83B36F1-61A6-5001-B191-4D0CE282E236}:3ea'),
]
self.do_missing_dependency_test(expected_product, expected_dependencies,
@@ -163,7 +203,14 @@ class TestsMissingDependencies_WindowsAndMac(object):
@pytest.mark.assetpipeline
@pytest.mark.test_case_id("C17226567")
def test_WindowsAndMac_InvalidAssetsIDNotDependencies_NoReportedMessage(self):
- """Tests that invalid asset IDs do not count as missing dependencies"""
+ """
+ Tests that invalid asset IDs do not count as missing dependencies
+
+ Test Steps:
+ 1. Set the expected product
+ 2. Set the expected missing dependencies
+ 3. Execute test
+ """
# Relative path to the txt file with invalid asset IDs
expected_product = f"testassets\\invalidassetidnoreport.txt"
@@ -178,7 +225,14 @@ class TestsMissingDependencies_WindowsAndMac(object):
# fmt:off
def test_WindowsAndMac_ValidSourcePathsNotDependencies_ReportsMissingDependencies(self):
# fmt:on
- """Tests that valid source paths can translate to missing dependencies"""
+ """
+ Tests that valid source paths can translate to missing dependencies
+
+ Test Steps:
+ 1. Set the expected product
+ 2. Set the expected missing dependencies
+ 3. Execute test
+ """
# Relative path to the txt file with missing dependencies as source paths
expected_product = f"testassets\\relativesourcepathsnotdependencies.txt"
@@ -186,16 +240,13 @@ class TestsMissingDependencies_WindowsAndMac(object):
# Expected missing dependencies
expected_dependencies = [
# String Asset #
- ("Config/Editor.xml", "{06E9D663-3C87-5400-A532-BCB2C0CA19D6}:0"),
- (r"TestAssets\WildcardScanTest1.txt", "{1CB10C43-F324-5B93-A294-C602ADEF95F9}:0"),
- ("TestAssets/RelativeProductPathsNotDependencies.txt", "{B772953C-A08A-5D20-9491-530E87D11504}:0"),
- ("textures/_dev_Purple.tif", "{A2482826-053D-5634-A27B-084B1326AAE5}:0"),
- ("textures/_dev_Purple.tif", "{A2482826-053D-5634-A27B-084B1326AAE5}:10000"),
- ("textures/_dev_Purple.tif", "{A2482826-053D-5634-A27B-084B1326AAE5}:20000"),
- ("textures/_dev_Purple.tif", "{A2482826-053D-5634-A27B-084B1326AAE5}:30000"),
- ("textures/_dev_Purple.tif", "{A2482826-053D-5634-A27B-084B1326AAE5}:40000"),
- ("textures/_dev_Purple.tif", "{A2482826-053D-5634-A27B-084B1326AAE5}:50000"),
- ("Config/gAME.XML", "{B92667DC-9F5B-5D72-A29D-99219DD9B691}:0"),
+ ('TestAssets\\WildcardScanTest1.txt', '{1CB10C43-F324-5B93-A294-C602ADEF95F9}:0'),
+ ('libs/particles/milestone2PARTICLES.XML', '{6BDE282B-49C9-57F7-B071-4B26579BCA9A}:0'),
+ ('textures/_dev_Purple.tif', '{A2482826-053D-5634-A27B-084B1326AAE5}:3e8'),
+ ('textures/_dev_Purple.tif', '{A2482826-053D-5634-A27B-084B1326AAE5}:3ea'),
+ ('textures/_dev_Purple.tif', '{A2482826-053D-5634-A27B-084B1326AAE5}:3eb'),
+ ('project.json', '{B076CDDC-14DF-50F4-A5E9-7518ABB3E851}:0'),
+ ('TestAssets/RelativeProductPathsNotDependencies.txt', '{B772953C-A08A-5D20-9491-530E87D11504}:0'),
]
self.do_missing_dependency_test(expected_product, expected_dependencies,
@@ -205,7 +256,14 @@ class TestsMissingDependencies_WindowsAndMac(object):
@pytest.mark.assetpipeline
@pytest.mark.test_case_id("C17226567")
def test_WindowsAndMac_InvalidARelativePathsNotDependencies_NoReportedMessage(self):
- """Tests that invalid relative paths do not resolve to missing dependencies"""
+ """
+ Tests that invalid relative paths do not resolve to missing dependencies
+
+ Test Steps:
+ 1. Set the expected product
+ 2. Set the expected missing dependencies
+ 3. Execute test
+ """
# Relative path to the txt file with invalid relative paths
expected_product = f"testassets\\invalidrelativepathsnoreport.txt"
@@ -220,7 +278,14 @@ class TestsMissingDependencies_WindowsAndMac(object):
# fmt:off
def test_WindowsAndMac_ValidProductPathsNotDependencies_ReportsMissingDependencies(self):
# fmt:on
- """Tests that valid product paths can resolve to missing dependencies"""
+ """
+ Tests that valid product paths can resolve to missing dependencies
+
+ Test Steps:
+ 1. Set the expected product
+ 2. Set the expected missing dependencies
+ 3. Execute test
+ """
self._asset_processor.add_source_folder_assets(f"Gems\\LyShineExamples\\Assets\\UI\\Fonts\\LyShineExamples")
self._asset_processor.add_scan_folder(f"Gems\\LyShineExamples\\Assets")
@@ -228,24 +293,22 @@ class TestsMissingDependencies_WindowsAndMac(object):
expected_product = f"testassets\\relativeproductpathsnotdependencies.txt"
expected_dependencies = [
# String Asset #
- ("materials/floor_tile.mtl", "{0EFF5E4A-F544-5D87-8696-6DDFA62D6063}:0"),
- ("materials/am_grass1.mtl", "{1151F14D-38A6-5579-888A-BE3139882E68}:0"),
- ("2ef92b8D044E5C278E2BB1AC0374A4E7:131072", "{2EF92B8D-044E-5C27-8E2B-B1AC0374A4E7}:20000"),
- ("ui/milestone2menu.uicanvas", "{445D9AF3-6CA5-5281-82A9-5C570BCD1DB8}:0"),
- ("ui/fonts/lyshineexamples/vera.ttf", "{74F5C29E-4749-5EE8-AEC6-A1C540600CE7}:0"),
- ("materials/am_rockground.mtl", "{A1DA3D05-A020-5BB5-A608-C4812B7BD733}:0"),
- ("textures/_dev_yellow_light.dds.2", "{6C40868F-3FC1-5115-96EA-DD0A9E33DEE4}:20000"),
- (r"automatedtesting\textures\_dev_stucco.dds", "{70114D85-D712-5AEB-A816-8FE3A37087AF}:0"),
- ("textures/milestone2/ama_grey_02.dds", "{3EE80AAD-EB9C-56BD-9E9C-65410578998C}:0"),
- (r"textures\\_dev_tan.dds", "{8F2BCEF5-C8CE-5B80-8103-8C1D694D012C}:0"),
- ("textures/_dev_purple.dds", "{A2482826-053D-5634-A27B-084B1326AAE5}:0"),
- ("TEXTURES/_DEV_WHITE.dds", "{D83B36F1-61A6-5001-B191-4D0CE282E236}:0"),
- ("textures/_dev_woodland.dds", "{F3DD193C-5845-569C-A974-AA338B30CF86}:0"),
- ("A2482826-053D-5634-A27B-084B1326AAE5}:[196608", "{A2482826-053D-5634-A27B-084B1326AAE5}:30000"),
- ("B92667DC-9F5B-5D72-A29D-99219DD9B691", "{B92667DC-9F5B-5D72-A29D-99219DD9B691}:0"),
- ("CEAA362B4E505BCEB827CB92EF40A50E", "{CEAA362B-4E50-5BCE-B827-CB92EF40A50E}:1"),
- ("CEAA362B4E505BCEB827CB92EF40A50E", "{CEAA362B-4E50-5BCE-B827-CB92EF40A50E}:2"),
- ("ui/fonts/lyshineexamples/veramono.ttf", "{BAD7FDC5-7BA6-5490-95AA-89078E2FA876}:0"),
+ ('materials/floor_tile.mtl', '{0EFF5E4A-F544-5D87-8696-6DDFA62D6063}:0'),
+ ('materials/am_grass1.mtl', '{1151F14D-38A6-5579-888A-BE3139882E68}:0'),
+ ('2ef92b8D044E5C278E2BB1AC0374A4E7:1002', '{2EF92B8D-044E-5C27-8E2B-B1AC0374A4E7}:3ea'),
+ ('textures/milestone2/ama_grey_02.tif.streamingimage', '{3EE80AAD-EB9C-56BD-9E9C-65410578998C}:3e8'),
+ ('ui/milestone2menu.uicanvas', '{445D9AF3-6CA5-5281-82A9-5C570BCD1DB8}:0'),
+ ('libs/particles/milestone2particles.xml', '{6BDE282B-49C9-57F7-B071-4B26579BCA9A}:0'),
+ ('textures/_dev_yellow_light.tif.1002.imagemipchain', '{6C40868F-3FC1-5115-96EA-DD0A9E33DEE4}:3ea'),
+ ('textures\\\\_dev_tan.tif.streamingimage', '{8F2BCEF5-C8CE-5B80-8103-8C1D694D012C}:3e8'),
+ ('materials/am_rockground.mtl', '{A1DA3D05-A020-5BB5-A608-C4812B7BD733}:0'),
+ ('textures/_dev_purple.tif.streamingimage', '{A2482826-053D-5634-A27B-084B1326AAE5}:3e8'),
+ ('A2482826-053D-5634-A27B-084B1326AAE5}:[1002', '{A2482826-053D-5634-A27B-084B1326AAE5}:3ea'),
+ ('project.json', '{B076CDDC-14DF-50F4-A5E9-7518ABB3E851}:0'),
+ ('CEAA362B4E505BCEB827CB92EF40A50E', '{CEAA362B-4E50-5BCE-B827-CB92EF40A50E}:1'),
+ ('CEAA362B4E505BCEB827CB92EF40A50E', '{CEAA362B-4E50-5BCE-B827-CB92EF40A50E}:2'),
+ ('TEXTURES/_DEV_WHITE.tif.streamingimage', '{D83B36F1-61A6-5001-B191-4D0CE282E236}:3e8'),
+ ('textures/_dev_woodland.tif.streamingimage', '{F3DD193C-5845-569C-A974-AA338B30CF86}:3e8'),
]
self.do_missing_dependency_test(expected_product, expected_dependencies,
@@ -255,13 +318,20 @@ class TestsMissingDependencies_WindowsAndMac(object):
@pytest.mark.assetpipeline
@pytest.mark.test_case_id("C17226567")
def test_WindowsAndMac_WildcardScan_FindsAllExpectedFiles(self):
- """Tests that the wildcard scanning will pick up multiple files"""
+ """
+ Tests that the wildcard scanning will pick up multiple files
+
+ Test Steps:
+ 1. Set the expected product
+ 2. Set the expected missing dependencies
+ 3. Execute test
+ """
helper = self._missing_dep_helper
# Relative paths to the txt file with no missing dependencies
- expected_product_1 = f"{self._workspace.project}\\testassets\\wildcardscantest1.txt"
- expected_product_2 = f"{self._workspace.project}\\testassets\\wildcardscantest2.txt"
+ expected_product_1 = f"testassets\\wildcardscantest1.txt"
+ expected_product_2 = f"testassets\\wildcardscantest2.txt"
expected_dependencies = [] # Neither file has expected missing dependencies
# Run missing dependency scanner and validate results for both files
@@ -286,21 +356,33 @@ class TestsMissingDependencies_WindowsAndMac(object):
For these references that are valid, all but one have available, matching dependencies. This test is
primarily meant to verify that the missing dependency reporter checks the product dependency table before
emitting missing dependencies.
+
+ Test Steps:
+ 1. Set the expected product
+ 2. Set the expected missing dependencies
+ 3. Execute test
"""
# Relative path to target test file
- expected_product = f"testassets\\dependencyscannerasset.dynamicslice"
+ expected_product = f"testassets\\reportonemissingdependency.txt"
# The only expected missing dependency
- expected_dependencies = [("Config/Game.xml", "{B92667DC-9F5B-5D72-A29D-99219DD9B691}:0")]
+ expected_dependencies = [('6BDE282B49C957F7B0714B26579BCA9A', '{6BDE282B-49C9-57F7-B071-4B26579BCA9A}:0'),]
self.do_missing_dependency_test(expected_product, expected_dependencies,
- "%DependencyScannerAsset%.dynamicslice")
+ "%reportonemissingdependency.txt")
@pytest.mark.BAT
@pytest.mark.assetpipeline
@pytest.mark.test_case_id("C17226567")
def test_WindowsAndMac_ReferencesSelfPath_NoReportedMessage(self):
- """Tests that a file that references itself via relative path does not report itself as a missing dependency"""
+ """
+ Tests that a file that references itself via relative path does not report itself as a missing dependency
+
+ Test Steps:
+ 1. Set the expected product
+ 2. Set the expected missing dependencies
+ 3. Execute test
+ """
# Relative path to file that references itself via relative path
expected_product = f"testassets\\selfreferencepath.txt"
expected_dependencies = []
@@ -312,7 +394,14 @@ class TestsMissingDependencies_WindowsAndMac(object):
@pytest.mark.assetpipeline
@pytest.mark.test_case_id("C17226567")
def test_WindowsAndMac_ReferencesSelfUUID_NoReportedMessage(self):
- """Tests that a file that references itself via its UUID does not report itself as a missing dependency"""
+ """
+ Tests that a file that references itself via its UUID does not report itself as a missing dependency
+
+ Test Steps:
+ 1. Set the expected product
+ 2. Set the expected missing dependencies
+ 3. Execute test
+ """
# Relative path to file that references itself via its UUID
expected_product = f"testassets\\selfreferenceuuid.txt"
@@ -325,7 +414,14 @@ class TestsMissingDependencies_WindowsAndMac(object):
@pytest.mark.assetpipeline
@pytest.mark.test_case_id("C17226567")
def test_WindowsAndMac_ReferencesSelfAssetID_NoReportedMessage(self):
- """Tests that a file that references itself via its Asset ID does not report itself as a missing dependency"""
+ """
+ Tests that a file that references itself via its Asset ID does not report itself as a missing dependency
+
+ Test Steps:
+ 1. Set the expected product
+ 2. Set the expected missing dependencies
+ 3. Execute test
+ """
# Relative path to file that references itself via its Asset ID
expected_product = f"testassets\\selfreferenceassetid.txt"
@@ -342,6 +438,11 @@ class TestsMissingDependencies_WindowsAndMac(object):
Tests that the scan limit fails to find a missing dependency that is out of reach.
The max iteration count is set to just under where a valid missing dependency is on a line in the file,
so this will not report any missing dependencies.
+
+ Test Steps:
+ 1. Set the expected product
+ 2. Set the expected missing dependencies
+ 3. Execute test
"""
# Relative path to file that has a missing dependency at 31 iterations deep
@@ -359,14 +460,20 @@ class TestsMissingDependencies_WindowsAndMac(object):
Tests that the scan limit succeeds in finding a missing dependency that is barely in reach.
In the previous test, the scanner was set to stop recursion just before a missing dependency was found.
This test runs with the recursion limit set deep enough to actually find the missing dependency.
+
+ Test Steps:
+ 1. Set the expected product
+ 2. Set the expected missing dependencies
+ 3. Execute test
"""
+
# Relative path to file that has a missing dependency at 31 iterations deep
expected_product = f"testassets\\maxiteration31deep.txt"
# Expected missing dependency hiding 31 dependencies deep
expected_dependencies = [
# String Asset #
- ("B92667DC-9F5B-5D72-A29D-99219DD9B691", "{B92667DC-9F5B-5D72-A29D-99219DD9B691}:0")
+ ("6BDE282B-49C9-57F7-B071-4B26579BCA9A", "{6BDE282B-49C9-57F7-B071-4B26579BCA9A}:0")
]
self.do_missing_dependency_test(expected_product, expected_dependencies,
@@ -378,7 +485,14 @@ class TestsMissingDependencies_WindowsAndMac(object):
# fmt:off
def test_WindowsAndMac_PotentialMatchesLongerThanUUIDString_OnlyReportsCorrectLengthUUIDs(self):
# fmt:on
- """Tests that dependency references that are longer than expected are ignored"""
+ """
+ Tests that dependency references that are longer than expected are ignored
+
+ Test Steps:
+ 1. Set the expected product
+ 2. Set the expected missing dependencies
+ 3. Execute test
+ """
# Relative path to text file with varying length UUID references
expected_product = f"testassets\\onlymatchescorrectlengthuuids.txt"
@@ -386,11 +500,11 @@ class TestsMissingDependencies_WindowsAndMac(object):
# Expected dependencies with valid lengths from file
expected_dependencies = [
# String Asset #
- ("D92C4661C8985E19BD3597CB2318CFA6", "{D92C4661-C898-5E19-BD35-97CB2318CFA6}:0"),
- ("58BE9DA51F1753B98CEEEEB10E63454D", "{58BE9DA5-1F17-53B9-8CEE-EEB10E63454D}:914f19b7"),
- ("747D31D71E62553592226173C49CF97E", "{747D31D7-1E62-5535-9222-6173C49CF97E}:1"),
- ("747D31D71E62553592226173C49CF97E", "{747D31D7-1E62-5535-9222-6173C49CF97E}:2"),
- ("1CB10C43-F324-5B93-A294-C602ADEF95F9", "{1CB10C43-F324-5B93-A294-C602ADEF95F9}:0"),
+ ('D1265251CC14584AB1CECB10746A2BA0', '{D1265251-CC14-584A-B1CE-CB10746A2BA0}:2'),
+ ('D1265251CC14584AB1CECB10746A2BA0', '{D1265251-CC14-584A-B1CE-CB10746A2BA0}:1'),
+ ('D92C4661C8985E19BD3597CB2318CFA6', '{D92C4661-C898-5E19-BD35-97CB2318CFA6}:0'),
+ ('837412DFD05F576D81AAACF360463749', '{837412DF-D05F-576D-81AA-ACF360463749}:0'),
+ ('785A05D2483E5B43A2B992ACDAE6E938', '{785A05D2-483E-5B43-A2B9-92ACDAE6E938}:0'),
]
self.do_missing_dependency_test( expected_product, expected_dependencies,
@@ -403,7 +517,14 @@ class TestsMissingDependencies_WindowsAndMac(object):
def test_WindowsAndMac_MissingDependencyScanner_GradImageSuccess(
self, ap_setup_fixture
):
- """Tests the Missing Dependency Scanner can scan gradimage files"""
+ """
+ Tests the Missing Dependency Scanner can scan gradimage files
+
+ Test Steps:
+ 1. Create temporary testing environment
+ 2. Run the move dependency scanner against the gradimage
+ 2. Validate that the expected product files and and expected depdencies match
+ """
env = ap_setup_fixture
helper = self._missing_dep_helper
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/auxiliary_content_tests/auxiliary_content_tests.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/auxiliary_content_tests/auxiliary_content_tests.py
index 7e9f65de60..452dc66352 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/auxiliary_content_tests/auxiliary_content_tests.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/auxiliary_content_tests/auxiliary_content_tests.py
@@ -51,6 +51,11 @@ class TestAuxiliaryContent:
def test_CreateAuxiliaryContent_DontSkipLevelPaks(self, workspace, level):
"""
This test ensure that Auxiliary Content contain level.pak files
+
+ Test Steps:
+ 1. Run auxiliary content against project under test
+ 2. Validate auxiliary content exists
+ 3. Verifies that level.pak exists
"""
path_to_dev = workspace.paths.engine_root()
@@ -70,6 +75,11 @@ class TestAuxiliaryContent:
def test_CreateAuxiliaryContent_SkipLevelPaks(self, workspace, level):
"""
This test ensure that Auxiliary Content contain no level.pak file
+
+ Test Steps:
+ 1. Run auxiliary content against project under test with skiplevelPaks flag
+ 2. Validate auxiliary content exists
+ 3. Validate level.pak was added to auxiliary content
"""
path_to_dev = workspace.paths.engine_root()
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/fbx_tests.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/fbx_tests.py
index b66984666b..afd7190c1b 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/fbx_tests.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/fbx_tests.py
@@ -533,6 +533,14 @@ class TestsFBX_AllPlatforms(object):
def test_FBXBlackboxTest_SourceFiles_Processed_ResultInExpectedProducts(self, workspace,
ap_setup_fixture, asset_processor, project,
blackbox_param):
+ """
+ Please see run_fbx_test(...) for details
+
+ Test Steps:
+ 1. Determine if blackbox is set to none
+ 2. Run FBX Test
+ """
+
if blackbox_param == None:
return
self.run_fbx_test(workspace, ap_setup_fixture,
@@ -544,6 +552,15 @@ class TestsFBX_AllPlatforms(object):
workspace, ap_setup_fixture,
asset_processor, project,
blackbox_param):
+ """
+ Please see run_fbx_test(...) for details
+
+ Test Steps:
+ 1. Determine if blackbox is set to none
+ 2. Run FBX Test
+ 2. Re-run FBX test and validate the information in override assets
+ """
+
if blackbox_param == None:
return
self.run_fbx_test(workspace, ap_setup_fixture,
@@ -567,6 +584,19 @@ class TestsFBX_AllPlatforms(object):
def run_fbx_test(self, workspace, ap_setup_fixture, asset_processor,
project, blackbox_params: BlackboxAssetTest, overrideAsset = False):
+ """
+ These tests work by having the test case ingest the test data and determine the run pattern.
+ Tests will process scene settings files and will additionally do a verification against a provided debug file
+ Additionally, if an override is passed, the output is checked against the override.
+
+ Test Steps:
+ 1. Create temporary test environment
+ 2. Process Assets
+ 3. Determine what assets to validate based upon test data
+ 4. Validate assets were created in cache
+ 5. If debug file provided, verify scene files were generated correctly
+ 6. Verify that each given source asset resulted in the expected jobs and products
+ """
test_assets_folder = blackbox_params.override_asset_folder if overrideAsset else blackbox_params.asset_folder
logger.info(f"{blackbox_params.test_name}: Processing assets in folder '"
diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/wwise_bank_dependency_tests/bank_info_parser_tests.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/wwise_bank_dependency_tests/bank_info_parser_tests.py
index 0db13bf53c..764b7723bf 100755
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/wwise_bank_dependency_tests/bank_info_parser_tests.py
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/wwise_bank_dependency_tests/bank_info_parser_tests.py
@@ -26,6 +26,18 @@ def soundbank_metadata_generator_setup_fixture(workspace):
def success_case_test(test_folder, expected_dependencies_dict, bank_info, expected_result_code=0):
+ """
+ Test Steps:
+ 1. Make sure the return code is what was expected, and that the expected number of banks were returned.
+ 2. Validate bank is in the expected dependencies dictionary.
+ 3. Validate the path to output the metadata file to was assembled correctly.
+ 4. Validate metadata object for this bank is set, and that it has an object assigned to its dependencies field
+ and its includedEvents field
+ 5. Validate metadata object has the correct number of dependencies, and validated that every expected dependency
+ exists in the dependencies list of the metadata object.
+ 6. Validate metadata object has the correct number of events, and validate that every expected event exists in the
+ events of the metadata object.
+ """
expected_bank_count = len(expected_dependencies_dict)
banks, result_code = bank_info.generate_metadata(
@@ -80,8 +92,17 @@ class TestSoundBankMetadataGenerator:
def test_NoMetadataTooFewBanks_ReturnCodeIsError(self, workspace, soundbank_metadata_generator_setup_fixture):
- # Trying to generate metadata for banks in a folder with one or fewer banks and no metadata is not possible
- # and should fail.
+ """
+ Trying to generate metadata for banks in a folder with one or fewer banks and no metadata is not possible
+ and should fail.
+
+ Test Steps:
+ 1. Setup testing environment with only 1 bank file
+ 2. Get Sound Bank Info
+ 3. Attempt to generate sound bank metadata
+ 4. Verify that proper error code is returned
+ """
+ #
test_assets_folder = os.path.join(soundbank_metadata_generator_setup_fixture['tests_dir'], 'assets',
'test_NoMetadataTooFewBanks_ReturnCodeIsError')
if not os.path.isdir(test_assets_folder):
@@ -97,15 +118,30 @@ class TestSoundBankMetadataGenerator:
assert error_code is 2, 'Metadata was generated when there were fewer than two banks in the target directory.'
def test_NoMetadataNoContentBank_NoMetadataGenerated(self, workspace, soundbank_metadata_generator_setup_fixture):
+ """
+ Test Steps:
+ 1. Setup testing environment
+ 2. No expected dependencies
+ 3. Call success case test
+ """
test_assets_folder = os.path.join(soundbank_metadata_generator_setup_fixture['tests_dir'], 'assets',
'test_NoMetadataNoContentBank_NoMetadataGenerated')
expected_dependencies = dict()
success_case_test(test_assets_folder, expected_dependencies, get_bank_info(workspace))
def test_NoMetadataOneContentBank_NoStreamedFiles_OneDependency(self, workspace, soundbank_metadata_generator_setup_fixture):
- # When no Wwise metadata is present, and there is only one content bank in the target directory with no wem
- # files, then only the content bank should have metadata associated with it. The generated metadata should
- # only describe a dependency on the init bank.
+ """
+ When no Wwise metadata is present, and there is only one content bank in the target directory with no wem
+ files, then only the content bank should have metadata associated with it. The generated metadata should
+ only describe a dependency on the init bank.
+
+ Test Steps:
+ 1. Setup testing environment
+ 2. Get current bank info
+ 3. Build expected dependencies
+ 4. Call success case test
+ """
+
test_assets_folder = os.path.join(soundbank_metadata_generator_setup_fixture['tests_dir'], 'assets',
'test_NoMetadataOneContentBank_NoStreamedFiles_OneDependency')
@@ -116,9 +152,18 @@ class TestSoundBankMetadataGenerator:
def test_NoMetadataOneContentBank_StreamedFiles_MultipleDependencies(self, workspace,
soundbank_metadata_generator_setup_fixture):
- # When no Wwise metadata is present, and there is only one content bank in the target directory with wem files
- # present, then only the content bank should have metadata associated with it. The generated metadata should
- # describe a dependency on the init bank and all wem files in the folder.
+ """
+ When no Wwise metadata is present, and there is only one content bank in the target directory with wem files
+ present, then only the content bank should have metadata associated with it. The generated metadata should
+ describe a dependency on the init bank and all wem files in the folder.
+
+ Test Steps:
+ 1. Setup testing environment
+ 2. Get current bank info
+ 3. Build expected dependencies
+ 4. Call success case test
+ """
+
test_assets_folder = os.path.join(soundbank_metadata_generator_setup_fixture['tests_dir'], 'assets',
'test_NoMetadataOneContentBank_StreamedFiles_MultipleDependencies')
@@ -136,10 +181,19 @@ class TestSoundBankMetadataGenerator:
success_case_test(test_assets_folder, expected_dependencies, get_bank_info(workspace))
def test_NoMetadataMultipleBanks_OneDependency_ReturnCodeIsWarning(self, workspace, soundbank_metadata_generator_setup_fixture):
- # When no Wwise metadata is present, and there are multiple content banks in the target directory with wem files
- # present, there is no way to tell which bank requires which wem files. A warning should be emitted,
- # stating that the full dependency graph could not be created, and only dependencies on the init bank are
- # described in the generated metadata files.
+ """
+ When no Wwise metadata is present, and there are multiple content banks in the target directory with wem files
+ present, there is no way to tell which bank requires which wem files. A warning should be emitted,
+ stating that the full dependency graph could not be created, and only dependencies on the init bank are
+ described in the generated metadata files.
+
+ Test Steps:
+ 1. Setup testing environment
+ 2. Get current bank info
+ 3. Build expected dependencies
+ 4. Call success case test
+ """
+
test_assets_folder = os.path.join(soundbank_metadata_generator_setup_fixture['tests_dir'], 'assets',
'test_NoMetadataMultipleBanks_OneDependency_ReturnCodeIsWarning')
bank_info = get_bank_info(workspace)
@@ -150,8 +204,17 @@ class TestSoundBankMetadataGenerator:
success_case_test(test_assets_folder, expected_dependencies, get_bank_info(workspace), expected_result_code=1)
def test_OneContentBank_NoStreamedFiles_OneDependency(self, workspace, soundbank_metadata_generator_setup_fixture):
- # Wwise metadata describes one content bank that contains all media needed by its events. Generated metadata
- # describes a dependency only on the init bank.
+ """
+ Wwise metadata describes one content bank that contains all media needed by its events. Generated metadata
+ describes a dependency only on the init bank.
+
+ Test Steps:
+ 1. Setup testing environment
+ 2. Get current bank info
+ 3. Build expected dependencies
+ 4. Call success case test
+ """
+
test_assets_folder = os.path.join(soundbank_metadata_generator_setup_fixture['tests_dir'], 'assets',
'test_OneContentBank_NoStreamedFiles_OneDependency')
@@ -165,8 +228,17 @@ class TestSoundBankMetadataGenerator:
success_case_test(test_assets_folder, expected_dependencies, get_bank_info(workspace))
def test_OneContentBank_StreamedFiles_MultipleDependencies(self, workspace, soundbank_metadata_generator_setup_fixture):
- # Wwise metadata describes one content bank that references streamed media files needed by its events. Generated
- # metadata describes dependencies on the init bank and wems named by the IDs of referenced streamed media.
+ """
+ Wwise metadata describes one content bank that references streamed media files needed by its events. Generated
+ metadata describes dependencies on the init bank and wems named by the IDs of referenced streamed media.
+
+ Test Steps:
+ 1. Setup testing environment
+ 2. Get current bank info
+ 3. Build expected dependencies
+ 4. Call success case test
+ """
+
test_assets_folder = os.path.join(soundbank_metadata_generator_setup_fixture['tests_dir'], 'assets',
'test_OneContentBank_StreamedFiles_MultipleDependencies')
@@ -187,8 +259,17 @@ class TestSoundBankMetadataGenerator:
success_case_test(test_assets_folder, expected_dependencies, get_bank_info(workspace))
def test_MultipleContentBanks_NoStreamedFiles_OneDependency(self, workspace, soundbank_metadata_generator_setup_fixture):
- # Wwise metadata describes multiple content banks. Each bank contains all media needed by its events. Generated
- # metadata describes each bank having a dependency only on the init bank.
+ """
+ Wwise metadata describes multiple content banks. Each bank contains all media needed by its events. Generated
+ metadata describes each bank having a dependency only on the init bank.
+
+ Test Steps:
+ 1. Setup testing environment
+ 2. Get current bank info
+ 3. Build expected dependencies
+ 4. Call success case test
+ """
+
test_assets_folder = os.path.join(soundbank_metadata_generator_setup_fixture['tests_dir'], 'assets',
'test_MultipleContentBanks_NoStreamedFiles_OneDependency')
@@ -206,8 +287,17 @@ class TestSoundBankMetadataGenerator:
success_case_test(test_assets_folder, expected_dependencies, get_bank_info(workspace))
def test_MultipleContentBanks_Bank1StreamedFiles(self, workspace, soundbank_metadata_generator_setup_fixture):
- # Wwise metadata describes multiple content banks. Bank 1 references streamed media files needed by its events,
- # while bank 2 contains all media need by its events.
+ """
+ Wwise metadata describes multiple content banks. Bank 1 references streamed media files needed by its events,
+ while bank 2 contains all media need by its events.
+
+ Test Steps:
+ 1. Setup testing environment
+ 2. Get current bank info
+ 3. Build expected dependencies
+ 4. Call success case test
+ """
+
test_assets_folder = os.path.join(soundbank_metadata_generator_setup_fixture['tests_dir'], 'assets',
'test_MultipleContentBanks_Bank1StreamedFiles')
@@ -228,9 +318,18 @@ class TestSoundBankMetadataGenerator:
success_case_test(test_assets_folder, expected_dependencies, get_bank_info(workspace))
def test_MultipleContentBanks_SplitBanks_OnlyBankDependenices(self, workspace, soundbank_metadata_generator_setup_fixture):
- # Wwise metadata describes multiple content banks. Bank 3 events require media that is contained in bank 4.
- # Generated metadata describes each bank having a dependency on the init bank, while bank 3 has an additional
- # dependency on bank 4.
+ """
+ Wwise metadata describes multiple content banks. Bank 3 events require media that is contained in bank 4.
+ Generated metadata describes each bank having a dependency on the init bank, while bank 3 has an additional
+ dependency on bank 4.
+
+ Test Steps:
+ 1. Setup testing environment
+ 2. Get current bank info
+ 3. Build expected dependencies
+ 4. Call success case test
+ """
+
test_assets_folder = os.path.join(soundbank_metadata_generator_setup_fixture['tests_dir'], 'assets',
'test_MultipleContentBanks_SplitBanks_OnlyBankDependenices')
@@ -248,9 +347,18 @@ class TestSoundBankMetadataGenerator:
success_case_test(test_assets_folder, expected_dependencies, get_bank_info(workspace))
def test_MultipleContentBanks_ReferencedEvent_MediaEmbeddedInBank(self, workspace, soundbank_metadata_generator_setup_fixture):
- # Wwise metadata describes multiple content banks. Bank 1 contains all media required by its events, while bank
- # 5 contains a reference to an event in bank 1, but no media for that event. Generated metadata describes both
- # banks having a dependency on the init bank, while bank 5 has an additional dependency on bank 1.
+ """
+ Wwise metadata describes multiple content banks. Bank 1 contains all media required by its events, while bank
+ 5 contains a reference to an event in bank 1, but no media for that event. Generated metadata describes both
+ banks having a dependency on the init bank, while bank 5 has an additional dependency on bank 1.
+
+ Test Steps:
+ 1. Setup testing environment
+ 2. Get current bank info
+ 3. Build expected dependencies
+ 4. Call success case test
+ """
+
test_assets_folder = os.path.join(soundbank_metadata_generator_setup_fixture['tests_dir'], 'assets',
'test_MultipleContentBanks_ReferencedEvent_MediaEmbeddedInBank')
@@ -271,10 +379,19 @@ class TestSoundBankMetadataGenerator:
success_case_test(test_assets_folder, expected_dependencies, get_bank_info(workspace))
def test_MultipleContentBanks_ReferencedEvent_MediaStreamed(self, workspace, soundbank_metadata_generator_setup_fixture):
- # Wwise metadata describes multiple content banks. Bank 1 references streamed media files needed by its events,
- # while bank 5 contains a reference to an event in bank 1. This causes bank 5 to also describe a reference to
- # the streamed media file referenced by the event from bank 1. Generated metadata describes both banks having
- # dependencies on the init bank, as well as the wem named by the ID of referenced streamed media.
+ """
+ Wwise metadata describes multiple content banks. Bank 1 references streamed media files needed by its events,
+ while bank 5 contains a reference to an event in bank 1. This causes bank 5 to also describe a reference to
+ the streamed media file referenced by the event from bank 1. Generated metadata describes both banks having
+ dependencies on the init bank, as well as the wem named by the ID of referenced streamed media.
+
+ Test Steps:
+ 1. Setup testing environment
+ 2. Get current bank info
+ 3. Build expected dependencies
+ 4. Call success case test
+ """
+
test_assets_folder = os.path.join(soundbank_metadata_generator_setup_fixture['tests_dir'], 'assets',
'test_MultipleContentBanks_ReferencedEvent_MediaStreamed')
@@ -298,11 +415,20 @@ class TestSoundBankMetadataGenerator:
success_case_test(test_assets_folder, expected_dependencies, get_bank_info(workspace))
def test_MultipleContentBanks_ReferencedEvent_MixedSources(self, workspace, soundbank_metadata_generator_setup_fixture):
- # Wwise metadata describes multiple content banks. Bank 1 references a streamed media files needed by one of its
- # events, and contains all media needed for its other events, while bank 5 contains a reference to two events
- # in bank 1: one that requires streamed media, and one that requires media embedded in bank 1. Generated
- # metadata describes both banks having dependencies on the init bank and the wem named by the ID of referenced
- # streamed media, while bank 5 has an additional dependency on bank 1.
+ """
+ Wwise metadata describes multiple content banks. Bank 1 references a streamed media files needed by one of its
+ events, and contains all media needed for its other events, while bank 5 contains a reference to two events
+ in bank 1: one that requires streamed media, and one that requires media embedded in bank 1. Generated
+ metadata describes both banks having dependencies on the init bank and the wem named by the ID of referenced
+ streamed media, while bank 5 has an additional dependency on bank 1.
+
+ Test Steps:
+ 1. Setup testing environment
+ 2. Get current bank info
+ 3. Build expected dependencies
+ 4. Call success case test
+ """
+
test_assets_folder = os.path.join(soundbank_metadata_generator_setup_fixture['tests_dir'], 'assets',
'test_MultipleContentBanks_ReferencedEvent_MixedSources')
@@ -332,8 +458,17 @@ class TestSoundBankMetadataGenerator:
success_case_test(test_assets_folder, expected_dependencies, get_bank_info(workspace))
def test_MultipleContentBanks_VaryingDependencies_MixedSources(self, workspace, soundbank_metadata_generator_setup_fixture):
- # Wwise metadata describes multiple content banks that have varying dependencies on each other, and dependencies
- # on streamed media files.
+ """
+ Wwise metadata describes multiple content banks that have varying dependencies on each other, and dependencies
+ on streamed media files.
+
+ Test Steps:
+ 1. Setup testing environment
+ 2. Get current bank info
+ 3. Build expected dependencies
+ 4. Call success case test
+ """
+
test_assets_folder = os.path.join(soundbank_metadata_generator_setup_fixture['tests_dir'], 'assets',
'test_MultipleContentBanks_VaryingDependencies_MixedSources')
diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt
index 7ffc2072f1..91228bc71c 100644
--- a/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt
@@ -20,7 +20,7 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_BUILD_TESTS_SUPPORTED AND AutomatedT
TEST_SUITE main
PATH ${CMAKE_CURRENT_LIST_DIR}/test_Atom_MainSuite.py
TEST_SERIAL
- TIMEOUT 300
+ TIMEOUT 400
RUNTIME_DEPENDENCIES
AssetProcessor
AutomatedTesting.Assets
@@ -31,7 +31,7 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_BUILD_TESTS_SUPPORTED AND AutomatedT
TEST_SUITE sandbox
PATH ${CMAKE_CURRENT_LIST_DIR}/test_Atom_SandboxSuite.py
TEST_SERIAL
- TIMEOUT 300
+ TIMEOUT 400
RUNTIME_DEPENDENCIES
AssetProcessor
AutomatedTesting.Assets
diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py
index e701ff8d16..35eaa2e4ce 100644
--- a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py
+++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py
@@ -77,10 +77,10 @@ def run():
def verify_enter_exit_game_mode(component_name):
general.enter_game_mode()
- TestHelper.wait_for_condition(lambda: general.is_in_game_mode(), 1.0)
+ TestHelper.wait_for_condition(lambda: general.is_in_game_mode(), 2.0)
general.log(f"{component_name}_test: Entered game mode: {general.is_in_game_mode()}")
general.exit_game_mode()
- TestHelper.wait_for_condition(lambda: not general.is_in_game_mode(), 1.0)
+ TestHelper.wait_for_condition(lambda: not general.is_in_game_mode(), 2.0)
general.log(f"{component_name}_test: Exit game mode: {not general.is_in_game_mode()}")
def verify_hide_unhide_entity(component_name, entity_obj):
@@ -97,16 +97,16 @@ def run():
def verify_deletion_undo_redo(component_name, entity_obj):
editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntityById", entity_obj.id)
- TestHelper.wait_for_condition(lambda: not hydra.find_entity_by_name(entity_obj.name), 1.0)
+ TestHelper.wait_for_condition(lambda: not hydra.find_entity_by_name(entity_obj.name), 2.0)
general.log(f"{component_name}_test: Entity deleted: {not hydra.find_entity_by_name(entity_obj.name)}")
general.undo()
- TestHelper.wait_for_condition(lambda: hydra.find_entity_by_name(entity_obj.name) is not None, 1.0)
+ TestHelper.wait_for_condition(lambda: hydra.find_entity_by_name(entity_obj.name) is not None, 2.0)
general.log(f"{component_name}_test: UNDO entity deletion works: "
f"{hydra.find_entity_by_name(entity_obj.name) is not None}")
general.redo()
- TestHelper.wait_for_condition(lambda: not hydra.find_entity_by_name(entity_obj.name), 1.0)
+ TestHelper.wait_for_condition(lambda: not hydra.find_entity_by_name(entity_obj.name), 2.0)
general.log(f"{component_name}_test: REDO entity deletion works: "
f"{not hydra.find_entity_by_name(entity_obj.name)}")
@@ -120,7 +120,7 @@ def run():
f"{not is_component_enabled(entity_obj.components[0])}")
for component in components_to_add:
entity_obj.add_component(component)
- TestHelper.wait_for_condition(lambda: is_component_enabled(entity_obj.components[0]), 1.0)
+ TestHelper.wait_for_condition(lambda: is_component_enabled(entity_obj.components[0]), 2.0)
general.log(
f"{component_name}_test: Entity enabled after adding "
f"required components: {is_component_enabled(entity_obj.components[0])}"
diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py
index aafa2ff9b7..fccd750573 100644
--- a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py
+++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py
@@ -18,7 +18,7 @@ import pytest
import editor_python_test_tools.hydra_test_utils as hydra
logger = logging.getLogger(__name__)
-EDITOR_TIMEOUT = 120
+EDITOR_TIMEOUT = 300
TEST_DIRECTORY = os.path.join(os.path.dirname(__file__), "atom_hydra_scripts")
@@ -26,7 +26,161 @@ TEST_DIRECTORY = os.path.join(os.path.dirname(__file__), "atom_hydra_scripts")
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
@pytest.mark.parametrize("level", ["auto_test"])
class TestAtomEditorComponentsMain(object):
+ """Holds tests for Atom components."""
- # It requires at least one test
- def test_Dummy(self, request, editor, level, workspace, project, launcher_platform):
- pass
+ def test_AtomEditorComponents_AddedToEntity(self, request, editor, level, workspace, project, launcher_platform):
+ """
+ Please review the hydra script run by this test for more specific test info.
+ Tests the following Atom components and verifies all "expected_lines" appear in Editor.log:
+ 1. Display Mapper
+ 2. Light
+ 3. Radius Weight Modifier
+ 4. PostFX Layer
+ 5. Physical Sky
+ 6. Global Skylight (IBL)
+ 7. Exposure Control
+ 8. Directional Light
+ 9. DepthOfField
+ 10. Decal (Atom)
+ """
+ cfg_args = [level]
+
+ expected_lines = [
+ # Decal (Atom) Component
+ "Decal (Atom) Entity successfully created",
+ "Decal (Atom)_test: Component added to the entity: True",
+ "Decal (Atom)_test: Component removed after UNDO: True",
+ "Decal (Atom)_test: Component added after REDO: True",
+ "Decal (Atom)_test: Entered game mode: True",
+ "Decal (Atom)_test: Exit game mode: True",
+ "Decal (Atom) Controller|Configuration|Material: SUCCESS",
+ "Decal (Atom)_test: Entity is hidden: True",
+ "Decal (Atom)_test: Entity is shown: True",
+ "Decal (Atom)_test: Entity deleted: True",
+ "Decal (Atom)_test: UNDO entity deletion works: True",
+ "Decal (Atom)_test: REDO entity deletion works: True",
+ # DepthOfField Component
+ "DepthOfField Entity successfully created",
+ "DepthOfField_test: Component added to the entity: True",
+ "DepthOfField_test: Component removed after UNDO: True",
+ "DepthOfField_test: Component added after REDO: True",
+ "DepthOfField_test: Entered game mode: True",
+ "DepthOfField_test: Exit game mode: True",
+ "DepthOfField_test: Entity disabled initially: True",
+ "DepthOfField_test: Entity enabled after adding required components: True",
+ "DepthOfField Controller|Configuration|Camera Entity: SUCCESS",
+ "DepthOfField_test: Entity is hidden: True",
+ "DepthOfField_test: Entity is shown: True",
+ "DepthOfField_test: Entity deleted: True",
+ "DepthOfField_test: UNDO entity deletion works: True",
+ "DepthOfField_test: REDO entity deletion works: True",
+ # Exposure Control Component
+ "Exposure Control Entity successfully created",
+ "Exposure Control_test: Component added to the entity: True",
+ "Exposure Control_test: Component removed after UNDO: True",
+ "Exposure Control_test: Component added after REDO: True",
+ "Exposure Control_test: Entered game mode: True",
+ "Exposure Control_test: Exit game mode: True",
+ "Exposure Control_test: Entity disabled initially: True",
+ "Exposure Control_test: Entity enabled after adding required components: True",
+ "Exposure Control_test: Entity is hidden: True",
+ "Exposure Control_test: Entity is shown: True",
+ "Exposure Control_test: Entity deleted: True",
+ "Exposure Control_test: UNDO entity deletion works: True",
+ "Exposure Control_test: REDO entity deletion works: True",
+ # Global Skylight (IBL) Component
+ "Global Skylight (IBL) Entity successfully created",
+ "Global Skylight (IBL)_test: Component added to the entity: True",
+ "Global Skylight (IBL)_test: Component removed after UNDO: True",
+ "Global Skylight (IBL)_test: Component added after REDO: True",
+ "Global Skylight (IBL)_test: Entered game mode: True",
+ "Global Skylight (IBL)_test: Exit game mode: True",
+ "Global Skylight (IBL) Controller|Configuration|Diffuse Image: SUCCESS",
+ "Global Skylight (IBL) Controller|Configuration|Specular Image: SUCCESS",
+ "Global Skylight (IBL)_test: Entity is hidden: True",
+ "Global Skylight (IBL)_test: Entity is shown: True",
+ "Global Skylight (IBL)_test: Entity deleted: True",
+ "Global Skylight (IBL)_test: UNDO entity deletion works: True",
+ "Global Skylight (IBL)_test: REDO entity deletion works: True",
+ # Physical Sky Component
+ "Physical Sky Entity successfully created",
+ "Physical Sky component was added to entity",
+ "Entity has a Physical Sky component",
+ "Physical Sky_test: Component added to the entity: True",
+ "Physical Sky_test: Component removed after UNDO: True",
+ "Physical Sky_test: Component added after REDO: True",
+ "Physical Sky_test: Entered game mode: True",
+ "Physical Sky_test: Exit game mode: True",
+ "Physical Sky_test: Entity is hidden: True",
+ "Physical Sky_test: Entity is shown: True",
+ "Physical Sky_test: Entity deleted: True",
+ "Physical Sky_test: UNDO entity deletion works: True",
+ "Physical Sky_test: REDO entity deletion works: True",
+ # PostFX Layer Component
+ "PostFX Layer Entity successfully created",
+ "PostFX Layer_test: Component added to the entity: True",
+ "PostFX Layer_test: Component removed after UNDO: True",
+ "PostFX Layer_test: Component added after REDO: True",
+ "PostFX Layer_test: Entered game mode: True",
+ "PostFX Layer_test: Exit game mode: True",
+ "PostFX Layer_test: Entity is hidden: True",
+ "PostFX Layer_test: Entity is shown: True",
+ "PostFX Layer_test: Entity deleted: True",
+ "PostFX Layer_test: UNDO entity deletion works: True",
+ "PostFX Layer_test: REDO entity deletion works: True",
+ # Radius Weight Modifier Component
+ "Radius Weight Modifier Entity successfully created",
+ "Radius Weight Modifier_test: Component added to the entity: True",
+ "Radius Weight Modifier_test: Component removed after UNDO: True",
+ "Radius Weight Modifier_test: Component added after REDO: True",
+ "Radius Weight Modifier_test: Entered game mode: True",
+ "Radius Weight Modifier_test: Exit game mode: True",
+ "Radius Weight Modifier_test: Entity is hidden: True",
+ "Radius Weight Modifier_test: Entity is shown: True",
+ "Radius Weight Modifier_test: Entity deleted: True",
+ "Radius Weight Modifier_test: UNDO entity deletion works: True",
+ "Radius Weight Modifier_test: REDO entity deletion works: True",
+ # Light Component
+ "Light Entity successfully created",
+ "Light_test: Component added to the entity: True",
+ "Light_test: Component removed after UNDO: True",
+ "Light_test: Component added after REDO: True",
+ "Light_test: Entered game mode: True",
+ "Light_test: Exit game mode: True",
+ "Light_test: Entity is hidden: True",
+ "Light_test: Entity is shown: True",
+ "Light_test: Entity deleted: True",
+ "Light_test: UNDO entity deletion works: True",
+ "Light_test: REDO entity deletion works: True",
+ # Display Mapper Component
+ "Display Mapper Entity successfully created",
+ "Display Mapper_test: Component added to the entity: True",
+ "Display Mapper_test: Component removed after UNDO: True",
+ "Display Mapper_test: Component added after REDO: True",
+ "Display Mapper_test: Entered game mode: True",
+ "Display Mapper_test: Exit game mode: True",
+ "Display Mapper_test: Entity is hidden: True",
+ "Display Mapper_test: Entity is shown: True",
+ "Display Mapper_test: Entity deleted: True",
+ "Display Mapper_test: UNDO entity deletion works: True",
+ "Display Mapper_test: REDO entity deletion works: True",
+ ]
+
+ unexpected_lines = [
+ "Trace::Assert",
+ "Trace::Error",
+ "Traceback (most recent call last):",
+ ]
+
+ hydra.launch_and_validate_results(
+ request,
+ TEST_DIRECTORY,
+ editor,
+ "hydra_AtomEditorComponents_AddedToEntity.py",
+ timeout=EDITOR_TIMEOUT,
+ expected_lines=expected_lines,
+ unexpected_lines=unexpected_lines,
+ halt_on_unexpected=True,
+ null_renderer=True,
+ cfg_args=cfg_args,
+ )
diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_SandboxSuite.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_SandboxSuite.py
index 8ca5b5aa31..0fb873e677 100644
--- a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_SandboxSuite.py
+++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_SandboxSuite.py
@@ -19,170 +19,6 @@ import pytest
@pytest.mark.parametrize("level", ["auto_test"])
class TestAtomEditorComponentsSandbox(object):
- @pytest.mark.test_case_id(
- "C32078117", # Area Light
- "C32078130", # Display Mapper
- "C32078129", # Light
- "C32078131", # Radius Weight Modifier
- "C32078127", # PostFX Layer
- "C32078126", # Point Light
- "C32078125", # Physical Sky
- "C32078115", # Global Skylight (IBL)
- "C32078121", # Exposure Control
- "C32078120", # Directional Light
- "C32078119", # DepthOfField
- "C32078118") # Decal
- def test_AtomEditorComponents_AddedToEntity(self, request, editor, level, workspace, project, launcher_platform):
- cfg_args = [level]
-
- expected_lines = [
- # Decal Component
- "Decal (Atom) Entity successfully created",
- "Decal (Atom)_test: Component added to the entity: True",
- "Decal (Atom)_test: Component removed after UNDO: True",
- "Decal (Atom)_test: Component added after REDO: True",
- "Decal (Atom)_test: Entered game mode: True",
- "Decal (Atom)_test: Exit game mode: True",
- "Decal (Atom) Controller|Configuration|Material: SUCCESS",
- "Decal (Atom)_test: Entity is hidden: True",
- "Decal (Atom)_test: Entity is shown: True",
- "Decal (Atom)_test: Entity deleted: True",
- "Decal (Atom)_test: UNDO entity deletion works: True",
- "Decal (Atom)_test: REDO entity deletion works: True",
- # DepthOfField Component
- "DepthOfField Entity successfully created",
- "DepthOfField_test: Component added to the entity: True",
- "DepthOfField_test: Component removed after UNDO: True",
- "DepthOfField_test: Component added after REDO: True",
- "DepthOfField_test: Entered game mode: True",
- "DepthOfField_test: Exit game mode: True",
- "DepthOfField_test: Entity disabled initially: True",
- "DepthOfField_test: Entity enabled after adding required components: True",
- "DepthOfField Controller|Configuration|Camera Entity: SUCCESS",
- "DepthOfField_test: Entity is hidden: True",
- "DepthOfField_test: Entity is shown: True",
- "DepthOfField_test: Entity deleted: True",
- "DepthOfField_test: UNDO entity deletion works: True",
- "DepthOfField_test: REDO entity deletion works: True",
- # Directional Light Component
- "Directional Light Entity successfully created",
- "Directional Light_test: Component added to the entity: True",
- "Directional Light_test: Component removed after UNDO: True",
- "Directional Light_test: Component added after REDO: True",
- "Directional Light_test: Entered game mode: True",
- "Directional Light_test: Exit game mode: True",
- "Directional Light Controller|Configuration|Shadow|Camera: SUCCESS",
- "Directional Light_test: Entity is hidden: True",
- "Directional Light_test: Entity is shown: True",
- "Directional Light_test: Entity deleted: True",
- "Directional Light_test: UNDO entity deletion works: True",
- "Directional Light_test: REDO entity deletion works: True",
- # Exposure Control Component
- "Exposure Control Entity successfully created",
- "Exposure Control_test: Component added to the entity: True",
- "Exposure Control_test: Component removed after UNDO: True",
- "Exposure Control_test: Component added after REDO: True",
- "Exposure Control_test: Entered game mode: True",
- "Exposure Control_test: Exit game mode: True",
- "Exposure Control_test: Entity disabled initially: True",
- "Exposure Control_test: Entity enabled after adding required components: True",
- "Exposure Control_test: Entity is hidden: True",
- "Exposure Control_test: Entity is shown: True",
- "Exposure Control_test: Entity deleted: True",
- "Exposure Control_test: UNDO entity deletion works: True",
- "Exposure Control_test: REDO entity deletion works: True",
- # Global Skylight (IBL) Component
- "Global Skylight (IBL) Entity successfully created",
- "Global Skylight (IBL)_test: Component added to the entity: True",
- "Global Skylight (IBL)_test: Component removed after UNDO: True",
- "Global Skylight (IBL)_test: Component added after REDO: True",
- "Global Skylight (IBL)_test: Entered game mode: True",
- "Global Skylight (IBL)_test: Exit game mode: True",
- "Global Skylight (IBL) Controller|Configuration|Diffuse Image: SUCCESS",
- "Global Skylight (IBL) Controller|Configuration|Specular Image: SUCCESS",
- "Global Skylight (IBL)_test: Entity is hidden: True",
- "Global Skylight (IBL)_test: Entity is shown: True",
- "Global Skylight (IBL)_test: Entity deleted: True",
- "Global Skylight (IBL)_test: UNDO entity deletion works: True",
- "Global Skylight (IBL)_test: REDO entity deletion works: True",
- # Physical Sky Component
- "Physical Sky Entity successfully created",
- "Physical Sky component was added to entity",
- "Entity has a Physical Sky component",
- "Physical Sky_test: Component added to the entity: True",
- "Physical Sky_test: Component removed after UNDO: True",
- "Physical Sky_test: Component added after REDO: True",
- "Physical Sky_test: Entered game mode: True",
- "Physical Sky_test: Exit game mode: True",
- "Physical Sky_test: Entity is hidden: True",
- "Physical Sky_test: Entity is shown: True",
- "Physical Sky_test: Entity deleted: True",
- "Physical Sky_test: UNDO entity deletion works: True",
- "Physical Sky_test: REDO entity deletion works: True",
- # PostFX Layer Component
- "PostFX Layer Entity successfully created",
- "PostFX Layer_test: Component added to the entity: True",
- "PostFX Layer_test: Component removed after UNDO: True",
- "PostFX Layer_test: Component added after REDO: True",
- "PostFX Layer_test: Entered game mode: True",
- "PostFX Layer_test: Exit game mode: True",
- "PostFX Layer_test: Entity is hidden: True",
- "PostFX Layer_test: Entity is shown: True",
- "PostFX Layer_test: Entity deleted: True",
- "PostFX Layer_test: UNDO entity deletion works: True",
- "PostFX Layer_test: REDO entity deletion works: True",
- # Radius Weight Modifier Component
- "Radius Weight Modifier Entity successfully created",
- "Radius Weight Modifier_test: Component added to the entity: True",
- "Radius Weight Modifier_test: Component removed after UNDO: True",
- "Radius Weight Modifier_test: Component added after REDO: True",
- "Radius Weight Modifier_test: Entered game mode: True",
- "Radius Weight Modifier_test: Exit game mode: True",
- "Radius Weight Modifier_test: Entity is hidden: True",
- "Radius Weight Modifier_test: Entity is shown: True",
- "Radius Weight Modifier_test: Entity deleted: True",
- "Radius Weight Modifier_test: UNDO entity deletion works: True",
- "Radius Weight Modifier_test: REDO entity deletion works: True",
- # Light Component
- "Light Entity successfully created",
- "Light_test: Component added to the entity: True",
- "Light_test: Component removed after UNDO: True",
- "Light_test: Component added after REDO: True",
- "Light_test: Entered game mode: True",
- "Light_test: Exit game mode: True",
- "Light_test: Entity is hidden: True",
- "Light_test: Entity is shown: True",
- "Light_test: Entity deleted: True",
- "Light_test: UNDO entity deletion works: True",
- "Light_test: REDO entity deletion works: True",
- # Display Mapper Component
- "Display Mapper Entity successfully created",
- "Display Mapper_test: Component added to the entity: True",
- "Display Mapper_test: Component removed after UNDO: True",
- "Display Mapper_test: Component added after REDO: True",
- "Display Mapper_test: Entered game mode: True",
- "Display Mapper_test: Exit game mode: True",
- "Display Mapper_test: Entity is hidden: True",
- "Display Mapper_test: Entity is shown: True",
- "Display Mapper_test: Entity deleted: True",
- "Display Mapper_test: UNDO entity deletion works: True",
- "Display Mapper_test: REDO entity deletion works: True",
- ]
-
- unexpected_lines = [
- "failed to open",
- "Traceback (most recent call last):",
- ]
-
- hydra.launch_and_validate_results(
- request,
- TEST_DIRECTORY,
- editor,
- "hydra_AtomEditorComponents_AddedToEntity.py",
- timeout=EDITOR_TIMEOUT,
- expected_lines=expected_lines,
- unexpected_lines=unexpected_lines,
- halt_on_unexpected=True,
- null_renderer=True,
- cfg_args=cfg_args,
- )
+ # It requires at least one test
+ def test_Dummy(self, request, editor, level, workspace, project, launcher_platform):
+ pass
diff --git a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/asset_database_utils.py b/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/asset_database_utils.py
index 75df510db1..38df3906a8 100755
--- a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/asset_database_utils.py
+++ b/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/asset_database_utils.py
@@ -47,7 +47,7 @@ def get_active_platforms_from_db(asset_db_path) -> List[str]:
# Convert a source product path into a db product path
# cache_platform/projectname/product_path
def get_db_product_path(workspace, source_path, cache_platform):
- product_path = os.path.join(cache_platform, workspace.project, source_path)
+ product_path = os.path.join(cache_platform, source_path)
product_path = product_path.replace('\\', '/')
return product_path
diff --git a/AutomatedTesting/Gem/PythonTests/editor/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/editor/CMakeLists.txt
new file mode 100644
index 0000000000..834254134e
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/editor/CMakeLists.txt
@@ -0,0 +1,57 @@
+#
+# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+# its licensors.
+#
+# For complete copyright and license terms please see the LICENSE at the root of this
+# distribution (the "License"). All use of this software is governed by the License,
+# or, if provided, by the license below or the license accompanying this file. Do not
+# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_FOUNDATION_TEST_SUPPORTED)
+ ly_add_pytest(
+ NAME AutomatedTesting::EditorTests_Main
+ TEST_SUITE main
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}
+ PYTEST_MARKS "not SUITE_sandbox and not SUITE_periodic and not SUITE_benchmark"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ COMPONENT
+ Editor
+ )
+
+ ly_add_pytest(
+ NAME AutomatedTesting::EditorTests_Periodic
+ TEST_SUITE periodic
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}
+ PYTEST_MARKS "SUITE_periodic"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ COMPONENT
+ Editor
+ )
+
+ ly_add_pytest(
+ NAME AutomatedTesting::EditorTests_Sandbox
+ TEST_SUITE sandbox
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}
+ PYTEST_MARKS "SUITE_sandbox"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ COMPONENT
+ Editor
+ )
+endif()
diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/BasicEditorWorkflows_LevelEntityComponentCRUD.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/BasicEditorWorkflows_LevelEntityComponentCRUD.py
new file mode 100644
index 0000000000..5d4218efd0
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/BasicEditorWorkflows_LevelEntityComponentCRUD.py
@@ -0,0 +1,160 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+"""
+C6351273: Create a new level
+C6384955: Basic Workflow: Entity Manipulation in the Outliner
+C16929880: Add Delete Components
+C15167490: Save a level
+C15167491: Export a level
+"""
+
+import os
+import sys
+from PySide2 import QtWidgets
+
+import azlmbr.bus as bus
+import azlmbr.editor as editor
+import azlmbr.entity as entity
+import azlmbr.math as math
+import azlmbr.paths
+
+sys.path.append(os.path.join(azlmbr.paths.devroot, 'AutomatedTesting', 'Gem', 'PythonTests'))
+from editor_python_test_tools.editor_test_helper import EditorTestHelper
+import editor_python_test_tools.pyside_utils as pyside_utils
+import editor_python_test_tools.hydra_editor_utils as hydra
+
+
+class TestBasicEditorWorkflows(EditorTestHelper):
+ def __init__(self):
+ EditorTestHelper.__init__(self, log_prefix="BasicEditorWorkflows_LevelEntityComponent", args=["level"])
+
+ @pyside_utils.wrap_async
+ async def run_test(self):
+ """
+ Summary:
+ Open Lumberyard editor and check if basic Editor workflows are completable.
+
+ Expected Behavior:
+ - A new level can be created
+ - A new entity can be created
+ - Entity hierarchy can be adjusted
+ - Components can be added/removed/updated
+ - Level can be saved
+ - Level can be exported
+
+ Note:
+ - This test file must be called from the Lumberyard Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ def find_entity_by_name(entity_name):
+ search_filter = entity.SearchFilter()
+ search_filter.names = [entity_name]
+ results = entity.SearchBus(bus.Broadcast, 'SearchEntities', search_filter)
+ if len(results) > 0:
+ return results[0]
+ return None
+
+ # 1) Create a new level
+ editor_window = pyside_utils.get_editor_main_window()
+ new_level_action = pyside_utils.get_action_for_menu_path(editor_window, "File", "New Level")
+ pyside_utils.trigger_action_async(new_level_action)
+ active_modal_widget = await pyside_utils.wait_for_modal_widget()
+ new_level_dlg = active_modal_widget.findChild(QtWidgets.QWidget, "CNewLevelDialog")
+ if new_level_dlg:
+ if new_level_dlg.windowTitle() == "New Level":
+ self.log("New Level dialog opened")
+ grp_box = new_level_dlg.findChild(QtWidgets.QGroupBox, "STATIC_GROUP1")
+ level_name = grp_box.findChild(QtWidgets.QLineEdit, "LEVEL")
+ level_name.setText(self.args["level"])
+ level_folders = grp_box.findChild(QtWidgets.QComboBox, "LEVEL_FOLDERS")
+ level_folders.setCurrentText("Levels/")
+ button_box = new_level_dlg.findChild(QtWidgets.QDialogButtonBox, "buttonBox")
+ button_box.button(QtWidgets.QDialogButtonBox.Ok).click()
+
+ # Verify new level was created successfully
+ level_create_success = await pyside_utils.wait_for_condition(lambda: editor.EditorToolsApplicationRequestBus(
+ bus.Broadcast, "GetCurrentLevelName") == self.args["level"], 5.0)
+ self.test_success = level_create_success
+ self.log(f"Create and load new level: {level_create_success}")
+
+ # Execute EditorTestHelper setup since level was created outside of EditorTestHelper's methods
+ self.test_success = self.test_success and self.after_level_load()
+
+ # 2) Delete existing entities, and create and manipulate new entities via Entity Inspector
+ search_filter = azlmbr.entity.SearchFilter()
+ all_entities = entity.SearchBus(azlmbr.bus.Broadcast, "SearchEntities", search_filter)
+ editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntities", all_entities)
+ entity_outliner_widget = editor_window.findChild(QtWidgets.QWidget, "OutlinerWidgetUI")
+ outliner_object_list = entity_outliner_widget.findChild(QtWidgets.QWidget, "m_objectList_Contents")
+ outliner_tree = outliner_object_list.findChild(QtWidgets.QWidget, "m_objectTree")
+ await pyside_utils.trigger_context_menu_entry(outliner_tree, "Create entity")
+
+ # Find the new entity
+ parent_entity_id = find_entity_by_name("Entity1")
+ parent_entity_success = await pyside_utils.wait_for_condition(lambda: parent_entity_id is not None, 5.0)
+ self.test_success = self.test_success and parent_entity_success
+ self.log(f"New entity creation: {parent_entity_success}")
+
+ # TODO: Replace Hydra call to creates child entity and add components with context menu triggering - LYN-3951
+ # Create a new child entity
+ child_entity = hydra.Entity("Child")
+ entity_position = math.Vector3(0.0, 0.0, 0.0)
+ components_to_add = []
+ child_entity.create_entity(entity_position, components_to_add, parent_entity_id)
+
+ # Verify entity hierarchy
+ child_entity.get_parent_info()
+ self.test_success = self.test_success and child_entity.parent_id == parent_entity_id
+ self.log(f"Create entity hierarchy: {child_entity.parent_id == parent_entity_id}")
+
+ # 3) Add/configure a component on an entity
+ # Add component and verify success
+ child_entity.add_component("Box Shape")
+ component_add_success = self.wait_for_condition(lambda: hydra.has_components(child_entity.id, ["Box Shape"]), 5.0)
+ self.test_success = self.test_success and component_add_success
+ self.log(f"Add component: {component_add_success}")
+
+ # Update the component
+ dimensions_to_set = math.Vector3(16.0, 16.0, 16.0)
+ child_entity.get_set_test(0, "Box Shape|Box Configuration|Dimensions", dimensions_to_set)
+ box_shape_dimensions = hydra.get_component_property_value(child_entity.components[0], "Box Shape|Box Configuration|Dimensions")
+ self.test_success = self.test_success and box_shape_dimensions == dimensions_to_set
+ self.log(f"Component update: {box_shape_dimensions == dimensions_to_set}")
+
+ # Remove the component
+ child_entity.remove_component("Box Shape")
+ component_rem_success = self.wait_for_condition(lambda: not hydra.has_components(child_entity.id, ["Box Shape"]),
+ 5.0)
+ self.test_success = self.test_success and component_rem_success
+ self.log(f"Remove component: {component_rem_success}")
+
+ # 4) Save the level
+ save_level_action = pyside_utils.get_action_for_menu_path(editor_window, "File", "Save")
+ pyside_utils.trigger_action_async(save_level_action)
+
+ # 5) Export the level
+ export_action = pyside_utils.get_action_for_menu_path(editor_window, "Game", "Export to Engine")
+ pyside_utils.trigger_action_async(export_action)
+ level_pak_file = os.path.join(
+ "AutomatedTesting", "Levels", self.args["level"], "level.pak"
+ )
+ export_success = self.wait_for_condition(lambda: os.path.exists(level_pak_file), 5.0)
+ self.test_success = self.test_success and export_success
+ self.log(f"Save and Export: {export_success}")
+
+
+test = TestBasicEditorWorkflows()
+test.run()
diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_EditMenuOptions.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_EditMenuOptions.py
index 208ef40d41..3eeb3ddf84 100644
--- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_EditMenuOptions.py
+++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_EditMenuOptions.py
@@ -64,8 +64,6 @@ class TestEditMenuOptions(EditorTestHelper):
("Modify", "Transform Mode", "Move"),
("Modify", "Transform Mode", "Rotate"),
("Modify", "Transform Mode", "Scale"),
- ("Lock Selection",),
- ("Unlock All Entities",),
("Editor Settings", "Global Preferences"),
("Editor Settings", "Graphics Settings"),
("Editor Settings", "Editor Settings Manager"),
diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_ViewMenuOptions.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_ViewMenuOptions.py
index 05ee802d19..173d658b3c 100644
--- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_ViewMenuOptions.py
+++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_ViewMenuOptions.py
@@ -50,7 +50,6 @@ class TestViewMenuOptions(EditorTestHelper):
("Center on Selection",),
("Show Quick Access Bar",),
("Viewport", "Wireframe"),
- ("Viewport", "Grid Settings"),
("Viewport", "Go to Position"),
("Viewport", "Center on Selection"),
("Viewport", "Go to Location"),
diff --git a/AutomatedTesting/Gem/PythonTests/editor/test_AssetPicker.py b/AutomatedTesting/Gem/PythonTests/editor/test_AssetPicker.py
index ac499d734f..90ca3690e4 100644
--- a/AutomatedTesting/Gem/PythonTests/editor/test_AssetPicker.py
+++ b/AutomatedTesting/Gem/PythonTests/editor/test_AssetPicker.py
@@ -42,6 +42,7 @@ class TestAssetPicker(object):
@pytest.mark.test_case_id("C13751579", "C1508814")
@pytest.mark.SUITE_periodic
+ @pytest.mark.xfail # ATOM-15493
def test_AssetPicker_UI_UX(self, request, editor, level, launcher_platform):
expected_lines = [
"TestEntity Entity successfully created",
diff --git a/AutomatedTesting/Gem/PythonTests/editor/test_BasicEditorWorkflows.py b/AutomatedTesting/Gem/PythonTests/editor/test_BasicEditorWorkflows.py
new file mode 100644
index 0000000000..b045b364a3
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/editor/test_BasicEditorWorkflows.py
@@ -0,0 +1,63 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+import os
+import pytest
+
+# Bail on the test if ly_test_tools doesn't exist.
+pytest.importorskip('ly_test_tools')
+import ly_test_tools.environment.file_system as file_system
+import editor_python_test_tools.hydra_test_utils as hydra
+
+test_directory = os.path.join(os.path.dirname(__file__), "EditorScripts")
+log_monitor_timeout = 180
+
+
+@pytest.mark.parametrize('project', ['AutomatedTesting'])
+@pytest.mark.parametrize('level', ['tmp_level'])
+@pytest.mark.usefixtures("automatic_process_killer")
+@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
+class TestBasicEditorWorkflows(object):
+
+ @pytest.fixture(autouse=True)
+ def setup_teardown(self, request, workspace, project, level):
+ def teardown():
+ file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
+
+ request.addfinalizer(teardown)
+
+ file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
+
+ @pytest.mark.test_case_id("C6351273", "C6384955", "C16929880", "C15167490", "C15167491")
+ @pytest.mark.SUITE_main
+ def test_BasicEditorWorkflows_LevelEntityComponentCRUD(self, request, editor, level, launcher_platform):
+
+ expected_lines = [
+ "Create and load new level: True",
+ "New entity creation: True",
+ "Create entity hierarchy: True",
+ "Add component: True",
+ "Component update: True",
+ "Remove component: True",
+ "Save and Export: True",
+ "BasicEditorWorkflows_LevelEntityComponent: result=SUCCESS",
+ ]
+
+ hydra.launch_and_validate_results(
+ request,
+ test_directory,
+ editor,
+ "BasicEditorWorkflows_LevelEntityComponentCRUD.py",
+ expected_lines,
+ cfg_args=[level],
+ timeout=log_monitor_timeout,
+ auto_test_mode=False
+ )
diff --git a/AutomatedTesting/Gem/PythonTests/editor/test_Docking.py b/AutomatedTesting/Gem/PythonTests/editor/test_Docking.py
index a75b3b36cd..f887560a19 100644
--- a/AutomatedTesting/Gem/PythonTests/editor/test_Docking.py
+++ b/AutomatedTesting/Gem/PythonTests/editor/test_Docking.py
@@ -39,8 +39,8 @@ class TestDocking(object):
file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
@pytest.mark.test_case_id("C6376081")
- @pytest.mark.SUITE_periodic
- def test_basic_docked_tools(self, request, editor, level, launcher_platform):
+ @pytest.mark.SUITE_sandbox
+ def test_Docking_BasicDockedTools(self, request, editor, level, launcher_platform):
expected_lines = [
"The tools are all docked together in a tabbed widget",
"Entity Outliner works when docked, can select an Entity",
diff --git a/AutomatedTesting/Gem/PythonTests/editor/test_Menus.py b/AutomatedTesting/Gem/PythonTests/editor/test_Menus.py
index 251bd7cfed..c2da1343de 100644
--- a/AutomatedTesting/Gem/PythonTests/editor/test_Menus.py
+++ b/AutomatedTesting/Gem/PythonTests/editor/test_Menus.py
@@ -39,7 +39,7 @@ class TestMenus(object):
file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
@pytest.mark.test_case_id("C16780783", "C2174438")
- @pytest.mark.SUITE_periodic
+ @pytest.mark.SUITE_sandbox
def test_Menus_EditMenuOptions_Work(self, request, editor, level, launcher_platform):
expected_lines = [
"Undo Action triggered",
@@ -59,8 +59,6 @@ class TestMenus(object):
"Move Action triggered",
"Rotate Action triggered",
"Scale Action triggered",
- "Lock Selection Action triggered",
- "Unlock All Entities Action triggered",
"Global Preferences Action triggered",
"Graphics Settings Action triggered",
"Editor Settings Manager Action triggered",
@@ -93,7 +91,6 @@ class TestMenus(object):
"Center on Selection Action triggered",
"Show Quick Access Bar Action triggered",
"Wireframe Action triggered",
- "Grid Settings Action triggered",
"Go to Position Action triggered",
"Center on Selection Action triggered",
"Go to Location Action triggered",
@@ -116,7 +113,7 @@ class TestMenus(object):
)
@pytest.mark.test_case_id("C16780778")
- @pytest.mark.SUITE_periodic
+ @pytest.mark.SUITE_sandbox
def test_Menus_FileMenuOptions_Work(self, request, editor, level, launcher_platform):
expected_lines = [
"New Level Action triggered",
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/largeworlds/CMakeLists.txt
new file mode 100644
index 0000000000..c7fd43c7b2
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/CMakeLists.txt
@@ -0,0 +1,185 @@
+#
+# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+# its licensors.
+#
+# For complete copyright and license terms please see the LICENSE at the root of this
+# distribution (the "License"). All use of this software is governed by the License,
+# or, if provided, by the license below or the license accompanying this file. Do not
+# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_LARGE_WORLDS_TEST_SUPPORTED)
+
+## DynVeg ##
+
+ ly_add_pytest(
+ NAME AutomatedTesting::DynamicVegetationTests_Main
+ TEST_SERIAL
+ TEST_SUITE main
+ PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg
+ PYTEST_MARKS "not SUITE_sandbox and not SUITE_periodic and not SUITE_benchmark"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ Legacy::Editor
+ AutomatedTesting.GameLauncher
+ AutomatedTesting.Assets
+ COMPONENT
+ LargeWorlds
+ )
+
+
+ ly_add_pytest(
+ NAME AutomatedTesting::DynamicVegetationTests_Sandbox
+ TEST_SERIAL
+ TEST_SUITE sandbox
+ PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg
+ PYTEST_MARKS "SUITE_sandbox"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ Legacy::Editor
+ AutomatedTesting.GameLauncher
+ AutomatedTesting.Assets
+ COMPONENT
+ LargeWorlds
+ )
+
+ ly_add_pytest(
+ NAME AutomatedTesting::DynamicVegetationFilterTests_Periodic
+ TEST_SERIAL
+ TEST_SUITE periodic
+ PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg
+ PYTEST_MARKS "SUITE_periodic and dynveg_filter"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ Legacy::Editor
+ AutomatedTesting.Assets
+ COMPONENT
+ LargeWorlds
+ )
+
+ ly_add_pytest(
+ NAME AutomatedTesting::DynamicVegetationModifierTests_Periodic
+ TEST_SERIAL
+ TEST_SUITE periodic
+ PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg
+ PYTEST_MARKS "SUITE_periodic and dynveg_modifier"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ Legacy::Editor
+ AutomatedTesting.Assets
+ COMPONENT
+ LargeWorlds
+ )
+
+ ly_add_pytest(
+ NAME AutomatedTesting::DynamicVegetationRegressionTests_Periodic
+ TEST_SERIAL
+ TEST_SUITE periodic
+ PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg
+ PYTEST_MARKS "SUITE_periodic and dynveg_regression"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ Legacy::Editor
+ AutomatedTesting.Assets
+ COMPONENT
+ LargeWorlds
+ )
+
+ ly_add_pytest(
+ NAME AutomatedTesting::DynamicVegetationAreaTests_Periodic
+ TEST_SERIAL
+ TEST_SUITE periodic
+ PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg
+ PYTEST_MARKS "SUITE_periodic and dynveg_area"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ Legacy::Editor
+ AutomatedTesting.Assets
+ COMPONENT
+ LargeWorlds
+ )
+
+ ly_add_pytest(
+ NAME AutomatedTesting::DynamicVegetationMiscTests_Periodic
+ TEST_SERIAL
+ TEST_SUITE periodic
+ PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg
+ PYTEST_MARKS "SUITE_periodic and dynveg_misc"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ Legacy::Editor
+ AutomatedTesting.Assets
+ COMPONENT
+ LargeWorlds
+ )
+
+ ly_add_pytest(
+ NAME AutomatedTesting::DynamicVegetationSurfaceTagTests_Periodic
+ TEST_SERIAL
+ TEST_SUITE periodic
+ PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg
+ PYTEST_MARKS "SUITE_periodic and dynveg_surfacetagemitter"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ Legacy::Editor
+ AutomatedTesting.Assets
+ COMPONENT
+ LargeWorlds
+ )
+## LandscapeCanvas ##
+
+ ly_add_pytest(
+ NAME AutomatedTesting::LandscapeCanvasTests_Main
+ TEST_SERIAL
+ TEST_SUITE main
+ PATH ${CMAKE_CURRENT_LIST_DIR}/landscape_canvas
+ PYTEST_MARKS "not SUITE_sandbox and not SUITE_periodic and not SUITE_benchmark"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ Legacy::Editor
+ AutomatedTesting.Assets
+ COMPONENT
+ LargeWorlds
+ )
+
+ ly_add_pytest(
+ NAME AutomatedTesting::LandscapeCanvasTests_Periodic
+ TEST_SERIAL
+ TEST_SUITE periodic
+ PATH ${CMAKE_CURRENT_LIST_DIR}/landscape_canvas
+ PYTEST_MARKS "SUITE_periodic"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ Legacy::Editor
+ AutomatedTesting.Assets
+ COMPONENT
+ LargeWorlds
+ )
+
+## GradientSignal ##
+ ly_add_pytest(
+ NAME AutomatedTesting::GradientSignalTests_Periodic
+ TEST_SERIAL
+ TEST_SUITE periodic
+ PATH ${CMAKE_CURRENT_LIST_DIR}/gradient_signal
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ Legacy::Editor
+ AutomatedTesting.Assets
+ COMPONENT
+ LargeWorlds
+ )
+
+endif()
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius.py
index 1ccfc43585..d0c6fc3c5a 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius.py
@@ -82,42 +82,34 @@ class TestDistanceBetweenFilterComponentOverrides(EditorTestHelper):
editor.EditorComponentAPIBus(bus.Broadcast, "SetComponentProperty", veg_system_settings_component,
'Configuration|Area System Settings|Sector Point Density', 16)
- # Add a Vegetation Debugger component to allow area refreshes
- hydra.add_level_component("Vegetation Debugger")
-
# 5) Add a Vegetation Distance Between Filter, toggle overrides on both the component and descriptor,
# and verify initial instance counts are accurate
spawner_entity.add_component("Vegetation Distance Between Filter")
spawner_entity.get_set_test(3, "Configuration|Allow Per-Item Overrides", True)
spawner_entity.get_set_test(2, "Configuration|Embedded Assets|[0]|Distance Between Filter (Radius)|Override Enabled", True)
- general.run_console('veg_debugClearAllAreas')
- self.test_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_a, 0.5, 1), 5.0) and \
- self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_b, 0.5, 2), 5.0) and \
- self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_c, 0.5, 2), 5.0) and \
- self.test_success
+ num_expected = 16 * 16
+ initial_success = self.wait_for_condition(lambda: dynveg.validate_instance_count_in_entity_shape(spawner_entity.id, num_expected), 5.0)
+ self.test_success = self.test_success and initial_success
# 6) Change Radius Min to 1.0, refresh, and verify instance counts are accurate
spawner_entity.get_set_test(2, "Configuration|Embedded Assets|[0]|Distance Between Filter (Radius)|Radius Min", 1.0)
- general.run_console('veg_debugClearAllAreas')
- self.test_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_a, 0.5, 1), 5.0) and \
- self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_b, 0.5, 0), 5.0) and \
- self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_c, 0.5, 1), 5.0) and \
- self.test_success
+ point_a_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_a, 0.5, 1), 5.0)
+ point_b_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_b, 0.5, 0), 5.0)
+ point_c_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_c, 0.5, 1), 5.0)
+ self.test_success = self.test_success and point_a_success and point_b_success and point_c_success
# 7) Change Radius Min to 2.0, refresh, and verify instance counts are accurate
spawner_entity.get_set_test(2, "Configuration|Embedded Assets|[0]|Distance Between Filter (Radius)|Radius Min", 2.0)
- general.run_console('veg_debugClearAllAreas')
- self.test_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_a, 0.5, 1), 5.0) and \
- self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_b, 0.5, 0), 5.0) and \
- self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_c, 0.5, 0), 5.0) and \
- self.test_success
+ point_a_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_a, 0.5, 1), 5.0)
+ point_b_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_b, 0.5, 0), 5.0)
+ point_c_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_c, 0.5, 0), 5.0)
+ self.test_success = self.test_success and point_a_success and point_b_success and point_c_success
# 8) Change Radius Min to 16.0, refresh, and verify instance counts are accurate, only a single instance should plant
spawner_entity.get_set_test(2, "Configuration|Embedded Assets|[0]|Distance Between Filter (Radius)|Radius Min", 16.0)
- general.run_console('veg_debugClearAllAreas')
num_expected_instances = 1
final_check_success = self.wait_for_condition(lambda: dynveg.validate_instance_count_in_entity_shape(spawner_entity.id, num_expected_instances), 5.0)
- self.test_success = final_check_success and self.test_success
+ self.test_success = self.test_success and final_check_success
test = TestDistanceBetweenFilterComponentOverrides()
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius.py
index 09c5fd63cf..d342afd7ca 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius.py
@@ -80,35 +80,29 @@ class TestDistanceBetweenFilterComponent(EditorTestHelper):
editor.EditorComponentAPIBus(bus.Broadcast, "SetComponentProperty", veg_system_settings_component,
'Configuration|Area System Settings|Sector Point Density', 16)
- # Add a Vegetation Debugger component to allow area refreshes
- hydra.add_level_component("Vegetation Debugger")
-
# 5) Add a Vegetation Distance Between Filter and verify initial instance counts are accurate
spawner_entity.add_component("Vegetation Distance Between Filter")
- self.test_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_a, 0.5, 1), 5.0) and \
- self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_b, 0.5, 2), 5.0) and \
- self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_c, 0.5, 2), 5.0) and \
- self.test_success
+ num_expected = 16 * 16
+ num_expected = 16 * 16
+ initial_success = self.wait_for_condition(lambda: dynveg.validate_instance_count_in_entity_shape(spawner_entity.id, num_expected), 5.0)
+ self.test_success = self.test_success and initial_success
# 6) Change Radius Min to 1.0, refresh, and verify instance counts are accurate
spawner_entity.get_set_test(3, "Configuration|Radius Min", 1.0)
- general.run_console('veg_debugClearAllAreas')
- self.test_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_a, 0.5, 1), 5.0) and \
- self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_b, 0.5, 0), 5.0) and \
- self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_c, 0.5, 1), 5.0) and \
- self.test_success
+ point_a_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_a, 0.5, 1), 5.0)
+ point_b_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_b, 0.5, 0), 5.0)
+ point_c_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_c, 0.5, 1), 5.0)
+ self.test_success = self.test_success and point_a_success and point_b_success and point_c_success
# 7) Change Radius Min to 2.0, refresh, and verify instance counts are accurate
spawner_entity.get_set_test(3, "Configuration|Radius Min", 2.0)
- general.run_console('veg_debugClearAllAreas')
- self.test_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_a, 0.5, 1), 5.0) and \
- self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_b, 0.5, 0), 5.0) and \
- self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_c, 0.5, 0), 5.0) and \
- self.test_success
+ point_a_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_a, 0.5, 1), 5.0)
+ point_b_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_b, 0.5, 0), 5.0)
+ point_c_success = self.wait_for_condition(lambda: dynveg.validate_instance_count(instance_query_point_c, 0.5, 0), 5.0)
+ self.test_success = self.test_success and point_a_success and point_b_success and point_c_success
# 8) Change Radius Min to 16.0, refresh, and verify instance counts are accurate
spawner_entity.get_set_test(3, "Configuration|Radius Min", 16.0)
- general.run_console('veg_debugClearAllAreas')
num_expected_instances = 1
final_check_success = self.wait_for_condition(lambda: dynveg.validate_instance_count_in_entity_shape(spawner_entity.id, num_expected_instances), 5.0)
self.test_success = final_check_success and self.test_success
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_BasicSurfaceTagCreation.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_BasicSurfaceTagCreation.py
index 4f58a23a19..730a557a9e 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_BasicSurfaceTagCreation.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_BasicSurfaceTagCreation.py
@@ -23,6 +23,25 @@ class TestSurfaceMaskFilter_BasicSurfaceTagCreation(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="TestSurfaceMaskFilter_BasicSurfaceTagCreation", args=["level"])
def run_test(self):
+ """
+ Summary:
+ Verifies basic surface tag value equality
+
+ Expected Behavior:
+ Surface tags of the same name are equal, and different names aren't.
+
+ Test Steps:
+ 1) Open level
+ 2) Create 2 new surface tags of identical names and verify they resolve as equal.
+ 3) Create another new tag of a different name and verify they resolve as different.
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
self.log("SurfaceTag test started")
# Create a level
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/VegetationInstances_DespawnWhenOutOfRange.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/VegetationInstances_DespawnWhenOutOfRange.py
index c25761d655..46c5483988 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/VegetationInstances_DespawnWhenOutOfRange.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/VegetationInstances_DespawnWhenOutOfRange.py
@@ -33,6 +33,25 @@ class TestVegetationInstances_DespawnWhenOutOfRange(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix='VegetationInstances_DespawnWhenOutOfRange', args=['level'])
def run_test(self):
+ """
+ Summary:
+ Verifies that vegetation instances properly spawn/despawn based on camera range.
+
+ Expected Behavior:
+ Vegetation instances despawn when out of camera range.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Create a simple vegetation area, and set the view position near the spawner. Verify instances plant.
+ 3) Move the view position away from the spawner. Verify instances despawn.
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
# Create a new level
self.test_success = self.create_level(
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py
index 9898570692..ead1e8779c 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py
@@ -41,7 +41,7 @@ class TestDynamicSliceInstanceSpawner(object):
return console
@pytest.mark.test_case_id("C28851763")
- @pytest.mark.SUITE_periodic
+ @pytest.mark.SUITE_main
@pytest.mark.dynveg_area
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
def test_DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks(self, request, editor, level, workspace, project,
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py
index 7bd8484cf4..ca71cd2137 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py
@@ -37,7 +37,7 @@ class TestEmptyInstanceSpawner(object):
file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
@pytest.mark.test_case_id("C28851762")
- @pytest.mark.SUITE_periodic
+ @pytest.mark.SUITE_main
@pytest.mark.dynveg_area
def test_EmptyInstanceSpawner_EmptySpawnerWorks(self, request, editor, level, launcher_platform):
cfg_args = [level]
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientGenerators_Incompatibilities.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientGenerators_Incompatibilities.py
index cc9a15bba0..c37bc9780f 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientGenerators_Incompatibilities.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientGenerators_Incompatibilities.py
@@ -28,8 +28,21 @@ class TestGradientGeneratorIncompatibilities(EditorTestHelper):
def run_test(self):
"""
Summary:
- Verify that Entities are not active when a Gradient Generator and incompatible component are both present
- on the same Entity.
+ This test verifies that components are disabled when conflicting components are present on the same entity.
+
+ Expected Behavior:
+ Gradient Generator components are incompatible with Vegetation area components.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Create a new entity in the level
+ 3) Add each Gradient Generator component to an entity, and add a Vegetation Area component to the same entity
+ 4) Verify that components are only enabled when entity is free of a conflicting component
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
:return: None
"""
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientModifiers_Incompatibilities.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientModifiers_Incompatibilities.py
index b7d12d074a..f2edc2924e 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientModifiers_Incompatibilities.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientModifiers_Incompatibilities.py
@@ -28,8 +28,21 @@ class TestGradientModifiersIncompatibilities(EditorTestHelper):
def run_test(self):
"""
Summary:
- Verify that Entities are not active when a Gradient Modifier and incompatible component are both present
- on the same Entity.
+ This test verifies that components are disabled when conflicting components are present on the same entity.
+
+ Expected Behavior:
+ Gradient Modifier components are incompatible with Vegetation area components.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Create a new entity in the level
+ 3) Add each Gradient Modifier component to an entity, and add a Vegetation Area component to the same entity
+ 4) Verify that components are only enabled when entity is free of a conflicting component
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
:return: None
"""
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin.py
index c37ee36265..45da74d6cd 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin.py
@@ -9,19 +9,6 @@ remove or modify any license notices. This file is distributed on an "AS IS" BAS
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
"""
-"""
-The below cases are combined in this script
-C2676829
-C3961326
-C3980659
-C3980664
-C3980669
-C3416548
-C2676823
-C3961321
-C2676826
-"""
-
import os
import sys
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_DefaultPinnedEntityIsSelf.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_DefaultPinnedEntityIsSelf.py
index 5a758b9d89..b8f4114d30 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_DefaultPinnedEntityIsSelf.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_DefaultPinnedEntityIsSelf.py
@@ -44,7 +44,21 @@ class TestGradientPreviewSettings(EditorTestHelper):
def run_test(self):
"""
Summary:
- Verify if the current entity is set to the pin preview to shape entity by default for several components.
+ This test verifies default values for the pinned entity for Gradient Preview settings.
+
+ Expected Behavior:
+ Pinned entity is self for all gradient generator/modifiers.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Create a new entity in the level
+ 3) Add each Gradient Generator component to an entity, and verify the Pin Preview to Shape property is set to
+ self
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
:return: None
"""
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_ComponentDependencies.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_ComponentDependencies.py
index a16e37e0fc..8e2d0611af 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_ComponentDependencies.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_ComponentDependencies.py
@@ -31,11 +31,21 @@ class TestGradientSurfaceTagEmitterDependencies(EditorTestHelper):
def run_test(self):
"""
Summary:
- Component has a dependency on a Gradient component
+ This test verifies that the Gradient Surface Tag Emitter component is dependent on a gradient component.
Expected Result:
- Component is disabled until a Gradient Generator, Modifier or Gradient Reference component
- (and any sub-dependencies) is added to the entity.
+ Gradient Surface Tag Emitter component is disabled until a Gradient Generator, Modifier or Gradient Reference
+ component (and any sub-dependencies) is added to the entity.
+
+ Test Steps:
+ 1) Open level
+ 2) Create a new entity with a Gradient Surface Tag Emitter component
+ 3) Verify the component is disabled until a dependent component is also added to the entity
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
:return: None
"""
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_RequiresShape.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_RequiresShape.py
index e1e901f2f7..2311363db9 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_RequiresShape.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_RequiresShape.py
@@ -28,8 +28,20 @@ class TestGradientTransformRequiresShape(EditorTestHelper):
def run_test(self):
"""
Summary:
- Verify that Gradient Transform Modifier component requires a
- Shape component before the Entity can become active.
+ This test verifies that the Gradient Transform Modifier component is dependent on a shape component.
+
+ Expected Result:
+ Gradient Transform Modifier component is disabled until a shape component is added to the entity.
+
+ Test Steps:
+ 1) Open level
+ 2) Create a new entity with a Gradient Transform Modifier component
+ 3) Verify the component is disabled until a shape component is also added to the entity
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
:return: None
"""
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_RequiresShape.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_RequiresShape.py
index dab8e6928a..a5d9632fd6 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_RequiresShape.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_RequiresShape.py
@@ -28,8 +28,20 @@ class TestImageGradientRequiresShape(EditorTestHelper):
def run_test(self):
"""
Summary:
- Verify that Image Gradient component requires a
- Shape component before the Entity can become active.
+ This test verifies that the Image Gradient component is dependent on a shape component.
+
+ Expected Result:
+ Gradient Transform Modifier component is disabled until a shape component is added to the entity.
+
+ Test Steps:
+ 1) Open level
+ 2) Create a new entity with a Image Gradient component
+ 3) Verify the component is disabled until a shape component is also added to the entity
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
:return: None
"""
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_DependentComponentsAdded.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_DependentComponentsAdded.py
index d1e0b68ef4..c41d153cfa 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_DependentComponentsAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_DependentComponentsAdded.py
@@ -33,6 +33,26 @@ class TestAreaNodeComponentDependency(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="AreaNodeComponentDependency", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that the Landscape Canvas nodes can be added to a graph, and correctly create entities with
+ proper dependent components.
+
+ Expected Behavior:
+ All expected component dependencies are met when adding an area node to a graph.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Drag each of the area nodes to the graph area, and ensure the proper dependent components are added
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
def onEntityCreated(parameters):
global newEntityId
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityCreatedOnNodeAdd.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityCreatedOnNodeAdd.py
index 4e429a192b..fb977b4987 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityCreatedOnNodeAdd.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityCreatedOnNodeAdd.py
@@ -33,7 +33,25 @@ class TestGradientNodeEntityCreate(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="AreaNodeEntityCreate", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that the Landscape Canvas nodes can be added to a graph, and correctly create entities.
+ Expected Behavior:
+ New entities are created when dragging area nodes to graph area.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Drag each of the area nodes to the graph area, and ensure a new entity is created
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
def onEntityCreated(parameters):
global newEntityId
newEntityId = parameters[0]
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityRemovedOnNodeDelete.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityRemovedOnNodeDelete.py
index 38f8641b4c..57ba8fc006 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityRemovedOnNodeDelete.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityRemovedOnNodeDelete.py
@@ -34,7 +34,26 @@ class TestAreaNodeEntityDelete(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="AreaNodeEntityDelete", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that the Landscape Canvas node deletion properly cleans up entities in the Editor.
+ Expected Behavior:
+ Entities are removed when area nodes are deleted from a graph.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Drag each of the area nodes to the graph area, and ensure a new entity is created
+ 4) Delete the nodes, and ensure the newly created entities are removed
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
def onEntityCreated(parameters):
global createdEntityId
createdEntityId = parameters[0]
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ComponentUpdates_UpdateGraph.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ComponentUpdates_UpdateGraph.py
index 26062c01f8..60527b64d2 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ComponentUpdates_UpdateGraph.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ComponentUpdates_UpdateGraph.py
@@ -9,24 +9,6 @@ remove or modify any license notices. This file is distributed on an "AS IS" BAS
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
"""
-
-"""
-C22602072 - Graph is updated when underlying components are added/removed
-
-1. Open Level.
-2. Find LandscapeCanvas named entity.
-3. Ensure Vegetation Distribution Component is present on the BushSpawner entity.
-4. Open graph and ensure Distribution Filter wrapped node is present.
-5. Delete the Vegetation Distribution Filter component from the BushSpawner entity via Entity Inspector.
-6. Ensure the Vegetation Distribution Filter component was deleted from the BushSpawner entity and node is no longer
-present in the graph.
-7. Add Vegetation Altitude Filter to the BushSpawner entity through Entity Inspector.
-8. Ensure Altitude Filter was added to the BushSpawner node in the open graph.
-9. Add a new entity with unique name as a child of the Landscape Canvas entity.
-10. Add a Box Shape component to the new child entity.
-11. Ensure Box Shape node is present on the open graph.
-"""
-
import os
import sys
@@ -50,6 +32,36 @@ class TestComponentUpdatesUpdateGraph(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="ComponentUpdatesUpdateGraph", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that the Landscape Canvas graphs update properly when components are added/removed outside of
+ Landscape Canvas.
+
+ Expected Behavior:
+ Graphs properly reflect component changes made to entities outside of Landscape Canvas.
+
+ Test Steps:
+ 1. Open Level
+ 2. Find LandscapeCanvas named entity
+ 3. Ensure Vegetation Distribution Component is present on the BushSpawner entity
+ 4. Open graph and ensure Distribution Filter wrapped node is present
+ 5. Delete the Vegetation Distribution Filter component from the BushSpawner entity via Entity Inspector
+ 6. Ensure the Vegetation Distribution Filter component was deleted from the BushSpawner entity and node is
+ no longer present in the graph
+ 7. Add Vegetation Altitude Filter to the BushSpawner entity through Entity Inspector
+ 8. Ensure Altitude Filter was added to the BushSpawner node in the open graph
+ 9. Add a new entity with unique name as a child of the Landscape Canvas entity
+ 10. Add a Box Shape component to the new child entity
+ 11. Ensure Box Shape node is present on the open graph
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
# Create a new empty level and instantiate LC_BushFlowerBlender.slice
self.test_success = self.create_level(
self.args["level"],
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/CreateNewGraph.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/CreateNewGraph.py
index 5fed13985d..4b5e03abbc 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/CreateNewGraph.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/CreateNewGraph.py
@@ -37,6 +37,25 @@ class TestCreateNewGraph(EditorTestHelper):
print("New root entity created")
def run_test(self):
+ """
+ Summary:
+ This test verifies that new graphs can be created in Landscape Canvas.
+
+ Expected Behavior:
+ New graphs can be created, and proper entity is created to hold graph data with a Landscape Canvas component.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Ensures the root entity created contains a Landscape Canvas component
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
self.test_success = self.create_level(
self.args["level"],
heightmap_resolution=128,
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_DisabledNodeDuplication.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_DisabledNodeDuplication.py
index 7fd3f075e0..81e24b20e1 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_DisabledNodeDuplication.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_DisabledNodeDuplication.py
@@ -33,7 +33,25 @@ class TestDisabledNodeDuplication(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="DisabledNodeDuplication", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies Editor stability after duplicating disabled Landscape Canvas nodes.
+ Expected Behavior:
+ Editor remains stable and free of crashes.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Create several new nodes, disable the nodes via disabling/deleting components, and duplicate the nodes
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
def onEntityCreated(parameters):
global newEntityId
newEntityId = parameters[0]
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_UndoNodeDelete_SliceEntity.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_UndoNodeDelete_SliceEntity.py
index 27ab6fded3..61c4cf9ac2 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_UndoNodeDelete_SliceEntity.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_UndoNodeDelete_SliceEntity.py
@@ -9,17 +9,6 @@ remove or modify any license notices. This file is distributed on an "AS IS" BAS
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
"""
-
-"""
-C30813586 - Editor remains stable after Undoing deletion of a node on a slice entity
-
-1. Open level with instantiated slice.
-2. Open the graph.
-3. Find the BushSpawner's Vegetation Layer Spawner node.
-4. Delete the node.
-5. Undo to restore the node.
-"""
-
import os
import sys
@@ -44,7 +33,26 @@ class TestUndoNodeDeleteSlice(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="UndoNodeDeleteSlice", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies Editor stability after undoing the deletion of nodes on a slice entity.
+ Expected Behavior:
+ Editor remains stable and free of crashes.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Instantiate a slice with a Landscape Canvas setup
+ 3) Find a specific node on the graph, and delete it
+ 4) Restore the node with Undo
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
# Create a new empty level and instantiate LC_BushFlowerBlender.slice
self.test_success = self.create_level(
self.args["level"],
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientMixer_NodeConstruction.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientMixer_NodeConstruction.py
index ca3bc04f47..124baf9d2e 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientMixer_NodeConstruction.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientMixer_NodeConstruction.py
@@ -34,6 +34,27 @@ class TestGradientMixerNodeConstruction(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="GradientMixerNodeConstruction", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies a Gradient Mixer vegetation setup can be constructed through Landscape Canvas.
+
+ Expected Behavior:
+ Entities contain all required components and component references after creating nodes and setting connections
+ on a Landscape Canvas graph.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Add all necessary nodes to the graph and set connections to form a Gradient Mixer setup
+ 4) Verify all components and component references were properly set during graph construction
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
def onEntityCreated(parameters):
global newEntityId
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityCreatedOnNodeAdd.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityCreatedOnNodeAdd.py
index d40b19e7db..aa98eb3dc3 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityCreatedOnNodeAdd.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityCreatedOnNodeAdd.py
@@ -33,6 +33,25 @@ class TestGradientModifierNodeEntityCreate(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="GradientModifierNodeEntityCreate", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that the Landscape Canvas nodes can be added to a graph, and correctly create entities.
+
+ Expected Behavior:
+ New entities are created when dragging Gradient Modifier nodes to graph area.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Drag each of the Gradient Modifier nodes to the graph area, and ensure a new entity is created
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
def onEntityCreated(parameters):
global newEntityId
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityRemovedOnNodeDelete.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityRemovedOnNodeDelete.py
index dc263924d1..6a82b05039 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityRemovedOnNodeDelete.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityRemovedOnNodeDelete.py
@@ -34,7 +34,26 @@ class TestGradientModifierNodeEntityDelete(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="GradientModifierNodeEntityDelete", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that the Landscape Canvas node deletion properly cleans up entities in the Editor.
+ Expected Behavior:
+ Entities are removed when Gradient Modifier nodes are deleted from a graph.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Drag each of the Gradient Modifier nodes to the graph area, and ensure a new entity is created
+ 4) Delete the nodes, and ensure the newly created entities are removed
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
def onEntityCreated(parameters):
global createdEntityId
createdEntityId = parameters[0]
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_DependentComponentsAdded.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_DependentComponentsAdded.py
index 5e203e1892..f9360fe356 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_DependentComponentsAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_DependentComponentsAdded.py
@@ -33,6 +33,27 @@ class TestGradientNodeComponentDependency(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="GradientNodeComponentDependency", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that the Landscape Canvas nodes can be added to a graph, and correctly create entities with
+ proper dependent components.
+
+ Expected Behavior:
+ All expected component dependencies are met when adding a Gradient Modifier node to a graph.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Drag each of the Gradient Modifier nodes to the graph area, and ensure the proper dependent components are
+ added
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
def onEntityCreated(parameters):
global newEntityId
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityCreatedOnNodeAdd.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityCreatedOnNodeAdd.py
index 6d4a2f58a7..8aaad9b81d 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityCreatedOnNodeAdd.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityCreatedOnNodeAdd.py
@@ -32,6 +32,25 @@ class TestGradientNodeEntityCreate(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="GradientNodeEntityCreate", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that the Landscape Canvas nodes can be added to a graph, and correctly create entities.
+
+ Expected Behavior:
+ New entities are created when dragging Gradient nodes to graph area.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Drag each of the Gradient nodes to the graph area, and ensure a new entity is created
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
def onEntityCreated(parameters):
global newEntityId
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityRemovedOnNodeDelete.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityRemovedOnNodeDelete.py
index 2b49e3a911..d74b86d0bf 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityRemovedOnNodeDelete.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityRemovedOnNodeDelete.py
@@ -34,6 +34,26 @@ class TestGradientNodeEntityDelete(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="GradientNodeEntityDelete", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that the Landscape Canvas node deletion properly cleans up entities in the Editor.
+
+ Expected Behavior:
+ Entities are removed when Gradient nodes are deleted from a graph.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Drag each of the Gradient nodes to the graph area, and ensure a new entity is created
+ 4) Delete the nodes, and ensure the newly created entities are removed
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
def onEntityCreated(parameters):
global createdEntityId
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnEntityDelete.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnEntityDelete.py
index d3ad5c1c1e..6aa539b554 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnEntityDelete.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnEntityDelete.py
@@ -31,6 +31,26 @@ class TestGraphClosedOnEntityDelete(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="GraphClosedOnEntityDelete", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that Landscape Canvas graphs are auto-closed when the corresponding entity is deleted.
+
+ Expected Behavior:
+ When a Landscape Canvas root entity is deleted, the corresponding graph automatically closes.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Delete the automatically created entity
+ 4) Verify the open graph is closed
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
def onEntityCreated(parameters):
global newRootEntityId
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnLevelChange.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnLevelChange.py
index b7b0008eb2..ebc75ab621 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnLevelChange.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnLevelChange.py
@@ -29,7 +29,26 @@ class TestGraphClosedOnLevelChange(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="GraphClosedOnLevelChange", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that Landscape Canvas graphs are auto-closed when the currently open level changes.
+ Expected Behavior:
+ When a new level is loaded in the Editor, open Landscape Canvas graphs are automatically closed.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Open a different level
+ 4) Verify the open graph is closed
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
# Create a new empty level
self.test_success = self.create_level(
self.args["level"],
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_TabbedGraph.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_TabbedGraph.py
index efd1cc5a55..4b018aeb45 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_TabbedGraph.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_TabbedGraph.py
@@ -29,6 +29,26 @@ class TestGraphClosedTabbedGraph(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="GraphClosedTabbedGraph", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that Landscape Canvas tabbed graphs can be independently closed.
+
+ Expected Behavior:
+ Closing a tabbed graph only closes the appropriate graph.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create several new graphs
+ 3) Close one of the open graphs
+ 4) Ensure the graph properly closed, and other open graphs remain open
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
# Create a new empty level
self.test_success = self.create_level(
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphUpdates_UpdateComponents.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphUpdates_UpdateComponents.py
index f350d37178..f94a6c2e3a 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphUpdates_UpdateComponents.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphUpdates_UpdateComponents.py
@@ -9,21 +9,6 @@ remove or modify any license notices. This file is distributed on an "AS IS" BAS
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
"""
-
-"""
-C22715182 - Components are updated when nodes are added/removed/updated
-
-1. Open Level.
-2. Open the graph on LC_BushFlowerBlender.slice
-3. Find the Rotation Modifier node on the BushSpawner entity
-4. Delete the Rotation Modifier node
-5. Ensure the Vegetation Rotation Modifier component is removed from the BushSpawner entity
-6. Delete the Vegetation Layer Spawner node from the graph
-7. Ensure BushSpawner entity is deleted
-8. Change connection from second Rotation Modifier node to a different Gradient
-9. Ensure Gradient reference on component is updated
-"""
-
import os
import sys
@@ -50,6 +35,31 @@ class TestGraphUpdatesUpdateComponents(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="GraphUpdatesUpdateComponents", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that components are properly updated as nodes are added/removed/updated.
+
+ Expected Behavior:
+ Landscape Canvas node CRUD properly updates component entities.
+
+ Test Steps:
+ 1. Open Level.
+ 2. Open the graph on LC_BushFlowerBlender.slice
+ 3. Find the Rotation Modifier node on the BushSpawner entity
+ 4. Delete the Rotation Modifier node
+ 5. Ensure the Vegetation Rotation Modifier component is removed from the BushSpawner entity
+ 6. Delete the Vegetation Layer Spawner node from the graph
+ 7. Ensure BushSpawner entity is deleted
+ 8. Change connection from second Rotation Modifier node to a different Gradient
+ 9. Ensure Gradient reference on component is updated
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
# Create a new empty level and instantiate LC_BushFlowerBlender.slice
self.test_success = self.create_level(
self.args["level"],
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LandscapeCanvasComponent_AddedRemoved.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LandscapeCanvasComponent_AddedRemoved.py
index 176429885f..c3857e1393 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LandscapeCanvasComponent_AddedRemoved.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LandscapeCanvasComponent_AddedRemoved.py
@@ -30,6 +30,26 @@ class TestLandscapeCanvasComponentAddedRemoved(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="LandscapeCanvasComponentAddedRemoved", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that the Landscape Canvas component can be added to/removed from an entity.
+
+ Expected Behavior:
+ Closing a tabbed graph only closes the appropriate graph.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Create a new entity
+ 3) Add a Landscape Canvas component to the entity
+ 4) Remove the Landscape Canvas component from the entity
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
# Create a new empty level
self.test_success = self.create_level(
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LandscapeCanvas_SliceCreateInstantiate.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LandscapeCanvas_SliceCreateInstantiate.py
index e0f13adaa9..f174a52610 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LandscapeCanvas_SliceCreateInstantiate.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LandscapeCanvas_SliceCreateInstantiate.py
@@ -30,12 +30,21 @@ class TestLandscapeCanvasSliceCreateInstantiate(EditorTestHelper):
def run_test(self):
"""
Summary:
- C22602016 A slice containing the LandscapeCanvas component can be created/instantiated.
+ A slice containing the LandscapeCanvas component can be created/instantiated.
Expected Result:
- Slice is created and processed successfully and free of errors/warnings.
- Another copy of the slice is instantiated.
+ Slice is created/processed/instantiated successfully and free of errors/warnings.
+ Test Steps:
+ 1) Create a new level
+ 2) Create a new entity with a Landscape Canvas component
+ 3) Create a slice of the new entity
+ 4) Instantiate a new copy of the slice
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
:return: None
"""
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerBlender_NodeConstruction.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerBlender_NodeConstruction.py
index ecc529b9b4..82a2abf5ea 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerBlender_NodeConstruction.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerBlender_NodeConstruction.py
@@ -34,6 +34,27 @@ class TestLayerBlenderNodeConstruction(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="LayerBlenderNodeConstruction", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies a Layer Blender vegetation setup can be constructed through Landscape Canvas.
+
+ Expected Behavior:
+ Entities contain all required components and component references after creating nodes and setting connections
+ on a Landscape Canvas graph.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Add all necessary nodes to the graph and set connections to form a Layer Blender setup
+ 4) Verify all components and component references were properly set during graph construction
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
def onEntityCreated(parameters):
global newEntityId
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerExtenderNodes_ComponentEntitySync.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerExtenderNodes_ComponentEntitySync.py
index 00fcb5170c..df3c549fff 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerExtenderNodes_ComponentEntitySync.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerExtenderNodes_ComponentEntitySync.py
@@ -34,6 +34,25 @@ class TestLayerExtenderNodeComponentEntitySync(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="LayerExtenderNodeComponentEntitySync", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that all wrapped nodes can be successfully added to/removed from parent nodes.
+
+ Expected Behavior:
+ All wrapped extender nodes can be added to/removed from appropriate parent nodes.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Add Area Blender and Layer Spawner nodes to the graph, and add/remove each extender node to/from each
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
def onEntityCreated(parameters):
global newEntityId
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityCreatedOnNodeAdd.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityCreatedOnNodeAdd.py
index bd10e5f4c6..cd4915ea24 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityCreatedOnNodeAdd.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityCreatedOnNodeAdd.py
@@ -33,6 +33,25 @@ class TestShapeNodeEntityCreate(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="ShapeNodeEntityCreate", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that the Landscape Canvas nodes can be added to a graph, and correctly create entities.
+
+ Expected Behavior:
+ New entities are created when dragging shape nodes to graph area.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Drag each of the shape nodes to the graph area, and ensure a new entity is created
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
def onEntityCreated(parameters):
global newEntityId
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityRemovedOnNodeDelete.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityRemovedOnNodeDelete.py
index f71f5ae906..fcfbe03576 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityRemovedOnNodeDelete.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityRemovedOnNodeDelete.py
@@ -34,7 +34,27 @@ class TestShapeNodeEntityDelete(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="ShapeNodeEntityDelete", args=["level"])
def run_test(self):
-
+ """
+ Summary:
+ This test verifies that the Landscape Canvas node deletion properly cleans up entities in the Editor.
+
+ Expected Behavior:
+ Entities are removed when shape nodes are deleted from a graph.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Drag each of the shape nodes to the graph area, and ensure a new entity is created
+ 4) Delete the nodes, and ensure the newly created entities are removed
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
def onEntityCreated(parameters):
global createdEntityId
createdEntityId = parameters[0]
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/SlotConnections_UpdateComponentReferences.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/SlotConnections_UpdateComponentReferences.py
index 968f39c64d..183c3f7ccb 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/SlotConnections_UpdateComponentReferences.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/SlotConnections_UpdateComponentReferences.py
@@ -33,6 +33,27 @@ class TestSlotConnectionsUpdateComponents(EditorTestHelper):
EditorTestHelper.__init__(self, log_prefix="SlotConnectionsUpdateComponents", args=["level"])
def run_test(self):
+ """
+ Summary:
+ This test verifies that the Landscape Canvas slot connections properly update component references.
+
+ Expected Behavior:
+ A reference created through slot connections in Landscape Canvas is reflected in the Entity Inspector.
+
+ Test Steps:
+ 1) Create a new level
+ 2) Open Landscape Canvas and create a new graph
+ 3) Several nodes are added to a graph, and connections are set between the nodes
+ 4) Component references are verified via Entity Inspector
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
# Retrieve the proper component TypeIds per component name
componentNames = [
'Random Noise Gradient',
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GraphComponentSync.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GraphComponentSync.py
index efeba3b74a..855764fa6f 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GraphComponentSync.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GraphComponentSync.py
@@ -118,7 +118,7 @@ class TestGraphComponentSync(object):
@pytest.mark.test_case_id('C15987206')
@pytest.mark.SUITE_main
- def test_LandscapeCanvas_GradientMixerNodeConstruction(self, request, editor, level, launcher_platform):
+ def test_LandscapeCanvas_GradientMixer_NodeConstruction(self, request, editor, level, launcher_platform):
"""
Verifies a Gradient Mixer can be setup in Landscape Canvas and all references are property set.
"""
@@ -141,7 +141,7 @@ class TestGraphComponentSync(object):
@pytest.mark.test_case_id('C21333743')
@pytest.mark.SUITE_periodic
- def test_LandscapeCanvas_LayerBlenderNodeConstruction(self, request, editor, level, launcher_platform):
+ def test_LandscapeCanvas_LayerBlender_NodeConstruction(self, request, editor, level, launcher_platform):
"""
Verifies a Layer Blender can be setup in Landscape Canvas and all references are property set.
"""
diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14861501_PhysXCollider_RenderMeshAutoAssigned.py b/AutomatedTesting/Gem/PythonTests/physics/C14861501_PhysXCollider_RenderMeshAutoAssigned.py
index e415687001..bc7b1b5e00 100755
--- a/AutomatedTesting/Gem/PythonTests/physics/C14861501_PhysXCollider_RenderMeshAutoAssigned.py
+++ b/AutomatedTesting/Gem/PythonTests/physics/C14861501_PhysXCollider_RenderMeshAutoAssigned.py
@@ -98,5 +98,5 @@ if __name__ == "__main__":
import ImportPathHelper as imports
imports.init()
- from utils import Report
+ from editor_python_test_tools.utils import Report
Report.start_test(C14861501_PhysXCollider_RenderMeshAutoAssigned)
diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14976308_ScriptCanvas_SetKinematicTargetTransform.py b/AutomatedTesting/Gem/PythonTests/physics/C14976308_ScriptCanvas_SetKinematicTargetTransform.py
index c76c5cab80..8400364626 100755
--- a/AutomatedTesting/Gem/PythonTests/physics/C14976308_ScriptCanvas_SetKinematicTargetTransform.py
+++ b/AutomatedTesting/Gem/PythonTests/physics/C14976308_ScriptCanvas_SetKinematicTargetTransform.py
@@ -68,7 +68,7 @@ def C14976308_ScriptCanvas_SetKinematicTargetTransform():
the script deactivates Signal, Sphere's transform will update to that of Transform_Target.
NOTE: There is a known bug (LY-107723) which causes the rotation to update to a value that is not sufficiently close
to the expected result when using Set Kinematic Target which will cause the test to fail:
- https://jira.agscollab.com/browse/LY-107723
+ LY-107723
Test Steps:
1) Open level and enter game mode
diff --git a/AutomatedTesting/Gem/PythonTests/physics/C3510644_Collider_CollisionGroups.py b/AutomatedTesting/Gem/PythonTests/physics/C3510644_Collider_CollisionGroups.py
index 4ae10288bd..e714da9de7 100755
--- a/AutomatedTesting/Gem/PythonTests/physics/C3510644_Collider_CollisionGroups.py
+++ b/AutomatedTesting/Gem/PythonTests/physics/C3510644_Collider_CollisionGroups.py
@@ -13,7 +13,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# Test case ID : C3510644
# Test Case Title : Check that the collision layer and collision group of the terrain can be changed
# and the collision behavior of the terrain changes accordingly
-# URL of the test case : https://testrail.agscollab.com/index.php?/cases/view/3510644
# fmt: off
diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py b/AutomatedTesting/Gem/PythonTests/physics/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py
index d65e9050bd..57cdc8f9c5 100755
--- a/AutomatedTesting/Gem/PythonTests/physics/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py
+++ b/AutomatedTesting/Gem/PythonTests/physics/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py
@@ -114,5 +114,5 @@ if __name__ == "__main__":
import ImportPathHelper as imports
imports.init()
- from utils import Report
+ from editor_python_test_tools.utils import Report
Report.start_test(C4044695_PhysXCollider_AddMultipleSurfaceFbx)
diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6321601_Force_HighValuesDirectionAxes.py b/AutomatedTesting/Gem/PythonTests/physics/C6321601_Force_HighValuesDirectionAxes.py
index 4b0b036970..08083a7868 100755
--- a/AutomatedTesting/Gem/PythonTests/physics/C6321601_Force_HighValuesDirectionAxes.py
+++ b/AutomatedTesting/Gem/PythonTests/physics/C6321601_Force_HighValuesDirectionAxes.py
@@ -239,7 +239,7 @@ def C6321601_Force_HighValuesDirectionAxes():
force_notification_handler.add_callback("OnCalculateNetForce", on_calc_net_force)
# Wait for 3 secs, because there is a known bug identified and filed in
- # JIRA https://jira.agscollab.com/browse/LY-107677
+ # JIRA LY-107677
# The error "[Error] Huge object being added to a COctreeNode, name: 'MeshComponentRenderNode', objBox:"
# will show (if occured) in about 3 sec into the game mode.
helper.wait_for_condition(has_physx_error, 3.0)
diff --git a/AutomatedTesting/Gem/PythonTests/physics/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/physics/CMakeLists.txt
new file mode 100644
index 0000000000..4f89e841df
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/physics/CMakeLists.txt
@@ -0,0 +1,52 @@
+#
+# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+# its licensors.
+#
+# For complete copyright and license terms please see the LICENSE at the root of this
+# distribution (the "License"). All use of this software is governed by the License,
+# or, if provided, by the license below or the license accompanying this file. Do not
+# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
+ ly_add_pytest(
+ NAME AutomatedTesting::PhysicsTests_Main
+ TEST_SUITE main
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Main.py
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ COMPONENT
+ Physics
+ )
+ ly_add_pytest(
+ NAME AutomatedTesting::PhysicsTests_Periodic
+ TEST_SUITE periodic
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Periodic.py
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ COMPONENT
+ Physics
+ )
+ ly_add_pytest(
+ NAME AutomatedTesting::PhysicsTests_Sandbox
+ TEST_SUITE sandbox
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Sandbox.py
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ COMPONENT
+ Physics
+ )
+endif()
diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_InDevelopment.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_InDevelopment.py
index 8f098941ea..8986c1024a 100755
--- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_InDevelopment.py
+++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_InDevelopment.py
@@ -50,7 +50,7 @@ class TestAutomation(TestAutomationBase):
unexpected_lines = ["Assert"]
self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines)
- # BUG: https://jira.agscollab.com/browse/LY-107723")
+ # BUG: LY-107723")
def test_C14976308_ScriptCanvas_SetKinematicTargetTransform(self, request, workspace, editor):
from . import C14976308_ScriptCanvas_SetKinematicTargetTransform as test_module
diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py
index 8f1f2f7481..2cf55c7a58 100644
--- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py
+++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py
@@ -42,6 +42,7 @@ class TestAutomation(TestAutomationBase):
self._run_test(request, workspace, editor, test_module)
@revert_physics_config
+ @fm.file_override('physxsystemconfiguration.setreg','C4044459_Material_DynamicFriction.setreg_override', 'AutomatedTesting/Registry')
def test_C4044459_Material_DynamicFriction(self, request, workspace, editor, launcher_platform):
from . import C4044459_Material_DynamicFriction as test_module
self._run_test(request, workspace, editor, test_module)
diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py
index 3bbfe64e38..2b82c3e596 100755
--- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py
+++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py
@@ -429,6 +429,8 @@ class TestAutomation(TestAutomationBase):
from . import C4976236_AddPhysxColliderComponent as test_module
self._run_test(request, workspace, editor, test_module)
+ @pytest.mark.xfail(
+ reason="This will fail due to this issue ATOM-15487.")
def test_C14861502_PhysXCollider_AssetAutoAssigned(self, request, workspace, editor, launcher_platform):
from . import C14861502_PhysXCollider_AssetAutoAssigned as test_module
self._run_test(request, workspace, editor, test_module)
diff --git a/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Physmaterial_Editor.py b/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Physmaterial_Editor.py
index 5f24f41083..b6d7c610e3 100755
--- a/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Physmaterial_Editor.py
+++ b/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Physmaterial_Editor.py
@@ -12,7 +12,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
'''
This unittest might have to be refactored once changes to Physmaterial_Editor.py are made.
These changes will occur after the but, reverence below is resloved.
-Bug: https://jira.agscollab.com/browse/LY-107392
+Bug: LY-107392
'''
class Tests:
opening_bad_file = ("Bad file could not be opened", "Bad file was opened")
diff --git a/AutomatedTesting/Gem/PythonTests/prefab/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/prefab/CMakeLists.txt
new file mode 100644
index 0000000000..61f1944974
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/prefab/CMakeLists.txt
@@ -0,0 +1,25 @@
+#
+# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+# its licensors.
+#
+# For complete copyright and license terms please see the LICENSE at the root of this
+# distribution (the "License"). All use of this software is governed by the License,
+# or, if provided, by the license below or the license accompanying this file. Do not
+# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+
+## Prefab ##
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
+ ly_add_pytest(
+ NAME AutomatedTesting::PrefabTests
+ TEST_SUITE main
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Main.py
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ )
+endif()
diff --git a/AutomatedTesting/Gem/PythonTests/prefab/PrefabLevel_OpensLevelWithEntities.py b/AutomatedTesting/Gem/PythonTests/prefab/PrefabLevel_OpensLevelWithEntities.py
new file mode 100644
index 0000000000..3401c6a0a9
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/prefab/PrefabLevel_OpensLevelWithEntities.py
@@ -0,0 +1,76 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+# fmt:off
+class Tests():
+ find_empty_entity = ("Entity: 'EmptyEntity' found", "Entity: 'EmptyEntity' *not* found in level")
+ empty_entity_pos = ("'EmptyEntity' position is at the expected position", "'EmptyEntity' position is *not* at the expected position")
+ find_pxentity = ("Entity: 'EntityWithPxCollider' found", "Entity: 'EntityWithPxCollider' *not* found in level")
+ pxentity_component = ("Entity: 'EntityWithPxCollider' has a Physx Collider", "Entity: 'EntityWithPxCollider' does *not* have a Physx Collider")
+
+# fmt:on
+
+def PrefabLevel_OpensLevelWithEntities():
+ """
+ Opens the level that contains 2 entities, "EmptyEntity" and "EntityWithPxCollider".
+ This test makes sure that both entities exist after opening the level and that:
+ - EmptyEntity is at Position: (10, 20, 30)
+ - EntityWithPxCollider has a PhysXCollider component
+ """
+
+ import os
+ import sys
+
+ from editor_python_test_tools.utils import Report
+ from editor_python_test_tools.utils import TestHelper as helper
+
+ import editor_python_test_tools.hydra_editor_utils as hydra
+
+ import azlmbr.entity as entity
+ import azlmbr.bus as bus
+ from azlmbr.math import Vector3
+
+ EXPECTED_EMPTY_ENTITY_POS = Vector3(10.00, 20.0, 30.0)
+
+ helper.init_idle()
+ helper.open_level("prefab", "PrefabLevel_OpensLevelWithEntities")
+
+ def find_entity(entity_name):
+ searchFilter = entity.SearchFilter()
+ searchFilter.names = [entity_name]
+ entityIds = entity.SearchBus(bus.Broadcast, 'SearchEntities', searchFilter)
+ if entityIds[0].IsValid():
+ return entityIds[0]
+ return None
+#Checks for an entity called "EmptyEntity"
+ helper.wait_for_condition(lambda: find_entity("EmptyEntity").IsValid(), 5.0)
+ empty_entity_id = find_entity("EmptyEntity")
+ Report.result(Tests.find_empty_entity, empty_entity_id.IsValid())
+
+# Checks if the EmptyEntity is in the correct position and if it fails, it will provide the expected postion and the actual postion of the entity in the Editor log
+ empty_entity_pos = azlmbr.components.TransformBus(azlmbr.bus.Event, "GetWorldTranslation", empty_entity_id)
+ is_at_position = empty_entity_pos.IsClose(EXPECTED_EMPTY_ENTITY_POS)
+ Report.result(Tests.empty_entity_pos, is_at_position)
+ if not is_at_position:
+ Report.info(f'Expected position: {EXPECTED_EMPTY_ENTITY_POS.ToString()}, actual position: {empty_entity_pos.ToString()}')
+
+#Checks for an entity called "EntityWithPxCollider" and if it has the PhysX Collider component
+ pxentity = find_entity("EntityWithPxCollider")
+ Report.result(Tests.find_pxentity, pxentity.IsValid())
+
+ pxcollider_id = hydra.get_component_type_id("PhysX Collider")
+ hasComponent = azlmbr.editor.EditorComponentAPIBus(azlmbr.bus.Broadcast, 'HasComponentOfType', pxentity, pxcollider_id)
+ Report.result(Tests.pxentity_component, hasComponent)
+
+if __name__ == "__main__":
+
+ from editor_python_test_tools.utils import Report
+ Report.start_test (PrefabLevel_OpensLevelWithEntities)
diff --git a/AutomatedTesting/Gem/PythonTests/prefab/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/prefab/TestSuite_Main.py
new file mode 100644
index 0000000000..51c78a99e2
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/prefab/TestSuite_Main.py
@@ -0,0 +1,35 @@
+"""
+ All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+ its licensors.
+
+ For complete copyright and license terms please see the LICENSE at the root of this
+ distribution (the "License"). All use of this software is governed by the License,
+ or, if provided, by the license below or the license accompanying this file. Do not
+ remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+ """
+
+# 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
+
+sys.path.append (os.path.dirname (os.path.abspath (__file__)) + '/../automatedtesting_shared')
+
+from base import TestAutomationBase
+
+@pytest.mark.SUITE_main
+@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+class TestAutomation(TestAutomationBase):
+
+ def _run_prefab_test(self, request, workspace, editor, test_module):
+ self._run_test(request, workspace, editor, test_module, ["--regset=/Amazon/Preferences/EnablePrefabSystem=true"])
+
+ def test_PrefabLevel_OpensLevelWithEntities(self, request, workspace, editor, launcher_platform):
+ from . import PrefabLevel_OpensLevelWithEntities as test_module
+ self._run_prefab_test(request, workspace, editor, test_module)
diff --git a/AutomatedTesting/Gem/PythonTests/prefab/__init__.py b/AutomatedTesting/Gem/PythonTests/prefab/__init__.py
new file mode 100644
index 0000000000..79f8fa4422
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/prefab/__init__.py
@@ -0,0 +1,10 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/AssetEditor_CreateScriptEventFile.py b/AutomatedTesting/Gem/PythonTests/scripting/AssetEditor_CreateScriptEventFile.py
deleted file mode 100644
index dcbbf47f0c..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/AssetEditor_CreateScriptEventFile.py
+++ /dev/null
@@ -1,124 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: T92569013
-Test Case Title: Script Event file can be created
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92569013
-"""
-
-
-# fmt: off
-class Tests():
- new_event_created = ("New Script Event created", "New Script Event not created")
- child_event_created = ("Child Event created", "Child not created")
- file_saved = ("Script event file saved", "Script event file did not save")
- console_error = ("No unexpected error in console", "Error found in console")
- console_warning = ("No unexpected warning in console", "Warning found in console")
-# fmt: on
-
-
-def CreateScriptEventFile():
- """
- Summary:
- Script Event file can be created
-
- Expected Behavior:
- File is created without any errors and warnings in Console
-
- Test Steps:
- 1) Open Asset Editor
- 2) Get Asset Editor Qt object
- 3) Create new Script Event Asset
- 4) Add new child event
- 5) Save the Script Event file
- 6) Verify if file is created
- 7) Verify console for errors/warnings
- 8) Close Asset Editor
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
- import os
- from utils import Report
- from utils import TestHelper as helper
- from utils import Tracer
- import pyside_utils
-
- # Open 3D Engine imports
- import azlmbr.legacy.general as general
- import azlmbr.editor as editor
- import azlmbr.bus as bus
-
- # Pyside imports
- from PySide2 import QtWidgets
-
- GENERAL_WAIT = 1.0 # seconds
-
- FILE_PATH = os.path.join("AutomatedTesting", "ScriptCanvas", "test_file.scriptevent")
-
- # 1) Open Asset Editor
- general.idle_enable(True)
- # Initially close the Asset Editor and then reopen to ensure we don't have any existing assets open
- general.close_pane("Asset Editor")
- general.open_pane("Asset Editor")
- helper.wait_for_condition(lambda: general.is_pane_visible("Asset Editor"), 5.0)
-
- # 2) Get Asset Editor Qt object
- editor_window = pyside_utils.get_editor_main_window()
- asset_editor_widget = editor_window.findChild(QtWidgets.QDockWidget, "Asset Editor").findChild(
- QtWidgets.QWidget, "AssetEditorWindowClass"
- )
- container = asset_editor_widget.findChild(QtWidgets.QWidget, "ContainerForRows")
- menu_bar = asset_editor_widget.findChild(QtWidgets.QMenuBar)
-
- # 3) Create new Script Event Asset
- action = pyside_utils.find_child_by_pattern(menu_bar, {"type": QtWidgets.QAction, "text": "Script Events"})
- action.trigger()
- result = helper.wait_for_condition(
- lambda: container.findChild(QtWidgets.QFrame, "Events") is not None, 3 * GENERAL_WAIT
- )
- Report.result(Tests.new_event_created, result)
-
- # 4) Add new child event
- add_event = container.findChild(QtWidgets.QFrame, "Events").findChild(QtWidgets.QToolButton, "")
- add_event.click()
- result = helper.wait_for_condition(
- lambda: asset_editor_widget.findChild(QtWidgets.QFrame, "EventName") is not None, GENERAL_WAIT
- )
- Report.result(Tests.child_event_created, result)
-
- with Tracer() as section_tracer:
- # 5) Save the Script Event file
- editor.AssetEditorWidgetRequestsBus(bus.Broadcast, "SaveAssetAs", FILE_PATH)
-
- # 6) Verify if file is created
- result = helper.wait_for_condition(lambda: os.path.exists(FILE_PATH), 3 * GENERAL_WAIT)
- Report.result(Tests.file_saved, result)
-
- # 7) Verify console for errors/warnings
- Report.result(Tests.console_error, not section_tracer.has_errors)
- Report.result(Tests.console_warning, not section_tracer.has_warnings)
-
- # 8) Close Asset Editor
- general.close_pane("Asset Editor")
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
-
- from utils import Report
-
- Report.start_test(CreateScriptEventFile)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/AssetEditor_NewScriptEvent.py b/AutomatedTesting/Gem/PythonTests/scripting/AssetEditor_NewScriptEvent.py
deleted file mode 100644
index 1f801d4eeb..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/AssetEditor_NewScriptEvent.py
+++ /dev/null
@@ -1,129 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-
-Test case ID: T92568942
-Test Case Title: Clicking the "+" button and selecting "New Script Event" opens the
-Asset Editor with a new Script Event asset
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92568942
-"""
-
-from PySide2 import QtWidgets
-import azlmbr.legacy.general as general
-
-import editor_python_test_tools.pyside_utils as pyside_utils
-from editor_python_test_tools.utils import TestHelper as helper
-from editor_python_test_tools.utils import Report
-
-
-class Tests:
- action_found = "New Script event action found"
- asset_editor_opened = "Asset Editor opened"
- new_asset = "Asset Editor created with new asset"
- script_event = "New Script event created in Asset Editor"
-
-
-GENERAL_WAIT = 0.5 # seconds
-
-
-class TestAssetEditor_NewScriptEvent:
- """
- Summary:
- Clicking the "+" button in Node Palette and creating New Script Event opens Asset Editor
-
- Expected Behavior:
- Clicking the "+" button and selecting "New Script Event" opens the Asset Editor with a
- new Script Event asset
-
- Test Steps:
- 1) Open Script Canvas window (Tools > Script Canvas)
- 2) Close any existing AssetEditor window
- 3) Get the SC window object
- 4) Click on New Script Event on Node palette
- 5) Verify if Asset Editor opened
- 6) Verify if a new asset with Script Canvas category is opened
- 7) Close Script Canvas and Asset Editor
-
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- @pyside_utils.wrap_async
- async def run_test(self):
- # 1) Open Script Canvas window (Tools > Script Canvas)
- general.idle_enable(True)
- general.open_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
-
- # 2) Close any existing AssetEditor window
- general.close_pane("Asset Editor")
- helper.wait_for_condition(lambda: not general.is_pane_visible("Asset Editor"), 5.0)
-
- # 3) Get the SC window object
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
- node_palette = sc.findChild(QtWidgets.QDockWidget, "NodePalette")
- frame = node_palette.findChild(QtWidgets.QFrame, "searchCustomization")
- button = frame.findChild(QtWidgets.QToolButton)
- pyside_utils.click_button_async(button)
-
- # 4) Click on New Script Event on Node palette
- menu = None
-
- def menu_has_focus():
- nonlocal menu
- for fw in [
- QtWidgets.QApplication.activePopupWidget(),
- QtWidgets.QApplication.activeModalWidget(),
- QtWidgets.QApplication.focusWidget(),
- QtWidgets.QApplication.activeWindow(),
- ]:
- print(fw)
- if fw and isinstance(fw, QtWidgets.QMenu) and fw.isVisible():
- menu = fw
- return True
- return False
-
- await pyside_utils.wait_for_condition(menu_has_focus, GENERAL_WAIT)
- action = await pyside_utils.wait_for_action_in_menu(menu, {"text": "New Script Event"})
- Report.info(f"{Tests.action_found}: {action is not None}")
- action.trigger()
- pyside_utils.queue_hide_event(menu)
-
- # 5) Verify if Asset Editor opened
- result = helper.wait_for_condition(lambda: general.is_pane_visible("Asset Editor"), GENERAL_WAIT)
- Report.info(f"{Tests.asset_editor_opened}: {result}")
-
- # 6) Verify if a new asset with Script Canvas category is opened
- asset_editor = editor_window.findChild(QtWidgets.QDockWidget, "Asset Editor")
- row_container = asset_editor.findChild(QtWidgets.QWidget, "ContainerForRows")
- # NOTE: QWidget ContainerForRows will have frames of Name, Category, ToolTip etc.
- # To validate if a new script event file is generated, we check for
- # QFrame Category and its value
- categories = row_container.findChildren(QtWidgets.QFrame, "Category")
- Report.info(f"{Tests.new_asset}: {len(categories)>0}")
- result = False
- for frame in categories:
- line_edit = frame.findChild(QtWidgets.QLineEdit)
- result = True if (line_edit and line_edit.text() == "Script Events") else False
- Report.info(f"{Tests.script_event}: {result}")
-
- # 7) Close Script Canvas and Asset Editor
- general.close_pane("Script Canvas")
- general.close_pane("Asset Editor")
-
-
-test = TestAssetEditor_NewScriptEvent()
-test.run_test()
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/scripting/CMakeLists.txt
new file mode 100644
index 0000000000..58507c680c
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/CMakeLists.txt
@@ -0,0 +1,37 @@
+#
+# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+# its licensors.
+#
+# For complete copyright and license terms please see the LICENSE at the root of this
+# distribution (the "License"). All use of this software is governed by the License,
+# or, if provided, by the license below or the license accompanying this file. Do not
+# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
+ ly_add_pytest(
+ NAME AutomatedTesting::ScriptCanvasTests_Perodic
+ TEST_SUITE periodic
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Periodic.py
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ COMPONENT
+ ScriptCanvas
+ )
+ ly_add_pytest(
+ NAME AutomatedTesting::ScriptCanvasTests_Sandbox
+ TEST_SUITE sandbox
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Sandbox.py
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ Legacy::Editor
+ AZ::AssetProcessor
+ AutomatedTesting.Assets
+ )
+endif()
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Debugger_HappyPath_TargetMultipleEntities.py b/AutomatedTesting/Gem/PythonTests/scripting/Debugger_HappyPath_TargetMultipleEntities.py
new file mode 100644
index 0000000000..2c36062acf
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/Debugger_HappyPath_TargetMultipleEntities.py
@@ -0,0 +1,138 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ level_created = ("New level created", "New level not created")
+ entities_found = ("Entities are found in Logging window", "Entities are not found in Logging window")
+ select_multiple_targets = ("Multiple targets are selected", "Multiple targets are not selected")
+# fmt: on
+
+
+GENERAL_WAIT = 0.5 # seconds
+
+
+def Debugger_HappyPath_TargetMultipleEntities():
+ """
+ Summary:
+ Multiple Entities can be targeted in the Debugger tool
+
+ Expected Behavior:
+ Multiple selected files can be checked for logging.
+ Upon checking, checkboxes of the parent folders change to either full or partial check.
+
+ Test Steps:
+ 1) Create temp level
+ 2) Create two entities with scriptcanvas components
+ 3) Set values for scriptcanvas
+ 4) Open Script Canvas window and get sc object
+ 5) Open Debugging(Logging) window
+ 6) Click on Entities tab in logging window
+ 7) Verify if the scriptcanvas exist under entities
+ 8) Verify if the entities can be selected
+ 9) Close Debugging window and Script Canvas window
+
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ from PySide2 import QtWidgets
+ from PySide2.QtCore import Qt
+ import azlmbr.legacy.general as general
+ import azlmbr.math as math
+ import azlmbr.asset as asset
+ import azlmbr.bus as bus
+
+ import os
+ import pyside_utils
+ import hydra_editor_utils as hydra
+ from utils import TestHelper as helper
+ from utils import Report
+
+ LEVEL_NAME = "tmp_level"
+ ASSET_NAME_1 = "ScriptCanvas_TwoComponents0.scriptcanvas"
+ ASSET_NAME_2 = "ScriptCanvas_TwoComponents1.scriptcanvas"
+ ASSET_1 = os.path.join("scriptcanvas", ASSET_NAME_1)
+ ASSET_2 = os.path.join("scriptcanvas", ASSET_NAME_2)
+ WAIT_TIME = 3.0
+
+ def get_asset(asset_path):
+ return asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", asset_path, math.Uuid(), False)
+
+ # 1) Create temp level
+ general.idle_enable(True)
+ result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
+ Report.critical_result(Tests.level_created, result == 0)
+ helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
+ general.close_pane("Error Report")
+
+ # 2) Create two entities with scriptcanvas components
+ position = math.Vector3(512.0, 512.0, 32.0)
+ test_entity_1 = hydra.Entity("test_entity_1")
+ test_entity_1.create_entity(position, ["Script Canvas"])
+ test_entity_2 = hydra.Entity("test_entity_2")
+ test_entity_2.create_entity(position, ["Script Canvas"])
+
+ # 3) Set values for scriptcanvas
+ test_entity_1.get_set_test(0, "Script Canvas Asset|Script Canvas Asset", get_asset(ASSET_1))
+ test_entity_2.get_set_test(0, "Script Canvas Asset|Script Canvas Asset", get_asset(ASSET_2))
+
+ # 4) Open Script Canvas window and get sc opbject
+ general.open_pane("Script Canvas")
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+
+ # 5) Open Debugging(Logging) window
+ if (
+ sc.findChild(QtWidgets.QDockWidget, "LoggingWindow") is None
+ or not sc.findChild(QtWidgets.QDockWidget, "LoggingWindow").isVisible()
+ ):
+ action = pyside_utils.find_child_by_pattern(sc, {"text": "Debugging", "type": QtWidgets.QAction})
+ action.trigger()
+ logging_window = sc.findChild(QtWidgets.QDockWidget, "LoggingWindow")
+
+ # 6) Click on Entities tab in logging window
+ button = pyside_utils.find_child_by_pattern(logging_window, {"type": QtWidgets.QPushButton, "text": "Entities"})
+ button.click()
+
+ # 7) Verify if the scriptcanvas exist under entities
+ entities = logging_window.findChild(QtWidgets.QWidget, "entitiesPage")
+ tree = entities.findChild(QtWidgets.QTreeView, "pivotTreeView")
+ asset_1_mi = pyside_utils.find_child_by_pattern(tree, ASSET_NAME_1.lower())
+ asset_2_mi = pyside_utils.find_child_by_pattern(tree, ASSET_NAME_2.lower())
+ result = asset_1_mi is not None and asset_2_mi is not None
+ Report.critical_result(Tests.entities_found, result)
+
+ # 8) Verify if the entities can be selected
+ tree.expandAll()
+ tree.model().setData(asset_1_mi, 2, Qt.CheckStateRole)
+ tree.model().setData(asset_2_mi, 2, Qt.CheckStateRole)
+ checklist = [asset_1_mi, asset_1_mi.parent(), asset_2_mi, asset_2_mi.parent()]
+ result = all([index.data(Qt.CheckStateRole) == 2 for index in checklist])
+ Report.critical_result(Tests.select_multiple_targets, result)
+
+ # 9) Close Debugging window and Script Canvas window
+ logging_window.close()
+ general.close_pane("Script Canvas")
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(Debugger_HappyPath_TargetMultipleEntities)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Debugger_HappyPath_TargetMultipleGraphs.py b/AutomatedTesting/Gem/PythonTests/scripting/Debugger_HappyPath_TargetMultipleGraphs.py
new file mode 100644
index 0000000000..906c198d43
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/Debugger_HappyPath_TargetMultipleGraphs.py
@@ -0,0 +1,106 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ select_multiple_targets = ("Multiple targets are selected", "Multiple targets are not selected")
+# fmt: on
+
+
+GENERAL_WAIT = 0.5 # seconds
+
+
+def Debugger_HappyPath_TargetMultipleGraphs():
+ """
+ Summary:
+ Multiple Graphs can be targeted in the Debugger tool
+
+ Expected Behavior:
+ Multiple elected files can be checked for logging.
+ Upon checking, checkboxes of the parent folders change to either full or partial check.
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Get the SC window object
+ 3) Open Debugging Tool if not opened already
+ 4) Select Graphs tab under logging window
+ 5) Select multiple targets from levels and scriptcanvas
+ 6) Verify if multiple targets are selected
+ 7) Close Debugging window and Script Canvas window
+
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ from PySide2 import QtWidgets
+ from PySide2.QtCore import Qt
+ import azlmbr.legacy.general as general
+
+ import pyside_utils
+ from utils import TestHelper as helper
+ from utils import Report
+
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.idle_enable(True)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 6.0)
+
+ # 2) Get the SC window object
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+
+ # 3) Open Debugging Tool if not opened already
+ if (
+ sc.findChild(QtWidgets.QDockWidget, "LoggingWindow") is None
+ or not sc.findChild(QtWidgets.QDockWidget, "LoggingWindow").isVisible()
+ ):
+ action = pyside_utils.find_child_by_pattern(sc, {"text": "Debugging", "type": QtWidgets.QAction})
+ action.trigger()
+ logging_window = sc.findChild(QtWidgets.QDockWidget, "LoggingWindow")
+
+ # 4) Select Graphs tab under logging window
+ button = pyside_utils.find_child_by_pattern(logging_window, {"type": QtWidgets.QPushButton, "text": "Graphs"})
+ button.click()
+
+ # 5) Select multiple targets from levels and scriptcanvas
+ graphs = logging_window.findChild(QtWidgets.QWidget, "graphsPage")
+ tree = graphs.findChild(QtWidgets.QTreeView, "pivotTreeView")
+ # Select the first child under levels
+ level_model_index = pyside_utils.find_child_by_pattern(tree, "levels")
+ level_child_index = pyside_utils.get_item_view_index(tree, 0, 0, level_model_index)
+ tree.model().setData(level_child_index, 2, Qt.CheckStateRole)
+ # Select the first child under scriptcanvas
+ sc_model_index = pyside_utils.find_child_by_pattern(tree, "scriptcanvas")
+ sc_child_index = pyside_utils.get_item_view_index(tree, 0, 0, sc_model_index)
+ tree.model().setData(sc_child_index, 2, Qt.CheckStateRole)
+
+ # 6) Verify if multiple targets are selected
+ result = all([index.data(Qt.CheckStateRole) != 0 for index in (level_model_index, sc_model_index)])
+ result = result and all([index.data(Qt.CheckStateRole) == 2 for index in (level_child_index, sc_child_index)])
+ Report.result(Tests.select_multiple_targets, result)
+
+ # 7) Close Debugging window and Script Canvas window
+ logging_window.close()
+ general.close_pane("Script Canvas")
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(Debugger_HappyPath_TargetMultipleGraphs)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Debugging_TargetMultipleEntities.py b/AutomatedTesting/Gem/PythonTests/scripting/Debugging_TargetMultipleEntities.py
deleted file mode 100644
index a26cb4f923..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/Debugging_TargetMultipleEntities.py
+++ /dev/null
@@ -1,144 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-
-Test case ID: T92568856
-Test Case Title: Multiple Entities can be targeted in the Debugger tool
-URLs of the test case: https://testrail.agscollab.com/index.php?/tests/view/92568856
-"""
-
-
-# fmt: off
-class Tests():
- level_created = ("New level created", "New level not created")
- entities_found = ("Entities are found in Logging window", "Entities are not found in Logging window")
- select_multiple_targets = ("Multiple targets are selected", "Multiple targets are not selected")
-# fmt: on
-
-
-GENERAL_WAIT = 0.5 # seconds
-
-
-def Debugging_TargetMultipleEntities():
- """
- Summary:
- Multiple Entities can be targeted in the Debugger tool
-
- Expected Behavior:
- Selected files can be checked for logging.
- Upon checking, checkboxes of the parent folders change to either full or partial check.
-
- Test Steps:
- 1) Create temp level
- 2) Create two entities with scriptcanvas components
- 3) Set values for scriptcanvas
- 4) Open Script Canvas window and get sc opbject
- 5) Open Debugging(Logging) window
- 6) Click on Entities tab in logging window
- 7) Verify if the scriptcanvas exist under entities
- 8) Verify if the entities can be selected
- 9) Close Debugging window and Script Canvas window
-
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- from PySide2 import QtWidgets
- from PySide2.QtCore import Qt
- import azlmbr.legacy.general as general
- import azlmbr.math as math
- import azlmbr.asset as asset
- import azlmbr.bus as bus
-
- import os
- import pyside_utils
- import hydra_editor_utils as hydra
- from utils import TestHelper as helper
- from utils import Report
-
- LEVEL_NAME = "tmp_level"
- ASSET_NAME_1 = "ScriptCanvas_TwoComponents0.scriptcanvas"
- ASSET_NAME_2 = "ScriptCanvas_TwoComponents1.scriptcanvas"
- ASSET_1 = os.path.join("scriptcanvas", ASSET_NAME_1)
- ASSET_2 = os.path.join("scriptcanvas", ASSET_NAME_2)
- WAIT_TIME = 3.0
-
- def get_asset(asset_path):
- return asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", asset_path, math.Uuid(), False)
-
- # 1) Create temp level
- general.idle_enable(True)
- result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
- Report.critical_result(Tests.level_created, result == 0)
- helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
- general.close_pane("Error Report")
-
- # 2) Create two entities with scriptcanvas components
- position = math.Vector3(512.0, 512.0, 32.0)
- test_entity_1 = hydra.Entity("test_entity_1")
- test_entity_1.create_entity(position, ["Script Canvas"])
- test_entity_2 = hydra.Entity("test_entity_2")
- test_entity_2.create_entity(position, ["Script Canvas"])
-
- # 3) Set values for scriptcanvas
- test_entity_1.get_set_test(0, "Script Canvas Asset|Script Canvas Asset", get_asset(ASSET_1))
- test_entity_2.get_set_test(0, "Script Canvas Asset|Script Canvas Asset", get_asset(ASSET_2))
-
- # 4) Open Script Canvas window and get sc opbject
- general.open_pane("Script Canvas")
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
-
- # 5) Open Debugging(Logging) window
- if (
- sc.findChild(QtWidgets.QDockWidget, "LoggingWindow") is None
- or not sc.findChild(QtWidgets.QDockWidget, "LoggingWindow").isVisible()
- ):
- action = pyside_utils.find_child_by_pattern(sc, {"text": "Debugging", "type": QtWidgets.QAction})
- action.trigger()
- logging_window = sc.findChild(QtWidgets.QDockWidget, "LoggingWindow")
-
- # 6) Click on Entities tab in logging window
- button = pyside_utils.find_child_by_pattern(logging_window, {"type": QtWidgets.QPushButton, "text": "Entities"})
- button.click()
-
- # 7) Verify if the scriptcanvas exist under entities
- entities = logging_window.findChild(QtWidgets.QWidget, "entitiesPage")
- tree = entities.findChild(QtWidgets.QTreeView, "pivotTreeView")
- asset_1_mi = pyside_utils.find_child_by_pattern(tree, ASSET_NAME_1.lower())
- asset_2_mi = pyside_utils.find_child_by_pattern(tree, ASSET_NAME_2.lower())
- result = asset_1_mi is not None and asset_2_mi is not None
- Report.critical_result(Tests.entities_found, result)
-
- # 8) Verify if the entities can be selected
- tree.expandAll()
- tree.model().setData(asset_1_mi, 2, Qt.CheckStateRole)
- tree.model().setData(asset_2_mi, 2, Qt.CheckStateRole)
- checklist = [asset_1_mi, asset_1_mi.parent(), asset_2_mi, asset_2_mi.parent()]
- result = all([index.data(Qt.CheckStateRole) == 2 for index in checklist])
- Report.critical_result(Tests.select_multiple_targets, result)
-
- # 9) Close Debugging window and Script Canvas window
- logging_window.close()
- general.close_pane("Script Canvas")
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
- from utils import Report
-
- Report.start_test(Debugging_TargetMultipleEntities)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Debugging_TargetMultipleGraphs.py b/AutomatedTesting/Gem/PythonTests/scripting/Debugging_TargetMultipleGraphs.py
deleted file mode 100644
index 4aa5c822a7..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/Debugging_TargetMultipleGraphs.py
+++ /dev/null
@@ -1,113 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-
-Test case ID: T92569137
-Test Case Title: Multiple Graphs can be targeted in the Debugger tool
-URLs of the test case: https://testrail.agscollab.com/index.php?/tests/view/92569137
-"""
-
-
-# fmt: off
-class Tests():
- select_multiple_targets = ("Multiple targets are selected", "Multiple targets are not selected")
-# fmt: on
-
-
-GENERAL_WAIT = 0.5 # seconds
-
-
-def Debugging_TargetMultipleGraphs():
- """
- Summary:
- Multiple Graphs can be targeted in the Debugger tool
-
- Expected Behavior:
- Selected files can be checked for logging.
- Upon checking, checkboxes of the parent folders change to either full or partial check.
-
- Test Steps:
- 1) Open Script Canvas window (Tools > Script Canvas)
- 2) Get the SC window object
- 3) Open Debugging Tool if not opened already
- 4) Select Graphs tab under logging window
- 5) Select multiple targets from levels and scriptcanvas
- 6) Verify if multiple targets are selected
- 7) Close Debugging window and Script Canvas window
-
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- from PySide2 import QtWidgets
- from PySide2.QtCore import Qt
- import azlmbr.legacy.general as general
-
- import pyside_utils
- from utils import TestHelper as helper
- from utils import Report
-
- # 1) Open Script Canvas window (Tools > Script Canvas)
- general.idle_enable(True)
- general.open_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 6.0)
-
- # 2) Get the SC window object
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
-
- # 3) Open Debugging Tool if not opened already
- if (
- sc.findChild(QtWidgets.QDockWidget, "LoggingWindow") is None
- or not sc.findChild(QtWidgets.QDockWidget, "LoggingWindow").isVisible()
- ):
- action = pyside_utils.find_child_by_pattern(sc, {"text": "Debugging", "type": QtWidgets.QAction})
- action.trigger()
- logging_window = sc.findChild(QtWidgets.QDockWidget, "LoggingWindow")
-
- # 4) Select Graphs tab under logging window
- button = pyside_utils.find_child_by_pattern(logging_window, {"type": QtWidgets.QPushButton, "text": "Graphs"})
- button.click()
-
- # 5) Select multiple targets from levels and scriptcanvas
- graphs = logging_window.findChild(QtWidgets.QWidget, "graphsPage")
- tree = graphs.findChild(QtWidgets.QTreeView, "pivotTreeView")
- # Select the first child under levels
- level_model_index = pyside_utils.find_child_by_pattern(tree, "levels")
- level_child_index = pyside_utils.get_item_view_index(tree, 0, 0, level_model_index)
- tree.model().setData(level_child_index, 2, Qt.CheckStateRole)
- # Select the first child under scriptcanvas
- sc_model_index = pyside_utils.find_child_by_pattern(tree, "scriptcanvas")
- sc_child_index = pyside_utils.get_item_view_index(tree, 0, 0, sc_model_index)
- tree.model().setData(sc_child_index, 2, Qt.CheckStateRole)
-
- # 6) Verify if multiple targets are selected
- result = all([index.data(Qt.CheckStateRole) != 0 for index in (level_model_index, sc_model_index)])
- result = result and all([index.data(Qt.CheckStateRole) == 2 for index in (level_child_index, sc_child_index)])
- Report.result(Tests.select_multiple_targets, result)
-
- # 7) Close Debugging window and Script Canvas window
- logging_window.close()
- general.close_pane("Script Canvas")
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
-
- from utils import Report
-
- Report.start_test(Debugging_TargetMultipleGraphs)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Docking_Pane.py b/AutomatedTesting/Gem/PythonTests/scripting/Docking_Pane.py
deleted file mode 100755
index 4fa1e1257f..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/Docking_Pane.py
+++ /dev/null
@@ -1,117 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: C1702824
-Test Case Title: Docking
-URLs of the test case: https://testrail.agscollab.com/index.php?/cases/view/1702824
-"""
-
-
-# fmt: off
-class Tests():
- pane_opened = ("Pane is opened successfully", "Failed to open pane")
- dock_pane = ("Pane is docked successfully", "Failed to dock Pane into one or more allowed area")
-# fmt: on
-
-
-def Docking_Pane():
- """
- Summary:
- The Script Canvas window is opened to verify if Script canvas panes can be docked into
- every possible area of Script Canvas main window.
-
- Expected Behavior:
- The pane docks successfully.
-
- Test Steps:
- 1) Open Script Canvas window (Tools > Script Canvas)
- 2) Make sure Node Palette pane is opened
- 3) Dock the Node Palette pane into every possible area of main window
- 4) Restore default layout
- 5) Close Script Canvas window
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- # Helper imports
- import ImportPathHelper as imports
-
- imports.init()
-
- 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
-
- # Open 3D Engine imports
- import azlmbr.legacy.general as general
-
- # Pyside imports
- from PySide2 import QtCore, QtWidgets
- from PySide2.QtCore import Qt
-
- PANE_WIDGET = "NodePalette" # Chosen most commonly used pane
- DOCKAREAS = [Qt.TopDockWidgetArea, Qt.BottomDockWidgetArea, Qt.RightDockWidgetArea, Qt.LeftDockWidgetArea]
- DOCKED = True
-
- def click_menu_option(window, option_text):
- action = pyside_utils.find_child_by_pattern(window, {"text": option_text, "type": QtWidgets.QAction})
- action.trigger()
-
- def find_pane(window, pane_name):
- return window.findChild(QtWidgets.QDockWidget, pane_name)
-
- # Test starts here
- general.idle_enable(True)
-
- # 1) Open Script Canvas window (Tools > Script Canvas)
- general.open_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
-
- # 2) Make sure Node Palette pane is opened
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
- sc_main = sc.findChild(QtWidgets.QMainWindow)
- pane = find_pane(sc_main, PANE_WIDGET)
- if not pane.isVisible():
- click_menu_option(sc, "Node Palette")
- pane = find_pane(sc_main, PANE_WIDGET) # New reference
-
- Report.result(Tests.pane_opened, pane.isVisible())
-
- # 3) Dock the Node Palette pane into every possible area of main window
- for area in DOCKAREAS:
- sc_main.addDockWidget(area, find_pane(sc_main, PANE_WIDGET), QtCore.Qt.Vertical)
- if not (sc_main.dockWidgetArea(find_pane(sc_main, PANE_WIDGET)) == area):
- Report.info(f"Failed to dock into {str(area)}")
- DOCKED = DOCKED and (sc_main.dockWidgetArea(find_pane(sc_main, PANE_WIDGET)) == area)
-
- Report.result(Tests.dock_pane, DOCKED)
-
- # 4) Restore default layout
- # Need this step to restore to default in case of test failure
- click_menu_option(sc, "Restore Default Layout")
-
- # 5) Close Script Canvas window
- sc.close()
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
-
- from editor_python_test_tools.utils import Report
-
- Report.start_test(Docking_Pane)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/EditMenu_Default_UndoRedo.py b/AutomatedTesting/Gem/PythonTests/scripting/EditMenu_Default_UndoRedo.py
new file mode 100644
index 0000000000..34345cf36b
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/EditMenu_Default_UndoRedo.py
@@ -0,0 +1,113 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ variable_created = ("New variable created", "New variable not created")
+ undo_worked = ("Undo action working", "Undo action did not work")
+ redo_worked = ("Redo action working", "Redo action did not work")
+# fmt: on
+
+
+def EditMenu_Default_UndoRedo():
+ """
+ Summary:
+ Edit > Undo undoes the last action
+ Edit > Redo redoes the last undone action
+ We create a new variable in variable manager, undo and verify if variable is removed,
+ redo it and verify if the variable is created again.
+
+ Expected Behavior:
+ The last action is undone upon selecting Undo.
+ The last undone action is redone upon selecting Redo.
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Get the SC window object
+ 3) Open Variable Manager if not opened already
+ 4) Create Graph
+ 5) Create new variable
+ 6) Verify if the variable is created initially
+ 7) Trigger Undo action and verify if variable is removed in Variable Manager
+ 8) Trigger Redo action and verify if variable is re-added in Variable Manager
+ 9) Close SC window
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ from PySide2 import QtWidgets, QtCore
+
+ import pyside_utils
+
+ import azlmbr.legacy.general as general
+
+ # 1) Open Script Canvas window
+ general.idle_enable(True)
+ general.open_pane("Script Canvas")
+
+ # 2) Get the SC window object
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+
+ # 3) Open Variable Manager if not opened already
+ if sc.findChild(QtWidgets.QDockWidget, "VariableManager") is None:
+ action = pyside_utils.find_child_by_pattern(sc, {"text": "Variable Manager", "type": QtWidgets.QAction})
+ action.trigger()
+ variable_manager = sc.findChild(QtWidgets.QDockWidget, "VariableManager")
+
+ # 4) Create Graph
+ action = pyside_utils.find_child_by_pattern(sc, {"objectName": "action_New_Script", "type": QtWidgets.QAction})
+ action.trigger()
+
+ # 5) Create new variable
+ add_button = variable_manager.findChild(QtWidgets.QPushButton, "addButton")
+ add_button.click() # Click on Create Variable button
+ # Select variable type
+ table_view = variable_manager.findChild(QtWidgets.QTableView, "variablePalette")
+ model_index = pyside_utils.find_child_by_pattern(table_view, "Boolean")
+ # Click on it to create variable
+ pyside_utils.item_view_index_mouse_click(table_view, model_index)
+
+ # 6) Verify if the variable is created initially
+ graph_vars = variable_manager.findChild(QtWidgets.QTableView, "graphVariables")
+ result = graph_vars.model().rowCount(QtCore.QModelIndex()) == 1 # since we added 1 variable, rowcount=1
+ Report.result(Tests.variable_created, result)
+
+ # 7) Trigger Undo action and verify if variable is removed in Variable Manager
+ action = sc.findChild(QtWidgets.QAction, "action_Undo")
+ action.trigger()
+ result = graph_vars.model().rowCount(QtCore.QModelIndex()) == 0 # since we triggered undo, rowcount=0
+ Report.result(Tests.undo_worked, result)
+
+ # 8) Trigger Redo action and verify if variable is readded in Variable Manager
+ action = sc.findChild(QtWidgets.QAction, "action_Redo")
+ action.trigger()
+ result = (
+ graph_vars.model().rowCount(QtCore.QModelIndex()) == 1
+ ) # since action is redone 1 variable is readded, rowcount=1
+ Report.result(Tests.redo_worked, result)
+
+ # 9) Close SC window
+ general.close_pane("Script Canvas")
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(EditMenu_Default_UndoRedo)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/EditMenu_UndoRedo.py b/AutomatedTesting/Gem/PythonTests/scripting/EditMenu_UndoRedo.py
deleted file mode 100644
index a87d9e9be9..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/EditMenu_UndoRedo.py
+++ /dev/null
@@ -1,123 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-
-Test case ID: T92569049
-Test Case Title: Edit > Undo undoes the last action
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92569049
-Test case ID: T92569051
-Test Case Title: Edit > Redo redoes the last undone action
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92569051
-"""
-
-
-# fmt: off
-class Tests():
- variable_created = ("New variable created", "New variable not created")
- undo_worked = ("Undo action working", "Undo action did not work")
- redo_worked = ("Redo action working", "Redo action did not work")
-# fmt: on
-
-
-def EditMenu_UndoRedo():
- """
- Summary:
- Edit > Undo undoes the last action
- Edit > Redo redoes the last undone action
- We create a new variable in variable manager, undo and verify if variable is removed,
- redo it and verify if the variable is created again.
-
- Expected Behavior:
- The last action is undone.
- The last undone action is redone.
-
- Test Steps:
- 1) Open Script Canvas window (Tools > Script Canvas)
- 2) Get the SC window object
- 3) Open Variable Manager if not opened already
- 4) Create Graph
- 5) Create new variable
- 6) Verify if the variable is created initially
- 7) Trigger Undo action and verify if variable is removed in Variable Manager
- 8) Trigger Redo action and verify if variable is readded in Variable Manager
- 9) Close SC window
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- from PySide2 import QtWidgets, QtCore
-
- import azlmbr.legacy.general as general
-
- import pyside_utils
-
- # 1) Open Script Canvas window
- general.idle_enable(True)
- general.open_pane("Script Canvas")
-
- # 2) Get the SC window object
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
-
- # 3) Open Variable Manager if not opened already
- if sc.findChild(QtWidgets.QDockWidget, "VariableManager") is None:
- action = pyside_utils.find_child_by_pattern(sc, {"text": "Variable Manager", "type": QtWidgets.QAction})
- action.trigger()
- variable_manager = sc.findChild(QtWidgets.QDockWidget, "VariableManager")
-
- # 4) Create Graph
- action = pyside_utils.find_child_by_pattern(sc, {"objectName": "action_New_Script", "type": QtWidgets.QAction})
- action.trigger()
-
- # 5) Create new variable
- add_button = variable_manager.findChild(QtWidgets.QPushButton, "addButton")
- add_button.click() # Click on Create Variable button
- # Select variable type
- table_view = variable_manager.findChild(QtWidgets.QTableView, "variablePalette")
- model_index = pyside_utils.find_child_by_pattern(table_view, "Boolean")
- # Click on it to create variable
- pyside_utils.item_view_index_mouse_click(table_view, model_index)
-
- # 6) Verify if the variable is created initially
- graph_vars = variable_manager.findChild(QtWidgets.QTableView, "graphVariables")
- result = graph_vars.model().rowCount(QtCore.QModelIndex()) == 1 # since we added 1 variable, rowcount=1
- Report.result(Tests.variable_created, result)
-
- # 7) Trigger Undo action and verify if variable is removed in Variable Manager
- action = sc.findChild(QtWidgets.QAction, "action_Undo")
- action.trigger()
- result = graph_vars.model().rowCount(QtCore.QModelIndex()) == 0 # since we triggered undo, rowcount=0
- Report.result(Tests.undo_worked, result)
-
- # 8) Trigger Redo action and verify if variable is readded in Variable Manager
- action = sc.findChild(QtWidgets.QAction, "action_Redo")
- action.trigger()
- result = (
- graph_vars.model().rowCount(QtCore.QModelIndex()) == 1
- ) # since action is redone 1 variable is readded, rowcount=1
- Report.result(Tests.redo_worked, result)
-
- # 9) Close SC window
- general.close_pane("Script Canvas")
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
-
- from utils import Report
-
- Report.start_test(EditMenu_UndoRedo)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Entity_AddScriptCanvasComponent.py b/AutomatedTesting/Gem/PythonTests/scripting/Entity_AddScriptCanvasComponent.py
deleted file mode 100644
index fd8e9b1173..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/Entity_AddScriptCanvasComponent.py
+++ /dev/null
@@ -1,88 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: T92562978
-Test Case Title: Script Canvas Component can be added to an entity
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92562978
-"""
-
-
-# fmt: off
-class Tests():
- level_created = ("New level created", "Failed to create new level")
- entity_created = ("Test Entity created", "Failed to create test entity")
- add_sc_component = ("Script Canvas component added to entity", "Failed to add SC component to entity")
- no_errors_found = ("Tracer found no errors", "One or more errors found by Tracer")
- no_warnings_found = ("Tracer found no warnings", "One or more warnings found by Tracer")
-# fmt: on
-
-
-def Entity_AddScriptCanvasComponent():
- """
- Summary:
- verify if Script Canvas component can be added to Entity without any issue
-
- Expected Behavior:
- Script Canvas Component is added to the entity successfully without issue.
-
- Test Steps:
- 1) Create temp level
- 2) Create test entity
- 3) Start Tracer
- 4) Add Script Canvas component to test entity
- 5) Search for errors and warnings
-
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- from utils import TestHelper as helper
- from utils import Tracer
- from editor_entity_utils import EditorEntity
- import azlmbr.legacy.general as general
-
- LEVEL_NAME = "tmp_level"
- WAIT_TIME = 3.0 # SECONDS
-
- # 1) Create temp level
- general.idle_enable(True)
- result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
- Report.critical_result(Tests.level_created, result == 0)
- helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
- general.close_pane("Error Report")
-
- # 2) Create new entity
- test_entity = EditorEntity.create_editor_entity("test_entity")
- Report.result(Tests.entity_created, test_entity.id.IsValid())
-
- # 3) Start Tracer
- with Tracer() as section_tracer:
-
- # 4) Add Script Canvas component to test entity
- test_entity.add_component("Script Canvas")
- Report.result(Tests.add_sc_component, test_entity.has_component("Script Canvas"))
-
- # 5) Search for errors and warnings
- Report.result(Tests.no_errors_found, not section_tracer.has_errors)
- Report.result(Tests.no_warnings_found, not section_tracer.has_warnings)
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
- from utils import Report
-
- Report.start_test(Entity_AddScriptCanvasComponent)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Entity_HappyPath_AddScriptCanvasComponent.py b/AutomatedTesting/Gem/PythonTests/scripting/Entity_HappyPath_AddScriptCanvasComponent.py
new file mode 100644
index 0000000000..22530c90c1
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/Entity_HappyPath_AddScriptCanvasComponent.py
@@ -0,0 +1,83 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ level_created = ("New level created", "Failed to create new level")
+ entity_created = ("Test Entity created", "Failed to create test entity")
+ add_sc_component = ("Script Canvas component added to entity", "Failed to add SC component to entity")
+ no_errors_found = ("Tracer found no errors", "One or more errors found by Tracer")
+ no_warnings_found = ("Tracer found no warnings", "One or more warnings found by Tracer")
+# fmt: on
+
+
+def Entity_HappyPath_AddScriptCanvasComponent():
+ """
+ Summary:
+ Script Canvas Component can be added to an entity
+
+ Expected Behavior:
+ Script Canvas Component is added to the entity successfully without issue
+
+ Test Steps:
+ 1) Create temp level
+ 2) Create test entity
+ 3) Start Tracer
+ 4) Add Script Canvas component to test entity
+ 5) Search for errors and warnings
+
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ from utils import TestHelper as helper
+ from utils import Tracer
+ from editor_entity_utils import EditorEntity
+ import azlmbr.legacy.general as general
+
+ LEVEL_NAME = "tmp_level"
+ WAIT_TIME = 3.0 # SECONDS
+
+ # 1) Create temp level
+ general.idle_enable(True)
+ result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
+ Report.critical_result(Tests.level_created, result == 0)
+ helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
+ general.close_pane("Error Report")
+
+ # 2) Create new entity
+ test_entity = EditorEntity.create_editor_entity("test_entity")
+ Report.result(Tests.entity_created, test_entity.id.IsValid())
+
+ # 3) Start Tracer
+ with Tracer() as section_tracer:
+
+ # 4) Add Script Canvas component to test entity
+ test_entity.add_component("Script Canvas")
+ Report.result(Tests.add_sc_component, test_entity.has_component("Script Canvas"))
+
+ # 5) Search for errors and warnings
+ Report.result(Tests.no_errors_found, not section_tracer.has_errors)
+ Report.result(Tests.no_warnings_found, not section_tracer.has_warnings)
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(Entity_HappyPath_AddScriptCanvasComponent)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/FileMenu_Default_NewAndOpen.py b/AutomatedTesting/Gem/PythonTests/scripting/FileMenu_Default_NewAndOpen.py
new file mode 100644
index 0000000000..4771a95ab7
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/FileMenu_Default_NewAndOpen.py
@@ -0,0 +1,90 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+from PySide2 import QtWidgets
+
+import editor_python_test_tools.pyside_utils as pyside_utils
+from editor_python_test_tools.utils import Report
+
+import azlmbr.legacy.general as general
+
+
+# fmt: off
+class Tests():
+ new_action = "File->New action working as expected"
+ open_action = "File->Open action working as expected"
+# fmt: on
+
+
+GENERAL_WAIT = 0.5 # seconds
+
+
+class TestFileMenuDefaultNewOpen:
+ """
+ Summary:
+ When clicked on File->New, new script opens
+ File->Open should open the FileBrowser
+
+ Expected Behavior:
+ New and Open actions should work as expected.
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Get the SC window object
+ 3) Trigger File->New action
+ 4) Verify if New tab is opened
+ 5) Trigger File->Open action
+ 6) Close Script Canvas window
+
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ @pyside_utils.wrap_async
+ async def run_test(self):
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.open_pane("Script Canvas")
+
+ # 2) Get the SC window object
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ sc_main = sc.findChild(QtWidgets.QMainWindow)
+ sc_tabs = sc_main.findChild(QtWidgets.QTabWidget, "ScriptCanvasTabs")
+
+ # 3) Trigger File->New action
+ initial_tabs_count = sc_tabs.count()
+ action = pyside_utils.find_child_by_pattern(
+ sc_main, {"objectName": "action_New_Script", "type": QtWidgets.QAction}
+ )
+ action.trigger()
+
+ # 4) Verify if New tab is opened
+ general.idle_wait(GENERAL_WAIT)
+ Report.info(f"{Tests.new_action}: {sc_tabs.count() == initial_tabs_count + 1}")
+
+ # 5) Trigger File->Open action
+ action = pyside_utils.find_child_by_pattern(sc_main, {"objectName": "action_Open", "type": QtWidgets.QAction})
+ pyside_utils.trigger_action_async(action)
+ general.idle_wait(GENERAL_WAIT)
+ popup = await pyside_utils.wait_for_modal_widget()
+ Report.info(f"{Tests.open_action}: {popup and 'Open' in popup.windowTitle()}")
+ popup.close()
+
+ # 6) Close Script Canvas window
+ general.close_pane("Script Canvas")
+
+
+test = TestFileMenuDefaultNewOpen()
+test.run_test()
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/FileMenu_New_Open.py b/AutomatedTesting/Gem/PythonTests/scripting/FileMenu_New_Open.py
deleted file mode 100644
index f72ac8ea01..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/FileMenu_New_Open.py
+++ /dev/null
@@ -1,98 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-
-Test case ID: T92569037
-Test Case Title: File > New Script creates a new script
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92569037
-Test case ID: T92569039
-Test Case Title: File > Open opens the Open... dialog
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92569039
-"""
-
-import os
-import sys
-from PySide2 import QtWidgets
-import azlmbr.legacy.general as general
-
-import editor_python_test_tools.pyside_utils as pyside_utils
-from editor_python_test_tools.utils import Report
-
-# fmt: off
-class Tests():
- new_action = "File->New action working as expected"
- open_action = "File->Open action working as expected"
-# fmt: on
-
-
-GENERAL_WAIT = 0.5 # seconds
-
-
-class TestFileMenuNewOpen:
- """
- Summary:
- When clicked on File->New, new script opens and File->Open should open the FileBrowser
-
- Expected Behavior:
- New and Open actions should work as expected.
-
- Test Steps:
- 1) Open Script Canvas window (Tools > Script Canvas)
- 2) Get the SC window object
- 3) Trigger File->New action
- 4) Verify if New tab is opened
- 5) Trigger File->Open action
- 6) Close Script Canvas window
-
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- @pyside_utils.wrap_async
- async def run_test(self):
- # 1) Open Script Canvas window (Tools > Script Canvas)
- general.open_pane("Script Canvas")
-
- # 2) Get the SC window object
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
- sc_main = sc.findChild(QtWidgets.QMainWindow)
- sc_tabs = sc_main.findChild(QtWidgets.QTabWidget, "ScriptCanvasTabs")
-
- # 3) Trigger File->New action
- initial_tabs_count = sc_tabs.count()
- action = pyside_utils.find_child_by_pattern(
- sc_main, {"objectName": "action_New_Script", "type": QtWidgets.QAction}
- )
- action.trigger()
-
- # 4) Verify if New tab is opened
- general.idle_wait(GENERAL_WAIT)
- Report.info(f"{Tests.new_action}: {sc_tabs.count() == initial_tabs_count + 1}")
-
- # 5) Trigger File->Open action
- action = pyside_utils.find_child_by_pattern(sc_main, {"objectName": "action_Open", "type": QtWidgets.QAction})
- pyside_utils.trigger_action_async(action)
- general.idle_wait(GENERAL_WAIT)
- popup = await pyside_utils.wait_for_modal_widget()
- Report.info(f"{Tests.open_action}: {popup and 'Open' in popup.windowTitle()}")
- popup.close()
-
- # 6) Close Script Canvas window
- general.close_pane("Script Canvas")
-
-
-test = TestFileMenuNewOpen()
-test.run_test()
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/GraphClose_Default_SavePrompt.py b/AutomatedTesting/Gem/PythonTests/scripting/GraphClose_Default_SavePrompt.py
new file mode 100644
index 0000000000..9720c846c7
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/GraphClose_Default_SavePrompt.py
@@ -0,0 +1,102 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+from PySide2 import QtWidgets
+
+import editor_python_test_tools.pyside_utils as pyside_utils
+from editor_python_test_tools.utils import TestHelper as helper
+from editor_python_test_tools.utils import Report
+
+import azlmbr.legacy.general as general
+
+
+# fmt: off
+class Tests():
+ new_graph = "New graph created"
+ save_prompt = "Save prompt opened as expected"
+ close_graph = "Close button worked as expected"
+# fmt: on
+
+
+GENERAL_WAIT = 0.5 # seconds
+
+
+class TestGraphClose_Default_SavePrompt:
+ """
+ Summary:
+ The graph is closed when x button is clicked.
+ Save Prompt is opened before closing.
+
+ Expected Behavior:
+ The Graph is closed.
+ Upon closing the graph, User is prompted whether or not to save changes.
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Get the SC window object
+ 3) Trigger File->New action
+ 4) Verify if New tab is opened
+ 5) Close new tab using X on top of graph and check for save dialog
+ 6) Check if tab is closed
+ 7) Close Script Canvas window
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ @pyside_utils.wrap_async
+ async def run_test(self):
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.idle_enable(True)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+
+ # 2) Get the SC window object
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ sc_main = sc.findChild(QtWidgets.QMainWindow)
+ sc_tabs = sc_main.findChild(QtWidgets.QTabWidget, "ScriptCanvasTabs")
+ tab_bar = sc_tabs.findChild(QtWidgets.QTabBar)
+
+ # 3) Trigger File->New action
+ initial_tabs_count = sc_tabs.count()
+ action = pyside_utils.find_child_by_pattern(
+ sc_main, {"objectName": "action_New_Script", "type": QtWidgets.QAction}
+ )
+ action.trigger()
+
+ # 4) Verify if New tab is opened
+ result = helper.wait_for_condition(lambda: sc_tabs.count() == initial_tabs_count + 1, GENERAL_WAIT)
+ Report.info(f"{Tests.new_graph}: {result}")
+
+ # 5) Close new tab using X on top of graph and check for save dialog
+ close_button = tab_bar.findChildren(QtWidgets.QAbstractButton)[0]
+ pyside_utils.click_button_async(close_button)
+ popup = await pyside_utils.wait_for_modal_widget()
+ if popup:
+ Report.info(f"{Tests.save_prompt}: {popup.findChild(QtWidgets.QDialog, 'SaveChangesDialog') is not None}")
+ dont_save = popup.findChild(QtWidgets.QPushButton, "m_continueButton")
+ dont_save.click()
+
+ # 6) Check if tab is closed
+ await pyside_utils.wait_for_condition(lambda: sc_tabs.count() == initial_tabs_count, 5.0)
+ Report.info(f"{Tests.close_graph}: {sc_tabs.count()==initial_tabs_count}")
+
+ # 7) Close Script Canvas window
+ general.close_pane("Script Canvas")
+
+
+test = TestGraphClose_Default_SavePrompt()
+test.run_test()
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/GraphClose_SavePrompt.py b/AutomatedTesting/Gem/PythonTests/scripting/GraphClose_SavePrompt.py
deleted file mode 100644
index ce610b159b..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/GraphClose_SavePrompt.py
+++ /dev/null
@@ -1,110 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-
-Test case ID: T92563070
-Test Case Title: Graphs can be closed by clicking X on the Graph name tab
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92563070
-Test case ID: T92563068
-Test Case Title: Save Prompt: User is prompted to save a graph on close after
-creating a new graph
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92563068
-"""
-
-import os
-import sys
-from PySide2 import QtWidgets
-import azlmbr.legacy.general as general
-
-import editor_python_test_tools.pyside_utils as pyside_utils
-from editor_python_test_tools.utils import TestHelper as helper
-from editor_python_test_tools.utils import Report
-
-# fmt: off
-class Tests():
- new_graph = "New graph created"
- save_prompt = "Save prompt opened as expected"
- close_graph = "Close button worked as expected"
-# fmt: on
-
-
-GENERAL_WAIT = 0.5 # seconds
-
-
-class TestGraphCloseSavePrompt:
- """
- Summary:
- The graph is closed when x button is clicked.
- Save Prompt is opened before closing.
-
- Expected Behavior:
- New and Open actions should work as expected.
-
- Test Steps:
- 1) Open Script Canvas window (Tools > Script Canvas)
- 2) Get the SC window object
- 3) Trigger File->New action
- 4) Verify if New tab is opened
- 5) Close new tab using X on top of graph and check for save dialog
- 6) Check if tab is closed
- 7) Close Script Canvas window
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- @pyside_utils.wrap_async
- async def run_test(self):
- # 1) Open Script Canvas window (Tools > Script Canvas)
- general.idle_enable(True)
- general.open_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
-
- # 2) Get the SC window object
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
- sc_main = sc.findChild(QtWidgets.QMainWindow)
- sc_tabs = sc_main.findChild(QtWidgets.QTabWidget, "ScriptCanvasTabs")
- tab_bar = sc_tabs.findChild(QtWidgets.QTabBar)
-
- # 3) Trigger File->New action
- initial_tabs_count = sc_tabs.count()
- action = pyside_utils.find_child_by_pattern(
- sc_main, {"objectName": "action_New_Script", "type": QtWidgets.QAction}
- )
- action.trigger()
-
- # 4) Verify if New tab is opened
- result = helper.wait_for_condition(lambda: sc_tabs.count() == initial_tabs_count + 1, GENERAL_WAIT)
- Report.info(f"{Tests.new_graph}: {result}")
-
- # 5) Close new tab using X on top of graph and check for save dialog
- close_button = tab_bar.findChildren(QtWidgets.QAbstractButton)[0]
- pyside_utils.click_button_async(close_button)
- popup = await pyside_utils.wait_for_modal_widget()
- if popup:
- Report.info(f"{Tests.save_prompt}: {popup.findChild(QtWidgets.QDialog, 'SaveChangesDialog') is not None}")
- dont_save = popup.findChild(QtWidgets.QPushButton, "m_continueButton")
- dont_save.click()
-
- # 6) Check if tab is closed
- await pyside_utils.wait_for_condition(lambda: sc_tabs.count() == initial_tabs_count, 5.0)
- Report.info(f"{Tests.close_graph}: {sc_tabs.count()==initial_tabs_count}")
-
- # 7) Close Script Canvas window
- general.close_pane("Script Canvas")
-
-
-test = TestGraphCloseSavePrompt()
-test.run_test()
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Graph_HappyPath_ZoomInZoomOut.py b/AutomatedTesting/Gem/PythonTests/scripting/Graph_HappyPath_ZoomInZoomOut.py
new file mode 100644
index 0000000000..11c83bb779
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/Graph_HappyPath_ZoomInZoomOut.py
@@ -0,0 +1,111 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ zoom_in = ("Zoom In action working as expected", "Zoom In action not working as expected")
+ zoom_out = ("Zoom Out action working as expected", "Zoom Out action not working as expected")
+# fmt: on
+
+
+GENERAL_WAIT = 0.5 # seconds
+
+
+def Graph_HappyPath_ZoomInZoomOut():
+ """
+ Summary:
+ The graph can be zoomed in and zoomed out.
+
+ Expected Behavior:
+ The graph is zoomed in when when we click View->ZoomIn
+ The graph is zoomed out when when we click View->ZoomOut
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Get the SC window object
+ 3) Create new graph
+ 4) Get initial graph transform values
+ 5) Trigger Zoom In and verify if the graph transform scale is increased
+ 6) Trigger Zoom Out and verify if the graph transform scale is decreased
+ 7) Close Script Canvas window
+
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ # Helper imports
+ import ImportPathHelper as imports
+
+ imports.init()
+
+ from PySide2 import QtWidgets
+ import azlmbr.legacy.general as general
+
+ import pyside_utils
+ from utils import TestHelper as helper
+ from utils import Report
+
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.idle_enable(True)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+
+ # 2) Get the SC window object
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ sc_main = sc.findChild(QtWidgets.QMainWindow)
+
+ # 3) Create new graph
+ create_new_graph = pyside_utils.find_child_by_pattern(
+ sc_main, {"objectName": "action_New_Script", "type": QtWidgets.QAction}
+ )
+ create_new_graph.trigger()
+
+ # 4) Get initial graph transform values
+ graphics_view = sc_main.findChild(QtWidgets.QGraphicsView)
+ # NOTE: transform m11 and m22 are horizontal and vertical scales of graph
+ # they increase when zoomed in and decreased when zoomed out
+ curr_m11, curr_m22 = graphics_view.transform().m11(), graphics_view.transform().m22()
+
+ # 5) Trigger Zoom In and verify if the graph transform scale is increased
+ zin = pyside_utils.find_child_by_pattern(sc_main, {"objectName": "action_ZoomIn", "type": QtWidgets.QAction})
+ zin.trigger()
+ result = helper.wait_for_condition(
+ lambda: curr_m11 < graphics_view.transform().m11() and curr_m22 < graphics_view.transform().m22(), GENERAL_WAIT
+ )
+ Report.result(Tests.zoom_in, result)
+
+ # 6) Trigger Zoom Out and verify if the graph transform scale is decreased
+ curr_m11, curr_m22 = graphics_view.transform().m11(), graphics_view.transform().m22()
+ zout = pyside_utils.find_child_by_pattern(sc_main, {"objectName": "action_ZoomOut", "type": QtWidgets.QAction})
+ zout.trigger()
+ result = helper.wait_for_condition(
+ lambda: curr_m11 > graphics_view.transform().m11() and curr_m22 > graphics_view.transform().m22(), GENERAL_WAIT
+ )
+ Report.result(Tests.zoom_out, result)
+
+ # 7) Close Script Canvas window
+ general.close_pane("Script Canvas")
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(Graph_HappyPath_ZoomInZoomOut)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Graph_ZoomInZoomOut.py b/AutomatedTesting/Gem/PythonTests/scripting/Graph_ZoomInZoomOut.py
deleted file mode 100644
index a93b6e61d1..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/Graph_ZoomInZoomOut.py
+++ /dev/null
@@ -1,120 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-
-Test case ID: T92569079
-Test Case Title: View > Zoom In zooms the graph in
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92569079
-Test case ID: T92569081
-Test Case Title: View > Zoom In zooms the graph out
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92569081
-"""
-
-
-# fmt: off
-class Tests():
- zoom_in = ("Zoom In action working as expected", "Zoom In action not working as expected")
- zoom_out = ("Zoom Out action working as expected", "Zoom Out action not working as expected")
-# fmt: on
-
-
-GENERAL_WAIT = 0.5 # seconds
-
-
-def Graph_ZoomInZoomOut():
- """
- Summary:
- The graph can be zoomed in and zoomed out.
-
- Expected Behavior:
- The graph is zoomed in when when we click View->ZoomIn
- The graph is zoomed out when when we click View->ZoomOut
-
- Test Steps:
- 1) Open Script Canvas window (Tools > Script Canvas)
- 2) Get the SC window object
- 3) Create new graph
- 4) Get initial graph transform values
- 5) Trigger Zoom In and verify if the graph transform scale is increased
- 6) Trigger Zoom Out and verify if the graph transform scale is decreased
- 7) Close Script Canvas window
-
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- # Helper imports
- import ImportPathHelper as imports
-
- imports.init()
-
- from PySide2 import QtWidgets
- import azlmbr.legacy.general as general
-
- import pyside_utils
- from utils import TestHelper as helper
- from utils import Report
-
- # 1) Open Script Canvas window (Tools > Script Canvas)
- general.idle_enable(True)
- general.open_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
-
- # 2) Get the SC window object
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
- sc_main = sc.findChild(QtWidgets.QMainWindow)
-
- # 3) Create new graph
- create_new_graph = pyside_utils.find_child_by_pattern(
- sc_main, {"objectName": "action_New_Script", "type": QtWidgets.QAction}
- )
- create_new_graph.trigger()
-
- # 4) Get initial graph transform values
- graphics_view = sc_main.findChild(QtWidgets.QGraphicsView)
- # NOTE: transform m11 and m22 are horizontal and vertical scales of graph
- # they increase when zoomed in and decreased when zoomed out
- curr_m11, curr_m22 = graphics_view.transform().m11(), graphics_view.transform().m22()
-
- # 5) Trigger Zoom In and verify if the graph transform scale is increased
- zin = pyside_utils.find_child_by_pattern(sc_main, {"objectName": "action_ZoomIn", "type": QtWidgets.QAction})
- zin.trigger()
- result = helper.wait_for_condition(
- lambda: curr_m11 < graphics_view.transform().m11() and curr_m22 < graphics_view.transform().m22(), GENERAL_WAIT,
- )
- Report.result(Tests.zoom_in, result)
-
- # 6) Trigger Zoom Out and verify if the graph transform scale is decreased
- curr_m11, curr_m22 = graphics_view.transform().m11(), graphics_view.transform().m22()
- zout = pyside_utils.find_child_by_pattern(sc_main, {"objectName": "action_ZoomOut", "type": QtWidgets.QAction})
- zout.trigger()
- result = helper.wait_for_condition(
- lambda: curr_m11 > graphics_view.transform().m11() and curr_m22 > graphics_view.transform().m22(), GENERAL_WAIT,
- )
- Report.result(Tests.zoom_out, result)
-
- # 7) Close Script Canvas window
- general.close_pane("Script Canvas")
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
-
- from utils import Report
-
- Report.start_test(Graph_ZoomInZoomOut)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ImportPathHelper.py b/AutomatedTesting/Gem/PythonTests/scripting/ImportPathHelper.py
index a45024cebf..ef794433f0 100755
--- a/AutomatedTesting/Gem/PythonTests/scripting/ImportPathHelper.py
+++ b/AutomatedTesting/Gem/PythonTests/scripting/ImportPathHelper.py
@@ -9,9 +9,10 @@ remove or modify any license notices. This file is distributed on an "AS IS" BAS
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
"""
+
def init():
import os
import sys
- sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared')
- sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../EditorPythonTestTools/editor_python_test_tools')
-
\ No newline at end of file
+
+ sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../automatedtesting_shared")
+ sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../EditorPythonTestTools/editor_python_test_tools")
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/NewScriptEventButton_HappyPath_ContainsSCCategory.py b/AutomatedTesting/Gem/PythonTests/scripting/NewScriptEventButton_HappyPath_ContainsSCCategory.py
new file mode 100644
index 0000000000..acc0880a73
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/NewScriptEventButton_HappyPath_ContainsSCCategory.py
@@ -0,0 +1,122 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+from PySide2 import QtWidgets
+import azlmbr.legacy.general as general
+
+import editor_python_test_tools.pyside_utils as pyside_utils
+from editor_python_test_tools.utils import TestHelper as helper
+from editor_python_test_tools.utils import Report
+
+
+class Tests:
+ action_found = "New Script event action found"
+ asset_editor_opened = "Asset Editor opened"
+ new_asset = "Asset Editor created with new asset"
+ script_event = "New Script event created in Asset Editor"
+
+
+GENERAL_WAIT = 0.5 # seconds
+
+
+class TestAssetEditor_NewScriptEvent:
+ """
+ Summary:
+ Verifying logic flow of the "+" button on the Script Canvas pane's Node Palette is as expected
+
+ Expected Behavior:
+ Clicking the "+" button and selecting "New Script Event" opens the Asset Editor with a new Script Event asset
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Close any existing AssetEditor window
+ 3) Get the SC window object
+ 4) Click on New Script Event on Node palette
+ 5) Verify if Asset Editor opened
+ 6) Verify if a new asset with Script Canvas category is opened
+ 7) Close Script Canvas and Asset Editor
+
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ @pyside_utils.wrap_async
+ async def run_test(self):
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.idle_enable(True)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+
+ # 2) Close any existing AssetEditor window
+ general.close_pane("Asset Editor")
+ helper.wait_for_condition(lambda: not general.is_pane_visible("Asset Editor"), 5.0)
+
+ # 3) Get the SC window object
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ node_palette = sc.findChild(QtWidgets.QDockWidget, "NodePalette")
+ frame = node_palette.findChild(QtWidgets.QFrame, "searchCustomization")
+ button = frame.findChild(QtWidgets.QToolButton)
+ pyside_utils.click_button_async(button)
+
+ # 4) Click on New Script Event on Node palette
+ menu = None
+
+ def menu_has_focus():
+ nonlocal menu
+ for fw in [
+ QtWidgets.QApplication.activePopupWidget(),
+ QtWidgets.QApplication.activeModalWidget(),
+ QtWidgets.QApplication.focusWidget(),
+ QtWidgets.QApplication.activeWindow(),
+ ]:
+ print(fw)
+ if fw and isinstance(fw, QtWidgets.QMenu) and fw.isVisible():
+ menu = fw
+ return True
+ return False
+
+ await pyside_utils.wait_for_condition(menu_has_focus, GENERAL_WAIT)
+ action = await pyside_utils.wait_for_action_in_menu(menu, {"text": "New Script Event"})
+ Report.info(f"{Tests.action_found}: {action is not None}")
+ action.trigger()
+ pyside_utils.queue_hide_event(menu)
+
+ # 5) Verify if Asset Editor opened
+ result = helper.wait_for_condition(lambda: general.is_pane_visible("Asset Editor"), GENERAL_WAIT)
+ Report.info(f"{Tests.asset_editor_opened}: {result}")
+
+ # 6) Verify if a new asset with Script Canvas category is opened
+ asset_editor = editor_window.findChild(QtWidgets.QDockWidget, "Asset Editor")
+ row_container = asset_editor.findChild(QtWidgets.QWidget, "ContainerForRows")
+ # NOTE: QWidget ContainerForRows will have frames of Name, Category, ToolTip etc.
+ # To validate if a new script event file is generated, we check for
+ # QFrame Category and its value
+ categories = row_container.findChildren(QtWidgets.QFrame, "Category")
+ Report.info(f"{Tests.new_asset}: {len(categories)>0}")
+ result = False
+ for frame in categories:
+ line_edit = frame.findChild(QtWidgets.QLineEdit)
+ result = True if (line_edit and line_edit.text() == "Script Events") else False
+ Report.info(f"{Tests.script_event}: {result}")
+
+ # 7) Close Script Canvas and Asset Editor
+ general.close_pane("Script Canvas")
+ general.close_pane("Asset Editor")
+
+
+test = TestAssetEditor_NewScriptEvent()
+test.run_test()
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/NodeCategory_ExpandOnClick.py b/AutomatedTesting/Gem/PythonTests/scripting/NodeCategory_ExpandOnClick.py
new file mode 100644
index 0000000000..81e23dc35e
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/NodeCategory_ExpandOnClick.py
@@ -0,0 +1,127 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ pane_open = ("Script Canvas pane successfully opened", "Script Canvas pane failed to open")
+ click_expand = ("Category expanded on left click", "Category failed to expand on left click")
+ click_collapse = ("Category collapsed on left click", "Category failed to collapse on left click")
+ dClick_expand = ("Category expanded on double click", "Category failed to expand on double click")
+ dClick_collapse = ("Category collapsed on double click", "Category failed to collapse on double click")
+# fmt: on
+
+
+def NodeCategory_ExpandOnClick():
+ """
+ Summary:
+ Verifying the expand/collapse functionality on node categories
+
+ Expected Behavior:
+ The node category should expand when double clicked or when the drop down indicator is
+ left-clicked. Once expanded, it should be collapsed via the same actions.
+
+ Test Steps:
+ 1) Open Script Canvas pane
+ 2) Get the SC window objects
+ 3) Ensure all categories are collapsed for a clean state
+ 4) Left-Click on a node category arrow to expand it
+ 5) Verify it expanded
+ 6) Left-Click on a node category arrow to collapse it
+ 7) Verify it collapsed
+ 8) Double-Click on a node category to expand it
+ 9) Verify it expanded
+ 10) Double-Click on a node category to collapse it
+ 11) Verify it collapsed
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ from utils import Report
+ from PySide2 import QtCore, QtWidgets, QtTest
+ from PySide2.QtTest import QTest
+ import pyside_utils
+ import azlmbr.legacy.general as general
+
+ def left_click_arrow(item_view, index):
+ original_state = item_view.isExpanded(index)
+ rect_center_y = item_view.visualRect(index).center().y()
+ rect_left_x = item_view.visualRect(index).left()
+ for i in range(5): # this range can be increased for safe side
+ QtTest.QTest.mouseClick(
+ item_view.viewport(),
+ QtCore.Qt.LeftButton,
+ QtCore.Qt.NoModifier,
+ QtCore.QPoint(rect_left_x - i, rect_center_y),
+ )
+ if item_view.isExpanded(index) != original_state:
+ break
+
+ def double_click(item_view, index):
+ item_index_center = item_view.visualRect(index).center()
+ # Left click on the item before trying to double click, will otherwise fail to expand
+ # as first click would highlight and second click would be a 'single click'
+ pyside_utils.item_view_index_mouse_click(item_view, index)
+ QTest.mouseDClick(item_view.viewport(), QtCore.Qt.LeftButton, QtCore.Qt.NoModifier, item_index_center)
+
+ # 1) Open Script Canvas pane
+ general.open_pane("Script Canvas")
+ Report.critical_result(Tests.pane_open, general.is_pane_visible("Script Canvas"))
+
+ # 2) Get the SC window objects
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ if sc.findChild(QtWidgets.QDockWidget, "NodePalette") is None:
+ action = pyside_utils.find_child_by_pattern(sc, {"text": "Node Palette", "type": QtWidgets.QAction})
+ action.trigger()
+ node_palette = sc.findChild(QtWidgets.QDockWidget, "NodePalette")
+ nodeTree = node_palette.findChild(QtWidgets.QTreeView, "treeView")
+ ai_index = pyside_utils.find_child_by_pattern(nodeTree, "AI")
+
+ # 3) Ensure all categories are collapsed for a clean state
+ nodeTree.collapseAll()
+
+ # 4) Left-Click on a node category arrow to expand it
+ left_click_arrow(nodeTree, ai_index)
+
+ # 5) Verify it expanded
+ Report.result(Tests.click_expand, nodeTree.isExpanded(ai_index))
+
+ # 6) Left-Click on a node category arrow to collapse it
+ left_click_arrow(nodeTree, ai_index)
+
+ # 7) Verify it collapsed
+ Report.result(Tests.click_collapse, not nodeTree.isExpanded(ai_index))
+
+ # 8) Double-Click on a node category to expand it
+ double_click(nodeTree, ai_index)
+
+ # 9) Verify it expanded
+ Report.result(Tests.dClick_expand, nodeTree.isExpanded(ai_index))
+
+ # 10) Double-Click on a node category to collapse it
+ double_click(nodeTree, ai_index)
+
+ # 11) Verify it collapsed
+ Report.result(Tests.dClick_collapse, not nodeTree.isExpanded(ai_index))
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(NodeCategory_ExpandOnClick)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/NodeInspector_HappyPath_VariableRenames.py b/AutomatedTesting/Gem/PythonTests/scripting/NodeInspector_HappyPath_VariableRenames.py
new file mode 100644
index 0000000000..c235db6256
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/NodeInspector_HappyPath_VariableRenames.py
@@ -0,0 +1,126 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ variable_created = ("New variable created", "New variable is not created")
+ node_inspector_rename = ("Variable is renamed in Node Inspector", "Variable is not renamed in Node Inspector")
+ variable_manager_rename = ("Variable is renamed in Variable Manager", "Variable is not renamed in Variable Manager")
+# fmt: on
+
+
+GENERAL_WAIT = 0.5 # seconds
+
+
+def NodeInspector_HappyPath_VariableRenames():
+ """
+ Summary:
+ Renaming variables in the Node Inspector, renames the actual variable.
+
+ Expected Behavior:
+ The Variable's name is changed in both Node Inspector and Variable Manager.
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Get the SC window object
+ 3) Open Variable Manager if not opened already
+ 4) Open Node Inspector if not opened already
+ 5) Create new graph and a new variable in Variable manager
+ 6) Click on the variable
+ 7) Update name in Node Inspector and click on ENTER
+ 8) Verify if the name is updated in Node inspector and Variable manager
+ 9) Close Script Canvas window
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ from PySide2 import QtWidgets, QtCore, QtTest
+ from PySide2.QtCore import Qt
+
+ import pyside_utils
+ from utils import TestHelper as helper
+
+ import azlmbr.legacy.general as general
+
+ TEST_NAME = "test name"
+
+ def open_tool(sc, dock_widget_name, pane_name):
+ if sc.findChild(QtWidgets.QDockWidget, dock_widget_name) is None:
+ action = pyside_utils.find_child_by_pattern(sc, {"text": pane_name, "type": QtWidgets.QAction})
+ action.trigger()
+ tool = sc.findChild(QtWidgets.QDockWidget, dock_widget_name)
+ return tool
+
+ # 1) Open Script Canvas window
+ general.idle_enable(True)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+
+ # 2) Get the SC window object
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+
+ # 3) Open Variable Manager if not opened already
+ variable_manager = open_tool(sc, "VariableManager", "Variable Manager")
+
+ # 4) Open Node Inspector if not opened already
+ node_inspector = open_tool(sc, "NodeInspector", "Node Inspector")
+
+ # 5) Create new graph and a new variable in Variable manager
+ action = pyside_utils.find_child_by_pattern(sc, {"objectName": "action_New_Script", "type": QtWidgets.QAction})
+ action.trigger()
+ graph_vars = variable_manager.findChild(QtWidgets.QTableView, "graphVariables")
+ add_button = variable_manager.findChild(QtWidgets.QPushButton, "addButton")
+ add_button.click()
+ # Select variable type
+ table_view = variable_manager.findChild(QtWidgets.QTableView, "variablePalette")
+ model_index = pyside_utils.find_child_by_pattern(table_view, "Boolean")
+ # Click on it to create variable
+ pyside_utils.item_view_index_mouse_click(table_view, model_index)
+ result = graph_vars.model().rowCount(QtCore.QModelIndex()) == 1
+ var_mi = pyside_utils.find_child_by_pattern(graph_vars, "Variable 1")
+ result = result and (var_mi is not None)
+ Report.critical_result(Tests.variable_created, result)
+
+ # 6) Click on the variable
+ pyside_utils.item_view_index_mouse_click(graph_vars, var_mi)
+
+ # 7) Update name in Node Inspector and click on ENTER
+ helper.wait_for_condition(
+ lambda: node_inspector.findChild(QtWidgets.QWidget, "ContainerForRows") is not None, GENERAL_WAIT
+ )
+ row_container = node_inspector.findChild(QtWidgets.QWidget, "ContainerForRows")
+ name_frame = row_container.findChild(QtWidgets.QWidget, "Name")
+ name_line_edit = name_frame.findChild(QtWidgets.QLineEdit)
+ name_line_edit.setText(TEST_NAME)
+ QtTest.QTest.keyClick(name_line_edit, Qt.Key_Return, Qt.NoModifier)
+
+ # 8) Verify if the name is updated in Node inspector and Variable manager
+ helper.wait_for_condition(lambda: var_mi.data(Qt.DisplayRole) == TEST_NAME, GENERAL_WAIT)
+ Report.critical_result(Tests.node_inspector_rename, name_line_edit.text() == TEST_NAME)
+ Report.critical_result(Tests.variable_manager_rename, var_mi.data(Qt.DisplayRole) == TEST_NAME)
+
+ # 9) Close Script Canvas window
+ general.close_pane("Script Canvas")
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(NodeInspector_HappyPath_VariableRenames)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/NodeInspector_RenameVariable.py b/AutomatedTesting/Gem/PythonTests/scripting/NodeInspector_RenameVariable.py
deleted file mode 100644
index 33d3f4137a..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/NodeInspector_RenameVariable.py
+++ /dev/null
@@ -1,132 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: T92568982
-Test Case Title: Renaming variables in the Node Inspector
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92568982
-"""
-
-
-# fmt: off
-class Tests():
- variable_created = ("New variable created", "New variable is not created")
- node_inspector_rename = ("Variable is renamed in Node Inspector", "Variable is not renamed in Node Inspector")
- variable_manager_rename = ("Variable is renamed in Variable Manager", "Variable is not renamed in Variable Manager")
-# fmt: on
-
-
-GENERAL_WAIT = 0.5 # seconds
-
-
-def NodeInspector_RenameVariable():
- """
- Summary:
- Renaming variables in the Node Inspector, renames the actual variable.
-
- Expected Behavior:
- The Variable's name is changed in both Node Inspector and Variable Manager.
-
- Test Steps:
- 1) Open Script Canvas window (Tools > Script Canvas)
- 2) Get the SC window object
- 3) Open Variable Manager if not opened already
- 4) Open Node Inspector if not opened already
- 5) Create new graph and a new variable in Variable manager
- 6) Click on the variable
- 7) Update name in Node Inspector and click on ENTER
- 8) Verify if the name is updated in Node inspector and Variable manager
- 9) Close Script Canvas window
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- TEST_NAME = "test name"
-
- from PySide2 import QtWidgets, QtCore, QtTest
- from PySide2.QtCore import Qt
- import azlmbr.legacy.general as general
-
- import pyside_utils
- from utils import TestHelper as helper
-
- def open_tool(sc, dock_widget_name, pane_name):
- if sc.findChild(QtWidgets.QDockWidget, dock_widget_name) is None:
- action = pyside_utils.find_child_by_pattern(sc, {"text": pane_name, "type": QtWidgets.QAction})
- action.trigger()
- tool = sc.findChild(QtWidgets.QDockWidget, dock_widget_name)
- return tool
-
- # 1) Open Script Canvas window
- general.idle_enable(True)
- general.open_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
-
- # 2) Get the SC window object
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
-
- # 3) Open Variable Manager if not opened already
- variable_manager = open_tool(sc, "VariableManager", "Variable Manager")
-
- # 4) Open Node Inspector if not opened already
- node_inspector = open_tool(sc, "NodeInspector", "Node Inspector")
-
- # 5) Create new graph and a new variable in Variable manager
- action = pyside_utils.find_child_by_pattern(sc, {"objectName": "action_New_Script", "type": QtWidgets.QAction})
- action.trigger()
- graph_vars = variable_manager.findChild(QtWidgets.QTableView, "graphVariables")
- add_button = variable_manager.findChild(QtWidgets.QPushButton, "addButton")
- add_button.click()
- # Select variable type
- table_view = variable_manager.findChild(QtWidgets.QTableView, "variablePalette")
- model_index = pyside_utils.find_child_by_pattern(table_view, "Boolean")
- # Click on it to create variable
- pyside_utils.item_view_index_mouse_click(table_view, model_index)
- result = graph_vars.model().rowCount(QtCore.QModelIndex()) == 1
- var_mi = pyside_utils.find_child_by_pattern(graph_vars, "Variable 1")
- result = result and (var_mi is not None)
- Report.critical_result(Tests.variable_created, result)
-
- # 6) Click on the variable
- pyside_utils.item_view_index_mouse_click(graph_vars, var_mi)
-
- # 7) Update name in Node Inspector and click on ENTER
- helper.wait_for_condition(
- lambda: node_inspector.findChild(QtWidgets.QWidget, "ContainerForRows") is not None, GENERAL_WAIT
- )
- row_container = node_inspector.findChild(QtWidgets.QWidget, "ContainerForRows")
- name_frame = row_container.findChild(QtWidgets.QWidget, "Name")
- name_line_edit = name_frame.findChild(QtWidgets.QLineEdit)
- name_line_edit.setText(TEST_NAME)
- QtTest.QTest.keyClick(name_line_edit, Qt.Key_Return, Qt.NoModifier)
-
- # 8) Verify if the name is updated in Node inspector and Variable manager
- helper.wait_for_condition(lambda: var_mi.data(Qt.DisplayRole) == TEST_NAME, GENERAL_WAIT)
- Report.critical_result(Tests.node_inspector_rename, name_line_edit.text() == TEST_NAME)
- Report.critical_result(Tests.variable_manager_rename, var_mi.data(Qt.DisplayRole) == TEST_NAME)
-
- # 9) Close Script Canvas window
- general.close_pane("Script Canvas")
-
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
-
- from utils import Report
-
- Report.start_test(NodeInspector_RenameVariable)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/NodePalette_ClearSelection.py b/AutomatedTesting/Gem/PythonTests/scripting/NodePalette_ClearSelection.py
deleted file mode 100644
index de30e46767..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/NodePalette_ClearSelection.py
+++ /dev/null
@@ -1,94 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: T92562993
-Test Case Title: Clicking the X button on the Search Box clears the currently entered string
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92562993
-"""
-
-
-# fmt: off
-class Tests():
- set_search_string = ("Search string is set", "Search string is not set")
- search_string_cleared = ("Search string cleared as expected", "Search string not cleared")
-# fmt: on
-
-
-def NodePalette_ClearSelection():
- """
- Summary:
- We enter some string in the Node Palette Search box, and click on the X button to verify if the
- search string got cleared.
-
- Expected Behavior:
- Clicking the X button on the Search Box clears the currently entered string
-
- Test Steps:
- 1) Open Script Canvas window (Tools > Script Canvas)
- 2) Get the SC window object
- 3) Open Node Manager if not opened already
- 4) Set some string in the Search box
- 5) Verify if the test string is set
- 6) Clear search string and verify if it is cleared
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- from PySide2 import QtWidgets
-
- from utils import TestHelper as helper
-
- import azlmbr.legacy.general as general
-
- import pyside_utils
-
- TEST_STRING = "Test String"
-
- # 1) Open Script Canvas window (Tools > Script Canvas)
- general.idle_enable(True)
- general.open_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 3.0)
-
- # 2) Get the SC window object
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
-
- # 3) Open Node Manager if not opened already
- if sc.findChild(QtWidgets.QDockWidget, "NodePalette") is None:
- action = pyside_utils.find_child_by_pattern(sc, {"text": "Node Palette", "type": QtWidgets.QAction})
- action.trigger()
- node_palette = sc.findChild(QtWidgets.QDockWidget, "NodePalette")
- search_frame = node_palette.findChild(QtWidgets.QFrame, "searchFrame")
-
- # 4) Set some string in the Search box
- search_box = search_frame.findChild(QtWidgets.QLineEdit, "searchFilter")
- search_box.setText(TEST_STRING)
-
- # 5) Verify if the test string is set
- Report.result(Tests.set_search_string, search_box.text() == TEST_STRING)
-
- # 6) Clear search string and verify if it is cleared
- clear_text_button = search_frame.findChild(QtWidgets.QToolButton, "ClearToolButton")
- clear_text_button.click()
- Report.result(Tests.search_string_cleared, search_box.text() == "")
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
- from utils import Report
-
- Report.start_test(NodePalette_ClearSelection)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/NodePalette_HappyPath_CanSelectNode.py b/AutomatedTesting/Gem/PythonTests/scripting/NodePalette_HappyPath_CanSelectNode.py
new file mode 100644
index 0000000000..2fb1830b8f
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/NodePalette_HappyPath_CanSelectNode.py
@@ -0,0 +1,100 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ category_selected = ("Category can be selected", "Category cannot be selected")
+ node_selected = ("Node can be selected", "Node cannot be selected")
+# fmt: on
+
+
+GENERAL_WAIT = 0.5 # seconds
+
+
+def NodePalette_HappyPath_CanSelectNode():
+ """
+ Summary:
+ Categories and Nodes can be selected
+
+ Expected Behavior:
+ A category can be selected inside the Node Palette
+ A Node can be selected inside the Node Palette
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Get the SC window object
+ 3) Expand QTreeView
+ 4) Click on category and check if it is selected
+ 5) Click on node and check if it is selected
+ 6) Close Script Canvas window
+
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ CATEGORY = "AI"
+ NODE = "Find Path To Entity"
+
+ from PySide2 import QtWidgets
+
+ import pyside_utils
+ from utils import TestHelper as helper
+
+ import azlmbr.legacy.general as general
+
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.idle_enable(True)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+
+ # 2) Get the SC window object
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ if sc.findChild(QtWidgets.QDockWidget, "NodePalette") is None:
+ action = pyside_utils.find_child_by_pattern(sc, {"text": "Node Palette", "type": QtWidgets.QAction})
+ action.trigger()
+ node_palette = sc.findChild(QtWidgets.QDockWidget, "NodePalette")
+ tree = node_palette.findChild(QtWidgets.QTreeView, "treeView")
+
+ # 3) Expand QTreeView
+ tree.expandAll()
+
+ # 4) Click on category and check if it is selected
+ category_index = pyside_utils.find_child_by_hierarchy(tree, CATEGORY)
+ tree.scrollTo(category_index)
+ pyside_utils.item_view_index_mouse_click(tree, category_index)
+ pyside_utils.wait_for_condition(tree.selectedIndexes() and tree.selectedIndexes()[0] == category_index)
+ Report.result(Tests.category_selected, tree.selectedIndexes()[0] == category_index)
+
+ # 5) Click on node and check if it is selected
+ node_index = pyside_utils.find_child_by_pattern(tree, NODE)
+ helper.wait_for_condition(lambda: tree.isExpanded(node_index), GENERAL_WAIT)
+ pyside_utils.item_view_index_mouse_click(tree, node_index)
+ pyside_utils.wait_for_condition(tree.selectedIndexes()[0] == node_index)
+ Report.result(Tests.node_selected, tree.selectedIndexes()[0] == node_index)
+
+ # 6) Close Script Canvas window
+ general.close_pane("Script Canvas")
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(NodePalette_HappyPath_CanSelectNode)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/NodePalette_HappyPath_ClearSelection.py b/AutomatedTesting/Gem/PythonTests/scripting/NodePalette_HappyPath_ClearSelection.py
new file mode 100644
index 0000000000..93254dd377
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/NodePalette_HappyPath_ClearSelection.py
@@ -0,0 +1,88 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ set_search_string = ("Search string is set", "Search string is not set")
+ search_string_cleared = ("Search string cleared as expected", "Search string not cleared")
+# fmt: on
+
+
+def NodePalette_HappyPath_ClearSelection():
+ """
+ Summary:
+ Clicking the X button on the Search Box clears the currently entered string
+
+ Expected Behavior:
+ After entering a string value into the Node Palette's search box and click on
+ the X button, the search box should be cleared
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Get the SC window object
+ 3) Open Node Manager if not opened already
+ 4) Set some string in the Search box
+ 5) Verify if the test string is set
+ 6) Clear search string and verify if it is cleared
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ from PySide2 import QtWidgets
+
+ import pyside_utils
+ from utils import TestHelper as helper
+
+ import azlmbr.legacy.general as general
+
+ TEST_STRING = "Test String"
+
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.idle_enable(True)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 3.0)
+
+ # 2) Get the SC window object
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+
+ # 3) Open Node Manager if not opened already
+ if sc.findChild(QtWidgets.QDockWidget, "NodePalette") is None:
+ action = pyside_utils.find_child_by_pattern(sc, {"text": "Node Palette", "type": QtWidgets.QAction})
+ action.trigger()
+ node_palette = sc.findChild(QtWidgets.QDockWidget, "NodePalette")
+ search_frame = node_palette.findChild(QtWidgets.QFrame, "searchFrame")
+
+ # 4) Set some string in the Search box
+ search_box = search_frame.findChild(QtWidgets.QLineEdit, "searchFilter")
+ search_box.setText(TEST_STRING)
+
+ # 5) Verify if the test string is set
+ Report.result(Tests.set_search_string, search_box.text() == TEST_STRING)
+
+ # 6) Clear search string and verify if it is cleared
+ clear_text_button = search_frame.findChild(QtWidgets.QToolButton, "ClearToolButton")
+ clear_text_button.click()
+ Report.result(Tests.search_string_cleared, search_box.text() == "")
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(NodePalette_HappyPath_ClearSelection)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/NodePalette_SearchText_Deletion.py b/AutomatedTesting/Gem/PythonTests/scripting/NodePalette_SearchText_Deletion.py
new file mode 100644
index 0000000000..0739a8e637
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/NodePalette_SearchText_Deletion.py
@@ -0,0 +1,91 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ set_search_string = ("Search string is set", "Search string is not set")
+ search_string_deleted = ("Search string deleted as expected", "Search string not deleted")
+# fmt: on
+
+
+def NodePalette_SearchText_Deletion():
+ """
+ Summary:
+ We enter some string in the Node Palette Search box, select that text and delete it.
+
+ Expected Behavior:
+ After RightClick->Delete the text in the Searchbox should be deleted.
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Get the SC window object
+ 3) Open Node Manager if not opened already
+ 4) Set some string in the Search box
+ 5) Verify if the test string is set
+ 6) Delete search string using right click and verify if it is cleared
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ from PySide2 import QtWidgets, QtTest, QtCore
+
+ from utils import TestHelper as helper
+
+ import azlmbr.legacy.general as general
+
+ import pyside_utils
+
+ TEST_STRING = "TestString"
+
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.idle_enable(True)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 3.0)
+
+ # 2) Get the SC window object
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+
+ # 3) Open Node Manager if not opened already
+ if sc.findChild(QtWidgets.QDockWidget, "NodePalette") is None:
+ action = pyside_utils.find_child_by_pattern(sc, {"text": "Node Palette", "type": QtWidgets.QAction})
+ action.trigger()
+ node_palette = sc.findChild(QtWidgets.QDockWidget, "NodePalette")
+ search_frame = node_palette.findChild(QtWidgets.QFrame, "searchFrame")
+
+ # 4) Set some string in the Search box
+ search_box = search_frame.findChild(QtWidgets.QLineEdit, "searchFilter")
+ search_box.setText(TEST_STRING)
+
+ # 5) Verify if the test string is set
+ result = helper.wait_for_condition(lambda: search_box.text() == TEST_STRING, 1.0)
+ Report.result(Tests.set_search_string, result)
+
+ # 6) Delete search string using right click and verify if it is cleared
+ QtTest.QTest.keyClick(search_box, QtCore.Qt.Key_A, QtCore.Qt.ControlModifier)
+ pyside_utils.trigger_context_menu_entry(search_box, "Delete")
+ result = helper.wait_for_condition(lambda: search_box.text() == "", 2.0)
+ Report.result(Tests.search_string_deleted, result)
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(NodePalette_SearchText_Deletion)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/NodePalette_SelectNode.py b/AutomatedTesting/Gem/PythonTests/scripting/NodePalette_SelectNode.py
deleted file mode 100644
index 2ab76071a6..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/NodePalette_SelectNode.py
+++ /dev/null
@@ -1,104 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-
-Test case ID: T92568940
-Test Case Title: Categories and Nodes can be selected
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92568940
-"""
-
-
-# fmt: off
-class Tests():
- category_selected = ("Category can be selected", "Category cannot be selected")
- node_selected = ("Node can be selected", "Node cannot be selected")
-# fmt: on
-
-
-GENERAL_WAIT = 0.5 # seconds
-
-
-def NodePalette_SelectNode():
- """
- Summary:
- Categories and Nodes can be selected
-
- Expected Behavior:
- When clicked on Node Palette, nodes and categories can be selected.
-
- Test Steps:
- 1) Open Script Canvas window (Tools > Script Canvas)
- 2) Get the SC window object
- 3) Expand QTreeView
- 4) Click on category and check if it is selected
- 5) Click on node and check if it is selected
- 6) Close Script Canvas window
-
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- CATEGORY = "AI"
- NODE = "Find Path To Entity"
-
- from PySide2 import QtWidgets
- import azlmbr.legacy.general as general
-
- import pyside_utils
- from utils import TestHelper as helper
-
- # 1) Open Script Canvas window (Tools > Script Canvas)
- general.idle_enable(True)
- general.open_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
-
- # 2) Get the SC window object
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
- if sc.findChild(QtWidgets.QDockWidget, "NodePalette") is None:
- action = pyside_utils.find_child_by_pattern(sc, {"text": "Node Palette", "type": QtWidgets.QAction})
- action.trigger()
- node_palette = sc.findChild(QtWidgets.QDockWidget, "NodePalette")
- tree = node_palette.findChild(QtWidgets.QTreeView, "treeView")
-
- # 3) Expand QTreeView
- tree.expandAll()
-
- # 4) Click on category and check if it is selected
- category_index = pyside_utils.find_child_by_hierarchy(tree, CATEGORY)
- tree.scrollTo(category_index)
- pyside_utils.item_view_index_mouse_click(tree, category_index)
- pyside_utils.wait_for_condition(tree.selectedIndexes() and tree.selectedIndexes()[0] == category_index)
- Report.result(Tests.category_selected, tree.selectedIndexes()[0] == category_index)
-
- # 5) Click on node and check if it is selected
- node_index = pyside_utils.find_child_by_pattern(tree, NODE)
- helper.wait_for_condition(lambda: tree.isExpanded(node_index), GENERAL_WAIT)
- pyside_utils.item_view_index_mouse_click(tree, node_index)
- pyside_utils.wait_for_condition(tree.selectedIndexes()[0] == node_index)
- Report.result(Tests.node_selected, tree.selectedIndexes()[0] == node_index)
-
- # 6) Close Script Canvas window
- general.close_pane("Script Canvas")
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
-
- from utils import Report
-
- Report.start_test(NodePalette_SelectNode)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Node_HappyPath_DuplicateNode.py b/AutomatedTesting/Gem/PythonTests/scripting/Node_HappyPath_DuplicateNode.py
new file mode 100644
index 0000000000..77d3b2fcde
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/Node_HappyPath_DuplicateNode.py
@@ -0,0 +1,117 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ node_duplicated = ("Successfully duplicated node", "Failed to duplicate the node")
+# fmt: on
+
+
+def Node_HappyPath_DuplicateNode():
+ """
+ Summary:
+ Duplicating node in graph
+
+ Expected Behavior:
+ Upon selecting a node and pressing Ctrl+D, the node will be duplicated
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Open a new graph
+ 3) Add node to graph
+ 4) Duplicate node
+ 5) Verify the node was duplicated6) Verify the node was duplicated
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ from PySide2 import QtWidgets, QtTest
+ from PySide2.QtCore import Qt
+
+ 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
+
+ import azlmbr.legacy.general as general
+
+ WAIT_FRAMES = 200
+
+ NODE_NAME = "Print"
+ NODE_CATEGORY = "Debug"
+ EXPECTED_STRING = f"{NODE_NAME} - {NODE_CATEGORY} (2 Selected)"
+
+ def command_line_input(command_str):
+ cmd_action = pyside_utils.find_child_by_pattern(
+ sc_main, {"objectName": "action_ViewCommandLine", "type": QtWidgets.QAction}
+ )
+ cmd_action.trigger()
+ textbox = sc.findChild(QtWidgets.QLineEdit, "commandText")
+ QtTest.QTest.keyClicks(textbox, command_str)
+ QtTest.QTest.keyClick(textbox, Qt.Key_Enter, Qt.NoModifier)
+
+ def grab_title_text():
+ scroll_area = node_inspector.findChild(QtWidgets.QScrollArea, "")
+ QtTest.QTest.keyClick(graph, "a", Qt.ControlModifier, WAIT_FRAMES)
+ background = scroll_area.findChild(QtWidgets.QFrame, "Background")
+ title = background.findChild(QtWidgets.QLabel, "Title")
+ text = title.findChild(QtWidgets.QLabel, "Title")
+ return text.text()
+
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.idle_enable(True)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+
+ # 2) Open a new graph
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ sc_main = sc.findChild(QtWidgets.QMainWindow)
+ create_new_graph = pyside_utils.find_child_by_pattern(
+ sc_main, {"objectName": "action_New_Script", "type": QtWidgets.QAction}
+ )
+ if sc.findChild(QtWidgets.QDockWidget, "NodeInspector") is None:
+ action = pyside_utils.find_child_by_pattern(sc, {"text": "Node Inspector", "type": QtWidgets.QAction})
+ action.trigger()
+ node_inspector = sc.findChild(QtWidgets.QDockWidget, "NodeInspector")
+ create_new_graph.trigger()
+
+ # 3) Add node
+ command_line_input("add_node Print")
+
+ # 4) Duplicate node
+ graph_view = sc.findChild(QtWidgets.QFrame, "graphicsViewFrame")
+ graph = graph_view.findChild(QtWidgets.QWidget, "")
+ # There are currently no utilities available to directly duplicate the node,
+ # therefore the node is selected using CTRL+A on the graph to select
+ # it and then CTRL+D to duplicate
+ sc_main.activateWindow()
+ QtTest.QTest.keyClick(graph, "a", Qt.ControlModifier, WAIT_FRAMES)
+ QtTest.QTest.keyClick(graph, "d", Qt.ControlModifier, WAIT_FRAMES)
+
+ # 5) Verify the node was duplicated
+ # As direct interaction with node is not available the text on the label
+ # inside the Node Inspector is validated showing two nodes exist
+ after_dup = grab_title_text()
+ Report.result(Tests.node_duplicated, after_dup == EXPECTED_STRING)
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from editor_python_test_tools.utils import Report
+
+ Report.start_test(Node_HappyPath_DuplicateNode)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/OnEntityActivatedDeactivated_PrintMessage.py b/AutomatedTesting/Gem/PythonTests/scripting/OnEntityActivatedDeactivated_PrintMessage.py
deleted file mode 100644
index 51b63c4268..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/OnEntityActivatedDeactivated_PrintMessage.py
+++ /dev/null
@@ -1,184 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: T92569253 // T92569254
-Test Case Title: On Entity Activated // On Entity Deactivated
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92569253 // https://testrail.agscollab.com/index.php?/tests/view/92569254
-"""
-
-
-# fmt: off
-class Tests():
- level_created = ("Successfully created temp level", "Failed to create temp level")
- controller_exists = ("Successfully found controller entity", "Failed to find controller entity")
- activated_exists = ("Successfully found activated entity", "Failed to find activated entity")
- deactivated_exists = ("Successfully found deactivated entity","Failed to find deactivated entity")
- start_states_correct = ("Start states set up successfully", "Start states set up incorrectly")
- game_mode_entered = ("Successfully entered game mode" "Failed to enter game mode")
- lines_found = ("Successfully found expected prints", "Failed to find expected prints")
- game_mode_exited = ("Successfully exited game mode" "Failed to exit game mode")
-# fmt: on
-
-
-def OnEntityActivatedDeactivated_PrintMessage():
- """
- Summary:
- Verify that the On Entity Activation node is working as expected
-
- Expected Behavior:
- Upon entering game mode, the Controller entity will wait 1 second and then activate the ActivationTest
- entity. The script attached to ActivationTest will print out a message on activation. The Controller
- will also deactivate the DeactivationTest entity, which should print a message.
-
- Test Steps:
- 1) Create temp level
- 2) Setup the level
- 3) Validate the entities
- 4) Start the Tracer
- 5) Enter Game Mode
- 6) Validate Print message
- 7) Exit game mode
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
- import os
-
- from utils import TestHelper as helper
- from editor_entity_utils import EditorEntity as Entity
- from utils import Report
- from utils import Tracer
-
- import azlmbr.legacy.general as general
-
- EditorEntity = str
- LEVEL_NAME = "tmp_level"
- WAIT_TIME = 3.0 # SECONDS
- EXPECTED_LINES = ["Activator Script: Activated", "Deactivator Script: Deactivated"]
- controller_dict = {
- "name": "Controller",
- "status": "active",
- "path": os.path.join("ScriptCanvas", "OnEntityActivatedScripts", "controller.scriptcanvas")
- }
- activated_dict = {
- "name": "ActivationTest",
- "status": "inactive",
- "path": os.path.join("ScriptCanvas", "OnEntityActivatedScripts", "activator.scriptcanvas")
- }
- deactivated_dict = {
- "name": "DeactivationTest",
- "status": "active",
- "path": os.path.join("ScriptCanvas", "OnEntityActivatedScripts", "deactivator.scriptcanvas")
- }
-
- def get_asset(asset_path):
- return azlmbr.asset.AssetCatalogRequestBus(azlmbr.bus.Broadcast, "GetAssetIdByPath", asset_path, azlmbr.math.Uuid(), False)
-
- def setup_level():
- def create_editor_entity(entity_dict:dict, entity_to_activate:EditorEntity=None, entity_to_deactivate:EditorEntity=None) -> EditorEntity:
- entity = Entity.create_editor_entity(entity_dict["name"])
- entity.set_start_status(entity_dict["status"])
- sc_component = entity.add_component("Script Canvas")
- sc_component.set_component_property_value("Script Canvas Asset|Script Canvas Asset", get_asset(entity_dict["path"]))
-
- if entity_dict["name"] == "Controller":
- sc_component.get_property_tree()
- sc_component.set_component_property_value("Properties|Variable Fields|Variables|[0]|Name,Value|Datum|Datum|EntityToActivate", entity_to_activate.id)
- sc_component.set_component_property_value("Properties|Variable Fields|Variables|[1]|Name,Value|Datum|Datum|EntityToDeactivate", entity_to_deactivate.id)
- return entity
-
- activated = create_editor_entity(activated_dict)
- deactivated = create_editor_entity(deactivated_dict)
- create_editor_entity(controller_dict, activated, deactivated)
-
- def validate_entity_exist(entity_name: str, test_tuple: tuple):
- """
- Validate the entity with the given name exists in the level
- :return: entity: editor entity object
- """
- entity = Entity.find_editor_entity(entity_name)
- Report.critical_result(test_tuple, entity.id.IsValid())
- return entity
-
- def validate_start_state(entity:EditorEntity, expected_state:str):
- """
- Validate that the starting state of the entity is correct, if it isn't then attempt to rectify and recheck.
- :return: bool: Whether state is set as expected
- """
- state_options = {
- "active": azlmbr.globals.property.EditorEntityStartStatus_StartActive,
- "inactive": azlmbr.globals.property.EditorEntityStartStatus_StartInactive,
- "editor": azlmbr.globals.property.EditorEntityStartStatus_EditorOnly,
- }
- if expected_state.lower() not in state_options.keys():
- raise ValueError(f"{expected_state} is an invalid option; valid options: active, inactive, or editor.")
-
- state = entity.get_start_status()
- if state != state_options[expected_state]:
- # If state fails to set, set_start_status will assert
- entity.set_start_status(expected_state)
- return True
-
- def validate_entities_in_level():
- controller = validate_entity_exist(controller_dict["name"], Tests.controller_exists)
- state1_correct = validate_start_state(controller, controller_dict["status"])
-
- act_tester = validate_entity_exist(activated_dict["name"], Tests.activated_exists)
- state2_correct = validate_start_state(act_tester, activated_dict["status"])
-
- deac_tester = validate_entity_exist(deactivated_dict["name"], Tests.deactivated_exists)
- state3_correct = validate_start_state(deac_tester, deactivated_dict["status"])
-
- all_states_correct = state1_correct and state2_correct and state3_correct
- Report.critical_result(Tests.start_states_correct, all_states_correct)
-
- def locate_expected_lines(line_list: list):
- found_lines = [printInfo.message.strip() for printInfo in section_tracer.prints]
- return all(line in found_lines for line in line_list)
-
- # 1) Create temp level
- general.idle_enable(True)
- result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
- Report.critical_result(Tests.level_created, result == 0)
- helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
- general.close_pane("Error Report")
-
- # 2) Setup the level
- setup_level()
-
- # 3) Validate the entities
- validate_entities_in_level()
-
- # 4) Start the Tracer
- with Tracer() as section_tracer:
-
- # 5) Enter Game Mode
- helper.enter_game_mode(Tests.game_mode_entered)
-
- # 6) Validate Print message
- helper.wait_for_condition(lambda: locate_expected_lines(EXPECTED_LINES), WAIT_TIME)
-
- Report.result(Tests.lines_found, locate_expected_lines(EXPECTED_LINES))
-
- # 7) Exit game mode
- helper.exit_game_mode(Tests.game_mode_exited)
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
- imports.init()
-
- from utils import Report
-
- Report.start_test(OnEntityActivatedDeactivated_PrintMessage)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Opening_Closing_Pane.py b/AutomatedTesting/Gem/PythonTests/scripting/Opening_Closing_Pane.py
deleted file mode 100755
index 666f052240..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/Opening_Closing_Pane.py
+++ /dev/null
@@ -1,121 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: C1702834 // C1702823
-Test Case Title: Opening pane // Closing pane
-URLs of the test case: https://testrail.agscollab.com/index.php?/cases/view/1702834 and
- https://testrail.agscollab.com/index.php?/cases/view/1702823
-"""
-
-
-# fmt: off
-class Tests():
- default_visible = ("All the panes visible by default", "One or more panes do not visible by default")
- open_panes = ("All the Panes opened successfully", "Failed to open one or more panes")
- close_pane = ("All the Panes closed successfully", "Failed to close one or more panes")
-# fmt: on
-
-
-def Opening_Closing_Pane():
- """
- Summary:
- The Script Canvas window is opened to verify if Script canvas panes can be opened and closed.
-
- Expected Behavior:
- The pane opens and closes successfully.
-
- Test Steps:
- 1) Open Script Canvas window (Tools > Script Canvas)
- 2) Restore default layout
- 3) Verify if panes were opened by default
- 4) Close the opened panes
- 5) Open Script Canvas panes (Tools > )
- 6) Restore default layout
- 7) Close Script Canvas window
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- 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
-
- # Open 3D Engine Imports
- import azlmbr.legacy.general as general
-
- # Pyside imports
- from PySide2 import QtWidgets
-
- PANE_WIDGETS = ("NodePalette", "VariableManager")
-
- def click_menu_option(window, option_text):
- action = pyside_utils.find_child_by_pattern(window, {"text": option_text, "type": QtWidgets.QAction})
- action.trigger()
-
- def find_pane(window, pane_name):
- return window.findChild(QtWidgets.QDockWidget, pane_name)
-
- def is_pane_visible(window, pane_name):
- pane = find_pane(window, pane_name)
- return pane.isVisible()
-
- # Test starts here
- general.idle_enable(True)
-
- # 1) Open Script Canvas window (Tools > Script Canvas)
- general.open_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
-
- # 2) Restore default layout
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
- click_menu_option(sc, "Restore Default Layout")
-
- # 3) Verify if panes were opened by default
- PANES_VISIBLE = all(is_pane_visible(sc, pane) for pane in PANE_WIDGETS)
- Report.critical_result(Tests.default_visible, PANES_VISIBLE)
-
- # 4) Close the opened panes
- for item in PANE_WIDGETS:
- pane = sc.findChild(QtWidgets.QDockWidget, item)
- pane.close()
- if pane.isVisible():
- Report.info(f"Failed to close pane : {item}")
-
- PANES_VISIBLE = any(is_pane_visible(sc, pane) for pane in PANE_WIDGETS)
- Report.result(Tests.close_pane, not PANES_VISIBLE)
-
- # 5) Open Script Canvas panes (Tools > )
- click_menu_option(sc, "Node Palette")
- click_menu_option(sc, "Variable Manager")
- PANES_VISIBLE = helper.wait_for_condition(lambda: all(is_pane_visible(sc, pane) for pane in PANE_WIDGETS), 2.0)
- Report.result(Tests.open_panes, PANES_VISIBLE)
-
- # 6) Restore default layout
- # Needed this step to restore to default in case of test failure
- click_menu_option(sc, "Restore Default Layout")
-
- # 7) Close Script Canvas window
- sc.close()
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
-
- from editor_python_test_tools.utils import Report
-
- Report.start_test(Opening_Closing_Pane)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Pane_Default_RetainOnSCRestart.py b/AutomatedTesting/Gem/PythonTests/scripting/Pane_Default_RetainOnSCRestart.py
new file mode 100644
index 0000000000..626b1cf0bd
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/Pane_Default_RetainOnSCRestart.py
@@ -0,0 +1,157 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ relaunch_sc = ("Script Canvas window is relaunched", "Failed to relaunch Script Canvas window")
+ test_panes_visible = ("All the test panes are opened", "Failed to open one or more test panes")
+ close_pane_1 = ("Test pane 1 is closed", "Failed to close test pane 1")
+ visibility_retained = ("Test pane retained its visibility on SC restart", "Failed to retain visibility of test pane on SC restart")
+ resize_pane_3 = ("Test pane 3 resized successfully", "Failed to resize Test pane 3")
+ size_retained = ("Test pane retained its size on SC restart", "Failed to retain size of test pane on SC restart")
+ location_changed = ("Location of test pane 2 changed successfully", "Failed to change location of test pane 2")
+ location_retained = ("Test pane retained its location on SC restart", "Failed to retain location of test pane on SC restart")
+# fmt: on
+
+
+def Pane_Default_RetainOnSCRestart():
+ """
+ Summary:
+ The Script Canvas window is opened to verify if Script canvas panes can retain its visibility, size and location
+ upon ScriptCanvas restart.
+
+ Expected Behavior:
+ The ScriptCanvas pane retain it's visibility, size and location upon ScriptCanvas restart.
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Make sure test panes are open and visible
+ 3) Close test pane 1
+ 4) Change dock location of test pane 2
+ 5) Resize test pane 3
+ 6) Relaunch Script Canvas
+ 7) Verify if test pane 1 retain its visibility
+ 8) Verify if location of test pane 2 is retained
+ 9) Verify if size of test pane 3 is retained
+ 10) Restore default layout and close SC window
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ # Pyside imports
+ from PySide2 import QtCore, QtWidgets
+ from PySide2.QtCore import Qt
+
+ # Helper imports
+ from utils import Report
+ from utils import TestHelper as helper
+ import pyside_utils
+
+ # Open 3D Engine Imports
+ import azlmbr.legacy.general as general
+
+ TEST_PANE_1 = "NodePalette" # test visibility
+ TEST_PANE_2 = "VariableManager" # test location
+ TEST_PANE_3 = "NodeInspector" # test size
+ SCALE_INT = 10 # Random resize scale integer
+ DOCKAREA = Qt.TopDockWidgetArea # Preferred top area since no widget is docked on top
+
+ def click_menu_option(window, option_text):
+ action = pyside_utils.find_child_by_pattern(window, {"text": option_text, "type": QtWidgets.QAction})
+ action.trigger()
+
+ def find_pane(window, pane_name):
+ return window.findChild(QtWidgets.QDockWidget, pane_name)
+
+ # Test starts here
+ general.idle_enable(True)
+
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 3.0)
+
+ # 2) Make sure test panes are open and visible
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ click_menu_option(sc, "Restore Default Layout")
+ test_pane_1 = sc.findChild(QtWidgets.QDockWidget, TEST_PANE_1)
+ test_pane_2 = sc.findChild(QtWidgets.QDockWidget, TEST_PANE_2)
+ test_pane_3 = sc.findChild(QtWidgets.QDockWidget, TEST_PANE_3)
+
+ Report.result(
+ Tests.test_panes_visible, test_pane_1.isVisible() and test_pane_2.isVisible() and test_pane_3.isVisible()
+ )
+
+ # Initiate try block here to restore default in finally block
+ try:
+ # 3) Close test pane
+ test_pane_1.close()
+ Report.result(Tests.close_pane_1, not test_pane_1.isVisible())
+
+ # 4) Change dock location of test pane 2
+ sc_main = sc.findChild(QtWidgets.QMainWindow)
+ sc_main.addDockWidget(DOCKAREA, find_pane(sc_main, TEST_PANE_2), QtCore.Qt.Vertical)
+ Report.result(Tests.location_changed, sc_main.dockWidgetArea(find_pane(sc_main, TEST_PANE_2)) == DOCKAREA)
+
+ # 5) Resize test pane 3
+ initial_size = test_pane_3.frameSize()
+ test_pane_3.resize(initial_size.width() + SCALE_INT, initial_size.height() + SCALE_INT)
+ new_size = test_pane_3.frameSize()
+ resize_success = (
+ abs(initial_size.width() - new_size.width()) == abs(initial_size.height() - new_size.height()) == SCALE_INT
+ )
+ Report.result(Tests.resize_pane_3, resize_success)
+
+ # 6) Relaunch Script Canvas
+ general.close_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 2.0)
+
+ general.open_pane("Script Canvas")
+ sc_visible = helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+ Report.result(Tests.relaunch_sc, sc_visible)
+
+ # 7) Verify if test pane 1 retain its visibility
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ Report.result(Tests.visibility_retained, not find_pane(sc, TEST_PANE_1).isVisible())
+
+ # 8) Verify if location of test pane 2 is retained
+ sc_main = sc.findChild(QtWidgets.QMainWindow)
+ Report.result(Tests.location_retained, sc_main.dockWidgetArea(find_pane(sc_main, TEST_PANE_2)) == DOCKAREA)
+
+ # 9) Verify if size of test pane 3 is retained
+ test_pane_3 = sc.findChild(QtWidgets.QDockWidget, TEST_PANE_3)
+ retained_size = test_pane_3.frameSize()
+ retain_success = retained_size != initial_size
+ Report.result(Tests.size_retained, retain_success)
+
+ finally:
+ # 10) Restore default layout and close SC window
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ click_menu_option(sc, "Restore Default Layout")
+ sc.close()
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(Pane_Default_RetainOnSCRestart)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Pane_HappyPath_DocksProperly.py b/AutomatedTesting/Gem/PythonTests/scripting/Pane_HappyPath_DocksProperly.py
new file mode 100644
index 0000000000..2186a8a54a
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/Pane_HappyPath_DocksProperly.py
@@ -0,0 +1,106 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ pane_opened = ("Pane is opened successfully", "Failed to open pane")
+ dock_pane = ("Pane is docked successfully", "Failed to dock Pane into one or more allowed area")
+# fmt: on
+
+
+def Pane_HappyPath_DocksProperly():
+ """
+ Summary:
+ The Script Canvas window is opened to verify if Script canvas panes can be docked into every
+ possible area of Script Canvas main window. (top, bottom, right and left sides of the window)
+
+ Expected Behavior:
+ The pane docks successfully.
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Make sure Node Palette pane is opened
+ 3) Dock the Node Palette pane into every possible area of main window
+ 4) Restore default layout
+ 5) Close Script Canvas window
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ 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
+
+ # Open 3D Engine imports
+ import azlmbr.legacy.general as general
+
+ # Pyside imports
+ from PySide2 import QtCore, QtWidgets
+ from PySide2.QtCore import Qt
+
+ PANE_WIDGET = "NodePalette" # Chosen most commonly used pane
+ DOCKAREAS = [Qt.TopDockWidgetArea, Qt.BottomDockWidgetArea, Qt.RightDockWidgetArea, Qt.LeftDockWidgetArea]
+ DOCKED = True
+
+ def click_menu_option(window, option_text):
+ action = pyside_utils.find_child_by_pattern(window, {"text": option_text, "type": QtWidgets.QAction})
+ action.trigger()
+
+ def find_pane(window, pane_name):
+ return window.findChild(QtWidgets.QDockWidget, pane_name)
+
+ # Test starts here
+ general.idle_enable(True)
+
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+
+ # 2) Make sure Node Palette pane is opened
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ sc_main = sc.findChild(QtWidgets.QMainWindow)
+ pane = find_pane(sc_main, PANE_WIDGET)
+ if not pane.isVisible():
+ click_menu_option(sc, "Node Palette")
+ pane = find_pane(sc_main, PANE_WIDGET) # New reference
+
+ Report.result(Tests.pane_opened, pane.isVisible())
+
+ # 3) Dock the Node Palette pane into every possible area of main window
+ for area in DOCKAREAS:
+ sc_main.addDockWidget(area, find_pane(sc_main, PANE_WIDGET), QtCore.Qt.Vertical)
+ if not (sc_main.dockWidgetArea(find_pane(sc_main, PANE_WIDGET)) == area):
+ Report.info(f"Failed to dock into {str(area)}")
+ DOCKED = DOCKED and (sc_main.dockWidgetArea(find_pane(sc_main, PANE_WIDGET)) == area)
+
+ Report.result(Tests.dock_pane, DOCKED)
+
+ # 4) Restore default layout
+ # Need this step to restore to default in case of test failure
+ click_menu_option(sc, "Restore Default Layout")
+
+ # 5) Close Script Canvas window
+ sc.close()
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from editor_python_test_tools.utils import Report
+
+ Report.start_test(Pane_HappyPath_DocksProperly)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Pane_HappyPath_OpenCloseSuccessfully.py b/AutomatedTesting/Gem/PythonTests/scripting/Pane_HappyPath_OpenCloseSuccessfully.py
new file mode 100644
index 0000000000..cedd68cd87
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/Pane_HappyPath_OpenCloseSuccessfully.py
@@ -0,0 +1,115 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ default_visible = ("All the panes visible by default", "One or more panes do not visible by default")
+ open_panes = ("All the Panes opened successfully", "Failed to open one or more panes")
+ close_pane = ("All the Panes closed successfully", "Failed to close one or more panes")
+# fmt: on
+
+
+def Pane_HappyPath_OpenCloseSuccessfully():
+ """
+ Summary:
+ The Script Canvas window is opened to verify if Script Canvas panes can be opened and closed.
+
+ Expected Behavior:
+ The panes open and close successfully.
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Restore default layout
+ 3) Verify if panes were opened by default
+ 4) Close the opened panes
+ 5) Open Script Canvas panes (Tools > )
+ 6) Restore default layout
+ 7) Close Script Canvas window
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ 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
+
+ # Open 3D Engine Imports
+ import azlmbr.legacy.general as general
+
+ # Pyside imports
+ from PySide2 import QtWidgets
+
+ PANE_WIDGETS = ("NodePalette", "VariableManager")
+
+ def click_menu_option(window, option_text):
+ action = pyside_utils.find_child_by_pattern(window, {"text": option_text, "type": QtWidgets.QAction})
+ action.trigger()
+
+ def find_pane(window, pane_name):
+ return window.findChild(QtWidgets.QDockWidget, pane_name)
+
+ def is_pane_visible(window, pane_name):
+ pane = find_pane(window, pane_name)
+ return pane.isVisible()
+
+ # Test starts here
+ general.idle_enable(True)
+
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+
+ # 2) Restore default layout
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ click_menu_option(sc, "Restore Default Layout")
+
+ # 3) Verify if panes were opened by default
+ PANES_VISIBLE = all(is_pane_visible(sc, pane) for pane in PANE_WIDGETS)
+ Report.critical_result(Tests.default_visible, PANES_VISIBLE)
+
+ # 4) Close the opened panes
+ for item in PANE_WIDGETS:
+ pane = sc.findChild(QtWidgets.QDockWidget, item)
+ pane.close()
+ if pane.isVisible():
+ Report.info(f"Failed to close pane : {item}")
+
+ PANES_VISIBLE = any(is_pane_visible(sc, pane) for pane in PANE_WIDGETS)
+ Report.result(Tests.close_pane, not PANES_VISIBLE)
+
+ # 5) Open Script Canvas panes (Tools > )
+ click_menu_option(sc, "Node Palette")
+ click_menu_option(sc, "Variable Manager")
+ PANES_VISIBLE = helper.wait_for_condition(lambda: all(is_pane_visible(sc, pane) for pane in PANE_WIDGETS), 2.0)
+ Report.result(Tests.open_panes, PANES_VISIBLE)
+
+ # 6) Restore default layout
+ # Needed this step to restore to default in case of test failure
+ click_menu_option(sc, "Restore Default Layout")
+
+ # 7) Close Script Canvas window
+ sc.close()
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from editor_python_test_tools.utils import Report
+
+ Report.start_test(Pane_HappyPath_OpenCloseSuccessfully)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Pane_HappyPath_ResizesProperly.py b/AutomatedTesting/Gem/PythonTests/scripting/Pane_HappyPath_ResizesProperly.py
new file mode 100644
index 0000000000..36d734049d
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/Pane_HappyPath_ResizesProperly.py
@@ -0,0 +1,108 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ open_pane = ("Pane opened successfully", "Failed to open pane")
+ resize_pane = ("Pane window resized successfully", "Failed to resize pane window")
+# fmt: on
+
+
+def Pane_HappyPath_ResizesProperly():
+ """
+ Summary:
+ The Script Canvas window is opened to verify if Script Canvas panes can be resized and scaled
+
+ Expected Behavior:
+ The pane is resized and scaled appropriately.
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Restore default layout
+ 3) Make sure pane is opened
+ 4) Resize pane and verify change
+ 5) Restore default layout
+ 6) Close Script Canvas window
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ from PySide2 import QtWidgets
+
+ 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
+
+ # Open 3D Engine imports
+ import azlmbr.legacy.general as general
+
+ PANE_WIDGET = "NodePalette"
+ SCALE_INT = 10
+
+ def click_menu_option(window, option_text):
+ action = pyside_utils.find_child_by_pattern(window, {"text": option_text, "type": QtWidgets.QAction})
+ action.trigger()
+
+ def find_pane(window, pane_name):
+ return window.findChild(QtWidgets.QDockWidget, pane_name)
+
+ # Test starts here
+ general.idle_enable(True)
+
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+
+ # 2) Restore default layout
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ click_menu_option(sc, "Restore Default Layout")
+
+ # 3) Make sure pane is opened
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ pane = find_pane(sc, PANE_WIDGET)
+ if not pane.isVisible():
+ click_menu_option(sc, "Node Palette")
+ pane = find_pane(sc, PANE_WIDGET) # New reference
+
+ Report.result(Tests.open_pane, pane.isVisible())
+
+ # 4) Resize pane and verify change
+ initial_size = pane.frameSize()
+ pane.resize(initial_size.width() + SCALE_INT, initial_size.height() + SCALE_INT)
+ new_size = pane.frameSize()
+ test_success = (
+ abs(initial_size.width() - new_size.width()) == abs(initial_size.height() - new_size.height()) == SCALE_INT
+ )
+ Report.result(Tests.resize_pane, test_success)
+
+ # 5) Restore default layout
+ # Needed this step to restore to default in case of test failure
+ click_menu_option(sc, "Restore Default Layout")
+
+ # 6) Close Script Canvas window
+ sc.close()
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from editor_python_test_tools.utils import Report
+
+ Report.start_test(Pane_HappyPath_ResizesProperly)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Pane_PropertiesChanged_RetainsOnRestart.py b/AutomatedTesting/Gem/PythonTests/scripting/Pane_PropertiesChanged_RetainsOnRestart.py
new file mode 100644
index 0000000000..3750fd290b
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/Pane_PropertiesChanged_RetainsOnRestart.py
@@ -0,0 +1,161 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+class Tests:
+ test_panes_visible = "All the test panes are opened"
+ close_pane_1 = "Test pane 1 is closed"
+ resize_pane_3 = "Test pane 3 resized successfully"
+ location_changed = "Location of test pane 2 changed successfully"
+ visiblity_retained = "Test pane retained its visiblity on Editor restart"
+ location_retained = "Test pane retained its location on Editor restart"
+ size_retained = "Test pane retained its size on Editor restart"
+
+
+def Pane_PropertiesChanged_RetainsOnRestart():
+ """
+ Summary:
+ The Script Canvas window is opened to verify if Script canvas panes can retain its visibility, size and location
+ upon Editor restart.
+
+ Expected Behavior:
+ The ScriptCanvas pane retain it's visiblity, size and location upon Editor restart.
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Make sure test panes are open and visible
+ 3) Close test pane 1
+ 4) Change dock location of test pane 2
+ 5) Resize test pane 3
+ 6) Restart Editor
+ 7) Verify if test pane 1 retain its visiblity
+ 8) Verify if location of test pane 2 is retained
+ 9) Verify if size of test pane 3 is retained
+ 10) Restore default layout and close SC window
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ import sys
+
+ # Helper imports
+ from utils import Report
+ from utils import TestHelper as helper
+ import pyside_utils
+
+ # Lumberyard Imports
+ import azlmbr.legacy.general as general
+
+ # Pyside imports
+ from PySide2 import QtCore, QtWidgets
+ from PySide2.QtCore import Qt
+
+ # Constants
+ TEST_CONDITION = sys.argv[1]
+ TEST_PANE_1 = "NodePalette" # pane used to test visibility
+ TEST_PANE_2 = "VariableManager" # pane used to test location
+ TEST_PANE_3 = "NodeInspector" # pane used to test size
+ SCALE_INT = 10 # Random resize scale integer
+ DOCKAREA = Qt.TopDockWidgetArea # Preferred top area since no widget is docked on top
+
+ def click_menu_option(window, option_text):
+ action = pyside_utils.find_child_by_pattern(window, {"text": option_text, "type": QtWidgets.QAction})
+ action.trigger()
+
+ def find_pane(window, pane_name):
+ return window.findChild(QtWidgets.QDockWidget, pane_name)
+
+ # Test starts here
+ general.idle_enable(True)
+
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+
+ if TEST_CONDITION == "before_restart":
+ # 2) Make sure test panes are open and visible
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ click_menu_option(sc, "Restore Default Layout")
+ test_pane_1 = sc.findChild(QtWidgets.QDockWidget, TEST_PANE_1)
+ test_pane_2 = sc.findChild(QtWidgets.QDockWidget, TEST_PANE_2)
+ test_pane_3 = sc.findChild(QtWidgets.QDockWidget, TEST_PANE_3)
+
+ result = test_pane_1.isVisible() and test_pane_2.isVisible() and test_pane_3.isVisible()
+ Report.info(f"{Tests.test_panes_visible}: {result}")
+
+ # 3) Close test pane
+ test_pane_1.close()
+ Report.info(f"{Tests.close_pane_1}: {not test_pane_1.isVisible()}")
+
+ # 4) Change dock location of test pane 2
+ sc_main = sc.findChild(QtWidgets.QMainWindow)
+ sc_main.addDockWidget(DOCKAREA, find_pane(sc_main, TEST_PANE_2), QtCore.Qt.Vertical)
+ Report.info(f"{Tests.location_changed}: {sc_main.dockWidgetArea(find_pane(sc_main, TEST_PANE_2)) == DOCKAREA}")
+
+ # 5) Resize test pane 3
+ initial_size = test_pane_3.frameSize()
+ test_pane_3.resize(initial_size.width() + SCALE_INT, initial_size.height() + SCALE_INT)
+ new_size = test_pane_3.frameSize()
+ resize_success = (
+ abs(initial_size.width() - new_size.width()) == abs(initial_size.height() - new_size.height()) == SCALE_INT
+ )
+ Report.info(f"{Tests.resize_pane_3}: {resize_success}")
+
+ if TEST_CONDITION == "after_restart":
+ try:
+ # 6) Restart Editor
+ # Restart is not possible through script and hence it is done by running the same file as 2 tests with a
+ # condition as before_test and after_test
+
+ # 7) Verify if test pane 1 retain its visiblity
+ # This pane closed before restart and expected that pane should not be visible.
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ Report.info(f"{Tests.visiblity_retained}: {not find_pane(sc, TEST_PANE_1).isVisible()}")
+
+ # 8) Verify if location of test pane 2 is retained
+ # This pane was set at DOCKAREA lcoation before restart
+ sc_main = sc.findChild(QtWidgets.QMainWindow)
+ Report.info(
+ f"{Tests.location_retained}: {sc_main.dockWidgetArea(find_pane(sc_main, TEST_PANE_2)) == DOCKAREA}"
+ )
+
+ # 9) Verify if size of test pane 3 is retained
+ # Verifying if size retained by checking current size not matching with default size
+ test_pane_3 = find_pane(sc, TEST_PANE_3)
+ retained_size = test_pane_3.frameSize()
+ click_menu_option(sc, "Restore Default Layout")
+ actual_size = test_pane_3.frameSize()
+ Report.info(f"{Tests.size_retained}: {retained_size != actual_size}")
+
+ finally:
+ # 10) Restore default layout and close SC window
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ click_menu_option(sc, "Restore Default Layout")
+ sc.close()
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+
+ from utils import Report
+
+ Report.start_test(Pane_PropertiesChanged_RetainsOnRestart)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Pane_RetainOnSCRestart.py b/AutomatedTesting/Gem/PythonTests/scripting/Pane_RetainOnSCRestart.py
deleted file mode 100644
index fa5e9e6068..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/Pane_RetainOnSCRestart.py
+++ /dev/null
@@ -1,164 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: C1702821 // C1702832
-Test Case Title: Retain visibility, size and location upon Script Canvas restart
-URLs of the test case: https://testrail.agscollab.com/index.php?/cases/view/1702821 and
- https://testrail.agscollab.com/index.php?/cases/view/1702832
-"""
-
-
-# fmt: off
-class Tests():
- relaunch_sc = ("Script Canvas window is relaunched", "Failed to relaunch Script Canvas window")
- test_panes_visible = ("All the test panes are opened", "Failed to open one or more test panes")
- close_pane_1 = ("Test pane 1 is closed", "Failed to close test pane 1")
- visiblity_retained = ("Test pane retained its visiblity on SC restart", "Failed to retain visiblity of test pane on SC restart")
- resize_pane_3 = ("Test pane 3 resized successfully", "Failed to resize Test pane 3")
- size_retained = ("Test pane retained its size on SC restart", "Failed to retain size of test pane on SC restart")
- location_changed = ("Location of test pane 2 changed successfully", "Failed to change locatio of test pane 2")
- location_retained = ("Test pane retained its location on SC restart", "Failed to retain location of test pane on SC restart")
-# fmt: on
-
-
-def Pane_RetainOnSCRestart():
- """
- Summary:
- The Script Canvas window is opened to verify if Script canvas panes can retain its visibility, size and location
- upon ScriptCanvas restart.
-
- Expected Behavior:
- The ScriptCanvas pane retain it's visiblity, size and location upon ScriptCanvas restart.
-
- Test Steps:
- 1) Open Script Canvas window (Tools > Script Canvas)
- 2) Make sure test panes are open and visible
- 3) Close test pane 1
- 4) Change dock location of test pane 2
- 5) Resize test pane 3
- 6) Relaunch Script Canvas
- 7) Verify if test pane 1 retain its visiblity
- 8) Verify if location of test pane 2 is retained
- 9) Verify if size of test pane 3 is retained
- 10) Restore default layout and close SC window
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- # Helper imports
- from utils import Report
- from utils import TestHelper as helper
- import pyside_utils
-
- # Open 3D Engine Imports
- import azlmbr.legacy.general as general
-
- # Pyside imports
- from PySide2 import QtCore, QtWidgets
- from PySide2.QtCore import Qt
-
- # Constants
- TEST_PANE_1 = "NodePalette" # test visibility
- TEST_PANE_2 = "VariableManager" # test location
- TEST_PANE_3 = "NodeInspector" # test size
- SCALE_INT = 10 # Random resize scale integer
- DOCKAREA = Qt.TopDockWidgetArea # Preferred top area since no widget is docked on top
-
- def click_menu_option(window, option_text):
- action = pyside_utils.find_child_by_pattern(window, {"text": option_text, "type": QtWidgets.QAction})
- action.trigger()
-
- def find_pane(window, pane_name):
- return window.findChild(QtWidgets.QDockWidget, pane_name)
-
- # Test starts here
- general.idle_enable(True)
-
- # 1) Open Script Canvas window (Tools > Script Canvas)
- general.open_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 3.0)
-
- # 2) Make sure test panes are open and visible
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
- click_menu_option(sc, "Restore Default Layout")
- test_pane_1 = sc.findChild(QtWidgets.QDockWidget, TEST_PANE_1)
- test_pane_2 = sc.findChild(QtWidgets.QDockWidget, TEST_PANE_2)
- test_pane_3 = sc.findChild(QtWidgets.QDockWidget, TEST_PANE_3)
-
- Report.result(
- Tests.test_panes_visible, test_pane_1.isVisible() and test_pane_2.isVisible() and test_pane_3.isVisible()
- )
-
- # Initiate try block here to restore default in finally block
- try:
- # 3) Close test pane
- test_pane_1.close()
- Report.result(Tests.close_pane_1, not test_pane_1.isVisible())
-
- # 4) Change dock location of test pane 2
- sc_main = sc.findChild(QtWidgets.QMainWindow)
- sc_main.addDockWidget(DOCKAREA, find_pane(sc_main, TEST_PANE_2), QtCore.Qt.Vertical)
- Report.result(Tests.location_changed, sc_main.dockWidgetArea(find_pane(sc_main, TEST_PANE_2)) == DOCKAREA)
-
- # 5) Resize test pane 3
- initial_size = test_pane_3.frameSize()
- test_pane_3.resize(initial_size.width() + SCALE_INT, initial_size.height() + SCALE_INT)
- new_size = test_pane_3.frameSize()
- resize_success = (
- abs(initial_size.width() - new_size.width()) == abs(initial_size.height() - new_size.height()) == SCALE_INT
- )
- Report.result(Tests.resize_pane_3, resize_success)
-
- # 6) Relaunch Script Canvas
- general.close_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 2.0)
-
- general.open_pane("Script Canvas")
- sc_visible = helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
- Report.result(Tests.relaunch_sc, sc_visible)
-
- # 7) Verify if test pane 1 retain its visiblity
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
- Report.result(Tests.visiblity_retained, not find_pane(sc, TEST_PANE_1).isVisible())
-
- # 8) Verify if location of test pane 2 is retained
- sc_main = sc.findChild(QtWidgets.QMainWindow)
- Report.result(Tests.location_retained, sc_main.dockWidgetArea(find_pane(sc_main, TEST_PANE_2)) == DOCKAREA)
-
- # 9) Verify if size of test pane 3 is retained
- test_pane_3 = sc.findChild(QtWidgets.QDockWidget, TEST_PANE_3)
- retained_size = test_pane_3.frameSize()
- retain_success = retained_size != initial_size
- Report.result(Tests.size_retained, retain_success)
-
- finally:
- # 10) Restore default layout and close SC window
- general.open_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
- click_menu_option(sc, "Restore Default Layout")
- sc.close()
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
-
- from utils import Report
-
- Report.start_test(Pane_RetainOnSCRestart)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Pane_Undocked_ClosesSuccessfully.py b/AutomatedTesting/Gem/PythonTests/scripting/Pane_Undocked_ClosesSuccessfully.py
new file mode 100644
index 0000000000..0ddbe7e34f
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/Pane_Undocked_ClosesSuccessfully.py
@@ -0,0 +1,121 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ undock_pane = ("Pane is undocked successfully", "Failed to undock pane")
+ close_sc_window = ("Script Canvas window is closed", "Failed to close Script Canvas window")
+ pane_closed = ("Pane is closed successfully", "Failed to close the pane")
+# fmt: on
+
+
+def Pane_Undocked_ClosesSuccessfully():
+ """
+ Summary:
+ The Script Canvas window is opened with one of the pane undocked.
+ Verify if undocked pane closes upon closing Script canvas window.
+
+ Expected Behavior:
+ The undocked pane closes when Script Canvas window closed.
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Undock Node Palette pane
+ 3) Connect to Pane visibility signal emitter to verify pane closed
+ 4) Close Script Canvas window
+ 5) Restore default layout
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ from PySide2 import QtWidgets
+
+ # Helper imports
+ from utils import Report
+ from utils import TestHelper as helper
+ import pyside_utils
+
+ # Open 3D Engine imports
+ import azlmbr.legacy.general as general
+
+ TEST_PANE = "NodePalette" # Chosen most commonly used pane
+
+ def click_menu_option(window, option_text):
+ action = pyside_utils.find_child_by_pattern(window, {"text": option_text, "type": QtWidgets.QAction})
+ action.trigger()
+
+ def find_pane(window, pane_name):
+ return window.findChild(QtWidgets.QDockWidget, pane_name)
+
+ def on_top_level_changed():
+ # This function has test condition always True since it gets emitted only when condition satisfied
+ Report.result(Tests.undock_pane, True)
+
+ def on_pane_closed():
+ # This function has test condition always True since it gets emitted only when condition satisfied
+ Report.result(Tests.pane_closed, True)
+
+ # Test starts here
+ general.idle_enable(True)
+
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+
+ # 2) Undock Node Palette pane
+ # Make sure Node Palette pane is opened
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ pane = find_pane(sc, TEST_PANE)
+ if not pane.isVisible():
+ click_menu_option(sc, "Node Palette")
+ pane = find_pane(sc, TEST_PANE) # New reference
+
+ # We drag/drop pane over the graph since it doesn't allow docking, so this will undock it
+ try:
+ graph = find_pane(sc, "GraphCanvasEditorCentralWidget")
+ try:
+ pane.topLevelChanged.connect(on_top_level_changed)
+ pyside_utils.drag_and_drop(pane, graph)
+ finally:
+ pane.topLevelChanged.disconnect(on_top_level_changed)
+
+ # 3) Connect to Pane visibility signal emitter to verify pane closed
+ # No need to disconnect this since pane widget gets deleted when SC window closed
+ pane.visibilityChanged.connect(on_pane_closed)
+
+ # 4) Close Script Canvas window
+ sc.close()
+ is_sc_visible = helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 2.0)
+ Report.result(Tests.close_sc_window, not is_sc_visible)
+
+ finally:
+ # 5) Restore default layout
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ click_menu_option(sc, "Restore Default Layout")
+ sc.close()
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(Pane_Undocked_ClosesSuccessfully)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Resizing_Pane.py b/AutomatedTesting/Gem/PythonTests/scripting/Resizing_Pane.py
deleted file mode 100755
index 180f577953..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/Resizing_Pane.py
+++ /dev/null
@@ -1,113 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: C1702829
-Test Case Title: Resizing pane
-URLs of the test case: https://testrail.agscollab.com/index.php?/cases/view/1702829
-"""
-
-
-# fmt: off
-class Tests():
- open_pane = ("Pane opened successfully", "Failed to open pane")
- resize_pane = ("Pane window resized successfully", "Failed to resize pane window")
-# fmt: on
-
-
-def Resizing_Pane():
- """
- Summary:
- The Script Canvas window is opened to verify if Script canvas panes can be resized and scaled
-
- Expected Behavior:
- The pane is resized and scaled appropriately.
-
- Test Steps:
- 1) Open Script Canvas window (Tools > Script Canvas)
- 2) Restore default layout
- 3) Make sure pane is opened
- 4) Resize pane
- 5) Restore default layout
- 6) Close Script Canvas window
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- 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
-
- # Open 3D Engine imports
- import azlmbr.legacy.general as general
-
- # Pyside imports
- from PySide2 import QtWidgets
-
- PANE_WIDGET = "NodePalette"
- SCALE_INT = 10
-
- def click_menu_option(window, option_text):
- action = pyside_utils.find_child_by_pattern(window, {"text": option_text, "type": QtWidgets.QAction})
- action.trigger()
-
- def find_pane(window, pane_name):
- return window.findChild(QtWidgets.QDockWidget, pane_name)
-
- # Test starts here
- general.idle_enable(True)
-
- # 1) Open Script Canvas window (Tools > Script Canvas)
- general.open_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
-
- # 2) Restore default layout
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
- click_menu_option(sc, "Restore Default Layout")
-
- # 3) Make sure pane is opened
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
- pane = find_pane(sc, PANE_WIDGET)
- if not pane.isVisible():
- click_menu_option(sc, "Node Palette")
- pane = find_pane(sc, PANE_WIDGET) # New reference
-
- Report.result(Tests.open_pane, pane.isVisible())
-
- # 4) Resize pane
- initial_size = pane.frameSize()
- pane.resize(initial_size.width() + SCALE_INT, initial_size.height() + SCALE_INT)
- new_size = pane.frameSize()
- test_success = (
- abs(initial_size.width() - new_size.width()) == abs(initial_size.height() - new_size.height()) == SCALE_INT
- )
- Report.result(Tests.resize_pane, test_success)
-
- # 5) Restore default layout
- # Needed this step to restore to default in case of test failure
- click_menu_option(sc, "Restore Default Layout")
-
- # 6) Close Script Canvas window
- sc.close()
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
- from editor_python_test_tools.utils import Report
-
- Report.start_test(Resizing_Pane)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvasComponent_OnEntityActivatedDeactivated_PrintMessage.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvasComponent_OnEntityActivatedDeactivated_PrintMessage.py
new file mode 100644
index 0000000000..14e0c849e3
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvasComponent_OnEntityActivatedDeactivated_PrintMessage.py
@@ -0,0 +1,192 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ level_created = ("Successfully created temp level", "Failed to create temp level")
+ controller_exists = ("Successfully found controller entity", "Failed to find controller entity")
+ activated_exists = ("Successfully found activated entity", "Failed to find activated entity")
+ deactivated_exists = ("Successfully found deactivated entity", "Failed to find deactivated entity")
+ start_states_correct = ("Start states set up successfully", "Start states set up incorrectly")
+ game_mode_entered = ("Successfully entered game mode" "Failed to enter game mode")
+ lines_found = ("Successfully found expected prints", "Failed to find expected prints")
+ game_mode_exited = ("Successfully exited game mode" "Failed to exit game mode")
+# fmt: on
+
+
+def ScriptCanvasComponent_OnEntityActivatedDeactivated_PrintMessage():
+ """
+ Summary:
+ Verify that the On Entity Activated/On Entity Deactivated nodes are working as expected
+
+ Expected Behavior:
+ Upon entering game mode, the Controller entity will wait 1 second and then activate the ActivationTest
+ entity. The script attached to ActivationTest will print out a message on activation. The Controller
+ will also deactivate the DeactivationTest entity, which should print a message.
+
+ Test Steps:
+ 1) Create temp level
+ 2) Setup the level
+ 3) Validate the entities
+ 4) Start the Tracer
+ 5) Enter Game Mode
+ 6) Validate Print message
+ 7) Exit game mode
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ import os
+
+ from editor_entity_utils import EditorEntity as Entity
+ from utils import Report
+ from utils import TestHelper as helper
+ from utils import Tracer
+
+ import azlmbr.legacy.general as general
+
+ EditorEntity = str
+ LEVEL_NAME = "tmp_level"
+ WAIT_TIME = 3.0 # SECONDS
+ EXPECTED_LINES = ["Activator Script: Activated", "Deactivator Script: Deactivated"]
+ controller_dict = {
+ "name": "Controller",
+ "status": "active",
+ "path": os.path.join("ScriptCanvas", "OnEntityActivatedScripts", "controller.scriptcanvas"),
+ }
+ activated_dict = {
+ "name": "ActivationTest",
+ "status": "inactive",
+ "path": os.path.join("ScriptCanvas", "OnEntityActivatedScripts", "activator.scriptcanvas"),
+ }
+ deactivated_dict = {
+ "name": "DeactivationTest",
+ "status": "active",
+ "path": os.path.join("ScriptCanvas", "OnEntityActivatedScripts", "deactivator.scriptcanvas"),
+ }
+
+ def get_asset(asset_path):
+ return azlmbr.asset.AssetCatalogRequestBus(
+ azlmbr.bus.Broadcast, "GetAssetIdByPath", asset_path, azlmbr.math.Uuid(), False
+ )
+
+ def setup_level():
+ def create_editor_entity(
+ entity_dict: dict, entity_to_activate: EditorEntity = None, entity_to_deactivate: EditorEntity = None
+ ) -> EditorEntity:
+ entity = Entity.create_editor_entity(entity_dict["name"])
+ entity.set_start_status(entity_dict["status"])
+ sc_component = entity.add_component("Script Canvas")
+ sc_component.set_component_property_value(
+ "Script Canvas Asset|Script Canvas Asset", get_asset(entity_dict["path"])
+ )
+
+ if entity_dict["name"] == "Controller":
+ sc_component.get_property_tree()
+ sc_component.set_component_property_value(
+ "Properties|Variable Fields|Variables|[0]|Name,Value|Datum|Datum|EntityToActivate",
+ entity_to_activate.id,
+ )
+ sc_component.set_component_property_value(
+ "Properties|Variable Fields|Variables|[1]|Name,Value|Datum|Datum|EntityToDeactivate",
+ entity_to_deactivate.id,
+ )
+ return entity
+
+ activated = create_editor_entity(activated_dict)
+ deactivated = create_editor_entity(deactivated_dict)
+ create_editor_entity(controller_dict, activated, deactivated)
+
+ def validate_entity_exist(entity_name: str, test_tuple: tuple):
+ """
+ Validate the entity with the given name exists in the level
+ :return: entity: editor entity object
+ """
+ entity = Entity.find_editor_entity(entity_name)
+ Report.critical_result(test_tuple, entity.id.IsValid())
+ return entity
+
+ def validate_start_state(entity: EditorEntity, expected_state: str):
+ """
+ Validate that the starting state of the entity is correct, if it isn't then attempt to rectify and recheck.
+ :return: bool: Whether state is set as expected
+ """
+ state_options = {
+ "active": azlmbr.globals.property.EditorEntityStartStatus_StartActive,
+ "inactive": azlmbr.globals.property.EditorEntityStartStatus_StartInactive,
+ "editor": azlmbr.globals.property.EditorEntityStartStatus_EditorOnly,
+ }
+ if expected_state.lower() not in state_options.keys():
+ raise ValueError(f"{expected_state} is an invalid option; valid options: active, inactive, or editor.")
+
+ state = entity.get_start_status()
+ if state != state_options[expected_state]:
+ # If state fails to set, set_start_status will assert
+ entity.set_start_status(expected_state)
+ return True
+
+ def validate_entities_in_level():
+ controller = validate_entity_exist(controller_dict["name"], Tests.controller_exists)
+ state1_correct = validate_start_state(controller, controller_dict["status"])
+
+ act_tester = validate_entity_exist(activated_dict["name"], Tests.activated_exists)
+ state2_correct = validate_start_state(act_tester, activated_dict["status"])
+
+ deac_tester = validate_entity_exist(deactivated_dict["name"], Tests.deactivated_exists)
+ state3_correct = validate_start_state(deac_tester, deactivated_dict["status"])
+
+ all_states_correct = state1_correct and state2_correct and state3_correct
+ Report.critical_result(Tests.start_states_correct, all_states_correct)
+
+ def locate_expected_lines(line_list: list):
+ found_lines = [printInfo.message.strip() for printInfo in section_tracer.prints]
+ return all(line in found_lines for line in line_list)
+
+ # 1) Create temp level
+ general.idle_enable(True)
+ result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
+ Report.critical_result(Tests.level_created, result == 0)
+ helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
+ general.close_pane("Error Report")
+
+ # 2) Setup the level
+ setup_level()
+
+ # 3) Validate the entities
+ validate_entities_in_level()
+
+ # 4) Start the Tracer
+ with Tracer() as section_tracer:
+
+ # 5) Enter Game Mode
+ helper.enter_game_mode(Tests.game_mode_entered)
+
+ # 6) Validate Print message
+ helper.wait_for_condition(lambda: locate_expected_lines(EXPECTED_LINES), WAIT_TIME)
+
+ Report.result(Tests.lines_found, locate_expected_lines(EXPECTED_LINES))
+
+ # 7) Exit game mode
+ helper.exit_game_mode(Tests.game_mode_exited)
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(ScriptCanvasComponent_OnEntityActivatedDeactivated_PrintMessage)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvasTools_Toggle_OpenCloseSuccess.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvasTools_Toggle_OpenCloseSuccess.py
new file mode 100644
index 0000000000..a105f1ef18
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvasTools_Toggle_OpenCloseSuccess.py
@@ -0,0 +1,124 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ node_palette_opened = ("NodePalette is opened successfully", "Failed to open NodePalette")
+ node_inspector_opened = ("NodeInspector is opened successfully", "Failed to open NodeInspector")
+ bookmark_opened = ("Bookmarks is opened successfully", "Failed to open Bookmarks")
+ variable_manager_opened = ("VariableManager is opened successfully", "Failed to open VariableManager")
+ node_palette_closed_by_start = ("NodePalette is closed successfully", "Failed to close NodePalette")
+ node_inspector_closed_by_start = ("NodeInspector is closed successfully", "Failed to close NodeInspector")
+ bookmark_closed_by_start = ("Bookmarks is closed successfully", "Failed to close Bookmarks")
+ variable_manager_closed_by_start = ("VariableManager is closed successfully", "Failed to close VariableManager")
+ node_palette_closed_by_end = ("NodePalette is closed successfully", "Failed to close NodePalette")
+ node_inspector_closed_by_end = ("NodeInspector is closed successfully", "Failed to close NodeInspector")
+ bookmark_closed_by_end = ("Bookmarks is closed successfully", "Failed to close Bookmarks")
+ variable_manager_closed_by_end = ("VariableManager is closed successfully", "Failed to close VariableManager")
+# fmt: on
+
+
+def ScriptCanvasTools_Toggle_OpenCloseSuccess():
+ """
+ Summary:
+ Toggle Node Palette, Node Inspector, Bookmarks and Variable Manager in Script Canvas.
+ Make sure each pane opens and closes successfully.
+
+ Expected Behavior:
+ Each pane opens and closes successfully.
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Make sure Node Palette, Node Inspector, Bookmarks and Variable Manager panes are closed in Script Canvas window
+ 3) Open Node Palette, Node Inspector, Bookmarks and Variable Manager in Script Canvas window
+ 4) Close Node Palette, Node Inspector, Bookmarks and Variable Manager in Script Canvas window
+ 5) Restore default layout
+ 6) Close Script Canvas window
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ from PySide2 import QtWidgets
+
+ from utils import Report
+ from utils import TestHelper as helper
+ import pyside_utils
+
+ # Open 3D Engine imports
+ import azlmbr.legacy.general as general
+
+ def click_menu_option(window, option_text):
+ action = pyside_utils.find_child_by_pattern(window, {"text": option_text, "type": QtWidgets.QAction})
+ action.trigger()
+
+ def find_pane(window, pane_name):
+ return window.findChild(QtWidgets.QDockWidget, pane_name)
+
+ def close_tool(window, pane_widget, test_tuple):
+ pane = find_pane(window, pane_widget)
+ pane.close()
+ Report.result(test_tuple, not pane.isVisible())
+
+ def open_tool(window, pane_widget, tool, test_tuple):
+ pane = find_pane(window, pane_widget)
+ if not pane.isVisible():
+ click_menu_option(window, tool)
+ pane = find_pane(window, pane_widget)
+ Report.result(test_tuple, pane.isVisible())
+
+ # Test starts here
+ general.idle_enable(True)
+
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+
+ # 2) Make sure Node Palette, Node Inspector, Bookmarks and Variable Manager panes are closed in Script Canvas window
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ close_tool(sc, "NodePalette", Tests.node_palette_closed_by_start)
+ close_tool(sc, "NodeInspector", Tests.node_inspector_closed_by_start)
+ close_tool(sc, "BookmarkDockWidget", Tests.bookmark_closed_by_start)
+ close_tool(sc, "VariableManager", Tests.variable_manager_closed_by_start)
+
+ # 3) Open Node Palette, Node Inspector, Bookmarks and Variable Manager in Script Canvas window
+ open_tool(sc, "NodePalette", "Node Palette", Tests.node_palette_opened)
+ open_tool(sc, "NodeInspector", "Node Inspector", Tests.node_inspector_opened)
+ open_tool(sc, "BookmarkDockWidget", "Bookmarks", Tests.bookmark_opened)
+ open_tool(sc, "VariableManager", "Variable Manager", Tests.variable_manager_opened)
+
+ # 4) Close Node Palette, Node Inspector, Bookmarks and Variable Manager in Script Canvas window
+ close_tool(sc, "NodePalette", Tests.node_palette_closed_by_end)
+ close_tool(sc, "NodeInspector", Tests.node_inspector_closed_by_end)
+ close_tool(sc, "BookmarkDockWidget", Tests.bookmark_closed_by_end)
+ close_tool(sc, "VariableManager", Tests.variable_manager_closed_by_end)
+
+ # 5) Restore default layout
+ # Need this step to restore to default in case of test failure
+ click_menu_option(sc, "Restore Default Layout")
+
+ # 6) Close Script Canvas window
+ sc.close()
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(ScriptCanvasTools_Toggle_OpenCloseSuccess)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_ChangingAssets.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_ChangingAssets.py
deleted file mode 100644
index 38d60ad871..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_ChangingAssets.py
+++ /dev/null
@@ -1,116 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: T92562986
-Test Case Title: Changing the assigned Script Canvas Asset on an entity properly updates
-level functionality
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92562986
-"""
-
-
-# fmt: off
-class Tests():
- level_created = ("New level created", "New level not created")
- entity_created = ("Test Entity created", "Test Entity not created")
- game_mode_entered = ("Game Mode successfully entered", "Game mode failed to enter")
- game_mode_exited = ("Game Mode successfully exited", "Game mode failed to exited")
- found_lines = ("Expected log lines were found", "Expected log lines were not found")
-# fmt: on
-
-
-def ScriptCanvas_ChangingAssets():
- """
- Summary:
- Changing the assigned Script Canvas Asset on an entity properly updates level functionality
-
- Expected Behavior:
- When game mode is entered, respective strings of assigned assets should be printed
-
- Test Steps:
- 1) Create temp level
- 2) Create new entity
- 3) Start Tracer
- 4) Set first script and evaluate
- 5) Set second script and evaluate
-
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- import os
-
- from utils import TestHelper as helper
- from utils import Tracer
- import hydra_editor_utils as hydra
- import azlmbr.legacy.general as general
- import azlmbr.math as math
- import azlmbr.asset as asset
- import azlmbr.bus as bus
- import azlmbr.paths as paths
-
- LEVEL_NAME = "tmp_level"
- ASSET_1 = os.path.join("scriptcanvas", "ScriptCanvas_TwoComponents0.scriptcanvas")
- ASSET_2 = os.path.join("scriptcanvas", "ScriptCanvas_TwoComponents1.scriptcanvas")
- EXP_LINE_1 = "Greetings from the first script"
- EXP_LINE_2 = "Greetings from the second script"
- WAIT_TIME = 3.0 # SECONDS
-
- def get_asset(asset_path):
- return asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", asset_path, math.Uuid(), False)
-
- def find_expected_line(expected_line):
- found_lines = [printInfo.message.strip() for printInfo in section_tracer.prints]
- return expected_line in found_lines
-
- def set_asset_evaluate(test_entity, ASSET_PATH, EXP_LINE):
- # Set Script Canvas entity
- test_entity.get_set_test(0, "Script Canvas Asset|Script Canvas Asset", get_asset(ASSET_PATH))
-
- # Enter/exit game mode
- helper.enter_game_mode(Tests.game_mode_entered)
- helper.wait_for_condition(lambda: find_expected_line(EXP_LINE), WAIT_TIME)
- Report.result(Tests.found_lines, find_expected_line(EXP_LINE))
- helper.exit_game_mode(Tests.game_mode_exited)
-
-
- # 1) Create temp level
- general.idle_enable(True)
- result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
- Report.critical_result(Tests.level_created, result == 0)
- helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
- general.close_pane("Error Report")
-
- # 2) Create new entity
- position = math.Vector3(512.0, 512.0, 32.0)
- test_entity = hydra.Entity("test_entity")
- test_entity.create_entity(position, ["Script Canvas"])
-
- # 3) Start Tracer
- with Tracer() as section_tracer:
-
- # 4) Set first script and evaluate
- set_asset_evaluate(test_entity, ASSET_1, EXP_LINE_1)
-
- # 5) Set second script and evaluate
- set_asset_evaluate(test_entity, ASSET_2, EXP_LINE_2)
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
- from utils import Report
-
- Report.start_test(ScriptCanvas_ChangingAssets)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_ChangingAssets_ComponentStable.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_ChangingAssets_ComponentStable.py
new file mode 100644
index 0000000000..d39c3d2590
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_ChangingAssets_ComponentStable.py
@@ -0,0 +1,109 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ level_created = ("New level created", "New level not created")
+ entity_created = ("Test Entity created", "Test Entity not created")
+ game_mode_entered = ("Game Mode successfully entered", "Game mode failed to enter")
+ game_mode_exited = ("Game Mode successfully exited", "Game mode failed to exited")
+ found_lines = ("Expected log lines were found", "Expected log lines were not found")
+# fmt: on
+
+
+def ScriptCanvas_ChangingAssets_ComponentStable():
+ """
+ Summary:
+ Changing the assigned Script Canvas Asset on an entity properly updates level functionality
+
+ Expected Behavior:
+ When game mode is entered, respective strings of assigned assets should be printed
+
+ Test Steps:
+ 1) Create temp level
+ 2) Create new entity
+ 3) Start Tracer
+ 4) Set first script and evaluate
+ 5) Set second script and evaluate
+
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ import os
+
+ from utils import TestHelper as helper
+ from utils import Tracer
+ import hydra_editor_utils as hydra
+ import azlmbr.legacy.general as general
+ import azlmbr.math as math
+ import azlmbr.asset as asset
+ import azlmbr.bus as bus
+
+ LEVEL_NAME = "tmp_level"
+ ASSET_1 = os.path.join("scriptcanvas", "ScriptCanvas_TwoComponents0.scriptcanvas")
+ ASSET_2 = os.path.join("scriptcanvas", "ScriptCanvas_TwoComponents1.scriptcanvas")
+ EXP_LINE_1 = "Greetings from the first script"
+ EXP_LINE_2 = "Greetings from the second script"
+ WAIT_TIME = 3.0 # SECONDS
+
+ def get_asset(asset_path):
+ return asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", asset_path, math.Uuid(), False)
+
+ def find_expected_line(expected_line):
+ found_lines = [printInfo.message.strip() for printInfo in section_tracer.prints]
+ return expected_line in found_lines
+
+ def set_asset_evaluate(test_entity, ASSET_PATH, EXP_LINE):
+ # Set Script Canvas entity
+ test_entity.get_set_test(0, "Script Canvas Asset|Script Canvas Asset", get_asset(ASSET_PATH))
+
+ # Enter/exit game mode
+ helper.enter_game_mode(Tests.game_mode_entered)
+ helper.wait_for_condition(lambda: find_expected_line(EXP_LINE), WAIT_TIME)
+ Report.result(Tests.found_lines, find_expected_line(EXP_LINE))
+ helper.exit_game_mode(Tests.game_mode_exited)
+
+ # 1) Create temp level
+ general.idle_enable(True)
+ result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
+ Report.critical_result(Tests.level_created, result == 0)
+ helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
+ general.close_pane("Error Report")
+
+ # 2) Create new entity
+ position = math.Vector3(512.0, 512.0, 32.0)
+ test_entity = hydra.Entity("test_entity")
+ test_entity.create_entity(position, ["Script Canvas"])
+
+ # 3) Start Tracer
+ with Tracer() as section_tracer:
+
+ # 4) Set first script and evaluate
+ set_asset_evaluate(test_entity, ASSET_1, EXP_LINE_1)
+
+ # 5) Set second script and evaluate
+ set_asset_evaluate(test_entity, ASSET_2, EXP_LINE_2)
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(ScriptCanvas_ChangingAssets_ComponentStable)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_TwoComponents.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_TwoComponents.py
deleted file mode 100644
index 896bee96e5..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_TwoComponents.py
+++ /dev/null
@@ -1,118 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: T92563190
-Test Case Title: A single Entity with two Script Canvas components works properly
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92563190
-"""
-
-
-# fmt: off
-class Tests():
- level_created = ("New level created", "New level not created")
- game_mode_entered = ("Game Mode successfully entered", "Game mode failed to enter")
- game_mode_exited = ("Game Mode successfully exited", "Game mode failed to exited")
- found_lines = ("Expected log lines were found", "Expected log lines were not found")
-# fmt: on
-
-
-class LogLines:
- expected_lines = ["Greetings from the first script", "Greetings from the second script"]
-
-
-def ScriptCanvas_TwoComponents():
- """
- Summary:
- A test entity contains two Script Canvas components with different unique script canvas files.
- Each of these files will have a print node set to activate on graph start.
-
- Expected Behavior:
- When game mode is entered, two unique strings should be printed out to the console
-
- Test Steps:
- 1) Create level
- 2) Create entity with SC components
- 3) Start Tracer
- 4) Enter game mode
- 5) Wait for expected lines to be found
- 6) Report if expected lines were found
- 7) Exit game mode
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
- import os
-
- from utils import TestHelper as helper
- import hydra_editor_utils as hydra
- from utils import Report
- from utils import Tracer
- import azlmbr.legacy.general as general
- import azlmbr.math as math
- import azlmbr.asset as asset
- import azlmbr.bus as bus
-
- LEVEL_NAME = "tmp_level"
- ASSET_1 = os.path.join("scriptcanvas", "ScriptCanvas_TwoComponents0.scriptcanvas")
- ASSET_2 = os.path.join("scriptcanvas", "ScriptCanvas_TwoComponents1.scriptcanvas")
- WAIT_TIME = 3.0 # SECONDS
-
- def get_asset(asset_path):
- return asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", asset_path, math.Uuid(), False)
-
- def locate_expected_lines():
- found_lines = []
- for printInfo in section_tracer.prints:
- found_lines.append(printInfo.message.strip())
-
- return all(line in found_lines for line in LogLines.expected_lines)
-
- # 1) Create level
- general.idle_enable(True)
- result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
- Report.critical_result(Tests.level_created, result == 0)
- helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
- general.close_pane("Error Report")
-
- # 2) Create entity with SC components
- position = math.Vector3(512.0, 512.0, 32.0)
- test_entity = hydra.Entity("test_entity")
- test_entity.create_entity(position, ["Script Canvas", "Script Canvas"])
- test_entity.get_set_test(0, "Script Canvas Asset|Script Canvas Asset", get_asset(ASSET_1))
- test_entity.get_set_test(1, "Script Canvas Asset|Script Canvas Asset", get_asset(ASSET_2))
-
- # 3) Start Tracer
- with Tracer() as section_tracer:
-
- # 4) Enter game mode
- helper.enter_game_mode(Tests.game_mode_entered)
-
- # 5) Wait for expected lines to be found
- helper.wait_for_condition(locate_expected_lines, WAIT_TIME)
-
- # 6) Report if expected lines were found
- Report.result(Tests.found_lines, locate_expected_lines())
-
- # 7) Exit game mode
- helper.exit_game_mode(Tests.game_mode_exited)
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
-
- from utils import Report
-
- Report.start_test(ScriptCanvas_TwoComponents)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_TwoComponents_InteractSuccessfully.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_TwoComponents_InteractSuccessfully.py
new file mode 100644
index 0000000000..9bbda9bdbd
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_TwoComponents_InteractSuccessfully.py
@@ -0,0 +1,114 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ level_created = ("New level created", "New level not created")
+ game_mode_entered = ("Game Mode successfully entered", "Game mode failed to enter")
+ game_mode_exited = ("Game Mode successfully exited", "Game mode failed to exited")
+ found_lines = ("Expected log lines were found", "Expected log lines were not found")
+# fmt: on
+
+
+class LogLines:
+ expected_lines = ["Greetings from the first script", "Greetings from the second script"]
+
+
+def ScriptCanvas_TwoComponents_InteractSuccessfully():
+ """
+ Summary:
+ A test entity contains two Script Canvas components with different unique script canvas files.
+ Each of these files will have a print node set to activate on graph start.
+
+ Expected Behavior:
+ When game mode is entered, two unique strings should be printed out to the console
+
+ Test Steps:
+ 1) Create level
+ 2) Create entity with SC components
+ 3) Start Tracer
+ 4) Enter game mode
+ 5) Wait for expected lines to be found
+ 6) Report if expected lines were found
+ 7) Exit game mode
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ import os
+
+ from utils import TestHelper as helper
+ import hydra_editor_utils as hydra
+ from utils import Report
+ from utils import Tracer
+
+ import azlmbr.legacy.general as general
+ import azlmbr.math as math
+ import azlmbr.asset as asset
+ import azlmbr.bus as bus
+
+ LEVEL_NAME = "tmp_level"
+ ASSET_1 = os.path.join("scriptcanvas", "ScriptCanvas_TwoComponents0.scriptcanvas")
+ ASSET_2 = os.path.join("scriptcanvas", "ScriptCanvas_TwoComponents1.scriptcanvas")
+ WAIT_TIME = 3.0 # SECONDS
+
+ def get_asset(asset_path):
+ return asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", asset_path, math.Uuid(), False)
+
+ def locate_expected_lines():
+ found_lines = []
+ for printInfo in section_tracer.prints:
+ found_lines.append(printInfo.message.strip())
+
+ return all(line in found_lines for line in LogLines.expected_lines)
+
+ # 1) Create level
+ general.idle_enable(True)
+ result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
+ Report.critical_result(Tests.level_created, result == 0)
+ helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
+ general.close_pane("Error Report")
+
+ # 2) Create entity with SC components
+ position = math.Vector3(512.0, 512.0, 32.0)
+ test_entity = hydra.Entity("test_entity")
+ test_entity.create_entity(position, ["Script Canvas", "Script Canvas"])
+ test_entity.get_set_test(0, "Script Canvas Asset|Script Canvas Asset", get_asset(ASSET_1))
+ test_entity.get_set_test(1, "Script Canvas Asset|Script Canvas Asset", get_asset(ASSET_2))
+
+ # 3) Start Tracer
+ with Tracer() as section_tracer:
+
+ # 4) Enter game mode
+ helper.enter_game_mode(Tests.game_mode_entered)
+
+ # 5) Wait for expected lines to be found
+ helper.wait_for_condition(locate_expected_lines, WAIT_TIME)
+
+ # 6) Report if expected lines were found
+ Report.result(Tests.found_lines, locate_expected_lines())
+
+ # 7) Exit game mode
+ helper.exit_game_mode(Tests.game_mode_exited)
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(ScriptCanvas_TwoComponents_InteractSuccessfully)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_TwoEntities.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_TwoEntities.py
deleted file mode 100644
index 401e6c0271..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_TwoEntities.py
+++ /dev/null
@@ -1,107 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: T92563191
-Test Case Title: Two Entities can use the same Graph asset successfully at RunTime
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92563191
-"""
-
-
-# fmt: off
-class Tests():
- level_created = ("New level created", "New level not created")
- game_mode_entered = ("Game Mode successfully entered", "Game mode failed to enter")
- game_mode_exited = ("Game Mode successfully exited", "Game mode failed to exited")
- found_lines = ("Expected log lines were found", "Expected log lines were not found")
-# fmt: on
-
-
-def ScriptCanvas_TwoEntities():
- """
- Summary:
- Two Entities can use the same Graph asset successfully at RunTime. The script canvas asset
- attached to the enties will print the respective entity names.
-
- Expected Behavior:
- When game mode is entered, respective strings of different entities should be printed.
-
- Test Steps:
- 1) Create temp level
- 2) Create two new entities with different names
- 3) Set ScriptCanvas asset to both the entities
- 4) Enter/Exit game mode and verify log lines
-
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- import os
-
- from utils import TestHelper as helper
- from utils import Tracer
- import hydra_editor_utils as hydra
- import azlmbr.legacy.general as general
- import azlmbr.math as math
- import azlmbr.asset as asset
- import azlmbr.bus as bus
-
- LEVEL_NAME = "tmp_level"
- ASSET_PATH = os.path.join("scriptcanvas", "T92563191_test.scriptcanvas")
- EXPECTED_LINES = ["Entity Name: test_entity_1", "Entity Name: test_entity_2"]
- WAIT_TIME = 0.5 # SECONDS
-
- def get_asset(asset_path):
- return asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", asset_path, math.Uuid(), False)
-
- # 1) Create temp level
- general.idle_enable(True)
- result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
- Report.critical_result(Tests.level_created, result == 0)
- helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
- general.close_pane("Error Report")
-
- # 2) Create two new entities with different names
- position = math.Vector3(512.0, 512.0, 32.0)
- test_entity_1 = hydra.Entity("test_entity_1")
- test_entity_1.create_entity(position, ["Script Canvas"])
-
- test_entity_2 = hydra.Entity("test_entity_2")
- test_entity_2.create_entity(position, ["Script Canvas"])
-
- # 3) Set ScriptCanvas asset to both the entities
- test_entity_1.get_set_test(0, "Script Canvas Asset|Script Canvas Asset", get_asset(ASSET_PATH))
- test_entity_2.get_set_test(0, "Script Canvas Asset|Script Canvas Asset", get_asset(ASSET_PATH))
-
- # 4) Enter/Exit game mode and verify log lines
- with Tracer() as section_tracer:
-
- helper.enter_game_mode(Tests.game_mode_entered)
- # wait for WAIT_TIME to let the script print strings
- general.idle_wait(WAIT_TIME)
- helper.exit_game_mode(Tests.game_mode_exited)
-
- found_lines = [printInfo.message.strip() for printInfo in section_tracer.prints]
- result = all(line in found_lines for line in EXPECTED_LINES)
-
- Report.result(Tests.found_lines, result)
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
- from utils import Report
-
- Report.start_test(ScriptCanvas_TwoEntities)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_TwoEntities_UseSimultaneously.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_TwoEntities_UseSimultaneously.py
new file mode 100644
index 0000000000..d25ef64c4a
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/ScriptCanvas_TwoEntities_UseSimultaneously.py
@@ -0,0 +1,104 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ level_created = ("New level created successfully", "New level failed to create")
+ game_mode_entered = ("Game Mode successfully entered", "Game mode failed to enter")
+ game_mode_exited = ("Game Mode successfully exited", "Game mode failed to exited")
+ found_lines = ("Expected log lines were found", "Expected log lines were not found")
+# fmt: on
+
+
+def ScriptCanvas_TwoEntities_UseSimultaneously():
+ """
+ Summary:
+ Two Entities can use the same Graph asset successfully at RunTime. The script canvas asset
+ attached to the entities will print the respective entity names.
+
+ Expected Behavior:
+ When game mode is entered, respective strings of different entities should be printed.
+
+ Test Steps:
+ 1) Create temp level
+ 2) Create two new entities with different names
+ 3) Set ScriptCanvas asset to both the entities
+ 4) Enter/Exit game mode and verify log lines
+
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ import os
+
+ import hydra_editor_utils as hydra
+ from utils import TestHelper as helper
+ from utils import Tracer
+
+ import azlmbr.legacy.general as general
+ import azlmbr.math as math
+ import azlmbr.asset as asset
+ import azlmbr.bus as bus
+
+ LEVEL_NAME = "tmp_level"
+ ASSET_PATH = os.path.join("scriptcanvas", "T92563191_test.scriptcanvas")
+ EXPECTED_LINES = ["Entity Name: test_entity_1", "Entity Name: test_entity_2"]
+ WAIT_TIME = 0.5 # SECONDS
+
+ def get_asset(asset_path):
+ return asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", asset_path, math.Uuid(), False)
+
+ # 1) Create temp level
+ general.idle_enable(True)
+ result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
+ Report.critical_result(Tests.level_created, result == 0)
+ helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
+ general.close_pane("Error Report")
+
+ # 2) Create two new entities with different names
+ position = math.Vector3(512.0, 512.0, 32.0)
+ test_entity_1 = hydra.Entity("test_entity_1")
+ test_entity_1.create_entity(position, ["Script Canvas"])
+
+ test_entity_2 = hydra.Entity("test_entity_2")
+ test_entity_2.create_entity(position, ["Script Canvas"])
+
+ # 3) Set ScriptCanvas asset to both the entities
+ test_entity_1.get_set_test(0, "Script Canvas Asset|Script Canvas Asset", get_asset(ASSET_PATH))
+ test_entity_2.get_set_test(0, "Script Canvas Asset|Script Canvas Asset", get_asset(ASSET_PATH))
+
+ # 4) Enter/Exit game mode and verify log lines
+ with Tracer() as section_tracer:
+
+ helper.enter_game_mode(Tests.game_mode_entered)
+ # wait for WAIT_TIME to let the script print strings
+ general.idle_wait(WAIT_TIME)
+ helper.exit_game_mode(Tests.game_mode_exited)
+
+ found_lines = [printInfo.message.strip() for printInfo in section_tracer.prints]
+ result = all(line in found_lines for line in EXPECTED_LINES)
+
+ Report.result(Tests.found_lines, result)
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(ScriptCanvas_TwoEntities_UseSimultaneously)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvent_AddRemoveMethod_UpdatesInSC.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvent_AddRemoveMethod_UpdatesInSC.py
new file mode 100644
index 0000000000..21ad40014e
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvent_AddRemoveMethod_UpdatesInSC.py
@@ -0,0 +1,202 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ new_event_created = ("New Script Event created", "New Script Event not created")
+ child_1_created = ("Initial Child Event created", "Initial Child Event not created")
+ child_2_created = ("Second Child Event created", "Second Child Event not created")
+ file_saved = ("Script event file saved", "Script event file did not save")
+ method_added = ("Method added to scriptevent file", "Method not added to scriptevent file")
+ method_removed = ("Method removed from scriptevent file", "Method not removed from scriptevent file")
+# fmt: on
+
+
+def ScriptEvent_AddRemoveMethod_UpdatesInSC():
+ """
+ Summary:
+ Method can be added/removed to an existing .scriptevents file
+
+ Expected Behavior:
+ The Method is correctly added/removed to the asset, and Script Canvas nodes are updated accordingly.
+
+ Test Steps:
+ 1) Open Asset Editor and Script Canvas windows
+ 2) Initially create new Script Event file with one method
+ 3) Verify if file is created and saved
+ 4) Add a new child element
+ 5) Update MethodNames and save file
+ 6) Verify if the new node exist in SC (search in node palette)
+ 7) Delete one method and save
+ 8) Verify if the node is removed in SC
+ 9) Close Asset Editor
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ import os
+ from utils import TestHelper as helper
+ import pyside_utils
+
+ # Open 3D Engine imports
+ import azlmbr.legacy.general as general
+ import azlmbr.editor as editor
+ import azlmbr.bus as bus
+
+ # Pyside imports
+ from PySide2 import QtWidgets, QtTest, QtCore
+
+ GENERAL_WAIT = 1.0 # seconds
+
+ FILE_PATH = os.path.join("AutomatedTesting", "TestAssets", "test_file.scriptevents")
+ METHOD_NAME = "test_method_name"
+
+ editor_window = pyside_utils.get_editor_main_window()
+ asset_editor = asset_editor_widget = container = menu_bar = None
+ sc = node_palette = tree = search_frame = search_box = None
+
+ def initialize_asset_editor_qt_objects():
+ nonlocal asset_editor, asset_editor_widget, container, menu_bar
+ asset_editor = editor_window.findChild(QtWidgets.QDockWidget, "Asset Editor")
+ asset_editor_widget = asset_editor.findChild(QtWidgets.QWidget, "AssetEditorWindowClass")
+ container = asset_editor_widget.findChild(QtWidgets.QWidget, "ContainerForRows")
+ menu_bar = asset_editor_widget.findChild(QtWidgets.QMenuBar)
+
+ def initialize_sc_qt_objects():
+ nonlocal sc, node_palette, tree, search_frame, search_box
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ if sc.findChild(QtWidgets.QDockWidget, "NodePalette") is None:
+ action = pyside_utils.find_child_by_pattern(sc, {"text": "Node Palette", "type": QtWidgets.QAction})
+ action.trigger()
+ node_palette = sc.findChild(QtWidgets.QDockWidget, "NodePalette")
+ tree = node_palette.findChild(QtWidgets.QTreeView, "treeView")
+ search_frame = node_palette.findChild(QtWidgets.QFrame, "searchFrame")
+ search_box = search_frame.findChild(QtWidgets.QLineEdit, "searchFilter")
+
+ def save_file():
+ editor.AssetEditorWidgetRequestsBus(bus.Broadcast, "SaveAssetAs", FILE_PATH)
+ action = pyside_utils.find_child_by_pattern(menu_bar, {"type": QtWidgets.QAction, "iconText": "Save"})
+ action.trigger()
+ # wait till file is saved, to validate that check the text of QLabel at the bottom of the AssetEditor,
+ # if there are no unsaved changes we will not have any * in the text
+ label = asset_editor.findChild(QtWidgets.QLabel, "textEdit")
+ return helper.wait_for_condition(lambda: "*" not in label.text(), 3.0)
+
+ def expand_container_rows(object_name):
+ children = container.findChildren(QtWidgets.QFrame, object_name)
+ for child in children:
+ check_box = child.findChild(QtWidgets.QCheckBox)
+ if check_box and not check_box.isChecked():
+ QtTest.QTest.mouseClick(check_box, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier)
+
+ def node_palette_search(node_name):
+ search_box.setText(node_name)
+ helper.wait_for_condition(lambda: search_box.text() == node_name, 1.0)
+ # Try clicking ENTER in search box multiple times
+ for _ in range(10):
+ QtTest.QTest.keyClick(search_box, QtCore.Qt.Key_Enter, QtCore.Qt.NoModifier)
+ if pyside_utils.find_child_by_pattern(tree, {"text": node_name}) is not None:
+ break
+
+ # 1) Open Asset Editor
+ general.idle_enable(True)
+ # Initially close the Asset Editor and then reopen to ensure we don't have any existing assets open
+ general.close_pane("Asset Editor")
+ general.open_pane("Asset Editor")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Asset Editor"), 5.0)
+
+ # 2) Initially create new Script Event file with one method
+ initialize_asset_editor_qt_objects()
+ action = pyside_utils.find_child_by_pattern(menu_bar, {"type": QtWidgets.QAction, "text": "Script Events"})
+ action.trigger()
+ result = helper.wait_for_condition(
+ lambda: container.findChild(QtWidgets.QFrame, "Events") is not None
+ and container.findChild(QtWidgets.QFrame, "Events").findChild(QtWidgets.QToolButton, "") is not None,
+ 3 * GENERAL_WAIT,
+ )
+ Report.result(Tests.new_event_created, result)
+ # Add new method
+ add_event = container.findChild(QtWidgets.QFrame, "Events").findChild(QtWidgets.QToolButton, "")
+ add_event.click()
+ result = helper.wait_for_condition(
+ lambda: asset_editor_widget.findChild(QtWidgets.QFrame, "EventName") is not None, GENERAL_WAIT
+ )
+ Report.result(Tests.child_1_created, result)
+ editor.AssetEditorWidgetRequestsBus(bus.Broadcast, "SaveAssetAs", FILE_PATH)
+
+ # 3) Verify if file is created and saved
+ result = helper.wait_for_condition(lambda: os.path.exists(FILE_PATH), 3 * GENERAL_WAIT)
+ Report.result(Tests.file_saved, result and save_file())
+
+ # 4) Add a new child element
+ add_event = container.findChild(QtWidgets.QFrame, "Events").findChild(QtWidgets.QToolButton, "")
+ add_event.click()
+ result = helper.wait_for_condition(
+ lambda: len(asset_editor_widget.findChildren(QtWidgets.QFrame, "EventName")) == 2, 2 * GENERAL_WAIT
+ )
+ Report.result(Tests.child_2_created, result)
+
+ # 5) Update MethodNames and save file, (update all Method names to make it easier to search in SC later)
+ # Expand the EventName initially
+ expand_container_rows("EventName")
+ # Expand Name fields under it
+ expand_container_rows("Name")
+ count = 0 # 2 Method names will be updated Ex: test_method_name_0, test_method_name_1
+ container = asset_editor_widget.findChild(QtWidgets.QWidget, "ContainerForRows")
+ children = container.findChildren(QtWidgets.QFrame, "Name")
+ for child in children:
+ line_edit = child.findChild(QtWidgets.QLineEdit)
+ if line_edit and line_edit.text() == "MethodName":
+ line_edit.setText(f"{METHOD_NAME}_{count}")
+ count += 1
+ save_file()
+
+ # 6) Verify if the new node exist in SC (search in node palette)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+ initialize_sc_qt_objects()
+ node_palette_search(f"{METHOD_NAME}_1")
+ get_node_index = lambda: pyside_utils.find_child_by_pattern(tree, {"text": f"{METHOD_NAME}_1"}) is not None
+ result = helper.wait_for_condition(get_node_index, GENERAL_WAIT)
+ Report.result(Tests.method_added, result)
+
+ # 7) Delete one method and save
+ initialize_asset_editor_qt_objects()
+ for child in container.findChildren(QtWidgets.QFrame, "EventName"):
+ if child.findChild(QtWidgets.QToolButton, ""):
+ child.findChild(QtWidgets.QToolButton, "").click()
+ break
+ save_file()
+
+ # 8) Verify if the node is removed in SC (search in node palette)
+ initialize_sc_qt_objects()
+ node_palette_search(f"{METHOD_NAME}_0")
+ get_node_index = lambda: pyside_utils.find_child_by_pattern(tree, {"text": f"{METHOD_NAME}_0"}) is None
+ result = helper.wait_for_condition(get_node_index, GENERAL_WAIT)
+ Report.result(Tests.method_removed, result)
+
+ # 9) Close Asset Editor
+ general.close_pane("Asset Editor")
+ general.close_pane("Script Canvas")
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(ScriptEvent_AddRemoveMethod_UpdatesInSC)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvent_AddRemoveParameter_ActionsSuccessful.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvent_AddRemoveParameter_ActionsSuccessful.py
new file mode 100644
index 0000000000..638c69e8f3
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvent_AddRemoveParameter_ActionsSuccessful.py
@@ -0,0 +1,131 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ new_event_created = ("Successfully created a new event", "Failed to create a new event")
+ child_event_created = ("Successfully created Child Event", "Failed to create Child Event")
+ file_saved = ("Successfully saved event asset", "Failed to save event asset")
+ parameter_created = ("Successfully added parameter", "Failed to add parameter")
+ parameter_removed = ("Successfully removed parameter", "Failed to remove parameter")
+# fmt: on
+
+
+def ScriptEvent_AddRemoveParameter_ActionsSuccessful():
+ """
+ Summary:
+ Parameter can be removed from a Script Event method
+
+ Expected Behavior:
+ Upon saving the updated .scriptevents asset the removed paramenter should no longer be present on the Script Event
+
+ Test Steps:
+ 1) Open Asset Editor
+ 2) Get Asset Editor Qt object
+ 3) Create new Script Event Asset
+ 4) Add Parameter to Event
+ 5) Remove Parameter from Event
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ import os
+ from PySide2 import QtWidgets
+
+ 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
+
+ import azlmbr.bus as bus
+ import azlmbr.editor as editor
+ import azlmbr.legacy.general as general
+
+ GENERAL_WAIT = 1.0 # seconds
+ FILE_PATH = os.path.join("AutomatedTesting", "ScriptCanvas", "test_file.scriptevent")
+ QtObject = object
+
+ def create_script_event(asset_editor: QtObject, file_path: str) -> None:
+ action = pyside_utils.find_child_by_pattern(menu_bar, {"type": QtWidgets.QAction, "text": "Script Events"})
+ action.trigger()
+ result = helper.wait_for_condition(
+ lambda: container.findChild(QtWidgets.QFrame, "Events") is not None, 3 * GENERAL_WAIT
+ )
+ Report.result(Tests.new_event_created, result)
+
+ # Add new child event
+ add_event = container.findChild(QtWidgets.QFrame, "Events").findChild(QtWidgets.QToolButton, "")
+ add_event.click()
+ result = helper.wait_for_condition(
+ lambda: asset_editor.findChild(QtWidgets.QFrame, "EventName") is not None, GENERAL_WAIT
+ )
+ Report.result(Tests.child_event_created, result)
+ # Save the Script Event file
+ editor.AssetEditorWidgetRequestsBus(bus.Broadcast, "SaveAssetAs", file_path)
+
+ # Verify if file is created
+ result = helper.wait_for_condition(lambda: os.path.exists(file_path), 3 * GENERAL_WAIT)
+ Report.result(Tests.file_saved, result)
+
+ def create_parameter(file_path: str) -> None:
+ add_param = container.findChild(QtWidgets.QFrame, "Parameters").findChild(QtWidgets.QToolButton, "")
+ add_param.click()
+ result = helper.wait_for_condition(
+ lambda: asset_editor_widget.findChild(QtWidgets.QFrame, "[0]") is not None, GENERAL_WAIT
+ )
+ Report.result(Tests.parameter_created, result)
+ editor.AssetEditorWidgetRequestsBus(bus.Broadcast, "SaveAssetAs", file_path)
+
+ def remove_parameter(file_path: str) -> None:
+ remove_param = container.findChild(QtWidgets.QFrame, "[0]").findChild(QtWidgets.QToolButton, "")
+ remove_param.click()
+ result = helper.wait_for_condition(
+ lambda: asset_editor_widget.findChild(QtWidgets.QFrame, "[0]") is None, GENERAL_WAIT
+ )
+ Report.result(Tests.parameter_removed, result)
+ editor.AssetEditorWidgetRequestsBus(bus.Broadcast, "SaveAssetAs", file_path)
+
+ # 1) Open Asset Editor
+ general.idle_enable(True)
+ # Initially close the Asset Editor and then reopen to ensure we don't have any existing assets open
+ general.close_pane("Asset Editor")
+ general.open_pane("Asset Editor")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Asset Editor"), 5.0)
+
+ # 2) Get Asset Editor Qt object
+ editor_window = pyside_utils.get_editor_main_window()
+ asset_editor_widget = editor_window.findChild(QtWidgets.QDockWidget, "Asset Editor").findChild(
+ QtWidgets.QWidget, "AssetEditorWindowClass"
+ )
+ container = asset_editor_widget.findChild(QtWidgets.QWidget, "ContainerForRows")
+ menu_bar = asset_editor_widget.findChild(QtWidgets.QMenuBar)
+
+ # 3) Create new Script Event Asset
+ create_script_event(asset_editor_widget, FILE_PATH)
+
+ # 4) Add Parameter to Event
+ create_parameter(FILE_PATH)
+
+ # 5) Remove Parameter from Event
+ remove_parameter(FILE_PATH)
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from editor_python_test_tools.utils import Report
+
+ Report.start_test(ScriptEvent_AddRemoveParameter_ActionsSuccessful)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvent_HappyPath_CreatedWithoutError.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvent_HappyPath_CreatedWithoutError.py
new file mode 100644
index 0000000000..72144ebc0e
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvent_HappyPath_CreatedWithoutError.py
@@ -0,0 +1,119 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ new_event_created = ("New Script Event created", "New Script Event not created")
+ child_event_created = ("Child Event created", "Child not created")
+ file_saved = ("Script event file saved", "Script event file did not save")
+ console_error = ("No unexpected error in console", "Error found in console")
+ console_warning = ("No unexpected warning in console", "Warning found in console")
+# fmt: on
+
+
+def CreateScriptEventFile():
+ """
+ Summary:
+ Script Event file can be created
+
+ Expected Behavior:
+ File is created without any errors and warnings in Console
+
+ Test Steps:
+ 1) Open Asset Editor
+ 2) Get Asset Editor Qt object
+ 3) Create new Script Event Asset
+ 4) Add new child event
+ 5) Save the Script Event file
+ 6) Verify if file is created
+ 7) Verify console for errors/warnings
+ 8) Close Asset Editor
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ import os
+ from utils import Report
+ from utils import TestHelper as helper
+ from utils import Tracer
+ import pyside_utils
+
+ # Open 3D Engine imports
+ import azlmbr.legacy.general as general
+ import azlmbr.editor as editor
+ import azlmbr.bus as bus
+
+ # Pyside imports
+ from PySide2 import QtWidgets
+
+ GENERAL_WAIT = 1.0 # seconds
+
+ FILE_PATH = os.path.join("AutomatedTesting", "ScriptCanvas", "test_file.scriptevent")
+
+ # 1) Open Asset Editor
+ general.idle_enable(True)
+ # Initially close the Asset Editor and then reopen to ensure we don't have any existing assets open
+ general.close_pane("Asset Editor")
+ general.open_pane("Asset Editor")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Asset Editor"), 5.0)
+
+ # 2) Get Asset Editor Qt object
+ editor_window = pyside_utils.get_editor_main_window()
+ asset_editor_widget = editor_window.findChild(QtWidgets.QDockWidget, "Asset Editor").findChild(
+ QtWidgets.QWidget, "AssetEditorWindowClass"
+ )
+ container = asset_editor_widget.findChild(QtWidgets.QWidget, "ContainerForRows")
+ menu_bar = asset_editor_widget.findChild(QtWidgets.QMenuBar)
+
+ # 3) Create new Script Event Asset
+ action = pyside_utils.find_child_by_pattern(menu_bar, {"type": QtWidgets.QAction, "text": "Script Events"})
+ action.trigger()
+ result = helper.wait_for_condition(
+ lambda: container.findChild(QtWidgets.QFrame, "Events") is not None, 3 * GENERAL_WAIT
+ )
+ Report.result(Tests.new_event_created, result)
+
+ # 4) Add new child event
+ add_event = container.findChild(QtWidgets.QFrame, "Events").findChild(QtWidgets.QToolButton, "")
+ add_event.click()
+ result = helper.wait_for_condition(
+ lambda: asset_editor_widget.findChild(QtWidgets.QFrame, "EventName") is not None, GENERAL_WAIT
+ )
+ Report.result(Tests.child_event_created, result)
+
+ with Tracer() as section_tracer:
+ # 5) Save the Script Event file
+ editor.AssetEditorWidgetRequestsBus(bus.Broadcast, "SaveAssetAs", FILE_PATH)
+
+ # 6) Verify if file is created
+ result = helper.wait_for_condition(lambda: os.path.exists(FILE_PATH), 3 * GENERAL_WAIT)
+ Report.result(Tests.file_saved, result)
+
+ # 7) Verify console for errors/warnings
+ Report.result(Tests.console_error, not section_tracer.has_errors)
+ Report.result(Tests.console_warning, not section_tracer.has_warnings)
+
+ # 8) Close Asset Editor
+ general.close_pane("Asset Editor")
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(CreateScriptEventFile)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_AllParamDatatypes_CreationSuccess.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_AllParamDatatypes_CreationSuccess.py
new file mode 100644
index 0000000000..4beedec7cf
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_AllParamDatatypes_CreationSuccess.py
@@ -0,0 +1,210 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ new_event_created = ("New Script Event created", "New Script Event not created")
+ child_event_created = ("Child Event created", "Child Event not created")
+ params_added = ("New parameters added", "New parameters are not added")
+ file_saved = ("Script event file saved", "Script event file did not save")
+ node_found = ("Node found in Script Canvas", "Node not found in Script Canvas")
+# fmt: on
+
+
+def ScriptEvents_AllParamDatatypes_CreationSuccess():
+ """
+ Summary:
+ Parameters of all types can be created.
+
+ Expected Behavior:
+ The Method handles the large number of Parameters gracefully.
+ Parameters of all data types can be successfully created.
+ Updated ScriptEvent toast appears in Script Canvas.
+
+ Test Steps:
+ 1) Open Asset Editor
+ 2) Initially create new Script Event file with one method
+ 3) Add new method and set name to it
+ 4) Add new parameters of each type
+ 5) Verify if parameters are added
+ 6) Expand the parameter rows
+ 7) Set different names and datatypes for each parameter
+ 8) Save file and verify node in SC Node Palette
+ 9) Close Asset Editor
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ import os
+ from utils import TestHelper as helper
+ import pyside_utils
+
+ # Open 3D Engine imports
+ import azlmbr.legacy.general as general
+ import azlmbr.editor as editor
+ import azlmbr.bus as bus
+
+ # Pyside imports
+ from PySide2 import QtWidgets, QtTest, QtCore
+
+ GENERAL_WAIT = 1.0 # seconds
+
+ FILE_PATH = os.path.join("AutomatedTesting", "TestAssets", "test_file.scriptevents")
+ N_VAR_TYPES = 10 # Top 10 variable types
+ TEST_METHOD_NAME = "test_method_name"
+
+ editor_window = pyside_utils.get_editor_main_window()
+ asset_editor = asset_editor_widget = container = menu_bar = None
+ sc = node_palette = tree = search_frame = search_box = None
+
+ def initialize_asset_editor_qt_objects():
+ nonlocal asset_editor, asset_editor_widget, container, menu_bar
+ asset_editor = editor_window.findChild(QtWidgets.QDockWidget, "Asset Editor")
+ asset_editor_widget = asset_editor.findChild(QtWidgets.QWidget, "AssetEditorWindowClass")
+ container = asset_editor_widget.findChild(QtWidgets.QWidget, "ContainerForRows")
+ menu_bar = asset_editor_widget.findChild(QtWidgets.QMenuBar)
+
+ def initialize_sc_qt_objects():
+ nonlocal sc, node_palette, tree, search_frame, search_box
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ if sc.findChild(QtWidgets.QDockWidget, "NodePalette") is None:
+ action = pyside_utils.find_child_by_pattern(sc, {"text": "Node Palette", "type": QtWidgets.QAction})
+ action.trigger()
+ node_palette = sc.findChild(QtWidgets.QDockWidget, "NodePalette")
+ tree = node_palette.findChild(QtWidgets.QTreeView, "treeView")
+ search_frame = node_palette.findChild(QtWidgets.QFrame, "searchFrame")
+ search_box = search_frame.findChild(QtWidgets.QLineEdit, "searchFilter")
+
+ def save_file():
+ editor.AssetEditorWidgetRequestsBus(bus.Broadcast, "SaveAssetAs", FILE_PATH)
+ action = pyside_utils.find_child_by_pattern(menu_bar, {"type": QtWidgets.QAction, "iconText": "Save"})
+ action.trigger()
+ # wait till file is saved, to validate that check the text of QLabel at the bottom of the AssetEditor,
+ # if there are no unsaved changes we will not have any * in the text
+ label = asset_editor.findChild(QtWidgets.QLabel, "textEdit")
+ return helper.wait_for_condition(lambda: "*" not in label.text(), 3.0)
+
+ def expand_container_rows(object_name):
+ children = container.findChildren(QtWidgets.QFrame, object_name)
+ for child in children:
+ check_box = child.findChild(QtWidgets.QCheckBox)
+ if check_box and not check_box.isChecked():
+ QtTest.QTest.mouseClick(check_box, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier)
+
+ def node_palette_search(node_name):
+ search_box.setText(node_name)
+ helper.wait_for_condition(lambda: search_box.text() == node_name, 1.0)
+ # Try clicking ENTER in search box multiple times
+ for _ in range(20):
+ QtTest.QTest.keyClick(search_box, QtCore.Qt.Key_Enter, QtCore.Qt.NoModifier)
+ if pyside_utils.find_child_by_pattern(tree, {"text": node_name}) is not None:
+ break
+
+ def verify_added_params():
+ for index in range(N_VAR_TYPES):
+ if container.findChild(QtWidgets.QFrame, f"[{index}]") is None:
+ return False
+ return True
+
+ # 1) Open Asset Editor
+ general.idle_enable(True)
+ # Initially close the Asset Editor and then reopen to ensure we don't have any existing assets open
+ general.close_pane("Asset Editor")
+ general.open_pane("Asset Editor")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Asset Editor"), 5.0)
+
+ # 2) Initially create new Script Event file with one method
+ initialize_asset_editor_qt_objects()
+ action = pyside_utils.find_child_by_pattern(menu_bar, {"type": QtWidgets.QAction, "text": "Script Events"})
+ action.trigger()
+ result = helper.wait_for_condition(
+ lambda: container.findChild(QtWidgets.QFrame, "Events") is not None
+ and container.findChild(QtWidgets.QFrame, "Events").findChild(QtWidgets.QToolButton, "") is not None,
+ 3 * GENERAL_WAIT,
+ )
+ Report.result(Tests.new_event_created, result)
+
+ # 3) Add new method and set name to it
+ add_event = container.findChild(QtWidgets.QFrame, "Events").findChild(QtWidgets.QToolButton, "")
+ add_event.click()
+ result = helper.wait_for_condition(
+ lambda: asset_editor_widget.findChild(QtWidgets.QFrame, "EventName") is not None, GENERAL_WAIT
+ )
+ Report.result(Tests.child_event_created, result)
+ expand_container_rows("EventName")
+ expand_container_rows("Name")
+ initialize_asset_editor_qt_objects()
+ children = container.findChildren(QtWidgets.QFrame, "Name")
+ for child in children:
+ line_edit = child.findChild(QtWidgets.QLineEdit)
+ if line_edit is not None and line_edit.text() == "MethodName":
+ line_edit.setText(TEST_METHOD_NAME)
+
+ # 4) Add new parameters of each type
+ helper.wait_for_condition(lambda: container.findChild(QtWidgets.QFrame, "Parameters") is not None, 2.0)
+ parameters = container.findChild(QtWidgets.QFrame, "Parameters")
+ add_param = parameters.findChild(QtWidgets.QToolButton, "")
+ for _ in range(N_VAR_TYPES):
+ add_param.click()
+
+ # 5) Verify if parameters are added
+ result = helper.wait_for_condition(verify_added_params, 3.0)
+ Report.result(Tests.params_added, result)
+
+ # 6) Expand the parameter rows (to render QFrame 'Type' for each param)
+ for index in range(N_VAR_TYPES):
+ expand_container_rows(f"[{index}]")
+
+ # 7) Set different names and datatypes for each parameter
+ expand_container_rows("Name")
+ children = container.findChildren(QtWidgets.QFrame, "Name")
+ index = 0
+ for child in children:
+ line_edit = child.findChild(QtWidgets.QLineEdit)
+ if line_edit is not None and line_edit.text() == "ParameterName":
+ line_edit.setText(f"param_{index}")
+ index += 1
+
+ children = container.findChildren(QtWidgets.QFrame, "Type")
+ index = 0
+ for child in children:
+ combo_box = child.findChild(QtWidgets.QComboBox)
+ if combo_box is not None and index < N_VAR_TYPES:
+ combo_box.setCurrentIndex(index)
+ index += 1
+
+ # 8) Save file and verify node in SC Node Palette
+ Report.result(Tests.file_saved, save_file())
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
+ initialize_sc_qt_objects()
+ node_palette_search(TEST_METHOD_NAME)
+ get_node_index = lambda: pyside_utils.find_child_by_pattern(tree, {"text": TEST_METHOD_NAME}) is not None
+ result = helper.wait_for_condition(get_node_index, 2.0)
+ Report.result(Tests.node_found, result)
+
+ # 9) Close Asset Editor
+ general.close_pane("Asset Editor")
+ general.close_pane("Script Canvas")
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(ScriptEvents_AllParamDatatypes_CreationSuccess)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_Default_SendReceiveSuccessfully.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_Default_SendReceiveSuccessfully.py
new file mode 100644
index 0000000000..e0730b284c
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_Default_SendReceiveSuccessfully.py
@@ -0,0 +1,105 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ level_created = ("Successfully created temporary level", "Failed to create temporary level")
+ entity_created = ("Successfully created test entity", "Failed to create test entity")
+ enter_game_mode = ("Successfully entered game mode", "Failed to enter game mode")
+ lines_found = ("Successfully found expected message", "Failed to find expected message")
+ exit_game_mode = ("Successfully exited game mode", "Failed to exit game mode")
+# fmt: on
+
+
+def ScriptEvents_Default_SendReceiveSuccessfully():
+ """
+ Summary:
+ An entity exists in the level that contains a Script Canvas component. In the graph is both a Send Event
+ and a Receive Event.
+
+ Expected Behavior:
+ After entering game mode the graph on the entity should print an expected message to the console
+
+ Test Steps:
+ 1) Create test level
+ 2) Create test entity
+ 3) Start Tracer
+ 4) Enter Game Mode
+ 5) Read for line
+ 6) Exit Game Mode
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ import os
+ from editor_entity_utils import EditorEntity as Entity
+ from utils import Report
+ from utils import TestHelper as helper
+ from utils import Tracer
+
+ import azlmbr.legacy.general as general
+ import azlmbr.asset as asset
+ import azlmbr.math as math
+ import azlmbr.bus as bus
+
+ LEVEL_NAME = "tmp_level"
+ WAIT_TIME = 3.0 # SECONDS
+ EXPECTED_LINES = ["T92567320: Message Received"]
+ SC_ASSET_PATH = os.path.join("ScriptCanvas", "T92567320.scriptcanvas")
+
+ def create_editor_entity(name, sc_asset):
+ entity = Entity.create_editor_entity(name)
+ sc_comp = entity.add_component("Script Canvas")
+ asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", sc_asset, math.Uuid(), False)
+ sc_comp.set_component_property_value("Script Canvas Asset|Script Canvas Asset", asset_id)
+ Report.critical_result(Tests.entity_created, entity.id.isValid())
+
+ def locate_expected_lines(line_list: list):
+ found_lines = [printInfo.message.strip() for printInfo in section_tracer.prints]
+
+ return all(line in found_lines for line in line_list)
+
+ # 1) Create temp level
+ general.idle_enable(True)
+ result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
+ Report.critical_result(Tests.level_created, result == 0)
+ helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
+ general.close_pane("Error Report")
+
+ # 2) Create test entity
+ create_editor_entity("TestEntity", SC_ASSET_PATH)
+
+ # 3) Start Tracer
+ with Tracer() as section_tracer:
+
+ # 4) Enter Game Mode
+ helper.enter_game_mode(Tests.enter_game_mode)
+
+ # 5) Read for line
+ lines_located = helper.wait_for_condition(lambda: locate_expected_lines(EXPECTED_LINES), WAIT_TIME)
+ Report.result(Tests.lines_found, lines_located)
+
+ # 6) Exit Game Mode
+ helper.exit_game_mode(Tests.exit_game_mode)
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(ScriptEvents_Default_SendReceiveSuccessfully)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_HappyPath_SendReceiveAcrossMultiple.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_HappyPath_SendReceiveAcrossMultiple.py
new file mode 100644
index 0000000000..be2665899f
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_HappyPath_SendReceiveAcrossMultiple.py
@@ -0,0 +1,116 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ level_created = ("Successfully created temporary level", "Failed to create temporary level")
+ entitya_created = ("Successfully created EntityA", "Failed to create EntityA")
+ entityb_created = ("Successfully created EntityB", "Failed to create EntityB")
+ enter_game_mode = ("Successfully entered game mode", "Failed to enter game mode")
+ lines_found = ("Successfully found expected message", "Failed to find expected message")
+ exit_game_mode = ("Successfully exited game mode", "Failed to exit game mode")
+# fmt: on
+
+
+def ScriptEvents_HappyPath_SendReceiveAcrossMultiple():
+ """
+ Summary:
+ EntityA and EntityB will be created in a level. Attached to both will be a Script Canvas component.
+ The Script Event created for the test will be sent from EntityA to EntityB.
+
+ Expected Behavior:
+ The output of the Script Event should be printed to the console
+
+ Test Steps:
+ 1) Create test level
+ 2) Create EntityA/EntityB (add scriptcanvas files part of entity setup)
+ 3) Start Tracer
+ 4) Enter Game Mode
+ 5) Read for line
+ 6) Exit Game Mode
+
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ import os
+
+ from editor_entity_utils import EditorEntity as Entity
+ from utils import Report
+ from utils import TestHelper as helper
+ from utils import Tracer
+
+ import azlmbr.legacy.general as general
+
+ LEVEL_NAME = "tmp_level"
+ WAIT_TIME = 3.0
+ ASSET_PREFIX = "T92567321"
+ asset_paths = {
+ "event": os.path.join("TestAssets", f"{ASSET_PREFIX}.scriptevents"),
+ "assetA": os.path.join("ScriptCanvas", f"{ASSET_PREFIX}A.scriptcanvas"),
+ "assetB": os.path.join("ScriptCanvas", f"{ASSET_PREFIX}B.scriptcanvas"),
+ }
+ sc_for_entities = {"EntityA": asset_paths["assetA"], "EntityB": asset_paths["assetB"]}
+ EXPECTED_LINES = ["Incoming Message Received"]
+
+ def get_asset(asset_path):
+ return azlmbr.asset.AssetCatalogRequestBus(
+ azlmbr.bus.Broadcast, "GetAssetIdByPath", asset_path, azlmbr.math.Uuid(), False
+ )
+
+ def create_editor_entity(name, sc_asset):
+ entity = Entity.create_editor_entity(name)
+ sc_comp = entity.add_component("Script Canvas")
+ sc_comp.set_component_property_value("Script Canvas Asset|Script Canvas Asset", get_asset(sc_asset))
+ Report.critical_result(Tests.__dict__[name.lower() + "_created"], entity.id.isValid())
+
+ def locate_expected_lines(line_list: list):
+ found_lines = [printInfo.message.strip() for printInfo in section_tracer.prints]
+
+ return all(line in found_lines for line in line_list)
+
+ # 1) Create temp level
+ general.idle_enable(True)
+ result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
+ Report.critical_result(Tests.level_created, result == 0)
+ helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
+ general.close_pane("Error Report")
+
+ # 2) Create EntityA/EntityB
+ for key in sc_for_entities.keys():
+ create_editor_entity(key, sc_for_entities[key])
+
+ # 3) Start Tracer
+ with Tracer() as section_tracer:
+
+ # 4) Enter Game Mode
+ helper.enter_game_mode(Tests.enter_game_mode)
+
+ # 5) Read for line
+ lines_located = helper.wait_for_condition(lambda: locate_expected_lines(EXPECTED_LINES), WAIT_TIME)
+ Report.result(Tests.lines_found, lines_located)
+
+ # 6) Exit Game Mode
+ helper.exit_game_mode(Tests.exit_game_mode)
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(ScriptEvents_HappyPath_SendReceiveAcrossMultiple)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_ReturnSetType_Successfully.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_ReturnSetType_Successfully.py
new file mode 100644
index 0000000000..ee63684ace
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_ReturnSetType_Successfully.py
@@ -0,0 +1,111 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+Test Case Title: Event can return a value of set type successfully
+"""
+
+
+# fmt: off
+class Tests():
+ level_created = ("Successfully created temporary level", "Failed to create temporary level")
+ entity_created = ("Successfully created test entity", "Failed to create test entity")
+ enter_game_mode = ("Successfully entered game mode", "Failed to enter game mode")
+ lines_found = ("Successfully found expected message", "Failed to find expected message")
+ exit_game_mode = ("Successfully exited game mode", "Failed to exit game mode")
+# fmt: on
+
+
+def ScriptEvents_ReturnSetType_Successfully():
+ """
+ Summary: A temporary level is created with an Entity having ScriptCanvas component.
+ ScriptEvent(T92569006_ScriptEvent.scriptevents) is created with one Method that has a return value.
+ ScriptCanvas(T92569006_ScriptCanvas.scriptcanvas) is attached to Entity. Graph has Send node that sends the Method
+ of the ScriptEvent and prints the returned result ( On Entity Activated -> Send node -> Print) and Receive node is
+ set to return custom value ( Receive node -> Print).
+ Verify that the entity containing T92569006_ScriptCanvas.scriptcanvas should print the custom value set in both
+ Send and Receive nodes.
+
+ Expected Behavior:
+ After entering game mode, the graph on the entity should print an expected message to the console
+
+ Test Steps:
+ 1) Create test level
+ 2) Create test entity
+ 3) Start Tracer
+ 4) Enter Game Mode
+ 5) Read for line
+ 6) Exit Game Mode
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+ import os
+ from editor_entity_utils import EditorEntity as Entity
+ from utils import Report
+ from utils import TestHelper as helper
+ from utils import Tracer
+
+ import azlmbr.legacy.general as general
+ import azlmbr.asset as asset
+ import azlmbr.math as math
+ import azlmbr.bus as bus
+
+ LEVEL_NAME = "tmp_level"
+ WAIT_TIME = 3.0 # SECONDS
+ EXPECTED_LINES = ["T92569006_ScriptEvent_Sent", "T92569006_ScriptEvent_Received"]
+ SC_ASSET_PATH = os.path.join("ScriptCanvas", "T92569006_ScriptCanvas.scriptcanvas")
+
+ def create_editor_entity(name, sc_asset):
+ entity = Entity.create_editor_entity(name)
+ sc_comp = entity.add_component("Script Canvas")
+ asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", sc_asset, math.Uuid(), False)
+ sc_comp.set_component_property_value("Script Canvas Asset|Script Canvas Asset", asset_id)
+ Report.critical_result(Tests.entity_created, entity.id.isValid())
+
+ def locate_expected_lines(line_list: list):
+ found_lines = [printInfo.message.strip() for printInfo in section_tracer.prints]
+
+ return all(line in found_lines for line in line_list)
+
+ # 1) Create temp level
+ general.idle_enable(True)
+ result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
+ Report.critical_result(Tests.level_created, result == 0)
+ helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
+ general.close_pane("Error Report")
+
+ # 2) Create test entity
+ create_editor_entity("TestEntity", SC_ASSET_PATH)
+
+ # 3) Start Tracer
+ with Tracer() as section_tracer:
+
+ # 4) Enter Game Mode
+ helper.enter_game_mode(Tests.enter_game_mode)
+
+ # 5) Read for line
+ lines_located = helper.wait_for_condition(lambda: locate_expected_lines(EXPECTED_LINES), WAIT_TIME)
+ Report.result(Tests.lines_found, lines_located)
+
+ # 6) Exit Game Mode
+ helper.exit_game_mode(Tests.exit_game_mode)
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(ScriptEvents_ReturnSetType_Successfully)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_SendReceiveAcrossMultiple.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_SendReceiveAcrossMultiple.py
deleted file mode 100644
index d671229cdf..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_SendReceiveAcrossMultiple.py
+++ /dev/null
@@ -1,120 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: T92567321
-Test Case Title: Script Events: Can send and receive a script event across multiple entities successfully
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92567321
-"""
-
-
-# fmt: off
-class Tests():
- level_created = ("Successfully created temporary level", "Failed to create temporary level")
- entitya_created = ("Successfully created EntityA", "Failed to create EntityA")
- entityb_created = ("Successfully created EntityB", "Failed to create EntityB")
- enter_game_mode = ("Successfully entered game mode", "Failed to enter game mode")
- lines_found = ("Successfully found expected message", "Failed to find expected message")
- exit_game_mode = ("Successfully exited game mode", "Failed to exit game mode")
-# fmt: on
-
-
-def ScriptEvents_SendReceiveAcrossMultiple():
- """
- Summary:
- EntityA and EntityB will be created in a level. Attached to both will be a Script Canvas component. The Script Event created for the test will be sent from EntityA to EntityB.
-
- Expected Behavior:
- The output of the Script Event should be printed to the console
-
- Test Steps:
- 1) Create test level
- 2) Create EntityA/EntityB (add scriptcanvas files part of entity setup)
- 3) Start Tracer
- 4) Enter Game Mode
- 5) Read for line
- 6) Exit Game Mode
-
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
- import os
-
- from editor_entity_utils import EditorEntity as Entity
- from utils import Report
- from utils import TestHelper as helper
- from utils import Tracer
-
- import azlmbr.legacy.general as general
-
- LEVEL_NAME = "tmp_level"
- WAIT_TIME = 3.0
- ASSET_PREFIX = "T92567321"
- asset_paths = {
- "event": os.path.join("TestAssets", f"{ASSET_PREFIX}.scriptevents"),
- "assetA": os.path.join("ScriptCanvas", f"{ASSET_PREFIX}A.scriptcanvas"),
- "assetB": os.path.join("ScriptCanvas", f"{ASSET_PREFIX}B.scriptcanvas"),
- }
- sc_for_entities = {
- "EntityA": asset_paths["assetA"],
- "EntityB": asset_paths["assetB"]
- }
- EXPECTED_LINES = ["Incoming Message Received"]
-
- def get_asset(asset_path):
- return azlmbr.asset.AssetCatalogRequestBus(azlmbr.bus.Broadcast, "GetAssetIdByPath", asset_path, azlmbr.math.Uuid(), False)
-
- def create_editor_entity(name, sc_asset):
- entity = Entity.create_editor_entity(name)
- sc_comp = entity.add_component("Script Canvas")
- sc_comp.set_component_property_value("Script Canvas Asset|Script Canvas Asset", get_asset(sc_asset))
- Report.critical_result(Tests.__dict__[name.lower()+"_created"], entity.id.isValid())
-
- def locate_expected_lines(line_list: list):
- found_lines = [printInfo.message.strip() for printInfo in section_tracer.prints]
-
- return all(line in found_lines for line in line_list)
-
- # 1) Create temp level
- general.idle_enable(True)
- result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
- Report.critical_result(Tests.level_created, result == 0)
- helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
- general.close_pane("Error Report")
-
- # 2) Create EntityA/EntityB
- for key in sc_for_entities.keys():
- create_editor_entity(key, sc_for_entities[key])
-
- # 3) Start Tracer
- with Tracer() as section_tracer:
-
- # 4) Enter Game Mode
- helper.enter_game_mode(Tests.enter_game_mode)
-
- # 5) Read for line
- lines_located = helper.wait_for_condition(lambda: locate_expected_lines(EXPECTED_LINES), WAIT_TIME)
- Report.result(Tests.lines_found, lines_located)
-
- # 6) Exit Game Mode
- helper.exit_game_mode(Tests.exit_game_mode)
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
- imports.init()
-
- from utils import Report
-
- Report.start_test(ScriptEvents_SendReceiveAcrossMultiple)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_SendReceiveSuccessfully.py b/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_SendReceiveSuccessfully.py
deleted file mode 100644
index b5e26d14ae..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/ScriptEvents_SendReceiveSuccessfully.py
+++ /dev/null
@@ -1,110 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: T92567320
-Test Case Title: Script Events: Can send and receive a script event successfully
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92567320
-"""
-
-
-# fmt: off
-class Tests():
- level_created = ("Successfully created temporary level", "Failed to create temporary level")
- entity_created = ("Successfully created test entity", "Failed to create test entity")
- enter_game_mode = ("Successfully entered game mode", "Failed to enter game mode")
- lines_found = ("Successfully found expected message", "Failed to find expected message")
- exit_game_mode = ("Successfully exited game mode", "Failed to exit game mode")
-# fmt: on
-
-
-def ScriptEvents_SendReceiveSuccessfully():
- """
- Summary:
- An entity exists in the level that contains a Script Canvas component. In the graph is both a Send Event
- and a Receive Event.
-
- Expected Behavior:
- After entering game mode the graph on the entity should print an expected message to the console
-
- Test Steps:
- 1) Create test level
- 2) Create test entity
- 3) Start Tracer
- 4) Enter Game Mode
- 5) Read for line
- 6) Exit Game Mode
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
- import os
- from editor_entity_utils import EditorEntity as Entity
- from utils import Report
- from utils import TestHelper as helper
- from utils import Tracer
-
- import azlmbr.legacy.general as general
- import azlmbr.asset as asset
- import azlmbr.math as math
- import azlmbr.bus as bus
-
- LEVEL_NAME = "tmp_level"
- WAIT_TIME = 3.0 # SECONDS
- EXPECTED_LINES = ["T92567320: Message Received"]
- SC_ASSET_PATH = os.path.join("ScriptCanvas", "T92567320.scriptcanvas")
-
- def create_editor_entity(name, sc_asset):
- entity = Entity.create_editor_entity(name)
- sc_comp = entity.add_component("Script Canvas")
- asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", sc_asset, math.Uuid(), False)
- sc_comp.set_component_property_value("Script Canvas Asset|Script Canvas Asset", asset_id)
- Report.critical_result(Tests.entity_created, entity.id.isValid())
-
- def locate_expected_lines(line_list: list):
- found_lines = [printInfo.message.strip() for printInfo in section_tracer.prints]
-
- return all(line in found_lines for line in line_list)
-
- # 1) Create temp level
- general.idle_enable(True)
- result = general.create_level_no_prompt(LEVEL_NAME, 128, 1, 512, True)
- Report.critical_result(Tests.level_created, result == 0)
- helper.wait_for_condition(lambda: general.get_current_level_name() == LEVEL_NAME, WAIT_TIME)
- general.close_pane("Error Report")
-
- # 2) Create test entity
- create_editor_entity("TestEntity", SC_ASSET_PATH)
-
- # 3) Start Tracer
- with Tracer() as section_tracer:
-
- # 4) Enter Game Mode
- helper.enter_game_mode(Tests.enter_game_mode)
-
- # 5) Read for line
- lines_located = helper.wait_for_condition(lambda: locate_expected_lines(EXPECTED_LINES), WAIT_TIME)
- Report.result(Tests.lines_found, lines_located)
-
- # 6) Exit Game Mode
- helper.exit_game_mode(Tests.exit_game_mode)
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
-
- from utils import Report
-
- Report.start_test(ScriptEvents_SendReceiveSuccessfully)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Active.py b/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Active.py
deleted file mode 100755
index d87f2986bf..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Active.py
+++ /dev/null
@@ -1,254 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-"""
-
-import pytest
-import os
-import sys
-sys.path.append(os.path.dirname(__file__))
-
-import ImportPathHelper as imports
-imports.init()
-
-import hydra_test_utils as hydra
-import ly_test_tools.environment.file_system as file_system
-from ly_test_tools import LAUNCHERS
-from base import TestAutomationBase
-
-TEST_DIRECTORY = os.path.dirname(__file__)
-
-
-@pytest.mark.SUITE_periodic
-@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
-@pytest.mark.parametrize("project", ["AutomatedTesting"])
-class TestAutomation(TestAutomationBase):
- @pytest.mark.test_case_id("C1702834", "C1702823")
- def test_Opening_Closing_Pane(self, request, workspace, editor, launcher_platform):
- from . import Opening_Closing_Pane as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("C1702824")
- def test_Docking_Pane(self, request, workspace, editor, launcher_platform):
- from . import Docking_Pane as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("C1702829")
- def test_Resizing_Pane(self, request, workspace, editor, launcher_platform):
- from . import Resizing_Pane as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("T92563190")
- @pytest.mark.parametrize("level", ["tmp_level"])
- def test_ScriptCanvas_TwoComponents(self, request, workspace, editor, launcher_platform, level):
- def teardown():
- file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
- request.addfinalizer(teardown)
- file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
- from . import ScriptCanvas_TwoComponents as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("T92562986")
- @pytest.mark.parametrize("level", ["tmp_level"])
- def test_ScriptCanvas_ChangingAssets(self, request, workspace, editor, launcher_platform, project, level):
- def teardown():
- file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
- request.addfinalizer(teardown)
- file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
- from . import ScriptCanvas_ChangingAssets as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("T92569079", "T92569081")
- def test_Graph_ZoomInZoomOut(self, request, workspace, editor, launcher_platform):
- from . import Graph_ZoomInZoomOut as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("T92568940")
- def test_NodePalette_SelectNode(self, request, workspace, editor, launcher_platform):
- from . import NodePalette_SelectNode as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("T92569253")
- @pytest.mark.test_case_id("T92569254")
- @pytest.mark.parametrize("level", ["tmp_level"])
- def test_OnEntityActivatedDeactivated_PrintMessage(self, request, workspace, editor, launcher_platform, project, level):
- def teardown():
- file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
- request.addfinalizer(teardown)
- file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
- from . import OnEntityActivatedDeactivated_PrintMessage as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("T92562993")
- def test_NodePalette_ClearSelection(self, request, workspace, editor, launcher_platform, project):
- from . import NodePalette_ClearSelection as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("T92563191")
- @pytest.mark.parametrize("level", ["tmp_level"])
- def test_ScriptCanvas_TwoEntities(self, request, workspace, editor, launcher_platform, project, level):
- def teardown():
- file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
- request.addfinalizer(teardown)
- file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
- from . import ScriptCanvas_TwoEntities as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("T92569013")
- def test_AssetEditor_CreateScriptEventFile(self, request, workspace, editor, launcher_platform, project):
- def teardown():
- file_system.delete(
- [os.path.join(workspace.paths.project(), "ScriptCanvas", "test_file.scriptevent")], True, True
- )
- request.addfinalizer(teardown)
- file_system.delete(
- [os.path.join(workspace.paths.project(), "ScriptCanvas", "test_file.scriptevent")], True, True
- )
- from . import AssetEditor_CreateScriptEventFile as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("T92569165", "T92569167", "T92569168", "T92569170")
- def test_Toggle_ScriptCanvasTools(self, request, workspace, editor, launcher_platform):
- from . import Toggle_ScriptCanvasTools as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("T92568982")
- def test_NodeInspector_RenameVariable(self, request, workspace, editor, launcher_platform, project):
- from . import NodeInspector_RenameVariable as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("T92569137")
- def test_Debugging_TargetMultipleGraphs(self, request, workspace, editor, launcher_platform, project):
- from . import Debugging_TargetMultipleGraphs as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("T92568856")
- @pytest.mark.parametrize("level", ["tmp_level"])
- def test_Debugging_TargetMultipleEntities(self, request, workspace, editor, launcher_platform, project, level):
- def teardown():
- file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
- request.addfinalizer(teardown)
- file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
- from . import Debugging_TargetMultipleEntities as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("T92569049", "T92569051")
- def test_EditMenu_UndoRedo(self, request, workspace, editor, launcher_platform, project):
- from . import EditMenu_UndoRedo as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("C1702825", "C1702831")
- def test_UnDockedPane_CloseSCWindow(self, request, workspace, editor, launcher_platform):
- from . import UnDockedPane_CloseSCWindow as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("T92562978")
- @pytest.mark.parametrize("level", ["tmp_level"])
- def test_Entity_AddScriptCanvasComponent(self, request, workspace, editor, launcher_platform, project, level):
- def teardown():
- file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
- request.addfinalizer(teardown)
- file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
- from . import Entity_AddScriptCanvasComponent as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("C1702821", "C1702832")
- def test_Pane_RetainOnSCRestart(self, request, workspace, editor, launcher_platform):
- from . import Pane_RetainOnSCRestart as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("T92567321")
- @pytest.mark.parametrize("level", ["tmp_level"])
- def test_ScriptEvents_SendReceiveAcrossMultiple(self, request, workspace, editor, launcher_platform, project, level):
- def teardown():
- file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
- request.addfinalizer(teardown)
- file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
- from . import ScriptEvents_SendReceiveAcrossMultiple as test_module
- self._run_test(request, workspace, editor, test_module)
-
- @pytest.mark.test_case_id("T92567320")
- @pytest.mark.parametrize("level", ["tmp_level"])
- def test_ScriptEvents_SendReceiveSuccessfully(self, request, workspace, editor, launcher_platform, project, level):
- def teardown():
- file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
- request.addfinalizer(teardown)
- file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
- from . import ScriptEvents_SendReceiveSuccessfully as test_module
- self._run_test(request, workspace, editor, test_module)
-
-# NOTE: We had to use hydra_test_utils.py, as TestAutomationBase run_test method
-# fails because of pyside_utils import
-@pytest.mark.SUITE_periodic
-@pytest.mark.parametrize("launcher_platform", ["windows_editor"])
-@pytest.mark.parametrize("project", ["AutomatedTesting"])
-class TestScriptCanvasTests(object):
- """
- The following tests use hydra_test_utils.py to launch the editor and validate the results.
- """
-
- @pytest.mark.test_case_id("T92569037", "T92569039")
- def test_FileMenu_New_Open(self, request, editor, launcher_platform):
- expected_lines = [
- "File->New action working as expected: True",
- "File->Open action working as expected: True",
- ]
- hydra.launch_and_validate_results(
- request, TEST_DIRECTORY, editor, "FileMenu_New_Open.py", expected_lines, auto_test_mode=False, timeout=60,
- )
-
- @pytest.mark.test_case_id("T92568942")
- def test_AssetEditor_NewScriptEvent(self, request, editor, launcher_platform):
- expected_lines = [
- "New Script event action found: True",
- "Asset Editor opened: True",
- "Asset Editor created with new asset: True",
- "New Script event created in Asset Editor: True",
- ]
- hydra.launch_and_validate_results(
- request,
- TEST_DIRECTORY,
- editor,
- "AssetEditor_NewScriptEvent.py",
- expected_lines,
- auto_test_mode=False,
- timeout=60,
- )
-
- @pytest.mark.test_case_id("T92563068", "T92563070")
- def test_GraphClose_SavePrompt(self, request, editor, launcher_platform):
- expected_lines = [
- "New graph created: True",
- "Save prompt opened as expected: True",
- "Close button worked as expected: True",
- ]
- hydra.launch_and_validate_results(
- request,
- TEST_DIRECTORY,
- editor,
- "GraphClose_SavePrompt.py",
- expected_lines,
- auto_test_mode=False,
- timeout=60,
- )
-
- @pytest.mark.test_case_id("T92564789", "T92568873")
- def test_VariableManager_CreateDeleteVars(self, request, editor, launcher_platform):
- var_types = ["Boolean", "Color", "EntityID", "Number", "String", "Transform", "Vector2", "Vector3", "Vector4"]
- expected_lines = [f"Success: {var_type} variable is created" for var_type in var_types]
- expected_lines.extend([f"Success: {var_type} variable is deleted" for var_type in var_types])
- hydra.launch_and_validate_results(
- request,
- TEST_DIRECTORY,
- editor,
- "VariableManager_CreateDeleteVars.py",
- expected_lines,
- auto_test_mode=False,
- timeout=60,
- )
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Periodic.py b/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Periodic.py
new file mode 100755
index 0000000000..e3a8d874da
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Periodic.py
@@ -0,0 +1,354 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+import pytest
+import os
+import sys
+sys.path.append(os.path.dirname(__file__))
+
+import ImportPathHelper as imports
+imports.init()
+
+import hydra_test_utils as hydra
+import ly_test_tools.environment.file_system as file_system
+from ly_test_tools import LAUNCHERS
+from base import TestAutomationBase
+
+TEST_DIRECTORY = os.path.dirname(__file__)
+
+
+@pytest.mark.SUITE_periodic
+@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+class TestAutomation(TestAutomationBase):
+ def test_Pane_HappyPath_OpenCloseSuccessfully(self, request, workspace, editor, launcher_platform):
+ from . import Pane_HappyPath_OpenCloseSuccessfully as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_Pane_HappyPath_DocksProperly(self, request, workspace, editor, launcher_platform):
+ from . import Pane_HappyPath_DocksProperly as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_Pane_HappyPath_ResizesProperly(self, request, workspace, editor, launcher_platform):
+ from . import Pane_HappyPath_ResizesProperly as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ @pytest.mark.parametrize("level", ["tmp_level"])
+ def test_ScriptCanvas_TwoComponents_InteractSuccessfully(self, request, workspace, editor, launcher_platform, level):
+ def teardown():
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ request.addfinalizer(teardown)
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ from . import ScriptCanvas_TwoComponents_InteractSuccessfully as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ @pytest.mark.parametrize("level", ["tmp_level"])
+ def test_ScriptCanvas_ChangingAssets_ComponentStable(self, request, workspace, editor, launcher_platform, project, level):
+ def teardown():
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ request.addfinalizer(teardown)
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ from . import ScriptCanvas_ChangingAssets_ComponentStable as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_Graph_HappyPath_ZoomInZoomOut(self, request, workspace, editor, launcher_platform):
+ from . import Graph_HappyPath_ZoomInZoomOut as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_NodePalette_HappyPath_CanSelectNode(self, request, workspace, editor, launcher_platform):
+ from . import NodePalette_HappyPath_CanSelectNode as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ @pytest.mark.parametrize("level", ["tmp_level"])
+ def test_ScriptCanvasComponent_OnEntityActivatedDeactivated_PrintMessage(self, request, workspace, editor, launcher_platform, project, level):
+ def teardown():
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ request.addfinalizer(teardown)
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ from . import ScriptCanvasComponent_OnEntityActivatedDeactivated_PrintMessage as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_NodePalette_HappyPath_ClearSelection(self, request, workspace, editor, launcher_platform, project):
+ from . import NodePalette_HappyPath_ClearSelection as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ @pytest.mark.parametrize("level", ["tmp_level"])
+ def test_ScriptCanvas_TwoEntities_UseSimultaneously(self, request, workspace, editor, launcher_platform, project, level):
+ def teardown():
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ request.addfinalizer(teardown)
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ from . import ScriptCanvas_TwoEntities_UseSimultaneously as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_ScriptEvent_HappyPath_CreatedWithoutError(self, request, workspace, editor, launcher_platform, project):
+ def teardown():
+ file_system.delete(
+ [os.path.join(workspace.paths.project(), "ScriptCanvas", "test_file.scriptevent")], True, True
+ )
+ request.addfinalizer(teardown)
+ file_system.delete(
+ [os.path.join(workspace.paths.project(), "ScriptCanvas", "test_file.scriptevent")], True, True
+ )
+ from . import ScriptEvent_HappyPath_CreatedWithoutError as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_ScriptCanvasTools_Toggle_OpenCloseSuccess(self, request, workspace, editor, launcher_platform):
+ from . import ScriptCanvasTools_Toggle_OpenCloseSuccess as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_NodeInspector_HappyPath_VariableRenames(self, request, workspace, editor, launcher_platform, project):
+ from . import NodeInspector_HappyPath_VariableRenames as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_Debugger_HappyPath_TargetMultipleGraphs(self, request, workspace, editor, launcher_platform, project):
+ from . import Debugger_HappyPath_TargetMultipleGraphs as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ @pytest.mark.parametrize("level", ["tmp_level"])
+ def test_Debugger_HappyPath_TargetMultipleEntities(self, request, workspace, editor, launcher_platform, project, level):
+ def teardown():
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ request.addfinalizer(teardown)
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ from . import Debugger_HappyPath_TargetMultipleEntities as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_EditMenu_Default_UndoRedo(self, request, workspace, editor, launcher_platform, project):
+ from . import EditMenu_Default_UndoRedo as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_Pane_Undocked_ClosesSuccessfully(self, request, workspace, editor, launcher_platform):
+ from . import Pane_Undocked_ClosesSuccessfully as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ @pytest.mark.parametrize("level", ["tmp_level"])
+ def test_Entity_HappyPath_AddScriptCanvasComponent(self, request, workspace, editor, launcher_platform, project, level):
+ def teardown():
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ request.addfinalizer(teardown)
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ from . import Entity_HappyPath_AddScriptCanvasComponent as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_Pane_Default_RetainOnSCRestart(self, request, workspace, editor, launcher_platform):
+ from . import Pane_Default_RetainOnSCRestart as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ @pytest.mark.parametrize("level", ["tmp_level"])
+ def test_ScriptEvents_HappyPath_SendReceiveAcrossMultiple(self, request, workspace, editor, launcher_platform, project, level):
+ def teardown():
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ request.addfinalizer(teardown)
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ from . import ScriptEvents_HappyPath_SendReceiveAcrossMultiple as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ @pytest.mark.parametrize("level", ["tmp_level"])
+ def test_ScriptEvents_Default_SendReceiveSuccessfully(self, request, workspace, editor, launcher_platform, project, level):
+ def teardown():
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ request.addfinalizer(teardown)
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ from . import ScriptEvents_Default_SendReceiveSuccessfully as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ @pytest.mark.parametrize("level", ["tmp_level"])
+ def test_ScriptEvents_ReturnSetType_Successfully(self, request, workspace, editor, launcher_platform, project, level):
+ def teardown():
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ request.addfinalizer(teardown)
+ file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True)
+ from . import ScriptEvents_ReturnSetType_Successfully as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_NodeCategory_ExpandOnClick(self, request, workspace, editor, launcher_platform):
+ from . import NodeCategory_ExpandOnClick as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_NodePalette_SearchText_Deletion(self, request, workspace, editor, launcher_platform):
+ from . import NodePalette_SearchText_Deletion as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_VariableManager_UnpinVariableType_Works(self, request, workspace, editor, launcher_platform):
+ from . import VariableManager_UnpinVariableType_Works as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_Node_HappyPath_DuplicateNode(self, request, workspace, editor, launcher_platform):
+ from . import Node_HappyPath_DuplicateNode as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+ def test_ScriptEvent_AddRemoveParameter_ActionsSuccessful(self, request, workspace, editor, launcher_platform):
+ def teardown():
+ file_system.delete(
+ [os.path.join(workspace.paths.project(), "ScriptCanvas", "test_file.scriptevent")], True, True
+ )
+ request.addfinalizer(teardown)
+ file_system.delete(
+ [os.path.join(workspace.paths.project(), "ScriptCanvas", "test_file.scriptevent")], True, True
+ )
+ from . import ScriptEvent_AddRemoveParameter_ActionsSuccessful as test_module
+ self._run_test(request, workspace, editor, test_module)
+
+# NOTE: We had to use hydra_test_utils.py, as TestAutomationBase run_test method
+# fails because of pyside_utils import
+@pytest.mark.SUITE_periodic
+@pytest.mark.parametrize("launcher_platform", ["windows_editor"])
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+class TestScriptCanvasTests(object):
+ """
+ The following tests use hydra_test_utils.py to launch the editor and validate the results.
+ """
+
+ def test_FileMenu_Default_NewAndOpen(self, request, editor, launcher_platform):
+ expected_lines = [
+ "File->New action working as expected: True",
+ "File->Open action working as expected: True",
+ ]
+ hydra.launch_and_validate_results(
+ request, TEST_DIRECTORY, editor, "FileMenu_Default_NewAndOpen.py", expected_lines, auto_test_mode=False, timeout=60,
+ )
+
+ def test_NewScriptEventButton_HappyPath_ContainsSCCategory(self, request, editor, launcher_platform):
+ expected_lines = [
+ "New Script event action found: True",
+ "Asset Editor opened: True",
+ "Asset Editor created with new asset: True",
+ "New Script event created in Asset Editor: True",
+ ]
+ hydra.launch_and_validate_results(
+ request,
+ TEST_DIRECTORY,
+ editor,
+ "NewScriptEventButton_HappyPath_ContainsSCCategory.py",
+ expected_lines,
+ auto_test_mode=False,
+ timeout=60,
+ )
+
+ def test_GraphClose_Default_SavePrompt(self, request, editor, launcher_platform):
+ expected_lines = [
+ "New graph created: True",
+ "Save prompt opened as expected: True",
+ "Close button worked as expected: True",
+ ]
+ hydra.launch_and_validate_results(
+ request,
+ TEST_DIRECTORY,
+ editor,
+ "GraphClose_Default_SavePrompt.py",
+ expected_lines,
+ auto_test_mode=False,
+ timeout=60,
+ )
+
+ def test_VariableManager_Default_CreateDeleteVars(self, request, editor, launcher_platform):
+ var_types = ["Boolean", "Color", "EntityID", "Number", "String", "Transform", "Vector2", "Vector3", "Vector4"]
+ expected_lines = [f"Success: {var_type} variable is created" for var_type in var_types]
+ expected_lines.extend([f"Success: {var_type} variable is deleted" for var_type in var_types])
+ hydra.launch_and_validate_results(
+ request,
+ TEST_DIRECTORY,
+ editor,
+ "VariableManager_Default_CreateDeleteVars.py",
+ expected_lines,
+ auto_test_mode=False,
+ timeout=60,
+ )
+
+ @pytest.mark.parametrize(
+ "config",
+ [
+ {
+ "cfg_args": "before_restart",
+ "expected_lines": [
+ "All the test panes are opened: True",
+ "Test pane 1 is closed: True",
+ "Location of test pane 2 changed successfully: True",
+ "Test pane 3 resized successfully: True",
+ ],
+ },
+ {
+ "cfg_args": "after_restart",
+ "expected_lines": [
+ "Test pane retained its visiblity on Editor restart: True",
+ "Test pane retained its location on Editor restart: True",
+ "Test pane retained its size on Editor restart: True",
+ ],
+ },
+ ],
+ )
+
+ def test_Pane_PropertiesChanged_RetainsOnRestart(self, request, editor, config, project, launcher_platform):
+ hydra.launch_and_validate_results(
+ request,
+ TEST_DIRECTORY,
+ editor,
+ "Pane_PropertiesChanged_RetainsOnRestart.py",
+ config.get('expected_lines'),
+ cfg_args=[config.get('cfg_args')],
+ auto_test_mode=False,
+ timeout=60,
+ )
+
+ def test_ScriptEvent_AddRemoveMethod_UpdatesInSC(self, request, workspace, editor, launcher_platform):
+ def teardown():
+ file_system.delete(
+ [os.path.join(workspace.paths.project(), "TestAssets", "test_file.scriptevents")], True, True
+ )
+ request.addfinalizer(teardown)
+ file_system.delete(
+ [os.path.join(workspace.paths.project(), "TestAssets", "test_file.scriptevents")], True, True
+ )
+ expected_lines = [
+ "Success: New Script Event created",
+ "Success: Initial Child Event created",
+ "Success: Second Child Event created",
+ "Success: Script event file saved",
+ "Success: Method added to scriptevent file",
+ "Success: Method removed from scriptevent file",
+ ]
+ hydra.launch_and_validate_results(
+ request,
+ TEST_DIRECTORY,
+ editor,
+ "ScriptEvent_AddRemoveMethod_UpdatesInSC.py",
+ expected_lines,
+ auto_test_mode=False,
+ timeout=60,
+ )
+
+ def test_ScriptEvents_AllParamDatatypes_CreationSuccess(self, request, workspace, editor, launcher_platform):
+ def teardown():
+ file_system.delete(
+ [os.path.join(workspace.paths.project(), "TestAssets", "test_file.scriptevents")], True, True
+ )
+ request.addfinalizer(teardown)
+ file_system.delete(
+ [os.path.join(workspace.paths.project(), "TestAssets", "test_file.scriptevents")], True, True
+ )
+ expected_lines = [
+ "Success: New Script Event created",
+ "Success: Child Event created",
+ "Success: New parameters added",
+ "Success: Script event file saved",
+ "Success: Node found in Script Canvas",
+ ]
+ hydra.launch_and_validate_results(
+ request,
+ TEST_DIRECTORY,
+ editor,
+ "ScriptEvents_AllParamDatatypes_CreationSuccess.py",
+ expected_lines,
+ auto_test_mode=False,
+ timeout=60,
+ )
+
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/Toggle_ScriptCanvasTools.py b/AutomatedTesting/Gem/PythonTests/scripting/Toggle_ScriptCanvasTools.py
deleted file mode 100644
index 4024e28277..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/Toggle_ScriptCanvasTools.py
+++ /dev/null
@@ -1,137 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: C92569165, C92569167, C92569168, C92569170
-Test Case Title: Tools > Node Palette toggles the Node Palette
- Tools > Node Inspector toggles the Node Inspector
- Tools > Bookmarks toggles the Bookmarks
- Tools > Variable Manager toggles the Variable Manager
-
-URLs of the test case: https://testrail.agscollab.com/index.php?/cases/view/92569165
- https://testrail.agscollab.com/index.php?/cases/view/92569167
- https://testrail.agscollab.com/index.php?/cases/view/92569168
- https://testrail.agscollab.com/index.php?/cases/view/92569170
-"""
-
-
-# fmt: off
-class Tests():
- node_palette_opened = ("NodePalette is opened successfully", "Failed to open NodePalette")
- node_inspector_opened = ("NodeInspector is opened successfully", "Failed to open NodeInspector")
- bookmark_opened = ("Bookmarks is opened successfully", "Failed to open Bookmarks")
- variable_manager_opened = ("VariableManager is opened successfully", "Failed to open VariableManager")
- node_palette_closed_by_start = ("NodePalette is closed successfully", "Failed to close NodePalette")
- node_inspector_closed_by_start = ("NodeInspector is closed successfully", "Failed to close NodeInspector")
- bookmark_closed_by_start = ("Bookmarks is closed successfully", "Failed to close Bookmarks")
- variable_manager_closed_by_start = ("VariableManager is closed successfully", "Failed to close VariableManager")
- node_palette_closed_by_end = ("NodePalette is closed successfully", "Failed to close NodePalette")
- node_inspector_closed_by_end = ("NodeInspector is closed successfully", "Failed to close NodeInspector")
- bookmark_closed_by_end = ("Bookmarks is closed successfully", "Failed to close Bookmarks")
- variable_manager_closed_by_end = ("VariableManager is closed successfully", "Failed to close VariableManager")
-# fmt: on
-
-
-def Toggle_ScriptCanvasTools():
- """
- Summary:
- Toggle Node Palette, Node Inspector, Bookmarks and Variable Manager in Script Canvas.
- Make sure each pane opens and closes successfully.
-
- Expected Behavior:
- Each pane opens and closes successfully.
-
- Test Steps:
- 1) Open Script Canvas window (Tools > Script Canvas)
- 2) Make sure Node Palette, Node Inspector, Bookmarks and Variable Manager panes are closed in Script Canvas window
- 3) Open Node Palette, Node Inspector, Bookmarks and Variable Manager in Script Canvas window
- 4) Close Node Palette, Node Inspector, Bookmarks and Variable Manager in Script Canvas window
- 5) Restore default layout
- 6) Close Script Canvas window
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- from utils import Report
- from utils import TestHelper as helper
- import pyside_utils
-
- # Open 3D Engine imports
- import azlmbr.legacy.general as general
-
- # Pyside imports
- from PySide2 import QtWidgets
-
- def click_menu_option(window, option_text):
- action = pyside_utils.find_child_by_pattern(window, {"text": option_text, "type": QtWidgets.QAction})
- action.trigger()
-
- def find_pane(window, pane_name):
- return window.findChild(QtWidgets.QDockWidget, pane_name)
-
- def close_tool(window, pane_widget, test_tuple):
- pane = find_pane(window, pane_widget)
- pane.close()
- Report.result(test_tuple, not pane.isVisible())
-
- def open_tool(window, pane_widget, tool, test_tuple):
- pane = find_pane(window, pane_widget)
- if not pane.isVisible():
- click_menu_option(window, tool)
- pane = find_pane(window, pane_widget)
- Report.result(test_tuple, pane.isVisible())
-
- # Test starts here
- general.idle_enable(True)
-
- # 1) Open Script Canvas window (Tools > Script Canvas)
- general.open_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
-
- # 2) Make sure Node Palette, Node Inspector, Bookmarks and Variable Manager panes are closed in Script Canvas window
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
- close_tool(sc, "NodePalette", Tests.node_palette_closed_by_start)
- close_tool(sc, "NodeInspector", Tests.node_inspector_closed_by_start)
- close_tool(sc, "BookmarkDockWidget", Tests.bookmark_closed_by_start)
- close_tool(sc, "VariableManager", Tests.variable_manager_closed_by_start)
-
- # 3) Open Node Palette, Node Inspector, Bookmarks and Variable Manager in Script Canvas window
- open_tool(sc, "NodePalette", "Node Palette", Tests.node_palette_opened)
- open_tool(sc, "NodeInspector", "Node Inspector", Tests.node_inspector_opened)
- open_tool(sc, "BookmarkDockWidget", "Bookmarks", Tests.bookmark_opened)
- open_tool(sc, "VariableManager", "Variable Manager", Tests.variable_manager_opened)
-
- # 4) Close Node Palette, Node Inspector, Bookmarks and Variable Manager in Script Canvas window
- close_tool(sc, "NodePalette", Tests.node_palette_closed_by_end)
- close_tool(sc, "NodeInspector", Tests.node_inspector_closed_by_end)
- close_tool(sc, "BookmarkDockWidget", Tests.bookmark_closed_by_end)
- close_tool(sc, "VariableManager", Tests.variable_manager_closed_by_end)
-
- # 5) Restore default layout
- # Need this step to restore to default in case of test failure
- click_menu_option(sc, "Restore Default Layout")
-
- # 6) Close Script Canvas window
- sc.close()
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
-
- from utils import Report
-
- Report.start_test(Toggle_ScriptCanvasTools)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/UnDockedPane_CloseSCWindow.py b/AutomatedTesting/Gem/PythonTests/scripting/UnDockedPane_CloseSCWindow.py
deleted file mode 100644
index 875f28ec95..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/UnDockedPane_CloseSCWindow.py
+++ /dev/null
@@ -1,128 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: C1702825 // C1702831
-Test Case Title: Undocking // Closing script canvas with the pane floating
-URLs of the test case: https://testrail.agscollab.com/index.php?/cases/view/1702825 &
- https://testrail.agscollab.com/index.php?/cases/view/1702831
-"""
-
-
-# fmt: off
-class Tests():
- undock_pane = ("Pane is undocked successfully", "Failed to undock pane")
- close_sc_window = ("Script Canvas window is closed", "Failed to close Script Canvas window")
- pane_closed = ("Pane is closed successfully", "Failed to close the pane")
-# fmt: on
-
-
-def UnDockedPane_CloseSCWindow():
- """
- Summary:
- The Script Canvas window is opened with one of the pane undocked.
- Verify if undocked pane closes upon closing Script canvas window.
-
- Expected Behavior:
- The undocked pane closes when Script Canvas window closed.
-
- Test Steps:
- 1) Open Script Canvas window (Tools > Script Canvas)
- 2) Undock Node Palette pane
- 3) Connect to Pane visibility signal emitter to verify pane closed
- 4) Close Script Canvas window
- 5) Restore default layout
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- # Helper imports
- from utils import Report
- from utils import TestHelper as helper
- import pyside_utils
-
- # Open 3D Engine imports
- import azlmbr.legacy.general as general
-
- # Pyside imports
- from PySide2 import QtWidgets
-
- TEST_PANE = "NodePalette" # Chosen most commonly used pane
-
- def click_menu_option(window, option_text):
- action = pyside_utils.find_child_by_pattern(window, {"text": option_text, "type": QtWidgets.QAction})
- action.trigger()
-
- def find_pane(window, pane_name):
- return window.findChild(QtWidgets.QDockWidget, pane_name)
-
- def on_top_level_changed():
- # This function has test condition always True since it gets emitted only when condition satisfied
- Report.result(Tests.undock_pane, True)
-
- def on_pane_closed():
- # This function has test condition always True since it gets emitted only when condition satisfied
- Report.result(Tests.pane_closed, True)
-
- # Test starts here
- general.idle_enable(True)
-
- # 1) Open Script Canvas window (Tools > Script Canvas)
- general.open_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
-
- # 2) Undock Node Palette pane
- # Make sure Node Palette pane is opened
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
- pane = find_pane(sc, TEST_PANE)
- if not pane.isVisible():
- click_menu_option(sc, "Node Palette")
- pane = find_pane(sc, TEST_PANE) # New reference
-
- # We drag/drop pane over the graph since it doesn't allow docking, so this will undock it
- try:
- graph = find_pane(sc, "GraphCanvasEditorCentralWidget")
- try:
- pane.topLevelChanged.connect(on_top_level_changed)
- pyside_utils.drag_and_drop(pane, graph)
- finally:
- pane.topLevelChanged.disconnect(on_top_level_changed)
-
- # 3) Connect to Pane visibility signal emitter to verify pane closed
- # No need to disconnect this since pane widget gets deleted when SC window closed
- pane.visibilityChanged.connect(on_pane_closed)
-
- # 4) Close Script Canvas window
- sc.close()
- is_sc_visible = helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 2.0)
- Report.result(Tests.close_sc_window, not is_sc_visible)
-
- finally:
- # 5) Restore default layout
- general.open_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 5.0)
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
- click_menu_option(sc, "Restore Default Layout")
- sc.close()
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
-
- from utils import Report
-
- Report.start_test(UnDockedPane_CloseSCWindow)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/VariableManager_CreateDeleteVars.py b/AutomatedTesting/Gem/PythonTests/scripting/VariableManager_CreateDeleteVars.py
deleted file mode 100644
index 6facc324d4..0000000000
--- a/AutomatedTesting/Gem/PythonTests/scripting/VariableManager_CreateDeleteVars.py
+++ /dev/null
@@ -1,123 +0,0 @@
-"""
-All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-its licensors.
-
-For complete copyright and license terms please see the LICENSE at the root of this
-distribution (the "License"). All use of this software is governed by the License,
-or, if provided, by the license below or the license accompanying this file. Do not
-remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-
-Test case ID: T92564789
-Test Case Title: Each Variable type can be created
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92564789
-Test case ID: T92568873
-Test Case Title: Each Variable type can be deleted
-URL of the test case: https://testrail.agscollab.com/index.php?/tests/view/92568873
-"""
-
-
-def VariableManager_CreateDeleteVars():
- """
- Summary:
- Each variable type can be created and deleted in variable manager.
-
- Expected Behavior:
- Each variable type can be created and deleted in variable manager.
-
- Test Steps:
- 1) Open Script Canvas window (Tools > Script Canvas)
- 2) Get the SC window object
- 3) Open Variable Manager if not opened already
- 4) Create Graph
- 5) Create variable of each type and verify if it is created
- 6) Delete each type of variable and verify if it is deleted
- 7) Close SC window
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
-
- :return: None
- """
-
- from PySide2 import QtWidgets, QtCore, QtTest
-
- from PySide2.QtCore import Qt
-
- from utils import TestHelper as helper
-
- import azlmbr.legacy.general as general
-
- import pyside_utils
-
- def generate_test_tuple(var_type, action):
- return (f"{var_type} variable is {action}d", f"{var_type} variable is not {action}d")
-
- # 1) Open Script Canvas window
- general.idle_enable(True)
- general.open_pane("Script Canvas")
- helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 10.0)
-
- # 2) Get the SC window object
- editor_window = pyside_utils.get_editor_main_window()
- sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
-
- # 3) Open Variable Manager if not opened already
- if sc.findChild(QtWidgets.QDockWidget, "VariableManager") is None:
- action = pyside_utils.find_child_by_pattern(sc, {"text": "Variable Manager", "type": QtWidgets.QAction})
- action.trigger()
- variable_manager = sc.findChild(QtWidgets.QDockWidget, "VariableManager")
-
- # 4) Create Graph
- action = pyside_utils.find_child_by_pattern(sc, {"objectName": "action_New_Script", "type": QtWidgets.QAction})
- action.trigger()
-
- graph_vars = variable_manager.findChild(QtWidgets.QTableView, "graphVariables")
-
- var_types = ["Boolean", "Color", "EntityID", "Number", "String", "Transform", "Vector2", "Vector3", "Vector4"]
-
- # 5) Create variable of each type and verify if it is created
- for index, var_type in enumerate(var_types):
- # Create new variable
- add_button = variable_manager.findChild(QtWidgets.QPushButton, "addButton")
- add_button.click() # Click on Create Variable button
- # Select variable type
- table_view = variable_manager.findChild(QtWidgets.QTableView, "variablePalette")
- model_index = pyside_utils.find_child_by_pattern(table_view, var_type)
- # Click on it to create variable
- pyside_utils.item_view_index_mouse_click(table_view, model_index)
- # Verify if the variable is created
- # NOTE: To check if variable of a type is created, we are checking 1) rowcount
- # 2) If we have row with variable "Variable "
- # 3) Type of variable, which is next column of the variable name
- result = graph_vars.model().rowCount(QtCore.QModelIndex()) == (
- index + 1
- ) # since we added 1 variable, rowcount will increase by 1
- var_mi = pyside_utils.find_child_by_pattern(graph_vars, f"Variable {index+1}")
- result = result and (var_mi is not None) and (var_mi.siblingAtColumn(1).data(Qt.DisplayRole) == var_type)
- Report.result(generate_test_tuple(var_type, "create"), result)
-
- # 6) Delete each type of variable and verify if it is deleted
- for index, var_type in enumerate(var_types):
- # Delete variable and verify if its deleted
- # NOTE: To check if variable of a type is deleted, we are checking rowcount
- var_mi = pyside_utils.find_child_by_pattern(graph_vars, f"Variable {index+1}")
- pyside_utils.item_view_index_mouse_click(graph_vars, var_mi)
- QtTest.QTest.keyClick(graph_vars, Qt.Key_Delete, Qt.NoModifier)
- # since variable is deleted, rowcount will decrease by 1
- result = graph_vars.model().rowCount(QtCore.QModelIndex()) == (len(var_types) - (index + 1))
- Report.result(generate_test_tuple(var_type, "delete"), result)
-
- # 7) Close SC window
- general.close_pane("Script Canvas")
-
-
-if __name__ == "__main__":
- import ImportPathHelper as imports
-
- imports.init()
- from utils import Report
-
- Report.start_test(VariableManager_CreateDeleteVars)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/VariableManager_Default_CreateDeleteVars.py b/AutomatedTesting/Gem/PythonTests/scripting/VariableManager_Default_CreateDeleteVars.py
new file mode 100644
index 0000000000..e53939172e
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/VariableManager_Default_CreateDeleteVars.py
@@ -0,0 +1,114 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+def VariableManager_Default_CreateDeleteVars():
+ """
+ Summary:
+ Creating and deleting each type of variable in the Variable Manager pane
+
+ Expected Behavior:
+ Each variable type can be created and deleted in variable manager.
+
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Get the SC window object
+ 3) Open Variable Manager if not opened already
+ 4) Create Graph
+ 5) Create variable of each type and verify if it is created
+ 6) Delete each type of variable and verify if it is deleted
+ 7) Close SC window
+
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ from PySide2 import QtWidgets, QtCore, QtTest
+ from PySide2.QtCore import Qt
+
+ from utils import TestHelper as helper
+ import pyside_utils
+
+ import azlmbr.legacy.general as general
+
+ def generate_test_tuple(var_type, action):
+ return (f"{var_type} variable is {action}d", f"{var_type} variable is not {action}d")
+
+ # 1) Open Script Canvas window
+ general.idle_enable(True)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 10.0)
+
+ # 2) Get the SC window object
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+
+ # 3) Open Variable Manager if not opened already
+ if sc.findChild(QtWidgets.QDockWidget, "VariableManager") is None:
+ action = pyside_utils.find_child_by_pattern(sc, {"text": "Variable Manager", "type": QtWidgets.QAction})
+ action.trigger()
+ variable_manager = sc.findChild(QtWidgets.QDockWidget, "VariableManager")
+
+ # 4) Create Graph
+ action = pyside_utils.find_child_by_pattern(sc, {"objectName": "action_New_Script", "type": QtWidgets.QAction})
+ action.trigger()
+
+ graph_vars = variable_manager.findChild(QtWidgets.QTableView, "graphVariables")
+
+ var_types = ["Boolean", "Color", "EntityID", "Number", "String", "Transform", "Vector2", "Vector3", "Vector4"]
+
+ # 5) Create variable of each type and verify if it is created
+ for index, var_type in enumerate(var_types):
+ # Create new variable
+ add_button = variable_manager.findChild(QtWidgets.QPushButton, "addButton")
+ add_button.click() # Click on Create Variable button
+ # Select variable type
+ table_view = variable_manager.findChild(QtWidgets.QTableView, "variablePalette")
+ model_index = pyside_utils.find_child_by_pattern(table_view, var_type)
+ # Click on it to create variable
+ pyside_utils.item_view_index_mouse_click(table_view, model_index)
+ # Verify if the variable is created
+ # NOTE: To check if variable of a type is created, we are checking 1) rowcount
+ # 2) If we have row with variable "Variable "
+ # 3) Type of variable, which is next column of the variable name
+ result = graph_vars.model().rowCount(QtCore.QModelIndex()) == (
+ index + 1
+ ) # since we added 1 variable, rowcount will increase by 1
+ var_mi = pyside_utils.find_child_by_pattern(graph_vars, f"Variable {index+1}")
+ result = result and (var_mi is not None) and (var_mi.siblingAtColumn(1).data(Qt.DisplayRole) == var_type)
+ Report.result(generate_test_tuple(var_type, "create"), result)
+
+ # 6) Delete each type of variable and verify if it is deleted
+ for index, var_type in enumerate(var_types):
+ # Delete variable and verify if its deleted
+ # NOTE: To check if variable of a type is deleted, we are checking rowcount
+ var_mi = pyside_utils.find_child_by_pattern(graph_vars, f"Variable {index+1}")
+ pyside_utils.item_view_index_mouse_click(graph_vars, var_mi)
+ QtTest.QTest.keyClick(graph_vars, Qt.Key_Delete, Qt.NoModifier)
+ # since variable is deleted, rowcount will decrease by 1
+ result = graph_vars.model().rowCount(QtCore.QModelIndex()) == (len(var_types) - (index + 1))
+ Report.result(generate_test_tuple(var_type, "delete"), result)
+
+ # 7) Close SC window
+ general.close_pane("Script Canvas")
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(VariableManager_Default_CreateDeleteVars)
diff --git a/AutomatedTesting/Gem/PythonTests/scripting/VariableManager_UnpinVariableType_Works.py b/AutomatedTesting/Gem/PythonTests/scripting/VariableManager_UnpinVariableType_Works.py
new file mode 100644
index 0000000000..a7c72ce134
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/scripting/VariableManager_UnpinVariableType_Works.py
@@ -0,0 +1,120 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+
+# fmt: off
+class Tests():
+ variable_manager_opened = ("VariableManager is opened successfully", "Failed to open VariableManager")
+ variable_pinned = ("Variable is pinned", "Variable is not pinned, But it should be unpinned")
+ variable_unpinned = ("Variable is unpinned", "Variable is not unpinned, But it should be pinned")
+ variable_unpinned_after_reopen = ("Variable is unpinned after reopening create variable menu", "Variable is not unpinned after reopening create variable menu")
+# fmt: on
+
+
+def VariableManager_UnpinVariableType_Works():
+ """
+ Summary:
+ Unpin variable types in create variable menu.
+ Expected Behavior:
+ The variable unpinned in create variable menu remains unpinned after reopening create variable menu.
+ Test Steps:
+ 1) Open Script Canvas window (Tools > Script Canvas)
+ 2) Get the SC window object
+ 3) Open Variable Manager in Script Canvas window
+ 4) Create new graph
+ 5) Click on the Create Variable button in the Variable Manager
+ 6) Unpin Boolean by clicking the "Pin" icon on its left side
+ 7) Close and Reopen Create Variable menu and make sure Boolean is unpinned after reopening Create Variable menu
+ 8) Restore default layout and close SC window
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+ :return: None
+ """
+
+ from PySide2 import QtWidgets
+ import azlmbr.legacy.general as general
+
+ import pyside_utils
+ from utils import TestHelper as helper
+ from utils import Report
+ from PySide2.QtCore import Qt
+
+ GENERAL_WAIT = 1.0 # seconds
+
+ def find_pane(window, pane_name):
+ return window.findChild(QtWidgets.QDockWidget, pane_name)
+
+ def click_menu_option(window, option_text):
+ action = pyside_utils.find_child_by_pattern(window, {"text": option_text, "type": QtWidgets.QAction})
+ action.trigger()
+
+ # 1) Open Script Canvas window (Tools > Script Canvas)
+ general.idle_enable(True)
+ general.open_pane("Script Canvas")
+ helper.wait_for_condition(lambda: general.is_pane_visible("Script Canvas"), 6.0)
+
+ # 2) Get the SC window object
+ editor_window = pyside_utils.get_editor_main_window()
+ sc = editor_window.findChild(QtWidgets.QDockWidget, "Script Canvas")
+ sc_main = sc.findChild(QtWidgets.QMainWindow)
+
+ # 3) Open Variable Manager in Script Canvas window
+ pane = find_pane(sc, "VariableManager")
+ if not pane.isVisible():
+ click_menu_option(sc, "Variable Manager")
+ pane = find_pane(sc, "VariableManager")
+ Report.result(Tests.variable_manager_opened, pane.isVisible())
+
+ # 4) Create new graph
+ create_new_graph = pyside_utils.find_child_by_pattern(
+ sc_main, {"objectName": "action_New_Script", "type": QtWidgets.QAction}
+ )
+ create_new_graph.trigger()
+
+ # 5) Click on the Create Variable button in the Variable Manager
+ variable_manager = sc_main.findChild(QtWidgets.QDockWidget, "VariableManager")
+ button = variable_manager.findChild(QtWidgets.QPushButton, "addButton")
+ button.click()
+
+ # 6) Unpin Boolean by clicking the "Pin" icon on its left side
+ table_view = variable_manager.findChild(QtWidgets.QTableView, "variablePalette")
+ model_index = pyside_utils.find_child_by_pattern(table_view, "Boolean")
+ # Make sure Boolean is pinned
+ is_boolean = model_index.siblingAtColumn(0)
+ result = helper.wait_for_condition(lambda: is_boolean.data(Qt.DecorationRole) is not None, GENERAL_WAIT)
+ Report.result(Tests.variable_pinned, result)
+ # Unpin Boolean and make sure Boolean is unpinned.
+ pyside_utils.item_view_index_mouse_click(table_view, is_boolean)
+ result = helper.wait_for_condition(lambda: is_boolean.data(Qt.DecorationRole) is None, GENERAL_WAIT)
+ Report.result(Tests.variable_unpinned, result)
+
+ # 7) Close and Reopen Create Variable menu and make sure Boolean is unpinned after reopening Create Variable menu
+ button.click()
+ button.click()
+ model_index = pyside_utils.find_child_by_pattern(table_view, "Boolean")
+ result = helper.wait_for_condition(
+ lambda: model_index.siblingAtColumn(0).data(Qt.DecorationRole) is None, GENERAL_WAIT
+ )
+ Report.result(Tests.variable_unpinned_after_reopen, result)
+
+ # 8) Restore default layout and close SC window
+ click_menu_option(sc, "Restore Default Layout")
+ general.close_pane("Script Canvas")
+
+
+if __name__ == "__main__":
+ import ImportPathHelper as imports
+
+ imports.init()
+ from utils import Report
+
+ Report.start_test(VariableManager_UnpinVariableType_Works)
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt
new file mode 100644
index 0000000000..a3b6e36250
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt
@@ -0,0 +1,45 @@
+#
+# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+# its licensors.
+#
+# For complete copyright and license terms please see the LICENSE at the root of this
+# distribution (the "License"). All use of this software is governed by the License,
+# or, if provided, by the license below or the license accompanying this file. Do not
+# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
+ ly_add_pytest(
+ NAME AutomatedTesting::SmokeTest
+ TEST_SUITE smoke
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}
+ PYTEST_MARKS "SUITE_smoke"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ AZ::PythonBindingsExample
+ Legacy::Editor
+ AutomatedTesting.GameLauncher
+ AutomatedTesting.Assets
+ COMPONENT
+ Smoke
+ )
+
+ ly_add_pytest(
+ NAME AutomatedTesting::SandboxTest
+ TEST_SUITE sandbox
+ TEST_SERIAL
+ PATH ${CMAKE_CURRENT_LIST_DIR}
+ PYTEST_MARKS "SUITE_sandbox"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ AZ::PythonBindingsExample
+ Legacy::Editor
+ AutomatedTesting.GameLauncher
+ AutomatedTesting.Assets
+ COMPONENT
+ Smoke
+ )
+endif()
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/Editor_NewExistingLevels_Works.py b/AutomatedTesting/Gem/PythonTests/smoke/Editor_NewExistingLevels_Works.py
new file mode 100644
index 0000000000..db0284f14c
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/Editor_NewExistingLevels_Works.py
@@ -0,0 +1,147 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+
+Test Case Title: Create Test for UI apps- Editor
+"""
+
+
+class Tests():
+ level_created = ("Level created", "Failed to create level")
+ entity_found = ("New Entity created in level", "Failed to create New Entity in level")
+ mesh_added = ("Mesh Component added", "Failed to add Mesh Component")
+ enter_game_mode = ("Game Mode successfully entered", "Failed to enter in Game Mode")
+ exit_game_mode = ("Game Mode successfully exited", "Failed to exit in Game Mode")
+ level_opened = ("Level opened successfully", "Failed to open level")
+ level_exported = ("Level exported successfully", "Failed to export level")
+ mesh_removed = ("Mesh Component removed", "Failed to remove Mesh Component")
+ entity_deleted = ("Entity deleted", "Failed to delete Entity")
+ level_edits_present = ("Level edits persist after saving", "Failed to save level edits after saving")
+
+
+def Editor_NewExistingLevels_Works():
+ """
+ Summary: Perform the below operations on Editor
+
+ 1) Launch & Close editor
+ 2) Create new level
+ 3) Saving and loading levels
+ 4) Level edits persist after saving
+ 5) Export Level
+ 6) Can switch to play mode (ctrl+g) and exit that
+ 7) Run editor python bindings test
+ 8) Create an Entity
+ 9) Delete an Entity
+ 10) Add a component to an Entity
+
+ Expected Behavior:
+ All operations succeed and do not cause a crash
+
+ Test Steps:
+ 1) Launch editor and Create a new level
+ 2) Create a new entity
+ 3) Add Mesh component
+ 4) Verify enter/exit game mode
+ 5) Save, Load and Export level
+ 6) Remove Mesh component
+ 7) Delete entity
+ 8) Open an existing level
+ 9) Create a new entity in an existing level
+ 10) Save, Load and Export an existing level and close editor
+
+ Note:
+ - This test file must be called from the Lumberyard Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+
+ :return: None
+ """
+
+ import os
+ import editor_python_test_tools.hydra_editor_utils as hydra
+ from editor_python_test_tools.utils import TestHelper as helper
+ from editor_python_test_tools.utils import Report
+ import azlmbr.bus as bus
+ import azlmbr.editor as editor
+ import azlmbr.legacy.general as general
+ import azlmbr.math as math
+
+ # 1) Launch editor and Create a new level
+ helper.init_idle()
+ test_level_name = "temp_level"
+ general.create_level_no_prompt(test_level_name, 128, 1, 128, False)
+ helper.wait_for_condition(lambda: general.get_current_level_name() == test_level_name, 2.0)
+ Report.result(Tests.level_created, general.get_current_level_name() == test_level_name)
+
+ # 2) Create a new entity
+ entity_position = math.Vector3(200.0, 200.0, 38.0)
+ new_entity = hydra.Entity("Entity1")
+ new_entity.create_entity(entity_position, [])
+ test_entity = hydra.find_entity_by_name("Entity1")
+ Report.result(Tests.entity_found, test_entity.IsValid())
+
+ # 3) Add Mesh component
+ new_entity.add_component("Mesh")
+ Report.result(Tests.mesh_added, hydra.has_components(new_entity.id, ["Mesh"]))
+
+ # 4) Verify enter/exit game mode
+ helper.enter_game_mode(Tests.enter_game_mode)
+ helper.exit_game_mode(Tests.exit_game_mode)
+
+ # 5) Save, Load and Export level
+ # Save Level
+ general.save_level()
+ # Open Level
+ general.open_level(test_level_name)
+ Report.result(Tests.level_opened, general.get_current_level_name() == test_level_name)
+ # Export Level
+ general.export_to_engine()
+ level_pak_file = os.path.join("AutomatedTesting", "Levels", test_level_name, "level.pak")
+ Report.result(Tests.level_exported, os.path.exists(level_pak_file))
+
+ # 6) Remove Mesh component
+ new_entity.remove_component("Mesh")
+ Report.result(Tests.mesh_removed, not hydra.has_components(new_entity.id, ["Mesh"]))
+
+ # 7) Delete entity
+ editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntityById", new_entity.id)
+ test_entity = hydra.find_entity_by_name("Entity1")
+ Report.result(Tests.entity_deleted, len(test_entity) == 0)
+
+ # 8) Open an existing level
+ general.open_level(test_level_name)
+ Report.result(Tests.level_opened, general.get_current_level_name() == test_level_name)
+
+ # 9) Create a new entity in an existing level
+ entity_position = math.Vector3(200.0, 200.0, 38.0)
+ new_entity_2 = hydra.Entity("Entity2")
+ new_entity_2.create_entity(entity_position, [])
+ test_entity = hydra.find_entity_by_name("Entity2")
+ Report.result(Tests.entity_found, test_entity.IsValid())
+
+ # 10) Save, Load and Export an existing level
+ # Save Level
+ general.save_level()
+ # Open Level
+ general.open_level(test_level_name)
+ Report.result(Tests.level_opened, general.get_current_level_name() == test_level_name)
+ entity_id = hydra.find_entity_by_name(new_entity_2.name)
+ Report.result(Tests.level_edits_present, entity_id == new_entity_2.id)
+ # Export Level
+ general.export_to_engine()
+ level_pak_file = os.path.join("AutomatedTesting", "Levels", test_level_name, "level.pak")
+ Report.result(Tests.level_exported, os.path.exists(level_pak_file))
+
+
+if __name__ == "__main__":
+
+ from editor_python_test_tools.utils import Report
+
+ Report.start_test(Editor_NewExistingLevels_Works)
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/__init__.py b/AutomatedTesting/Gem/PythonTests/smoke/__init__.py
new file mode 100644
index 0000000000..79f8fa4422
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/__init__.py
@@ -0,0 +1,10 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBuilder_Works.py b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBuilder_Works.py
new file mode 100644
index 0000000000..5381fd9fd8
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBuilder_Works.py
@@ -0,0 +1,32 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+
+CLI tool - AssetBuilder
+Launch AssetBuilder and Verify the help message
+"""
+
+import os
+import pytest
+import subprocess
+
+
+@pytest.mark.SUITE_smoke
+class TestCLIToolAssetBuilderWorks(object):
+ def test_CLITool_AssetBuilder_Works(self, build_directory):
+ file_path = os.path.join(build_directory, "AssetBuilder")
+ help_message = "AssetBuilder is part of the Asset Processor"
+ # Launch AssetBuilder
+ output = subprocess.run([file_path, "-help"], capture_output=True, timeout=10)
+ assert (
+ len(output.stderr) == 0 and output.returncode == 0
+ ), f"Error occurred while launching {file_path}: {output.stderr}"
+ # Verify help message
+ assert help_message in str(output.stdout), f"Help Message: {help_message} is not present"
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBundlerBatch_Works.py b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBundlerBatch_Works.py
new file mode 100644
index 0000000000..fd69bb973f
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBundlerBatch_Works.py
@@ -0,0 +1,32 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+
+CLI tool - AssetBundlerBatch
+Launch AssetBundlerBatch and Verify the help message
+"""
+
+import os
+import pytest
+import subprocess
+
+
+@pytest.mark.SUITE_smoke
+class TestCLIToolAssetBundlerBatchWorks(object):
+ def test_CLITool_AssetBundlerBatch_Works(self, build_directory):
+ file_path = os.path.join(build_directory, "AssetBundlerBatch")
+ help_message = "Specifies the Seed List file to operate on by path"
+ # Launch AssetBundlerBatch
+ output = subprocess.run([file_path, "--help"], capture_output=True, timeout=10)
+ assert (
+ len(output.stderr) == 0 and output.returncode == 0
+ ), f"Error occurred while launching {file_path}: {output.stderr}"
+ # Verify help message
+ assert help_message in str(output.stdout), f"Help Message: {help_message} is not present"
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetProcessorBatch_Works.py b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetProcessorBatch_Works.py
new file mode 100644
index 0000000000..c828800639
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetProcessorBatch_Works.py
@@ -0,0 +1,26 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+
+CLI tool - AssetProcessorBatch
+Launch AssetProcessorBatch and Shutdown AssetProcessorBatch without any crash
+"""
+
+import pytest
+
+
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+@pytest.mark.SUITE_smoke
+class TestsCLIToolAssetProcessorBatchWorks(object):
+ def test_CLITool_AssetProcessorBatch_Works(self, workspace):
+ """
+ Test Launching AssetProcessorBatch and verifies that is shuts down without issue
+ """
+ workspace.asset_processor.batch_process()
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AzTestRunner_Works.py b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AzTestRunner_Works.py
new file mode 100644
index 0000000000..fd15c7701d
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AzTestRunner_Works.py
@@ -0,0 +1,34 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+
+CLI tool - AzTestRunner
+Launch AzTestRunner and Verify the help message
+"""
+
+import os
+import pytest
+import subprocess
+
+
+@pytest.mark.SUITE_smoke
+class TestCLIToolAzTestRunnerWorks(object):
+ def test_CLITool_AzTestRunner_Works(self, build_directory):
+ file_path = os.path.join(build_directory, "AzTestRunner")
+ help_message = "OKAY Symbol found: AzRunUnitTests"
+ # Launch AzTestRunner
+ output = subprocess.run(
+ [file_path, "AzTestRunner.Tests", "AzRunUnitTests", "--gtest_list_tests"], capture_output=True, timeout=10
+ )
+ assert (
+ len(output.stderr) == 0 and output.returncode == 0
+ ), f"Error occurred while launching {file_path}: {output.stderr}"
+ # Verify help message
+ assert help_message in str(output.stdout), f"Help Message: {help_message} is not present"
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_PythonBindingsExample_Works.py b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_PythonBindingsExample_Works.py
new file mode 100644
index 0000000000..bef683537e
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_PythonBindingsExample_Works.py
@@ -0,0 +1,32 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+
+CLI tool - PythonBindingsExample
+Launch PythonBindingsExample and Verify the help message
+"""
+
+import os
+import pytest
+import subprocess
+
+
+@pytest.mark.SUITE_smoke
+class TestCLIToolPythonBindingsExampleWorks(object):
+ def test_CLITool_PythonBindingsExample_Works(self, build_directory):
+ file_path = os.path.join(build_directory, "PythonBindingsExample")
+ help_message = "--help Prints the help text"
+ # Launch PythonBindingsExample
+ output = subprocess.run([file_path, "-help"], capture_output=True, timeout=10)
+ assert (
+ len(output.stderr) == 0 and output.returncode == 1
+ ), f"Error occurred while launching {file_path}: {output.stderr}"
+ # Verify help message
+ assert help_message in str(output.stdout), f"Help Message: {help_message} is not present"
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_SerializeContextTools_Works.py b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_SerializeContextTools_Works.py
new file mode 100644
index 0000000000..e63a00acf1
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_SerializeContextTools_Works.py
@@ -0,0 +1,32 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+
+CLI tool - SerializeContextTools
+Launch SerializeContextTools and Verify the help message
+"""
+
+import os
+import pytest
+import subprocess
+
+
+@pytest.mark.SUITE_smoke
+class TestCLIToolSerializeContextToolsWorks(object):
+ def test_CLITool_SerializeContextTools_Works(self, build_directory):
+ file_path = os.path.join(build_directory, "SerializeContextTools")
+ help_message = "Converts a file with an ObjectStream to the new JSON"
+ # Launch SerializeContextTools
+ output = subprocess.run([file_path, "-help"], capture_output=True, timeout=10)
+ assert (
+ len(output.stderr) == 0 and output.returncode == 0
+ ), f"Error occurred while launching {file_path}: {output.stderr}"
+ # Verify help message
+ assert help_message in str(output.stdout), f"Help Message: {help_message} is not present"
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_Editor_NewExistingLevels_Works.py b/AutomatedTesting/Gem/PythonTests/smoke/test_Editor_NewExistingLevels_Works.py
new file mode 100644
index 0000000000..e6b072ba58
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_Editor_NewExistingLevels_Works.py
@@ -0,0 +1,32 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+"""
+
+import pytest
+import os
+from automatedtesting_shared.base import TestAutomationBase
+import ly_test_tools.environment.file_system as file_system
+
+
+@pytest.mark.SUITE_sandbox
+@pytest.mark.parametrize("launcher_platform", ["windows_editor"])
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+@pytest.mark.parametrize("level", ["temp_level"])
+class TestAutomation(TestAutomationBase):
+ def test_Editor_NewExistingLevels_Works(self, request, workspace, editor, level, project, launcher_platform):
+ def teardown():
+ file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
+
+ request.addfinalizer(teardown)
+ file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
+
+ from . import Editor_NewExistingLevels_Works as test_module
+
+ self._run_test(request, workspace, editor, test_module)
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_StaticTools_GenPakShaders_Works.py b/AutomatedTesting/Gem/PythonTests/smoke/test_StaticTools_GenPakShaders_Works.py
new file mode 100644
index 0000000000..42cb3afb00
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_StaticTools_GenPakShaders_Works.py
@@ -0,0 +1,44 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+
+Static tool scripts
+Launch Static tool and Verify the help message
+"""
+
+import os
+import pytest
+import subprocess
+import sys
+
+
+def verify_help_message(static_tool):
+ help_message = ["--help", "show this help message and exit"]
+ output = subprocess.run([sys.executable, static_tool, "-h"], capture_output=True)
+ assert (
+ len(output.stderr) == 0 and output.returncode == 0
+ ), f"Error occurred while launching {static_tool}: {output.stderr}"
+ # verify help message
+ for message in help_message:
+ assert message in str(output.stdout), f"Help Message: {message} is not present"
+
+
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+@pytest.mark.SUITE_smoke
+class TestStaticToolsGenPakShadersWorks(object):
+ def test_StaticTools_GenPakShaders_Works(self, editor):
+ static_tools = [
+ os.path.join(editor.workspace.paths.engine_root(), "scripts", "bundler", "gen_shaders.py"),
+ os.path.join(editor.workspace.paths.engine_root(), "scripts", "bundler", "get_shader_list.py"),
+ os.path.join(editor.workspace.paths.engine_root(), "scripts", "bundler", "pak_shaders.py"),
+ ]
+
+ for tool in static_tools:
+ verify_help_message(tool)
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_UIApps_AssetProcessor_CheckIdle.py b/AutomatedTesting/Gem/PythonTests/smoke/test_UIApps_AssetProcessor_CheckIdle.py
new file mode 100644
index 0000000000..4b039adea8
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_UIApps_AssetProcessor_CheckIdle.py
@@ -0,0 +1,39 @@
+"""
+All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+its licensors.
+
+For complete copyright and license terms please see the LICENSE at the root of this
+distribution (the "License"). All use of this software is governed by the License,
+or, if provided, by the license below or the license accompanying this file. Do not
+remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+
+UI Apps: AssetProcessor
+Open AssetProcessor, Wait until AssetProcessor is Idle
+Close AssetProcessor.
+"""
+
+
+import pytest
+from ly_test_tools.o3de.asset_processor import AssetProcessor
+
+
+@pytest.mark.parametrize("project", ["AutomatedTesting"])
+@pytest.mark.SUITE_smoke
+class TestsUIAppsAssetProcessorCheckIdle(object):
+ @pytest.fixture(autouse=True)
+ def setup_teardown(self, request):
+ self.asset_processor = None
+
+ def teardown():
+ self.asset_processor.stop()
+
+ request.addfinalizer(teardown)
+
+ def test_UIApps_AssetProcessor_CheckIdle(self, workspace):
+ """
+ Test Launching AssetProcessorBatch and verifies that is shuts down without issue
+ """
+ self.asset_processor = AssetProcessor(workspace)
+ self.asset_processor.gui_process()
diff --git a/AutomatedTesting/Gem/PythonTests/streaming/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/streaming/CMakeLists.txt
new file mode 100644
index 0000000000..10b9fabcc0
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/streaming/CMakeLists.txt
@@ -0,0 +1,24 @@
+#
+# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+# its licensors.
+#
+# For complete copyright and license terms please see the LICENSE at the root of this
+# distribution (the "License"). All use of this software is governed by the License,
+# or, if provided, by the license below or the license accompanying this file. Do not
+# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#
+
+if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
+ # Unstable, SPEC-3838 will restore
+ #ly_add_pytest(
+ # NAME AutomatedTesting::asset_load_benchmark_test
+ # TEST_SERIAL
+ # TEST_SUITE benchmark
+ # PATH ${CMAKE_CURRENT_LIST_DIR}/benchmark/asset_load_benchmark_test.py
+ # RUNTIME_DEPENDENCIES
+ # AZ::AssetProcessor
+ # AZ::AssetProcessorBatch
+ # AutomatedTesting.GameLauncher
+ #)
+endif()
diff --git a/AutomatedTesting/Levels/AI/NavigationComponentTest/leveldata/Heightmap.dat b/AutomatedTesting/Levels/AI/NavigationComponentTest/leveldata/Heightmap.dat
deleted file mode 100644
index 8c1a4881a8..0000000000
--- a/AutomatedTesting/Levels/AI/NavigationComponentTest/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e1218e785966cba2973af5fcc2adeea81399ef4b9ceee9713e430d14090317bd
-size 272849
diff --git a/AutomatedTesting/Levels/AI/NavigationComponentTest/terrain/cover.ctc b/AutomatedTesting/Levels/AI/NavigationComponentTest/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/AI/NavigationComponentTest/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterCollision/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterCollision/leveldata/Heightmap.dat
deleted file mode 100644
index c57f97afb8..0000000000
--- a/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterCollision/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:259892d63259cdc7b0cbee64c979d917820ea2bb402397ef63a3383ea5146b0a
-size 132288
diff --git a/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterCollision/terrain/cover.ctc b/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterCollision/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterCollision/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterDamage/LevelData/Heightmap.dat b/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterDamage/LevelData/Heightmap.dat
deleted file mode 100644
index c57f97afb8..0000000000
--- a/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterDamage/LevelData/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:259892d63259cdc7b0cbee64c979d917820ea2bb402397ef63a3383ea5146b0a
-size 132288
diff --git a/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterDamage/terrain/cover.ctc b/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterDamage/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterDamage/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/C18977329_NvCloth_AddClothSimulationToMesh.ly b/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/C18977329_NvCloth_AddClothSimulationToMesh.ly
index 17fee158d8..1afbf787db 100644
--- a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/C18977329_NvCloth_AddClothSimulationToMesh.ly
+++ b/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/C18977329_NvCloth_AddClothSimulationToMesh.ly
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a2a3360287a4711882c4254d64ca2ba70cd743012a7d38ca29aa2a57f151efaa
-size 6661
+oid sha256:e15d484113e8151072b410924747a8ad304f6f12457fad577308c0491693ab34
+size 5472
diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/LevelData/Heightmap.dat b/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/LevelData/Heightmap.dat
deleted file mode 100644
index e3cfc6487c..0000000000
--- a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/LevelData/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6f5b950e0dcd47ada8f34dc9f64976ebe156aeedb92d7e6d3467efbeddb3baa2
-size 17407674
diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/filelist.xml b/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/filelist.xml
index 6c8b361e57..9775a35c53 100644
--- a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/filelist.xml
+++ b/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/filelist.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/level.pak b/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/level.pak
index e80d5ca1d9..08a775b6c8 100644
--- a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/level.pak
+++ b/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/level.pak
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:cd8105f020151e65093988dfb09ab42ff8d33ef5b97c61fbe0011384870aadf8
-size 39238
+oid sha256:64de37c805b0be77cdb7a85b5406af58b7f845e7d97fec1721ac5d789bb641db
+size 38856
diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/terrain/cover.ctc b/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/C18977330_NvCloth_AddClothSimulationToActor.ly b/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/C18977330_NvCloth_AddClothSimulationToActor.ly
index 031989ee11..385027c479 100644
--- a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/C18977330_NvCloth_AddClothSimulationToActor.ly
+++ b/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/C18977330_NvCloth_AddClothSimulationToActor.ly
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f53fb5e096ff562e9f0f12856ce387891596776d086f49c7ed3a59dcd0a0c11a
-size 6535
+oid sha256:7b595323d4d51211463dea0338abb6ce2a4a0a8d41efb12ac3c9dccd1f972171
+size 5504
diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/LevelData/Heightmap.dat b/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/LevelData/Heightmap.dat
deleted file mode 100644
index 80f0296fd4..0000000000
--- a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/LevelData/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ae30a71535b7283f4b19a0dee09ad98afc2d23e127d3da53c4da76650c0d9698
-size 17407642
diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/filelist.xml b/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/filelist.xml
index 290a28f223..7ccc1d51eb 100644
--- a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/filelist.xml
+++ b/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/filelist.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/level.pak b/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/level.pak
index fb91adeba5..12ce03fa87 100644
--- a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/level.pak
+++ b/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/level.pak
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:87fbd9fda267daa505f11276b64f47c26115bee9e6d14f2a6f5a1cf1e1234218
-size 39179
+oid sha256:617c455668fc41cb7fd69de690e4aa3c80f2cb36deaa371902b79de18fcd1cb2
+size 39233
diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/terrain/cover.ctc b/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/Base/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/Base/leveldata/Heightmap.dat
deleted file mode 100644
index 2619d881d2..0000000000
--- a/AutomatedTesting/Levels/Physics/Base/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5080ffd65c2c76fbd5db96f75496dae7d4992dfc2f6a5e9514345e1d74422143
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/Base/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/Base/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/Base/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/Heightmap.dat
deleted file mode 100644
index 43bea299f4..0000000000
--- a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e9018429c312bced4975ab9e4d5cd6420a2fc8605b7d0929334dfd7dff50a79b
-size 272967
diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/leveldata/Heightmap.dat
deleted file mode 100644
index 8772b96c9f..0000000000
--- a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2a53b3ffe745f824431028cc36d1990f55e9303bff99542f8ee3b85cd4417636
-size 272903
diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/leveldata/Heightmap.dat
deleted file mode 100644
index 8dba2c114b..0000000000
--- a/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:35fa1fc96e3092de7200533183d875fe19585ca292e01af24dcc82497c8d400a
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/Heightmap.dat
deleted file mode 100644
index b3f394b89e..0000000000
--- a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:93c2de86abea5c70845480f09dd86e9aebf2084c8e26444eee846ad9a3b18fe0
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/leveldata/Heightmap.dat
deleted file mode 100644
index 5f407d9252..0000000000
--- a/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:65464a758912e1dc2cdd39606fe86d05315336635a42a659734b3755f6e4ad4c
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/leveldata/Heightmap.dat
deleted file mode 100644
index ea30699f94..0000000000
--- a/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5517e2cd05060859a9e010f9df1f410a7fc9739a8ec6adbc0e214b894a7eef21
-size 272903
diff --git a/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/leveldata/Heightmap.dat
deleted file mode 100644
index bdce2c873d..0000000000
--- a/AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:55f771fb360a8b7a6d12e9b0e5f8824f9567d1869cb2757b7a3263539d03db1f
-size 17407561
diff --git a/AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/leveldata/Heightmap.dat
deleted file mode 100644
index f1d48b1ccd..0000000000
--- a/AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b7718b09645345926ac1f59513114f64c6e146a49fac69f2835ce20c831953d7
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/leveldata/Heightmap.dat
deleted file mode 100644
index 0c1cfb6e1c..0000000000
--- a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3b10f68c7f64dd775e6abc3250c019c1efdf498822b77bd98efb8f8c19513c0e
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/leveldata/Heightmap.dat
deleted file mode 100644
index 1f85094c91..0000000000
--- a/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:646140ed507ea073e2472196661b204694d686142536e1912b173376324b302a
-size 274291
diff --git a/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/leveldata/Heightmap.dat
deleted file mode 100644
index a84b83c152..0000000000
--- a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:965f0dd885e93c25183390a87675b5aef1d24d374ededc5e073a98e15318858e
-size 272903
diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/leveldata/Heightmap.dat
deleted file mode 100644
index 54c23454f9..0000000000
--- a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e9487342e768620c77288e3b8019ade03cd12eb1c19067b5d6408a185a62203e
-size 272967
diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/leveldata/Heightmap.dat
deleted file mode 100644
index e461c4f629..0000000000
--- a/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:54b2dc4c443ea1e9b9aaed9d2aef1227ddeeac7db728b699cacd08811c81db8f
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/leveldata/Heightmap.dat
deleted file mode 100644
index d290b022fe..0000000000
--- a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ae84e1cb4cc4d54cb4cccb361663f8a4bb214e95ad0023cdd068657ef4705e43
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/leveldata/Heightmap.dat
deleted file mode 100644
index c8eabe5621..0000000000
--- a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a5c76ddb855bd123944e9582f289298091e6dc9089d877e1175079df72a251d9
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/leveldata/Heightmap.dat
deleted file mode 100644
index 1ab498d3da..0000000000
--- a/AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2913bdf321ee6cbe2bf148444554ce0135b41ac5ddac42d62a32d8af4cf7ae1c
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/terrain/cover.ctc
deleted file mode 100644
index 5df79a372b..0000000000
--- a/AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:eee27982bfd7ad92814e2287d5fae32f943a470120550e2ac93d2299a4969876
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/leveldata/Heightmap.dat
deleted file mode 100644
index ed4d2f4efc..0000000000
--- a/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:52834b00e1392b055902d9bc93c52c145e75f758250049e71dc2d6b40a377279
-size 272903
diff --git a/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/leveldata/Heightmap.dat
deleted file mode 100644
index 9fa09123de..0000000000
--- a/AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fb391ba2b3a7631e00b067610f1fa541bfd74d1d64e11aee72741cca5c2b7d90
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/leveldata/Heightmap.dat
deleted file mode 100644
index 46e1443632..0000000000
--- a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1802389900e2a041717f05ea9f05ae344edd8ce49b5332204a87d2124459561f
-size 17407722
diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/leveldata/Heightmap.dat
deleted file mode 100644
index 00187ffd24..0000000000
--- a/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3461c62fd0a988d4f3369116f9447d392cac1f4b1f259dc65aabe2fabbfafb37
-size 17407722
diff --git a/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/leveldata/Heightmap.dat
deleted file mode 100644
index b62e36aef5..0000000000
--- a/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d7d878cdef5de9038df845b5ef5709cc3afe2a5a3a606f3f5ac4575a733ffc5e
-size 273095
diff --git a/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/leveldata/Heightmap.dat
deleted file mode 100644
index 45e1bc7290..0000000000
--- a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6931308387c56833dcfa8887cc91cdf3ec2c8dcf47803118892b9734751f86c9
-size 274584
diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/leveldata/Heightmap.dat
deleted file mode 100644
index 929371d5ba..0000000000
--- a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:75c123551336f3ff33d1e7b7a35609e1e5dc70cc360b59a23c11c8650ccf19a6
-size 17409393
diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/leveldata/Heightmap.dat
deleted file mode 100644
index 2650c4e5cb..0000000000
--- a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5b3d4971af97025075197da8cb357d488ca899e3da8fb1e6f56082d6aace7101
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/leveldata/Heightmap.dat
deleted file mode 100644
index e32db0bdff..0000000000
--- a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b79f9dec3428d224041ff2404c503c9df1a7fc8fb0e84bfec30374a918710b2a
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/leveldata/Heightmap.dat
deleted file mode 100644
index 2521b77547..0000000000
--- a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4adb1fccd94b0bcf444b4a6dc6f387b20bf22f0d83fefe1d938ffa6672e83a13
-size 17408454
diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/leveldata/Heightmap.dat
deleted file mode 100644
index 6798b7f0c0..0000000000
--- a/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fd1588965564e750d4d5d56771d983dbd27cf36a072ad2a4bc00478d3cb4629b
-size 272903
diff --git a/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/Heightmap.dat
deleted file mode 100644
index 66b1d441b9..0000000000
--- a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:179f70d479b1090b16dfbfc92e5354d69751ee0288b831b51840a936e279b2d1
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/Heightmap.dat
deleted file mode 100644
index 66b1d441b9..0000000000
--- a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:179f70d479b1090b16dfbfc92e5354d69751ee0288b831b51840a936e279b2d1
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/leveldata/Heightmap.dat
deleted file mode 100644
index e5479ac90e..0000000000
--- a/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:709cb703dd55024d7863d8b64ffe74e9e02560e2faefb18e28f23e18a7186f52
-size 17409642
diff --git a/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/leveldata/Heightmap.dat
deleted file mode 100644
index 6a27041aba..0000000000
--- a/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2ac95dd40dd51f41fdbf06528e47f2675d888da0c09fe516a5d78c90ed025f5d
-size 17407561
diff --git a/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/leveldata/Heightmap.dat
deleted file mode 100644
index 95bc38ca3b..0000000000
--- a/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:336249a60fe83032f9cad84b9e5cfe53e4fbc95d8bbeb27e7376629a6899622e
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/LevelData/Heightmap.dat b/AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/LevelData/Heightmap.dat
deleted file mode 100644
index 11f4d421fd..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/LevelData/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d831766ab559a54fa77535c1debb710cda545ae2c34e37cf4456b90769abe33a
-size 8389548
diff --git a/AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/leveldata/Heightmap.dat
deleted file mode 100644
index 1081404c7a..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:44607f0af9f20238fe5405800542230cb9cf374a9f7b94abee43910e177c9195
-size 17407508
diff --git a/AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/leveldata/Heightmap.dat
deleted file mode 100644
index 1081404c7a..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:44607f0af9f20238fe5405800542230cb9cf374a9f7b94abee43910e177c9195
-size 17407508
diff --git a/AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/leveldata/Heightmap.dat
deleted file mode 100644
index 1081404c7a..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:44607f0af9f20238fe5405800542230cb9cf374a9f7b94abee43910e177c9195
-size 17407508
diff --git a/AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/leveldata/Heightmap.dat
deleted file mode 100644
index 1081404c7a..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:44607f0af9f20238fe5405800542230cb9cf374a9f7b94abee43910e177c9195
-size 17407508
diff --git a/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/leveldata/Heightmap.dat
deleted file mode 100644
index 1081404c7a..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:44607f0af9f20238fe5405800542230cb9cf374a9f7b94abee43910e177c9195
-size 17407508
diff --git a/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/leveldata/Heightmap.dat
deleted file mode 100644
index 1081404c7a..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:44607f0af9f20238fe5405800542230cb9cf374a9f7b94abee43910e177c9195
-size 17407508
diff --git a/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/leveldata/Heightmap.dat
deleted file mode 100644
index 1081404c7a..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:44607f0af9f20238fe5405800542230cb9cf374a9f7b94abee43910e177c9195
-size 17407508
diff --git a/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/leveldata/Heightmap.dat
deleted file mode 100644
index 5218205cc2..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cb33993ffc810014adbb3c2054980e4e6523919a690b6271a218b17b1f537262
-size 17407508
diff --git a/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/leveldata/Heightmap.dat
deleted file mode 100644
index 1081404c7a..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:44607f0af9f20238fe5405800542230cb9cf374a9f7b94abee43910e177c9195
-size 17407508
diff --git a/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/leveldata/Heightmap.dat
deleted file mode 100644
index 1081404c7a..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:44607f0af9f20238fe5405800542230cb9cf374a9f7b94abee43910e177c9195
-size 17407508
diff --git a/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/leveldata/Heightmap.dat
deleted file mode 100644
index 1081404c7a..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:44607f0af9f20238fe5405800542230cb9cf374a9f7b94abee43910e177c9195
-size 17407508
diff --git a/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/leveldata/Heightmap.dat
deleted file mode 100644
index 1081404c7a..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:44607f0af9f20238fe5405800542230cb9cf374a9f7b94abee43910e177c9195
-size 17407508
diff --git a/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/leveldata/Heightmap.dat
deleted file mode 100644
index 3fbf3cb79d..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4e640b0c7396ba078c2d591b84d3e9289f391635e0f2db0d84de824634247cae
-size 17407508
diff --git a/AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/leveldata/Heightmap.dat
deleted file mode 100644
index 35dd269a45..0000000000
--- a/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c8448b0e7a0a336c44743b3031226572cfbc5d0dd118c7214c2255434d46c070
-size 17407561
diff --git a/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/leveldata/Heightmap.dat
deleted file mode 100644
index 35dd269a45..0000000000
--- a/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c8448b0e7a0a336c44743b3031226572cfbc5d0dd118c7214c2255434d46c070
-size 17407561
diff --git a/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/leveldata/Heightmap.dat
deleted file mode 100644
index d0f31986ba..0000000000
--- a/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c8faedf8853c5e96edc68089af22243c7cbd0ba27aa76b1b065e72693c9140eb
-size 272903
diff --git a/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/LevelData/Heightmap.dat b/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/LevelData/Heightmap.dat
deleted file mode 100644
index c319bfdc1b..0000000000
--- a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/LevelData/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b0e1bd3cb02be966cfd15ff9c44605c778058a2b06899c1934762f4fe770e73d
-size 8389740
diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/leveldata/Heightmap.dat
deleted file mode 100644
index 5b841792c2..0000000000
--- a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c2714d5fcf2c87ae5b149ec68e0df1dc66d451e219e050d11609b0e3e41f1c71
-size 8389548
diff --git a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/leveldata/Heightmap.dat
deleted file mode 100644
index 67c08472c3..0000000000
--- a/AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e7bcb9526a0f20e01f1f263f4853b6630a93c8eeeca9b65506064fccfeac4e40
-size 273000
diff --git a/AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/leveldata/Heightmap.dat
deleted file mode 100644
index 2bf6b30add..0000000000
--- a/AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:57d336a6e26bc0c55b8dbd27fb3e0947d3d2cfc49f18142a8fa88430f4b615b0
-size 272909
diff --git a/AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/leveldata/Heightmap.dat
deleted file mode 100644
index 6f46e7ab93..0000000000
--- a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1e90a489a4042a27b564b0edf3ba32258bccf25e6b45a949737da9d7209f30e4
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/leveldata/Heightmap.dat
deleted file mode 100644
index 35dd269a45..0000000000
--- a/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c8448b0e7a0a336c44743b3031226572cfbc5d0dd118c7214c2255434d46c070
-size 17407561
diff --git a/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/leveldata/Heightmap.dat
deleted file mode 100644
index 35dd269a45..0000000000
--- a/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c8448b0e7a0a336c44743b3031226572cfbc5d0dd118c7214c2255434d46c070
-size 17407561
diff --git a/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/leveldata/Heightmap.dat
deleted file mode 100644
index 35dd269a45..0000000000
--- a/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c8448b0e7a0a336c44743b3031226572cfbc5d0dd118c7214c2255434d46c070
-size 17407561
diff --git a/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/leveldata/Heightmap.dat
deleted file mode 100644
index 35dd269a45..0000000000
--- a/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c8448b0e7a0a336c44743b3031226572cfbc5d0dd118c7214c2255434d46c070
-size 17407561
diff --git a/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/leveldata/Heightmap.dat
deleted file mode 100644
index 35dd269a45..0000000000
--- a/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c8448b0e7a0a336c44743b3031226572cfbc5d0dd118c7214c2255434d46c070
-size 17407561
diff --git a/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/leveldata/Heightmap.dat
deleted file mode 100644
index b7a01eb918..0000000000
--- a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3fa70d03516a287419a32ffb59178c302ba10687e5439fe131305d63dd51e0ca
-size 272903
diff --git a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/leveldata/Heightmap.dat
deleted file mode 100644
index f1d0bf3b16..0000000000
--- a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:04ef00ec40ec80a43b39ab898e5ee99810eccf8d3f50278054f52c6e54667f0f
-size 17407590
diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/leveldata/Heightmap.dat
deleted file mode 100644
index d9ce7a6ec4..0000000000
--- a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:af292927784263e86581009389f9c9d322e85b3d2208a72286dbe860d8995d2f
-size 17407561
diff --git a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/leveldata/Heightmap.dat
deleted file mode 100644
index 6555bbb47c..0000000000
--- a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8849aaa3261772f0a4286acb64cf2c5af15f76cbd8e42bd96ce5532df3ed64f4
-size 274401
diff --git a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/leveldata/Heightmap.dat
deleted file mode 100644
index 755ba49dc0..0000000000
--- a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4bc0fd79ecccd25461096a9f716f21552d3a0b9650a7d1567060d70f93579afd
-size 273771
diff --git a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/leveldata/Heightmap.dat
deleted file mode 100644
index e08359de1c..0000000000
--- a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:91d4f2760734ec798785956e7873186d2ac45935068011167d4a594f490c0bf4
-size 272967
diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/leveldata/Heightmap.dat
deleted file mode 100644
index 0b7e8da583..0000000000
--- a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b1a9ad65c4a46f5bd1f67ac3350688549b6048620467c7b54cb30102a08c88ad
-size 272967
diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/leveldata/Heightmap.dat
deleted file mode 100644
index b5814e3003..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5fd1899decf59ab5cf0990a24a7c8f3ab383f8739d1d2b558f081e64787d1e9c
-size 17407722
diff --git a/AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/leveldata/Heightmap.dat
deleted file mode 100644
index c7321f0771..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9ae9eaf24bd5a1348e1a2f867b26408fbcc3275d3d3e45e65ce8fdafc3ceecdb
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/leveldata/Heightmap.dat
deleted file mode 100644
index fb081369d8..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4cfdf881e642d5ac20411a85164991d7ca8a4428324ad36224675680633fb64b
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/leveldata/Heightmap.dat
deleted file mode 100644
index 1705042d2a..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4ebba3e4761448e928c02417fe0732d7af9dde3fa954a74aaa56c7abbdd6c829
-size 17408234
diff --git a/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/leveldata/Heightmap.dat
deleted file mode 100644
index 6422240323..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6476315967452f205596689e576e4b4bb834b3122bb3976e84fc1a42abf8e9cd
-size 17408330
diff --git a/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/leveldata/Heightmap.dat
deleted file mode 100644
index eb4935beb0..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fff150891e6035904d35d3821aa2df85af7ed0bc3d9c8780e4bd186dc1ab7216
-size 273031
diff --git a/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/leveldata/Heightmap.dat
deleted file mode 100644
index 47884d0c4e..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:95f16f7ae156afe5d252b95c9b5bfd2ad5f8c0f918888bd1fbc48407708723ab
-size 272967
diff --git a/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/leveldata/Heightmap.dat
deleted file mode 100644
index 44e7c48c98..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3ebda4f2e5bcf223ba1bc6273c49cc641e433c15a343fdbcdb3cab20bbd98c10
-size 17407722
diff --git a/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/leveldata/Heightmap.dat
deleted file mode 100644
index 1853f40c9d..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f488c4b02efeebb8528a42b2259cb96a40e29d366fa629bae625dff6666621d7
-size 17407721
diff --git a/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/leveldata/Heightmap.dat
deleted file mode 100644
index 536deab727..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:97b22d6b0f426fd22f68f1cd08a2a39bae75644f2f54003a1191f7273e69734a
-size 272967
diff --git a/AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/leveldata/Heightmap.dat
deleted file mode 100644
index 4581d9bcb6..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f2a85cc698d064f0701bef963afde2908c31d837e6d25afd3d5d4b08838ad47f
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/leveldata/Heightmap.dat
deleted file mode 100644
index b1bbb93cdb..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6d7a8b0e93ea230fe46642f392a3836a95651802f1b23ecff4741d5037bba6db
-size 272903
diff --git a/AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/leveldata/Heightmap.dat
deleted file mode 100644
index 228cdbb6ec..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0b43531ceeb4f2119b4978b2501038e0106a17694b051de49f829349f8f49eb3
-size 17407561
diff --git a/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/leveldata/Heightmap.dat
deleted file mode 100644
index 90757c597e..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f9ee507c0b37dc5c007afee8524e49ae223727847d075b416a9420c99d7b1c15
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/leveldata/Heightmap.dat
deleted file mode 100644
index 77636050c1..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ae5c2fde61764e3f6150ff2b2d15dfaa38c3b0dfe76f0a6ae50f76f85912f781
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/leveldata/Heightmap.dat
deleted file mode 100644
index 4247db13e0..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a1886608dca8428ea53e4d2ea0a749072bde8baab935f593657264fd08a7b924
-size 17407722
diff --git a/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/leveldata/Heightmap.dat
deleted file mode 100644
index 2ec404ff7b..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6dc09aa3d8bcf65faa42043a975b0dce7af7450fe466d297b3b1f803ea8e9a9a
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/leveldata/Heightmap.dat
deleted file mode 100644
index c4f8a2a863..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:664ed8be7bd6521f1d98f373087b1f44f18ae5d7cd2da53325e5a3f588b15e43
-size 272903
diff --git a/AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/leveldata/Heightmap.dat
deleted file mode 100644
index 298e654e19..0000000000
--- a/AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9c2430de76e2e824323072e80c7e7194e803e49639facfbf8293d48e832ae3b8
-size 272903
diff --git a/AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/leveldata/Heightmap.dat
deleted file mode 100644
index 1bc58fdb62..0000000000
--- a/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:885772e6d2bbe859c4de728888970ce003dde3a6b658cf716242a92c0be81f08
-size 272967
diff --git a/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/leveldata/Heightmap.dat
deleted file mode 100644
index e238bc5a3d..0000000000
--- a/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7917bcdcbb3a788e1596b65a47df0efa79d872456775555a478d8d68e104ed5a
-size 272903
diff --git a/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/leveldata/Heightmap.dat
deleted file mode 100644
index 710bb396f3..0000000000
--- a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3af891c31ed9b4023548f6aa65fa224a5af379f27432bd11808479ef678ddd25
-size 272903
diff --git a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/leveldata/Heightmap.dat
deleted file mode 100644
index 47184c77dc..0000000000
--- a/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9ad9563ce944d8ce37af3e7300c5647de79331dfb002fe274e3aef0bf0736956
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/leveldata/Heightmap.dat
deleted file mode 100644
index 75be3478ff..0000000000
--- a/AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:243cd3b6a776732db1093147d5482a458d65603e74fc09058ed5b03ee6e04720
-size 272967
diff --git a/AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/leveldata/Heightmap.dat
deleted file mode 100644
index b1d62c11ff..0000000000
--- a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7c25f6b8480b95ce5ff101e66d829215fe9efc2fca07b474ef11e8062d95ff50
-size 17407722
diff --git a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/leveldata/Heightmap.dat
deleted file mode 100644
index 5454b28cd5..0000000000
--- a/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:185c7b71d452c9d7cfaa28d6c9b782179708b82ab09387919d8ecd1b96df4337
-size 17407722
diff --git a/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/leveldata/Heightmap.dat
deleted file mode 100644
index d2da463d29..0000000000
--- a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9f0e21daaaead505664b5cab3e131e7f0e01de76362cc8b304aef908b842b99d
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/leveldata/Heightmap.dat
deleted file mode 100644
index bf01f8b4b9..0000000000
--- a/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bf77a5ddfd8ff9a9443e551cebb2eadade3b056db8539a81a38f00c3e448882c
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/leveldata/Heightmap.dat
deleted file mode 100644
index 38834c6ffc..0000000000
--- a/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:43364efffb1278e1986537f612899e5ed7777d0a2da624827eb478e3290d3e15
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/leveldata/Heightmap.dat
deleted file mode 100644
index 2b02b6f32c..0000000000
--- a/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b6ad16faf3d9c08e9fc26cf57f6ccfee4870be0b681302499cfcba1b48ed2450
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/leveldata/Heightmap.dat
deleted file mode 100644
index e0bb0dca29..0000000000
--- a/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:957582ad1f2df72a7d8569d15ad5b7d00b711f97a7b85a62af14b45f1e505b83
-size 17407722
diff --git a/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/leveldata/Heightmap.dat
deleted file mode 100644
index 250572b0e2..0000000000
--- a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f97dab20304bc260b744a92a880f99e78ec720796b99910b566bf59b0a1fc96f
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/leveldata/Heightmap.dat
deleted file mode 100644
index 9c45acebe4..0000000000
--- a/AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8067bc2add439a73dc9e2f1971e084e7193359b2b1f48883ced366814dccee53
-size 272968
diff --git a/AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/leveldata/Heightmap.dat
deleted file mode 100644
index b01cafea8e..0000000000
--- a/AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6401692e054f1c4e98be464da6ba46602a54cffa87dedbe7f93f04e5f4c73b38
-size 272967
diff --git a/AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/leveldata/Heightmap.dat
deleted file mode 100644
index fd12b3bcf3..0000000000
--- a/AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:505c3eb789d6033663199730a13290bb5e6c8a64997612bedcf468611b1db84c
-size 1088935
diff --git a/AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/leveldata/Heightmap.dat
deleted file mode 100644
index de654e5c66..0000000000
--- a/AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9094ed2eb22b00e83d2b38400295a1b0499a73f7ce69f08c91476aa53f52d55f
-size 1088936
diff --git a/AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/leveldata/Heightmap.dat
deleted file mode 100644
index cd96b125c5..0000000000
--- a/AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bdfb853736f89ba7370e1d84d14fbdf2bcd0e7947c8ac1d8ef5c974d174805c5
-size 272967
diff --git a/AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/leveldata/Heightmap.dat
deleted file mode 100644
index 88230ecde3..0000000000
--- a/AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:89c8b97f06c2022d93cd6e8998230dc4e4c984bf915f901c64494c31f43ce361
-size 8389601
diff --git a/AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/leveldata/Heightmap.dat
deleted file mode 100644
index f1203cbb38..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b1859b510aefeeef4b56773cb6b9534a8fe9822da42dace360e1275774a4b015
-size 17407722
diff --git a/AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/leveldata/Heightmap.dat
deleted file mode 100644
index c38fc24151..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fd1933b2146650738286a96252a373272fa193ad584cc3fcef1fb63e563f69d5
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/leveldata/Heightmap.dat
deleted file mode 100644
index f4d421c60f..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9c1423ef445819bd6fc431636a33c134c6c233cbe0f691590ff51f25a72a4e65
-size 272903
diff --git a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/leveldata/Heightmap.dat
deleted file mode 100644
index 8c77677ddc..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:41e755a0673feebe74637cb21c48f57cd3f4ddd0bbfe1db56bb0ab425e47e9d7
-size 17407818
diff --git a/AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/terrain/cover.ctc
deleted file mode 100644
index 3b21b4fd38..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c312bc0963da8a266a385bc912f0e6549b3cf6e6c7c45b04ae7cd17cdebcbb35
-size 89393864
diff --git a/AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/leveldata/Heightmap.dat
deleted file mode 100644
index 8c77677ddc..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:41e755a0673feebe74637cb21c48f57cd3f4ddd0bbfe1db56bb0ab425e47e9d7
-size 17407818
diff --git a/AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/terrain/cover.ctc
deleted file mode 100644
index 3b21b4fd38..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c312bc0963da8a266a385bc912f0e6549b3cf6e6c7c45b04ae7cd17cdebcbb35
-size 89393864
diff --git a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/leveldata/Heightmap.dat
deleted file mode 100644
index 24e3dc92aa..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1e38ef80eb942863c2d7c449da1cb94e5e6c3ccf42efed74f51f5d2bf3927410
-size 1088936
diff --git a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/leveldata/Heightmap.dat
deleted file mode 100644
index c93a3463c5..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:978fdf9b771a3e0ca49fedeeb8c40efddb65d0f84bdf5cd93dfe07fcf9f5c2ba
-size 272903
diff --git a/AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/leveldata/Heightmap.dat
deleted file mode 100644
index 7bea75cd29..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3f82438d7e79d1c519bc46520a138b262358a3b2f930fa85335ba8123cbeac64
-size 272903
diff --git a/AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/leveldata/Heightmap.dat
deleted file mode 100644
index 8656f8dc82..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:887a277eb6c0394aebf2c1b45bb97c308fdae9b77d5a2d4c435459226ea43315
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/leveldata/Heightmap.dat
deleted file mode 100644
index a28794f59b..0000000000
--- a/AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bd2bb7c49590bdcb95a536e6bb307a6ce4f3290d5575074c71af9929bd815d4b
-size 273032
diff --git a/AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/leveldata/Heightmap.dat
deleted file mode 100644
index 4cc409be9e..0000000000
--- a/AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0a0ae4b840bc786cde6baaa104b4cd307559ae669191c1193dcc16e1900345f4
-size 17401625
diff --git a/AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/leveldata/Heightmap.dat
deleted file mode 100644
index f6a994dfc8..0000000000
--- a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8fc79df6e76e7a1b78e868a1b38270a20c4f6f01bf75d8f041ed31b54bcd0f18
-size 17407883
diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/terrain/cover.ctc
deleted file mode 100644
index 3b21b4fd38..0000000000
--- a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c312bc0963da8a266a385bc912f0e6549b3cf6e6c7c45b04ae7cd17cdebcbb35
-size 89393864
diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/leveldata/Heightmap.dat
deleted file mode 100644
index bd76461f43..0000000000
--- a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:82ff0215eec3b56e30c98552229873f9c8171780f064514904fc9c2dc6a06ec5
-size 272968
diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/leveldata/Heightmap.dat
deleted file mode 100644
index fc4176f1d7..0000000000
--- a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1d05be295505fac28ccf838b2693cb8d9728831b7ff755e39f924b3d553c0d33
-size 278507435
diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/terrain/cover.ctc
deleted file mode 100644
index 3b21b4fd38..0000000000
--- a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c312bc0963da8a266a385bc912f0e6549b3cf6e6c7c45b04ae7cd17cdebcbb35
-size 89393864
diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/leveldata/Heightmap.dat
deleted file mode 100644
index e300eeda72..0000000000
--- a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:01b31f5b7a47a98458a8bc41564ca044e1290aaaf03aab45930cbb3665cdcdb2
-size 4352744
diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/leveldata/Heightmap.dat
deleted file mode 100644
index 758aa5bc34..0000000000
--- a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2e8e198c676660fb0ee41dc26a819a446d22e8191b656c5cf1938c8e84662eb5
-size 17407722
diff --git a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/leveldata/Heightmap.dat
deleted file mode 100644
index 46362b012e..0000000000
--- a/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8f3e14eb70dd43e5de38f7bf7f6289662a5cec5e3a9b0f4491c9885cf7794b4f
-size 272967
diff --git a/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/leveldata/Heightmap.dat
deleted file mode 100644
index bb848da4ed..0000000000
--- a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:37ea00154e4dcab65e12ee8ca194cb66838bb82529431f4d091cd9c2c79156ed
-size 272967
diff --git a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/leveldata/Heightmap.dat
deleted file mode 100644
index b9ccb9a4d9..0000000000
--- a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f5bd283a1f7d6773603be60d0f68b5dd638ad67af600b77a34ce0c0313c2a9ea
-size 272967
diff --git a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/leveldata/Heightmap.dat
deleted file mode 100644
index adc6d8cd8a..0000000000
--- a/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:43ca971f0dc9e3a742df0c9b3823ba91893509d46cd58394a44b0cdb23398a7f
-size 272967
diff --git a/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/leveldata/Heightmap.dat
deleted file mode 100644
index 2819a15ca8..0000000000
--- a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d6da98fed444511cfbf7c816f58644647997ffae6ad95e00fc047be7d2e091aa
-size 17407722
diff --git a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/leveldata/Heightmap.dat
deleted file mode 100644
index d4569021f5..0000000000
--- a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:111764017407ee2fd7e2be64cd121f8347dc9d706a7964f381f9bcd351a33e30
-size 272967
diff --git a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/leveldata/Heightmap.dat
deleted file mode 100644
index 88230ecde3..0000000000
--- a/AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:89c8b97f06c2022d93cd6e8998230dc4e4c984bf915f901c64494c31f43ce361
-size 8389601
diff --git a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/Heightmap.dat
deleted file mode 100644
index 5b2f135a91..0000000000
--- a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c9729210c30daa9177bd8457f2780ed77bae8de6cd15a62bff3a07c52bb603b4
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/Heightmap.dat
deleted file mode 100644
index f54f95b8d2..0000000000
--- a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f5f28abec553b0e796914564800808ea83c15373b89a72e77c06beb1b79118c3
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/Heightmap.dat
deleted file mode 100644
index edf807fd0c..0000000000
--- a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0dba21e478e2062ae68a2309889fa847df1c93306fa92e23989ab99d1a402bee
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/Heightmap.dat
deleted file mode 100644
index 1b7661ff99..0000000000
--- a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a01c0912336c4a1484231d245e4f8d49189e9f6295f1644672bd2443c2504d75
-size 17408042
diff --git a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/EnablingGravityWorks/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/EnablingGravityWorks/leveldata/Heightmap.dat
deleted file mode 100644
index 29cd5e7a62..0000000000
--- a/AutomatedTesting/Levels/Physics/EnablingGravityWorks/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:296d54a50af0194ce6cfc2dbfc20b45f6ca0b22e131fbbc7efb2fa71819e0125
-size 17407722
diff --git a/AutomatedTesting/Levels/Physics/EnablingGravityWorks/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/EnablingGravityWorks/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/EnablingGravityWorks/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Physics/NameNode_Prints/LevelData/Heightmap.dat b/AutomatedTesting/Levels/Physics/NameNode_Prints/LevelData/Heightmap.dat
deleted file mode 100644
index f3e0ef3b30..0000000000
--- a/AutomatedTesting/Levels/Physics/NameNode_Prints/LevelData/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bc68622cb0490202b77ef121e6477cba595563fe48b388e3656e5f83d75326ab
-size 17407508
diff --git a/AutomatedTesting/Levels/Physics/Physmaterial_Editor_Test/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/Physmaterial_Editor_Test/leveldata/Heightmap.dat
deleted file mode 100644
index d3415a29e8..0000000000
--- a/AutomatedTesting/Levels/Physics/Physmaterial_Editor_Test/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:02166a294304ad1b49e0657612066fad67f8c6a534ff29391e096d5f7f02a530
-size 17407562
diff --git a/AutomatedTesting/Levels/Physics/Physmaterial_Editor_Test/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/Physmaterial_Editor_Test/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Physics/Physmaterial_Editor_Test/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Prefab/PrefabLevel_OpensLevelWithEntities/PrefabLevel_OpensLevelWithEntities.prefab b/AutomatedTesting/Levels/Prefab/PrefabLevel_OpensLevelWithEntities/PrefabLevel_OpensLevelWithEntities.prefab
new file mode 100644
index 0000000000..0776f25935
--- /dev/null
+++ b/AutomatedTesting/Levels/Prefab/PrefabLevel_OpensLevelWithEntities/PrefabLevel_OpensLevelWithEntities.prefab
@@ -0,0 +1,171 @@
+{
+ "Source": "Levels/PrefabLevel_OpensLevelWithEntities/PrefabLevel_OpensLevelWithEntities.prefab",
+ "ContainerEntity": {
+ "Id": "Entity_[403811863694]",
+ "Name": "Level",
+ "Components": {
+ "Component_[10582285743525614098]": {
+ "$type": "SelectionComponent",
+ "Id": 10582285743525614098
+ },
+ "Component_[12253783095375428046]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 12253783095375428046
+ },
+ "Component_[13764860261821571747]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 13764860261821571747,
+ "Parent Entity": ""
+ },
+ "Component_[15844324401733835865]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 15844324401733835865
+ },
+ "Component_[1605854641405361768]": {
+ "$type": "EditorLockComponent",
+ "Id": 1605854641405361768
+ },
+ "Component_[17698173984524983803]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 17698173984524983803
+ },
+ "Component_[3444251662966224826]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 3444251662966224826
+ },
+ "Component_[4231768881195179982]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 4231768881195179982
+ },
+ "Component_[4722360315410084479]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 4722360315410084479
+ },
+ "Component_[7614719100624882952]": {
+ "$type": "EditorPrefabComponent",
+ "Id": 7614719100624882952
+ },
+ "Component_[9585901769691795481]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 9585901769691795481
+ }
+ },
+ "IsDependencyReady": true
+ },
+ "Entities": {
+ "Entity_[438171602062]": {
+ "Id": "Entity_[438171602062]",
+ "Name": "EntityWithPxCollider",
+ "Components": {
+ "Component_[11161653124805884473]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 11161653124805884473
+ },
+ "Component_[13116773315299882093]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 13116773315299882093
+ },
+ "Component_[15820915681461536711]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 15820915681461536711
+ },
+ "Component_[2222061938345834243]": {
+ "$type": "SelectionComponent",
+ "Id": 2222061938345834243
+ },
+ "Component_[3861913165076405600]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 3861913165076405600
+ },
+ "Component_[7118587015611303204]": {
+ "$type": "EditorLockComponent",
+ "Id": 7118587015611303204
+ },
+ "Component_[7751174327125555504]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 7751174327125555504
+ },
+ "Component_[8304730147756374057]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 8304730147756374057,
+ "Parent Entity": "Entity_[403811863694]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 20.0,
+ 34.0
+ ]
+ }
+ },
+ "Component_[8866353210615920259]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 8866353210615920259
+ },
+ "Component_[8988181228601932779]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 8988181228601932779
+ },
+ "Component_[7103333782129541775]": {
+ "$type": "EditorColliderComponent",
+ "Id": 7103333782129541775
+ }
+ },
+ "IsDependencyReady": true
+ },
+ "Entity_[532660882574]": {
+ "Id": "Entity_[532660882574]",
+ "Name": "EmptyEntity",
+ "Components": {
+ "Component_[16437814751543997955]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 16437814751543997955
+ },
+ "Component_[16751517102089557119]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 16751517102089557119
+ },
+ "Component_[16773275259304187949]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 16773275259304187949
+ },
+ "Component_[17283539636910567200]": {
+ "$type": "SelectionComponent",
+ "Id": 17283539636910567200
+ },
+ "Component_[250004123617033400]": {
+ "$type": "EditorLockComponent",
+ "Id": 250004123617033400
+ },
+ "Component_[2791138963683667073]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 2791138963683667073,
+ "Parent Entity": "Entity_[403811863694]",
+ "Transform Data": {
+ "Translate": [
+ 10.0,
+ 20.0,
+ 30.0
+ ]
+ }
+ },
+ "Component_[3296942400051129145]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 3296942400051129145
+ },
+ "Component_[3422076964671342434]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3422076964671342434
+ },
+ "Component_[3431895414183121731]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 3431895414183121731
+ },
+ "Component_[7072085777705148766]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 7072085777705148766
+ }
+ },
+ "IsDependencyReady": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Levels/Simple/Simple.ly b/AutomatedTesting/Levels/Simple/Simple.ly
index 0148ee6e34..0a063bf8f8 100644
--- a/AutomatedTesting/Levels/Simple/Simple.ly
+++ b/AutomatedTesting/Levels/Simple/Simple.ly
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:804193a2afd68cd1e6bec8155ea11400566f2941fbd6eb0c324839ebcd10192d
-size 8492
+oid sha256:302d6172156e8ed665e44e206d81f54f1b0f1008d73327300ea92f8c1159780b
+size 11820
diff --git a/AutomatedTesting/Levels/Simple/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Simple/leveldata/Heightmap.dat
deleted file mode 100644
index a115a949ea..0000000000
--- a/AutomatedTesting/Levels/Simple/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4f5bed6147984ab47380f219627d57d0d81fee47240ee4f9f22eb36ad891cca8
-size 17407722
diff --git a/AutomatedTesting/Levels/Simple/terrain/cover.ctc b/AutomatedTesting/Levels/Simple/terrain/cover.ctc
deleted file mode 100644
index 758d8ecc7c..0000000000
--- a/AutomatedTesting/Levels/Simple/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:56ababffe6020616ccd87fff0cc5968fc5b15d6f7812ef1f71457544deda53e5
-size 1310792
diff --git a/AutomatedTesting/Levels/TestDependenciesLevel/LevelData/Heightmap.dat b/AutomatedTesting/Levels/TestDependenciesLevel/LevelData/Heightmap.dat
deleted file mode 100644
index f4b5b6a7ec..0000000000
--- a/AutomatedTesting/Levels/TestDependenciesLevel/LevelData/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:33755cbdc3e12d51ebaff02a97ff83632b59d04e15c935e72c819f97a85313ee
-size 17407849
diff --git a/AutomatedTesting/Levels/TestDependenciesLevel/terrain/cover.ctc b/AutomatedTesting/Levels/TestDependenciesLevel/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/TestDependenciesLevel/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Utils/Tracer_ErrorEntity/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Utils/Tracer_ErrorEntity/leveldata/Heightmap.dat
deleted file mode 100644
index 92979fc15b..0000000000
--- a/AutomatedTesting/Levels/Utils/Tracer_ErrorEntity/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1ec97cba81a1332d3ddbf7e792a037b481f98890351ff997eb4c14df608063bf
-size 17407612
diff --git a/AutomatedTesting/Levels/Utils/Tracer_ErrorEntity/terrain/cover.ctc b/AutomatedTesting/Levels/Utils/Tracer_ErrorEntity/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Utils/Tracer_ErrorEntity/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/Utils/Tracer_WarningEntity/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Utils/Tracer_WarningEntity/leveldata/Heightmap.dat
deleted file mode 100644
index d08880d3f7..0000000000
--- a/AutomatedTesting/Levels/Utils/Tracer_WarningEntity/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a4a511fb77ac358234d93b9504d7c4fab728d703599e565c11de82423b6861d7
-size 17407562
diff --git a/AutomatedTesting/Levels/Utils/Tracer_WarningEntity/terrain/cover.ctc b/AutomatedTesting/Levels/Utils/Tracer_WarningEntity/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/Utils/Tracer_WarningEntity/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/WaterSample/WaterSample.ly b/AutomatedTesting/Levels/WaterSample/WaterSample.ly
deleted file mode 100644
index b1899f3710..0000000000
--- a/AutomatedTesting/Levels/WaterSample/WaterSample.ly
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d49aceca5ad4e0b9f46c8127afb5c53b68aa30272950b1abd66fba310977ff0c
-size 15032
diff --git a/AutomatedTesting/Levels/WaterSample/filelist.xml b/AutomatedTesting/Levels/WaterSample/filelist.xml
deleted file mode 100644
index d14b2fdaf2..0000000000
--- a/AutomatedTesting/Levels/WaterSample/filelist.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/AutomatedTesting/Levels/WaterSample/halfsphere.cgf b/AutomatedTesting/Levels/WaterSample/halfsphere.cgf
deleted file mode 100644
index 4426d8a232..0000000000
--- a/AutomatedTesting/Levels/WaterSample/halfsphere.cgf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5f221acd847ec8a15e1333a5163d6d0fd886b8eda46fa7b133f76ddbf1d11216
-size 41472
diff --git a/AutomatedTesting/Levels/WaterSample/halfsphere2.cgf b/AutomatedTesting/Levels/WaterSample/halfsphere2.cgf
deleted file mode 100644
index c776ff68b8..0000000000
--- a/AutomatedTesting/Levels/WaterSample/halfsphere2.cgf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c8e5dcfbe65fd2fd8ea29a38a96e703683c544fd42b9424857b1df3718c7775a
-size 41472
diff --git a/AutomatedTesting/Levels/WaterSample/level.pak b/AutomatedTesting/Levels/WaterSample/level.pak
deleted file mode 100644
index 1753ef4b93..0000000000
--- a/AutomatedTesting/Levels/WaterSample/level.pak
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0378911c27933302042550d5a031a5f9104296162edc2b21e44893f1b8cff969
-size 44124
diff --git a/AutomatedTesting/Levels/WaterSample/leveldata/Environment.xml b/AutomatedTesting/Levels/WaterSample/leveldata/Environment.xml
deleted file mode 100644
index 6a95c631bb..0000000000
--- a/AutomatedTesting/Levels/WaterSample/leveldata/Environment.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/AutomatedTesting/Levels/WaterSample/leveldata/Heightmap.dat b/AutomatedTesting/Levels/WaterSample/leveldata/Heightmap.dat
deleted file mode 100644
index faa167e7b9..0000000000
--- a/AutomatedTesting/Levels/WaterSample/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2d279ddb3735d78930a121c8ee861608feadc5d808ec816bf3dc5d577a7f80e6
-size 17409012
diff --git a/AutomatedTesting/Levels/WaterSample/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/WaterSample/leveldata/TerrainTexture.xml
deleted file mode 100644
index 21741afe52..0000000000
--- a/AutomatedTesting/Levels/WaterSample/leveldata/TerrainTexture.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/AutomatedTesting/Levels/WaterSample/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/WaterSample/leveldata/TimeOfDay.xml
deleted file mode 100644
index 60ad405904..0000000000
--- a/AutomatedTesting/Levels/WaterSample/leveldata/TimeOfDay.xml
+++ /dev/null
@@ -1,356 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/AutomatedTesting/Levels/WaterSample/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/WaterSample/leveldata/VegetationMap.dat
deleted file mode 100644
index dce5631cd0..0000000000
--- a/AutomatedTesting/Levels/WaterSample/leveldata/VegetationMap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0e6a5435c928079b27796f6b202bbc2623e7e454244ddc099a3cadf33b7cb9e9
-size 63
diff --git a/AutomatedTesting/Levels/WaterSample/pool.cgf b/AutomatedTesting/Levels/WaterSample/pool.cgf
deleted file mode 100644
index 04bec52a62..0000000000
--- a/AutomatedTesting/Levels/WaterSample/pool.cgf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:12ca8f1942331abde4d58724aea22609c8d7951cc415afa6e5f1c550a14e67b0
-size 363624
diff --git a/AutomatedTesting/Levels/WaterSample/pool2.cgf b/AutomatedTesting/Levels/WaterSample/pool2.cgf
deleted file mode 100644
index 204306f8a8..0000000000
--- a/AutomatedTesting/Levels/WaterSample/pool2.cgf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f5b525a410730d84c0b3e97396d392e1e72f4b894742ddef3de4ede5542b0f8e
-size 86148
diff --git a/AutomatedTesting/Levels/WaterSample/tags.txt b/AutomatedTesting/Levels/WaterSample/tags.txt
deleted file mode 100644
index 0d6c1880e7..0000000000
--- a/AutomatedTesting/Levels/WaterSample/tags.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-0,0,0,0,0,0
-0,0,0,0,0,0
-0,0,0,0,0,0
-0,0,0,0,0,0
-0,0,0,0,0,0
-0,0,0,0,0,0
-0,0,0,0,0,0
-0,0,0,0,0,0
-0,0,0,0,0,0
-0,0,0,0,0,0
-0,0,0,0,0,0
-0,0,0,0,0,0
diff --git a/AutomatedTesting/Levels/WaterSample/terrain/cover.ctc b/AutomatedTesting/Levels/WaterSample/terrain/cover.ctc
deleted file mode 100644
index 0823b8a456..0000000000
--- a/AutomatedTesting/Levels/WaterSample/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:442fe75f06b84d877259b986b69f17f8bb3719f95e87c100ef136a12440706c0
-size 1310792
diff --git a/AutomatedTesting/Levels/WaterSample/terraintexture.pak b/AutomatedTesting/Levels/WaterSample/terraintexture.pak
deleted file mode 100644
index fe3604a050..0000000000
--- a/AutomatedTesting/Levels/WaterSample/terraintexture.pak
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8739c76e681f900923b900c9df0ef75cf421d39cabb54650c4b9ad19b6a76d85
-size 22
diff --git a/AutomatedTesting/Levels/WaterSample/woodland_canyon_river.mtl b/AutomatedTesting/Levels/WaterSample/woodland_canyon_river.mtl
deleted file mode 100644
index 4548bca421..0000000000
--- a/AutomatedTesting/Levels/WaterSample/woodland_canyon_river.mtl
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/AutomatedTesting/Levels/WhiteBox/EmptyLevel/LevelData/Heightmap.dat b/AutomatedTesting/Levels/WhiteBox/EmptyLevel/LevelData/Heightmap.dat
deleted file mode 100644
index 29e3419f1f..0000000000
--- a/AutomatedTesting/Levels/WhiteBox/EmptyLevel/LevelData/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:516a3c2be23cd39ece7cab752845008d2b0940327338667d99f8a9dc934955e7
-size 8389548
diff --git a/AutomatedTesting/Levels/auto_test/LevelData/Heightmap.dat b/AutomatedTesting/Levels/auto_test/LevelData/Heightmap.dat
deleted file mode 100644
index c45e9c55d6..0000000000
--- a/AutomatedTesting/Levels/auto_test/LevelData/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:11035ee2ffa8b8e05694d1e9911bc187ce8d11d44ec21d2e85256348208888cd
-size 17407568
diff --git a/AutomatedTesting/Levels/auto_test/terrain/cover.ctc b/AutomatedTesting/Levels/auto_test/terrain/cover.ctc
deleted file mode 100644
index 5c869c6533..0000000000
--- a/AutomatedTesting/Levels/auto_test/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c
-size 1310792
diff --git a/AutomatedTesting/Levels/ocean_component/LevelData/Heightmap.dat b/AutomatedTesting/Levels/ocean_component/LevelData/Heightmap.dat
deleted file mode 100644
index d8cc5b2c0d..0000000000
--- a/AutomatedTesting/Levels/ocean_component/LevelData/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:dd639fcd1ed23c191ac037b33dc3b592a5a2350d940851ec2206d391b1988a8c
-size 272966
diff --git a/AutomatedTesting/Levels/ocean_component/terrain/cover.ctc b/AutomatedTesting/Levels/ocean_component/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/ocean_component/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Levels/ocean_trackview/leveldata/Heightmap.dat b/AutomatedTesting/Levels/ocean_trackview/leveldata/Heightmap.dat
deleted file mode 100644
index 6e54935add..0000000000
--- a/AutomatedTesting/Levels/ocean_trackview/leveldata/Heightmap.dat
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a5a13103dc7a070193a74e362daea1d152b8c50031db93f9a7689a9a5c8137c2
-size 272903
diff --git a/AutomatedTesting/Levels/ocean_trackview/terrain/cover.ctc b/AutomatedTesting/Levels/ocean_trackview/terrain/cover.ctc
deleted file mode 100644
index 78c2ab6ed5..0000000000
--- a/AutomatedTesting/Levels/ocean_trackview/terrain/cover.ctc
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d4bb4e2ab7876994431f3e6e78a004ea5718e057077b37db14ea8a52637338be
-size 262184
diff --git a/AutomatedTesting/Objects/LumberTank/ProxyGray_ddna.tif.exportsettings b/AutomatedTesting/Objects/LumberTank/ProxyGray_ddna.tif.exportsettings
index 013c774e9e..a4e1a9a3c5 100644
--- a/AutomatedTesting/Objects/LumberTank/ProxyGray_ddna.tif.exportsettings
+++ b/AutomatedTesting/Objects/LumberTank/ProxyGray_ddna.tif.exportsettings
@@ -1 +1 @@
-/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce="es3:1,ios:1,osx_gl:0,pc:0,provo:0"
\ No newline at end of file
+/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce="android:1,ios:1,mac:0,pc:0,provo:0"
\ No newline at end of file
diff --git a/AutomatedTesting/Registry/C3510644_Collider_CollisionGroups.setreg_override b/AutomatedTesting/Registry/C3510644_Collider_CollisionGroups.setreg_override
index 9fa5e26768..696a0a74da 100644
--- a/AutomatedTesting/Registry/C3510644_Collider_CollisionGroups.setreg_override
+++ b/AutomatedTesting/Registry/C3510644_Collider_CollisionGroups.setreg_override
@@ -119,6 +119,9 @@
]
}
},
+ "DefaultMaterial": {
+ "SurfaceType": "Default_1"
+ },
"MaterialLibrary": {
"assetId": {
"guid": "{3A055A3F-8CB7-5FEE-B437-EB365FACD0D4}"
diff --git a/AutomatedTesting/Registry/C4044459_Material_DynamicFriction.setreg_override b/AutomatedTesting/Registry/C4044459_Material_DynamicFriction.setreg_override
new file mode 100644
index 0000000000..c53b04e5c2
--- /dev/null
+++ b/AutomatedTesting/Registry/C4044459_Material_DynamicFriction.setreg_override
@@ -0,0 +1,118 @@
+{
+ "Amazon": {
+ "Gems": {
+ "PhysX": {
+ "PhysXSystemConfiguration": {
+ "CollisionConfig": {
+ "Layers": {
+ "LayerNames": [
+ "Default",
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ "TouchBend"
+ ]
+ },
+ "Groups": {
+ "GroupPresets": [
+ {
+ "Name": "All",
+ "ReadOnly": true
+ },
+ {
+ "Id": {
+ "GroupId": "{CDB6B8D8-5CD0-40A8-874D-839B00A92EBB}"
+ },
+ "Name": "None",
+ "Group": {
+ "Mask": 0
+ },
+ "ReadOnly": true
+ },
+ {
+ "Id": {
+ "GroupId": "{22769429-5D46-429B-829A-0115239D9AAA}"
+ },
+ "Name": "All_NoTouchBend",
+ "Group": {
+ "Mask": 9223372036854775807
+ },
+ "ReadOnly": true
+ }
+ ]
+ }
+ },
+ "DefaultMaterial": {
+ "SurfaceType": "Default_1"
+ },
+ "MaterialLibrary": {
+ "assetId": {
+ "guid": "{6AA79EE4-7EC3-5717-87AE-EDD7D886FD7F}"
+ },
+ "loadBehavior": "QueueLoad",
+ "assetHint": "levels/physics/c4044459_material_dynamicfriction/dynamic_friction.physmaterial"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Registry/C4976227_Collider_NewGroup.setreg_override b/AutomatedTesting/Registry/C4976227_Collider_NewGroup.setreg_override
index afbe6a9d38..5e98e08ede 100644
--- a/AutomatedTesting/Registry/C4976227_Collider_NewGroup.setreg_override
+++ b/AutomatedTesting/Registry/C4976227_Collider_NewGroup.setreg_override
@@ -107,6 +107,9 @@
]
}
},
+ "DefaultMaterial": {
+ "SurfaceType": "Default_1"
+ },
"MaterialLibrary": {
"assetId": {
"guid": "{3A055A3F-8CB7-5FEE-B437-EB365FACD0D4}"
diff --git a/AutomatedTesting/Registry/C4976244_Collider_SameGroupSameLayerCollision.setreg_override b/AutomatedTesting/Registry/C4976244_Collider_SameGroupSameLayerCollision.setreg_override
index 9fa5e26768..696a0a74da 100644
--- a/AutomatedTesting/Registry/C4976244_Collider_SameGroupSameLayerCollision.setreg_override
+++ b/AutomatedTesting/Registry/C4976244_Collider_SameGroupSameLayerCollision.setreg_override
@@ -119,6 +119,9 @@
]
}
},
+ "DefaultMaterial": {
+ "SurfaceType": "Default_1"
+ },
"MaterialLibrary": {
"assetId": {
"guid": "{3A055A3F-8CB7-5FEE-B437-EB365FACD0D4}"
diff --git a/AutomatedTesting/Registry/C4976245_PhysXCollider_CollisionLayerTest.setreg_override b/AutomatedTesting/Registry/C4976245_PhysXCollider_CollisionLayerTest.setreg_override
index 9fa5e26768..696a0a74da 100644
--- a/AutomatedTesting/Registry/C4976245_PhysXCollider_CollisionLayerTest.setreg_override
+++ b/AutomatedTesting/Registry/C4976245_PhysXCollider_CollisionLayerTest.setreg_override
@@ -119,6 +119,9 @@
]
}
},
+ "DefaultMaterial": {
+ "SurfaceType": "Default_1"
+ },
"MaterialLibrary": {
"assetId": {
"guid": "{3A055A3F-8CB7-5FEE-B437-EB365FACD0D4}"
diff --git a/AutomatedTesting/Registry/C4982593_PhysXCollider_CollisionLayer.setreg_override b/AutomatedTesting/Registry/C4982593_PhysXCollider_CollisionLayer.setreg_override
index 9fa5e26768..696a0a74da 100644
--- a/AutomatedTesting/Registry/C4982593_PhysXCollider_CollisionLayer.setreg_override
+++ b/AutomatedTesting/Registry/C4982593_PhysXCollider_CollisionLayer.setreg_override
@@ -119,6 +119,9 @@
]
}
},
+ "DefaultMaterial": {
+ "SurfaceType": "Default_1"
+ },
"MaterialLibrary": {
"assetId": {
"guid": "{3A055A3F-8CB7-5FEE-B437-EB365FACD0D4}"
diff --git a/AutomatedTesting/Registry/authenticationProvider.setreg b/AutomatedTesting/Registry/authenticationProvider.setreg
new file mode 100644
index 0000000000..c90433468c
--- /dev/null
+++ b/AutomatedTesting/Registry/authenticationProvider.setreg
@@ -0,0 +1,5 @@
+{
+ "AWS":
+ {
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Registry/awscoreconfiguration.setreg b/AutomatedTesting/Registry/awscoreconfiguration.setreg
new file mode 100644
index 0000000000..b7c60b0fb9
--- /dev/null
+++ b/AutomatedTesting/Registry/awscoreconfiguration.setreg
@@ -0,0 +1,10 @@
+{
+ "Amazon":
+ {
+ "AWSCore":
+ {
+ "ProfileName": "AWSAutomationTest",
+ "ResourceMappingConfigFileName": "aws_resource_mappings.json"
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Registry/physxsystemconfiguration.setreg b/AutomatedTesting/Registry/physxsystemconfiguration.setreg
index 02f65b685b..30e9dced44 100644
--- a/AutomatedTesting/Registry/physxsystemconfiguration.setreg
+++ b/AutomatedTesting/Registry/physxsystemconfiguration.setreg
@@ -101,6 +101,9 @@
]
}
},
+ "DefaultMaterial": {
+ "SurfaceType": "Default_1"
+ },
"MaterialLibrary": {
"assetId": {
"guid": "{3A055A3F-8CB7-5FEE-B437-EB365FACD0D4}"
diff --git a/AutomatedTesting/ScriptCanvas/T92569006_ScriptCanvas.scriptcanvas b/AutomatedTesting/ScriptCanvas/T92569006_ScriptCanvas.scriptcanvas
new file mode 100644
index 0000000000..626ee29d96
--- /dev/null
+++ b/AutomatedTesting/ScriptCanvas/T92569006_ScriptCanvas.scriptcanvas
@@ -0,0 +1,1952 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AutomatedTesting/Slices/1m_Cube.slice b/AutomatedTesting/Slices/1m_Cube.slice
index 5ace34bd10..b31869c7fa 100644
--- a/AutomatedTesting/Slices/1m_Cube.slice
+++ b/AutomatedTesting/Slices/1m_Cube.slice
@@ -39,6 +39,7 @@
+
@@ -61,7 +62,7 @@
-
+
@@ -122,38 +123,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/AutomatedTesting/TestAssets/MaxIteration31Deep.txt b/AutomatedTesting/TestAssets/MaxIteration31Deep.txt
index e9e8f94715..d0ac57c883 100644
--- a/AutomatedTesting/TestAssets/MaxIteration31Deep.txt
+++ b/AutomatedTesting/TestAssets/MaxIteration31Deep.txt
@@ -1,3 +1,3 @@
The dependency scanner has a built in limit to how deep it will recurse when multiple results exist on the same line.
This file has a single line with 10 invalid UUIDs, and an 11th valid UUID.
-1: 00000000-0000-0000-0000-000000000000, 2: 00000000-0000-0000-0000-000000000000, 3: 00000000-0000-0000-0000-000000000000, 4: 00000000-0000-0000-0000-000000000000, 5: 00000000-0000-0000-0000-000000000000, 6: 00000000-0000-0000-0000-000000000000, 7: 00000000-0000-0000-0000-000000000000, 8: 00000000-0000-0000-0000-000000000000, 9: 00000000-0000-0000-0000-000000000000, 10: 00000000-0000-0000-0000-000000000000, 11: 00000000-0000-0000-0000-000000000000, 12: 00000000-0000-0000-0000-000000000000, 13: 00000000-0000-0000-0000-000000000000, 14: 00000000-0000-0000-0000-000000000000, 15: 00000000-0000-0000-0000-000000000000, 16: 00000000-0000-0000-0000-000000000000, 17: 00000000-0000-0000-0000-000000000000, 18: 00000000-0000-0000-0000-000000000000, 19: 00000000-0000-0000-0000-000000000000, 20: 00000000-0000-0000-0000-000000000000, 21: 00000000-0000-0000-0000-000000000000, 22: 00000000-0000-0000-0000-000000000000, 23: 00000000-0000-0000-0000-000000000000, 24: 00000000-0000-0000-0000-000000000000, 25: 00000000-0000-0000-0000-000000000000, 26: 00000000-0000-0000-0000-000000000000, 27: 00000000-0000-0000-0000-000000000000, 28: 00000000-0000-0000-0000-000000000000, 29: 00000000-0000-0000-0000-000000000000, 30: 00000000-0000-0000-0000-000000000000, 31 (valid UUID, game . xml): B92667DC-9F5B-5D72-A29D-99219DD9B691
+1: 00000000-0000-0000-0000-000000000000, 2: 00000000-0000-0000-0000-000000000000, 3: 00000000-0000-0000-0000-000000000000, 4: 00000000-0000-0000-0000-000000000000, 5: 00000000-0000-0000-0000-000000000000, 6: 00000000-0000-0000-0000-000000000000, 7: 00000000-0000-0000-0000-000000000000, 8: 00000000-0000-0000-0000-000000000000, 9: 00000000-0000-0000-0000-000000000000, 10: 00000000-0000-0000-0000-000000000000, 11: 00000000-0000-0000-0000-000000000000, 12: 00000000-0000-0000-0000-000000000000, 13: 00000000-0000-0000-0000-000000000000, 14: 00000000-0000-0000-0000-000000000000, 15: 00000000-0000-0000-0000-000000000000, 16: 00000000-0000-0000-0000-000000000000, 17: 00000000-0000-0000-0000-000000000000, 18: 00000000-0000-0000-0000-000000000000, 19: 00000000-0000-0000-0000-000000000000, 20: 00000000-0000-0000-0000-000000000000, 21: 00000000-0000-0000-0000-000000000000, 22: 00000000-0000-0000-0000-000000000000, 23: 00000000-0000-0000-0000-000000000000, 24: 00000000-0000-0000-0000-000000000000, 25: 00000000-0000-0000-0000-000000000000, 26: 00000000-0000-0000-0000-000000000000, 27: 00000000-0000-0000-0000-000000000000, 28: 00000000-0000-0000-0000-000000000000, 29: 00000000-0000-0000-0000-000000000000, 30: 00000000-0000-0000-0000-000000000000, 31 (valid UUID, libs / particles / milestone2particles . xml): 6BDE282B-49C9-57F7-B071-4B26579BCA9A
diff --git a/AutomatedTesting/TestAssets/OnlyMatchesCorrectLengthUUIDs.txt b/AutomatedTesting/TestAssets/OnlyMatchesCorrectLengthUUIDs.txt
index d49108072a..10bdaec686 100644
--- a/AutomatedTesting/TestAssets/OnlyMatchesCorrectLengthUUIDs.txt
+++ b/AutomatedTesting/TestAssets/OnlyMatchesCorrectLengthUUIDs.txt
@@ -1,15 +1,15 @@
The missing dependency scanner was updated to only look for substrings that are the exact length of UUIDs, separated by word boundaries. This avoids problems with very long numbers causing the scan to stall out and take a long time.
-This is the UUID for dev / AutomatedTesting / Config / Game . xml with an extra UUID character at the beginning. It should not show up in scan results.
-aB92667DC-9F5B-5D72-A29D-99219DD9B691
+This is the UUID for libs / particles / milestone2particles . xml with an extra UUID character at the beginning. It should not show up in scan results.
+a6BDE282B49C957F7B0714B26579BCA9A
-This is the UUID for dev / AutomatedTesting / Config / Editor . xml. It has an extra non-UUID character at the end. It should not show up in scan results.
-06E9D6633C875400A532BCB2C0CA19D6t
+This is the UUID for project . json. It has an extra non-UUID character at the end. It should not show up in scan results.
+B076CDDC14DF50F4A5E97518ABB3E851t
-Two UUIDs, the first invalid a6BDE282B49C957F7B0714B26579BCA9A mixed with a second valid one 58BE9DA51F1753B98CEEEEB10E63454D the same line. The second should show up in scan results.
+Two UUIDs, the first invalid a1CB10C43F3245B93A294C602ADEF95F9 mixed with a second valid one D1265251CC14584AB1CECB10746A2BA0 the same line. The second should show up in scan results.
-UUID for slices / MuzzleFlash . slice, after an equal sign should show up in scan results=747D31D71E62553592226173C49CF97E
+UUID for TestAssets / DependencyScannerAsset . slice, after an equal sign should show up in scan results=837412DFD05F576D81AAACF360463749
-UUID for TestsAssets / WildcardScanTest1 . txt in quotes, should show up in scan results"1CB10C43-F324-5B93-A294-C602ADEF95F9"
+UUID for TestAssets / WildcardScanTest2 . txt in quotes, should show up in scan results"D92C4661C8985E19BD3597CB2318CFA6"
-UUID for Objects / Lumbertank_turret . cgf in curly braces, should up show in scan results{D92C4661C8985E19BD3597CB2318CFA6}
+UUID for TestAssets / SelfReferenceAssetID. txt in curly braces, should up show in scan results{785A05D2483E5B43A2B992ACDAE6E938}
diff --git a/AutomatedTesting/TestAssets/RelativeProductPathsNotDependencies.txt b/AutomatedTesting/TestAssets/RelativeProductPathsNotDependencies.txt
index b2f341a15f..d3975ced7c 100644
--- a/AutomatedTesting/TestAssets/RelativeProductPathsNotDependencies.txt
+++ b/AutomatedTesting/TestAssets/RelativeProductPathsNotDependencies.txt
@@ -1,25 +1,25 @@
These tests are mostly done with files that have a different extension between source and product.
The source scan is done first, and will catch files in the source path.
Product path searching is resolved using "endsWith" logic.
-textures/_dev_purple.dds
+textures/_dev_purple.tif.streamingimage
Back slashes, and project name in the path
-automatedtesting\textures\_dev_stucco.dds
+pc/textures/_dev_stucco.tif.streamingimage
Double back slashes
-textures\\_dev_tan.dds
+textures\\_dev_tan.tif.streamingimage
Casing doesn't match
-TEXTURES/_DEV_WHITE.dds
+TEXTURES/_DEV_WHITE.tif.streamingimage
Some files have multiple extensions, this verifies that won't trip up the scanner.
-textures/_dev_yellow_light.dds.2
-Path inline textures/milestone2/ama_grey_02.dds test
-Path after=textures/_dev_woodland.dds equal sign
+textures/_dev_yellow_light.tif.1002.imagemipchain
+Path inline textures/milestone2/ama_grey_02.tif.streamingimage test
+Path after=textures/_dev_woodland.tif.streamingimage equal sign
Multiple paths on one line
Multiple materials/am_grass1.mtl paths materials/am_rockground.mtl on one line
Path before a UUID
Path materials/floor_tile.mtl before B92667DC-9F5B-5D72-A29D-99219DD9B691 a UUID
Path before an asset ID
-Path ui/milestone2menu.uicanvas before an 2ef92b8D044E5C278E2BB1AC0374A4E7:131072 asset ID
+Path ui/milestone2menu.uicanvas before an 2ef92b8D044E5C278E2BB1AC0374A4E7:1002 asset ID
Path after a UUID
-Path after CEAA362B4E505BCEB827CB92EF40A50E a ui/fonts/lyshineexamples/vera.ttf UUID
+Path after CEAA362B4E505BCEB827CB92EF40A50E a project.json UUID
Path after an asset ID
-Path after {A2482826-053D-5634-A27B-084B1326AAE5}:[196608] an ui/fonts/lyshineexamples/veramono.ttf asset ID
+Path after {A2482826-053D-5634-A27B-084B1326AAE5}:[1002] an libs/particles/milestone2particles.xml asset ID
diff --git a/AutomatedTesting/TestAssets/RelativeSourcePathsNotDependencies.txt b/AutomatedTesting/TestAssets/RelativeSourcePathsNotDependencies.txt
index 27ac8f02dd..a5ae046b11 100644
--- a/AutomatedTesting/TestAssets/RelativeSourcePathsNotDependencies.txt
+++ b/AutomatedTesting/TestAssets/RelativeSourcePathsNotDependencies.txt
@@ -3,6 +3,6 @@ TestAssets/RelativeProductPathsNotDependencies.txt
Back slashes
TestAssets\WildcardScanTest1.txt
Casing doesn't match
-Config/gAME.XML
-Path inline Config/Editor.xml test
+libs/particles/milestone2PARTICLES.XML
+Path inline project.json test
Path after=textures/_dev_Purple.tif equal sign
diff --git a/AutomatedTesting/TestAssets/T92569006.scriptevents b/AutomatedTesting/TestAssets/T92569006.scriptevents
new file mode 100644
index 0000000000..518b1b5733
--- /dev/null
+++ b/AutomatedTesting/TestAssets/T92569006.scriptevents
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AutomatedTesting/TestAssets/ValidAssetIdNotDependency.txt b/AutomatedTesting/TestAssets/ValidAssetIdNotDependency.txt
index 0d677113e0..4cda459232 100644
--- a/AutomatedTesting/TestAssets/ValidAssetIdNotDependency.txt
+++ b/AutomatedTesting/TestAssets/ValidAssetIdNotDependency.txt
@@ -1,5 +1,5 @@
-dev/AutomatedTesting/textures/_dev_Purple.tif, the product ID is for one of the mips.
-{A2482826-053D-5634-A27B-084B1326AAE5}:[196608]
-_dev_Red.tif, another mip, different formatting.
-2ef92b8D044E5C278E2BB1AC0374A4E7:131072
-_dev_White.tif, {D83B36F1-61A6-5001-B191-4D0CE282E236}-327680 asset ID inline.
+ /textures /_dev_Purple . tif, the product ID is for one of the mips.
+{A2482826-053D-5634-A27B-084B1326AAE5}:[1002]
+_dev_Red . tif, another mip, different formatting.
+2ef92b8D044E5C278E2BB1AC0374A4E7:1003
+_dev_White.tif, {D83B36F1-61A6-5001-B191-4D0CE282E236}-1002 asset ID inline.
diff --git a/AutomatedTesting/TestAssets/ValidUUIDsNotDependency.txt b/AutomatedTesting/TestAssets/ValidUUIDsNotDependency.txt
index c6b2cbb0e7..436d6fb628 100644
--- a/AutomatedTesting/TestAssets/ValidUUIDsNotDependency.txt
+++ b/AutomatedTesting/TestAssets/ValidUUIDsNotDependency.txt
@@ -1,18 +1,18 @@
Paths are broken up to avoid having them show up as relative path results.
-This is the UUID for dev / AutomatedTesting / Config / Game . xml
-B92667DC-9F5B-5D72-A29D-99219DD9B691
-This is the UUID for dev / AutomatedTesting / Config / Editor . xml. This tests UUIDs without separators.
-06E9D6633C875400A532BCB2C0CA19D6
+This is the UUID for Materials / Default / AM_UV_v1_1K_source . png
+C67BEA9F-09FF-59AA-A7F0-A52B8F987508
+This is the UUID for libs / particles / milestone2particles . xml. This tests UUIDs without separators.
+6BDE282B49C957F7B0714B26579BCA9A
This is the UUID for SelfReferenceUUID.txt. This tests UUIDs with mixed casing.
33bcee02F3225688ABEE534F6058593F
-This is a UUID mid-line 9886E132-572D-5746-9377-E629AB6C1981, for gems . json
+This is a UUID mid-line B076CDDC-14DF-50F4-A5E9-7518ABB3E851, for project . json
Two UUIDs on the same line
-Two UUIDs 6BDE282B49C957F7B0714B26579BCA9A mixed on 58BE9DA51F1753B98CEEEEB10E63454D the same line
+Two UUIDs 345E5C660D6254FF8D0F7C8EE66A2249 mixed on A26C73D1837E5AE59E68F916FA7C3699 the same line
Test UUIDs and Asset IDs mixed on the same line. Relative paths are handled in the relative path tests.
UUID: slices / MuzzleFlash . slice, AssetID: TestsAssets / WildcardScanTest1 . txt
This 747D31D71E62553592226173C49CF97E uuid is on the line with 1CB10C43F3245B93A294C602ADEF95F9:[0] a valid asset ID
UUID: Objects / Lumbertank_turret . cgf, AssetID: TestsAssets / WildcardScanTest2 . txt
-This D92C4661C8985E19BD3597CB2318CFA6:[0] uuid is on the line with 7364AB2B092F5B0B80601BBC6E53087C a valid asset ID
+This D92C4661C8985E19BD3597CB2318CFA6:[0] uuid is on the line with 37108522F50459499CD6C8D47A960CF1 a valid asset ID
diff --git a/AutomatedTesting/preview.png b/AutomatedTesting/preview.png
index 2191a0ebc2..c6928d31fc 100644
--- a/AutomatedTesting/preview.png
+++ b/AutomatedTesting/preview.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a18fae4040a22d2bb359a8ca642b97bb8f6468eeb52e2826b3b029bd8f1350b6
-size 5466
+oid sha256:b9cd9d6f67440c193a85969ec5c082c6343e6d1fff3b6f209a0a6931eb22dd47
+size 2949
diff --git a/AutomatedTesting/sounds/.gitignore b/AutomatedTesting/sounds/.gitignore
new file mode 100644
index 0000000000..80c66daa1c
--- /dev/null
+++ b/AutomatedTesting/sounds/.gitignore
@@ -0,0 +1,8 @@
+.backup/
+.cache/
+*.log
+*.akd
+*.dat
+*.prof
+*.validationcache
+*.wsettings
\ No newline at end of file
diff --git a/AutomatedTesting/sounds/wwise/Init.bnk b/AutomatedTesting/sounds/wwise/Init.bnk
index 530a7e007f..292288ff26 100644
--- a/AutomatedTesting/sounds/wwise/Init.bnk
+++ b/AutomatedTesting/sounds/wwise/Init.bnk
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:803ddb37eb27cba666f9320c2f5905219193e1a069d1144a64df92fab0e31878
-size 1243
+oid sha256:c9e6a4ef3d2f33f31827ce2bba2ed8bad87324f3fe86f79389ef2956b304a924
+size 1180
diff --git a/AutomatedTesting/sounds/wwise/Init.txt b/AutomatedTesting/sounds/wwise/Init.txt
index 038359ac1a..4b989c4017 100644
--- a/AutomatedTesting/sounds/wwise/Init.txt
+++ b/AutomatedTesting/sounds/wwise/Init.txt
@@ -21,5 +21,4 @@ Audio Bus ID Name Wwise Object Path Notes
Audio Devices ID Name Type Notes
2317455096 No_Output No Output
3859886410 System System
- 4230635974 Default_Motion_Device Wwise Motion
diff --git a/AutomatedTesting/sounds/wwise/PluginInfo.xml b/AutomatedTesting/sounds/wwise/PluginInfo.xml
index 61e689f373..19f3fe9c1b 100644
--- a/AutomatedTesting/sounds/wwise/PluginInfo.xml
+++ b/AutomatedTesting/sounds/wwise/PluginInfo.xml
@@ -1,9 +1,8 @@
-
+
-
-
-
-
+
+
+
diff --git a/AutomatedTesting/sounds/wwise/SoundbanksInfo.xml b/AutomatedTesting/sounds/wwise/SoundbanksInfo.xml
index 22ae71f4dc..d7bfecaa53 100644
--- a/AutomatedTesting/sounds/wwise/SoundbanksInfo.xml
+++ b/AutomatedTesting/sounds/wwise/SoundbanksInfo.xml
@@ -1,11 +1,11 @@
-
+
- Q:\audio\dev\AutomatedTesting\sounds\wwise_project\
- Q:\audio\dev\AutomatedTesting\sounds\wwise_project\.cache\Windows\
- Q:\audio\dev\AutomatedTesting\sounds\wwise\
+ D:\code\o3de\AutomatedTesting\sounds\wwise_project\
+ D:\code\o3de\AutomatedTesting\sounds\wwise_project\.cache\Windows\
+ D:\code\o3de\AutomatedTesting\sounds\wwise\
- Q:\audio\dev\AutomatedTesting\sounds\wwise_project\GeneratedSoundBanks\Windows
+ D:\code\o3de\AutomatedTesting\sounds\wwise_project\GeneratedSoundBanks\Windows
@@ -28,7 +28,7 @@
-
+
\SoundBanks\Default Work Unit\test_bank2
test_bank2
test_bank2.bnk
@@ -37,7 +37,7 @@
-
+
\SoundBanks\Default Work Unit\test_bank3
test_bank3
test_bank3.bnk
@@ -60,7 +60,7 @@
-
+
\SoundBanks\Default Work Unit\test_bank1
test_bank1
test_bank1.bnk
@@ -83,7 +83,7 @@
-
+
\SoundBanks\Default Work Unit\test_bank6
test_bank6
test_bank6.bnk
@@ -102,7 +102,7 @@
-
+
\SoundBanks\Default Work Unit\test_bank7
test_bank7
test_bank7.bnk
@@ -125,7 +125,7 @@
-
+
\SoundBanks\Default Work Unit\test_bank4
test_bank4
test_bank4.bnk
@@ -136,7 +136,7 @@
-
+
\SoundBanks\Default Work Unit\test_bank5
test_bank5
test_bank5.bnk
@@ -169,7 +169,7 @@
-
+
Init
Init
Init.bnk
diff --git a/AutomatedTesting/sounds/wwise/test_bank1.bnk b/AutomatedTesting/sounds/wwise/test_bank1.bnk
index 9e8f50a98a..bd0e1e66cb 100644
--- a/AutomatedTesting/sounds/wwise/test_bank1.bnk
+++ b/AutomatedTesting/sounds/wwise/test_bank1.bnk
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:94ea13931c13592deba669bd4920328ff96f17e6f8fce280d03f00251a96327a
-size 94122
+oid sha256:3db299d7d823b649ff20a7ffc986dccfce1fa3189f178491e2712d6c00b317af
+size 94126
diff --git a/AutomatedTesting/sounds/wwise/test_bank1.txt b/AutomatedTesting/sounds/wwise/test_bank1.txt
index a0c6e13621..5ec2e4b96b 100644
--- a/AutomatedTesting/sounds/wwise/test_bank1.txt
+++ b/AutomatedTesting/sounds/wwise/test_bank1.txt
@@ -3,8 +3,8 @@ Event ID Name Wwise Object Path Notes
865645077 test_event_1_bank1_embedded_target \Default Work Unit\test_event_1_bank1_embedded_target
In Memory Audio ID Name Audio source file Wwise Object Path Notes Data Size
- 23965881 test_sfx_1_bank1_embedded Q:\audio\dev\AutomatedTesting\sounds\wwise_project\.cache\Windows\SFX\AMZ_sfx_NME_wpn_plasma_pistol_fire_impact004_56D34C19.wem \Actor-Mixer Hierarchy\Default Work Unit\test_sfx_1_bank1_embedded 93864
+ 23965881 test_sfx_1_bank1_embedded D:\code\o3de\AutomatedTesting\sounds\wwise_project\.cache\Windows\SFX\AMZ_sfx_NME_wpn_plasma_pistol_fire_impact004_56D34C19.wem \Actor-Mixer Hierarchy\Default Work Unit\test_sfx_1_bank1_embedded 93864
Streamed Audio ID Name Audio source file Generated audio file Wwise Object Path Notes
- 499820003 test_sfx_2_bank1_streamed Q:\audio\dev\AutomatedTesting\sounds\wwise_project\.cache\Windows\SFX\env_door_scanner_scan_success_56D34C19.wem 499820003.wem \Actor-Mixer Hierarchy\Default Work Unit\test_sfx_2_bank1_streamed
+ 499820003 test_sfx_2_bank1_streamed D:\code\o3de\AutomatedTesting\sounds\wwise_project\.cache\Windows\SFX\env_door_scanner_scan_success_56D34C19.wem 499820003.wem \Actor-Mixer Hierarchy\Default Work Unit\test_sfx_2_bank1_streamed
diff --git a/AutomatedTesting/sounds/wwise/test_bank2.bnk b/AutomatedTesting/sounds/wwise/test_bank2.bnk
index 2e31c359bf..ee96554646 100644
--- a/AutomatedTesting/sounds/wwise/test_bank2.bnk
+++ b/AutomatedTesting/sounds/wwise/test_bank2.bnk
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ad73fd0981e47fe3313eff51d2841ea5fd522a99103684d696849e7353277ea9
-size 430
+oid sha256:1bdaed4dc5cc514a8a3ddfaf990f59061514af7962a7a112eb677ad5c45fcb85
+size 434
diff --git a/AutomatedTesting/sounds/wwise/test_bank3.bankdeps b/AutomatedTesting/sounds/wwise/test_bank3.bankdeps
index 606dbdbac8..51a952d463 100644
--- a/AutomatedTesting/sounds/wwise/test_bank3.bankdeps
+++ b/AutomatedTesting/sounds/wwise/test_bank3.bankdeps
@@ -2,9 +2,9 @@
"version": "1.0",
"bankName": "test_bank3.bnk",
"dependencies": [
- "196049145.wem",
+ "test_bank4.bnk",
"Init.bnk",
- "test_bank4.bnk"
+ "196049145.wem"
],
"includedEvents": [
"test_event_5_bank3_embedded_target_bank4",
diff --git a/AutomatedTesting/sounds/wwise/test_bank3.bnk b/AutomatedTesting/sounds/wwise/test_bank3.bnk
index 32e6161e6c..6b83836c18 100644
--- a/AutomatedTesting/sounds/wwise/test_bank3.bnk
+++ b/AutomatedTesting/sounds/wwise/test_bank3.bnk
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:33eabaa646e9567017946bee05b1b5a835e91862f63145ebe5a2fbdd9c9f5a49
-size 226
+oid sha256:57c75cf8745b31071a788a20d8de5a60cedbfb8a6155eae1a461b8c6501e5479
+size 230
diff --git a/AutomatedTesting/sounds/wwise/test_bank3.txt b/AutomatedTesting/sounds/wwise/test_bank3.txt
index ca6efc6e02..9a843afad7 100644
--- a/AutomatedTesting/sounds/wwise/test_bank3.txt
+++ b/AutomatedTesting/sounds/wwise/test_bank3.txt
@@ -3,5 +3,5 @@ Event ID Name Wwise Object Path Notes
645979556 test_event_6_bank3_streamed_target_bank4 \Default Work Unit\test_event_6_bank3_streamed_target_bank4 Event that lives in test_bank3. This event targets only one media, which is streamed from test_bank4.
Streamed Audio ID Name Audio source file Generated audio file Wwise Object Path Notes
- 196049145 test_sfx_6_bank4_streamed Q:\audio\dev\AutomatedTesting\sounds\wwise_project\.cache\Windows\SFX\AMZ_sfx_NME_wpn_plasma_pistol_fire003_56D34C19.wem 196049145.wem \Actor-Mixer Hierarchy\Default Work Unit\test_sfx_6_bank4_streamed
+ 196049145 test_sfx_6_bank4_streamed D:\code\o3de\AutomatedTesting\sounds\wwise_project\.cache\Windows\SFX\AMZ_sfx_NME_wpn_plasma_pistol_fire003_56D34C19.wem 196049145.wem \Actor-Mixer Hierarchy\Default Work Unit\test_sfx_6_bank4_streamed
diff --git a/AutomatedTesting/sounds/wwise/test_bank4.bnk b/AutomatedTesting/sounds/wwise/test_bank4.bnk
index e169744d84..5f5883d559 100644
--- a/AutomatedTesting/sounds/wwise/test_bank4.bnk
+++ b/AutomatedTesting/sounds/wwise/test_bank4.bnk
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:79d308f3c50fece383fd82fd0060e26558e6a2e78a4ecd5d8afe24907489a88f
+oid sha256:3a635f7d1ccb256caed90d18ca566cd0fa56d49b491af7c88c0b5da55a3ef4fe
size 142234
diff --git a/AutomatedTesting/sounds/wwise/test_bank4.txt b/AutomatedTesting/sounds/wwise/test_bank4.txt
index 770cb7f171..7649b0eed5 100644
--- a/AutomatedTesting/sounds/wwise/test_bank4.txt
+++ b/AutomatedTesting/sounds/wwise/test_bank4.txt
@@ -1,3 +1,3 @@
In Memory Audio ID Name Audio source file Wwise Object Path Notes Data Size
- 666825490 test_sfx_5_bank4_embedded Q:\audio\dev\AutomatedTesting\sounds\wwise_project\.cache\Windows\SFX\AMZN_sfx_env_commsarray_apllyupdate_end_56D34C19.wem \Actor-Mixer Hierarchy\Default Work Unit\test_sfx_5_bank4_embedded 142170
+ 666825490 test_sfx_5_bank4_embedded D:\code\o3de\AutomatedTesting\sounds\wwise_project\.cache\Windows\SFX\AMZN_sfx_env_commsarray_apllyupdate_end_56D34C19.wem \Actor-Mixer Hierarchy\Default Work Unit\test_sfx_5_bank4_embedded 142170
diff --git a/AutomatedTesting/sounds/wwise/test_bank5.bnk b/AutomatedTesting/sounds/wwise/test_bank5.bnk
index b4e629d9a7..168c7c1a4d 100644
--- a/AutomatedTesting/sounds/wwise/test_bank5.bnk
+++ b/AutomatedTesting/sounds/wwise/test_bank5.bnk
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:80c02f30d439ffcfb479e4a82b0269fe4f479c50019028e51f0fa6e3fea0bfdd
-size 290
+oid sha256:fa329eeb83184e88b7ab26fbff2479a98232210bcd130801041b20ccb3bcf16e
+size 294
diff --git a/AutomatedTesting/sounds/wwise/test_bank5.txt b/AutomatedTesting/sounds/wwise/test_bank5.txt
index 0f66c57f8e..3d560cf9f5 100644
--- a/AutomatedTesting/sounds/wwise/test_bank5.txt
+++ b/AutomatedTesting/sounds/wwise/test_bank5.txt
@@ -5,5 +5,5 @@ Event ID Name Wwise Object Path Notes
3546419658 test_event_7_bank5_referenced_event_bank1_embedded \Default Work Unit\test_event_7_bank5_referenced_event_bank1_embedded
Streamed Audio ID Name Audio source file Generated audio file Wwise Object Path Notes
- 499820003 test_sfx_2_bank1_streamed Q:\audio\dev\AutomatedTesting\sounds\wwise_project\.cache\Windows\SFX\env_door_scanner_scan_success_56D34C19.wem 499820003.wem \Actor-Mixer Hierarchy\Default Work Unit\test_sfx_2_bank1_streamed
+ 499820003 test_sfx_2_bank1_streamed D:\code\o3de\AutomatedTesting\sounds\wwise_project\.cache\Windows\SFX\env_door_scanner_scan_success_56D34C19.wem 499820003.wem \Actor-Mixer Hierarchy\Default Work Unit\test_sfx_2_bank1_streamed
diff --git a/AutomatedTesting/sounds/wwise/test_bank6.bnk b/AutomatedTesting/sounds/wwise/test_bank6.bnk
index 18ee92b51d..4c942037f0 100644
--- a/AutomatedTesting/sounds/wwise/test_bank6.bnk
+++ b/AutomatedTesting/sounds/wwise/test_bank6.bnk
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:07d132d54b2c747e2409a56c05a4adca0dfa4407b791ffaa6bb14531f92f89aa
-size 494
+oid sha256:80d3014fcfd3a8ff37219515f0c9d67a2a674094002538ac6741702dca07c14d
+size 498
diff --git a/AutomatedTesting/sounds/wwise/test_bank7.bankdeps b/AutomatedTesting/sounds/wwise/test_bank7.bankdeps
index 02be60a544..56cf29c619 100644
--- a/AutomatedTesting/sounds/wwise/test_bank7.bankdeps
+++ b/AutomatedTesting/sounds/wwise/test_bank7.bankdeps
@@ -2,9 +2,9 @@
"version": "1.0",
"bankName": "test_bank7.bnk",
"dependencies": [
+ "656567798.wem",
"601903616.wem",
- "Init.bnk",
- "656567798.wem"
+ "Init.bnk"
],
"includedEvents": [
"test_event_11_bank7_streamed_target",
diff --git a/AutomatedTesting/sounds/wwise/test_bank7.bnk b/AutomatedTesting/sounds/wwise/test_bank7.bnk
index abc398d1f1..c01346fd58 100644
--- a/AutomatedTesting/sounds/wwise/test_bank7.bnk
+++ b/AutomatedTesting/sounds/wwise/test_bank7.bnk
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:990538a33c72e79d63cab0c191b4e0f199688b923bb6bdcc8888aab375e7d11d
-size 226
+oid sha256:0de33094b9792d7f9ff8042e16b153dd76729e9010d6713e1824d2229c653042
+size 230
diff --git a/AutomatedTesting/sounds/wwise/test_bank7.txt b/AutomatedTesting/sounds/wwise/test_bank7.txt
index 033c2ea5b9..3bf2da686b 100644
--- a/AutomatedTesting/sounds/wwise/test_bank7.txt
+++ b/AutomatedTesting/sounds/wwise/test_bank7.txt
@@ -3,6 +3,6 @@ Event ID Name Wwise Object Path Notes
2110064689 test_event_11_bank7_streamed_target \Default Work Unit\test_event_11_bank7_streamed_target
Streamed Audio ID Name Audio source file Generated audio file Wwise Object Path Notes
- 601903616 test_sfx_8_bank7_streamed Q:\audio\dev\AutomatedTesting\sounds\wwise_project\.cache\Windows\SFX\gun_blaster_no_trigger_shot_1_56D34C19.wem 601903616.wem \Actor-Mixer Hierarchy\Default Work Unit\test_sfx_8_bank7_streamed
- 656567798 test_sfx_7_bank7_streamed Q:\audio\dev\AutomatedTesting\sounds\wwise_project\.cache\Windows\SFX\impact_bot_hits_metalelement_56D34C19.wem 656567798.wem \Actor-Mixer Hierarchy\Default Work Unit\test_sfx_7_bank7_streamed
+ 601903616 test_sfx_8_bank7_streamed D:\code\o3de\AutomatedTesting\sounds\wwise_project\.cache\Windows\SFX\gun_blaster_no_trigger_shot_1_56D34C19.wem 601903616.wem \Actor-Mixer Hierarchy\Default Work Unit\test_sfx_8_bank7_streamed
+ 656567798 test_sfx_7_bank7_streamed D:\code\o3de\AutomatedTesting\sounds\wwise_project\.cache\Windows\SFX\impact_bot_hits_metalelement_56D34C19.wem 656567798.wem \Actor-Mixer Hierarchy\Default Work Unit\test_sfx_7_bank7_streamed
diff --git a/AutomatedTesting/sounds/wwise_project/Actor-Mixer Hierarchy/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Actor-Mixer Hierarchy/Default Work Unit.wwu
index 8cc6eeecc2..33ac513281 100644
--- a/AutomatedTesting/sounds/wwise_project/Actor-Mixer Hierarchy/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Actor-Mixer Hierarchy/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
@@ -21,6 +21,7 @@
+
@@ -50,6 +51,7 @@
+
@@ -72,6 +74,7 @@
+
@@ -101,6 +104,7 @@
+
@@ -130,6 +134,7 @@
+
@@ -159,6 +164,7 @@
+
@@ -187,6 +193,7 @@
SFX
+
@@ -215,6 +222,7 @@
SFX
+
diff --git a/AutomatedTesting/sounds/wwise_project/Attenuations/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Attenuations/Default Work Unit.wwu
index 9034f07366..955c7d9e4a 100644
--- a/AutomatedTesting/sounds/wwise_project/Attenuations/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Attenuations/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Audio Devices/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Audio Devices/Default Work Unit.wwu
index 472e9b12d1..f56682b0bf 100644
--- a/AutomatedTesting/sounds/wwise_project/Audio Devices/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Audio Devices/Default Work Unit.wwu
@@ -1,11 +1,10 @@
-
+
-
diff --git a/AutomatedTesting/sounds/wwise_project/AutomatedTesting.wproj b/AutomatedTesting/sounds/wwise_project/AutomatedTesting.wproj
new file mode 100644
index 0000000000..1aead159ad
--- /dev/null
+++ b/AutomatedTesting/sounds/wwise_project/AutomatedTesting.wproj
@@ -0,0 +1,13491 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GeneratedSoundBanks\Windows
+
+
+
+
+ 256
+
+
+
+
+
+ ..\wwise\
+
+
+
+
+ Copy Streamed Files and Generate Dependency Info
+
+
+
+
+ "$(CopyStreamedFilesExePath)" -info "$(InfoFilePath)" -outputpath "$(SoundBankPath)" -banks "$(SoundBankListAsTextFile)" -languages "$(LanguageList)"
+"$(WwiseProjectPath)\..\..\..\python\python.cmd" "$(WwiseProjectPath)\..\..\..\Gems\AudioEngineWwise\Tools\WwiseAuthoringScripts\bank_info_parser.py" "$(InfoFilePath)" "$(SoundBankPath)"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -80
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 8
+
+
+
+
+ 0
+
+
+
+
+ -1
+
+
+
+
+ -1
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ -1
+
+
+
+
+ -1
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 12
+
+
+
+
+ False
+
+
+
+
+ 20
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 2
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ False
+
+
+
+
+ 65535
+
+
+
+
+ 127
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 60
+
+
+
+
+ 0
+
+
+
+
+ 127
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 50
+
+
+
+
+ False
+
+
+
+
+ -10
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 10000
+
+
+
+
+ 1
+
+
+
+
+ 400
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ 0.5
+
+
+
+
+ 0
+
+
+
+
+ -96
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 16
+
+
+
+
+ -96
+
+
+
+
+ 0
+
+
+
+
+ 48000
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 16
+
+
+
+
+ False
+
+
+
+
+ 1
+
+
+
+
+ 75
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ 512
+
+
+
+
+ -50
+
+
+
+
+ -30
+
+
+
+
+ -40
+
+
+
+
+ 0
+
+
+
+
+ 24024
+
+
+
+
+ 0
+
+
+
+
+ 8
+
+
+
+
+ English(US)
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 256
+
+
+
+
+
+
+
+
+
+ 50
+
+
+
+
+ 100
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ -80
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 5
+
+
+
+
+ 0.5
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 5
+
+
+
+
+ 0.5
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 64
+
+
+
+
+ 1.5
+
+
+
+
+ 2
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 64
+
+
+
+
+ 64
+
+
+
+
+ 4
+
+
+
+
+ 0
+
+
+
+
+ 0.1
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 20
+
+
+
+
+ 10000
+
+
+
+
+ 0.2
+
+
+
+
+ True
+
+
+
+
+ 80
+
+
+
+
+ 0.2
+
+
+
+
+ False
+
+
+
+
+ 200
+
+
+
+
+ 0.25
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 4
+
+
+
+
+ 4
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 10
+
+
+
+
+ 1
+
+
+
+
+ 200
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 10
+
+
+
+
+ 1
+
+
+
+
+ 200
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 40
+
+
+
+
+ 0
+
+
+
+
+ 1000
+
+
+
+
+ 160
+
+
+
+
+ 0
+
+
+
+
+ 0.5
+
+
+
+
+ 0.2
+
+
+
+
+ 0
+
+
+
+
+ 0.5
+
+
+
+
+ 0.2
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 0.2
+
+
+
+
+ 0
+
+
+
+
+ 0.2
+
+
+
+
+ 0.2
+
+
+
+
+ 3000
+
+
+
+
+ 0.2
+
+
+
+
+ 0
+
+
+
+
+ 6
+
+
+
+
+ 15000
+
+
+
+
+ 0
+
+
+
+
+ 1000
+
+
+
+
+ 20000
+
+
+
+
+ 0
+
+
+
+
+ 0.5
+
+
+
+
+ 0.2
+
+
+
+
+ 0
+
+
+
+
+ 0.5
+
+
+
+
+ 0.2
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 12
+
+
+
+
+ False
+
+
+
+
+ 20
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ False
+
+
+
+
+ 65535
+
+
+
+
+ 127
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 60
+
+
+
+
+ 0
+
+
+
+
+ 127
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ False
+
+
+
+
+ -10
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 12
+
+
+
+
+ False
+
+
+
+
+ 20
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ False
+
+
+
+
+ 65535
+
+
+
+
+ 127
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 60
+
+
+
+
+ 0
+
+
+
+
+ 127
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+ 2
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ 50
+
+
+
+
+ False
+
+
+
+
+ -10
+
+
+
+
+ True
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 5
+
+
+
+
+ 0.5
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 5
+
+
+
+
+ 0.5
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 5
+
+
+
+
+ 0.5
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 5
+
+
+
+
+ 0.5
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 5
+
+
+
+
+ 0.5
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 5
+
+
+
+
+ 0.5
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 5000
+
+
+
+
+ 10000
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 3
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 12
+
+
+
+
+ False
+
+
+
+
+ 20
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ False
+
+
+
+
+ 65535
+
+
+
+
+ 127
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 60
+
+
+
+
+ 0
+
+
+
+
+ 127
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ False
+
+
+
+
+ -10
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+
+
+
+
+ 1000
+
+
+
+
+ 5000
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 96
+
+
+
+
+ -100
+
+
+
+
+ -100
+
+
+
+
+ -100
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 35
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ True
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 3
+
+
+
+
+ 9
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 64
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ -96
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ 50
+
+
+
+
+ 50
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 4000
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 12
+
+
+
+
+ False
+
+
+
+
+ 20
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 1
+
+
+
+
+ 50
+
+
+
+
+ False
+
+
+
+
+ -10
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 120
+
+
+
+
+ 4
+
+
+
+
+ 4
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 12
+
+
+
+
+ False
+
+
+
+
+ 20
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 100
+
+
+
+
+ 50
+
+
+
+
+ False
+
+
+
+
+ -10
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 12
+
+
+
+
+ False
+
+
+
+
+ 20
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ False
+
+
+
+
+ 65535
+
+
+
+
+ 127
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 60
+
+
+
+
+ 0
+
+
+
+
+ 127
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ False
+
+
+
+
+ -10
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ -1
+
+
+
+
+ 0
+
+
+
+
+ -1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 12
+
+
+
+
+ False
+
+
+
+
+ 20
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 1
+
+
+
+
+ 50
+
+
+
+
+ False
+
+
+
+
+ -10
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 120
+
+
+
+
+ 4
+
+
+
+
+ 4
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 12
+
+
+
+
+ False
+
+
+
+
+ 20
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 1
+
+
+
+
+ 50
+
+
+
+
+ False
+
+
+
+
+ -10
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 120
+
+
+
+
+ 4
+
+
+
+
+ 4
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 50
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 7
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ -6
+
+
+
+
+ 0
+
+
+
+
+ 90
+
+
+
+
+ 0
+
+
+
+
+ 245
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ 100
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 100
+
+
+
+
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+
+
+
+
+ 4
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 8
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ 0.2
+
+
+
+
+ False
+
+
+
+
+ 0.2
+
+
+
+
+ 0.5
+
+
+
+
+ True
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 4
+
+
+
+
+ 1
+
+
+
+
+ 440
+
+
+
+
+ -12
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 4
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ -12
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ -12
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 10
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 4
+
+
+
+
+ 6
+
+
+
+
+ 5
+
+
+
+
+ 100
+
+
+
+
+ 1000
+
+
+
+
+ 12000
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0.5
+
+
+
+
+ 15
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 25
+
+
+
+
+
+
+
+
+ 0.1
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 1.5
+
+
+
+
+ 0.1
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0.1
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 3
+
+
+
+
+ 0.01
+
+
+
+
+ -40
+
+
+
+
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0.01
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 10
+
+
+
+
+ 0.1
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 1
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 40
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 18000
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ True
+
+
+
+
+ 10
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ -40
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 40
+
+
+
+
+ 18000
+
+
+
+
+ -96
+
+
+
+
+ -20
+
+
+
+
+ 20
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 13.62
+
+
+
+
+ 26.09
+
+
+
+
+ 26.55
+
+
+
+
+ 26.91
+
+
+
+
+ 28.04
+
+
+
+
+ 29.09
+
+
+
+
+ 29.9
+
+
+
+
+ 30.86
+
+
+
+
+ 15.66
+
+
+
+
+ 17.52
+
+
+
+
+ 19.02
+
+
+
+
+ 20.83
+
+
+
+
+ 22.6
+
+
+
+
+ 24.05
+
+
+
+
+ 24.78
+
+
+
+
+ 25.6
+
+
+
+
+ -96.3
+
+
+
+
+ 2
+
+
+
+
+ True
+
+
+
+
+ 8
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 4
+
+
+
+
+ -35
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ -96.3
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 40
+
+
+
+
+ 1.2
+
+
+
+
+ 80
+
+
+
+
+ 50
+
+
+
+
+ 8
+
+
+
+
+ 2
+
+
+
+
+ 100
+
+
+
+
+ 15
+
+
+
+
+ 5
+
+
+
+
+ 66
+
+
+
+
+ -96.3
+
+
+
+
+ 0
+
+
+
+
+ -20
+
+
+
+
+ 23
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 3
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 3
+
+
+
+
+ 1
+
+
+
+
+ 2
+
+
+
+
+ 10000
+
+
+
+
+ 0
+
+
+
+
+ 3
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 2.25
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ -96.3
+
+
+
+
+ -96.3
+
+
+
+
+ False
+
+
+
+
+ 25
+
+
+
+
+ 8
+
+
+
+
+ 0
+
+
+
+
+ -20
+
+
+
+
+ 100
+
+
+
+
+ 50
+
+
+
+
+ 100
+
+
+
+
+ 0.8
+
+
+
+
+ 0.1
+
+
+
+
+ 0
+
+
+
+
+ 180
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 10
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0.5
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 10
+
+
+
+
+ 5
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0.25
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0.5
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ True
+
+
+
+
+ 0.5
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 10
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 10
+
+
+
+
+ 0.5
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 440
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 10
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ 440
+
+
+
+
+ 0
+
+
+
+
+ 10
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 5
+
+
+
+
+ 1
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ True
+
+
+
+
+ 50
+
+
+
+
+ 1
+
+
+
+
+ 50
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 100
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ 50
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ -96.3
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 4
+
+
+
+
+ 0
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ -75
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 6
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 100
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ -96.3
+
+
+
+
+ 0
+
+
+
+
+ -60
+
+
+
+
+ -96.3
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1024
+
+
+
+
+ 48000
+
+
+
+
+ 48000
+
+
+
+
+ 48000
+
+
+
+
+ 180
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ -48
+
+
+
+
+ False
+
+
+
+
+ 0.1
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 2048
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 100
+
+
+
+
+ 1
+
+
+
+
+ 50
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+ Recorder.wav
+
+
+
+
+ -3
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ True
+
+
+
+
+ -96.3
+
+
+
+
+ False
+
+
+
+
+ -3
+
+
+
+
+ -3
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ -100
+
+
+
+
+ True
+
+
+
+
+ -12
+
+
+
+
+ 0.1
+
+
+
+
+ -12
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ -12
+
+
+
+
+ 0.1
+
+
+
+
+ -12
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 50
+
+
+
+
+ -96
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1024
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ -96
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ -6
+
+
+
+
+ 50
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ -6
+
+
+
+
+ 50
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 250
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ -96
+
+
+
+
+ 3
+
+
+
+
+ True
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0.5
+
+
+
+
+ 0
+
+
+
+
+ 2400
+
+
+
+
+ 345
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 32
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 10
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 20000
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0.707
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 256
+
+
+
+
+ False
+
+
+
+
+ 100
+
+
+
+
+ 100
+
+
+
+
+ 100
+
+
+
+
+ 100
+
+
+
+
+ 1000
+
+
+
+
+ 1000
+
+
+
+
+ 1000
+
+
+
+
+ 1000
+
+
+
+
+ 20000
+
+
+
+
+ 20000
+
+
+
+
+ 20000
+
+
+
+
+ 20000
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 5
+
+
+
+
+ 5
+
+
+
+
+ 9
+
+
+
+
+ 9
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 16641
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 10
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 60
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+ 0.01
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0.1
+
+
+
+
+ 0
+
+
+
+
+ 0.01
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0.1
+
+
+
+
+ 0
+
+
+
+
+ 0.01
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0.1
+
+
+
+
+ 0
+
+
+
+
+ 0.01
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0.1
+
+
+
+
+ 0
+
+
+
+
+ 150
+
+
+
+
+ 1000
+
+
+
+
+ 6000
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 4
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ True
+
+
+
+
+ 5
+
+
+
+
+ 100
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ True
+
+
+
+
+ 3
+
+
+
+
+ 200
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ True
+
+
+
+
+ 3
+
+
+
+
+ 500
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ True
+
+
+
+
+ 4
+
+
+
+
+ 1000
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+ 3
+
+
+
+
+ 3000
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ False
+
+
+
+
+ 3
+
+
+
+
+ 6000
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 4
+
+
+
+
+
+
+
+
+ -12
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ -12
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 6
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ 0.6
+
+
+
+
+ 0.6
+
+
+
+
+ 0.5
+
+
+
+
+ 0.3
+
+
+
+
+ 0.05
+
+
+
+
+ 0.25
+
+
+
+
+ 0.02
+
+
+
+
+ 1.5
+
+
+
+
+ 0.2
+
+
+
+
+ 0.3
+
+
+
+
+ True
+
+
+
+
+ 0.2
+
+
+
+
+ 8
+
+
+
+
+ 0.2
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+ 20
+
+
+
+
+ 0.7
+
+
+
+
+ 100
+
+
+
+
+ 0.1
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ True
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 3
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+ 0.7
+
+
+
+
+ 1
+
+
+
+
+ 0
+
+
+
+
+ 1
+
+
+
+
+ 0.9
+
+
+
+
+ 0.1
+
+
+
+
+ 3
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ 2
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ 1.4
+
+
+
+
+ -6
+
+
+
+
+ True
+
+
+
+
+ 0
+
+
+
+
+ 0
+
+
+
+
+ False
+
+
+
+
+ True
+
+
+
+
+ 0.5
+
+
+
+
+ 10000
+
+
+
+
+ -6
+
+
+
+
+ 7
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ 7.25
+
+
+
+
+ 2.75
+
+
+
+
+ 3.25
+
+
+
+
+ 4.25
+
+
+
+
+ 4.75
+
+
+
+
+ 3.75
+
+
+
+
+
+
+
+
+ 100
+
+
+
+
+ 50
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 5
+
+
+ 100
+ -200
+ 37
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 5
+
+
+ 100
+ 100
+ 37
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 5
+
+
+ 100
+ 100
+ 37
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 5
+
+
+ 100
+ -200
+ 37
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 5
+
+
+ 100
+ 100
+ 37
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 5
+
+
+ 100
+ 100
+ 37
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AutomatedTesting/sounds/wwise_project/Control Surface Sessions/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Control Surface Sessions/Default Work Unit.wwu
index 1f7d254b46..4e13dee554 100644
--- a/AutomatedTesting/sounds/wwise_project/Control Surface Sessions/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Control Surface Sessions/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Conversion Settings/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Conversion Settings/Default Work Unit.wwu
index ac7c83d1db..236f5765db 100644
--- a/AutomatedTesting/sounds/wwise_project/Conversion Settings/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Conversion Settings/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Conversion Settings/Factory Conversion Settings.wwu b/AutomatedTesting/sounds/wwise_project/Conversion Settings/Factory Conversion Settings.wwu
index 9a94d81c32..7873f5135a 100644
--- a/AutomatedTesting/sounds/wwise_project/Conversion Settings/Factory Conversion Settings.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Conversion Settings/Factory Conversion Settings.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Dynamic Dialogue/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Dynamic Dialogue/Default Work Unit.wwu
index e6e033e251..5411c7d503 100644
--- a/AutomatedTesting/sounds/wwise_project/Dynamic Dialogue/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Dynamic Dialogue/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Effects/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Effects/Default Work Unit.wwu
index f938135d6b..ca63005f4b 100644
--- a/AutomatedTesting/sounds/wwise_project/Effects/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Effects/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Effects/Factory Effects.wwu b/AutomatedTesting/sounds/wwise_project/Effects/Factory Effects.wwu
index ac716afb97..5a545f5e61 100644
--- a/AutomatedTesting/sounds/wwise_project/Effects/Factory Effects.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Effects/Factory Effects.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Effects/Factory Reflect.wwu b/AutomatedTesting/sounds/wwise_project/Effects/Factory Reflect.wwu
index f2269dd2dc..2c0ebb6b67 100644
--- a/AutomatedTesting/sounds/wwise_project/Effects/Factory Reflect.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Effects/Factory Reflect.wwu
@@ -1,10 +1,9 @@
-
+
-
-
+
@@ -185,8 +184,7 @@
-
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Events/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Events/Default Work Unit.wwu
index c65c8adca1..73c2e8f028 100644
--- a/AutomatedTesting/sounds/wwise_project/Events/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Events/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Game Parameters/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Game Parameters/Default Work Unit.wwu
index e373885f46..a939ebe124 100644
--- a/AutomatedTesting/sounds/wwise_project/Game Parameters/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Game Parameters/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Game Parameters/Factory Motion.wwu b/AutomatedTesting/sounds/wwise_project/Game Parameters/Factory Motion.wwu
index b06d283012..3989d74308 100644
--- a/AutomatedTesting/sounds/wwise_project/Game Parameters/Factory Motion.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Game Parameters/Factory Motion.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Game Parameters/Factory SoundSeed Air Game Syncs.wwu b/AutomatedTesting/sounds/wwise_project/Game Parameters/Factory SoundSeed Air Game Syncs.wwu
index 049dacb51e..efe69cb1a8 100644
--- a/AutomatedTesting/sounds/wwise_project/Game Parameters/Factory SoundSeed Air Game Syncs.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Game Parameters/Factory SoundSeed Air Game Syncs.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Interactive Music Hierarchy/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Interactive Music Hierarchy/Default Work Unit.wwu
index 1086c4511f..e8f4d23bb6 100644
--- a/AutomatedTesting/sounds/wwise_project/Interactive Music Hierarchy/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Interactive Music Hierarchy/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Master-Mixer Hierarchy/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Master-Mixer Hierarchy/Default Work Unit.wwu
index a627ce106e..b6c14df7af 100644
--- a/AutomatedTesting/sounds/wwise_project/Master-Mixer Hierarchy/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Master-Mixer Hierarchy/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
@@ -9,13 +9,15 @@
+
-
+
+
diff --git a/AutomatedTesting/sounds/wwise_project/Metadata/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Metadata/Default Work Unit.wwu
new file mode 100644
index 0000000000..0317c70b7c
--- /dev/null
+++ b/AutomatedTesting/sounds/wwise_project/Metadata/Default Work Unit.wwu
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/AutomatedTesting/sounds/wwise_project/Mixing Sessions/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Mixing Sessions/Default Work Unit.wwu
index 8c62ef9009..c24440febd 100644
--- a/AutomatedTesting/sounds/wwise_project/Mixing Sessions/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Mixing Sessions/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Modulators/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Modulators/Default Work Unit.wwu
index 062f9f80df..dc16200be3 100644
--- a/AutomatedTesting/sounds/wwise_project/Modulators/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Modulators/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Presets/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Presets/Default Work Unit.wwu
index 2bed1c6613..07f7565980 100644
--- a/AutomatedTesting/sounds/wwise_project/Presets/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Presets/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Presets/Factory Reflect.wwu b/AutomatedTesting/sounds/wwise_project/Presets/Factory Reflect.wwu
index 53f828f459..8138f5bcdd 100644
--- a/AutomatedTesting/sounds/wwise_project/Presets/Factory Reflect.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Presets/Factory Reflect.wwu
@@ -1,5 +1,5 @@
-
+
@@ -19,6 +19,7 @@
+
diff --git a/AutomatedTesting/sounds/wwise_project/Presets/Factory Spatial Audio.wwu b/AutomatedTesting/sounds/wwise_project/Presets/Factory Spatial Audio.wwu
index 5b96bd3b29..d73cf8d8c3 100644
--- a/AutomatedTesting/sounds/wwise_project/Presets/Factory Spatial Audio.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Presets/Factory Spatial Audio.wwu
@@ -1,5 +1,5 @@
-
+
@@ -17,6 +17,7 @@
+
diff --git a/AutomatedTesting/sounds/wwise_project/Queries/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Queries/Default Work Unit.wwu
index f4e9f99aa4..ff80573330 100644
--- a/AutomatedTesting/sounds/wwise_project/Queries/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Queries/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Queries/Factory Queries.wwu b/AutomatedTesting/sounds/wwise_project/Queries/Factory Queries.wwu
index 527315de63..813983d789 100644
--- a/AutomatedTesting/sounds/wwise_project/Queries/Factory Queries.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Queries/Factory Queries.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/SoundBanks/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/SoundBanks/Default Work Unit.wwu
index da8fa90010..c12261ab5b 100644
--- a/AutomatedTesting/sounds/wwise_project/SoundBanks/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/SoundBanks/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Soundcaster Sessions/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Soundcaster Sessions/Default Work Unit.wwu
index d6b8329537..379bf37da9 100644
--- a/AutomatedTesting/sounds/wwise_project/Soundcaster Sessions/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Soundcaster Sessions/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/States/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/States/Default Work Unit.wwu
index f27a0d0310..b06937baa9 100644
--- a/AutomatedTesting/sounds/wwise_project/States/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/States/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Switches/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Switches/Default Work Unit.wwu
index 49c00bc378..37fb0b424c 100644
--- a/AutomatedTesting/sounds/wwise_project/Switches/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Switches/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Triggers/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Triggers/Default Work Unit.wwu
index 3b2e2634df..bb2a827d79 100644
--- a/AutomatedTesting/sounds/wwise_project/Triggers/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Triggers/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Virtual Acoustics/Default Work Unit.wwu b/AutomatedTesting/sounds/wwise_project/Virtual Acoustics/Default Work Unit.wwu
index 29c26cbbab..d10d9475dc 100644
--- a/AutomatedTesting/sounds/wwise_project/Virtual Acoustics/Default Work Unit.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Virtual Acoustics/Default Work Unit.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/sounds/wwise_project/Virtual Acoustics/Factory Reflect Acoustic Textures.wwu b/AutomatedTesting/sounds/wwise_project/Virtual Acoustics/Factory Reflect Acoustic Textures.wwu
index 864f6ba959..ca4a1ae8f2 100644
--- a/AutomatedTesting/sounds/wwise_project/Virtual Acoustics/Factory Reflect Acoustic Textures.wwu
+++ b/AutomatedTesting/sounds/wwise_project/Virtual Acoustics/Factory Reflect Acoustic Textures.wwu
@@ -1,5 +1,5 @@
-
+
diff --git a/AutomatedTesting/surfacetypemateriallibrary.physmaterial b/AutomatedTesting/surfacetypemateriallibrary.physmaterial
index 3c39d5521e..481cd2fbfa 100644
--- a/AutomatedTesting/surfacetypemateriallibrary.physmaterial
+++ b/AutomatedTesting/surfacetypemateriallibrary.physmaterial
@@ -1,19 +1,155 @@
-
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ae8a7a05f8..387f536966 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -32,10 +32,14 @@ if(NOT PROJECT_NAME)
)
endif()
+################################################################################
+# Initialize
+################################################################################
include(cmake/GeneralSettings.cmake)
include(cmake/FileUtil.cmake)
include(cmake/PAL.cmake)
include(cmake/PALTools.cmake)
+include(cmake/RuntimeDependencies.cmake)
include(cmake/Install.cmake)
include(cmake/Configurations.cmake) # Requires to be after PAL so we get platform variable definitions
include(cmake/Dependencies.cmake)
@@ -43,89 +47,106 @@ include(cmake/Deployment.cmake)
include(cmake/3rdParty.cmake)
include(cmake/LYPython.cmake)
include(cmake/LYWrappers.cmake)
+include(cmake/Gems.cmake)
include(cmake/UnitTest.cmake)
include(cmake/LYTestWrappers.cmake)
include(cmake/Monolithic.cmake)
include(cmake/SettingsRegistry.cmake)
include(cmake/TestImpactFramework/LYTestImpactFramework.cmake)
include(cmake/CMakeFiles.cmake)
+include(cmake/O3DEJson.cmake)
################################################################################
# Subdirectory processing
################################################################################
+function(add_engine_json_external_subdirectories)
+ read_json_external_subdirs(external_subdis ${LY_ROOT_FOLDER}/engine.json)
+ foreach(external_subdir ${external_subdis})
+ file(REAL_PATH ${external_subdir} real_external_subdir BASE_DIRECTORY ${LY_ROOT_FOLDER})
+ list(APPEND engine_external_subdirs ${real_external_subdir})
+ endforeach()
+
+ set_property(GLOBAL APPEND PROPERTY LY_EXTERNAL_SUBDIRS ${engine_external_subdirs})
+endfunction()
+
# Add the projects first so the Launcher can find them
include(cmake/Projects.cmake)
if(NOT INSTALLED_ENGINE)
+
# Add the rest of the targets
add_subdirectory(Code)
- add_subdirectory(Gems)
+ add_subdirectory(scripts)
+
+ # SPEC-1417 will investigate and fix this
+ if(NOT PAL_PLATFORM_NAME STREQUAL "Mac")
+ add_subdirectory(Tools/LyTestTools/tests/)
+ add_subdirectory(Tools/RemoteConsole/ly_remote_console/tests/)
+ endif()
+
+ # Add external subdirectories listed in the engine.json. LY_EXTERNAL_SUBDIRS is a cache variable so the user can add extra
+ # external subdirectories
+ add_engine_json_external_subdirectories()
+ get_property(external_subdirs GLOBAL PROPERTY LY_EXTERNAL_SUBDIRS)
+ list(APPEND LY_EXTERNAL_SUBDIRS ${external_subdirs})
+
+ # Loop over the additional external subdirectories and invoke add_subdirectory on them
+ foreach(external_directory ${LY_EXTERNAL_SUBDIRS})
+ # Hash the extenal_directory name and append it to the Binary Directory section of add_subdirectory
+ # This is to deal with potential situations where multiple external directories has the same last directory name
+ # For example if D:/Company1/RayTracingGem and F:/Company2/Path/RayTracingGem were both added as a subdirectory
+ file(REAL_PATH ${external_directory} full_directory_path)
+ string(SHA256 full_directory_hash ${full_directory_path})
+ # Truncate the full_directory_hash down to 8 characters to avoid hitting the Windows 260 character path limit
+ # when the external subdirectory contains relative paths of significant length
+ string(SUBSTRING ${full_directory_hash} 0 8 full_directory_hash)
+ # Use the last directory as the suffix path to use for the Binary Directory
+ get_filename_component(directory_name ${external_directory} NAME)
+ add_subdirectory(${external_directory} ${CMAKE_BINARY_DIR}/External/${directory_name}-${full_directory_hash})
+ endforeach()
+
else()
ly_find_o3de_packages()
endif()
-set(enabled_platforms
- ${PAL_PLATFORM_NAME}
- ${LY_PAL_TOOLS_ENABLED})
-
-foreach(restricted_platform ${PAL_RESTRICTED_PLATFORMS})
- if(restricted_platform IN_LIST enabled_platforms)
- add_subdirectory(restricted/${restricted_platform})
- endif()
-endforeach()
-
-if(NOT INSTALLED_ENGINE)
- add_subdirectory(scripts)
-endif()
-
-# SPEC-1417 will investigate and fix this
-if(NOT PAL_PLATFORM_NAME STREQUAL "Mac")
- add_subdirectory(Tools/LyTestTools/tests/)
- add_subdirectory(Tools/RemoteConsole/ly_remote_console/tests/)
-endif()
-
################################################################################
# Post-processing
################################################################################
-
-# Loop over the additional external subdirectories and invoke add_subdirectory on them
-foreach(external_directory ${LY_EXTERNAL_SUBDIRS})
- # Hash the extenal_directory name and append it to the Binary Directory section of add_subdirectory
- # This is to deal with potential situations where multiple external directories has the same last directory name
- # For example if D:/Company1/RayTracingGem and F:/Company2/Path/RayTracingGem were both added as a subdirectory
- file(REAL_PATH ${external_directory} full_directory_path)
- string(SHA256 full_directory_hash ${full_directory_path})
- # Truncate the full_directory_hash down to 8 characters to avoid hitting the Windows 260 character path limit
- # when the external subdirectory contains relative paths of significant length
- string(SUBSTRING ${full_directory_hash} 0 8 full_directory_hash)
- # Use the last directory as the suffix path to use for the Binary Directory
- get_filename_component(directory_name ${external_directory} NAME)
- add_subdirectory(${external_directory} ${CMAKE_BINARY_DIR}/${directory_name}-${full_directory_hash})
-endforeach()
-
# The following steps have to be done after all targets are registered:
-# 1. generate a settings registry .setreg file for all ly_add_project_dependencies() and ly_add_target_dependencies() calls
+# Defer generation of the StaticModules.inl file which is needed to create the AZ::Module derived class in monolithic
+# builds until after all the targets are known
+ly_delayed_generate_static_modules_inl()
+
+# 1. Add any dependencies registered via ly_enable_gems
+ly_enable_gems_delayed()
+
+# 2. generate a settings registry .setreg file for all ly_add_project_dependencies() and ly_add_target_dependencies() calls
# to provide applications with the filenames of gem modules to load
-# This must be done before ly_delayed_target_link_libraries() as that inserts BUILD_DEPENDENCIE as MANUALLY_ADDED_DEPENDENCIES
+# This must be done before ly_delayed_target_link_libraries() as that inserts BUILD_DEPENDENCIES as MANUALLY_ADDED_DEPENDENCIES
# if the build dependency is a MODULE_LIBRARY. That would cause a false load dependency to be generated
ly_delayed_generate_settings_registry()
-# 2. link targets where the dependency was yet not declared, we need to have the declaration so we do different
+
+# 3. link targets where the dependency was yet not declared, we need to have the declaration so we do different
# linking logic depending on the type of target
ly_delayed_target_link_libraries()
-# 3. generate a registry file for unit testing for platforms that support unit testing
+
+# 4. generate a registry file for unit testing for platforms that support unit testing
if(PAL_TRAIT_BUILD_TESTS_SUPPORTED)
ly_delayed_generate_unit_test_module_registry()
endif()
-# 4. inject runtime dependencies to the targets. We need to do this after (1) since we are going to walk through
-# the dependencies
-include(cmake/RuntimeDependencies.cmake)
-# 5. Perform test impact framework post steps once all of the targets have been enumerated
-ly_test_impact_post_step()
-# 6. Generate the O3DE find file and setup install locations for scripts, tools, assets etc., required by the engine
-if(NOT INSTALLED_ENGINE)
- ly_setup_o3de_install()
- # IMPORTANT: must be included last
+# 5. inject runtime dependencies to the targets. We need to do this after (1) since we are going to walk through
+# the dependencies
+ly_delayed_generate_runtime_dependencies()
+
+# 6. Perform test impact framework post steps once all of the targets have been enumerated
+ly_test_impact_post_step()
+
+# 7. Generate the O3DE find file and setup install locations for scripts, tools, assets etc., required by the engine
+if(NOT INSTALLED_ENGINE)
+ # 8. Generate the O3DE find file and setup install locations for scripts, tools, assets etc., required by the engine
+ ly_setup_o3de_install()
+ # 9. CPack information (to be included after install)
include(cmake/Packaging.cmake)
endif()
diff --git a/Code/.p4ignore b/Code/.p4ignore
deleted file mode 100644
index f0b9f1ea6b..0000000000
--- a/Code/.p4ignore
+++ /dev/null
@@ -1,6 +0,0 @@
-#Ignore these directories
-SDKs
-
-#ColinB (8/26)- I know there are depot files that this will ignore... But these files should not be
-#here, they should all be in 3rdParty... so we will ignore them until I can move them, it should
-#be OK for now because they shouldn't change at all anyway.
diff --git a/Code/CryEngine/CryCommon/AABBSV.h b/Code/CryEngine/CryCommon/AABBSV.h
deleted file mode 100644
index 4c1c277e35..0000000000
--- a/Code/CryEngine/CryCommon/AABBSV.h
+++ /dev/null
@@ -1,525 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-
-// Description : shadow volume AABB functionality for overlap testings
-
-
-#ifndef CRYINCLUDE_CRYCOMMON_AABBSV_H
-#define CRYINCLUDE_CRYCOMMON_AABBSV_H
-#pragma once
-
-#include "Cry_Geo.h"
-
-struct Shadowvolume
-{
- uint32 sideamount;
- uint32 nplanes;
-
- Plane oplanes[10];
-};
-
-namespace NAABB_SV
-{
- //***************************************************************************************
- //***************************************************************************************
- //*** Calculate a ShadowVolume using an AABB and a point-light ***
- //***************************************************************************************
- //*** The planes of the AABB facing away from the point-light are the far-planes ***
- //*** of the ShadowVolume. There can be 3-6 far-planes. ***
- //***************************************************************************************
- void AABB_ReceiverShadowVolume(const Vec3& PointLight, const AABB& Occluder, Shadowvolume& sv);
-
- //***************************************************************************************
- //***************************************************************************************
- //*** Calculate a ShadowVolume using an AABB and a point-light ***
- //***************************************************************************************
- //*** The planes of the AABB facing the point-light are the near-planes of the ***
- //*** the ShadowVolume. There can be 1-3 near-planes. ***
- //*** The far-plane is defined by lightrange. ***
- //***************************************************************************************
- void AABB_ShadowVolume(const Vec3& PointLight, const AABB& Occluder, Shadowvolume& sv, f32 lightrange);
-
- //***************************************************************************************
- //*** this is the "fast" version to check if an AABB is overlapping a shadowvolume ***
- //***************************************************************************************
- bool Is_AABB_In_ShadowVolume(const Shadowvolume& sv, const AABB& Receiver);
-
- //***************************************************************************************
- //*** this is the "hierarchical" check ***
- //***************************************************************************************
- char Is_AABB_In_ShadowVolume_hierarchical(const Shadowvolume& sv, const AABB& Receiver);
-}
-
-
-
-
-
-inline void NAABB_SV::AABB_ReceiverShadowVolume(const Vec3& PointLight, const AABB& Occluder, Shadowvolume& sv)
-{
- sv.sideamount = 0;
- sv.nplanes = 0;
-
- //------------------------------------------------------------------------------
- //-- check if PointLight is in front of any occluder plane or inside occluder --
- //------------------------------------------------------------------------------
- uint32 front = 0;
- if (PointLight.x < Occluder.min.x)
- {
- front |= 0x01;
- }
- if (PointLight.x > Occluder.max.x)
- {
- front |= 0x02;
- }
- if (PointLight.y < Occluder.min.y)
- {
- front |= 0x04;
- }
- if (PointLight.y > Occluder.max.y)
- {
- front |= 0x08;
- }
- if (PointLight.z < Occluder.min.z)
- {
- front |= 0x10;
- }
- if (PointLight.z > Occluder.max.z)
- {
- front |= 0x20;
- }
-
- sv.sideamount = BoxSides[(front << 3) + 7];
-
- uint32 back = front ^ 0x3f;
- if (back & 0x01)
- {
- sv.oplanes[sv.nplanes].SetPlane(Vec3(-1, +0, +0), Occluder.min);
- sv.nplanes++;
- }
- if (back & 0x02)
- {
- sv.oplanes[sv.nplanes].SetPlane(Vec3(+1, +0, +0), Occluder.max);
- sv.nplanes++;
- }
- if (back & 0x04)
- {
- sv.oplanes[sv.nplanes].SetPlane(Vec3(+0, -1, +0), Occluder.min);
- sv.nplanes++;
- }
- if (back & 0x08)
- {
- sv.oplanes[sv.nplanes].SetPlane(Vec3(+0, +1, +0), Occluder.max);
- sv.nplanes++;
- }
- if (back & 0x10)
- {
- sv.oplanes[sv.nplanes].SetPlane(Vec3(+0, +0, -1), Occluder.min);
- sv.nplanes++;
- }
- if (back & 0x20)
- {
- sv.oplanes[sv.nplanes].SetPlane(Vec3(+0, +0, +1), Occluder.max);
- sv.nplanes++;
- }
-
- if (front == 0)
- {
- return; //light is inside occluder
- }
- //all 8 vertices of a AABB
- Vec3 o[8] =
- {
- Vec3(Occluder.min.x, Occluder.min.y, Occluder.min.z),
- Vec3(Occluder.max.x, Occluder.min.y, Occluder.min.z),
- Vec3(Occluder.min.x, Occluder.max.y, Occluder.min.z),
- Vec3(Occluder.max.x, Occluder.max.y, Occluder.min.z),
- Vec3(Occluder.min.x, Occluder.min.y, Occluder.max.z),
- Vec3(Occluder.max.x, Occluder.min.y, Occluder.max.z),
- Vec3(Occluder.min.x, Occluder.max.y, Occluder.max.z),
- Vec3(Occluder.max.x, Occluder.max.y, Occluder.max.z)
- };
-
- //---------------------------------------------------------------------
- //--- find the silhouette-vertices of the occluder-AABB ---
- //---------------------------------------------------------------------
- uint32 p0 = BoxSides[(front << 3) + 0];
- uint32 p1 = BoxSides[(front << 3) + 1];
- uint32 p2 = BoxSides[(front << 3) + 2];
- uint32 p3 = BoxSides[(front << 3) + 3];
- uint32 p4 = BoxSides[(front << 3) + 4];
- uint32 p5 = BoxSides[(front << 3) + 5];
-
- float a;
- if (sv.sideamount == 4)
- {
- //sv.oplanes[sv.nplanes+0] = Plane::CreatePlane( o[p0],o[p1], PointLight );
- //sv.oplanes[sv.nplanes+1] = Plane::CreatePlane( o[p1],o[p2], PointLight );
- //sv.oplanes[sv.nplanes+2] = Plane::CreatePlane( o[p2],o[p3], PointLight );
- //sv.oplanes[sv.nplanes+3] = Plane::CreatePlane( o[p3],o[p0], PointLight );
- sv.sideamount = 0;
- a = (o[p1] - o[p0]) | (o[p0] - PointLight);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p0], o[p1], PointLight);
- sv.sideamount++;
- }
- a = (o[p2] - o[p1]) | (o[p1] - PointLight);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p1], o[p2], PointLight);
- sv.sideamount++;
- }
- a = (o[p3] - o[p2]) | (o[p2] - PointLight);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p2], o[p3], PointLight);
- sv.sideamount++;
- }
- a = (o[p0] - o[p3]) | (o[p3] - PointLight);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p3], o[p0], PointLight);
- sv.sideamount++;
- }
- }
-
- if (sv.sideamount == 6)
- {
- //sv.oplanes[sv.nplanes+0] = Plane::CreatePlane( o[p0],o[p1], PointLight );
- //sv.oplanes[sv.nplanes+1] = Plane::CreatePlane( o[p1],o[p2], PointLight );
- //sv.oplanes[sv.nplanes+2] = Plane::CreatePlane( o[p2],o[p3], PointLight );
- //sv.oplanes[sv.nplanes+3] = Plane::CreatePlane( o[p3],o[p4], PointLight );
- //sv.oplanes[sv.nplanes+4] = Plane::CreatePlane( o[p4],o[p5], PointLight );
- //sv.oplanes[sv.nplanes+5] = Plane::CreatePlane( o[p5],o[p0], PointLight );
-
- sv.sideamount = 0;
- a = (o[p1] - o[p0]) | (o[p0] - PointLight);
- assert(sv.nplanes + sv.sideamount < 10);
- PREFAST_ASSUME(sv.nplanes + sv.sideamount < 10);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p0], o[p1], PointLight);
- sv.sideamount++;
- }
- a = (o[p2] - o[p1]) | (o[p1] - PointLight);
- assert(sv.nplanes + sv.sideamount < 10);
- PREFAST_ASSUME(sv.nplanes + sv.sideamount < 10);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p1], o[p2], PointLight);
- sv.sideamount++;
- }
- a = (o[p3] - o[p2]) | (o[p2] - PointLight);
- assert(sv.nplanes + sv.sideamount < 10);
- PREFAST_ASSUME(sv.nplanes + sv.sideamount < 10);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p2], o[p3], PointLight);
- sv.sideamount++;
- }
- a = (o[p4] - o[p3]) | (o[p3] - PointLight);
- assert(sv.nplanes + sv.sideamount < 10);
- PREFAST_ASSUME(sv.nplanes + sv.sideamount < 10);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p3], o[p4], PointLight);
- sv.sideamount++;
- }
- a = (o[p5] - o[p4]) | (o[p4] - PointLight);
- assert(sv.nplanes + sv.sideamount < 10);
- PREFAST_ASSUME(sv.nplanes + sv.sideamount < 10);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p4], o[p5], PointLight);
- sv.sideamount++;
- }
- a = (o[p0] - o[p5]) | (o[p5] - PointLight);
- assert(sv.nplanes + sv.sideamount < 10);
- PREFAST_ASSUME(sv.nplanes + sv.sideamount < 10);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p5], o[p0], PointLight);
- sv.sideamount++;
- }
- }
-}
-
-inline void NAABB_SV::AABB_ShadowVolume(const Vec3& PointLight, const AABB& Occluder, Shadowvolume& sv, f32 lightrange)
-{
- sv.sideamount = 0;
- sv.nplanes = 0;
-
- //------------------------------------------------------------------------------
- //-- check if PointLight is in front of any occluder plane or inside occluder --
- //------------------------------------------------------------------------------
- uint32 front = 0;
- if (PointLight.x < Occluder.min.x)
- {
- front |= 0x01;
- }
- if (PointLight.x > Occluder.max.x)
- {
- front |= 0x02;
- }
- if (PointLight.y < Occluder.min.y)
- {
- front |= 0x04;
- }
- if (PointLight.y > Occluder.max.y)
- {
- front |= 0x08;
- }
- if (PointLight.z < Occluder.min.z)
- {
- front |= 0x10;
- }
- if (PointLight.z > Occluder.max.z)
- {
- front |= 0x20;
- }
- if (front == 0)
- {
- return; //light is inside occluder
- }
- sv.sideamount = BoxSides[(front << 3) + 7];
-
- if (front & 0x01)
- {
- sv.oplanes[sv.nplanes].SetPlane(Vec3(-1, +0, +0), Occluder.min);
- sv.nplanes++;
- }
- if (front & 0x02)
- {
- sv.oplanes[sv.nplanes].SetPlane(Vec3(+1, +0, +0), Occluder.max);
- sv.nplanes++;
- }
- if (front & 0x04)
- {
- sv.oplanes[sv.nplanes].SetPlane(Vec3(+0, -1, +0), Occluder.min);
- sv.nplanes++;
- }
- if (front & 0x08)
- {
- sv.oplanes[sv.nplanes].SetPlane(Vec3(+0, +1, +0), Occluder.max);
- sv.nplanes++;
- }
- if (front & 0x10)
- {
- sv.oplanes[sv.nplanes].SetPlane(Vec3(+0, +0, -1), Occluder.min);
- sv.nplanes++;
- }
- if (front & 0x20)
- {
- sv.oplanes[sv.nplanes].SetPlane(Vec3(+0, +0, +1), Occluder.max);
- sv.nplanes++;
- }
-
- //all 8 vertices of a AABB
- Vec3 o[8] =
- {
- Vec3(Occluder.min.x, Occluder.min.y, Occluder.min.z),
- Vec3(Occluder.max.x, Occluder.min.y, Occluder.min.z),
- Vec3(Occluder.min.x, Occluder.max.y, Occluder.min.z),
- Vec3(Occluder.max.x, Occluder.max.y, Occluder.min.z),
- Vec3(Occluder.min.x, Occluder.min.y, Occluder.max.z),
- Vec3(Occluder.max.x, Occluder.min.y, Occluder.max.z),
- Vec3(Occluder.min.x, Occluder.max.y, Occluder.max.z),
- Vec3(Occluder.max.x, Occluder.max.y, Occluder.max.z)
- };
-
- //---------------------------------------------------------------------
- //--- find the silhouette-vertices of the occluder-AABB ---
- //---------------------------------------------------------------------
- uint32 p0 = BoxSides[(front << 3) + 0];
- uint32 p1 = BoxSides[(front << 3) + 1];
- uint32 p2 = BoxSides[(front << 3) + 2];
- uint32 p3 = BoxSides[(front << 3) + 3];
- uint32 p4 = BoxSides[(front << 3) + 4];
- uint32 p5 = BoxSides[(front << 3) + 5];
-
- //the new center-position in world-space
- Vec3 MiddleOfOccluder = (Occluder.max + Occluder.min) * 0.5f;
- sv.oplanes[sv.nplanes] = Plane::CreatePlane((MiddleOfOccluder - PointLight).GetNormalized(), (MiddleOfOccluder - PointLight).GetNormalized() * lightrange + PointLight);
- sv.nplanes++;
-
- float a;
- if (sv.sideamount == 4)
- {
- sv.sideamount = 0;
- a = (o[p1] - o[p0]) | (o[p0] - PointLight);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p0], o[p1], PointLight);
- sv.sideamount++;
- }
- a = (o[p2] - o[p1]) | (o[p1] - PointLight);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p1], o[p2], PointLight);
- sv.sideamount++;
- }
- a = (o[p3] - o[p2]) | (o[p2] - PointLight);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p2], o[p3], PointLight);
- sv.sideamount++;
- }
- a = (o[p0] - o[p3]) | (o[p3] - PointLight);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p3], o[p0], PointLight);
- sv.sideamount++;
- }
- }
-
- if (sv.sideamount == 6)
- {
- sv.sideamount = 0;
- a = (o[p1] - o[p0]) | (o[p0] - PointLight);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p0], o[p1], PointLight);
- sv.sideamount++;
- }
- a = (o[p2] - o[p1]) | (o[p1] - PointLight);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p1], o[p2], PointLight);
- sv.sideamount++;
- }
- a = (o[p3] - o[p2]) | (o[p2] - PointLight);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p2], o[p3], PointLight);
- sv.sideamount++;
- }
- a = (o[p4] - o[p3]) | (o[p3] - PointLight);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p3], o[p4], PointLight);
- sv.sideamount++;
- }
- a = (o[p5] - o[p4]) | (o[p4] - PointLight);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p4], o[p5], PointLight);
- sv.sideamount++;
- }
- a = (o[p0] - o[p5]) | (o[p5] - PointLight);
- if (a)
- {
- sv.oplanes[sv.nplanes + sv.sideamount] = Plane::CreatePlane(o[p5], o[p0], PointLight);
- sv.sideamount++;
- }
- }
-}
-
-inline bool NAABB_SV::Is_AABB_In_ShadowVolume(const Shadowvolume& sv, const AABB& Receiver)
-{
- uint32 pa = sv.sideamount + sv.nplanes;
-
- f32 d;
- const Vec3* pAABB = &Receiver.min;
-
- union f32_u
- {
- float floatVal;
- uint32 uintVal;
- };
-
- //------------------------------------------------------------------------------
- //---- check if receiver-AABB is in front of any of these planes ------
- //------------------------------------------------------------------------------
- for (uint32 x = 0; x < pa; x++)
- {
- d = sv.oplanes[x].d;
-
- //avoid breaking strict aliasing rules
- f32_u ux;
- ux.floatVal = sv.oplanes[x].n.x;
- f32_u uy;
- uy.floatVal = sv.oplanes[x].n.y;
- f32_u uz;
- uz.floatVal = sv.oplanes[x].n.z;
- const uint32 bitX = ux.uintVal >> 31;
- const uint32 bitY = uy.uintVal >> 31;
- const uint32 bitZ = uz.uintVal >> 31;
-
- d += sv.oplanes[x].n.x * pAABB[bitX].x;
- d += sv.oplanes[x].n.y * pAABB[bitY].y;
- d += sv.oplanes[x].n.z * pAABB[bitZ].z;
- if (d > 0)
- {
- return CULL_EXCLUSION;
- }
- }
- return CULL_OVERLAP;
-}
-
-inline char NAABB_SV::Is_AABB_In_ShadowVolume_hierarchical(const Shadowvolume& sv, const AABB& Receiver)
-{
- uint32 pa = sv.sideamount + sv.nplanes;
- const Vec3* pAABB = &Receiver.min;
-
- f32 dot1, dot2;
- uint32 notOverlap = 0x80000000; // will be reset to 0 if there's at least one overlapping
-
- union f32_u
- {
- float floatVal;
- uint32 uintVal;
- };
-
- //------------------------------------------------------------------------------
- //---- check if receiver-AABB is in front of any of these planes ------
- //------------------------------------------------------------------------------
- for (uint32 x = 0; x < pa; x++)
- {
- dot1 = dot2 = sv.oplanes[x].d;
-
- //avoid breaking strict aliasing rules
- f32_u ux;
- ux.floatVal = sv.oplanes[x].n.x;
- f32_u uy;
- uy.floatVal = sv.oplanes[x].n.y;
- f32_u uz;
- uz.floatVal = sv.oplanes[x].n.z;
- const uint32 bitX = ux.uintVal >> 31;
- const uint32 bitY = uy.uintVal >> 31;
- const uint32 bitZ = uz.uintVal >> 31;
-
- dot1 += sv.oplanes[x].n.x * pAABB[0 + bitX].x;
- dot2 += sv.oplanes[x].n.x * pAABB[1 - bitX].x;
- dot1 += sv.oplanes[x].n.y * pAABB[0 + bitY].y;
- dot2 += sv.oplanes[x].n.y * pAABB[1 - bitY].y;
- dot1 += sv.oplanes[x].n.z * pAABB[0 + bitZ].z;
- dot2 += sv.oplanes[x].n.z * pAABB[1 - bitZ].z;
- PREFAST_SUPPRESS_WARNING(6001) f32_u d;
- d.floatVal = dot1;
- if (!(d.uintVal & 0x80000000))
- {
- return CULL_EXCLUSION;
- }
- PREFAST_SUPPRESS_WARNING(6001) f32_u d2;
- d2.floatVal = dot2;
- notOverlap &= d2.uintVal;
- }
- if (notOverlap)
- {
- return CULL_INCLUSION;
- }
- return CULL_OVERLAP;
-}
-
-#endif // CRYINCLUDE_CRYCOMMON_AABBSV_H
-
diff --git a/Code/CryEngine/CryCommon/Algorithm.h b/Code/CryEngine/CryCommon/Algorithm.h
deleted file mode 100644
index 554fe7f507..0000000000
--- a/Code/CryEngine/CryCommon/Algorithm.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-#ifndef CRYINCLUDE_CRYCOMMON_ALGORITHM_H
-#define CRYINCLUDE_CRYCOMMON_ALGORITHM_H
-#pragma once
-//short hand for using stl algorithms. same syntax (from users perspective) of c++17 range library. Only the shorthand algorithms from range library(N4128) though.
-//Not all algorithms are covered. Add any as you need them. It would be a fair amount of work to add them all, so I'm just adding them as needed.
-//Note Android doesn't have non member cbegin and cend yet.
-
-#include
-#include
-#include
-
-namespace std17
-{
- template
- void for_each(const Container& con, Callable callable)
- {
- std::for_each(begin(con), end(con), callable);
- }
-
- template
- bool any_of(const Container& con, UnaryPredicate pred)
- {
- return std::any_of(begin(con), end(con), pred);
- }
-
- template
- bool all_of(const Container& con, UnaryPredicate pred)
- {
- return std::all_of(begin(con), end(con), pred);
- }
-
- template
- bool none_of(const Container& con, UnaryPredicate pred)
- {
- return std::none_of(begin(con), end(con), pred);
- }
-
- template
- typename Container::iterator find_if(Container& con, UnaryPredicate pred)
- {
- return std::find_if(begin(con), end(con), pred);
- }
-
- template
- T accumulate(const Container& con, T init)
- {
- return std::accumulate(begin(con), end(con), init);
- }
-
- template
- T accumulate(const Container& con, T init, BinaryOperation binary_op)
- {
- return std::accumulate(begin(con), end(con), init, binary_op);
- }
-
- template
- auto count_if(const Container&con, UnaryPredicate pred)->decltype(std::count_if(begin(con), end(con), pred))
- {
- return std::count_if(begin(con), end(con), pred);
- }
-}
-
-#endif // CRYINCLUDE_CRYCOMMON_ALGORITHM_H
diff --git a/Code/CryEngine/CryCommon/Allocator.h b/Code/CryEngine/CryCommon/Allocator.h
deleted file mode 100644
index 682de1e862..0000000000
--- a/Code/CryEngine/CryCommon/Allocator.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-
-#ifndef CRYINCLUDE_CRYCOMMON_ALLOCATOR_H
-#define CRYINCLUDE_CRYCOMMON_ALLOCATOR_H
-#pragma once
-
-#include "CryMemoryAllocator.h"
-
-////////////////////////////////////////////////////////////////////////
-// Allocator default implementation
-
-struct StdAllocator
-{
- // Class-specific alloc/free/size functions. Use aligned versions only when necessary.
- template
- static void* Allocate(T*& p)
- {
- return p = NeedAlign() ?
- (T*)CryModuleMemalign(sizeof(T), alignof(T)) :
- (T*)CryModuleMalloc(sizeof(T));
- }
-
- template
- static void Deallocate(T* p)
- {
- if (NeedAlign())
- {
- CryModuleMemalignFree(p);
- }
- else
- {
- CryModuleFree(p);
- }
- }
-
- template
- static size_t GetMemSize(const T* p)
- {
- return NeedAlign() ?
- sizeof(T) + alignof(T) :
- sizeof(T);
- }
-
- template
- void GetMemoryUsage(ICrySizer* pSizer) const { /*nothing*/}
-protected:
-
- template
- static bool NeedAlign()
- { PREFAST_SUPPRESS_WARNING(6326); return alignof(T) > _ALIGNMENT; }
-};
-
-// Handy delete template function, for any allocator.
-template
-void Delete(TAlloc& alloc, T* ptr)
-{
- if (ptr)
- {
- ptr->~T();
- alloc.Deallocate(ptr);
- }
-}
-
-#endif // CRYINCLUDE_CRYCOMMON_ALLOCATOR_H
diff --git a/Code/CryEngine/CryCommon/AnimTime.h b/Code/CryEngine/CryCommon/AnimTime.h
deleted file mode 100644
index 8bd0b9d442..0000000000
--- a/Code/CryEngine/CryCommon/AnimTime.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-
-#ifndef __animtime_h__
-#define __animtime_h__
-
-#include
-#include
-#include
-
-struct SAnimTime
-{
- static const uint numTicksPerSecond = 6000;
-
- // List of possible frame rates (dividers of 6000). Most commonly used ones first.
- enum EFrameRate
- {
- // Common
- eFrameRate_30fps, eFrameRate_60fps, eFrameRate_120fps,
-
- // Possible
- eFrameRate_10fps, eFrameRate_12fps, eFrameRate_15fps, eFrameRate_24fps,
- eFrameRate_25fps, eFrameRate_40fps, eFrameRate_48fps, eFrameRate_50fps,
- eFrameRate_75fps, eFrameRate_80fps, eFrameRate_100fps, eFrameRate_125fps,
- eFrameRate_150fps, eFrameRate_200fps, eFrameRate_240fps, eFrameRate_250fps,
- eFrameRate_300fps, eFrameRate_375fps, eFrameRate_400fps, eFrameRate_500fps,
- eFrameRate_600fps, eFrameRate_750fps, eFrameRate_1000fps, eFrameRate_1200fps,
- eFrameRate_1500fps, eFrameRate_2000fps, eFrameRate_3000fps, eFrameRate_6000fps,
-
- eFrameRate_Num
- };
-
- SAnimTime()
- : m_ticks(0) {}
- explicit SAnimTime(int32 ticks)
- : m_ticks(ticks) {}
- explicit SAnimTime(float time)
- : m_ticks(aznumeric_caster(std::lround(static_cast(time) * numTicksPerSecond))) {}
-
- static uint GetFrameRateValue(EFrameRate frameRate)
- {
- const uint frameRateValues[eFrameRate_Num] =
- {
- // Common
- 30, 60, 120,
-
- // Possible
- 10, 12, 15, 24, 25, 40, 48, 50, 75, 80, 100, 125,
- 150, 200, 240, 250, 300, 375, 400, 500, 600, 750,
- 1000, 1200, 1500, 2000, 3000, 6000
- };
-
- return frameRateValues[frameRate];
- }
-
- static const char* GetFrameRateName(EFrameRate frameRate)
- {
- const char* frameRateNames[eFrameRate_Num] =
- {
- // Common
- "30 fps", "60 fps", "120 fps",
-
- // Possible
- "10 fps", "12 fps", "15 fps", "24 fps",
- "25 fps", "40 fps", "48 fps", "50 fps",
- "75 fps", "80 fps", "100 fps", "125 fps",
- "150 fps", "200 fps", "240 fps", "250 fps",
- "300 fps", "375 fps", "400 fps", "500 fps",
- "600 fps", "750 fps", "1000 fps", "1200 fps",
- "1500 fps", "2000 fps", "3000 fps", "6000 fps"
- };
-
- return frameRateNames[frameRate];
- }
-
- float ToFloat() const { return static_cast(m_ticks) / numTicksPerSecond; }
-
- void Serialize(Serialization::IArchive& ar)
- {
- ar(m_ticks, "ticks", "Ticks");
- }
-
- // Helper to serialize from ticks or old float time
- void Serialize(XmlNodeRef keyNode, bool bLoading, const char* pName, const char* pLegacyName)
- {
- if (bLoading)
- {
- int32 ticks;
- if (!keyNode->getAttr(pName, ticks))
- {
- // Backwards compatibility
- float time = 0.0f;
- keyNode->getAttr(pLegacyName, time);
- *this = SAnimTime(time);
- }
- else
- {
- m_ticks = ticks;
- }
- }
- else if (m_ticks > 0)
- {
- keyNode->setAttr(pName, m_ticks);
- }
- }
-
- int32 GetTicks() const { return m_ticks; }
-
- static SAnimTime Min() { SAnimTime minTime; minTime.m_ticks = std::numeric_limits::lowest(); return minTime; }
- static SAnimTime Max() { SAnimTime maxTime; maxTime.m_ticks = (std::numeric_limits::max)(); return maxTime; }
-
- SAnimTime operator-() const { return SAnimTime(-m_ticks); }
- SAnimTime operator-(SAnimTime r) const { SAnimTime temp = *this; temp.m_ticks -= r.m_ticks; return temp; }
- SAnimTime operator+(SAnimTime r) const { SAnimTime temp = *this; temp.m_ticks += r.m_ticks; return temp; }
- SAnimTime operator*(SAnimTime r) const { SAnimTime temp = *this; temp.m_ticks *= r.m_ticks; return temp; }
- SAnimTime operator/(SAnimTime r) const { SAnimTime temp; temp.m_ticks = static_cast((static_cast(m_ticks) * numTicksPerSecond) / r.m_ticks); return temp; }
- SAnimTime operator%(SAnimTime r) const { SAnimTime temp = *this; temp.m_ticks %= r.m_ticks; return temp; }
- SAnimTime operator*(float r) const { SAnimTime temp; temp.m_ticks = aznumeric_caster(std::lround(static_cast(m_ticks) * r)); return temp; }
- SAnimTime operator/(float r) const { SAnimTime temp; temp.m_ticks = aznumeric_caster(std::lround(static_cast(m_ticks) / r)); return temp; }
- SAnimTime& operator+=(SAnimTime r) { *this = *this + r; return *this; }
- SAnimTime& operator-=(SAnimTime r) { *this = *this - r; return *this; }
- SAnimTime& operator*=(SAnimTime r) { *this = *this * r; return *this; }
- SAnimTime& operator/=(SAnimTime r) { *this = *this / r; return *this; }
- SAnimTime& operator%=(SAnimTime r) { *this = *this % r; return *this; }
- SAnimTime& operator*=(float r) { *this = *this * r; return *this; }
- SAnimTime& operator/=(float r) { *this = *this / r; return *this; }
-
- bool operator<(SAnimTime r) const { return m_ticks < r.m_ticks; }
- bool operator<=(SAnimTime r) const { return m_ticks <= r.m_ticks; }
- bool operator>(SAnimTime r) const { return m_ticks > r.m_ticks; }
- bool operator>=(SAnimTime r) const { return m_ticks >= r.m_ticks; }
- bool operator==(SAnimTime r) const { return m_ticks == r.m_ticks; }
- bool operator!=(SAnimTime r) const { return m_ticks != r.m_ticks; }
-
- // Snap to nearest multiple of given frame rate
- SAnimTime SnapToNearest(const EFrameRate frameRate)
- {
- const int sign = sgn(m_ticks);
- const int32 absTicks = abs(m_ticks);
-
- const int framesMod = numTicksPerSecond / GetFrameRateValue(frameRate);
- const int32 remainder = absTicks % framesMod;
- const bool bNextMultiple = remainder >= (framesMod / 2);
- return SAnimTime(sign * ((absTicks - remainder) + (bNextMultiple ? framesMod : 0)));
- }
-
-private:
- int32 m_ticks;
-
- friend bool Serialize(Serialization::IArchive& ar, SAnimTime& animTime, const char* name, const char* label);
-};
-
-inline bool Serialize(Serialization::IArchive& ar, SAnimTime& animTime, const char* name, const char* label)
-{
- return ar(animTime.m_ticks, name, label);
-}
-
-inline SAnimTime abs(SAnimTime time)
-{
- return (time >= SAnimTime(0)) ? time : -time;
-}
-
-#endif
diff --git a/Code/CryEngine/CryCommon/Bezier.h b/Code/CryEngine/CryCommon/Bezier.h
deleted file mode 100644
index fa1cf60d49..0000000000
--- a/Code/CryEngine/CryCommon/Bezier.h
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-
-#ifndef __BEZIER_H__
-#define __BEZIER_H__
-
-#include
-#include
-#include
-
-struct SBezierControlPoint
-{
- SBezierControlPoint()
- : m_value(0.0f)
- , m_inTangent(ZERO)
- , m_outTangent(ZERO)
- , m_inTangentType(eTangentType_Auto)
- , m_outTangentType(eTangentType_Auto)
- , m_bBreakTangents(false)
- {
- }
-
- enum ETangentType
- {
- eTangentType_Custom,
- eTangentType_Auto,
- eTangentType_Zero,
- eTangentType_Step,
- eTangentType_Linear,
- };
-
- void Serialize(Serialization::IArchive& ar)
- {
- ar(m_value, "value", "Value");
-
- if (ar.IsOutput())
- {
- bool breakTangents = m_bBreakTangents;
- ar(breakTangents, "breakTangents", "Break Tangents");
- }
- else
- {
- bool breakTangents = false;
- ar(breakTangents, "breakTangents", "Break Tangents");
- m_bBreakTangents = breakTangents;
- }
-
- if (ar.IsOutput())
- {
- ETangentType inTangentType = m_inTangentType;
- ar(inTangentType, "inTangentType", "Incoming tangent type");
- }
- else
- {
- ETangentType inTangentType = eTangentType_Auto;
- ar(inTangentType, "inTangentType", "Incoming tangent type");
- m_inTangentType = inTangentType;
- }
-
- ar(m_inTangent, "inTangent", (m_inTangentType == eTangentType_Custom) ? "Incoming Tangent" : NULL);
-
- if (ar.IsOutput())
- {
- ETangentType outTangentType = m_outTangentType;
- ar(outTangentType, "outTangentType", "Outgoing tangent type");
- }
- else
- {
- ETangentType outTangentType = eTangentType_Auto;
- ar(outTangentType, "outTangentType", "Outgoing tangent type");
- m_outTangentType = outTangentType;
- }
-
- ar(m_outTangent, "outTangent", (m_outTangentType == eTangentType_Custom) ? "Outgoing Tangent" : NULL);
- }
-
- float m_value;
-
- // For 1D Bezier only the Y component is used
- Vec2 m_inTangent;
- Vec2 m_outTangent;
-
- ETangentType m_inTangentType : 4;
- ETangentType m_outTangentType : 4;
- bool m_bBreakTangents : 1;
-};
-
-struct SBezierKey
-{
- SBezierKey()
- : m_time(0) {}
-
- void Serialize(Serialization::IArchive& ar)
- {
- ar(m_time, "time", "Time");
- ar(m_controlPoint, "controlPoint", "Control Point");
- }
-
- SAnimTime m_time;
- SBezierControlPoint m_controlPoint;
-};
-
-namespace Bezier
-{
- inline float Evaluate(float t, float p0, float p1, float p2, float p3)
- {
- const float a = 1 - t;
- const float aSq = a * a;
- const float tSq = t * t;
- return (aSq * a * p0) + (3.0f * aSq * t * p1) + (3.0f * a * tSq * p2) + (tSq * t * p3);
- }
-
- inline float EvaluateDeriv(float t, float p0, float p1, float p2, float p3)
- {
- const float a = 1 - t;
- const float ta = t * a;
- const float aSq = a * a;
- const float tSq = t * t;
- return 3.0f * ((-p2 * tSq) + (p3 * tSq) - (p0 * aSq) + (p1 * aSq) + 2.0f * ((-p1 * ta) + (p2 * ta)));
- }
-
- inline float EvaluateX(const float t, const float duration, const SBezierControlPoint& start, const SBezierControlPoint& end)
- {
- const float p0 = 0.0f;
- const float p1 = p0 + start.m_outTangent.x;
- const float p3 = duration;
- const float p2 = p3 + end.m_inTangent.x;
- return Evaluate(t, p0, p1, p2, p3);
- }
-
- inline float EvaluateY(const float t, const SBezierControlPoint& start, const SBezierControlPoint& end)
- {
- const float p0 = start.m_value;
- const float p1 = p0 + start.m_outTangent.y;
- const float p3 = end.m_value;
- const float p2 = p3 + end.m_inTangent.y;
- return Evaluate(t, p0, p1, p2, p3);
- }
-
- // Duration = (time at end key) - (time at start key)
- inline float EvaluateDerivX(const float t, const float duration, const SBezierControlPoint& start, const SBezierControlPoint& end)
- {
- const float p0 = 0.0f;
- const float p1 = p0 + start.m_outTangent.x;
- const float p3 = duration;
- const float p2 = p3 + end.m_inTangent.x;
- return EvaluateDeriv(t, p0, p1, p2, p3);
- }
-
- inline float EvaluateDerivY(const float t, const SBezierControlPoint& start, const SBezierControlPoint& end)
- {
- const float p0 = start.m_value;
- const float p1 = p0 + start.m_outTangent.y;
- const float p3 = end.m_value;
- const float p2 = p3 + end.m_inTangent.y;
- return EvaluateDeriv(t, p0, p1, p2, p3);
- }
-
- // Find interpolation factor where 2D bezier curve has the given x value. Works only for curves where x is monotonically increasing.
- // The passed x must be in range [0, duration]. Uses the Newton-Raphson root finding method. Usually takes 2 or 3 iterations.
- //
- // Note: This is for "1D" 2D bezier curves as used in TrackView. The curves are restricted by the curve editor to be monotonically increasing.
- //
- inline float InterpolationFactorFromX(const float x, const float duration, const SBezierControlPoint& start, const SBezierControlPoint& end)
- {
- float t = (x / duration);
-
- const float epsilon = 0.00001f;
- const uint maxSteps = 10;
-
- for (uint i = 0; i < maxSteps; ++i)
- {
- const float currentX = EvaluateX(t, duration, start, end) - x;
- if (fabs(currentX) <= epsilon)
- {
- break;
- }
-
- const float currentXDeriv = EvaluateDerivX(t, duration, start, end);
- t -= currentX / currentXDeriv;
- }
-
- return t;
- }
-
- inline SBezierControlPoint CalculateInTangent(
- float time, const SBezierControlPoint& point,
- float leftTime, const SBezierControlPoint* pLeftPoint,
- float rightTime, const SBezierControlPoint* pRightPoint)
- {
- SBezierControlPoint newPoint = point;
-
- // In tangent X can never be positive
- newPoint.m_inTangent.x = std::min(point.m_inTangent.x, 0.0f);
-
- if (pLeftPoint)
- {
- switch (point.m_inTangentType)
- {
- case SBezierControlPoint::eTangentType_Custom:
- {
- // Need to clamp tangent if it is reaching over last point
- const float deltaTime = time - leftTime;
- if (deltaTime < -newPoint.m_inTangent.x)
- {
- if (newPoint.m_inTangent.x == 0)
- {
- newPoint.m_inTangent = Vec2(ZERO);
- }
- else
- {
- float scaleFactor = deltaTime / -newPoint.m_inTangent.x;
- newPoint.m_inTangent.x = -deltaTime;
- newPoint.m_inTangent.y *= scaleFactor;
- }
- }
- }
- break;
- case SBezierControlPoint::eTangentType_Zero:
- // Fall through. Zero for y is same as Auto, x is set to 0.0f
- case SBezierControlPoint::eTangentType_Auto:
- {
- const SBezierControlPoint& rightPoint = pRightPoint ? *pRightPoint : point;
- const float deltaTime = (pRightPoint ? rightTime : time) - leftTime;
- if (deltaTime > 0.0f)
- {
- const float ratio = (time - leftTime) / deltaTime;
- const float deltaValue = rightPoint.m_value - pLeftPoint->m_value;
- const bool bIsZeroTangent = (point.m_inTangentType == SBezierControlPoint::eTangentType_Zero);
- newPoint.m_inTangent = Vec2(-(deltaTime * ratio) / 3.0f, bIsZeroTangent ? 0.0f : -(deltaValue * ratio) / 3.0f);
- }
- else
- {
- newPoint.m_inTangent = Vec2(ZERO);
- }
- }
- break;
- case SBezierControlPoint::eTangentType_Linear:
- newPoint.m_inTangent = Vec2((leftTime - time) / 3.0f,
- (pLeftPoint->m_value - point.m_value) / 3.0f);
- break;
- }
- }
-
- return newPoint;
- }
-
- inline SBezierControlPoint CalculateOutTangent(
- float time, const SBezierControlPoint& point,
- float leftTime, const SBezierControlPoint* pLeftPoint,
- float rightTime, const SBezierControlPoint* pRightPoint)
- {
- SBezierControlPoint newPoint = point;
-
- // Out tangent X can never be negative
- newPoint.m_outTangent.x = std::max(point.m_outTangent.x, 0.0f);
-
- if (pRightPoint)
- {
- switch (point.m_outTangentType)
- {
- case SBezierControlPoint::eTangentType_Custom:
- {
- // Need to clamp tangent if it is reaching over next point
- const float deltaTime = rightTime - time;
- if (deltaTime < newPoint.m_outTangent.x)
- {
- if (newPoint.m_outTangent.x == 0)
- {
- newPoint.m_outTangent = Vec2(ZERO);
- }
- else
- {
- float scaleFactor = deltaTime / newPoint.m_outTangent.x;
- newPoint.m_outTangent.x = deltaTime;
- newPoint.m_outTangent.y *= scaleFactor;
- }
- }
- }
- break;
- case SBezierControlPoint::eTangentType_Zero:
- // Fall through. Zero for y is same as Auto, x is set to 0.0f
- case SBezierControlPoint::eTangentType_Auto:
- {
- const SBezierControlPoint& leftPoint = pLeftPoint ? *pLeftPoint : point;
- const float deltaTime = rightTime - (pLeftPoint ? leftTime : time);
- if (deltaTime > 0.0f)
- {
- const float ratio = (rightTime - time) / deltaTime;
- const float deltaValue = pRightPoint->m_value - leftPoint.m_value;
- const bool bIsZeroTangent = (point.m_outTangentType == SBezierControlPoint::eTangentType_Zero);
- newPoint.m_outTangent = Vec2((deltaTime * ratio) / 3.0f, bIsZeroTangent ? 0.0f : (deltaValue * ratio) / 3.0f);
- }
- else
- {
- newPoint.m_outTangent = Vec2(ZERO);
- }
- }
- break;
- case SBezierControlPoint::eTangentType_Linear:
- newPoint.m_outTangent = Vec2((rightTime - time) / 3.0f,
- (pRightPoint->m_value - point.m_value) / 3.0f);
- break;
- }
- }
-
- return newPoint;
- }
-}
-
-#endif
diff --git a/Code/CryEngine/CryCommon/CGFContent.h b/Code/CryEngine/CryCommon/CGFContent.h
deleted file mode 100644
index 9c6ff391ef..0000000000
--- a/Code/CryEngine/CryCommon/CGFContent.h
+++ /dev/null
@@ -1,903 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-
-// Description : Describe contents on CGF file.
-
-
-#ifndef CRYINCLUDE_CRYCOMMON_CGFCONTENT_H
-#define CRYINCLUDE_CRYCOMMON_CGFCONTENT_H
-#pragma once
-
-#include // <> required for Interfuscator
-#include // <> required for Interfuscator
-#include
-#include
-#include
-#include
-#include
-
-#include //Required for LOD support for touch bending vegetation
-#include //Required for LOD support for touch bending vegetation
-
-const int CGF_NODE_NAME_LENGTH = 64;
-//END: Add LOD support for touch bending vegetation
-
-struct CMaterialCGF;
-struct IConvertContext;
-
-#define CGF_NODE_NAME_LOD_PREFIX "$lod"
-
-//////////////////////////////////////////////////////////////////////////
-// This structure represents CGF node.
-//////////////////////////////////////////////////////////////////////////
-struct CNodeCGF
- : public _cfg_reference_target
-{
- enum ENodeType
- {
- NODE_MESH,
- NODE_LIGHT,
- NODE_HELPER,
- };
- enum EPhysicalizeFlags
- {
- ePhysicsalizeFlag_MeshNotNeeded = BIT(2), // When set physics data doesn't need additional Mesh indices or vertices.
- ePhysicsalizeFlag_NoBreaking = BIT(3), // node is unsuitable for procedural 3d breaking
- };
-
- ENodeType type;
- //START: Add LOD support for touch bending vegetation
- char name[CGF_NODE_NAME_LENGTH];
- //END: Add LOD support for touch bending vegetation
- string properties;
- Matrix34 localTM; // Local space transformation matrix.
- Matrix34 worldTM; // World space transformation matrix.
- CNodeCGF* pParent; // Pointer to parent node.
- CNodeCGF* pSharedMesh; // Not NULL if this node is sharing mesh and physics from referenced Node.
- CMesh* pMesh; // Pointer to mesh loaded for this node. (Only when type == NODE_MESH)
-
- HelperTypes helperType; // Only relevant if type==NODE_HELPER
- Vec3 helperSize; // Only relevant if type==NODE_HELPER
-
- CMaterialCGF* pMaterial; // Material node.
-
- // Physical data of the node with mesh.
- int nPhysicalizeFlags; // Saved into the nFlags2 chunk member.
- AZStd::vector physicalGeomData[4];
- int nPhysTriCount; // Not saved! only used for statistics in RC
-
- //////////////////////////////////////////////////////////////////////////
- // Used internally.
- int nChunkId; // Chunk id as loaded from CGF.
- int nParentChunkId; // Chunk id of parent Node.
- int nObjectChunkId; // Chunk id of the corresponding mesh.
- int pos_cont_id; // position controller chunk id
- int rot_cont_id; // rotation controller chunk id
- int scl_cont_id; // scale controller chunk id
- //////////////////////////////////////////////////////////////////////////
-
- // True if worldTM is identity.
- bool bIdentityMatrix;
- // True when this node is invisible physics proxy.
- bool bPhysicsProxy;
-
- // These values are not saved, but are only used for loading empty mesh chunks.
- struct MeshInfo
- {
- int nVerts;
- int nIndices;
- int nSubsets;
- Vec3 bboxMin;
- Vec3 bboxMax;
- float fGeometricMean;
- };
- MeshInfo meshInfo;
-
- CrySkinVtx* pSkinInfo; // for skinning with skeleton meshes (deformable objects)
-
- //////////////////////////////////////////////////////////////////////////
- // Constructor.
- //////////////////////////////////////////////////////////////////////////
- void Init()
- {
- type = NODE_MESH;
- localTM.SetIdentity();
- worldTM.SetIdentity();
- pParent = 0;
- pSharedMesh = 0;
- pMesh = 0;
- pMaterial = 0;
- helperType = HP_POINT;
- helperSize.Set(0, 0, 0);
- nPhysicalizeFlags = 0;
- nChunkId = 0;
- nParentChunkId = 0;
- nObjectChunkId = 0;
- pos_cont_id = rot_cont_id = scl_cont_id = 0;
- bIdentityMatrix = true;
- bPhysicsProxy = false;
- pSkinInfo = 0;
- nPhysTriCount = 0;
-
- ZeroStruct(meshInfo);
- }
-
- CNodeCGF()
- {
- Init();
- }
-
- explicit CNodeCGF(_cfg_reference_target::DeleteFncPtr pDeleteFnc)
- : _cfg_reference_target(pDeleteFnc)
- {
- Init();
- }
-
- ~CNodeCGF()
- {
- if (!pSharedMesh)
- {
- delete pMesh;
- }
- if (pSkinInfo)
- {
- delete[] pSkinInfo;
- }
- }
-};
-
-
-//////////////////////////////////////////////////////////////////////////
-// structures for skinning
-//////////////////////////////////////////////////////////////////////////
-
-struct TFace
-{
- uint16 i0, i1, i2;
- TFace() {}
- TFace(uint16 v0, uint16 v1, uint16 v2) { i0 = v0; i1 = v1; i2 = v2; }
- TFace(const CryFace& face) { i0 = aznumeric_caster(face[0]); i1 = aznumeric_caster(face[1]); i2 = aznumeric_caster(face[2]); }
- void operator = (const TFace& f) { i0 = f.i0; i1 = f.i1; i2 = f.i2; }
- void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const{}
- AUTO_STRUCT_INFO
-};
-
-struct PhysicalProxy
-{
- uint32 ChunkID;
- DynArray m_arrPoints;
- DynArray m_arrIndices;
- DynArray m_arrMaterials;
-};
-
-struct MorphTargets
-{
- uint32 MeshID;
- string m_strName;
- DynArray m_arrIntMorph;
- DynArray m_arrExtMorph;
-};
-
-typedef MorphTargets* MorphTargetsPtr;
-
-struct IntSkinVertex
-{
- Vec3 __obsolete0; // thin/fat vertex position. must be removed in the next RC refactoring
- Vec3 pos; // vertex-position of model.2
- Vec3 __obsolete2; // thin/fat vertex position. must be removed in the next RC refactoring
- uint16 boneIDs[4];
- f32 weights[4];
- ColorB color; //index for blend-array
- void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const{}
- AUTO_STRUCT_INFO
-};
-
-
-
-//////////////////////////////////////////////////////////////////////////
-// TCB Controller implementation.
-//////////////////////////////////////////////////////////////////////////
-
-
-// retrieves the position and orientation (in the logarithmic space, i.e. instead of quaternion, its logarithm is returned)
-// may be optimal for motion interpolation
-struct PQLog
-{
- Vec3 vPos;
- Vec3 vRotLog; // logarithm of the rotation
- void blendPQ (const PQLog& pqFrom, const PQLog& pqTo, f32 fBlend);
- void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const{}
-};
-
-struct CControllerType
-{
- uint16 m_controllertype;
- uint16 m_index;
- CControllerType()
- {
- m_controllertype = 0xffff;
- m_index = 0xffff;
- }
-};
-
-struct TCBFlags
-{
- uint8 f0, f1;
- TCBFlags() { f0 = f1 = 0; }
-};
-
-struct CStoredSkinningInfo
-{
- int32 m_nTicksPerFrame;
- f32 m_secsPerTick;
- int32 m_nStart;
- int32 m_nEnd;
- f32 m_Speed;
- f32 m_Distance;
- f32 m_Slope;
- int m_nAssetFlags;
- f32 m_LHeelStart, m_LHeelEnd;
- f32 m_LToe0Start, m_LToe0End;
- f32 m_RHeelStart, m_RHeelEnd;
- f32 m_RToe0Start, m_RToe0End;
- Vec3 m_MoveDirection; // raw storage
-
- CStoredSkinningInfo()
- : m_Speed(-1.0f)
- , m_Distance(-1.0f)
- , m_nAssetFlags(0)
- , m_LHeelStart(-10000.0f)
- , m_LHeelEnd(-10000.0f)
- , m_LToe0Start(-10000.0f)
- , m_LToe0End(-10000.0f)
- , m_RHeelStart(-10000.0f)
- , m_RHeelEnd(-10000.0f)
- , m_RToe0Start(-10000.0f)
- , m_RToe0End(-10000.0f)
- , m_Slope(-1.0f)
- {
- }
- AUTO_STRUCT_INFO
-};
-
-
-
-// structure for recreating controllers
-struct CControllerInfo
-{
- uint32 m_nControllerID;
- uint32 m_nPosKeyTimeTrack;
- uint32 m_nPosTrack;
- uint32 m_nRotKeyTimeTrack;
- uint32 m_nRotTrack;
-
- CControllerInfo()
- : m_nControllerID(~0)
- , m_nPosKeyTimeTrack(~0)
- , m_nPosTrack(~0)
- , m_nRotKeyTimeTrack(~0)
- , m_nRotTrack(~0) {}
-
- AUTO_STRUCT_INFO
-};
-
-struct MeshCollisionInfo
-{
- AABB m_aABB;
- OBB m_OBB;
- Vec3 m_Pos;
- DynArray m_arrIndexes;
- int32 m_iBoneId;
-
- MeshCollisionInfo()
- {
- // This didn't help much.
- // The BBs are reset to opposite infinites,
- // but never clamped/grown by any member points.
- m_aABB.min.zero();
- m_aABB.max.zero();
- m_OBB.m33.SetIdentity();
- m_OBB.h.zero();
- m_OBB.c.zero();
- m_Pos.zero();
- }
- void GetMemoryUsage(ICrySizer* pSizer) const
- {
- pSizer->AddObject(m_arrIndexes);
- }
-};
-
-
-
-struct SJointsAimIK_Rot
-{
- const char* m_strJointName;
- int16 m_nJointIdx;
- int16 m_nPosIndex;
- uint8 m_nPreEvaluate;
- uint8 m_nAdditive;
- int16 m_nRotJointParentIdx;
- SJointsAimIK_Rot()
- {
- m_strJointName = 0;
- m_nJointIdx = -1;
- m_nPosIndex = -1;
- m_nPreEvaluate = 0;
- m_nAdditive = 0;
- m_nRotJointParentIdx = -1;
- };
- void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const{}
-};
-
-struct SJointsAimIK_Pos
-{
- const char* m_strJointName;
- int16 m_nJointIdx;
- uint8 m_nAdditive;
- uint8 m_nEmpty;
- SJointsAimIK_Pos()
- {
- m_strJointName = 0;
- m_nJointIdx = -1;
- m_nAdditive = 0;
- m_nEmpty = 0;
- };
- void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const{}
-};
-
-
-struct DirectionalBlends
-{
- string m_AnimToken;
- uint32 m_AnimTokenCRC32;
- const char* m_strParaJointName;
- int16 m_nParaJointIdx;
- int16 m_nRotParaJointIdx;
- const char* m_strStartJointName;
- int16 m_nStartJointIdx;
- int16 m_nRotStartJointIdx;
- const char* m_strReferenceJointName;
- int32 m_nReferenceJointIdx;
- DirectionalBlends()
- {
- m_AnimTokenCRC32 = 0;
- m_strParaJointName = 0;
- m_nParaJointIdx = -1;
- m_nRotParaJointIdx = -1;
- m_strStartJointName = 0;
- m_nStartJointIdx = -1;
- m_nRotStartJointIdx = -1;
- m_strReferenceJointName = 0;
- m_nReferenceJointIdx = 1; //by default we use the Pelvis
- };
- void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const {}
-};
-
-
-struct CSkinningInfo
- : public _reference_target_t
-{
- DynArray m_arrBonesDesc; //animation-bones
-
- DynArray m_LookIK_Rot; //rotational joints used for Look-IK
- DynArray m_LookIK_Pos; //positional joints used for Look-IK
- DynArray m_LookDirBlends; //positional joints used for Look-IK
-
- DynArray m_AimIK_Rot; //rotational joints used for Aim-IK
- DynArray m_AimIK_Pos; //positional joints used for Aim-IK
- DynArray m_AimDirBlends; //positional joints used for Aim-IK
-
-
- DynArray m_arrPhyBoneMeshes; //collision proxi
- DynArray m_arrMorphTargets;
- DynArray m_arrIntFaces;
- DynArray m_arrIntVertices;
- DynArray m_arrExt2IntMap;
- DynArray m_arrBoneEntities; //physical-bones
- DynArray m_arrCollisions;
-
- uint32 m_numChunks{ 0 };
- bool m_bRotatedMorphTargets;
- bool m_bProperBBoxes;
-
- CSkinningInfo()
- : m_bRotatedMorphTargets(false)
- , m_bProperBBoxes(false) {}
-
- ~CSkinningInfo()
- {
- for (DynArray::iterator it = m_arrMorphTargets.begin(), end = m_arrMorphTargets.end(); it != end; ++it)
- {
- delete *it;
- }
- }
-
- int32 GetJointIDByName(const char* strJointName) const
- {
- uint32 numJoints = m_arrBonesDesc.size();
- for (uint32 i = 0; i < numJoints; i++)
- {
- if (_stricmp(m_arrBonesDesc[i].m_arrBoneName, strJointName) == 0)
- {
- return i;
- }
- }
- return -1;
- }
-
- // Return name of bone from bone table, return zero id nId is out of range
- const char* GetJointNameByID(int32 nJointID) const
- {
- int32 numJoints = m_arrBonesDesc.size();
- if (nJointID >= 0 && nJointID < numJoints)
- {
- return m_arrBonesDesc[nJointID].m_arrBoneName;
- }
- return ""; // invalid bone id
- }
-};
-
-//////////////////////////////////////////////////////////////////////////
-// This structure represents Material inside CGF.
-//////////////////////////////////////////////////////////////////////////
-struct CMaterialCGF
- : public _cfg_reference_target
-{
- char name[128]; // Material name;
- int nFlags; // Material flags.
- int nPhysicalizeType;
- bool bOldMaterial;
- float shOpacity;
-
- // Array of sub materials.
- DynArray subMaterials;
-
- //////////////////////////////////////////////////////////////////////////
- // Used internally.
- int nChunkId;
- //////////////////////////////////////////////////////////////////////////
-
- void Init()
- {
- nFlags = 0;
- nChunkId = 0;
- bOldMaterial = false;
- nPhysicalizeType = PHYS_GEOM_TYPE_DEFAULT;
- shOpacity = 1.f;
- }
-
- CMaterialCGF() { Init(); }
-
- explicit CMaterialCGF(_cfg_reference_target::DeleteFncPtr pDeleteFnc)
- : _cfg_reference_target(pDeleteFnc)
- { Init(); }
-};
-
-//////////////////////////////////////////////////////////////////////////
-// Info about physicalization of the CGF.
-//////////////////////////////////////////////////////////////////////////
-struct CPhysicalizeInfoCGF
-{
- bool bWeldVertices;
- float fWeldTolerance; // Min Distance between vertices when they collapse to single vertex if bWeldVertices enabled.
-
- // breakable physics
- int nGranularity;
- int nMode;
-
- Vec3* pRetVtx;
- int nRetVtx;
- int* pRetTets;
- int nRetTets;
-
- CPhysicalizeInfoCGF()
- : bWeldVertices(true)
- , fWeldTolerance(0.01f)
- , nMode(-1)
- , nGranularity(-1)
- , pRetVtx(0)
- , nRetVtx(0)
- , pRetTets(0)
- , nRetTets(0){}
-
- ~CPhysicalizeInfoCGF()
- {
- if (pRetVtx)
- {
- delete []pRetVtx;
- pRetVtx = 0;
- }
- if (pRetTets)
- {
- delete []pRetTets;
- pRetTets = 0;
- }
- }
-};
-
-
-//////////////////////////////////////////////////////////////////////////
-// Serialized skinnable foliage data
-//////////////////////////////////////////////////////////////////////////
-
-#define NODE_PROPERTY_STIFFNESS "stiffness"
-#define NODE_PROPERTY_DAMPING "damping"
-#define NODE_PROPERTY_THICKNESS "thickness"
-
-struct SSpineRC
-{
- SSpineRC()
- : pVtx(nullptr)
- , pSegDim(nullptr)
- , nVtx(0)
- , len(0)
- , pBoneIDs(nullptr)
- , parentBoneID(-1)
- , pStiffness(nullptr)
- , pDamping(nullptr)
- , pThickness(nullptr) {}
-
- ~SSpineRC()
- {
- if (pVtx)
- {
- delete[] pVtx;
- }
- if (pSegDim)
- {
- delete[] pSegDim;
- }
- if (pBoneIDs)
- {
- delete[] pBoneIDs;
- }
- if (pStiffness)
- {
- delete[] pStiffness;
- }
- if (pDamping)
- {
- delete[] pDamping;
- }
- if (pThickness)
- {
- delete[] pThickness;
- }
- }
-
- /// Add Skinned Geometry (.CGF) export type (for touch bending vegetation)
- static float GetDefaultStiffness() { return 0.5f; }
- static float GetDefaultDamping() { return 0.5f; }
- static float GetDefaultThickness() { return 0.03f; }
-
- Vec3* pVtx;
- Vec4* pSegDim;
- int nVtx;
- float len;
- Vec3 navg;
-
- int parentBoneID;
- int* pBoneIDs;
-
- //Per Bone parameters.
- float* pStiffness;
- float* pDamping;
- float* pThickness;
-
- int iAttachSpine;
- int iAttachSeg;
-};
-
-struct SFoliageInfoCGF
-{
- SFoliageInfoCGF() { nSpines = 0; pSpines = 0; pBoneMapping = 0; }
- ~SFoliageInfoCGF()
- {
- if (pSpines)
- {
- for (int i = 1; i < nSpines; i++) // spines 1..n-1 use the same buffer, so make sure they don't delete it
- {
- pSpines[i].pVtx = nullptr;
- pSpines[i].pSegDim = nullptr;
- pSpines[i].pBoneIDs = nullptr;
- pSpines[i].pStiffness = nullptr;
- pSpines[i].pDamping = nullptr;
- pSpines[i].pThickness = nullptr;
- }
- delete[] pSpines;
- }
-
- SAFE_DELETE_ARRAY(pBoneMapping);
-
- AZStd::unordered_map::iterator iter = boneMappings.begin();
- while (iter != boneMappings.end())
- {
- if (iter->second != nullptr)
- {
- SAFE_DELETE_ARRAY(iter->second->pBoneMapping);
- }
- iter++;
- }
-
- }
-
- SSpineRC* pSpines;
- int nSpines;
-
- ///Bone mappings for each LOD level
- AZStd::unordered_map boneMappings;
-
- ///Bone mapping for legacy format
- struct SMeshBoneMapping_uint8* pBoneMapping;
- int nSkinnedVtx;
-
- DynArray chunkBoneIds;
-};
-
-
-//////////////////////////////////////////////////////////////////////////
-struct CExportInfoCGF
-{
- bool bMergeAllNodes;
- bool bUseCustomNormals;
- bool bCompiledCGF;
- bool bHavePhysicsProxy;
- bool bHaveAutoLods;
- bool bNoMesh;
- bool bWantF32Vertices;
- bool b8WeightsPerVertex;
-
- /// Prevent reprocessing skinning data for skinned CGF
- bool bSkinnedCGF;
-
- bool bFromColladaXSI;
- bool bFromColladaMAX;
- bool bFromColladaMAYA;
-
- unsigned int rc_version[4]; // Resource compiler version.
- char rc_version_string[16]; // Version as a string.
-
- unsigned int authorToolVersion;
-};
-
-//////////////////////////////////////////////////////////////////////////
-// This class contain all info loaded from the CGF file.
-//////////////////////////////////////////////////////////////////////////
-class CContentCGF
-{
-public:
- //////////////////////////////////////////////////////////////////////////
- CContentCGF(const char* filename)
- {
- azstrcpy(m_filename, AZ_ARRAY_SIZE(m_filename), filename);
- memset(&m_exportInfo, 0, sizeof(m_exportInfo));
- m_exportInfo.bMergeAllNodes = true;
- m_exportInfo.bUseCustomNormals = false;
- m_exportInfo.bWantF32Vertices = false;
- m_exportInfo.b8WeightsPerVertex = false;
- m_exportInfo.bSkinnedCGF = false;
- m_pCommonMaterial = 0;
- m_bConsoleFormat = false;
- m_pOwnChunkFile = 0;
- }
-
- //////////////////////////////////////////////////////////////////////////
- virtual ~CContentCGF()
- {
- // Free nodes.
- m_nodes.clear();
- if (m_pOwnChunkFile)
- {
- m_pOwnChunkFile->Release();
- }
- }
-
- //////////////////////////////////////////////////////////////////////////
- const char* GetFilename() const
- {
- return m_filename;
- }
-
- void SetFilename(const char* filename)
- {
- azstrcpy(m_filename, AZ_ARRAY_SIZE(m_filename), filename);
- }
-
- //////////////////////////////////////////////////////////////////////////
- // Access to CGF nodes.
- void AddNode(CNodeCGF* pNode)
- {
- m_nodes.push_back(pNode);
- }
-
- int GetNodeCount() const
- {
- return m_nodes.size();
- }
-
- CNodeCGF* GetNode(int i)
- {
- return m_nodes[i];
- }
-
- const CNodeCGF* GetNode(int i) const
- {
- return m_nodes[i];
- }
-
- void ClearNodes()
- {
- m_nodes.clear();
- }
-
- void RemoveNode(CNodeCGF* pNode)
- {
- assert(pNode);
- for (int i = 0; i < m_nodes.size(); ++i)
- {
- if (m_nodes[i] == pNode)
- {
- pNode->pParent = 0;
- m_nodes.erase(i);
- break;
- }
- }
- }
- //////////////////////////////////////////////////////////////////////////
-
- //////////////////////////////////////////////////////////////////////////
- // Access to CGF materials.
- void AddMaterial(CMaterialCGF* pNode)
- {
- m_materials.push_back(pNode);
- }
-
- int GetMaterialCount() const
- {
- return m_materials.size();
- }
-
- CMaterialCGF* GetMaterial(int i)
- {
- return m_materials[i];
- }
-
- void ClearMaterials()
- {
- m_materials.clear();
- }
-
- CMaterialCGF* GetCommonMaterial() const
- {
- return m_pCommonMaterial;
- }
-
- void SetCommonMaterial(CMaterialCGF* pMtl)
- {
- m_pCommonMaterial = pMtl;
- }
-
- DynArray& GetUsedMaterialIDs()
- {
- return m_usedMaterialIds;
- }
-
- const DynArray& GetUsedMaterialIDs() const
- {
- return m_usedMaterialIds;
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- CPhysicalizeInfoCGF* GetPhysicalizeInfo()
- {
- return &m_physicsInfo;
- }
-
- const CPhysicalizeInfoCGF* GetPhysicalizeInfo() const
- {
- return &m_physicsInfo;
- }
-
- CExportInfoCGF* GetExportInfo()
- {
- return &m_exportInfo;
- }
-
- const CExportInfoCGF* GetExportInfo() const
- {
- return &m_exportInfo;
- }
-
- CSkinningInfo* GetSkinningInfo()
- {
- return &m_SkinningInfo;
- }
-
- const CSkinningInfo* GetSkinningInfo() const
- {
- return &m_SkinningInfo;
- }
-
- SFoliageInfoCGF* GetFoliageInfo()
- {
- return &m_foliageInfo;
- }
-
- bool GetConsoleFormat()
- {
- return m_bConsoleFormat;
- }
-
- bool ValidateMeshes(const char** const ppErrorDescription) const
- {
- for (int i = 0; i < m_nodes.size(); ++i)
- {
- const CNodeCGF* const pNode = m_nodes[i];
- if (pNode && pNode->pMesh && (!pNode->pMesh->Validate(ppErrorDescription)))
- {
- return false;
- }
- }
- return true;
- }
-
- // Set chunk file that this CGF owns.
- void SetChunkFile(IChunkFile* pChunkFile)
- {
- m_pOwnChunkFile = pChunkFile;
- }
-
-public:
- bool m_bConsoleFormat;
-
-private:
- char m_filename[260];
- CSkinningInfo m_SkinningInfo;
- DynArray<_smart_ptr > m_nodes;
- DynArray<_smart_ptr > m_materials;
- DynArray m_usedMaterialIds;
- _smart_ptr m_pCommonMaterial;
-
- CPhysicalizeInfoCGF m_physicsInfo;
- CExportInfoCGF m_exportInfo;
- SFoliageInfoCGF m_foliageInfo;
-
- IChunkFile* m_pOwnChunkFile;
-};
-
-namespace AZ
-{
- namespace SceneAPI
- {
- namespace DataTypes
- {
- class IAnimationGroup;
- }
- }
-}
-
-// Asset Writer interface for writing CContentCGF content to asset file
-struct IAssetWriter
-{
- virtual ~IAssetWriter()
- {
- }
-
- virtual bool WriteCGF(CContentCGF* content) = 0;
- virtual bool WriteCHR(CContentCGF* content, IConvertContext* convertContext) = 0;
- virtual bool WriteSKIN(CContentCGF* content, IConvertContext* convertContext, bool exportMorphTargets) = 0;
-};
-
-
-#endif // CRYINCLUDE_CRYCOMMON_CGFCONTENT_H
diff --git a/Code/CryEngine/CryCommon/CGFContent_info.cpp b/Code/CryEngine/CryCommon/CGFContent_info.cpp
deleted file mode 100644
index 27d61c2f62..0000000000
--- a/Code/CryEngine/CryCommon/CGFContent_info.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-
-#include "TypeInfo_impl.h"
-#include "CGFContent.h"
-
-STRUCT_INFO_BEGIN(TFace)
-STRUCT_VAR_INFO(i0, TYPE_INFO(uint16))
-STRUCT_VAR_INFO(i1, TYPE_INFO(uint16))
-STRUCT_VAR_INFO(i2, TYPE_INFO(uint16))
-STRUCT_INFO_END(TFace)
-
-STRUCT_INFO_BEGIN(IntSkinVertex)
-STRUCT_VAR_INFO(__obsolete0, TYPE_INFO(Vec3))
-STRUCT_VAR_INFO(pos, TYPE_INFO(Vec3))
-STRUCT_VAR_INFO(__obsolete2, TYPE_INFO(Vec3))
-STRUCT_VAR_INFO(boneIDs, TYPE_ARRAY(4, TYPE_INFO(uint16)))
-STRUCT_VAR_INFO(weights, TYPE_ARRAY(4, TYPE_INFO(f32)))
-STRUCT_VAR_INFO(color, TYPE_INFO(ColorB))
-STRUCT_INFO_END(IntSkinVertex)
-
-STRUCT_INFO_BEGIN(CStoredSkinningInfo)
-STRUCT_VAR_INFO(m_nTicksPerFrame, TYPE_INFO(int32))
-STRUCT_VAR_INFO(m_secsPerTick, TYPE_INFO(f32))
-STRUCT_VAR_INFO(m_nStart, TYPE_INFO(int32))
-STRUCT_VAR_INFO(m_nEnd, TYPE_INFO(int32))
-STRUCT_VAR_INFO(m_Speed, TYPE_INFO(f32))
-STRUCT_VAR_INFO(m_Distance, TYPE_INFO(f32))
-STRUCT_VAR_INFO(m_Slope, TYPE_INFO(f32))
-STRUCT_VAR_INFO(m_nAssetFlags, TYPE_INFO(int))
-STRUCT_VAR_INFO(m_LHeelStart, TYPE_INFO(f32))
-STRUCT_VAR_INFO(m_LHeelEnd, TYPE_INFO(f32))
-STRUCT_VAR_INFO(m_LToe0Start, TYPE_INFO(f32))
-STRUCT_VAR_INFO(m_LToe0End, TYPE_INFO(f32))
-STRUCT_VAR_INFO(m_RHeelStart, TYPE_INFO(f32))
-STRUCT_VAR_INFO(m_RHeelEnd, TYPE_INFO(f32))
-STRUCT_VAR_INFO(m_RToe0Start, TYPE_INFO(f32))
-STRUCT_VAR_INFO(m_RToe0End, TYPE_INFO(f32))
-STRUCT_VAR_INFO(m_MoveDirection, TYPE_INFO(Vec3))
-STRUCT_INFO_END(CStoredSkinningInfo)
-
-STRUCT_INFO_BEGIN(CControllerInfo)
-STRUCT_VAR_INFO(m_nControllerID, TYPE_INFO(uint32))
-STRUCT_VAR_INFO(m_nPosKeyTimeTrack, TYPE_INFO(uint32))
-STRUCT_VAR_INFO(m_nPosTrack, TYPE_INFO(uint32))
-STRUCT_VAR_INFO(m_nRotKeyTimeTrack, TYPE_INFO(uint32))
-STRUCT_VAR_INFO(m_nRotTrack, TYPE_INFO(uint32))
-STRUCT_INFO_END(CControllerInfo)
-
-STRUCT_INFO_BEGIN(UCol)
-STRUCT_VAR_INFO(dcolor, TYPE_INFO(uint32))
-STRUCT_INFO_END(UCol)
-
-STRUCT_INFO_BEGIN(SVF_P3S_C4B_T2S)
-STRUCT_VAR_INFO(xyz, TYPE_INFO(Vec3f16))
-STRUCT_VAR_INFO(color, TYPE_INFO(UCol))
-STRUCT_VAR_INFO(st, TYPE_INFO(Vec2f16))
-STRUCT_INFO_END(SVF_P3S_C4B_T2S)
diff --git a/Code/CryEngine/CryCommon/CMakeLists.txt b/Code/CryEngine/CryCommon/CMakeLists.txt
index 4725489358..3a1eb90d9d 100644
--- a/Code/CryEngine/CryCommon/CMakeLists.txt
+++ b/Code/CryEngine/CryCommon/CMakeLists.txt
@@ -9,58 +9,15 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
-ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME})
-ly_get_pal_tool_dirs(pal_tool_dirs ${CMAKE_CURRENT_LIST_DIR}/Platform)
-
ly_add_target(
NAME CryCommon STATIC
NAMESPACE Legacy
FILES_CMAKE
crycommon_files.cmake
- ${pal_dir}/crycommon_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
- PLATFORM_INCLUDE_FILES
- ${pal_dir}/crycommon_${PAL_PLATFORM_NAME_LOWERCASE}.cmake
INCLUDE_DIRECTORIES
PUBLIC
. # Lots of code without CryCommon/
.. # Dangerous since exports CryEngine's path (client code can do CrySystem/ without depending on that target)
- ${pal_dir}
- ${pal_tool_dirs}
- BUILD_DEPENDENCIES
- PUBLIC
- AZ::AzCore
- AZ::AzFramework
-)
-
-ly_add_target(
- NAME CryCommon.EngineSettings.Static STATIC
- NAMESPACE Legacy
- FILES_CMAKE
- crycommon_enginesettings_files.cmake
- ${pal_dir}/crycommon_enginesettings_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
- INCLUDE_DIRECTORIES
- PUBLIC
- .
- ${pal_dir}
- BUILD_DEPENDENCIES
- PUBLIC
- AZ::AzCore
- AZ::AzFramework
-)
-
-ly_add_target(
- NAME CryCommon.EngineSettings.RC.Static STATIC
- NAMESPACE Legacy
- FILES_CMAKE
- crycommon_enginesettings_files.cmake
- ${pal_dir}/crycommon_enginesettings_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
- INCLUDE_DIRECTORIES
- PUBLIC
- .
- ${pal_dir}
- COMPILE_DEFINITIONS
- PRIVATE
- RESOURCE_COMPILER
BUILD_DEPENDENCIES
PUBLIC
AZ::AzCore
diff --git a/Code/CryEngine/CryCommon/CREBaseCloud.h b/Code/CryEngine/CryCommon/CREBaseCloud.h
deleted file mode 100644
index b7a95d88d4..0000000000
--- a/Code/CryEngine/CryCommon/CREBaseCloud.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-
-#ifndef __CREBASECLOUD_H__
-#define __CREBASECLOUD_H__
-
-//================================================================================
-
-class SCloudParticle
-{
-public:
- inline SCloudParticle();
- inline SCloudParticle(const Vec3& vPos, float fRadius, const ColorF& baseColor, float fTransparency = 0);
- inline SCloudParticle(const Vec3& vPos, float fRadiusX, float fRadiusY, float fRotMin, float fRotMax, Vec2 vUV[]);
- inline ~SCloudParticle();
-
- float GetRadiusX() const { return m_fSize[0]; }
- float GetRadiusY() const { return m_fSize[1]; }
- float GetTransparency() const { return m_fTransparency; }
- const Vec3& GetPosition() const { return m_vPosition; }
- const ColorF& GetBaseColor() const { return m_vBaseColor; }
- uint32 GetNumLitColors() const { return m_vLitColors.size(); }
- inline const ColorF GetLitColor(unsigned int index) const;
- float GetSquareSortDistance() const { return m_fSquareSortDistance; }
-
- //! Sets the radius of the particle.
- void SetRadiusX(float rad) { m_fSize[0] = rad; }
- void SetRadiusY(float rad) { m_fSize[1] = rad; }
- void SetTransparency(float trans) { m_fTransparency = trans; }
- void SetPosition(const Vec3& pos) { m_vPosition = pos; }
- void SetBaseColor(const ColorF& col) { m_vBaseColor = col; }
- void AddLitColor(const ColorF& col) { m_vLitColors.push_back(col); }
- void ClearLitColors() { m_vLitColors.clear(); }
- void SetSquareSortDistance(float fSquareDistance) { m_fSquareSortDistance = fSquareDistance; }
-
- bool operator<(const SCloudParticle& p) const
- {
- return (m_fSquareSortDistance < p.m_fSquareSortDistance);
- }
-
- bool operator>(const SCloudParticle& p) const
- {
- return (m_fSquareSortDistance > p.m_fSquareSortDistance);
- }
-
-protected:
- float m_fTransparency;
- Vec3 m_vPosition;
- float m_fSize[2];
- float m_fRotMin;
- float m_fRotMax;
- ColorF m_vBaseColor;
- TArray m_vLitColors;
- Vec3 m_vEye;
-
- // for sorting particles during shading
- float m_fSquareSortDistance;
-public:
- Vec2 m_vUV[2];
-};
-
-inline SCloudParticle::SCloudParticle()
-{
- m_fSize[0] = 0;
- m_fTransparency = 0;
- m_vPosition = Vec3(0, 0, 0);
- m_vBaseColor = Col_Black;
- m_vEye = Vec3(0, 0, 0);
- m_fSquareSortDistance = 0;
-
- m_vLitColors.clear();
-}
-
-inline SCloudParticle::SCloudParticle(const Vec3& pos, float fRadius, const ColorF& baseColor, float fTransparency)
-{
- m_fSize[0] = fRadius;
- m_fSize[1] = fRadius;
- m_fTransparency = fTransparency;
- m_vPosition = pos;
- m_vBaseColor = baseColor;
- m_vUV[0] = Vec2(0, 0);
- m_vUV[1] = Vec2(1, 1);
-
- m_fRotMin = 0;
- m_fRotMax = 0;
- m_vEye = Vec3(0, 0, 0);
- m_fSquareSortDistance = 0;
-
- m_vLitColors.clear();
-}
-
-inline SCloudParticle::SCloudParticle(const Vec3& vPos, float fRadiusX, float fRadiusY, float fRotMin, float fRotMax, Vec2 vUV[2])
-{
- m_fSize[0] = fRadiusX;
- m_fSize[1] = fRadiusY;
- m_vPosition = vPos;
- m_vBaseColor = Col_White;
- m_vUV[0] = vUV[0];
- m_vUV[1] = vUV[1];
- m_fRotMin = fRotMin;
- m_fRotMax = fRotMax;
-
- m_fTransparency = 1.0f;
- m_vEye = Vec3(0, 0, 0);
- m_fSquareSortDistance = 0;
-
- m_vLitColors.clear();
-}
-
-inline SCloudParticle::~SCloudParticle()
-{
- m_vLitColors.clear();
-}
-
-inline const ColorF SCloudParticle::GetLitColor(unsigned int index) const
-{
- if (index <= m_vLitColors.size())
- {
- return m_vLitColors[index];
- }
- else
- {
- return Col_Black;
- }
-}
-
-//===========================================================================
-class CREBaseCloud
- : public CRendElementBase
-{
- friend class CRECloud;
-
-public:
- CREBaseCloud()
- : CRendElementBase()
- {
- mfSetType(eDATA_Cloud);
- mfUpdateFlags(FCEF_TRANSFORM);
- }
- virtual void SetParticles(SCloudParticle* pParticles, int nNumParticles) = 0;
-
- virtual void GetMemoryUsage(ICrySizer* pSizer) const
- {
- pSizer->AddObject(this, sizeof(*this));
- }
-};
-
-#endif // __CREBASECLOUD_H__
diff --git a/Code/CryEngine/CryCommon/CREFogVolume.h b/Code/CryEngine/CryCommon/CREFogVolume.h
deleted file mode 100644
index 83a024d15e..0000000000
--- a/Code/CryEngine/CryCommon/CREFogVolume.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-#ifndef _CREFOGVOLUME_
-#define _CREFOGVOLUME_
-
-#pragma once
-
-#include "VertexFormats.h"
-
-
-struct IFogVolumeRenderNode;
-
-
-class CREFogVolume
- : public CRendElementBase
-{
-public:
- CREFogVolume();
-
- virtual ~CREFogVolume();
- virtual void mfPrepare(bool bCheckOverflow);
- virtual bool mfDraw(CShader* ef, SShaderPass* sfm);
-
- virtual void GetMemoryUsage(ICrySizer* pSizer) const
- {
- pSizer->AddObject(this, sizeof(*this));
- }
-
- Vec3 m_center;
- uint32 m_viewerInsideVolume : 1;
- uint32 m_affectsThisAreaOnly : 1;
- uint32 m_stencilRef : 8;
- uint32 m_volumeType : 1;
- uint32 m_reserved : 21;
- AABB m_localAABB;
- Matrix34 m_matWSInv;
- float m_globalDensity;
- float m_densityOffset;
- float m_nearCutoff;
- Vec2 m_softEdgesLerp;
- ColorF m_fogColor; // color already combined with fHDRDynamic
- Vec3 m_heightFallOffDirScaled;
- Vec3 m_heightFallOffBasePoint;
- Vec3 m_eyePosInWS;
- Vec3 m_eyePosInOS;
- Vec3 m_rampParams;
- Vec3 m_windOffset;
- float m_noiseScale;
- Vec3 m_noiseFreq;
- float m_noiseOffset;
- float m_noiseElapsedTime;
- Vec3 m_scale;
-};
-
-
-#endif // #ifndef _CREFOGVOLUME_
diff --git a/Code/CryEngine/CryCommon/CREGameEffect.h b/Code/CryEngine/CryCommon/CREGameEffect.h
deleted file mode 100644
index 17e68813ed..0000000000
--- a/Code/CryEngine/CryCommon/CREGameEffect.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-#ifndef _CREGameEffect_
-#define _CREGameEffect_
-
-#pragma once
-
-//==================================================================================================
-// Name: IREGameEffect
-// Desc: Interface for game effect render elements, designed to be instantiated in game code, and
-// called from the CREGameEffect within the engine. This then allows render elements
-// to be created in game code as well as in the engine.
-// Author: James Chilvers
-//==================================================================================================
-struct IREGameEffect
-{
- virtual ~IREGameEffect(){}
-
- virtual void mfPrepare(bool bCheckOverflow) = 0;
- virtual bool mfDraw(CShader* ef, SShaderPass* sfm, CRenderObject* renderObj) = 0;
-};//------------------------------------------------------------------------------------------------
-
-//==================================================================================================
-// Name: CREGameEffect
-// Desc: Render element that uses the IREGameEffect interface for its functionality
-// Author: James Chilvers
-//==================================================================================================
-class CREGameEffect
- : public CRendElementBase
-{
-public:
-
- CREGameEffect();
- ~CREGameEffect();
-
- // CRendElementBase interface
- void mfPrepare(bool bCheckOverflow);
- bool mfDraw(CShader* ef, SShaderPass* sfm);
-
- // CREGameEffect interface
- inline void SetPrivateImplementation(IREGameEffect* pImpl) { m_pImpl = pImpl; }
- inline IREGameEffect* GetPrivateImplementation() const { return m_pImpl; }
-
- virtual void GetMemoryUsage(ICrySizer* pSizer) const
- {
- pSizer->AddObject(this, sizeof(*this));
- }
-private:
-
- IREGameEffect* m_pImpl; // Implementation of of render element
-};//------------------------------------------------------------------------------------------------
-
-#endif // #ifndef _CREGameEffect_
diff --git a/Code/CryEngine/CryCommon/CREGeomCache.h b/Code/CryEngine/CryCommon/CREGeomCache.h
deleted file mode 100644
index 6911b8486e..0000000000
--- a/Code/CryEngine/CryCommon/CREGeomCache.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-
-// Description : Backend part of geometry cache rendering
-
-#ifndef CRYINCLUDE_CRYCOMMON_CREGEOMCACHE_H
-#define CRYINCLUDE_CRYCOMMON_CREGEOMCACHE_H
-#pragma once
-
-#if defined(USE_GEOM_CACHES)
-
-#include
-#include
-
-class CREGeomCache
- : public CRendElementBase
-{
-public:
- struct SMeshInstance
- {
- AABB m_aabb;
- Matrix34 m_matrix;
- Matrix34 m_prevMatrix;
- };
-
- struct SMeshRenderData
- {
- DynArray m_instances;
- _smart_ptr m_pRenderMesh;
- };
-
- struct UpdateList
- {
- CryCriticalSection m_mutex;
- AZStd::vector> m_geoms;
- };
-
-public:
- CREGeomCache();
- ~CREGeomCache();
-
- bool Update(const int flags, const bool bTesselation);
- static void UpdateModified();
-
- // CRendElementBase interface
- virtual bool mfUpdate(int Flags, bool bTessellation);
- virtual void mfPrepare(bool bCheckOverflow);
- virtual bool mfDraw(CShader* ef, SShaderPass* sfm);
-
- // CREGeomCache interface
- virtual void InitializeRenderElement(const uint numMeshes, _smart_ptr* pMeshes, uint16 materialId);
- virtual void SetupMotionBlur(CRenderObject* pRenderObject, const SRenderingPassInfo& passInfo);
-
- virtual volatile int* SetAsyncUpdateState(int& threadId);
- virtual DynArray* GetMeshFillDataPtr();
- virtual DynArray* GetRenderDataPtr();
- virtual void DisplayFilledBuffer(const int threadId);
-
-
- AZ::Vertex::Format GetVertexFormat() const override;
- bool GetGeometryInfo(SGeometryInfo &streams) override;
-
-private:
- uint16 m_materialId;
- volatile bool m_bUpdateFrame[2];
- volatile int m_transformUpdateState[2];
-
- // We use a double buffered m_meshFillData array for input from the main thread. When data
- // was successfully sent from the main thread it gets copied to m_meshRenderData
- // This simplifies the cases where frame data is missing, e.g. meshFillData is not updated for a frame
- // Note that meshFillData really needs to be double buffered because the copy occurs in render thread
- // so the next main thread could already be touching the data again
- //
- // Note: m_meshRenderData is directly accessed for ray intersections via GetRenderDataPtr.
- // This is safe, because it's only used in editor.
- DynArray m_meshFillData[2];
- DynArray m_meshRenderData;
-
- static StaticInstance sm_updateList[2]; // double buffered update lists
-
- AZ::Vertex::Format m_geomCacheVertexFormat;
-};
-
-#endif
-#endif // CRYINCLUDE_CRYCOMMON_CREGEOMCACHE_H
diff --git a/Code/CryEngine/CryCommon/CREImposter.h b/Code/CryEngine/CryCommon/CREImposter.h
deleted file mode 100644
index 1150212b7d..0000000000
--- a/Code/CryEngine/CryCommon/CREImposter.h
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-
-#pragma once
-
-#include
-#include "Cry_Camera.h"
-
-//================================================================================
-
-struct SDynTexture2;
-struct SDynTexture;
-class IDynTexture;
-class CameraViewParameters;
-
-struct IImposterRenderElement
-{
- virtual void GetMemoryUsage(ICrySizer* pSizer) const = 0;
- virtual void mfPrepare(bool bCheckOverflow) = 0;
- virtual bool mfDraw(CShader* ef, SShaderPass* sl) = 0;
- virtual const SMinMaxBox& mfGetWorldSpaceBounds() = 0;
-
- virtual bool IsSplit() = 0;
- virtual bool IsScreenImposter() = 0;
-
- virtual float GetRadiusX() = 0;
- virtual float GetRadiusY() = 0;
- virtual Vec3* GetQuadCorners() = 0;
- virtual Vec3 GetNearPoint() = 0;
- virtual Vec3 GetFarPoint() = 0;
- virtual float GetErrorToleranceCosAngle() = 0;
- virtual uint32 GetState() = 0;
- virtual int GetAlphaRef() = 0;
- virtual ColorF GetColorHelper() = 0;
- virtual Vec3 GetLastSunDirection() = 0;
- virtual uint8 GetLastBestEdge() = 0;
- virtual float GetNear() = 0;
- virtual float GetFar() = 0;
- virtual float GetTransparency() = 0;
- virtual Vec3 GetPosition();
- virtual int GetLogResolutionX() = 0;
- virtual int GetLogResolutionY() = 0;
- virtual CameraViewParameters& GetLastViewParameters() = 0;
- virtual IDynTexture* GetTexture() = 0;
- virtual IDynTexture* GetScreenTexture() = 0;
- virtual IDynTexture* GetFrontTexture() = 0;
- virtual IDynTexture* GetDepthTexture() = 0;
- virtual const SMinMaxBox& GetWorldSpaceBounds() = 0;
-
- virtual void SetBBox(const Vec3& min, const Vec3& max) = 0;
- virtual void SetScreenImposterState(bool state) = 0;
- virtual void SetState(uint32 state) = 0;
- virtual void SetAlphaRef(uint32 ref) = 0;
- virtual void SetPosition(Vec3 pos) = 0;
- virtual void SetFrameResetValue(int frameResetValue) = 0;
- virtual void SetTexture(IDynTexture* texture) = 0;
- virtual void SetScreenTexture(IDynTexture* texture) = 0;
- virtual void SetFrontTexture(IDynTexture* texture) = 0;
- virtual void SetDepthTexture(IDynTexture* texture) = 0;
-};
-
-class CREImposter
- : public CRendElementBase
-{
- friend class CRECloud;
- static IDynTexture* m_pScreenTexture;
-
- CameraViewParameters m_LastViewParameters;
- bool m_bScreenImposter;
- bool m_bSplit;
- float m_fRadiusX;
- float m_fRadiusY;
- Vec3 m_vQuadCorners[4]; // in world space, relative to m_vPos, in clockwise order, can be rotated
- Vec3 m_vNearPoint;
- Vec3 m_vFarPoint;
- int m_nLogResolutionX;
- int m_nLogResolutionY;
- IDynTexture* m_pTexture;
- IDynTexture* m_pFrontTexture;
- IDynTexture* m_pTextureDepth;
- float m_fErrorToleranceCosAngle; // cosine of m_fErrorToleranceAngle used to check if IsImposterValid
- SMinMaxBox m_WorldSpaceBV;
- uint32 m_State;
- int m_AlphaRef;
- float m_fCurTransparency;
- ColorF m_ColorHelper;
- Vec3 m_vPos;
- Vec3 m_vLastSunDir;
- uint8 m_nLastBestEdge; // 0..11 this edge is favored to not jitter between different edges
- float m_fNear;
- float m_fFar;
-
- bool IsImposterValid(const CameraViewParameters& viewParameters, float fRadiusX, float fRadiusY, float fCamRadiusX, float fCamRadiusY,
- const int iRequiredLogResX, const int iRequiredLogResY, const uint32 dwBestEdge);
-
- bool Display(bool bDisplayFrontOfSplit);
-
-public:
- int m_nFrameReset;
- int m_FrameUpdate;
- float m_fTimeUpdate;
-
- static int m_MemUpdated;
- static int m_MemPostponed;
- static int m_PrevMemUpdated;
- static int m_PrevMemPostponed;
-
- CREImposter()
- : CRendElementBase()
- , m_pTexture(NULL)
- , m_pFrontTexture(NULL)
- , m_pTextureDepth(NULL)
- , m_bSplit(false)
- , m_fRadiusX(0)
- , m_fRadiusY(0)
- , m_fErrorToleranceCosAngle(cos(DEG2RAD(0.25f)))
- , m_bScreenImposter(false)
- , m_State(GS_DEPTHWRITE)
- , m_AlphaRef(-1)
- , m_fCurTransparency(1.0f)
- , m_FrameUpdate(0)
- , m_nFrameReset(0)
- , m_fTimeUpdate(0)
- , m_vLastSunDir(0, 0, 0)
- , m_nLogResolutionX(0)
- , m_nLogResolutionY(0)
- , m_nLastBestEdge(0)
- {
- mfSetType(eDATA_Imposter);
- mfUpdateFlags(FCEF_TRANSFORM);
- m_ColorHelper = Col_White;
- }
- virtual ~CREImposter()
- {
- ReleaseResources();
- }
-
- bool UpdateImposter();
- void ReleaseResources();
-
- bool PrepareForUpdate();
-
- virtual void GetMemoryUsage(ICrySizer* pSizer) const
- {
- pSizer->AddObject(this, sizeof(*this));
- }
- virtual void mfPrepare(bool bCheckOverflow);
- virtual bool mfDraw(CShader* ef, SShaderPass* sl);
- const SMinMaxBox& mfGetWorldSpaceBounds() { return m_WorldSpaceBV; }
-
- virtual bool IsSplit() { return m_bSplit; }
- virtual bool IsScreenImposter() { return m_bScreenImposter; }
-
- virtual float GetRadiusX() { return m_fRadiusX; }
- virtual float GetRadiusY() { return m_fRadiusY; }
- virtual Vec3* GetQuadCorners() { return &m_vQuadCorners[0]; }
- virtual Vec3 GetNearPoint() { return m_vNearPoint; }
- virtual Vec3 GetFarPoint() { return m_vFarPoint; }
- virtual float GetErrorToleranceCosAngle() { return m_fErrorToleranceCosAngle; }
- virtual uint32 GetState() { return m_State; }
- virtual int GetAlphaRef() { return m_AlphaRef; }
- virtual ColorF GetColorHelper() { return m_ColorHelper; }
- virtual Vec3 GetLastSunDirection() { return m_vLastSunDir; }
- virtual uint8 GetLastBestEdge() { return m_nLastBestEdge; }
- virtual float GetNear() { return m_fNear; }
- virtual float GetFar() { return m_fFar; }
- virtual float GetTransparency() { return m_fCurTransparency; }
- virtual Vec3 GetPosition();
- virtual int GetLogResolutionX() { return m_nLogResolutionX; }
- virtual int GetLogResolutionY() { return m_nLogResolutionY; }
- virtual CameraViewParameters& GetLastViewParameters() { return m_LastViewParameters; }
- virtual IDynTexture** GetTexture() { return &m_pTexture; }
- virtual IDynTexture** GetScreenTexture() { return &m_pScreenTexture; }
- virtual IDynTexture** GetFrontTexture() { return &m_pFrontTexture; }
- virtual IDynTexture** GetDepthTexture() { return &m_pTextureDepth; }
- virtual const SMinMaxBox& GetWorldSpaceBounds() { return m_WorldSpaceBV; }
- virtual int GetFrameReset() { return m_nFrameReset; }
- virtual void SetBBox(const Vec3& min, const Vec3& max) { m_WorldSpaceBV.SetMin(min); m_WorldSpaceBV.SetMax(max); }
- virtual void SetScreenImposterState(bool state) { m_bScreenImposter = state; }
- virtual void SetState(uint32 state) { m_State = state; }
- virtual void SetAlphaRef(uint32 ref) { m_AlphaRef = ref; }
- virtual void SetPosition(Vec3 pos) { m_vPos = pos; }
- virtual void SetFrameResetValue(int frameResetValue) { m_nFrameReset = frameResetValue; }
-};
diff --git a/Code/CryEngine/CryCommon/CREMesh.h b/Code/CryEngine/CryCommon/CREMesh.h
deleted file mode 100644
index 40df816808..0000000000
--- a/Code/CryEngine/CryCommon/CREMesh.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-
-#ifndef __CREMESH_H__
-#define __CREMESH_H__
-
-class CREMesh
- : public CRendElementBase
-{
-public:
-
- struct CRenderChunk* m_pChunk;
- class CRenderMesh* m_pRenderMesh;
-
- // Copy of Chunk to avoid indirections
- int32 m_nFirstIndexId;
- int32 m_nNumIndices;
-
- uint32 m_nFirstVertId;
- uint32 m_nNumVerts;
-
-protected:
- CREMesh()
- {
- mfSetType(eDATA_Mesh);
- mfUpdateFlags(FCEF_TRANSFORM);
-
- m_pChunk = NULL;
- m_pRenderMesh = NULL;
- m_nFirstIndexId = -1;
- m_nNumIndices = -1;
- m_nFirstVertId = 0;
- m_nNumVerts = 0;
- }
-
- virtual ~CREMesh()
- {
- }
-
- // Ideally should be declared and left unimplemented to prevent slicing at compile time
- // but this would prevent auto code gen in renderer later on.
- // To track potential slicing, uncomment the following (and their equivalent in CREMeshImpl)
- //CREMesh(CREMesh&);
- //CREMesh& operator=(CREMesh& rhs);
-};
-
-#endif // __CREMESH_H__
diff --git a/Code/CryEngine/CryCommon/CREOcclusionQuery.h b/Code/CryEngine/CryCommon/CREOcclusionQuery.h
deleted file mode 100644
index 9350a74104..0000000000
--- a/Code/CryEngine/CryCommon/CREOcclusionQuery.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-
-#ifndef __CREOCCLUSIONQUERY_H__
-#define __CREOCCLUSIONQUERY_H__
-
-#define SUPP_HMAP_OCCL
-#define SUPP_HWOBJ_OCCL
-
-//=============================================================
-
-class CRenderMesh;
-
-class CREOcclusionQuery
- : public CRendElementBase
-{
- friend class CRender3D;
- bool m_bSucceeded;
-public:
-
- int m_nVisSamples;
- int m_nCheckFrame;
- int m_nDrawFrame;
- Vec3 m_vBoxMin;
- Vec3 m_vBoxMax;
-
- UINT_PTR m_nOcclusionID; // this will carry a pointer LPDIRECT3DQUERY9, so it needs to be 64-bit on Windows 64
-
- CRenderMesh* m_pRMBox;
- static uint32 m_nQueriesPerFrameCounter;
- static uint32 m_nReadResultNowCounter;
- static uint32 m_nReadResultTryCounter;
-
- CREOcclusionQuery()
- {
- m_nOcclusionID = 0;
-
- m_nVisSamples = 800 * 600;
- m_nCheckFrame = 0;
- m_nDrawFrame = 0;
- m_vBoxMin = Vec3(0, 0, 0);
- m_vBoxMax = Vec3(0, 0, 0);
- m_pRMBox = NULL;
-
- mfSetType(eDATA_OcclusionQuery);
- mfUpdateFlags(FCEF_TRANSFORM);
- }
-
- bool RT_ReadResult_Try(uint32 nDefaultNumSamples);
-
- ILINE bool HasSucceeded() const { return m_bSucceeded; }
-
- virtual ~CREOcclusionQuery();
-
- virtual void mfPrepare(bool bCheckOverflow);
- virtual bool mfDraw(CShader* ef, SShaderPass* sfm);
- virtual void mfReset();
- virtual bool mfReadResult_Try(uint32 nDefaultNumSamples = 1);
- virtual bool mfReadResult_Now();
-
- virtual void GetMemoryUsage(ICrySizer* pSizer) const
- {
- pSizer->AddObject(this, sizeof(*this));
- }
-};
-
-struct OcclusionTestClient
-{
- OcclusionTestClient()
- : nLastOccludedMainFrameID(0)
- , nLastVisibleMainFrameID(0)
- {
-#ifdef SUPP_HMAP_OCCL
- vLastVisPoint.Set(0, 0, 0);
- nTerrainOccLastFrame = 0;
-#endif
-#ifdef SUPP_HWOBJ_OCCL
- bOccluded = true;
- pREOcclusionQuery = 0;
-#endif
- //nInstantTestRequested=0;
- }
-#ifdef SUPP_HWOBJ_OCCL
- ~OcclusionTestClient()
- {
- if (pREOcclusionQuery)
- {
- pREOcclusionQuery->Release(false);
- }
- }
-#endif
- uint32 nLastVisibleMainFrameID, nLastOccludedMainFrameID;
- uint32 nLastShadowCastMainFrameID, nLastNoShadowCastMainFrameID;
-#ifdef SUPP_HMAP_OCCL
- Vec3 vLastVisPoint;
- int nTerrainOccLastFrame;
-#endif
-#ifdef SUPP_HWOBJ_OCCL
- CREOcclusionQuery* pREOcclusionQuery;
- uint8 bOccluded;
-#endif
- //uint8 nInstantTestRequested;
-};
-
-
-#endif // CRYINCLUDE_CRYCOMMON_CREOCCLUSIONQUERY_H
diff --git a/Code/CryEngine/CryCommon/CREPostProcess.h b/Code/CryEngine/CryCommon/CREPostProcess.h
deleted file mode 100644
index 4803ae2166..0000000000
--- a/Code/CryEngine/CryCommon/CREPostProcess.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-
-#ifndef CRYINCLUDE_CRYCOMMON_CREPOSTPROCESS_H
-#define CRYINCLUDE_CRYCOMMON_CREPOSTPROCESS_H
-#pragma once
-
-
-class CREPostProcess
- : public CRendElementBase
-{
- friend class CD3D9Renderer;
-
-public:
-
- CREPostProcess();
- virtual ~CREPostProcess();
-
- virtual void mfPrepare(bool bCheckOverflow);
- virtual bool mfDraw(CShader* ef, SShaderPass* sfm);
-
- // Use for setting numeric values, vec4 (colors, position, vectors, wtv), strings
- virtual int mfSetParameter(const char* pszParam, float fValue, bool bForceValue = false) const;
- virtual int mfSetParameterVec4(const char* pszParam, const Vec4& pValue, bool bForceValue = false) const;
- virtual int mfSetParameterString(const char* pszParam, const char* pszArg) const;
-
- virtual void mfGetParameter(const char* pszParam, float& fValue) const;
- virtual void mfGetParameterVec4(const char* pszParam, Vec4& pValue) const;
- virtual void mfGetParameterString(const char* pszParam, const char*& pszArg) const;
-
- virtual int32 mfGetPostEffectID(const char* pPostEffectName) const;
-
- // Reset all post processing effects
- virtual void Reset(bool bOnSpecChange = false);
- virtual void mfReset()
- {
- Reset();
- }
-
- virtual void GetMemoryUsage(ICrySizer* pSizer) const
- {
- pSizer->AddObject(this, sizeof(*this));
- }
-};
-
-#endif // CRYINCLUDE_CRYCOMMON_CREPOSTPROCESS_H
diff --git a/Code/CryEngine/CryCommon/CREPrismObject.h b/Code/CryEngine/CryCommon/CREPrismObject.h
deleted file mode 100644
index 4ec290f1b9..0000000000
--- a/Code/CryEngine/CryCommon/CREPrismObject.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-#ifndef _CREPRISMOBJECT_
-#define _CREPRISMOBJECT_
-
-#pragma once
-
-#if !defined(EXCLUDE_DOCUMENTATION_PURPOSE)
-
-class CREPrismObject
- : public CRendElementBase
-{
-public:
- CREPrismObject();
-
- virtual ~CREPrismObject() {}
- virtual void mfPrepare(bool bCheckOverflow);
- virtual bool mfDraw(CShader* ef, SShaderPass* sfm);
-
- virtual void GetMemoryUsage(ICrySizer* pSizer) const
- {
- pSizer->AddObject(this, sizeof(*this));
- }
-
- Vec3 m_center;
-};
-
-#endif // EXCLUDE_DOCUMENTATION_PURPOSE
-
-#endif // _CREPRISMOBJECT_
diff --git a/Code/CryEngine/CryCommon/CRESky.h b/Code/CryEngine/CryCommon/CRESky.h
deleted file mode 100644
index 3dfc7d184f..0000000000
--- a/Code/CryEngine/CryCommon/CRESky.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-
-#ifndef __CRESKY_H__
-#define __CRESKY_H__
-
-//=============================================================
-
-#include "VertexFormats.h"
-#include
-
-struct SSkyLightRenderParams;
-
-class CRESky
- : public CRendElementBase
-{
- friend class CRender3D;
-
-public:
-
- float m_fTerrainWaterLevel;
- float m_fSkyBoxStretching;
- float m_fAlpha;
- int m_nSphereListId;
-
-public:
- CRESky();
- virtual ~CRESky();
- virtual void mfPrepare(bool bCheckOverflow);
- virtual bool mfDraw(CShader* ef, SShaderPass* sfm);
-
- virtual void GetMemoryUsage(ICrySizer* pSizer) const
- {
- pSizer->AddObject(this, sizeof(*this));
- }
-
- AZ::Vertex::Format GetVertexFormat() const override;
- bool GetGeometryInfo(SGeometryInfo& streams) override;
-
-private:
- AZ::Vertex::Format m_skyVertexFormat;
-};
-
-class CREHDRSky
- : public CRendElementBase
-{
-public:
- CREHDRSky();
- virtual ~CREHDRSky();
- virtual void mfPrepare(bool bCheckOverflow);
- virtual bool mfDraw(CShader* ef, SShaderPass* sfm);
-
- virtual void GetMemoryUsage(ICrySizer* pSizer) const
- {
- pSizer->AddObject(this, sizeof(*this));
- }
-
- void GenerateSkyDomeTextures(int32 width, int32 height);
-
- virtual AZ::Vertex::Format GetVertexFormat() const override;
- virtual bool GetGeometryInfo(SGeometryInfo& streams) override;
-
-public:
- const SSkyLightRenderParams* m_pRenderParams;
- int m_moonTexId;
- class CTexture* m_pSkyDomeTextureMie;
- class CTexture* m_pSkyDomeTextureRayleigh;
-
- static void SetCommonMoonParams(CShader* ef, bool bUseMoon = false);
-
-private:
- void Init();
-
-private:
- int m_skyDomeTextureLastTimeStamp;
- int m_frameReset;
- class CStars* m_pStars;
- AZ::Vertex::Format m_hdrSkyVertexFormat;
-};
-
-
-#endif // __CRESKY_H__
diff --git a/Code/CryEngine/CryCommon/CREVolumeObject.h b/Code/CryEngine/CryCommon/CREVolumeObject.h
deleted file mode 100644
index 2137053a8e..0000000000
--- a/Code/CryEngine/CryCommon/CREVolumeObject.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-#ifndef _CREVOLUMEOBJECT_
-#define _CREVOLUMEOBJECT_
-
-#pragma once
-
-#include "VertexFormats.h"
-
-
-struct IVolumeObjectRenderNode;
-
-struct IVolumeTexture
-{
-public:
- virtual ~IVolumeTexture() {}
- virtual void Release() = 0;
- virtual bool Create(unsigned int width, unsigned int height, unsigned int depth, unsigned char* pData) = 0;
- virtual bool Update(unsigned int width, unsigned int height, unsigned int depth, const unsigned char* pData) = 0;
- virtual int GetTexID() const = 0;
- virtual uint32 GetWidth() const = 0;
- virtual uint32 GetHeight() const = 0;
- virtual uint32 GetDepth() const = 0;
- virtual ITexture* GetTexture() const = 0;
-};
-
-class CREVolumeObject
- : public CRendElementBase
-{
-public:
- CREVolumeObject();
-
- virtual ~CREVolumeObject();
- virtual void mfPrepare(bool bCheckOverflow);
- virtual bool mfDraw(CShader* ef, SShaderPass* sfm);
-
- virtual IVolumeTexture* CreateVolumeTexture() const;
-
- virtual void GetMemoryUsage(ICrySizer* pSizer) const
- {
- pSizer->AddObject(this, sizeof(*this));
- }
-
- Vec3 m_center;
- Matrix34 m_matInv;
- Vec3 m_eyePosInWS;
- Vec3 m_eyePosInOS;
- Plane_tpl m_volumeTraceStartPlane;
- AABB m_renderBoundsOS;
- bool m_viewerInsideVolume;
- bool m_nearPlaneIntersectsVolume;
- float m_alpha;
- float m_scale;
-
- IVolumeTexture* m_pDensVol;
- IVolumeTexture* m_pShadVol;
- _smart_ptr m_pHullMesh;
-};
-
-#endif // #ifndef _CREVOLUMEOBJECT_
diff --git a/Code/CryEngine/CryCommon/CREWaterOcean.h b/Code/CryEngine/CryCommon/CREWaterOcean.h
deleted file mode 100644
index e8ca310d41..0000000000
--- a/Code/CryEngine/CryCommon/CREWaterOcean.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-
-#ifndef _CREWATEROCEAN_
-#define _CREWATEROCEAN_
-
-class CWater;
-
-class CREWaterOcean
- : public CRendElementBase
-{
-public:
- CREWaterOcean();
- virtual ~CREWaterOcean();
-
- virtual void mfPrepare(bool bCheckOverflow);
- virtual bool mfDraw(CShader* ef, SShaderPass* sfm);
- virtual void mfGetPlane(Plane_tpl& pl);
-
- virtual void Create(uint32 nVerticesCount, SVF_P3F_C4B_T2F* pVertices, uint32 nIndicesCount, const void* pIndices, uint32 nIndexSizeof);
- void ReleaseOcean();
-
- virtual Vec3 GetPositionAt(float x, float y) const;
- virtual Vec4* GetDisplaceGrid() const;
-
- virtual void GetMemoryUsage(ICrySizer* pSizer) const
- {
- pSizer->AddObject(this, sizeof(*this));
- }
-private:
-
- uint32 m_nVerticesCount;
- uint32 m_nIndicesCount;
- uint32 m_nIndexSizeof;
-
- void* m_pVertDecl;
- void* m_pVertices;
- void* m_pIndices;
-
-private:
-
- void UpdateFFT();
- void FrameUpdate();
-};
-
-
-#endif
diff --git a/Code/CryEngine/CryCommon/CREWaterVolume.h b/Code/CryEngine/CryCommon/CREWaterVolume.h
deleted file mode 100644
index 89102e3097..0000000000
--- a/Code/CryEngine/CryCommon/CREWaterVolume.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-#ifndef _CREWATERVOLUME_
-#define _CREWATERVOLUME_
-
-#pragma once
-
-
-#include "VertexFormats.h"
-
-class CREWaterVolume
- : public CRendElementBase
-{
-public:
- CREWaterVolume();
-
- virtual ~CREWaterVolume();
- virtual void mfPrepare(bool bCheckOverflow);
- virtual bool mfDraw(CShader* ef, SShaderPass* sfm);
- virtual void mfGetPlane(Plane_tpl& pl);
- virtual void mfCenter(Vec3& vCenter, CRenderObject* pObj);
-
- virtual void GetMemoryUsage(ICrySizer* pSizer) const
- {
- pSizer->AddObject(this, sizeof(*this));
- }
-
-public:
- struct SParams
- {
- SParams()
- : m_pVertices(0)
- , m_pIndices(0)
- , m_numVertices(0)
- , m_numIndices(0)
- , m_center(0, 0, 0)
- , m_WSBBox(Vec3(-1, -1, -1), Vec3(1, 1, 1))
- , m_fogPlane(Vec3(0, 0, 1), 0)
- , m_fogDensity(0.1f)
- , m_fogColor(0.2f, 0.5f, 0.7f)
- , m_fogColorAffectedBySun(true)
- , m_fogShadowing(0.5f)
- , m_caustics(true)
- , m_causticIntensity(1.0f)
- , m_causticTiling(1.0f)
- , m_causticHeight(0.9f)
- , m_viewerInsideVolume(false)
- , m_viewerCloseToWaterPlane(false)
- , m_viewerCloseToWaterVolume(false)
- {
- }
-
- const SVF_P3F_C4B_T2F* m_pVertices;
- const uint16* m_pIndices;
-
- size_t m_numVertices;
- size_t m_numIndices;
-
- Vec3 m_center;
- AABB m_WSBBox;
-
- Plane_tpl m_fogPlane;
- float m_fogDensity;
- Vec3 m_fogColor;
- bool m_fogColorAffectedBySun;
- float m_fogShadowing;
-
- bool m_caustics;
- float m_causticIntensity;
- float m_causticTiling;
- float m_causticHeight;
-
- bool m_viewerInsideVolume;
- bool m_viewerCloseToWaterPlane;
- bool m_viewerCloseToWaterVolume;
- };
-
- struct SOceanParams
- {
- SOceanParams()
- : m_fogColor(0.2f, 0.5f, 0.7f)
- , m_fogColorShallow(0.2f, 0.5f, 0.7f)
- , m_fogDensity(0.2f)
- {
- }
-
- Vec3 m_fogColor;
- Vec3 m_fogColorShallow;
- float m_fogDensity;
- };
-
-public:
- const SParams* m_pParams;
- const SOceanParams* m_pOceanParams;
- bool m_drawWaterSurface;
- bool m_drawFastPath;
-};
-
-
-#endif // #ifndef _CREWATERVOLUME_
diff --git a/Code/CryEngine/CryCommon/Console_std.h b/Code/CryEngine/CryCommon/Console_std.h
deleted file mode 100644
index 55944a2960..0000000000
--- a/Code/CryEngine/CryCommon/Console_std.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-
-#pragma once
-
-#include
-
-#include
-
-namespace std
-{
-#if defined(AZ_RESTRICTED_PLATFORM)
- #include AZ_RESTRICTED_FILE(Console_std_h)
-#endif
-}
diff --git a/Code/CryEngine/CryCommon/CountedValue.h b/Code/CryEngine/CryCommon/CountedValue.h
deleted file mode 100644
index 8ff3c5639c..0000000000
--- a/Code/CryEngine/CryCommon/CountedValue.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-
-// Description : A wrapper that counts the number of times the wrapped object
-// has been set This is useful for netserializing an object
-// that might be given a new value that s the same as the old value
-
-
-#ifndef CRYINCLUDE_CRYCOMMON_COUNTEDVALUE_H
-#define CRYINCLUDE_CRYCOMMON_COUNTEDVALUE_H
-#pragma once
-
-
-template
-struct CountedValue
-{
-public:
- CountedValue()
- : m_lastProducedId(0)
- , m_lastConsumedId(0) {}
-
- typedef uint32 TCountedID;
-
- void SetAndDirty(const T& value)
- {
- m_value = value;
- ++m_lastProducedId;
- CRY_ASSERT(m_lastProducedId > 0);
- }
-
- const T* GetLatestValue()
- {
- bool bHasNewValue = IsDirty(); // check for dirtiness before updating ids
- m_lastConsumedId = m_lastProducedId;
-
- return bHasNewValue ? &m_value : NULL;
- }
-
- inline bool IsDirty() const
- {
- return m_lastProducedId != m_lastConsumedId;
- }
-
- const T& Peek() const
- {
- return m_value;
- }
-
- TCountedID GetLatestID() const
- {
- return m_lastProducedId;
- }
-
- // This method should only be used to update the object during serialization!
- void UpdateDuringSerializationOnly(const T& value, TCountedID lastProducedId)
- {
- m_value = value;
- m_lastProducedId = lastProducedId;
- }
-
-private:
- TCountedID m_lastProducedId;
- TCountedID m_lastConsumedId;
- T m_value;
-};
-
-#endif // CRYINCLUDE_CRYCOMMON_COUNTEDVALUE_H
diff --git a/Code/CryEngine/CryCommon/CrtDebugStats.h b/Code/CryEngine/CryCommon/CrtDebugStats.h
deleted file mode 100644
index 6f03d33c18..0000000000
--- a/Code/CryEngine/CryCommon/CrtDebugStats.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
-* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-* its licensors.
-*
-* For complete copyright and license terms please see the LICENSE at the root of this
-* distribution (the "License"). All use of this software is governed by the License,
-* or, if provided, by the license below or the license accompanying this file. Do not
-* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*
-*/
-// Original file Copyright Crytek GMBH or its affiliates, used under license.
-
-// support for leak dumping and statistics gathering using vs Crt Debug
-// should be included in every DLL below DllMain()
-#ifndef CRYINCLUDE_CRYCOMMON_CRTDEBUGSTATS_H
-#define CRYINCLUDE_CRYCOMMON_CRTDEBUGSTATS_H
-#pragma once
-
-#ifdef WIN32
-#ifdef _DEBUG
-
-
-#include
-#include // CryLogAlways
-#include
-
-// copied from DBGINT.H (not a public header!)
-
-#define nNoMansLandSize 4
-
-typedef struct _CrtMemBlockHeader
-{
- struct _CrtMemBlockHeader* pBlockHeaderNext;
- struct _CrtMemBlockHeader* pBlockHeaderPrev;
- char* szFileName;
- int nLine;
- size_t nDataSize;
- int nBlockUse;
- long lRequest;
- unsigned char gap[nNoMansLandSize];
- /* followed by:
- * unsigned char data[nDataSize];
- * unsigned char anotherGap[nNoMansLandSize];
- */
-} _CrtMemBlockHeader;
-
-struct SFileInfo
-{
- int blocks;
- INT_PTR bytes; //AMD Port
- SFileInfo(INT_PTR b) { blocks = 1; bytes = b; }; //AMD Port
-};
-
-_CrtMemState lastcheckpoint;
-bool checkpointset = false;
-
-extern "C" void __declspec(dllexport) CheckPoint()
-{
- _CrtMemCheckpoint(&lastcheckpoint);
- checkpointset = true;
-};
-
-bool pairgreater(const std::pair& elem1, const std::pair& elem2)
-{
- return elem1.second.bytes > elem2.second.bytes;
-}
-
-extern "C" void __declspec(dllexport) UsageSummary([[maybe_unused]] ILog * log, char* modulename, int* extras)
-{
- _CrtMemState state;
-
- if (checkpointset)
- {
- _CrtMemState recent;
- _CrtMemCheckpoint(&recent);
- _CrtMemDifference(&state, &lastcheckpoint, &recent);
- }
- else
- {
- _CrtMemCheckpoint(&state);
- };
-
- INT_PTR numblocks = state.lCounts[_NORMAL_BLOCK]; //AMD Port
- INT_PTR totalalloc = state.lSizes[_NORMAL_BLOCK]; //AMD Port
-
- check_convert(extras[0]) = totalalloc;
- check_convert(extras[1]) = numblocks;
-
- CryLogAlways("$5---------------------------------------------------------------------------------------------------");
-
- if (!numblocks)
- {
- CryLogAlways("$3Module %s has no memory in use", modulename);
- return;
- }
- ;
-
- CryLogAlways("$5Usage summary for module %s", modulename);
- CryLogAlways("%d kbytes (peak %d) in %d objects of %d average bytes\n",
- totalalloc / 1024, state.lHighWaterCount / 1024, numblocks, numblocks ? totalalloc / numblocks : 0);
- CryLogAlways("%d kbytes allocated over time\n", state.lTotalCount / 1024);
-
- typedef std::map FileMap;
- FileMap fm;
-
- for (_CrtMemBlockHeader* h = state.pBlockHeader; h; h = h->pBlockHeaderNext)
- {
- if (_BLOCK_TYPE(h->nBlockUse) != _NORMAL_BLOCK)
- {
- continue;
- }
- string s = h->szFileName ? h->szFileName : "NO_SOURCE";
- if (h->nLine > 0)
- {
- char buf[16];
- sprintf_s(buf, "_%d", h->nLine);
- s += buf;
- }
- FileMap::iterator it = fm.find(s);
- if (it != fm.end())
- {
- (*it).second.blocks++;
- (*it).second.bytes += h->nDataSize;
- }
- else
- {
- fm.insert(FileMap::value_type(s, SFileInfo(h->nDataSize)));
- };
- }
- ;
-
- typedef std::vector< std::pair > FileVector;
- FileVector fv;
- for (FileMap::iterator it = fm.begin(); it != fm.end(); ++it)
- {
- fv.push_back((*it));
- }
- std::sort(fv.begin(), fv.end(), pairgreater);
-
- for (FileVector::iterator it = fv.begin(); it != fv.end(); ++it)
- {
- CryLogAlways("%6d kbytes / %6d blocks allocated from %s\n",
- (*it).second.bytes / 1024, (*it).second.blocks, (*it).first.c_str());
- }
- ;
-};
-
-#endif // _DEBUG
-
-#if !defined(_RELEASE) && !defined(_DLL) && defined(HANDLE)
-extern "C" HANDLE _crtheap;
-extern "C" HANDLE __declspec(dllexport) GetDLLHeap() {
- return _crtheap;
-};
-#endif
-
-#endif // WIN32
-
-#endif // CRYINCLUDE_CRYCOMMON_CRTDEBUGSTATS_H
diff --git a/Code/CryEngine/CryCommon/CryArray.h b/Code/CryEngine/CryCommon/CryArray.h
index 793201cf40..73a9a9ec38 100644
--- a/Code/CryEngine/CryCommon/CryArray.h
+++ b/Code/CryEngine/CryCommon/CryArray.h
@@ -15,7 +15,7 @@
#define CRYINCLUDE_CRYCOMMON_CRYARRAY_H
#pragma once
-#include // <> required for Interfuscator
+#include "CryLegacyAllocator.h"
//---------------------------------------------------------------------------
// Convenient iteration macros
@@ -91,8 +91,6 @@ Public classes:
Array
StaticArray
DynArray
- FastDynArray
- FixedDynArray
StaticDynArray
Support classes are placed in namespaces NArray and NAlloc to reduce global name usage.
@@ -612,13 +610,6 @@ namespace NAlloc
//---------------------------------------------------------------------------
// Allocators for DynArray.
- // No reallocation, for use in FixedDynArray
- struct NullAlloc
- {
- static void* alloc(void* pMem, [[maybe_unused]] size_t& nSize, [[maybe_unused]] size_t nAlign, [[maybe_unused]] bool bSlack = false)
- { return pMem; }
- };
-
// Standard CryModule memory allocation, using aligned versions
struct ModuleAlloc
{
@@ -655,128 +646,15 @@ namespace NAlloc
// Standard allocator for DynArray stores a compatibility pointer in the memory
typedef AllocCompatible StandardAlloc;
-
- // Allocator using specific heaps
- struct GeneralHeapAlloc
- : ModuleAlloc
- {
- IGeneralMemoryHeap* m_pHeap;
-
- GeneralHeapAlloc()
- : m_pHeap(0) {}
-
- explicit GeneralHeapAlloc(IGeneralMemoryHeap* pHeap)
- : m_pHeap(pHeap) {}
-
- void* alloc(void* pMem, size_t& nSize, size_t nAlign, bool bSlack = false) const
- {
- if (m_pHeap)
- {
- if (pMem)
- {
- if (!nSize)
- {
- // Dealloc
- m_pHeap->Free(pMem);
- return 0;
- }
- }
- else if (nSize)
- {
- // Alloc
- if (bSlack)
- {
- nSize = realloc_size(nSize);
- }
- return m_pHeap->Memalign(nAlign, nSize, "");
- }
- }
-
- return ModuleAlloc::alloc(pMem, nSize, nAlign, bSlack);
- }
- };
};
//---------------------------------------------------------------------------
// Storage schemes for dynamic arrays
namespace NArray
{
- /*---------------------------------------------------------------------------
- // STORAGE prototype for DynArray
- // Extends ArrayStorage with resizing functionality.
-
- struct DynStorage
- {
- struct Store: ArrayStorage::Store
- {
- I capacity() const;
- size_t get_alloc_size() const;
- void resize_raw( I new_size, bool allow_slack );
- };
- };
- ---------------------------------------------------------------------------*/
-
- //---------------------------------------------------------------------------
- // FastDynStorage: STORAGE scheme for DynArray.
- // Simple extension to ArrayStorage: size & capacity fields are inline, 3 words storage, fast access.
-
- template
- struct FastDynStorage
- {
- template
- struct Store
- : private A
- , public ArrayStorage::Store
- {
- typedef ArrayStorage::Store super_type;
-
- using super_type::m_aElems;
- using super_type::m_nCount;
-
- // Construction.
- Store()
- : m_nCapacity(0)
- {
- }
-
- Store(const A& a)
- : A(a)
- , m_nCapacity(0)
- {
- }
-
- I capacity() const
- { return m_nCapacity; }
-
- size_t get_alloc_size() const
- { return NAlloc::get_alloc_size(*this, m_aElems, capacity() * sizeof(T), alignof(T)); }
-
- void resize_raw(I new_size, bool allow_slack = false)
- {
- if (allow_slack ? new_size > capacity() : new_size != capacity())
- {
- m_nCapacity = new_size;
- m_aElems = NAlloc::reallocate(static_cast(*this), m_aElems, m_nCount, m_nCapacity, alignof(T), allow_slack);
- }
- set_size(new_size);
- }
-
- protected:
-
- I m_nCapacity;
-
- void set_size(I new_size)
- {
- assert(new_size >= 0 && new_size <= capacity());
- m_nCount = new_size;
- }
- };
- };
-
//---------------------------------------------------------------------------
// SmallDynStorage: STORAGE scheme for DynArray.
// Array is just a single pointer, size and capacity information stored before the array data.
- // Slightly slower than FastDynStorage, optimal for saving space, especially when array likely to be empty.
template
struct SmallDynStorage
@@ -1459,35 +1337,6 @@ struct LegacyDynArray
}
};
-
-//---------------------------------------------------------------------------
-
-template
-struct FastDynArray
- : DynArray< T, I, NArray::FastDynStorage >
-{
-};
-
-template
-struct FixedDynArray
- : LegacyDynArray< T, I, NArray::FastDynStorage