diff --git a/.clang-format b/.clang-format
index 2a9205219a..04e0284f97 100644
--- a/.clang-format
+++ b/.clang-format
@@ -7,28 +7,33 @@ AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Right
AlignOperands: false
AlignTrailingComments: false
+AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortFunctionsOnASingleLine: None
+AllowShortLambdasOnASingleLine: None
AlwaysBreakAfterReturnType: None
AlwaysBreakTemplateDeclarations: true
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 +43,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 d7f9d36c50..2037909dbd 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -115,7 +115,6 @@
*.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
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/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/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/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/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 280c25bcf7..0000000000
--- a/AutomatedTesting/Gem/Code/runtime_dependencies.cmake
+++ /dev/null
@@ -1,48 +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_AtomBridge
- Gem::NvCloth
- Gem::Blast
-)
diff --git a/AutomatedTesting/Gem/Code/tool_dependencies.cmake b/AutomatedTesting/Gem/Code/tool_dependencies.cmake
deleted file mode 100644
index fc50707c12..0000000000
--- a/AutomatedTesting/Gem/Code/tool_dependencies.cmake
+++ /dev/null
@@ -1,58 +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::EMotionFX.Editor
- Gem::ImGui.Editor
- Gem::Atom_AtomBridge.Editor
- Gem::NvCloth.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/Tests/__init__.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/__init__.py
old mode 100755
new mode 100644
similarity index 99%
rename from Tests/__init__.py
rename to AutomatedTesting/Gem/PythonTests/AWS/Windows/__init__.py
index 6ed3dc4bda..8caef52682
--- a/Tests/__init__.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/__init__.py
@@ -7,4 +7,5 @@ distribution (the "License"). All use of this software is governed by the Licens
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.
-"""
\ No newline at end of file
+"""
+
diff --git a/Tests/BuildSystems/test_lib/__init__.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/cdk/__init__.py
old mode 100755
new mode 100644
similarity index 99%
rename from Tests/BuildSystems/test_lib/__init__.py
rename to AutomatedTesting/Gem/PythonTests/AWS/Windows/cdk/__init__.py
index 6ed3dc4bda..8caef52682
--- a/Tests/BuildSystems/test_lib/__init__.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/cdk/__init__.py
@@ -7,4 +7,5 @@ distribution (the "License"). All use of this software is governed by the Licens
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.
-"""
\ No newline at end of file
+"""
+
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..455b3f94cb
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/cdk/cdk.py
@@ -0,0 +1,155 @@
+"""
+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
+
+
+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 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 = '') -> List[str]:
+ """
+ Deploys all the CDK stacks.
+ :param context_variable: Context variable for enabling optional features.
+ :return List of deployed stack arns.
+ """
+ if not self._cdk_path:
+ return []
+
+ deploy_cdk_application_cmd = ['cdk', 'deploy', '--require-approval', 'never']
+ 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 = ''
+
+
+@pytest.fixture(scope='function')
+def cdk(
+ request: pytest.fixture,
+ project: str,
+ feature_name: str,
+ workspace: pytest.fixture,
+ aws_utils: pytest.fixture,
+ 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 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())
+
+ def teardown():
+ if destroy_stacks_on_teardown:
+ cdk_obj.destroy()
+ request.addfinalizer(teardown)
+
+ return cdk_obj
diff --git a/Tests/graphics/__init__.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/__init__.py
old mode 100755
new mode 100644
similarity index 99%
rename from Tests/graphics/__init__.py
rename to AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/__init__.py
index 6ed3dc4bda..8caef52682
--- a/Tests/graphics/__init__.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/__init__.py
@@ -7,4 +7,5 @@ distribution (the "License"). All use of this software is governed by the Licens
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.
-"""
\ No newline at end of file
+"""
+
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/Tests/ly_shared/__init__.py b/AutomatedTesting/Gem/PythonTests/AWS/__init__.py
old mode 100755
new mode 100644
similarity index 99%
rename from Tests/ly_shared/__init__.py
rename to AutomatedTesting/Gem/PythonTests/AWS/__init__.py
index 6ed3dc4bda..8caef52682
--- a/Tests/ly_shared/__init__.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/__init__.py
@@ -7,4 +7,5 @@ distribution (the "License"). All use of this software is governed by the Licens
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.
-"""
\ No newline at end of file
+"""
+
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_utils.py b/AutomatedTesting/Gem/PythonTests/AWS/common/aws_utils.py
new file mode 100644
index 0000000000..7a15ba0abe
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/common/aws_utils.py
@@ -0,0 +1,82 @@
+"""
+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__)
+
+
+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 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 setting up a Cdk
+ :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/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 6f72d45893..8142691464 100644
--- a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt
@@ -15,406 +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 1500
- 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 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}/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 ##
-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}/NvCloth/TestSuite_Active.py
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- Legacy::Editor
- AZ::AssetProcessor
- AutomatedTesting.Assets
- COMPONENT
- NvCloth
- )
-endif()
+add_subdirectory(NvCloth)
## 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}/prefab/TestSuite_Main.py
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- Legacy::Editor
- AZ::AssetProcessor
- AutomatedTesting.Assets
- )
-endif()
+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 ##
-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}/smoke
- TIMEOUT 1500
- RUNTIME_DEPENDENCIES
- AZ::AssetProcessor
- AZ::PythonBindingsExample
- Legacy::Editor
- AutomatedTesting.GameLauncher
- AutomatedTesting.Assets
- COMPONENT
- Smoke
- )
-endif()
+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/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/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/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..a2002f2d15 100644
--- a/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/asset_processor_tests/CMakeLists.txt
@@ -141,4 +141,3 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
# )
endif()
-
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..1043bbaefa 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
@@ -302,7 +302,7 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
that generating debug information does not affect asset list creation
"""
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
@@ -377,7 +377,7 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
subcommands.
"""
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)
@@ -460,12 +460,12 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
"""
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 +502,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
@@ -613,20 +613,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 +646,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 +670,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
@@ -697,9 +697,9 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
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 +717,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 +741,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 +759,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 +769,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 +798,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 +879,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 +895,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 +911,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()
@@ -1046,7 +1046,7 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
"--addDefaultSeedListFiles",
"--platform=pc",
"--print",
- f"--project={workspace.project}"
+ f"--project-path={workspace.project}"
],
universal_newlines=True,
)
@@ -1115,7 +1115,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))
@@ -1156,13 +1156,15 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
# fmt:off
def test_WindowsAndMac_FilesMarkedSkip_FilesAreSkipped(self, workspace, bundler_batch_helper):
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 = []
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..0d830b39e2 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
@@ -102,7 +102,7 @@ class TestsAssetProcessorBatch_AllPlatforms(object):
def test_RunAPBatch_TwoPlatforms_ExitCodeZero(self, asset_processor):
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"
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..432b6cdfc8 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
@@ -84,10 +84,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:
@@ -112,17 +113,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")
@@ -151,9 +161,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,
@@ -186,16 +196,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,
@@ -228,24 +235,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,
@@ -260,8 +265,8 @@ class TestsMissingDependencies_WindowsAndMac(object):
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
@@ -288,13 +293,13 @@ class TestsMissingDependencies_WindowsAndMac(object):
emitting missing dependencies.
"""
# 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
@@ -366,7 +371,7 @@ class TestsMissingDependencies_WindowsAndMac(object):
# 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,
@@ -386,11 +391,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,
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 0b75760e05..fccd750573 100644
--- a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py
+++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py
@@ -26,19 +26,23 @@ 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."""
- @pytest.mark.test_case_id(
- "C32078130", # Display Mapper
- "C32078129", # Light
- "C32078131", # Radius Weight Modifier
- "C32078127", # PostFX Layer
- "C32078125", # Physical Sky
- "C32078115", # Global Skylight (IBL)
- "C32078121", # Exposure Control
- "C32078120", # Directional Light
- "C32078119", # DepthOfField
- "C32078118") # Decal (Atom)
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 = [
@@ -163,7 +167,8 @@ class TestAtomEditorComponentsMain(object):
]
unexpected_lines = [
- "failed to open",
+ "Trace::Assert",
+ "Trace::Error",
"Traceback (most recent call last):",
]
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_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/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/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_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/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/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/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/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/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/TestSuite_Active.py b/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Periodic.py
similarity index 80%
rename from AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Active.py
rename to AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Periodic.py
index c42c9f1a03..91d6b3e53e 100755
--- a/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Active.py
+++ b/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Periodic.py
@@ -76,14 +76,8 @@ class TestAutomation(TestAutomationBase):
from . import ScriptCanvasComponent_OnEntityActivatedDeactivated_PrintMessage as test_module
self._run_test(request, workspace, editor, test_module)
-<<<<<<< HEAD
def test_NodePalette_HappyPath_ClearSelection(self, request, workspace, editor, launcher_platform, project):
from . import NodePalette_HappyPath_ClearSelection as 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
->>>>>>> main
self._run_test(request, workspace, editor, test_module)
@pytest.mark.parametrize("level", ["tmp_level"])
@@ -119,11 +113,6 @@ class TestAutomation(TestAutomationBase):
from . import Debugger_HappyPath_TargetMultipleGraphs 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.parametrize("level", ["tmp_level"])
def test_Debugger_HappyPath_TargetMultipleEntities(self, request, workspace, editor, launcher_platform, project, level):
def teardown():
@@ -262,3 +251,92 @@ class TestScriptCanvasTests(object):
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/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/test_Editor_NewExistingLevels_Works.py b/AutomatedTesting/Gem/PythonTests/smoke/test_Editor_NewExistingLevels_Works.py
index 985740307f..e6b072ba58 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/test_Editor_NewExistingLevels_Works.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_Editor_NewExistingLevels_Works.py
@@ -15,7 +15,7 @@ from automatedtesting_shared.base import TestAutomationBase
import ly_test_tools.environment.file_system as file_system
-@pytest.mark.SUITE_smoke
+@pytest.mark.SUITE_sandbox
@pytest.mark.parametrize("launcher_platform", ["windows_editor"])
@pytest.mark.parametrize("project", ["AutomatedTesting"])
@pytest.mark.parametrize("level", ["temp_level"])
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/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/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/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/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..ca110eb103
--- /dev/null
+++ b/AutomatedTesting/Registry/awscoreconfiguration.setreg
@@ -0,0 +1,10 @@
+{
+ "Amazon":
+ {
+ "AWSCore":
+ {
+ "ProfileName": "default",
+ "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/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/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..3d4fe78063 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:40949893ed7009eeaa90b7ce6057cb6be9dfaf7b162e3c26ba9dadf985939d7d
+size 2038
diff --git a/AutomatedTesting/surfacetypemateriallibrary.physmaterial b/AutomatedTesting/surfacetypemateriallibrary.physmaterial
index 3c39d5521e..434d673998 100644
--- a/AutomatedTesting/surfacetypemateriallibrary.physmaterial
+++ b/AutomatedTesting/surfacetypemateriallibrary.physmaterial
@@ -1,18 +1,19 @@
-
+
-
-
-
+
+
+
+
-
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2ee08a8d16..387f536966 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -25,34 +25,13 @@ include(cmake/LySet.cmake)
include(cmake/Version.cmake)
include(cmake/OutputDirectory.cmake)
-# Set the engine_path and engine_json
-set(o3de_engine_path ${CMAKE_CURRENT_LIST_DIR})
-set(o3de_engine_json ${o3de_engine_path}/engine.json)
-
if(NOT PROJECT_NAME)
project(O3DE
LANGUAGES C CXX
VERSION ${LY_VERSION_STRING}
)
-
- # o3de manifest
- include(cmake/o3de_manifest.cmake)
endif()
-################################################################################
-# Resolve this engines name and restricted path
-################################################################################
-o3de_engine_name(${o3de_engine_json} o3de_engine_name)
-o3de_restricted_path(${o3de_engine_json} o3de_engine_restricted_path)
-message(STATUS "O3DE Engine Name: ${o3de_engine_name}")
-message(STATUS "O3DE Engine Path: ${o3de_engine_path}")
-if(o3de_engine_restricted_path)
- message(STATUS "O3DE Engine Restricted Path: ${o3de_engine_restricted_path}")
-endif()
-
-# add the engines cmake folder to the CMAKE_MODULE_PATH
-list(APPEND CMAKE_MODULE_PATH "${o3de_engine_path}/cmake")
-
################################################################################
# Initialize
################################################################################
@@ -60,6 +39,7 @@ 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)
@@ -67,88 +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(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()
-# Add external subdirectories listed in the manifest
-list(APPEND LY_EXTERNAL_SUBDIRS ${o3de_engine_external_subdirectories})
-
-set(enabled_platforms
- ${PAL_PLATFORM_NAME}
- ${LY_PAL_TOOLS_ENABLED})
-
-# Add any engine restricted platforms as external subdirs
-o3de_add_engine_restricted_platform_external_subdirs()
-
-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/CryEngine/CryCommon/IShader.h b/Code/CryEngine/CryCommon/IShader.h
index aea0762a81..81fe18706d 100644
--- a/Code/CryEngine/CryCommon/IShader.h
+++ b/Code/CryEngine/CryCommon/IShader.h
@@ -772,7 +772,6 @@ _MS_ALIGN(16) struct SSkinningData
void* pCharInstCB; // used if per char instance cbs are available in renderdll (d3d11+);
// members below are for Software Skinning
void* pCustomData; // client specific data, used for example for sw-skinning on animation side
- SSkinningData** pMasterSkinningDataList; // used by the SkinningData for a Character Instance, contains a list of all Skin Instances which need SW-Skinning
SSkinningData* pNextSkinningData; // List to the next element which needs SW-Skinning
} _ALIGN(16);
diff --git a/Code/CryEngine/CryCommon/ISystem.h b/Code/CryEngine/CryCommon/ISystem.h
index f863804f3d..653776f55b 100644
--- a/Code/CryEngine/CryCommon/ISystem.h
+++ b/Code/CryEngine/CryCommon/ISystem.h
@@ -125,7 +125,7 @@ enum ESystemConfigPlatform
{
CONFIG_INVALID_PLATFORM = 0,
CONFIG_PC = 1,
- CONFIG_OSX_GL = 2,
+ CONFIG_MAC = 2,
CONFIG_OSX_METAL = 3,
CONFIG_ANDROID = 4,
CONFIG_IOS = 5,
diff --git a/Code/CryEngine/CryCommon/LyShine/IDraw2d.h b/Code/CryEngine/CryCommon/LyShine/IDraw2d.h
index 16fdfceca3..76a71c9e24 100644
--- a/Code/CryEngine/CryCommon/LyShine/IDraw2d.h
+++ b/Code/CryEngine/CryCommon/LyShine/IDraw2d.h
@@ -11,7 +11,6 @@
*/
#pragma once
-#include
#include
#include
#include
@@ -84,7 +83,7 @@ public: // types
//! If this is not passed then the defaults below are used
struct TextOptions
{
- IFFont* font; //!< default is "default"
+ AZStd::string fontName; //!< default is "default"
unsigned int effectIndex; //!< default is 0
AZ::Vector3 color; //!< default is (1,1,1)
HAlign horizontalAlignment; //!< default is HAlign::Left
diff --git a/Code/CryEngine/CrySystem/DebugCallStack.cpp b/Code/CryEngine/CrySystem/DebugCallStack.cpp
new file mode 100644
index 0000000000..2a219ce674
--- /dev/null
+++ b/Code/CryEngine/CrySystem/DebugCallStack.cpp
@@ -0,0 +1,900 @@
+/*
+* 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 "CrySystem_precompiled.h"
+#include "DebugCallStack.h"
+
+#if defined(WIN32) || defined(WIN64)
+
+#include
+#include
+#include "System.h"
+
+#include
+#include
+
+#define VS_VERSION_INFO 1
+#define IDD_CRITICAL_ERROR 101
+#define IDB_CONFIRM_SAVE 102
+#define IDB_DONT_SAVE 103
+#define IDD_CONFIRM_SAVE_LEVEL 127
+#define IDB_CRASH_FACE 128
+#define IDD_EXCEPTION 245
+#define IDC_CALLSTACK 1001
+#define IDC_EXCEPTION_CODE 1002
+#define IDC_EXCEPTION_ADDRESS 1003
+#define IDC_EXCEPTION_MODULE 1004
+#define IDC_EXCEPTION_DESC 1005
+#define IDB_EXIT 1008
+#define IDB_IGNORE 1010
+__pragma(comment(lib, "version.lib"))
+
+//! Needs one external of DLL handle.
+extern HMODULE gDLLHandle;
+
+#include
+
+#define MAX_PATH_LENGTH 1024
+#define MAX_SYMBOL_LENGTH 512
+
+static HWND hwndException = 0;
+static bool g_bUserDialog = true; // true=on crash show dialog box, false=supress user interaction
+
+static int PrintException(EXCEPTION_POINTERS* pex);
+
+static bool IsFloatingPointException(EXCEPTION_POINTERS* pex);
+
+extern LONG WINAPI CryEngineExceptionFilterWER(struct _EXCEPTION_POINTERS* pExceptionPointers);
+extern LONG WINAPI CryEngineExceptionFilterMiniDump(struct _EXCEPTION_POINTERS* pExceptionPointers, const char* szDumpPath, MINIDUMP_TYPE mdumpValue);
+
+//=============================================================================
+CONTEXT CaptureCurrentContext()
+{
+ CONTEXT context;
+ memset(&context, 0, sizeof(context));
+ context.ContextFlags = CONTEXT_FULL;
+ RtlCaptureContext(&context);
+
+ return context;
+}
+
+LONG __stdcall CryUnhandledExceptionHandler(EXCEPTION_POINTERS* pex)
+{
+ return DebugCallStack::instance()->handleException(pex);
+}
+
+
+BOOL CALLBACK EnumModules(
+ PCSTR ModuleName,
+ DWORD64 BaseOfDll,
+ PVOID UserContext)
+{
+ DebugCallStack::TModules& modules = *static_cast(UserContext);
+ modules[(void*)BaseOfDll] = ModuleName;
+
+ return TRUE;
+}
+//=============================================================================
+// Class Statics
+//=============================================================================
+
+// Return single instance of class.
+IDebugCallStack* IDebugCallStack::instance()
+{
+ static DebugCallStack sInstance;
+ return &sInstance;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+// Sets up the symbols for functions in the debug file.
+//------------------------------------------------------------------------------------------------------------------------
+DebugCallStack::DebugCallStack()
+ : prevExceptionHandler(0)
+ , m_pSystem(0)
+ , m_nSkipNumFunctions(0)
+ , m_bCrash(false)
+ , m_szBugMessage(NULL)
+{
+}
+
+DebugCallStack::~DebugCallStack()
+{
+}
+
+void DebugCallStack::RemoveOldFiles()
+{
+ RemoveFile("error.log");
+ RemoveFile("error.bmp");
+ RemoveFile("error.dmp");
+}
+
+void DebugCallStack::RemoveFile(const char* szFileName)
+{
+ FILE* pFile = nullptr;
+ azfopen(&pFile, szFileName, "r");
+ const bool bFileExists = (pFile != NULL);
+
+ if (bFileExists)
+ {
+ fclose(pFile);
+
+ WriteLineToLog("Removing file \"%s\"...", szFileName);
+ if (remove(szFileName) == 0)
+ {
+ WriteLineToLog("File successfully removed.");
+ }
+ else
+ {
+ WriteLineToLog("Couldn't remove file!");
+ }
+ }
+}
+
+void DebugCallStack::installErrorHandler(ISystem* pSystem)
+{
+ m_pSystem = pSystem;
+ prevExceptionHandler = (void*)SetUnhandledExceptionFilter(CryUnhandledExceptionHandler);
+}
+
+//////////////////////////////////////////////////////////////////////////
+void DebugCallStack::SetUserDialogEnable(const bool bUserDialogEnable)
+{
+ g_bUserDialog = bUserDialogEnable;
+}
+
+
+DWORD g_idDebugThreads[10];
+const char* g_nameDebugThreads[10];
+int g_nDebugThreads = 0;
+volatile int g_lockThreadDumpList = 0;
+
+void MarkThisThreadForDebugging(const char* name)
+{
+ EBUS_EVENT(AZ::Debug::EventTraceDrillerSetupBus, SetThreadName, AZStd::this_thread::get_id(), name);
+
+ WriteLock lock(g_lockThreadDumpList);
+ DWORD id = GetCurrentThreadId();
+ if (g_nDebugThreads == sizeof(g_idDebugThreads) / sizeof(g_idDebugThreads[0]))
+ {
+ return;
+ }
+ for (int i = 0; i < g_nDebugThreads; i++)
+ {
+ if (g_idDebugThreads[i] == id)
+ {
+ return;
+ }
+ }
+ g_nameDebugThreads[g_nDebugThreads] = name;
+ g_idDebugThreads[g_nDebugThreads++] = id;
+ ((CSystem*)gEnv->pSystem)->EnableFloatExceptions(g_cvars.sys_float_exceptions);
+}
+
+void UnmarkThisThreadFromDebugging()
+{
+ WriteLock lock(g_lockThreadDumpList);
+ DWORD id = GetCurrentThreadId();
+ for (int i = g_nDebugThreads - 1; i >= 0; i--)
+ {
+ if (g_idDebugThreads[i] == id)
+ {
+ memmove(g_idDebugThreads + i, g_idDebugThreads + i + 1, (g_nDebugThreads - 1 - i) * sizeof(g_idDebugThreads[0]));
+ memmove(g_nameDebugThreads + i, g_nameDebugThreads + i + 1, (g_nDebugThreads - 1 - i) * sizeof(g_nameDebugThreads[0]));
+ --g_nDebugThreads;
+ }
+ }
+}
+
+extern int prev_sys_float_exceptions;
+void UpdateFPExceptionsMaskForThreads()
+{
+ int mask = -iszero(g_cvars.sys_float_exceptions);
+ CONTEXT ctx;
+ for (int i = 0; i < g_nDebugThreads; i++)
+ {
+ if (g_idDebugThreads[i] != GetCurrentThreadId())
+ {
+ HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, TRUE, g_idDebugThreads[i]);
+ ctx.ContextFlags = CONTEXT_ALL;
+ SuspendThread(hThread);
+ GetThreadContext(hThread, &ctx);
+#ifndef WIN64
+ (ctx.FloatSave.ControlWord |= 7) &= ~5 | mask;
+ (*(WORD*)(ctx.ExtendedRegisters + 24) |= 0x280) &= ~0x280 | mask;
+#else
+ (ctx.FltSave.ControlWord |= 7) &= ~5 | mask;
+ (ctx.FltSave.MxCsr |= 0x280) &= ~0x280 | mask;
+#endif
+ SetThreadContext(hThread, &ctx);
+ ResumeThread(hThread);
+ }
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+int DebugCallStack::handleException(EXCEPTION_POINTERS* exception_pointer)
+{
+ if (gEnv == NULL)
+ {
+ return EXCEPTION_EXECUTE_HANDLER;
+ }
+
+ ResetFPU(exception_pointer);
+
+ prev_sys_float_exceptions = 0;
+ const int cached_sys_float_exceptions = g_cvars.sys_float_exceptions;
+
+ ((CSystem*)gEnv->pSystem)->EnableFloatExceptions(0);
+
+ if (g_cvars.sys_WER)
+ {
+ gEnv->pLog->FlushAndClose();
+ return CryEngineExceptionFilterWER(exception_pointer);
+ }
+
+ if (g_cvars.sys_no_crash_dialog)
+ {
+ DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
+ SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
+ }
+
+ m_bCrash = true;
+
+ if (g_cvars.sys_no_crash_dialog)
+ {
+ DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
+ SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
+ }
+
+ static bool firstTime = true;
+
+ if (g_cvars.sys_dump_aux_threads)
+ {
+ for (int i = 0; i < g_nDebugThreads; i++)
+ {
+ if (g_idDebugThreads[i] != GetCurrentThreadId())
+ {
+ SuspendThread(OpenThread(THREAD_ALL_ACCESS, TRUE, g_idDebugThreads[i]));
+ }
+ }
+ }
+
+ // uninstall our exception handler.
+ SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)prevExceptionHandler);
+
+ if (!firstTime)
+ {
+ WriteLineToLog("Critical Exception! Called Multiple Times!");
+ gEnv->pLog->FlushAndClose();
+ // Exception called more then once.
+ return EXCEPTION_EXECUTE_HANDLER;
+ }
+
+ // Print exception info:
+ {
+ char excCode[80];
+ char excAddr[80];
+ WriteLineToLog("");
+ sprintf_s(excAddr, "0x%04X:0x%p", exception_pointer->ContextRecord->SegCs, exception_pointer->ExceptionRecord->ExceptionAddress);
+ sprintf_s(excCode, "0x%08X", exception_pointer->ExceptionRecord->ExceptionCode);
+ WriteLineToLog("Exception: %s, at Address: %s", excCode, excAddr);
+ }
+
+ firstTime = false;
+
+ const int ret = SubmitBug(exception_pointer);
+
+ if (ret != IDB_IGNORE)
+ {
+ CryEngineExceptionFilterWER(exception_pointer);
+ }
+
+ gEnv->pLog->FlushAndClose();
+
+ if (exception_pointer->ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE)
+ {
+ // This is non continuable exception. abort application now.
+ exit(exception_pointer->ExceptionRecord->ExceptionCode);
+ }
+
+ //typedef long (__stdcall *ExceptionFunc)(EXCEPTION_POINTERS*);
+ //ExceptionFunc prevFunc = (ExceptionFunc)prevExceptionHandler;
+ //return prevFunc( (EXCEPTION_POINTERS*)exception_pointer );
+ if (ret == IDB_EXIT)
+ {
+ // Immediate exit.
+ // on windows, exit() and _exit() do all sorts of things, unfortuantely
+ // TerminateProcess is the only way to die.
+ TerminateProcess(GetCurrentProcess(), exception_pointer->ExceptionRecord->ExceptionCode); // we crashed, so don't return a zero exit code!
+ // on linux based systems, _exit will not call ATEXIT and other things, which makes it more suitable for termination in an emergency such
+ // as an unhandled exception.
+ // however, this function is a windows exception handler.
+ }
+ else if (ret == IDB_IGNORE)
+ {
+#ifndef WIN64
+ exception_pointer->ContextRecord->FloatSave.StatusWord &= ~31;
+ exception_pointer->ContextRecord->FloatSave.ControlWord |= 7;
+ (*(WORD*)(exception_pointer->ContextRecord->ExtendedRegisters + 24) &= 31) |= 0x1F80;
+#else
+ exception_pointer->ContextRecord->FltSave.StatusWord &= ~31;
+ exception_pointer->ContextRecord->FltSave.ControlWord |= 7;
+ (exception_pointer->ContextRecord->FltSave.MxCsr &= 31) |= 0x1F80;
+#endif
+ firstTime = true;
+ prevExceptionHandler = (void*)SetUnhandledExceptionFilter(CryUnhandledExceptionHandler);
+ g_cvars.sys_float_exceptions = cached_sys_float_exceptions;
+ ((CSystem*)gEnv->pSystem)->EnableFloatExceptions(g_cvars.sys_float_exceptions);
+ return EXCEPTION_CONTINUE_EXECUTION;
+ }
+
+ // Continue;
+ return EXCEPTION_EXECUTE_HANDLER;
+}
+
+void DebugCallStack::ReportBug(const char* szErrorMessage)
+{
+ WriteLineToLog("Reporting bug: %s", szErrorMessage);
+
+ m_szBugMessage = szErrorMessage;
+ m_context = CaptureCurrentContext();
+ SubmitBug(NULL);
+ m_szBugMessage = NULL;
+}
+
+void DebugCallStack::dumpCallStack(std::vector& funcs)
+{
+ WriteLineToLog("=============================================================================");
+ int len = (int)funcs.size();
+ for (int i = 0; i < len; i++)
+ {
+ const char* str = funcs[i].c_str();
+ WriteLineToLog("%2d) %s", len - i, str);
+ }
+ WriteLineToLog("=============================================================================");
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+void DebugCallStack::LogExceptionInfo(EXCEPTION_POINTERS* pex)
+{
+ string path("");
+ if ((gEnv) && (gEnv->pFileIO))
+ {
+ const char* logAlias = gEnv->pFileIO->GetAlias("@log@");
+ if (!logAlias)
+ {
+ logAlias = gEnv->pFileIO->GetAlias("@root@");
+ }
+ if (logAlias)
+ {
+ path = logAlias;
+ path += "/";
+ }
+ }
+
+ string fileName = path;
+ fileName += "error.log";
+
+ struct stat fileInfo;
+ string timeStamp;
+ string backupPath;
+ if (gEnv->IsDedicated())
+ {
+ backupPath = PathUtil::ToUnixPath(PathUtil::AddSlash(path + "DumpBackups"));
+ gEnv->pFileIO->CreatePath(backupPath.c_str());
+
+ if (stat(fileName.c_str(), &fileInfo) == 0)
+ {
+ // Backup log
+ tm creationTime;
+ localtime_s(&creationTime, &fileInfo.st_mtime);
+ char tempBuffer[32];
+ strftime(tempBuffer, sizeof(tempBuffer), "%d %b %Y (%H %M %S)", &creationTime);
+ timeStamp = tempBuffer;
+
+ string backupFileName = backupPath + timeStamp + " error.log";
+ CopyFile(fileName.c_str(), backupFileName.c_str(), true);
+ }
+ }
+
+ FILE* f = nullptr;
+ azfopen(&f, fileName.c_str(), "wt");
+
+ static char errorString[s_iCallStackSize];
+ errorString[0] = 0;
+
+ // Time and Version.
+ char versionbuf[1024];
+ azstrcpy(versionbuf, AZ_ARRAY_SIZE(versionbuf), "");
+ PutVersion(versionbuf, AZ_ARRAY_SIZE(versionbuf));
+ cry_strcat(errorString, versionbuf);
+ cry_strcat(errorString, "\n");
+
+ char excCode[MAX_WARNING_LENGTH];
+ char excAddr[80];
+ char desc[1024];
+ char excDesc[MAX_WARNING_LENGTH];
+
+ // make sure the mouse cursor is visible
+ ShowCursor(TRUE);
+
+ const char* excName;
+ if (m_bIsFatalError || !pex)
+ {
+ const char* const szMessage = m_bIsFatalError ? s_szFatalErrorCode : m_szBugMessage;
+ excName = szMessage;
+ cry_strcpy(excCode, szMessage);
+ cry_strcpy(excAddr, "");
+ cry_strcpy(desc, "");
+ cry_strcpy(m_excModule, "");
+ cry_strcpy(excDesc, szMessage);
+ }
+ else
+ {
+ sprintf_s(excAddr, "0x%04X:0x%p", pex->ContextRecord->SegCs, pex->ExceptionRecord->ExceptionAddress);
+ sprintf_s(excCode, "0x%08X", pex->ExceptionRecord->ExceptionCode);
+ excName = TranslateExceptionCode(pex->ExceptionRecord->ExceptionCode);
+ cry_strcpy(desc, "");
+ sprintf_s(excDesc, "%s\r\n%s", excName, desc);
+
+
+ if (pex->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION)
+ {
+ if (pex->ExceptionRecord->NumberParameters > 1)
+ {
+ ULONG_PTR iswrite = pex->ExceptionRecord->ExceptionInformation[0];
+ DWORD64 accessAddr = pex->ExceptionRecord->ExceptionInformation[1];
+ if (iswrite)
+ {
+ sprintf_s(desc, "Attempt to write data to address 0x%08llu\r\nThe memory could not be \"written\"", accessAddr);
+ }
+ else
+ {
+ sprintf_s(desc, "Attempt to read from address 0x%08llu\r\nThe memory could not be \"read\"", accessAddr);
+ }
+ }
+ }
+ }
+
+
+ WriteLineToLog("Exception Code: %s", excCode);
+ WriteLineToLog("Exception Addr: %s", excAddr);
+ WriteLineToLog("Exception Module: %s", m_excModule);
+ WriteLineToLog("Exception Name : %s", excName);
+ WriteLineToLog("Exception Description: %s", desc);
+
+
+ cry_strcpy(m_excDesc, excDesc);
+ cry_strcpy(m_excAddr, excAddr);
+ cry_strcpy(m_excCode, excCode);
+
+
+ char errs[32768];
+ sprintf_s(errs, "Exception Code: %s\nException Addr: %s\nException Module: %s\nException Description: %s, %s\n",
+ excCode, excAddr, m_excModule, excName, desc);
+
+
+ cry_strcat(errs, "\nCall Stack Trace:\n");
+
+ std::vector funcs;
+ {
+ AZ::Debug::StackFrame frames[25];
+ AZ::Debug::SymbolStorage::StackLine lines[AZ_ARRAY_SIZE(frames)];
+ unsigned int numFrames = AZ::Debug::StackRecorder::Record(frames, AZ_ARRAY_SIZE(frames), 3);
+ if (numFrames)
+ {
+ AZ::Debug::SymbolStorage::DecodeFrames(frames, numFrames, lines);
+ for (unsigned int i = 0; i < numFrames; i++)
+ {
+ funcs.push_back(lines[i]);
+ }
+ }
+ dumpCallStack(funcs);
+ // Fill call stack.
+ char str[s_iCallStackSize];
+ cry_strcpy(str, "");
+ for (unsigned int i = 0; i < funcs.size(); i++)
+ {
+ char temp[s_iCallStackSize];
+ sprintf_s(temp, "%2zd) %s", funcs.size() - i, (const char*)funcs[i].c_str());
+ cry_strcat(str, temp);
+ cry_strcat(str, "\r\n");
+ cry_strcat(errs, temp);
+ cry_strcat(errs, "\n");
+ }
+ cry_strcpy(m_excCallstack, str);
+ }
+
+ cry_strcat(errorString, errs);
+
+ if (f)
+ {
+ fwrite(errorString, strlen(errorString), 1, f);
+ {
+ if (g_cvars.sys_dump_aux_threads)
+ {
+ for (int i = 0; i < g_nDebugThreads; i++)
+ {
+ if (g_idDebugThreads[i] != GetCurrentThreadId())
+ {
+ fprintf(f, "\n\nSuspended thread (%s):\n", g_nameDebugThreads[i]);
+ HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, TRUE, g_idDebugThreads[i]);
+
+ // mirrors the AZ::Debug::Trace::PrintCallstack() functionality, but prints to a file
+ {
+ AZ::Debug::StackFrame frames[10];
+
+ // Without StackFrame explicit alignment frames array is aligned to 4 bytes
+ // which causes the stack tracing to fail.
+ AZ::Debug::SymbolStorage::StackLine lines[AZ_ARRAY_SIZE(frames)];
+
+ unsigned int numFrames = AZ::Debug::StackRecorder::Record(frames, AZ_ARRAY_SIZE(frames), 0, hThread);
+ if (numFrames)
+ {
+ AZ::Debug::SymbolStorage::DecodeFrames(frames, numFrames, lines);
+ for (unsigned int i2 = 0; i2 < numFrames; ++i2)
+ {
+ fprintf(f, "%2d) %s\n", numFrames - i2, lines[i2]);
+ }
+ }
+ }
+
+ ResumeThread(hThread);
+ }
+ }
+ }
+ }
+ fflush(f);
+ fclose(f);
+ }
+
+ if (pex)
+ {
+ MINIDUMP_TYPE mdumpValue;
+ bool bDump = true;
+ switch (g_cvars.sys_dump_type)
+ {
+ case 0:
+ bDump = false;
+ break;
+ case 1:
+ mdumpValue = MiniDumpNormal;
+ break;
+ case 2:
+ mdumpValue = (MINIDUMP_TYPE)(MiniDumpWithIndirectlyReferencedMemory | MiniDumpWithDataSegs);
+ break;
+ case 3:
+ mdumpValue = MiniDumpWithFullMemory;
+ break;
+ default:
+ mdumpValue = (MINIDUMP_TYPE)g_cvars.sys_dump_type;
+ break;
+ }
+ if (bDump)
+ {
+ fileName = path + "error.dmp";
+
+ if (gEnv->IsDedicated() && stat(fileName.c_str(), &fileInfo) == 0)
+ {
+ // Backup dump (use timestamp from error.log if available)
+ if (timeStamp.empty())
+ {
+ tm creationTime;
+ localtime_s(&creationTime, &fileInfo.st_mtime);
+ char tempBuffer[32];
+ strftime(tempBuffer, sizeof(tempBuffer), "%d %b %Y (%H %M %S)", &creationTime);
+ timeStamp = tempBuffer;
+ }
+
+ string backupFileName = backupPath + timeStamp + " error.dmp";
+ CopyFile(fileName.c_str(), backupFileName.c_str(), true);
+ }
+
+ CryEngineExceptionFilterMiniDump(pex, fileName.c_str(), mdumpValue);
+ }
+ }
+
+ //if no crash dialog don't even submit the bug
+ if (m_postBackupProcess && g_cvars.sys_no_crash_dialog == 0 && g_bUserDialog)
+ {
+ m_postBackupProcess();
+ }
+ else
+ {
+ // lawsonn: Disabling the JIRA-based crash reporter for now
+ // we'll need to deal with it our own way, pending QA.
+ // if you're customizing the engine this is also your opportunity to deal with it.
+ if (g_cvars.sys_no_crash_dialog != 0 || !g_bUserDialog)
+ {
+ // ------------ place custom crash handler here ---------------------
+ // it should launch an executable!
+ /// by this time, error.bmp will be in the engine root folder
+ // error.log and error.dmp will also be present in the engine root folder
+ // if your error dumper wants those, it should zip them up and send them or offer to do so.
+ // ------------------------------------------------------------------
+ }
+ }
+ const bool bQuitting = !gEnv || !gEnv->pSystem || gEnv->pSystem->IsQuitting();
+
+ //[AlexMcC|16.04.10] When the engine is shutting down, MessageBox doesn't display a box
+ // and immediately returns IDYES. Avoid this by just not trying to save if we're quitting.
+ // Don't ask to save if this isn't a real crash (a real crash has exception pointers)
+ if (g_cvars.sys_no_crash_dialog == 0 && g_bUserDialog && gEnv->IsEditor() && !bQuitting && pex)
+ {
+ BackupCurrentLevel();
+
+ const INT_PTR res = DialogBoxParam(gDLLHandle, MAKEINTRESOURCE(IDD_CONFIRM_SAVE_LEVEL), NULL, DebugCallStack::ConfirmSaveDialogProc, NULL);
+ if (res == IDB_CONFIRM_SAVE)
+ {
+ if (SaveCurrentLevel())
+ {
+ MessageBox(NULL, "Level has been successfully saved!\r\nPress Ok to terminate Editor.", "Save", MB_OK);
+ }
+ else
+ {
+ MessageBox(NULL, "Error saving level.\r\nPress Ok to terminate Editor.", "Save", MB_OK | MB_ICONWARNING);
+ }
+ }
+ }
+
+ if (g_cvars.sys_no_crash_dialog != 0 || !g_bUserDialog)
+ {
+ // terminate immediately - since we're in a crash, there is no point unwinding stack, we've already done access violation or worse.
+ // calling exit will only cause further death down the line...
+ TerminateProcess(GetCurrentProcess(), pex->ExceptionRecord->ExceptionCode);
+ }
+}
+
+
+INT_PTR CALLBACK DebugCallStack::ExceptionDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ static EXCEPTION_POINTERS* pex;
+
+ static char errorString[32768] = "";
+
+ switch (message)
+ {
+ case WM_INITDIALOG:
+ {
+ pex = (EXCEPTION_POINTERS*)lParam;
+ HWND h;
+
+ if (pex->ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE)
+ {
+ // Disable continue button for non continuable exceptions.
+ //h = GetDlgItem( hwndDlg,IDB_CONTINUE );
+ //if (h) EnableWindow( h,FALSE );
+ }
+
+ DebugCallStack* pDCS = static_cast(DebugCallStack::instance());
+
+ h = GetDlgItem(hwndDlg, IDC_EXCEPTION_DESC);
+ if (h)
+ {
+ SendMessage(h, EM_REPLACESEL, FALSE, (LONG_PTR)pDCS->m_excDesc);
+ }
+
+ h = GetDlgItem(hwndDlg, IDC_EXCEPTION_CODE);
+ if (h)
+ {
+ SendMessage(h, EM_REPLACESEL, FALSE, (LONG_PTR)pDCS->m_excCode);
+ }
+
+ h = GetDlgItem(hwndDlg, IDC_EXCEPTION_MODULE);
+ if (h)
+ {
+ SendMessage(h, EM_REPLACESEL, FALSE, (LONG_PTR)pDCS->m_excModule);
+ }
+
+ h = GetDlgItem(hwndDlg, IDC_EXCEPTION_ADDRESS);
+ if (h)
+ {
+ SendMessage(h, EM_REPLACESEL, FALSE, (LONG_PTR)pDCS->m_excAddr);
+ }
+
+ // Fill call stack.
+ HWND callStack = GetDlgItem(hwndDlg, IDC_CALLSTACK);
+ if (callStack)
+ {
+ SendMessage(callStack, WM_SETTEXT, FALSE, (LPARAM)pDCS->m_excCallstack);
+ }
+
+ if (hwndException)
+ {
+ DestroyWindow(hwndException);
+ hwndException = 0;
+ }
+
+ if (IsFloatingPointException(pex))
+ {
+ EnableWindow(GetDlgItem(hwndDlg, IDB_IGNORE), TRUE);
+ }
+ }
+ break;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDB_EXIT:
+ case IDB_IGNORE:
+ // Fall through.
+
+ EndDialog(hwndDlg, wParam);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+INT_PTR CALLBACK DebugCallStack::ConfirmSaveDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, [[maybe_unused]] LPARAM lParam)
+{
+ switch (message)
+ {
+ case WM_INITDIALOG:
+ {
+ // The user might be holding down the spacebar while the engine crashes.
+ // If we don't remove keyboard focus from this dialog, the keypress will
+ // press the default button before the dialog actually appears, even if
+ // the user has already released the key, which is bad.
+ SetFocus(NULL);
+ } break;
+ case WM_COMMAND:
+ {
+ switch (LOWORD(wParam))
+ {
+ case IDB_CONFIRM_SAVE: // Fall through
+ case IDB_DONT_SAVE:
+ {
+ EndDialog(hwndDlg, wParam);
+ return TRUE;
+ }
+ }
+ } break;
+ }
+
+ return FALSE;
+}
+
+bool DebugCallStack::BackupCurrentLevel()
+{
+ CSystem* pSystem = static_cast(m_pSystem);
+ if (pSystem && pSystem->GetUserCallback())
+ {
+ return pSystem->GetUserCallback()->OnBackupDocument();
+ }
+
+ return false;
+}
+
+bool DebugCallStack::SaveCurrentLevel()
+{
+ CSystem* pSystem = static_cast(m_pSystem);
+ if (pSystem && pSystem->GetUserCallback())
+ {
+ return pSystem->GetUserCallback()->OnSaveDocument();
+ }
+
+ return false;
+}
+
+int DebugCallStack::SubmitBug(EXCEPTION_POINTERS* exception_pointer)
+{
+ int ret = IDB_EXIT;
+
+ assert(!hwndException);
+
+ RemoveOldFiles();
+
+ AZ::Debug::Trace::PrintCallstack("", 2);
+
+ LogExceptionInfo(exception_pointer);
+
+ if (IsFloatingPointException(exception_pointer))
+ {
+ //! Print exception dialog.
+ ret = PrintException(exception_pointer);
+ }
+
+ return ret;
+}
+
+void DebugCallStack::ResetFPU(EXCEPTION_POINTERS* pex)
+{
+ if (IsFloatingPointException(pex))
+ {
+ // How to reset FPU: http://www.experts-exchange.com/Programming/System/Windows__Programming/Q_10310953.html
+ _clearfp();
+#ifndef WIN64
+ pex->ContextRecord->FloatSave.ControlWord |= 0x2F;
+ pex->ContextRecord->FloatSave.StatusWord &= ~0x8080;
+#endif
+ }
+}
+
+string DebugCallStack::GetModuleNameForAddr(void* addr)
+{
+ if (m_modules.empty())
+ {
+ return "[unknown]";
+ }
+
+ if (addr < m_modules.begin()->first)
+ {
+ return "[unknown]";
+ }
+
+ TModules::const_iterator it = m_modules.begin();
+ TModules::const_iterator end = m_modules.end();
+ for (; ++it != end; )
+ {
+ if (addr < it->first)
+ {
+ return (--it)->second;
+ }
+ }
+
+ //if address is higher than the last module, we simply assume it is in the last module.
+ return m_modules.rbegin()->second;
+}
+
+void DebugCallStack::GetProcNameForAddr(void* addr, string& procName, void*& baseAddr, string& filename, int& line)
+{
+ AZ::Debug::SymbolStorage::StackLine func, file, module;
+ AZ::Debug::SymbolStorage::FindFunctionFromIP(addr, &func, &file, &module, line, baseAddr);
+ procName = func;
+ filename = file;
+}
+
+string DebugCallStack::GetCurrentFilename()
+{
+ char fullpath[MAX_PATH_LENGTH + 1];
+ GetModuleFileName(NULL, fullpath, MAX_PATH_LENGTH);
+ return fullpath;
+}
+
+static bool IsFloatingPointException(EXCEPTION_POINTERS* pex)
+{
+ if (!pex)
+ {
+ return false;
+ }
+
+ DWORD exceptionCode = pex->ExceptionRecord->ExceptionCode;
+ switch (exceptionCode)
+ {
+ case EXCEPTION_FLT_DENORMAL_OPERAND:
+ case EXCEPTION_FLT_DIVIDE_BY_ZERO:
+ case EXCEPTION_FLT_INEXACT_RESULT:
+ case EXCEPTION_FLT_INVALID_OPERATION:
+ case EXCEPTION_FLT_OVERFLOW:
+ case EXCEPTION_FLT_UNDERFLOW:
+ case STATUS_FLOAT_MULTIPLE_FAULTS:
+ case STATUS_FLOAT_MULTIPLE_TRAPS:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+int DebugCallStack::PrintException(EXCEPTION_POINTERS* exception_pointer)
+{
+ return (int)DialogBoxParam(gDLLHandle, MAKEINTRESOURCE(IDD_CRITICAL_ERROR), NULL, DebugCallStack::ExceptionDialogProc, (LPARAM)exception_pointer);
+}
+
+#else
+void MarkThisThreadForDebugging(const char*) {}
+void UnmarkThisThreadFromDebugging() {}
+void UpdateFPExceptionsMaskForThreads() {}
+#endif //WIN32
diff --git a/Code/CryEngine/CrySystem/DebugCallStack.h b/Code/CryEngine/CrySystem/DebugCallStack.h
new file mode 100644
index 0000000000..c37e6ba0d4
--- /dev/null
+++ b/Code/CryEngine/CrySystem/DebugCallStack.h
@@ -0,0 +1,95 @@
+/*
+* 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_CRYSYSTEM_DEBUGCALLSTACK_H
+#define CRYINCLUDE_CRYSYSTEM_DEBUGCALLSTACK_H
+#pragma once
+
+
+#include "IDebugCallStack.h"
+
+#if defined (WIN32) || defined (WIN64)
+
+//! Limits the maximal number of functions in call stack.
+const int MAX_DEBUG_STACK_ENTRIES_FILE_DUMP = 12;
+
+struct ISystem;
+
+//!============================================================================
+//!
+//! DebugCallStack class, capture call stack information from symbol files.
+//!
+//!============================================================================
+class DebugCallStack
+ : public IDebugCallStack
+{
+public:
+ DebugCallStack();
+ virtual ~DebugCallStack();
+
+ ISystem* GetSystem() { return m_pSystem; };
+
+ virtual string GetModuleNameForAddr(void* addr);
+ virtual void GetProcNameForAddr(void* addr, string& procName, void*& baseAddr, string& filename, int& line);
+ virtual string GetCurrentFilename();
+
+ void installErrorHandler(ISystem* pSystem);
+ virtual int handleException(EXCEPTION_POINTERS* exception_pointer);
+
+ virtual void ReportBug(const char*);
+
+ void dumpCallStack(std::vector& functions);
+
+ void SetUserDialogEnable(const bool bUserDialogEnable);
+
+ typedef std::map TModules;
+protected:
+ static void RemoveOldFiles();
+ static void RemoveFile(const char* szFileName);
+
+ static int PrintException(EXCEPTION_POINTERS* exception_pointer);
+ static INT_PTR CALLBACK ExceptionDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam);
+ static INT_PTR CALLBACK ConfirmSaveDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam);
+
+ void LogExceptionInfo(EXCEPTION_POINTERS* exception_pointer);
+ bool BackupCurrentLevel();
+ bool SaveCurrentLevel();
+ int SubmitBug(EXCEPTION_POINTERS* exception_pointer);
+ void ResetFPU(EXCEPTION_POINTERS* pex);
+
+ static const int s_iCallStackSize = 32768;
+
+ char m_excLine[256];
+ char m_excModule[128];
+
+ char m_excDesc[MAX_WARNING_LENGTH];
+ char m_excCode[MAX_WARNING_LENGTH];
+ char m_excAddr[80];
+ char m_excCallstack[s_iCallStackSize];
+
+ void* prevExceptionHandler;
+
+ bool m_bCrash;
+ const char* m_szBugMessage;
+
+ ISystem* m_pSystem;
+
+ int m_nSkipNumFunctions;
+ CONTEXT m_context;
+
+ TModules m_modules;
+};
+
+#endif //WIN32
+
+#endif // CRYINCLUDE_CRYSYSTEM_DEBUGCALLSTACK_H
diff --git a/Code/CryEngine/CrySystem/DllMain.cpp b/Code/CryEngine/CrySystem/DllMain.cpp
index 7fd620835b..53593821d9 100644
--- a/Code/CryEngine/CrySystem/DllMain.cpp
+++ b/Code/CryEngine/CrySystem/DllMain.cpp
@@ -14,6 +14,7 @@
#include "CrySystem_precompiled.h"
#include "System.h"
#include
+#include "DebugCallStack.h"
#if defined(AZ_RESTRICTED_PLATFORM)
#undef AZ_RESTRICTED_SECTION
@@ -87,6 +88,16 @@ CRYSYSTEM_API ISystem* CreateSystemInterface(const SSystemInitParams& startupPar
startupParams.pUserCallback->OnSystemConnect(pSystem);
}
+#if defined(WIN32)
+ // Environment Variable to signal we don't want to override our exception handler - our crash report system will set this
+ auto envVar = AZ::Environment::FindVariable("ExceptionHandlerIsSet");
+ const bool handlerIsSet = (envVar && *envVar);
+ if (!handlerIsSet)
+ {
+ ((DebugCallStack*)IDebugCallStack::instance())->installErrorHandler(pSystem);
+ }
+#endif
+
bool retVal = false;
{
AZ::Debug::StartupLogSinkReporter initLogSink;
diff --git a/Code/CryEngine/CrySystem/IDebugCallStack.cpp b/Code/CryEngine/CrySystem/IDebugCallStack.cpp
new file mode 100644
index 0000000000..c14dd2b0da
--- /dev/null
+++ b/Code/CryEngine/CrySystem/IDebugCallStack.cpp
@@ -0,0 +1,275 @@
+/*
+* 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 multiplatform base class for handling errors and collecting call stacks
+
+
+#include "CrySystem_precompiled.h"
+#include "IDebugCallStack.h"
+#include "System.h"
+#include
+#include
+#include
+#include
+//#if !defined(LINUX)
+
+#include
+
+const char* const IDebugCallStack::s_szFatalErrorCode = "FATAL_ERROR";
+
+IDebugCallStack::IDebugCallStack()
+ : m_bIsFatalError(false)
+ , m_postBackupProcess(0)
+ , m_memAllocFileHandle(AZ::IO::InvalidHandle)
+{
+}
+
+IDebugCallStack::~IDebugCallStack()
+{
+ StopMemLog();
+}
+
+#if AZ_LEGACY_CRYSYSTEM_TRAIT_DEBUGCALLSTACK_SINGLETON
+IDebugCallStack* IDebugCallStack::instance()
+{
+ static IDebugCallStack sInstance;
+ return &sInstance;
+}
+#endif
+
+void IDebugCallStack::FileCreationCallback(void (* postBackupProcess)())
+{
+ m_postBackupProcess = postBackupProcess;
+}
+//////////////////////////////////////////////////////////////////////////
+void IDebugCallStack::LogCallstack()
+{
+ AZ::Debug::Trace::PrintCallstack("", 2);
+}
+
+const char* IDebugCallStack::TranslateExceptionCode(DWORD dwExcept)
+{
+ switch (dwExcept)
+ {
+#if AZ_LEGACY_CRYSYSTEM_TRAIT_DEBUGCALLSTACK_TRANSLATE
+ case EXCEPTION_ACCESS_VIOLATION:
+ return "EXCEPTION_ACCESS_VIOLATION";
+ break;
+ case EXCEPTION_DATATYPE_MISALIGNMENT:
+ return "EXCEPTION_DATATYPE_MISALIGNMENT";
+ break;
+ case EXCEPTION_BREAKPOINT:
+ return "EXCEPTION_BREAKPOINT";
+ break;
+ case EXCEPTION_SINGLE_STEP:
+ return "EXCEPTION_SINGLE_STEP";
+ break;
+ case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
+ return "EXCEPTION_ARRAY_BOUNDS_EXCEEDED";
+ break;
+ case EXCEPTION_FLT_DENORMAL_OPERAND:
+ return "EXCEPTION_FLT_DENORMAL_OPERAND";
+ break;
+ case EXCEPTION_FLT_DIVIDE_BY_ZERO:
+ return "EXCEPTION_FLT_DIVIDE_BY_ZERO";
+ break;
+ case EXCEPTION_FLT_INEXACT_RESULT:
+ return "EXCEPTION_FLT_INEXACT_RESULT";
+ break;
+ case EXCEPTION_FLT_INVALID_OPERATION:
+ return "EXCEPTION_FLT_INVALID_OPERATION";
+ break;
+ case EXCEPTION_FLT_OVERFLOW:
+ return "EXCEPTION_FLT_OVERFLOW";
+ break;
+ case EXCEPTION_FLT_STACK_CHECK:
+ return "EXCEPTION_FLT_STACK_CHECK";
+ break;
+ case EXCEPTION_FLT_UNDERFLOW:
+ return "EXCEPTION_FLT_UNDERFLOW";
+ break;
+ case EXCEPTION_INT_DIVIDE_BY_ZERO:
+ return "EXCEPTION_INT_DIVIDE_BY_ZERO";
+ break;
+ case EXCEPTION_INT_OVERFLOW:
+ return "EXCEPTION_INT_OVERFLOW";
+ break;
+ case EXCEPTION_PRIV_INSTRUCTION:
+ return "EXCEPTION_PRIV_INSTRUCTION";
+ break;
+ case EXCEPTION_IN_PAGE_ERROR:
+ return "EXCEPTION_IN_PAGE_ERROR";
+ break;
+ case EXCEPTION_ILLEGAL_INSTRUCTION:
+ return "EXCEPTION_ILLEGAL_INSTRUCTION";
+ break;
+ case EXCEPTION_NONCONTINUABLE_EXCEPTION:
+ return "EXCEPTION_NONCONTINUABLE_EXCEPTION";
+ break;
+ case EXCEPTION_STACK_OVERFLOW:
+ return "EXCEPTION_STACK_OVERFLOW";
+ break;
+ case EXCEPTION_INVALID_DISPOSITION:
+ return "EXCEPTION_INVALID_DISPOSITION";
+ break;
+ case EXCEPTION_GUARD_PAGE:
+ return "EXCEPTION_GUARD_PAGE";
+ break;
+ case EXCEPTION_INVALID_HANDLE:
+ return "EXCEPTION_INVALID_HANDLE";
+ break;
+ //case EXCEPTION_POSSIBLE_DEADLOCK: return "EXCEPTION_POSSIBLE_DEADLOCK"; break ;
+
+ case STATUS_FLOAT_MULTIPLE_FAULTS:
+ return "STATUS_FLOAT_MULTIPLE_FAULTS";
+ break;
+ case STATUS_FLOAT_MULTIPLE_TRAPS:
+ return "STATUS_FLOAT_MULTIPLE_TRAPS";
+ break;
+
+
+#endif
+ default:
+ return "Unknown";
+ break;
+ }
+}
+
+void IDebugCallStack::PutVersion(char* str, size_t length)
+{
+AZ_PUSH_DISABLE_WARNING(4996, "-Wunknown-warning-option")
+
+ if (!gEnv || !gEnv->pSystem)
+ {
+ return;
+ }
+
+ char sFileVersion[128];
+ gEnv->pSystem->GetFileVersion().ToString(sFileVersion, sizeof(sFileVersion));
+
+ char sProductVersion[128];
+ gEnv->pSystem->GetProductVersion().ToString(sProductVersion, sizeof(sFileVersion));
+
+
+ //! Get time.
+ time_t ltime;
+ time(<ime);
+ tm* today = localtime(<ime);
+
+ char s[1024];
+ //! Use strftime to build a customized time string.
+ strftime(s, 128, "Logged at %#c\n", today);
+ azstrcat(str, length, s);
+ sprintf_s(s, "FileVersion: %s\n", sFileVersion);
+ azstrcat(str, length, s);
+ sprintf_s(s, "ProductVersion: %s\n", sProductVersion);
+ azstrcat(str, length, s);
+
+ if (gEnv->pLog)
+ {
+ const char* logfile = gEnv->pLog->GetFileName();
+ if (logfile)
+ {
+ sprintf (s, "LogFile: %s\n", logfile);
+ azstrcat(str, length, s);
+ }
+ }
+
+ AZ::IO::FixedMaxPathString projectPath = AZ::Utils::GetProjectPath();
+ azstrcat(str, length, "ProjectDir: ");
+ azstrcat(str, length, projectPath.c_str());
+ azstrcat(str, length, "\n");
+
+#if AZ_LEGACY_CRYSYSTEM_TRAIT_DEBUGCALLSTACK_APPEND_MODULENAME
+ GetModuleFileNameA(NULL, s, sizeof(s));
+
+ // Log EXE filename only if possible (not full EXE path which could contain sensitive info)
+ AZStd::string exeName;
+ if (AZ::StringFunc::Path::GetFullFileName(s, exeName))
+ {
+ azstrcat(str, length, "Executable: ");
+ azstrcat(str, length, exeName.c_str());
+
+# ifdef AZ_DEBUG_BUILD
+ azstrcat(str, length, " (debug: yes");
+# else
+ azstrcat(str, length, " (debug: no");
+# endif
+ }
+#endif
+AZ_POP_DISABLE_WARNING
+}
+
+
+//Crash the application, in this way the debug callstack routine will be called and it will create all the necessary files (error.log, dump, and eventually screenshot)
+void IDebugCallStack::FatalError(const char* description)
+{
+ m_bIsFatalError = true;
+ WriteLineToLog(description);
+
+#ifndef _RELEASE
+ bool bShowDebugScreen = g_cvars.sys_no_crash_dialog == 0;
+ // showing the debug screen is not safe when not called from mainthread
+ // it normally leads to a infinity recursion followed by a stack overflow, preventing
+ // useful call stacks, thus they are disabled
+ bShowDebugScreen = bShowDebugScreen && gEnv->mMainThreadId == CryGetCurrentThreadId();
+ if (bShowDebugScreen)
+ {
+ EBUS_EVENT(AZ::NativeUI::NativeUIRequestBus, DisplayOkDialog, "Open 3D Engine Fatal Error", description, false);
+ }
+#endif
+
+#if defined(WIN32) || !defined(_RELEASE)
+ int* p = 0x0;
+ PREFAST_SUPPRESS_WARNING(6011) * p = 1; // we're intentionally crashing here
+#endif
+}
+
+void IDebugCallStack::WriteLineToLog(const char* format, ...)
+{
+ va_list ArgList;
+ char szBuffer[MAX_WARNING_LENGTH];
+ va_start(ArgList, format);
+ vsnprintf_s(szBuffer, sizeof(szBuffer), sizeof(szBuffer) - 1, format, ArgList);
+ cry_strcat(szBuffer, "\n");
+ szBuffer[sizeof(szBuffer) - 1] = '\0';
+ va_end(ArgList);
+
+ AZ::IO::HandleType fileHandle = AZ::IO::InvalidHandle;
+ AZ::IO::FileIOBase::GetDirectInstance()->Open("@Log@\\error.log", AZ::IO::GetOpenModeFromStringMode("a+t"), fileHandle);
+ if (fileHandle != AZ::IO::InvalidHandle)
+ {
+ AZ::IO::FileIOBase::GetDirectInstance()->Write(fileHandle, szBuffer, strlen(szBuffer));
+ AZ::IO::FileIOBase::GetDirectInstance()->Flush(fileHandle);
+ AZ::IO::FileIOBase::GetDirectInstance()->Close(fileHandle);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+void IDebugCallStack::StartMemLog()
+{
+ AZ::IO::FileIOBase::GetDirectInstance()->Open("@Log@\\memallocfile.log", AZ::IO::OpenMode::ModeWrite, m_memAllocFileHandle);
+
+ assert(m_memAllocFileHandle != AZ::IO::InvalidHandle);
+}
+
+//////////////////////////////////////////////////////////////////////////
+void IDebugCallStack::StopMemLog()
+{
+ if (m_memAllocFileHandle != AZ::IO::InvalidHandle)
+ {
+ AZ::IO::FileIOBase::GetDirectInstance()->Close(m_memAllocFileHandle);
+ m_memAllocFileHandle = AZ::IO::InvalidHandle;
+ }
+}
+//#endif //!defined(LINUX)
diff --git a/Code/CryEngine/CrySystem/IDebugCallStack.h b/Code/CryEngine/CrySystem/IDebugCallStack.h
new file mode 100644
index 0000000000..f181b73913
--- /dev/null
+++ b/Code/CryEngine/CrySystem/IDebugCallStack.h
@@ -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.
+*
+*/
+// Original file Copyright Crytek GMBH or its affiliates, used under license.
+
+// Description : A multiplatform base class for handling errors and collecting call stacks
+
+#ifndef CRYINCLUDE_CRYSYSTEM_IDEBUGCALLSTACK_H
+#define CRYINCLUDE_CRYSYSTEM_IDEBUGCALLSTACK_H
+#pragma once
+
+#include "System.h"
+
+#if AZ_LEGACY_CRYSYSTEM_TRAIT_FORWARD_EXCEPTION_POINTERS
+struct EXCEPTION_POINTERS;
+#endif
+//! Limits the maximal number of functions in call stack.
+enum
+{
+ MAX_DEBUG_STACK_ENTRIES = 80
+};
+
+class IDebugCallStack
+{
+public:
+ // Returns single instance of DebugStack
+ static IDebugCallStack* instance();
+
+ virtual int handleException([[maybe_unused]] EXCEPTION_POINTERS* exception_pointer){return 0; }
+
+ // returns the module name of a given address
+ virtual string GetModuleNameForAddr([[maybe_unused]] void* addr) { return "[unknown]"; }
+
+ // returns the function name of a given address together with source file and line number (if available) of a given address
+ virtual void GetProcNameForAddr(void* addr, string& procName, void*& baseAddr, string& filename, int& line)
+ {
+ filename = "[unknown]";
+ line = 0;
+ baseAddr = addr;
+#if defined(PLATFORM_64BIT)
+ procName.Format("[%016llX]", addr);
+#else
+ procName.Format("[%08X]", addr);
+#endif
+ }
+
+ // returns current filename
+ virtual string GetCurrentFilename() { return "[unknown]"; }
+
+ //! Dumps Current Call Stack to log.
+ virtual void LogCallstack();
+ //triggers a fatal error, so the DebugCallstack can create the error.log and terminate the application
+ void FatalError(const char*);
+
+ //Reports a bug and continues execution
+ virtual void ReportBug(const char*) {}
+
+ virtual void FileCreationCallback(void (* postBackupProcess)());
+
+ static void WriteLineToLog(const char* format, ...);
+
+ virtual void StartMemLog();
+ virtual void StopMemLog();
+
+protected:
+ IDebugCallStack();
+ virtual ~IDebugCallStack();
+
+ static const char* TranslateExceptionCode(DWORD dwExcept);
+ static void PutVersion(char* str, size_t length);
+
+ bool m_bIsFatalError;
+ static const char* const s_szFatalErrorCode;
+
+ void (* m_postBackupProcess)();
+
+ AZ::IO::HandleType m_memAllocFileHandle;
+};
+
+
+
+#endif // CRYINCLUDE_CRYSYSTEM_IDEBUGCALLSTACK_H
diff --git a/Code/CryEngine/CrySystem/LevelSystem/SpawnableLevelSystem.cpp b/Code/CryEngine/CrySystem/LevelSystem/SpawnableLevelSystem.cpp
index ff6ebc0d17..31d1540d77 100644
--- a/Code/CryEngine/CrySystem/LevelSystem/SpawnableLevelSystem.cpp
+++ b/Code/CryEngine/CrySystem/LevelSystem/SpawnableLevelSystem.cpp
@@ -36,8 +36,8 @@ namespace LegacyLevelSystem
//------------------------------------------------------------------------
static void LoadLevel(const AZ::ConsoleCommandContainer& arguments)
{
- AZ_Error("SpawnableLevelSystem", arguments.empty(), "LoadLevel requires a level file name to be provided.");
- AZ_Error("SpawnableLevelSystem", arguments.size() > 1, "LoadLevel requires a single level file name to be provided.");
+ AZ_Error("SpawnableLevelSystem", !arguments.empty(), "LoadLevel requires a level file name to be provided.");
+ AZ_Error("SpawnableLevelSystem", arguments.size() == 1, "LoadLevel requires a single level file name to be provided.");
if (!arguments.empty() && gEnv->pSystem && gEnv->pSystem->GetILevelSystem() && !gEnv->IsEditor())
{
diff --git a/Code/CryEngine/CrySystem/System.h b/Code/CryEngine/CrySystem/System.h
index 631d84d934..a258030f70 100644
--- a/Code/CryEngine/CrySystem/System.h
+++ b/Code/CryEngine/CrySystem/System.h
@@ -208,6 +208,7 @@ struct SSystemCVars
int sys_no_crash_dialog;
int sys_no_error_report_window;
int sys_dump_aux_threads;
+ int sys_WER;
int sys_dump_type;
int sys_ai;
int sys_entitysystem;
@@ -728,7 +729,7 @@ protected: // -------------------------------------------------------------
CCmdLine* m_pCmdLine;
string m_currentLanguageAudio;
- string m_systemConfigName; // computed from system_(hardwareplatform)_(assetsPlatform) - eg, system_android_es3.cfg or system_android_opengl.cfg or system_windows_pc.cfg
+ string m_systemConfigName; // computed from system_(hardwareplatform)_(assetsPlatform) - eg, system_android_android.cfg or system_windows_pc.cfg
std::vector< std::pair > m_updateTimes;
diff --git a/Code/CryEngine/CrySystem/SystemInit.cpp b/Code/CryEngine/CrySystem/SystemInit.cpp
index a2c21ea04c..79041fa233 100644
--- a/Code/CryEngine/CrySystem/SystemInit.cpp
+++ b/Code/CryEngine/CrySystem/SystemInit.cpp
@@ -121,6 +121,10 @@
# include
#endif
+#ifdef WIN32
+extern LONG WINAPI CryEngineExceptionFilterWER(struct _EXCEPTION_POINTERS* pExceptionPointers);
+#endif
+
#if defined(AZ_RESTRICTED_PLATFORM)
#define AZ_RESTRICTED_SECTION SYSTEMINIT_CPP_SECTION_14
#include AZ_RESTRICTED_FILE(SystemInit_cpp)
@@ -860,11 +864,6 @@ bool CSystem::InitShine([[maybe_unused]] const SSystemInitParams& initParams)
EBUS_EVENT(UiSystemBus, InitializeSystem);
- if (!m_env.pLyShine)
- {
- AZ_Error(AZ_TRACE_SYSTEM_WINDOW, false, "LYShine System did not initialize correctly. Please check that the LyShine gem is enabled for this project in *_dependencies.cmake.");
- return false;
- }
return true;
}
@@ -1484,6 +1483,13 @@ AZ_POP_DISABLE_WARNING
InlineInitializationProcessing("CSystem::Init LoadConfigurations");
+#ifdef WIN32
+ if (g_cvars.sys_WER)
+ {
+ SetUnhandledExceptionFilter(CryEngineExceptionFilterWER);
+ }
+#endif
+
//////////////////////////////////////////////////////////////////////////
// Localization
//////////////////////////////////////////////////////////////////////////
@@ -2020,6 +2026,14 @@ void CSystem::CreateSystemVars()
REGISTER_CVAR2("sys_update_profile_time", &g_cvars.sys_update_profile_time, 1.0f, 0, "Time to keep updates timings history for.");
REGISTER_CVAR2("sys_no_crash_dialog", &g_cvars.sys_no_crash_dialog, m_bNoCrashDialog, VF_NULL, "Whether to disable the crash dialog window");
REGISTER_CVAR2("sys_no_error_report_window", &g_cvars.sys_no_error_report_window, m_bNoErrorReportWindow, VF_NULL, "Whether to disable the error report list");
+#if defined(_RELEASE)
+ if (!gEnv->IsDedicated())
+ {
+ REGISTER_CVAR2("sys_WER", &g_cvars.sys_WER, 1, 0, "Enables Windows Error Reporting");
+ }
+#else
+ REGISTER_CVAR2("sys_WER", &g_cvars.sys_WER, 0, 0, "Enables Windows Error Reporting");
+#endif
#ifdef USE_HTTP_WEBSOCKETS
REGISTER_CVAR2("sys_simple_http_base_port", &g_cvars.sys_simple_http_base_port, 1880, VF_REQUIRE_APP_RESTART,
diff --git a/Code/CryEngine/CrySystem/SystemWin32.cpp b/Code/CryEngine/CrySystem/SystemWin32.cpp
index c974365bfc..eb6aa17532 100644
--- a/Code/CryEngine/CrySystem/SystemWin32.cpp
+++ b/Code/CryEngine/CrySystem/SystemWin32.cpp
@@ -46,6 +46,8 @@
#include
#endif
+#include "IDebugCallStack.h"
+
#if defined(APPLE) || defined(LINUX)
#include
#endif
@@ -355,6 +357,7 @@ void CSystem::FatalError(const char* format, ...)
}
// Dump callstack.
+ IDebugCallStack::instance()->FatalError(szBuffer);
#endif
CryDebugBreak();
@@ -396,6 +399,8 @@ void CSystem::ReportBug([[maybe_unused]] const char* format, ...)
va_start(ArgList, format);
azvsnprintf(szBuffer + strlen(sPrefix), MAX_WARNING_LENGTH - strlen(sPrefix), format, ArgList);
va_end(ArgList);
+
+ IDebugCallStack::instance()->ReportBug(szBuffer);
#endif
}
diff --git a/Code/CryEngine/CrySystem/WindowsErrorReporting.cpp b/Code/CryEngine/CrySystem/WindowsErrorReporting.cpp
new file mode 100644
index 0000000000..feaffd42aa
--- /dev/null
+++ b/Code/CryEngine/CrySystem/WindowsErrorReporting.cpp
@@ -0,0 +1,137 @@
+/*
+* 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 : Support for Windows Error Reporting (WER)
+
+
+#include "CrySystem_precompiled.h"
+
+#ifdef WIN32
+
+#include "System.h"
+#include
+#include
+#include "errorrep.h"
+#include "ISystem.h"
+
+#include
+
+static WCHAR szPath[MAX_PATH + 1];
+static WCHAR szFR[] = L"\\System32\\FaultRep.dll";
+
+WCHAR* GetFullPathToFaultrepDll(void)
+{
+ UINT rc = GetSystemWindowsDirectoryW(szPath, ARRAYSIZE(szPath));
+ if (rc == 0 || rc > ARRAYSIZE(szPath) - ARRAYSIZE(szFR) - 1)
+ {
+ return NULL;
+ }
+
+ wcscat_s(szPath, szFR);
+ return szPath;
+}
+
+
+typedef BOOL (WINAPI * MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,
+ CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
+ CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
+ CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam
+ );
+
+//////////////////////////////////////////////////////////////////////////
+LONG WINAPI CryEngineExceptionFilterMiniDump(struct _EXCEPTION_POINTERS* pExceptionPointers, const char* szDumpPath, MINIDUMP_TYPE DumpType)
+{
+ // note: In debug mode, this dll is loaded on startup anyway, so this should not incur an additional load unless it crashes
+ // very early during startup.
+
+ fflush(nullptr); // according to MSDN on fflush, calling fflush on null flushes all buffers.
+ HMODULE hndDBGHelpDLL = LoadLibraryA("DBGHELP.DLL");
+
+ if (!hndDBGHelpDLL)
+ {
+ CryLogAlways("Failed to record DMP file: Could not open DBGHELP.DLL");
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+
+ MINIDUMPWRITEDUMP dumpFnPtr = (MINIDUMPWRITEDUMP)::GetProcAddress(hndDBGHelpDLL, "MiniDumpWriteDump");
+ if (!dumpFnPtr)
+ {
+ CryLogAlways("Failed to record DMP file: Unable to find MiniDumpWriteDump in DBGHELP.DLL");
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+
+ HANDLE hFile = ::CreateFile(szDumpPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ CryLogAlways("Failed to record DMP file: could not open file '%s' for writing - error code: %d", szDumpPath, GetLastError());
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+
+ _MINIDUMP_EXCEPTION_INFORMATION ExInfo;
+ ExInfo.ThreadId = ::GetCurrentThreadId();
+ ExInfo.ExceptionPointers = pExceptionPointers;
+ ExInfo.ClientPointers = NULL;
+
+ BOOL bOK = dumpFnPtr(GetCurrentProcess(), GetCurrentProcessId(), hFile, DumpType, &ExInfo, NULL, NULL);
+ ::CloseHandle(hFile);
+
+ if (bOK)
+ {
+ CryLogAlways("Successfully recorded DMP file: '%s'", szDumpPath);
+ return EXCEPTION_EXECUTE_HANDLER; // SUCCESS! you can execute your handlers now
+ }
+ else
+ {
+ CryLogAlways("Failed to record DMP file: '%s' - error code: %d", szDumpPath, GetLastError());
+ }
+
+ return EXCEPTION_CONTINUE_SEARCH;
+}
+
+//////////////////////////////////////////////////////////////////////////
+LONG WINAPI CryEngineExceptionFilterWER(struct _EXCEPTION_POINTERS* pExceptionPointers)
+{
+ if (g_cvars.sys_WER > 1)
+ {
+ char szScratch [_MAX_PATH];
+ const char* szDumpPath = gEnv->pCryPak->AdjustFileName("@log@/CE2Dump.dmp", szScratch, AZ_ARRAY_SIZE(szScratch), 0);
+
+ MINIDUMP_TYPE mdumpValue = (MINIDUMP_TYPE)(MiniDumpNormal);
+ if (g_cvars.sys_WER > 1)
+ {
+ mdumpValue = (MINIDUMP_TYPE)(g_cvars.sys_WER - 2);
+ }
+
+ return CryEngineExceptionFilterMiniDump(pExceptionPointers, szDumpPath, mdumpValue);
+ }
+
+ LONG lRet = EXCEPTION_CONTINUE_SEARCH;
+ WCHAR* psz = GetFullPathToFaultrepDll();
+ if (psz)
+ {
+ HMODULE hFaultRepDll = LoadLibraryW(psz);
+ if (hFaultRepDll)
+ {
+ pfn_REPORTFAULT pfn = (pfn_REPORTFAULT)GetProcAddress(hFaultRepDll, "ReportFault");
+ if (pfn)
+ {
+ pfn(pExceptionPointers, 0);
+ lRet = EXCEPTION_EXECUTE_HANDLER;
+ }
+ FreeLibrary(hFaultRepDll);
+ }
+ }
+ return lRet;
+}
+
+#endif // WIN32
diff --git a/Code/CryEngine/CrySystem/crysystem_files.cmake b/Code/CryEngine/CrySystem/crysystem_files.cmake
index 6a56339b85..84250de95b 100644
--- a/Code/CryEngine/CrySystem/crysystem_files.cmake
+++ b/Code/CryEngine/CrySystem/crysystem_files.cmake
@@ -15,6 +15,8 @@ set(FILES
CmdLineArg.cpp
ConsoleBatchFile.cpp
ConsoleHelpGen.cpp
+ DebugCallStack.cpp
+ IDebugCallStack.cpp
Log.cpp
System.cpp
SystemCFG.cpp
@@ -31,6 +33,8 @@ set(FILES
CmdLineArg.h
ConsoleBatchFile.h
ConsoleHelpGen.h
+ DebugCallStack.h
+ IDebugCallStack.h
Log.h
SimpleStringPool.h
CrySystem_precompiled.h
@@ -72,4 +76,5 @@ set(FILES
ViewSystem/ViewSystem.cpp
ViewSystem/ViewSystem.h
CrySystem_precompiled.cpp
+ WindowsErrorReporting.cpp
)
diff --git a/Code/Framework/AtomCore/AtomCore/std/parallel/concurrency_checker.h b/Code/Framework/AtomCore/AtomCore/std/parallel/concurrency_checker.h
index 311b574fdf..4a952721b6 100644
--- a/Code/Framework/AtomCore/AtomCore/std/parallel/concurrency_checker.h
+++ b/Code/Framework/AtomCore/AtomCore/std/parallel/concurrency_checker.h
@@ -20,10 +20,12 @@
namespace AZStd
{
- //! Simple class for verifying that no concurrent access is occuring.
+ //! Simple class for verifying that no concurrent access is occurring.
//! This is *not* a synchronization primitive, and is intended simply for checking that no concurrency issues exist.
//! It will be compiled out in release builds.
//! Use concurrency_checker like a mutex (i.e. call soft_lock() and soft_unlock() around all instances of your data access).
+ //! Use soft_lock_shared and soft_unlock_shared around places where multiple threads are allowed to have read access
+ //! at the same time as long as nothing else already has a soft lock
//! It will assert if there are multiple threads accessing the locked code/data at the same time.
//! Expected use case is for defensive programming: when you do not expect any concurrent access within a system,
//! but want to verify that it stays that way in the future, without incurring the overhead of a mutex.
@@ -34,7 +36,7 @@ namespace AZStd
{
#ifdef AZ_CONCURRENCY_CHECKER_ENABLED
uint32_t count = ++m_concurrencyCounter;
- AZ_Assert(count == 1, "Concurrency check failed. Multiple threads are trying to access data at the same time, or there is a lock/unlock mismatch.");
+ AZ_Assert(count == 1 && m_sharedConcurrencyCounter == 0, "Concurrency check failed. Multiple threads are trying to access data at the same time, or there is a lock/unlock mismatch.");
#endif
}
@@ -46,9 +48,27 @@ namespace AZStd
#endif
}
+ AZ_FORCE_INLINE void soft_lock_shared()
+ {
+#ifdef AZ_CONCURRENCY_CHECKER_ENABLED
+ AZ_Assert(m_concurrencyCounter == 0, "Concurrency check failed. A soft_lock_shared was attempted when there was already a soft_lock.");
+ ++m_sharedConcurrencyCounter;
+#endif
+ }
+
+ AZ_FORCE_INLINE void soft_unlock_shared()
+ {
+#ifdef AZ_CONCURRENCY_CHECKER_ENABLED
+ AZ_Assert(m_sharedConcurrencyCounter != 0, "Concurrency check failed. There is a shared_lock/shared_unlock mismatch.");
+ --m_sharedConcurrencyCounter;
+#endif
+ }
+
+
private:
#ifdef AZ_CONCURRENCY_CHECKER_ENABLED
AZStd::atomic_uint32_t m_concurrencyCounter = 0;
+ AZStd::atomic_uint32_t m_sharedConcurrencyCounter = 0;
#endif
};
diff --git a/Code/Framework/AtomCore/Tests/ArrayView.cpp b/Code/Framework/AtomCore/Tests/ArrayView.cpp
index 83fa20aaf0..56627d280e 100644
--- a/Code/Framework/AtomCore/Tests/ArrayView.cpp
+++ b/Code/Framework/AtomCore/Tests/ArrayView.cpp
@@ -293,15 +293,12 @@ namespace UnitTest
{
array_view view({ 1,2,3,4 });
- UnitTest::TestRunner::Instance().StartAssertTests();
+ AZ_TEST_START_TRACE_SUPPRESSION;
- EXPECT_EQ(0, UnitTest::TestRunner::Instance().m_numAssertsFailed);
view[4];
- EXPECT_EQ(1, UnitTest::TestRunner::Instance().m_numAssertsFailed);
view[5];
- EXPECT_EQ(2, UnitTest::TestRunner::Instance().m_numAssertsFailed);
- UnitTest::TestRunner::Instance().StopAssertTests();
+ AZ_TEST_STOP_TRACE_SUPPRESSION(2);
}
}
diff --git a/Code/Framework/AtomCore/Tests/ConcurrencyCheckerTests.cpp b/Code/Framework/AtomCore/Tests/ConcurrencyCheckerTests.cpp
new file mode 100644
index 0000000000..7cd1fa27ac
--- /dev/null
+++ b/Code/Framework/AtomCore/Tests/ConcurrencyCheckerTests.cpp
@@ -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.
+*
+*/
+
+#include
+
+#include
+
+using namespace AZStd;
+
+namespace UnitTest
+{
+ class ConcurrencyCheckerTestFixture
+ : public AllocatorsTestFixture
+ {
+
+ void SetUp() override
+ {
+ AllocatorsFixture::SetUp();
+ }
+ };
+
+ TEST_F(AllocatorsTestFixture, SoftLock_NoContention_NoAsserts)
+ {
+ concurrency_checker concurrencyChecker;
+ concurrencyChecker.soft_lock();
+ concurrencyChecker.soft_unlock();
+ concurrencyChecker.soft_lock();
+ concurrencyChecker.soft_unlock();
+ }
+
+ TEST_F(AllocatorsTestFixture, SoftLock_AlreadyLocked_Assert)
+ {
+ concurrency_checker concurrencyChecker;
+ concurrencyChecker.soft_lock();
+ AZ_TEST_START_TRACE_SUPPRESSION;
+ concurrencyChecker.soft_lock();
+ AZ_TEST_STOP_TRACE_SUPPRESSION(1);
+ }
+
+ TEST_F(AllocatorsTestFixture, SoftUnlock_NotAlreadyLocked_Assert)
+ {
+ concurrency_checker concurrencyChecker;
+ concurrencyChecker.soft_lock();
+ concurrencyChecker.soft_unlock();
+ AZ_TEST_START_TRACE_SUPPRESSION;
+ concurrencyChecker.soft_unlock();
+ AZ_TEST_STOP_TRACE_SUPPRESSION(1);
+ }
+
+ TEST_F(AllocatorsTestFixture, SoftLockShared_NoContention_NoAsserts)
+ {
+ concurrency_checker concurrencyChecker;
+ // Multiple shared locks can be made at once,
+ // as long as they are all unlocked before the next soft_lock
+ concurrencyChecker.soft_lock_shared();
+ concurrencyChecker.soft_lock_shared();
+ concurrencyChecker.soft_unlock_shared();
+ concurrencyChecker.soft_unlock_shared();
+
+ concurrencyChecker.soft_lock();
+ concurrencyChecker.soft_unlock();
+
+ concurrencyChecker.soft_lock_shared();
+ concurrencyChecker.soft_lock_shared();
+ concurrencyChecker.soft_unlock_shared();
+ concurrencyChecker.soft_unlock_shared();
+
+ concurrencyChecker.soft_lock();
+ concurrencyChecker.soft_unlock();
+ }
+
+ TEST_F(AllocatorsTestFixture, SoftLockShared_SharedLockAfterSoftLock_Assert)
+ {
+ concurrency_checker concurrencyChecker;
+
+ concurrencyChecker.soft_lock();
+ AZ_TEST_START_TRACE_SUPPRESSION;
+ concurrencyChecker.soft_lock_shared();
+ AZ_TEST_STOP_TRACE_SUPPRESSION(1);
+ }
+
+ TEST_F(AllocatorsTestFixture, SoftUnlockShared_NotAlreadyLocked_Assert)
+ {
+ concurrency_checker concurrencyChecker;
+ concurrencyChecker.soft_lock_shared();
+ concurrencyChecker.soft_unlock_shared();
+ AZ_TEST_START_TRACE_SUPPRESSION;
+ concurrencyChecker.soft_unlock_shared();
+ AZ_TEST_STOP_TRACE_SUPPRESSION(1);
+ }
+}
diff --git a/Code/Framework/AtomCore/Tests/atomcore_tests_files.cmake b/Code/Framework/AtomCore/Tests/atomcore_tests_files.cmake
index 26efd09fe1..24d23cb852 100644
--- a/Code/Framework/AtomCore/Tests/atomcore_tests_files.cmake
+++ b/Code/Framework/AtomCore/Tests/atomcore_tests_files.cmake
@@ -11,6 +11,7 @@
set(FILES
ArrayView.cpp
+ ConcurrencyCheckerTests.cpp
InstanceDatabase.cpp
JsonSerializationUtilsTests.cpp
lru_cache.cpp
diff --git a/Code/Framework/AzAndroid/java/com/amazon/lumberyard/LumberyardActivity.java b/Code/Framework/AzAndroid/java/com/amazon/lumberyard/LumberyardActivity.java
index b5d3de8164..5c1a120df6 100644
--- a/Code/Framework/AzAndroid/java/com/amazon/lumberyard/LumberyardActivity.java
+++ b/Code/Framework/AzAndroid/java/com/amazon/lumberyard/LumberyardActivity.java
@@ -244,7 +244,7 @@ public class LumberyardActivity extends NativeActivity
boolean useMainObb = GetBooleanResource("use_main_obb");
boolean usePatchObb = GetBooleanResource("use_patch_obb");
- if (IsBootstrapInAPK() && (useMainObb || usePatchObb))
+ if (AreAssetsInAPK() && (useMainObb || usePatchObb))
{
Log.d(TAG, "Using OBB expansion files for game assets");
@@ -421,12 +421,12 @@ public class LumberyardActivity extends NativeActivity
}
////////////////////////////////////////////////////////////////
- private boolean IsBootstrapInAPK()
+ private boolean AreAssetsInAPK()
{
try
{
- InputStream bootstrap = getAssets().open("bootstrap.cfg", AssetManager.ACCESS_UNKNOWN);
- bootstrap.close();
+ InputStream engine = getAssets().open("engine.json", AssetManager.ACCESS_UNKNOWN);
+ engine.close();
return true;
}
catch (IOException exception)
diff --git a/Code/Framework/AzCore/AzCore/Android/Utils.cpp b/Code/Framework/AzCore/AzCore/Android/Utils.cpp
index efbbf50d1d..d6435c67be 100644
--- a/Code/Framework/AzCore/AzCore/Android/Utils.cpp
+++ b/Code/Framework/AzCore/AzCore/Android/Utils.cpp
@@ -148,7 +148,7 @@ namespace AZ
}
}
- AZ_Assert(false, "Failed to locate the bootstrap.cfg path");
+ AZ_Assert(false, "Failed to locate the engine.json path");
return nullptr;
}
diff --git a/Code/Framework/AzCore/AzCore/Android/Utils.h b/Code/Framework/AzCore/AzCore/Android/Utils.h
index 222fac80ad..0862d53aa4 100644
--- a/Code/Framework/AzCore/AzCore/Android/Utils.h
+++ b/Code/Framework/AzCore/AzCore/Android/Utils.h
@@ -73,8 +73,8 @@ namespace AZ
//! \return The pointer position of the relative asset path
AZ::IO::FixedMaxPath StripApkPrefix(const char* filePath);
- //! Searches application storage and the APK for bootstrap.cfg. Will return nullptr
- //! if bootstrap.cfg is not found.
+ //! Searches application storage and the APK for engine.json. Will return nullptr
+ //! if engine.json is not found.
const char* FindAssetsDirectory();
//! Calls into Java to show the splash screen on the main UI (Java) thread
diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetCommon.h b/Code/Framework/AzCore/AzCore/Asset/AssetCommon.h
index c5cdbbf331..11f4531124 100644
--- a/Code/Framework/AzCore/AzCore/Asset/AssetCommon.h
+++ b/Code/Framework/AzCore/AzCore/Asset/AssetCommon.h
@@ -307,6 +307,8 @@ namespace AZ
Asset(AssetLoadBehavior loadBehavior = AssetLoadBehavior::Default);
/// Create an asset from a valid asset data (created asset), might not be loaded or currently loading.
Asset(AssetData* assetData, AssetLoadBehavior loadBehavior);
+ /// Create an asset from a valid asset data (created asset) and set the asset id for both, might not be loaded or currently loading.
+ Asset(const AZ::Data::AssetId& id, AssetData* assetData, AssetLoadBehavior loadBehavior);
/// Initialize asset pointer with id, type, and hint. No data construction will occur until QueueLoad is called.
Asset(const AZ::Data::AssetId& id, const AZ::Data::AssetType& type, const AZStd::string& hint = AZStd::string());
@@ -787,6 +789,18 @@ namespace AZ
SetData(assetData);
}
+ //=========================================================================
+ template
+ Asset::Asset(const AssetId& id, AssetData* assetData, AssetLoadBehavior loadBehavior)
+ : m_assetId(id)
+ , m_assetType(azrtti_typeid())
+ , m_loadBehavior(loadBehavior)
+ {
+ AZ_Assert(!assetData->m_assetId.IsValid(), "Asset data already has an ID set.");
+ assetData->m_assetId = id;
+ SetData(assetData);
+ }
+
//=========================================================================
template
Asset::Asset(const AssetId& id, const AZ::Data::AssetType& type, const AZStd::string& hint)
diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetJsonSerializer.cpp b/Code/Framework/AzCore/AzCore/Asset/AssetJsonSerializer.cpp
index 555eedf034..a72fe4e013 100644
--- a/Code/Framework/AzCore/AzCore/Asset/AssetJsonSerializer.cpp
+++ b/Code/Framework/AzCore/AzCore/Asset/AssetJsonSerializer.cpp
@@ -133,7 +133,15 @@ namespace AZ
if (!id.m_guid.IsNull())
{
*instance = AssetManager::Instance().FindOrCreateAsset(id, instance->GetType(), instance->GetAutoLoadBehavior());
-
+ if (!instance->GetId().IsValid())
+ {
+ // If the asset failed to be created, FindOrCreateAsset returns an asset instance with a null
+ // id. To preserve the asset id in the source json, reset the asset to an empty one, but with
+ // the right id.
+ const auto loadBehavior = instance->GetAutoLoadBehavior();
+ *instance = Asset(id, instance->GetType());
+ instance->SetAutoLoadBehavior(loadBehavior);
+ }
result.Combine(context.Report(result, "Successfully created Asset with id."));
}
diff --git a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp
index 8a170f5d89..1010ae3473 100644
--- a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp
+++ b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp
@@ -462,8 +462,6 @@ namespace AZ
// for the application root.
CalculateAppRoot();
- // Merge the bootstrap.cfg file into the Settings Registry as soon as the OSAllocator has been created.
- SettingsRegistryMergeUtils::MergeSettingsToRegistry_Bootstrap(*m_settingsRegistry);
SettingsRegistryMergeUtils::MergeSettingsToRegistry_O3deUserRegistry(*m_settingsRegistry, AZ_TRAIT_OS_PLATFORM_CODENAME, {});
SettingsRegistryMergeUtils::MergeSettingsToRegistry_CommandLine(*m_settingsRegistry, m_commandLine, executeRegDumpCommands);
SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*m_settingsRegistry);
@@ -1262,7 +1260,7 @@ namespace AZ
// So auto load is turned off if option "AutoLoad" key is bool that is false
if (valueName == "AutoLoad" && !value)
{
- // Strip off the AutoLoead entry from the path
+ // Strip off the AutoLoad entry from the path
auto autoLoadKey = AZ::StringFunc::TokenizeLast(path, "/");
if (!autoLoadKey)
{
@@ -1332,7 +1330,7 @@ namespace AZ
{
auto CompareDynamicModuleDescriptor = [&dynamicLibraryPath](const DynamicModuleDescriptor& entry)
{
- return entry.m_dynamicLibraryPath.contains(dynamicLibraryPath);
+ return AZ::IO::PathView(entry.m_dynamicLibraryPath).Stem() == AZ::IO::PathView(dynamicLibraryPath).Stem();
};
if (auto moduleIter = AZStd::find_if(gemModules.begin(), gemModules.end(), CompareDynamicModuleDescriptor);
moduleIter == gemModules.end())
diff --git a/Code/Framework/AzCore/AzCore/Component/TransformBus.h b/Code/Framework/AzCore/AzCore/Component/TransformBus.h
index 2003b949e2..2a8d82c34c 100644
--- a/Code/Framework/AzCore/AzCore/Component/TransformBus.h
+++ b/Code/Framework/AzCore/AzCore/Component/TransformBus.h
@@ -172,78 +172,10 @@ namespace AZ
//! Rotation modifiers
//! @{
- //! @deprecated Use SetLocalRotation()
- //! Sets the entity's rotation in the world.
- //! The origin of the axes is the entity's position in world space.
- //! @param eulerAnglesRadians A three-dimensional vector, containing Euler angles in radians, to rotate the entity by.
- virtual void SetRotation([[maybe_unused]] const AZ::Vector3& eulerAnglesRadians) {}
-
- //! @deprecated Use SetLocalRotation()
- //! Sets the entity's rotation around the world's X axis.
- //! The origin of the axis is the entity's position in world space.
- //! @param eulerAngleRadians The X coordinate Euler angle in radians to use for the entity's rotation.
- virtual void SetRotationX([[maybe_unused]] float eulerAngleRadian) {}
-
- //! @deprecated Use SetLocalRotation()
- //! Sets the entity's rotation around the world's Y axis.
- //! The origin of the axis is the entity's position in world space.
- //! @param eulerAngleRadians The Y coordinate Euler angle in radians to use for the entity's rotation.
- virtual void SetRotationY([[maybe_unused]] float eulerAngleRadian) {}
-
- //! @deprecated Use SetLocalRotation()
- //! Sets the entity's rotation around the world's Z axis.
- //! The origin of the axis is the entity's position in world space.
- //! @param eulerAngleRadians The Z coordinate Euler angle in radians to use for the entity's rotation.
- virtual void SetRotationZ([[maybe_unused]] float eulerAngleRadian) {}
-
- //! @deprecated Use SetLocalRotationQuaternion()
//! Sets the entity's rotation in the world in quaternion notation.
//! The origin of the axes is the entity's position in world space.
//! @param quaternion A quaternion that represents the rotation to use for the entity.
- virtual void SetRotationQuaternion([[maybe_unused]] const AZ::Quaternion& quaternion) {}
-
- //! @deprecated Use RotateAroundLocalX()
- //! Rotates the entity around the world's X axis.
- //! The origin of the axis is the entity's position in world space.
- //! @param eulerAngleRadians The Euler angle in radians by which to rotate the entity around the X axis.
- virtual void RotateByX([[maybe_unused]] float eulerAngleRadian) {}
-
- //! @deprecated Use RotateAroundLocalY()
- //! Rotates the entity around the world's Y axis.
- //! The origin of the axis is the entity's position in world space.
- //! @param eulerAngleRadians The Euler angle in radians by which to rotate the entity around the Y axis.
- virtual void RotateByY([[maybe_unused]] float eulerAngleRadian) {}
-
- //! @deprecated Use RotateAroundLocalZ()
- //! Rotates the entity around the world's Z axis.
- //! The origin of the axis is the entity's position in world space.
- //! @param eulerAngleRadians The Euler angle in radians by which to rotate the entity around the Z axis.
- virtual void RotateByZ([[maybe_unused]] float eulerAngleRadian) {}
-
- //! @deprecated Use GetLocalRotation()
- //! Gets the entity's rotation in the world in Euler angles rotation in radians.
- //! @return A three-dimensional vector, containing Euler angles in radians, that represents the entity's rotation.
- virtual AZ::Vector3 GetRotationEulerRadians() { return AZ::Vector3(FLT_MAX); }
-
- //! @deprecated Use GetLocalRotationQuaternion()
- //! Gets the entity's rotation in the world in quaternion format.
- //! @return A quaternion that represents the entity's rotation in world space.
- virtual AZ::Quaternion GetRotationQuaternion() { return AZ::Quaternion::CreateZero(); }
-
- //! @deprecated Use GetLocalRotation()
- //! Gets the entity's rotation around the world's X axis.
- //! @return The Euler angle in radians by which the the entity is rotated around the X axis in world space.
- virtual float GetRotationX() { return FLT_MAX; }
-
- //! @deprecated Use GetLocalRotation()
- //! Gets the entity's rotation around the world's Y axis.
- //! @return The Euler angle in radians by which the the entity is rotated around the Y axis in world space.
- virtual float GetRotationY() { return FLT_MAX; }
-
- //! @deprecated Use GetLocalRotation()
- //! Gets the entity's rotation around the world's Z axis.
- //! @return The Euler angle in radians by which the the entity is rotated around the Z axis in world space.
- virtual float GetRotationZ() { return FLT_MAX; }
+ virtual void SetWorldRotationQuaternion([[maybe_unused]] const AZ::Quaternion& quaternion) {}
//! Get angles in radian for each principle axis around which the world transform is
//! rotated in the order of z-axis and y-axis and then x-axis.
@@ -287,71 +219,21 @@ namespace AZ
//! Scale modifiers
//! @{
- //! @deprecated Use SetLocalScale()
- //! Scales the entity along the world's axes. The origin of the axes is the entity's position in the world.
- //! @param scale A three-dimensional vector that represents the multipliers with which to scale the entity in world space.
- virtual void SetScale([[maybe_unused]] const AZ::Vector3& scale) {}
-
- //! @deprecated Use SetLocalScaleX()
- //! Scales the entity along the world's X axis. The origin of the axis is the entity's position in the world.
- //! @param scaleX The multiplier by which to scale the entity along the X axis in world space.
- virtual void SetScaleX([[maybe_unused]] float scaleX) {}
-
- //! @deprecated Use SetLocalScaleY()
- //! Scales the entity along the world's Y axis. The origin of the axis is the entity's position in the world.
- //! @param scaleY The multiplier by which to scale the entity along the Y axis in world space.
- virtual void SetScaleY([[maybe_unused]] float scaleY) {}
-
- //! @deprecated Use SetLocalScaleZ()
- //! Scales the entity along the world's Z axis. The origin of the axis is the entity's position in the world.
- //! @param scaleZ The multiplier by which to scale the entity along the Z axis in world space.
- virtual void SetScaleZ([[maybe_unused]] float scaleZ) {}
-
- //! @deprecated Use GetLocalScale()
- //! Gets the scale of the entity in world space.
- //! @return A three-dimensional vector that represents the scale of the entity in world space.
- virtual AZ::Vector3 GetScale() { return AZ::Vector3(FLT_MAX); }
-
- //! @deprecated Use GetLocalScale()
- //! Gets the amount by which an entity is scaled along the world's X axis.
- //! @return The amount by which an entity is scaled along the X axis in world space.
- virtual float GetScaleX() { return FLT_MAX; }
-
- //! @deprecated Use GetLocalScale()
- //! Gets the amount by which an entity is scaled along the world's Y axis.
- //! @return The amount by which an entity is scaled along the Y axis in world space.
- virtual float GetScaleY() { return FLT_MAX; }
-
- //! @deprecated Use GetLocalScale()
- //! Gets the amount by which an entity is scaled along the world's Z axis.
- //! @return The amount by which an entity is scaled along the Z axis in world space.
- virtual float GetScaleZ() { return FLT_MAX; }
-
- //! Set local scale of the transform.
- //! @param scale The new scale to set along three local axes.
- virtual void SetLocalScale([[maybe_unused]] const AZ::Vector3& scale) {}
-
- //! Set local scale of the transform on x-axis.
- //! @param scaleX The new x-axis scale to set.
- virtual void SetLocalScaleX([[maybe_unused]] float scaleX) {}
-
- //! Set local scale of the transform on y-axis.
- //! @param scaleY The new y-axis scale to set.
- virtual void SetLocalScaleY([[maybe_unused]] float scaleY) {}
-
- //! Set local scale of the transform on z-axis.
- //! @param scaleZ The new z-axis scale to set.
- virtual void SetLocalScaleZ([[maybe_unused]] float scaleZ) {}
-
- //! Get the scale value on each axis in local space
- //! @return The scale value of type Vector3 along each axis in local space.
+ //! @deprecated GetLocalScale is deprecated, and is left only to allow migration of legacy vector scale.
+ //! Get the legacy vector scale value in local space.
+ //! @return The scale value in local space.
virtual AZ::Vector3 GetLocalScale() { return AZ::Vector3(FLT_MAX); }
- //! Get the scale value on each axis in world space.
- //! Note the transform will be skewed when it is rotated and has a parent transform scaled, in which
- //! case the returned world-scale from this function will be inaccurate.
- //! @return The scale value of type Vector3 along each axis in world space.
- virtual AZ::Vector3 GetWorldScale() { return AZ::Vector3(FLT_MAX); }
+ //! Set the uniform scale value in local space.
+ virtual void SetLocalUniformScale([[maybe_unused]] float scale) {}
+
+ //! Get the uniform scale value in local space.
+ //! @return The uniform scale value in local space.
+ virtual float GetLocalUniformScale() { return FLT_MAX; }
+
+ //! Get the uniform scale value in world space.
+ //! @return The uniform scale value in world space.
+ virtual float GetWorldUniformScale() { return FLT_MAX; }
//! @}
//! Transform hierarchy
diff --git a/Code/Framework/AzCore/AzCore/IO/Path/Path.h b/Code/Framework/AzCore/AzCore/IO/Path/Path.h
index 61294cd637..6c1b519224 100644
--- a/Code/Framework/AzCore/AzCore/IO/Path/Path.h
+++ b/Code/Framework/AzCore/AzCore/IO/Path/Path.h
@@ -95,6 +95,12 @@ namespace AZ::IO
constexpr int Compare(AZStd::string_view pathString) const noexcept;
constexpr int Compare(const value_type* pathString) const noexcept;
+ // Extension for fixed strings
+ //! extension: fixed string types with MaxPathLength capacity
+ //! Returns a new instance of an AZStd::fixed_string with capacity of MaxPathLength
+ //! made from the internal string
+ constexpr AZStd::fixed_string FixedMaxPathString() const noexcept;
+
// decomposition
//! Given a windows path of "C:\O3DE\foo\bar\name.txt" and a posix path of
//! "/O3DE/foo/bar/name.txt"
diff --git a/Code/Framework/AzCore/AzCore/IO/Path/Path.inl b/Code/Framework/AzCore/AzCore/IO/Path/Path.inl
index 1e42fc9df7..05a92c5247 100644
--- a/Code/Framework/AzCore/AzCore/IO/Path/Path.inl
+++ b/Code/Framework/AzCore/AzCore/IO/Path/Path.inl
@@ -915,6 +915,11 @@ namespace AZ::IO
return compare_string_view(path);
}
+ constexpr AZStd::fixed_string PathView::FixedMaxPathString() const noexcept
+ {
+ return AZStd::fixed_string(m_path.begin(), m_path.end());
+ }
+
// decomposition
constexpr auto PathView::RootName() const -> PathView
{
diff --git a/Code/Framework/AzCore/AzCore/Math/Aabb.cpp b/Code/Framework/AzCore/AzCore/Math/Aabb.cpp
index 3f7cb4ecf5..367594be63 100644
--- a/Code/Framework/AzCore/AzCore/Math/Aabb.cpp
+++ b/Code/Framework/AzCore/AzCore/Math/Aabb.cpp
@@ -227,7 +227,7 @@ namespace AZ
// the min and max of each part and sum them to get the min and max co-ordinate of the transformed box. For a given new axis,
// the coefficients for what proportion of each original axis is rotated onto that new axis are the same as the components we
// would get by performing the inverse rotation on the new axis, so we need to take the conjugate to get the inverse rotation.
- axisCoeffs = transform.GetScale() * (transform.GetRotation().GetConjugate().TransformVector(axis));
+ axisCoeffs = transform.GetUniformScale() * (transform.GetRotation().GetConjugate().TransformVector(axis));
a = axisCoeffs * m_min;
b = axisCoeffs * m_max;
diff --git a/Code/Framework/AzCore/AzCore/Math/Obb.cpp b/Code/Framework/AzCore/AzCore/Math/Obb.cpp
index eb511669d0..9226ddd28f 100644
--- a/Code/Framework/AzCore/AzCore/Math/Obb.cpp
+++ b/Code/Framework/AzCore/AzCore/Math/Obb.cpp
@@ -154,7 +154,7 @@ namespace AZ
return Obb::CreateFromPositionRotationAndHalfLengths(
transform.TransformPoint(obb.GetPosition()),
transform.GetRotation() * obb.GetRotation(),
- transform.GetScale() * obb.GetHalfLengths()
+ transform.GetUniformScale() * obb.GetHalfLengths()
);
}
}
diff --git a/Code/Framework/AzCore/AzCore/Math/Quaternion.cpp b/Code/Framework/AzCore/AzCore/Math/Quaternion.cpp
index 143fe59ca7..06443c0698 100644
--- a/Code/Framework/AzCore/AzCore/Math/Quaternion.cpp
+++ b/Code/Framework/AzCore/AzCore/Math/Quaternion.cpp
@@ -348,13 +348,20 @@ namespace AZ
return result.GetW() >= 0.0f ? result : -result;
}
- const Quaternion Quaternion::CreateFromEulerAnglesDegrees(Vector3& anglesInDegrees)
+ const Quaternion Quaternion::CreateFromEulerAnglesDegrees(const Vector3& anglesInDegrees)
{
Quaternion result;
result.SetFromEulerDegrees(anglesInDegrees);
return result;
}
+ const Quaternion Quaternion::CreateFromEulerAnglesRadians(const Vector3& anglesInRadians)
+ {
+ Quaternion result;
+ result.SetFromEulerRadians(anglesInRadians);
+ return result;
+ }
+
Quaternion Quaternion::Slerp(const Quaternion& dest, float t) const
{
const float DestDot = Dot(dest);
diff --git a/Code/Framework/AzCore/AzCore/Math/Quaternion.h b/Code/Framework/AzCore/AzCore/Math/Quaternion.h
index c4502063de..4d3b6641db 100644
--- a/Code/Framework/AzCore/AzCore/Math/Quaternion.h
+++ b/Code/Framework/AzCore/AzCore/Math/Quaternion.h
@@ -83,8 +83,11 @@ namespace AZ
static Quaternion CreateShortestArc(const Vector3& v1, const Vector3& v2);
- /// Creates a quaternion using rotation in degrees about the axes. First rotated about the X axis, followed by the Y axis, then the Z axis.
- static const Quaternion CreateFromEulerAnglesDegrees(Vector3& anglesInDegrees);
+ //! Creates a quaternion using rotation in degrees about the axes. First rotated about the X axis, followed by the Y axis, then the Z axis.
+ static const Quaternion CreateFromEulerAnglesDegrees(const Vector3& anglesInDegrees);
+
+ //! Creates a quaternion using rotation in radians about the axes. First rotated about the X axis, followed by the Y axis, then the Z axis.
+ static const Quaternion CreateFromEulerAnglesRadians(const Vector3& anglesInRadians);
//! Stores the vector to an array of 4 floats. The floats need only be 4 byte aligned, 16 byte alignment is not required.
void StoreToFloat4(float* values) const;
diff --git a/Code/Framework/AzCore/AzCore/Math/Random.h b/Code/Framework/AzCore/AzCore/Math/Random.h
index 5ae37433ec..8b2763df50 100644
--- a/Code/Framework/AzCore/AzCore/Math/Random.h
+++ b/Code/Framework/AzCore/AzCore/Math/Random.h
@@ -86,4 +86,101 @@ namespace AZ
Normal,
UniformReal
};
+
+ //! Halton sequences are deterministic, quasi-random sequences with low discrepancy. They
+ //! are useful for generating evenly distributed points.
+ //! See https://en.wikipedia.org/wiki/Halton_sequence for more information.
+
+ //! Returns a single halton number.
+ //! @param index The index of the number. Indices start at 1. Using index 0 will return 0.
+ //! @param base The numerical base of the halton number.
+ inline float GetHaltonNumber(uint32_t index, uint32_t base)
+ {
+ float fraction = 1.0f;
+ float result = 0.0f;
+
+ while (index > 0)
+ {
+ fraction = fraction / base;
+ result += fraction * (index % base);
+ index = aznumeric_cast(index / base);
+ }
+
+ return result;
+ }
+
+ //! A helper class for generating arrays of Halton sequences in n dimensions.
+ //! The class holds the state of which bases to use, the starting offset
+ //! of each dimension and how much to increment between each index for each
+ //! dimension.
+ template
+ class HaltonSequence
+ {
+ public:
+
+ //! Initializes a Halton sequence with some bases. By default there is no
+ //! offset and the index increments by 1 between each number.
+ HaltonSequence(AZStd::array bases)
+ : m_bases(bases)
+ {
+ m_offsets.fill(1); // Halton sequences start at index 1.
+ m_increments.fill(1); // By default increment by 1 between each number.
+ }
+
+ //! Fills a provided container from begin to end with a Halton sequence.
+ //! Entries are expected to be, or implicitly converted to, AZStd::array.
+ template
+ void FillHaltonSequence(Iterator begin, Iterator end)
+ {
+ AZStd::array indices = m_offsets;
+
+ // Generator that returns the Halton number for all bases for a single entry.
+ auto f = [&]()
+ {
+ AZStd::array item;
+ for (auto d = 0; d < Dimensions; ++d)
+ {
+ item[d] = GetHaltonNumber(indices[d], m_bases[d]);
+ indices[d] += m_increments[d];
+ }
+ return item;
+ };
+
+ AZStd::generate(begin, end, f);
+ }
+
+ //! Returns a Halton sequence in an array of N length.
+ template
+ AZStd::array, N> GetHaltonSequence()
+ {
+ AZStd::array, N> result;
+ FillHaltonSequence(result.begin(), result.end());
+ return result;
+ }
+
+ //! Sets the offsets per dimension to start generating a sequence from.
+ //! By default, there is no offset (offset of 0 corresponds to starting at index 1).
+ void SetOffsets(AZStd::array offsets)
+ {
+ m_offsets = offsets;
+
+ // Halton sequences start at index 1, so increment all the indices.
+ AZStd::for_each(m_offsets.begin(), m_offsets.end(), [](uint32_t &n){ n++; });
+ }
+
+ //! Sets the increment between numbers in the halton sequence per dimension
+ //! By default this is 1, meaning that no numbers are skipped. Can be negative
+ //! to generate numbers in reverse order.
+ void SetIncrements(AZStd::array increments)
+ {
+ m_increments = increments;
+ }
+
+ private:
+
+ AZStd::array m_bases;
+ AZStd::array m_offsets;
+ AZStd::array m_increments;
+
+ };
}
diff --git a/Code/Framework/AzCore/AzCore/Math/Spline.h b/Code/Framework/AzCore/AzCore/Math/Spline.h
index 912c10f46f..1adfc9b2fa 100644
--- a/Code/Framework/AzCore/AzCore/Math/Spline.h
+++ b/Code/Framework/AzCore/AzCore/Math/Spline.h
@@ -441,10 +441,10 @@ namespace AZ
const Transform& worldFromLocal, const Vector3& src, const Vector3& dir, const Spline& spline)
{
Transform worldFromLocalNormalized = worldFromLocal;
- const Vector3 scale = worldFromLocalNormalized.ExtractScale();
+ const float scale = worldFromLocalNormalized.ExtractUniformScale();
const Transform localFromWorldNormalized = worldFromLocalNormalized.GetInverse();
- const Vector3 localRayOrigin = localFromWorldNormalized.TransformPoint(src) * scale.GetReciprocal();
+ const Vector3 localRayOrigin = localFromWorldNormalized.TransformPoint(src) / scale;
const Vector3 localRayDirection = localFromWorldNormalized.TransformVector(dir);
return spline.GetNearestAddressRay(localRayOrigin, localRayDirection);
}
diff --git a/Code/Framework/AzCore/AzCore/Math/Transform.cpp b/Code/Framework/AzCore/AzCore/Math/Transform.cpp
index bb3f764492..62a390c138 100644
--- a/Code/Framework/AzCore/AzCore/Math/Transform.cpp
+++ b/Code/Framework/AzCore/AzCore/Math/Transform.cpp
@@ -130,8 +130,8 @@ namespace AZ
const Transform* transform = reinterpret_cast(classPtr);
float data[NumFloats];
transform->GetRotation().StoreToFloat4(data);
- transform->GetScale().StoreToFloat3(&data[4]);
- transform->GetTranslation().StoreToFloat3(&data[7]);
+ data[4] = transform->GetUniformScale();
+ transform->GetTranslation().StoreToFloat3(&data[5]);
for (int i = 0; i < NumFloats; i++)
{
@@ -159,8 +159,8 @@ namespace AZ
size_t TransformSerializer::TextToData(const char* text, unsigned int textVersion, IO::GenericStream& stream, bool isDataBigEndian)
{
- const size_t dataBufferSize = AZStd::max(NumFloatsVersion0, NumFloats);
- const size_t numElements = textVersion < 1 ? NumFloatsVersion0 : NumFloats;
+ const size_t dataBufferSize = AZStd::max(AZStd::max(NumFloatsVersion1, NumFloatsVersion0), NumFloats);
+ const size_t numElements = textVersion < 1 ? NumFloatsVersion0 : (textVersion == 1 ? NumFloatsVersion1 : NumFloats);
size_t nextNumberIndex = 0;
AZStd::array data;
@@ -201,7 +201,34 @@ namespace AZ
return true;
}
- // otherwise load as a separate rotation, scale and translation
+ // version 1 had a quaternion rotation, vector3 scale and vector3 translation
+ else if (version == 1)
+ {
+ float data[NumFloatsVersion1];
+ if (stream.GetLength() < sizeof(data))
+ {
+ return false;
+ }
+
+ stream.Read(sizeof(data), reinterpret_cast(data));
+
+ for (unsigned int i = 0; i < AZ_ARRAY_SIZE(data); ++i)
+ {
+ AZ_SERIALIZE_SWAP_ENDIAN(data[i], isDataBigEndian);
+ }
+
+ Quaternion rotation = Quaternion::CreateFromFloat4(data);
+ Vector3 vectorScale = Vector3::CreateFromFloat3(&data[4]);
+ Vector3 translation = Vector3::CreateFromFloat3(&data[7]);
+
+ float uniformScale = vectorScale.GetMaxElement();
+
+ *reinterpret_cast(classPtr) =
+ Transform::CreateFromQuaternionAndTranslation(rotation, translation) * Transform::CreateUniformScale(uniformScale);
+ return true;
+ }
+
+ // otherwise load as a quaternion rotation, float scale and vector3 translation
float data[NumFloats];
if (stream.GetLength() < sizeof(data))
{
@@ -216,11 +243,11 @@ namespace AZ
}
Quaternion rotation = Quaternion::CreateFromFloat4(data);
- Vector3 scale = Vector3::CreateFromFloat3(&data[4]);
- Vector3 translation = Vector3::CreateFromFloat3(&data[7]);
+ float scale = data[4];
+ Vector3 translation = Vector3::CreateFromFloat3(&data[5]);
*reinterpret_cast(classPtr) =
- Transform::CreateFromQuaternionAndTranslation(rotation, translation) * Transform::CreateScale(scale);
+ Transform::CreateFromQuaternionAndTranslation(rotation, translation) * Transform::CreateUniformScale(scale);
return true;
}
@@ -237,7 +264,7 @@ namespace AZ
if (serializeContext)
{
serializeContext->Class()
- ->Version(1)
+ ->Version(2)
->Serializer();
}
@@ -250,7 +277,7 @@ namespace AZ
Attribute(Script::Attributes::ExcludeFrom, Script::Attributes::ExcludeFlags::All)->
Attribute(Script::Attributes::Storage, Script::Attributes::StorageType::Value)->
Attribute(Script::Attributes::GenericConstructorOverride, &Internal::TransformDefaultConstructor)->
- Constructor()->
+ Constructor()->
Method("GetBasis", &Transform::GetBasis)->
Method("GetBasisX", &Transform::GetBasisX)->
Method("GetBasisY", &Transform::GetBasisY)->
@@ -283,11 +310,11 @@ namespace AZ
Attribute(Script::Attributes::ExcludeFrom, Script::Attributes::ExcludeFlags::All)->
Method("GetRotation", &Transform::GetRotation)->
Method("SetRotation", &Transform::SetRotation)->
- Method("GetScale", &Transform::GetScale)->
- Method("SetScale", &Transform::SetScale)->
- Method("ExtractScale", &Transform::ExtractScale)->
+ Method("GetUniformScale", &Transform::GetUniformScale)->
+ Method("SetUniformScale", &Transform::SetUniformScale)->
+ Method("ExtractUniformScale", &Transform::ExtractUniformScale)->
Attribute(Script::Attributes::ExcludeFrom, Script::Attributes::ExcludeFlags::All)->
- Method("MultiplyByScale", &Transform::MultiplyByScale)->
+ Method("MultiplyByUniformScale", &Transform::MultiplyByUniformScale)->
Method("GetInverse", &Transform::GetInverse)->
Method("Invert", &Transform::Invert)->
Attribute(Script::Attributes::ExcludeFrom, Script::Attributes::ExcludeFlags::All)->
@@ -305,7 +332,7 @@ namespace AZ
Method("CreateFromQuaternionAndTranslation", &Transform::CreateFromQuaternionAndTranslation)->
Method("CreateFromMatrix3x3", &Transform::CreateFromMatrix3x3)->
Method("CreateFromMatrix3x3AndTranslation", &Transform::CreateFromMatrix3x3AndTranslation)->
- Method("CreateScale", &Transform::CreateScale)->
+ Method("CreateUniformScale", &Transform::CreateUniformScale)->
Method("CreateTranslation", &Transform::CreateTranslation)->
Method("ConstructFromValuesNumeric", &Internal::ConstructTransformFromValues);
}
@@ -315,7 +342,7 @@ namespace AZ
{
Transform result;
Matrix3x3 tmp = value;
- result.m_scale = tmp.ExtractScale();
+ result.m_scale = tmp.ExtractScale().GetMaxElement();
result.m_rotation = Quaternion::CreateFromMatrix3x3(tmp);
result.m_translation = Vector3::CreateZero();
return result;
@@ -325,7 +352,7 @@ namespace AZ
{
Transform result;
Matrix3x3 tmp = value;
- result.m_scale = tmp.ExtractScale();
+ result.m_scale = tmp.ExtractScale().GetMaxElement();
result.m_rotation = Quaternion::CreateFromMatrix3x3(tmp);
result.m_translation = p;
return result;
@@ -335,7 +362,7 @@ namespace AZ
{
Transform result;
Matrix3x4 tmp = value;
- result.m_scale = tmp.ExtractScale();
+ result.m_scale = tmp.ExtractScale().GetMaxElement();
result.m_rotation = Quaternion::CreateFromMatrix3x4(tmp);
result.m_translation = value.GetTranslation();
return result;
diff --git a/Code/Framework/AzCore/AzCore/Math/Transform.h b/Code/Framework/AzCore/AzCore/Math/Transform.h
index eb1a12a912..3fe6ddc98a 100644
--- a/Code/Framework/AzCore/AzCore/Math/Transform.h
+++ b/Code/Framework/AzCore/AzCore/Math/Transform.h
@@ -25,10 +25,13 @@ namespace AZ
: public SerializeContext::IDataSerializer
{
public:
- // number of floats in the serialized representation, 4 for rotation, 3 for scale and 3 for translation
- static constexpr int NumFloats = 10;
+ // number of floats in the serialized representation, 4 for rotation, 1 for scale and 3 for translation
+ static constexpr int NumFloats = 8;
- // number of floats in the old format, which stored a 3x4 matrix
+ // number of floats in version 1, which used 4 for rotation, 3 for scale and 3 for translation
+ static constexpr int NumFloatsVersion1 = 10;
+
+ // number of floats in version 0, which stored a 3x4 matrix
static constexpr int NumFloatsVersion0 = 12;
size_t Save(const void* classPtr, IO::GenericStream& stream, bool isDataBigEndian) override;
@@ -45,7 +48,7 @@ namespace AZ
static constexpr float MaxTransformScale = 1e9f;
//! @}
- //! The basic transformation class, represented using a quaternion rotation, vector scale and vector translation.
+ //! The basic transformation class, represented using a quaternion rotation, float scale and vector translation.
//! By design, cannot represent skew transformations.
class Transform
{
@@ -63,7 +66,7 @@ namespace AZ
Transform() = default;
//! Construct a transform from components.
- Transform(const Vector3& translation, const Quaternion& rotation, const Vector3& scale);
+ Transform(const Vector3& translation, const Quaternion& rotation, float scale);
//! Creates an identity transform.
static Transform CreateIdentity();
@@ -82,15 +85,22 @@ namespace AZ
static Transform CreateFromQuaternionAndTranslation(const class Quaternion& q, const Vector3& p);
//! Constructs from a Matrix3x3, translation is set to zero.
+ //! Note that Transform only allows uniform scale, so if the matrix has different scale values along its axes,
+ //! the largest matrix scale value will be used to uniformly scale the Transform.
static Transform CreateFromMatrix3x3(const class Matrix3x3& value);
- //! Constructs from a Matrix3x3, translation is set to zero.
+ //! Constructs from a Matrix3x3 and translation Vector3.
+ //! Note that Transform only allows uniform scale, so if the matrix has different scale values along its axes,
+ //! the largest matrix scale value will be used to uniformly scale the Transform.
static Transform CreateFromMatrix3x3AndTranslation(const class Matrix3x3& value, const Vector3& p);
+ //! Constructs from a Matrix3x4.
+ //! Note that Transform only allows uniform scale, so if the matrix has different scale values along its axes,
+ //! the largest matrix scale value will be used to uniformly scale the Transform.
static Transform CreateFromMatrix3x4(const Matrix3x4& value);
- //! Sets the matrix to be a scale matrix, translation is set to zero.
- static Transform CreateScale(const Vector3& scale);
+ //! Sets the transform to apply (uniform) scale only, no rotation or translation.
+ static Transform CreateUniformScale(const float scale);
//! Sets the matrix to be a translation matrix, rotation part is set to identity.
static Transform CreateTranslation(const Vector3& translation);
@@ -119,13 +129,13 @@ namespace AZ
const Quaternion& GetRotation() const;
void SetRotation(const Quaternion& rotation);
- const Vector3& GetScale() const;
- void SetScale(const Vector3& v);
+ float GetUniformScale() const;
+ void SetUniformScale(const float scale);
- //! Sets the transforms scale to a unit value and returns the previous scale value.
- Vector3 ExtractScale();
+ //! Sets the transform's scale to a unit value and returns the previous scale value.
+ float ExtractUniformScale();
- void MultiplyByScale(const Vector3& scale);
+ void MultiplyByUniformScale(float scale);
Transform operator*(const Transform& rhs) const;
Transform& operator*=(const Transform& rhs);
@@ -159,7 +169,7 @@ namespace AZ
private:
Quaternion m_rotation;
- Vector3 m_scale;
+ float m_scale;
Vector3 m_translation;
};
diff --git a/Code/Framework/AzCore/AzCore/Math/Transform.inl b/Code/Framework/AzCore/AzCore/Math/Transform.inl
index 63425e6e41..5f71316b52 100644
--- a/Code/Framework/AzCore/AzCore/Math/Transform.inl
+++ b/Code/Framework/AzCore/AzCore/Math/Transform.inl
@@ -12,7 +12,7 @@
namespace AZ
{
- AZ_MATH_INLINE Transform::Transform(const Vector3& translation, const Quaternion& rotation, const Vector3& scale)
+ AZ_MATH_INLINE Transform::Transform(const Vector3& translation, const Quaternion& rotation, float scale)
: m_translation(translation)
, m_rotation(rotation)
, m_scale(scale)
@@ -25,7 +25,7 @@ namespace AZ
{
Transform result;
result.m_rotation = Quaternion::CreateIdentity();
- result.m_scale = Vector3::CreateOne();
+ result.m_scale = 1.0f;
result.m_translation = Vector3::CreateZero();
return result;
}
@@ -49,7 +49,7 @@ namespace AZ
{
Transform result;
result.m_rotation = q;
- result.m_scale = Vector3::CreateOne();
+ result.m_scale = 1.0f;
result.m_translation = Vector3::CreateZero();
return result;
}
@@ -58,12 +58,12 @@ namespace AZ
{
Transform result;
result.m_rotation = q;
- result.m_scale = Vector3::CreateOne();
+ result.m_scale = 1.0f;
result.m_translation = p;
return result;
}
- AZ_MATH_INLINE Transform Transform::CreateScale(const Vector3& scale)
+ AZ_MATH_INLINE Transform Transform::CreateUniformScale(float scale)
{
Transform result;
result.m_rotation = Quaternion::CreateIdentity();
@@ -76,7 +76,7 @@ namespace AZ
{
Transform result;
result.m_rotation = Quaternion::CreateIdentity();
- result.m_scale = Vector3::CreateOne();
+ result.m_scale = 1.0f;
result.m_translation = translation;
return result;
}
@@ -104,17 +104,17 @@ namespace AZ
AZ_MATH_INLINE Vector3 Transform::GetBasisX() const
{
- return m_rotation.TransformVector(Vector3::CreateAxisX(m_scale.GetX()));
+ return m_rotation.TransformVector(Vector3::CreateAxisX(m_scale));
}
AZ_MATH_INLINE Vector3 Transform::GetBasisY() const
{
- return m_rotation.TransformVector(Vector3::CreateAxisY(m_scale.GetY()));
+ return m_rotation.TransformVector(Vector3::CreateAxisY(m_scale));
}
AZ_MATH_INLINE Vector3 Transform::GetBasisZ() const
{
- return m_rotation.TransformVector(Vector3::CreateAxisZ(m_scale.GetZ()));
+ return m_rotation.TransformVector(Vector3::CreateAxisZ(m_scale));
}
AZ_MATH_INLINE void Transform::GetBasisAndTranslation(Vector3* basisX, Vector3* basisY, Vector3* basisZ, Vector3* pos) const
@@ -150,24 +150,24 @@ namespace AZ
m_rotation = rotation;
}
- AZ_MATH_INLINE const Vector3& Transform::GetScale() const
+ AZ_MATH_INLINE float Transform::GetUniformScale() const
{
return m_scale;
}
- AZ_MATH_INLINE void Transform::SetScale(const Vector3& scale)
+ AZ_MATH_INLINE void Transform::SetUniformScale(const float scale)
{
m_scale = scale;
}
- AZ_MATH_INLINE Vector3 Transform::ExtractScale()
+ AZ_MATH_INLINE float Transform::ExtractUniformScale()
{
- const Vector3 scale = m_scale;
- m_scale = Vector3::CreateOne();
+ const float scale = m_scale;
+ m_scale = 1.0f;
return scale;
}
- AZ_MATH_INLINE void Transform::MultiplyByScale(const Vector3& scale)
+ AZ_MATH_INLINE void Transform::MultiplyByUniformScale(float scale)
{
m_scale *= scale;
}
@@ -204,10 +204,9 @@ namespace AZ
AZ_MATH_INLINE Transform Transform::GetInverse() const
{
- // note - need to be careful about how to calculate inverse when there is non-uniform scale
Transform out;
out.m_rotation = m_rotation.GetConjugate();
- out.m_scale = m_scale.GetReciprocal();
+ out.m_scale = 1.0f / m_scale;
out.m_translation = -out.m_scale * (out.m_rotation.TransformVector(m_translation));
return out;
}
@@ -219,27 +218,27 @@ namespace AZ
AZ_MATH_INLINE bool Transform::IsOrthogonal(float tolerance) const
{
- return m_scale.IsClose(Vector3::CreateOne(), tolerance);
+ return AZ::IsClose(m_scale, 1.0f, tolerance);
}
AZ_MATH_INLINE Transform Transform::GetOrthogonalized() const
{
Transform result;
result.m_rotation = m_rotation;
- result.m_scale = Vector3::CreateOne();
+ result.m_scale = 1.0f;
result.m_translation = m_translation;
return result;
}
AZ_MATH_INLINE void Transform::Orthogonalize()
{
- *this = GetOrthogonalized();
+ m_scale = 1.0f;
}
AZ_MATH_INLINE bool Transform::IsClose(const Transform& rhs, float tolerance) const
{
return m_rotation.IsClose(rhs.m_rotation, tolerance)
- && m_scale.IsClose(rhs.m_scale, tolerance)
+ && AZ::IsClose(m_scale, rhs.m_scale, tolerance)
&& m_translation.IsClose(rhs.m_translation, tolerance);
}
@@ -268,21 +267,21 @@ namespace AZ
AZ_MATH_INLINE void Transform::SetFromEulerDegrees(const Vector3& eulerDegrees)
{
m_translation = Vector3::CreateZero();
- m_scale = Vector3::CreateOne();
+ m_scale = 1.0f;
m_rotation.SetFromEulerDegrees(eulerDegrees);
}
AZ_MATH_INLINE void Transform::SetFromEulerRadians(const Vector3& eulerRadians)
{
m_translation = Vector3::CreateZero();
- m_scale = Vector3::CreateOne();
+ m_scale = 1.0f;
m_rotation.SetFromEulerRadians(eulerRadians);
}
AZ_MATH_INLINE bool Transform::IsFinite() const
{
return m_rotation.IsFinite()
- && m_scale.IsFinite()
+ && AZ::IsFiniteFloat(m_scale)
&& m_translation.IsFinite();
}
diff --git a/Code/Framework/AzCore/AzCore/Math/TransformSerializer.cpp b/Code/Framework/AzCore/AzCore/Math/TransformSerializer.cpp
index 0a3e02ee0d..36c40265af 100644
--- a/Code/Framework/AzCore/AzCore/Math/TransformSerializer.cpp
+++ b/Code/Framework/AzCore/AzCore/Math/TransformSerializer.cpp
@@ -60,14 +60,14 @@ namespace AZ
{
// Scale is transitioning to a single uniform scale value, but since it's still internally represented as a Vector3,
// we need to pick one number to use for load/store operations.
- float scale = transformInstance->GetScale().GetMaxElement();
+ float scale = transformInstance->GetUniformScale();
JSR::ResultCode loadResult =
ContinueLoadingFromJsonObjectField(&scale, azrtti_typeid(), inputValue, ScaleTag, context);
result.Combine(loadResult);
- transformInstance->SetScale(AZ::Vector3(scale));
+ transformInstance->SetUniformScale(scale);
}
return context.Report(
@@ -124,8 +124,8 @@ namespace AZ
// Scale is transitioning to a single uniform scale value, but since it's still internally represented as a Vector3,
// we need to pick one number to use for load/store operations.
- float scale = transformInstance->GetScale().GetMaxElement();
- float defaultScale = defaultTransformInstance ? defaultTransformInstance->GetScale().GetMaxElement() : 0.0f;
+ float scale = transformInstance->GetUniformScale();
+ float defaultScale = defaultTransformInstance ? defaultTransformInstance->GetUniformScale() : 0.0f;
JSR::ResultCode storeResult = ContinueStoringToJsonObjectField(
outputValue, ScaleTag, &scale, defaultTransformInstance ? &defaultScale : nullptr, azrtti_typeid(),
diff --git a/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.cpp b/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.cpp
index 78f6ac0fb1..9e5b586c39 100644
--- a/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.cpp
+++ b/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.cpp
@@ -103,7 +103,7 @@ namespace AZ
}
}
- /// Returns a pointer to the beginning of master vector of SmallAllocationGroups.
+ /// Returns a pointer to the beginning of vector of SmallAllocationGroups.
SmallAllocationGroup* ArrayHead()
{
return this - m_index;
@@ -169,7 +169,7 @@ namespace AZ
return m_marker == MARKER;
}
- /// Returns the master index of the SmallAllocationGroup containing this allocation
+ /// Returns the index of the SmallAllocationGroup containing this allocation
uint32_t GetSmallAllocationIndex() const
{
return (uint32_t)(m_data & 0xFFFFFFFF);
diff --git a/Code/Framework/AzCore/AzCore/Module/ModuleManager.cpp b/Code/Framework/AzCore/AzCore/Module/ModuleManager.cpp
index fe41050b00..0ce3ee5d8d 100644
--- a/Code/Framework/AzCore/AzCore/Module/ModuleManager.cpp
+++ b/Code/Framework/AzCore/AzCore/Module/ModuleManager.cpp
@@ -512,7 +512,7 @@ namespace AZ
// Load DLLs specified in the application descriptor
for (const auto& moduleDescriptor : modules)
{
- // For each module that is loaded, attempt to set the module's folder as a path for dependent module resolution
+ // For each module that is loaded, attempt to set the module's folder as a path for dependent module resolution
moduleSearchPathHelper.SetModuleSearchPath(moduleDescriptor);
LoadModuleOutcome result = LoadDynamicModule(moduleDescriptor.m_dynamicLibraryPath.c_str(), lastStepToPerform, maintainReferences);
diff --git a/Code/Framework/AzCore/AzCore/PlatformId/PlatformDefaults.cpp b/Code/Framework/AzCore/AzCore/PlatformId/PlatformDefaults.cpp
index 63aad1ecf4..e31c3b0a1e 100644
--- a/Code/Framework/AzCore/AzCore/PlatformId/PlatformDefaults.cpp
+++ b/Code/Framework/AzCore/AzCore/PlatformId/PlatformDefaults.cpp
@@ -19,7 +19,7 @@ namespace AZ
{
inline namespace PlatformDefaults
{
- static const char* PlatformNames[PlatformId::NumPlatformIds] = { PlatformPC, PlatformES3, PlatformIOS, PlatformOSX, PlatformProvo, PlatformSalem, PlatformJasper, PlatformServer, PlatformAll, PlatformAllClient };
+ static const char* PlatformNames[PlatformId::NumPlatformIds] = { PlatformPC, PlatformAndroid, PlatformIOS, PlatformMac, PlatformProvo, PlatformSalem, PlatformJasper, PlatformServer, PlatformAll, PlatformAllClient };
const char* PlatformIdToPalFolder(AZ::PlatformId platform)
{
@@ -31,11 +31,11 @@ namespace AZ
{
case AZ::PC:
return "PC";
- case AZ::ES3:
+ case AZ::ANDROID_ID:
return "Android";
case AZ::IOS:
return "iOS";
- case AZ::OSX:
+ case AZ::MAC_ID:
return "Mac";
case AZ::PROVO:
return "Provo";
@@ -66,11 +66,11 @@ namespace AZ
}
else if (osPlatform == PlatformCodeNameMac)
{
- return PlatformOSX;
+ return PlatformMac;
}
else if (osPlatform == PlatformCodeNameAndroid)
{
- return PlatformES3;
+ return PlatformAndroid;
}
else if (osPlatform == PlatformCodeNameiOS)
{
@@ -207,13 +207,13 @@ namespace AZ
platformCodes.emplace_back(PlatformCodeNameWindows);
platformCodes.emplace_back(PlatformCodeNameLinux);
break;
- case PlatformId::ES3:
+ case PlatformId::ANDROID_ID:
platformCodes.emplace_back(PlatformCodeNameAndroid);
break;
case PlatformId::IOS:
platformCodes.emplace_back(PlatformCodeNameiOS);
break;
- case PlatformId::OSX:
+ case PlatformId::MAC_ID:
platformCodes.emplace_back(PlatformCodeNameMac);
break;
case PlatformId::PROVO:
diff --git a/Code/Framework/AzCore/AzCore/PlatformId/PlatformDefaults.h b/Code/Framework/AzCore/AzCore/PlatformId/PlatformDefaults.h
index 2d67c860cd..ba8c55f5f5 100644
--- a/Code/Framework/AzCore/AzCore/PlatformId/PlatformDefaults.h
+++ b/Code/Framework/AzCore/AzCore/PlatformId/PlatformDefaults.h
@@ -27,9 +27,9 @@ namespace AZ
inline namespace PlatformDefaults
{
constexpr char PlatformPC[] = "pc";
- constexpr char PlatformES3[] = "es3";
+ constexpr char PlatformAndroid[] = "android";
constexpr char PlatformIOS[] = "ios";
- constexpr char PlatformOSX[] = "osx_gl";
+ constexpr char PlatformMac[] = "mac";
constexpr char PlatformProvo[] = "provo";
constexpr char PlatformSalem[] = "salem";
constexpr char PlatformJasper[] = "jasper";
@@ -54,9 +54,9 @@ namespace AZ
AZ_ENUM_WITH_UNDERLYING_TYPE(PlatformId, int,
(Invalid, -1),
PC,
- ES3,
+ ANDROID_ID,
IOS,
- OSX,
+ MAC_ID,
PROVO,
SALEM,
JASPER,
@@ -73,9 +73,9 @@ namespace AZ
{
Platform_NONE = 0x00,
Platform_PC = 1 << PlatformId::PC,
- Platform_ES3 = 1 << PlatformId::ES3,
+ Platform_ANDROID = 1 << PlatformId::ANDROID_ID,
Platform_IOS = 1 << PlatformId::IOS,
- Platform_OSX = 1 << PlatformId::OSX,
+ Platform_MAC = 1 << PlatformId::MAC_ID,
Platform_PROVO = 1 << PlatformId::PROVO,
Platform_SALEM = 1 << PlatformId::SALEM,
Platform_JASPER = 1 << PlatformId::JASPER,
@@ -87,7 +87,7 @@ namespace AZ
// A special platform that will always correspond to all non-server platforms, even if new ones are added
Platform_ALL_CLIENT = 1ULL << 31,
- AllNamedPlatforms = Platform_PC | Platform_ES3 | Platform_IOS | Platform_OSX | Platform_PROVO | Platform_SALEM | Platform_JASPER | Platform_SERVER,
+ AllNamedPlatforms = Platform_PC | Platform_ANDROID | Platform_IOS | Platform_MAC | Platform_PROVO | Platform_SALEM | Platform_JASPER | Platform_SERVER,
};
AZ_DEFINE_ENUM_BITWISE_OPERATORS(PlatformFlags);
diff --git a/Code/Framework/AzCore/AzCore/PlatformId/PlatformId.cpp b/Code/Framework/AzCore/AzCore/PlatformId/PlatformId.cpp
index 0258869a0c..d56140be28 100644
--- a/Code/Framework/AzCore/AzCore/PlatformId/PlatformId.cpp
+++ b/Code/Framework/AzCore/AzCore/PlatformId/PlatformId.cpp
@@ -28,8 +28,8 @@ namespace AZ
return "Android64";
case PlatformID::PLATFORM_APPLE_IOS:
return "iOS";
- case PlatformID::PLATFORM_APPLE_OSX:
- return "OSX";
+ case PlatformID::PLATFORM_APPLE_MAC:
+ return "Mac";
#if defined(AZ_EXPAND_FOR_RESTRICTED_PLATFORM) || defined(AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS)
#define AZ_RESTRICTED_PLATFORM_EXPANSION(CodeName, CODENAME, codename, PrivateName, PRIVATENAME, privatename, PublicName, PUBLICNAME, publicname, PublicAuxName1, PublicAuxName2, PublicAuxName3)\
case PlatformID::PLATFORM_##PUBLICNAME:\
diff --git a/Code/Framework/AzCore/AzCore/PlatformId/PlatformId.h b/Code/Framework/AzCore/AzCore/PlatformId/PlatformId.h
index ce1a11d8ce..e8e7cef6dd 100644
--- a/Code/Framework/AzCore/AzCore/PlatformId/PlatformId.h
+++ b/Code/Framework/AzCore/AzCore/PlatformId/PlatformId.h
@@ -23,7 +23,7 @@ namespace AZ
PLATFORM_WINDOWS_64,
PLATFORM_LINUX_64,
PLATFORM_APPLE_IOS,
- PLATFORM_APPLE_OSX,
+ PLATFORM_APPLE_MAC,
PLATFORM_ANDROID_64, // ARMv8 / 64-bit
#if defined(AZ_EXPAND_FOR_RESTRICTED_PLATFORM) || defined(AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS)
#define AZ_RESTRICTED_PLATFORM_EXPANSION(CodeName, CODENAME, codename, PrivateName, PRIVATENAME, privatename, PublicName, PUBLICNAME, publicname, PublicAuxName1, PublicAuxName2, PublicAuxName3)\
diff --git a/Code/Framework/AzCore/AzCore/RTTI/AzStdOnDemandReflection.inl b/Code/Framework/AzCore/AzCore/RTTI/AzStdOnDemandReflection.inl
index 079c70c878..537d3e5c83 100644
--- a/Code/Framework/AzCore/AzCore/RTTI/AzStdOnDemandReflection.inl
+++ b/Code/Framework/AzCore/AzCore/RTTI/AzStdOnDemandReflection.inl
@@ -1020,29 +1020,60 @@ namespace AZ
}
};
- /// OnDemand reflection for AZStd::set
+
+ template
+ class Iterator_VM>
+ {
+ public:
+ using ContainerType = AZStd::unordered_set;
+ using IteratorType = typename ContainerType::iterator;
+ Iterator_VM(ContainerType& container)
+ : m_iterator(container.begin())
+ , m_end(container.end())
+ {}
+
+ const t_Key& GetKeyUnchecked() const
+ {
+ return *m_iterator;
+ }
+
+ bool IsNotAtEnd() const
+ {
+ return m_iterator != m_end;
+ }
+
+ t_Key& ModValueUnchecked()
+ {
+ return *m_iterator;
+ }
+
+ void Next()
+ {
+ ++m_iterator;
+ }
+
+ private:
+ IteratorType m_iterator;
+ IteratorType m_end;
+ };
+
+ /// OnDemand reflection for AZStd::unordered_set
template
struct OnDemandReflection< AZStd::unordered_set >
{
using ContainerType = AZStd::unordered_set;
using KeyListType = AZStd::vector;
- static AZ::Outcome Erase(ContainerType& thisMap, Key& key)
+ using ValueIteratorType = Iterator_VM;
+
+ static bool EraseCheck_VM(ContainerType& thisSet, Key& key)
{
- const auto result = thisMap.erase(key);
- if (result)
- {
- return AZ::Success();
- }
- else
- {
- return AZ::Failure();
- }
+ return thisSet.erase(key) != 0;
}
- static void Insert(ContainerType& thisSet, Key& key)
+ static ContainerType& ErasePost_VM(ContainerType& thisSet, [[maybe_unused]] Key&)
{
- thisSet.insert(key);
+ return thisSet;
}
static KeyListType GetKeys(ContainerType& thisSet)
@@ -1055,6 +1086,17 @@ namespace AZ
return keys;
}
+ static ContainerType& Insert(ContainerType& thisSet, Key& key)
+ {
+ thisSet.insert(key);
+ return thisSet;
+ }
+
+ static ValueIteratorType Iterate_VM(ContainerType& thisContainer)
+ {
+ return ValueIteratorType(thisContainer);
+ }
+
static void Swap(ContainerType& thisSet, ContainerType& otherSet)
{
thisSet.swap(otherSet);
@@ -1064,33 +1106,68 @@ namespace AZ
{
if (BehaviorContext* behaviorContext = azrtti_cast(context))
{
+ BranchOnResultInfo emptyBranchInfo;
+ emptyBranchInfo.m_returnResultInBranches = true;
+ emptyBranchInfo.m_trueToolTip = "The container is empty";
+ emptyBranchInfo.m_falseToolTip = "The container is not empty";
+
auto ContainsTransparent = [](const ContainerType& containerType, typename ContainerType::key_type& key)->bool
{
return containerType.contains(key);
};
+ ExplicitOverloadInfo explicitOverloadInfo;
behaviorContext->Class()
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
+ ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::ListOnly)
->Attribute(AZ::ScriptCanvasAttributes::PrettyName, ScriptCanvasOnDemandReflection::OnDemandPrettyName::Get(*behaviorContext))
->Attribute(AZ::Script::Attributes::ToolTip, ScriptCanvasOnDemandReflection::OnDemandToolTip::Get(*behaviorContext))
->Attribute(AZ::Script::Attributes::Category, ScriptCanvasOnDemandReflection::OnDemandCategoryName::Get(*behaviorContext))
->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::ScriptOwn)
->Method("BucketCount", static_cast(&ContainerType::bucket_count))
- ->Method("Erase", &Erase)
- ->Method("Empty", [](ContainerType& thisSet)->bool { return thisSet.empty(); })
+ ->Method("Empty", static_cast(&ContainerType::empty), { { { "Container", "The container to check if it is empty", nullptr, {} } } })
+ ->Attribute(AZ::ScriptCanvasAttributes::ExplicitOverloadCrc, ExplicitOverloadInfo("Is Empty", "Containers"))
+ ->Attribute(AZ::ScriptCanvasAttributes::BranchOnResult, emptyBranchInfo)
+ ->Method("EraseCheck_VM", &EraseCheck_VM)
+ ->Attribute(AZ::Script::Attributes::TreatAsMemberFunction, AZ::AttributeIsValid::IfPresent)
+ ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
+ ->Method("Erase", &ErasePost_VM)
+ ->Attribute(AZ::Script::Attributes::TreatAsMemberFunction, AZ::AttributeIsValid::IfPresent)
+ ->Attribute(AZ::ScriptCanvasAttributes::ExplicitOverloadCrc, ExplicitOverloadInfo("Erase", "Containers"))
+ ->Attribute(AZ::ScriptCanvasAttributes::CheckedOperation, CheckedOperationInfo("EraseCheck_VM", {}, "Out", "Key Not Found", true))
+ ->Attribute(AZ::ScriptCanvasAttributes::OverloadArgumentGroup, AZ::OverloadArgumentGroupInfo({ "ContainerGroup", "" }, { "ContainerGroup" }))
->Method("contains", ContainsTransparent)
+ ->Attribute(AZ::ScriptCanvasAttributes::ExplicitOverloadCrc, ExplicitOverloadInfo("Has Key", "Containers"))
->Attribute(AZ::Script::Attributes::TreatAsMemberFunction, AZ::AttributeIsValid::IfPresent)
->Method("Insert", &Insert)
+ ->Attribute(AZ::Script::Attributes::TreatAsMemberFunction, AZ::AttributeIsValid::IfPresent)
+ ->Attribute(AZ::ScriptCanvasAttributes::ExplicitOverloadCrc, ExplicitOverloadInfo("Insert", "Containers"))
+ ->Attribute(AZ::ScriptCanvasAttributes::OverloadArgumentGroup, AZ::OverloadArgumentGroupInfo({ "ContainerGroup", "", "" }, { "ContainerGroup" }))
->Method(k_sizeName, [](ContainerType* thisPtr) { return aznumeric_cast(thisPtr->size()); })
->Attribute(AZ::Script::Attributes::Operator, AZ::Script::Attributes::OperatorType::Length)
->Method("GetKeys", &GetKeys)
->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
+ ->Method("GetSize", [](ContainerType& thisPtr) { return aznumeric_cast(thisPtr.size()); })
+ ->Attribute(AZ::ScriptCanvasAttributes::ExplicitOverloadCrc, ExplicitOverloadInfo("Get Size", "Containers"))
+ ->Attribute(AZ::Script::Attributes::TreatAsMemberFunction, AZ::AttributeIsValid::IfPresent)
->Method("Reserve", static_cast(&ContainerType::reserve))
->Method("Swap", &Swap)
+ ->Method("Clear", [](ContainerType& thisContainer)->ContainerType& { thisContainer.clear(); return thisContainer; })
+ ->Attribute(AZ::Script::Attributes::TreatAsMemberFunction, AZ::AttributeIsValid::IfPresent)
+ ->Attribute(AZ::ScriptCanvasAttributes::ExplicitOverloadCrc, ExplicitOverloadInfo("Clear All Elements", "Containers"))
+ ->Attribute(AZ::ScriptCanvasAttributes::OverloadArgumentGroup, AZ::OverloadArgumentGroupInfo({ "ContainerGroup" }, { "ContainerGroup" }))
+ ->Method(k_iteratorConstructorName, &Iterate_VM)
+ ;
+
+ behaviorContext->Class()
+ ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::ListOnly)
+ ->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::ScriptOwn)
+ ->Method(k_iteratorGetKeyName, &ValueIteratorType::GetKeyUnchecked)
+ ->Method(k_iteratorModValueName, &ValueIteratorType::ModValueUnchecked)
+ ->Method(k_iteratorIsNotAtEndName, &ValueIteratorType::IsNotAtEnd)
+ ->Method(k_iteratorNextName, &ValueIteratorType::Next)
;
}
}
-
};
template <>
diff --git a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.cpp b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.cpp
index 635d160434..31a2cfc09e 100644
--- a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.cpp
+++ b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.cpp
@@ -165,7 +165,7 @@ namespace AZ
if (HasResult() != overload->HasResult())
{
- AZ_Error("Reflection", false, "Overload failure, all methods must have the same result, or none at all");
+ AZ_Error("Reflection", false, "Overload failure, all methods must have the same result, or none at all: %s", m_name.c_str());
return false;
}
@@ -176,7 +176,7 @@ namespace AZ
if (!(methodResult->m_typeId == overloadResult->m_typeId && methodResult->m_traits == overloadResult->m_traits))
{
- AZ_Error("Reflection", false, "Overload failure, all methods must have the same result, or none at all");
+ AZ_Error("Reflection", false, "Overload failure, all methods must have the same result, or none at all: %s", m_name.c_str());
return false;
}
}
@@ -575,7 +575,7 @@ namespace AZ
}
else
{
- AZ_Error("BehaviorContext", false, "safety check declared for method %s but it was not found in the class");
+ AZ_Error("BehaviorContext", false, "Method: %s, declared safety check: %s, but it was not found in class: %s", method.m_name.c_str(), m_name.c_str(), checkedOperationInfo.m_safetyCheckName.c_str());
}
}
}
diff --git a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContextUtilities.cpp b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContextUtilities.cpp
index c64b86ae0f..f6aac0fa16 100644
--- a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContextUtilities.cpp
+++ b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContextUtilities.cpp
@@ -34,10 +34,17 @@ namespace BehaviorContextUtilitiesCPP
using argument_type = const BehaviorParameter*;
using result_type = size_t;
result_type operator()(const argument_type& value) const
- {
- result_type result = AZStd::hash()(value->m_typeId);
- AZStd::hash_combine(result, CleanTraits(value->m_traits));
- return result;
+ {
+ if (value)
+ {
+ result_type result = AZStd::hash()(value->m_typeId);
+ AZStd::hash_combine(result, CleanTraits(value->m_traits));
+ return result;
+ }
+ else
+ {
+ return 0;
+ }
}
};
@@ -45,7 +52,11 @@ namespace BehaviorContextUtilitiesCPP
{
bool operator()(const BehaviorParameter* left, const BehaviorParameter* right) const
{
- return left->m_typeId == right->m_typeId && CleanTraits(left->m_traits) == CleanTraits(right->m_traits);
+ return (left == nullptr && right == nullptr)
+ || (left != nullptr
+ && right != nullptr
+ && left->m_typeId == right->m_typeId
+ && CleanTraits(left->m_traits) == CleanTraits(right->m_traits));
}
};
@@ -137,7 +148,7 @@ namespace AZ
for (size_t argIndex = 0, argSentinel = overload.GetNumArguments(); argIndex < argSentinel; ++argIndex)
{
auto overloadedArgIter = variance.m_input.find(argIndex);
- if (overloadedArgIter != variance.m_input.end())
+ if (overloadedArgIter != variance.m_input.end() && overloadedArgIter->second[overloadIndex])
{
// if this doesn't work try the type name
overloadName += ReplaceCppArtifacts(overloadedArgIter->second[overloadIndex]->m_name);
@@ -185,16 +196,24 @@ namespace AZ
{
auto argument = overloads[overloadIndex].first->GetArgument(0);
- const bool isThisPointer
- = (argument->m_traits & AZ::BehaviorParameter::Traits::TR_THIS_PTR) != 0
- || AZ::FindAttribute(AZ::Script::Attributes::TreatAsMemberFunction, overloads[overloadIndex].first->m_attributes);
+ if (argument)
+ {
+ const bool isThisPointer
+ = (argument->m_traits & AZ::BehaviorParameter::Traits::TR_THIS_PTR) != 0
+ || AZ::FindAttribute(AZ::Script::Attributes::TreatAsMemberFunction, overloads[overloadIndex].first->m_attributes);
- oneArgIsThisPointer = oneArgIsThisPointer || isThisPointer;
+ oneArgIsThisPointer = oneArgIsThisPointer || isThisPointer;
+ }
types.insert(argument);
stripedArgs.emplace_back(argument);
}
+ if (types.size() == overloads.size())
+ {
+ variance.m_unambiguousInput.insert(0);
+ }
+
if (types.size() > 1 && (onThis == VariantOnThis::Yes || !oneArgIsThisPointer))
{
variance.m_input.insert(AZStd::make_pair(0, stripedArgs));
@@ -210,11 +229,15 @@ namespace AZ
for (size_t overloadIndex = 0, overloadSentinel = overloads.size(); overloadIndex < overloadSentinel; ++overloadIndex)
{
auto argument = overloads[overloadIndex].first->GetArgument(argIndex);
-
types.insert(argument);
stripedArgs.emplace_back(argument);
}
+ if (types.size() == overloads.size())
+ {
+ variance.m_unambiguousInput.insert(0);
+ }
+
if (types.size() > 1)
{
variance.m_input.insert(AZStd::make_pair(argIndex, stripedArgs));
diff --git a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContextUtilities.h b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContextUtilities.h
index 4663635cdf..0dc9ecc969 100644
--- a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContextUtilities.h
+++ b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContextUtilities.h
@@ -27,6 +27,8 @@ namespace AZ
struct OverloadVariance
{
AZStd::unordered_map> m_input;
+ // the indices of inputs that make selection of overload unambiguous
+ AZStd::unordered_set m_unambiguousInput;
AZStd::vector m_output;
};
diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp b/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp
index ac1e61a5aa..9bf6247e97 100644
--- a/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp
+++ b/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp
@@ -2048,10 +2048,6 @@ LUA_API const Node* lua_getDummyNode()
return true;
}
- else
- {
- AZ_Warning("Script", false, "Index %d is not a function!", functionIndex);
- }
return false;
}
@@ -2078,7 +2074,6 @@ LUA_API const Node* lua_getDummyNode()
}
else
{
- AZ_Warning("Script", lua_isnil(m_nativeContext, -1), "Name %s exists but is not a function!", functionName);
lua_pop(m_nativeContext, 1);
}
@@ -5888,7 +5883,6 @@ LUA_API const Node* lua_getDummyNode()
else
{
lua_pop(m_impl->m_lua, 1);
- AZ_Warning("Script", false, "%s is not a function!", functionName);
}
return false;
}
@@ -5906,7 +5900,6 @@ LUA_API const Node* lua_getDummyNode()
else
{
lua_pop(m_impl->m_lua, 1);
- AZ_Warning("Script", false, "CacheIndex %d is not a function!", cachedIndex);
}
return false;
}
diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptSystemComponent.cpp b/Code/Framework/AzCore/AzCore/Script/ScriptSystemComponent.cpp
index 015554538f..11d4db2e07 100644
--- a/Code/Framework/AzCore/AzCore/Script/ScriptSystemComponent.cpp
+++ b/Code/Framework/AzCore/AzCore/Script/ScriptSystemComponent.cpp
@@ -937,7 +937,7 @@ void ScriptSystemComponent::Reflect(ReflectContext* reflection)
->Enum(PlatformID::PLATFORM_LINUX_64)>("Linux")
->Enum(PlatformID::PLATFORM_ANDROID_64)>("Android64")
->Enum(PlatformID::PLATFORM_APPLE_IOS)>("iOS")
- ->Enum(PlatformID::PLATFORM_APPLE_OSX)>("OSX")
+ ->Enum(PlatformID::PLATFORM_APPLE_MAC)>("Mac")
#if defined(AZ_EXPAND_FOR_RESTRICTED_PLATFORM) || defined(AZ_TOOLS_EXPAND_FOR_RESTRICTED_PLATFORMS)
#define AZ_RESTRICTED_PLATFORM_EXPANSION(CodeName, CODENAME, codename, PrivateName, PRIVATENAME, privatename, PublicName, PUBLICNAME, publicname, PublicAuxName1, PublicAuxName2, PublicAuxName3)\
->Enum(PlatformID::PLATFORM_##PUBLICNAME)>(#CodeName)
diff --git a/Code/Framework/AzCore/AzCore/Serialization/EditContextConstants.inl b/Code/Framework/AzCore/AzCore/Serialization/EditContextConstants.inl
index 1016027966..dfd0707ed2 100644
--- a/Code/Framework/AzCore/AzCore/Serialization/EditContextConstants.inl
+++ b/Code/Framework/AzCore/AzCore/Serialization/EditContextConstants.inl
@@ -123,6 +123,7 @@ namespace AZ
const static AZ::Crc32 NameLabelOverride = AZ_CRC("NameLabelOverride", 0x9ff79cab);
const static AZ::Crc32 AssetPickerTitle = AZ_CRC_CE("AssetPickerTitle");
+ const static AZ::Crc32 HideProductFilesInAssetPicker = AZ_CRC_CE("HideProductFilesInAssetPicker");
const static AZ::Crc32 ChildNameLabelOverride = AZ_CRC("ChildNameLabelOverride", 0x73dd2909);
//! Container attribute that is used to override labels for its elements given the index of the element
const static AZ::Crc32 IndexedChildNameLabelOverride = AZ_CRC("IndexedChildNameLabelOverride", 0x5f313ac2);
diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp
index 93d12acba3..9c4641741e 100644
--- a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp
+++ b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonDeserializer.cpp
@@ -10,6 +10,7 @@
*
*/
+#include "AzCore/RTTI/TypeInfo.h"
#include
#include
#include
@@ -61,6 +62,13 @@ namespace AZ
if (classData->m_azRtti && classData->m_azRtti->GetGenericTypeId() != typeId)
{
+ if (((classData->m_azRtti->GetTypeTraits() & (AZ::TypeTraits::is_signed | AZ::TypeTraits::is_unsigned)) != AZ::TypeTraits{0}) &&
+ context.GetSerializeContext()->GetUnderlyingTypeId(typeId) == classData->m_typeId)
+ {
+ // This value is from an enum, where a field has been reflected using ClassBuilder::Field, but the enum
+ // type itself has not been reflected using EnumBuilder. Treat it as an enum.
+ return LoadEnum(object, *classData, value, context);
+ }
serializer = context.GetRegistrationContext()->GetSerializerForType(classData->m_azRtti->GetGenericTypeId());
if (serializer)
{
@@ -77,21 +85,18 @@ namespace AZ
{
return LoadEnum(object, *classData, value, context);
}
- else if (classData->m_container)
+ if (classData->m_container)
{
return context.Report(Tasks::ReadField, Outcomes::Unsupported,
"The Json Serializer uses custom serializers to load containers. If this message is encountered "
"then a serializer for the target containers is missing, isn't registered or doesn't exist.");
}
- else if (value.IsObject())
+ if (value.IsObject())
{
return LoadClass(object, *classData, value, context);
}
- else
- {
- return context.Report(Tasks::ReadField, Outcomes::Unsupported,
- AZStd::string::format("Reading into targets of type '%s' is not supported.", classData->m_name));
- }
+ return context.Report(Tasks::ReadField, Outcomes::Unsupported,
+ AZStd::string::format("Reading into targets of type '%s' is not supported.", classData->m_name));
}
JsonSerializationResult::ResultCode JsonDeserializer::LoadToPointer(void* object, const Uuid& typeId,
@@ -233,8 +238,16 @@ namespace AZ
AZ::TypeId underlyingTypeId = AZ::TypeId::CreateNull();
if (!attributeReader.Read(underlyingTypeId))
{
- return context.Report(Tasks::RetrieveInfo, Outcomes::Unknown,
- "Unable to find underlying type of enum in class data.");
+ // for non-reflected enums, the passed-in classData already represents the enum's underlying type
+ if (context.GetSerializeContext()->GetUnderlyingTypeId(classData.m_typeId) == classData.m_typeId)
+ {
+ underlyingTypeId = classData.m_typeId;
+ }
+ else
+ {
+ return context.Report(Tasks::RetrieveInfo, Outcomes::Unknown,
+ "Unable to find underlying type of enum in class data.");
+ }
}
const SerializeContext::ClassData* underlyingClassData = context.GetSerializeContext()->FindClassData(underlyingTypeId);
diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryImpl.cpp b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryImpl.cpp
index 2421c75be3..3dd4931374 100644
--- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryImpl.cpp
+++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryImpl.cpp
@@ -14,6 +14,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -880,6 +881,13 @@ namespace AZ
const Specializations& specializations, const rapidjson::Pointer& historyPointer, AZStd::string_view folderPath)
{
using namespace rapidjson;
+
+ if (&lhs == &rhs)
+ {
+ // Early return to avoid setting the collisionFound reference to true
+ // std::sort is allowed to pass in the same memory address for the left and right elements
+ return false;
+ }
AZ_Assert(!lhs.m_tags.empty(), "Comparing a settings file without at least a name tag.");
AZ_Assert(!rhs.m_tags.empty(), "Comparing a settings file without at least a name tag.");
@@ -1054,15 +1062,23 @@ namespace AZ
jsonPatch.ParseInsitu(scratchBuffer.data());
if (jsonPatch.HasParseError())
{
+ auto nativeUI = AZ::Interface::Get();
if (jsonPatch.GetParseError() == rapidjson::kParseErrorDocumentEmpty)
{
- AZ_Warning("Settings Registry", false, R"(Unable to parse registry file "%s" due to json error "%s" at offset %llu.)",
+ AZ_Warning("Settings Registry", false, R"(Unable to parse registry file "%s" due to json error "%s" at offset %zu.)",
path, GetParseError_En(jsonPatch.GetParseError()), jsonPatch.GetErrorOffset());
}
else
{
- AZ_Error("Settings Registry", false, R"(Unable to parse registry file "%s" due to json error "%s" at offset %llu.)", path,
+ using ErrorString = AZStd::fixed_string<4096>;
+ auto jsonError = ErrorString::format(R"(Unable to parse registry file "%s" due to json error "%s" at offset %zu.)", path,
GetParseError_En(jsonPatch.GetParseError()), jsonPatch.GetErrorOffset());
+ AZ_Error("Settings Registry", false, "%s", jsonError.c_str());
+
+ if (nativeUI)
+ {
+ nativeUI->DisplayOkDialog("Setreg(Patch) Merge Issue", AZStd::string_view(jsonError), false);
+ }
}
pointer.Create(m_settings, m_settings.GetAllocator()).SetObject()
diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp
index 82bf1db484..2abef3f808 100644
--- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp
+++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp
@@ -88,6 +88,35 @@ namespace AZ::Internal
m_enginePaths.emplace_back(EngineInfo{AZ::IO::FixedMaxPath{value}.LexicallyNormal(), {}});
}
+ AZ::SettingsRegistryInterface::VisitResponse Traverse(
+ [[maybe_unused]] AZStd::string_view path, AZStd::string_view valueName,
+ AZ::SettingsRegistryInterface::VisitAction action, AZ::SettingsRegistryInterface::Type type) override
+ {
+ auto response = AZ::SettingsRegistryInterface::VisitResponse::Continue;
+ if (action == AZ::SettingsRegistryInterface::VisitAction::Begin)
+ {
+ if (type == AZ::SettingsRegistryInterface::Type::Array)
+ {
+ if (valueName.compare("engines") != 0)
+ {
+ response = AZ::SettingsRegistryInterface::VisitResponse::Skip;
+ }
+ }
+ }
+ else if (action == AZ::SettingsRegistryInterface::VisitAction::Value)
+ {
+ if (type == AZ::SettingsRegistryInterface::Type::String)
+ {
+ if (valueName.compare("path") != 0)
+ {
+ response = AZ::SettingsRegistryInterface::VisitResponse::Skip;
+ }
+ }
+ }
+
+ return response;
+ }
+
AZStd::vector m_enginePaths{};
};
@@ -494,13 +523,6 @@ namespace AZ::SettingsRegistryMergeUtils
return configFileParsed;
}
- void MergeSettingsToRegistry_Bootstrap(SettingsRegistryInterface& registry)
- {
- ConfigParserSettings parserSettings;
- parserSettings.m_registryRootPointerPath = BootstrapSettingsRootKey;
- MergeSettingsToRegistry_ConfigFile(registry, "bootstrap.cfg", parserSettings);
- }
-
void MergeSettingsToRegistry_AddRuntimeFilePaths(SettingsRegistryInterface& registry)
{
using FixedValueString = AZ::SettingsRegistryInterface::FixedValueString;
diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.h b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.h
index 576066c29f..b482530d24 100644
--- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.h
+++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.h
@@ -172,9 +172,6 @@ namespace AZ::SettingsRegistryMergeUtils
bool MergeSettingsToRegistry_ConfigFile(SettingsRegistryInterface& registry, AZStd::string_view filePath,
const ConfigParserSettings& configParserSettings);
- //! Loads bootstrap.cfg into the Settings Registry. This file does not support specializations.
- void MergeSettingsToRegistry_Bootstrap(SettingsRegistryInterface& registry);
-
//! Extracts file path information from the environment and bootstrap to calculate the various file paths and adds those
//! to the Settings Registry under the FilePathsRootKey.
void MergeSettingsToRegistry_AddRuntimeFilePaths(SettingsRegistryInterface& registry);
diff --git a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Utils/Utils_UnixLike.cpp b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Utils/Utils_UnixLike.cpp
index 9dbe8f7264..7fd8a639c3 100644
--- a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Utils/Utils_UnixLike.cpp
+++ b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Utils/Utils_UnixLike.cpp
@@ -41,10 +41,6 @@ namespace AZ
if (const char* homePath = std::getenv("HOME"); homePath != nullptr)
{
AZ::IO::FixedMaxPath path{homePath};
- if (!path.empty())
- {
- path /= ".o3de";
- }
return path.Native();
}
return {};
diff --git a/Code/Framework/AzCore/Platform/Mac/AzCore/PlatformId/PlatformId_Mac.h b/Code/Framework/AzCore/Platform/Mac/AzCore/PlatformId/PlatformId_Mac.h
index d361e79f05..42dcd3e2f7 100644
--- a/Code/Framework/AzCore/Platform/Mac/AzCore/PlatformId/PlatformId_Mac.h
+++ b/Code/Framework/AzCore/Platform/Mac/AzCore/PlatformId/PlatformId_Mac.h
@@ -13,5 +13,5 @@
namespace AZ
{
- static const PlatformID g_currentPlatform = PlatformID::PLATFORM_APPLE_OSX;
+ static const PlatformID g_currentPlatform = PlatformID::PLATFORM_APPLE_MAC;
}
diff --git a/Code/Framework/AzCore/Platform/iOS/AzCore/Module/DynamicModuleHandle_iOS.cpp b/Code/Framework/AzCore/Platform/iOS/AzCore/Module/DynamicModuleHandle_iOS.cpp
index 53514c89e4..a389162ccc 100644
--- a/Code/Framework/AzCore/Platform/iOS/AzCore/Module/DynamicModuleHandle_iOS.cpp
+++ b/Code/Framework/AzCore/Platform/iOS/AzCore/Module/DynamicModuleHandle_iOS.cpp
@@ -40,7 +40,7 @@ namespace AZ
// Afterwards use the AZ::IO::Path Append function append the filename as a child
// of the framework directory
AZ::IO::FixedMaxPathString fileName{ fullPath.Filename().Native() };
- fullPath.ReplaceFilename(AZ::IO::PathView((fileName + ".framework").c_str()));
+ fullPath.ReplaceFilename(AZ::IO::PathView(AZStd::string_view(fileName + ".framework")));
fullPath /= fileName;
}
}
diff --git a/Code/Framework/AzCore/Tests/AZTestShared/Math/MathTestHelpers.cpp b/Code/Framework/AzCore/Tests/AZTestShared/Math/MathTestHelpers.cpp
index 42b77f6976..f9616702f1 100644
--- a/Code/Framework/AzCore/Tests/AZTestShared/Math/MathTestHelpers.cpp
+++ b/Code/Framework/AzCore/Tests/AZTestShared/Math/MathTestHelpers.cpp
@@ -68,7 +68,7 @@ namespace AZ
return os
<< "translation: " << transform.GetTranslation()
<< " rotation: " << transform.GetRotation()
- << " scale: " << transform.GetScale();
+ << " scale: " << transform.GetUniformScale();
}
std::ostream& operator<<(std::ostream& os, const Color& color)
diff --git a/Code/Framework/AzCore/Tests/AZTestShared/Utils/Utils.cpp b/Code/Framework/AzCore/Tests/AZTestShared/Utils/Utils.cpp
index 38b9cd609b..9c6f85f08a 100644
--- a/Code/Framework/AzCore/Tests/AZTestShared/Utils/Utils.cpp
+++ b/Code/Framework/AzCore/Tests/AZTestShared/Utils/Utils.cpp
@@ -31,6 +31,8 @@ namespace UnitTest
ErrorHandler::ErrorHandler(const char* errorPattern)
: m_errorCount(0)
, m_warningCount(0)
+ , m_expectedErrorCount(0)
+ , m_expectedWarningCount(0)
, m_errorPattern(errorPattern)
{
AZ::Debug::TraceMessageBus::Handler::BusConnect();
@@ -51,6 +53,16 @@ namespace UnitTest
return m_warningCount;
}
+ int ErrorHandler::GetExpectedErrorCount() const
+ {
+ return m_expectedErrorCount;
+ }
+
+ int ErrorHandler::GetExpectedWarningCount() const
+ {
+ return m_expectedWarningCount;
+ }
+
bool ErrorHandler::SuppressExpectedErrors([[maybe_unused]] const char* window, const char* message)
{
return AZStd::string(message).find(m_errorPattern) != AZStd::string::npos;
@@ -61,7 +73,9 @@ namespace UnitTest
[[maybe_unused]] const char* func, const char* message)
{
m_errorCount++;
- return SuppressExpectedErrors(window, message);
+ bool suppress = SuppressExpectedErrors(window, message);
+ m_expectedErrorCount += suppress;
+ return suppress;
}
bool ErrorHandler::OnPreWarning(
@@ -69,7 +83,9 @@ namespace UnitTest
[[maybe_unused]] const char* func, const char* message)
{
m_warningCount++;
- return SuppressExpectedErrors(window, message);
+ bool suppress = SuppressExpectedErrors(window, message);
+ m_expectedWarningCount += suppress;
+ return suppress;
}
bool ErrorHandler::OnPrintf(const char* window, const char* message)
diff --git a/Code/Framework/AzCore/Tests/AZTestShared/Utils/Utils.h b/Code/Framework/AzCore/Tests/AZTestShared/Utils/Utils.h
index 044c3d1111..56ef340d22 100644
--- a/Code/Framework/AzCore/Tests/AZTestShared/Utils/Utils.h
+++ b/Code/Framework/AzCore/Tests/AZTestShared/Utils/Utils.h
@@ -30,8 +30,14 @@ namespace UnitTest
public:
explicit ErrorHandler(const char* errorPattern);
~ErrorHandler();
+ //! Returns the total number of errors encountered (including those which match the expected pattern).
int GetErrorCount() const;
+ //! Returns the total number of warnings encountered (including those which match the expected pattern).
int GetWarningCount() const;
+ //! Returns the number of errors encountered which matched the expected pattern.
+ int GetExpectedErrorCount() const;
+ //! Returns the number of warnings encountered which matched the expected pattern.
+ int GetExpectedWarningCount() const;
bool SuppressExpectedErrors(const char* window, const char* message);
// AZ::Debug::TraceMessageBus
@@ -44,6 +50,8 @@ namespace UnitTest
AZStd::string m_errorPattern;
int m_errorCount;
int m_warningCount;
+ int m_expectedErrorCount;
+ int m_expectedWarningCount;
};
}
diff --git a/Code/Framework/AzCore/Tests/Math/MathTestData.h b/Code/Framework/AzCore/Tests/Math/MathTestData.h
index cd3ade7854..c82c5caea7 100644
--- a/Code/Framework/AzCore/Tests/Math/MathTestData.h
+++ b/Code/Framework/AzCore/Tests/Math/MathTestData.h
@@ -61,8 +61,8 @@ namespace MathTestData
};
static const AZ::Transform NonOrthogonalTransforms[] = {
- AZ::Transform::CreateScale(AZ::Vector3(2.4f, 0.3f, 1.7f)),
- AZ::Transform::CreateRotationX(2.2f) * AZ::Transform::CreateScale(AZ::Vector3(0.2f, 0.8f, 1.4f))
+ AZ::Transform::CreateUniformScale(2.4f),
+ AZ::Transform::CreateRotationX(2.2f) * AZ::Transform::CreateUniformScale(0.8f)
};
static const AZ::Transform OrthogonalTransforms[] = {
diff --git a/Code/Framework/AzCore/Tests/Math/ObbTests.cpp b/Code/Framework/AzCore/Tests/Math/ObbTests.cpp
index a90d66f288..de267b4265 100644
--- a/Code/Framework/AzCore/Tests/Math/ObbTests.cpp
+++ b/Code/Framework/AzCore/Tests/Math/ObbTests.cpp
@@ -59,11 +59,11 @@ namespace UnitTest
TEST(MATH_Obb, TestScaleTransform)
{
Obb obb = Obb::CreateFromPositionRotationAndHalfLengths(position, rotation, halfLengths);
- Vector3 scaleFactors = Vector3(1.0f, 2.0f, 3.0f);
- Transform transform = Transform::CreateScale(scaleFactors);
+ float scale = 3.0f;
+ Transform transform = Transform::CreateUniformScale(scale);
obb = transform * obb;
- EXPECT_THAT(obb.GetPosition(), IsClose(Vector3(1.0f, 4.0f, 9.0f)));
- EXPECT_THAT(obb.GetHalfLengths(), IsClose(Vector3(0.5f, 1.0f, 1.5f)));
+ EXPECT_THAT(obb.GetPosition(), IsClose(Vector3(3.0f, 6.0f, 9.0f)));
+ EXPECT_THAT(obb.GetHalfLengths(), IsClose(Vector3(1.5f, 1.5f, 1.5f)));
}
TEST(MATH_Obb, TestSetPosition)
diff --git a/Code/Framework/AzCore/Tests/Math/RandomTests.cpp b/Code/Framework/AzCore/Tests/Math/RandomTests.cpp
new file mode 100644
index 0000000000..7fe3acff54
--- /dev/null
+++ b/Code/Framework/AzCore/Tests/Math/RandomTests.cpp
@@ -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.
+*
+*/
+
+#include
+#include
+
+using namespace AZ;
+
+namespace UnitTest
+{
+ TEST(MATH_Random, GetHaltonNumber)
+ {
+ EXPECT_FLOAT_EQ(0.5, GetHaltonNumber(1, 2));
+ EXPECT_FLOAT_EQ(898.0f / 2187.0f, GetHaltonNumber(1234, 3));
+ EXPECT_FLOAT_EQ(5981.0f / 15625.0f, GetHaltonNumber(4321, 5));
+ }
+
+ TEST(MATH_Random, HaltonSequenceStandard)
+ {
+ HaltonSequence<3> sequence({ 2, 3, 5 });
+ auto regularSequence = sequence.GetHaltonSequence<5>();
+
+ EXPECT_FLOAT_EQ(1.0f / 2.0f, regularSequence[0][0]);
+ EXPECT_FLOAT_EQ(1.0f / 3.0f, regularSequence[0][1]);
+ EXPECT_FLOAT_EQ(1.0f / 5.0f, regularSequence[0][2]);
+
+ EXPECT_FLOAT_EQ(1.0f / 4.0f, regularSequence[1][0]);
+ EXPECT_FLOAT_EQ(2.0f / 3.0f, regularSequence[1][1]);
+ EXPECT_FLOAT_EQ(2.0f / 5.0f, regularSequence[1][2]);
+
+ EXPECT_FLOAT_EQ(3.0f / 4.0f, regularSequence[2][0]);
+ EXPECT_FLOAT_EQ(1.0f / 9.0f, regularSequence[2][1]);
+ EXPECT_FLOAT_EQ(3.0f / 5.0f, regularSequence[2][2]);
+
+ EXPECT_FLOAT_EQ(1.0f / 8.0f, regularSequence[3][0]);
+ EXPECT_FLOAT_EQ(4.0f / 9.0f, regularSequence[3][1]);
+ EXPECT_FLOAT_EQ(4.0f / 5.0f, regularSequence[3][2]);
+
+ EXPECT_FLOAT_EQ(5.0f / 8.0f, regularSequence[4][0]);
+ EXPECT_FLOAT_EQ(7.0f / 9.0f, regularSequence[4][1]);
+ EXPECT_FLOAT_EQ(1.0f / 25.0f, regularSequence[4][2]);
+ }
+
+ TEST(MATH_Random, HaltonSequenceOffsets)
+ {
+ HaltonSequence<3> sequence({ 2, 3, 5 });
+ sequence.SetOffsets({ 1, 2, 3 });
+ auto offsetSequence = sequence.GetHaltonSequence<2>();
+
+ EXPECT_FLOAT_EQ(1.0f / 4.0f, offsetSequence[0][0]);
+ EXPECT_FLOAT_EQ(1.0f / 9.0f, offsetSequence[0][1]);
+ EXPECT_FLOAT_EQ(4.0f / 5.0f, offsetSequence[0][2]);
+
+ EXPECT_FLOAT_EQ(3.0f / 4.0f, offsetSequence[1][0]);
+ EXPECT_FLOAT_EQ(4.0f / 9.0f, offsetSequence[1][1]);
+ EXPECT_FLOAT_EQ(1.0f / 25.0f, offsetSequence[1][2]);
+ }
+
+ TEST(MATH_Random, HaltonSequenceIncrements)
+ {
+ HaltonSequence<3> sequence({ 2, 3, 5 });
+ sequence.SetOffsets({ 1, 2, 3 });
+ sequence.SetIncrements({ 1, 2, 3 });
+ auto incrementedSequence = sequence.GetHaltonSequence<2>();
+
+ EXPECT_FLOAT_EQ(1.0f / 4.0f, incrementedSequence[0][0]);
+ EXPECT_FLOAT_EQ(1.0f / 9.0f, incrementedSequence[0][1]);
+ EXPECT_FLOAT_EQ(4.0f / 5.0f, incrementedSequence[0][2]);
+
+ EXPECT_FLOAT_EQ(3.0f / 4.0f, incrementedSequence[1][0]);
+ EXPECT_FLOAT_EQ(7.0f / 9.0f, incrementedSequence[1][1]);
+ EXPECT_FLOAT_EQ(11.0f / 25.0f, incrementedSequence[1][2]);
+ }
+
+ TEST(MATH_Random, FillHaltonSequence)
+ {
+ HaltonSequence<3> sequence({ 2, 3, 5 });
+ auto regularSequence = sequence.GetHaltonSequence<5>();
+
+ struct Point
+ {
+ Point() = default;
+ Point(AZStd::array arr)
+ :x(arr[0])
+ ,y(arr[1])
+ ,z(arr[2])
+ {}
+
+ float x = 0.0f;
+ float y = 0.0f;
+ float z = 0.0f;
+ };
+
+ AZStd::array ownedContainer;
+ sequence.FillHaltonSequence(ownedContainer.begin(), ownedContainer.end());
+
+ for (size_t i = 0; i < regularSequence.size(); ++i)
+ {
+ EXPECT_FLOAT_EQ(regularSequence[i][0], ownedContainer[i].x);
+ EXPECT_FLOAT_EQ(regularSequence[i][1], ownedContainer[i].y);
+ EXPECT_FLOAT_EQ(regularSequence[i][2], ownedContainer[i].z);
+ }
+ }
+
+}
diff --git a/Code/Framework/AzCore/Tests/Math/TransformPerformanceTests.cpp b/Code/Framework/AzCore/Tests/Math/TransformPerformanceTests.cpp
index 400a845913..943aba9b76 100644
--- a/Code/Framework/AzCore/Tests/Math/TransformPerformanceTests.cpp
+++ b/Code/Framework/AzCore/Tests/Math/TransformPerformanceTests.cpp
@@ -180,13 +180,13 @@ namespace Benchmark
}
}
- BENCHMARK_F(BM_MathTransform, CreateScale)(benchmark::State& state)
+ BENCHMARK_F(BM_MathTransform, CreateUniformScale)(benchmark::State& state)
{
for (auto _ : state)
{
for (auto& testData : m_testDataArray)
{
- AZ::Transform result = AZ::Transform::CreateScale(testData.v3);
+ AZ::Transform result = AZ::Transform::CreateUniformScale(testData.value[0]);
benchmark::DoNotOptimize(result);
}
}
@@ -344,39 +344,39 @@ namespace Benchmark
}
}
- BENCHMARK_F(BM_MathTransform, GetScale)(benchmark::State& state)
+ BENCHMARK_F(BM_MathTransform, GetUniformScale)(benchmark::State& state)
{
for (auto _ : state)
{
for (auto& testData : m_testDataArray)
{
- AZ::Vector3 result = testData.t1.GetScale();
+ float result = testData.t1.GetUniformScale();
benchmark::DoNotOptimize(result);
}
}
}
- BENCHMARK_F(BM_MathTransform, SetScale)(benchmark::State& state)
+ BENCHMARK_F(BM_MathTransform, SetUniformScale)(benchmark::State& state)
{
for (auto _ : state)
{
for (auto& testData : m_testDataArray)
{
AZ::Transform testTransform = testData.t2;
- testTransform.SetScale(testData.v3);
+ testTransform.SetUniformScale(testData.value[0]);
benchmark::DoNotOptimize(testTransform);
}
}
}
- BENCHMARK_F(BM_MathTransform, ExtractScale)(benchmark::State& state)
+ BENCHMARK_F(BM_MathTransform, ExtractUniformScale)(benchmark::State& state)
{
for (auto _ : state)
{
for (auto& testData : m_testDataArray)
{
AZ::Transform testTransform = testData.t2;
- AZ::Vector3 result = testTransform.ExtractScale();
+ float result = testTransform.ExtractUniformScale();
benchmark::DoNotOptimize(result);
}
}
diff --git a/Code/Framework/AzCore/Tests/Math/TransformTests.cpp b/Code/Framework/AzCore/Tests/Math/TransformTests.cpp
index d0343211c3..529347f31d 100644
--- a/Code/Framework/AzCore/Tests/Math/TransformTests.cpp
+++ b/Code/Framework/AzCore/Tests/Math/TransformTests.cpp
@@ -159,37 +159,14 @@ namespace UnitTest
INSTANTIATE_TEST_CASE_P(MATH_Transform, TransformCreateFromQuaternionFixture, ::testing::ValuesIn(MathTestData::UnitQuaternions));
- using TransformCreateFromMatrix3x3Fixture = ::testing::TestWithParam;
-
- TEST_P(TransformCreateFromMatrix3x3Fixture, CreateFromMatrix3x3)
+ TEST(MATH_Transform, CreateUniformScale)
{
- const AZ::Matrix3x3 matrix3x3 = GetParam();
- const AZ::Transform transform = AZ::Transform::CreateFromMatrix3x3(matrix3x3);
- EXPECT_THAT(transform.GetTranslation(), IsClose(AZ::Vector3::CreateZero()));
- const AZ::Vector3 vector(2.3f, -0.6, 1.8f);
- EXPECT_THAT(transform.TransformPoint(vector), IsClose(matrix3x3 * vector));
- }
-
- TEST_P(TransformCreateFromMatrix3x3Fixture, CreateFromMatrix3x3AndTranslation)
- {
- const AZ::Matrix3x3 matrix3x3 = GetParam();
- const AZ::Vector3 translation(-2.6f, 1.7f, 0.8f);
- const AZ::Transform transform = AZ::Transform::CreateFromMatrix3x3AndTranslation(matrix3x3, translation);
- EXPECT_THAT(transform.GetTranslation(), IsClose(translation));
- const AZ::Vector3 vector(2.3f, -0.6, 1.8f);
- EXPECT_THAT(transform.TransformPoint(vector), IsClose(matrix3x3 * vector + translation));
- }
-
- INSTANTIATE_TEST_CASE_P(MATH_Transform, TransformCreateFromMatrix3x3Fixture, ::testing::ValuesIn(MathTestData::Matrix3x3s));
-
- TEST(MATH_Transform, CreateScale)
- {
- const AZ::Vector3 scale(1.7f, 0.3f, 2.4f);
- const AZ::Transform transform = AZ::Transform::CreateScale(scale);
+ const float scale = 1.7f;
+ const AZ::Transform transform = AZ::Transform::CreateUniformScale(scale);
const AZ::Vector3 vector(0.2f, -1.6f, 0.4f);
EXPECT_THAT(transform.GetTranslation(), IsClose(AZ::Vector3::CreateZero()));
const AZ::Vector3 transformedVector = transform.TransformPoint(vector);
- const AZ::Vector3 expected(0.34f, -0.48f, 0.96f);
+ const AZ::Vector3 expected(0.34f, -2.72f, 0.68f);
EXPECT_THAT(transformedVector, IsClose(expected));
}
@@ -237,10 +214,10 @@ namespace UnitTest
TEST(MATH_Transform, MultiplyByTransform)
{
const AZ::Transform transform1 = AZ::Transform::CreateRotationY(0.3f);
- const AZ::Transform transform2 = AZ::Transform::CreateScale(AZ::Vector3(1.3f, 1.5f, 0.4f));
+ const AZ::Transform transform2 = AZ::Transform::CreateUniformScale(1.3f);
const AZ::Transform transform3 = AZ::Transform::CreateFromQuaternionAndTranslation(
AZ::Quaternion(0.42f, 0.46f, -0.66f, 0.42f), AZ::Vector3(2.8f, -3.7f, 1.6f));
- const AZ::Transform transform4 = AZ::Transform::CreateRotationX(-0.7f) * AZ::Transform::CreateScale(AZ::Vector3(0.6f, 1.3f, 0.7f));
+ const AZ::Transform transform4 = AZ::Transform::CreateRotationX(-0.7f) * AZ::Transform::CreateUniformScale(0.6f);
AZ::Transform transform5 = transform1;
transform5 *= transform4;
const AZ::Vector3 vector(1.9f, 2.3f, 0.2f);
@@ -254,14 +231,14 @@ namespace UnitTest
TEST(MATH_Transform, TranslationCorrectInTransformHierarchy)
{
AZ::Transform parent = AZ::Transform::CreateRotationZ(AZ::DegToRad(45.0f));
- parent.SetScale(AZ::Vector3(3.0f, 2.0f, 1.0f));
+ parent.SetUniformScale(3.0f);
parent.SetTranslation(AZ::Vector3(0.2f, 0.3f, 0.4f));
AZ::Transform child = AZ::Transform::CreateRotationZ(AZ::DegToRad(90.0f));
child.SetTranslation(AZ::Vector3(0.5f, 0.6f, 0.7f));
const AZ::Transform overallTransform = parent * child;
const AZ::Vector3 overallTranslation = overallTransform.GetTranslation();
- const AZ::Vector3 expectedTranslation(0.412132f, 2.20919f, 1.1f);
- EXPECT_THAT(overallTranslation, IsClose(AZ::Vector3(0.412132f, 2.20919f, 1.1f)));
+ const AZ::Vector3 expectedTranslation(-0.012132f, 2.633452f, 2.5f);
+ EXPECT_THAT(overallTranslation, IsClose(expectedTranslation));
}
TEST(MATH_Transform, TransformPointVector3)
@@ -337,14 +314,14 @@ namespace UnitTest
TEST_P(TransformScaleFixture, Scale)
{
const AZ::Transform orthogonalTransform = GetParam();
- EXPECT_THAT(orthogonalTransform.GetScale(), IsClose(AZ::Vector3::CreateOne()));
+ EXPECT_NEAR(orthogonalTransform.GetUniformScale(), 1.0f, AZ::Constants::Tolerance);
AZ::Transform unscaledTransform = orthogonalTransform;
- unscaledTransform.ExtractScale();
- EXPECT_THAT(unscaledTransform.GetScale(), IsClose(AZ::Vector3::CreateOne()));
- const AZ::Vector3 scale(2.8f, 0.7f, 1.3f);
+ unscaledTransform.ExtractUniformScale();
+ EXPECT_NEAR(unscaledTransform.GetUniformScale(), 1.0f, AZ::Constants::Tolerance);
+ const float scale = 2.8f;
AZ::Transform scaledTransform = orthogonalTransform;
- scaledTransform.MultiplyByScale(scale);
- EXPECT_THAT(scaledTransform.GetScale(), IsClose(scale));
+ scaledTransform.MultiplyByUniformScale(scale);
+ EXPECT_NEAR(scaledTransform.GetUniformScale(), scale, AZ::Constants::Tolerance);
}
INSTANTIATE_TEST_CASE_P(MATH_Transform, TransformScaleFixture, ::testing::ValuesIn(MathTestData::OrthogonalTransforms));
@@ -353,24 +330,11 @@ namespace UnitTest
{
EXPECT_TRUE(AZ::Transform::CreateIdentity().IsOrthogonal());
EXPECT_TRUE(AZ::Transform::CreateRotationZ(0.3f).IsOrthogonal());
- EXPECT_FALSE(AZ::Transform::CreateScale(AZ::Vector3(0.8f, 0.3f, 1.2f)).IsOrthogonal());
+ EXPECT_FALSE(AZ::Transform::CreateUniformScale(0.8f).IsOrthogonal());
EXPECT_TRUE(AZ::Transform::CreateFromQuaternion(AZ::Quaternion(-0.52f, -0.08f, 0.56f, 0.64f)).IsOrthogonal());
AZ::Transform transform;
transform.SetFromEulerRadians(AZ::Vector3(0.2f, 0.4f, 0.1f));
EXPECT_TRUE(transform.IsOrthogonal());
-
- // want to test each possible way the transform could fail to be orthogonal, which we can do by testing for one
- // axis, then using a rotation which cycles the axes
- const AZ::Transform axisCycle = AZ::Transform::CreateFromQuaternion(AZ::Quaternion(0.5f, 0.5f, 0.5f, 0.5f));
-
- // a transform which is normalized in 2 axes, but not the third
- AZ::Transform nonOrthogonalTransform1 = AZ::Transform::CreateScale(AZ::Vector3(1.0f, 1.0f, 2.0f));
-
- for (int i = 0; i < 3; i++)
- {
- EXPECT_FALSE(nonOrthogonalTransform1.IsOrthogonal());
- nonOrthogonalTransform1 = axisCycle * nonOrthogonalTransform1;
- }
}
using TransformSetFromEulerDegreesFixture = ::testing::TestWithParam;
@@ -459,16 +423,17 @@ namespace UnitTest
{
const char* objectStreamBuffer =
R"DELIMITER(
-
+
)DELIMITER";
AZ::Transform* deserializedTransform = AZ::Utils::LoadObjectFromBuffer(objectStreamBuffer, strlen(objectStreamBuffer) + 1);
const AZ::Vector3 expectedTranslation(513.7845459f, 492.5420837f, 32.0000000f);
- const AZ::Vector3 expectedScale(1.5f, 0.5f, 1.2f);
+ const float expectedScale = 1.5f;
const AZ::Quaternion expectedRotation(0.2624075f, 0.4405251f, 0.2029076f, 0.8342113f);
const AZ::Transform expectedTransform =
- AZ::Transform::CreateFromQuaternionAndTranslation(expectedRotation, expectedTranslation) * AZ::Transform::CreateScale(expectedScale);
+ AZ::Transform::CreateFromQuaternionAndTranslation(expectedRotation, expectedTranslation) *
+ AZ::Transform::CreateUniformScale(expectedScale);
EXPECT_TRUE(deserializedTransform->IsClose(expectedTransform));
azfree(deserializedTransform);
diff --git a/Code/Framework/AzCore/Tests/ScriptMath.cpp b/Code/Framework/AzCore/Tests/ScriptMath.cpp
index cb673e92e7..dce63051c9 100644
--- a/Code/Framework/AzCore/Tests/ScriptMath.cpp
+++ b/Code/Framework/AzCore/Tests/ScriptMath.cpp
@@ -1275,10 +1275,10 @@ namespace UnitTest
script->Execute("AZTestAssert(t1:TransformVector(Vector3(1, 0, 0)):IsClose(Vector3(1, 0, 0)))");
script->Execute("AZTestAssert(t1:TransformVector(Vector3(0, 1, 0)):IsClose(Vector3(0, 0.866, 0.5)))");
script->Execute("AZTestAssert(t1:TransformVector(Vector3(0, 0, 1)):IsClose(Vector3(0, -0.5, 0.866)))");
- script->Execute("t1 = Transform.CreateScale(Vector3(1, 2, 3))");
- script->Execute("AZTestAssert(t1:TransformVector(Vector3(1, 0, 0)):IsClose(Vector3(1, 0, 0)))");
+ script->Execute("t1 = Transform.CreateUniformScale(2)");
+ script->Execute("AZTestAssert(t1:TransformVector(Vector3(1, 0, 0)):IsClose(Vector3(2, 0, 0)))");
script->Execute("AZTestAssert(t1:TransformVector(Vector3(0, 1, 0)):IsClose(Vector3(0, 2, 0)))");
- script->Execute("AZTestAssert(t1:TransformVector(Vector3(0, 0, 1)):IsClose(Vector3(0, 0, 3)))");
+ script->Execute("AZTestAssert(t1:TransformVector(Vector3(0, 0, 1)):IsClose(Vector3(0, 0, 2)))");
script->Execute("t1 = Transform.CreateTranslation(Vector3(1, 2, 3))");
script->Execute("AZTestAssert(t1:TransformVector(Vector3(1, 0, 0)):IsClose(Vector3(1, 0, 0)))");
script->Execute("AZTestAssert(t1:TransformVector(Vector3(0, 1, 0)):IsClose(Vector3(0, 1, 0)))");
@@ -1341,19 +1341,19 @@ namespace UnitTest
script->Execute("AZTestAssert(t3:GetTranslation():IsClose(Vector3(-5.90, 25.415, 19.645), 0.001))");
////test inverse, should handle non-orthogonal matrices
- script->Execute("t1 = Transform.CreateRotationX(1) * Transform.CreateScale(Vector3(1, 2, 3))");
+ script->Execute("t1 = Transform.CreateRotationX(1) * Transform.CreateUniformScale(2)");
script->Execute("AZTestAssert((t1*t1:GetInverse()):IsClose(Transform.CreateIdentity()))");
////scale access
- script->Execute("t1 = Transform.CreateRotationX(Math.DegToRad(40)) * Transform.CreateScale(Vector3(2, 3, 4))");
- script->Execute("AZTestAssert(t1:GetScale():IsClose(Vector3(2, 3, 4)))");
- script->Execute("AZTestAssert(t1:ExtractScale():IsClose(Vector3(2, 3, 4)))");
- script->Execute("AZTestAssert(t1:GetScale():IsClose(Vector3.CreateOne()))");
- script->Execute("t1:MultiplyByScale(Vector3(3, 4, 5))");
- script->Execute("AZTestAssert(t1:GetScale():IsClose(Vector3(3, 4, 5)))");
+ script->Execute("t1 = Transform.CreateRotationX(Math.DegToRad(40)) * Transform.CreateUniformScale(3)");
+ script->Execute("AZTestAssertFloatClose(t1:GetUniformScale(), 3)");
+ script->Execute("AZTestAssertFloatClose(t1:ExtractUniformScale(), 3)");
+ script->Execute("AZTestAssertFloatClose(t1:GetUniformScale(), 1)");
+ script->Execute("t1:MultiplyByUniformScale(2)");
+ script->Execute("AZTestAssertFloatClose(t1:GetUniformScale(), 2)");
////orthogonalize
- script->Execute("t1 = Transform.CreateRotationX(Math.DegToRad(30)) * Transform.CreateScale(Vector3(2, 3, 4))");
+ script->Execute("t1 = Transform.CreateRotationX(Math.DegToRad(30)) * Transform.CreateUniformScale(3)");
script->Execute("t1:SetTranslation(Vector3(1,2,3))");
script->Execute("t2 = t1:GetOrthogonalized()");
script->Execute("AZTestAssertFloatClose(t2:GetBasisX():GetLength(), 1)");
@@ -1372,7 +1372,7 @@ namespace UnitTest
script->Execute("t1 = Transform.CreateRotationX(Math.DegToRad(30))");
script->Execute("t1:SetTranslation(Vector3(1, 2, 3))");
script->Execute("AZTestAssert(t1:IsOrthogonal(0.05))");
- script->Execute("t1 = Transform.CreateRotationX(Math.DegToRad(30)) * Transform.CreateScale(Vector3(2, 3, 4))");
+ script->Execute("t1 = Transform.CreateRotationX(Math.DegToRad(30)) * Transform.CreateUniformScale(2)");
script->Execute("AZTestAssert( not t1:IsOrthogonal(0.05))");
////IsClose
diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/TestCases.h b/Code/Framework/AzCore/Tests/Serialization/Json/TestCases.h
index b01dbe9b0d..ae313632af 100644
--- a/Code/Framework/AzCore/Tests/Serialization/Json/TestCases.h
+++ b/Code/Framework/AzCore/Tests/Serialization/Json/TestCases.h
@@ -21,7 +21,7 @@ namespace JsonSerializationTests
{
using JsonSerializationTestCases = ::testing::Types<
// Structures
- SimpleClass, SimpleInheritence, MultipleInheritence, SimpleNested, SimpleEnumWrapper,
+ SimpleClass, SimpleInheritence, MultipleInheritence, SimpleNested, SimpleEnumWrapper, NonReflectedEnumWrapper,
// Pointers
SimpleNullPointer, SimpleAssignedPointer, ComplexAssignedPointer, ComplexNullInheritedPointer,
ComplexAssignedDifferentInheritedPointer, ComplexAssignedSameInheritedPointer,
diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/TestCases_Classes.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/TestCases_Classes.cpp
index 5be031d70a..6da3120f59 100644
--- a/Code/Framework/AzCore/Tests/Serialization/Json/TestCases_Classes.cpp
+++ b/Code/Framework/AzCore/Tests/Serialization/Json/TestCases_Classes.cpp
@@ -373,6 +373,57 @@ namespace JsonSerializationTests
return MakeInstanceWithoutDefaults(AZStd::move(instance), json);
}
+ // NonReflectedEnumWrapper
+ bool NonReflectedEnumWrapper::Equals(const NonReflectedEnumWrapper& rhs, bool fullReflection) const
+ {
+ return !fullReflection || (m_enumClass == rhs.m_enumClass && m_rawEnum== rhs.m_rawEnum);
+ }
+
+ void NonReflectedEnumWrapper::Reflect(AZStd::unique_ptr& context, bool fullReflection)
+ {
+ if (fullReflection)
+ {
+ // Note that the enums are not reflected using context->Enum<>
+
+ context->Class()
+ ->Field("enumClass", &NonReflectedEnumWrapper::m_enumClass)
+ ->Field("rawEnum", &NonReflectedEnumWrapper::m_rawEnum);
+ }
+ }
+
+ InstanceWithSomeDefaults NonReflectedEnumWrapper::GetInstanceWithSomeDefaults()
+ {
+ auto instance = AZStd::make_unique();
+ instance->m_enumClass = NonReflectedEnumWrapper::SimpleEnumClass::Option2;
+
+ const char* strippedDefaults = R"(
+ {
+ "enumClass": 2
+ })";
+ const char* keptDefaults = R"(
+ {
+ "enumClass": 2,
+ "rawEnum": 0
+ })";
+
+ return MakeInstanceWithSomeDefaults(AZStd::move(instance),
+ strippedDefaults, keptDefaults);
+ }
+
+ InstanceWithoutDefaults NonReflectedEnumWrapper::GetInstanceWithoutDefaults()
+ {
+ auto instance = AZStd::make_unique();
+ instance->m_enumClass = NonReflectedEnumWrapper::SimpleEnumClass::Option2;
+ instance->m_rawEnum = NonReflectedEnumWrapper::SimpleRawEnum::RawOption1;
+
+ const char* json = R"(
+ {
+ "enumClass": 2,
+ "rawEnum": 1
+ })";
+ return MakeInstanceWithoutDefaults(AZStd::move(instance), json);
+ }
+
// TemplatedClass
bool TemplatedClass::Equals(const TemplatedClass& rhs, bool fullReflection) const
diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/TestCases_Classes.h b/Code/Framework/AzCore/Tests/Serialization/Json/TestCases_Classes.h
index db5db23fba..1830ca9e6f 100644
--- a/Code/Framework/AzCore/Tests/Serialization/Json/TestCases_Classes.h
+++ b/Code/Framework/AzCore/Tests/Serialization/Json/TestCases_Classes.h
@@ -134,6 +134,35 @@ namespace JsonSerializationTests
SimpleRawEnum m_rawEnum{};
};
+ struct NonReflectedEnumWrapper
+ {
+ enum class SimpleEnumClass
+ {
+ Option1 = 1,
+ Option2,
+ };
+ enum SimpleRawEnum
+ {
+ RawOption1 = 1,
+ RawOption2,
+ };
+ AZ_CLASS_ALLOCATOR(NonReflectedEnumWrapper, AZ::SystemAllocator, 0);
+ AZ_RTTI(NonReflectedEnumWrapper, "{A80D5B6B-2FD1-46E9-A7A9-44C5E2650526}");
+
+ static constexpr bool SupportsPartialDefaults = true;
+
+ NonReflectedEnumWrapper() = default;
+ virtual ~NonReflectedEnumWrapper() = default;
+
+ bool Equals(const NonReflectedEnumWrapper& rhs, bool fullReflection) const;
+ static void Reflect(AZStd::unique_ptr& context, bool fullReflection);
+ static InstanceWithSomeDefaults GetInstanceWithSomeDefaults();
+ static InstanceWithoutDefaults GetInstanceWithoutDefaults();
+
+ SimpleEnumClass m_enumClass{};
+ SimpleRawEnum m_rawEnum{};
+ };
+
template
struct TemplatedClass
{
@@ -158,5 +187,7 @@ namespace AZ
{
AZ_TYPE_INFO_SPECIALIZE(JsonSerializationTests::SimpleEnumWrapper::SimpleEnumClass, "{AF6F1964-5B20-4689-BF23-F36B9C9AAE6A}");
AZ_TYPE_INFO_SPECIALIZE(JsonSerializationTests::SimpleEnumWrapper::SimpleRawEnum, "{EB24207F-B48F-4D8B-940D-3CD06A371739}");
+ AZ_TYPE_INFO_SPECIALIZE(JsonSerializationTests::NonReflectedEnumWrapper::SimpleEnumClass, "{E80E4A41-B29E-4B7C-B630-3B599172C837}");
+ AZ_TYPE_INFO_SPECIALIZE(JsonSerializationTests::NonReflectedEnumWrapper::SimpleRawEnum, "{C42AF28D-4F84-4540-972A-5B6EEFAB13FF}");
AZ_TYPE_INFO_TEMPLATE(JsonSerializationTests::TemplatedClass, "{CA4ADF74-66E7-4D16-B4AC-F71278C60EC7}", AZ_TYPE_INFO_TYPENAME);
}
diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/TransformSerializerTests.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/TransformSerializerTests.cpp
index 12711b1e1a..750f2ebc9c 100644
--- a/Code/Framework/AzCore/Tests/Serialization/Json/TransformSerializerTests.cpp
+++ b/Code/Framework/AzCore/Tests/Serialization/Json/TransformSerializerTests.cpp
@@ -44,7 +44,7 @@ namespace JsonSerializationTests
AZStd::shared_ptr CreateFullySetInstance() override
{
return AZStd::make_shared(
- AZ::Vector3(1.0f, 2.0f, 3.0f), AZ::Quaternion(0.25f, 0.5f, 0.75f, 1.0f), AZ::Vector3(9.0f));
+ AZ::Vector3(1.0f, 2.0f, 3.0f), AZ::Quaternion(0.25f, 0.5f, 0.75f, 1.0f), 9.0f);
}
AZStd::string_view GetJsonForFullySetInstance() override
@@ -95,7 +95,7 @@ namespace JsonSerializationTests
AZ::Transform expectedTransform(
AZ::Vector3(2.25f, 3.5f, 4.75f),
AZ::Quaternion(0.25f, 0.5f, 0.75f, 1.0f),
- AZ::Vector3(5.5f));
+ 5.5f);
rapidjson::Document json;
json.Parse(R"({ "Translation": [ 2.25, 3.5, 4.75 ], "Rotation": [ 0.25, 0.5, 0.75, 1.0 ], "Scale": 5.5 })");
@@ -112,7 +112,7 @@ namespace JsonSerializationTests
AZ::Transform testTransform = AZ::Transform::CreateIdentity();
AZ::Transform expectedTransform =
AZ::Transform::CreateFromQuaternion(AZ::Quaternion(0.25f, 0.5f, 0.75f, 1.0f));
- expectedTransform.SetScale(AZ::Vector3(5.5f));
+ expectedTransform.SetUniformScale(5.5f);
rapidjson::Document json;
json.Parse(R"({ "Rotation": [ 0.25, 0.5, 0.75, 1.0 ], "Scale": 5.5 })");
@@ -128,7 +128,7 @@ namespace JsonSerializationTests
{
AZ::Transform testTransform = AZ::Transform::CreateIdentity();
AZ::Transform expectedTransform = AZ::Transform::CreateTranslation(AZ::Vector3(2.25f, 3.5f, 4.75f));
- expectedTransform.SetScale(AZ::Vector3(5.5f));
+ expectedTransform.SetUniformScale(5.5f);
rapidjson::Document json;
json.Parse(R"({ "Translation": [ 2.25, 3.5, 4.75 ], "Scale": 5.5 })");
@@ -189,7 +189,7 @@ namespace JsonSerializationTests
TEST_F(JsonTransformSerializerTests, Load_FullySetTransform_ReturnsSuccessWithOnlyScale)
{
AZ::Transform testTransform = AZ::Transform::CreateIdentity();
- AZ::Transform expectedTransform = AZ::Transform::CreateScale(AZ::Vector3(5.5f));
+ AZ::Transform expectedTransform = AZ::Transform::CreateUniformScale(5.5f);
rapidjson::Document json;
json.Parse(R"({ "Scale" : 5.5 })");
diff --git a/Code/Framework/AzCore/Tests/SettingsRegistryMergeUtilsTests.cpp b/Code/Framework/AzCore/Tests/SettingsRegistryMergeUtilsTests.cpp
index 36b9757ce3..751d9ded6c 100644
--- a/Code/Framework/AzCore/Tests/SettingsRegistryMergeUtilsTests.cpp
+++ b/Code/Framework/AzCore/Tests/SettingsRegistryMergeUtilsTests.cpp
@@ -372,15 +372,15 @@ mac_remote_filesystem=0
-- We need to know this before we establish VFS because different platform assets
-- are stored in different root folders in the cache. These correspond to the names
-- In the asset processor config file. This value also controls what config file is read
--- when you read system_xxxx_xxxx.cfg (for example, system_windows_pc.cfg or system_android_es3.cfg)
+-- when you read system_xxxx_xxxx.cfg (for example, system_windows_pc.cfg or system_android_android.cfg)
-- by default, pc assets (in the 'pc' folder) are used, with RC being fed 'pc' as the platform
-- by default on console we use the default assets=pc for better iteration times
-- we should turn on console specific assets only when in release and/or testing assets and/or loading performance
-- that way most people will not need to have 3 different caches taking up disk space
assets = pc
-android_assets = es3
+android_assets = android
ios_assets = ios
-mac_assets = osx_gl
+mac_assets = mac
-- Add the IP address of your console to the white list that will connect to the asset processor here
-- You can list addresses or CIDR's. CIDR's are helpful if you are using DHCP. A CIDR looks like an ip address with
@@ -438,9 +438,9 @@ mac_wait_for_connect=0
ConfigFileParams::SettingsKeyValuePair{"/ios_remote_filesystem", AZ::s64{0}},
ConfigFileParams::SettingsKeyValuePair{"/mac_remote_filesystem", AZ::s64{0}},
ConfigFileParams::SettingsKeyValuePair{"/assets", AZStd::string_view{"pc"}},
- ConfigFileParams::SettingsKeyValuePair{"/android_assets", AZStd::string_view{"es3"}},
+ ConfigFileParams::SettingsKeyValuePair{"/android_assets", AZStd::string_view{"android"}},
ConfigFileParams::SettingsKeyValuePair{"/ios_assets", AZStd::string_view{"ios"}},
- ConfigFileParams::SettingsKeyValuePair{"/mac_assets", AZStd::string_view{"osx_gl"}},
+ ConfigFileParams::SettingsKeyValuePair{"/mac_assets", AZStd::string_view{"mac"}},
ConfigFileParams::SettingsKeyValuePair{"/connect_to_remote", AZ::s64{0}},
ConfigFileParams::SettingsKeyValuePair{"/windows_connect_to_remote", AZ::s64{1}},
ConfigFileParams::SettingsKeyValuePair{"/android_connect_to_remote", AZ::s64{0}},
@@ -478,20 +478,20 @@ test_asset_processor_tag = test_value
[Platform pc]
tags=tools,renderer,dx12,vulkan
-[Platform es3]
+[Platform android]
tags=android,mobile,renderer,vulkan ; With Comments at the end
[Platform ios]
tags=mobile,renderer,metal
-[Platform osx_gl]
+[Platform mac]
tags=tools,renderer,metal)"
, AZStd::fixed_vector{
ConfigFileParams::SettingsKeyValuePair{"/test_asset_processor_tag", AZStd::string_view{"test_value"}},
ConfigFileParams::SettingsKeyValuePair{"/Platform pc/tags", AZStd::string_view{"tools,renderer,dx12,vulkan"}},
- ConfigFileParams::SettingsKeyValuePair{"/Platform es3/tags", AZStd::string_view{"android,mobile,renderer,vulkan"}},
+ ConfigFileParams::SettingsKeyValuePair{"/Platform android/tags", AZStd::string_view{"android,mobile,renderer,vulkan"}},
ConfigFileParams::SettingsKeyValuePair{"/Platform ios/tags", AZStd::string_view{"mobile,renderer,metal"}},
- ConfigFileParams::SettingsKeyValuePair{"/Platform osx_gl/tags", AZStd::string_view{"tools,renderer,metal"}},
+ ConfigFileParams::SettingsKeyValuePair{"/Platform mac/tags", AZStd::string_view{"tools,renderer,metal"}},
}}
)
);
diff --git a/Code/Framework/AzCore/Tests/azcoretests_files.cmake b/Code/Framework/AzCore/Tests/azcoretests_files.cmake
index f90717d003..78b2701d92 100644
--- a/Code/Framework/AzCore/Tests/azcoretests_files.cmake
+++ b/Code/Framework/AzCore/Tests/azcoretests_files.cmake
@@ -152,6 +152,7 @@ set(FILES
Math/PlaneTests.cpp
Math/QuaternionPerformanceTests.cpp
Math/QuaternionTests.cpp
+ Math/RandomTests.cpp
Math/ShapeIntersectionPerformanceTests.cpp
Math/ShapeIntersectionTests.cpp
Math/SfmtTests.cpp
diff --git a/Code/Framework/AzFramework/AzFramework/Application/Application.cpp b/Code/Framework/AzFramework/AzFramework/Application/Application.cpp
index e02892de4e..c65ba373f8 100644
--- a/Code/Framework/AzFramework/AzFramework/Application/Application.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Application/Application.cpp
@@ -679,8 +679,6 @@ namespace AzFramework
{
auto fileIoBase = m_archiveFileIO.get();
// Set up the default file aliases based on the settings registry
- fileIoBase->SetAlias("@assets@", "");
- fileIoBase->SetAlias("@root@", GetEngineRoot());
fileIoBase->SetAlias("@engroot@", GetEngineRoot());
fileIoBase->SetAlias("@projectroot@", GetEngineRoot());
fileIoBase->SetAlias("@exefolder@", GetExecutableFolder());
@@ -694,8 +692,8 @@ namespace AzFramework
pathAliases.clear();
if (m_settingsRegistry->Get(pathAliases.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_CacheRootFolder))
{
- fileIoBase->SetAlias("@projectplatformcache@", pathAliases.c_str());
fileIoBase->SetAlias("@assets@", pathAliases.c_str());
+ fileIoBase->SetAlias("@projectplatformcache@", pathAliases.c_str());
fileIoBase->SetAlias("@root@", pathAliases.c_str()); // Deprecated Use @projectplatformcache@
}
pathAliases.clear();
diff --git a/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp b/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp
index b0285616df..4a80db2b24 100644
--- a/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp
@@ -2008,13 +2008,12 @@ namespace AZ::IO
// if no bind root is specified, compute one:
strBindRoot = !bindRoot.empty() ? bindRoot : szFullPath->ParentPath().Native();
- // Check if archive file disk exist on disk or inside of pak.
- bool bFileExists = IsFileExist(szFullPath->Native());
-
- if (!bFileExists && (nFactoryFlags & ZipDir::CacheFactory::FLAGS_READ_ONLY))
+ // Check if archive file disk exist on disk.
+ const bool pakOnDisk = FileIOBase::GetDirectInstance()->Exists(szFullPath->c_str());
+ if (!pakOnDisk && (nFactoryFlags & ZipDir::CacheFactory::FLAGS_READ_ONLY))
{
// Archive file not found.
- AZ_TracePrintf("Archive", "Cannot open Archive file %s\n", szFullPath->c_str());
+ AZ_TracePrintf("Archive", "Archive file %s does not exist\n", szFullPath->c_str());
return nullptr;
}
@@ -2492,8 +2491,6 @@ namespace AZ::IO
void Archive::FindCompressionInfo(bool& found, AZ::IO::CompressionInfo& info, const AZStd::string_view filename)
{
- constexpr uint32_t s_compressionTag = static_cast('Z') << 24 | static_cast('C') << 16 | static_cast('R') << 8 | static_cast('Y');
-
if (!found)
{
auto correctedFilename = AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(filename);
@@ -2519,7 +2516,6 @@ namespace AZ::IO
found = true;
info.m_archiveFilename.InitFromRelativePath(archive->GetFilePath());
- info.m_compressionTag.m_code = s_compressionTag;
info.m_offset = pFileData->GetFileDataOffset();
info.m_compressedSize = entry->desc.lSizeCompressed;
info.m_uncompressedSize = entry->desc.lSizeUncompressed;
@@ -2539,9 +2535,8 @@ namespace AZ::IO
break;
}
- info.m_decompressor = [&s_compressionTag]([[maybe_unused]] const AZ::IO::CompressionInfo& info, const void* compressed, size_t compressedSize, void* uncompressed, size_t uncompressedBufferSize)->bool
+ info.m_decompressor = []([[maybe_unused]] const AZ::IO::CompressionInfo& info, const void* compressed, size_t compressedSize, void* uncompressed, size_t uncompressedBufferSize)->bool
{
- AZ_Assert(info.m_compressionTag.m_code == s_compressionTag, "Provided compression info isn't supported by this decompressor.");
size_t nSizeUncompressed = uncompressedBufferSize;
return ZipDir::ZipRawUncompress(uncompressed, &nSizeUncompressed, compressed, compressedSize) == 0;
};
diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFindData.cpp b/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFindData.cpp
index 678f4e40bf..1794ae90e7 100644
--- a/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFindData.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFindData.cpp
@@ -50,6 +50,7 @@ namespace AZ::IO
, tWrite{ writeTime }
{
}
+
ArchiveFileIterator::ArchiveFileIterator(FindData* findData, AZStd::string_view filename, const FileDesc& fileDesc)
: m_findData{ findData }
, m_filename{ filename }
@@ -108,13 +109,10 @@ namespace AZ::IO
AZ::StringFunc::Path::GetFullPath(directory.c_str(), searchDirectory);
AZ::StringFunc::Path::GetFullFileName(directory.c_str(), pattern);
}
-
AZ::IO::FileIOBase::GetDirectInstance()->FindFiles(searchDirectory.c_str(), pattern.c_str(), [&](const char* filePath) -> bool
{
AZ::IO::FileDesc fileDesc;
-
- AZStd::string fullFilePath;
- AZ::StringFunc::Path::GetFullFileName(filePath, fullFilePath);
+ AZStd::string filePathEntry{filePath};
if (AZ::IO::FileIOBase::GetDirectInstance()->IsDirectory(filePath))
{
@@ -135,9 +133,8 @@ namespace AZ::IO
fileDesc.tAccess = fileDesc.tWrite;
fileDesc.tCreate = fileDesc.tWrite;
}
- [[maybe_unused]] auto result = m_mapFiles.emplace(AZStd::move(fullFilePath), fileDesc);
- AZ_Assert(result.second, "Failed to insert FindData entry for %s", fullFilePath.c_str());
-
+ [[maybe_unused]] auto result = m_mapFiles.emplace(AZStd::move(filePathEntry), fileDesc);
+ AZ_Assert(result.second, "Failed to insert FindData entry for filePath %s", filePath);
return true;
});
}
@@ -273,7 +270,9 @@ namespace AZ::IO
}
auto pakFileIter = m_mapFiles.begin();
- fileIterator.m_filename = pakFileIter->first;
+ AZStd::string fullFilePath;
+ AZ::StringFunc::Path::GetFullFileName(pakFileIter->first.c_str(), fullFilePath);
+ fileIterator.m_filename = AZStd::move(fullFilePath);
fileIterator.m_fileDesc = pakFileIter->second;
fileIterator.m_lastFetchValid = true;
diff --git a/Code/Framework/AzFramework/AzFramework/Archive/IArchive.h b/Code/Framework/AzFramework/AzFramework/Archive/IArchive.h
index f5de1a0f3a..ce8403b033 100644
--- a/Code/Framework/AzFramework/AzFramework/Archive/IArchive.h
+++ b/Code/Framework/AzFramework/AzFramework/Archive/IArchive.h
@@ -115,7 +115,7 @@ namespace AZ::IO
// If used, the source path will be treated as the destination path
// and no transformations will be done. Pass this flag when the path is to be the actual
// path on the disk/in the packs and doesn't need adjustment (or after it has come through adjustments already)
- // if this is set, AdjustFileName will not map the input path into the master folder (Ex: Shaders will not be converted to Game\Shaders)
+ // if this is set, AdjustFileName will not map the input path into the folder (Ex: Shaders will not be converted to Game\Shaders)
FLAGS_PATH_REAL = 1 << 16,
// AdjustFileName will always copy the file path to the destination path:
@@ -318,7 +318,6 @@ namespace AZ::IO
virtual ArchiveFileIterator FindFirst(AZStd::string_view pDir, uint32_t nFlags = 0, bool bAllowUseFileSystem = false) = 0;
virtual ArchiveFileIterator FindNext(AZ::IO::ArchiveFileIterator handle) = 0;
virtual bool FindClose(AZ::IO::ArchiveFileIterator handle) = 0;
- // virtual bool IsOutOfDate(const char * szCompiledName, const char * szMasterFile)=0;
//returns file modification time
virtual IArchive::FileTime GetModificationTime(AZ::IO::HandleType fileHandle) = 0;
diff --git a/Code/Framework/AzFramework/AzFramework/Archive/INestedArchive.h b/Code/Framework/AzFramework/AzFramework/Archive/INestedArchive.h
index 25d36f009b..29a1030cf0 100644
--- a/Code/Framework/AzFramework/AzFramework/Archive/INestedArchive.h
+++ b/Code/Framework/AzFramework/AzFramework/Archive/INestedArchive.h
@@ -47,7 +47,7 @@ namespace AZ::IO
enum EPakFlags
{
// support for absolute and other complex path specifications -
- // all paths will be treated relatively to the current directory (normally MasterCD)
+ // all paths will be treated relatively to the current directory
FLAGS_ABSOLUTE_PATHS = 1,
// if this is set, the object will only understand relative to the zip file paths,
diff --git a/Code/Framework/AzFramework/AzFramework/Asset/AssetProcessorMessages.cpp b/Code/Framework/AzFramework/AzFramework/Asset/AssetProcessorMessages.cpp
index 020feffc47..7280c4af5c 100644
--- a/Code/Framework/AzFramework/AzFramework/Asset/AssetProcessorMessages.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Asset/AssetProcessorMessages.cpp
@@ -308,6 +308,56 @@ namespace AzFramework
}
}
+ //---------------------------------------------------------------------
+ GenerateRelativeSourcePathRequest::GenerateRelativeSourcePathRequest(const AZ::OSString& sourcePath)
+ {
+ AZ_Assert(!sourcePath.empty(), "GenerateRelativeSourcePathRequest: asset path is empty");
+ m_sourcePath = sourcePath;
+ }
+
+ unsigned int GenerateRelativeSourcePathRequest::GetMessageType() const
+ {
+ return MessageType;
+ }
+
+ void GenerateRelativeSourcePathRequest::Reflect(AZ::ReflectContext* context)
+ {
+ auto serialize = azrtti_cast(context);
+ if (serialize)
+ {
+ serialize->Class()
+ ->Version(1)
+ ->Field("SourcePath", &GenerateRelativeSourcePathRequest::m_sourcePath);
+ }
+ }
+
+ //---------------------------------------------------------------------
+ GenerateRelativeSourcePathResponse::GenerateRelativeSourcePathResponse(
+ bool resolved, const AZ::OSString& relativeSourcePath, const AZ::OSString& rootFolder)
+ {
+ m_relativeSourcePath = relativeSourcePath;
+ m_resolved = resolved;
+ m_rootFolder = rootFolder;
+ }
+
+ unsigned int GenerateRelativeSourcePathResponse::GetMessageType() const
+ {
+ return GenerateRelativeSourcePathRequest::MessageType;
+ }
+
+ void GenerateRelativeSourcePathResponse::Reflect(AZ::ReflectContext* context)
+ {
+ auto serialize = azrtti_cast(context);
+ if (serialize)
+ {
+ serialize->Class()
+ ->Version(1)
+ ->Field("RelativeSourcePath", &GenerateRelativeSourcePathResponse::m_relativeSourcePath)
+ ->Field("RootFolder", &GenerateRelativeSourcePathResponse::m_rootFolder)
+ ->Field("Resolved", &GenerateRelativeSourcePathResponse::m_resolved);
+ }
+ }
+
//---------------------------------------------------------------------
GetFullSourcePathFromRelativeProductPathRequest::GetFullSourcePathFromRelativeProductPathRequest(const AZ::OSString& relativeProductPath)
{
diff --git a/Code/Framework/AzFramework/AzFramework/Asset/AssetProcessorMessages.h b/Code/Framework/AzFramework/AzFramework/Asset/AssetProcessorMessages.h
index 9661e61828..c15f75e3e7 100644
--- a/Code/Framework/AzFramework/AzFramework/Asset/AssetProcessorMessages.h
+++ b/Code/Framework/AzFramework/AzFramework/Asset/AssetProcessorMessages.h
@@ -288,6 +288,45 @@ namespace AzFramework
bool m_resolved;
};
+ //////////////////////////////////////////////////////////////////////////
+ class GenerateRelativeSourcePathRequest : public BaseAssetProcessorMessage
+ {
+ public:
+ AZ_CLASS_ALLOCATOR(GenerateRelativeSourcePathRequest, AZ::OSAllocator, 0);
+ AZ_RTTI(GenerateRelativeSourcePathRequest, "{B3865033-F5A3-4749-8147-7B1AB04D5F6D}",
+ BaseAssetProcessorMessage);
+ static void Reflect(AZ::ReflectContext* context);
+
+ // For people that are debugging the network messages and just see MessageType as a value,
+ // the CRC value below is 739777771 (0x2C181CEB)
+ static constexpr unsigned int MessageType =
+ AZ_CRC_CE("AssetSystem::GenerateRelativeSourcePathRequest");
+
+ GenerateRelativeSourcePathRequest() = default;
+ GenerateRelativeSourcePathRequest(const AZ::OSString& sourcePath);
+ unsigned int GetMessageType() const override;
+
+ AZ::OSString m_sourcePath;
+ };
+
+ class GenerateRelativeSourcePathResponse : public BaseAssetProcessorMessage
+ {
+ public:
+ AZ_CLASS_ALLOCATOR(GenerateRelativeSourcePathResponse, AZ::OSAllocator, 0);
+ AZ_RTTI(GenerateRelativeSourcePathResponse, "{938D33DB-C8F6-4FA4-BC81-2F139A9BE1D7}",
+ BaseAssetProcessorMessage);
+ static void Reflect(AZ::ReflectContext* context);
+
+ GenerateRelativeSourcePathResponse() = default;
+ GenerateRelativeSourcePathResponse(
+ bool resolved, const AZ::OSString& relativeSourcePath, const AZ::OSString& rootFolder);
+ unsigned int GetMessageType() const override;
+
+ AZ::OSString m_relativeSourcePath;
+ AZ::OSString m_rootFolder; ///< This is the folder it was found in (the watched/scanned folder, such as gems /assets/ folder)
+ bool m_resolved;
+ };
+
//////////////////////////////////////////////////////////////////////////
class GetFullSourcePathFromRelativeProductPathRequest
: public BaseAssetProcessorMessage
diff --git a/Code/Framework/AzFramework/AzFramework/Asset/AssetSystemComponent.cpp b/Code/Framework/AzFramework/AzFramework/Asset/AssetSystemComponent.cpp
index 83c4907468..6b19084c2a 100644
--- a/Code/Framework/AzFramework/AzFramework/Asset/AssetSystemComponent.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Asset/AssetSystemComponent.cpp
@@ -202,6 +202,7 @@ namespace AzFramework
// Requests
GetUnresolvedDependencyCountsRequest::Reflect(context);
GetRelativeProductPathFromFullSourceOrProductPathRequest::Reflect(context);
+ GenerateRelativeSourcePathRequest::Reflect(context);
GetFullSourcePathFromRelativeProductPathRequest::Reflect(context);
SourceAssetInfoRequest::Reflect(context);
AssetInfoRequest::Reflect(context);
@@ -234,6 +235,7 @@ namespace AzFramework
// Responses
GetUnresolvedDependencyCountsResponse::Reflect(context);
GetRelativeProductPathFromFullSourceOrProductPathResponse::Reflect(context);
+ GenerateRelativeSourcePathResponse::Reflect(context);
GetFullSourcePathFromRelativeProductPathResponse::Reflect(context);
SourceAssetInfoResponse::Reflect(context);
AssetInfoResponse::Reflect(context);
diff --git a/Code/Framework/AzFramework/AzFramework/Components/ComponentAdapter.h b/Code/Framework/AzFramework/AzFramework/Components/ComponentAdapter.h
index 682e886061..ee8b79bf06 100644
--- a/Code/Framework/AzFramework/AzFramework/Components/ComponentAdapter.h
+++ b/Code/Framework/AzFramework/AzFramework/Components/ComponentAdapter.h
@@ -1,22 +1,22 @@
/*
-* 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.
-*
-*/
+ * 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
-#include
#include
#include
+#include
namespace AzFramework
{
@@ -64,15 +64,13 @@ namespace AzFramework
the EditContext. TController can friend itself to the editor component to make this work if required.
*/
template
- class ComponentAdapter
- : public AZ::Component
+ class ComponentAdapter : public AZ::Component
{
public:
-
AZ_RTTI((ComponentAdapter, "{644A9187-4FDB-42C1-9D59-DD75304B551A}", TController, TConfiguration), AZ::Component);
ComponentAdapter() = default;
- ComponentAdapter(const TConfiguration& configuration);
+ explicit ComponentAdapter(const TConfiguration& configuration);
static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& services);
static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& services);
@@ -85,7 +83,6 @@ namespace AzFramework
void Deactivate() override;
protected:
-
static void Reflect(AZ::ReflectContext* context);
// AZ::Component overrides ...
diff --git a/Code/Framework/AzFramework/AzFramework/Components/ComponentAdapter.inl b/Code/Framework/AzFramework/AzFramework/Components/ComponentAdapter.inl
index a1b0826193..5c36ff0bf7 100644
--- a/Code/Framework/AzFramework/AzFramework/Components/ComponentAdapter.inl
+++ b/Code/Framework/AzFramework/AzFramework/Components/ComponentAdapter.inl
@@ -1,14 +1,14 @@
/*
-* 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.
-*
-*/
+ * 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.
+ *
+ */
#include
@@ -32,10 +32,12 @@ namespace AzFramework
if (auto serializeContext = azrtti_cast(context))
{
+ // clang-format off
serializeContext->Class()
->Version(1)
->Field("Controller", &ComponentAdapter::m_controller)
;
+ // clang-format on
}
}
@@ -66,9 +68,6 @@ namespace AzFramework
GetDependentServicesHelper(services, typename AZ::HasComponentDependentServices::type());
}
- //////////////////////////////////////////////////////////////////////////
- // AZ::Component interface implementation
-
template
void ComponentAdapter::Init()
{
@@ -78,7 +77,7 @@ namespace AzFramework
template
void ComponentAdapter::Activate()
{
- m_controller.Activate(GetEntityId());
+ ComponentActivateHelper::Activate(m_controller, AZ::EntityComponentIdPair(GetEntityId(), GetId()));
}
template
diff --git a/Code/Framework/AzFramework/AzFramework/Components/ComponentAdapterHelpers.h b/Code/Framework/AzFramework/AzFramework/Components/ComponentAdapterHelpers.h
index 158ee95f39..f0ef262a71 100644
--- a/Code/Framework/AzFramework/AzFramework/Components/ComponentAdapterHelpers.h
+++ b/Code/Framework/AzFramework/AzFramework/Components/ComponentAdapterHelpers.h
@@ -13,6 +13,7 @@
#pragma once
#include
+#include
namespace AzFramework
{
@@ -27,18 +28,43 @@ namespace AzFramework
template
struct ComponentInitHelper
{
- static void Init(T& common)
+ static void Init([[maybe_unused]] T& controller)
{
- AZ_UNUSED(common);
}
};
template
struct ComponentInitHelper().Init())>>
{
- static void Init(T& common)
+ static void Init(T& controller)
{
- common.Init();
+ controller.Init();
+ }
+ };
+
+ template
+ struct ComponentActivateHelper
+ {
+ static void Activate([[maybe_unused]] T& controller, [[maybe_unused]] const AZ::EntityComponentIdPair& entityComponentIdPair)
+ {
+ }
+ };
+
+ template
+ struct ComponentActivateHelper().Activate(AZ::EntityId()))>>
+ {
+ static void Activate(T& controller, const AZ::EntityComponentIdPair& entityComponentIdPair)
+ {
+ controller.Activate(entityComponentIdPair.GetEntityId());
+ }
+ };
+
+ template
+ struct ComponentActivateHelper().Activate(AZ::EntityComponentIdPair()))>>
+ {
+ static void Activate(T& controller, const AZ::EntityComponentIdPair& entityComponentIdPair)
+ {
+ controller.Activate(entityComponentIdPair);
}
};
diff --git a/Code/Framework/AzFramework/AzFramework/Components/TransformComponent.cpp b/Code/Framework/AzFramework/AzFramework/Components/TransformComponent.cpp
index 9083cb7d0d..b3c4f1b256 100644
--- a/Code/Framework/AzFramework/AzFramework/Components/TransformComponent.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Components/TransformComponent.cpp
@@ -327,99 +327,13 @@ namespace AzFramework
return localZ;
}
- void TransformComponent::SetRotation(const AZ::Vector3& eulerAnglesRadian)
+ void TransformComponent::SetWorldRotationQuaternion(const AZ::Quaternion& quaternion)
{
- AZ_Warning("TransformComponent", false, "SetRotation is deprecated, please use SetLocalRotation");
-
- AZ::Transform newWorldTransform = m_worldTM;
- newWorldTransform.SetRotation(AZ::ConvertEulerRadiansToQuaternion(eulerAnglesRadian));
- SetWorldTM(newWorldTransform);
- }
-
- void TransformComponent::SetRotationQuaternion(const AZ::Quaternion& quaternion)
- {
- AZ_Warning("TransformComponent", false, "SetRotationQuaternion is deprecated, please use SetLocalRotationQuaternion");
-
AZ::Transform newWorldTransform = m_worldTM;
newWorldTransform.SetRotation(quaternion);
SetWorldTM(newWorldTransform);
}
- void TransformComponent::SetRotationX(float eulerAngleRadian)
- {
- AZ_Warning("TransformComponent", false, "SetRotationX is deprecated, please use SetLocalRotation");
-
- AZ::Transform newWorldTransform = m_worldTM;
- newWorldTransform.SetRotation(AZ::Quaternion::CreateRotationX(eulerAngleRadian));
- SetWorldTM(newWorldTransform);
- }
-
- void TransformComponent::SetRotationY(float eulerAngleRadian)
- {
- AZ_Warning("TransformComponent", false, "SetRotationY is deprecated, please use SetLocalRotation");
-
- AZ::Transform newWorldTransform = m_worldTM;
- newWorldTransform.SetRotation(AZ::Quaternion::CreateRotationY(eulerAngleRadian));
- SetWorldTM(newWorldTransform);
- }
-
- void TransformComponent::SetRotationZ(float eulerAngleRadian)
- {
- AZ_Warning("TransformComponent", false, "SetRotationZ is deprecated, please use SetLocalRotation");
-
- AZ::Transform newWorldTransform = m_worldTM;
- newWorldTransform.SetRotation(AZ::Quaternion::CreateRotationZ(eulerAngleRadian));
- SetWorldTM(newWorldTransform);
- }
-
- void TransformComponent::RotateByX(float eulerAngleRadian)
- {
- AZ_Warning("TransformComponent", false, "RotateByX is deprecated, please use RotateAroundLocalX");
- RotateAroundLocalX(eulerAngleRadian);
- }
-
- void TransformComponent::RotateByY(float eulerAngleRadian)
- {
- AZ_Warning("TransformComponent", false, "RotateByY is deprecated, please use RotateAroundLocalY");
- RotateAroundLocalY(eulerAngleRadian);
- }
-
- void TransformComponent::RotateByZ(float eulerAngleRadian)
- {
- AZ_Warning("TransformComponent", false, "RotateByZ is deprecated, please use RotateAroundLocalZ");
- RotateAroundLocalZ(eulerAngleRadian);
- }
-
- AZ::Vector3 TransformComponent::GetRotationEulerRadians()
- {
- AZ_Warning("TransformComponent", false, "GetRotationEulerRadians is deprecated, please use GetWorldRotation");
- return m_worldTM.GetRotation().GetEulerRadians();
- }
-
- AZ::Quaternion TransformComponent::GetRotationQuaternion()
- {
- AZ_Warning("TransformComponent", false, "GetRotationQuaternion is deprecated, please use GetWorldRotationQuaternion");
- return m_worldTM.GetRotation();
- }
-
- float TransformComponent::GetRotationX()
- {
- AZ_Warning("TransformComponent", false, "GetRotationX is deprecated, please use GetWorldRotation");
- return GetRotationEulerRadians().GetX();
- }
-
- float TransformComponent::GetRotationY()
- {
- AZ_Warning("TransformComponent", false, "GetRotationY is deprecated, please use GetWorldRotation");
- return GetRotationEulerRadians().GetY();
- }
-
- float TransformComponent::GetRotationZ()
- {
- AZ_Warning("TransformComponent", false, "GetRotationZ is deprecated, please use GetWorldRotation");
- return GetRotationEulerRadians().GetZ();
- }
-
AZ::Vector3 TransformComponent::GetWorldRotation()
{
return m_worldTM.GetRotation().GetEulerRadians();
@@ -432,46 +346,26 @@ namespace AzFramework
void TransformComponent::SetLocalRotation(const AZ::Vector3& eulerRadianAngles)
{
- AZ::Transform newLocalTM = AZ::ConvertEulerRadiansToTransform(eulerRadianAngles);
- newLocalTM.SetScale(m_localTM.GetScale());
- newLocalTM.SetTranslation(m_localTM.GetTranslation());
+ AZ::Transform newLocalTM = m_localTM;
+ newLocalTM.SetRotation(AZ::Quaternion::CreateFromEulerAnglesRadians(eulerRadianAngles));
SetLocalTM(newLocalTM);
}
void TransformComponent::SetLocalRotationQuaternion(const AZ::Quaternion& quaternion)
{
- AZ::Transform newLocalTM;
- newLocalTM.SetScale(m_localTM.GetScale());
- newLocalTM.SetTranslation(m_localTM.GetTranslation());
+ AZ::Transform newLocalTM = m_localTM;
newLocalTM.SetRotation(quaternion);
SetLocalTM(newLocalTM);
}
static AZ::Transform RotateAroundLocalHelper(float eulerAngleRadian, const AZ::Transform& localTM, AZ::Vector3 axis)
{
- //get the existing translation and scale
- AZ::Vector3 translation = localTM.GetTranslation();
- AZ::Vector3 scale = localTM.GetScale();
-
//normalize the axis before creating rotation
axis.Normalize();
AZ::Quaternion rotate = AZ::Quaternion::CreateFromAxisAngle(axis, eulerAngleRadian);
- //create new rotation transform
- AZ::Quaternion currentRotate = localTM.GetRotation();
- AZ::Quaternion newRotate = rotate * currentRotate;
- newRotate.Normalize();
-
- //scale
- AZ::Transform newLocalTM = AZ::Transform::CreateScale(scale);
-
- //rotate
- AZ::Transform rotateLocalTM = AZ::Transform::CreateFromQuaternion(newRotate);
- newLocalTM = rotateLocalTM * newLocalTM;
-
- //translate
- newLocalTM.SetTranslation(translation);
-
+ AZ::Transform newLocalTM = localTM;
+ newLocalTM.SetRotation((rotate * localTM.GetRotation()).GetNormalized());
return newLocalTM;
}
@@ -512,117 +406,27 @@ namespace AzFramework
return m_localTM.GetRotation();
}
- void TransformComponent::SetScale(const AZ::Vector3& scale)
- {
- AZ_Warning("TransformComponent", false, "SetScale is deprecated, please use SetLocalScale");
-
- if (!m_worldTM.GetScale().IsClose(scale))
- {
- AZ::Transform newWorldTransform = m_worldTM;
- newWorldTransform.SetScale(scale);
- SetWorldTM(newWorldTransform);
- }
- }
-
- void TransformComponent::SetScaleX(float scaleX)
- {
- AZ_Warning("TransformComponent", false, "SetScaleX is deprecated, please use SetLocalScaleX");
-
- AZ::Vector3 newScale = m_worldTM.GetScale();
- newScale.SetX(scaleX);
- AZ::Transform newWorldTransform = m_worldTM;
- newWorldTransform.SetScale(newScale);
- SetWorldTM(newWorldTransform);
- }
-
- void TransformComponent::SetScaleY(float scaleY)
- {
- AZ_Warning("TransformComponent", false, "SetScaleY is deprecated, please use SetLocalScaleY");
-
- AZ::Vector3 newScale = m_worldTM.GetScale();
- newScale.SetY(scaleY);
- AZ::Transform newWorldTransform = m_worldTM;
- newWorldTransform.SetScale(newScale);
- SetWorldTM(newWorldTransform);
- }
-
- void TransformComponent::SetScaleZ(float scaleZ)
- {
- AZ_Warning("TransformComponent", false, "SetScaleZ is deprecated, please use SetLocalScaleZ");
-
- AZ::Vector3 newScale = m_worldTM.GetScale();
- newScale.SetZ(scaleZ);
- AZ::Transform newWorldTransform = m_worldTM;
- newWorldTransform.SetScale(newScale);
- SetWorldTM(newWorldTransform);
- }
-
- AZ::Vector3 TransformComponent::GetScale()
- {
- AZ_Warning("TransformComponent", false, "GetScale is deprecated, please use GetLocalScale");
- return m_worldTM.GetScale();
- }
-
- float TransformComponent::GetScaleX()
- {
- AZ_Warning("TransformComponent", false, "GetScaleX is deprecated, please use GetLocalScale");
- return m_worldTM.GetScale().GetX();
- }
-
- float TransformComponent::GetScaleY()
- {
- AZ_Warning("TransformComponent", false, "GetScaleY is deprecated, please use GetLocalScale");
- return m_worldTM.GetScale().GetY();
- }
-
- float TransformComponent::GetScaleZ()
- {
- AZ_Warning("TransformComponent", false, "GetScaleZ is deprecated, please use GetLocalScale");
- return m_worldTM.GetScale().GetZ();
- }
-
- void TransformComponent::SetLocalScale(const AZ::Vector3& scale)
- {
- AZ::Transform newLocalTM = m_localTM;
- newLocalTM.SetScale(scale);
- SetLocalTM(newLocalTM);
- }
-
- void TransformComponent::SetLocalScaleX(float scaleX)
- {
- AZ::Transform newLocalTM = m_localTM;
- AZ::Vector3 newScale = newLocalTM.GetScale();
- newScale.SetX(scaleX);
- newLocalTM.SetScale(newScale);
- SetLocalTM(newLocalTM);
- }
-
- void TransformComponent::SetLocalScaleY(float scaleY)
- {
- AZ::Transform newLocalTM = m_localTM;
- AZ::Vector3 newScale = newLocalTM.GetScale();
- newScale.SetY(scaleY);
- newLocalTM.SetScale(newScale);
- SetLocalTM(newLocalTM);
- }
-
- void TransformComponent::SetLocalScaleZ(float scaleZ)
- {
- AZ::Transform newLocalTM = m_localTM;
- AZ::Vector3 newScale = newLocalTM.GetScale();
- newScale.SetZ(scaleZ);
- newLocalTM.SetScale(newScale);
- SetLocalTM(newLocalTM);
- }
-
AZ::Vector3 TransformComponent::GetLocalScale()
{
- return m_localTM.GetScale();
+ AZ_WarningOnce("TransformComponent", false, "GetLocalScale is deprecated, please use GetLocalUniformScale instead");
+ return AZ::Vector3(m_localTM.GetUniformScale());
}
- AZ::Vector3 TransformComponent::GetWorldScale()
+ void TransformComponent::SetLocalUniformScale(float scale)
{
- return m_worldTM.GetScale();
+ AZ::Transform newLocalTM = m_localTM;
+ newLocalTM.SetUniformScale(scale);
+ SetLocalTM(newLocalTM);
+ }
+
+ float TransformComponent::GetLocalUniformScale()
+ {
+ return m_localTM.GetUniformScale();
+ }
+
+ float TransformComponent::GetWorldUniformScale()
+ {
+ return m_worldTM.GetUniformScale();
}
AZStd::vector TransformComponent::GetChildren()
@@ -929,45 +733,7 @@ namespace AzFramework
->Event("GetLocalX", &AZ::TransformBus::Events::GetLocalX)
->Event("GetLocalY", &AZ::TransformBus::Events::GetLocalY)
->Event("GetLocalZ", &AZ::TransformBus::Events::GetLocalZ)
- ->Event("RotateByX", &AZ::TransformBus::Events::RotateByX)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("RotateByY", &AZ::TransformBus::Events::RotateByY)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("RotateByZ", &AZ::TransformBus::Events::RotateByZ)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("SetEulerRotation", &AZ::TransformBus::Events::SetRotation)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("SetRotationQuaternion", &AZ::TransformBus::Events::SetRotationQuaternion)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("SetRotationX", &AZ::TransformBus::Events::SetRotationX)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("SetRotationY", &AZ::TransformBus::Events::SetRotationY)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("SetRotationZ", &AZ::TransformBus::Events::SetRotationZ)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("GetEulerRotation", &AZ::TransformBus::Events::GetRotationEulerRadians)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("GetRotationQuaternion", &AZ::TransformBus::Events::GetRotationQuaternion)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("GetRotationX", &AZ::TransformBus::Events::GetRotationX)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("GetRotationY", &AZ::TransformBus::Events::GetRotationY)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("GetRotationZ", &AZ::TransformBus::Events::GetRotationZ)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
+ ->Event("SetWorldRotationQuaternion", &AZ::TransformBus::Events::SetWorldRotationQuaternion)
->Event("GetWorldRotation", &AZ::TransformBus::Events::GetWorldRotation)
->Event("GetWorldRotationQuaternion", &AZ::TransformBus::Events::GetWorldRotationQuaternion)
->Event("SetLocalRotation", &AZ::TransformBus::Events::SetLocalRotation)
@@ -979,38 +745,11 @@ namespace AzFramework
->Event("GetLocalRotationQuaternion", &AZ::TransformBus::Events::GetLocalRotationQuaternion)
->Attribute("Rotation", AZ::Edit::Attributes::PropertyRotation)
->VirtualProperty("Rotation", "GetLocalRotationQuaternion", "SetLocalRotationQuaternion")
- ->Event("SetScale", &AZ::TransformBus::Events::SetScale)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("SetScaleX", &AZ::TransformBus::Events::SetScaleX)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("SetScaleY", &AZ::TransformBus::Events::SetScaleY)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("SetScaleZ", &AZ::TransformBus::Events::SetScaleZ)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("GetScale", &AZ::TransformBus::Events::GetScale)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("GetScaleX", &AZ::TransformBus::Events::GetScaleX)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("GetScaleY", &AZ::TransformBus::Events::GetScaleY)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("GetScaleZ", &AZ::TransformBus::Events::GetScaleZ)
- ->Attribute(AZ::Script::Attributes::Deprecated, true)
- ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
- ->Event("SetLocalScale", &AZ::TransformBus::Events::SetLocalScale)
- ->Event("SetLocalScaleX", &AZ::TransformBus::Events::SetLocalScaleX)
- ->Event("SetLocalScaleY", &AZ::TransformBus::Events::SetLocalScaleY)
- ->Event("SetLocalScaleZ", &AZ::TransformBus::Events::SetLocalScaleZ)
->Event("GetLocalScale", &AZ::TransformBus::Events::GetLocalScale)
->Attribute("Scale", AZ::Edit::Attributes::PropertyScale)
- ->VirtualProperty("Scale", "GetLocalScale", "SetLocalScale")
- ->Event("GetWorldScale", &AZ::TransformBus::Events::GetWorldScale)
+ ->Event("SetLocalUniformScale", &AZ::TransformBus::Events::SetLocalUniformScale)
+ ->Event("GetLocalUniformScale", &AZ::TransformBus::Events::GetLocalUniformScale)
+ ->VirtualProperty("Uniform Scale", "GetLocalUniformScale", "SetLocalUniformScale")
->Event("GetChildren", &AZ::TransformBus::Events::GetChildren)
->Event("GetAllDescendants", &AZ::TransformBus::Events::GetAllDescendants)
->Event("GetEntityAndAllDescendants", &AZ::TransformBus::Events::GetEntityAndAllDescendants)
diff --git a/Code/Framework/AzFramework/AzFramework/Components/TransformComponent.h b/Code/Framework/AzFramework/AzFramework/Components/TransformComponent.h
index 0dd53d84ed..0301334a0d 100644
--- a/Code/Framework/AzFramework/AzFramework/Components/TransformComponent.h
+++ b/Code/Framework/AzFramework/AzFramework/Components/TransformComponent.h
@@ -112,22 +112,7 @@ namespace AzFramework
float GetLocalZ() override;
// Rotation modifiers
- void SetRotation(const AZ::Vector3& eulerAnglesRadian) override;
- void SetRotationQuaternion(const AZ::Quaternion& quaternion) override;
- void SetRotationX(float eulerAngleRadian) override;
- void SetRotationY(float eulerAngleRadian) override;
- void SetRotationZ(float eulerAngleRadian) override;
-
- void RotateByX(float eulerAngleRadian) override;
- void RotateByY(float eulerAngleRadian) override;
- void RotateByZ(float eulerAngleRadian) override;
-
- AZ::Vector3 GetRotationEulerRadians() override;
- AZ::Quaternion GetRotationQuaternion() override;
-
- float GetRotationX() override;
- float GetRotationY() override;
- float GetRotationZ() override;
+ void SetWorldRotationQuaternion(const AZ::Quaternion& quaternion) override;
AZ::Vector3 GetWorldRotation() override;
AZ::Quaternion GetWorldRotationQuaternion() override;
@@ -143,23 +128,11 @@ namespace AzFramework
AZ::Quaternion GetLocalRotationQuaternion() override;
// Scale Modifiers
- void SetScale(const AZ::Vector3& scale) override;
- void SetScaleX(float scaleX) override;
- void SetScaleY(float scaleY) override;
- void SetScaleZ(float scaleZ) override;
-
- AZ::Vector3 GetScale() override;
- float GetScaleX() override;
- float GetScaleY() override;
- float GetScaleZ() override;
-
- void SetLocalScale(const AZ::Vector3& scale) override;
- void SetLocalScaleX(float scaleX) override;
- void SetLocalScaleY(float scaleY) override;
- void SetLocalScaleZ(float scaleZ) override;
-
AZ::Vector3 GetLocalScale() override;
- AZ::Vector3 GetWorldScale() override;
+
+ void SetLocalUniformScale(float scale) override;
+ float GetLocalUniformScale() override;
+ float GetWorldUniformScale() override;
// Transform hierarchy
AZStd::vector GetChildren() override;
diff --git a/Code/Framework/AzFramework/AzFramework/Entity/EntityDebugDisplayBus.h b/Code/Framework/AzFramework/AzFramework/Entity/EntityDebugDisplayBus.h
index fb6b8d7d72..c3a60f7ec3 100644
--- a/Code/Framework/AzFramework/AzFramework/Entity/EntityDebugDisplayBus.h
+++ b/Code/Framework/AzFramework/AzFramework/Entity/EntityDebugDisplayBus.h
@@ -60,6 +60,7 @@ namespace AzFramework
virtual void DrawTrianglesIndexed(const AZStd::vector& vertices, const AZStd::vector& indices, const AZ::Color& color) { (void)vertices; (void)indices, (void)color; }
virtual void DrawWireBox(const AZ::Vector3& min, const AZ::Vector3& max) { (void)min; (void)max; }
virtual void DrawSolidBox(const AZ::Vector3& min, const AZ::Vector3& max) { (void)min; (void)max; }
+ virtual void DrawWireOBB(const AZ::Vector3& center, const AZ::Vector3& axisX, const AZ::Vector3& axisY, const AZ::Vector3& axisZ, const AZ::Vector3& halfExtents) { (void)center; (void)axisX; (void)axisY; (void)axisZ; (void)halfExtents; }
virtual void DrawSolidOBB(const AZ::Vector3& center, const AZ::Vector3& axisX, const AZ::Vector3& axisY, const AZ::Vector3& axisZ, const AZ::Vector3& halfExtents) { (void)center; (void)axisX; (void)axisY; (void)axisZ; (void)halfExtents; }
virtual void DrawPoint(const AZ::Vector3& p, int nSize = 1) { (void)p; (void)nSize; }
virtual void DrawLine(const AZ::Vector3& p1, const AZ::Vector3& p2) { (void)p1; (void)p2; }
@@ -70,18 +71,15 @@ namespace AzFramework
virtual void DrawLine2d(const AZ::Vector2& p1, const AZ::Vector2& p2, float z) { (void)p1; (void)p2; (void)z; }
virtual void DrawLine2dGradient(const AZ::Vector2& p1, const AZ::Vector2& p2, float z, const AZ::Vector4& firstColor, const AZ::Vector4& secondColor) { (void)p1; (void)p2; (void)z; (void)firstColor; (void)secondColor; }
virtual void DrawWireCircle2d(const AZ::Vector2& center, float radius, float z) { (void)center; (void)radius; (void)z; }
- virtual void DrawTerrainCircle(const AZ::Vector3& worldPos, float radius, float height) { (void)worldPos; (void)radius; (void)height; }
- virtual void DrawTerrainCircle(const AZ::Vector3& center, float radius, float angle1, float angle2, float height) { (void)center; (void)radius; (void)angle1; (void)angle2; (void)height; }
virtual void DrawArc(const AZ::Vector3& pos, float radius, float startAngleDegrees, float sweepAngleDegrees, float angularStepDegrees, int referenceAxis = 2) { (void)pos; (void)radius; (void)startAngleDegrees; (void)sweepAngleDegrees; (void)angularStepDegrees; (void)referenceAxis; }
virtual void DrawArc(const AZ::Vector3& pos, float radius, float startAngleDegrees, float sweepAngleDegrees, float angularStepDegrees, const AZ::Vector3& fixedAxis) { (void)pos; (void)radius; (void)startAngleDegrees; (void)sweepAngleDegrees; (void)angularStepDegrees; (void)fixedAxis; }
virtual void DrawCircle(const AZ::Vector3& pos, float radius, int nUnchangedAxis = 2 /*z axis*/) { (void)pos; (void)radius; (void)nUnchangedAxis; }
virtual void DrawHalfDottedCircle(const AZ::Vector3& pos, float radius, const AZ::Vector3& viewPos, int nUnchangedAxis = 2 /*z axis*/) { (void)pos; (void)radius; (void)viewPos; (void)nUnchangedAxis; }
- virtual void DrawCone(const AZ::Vector3& pos, const AZ::Vector3& dir, float radius, float height, bool drawShaded = true) { (void)pos; (void)dir; (void)radius; (void)height; (void)drawShaded; }
+ virtual void DrawWireCone(const AZ::Vector3& pos, const AZ::Vector3& dir, float radius, float height) { (void)pos; (void)dir; (void)radius; (void)height; }
+ virtual void DrawSolidCone(const AZ::Vector3& pos, const AZ::Vector3& dir, float radius, float height, bool drawShaded = true) { (void)pos; (void)dir; (void)radius; (void)height; (void)drawShaded; }
virtual void DrawWireCylinder(const AZ::Vector3& center, const AZ::Vector3& axis, float radius, float height) { (void)center; (void)axis; (void)radius; (void)height; }
virtual void DrawSolidCylinder(const AZ::Vector3& center, const AZ::Vector3& axis, float radius, float height, bool drawShaded = true) { (void)center; (void)axis; (void)radius; (void)height; (void)drawShaded; }
virtual void DrawWireCapsule(const AZ::Vector3& center, const AZ::Vector3& axis, float radius, float heightStraightSection) { (void)center; (void)axis; (void)radius; (void)heightStraightSection; }
- virtual void DrawTerrainRect(float x1, float y1, float x2, float y2, float height) { (void)x1; (void)y1; (void)x2; (void)y2; (void)height; }
- virtual void DrawTerrainLine(AZ::Vector3 worldPos1, AZ::Vector3 worldPos2) { (void)worldPos1; (void)worldPos2; }
virtual void DrawWireSphere(const AZ::Vector3& pos, float radius) { (void)pos; (void)radius; }
virtual void DrawWireSphere(const AZ::Vector3& pos, const AZ::Vector3 radius) { (void)pos; (void)radius; }
virtual void DrawWireDisk(const AZ::Vector3& pos, const AZ::Vector3& dir, float radius) { (void)pos; (void)dir; (void)radius; }
@@ -91,11 +89,8 @@ namespace AzFramework
virtual void DrawTextLabel(const AZ::Vector3& pos, float size, const char* text, const bool bCenter = false, int srcOffsetX = 0, int srcOffsetY = 0) { (void)pos; (void)size; (void)text; (void)bCenter; (void)srcOffsetX; (void)srcOffsetY; }
virtual void Draw2dTextLabel(float x, float y, float size, const char* text, bool bCenter = false) { (void)x; (void)y; (void)size; (void)text; (void)bCenter; }
virtual void DrawTextOn2DBox(const AZ::Vector3& pos, const char* text, float textScale, const AZ::Vector4& TextColor, const AZ::Vector4& TextBackColor) { (void)pos; (void)text; (void)textScale; (void)TextColor; (void)TextBackColor; }
- virtual void DrawTextureLabel(ITexture* texture, const AZ::Vector3& pos, float sizeX, float sizeY, int texIconFlags) { (void)texture; (void)pos; (void)sizeX; (void)sizeY; (void)texIconFlags; }
- virtual void DrawTextureLabel(int textureId, const AZ::Vector3& pos, float sizeX, float sizeY, int texIconFlags) { (void)textureId; (void)pos; (void)sizeX; (void)sizeY; (void)texIconFlags; }
virtual void SetLineWidth(float width) { (void)width; }
virtual bool IsVisible(const AZ::Aabb& bounds) { (void)bounds; return false; }
- virtual int SetFillMode(int nFillMode) { (void)nFillMode; return 0; }
virtual float GetLineWidth() { return 0.0f; }
virtual float GetAspectRatio() { return 0.0f; }
virtual void DepthTestOff() {}
diff --git a/Code/Framework/AzFramework/AzFramework/Font/FontInterface.h b/Code/Framework/AzFramework/AzFramework/Font/FontInterface.h
index b64b61e22c..04a0572bb9 100644
--- a/Code/Framework/AzFramework/AzFramework/Font/FontInterface.h
+++ b/Code/Framework/AzFramework/AzFramework/Font/FontInterface.h
@@ -15,6 +15,7 @@
#include
#include
#include
+#include
#include
#include
@@ -42,11 +43,15 @@ namespace AzFramework
{
ViewportId m_drawViewportId = InvalidViewportId; //!< Viewport to draw into
AZ::Vector3 m_position; //!< world space position for 3d draws, screen space x,y,depth for 2d.
- AZ::Color m_color = AZ::Colors::White; //!< Color to draw the text
+ AZ::Color m_color = AZ::Colors::White; //!< Color to draw the text
+ unsigned int m_effectIndex = 0; //!< effect index to apply
AZ::Vector2 m_scale = AZ::Vector2(1.0f); //!< font scale
- float m_lineSpacing; //!< Spacing between new lines, as a percentage of m_scale.
+ float m_textSizeFactor = 12.0f; //!< font size in pixels
+ float m_lineSpacing = 1.0f; //!< Spacing between new lines, as a percentage of m_scale.
TextHorizontalAlignment m_hAlign = TextHorizontalAlignment::Left; //!< Horizontal text alignment
TextVerticalAlignment m_vAlign = TextVerticalAlignment::Top; //!< Vertical text alignment
+ bool m_useTransform = false; //!< Use specified transform
+ AZ::Matrix3x4 m_transform = AZ::Matrix3x4::Identity(); //!< Transform to apply to text quads
bool m_monospace = false; //!< disable character proportional spacing
bool m_depthTest = false; //!< Test character against the depth buffer
bool m_virtual800x600ScreenSize = true; //!< Text placement and size are scaled relative to a virtual 800x600 resolution
diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Character.h b/Code/Framework/AzFramework/AzFramework/Physics/Character.h
index 19a6cbfe03..2401c9c5b9 100644
--- a/Code/Framework/AzFramework/AzFramework/Physics/Character.h
+++ b/Code/Framework/AzFramework/AzFramework/Physics/Character.h
@@ -18,6 +18,7 @@
#include
#include
+#include
#include
#include
@@ -36,7 +37,7 @@ namespace Physics
static void Reflect(AZ::ReflectContext* context);
AZStd::string m_name;
- ShapeConfigurationList m_shapes;
+ AzPhysics::ShapeColliderPairList m_shapes;
};
class CharacterColliderConfiguration
diff --git a/Code/Framework/AzFramework/AzFramework/Physics/ClassConverters.cpp b/Code/Framework/AzFramework/AzFramework/Physics/ClassConverters.cpp
index eb74390638..4f206858af 100644
--- a/Code/Framework/AzFramework/AzFramework/Physics/ClassConverters.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Physics/ClassConverters.cpp
@@ -57,7 +57,7 @@ namespace Physics
classElement.RemoveElement(shapesIndex);
// add a new vector in the new format
- const int newShapesIndex = classElement.AddElement(context, "shapes");
+ const int newShapesIndex = classElement.AddElement(context, "shapes");
if (newShapesIndex != -1)
{
AZ::SerializeContext::DataElementNode& newShapesElement = classElement.GetSubElement(newShapesIndex);
@@ -65,7 +65,9 @@ namespace Physics
// convert the old shapes into the new format and add to the vector
for (AZ::SerializeContext::DataElementNode shape : shapesCopy)
{
- const int pairIndex = newShapesElement.AddElementWithData(context, "element", ShapeConfigurationPair());
+ const int pairIndex = newShapesElement.AddElementWithData(
+ context, "element", AzPhysics::ShapeColliderPair());
+
AZ::SerializeContext::DataElementNode& pairElement = newShapesElement.GetSubElement(pairIndex);
ColliderConfiguration colliderConfig;
@@ -131,8 +133,8 @@ namespace Physics
AZ::SerializeContext::DataElementNode* baseBaseClass1 = baseClass1->FindSubElement(AZ_CRC("BaseClass1", 0xd4925735));
if (baseBaseClass1 && baseBaseClass1->FindSubElementAndGetData(AZ_CRC("name", 0x5e237e06), name))
{
- ShapeConfigurationList shapes;
- if (nodeElement.FindSubElementAndGetData(AZ_CRC("shapes", 0x93dba512), shapes))
+ AzPhysics::ShapeColliderPairList shapes;
+ if (nodeElement.FindSubElementAndGetData(AZ_CRC("shapes", 0x93dba512), shapes))
{
CharacterColliderNodeConfiguration newColliderNodeConfig;
newColliderNodeConfig.m_name = name;
@@ -257,11 +259,18 @@ namespace Physics
if (success)
{
- success = success && dataElement.RemoveElementByName(AZ_CRC("MaterialId", 0x9360e002));
+ dataElement.RemoveElementByName(AZ_CRC("MaterialId", 0x9360e002));
+ success = success && (dataElement.FindElement(AZ_CRC("MaterialId", 0x9360e002)) < 0);
success = success && dataElement.AddElementWithData(context, "MaterialIds", AZStd::vector { materialId });
}
}
+ if (success && dataElement.GetVersion() <= 2)
+ {
+ dataElement.RemoveElementByName(AZ_CRC_CE("Material"));
+ success = success && (dataElement.FindElement(AZ_CRC_CE("Material")) < 0);
+ }
+
return success;
}
} // namespace ClassConverters
diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsEvents.h b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsEvents.h
index d5a82c0367..a3a34dc1df 100644
--- a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsEvents.h
+++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsEvents.h
@@ -58,9 +58,18 @@ namespace AzPhysics
//! When triggered will send the handle to the old Scene (after this call, the Handle will be invalid).
using OnSceneRemovedEvent = AZ::Event;
- //! Event that triggers when the default material library changes.
+ //! Event that triggers when the material library changes.
//! When triggered the event will send the Asset Id of the new material library.
- using OnDefaultMaterialLibraryChangedEvent = AZ::Event;
+ using OnMaterialLibraryChangedEvent = AZ::Event;
+
+ enum class MaterialLibraryLoadErrorType : uint8_t
+ {
+ InvalidId,
+ ErrorLoading
+ };
+
+ //! Event that triggers when the default material library has loaded with errors.
+ using OnMaterialLibraryLoadErrorEvent = AZ::Event;
//! Event that triggers when the default scene configuration changes.
//! When triggered the event will send the new default scene configuration.
diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.h b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.h
index ed8a68dc24..9d45a17edc 100644
--- a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.h
+++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsSimulatedBody.h
@@ -18,6 +18,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -68,6 +69,22 @@ namespace AzPhysics
return m_customUserData;
}
+ //! Helper functions for setting frame ID.
+ //! @param frameId Optionally set frame ID for the systems moving the actors back in time.
+ void SetFrameId(uint32_t frameId)
+ {
+ m_frameId = frameId;
+ }
+
+ //! Helper functions for getting the set frame ID.
+ //! @return Will return the frame ID.
+ uint32_t GetFrameId() const
+ {
+ return m_frameId;
+ }
+
+ static constexpr uint32_t UndefinedFrameId = AZStd::numeric_limits::max();
+
//! Perform a ray cast on this Simulated Body.
//! @param request The request to make.
//! @return Returns the closest hit, if any, against this simulated body.
@@ -126,6 +143,7 @@ namespace AzPhysics
SimulatedBodyEvents::OnTriggerExit m_triggerExitEvent;
void* m_customUserData = nullptr;
+ uint32_t m_frameId = UndefinedFrameId;
// helpers for reflecting to behavior context
SimulatedBodyEvents::OnCollisionBegin* GetOnCollisionBeginEvent();
diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsTypes.h b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsTypes.h
index 5158da275e..b2b5fd1511 100644
--- a/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsTypes.h
+++ b/Code/Framework/AzFramework/AzFramework/Physics/Common/PhysicsTypes.h
@@ -70,7 +70,10 @@ namespace AzPhysics
using SimulatedBodyHandleList = AZStd::vector;
//! Helper used for pairing the ShapeConfiguration and ColliderConfiguration together which is used when creating a Simulated Body.
- using ShapeColliderPair = AZStd::pair;
+ using ShapeColliderPair = AZStd::pair<
+ AZStd::shared_ptr,
+ AZStd::shared_ptr>;
+ using ShapeColliderPairList = AZStd::vector;
//! Flags used to specifying which properties of a body to compute.
enum class MassComputeFlags : AZ::u8
diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.cpp
index 01bff3ccbb..4aea643c6c 100644
--- a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.cpp
@@ -30,6 +30,16 @@ namespace AzPhysics
classElement.AddElementWithData(context, "name", name);
return true;
}
+
+ bool SimulatedBodyVersionConverter([[maybe_unused]] AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement)
+ {
+ if (classElement.GetVersion() <= 1)
+ {
+ classElement.RemoveElementByName(AZ_CRC_CE("scale"));
+ }
+
+ return true;
+ }
}
AZ_CLASS_ALLOCATOR_IMPL(SimulatedBodyConfiguration, AZ::SystemAllocator, 0);
@@ -40,11 +50,10 @@ namespace AzPhysics
{
serializeContext->ClassDeprecate("WorldBodyConfiguration", "{6EEB377C-DC60-4E10-AF12-9626C0763B2D}", &Internal::DeprecateWorldBodyConfiguration);
serializeContext->Class()
- ->Version(1)
+ ->Version(2, &Internal::SimulatedBodyVersionConverter)
->Field("name", &SimulatedBodyConfiguration::m_debugName)
->Field("position", &SimulatedBodyConfiguration::m_position)
->Field("orientation", &SimulatedBodyConfiguration::m_orientation)
- ->Field("scale", &SimulatedBodyConfiguration::m_scale)
->Field("entityId", &SimulatedBodyConfiguration::m_entityId)
->Field("startSimulationEnabled", &SimulatedBodyConfiguration::m_startSimulationEnabled)
;
diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.h b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.h
index 6862bfccb8..5ac920ab9d 100644
--- a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.h
+++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SimulatedBodyConfiguration.h
@@ -38,7 +38,6 @@ namespace AzPhysics
// Basic initial settings.
AZ::Vector3 m_position = AZ::Vector3::CreateZero();
AZ::Quaternion m_orientation = AZ::Quaternion::CreateIdentity();
- AZ::Vector3 m_scale = AZ::Vector3::CreateOne();
bool m_startSimulationEnabled = true;
// Entity/object association.
diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SystemConfiguration.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SystemConfiguration.cpp
index 497d67bef1..d7532cbfea 100644
--- a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SystemConfiguration.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SystemConfiguration.cpp
@@ -21,7 +21,7 @@ namespace AzPhysics
namespace
{
const float TimestepMin = 0.001f; //1000fps
- const float TimestepMax = 0.05f; //20fps
+ const float TimestepMax = 0.1f; //10fps
}
AZ_CLASS_ALLOCATOR_IMPL(SystemConfiguration, AZ::SystemAllocator, 0);
@@ -39,6 +39,8 @@ namespace AzPhysics
->Field("ShapecastBufferSize", &SystemConfiguration::m_shapecastBufferSize)
->Field("OverlapBufferSize", &SystemConfiguration::m_overlapBufferSize)
->Field("CollisionConfig", &SystemConfiguration::m_collisionConfig)
+ ->Field("DefaultMaterial", &SystemConfiguration::m_defaultMaterialConfiguration)
+ ->Field("MaterialLibrary", &SystemConfiguration::m_materialLibraryAsset)
;
if (AZ::EditContext* editContext = serializeContext->GetEditContext())
@@ -79,7 +81,9 @@ namespace AzPhysics
m_overlapBufferSize == other.m_overlapBufferSize &&
AZ::IsClose(m_maxTimestep, other.m_maxTimestep) &&
AZ::IsClose(m_fixedTimestep, other.m_fixedTimestep) &&
- m_collisionConfig == other.m_collisionConfig
+ m_collisionConfig == other.m_collisionConfig &&
+ m_defaultMaterialConfiguration == other.m_defaultMaterialConfiguration &&
+ m_materialLibraryAsset == other.m_materialLibraryAsset
;
}
diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SystemConfiguration.h b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SystemConfiguration.h
index 3de4dafd8c..56fe9a68c4 100644
--- a/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SystemConfiguration.h
+++ b/Code/Framework/AzFramework/AzFramework/Physics/Configuration/SystemConfiguration.h
@@ -13,6 +13,7 @@
#include
#include
+#include
namespace AZ
{
@@ -34,7 +35,7 @@ namespace AzPhysics
static constexpr float DefaultFixedTimestep = 0.0166667f; //! Value represents 1/60th or 60 FPS.
- float m_maxTimestep = 1.f / 20.f; //!< Maximum fixed timestep in seconds to run the physics update.
+ float m_maxTimestep = 0.1f; //!< Maximum fixed timestep in seconds to run the physics update (10FPS).
float m_fixedTimestep = DefaultFixedTimestep; //!< Timestep in seconds to run the physics update. See DefaultFixedTimestep.
AZ::u64 m_raycastBufferSize = 32; //!< Maximum number of hits that will be returned from a raycast.
@@ -45,6 +46,9 @@ namespace AzPhysics
//! Each Physics Scene uses this as a base and will override as needed.
CollisionConfiguration m_collisionConfig;
+ Physics::MaterialConfiguration m_defaultMaterialConfiguration; //!< Default material parameters for the project.
+ AZ::Data::Asset m_materialLibraryAsset = AZ::Data::AssetLoadBehavior::NoLoad; //!< Material Library exposed by the system component SystemBus API.
+
//! Controls whether the Physics System will self register to the TickBus and call StartSimulation / FinishSimulation on each Scene.
//! Disable this to manually control Physics Scene simulation logic.
bool m_autoManageSimulationUpdate = true;
diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Material.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Material.cpp
index 5552cef448..78e0431753 100644
--- a/Code/Framework/AzFramework/AzFramework/Physics/Material.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Physics/Material.cpp
@@ -49,10 +49,7 @@ namespace Physics
{
materialSelection->SetMaterialSlots(Physics::MaterialSelection::SlotsArray());
}
- if (materialSelection->IsDefaultMaterialLibraryAsset())
- {
- materialSelection->SyncSelectionToMaterialLibrary();
- }
+ materialSelection->SyncSelectionToMaterialLibrary();
}
};
@@ -122,6 +119,24 @@ namespace Physics
}
}
+ bool MaterialConfiguration::operator==(const MaterialConfiguration& other) const
+ {
+ return m_surfaceType == other.m_surfaceType &&
+ AZ::IsClose(m_dynamicFriction, other.m_dynamicFriction) &&
+ AZ::IsClose(m_staticFriction, other.m_staticFriction) &&
+ AZ::IsClose(m_restitution, other.m_restitution) &&
+ AZ::IsClose(m_density, other.m_density) &&
+ m_restitutionCombine == other.m_restitutionCombine &&
+ m_frictionCombine == other.m_frictionCombine &&
+ m_debugColor == other.m_debugColor
+ ;
+ }
+
+ bool MaterialConfiguration::operator!=(const MaterialConfiguration& other) const
+ {
+ return !(*this == other);
+ }
+
AZ::Color MaterialConfiguration::GenerateDebugColor(const char* materialName)
{
static const AZ::Color colors[] =
@@ -191,51 +206,25 @@ namespace Physics
//////////////////////////////////////////////////////////////////////////
- void MaterialLibraryAssetReflectionWrapper::Reflect(AZ::ReflectContext* context)
- {
- AZ::SerializeContext* serializeContext = azrtti_cast(context);
- if (serializeContext)
- {
- serializeContext->Class()
- ->Version(1)
- ->Field("Asset", &MaterialLibraryAssetReflectionWrapper::m_asset)
- ;
-
- AZ::EditContext* editContext = serializeContext->GetEditContext();
- if (editContext)
- {
- editContext->Class("", "")
- ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
- ->Attribute(AZ::Edit::Attributes::AutoExpand, "")
- ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)
- ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialLibraryAssetReflectionWrapper::m_asset, "Physics Material Library", "Physics Material Library")
- ->Attribute("EditButton", "")
- ;
- }
- }
- }
-
- //////////////////////////////////////////////////////////////////////////
-
-
- void DefaultMaterialLibraryAssetReflectionWrapper::Reflect(AZ::ReflectContext* context)
+ void MaterialInfoReflectionWrapper::Reflect(AZ::ReflectContext* context)
{
AZ::SerializeContext* serializeContext = azrtti_cast(context);
if (serializeContext)
{
- serializeContext->Class()
+ serializeContext->Class()
->Version(1)
- ->Field("Asset", &DefaultMaterialLibraryAssetReflectionWrapper::m_asset)
+ ->Field("DefaultMaterial", &MaterialInfoReflectionWrapper::m_defaultMaterialConfiguration)
+ ->Field("Asset", &MaterialInfoReflectionWrapper::m_materialLibraryAsset)
;
AZ::EditContext* editContext = serializeContext->GetEditContext();
if (editContext)
{
- editContext->Class("", "")
+ editContext->Class("Physics Materials", "")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
- ->Attribute(AZ::Edit::Attributes::AutoExpand, "")
- ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)
- ->DataElement(AZ::Edit::UIHandlers::Default, &DefaultMaterialLibraryAssetReflectionWrapper::m_asset, "Default Physics Material Library", "Library to use by default")
+ ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
+ ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialInfoReflectionWrapper::m_defaultMaterialConfiguration, "Default Physics Material", "Material used by default")
+ ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialInfoReflectionWrapper::m_materialLibraryAsset, "Physics Material Library", "Library to use for the project")
->Attribute(AZ::Edit::Attributes::AllowClearAsset, false)
->Attribute("EditButton", "")
;
@@ -269,6 +258,17 @@ namespace Physics
}
}
+ bool MaterialFromAssetConfiguration::operator==(const MaterialFromAssetConfiguration& other) const
+ {
+ return m_configuration == other.m_configuration &&
+ m_id == other.m_id;
+ }
+
+ bool MaterialFromAssetConfiguration::operator!=(const MaterialFromAssetConfiguration& other) const
+ {
+ return !(*this == other);
+ }
+
//////////////////////////////////////////////////////////////////////////
bool MaterialLibraryAsset::GetDataForMaterialId(const MaterialId& materialId, MaterialFromAssetConfiguration& configuration) const
@@ -370,9 +370,8 @@ namespace Physics
if (auto serializeContext = azrtti_cast(context))
{
serializeContext->Class()
- ->Version(2, &ClassConverters::MaterialSelectionConverter)
+ ->Version(3, &ClassConverters::MaterialSelectionConverter)
->EventHandler()
- ->Field("Material", &MaterialSelection::m_materialLibrary)
->Field("MaterialIds", &MaterialSelection::m_materialIdsAssignedToSlots)
;
@@ -381,14 +380,8 @@ namespace Physics
editContext->Class("Physics Material", "Select physics material library and which materials to use for the object")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
- ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialSelection::m_materialLibrary, "Library", "Physics material library to use for this object")
- ->Attribute(AZ::Edit::Attributes::ContainerCanBeModified, true)
- ->Attribute("EditButton", "")
- ->Attribute("EditDescription", "Open in Asset Editor")
- ->Attribute(AZ::Edit::Attributes::DefaultAsset, &MaterialSelection::GetDefaultMaterialLibraryId)
- ->Attribute(AZ::Edit::Attributes::ChangeNotify, &MaterialSelection::OnMaterialLibraryChanged)
->DataElement(AZ::Edit::UIHandlers::Default, &MaterialSelection::m_materialIdsAssignedToSlots, "Mesh Surfaces", "Specify which Physics Material to use for each element of this object")
- ->ElementAttribute(Attributes::MaterialLibraryAssetId, &MaterialSelection::GetMaterialLibraryAssetId)
+ ->ElementAttribute(Attributes::MaterialLibraryAssetId, &MaterialSelection::GetMaterialLibraryId)
->Attribute(AZ::Edit::Attributes::IndexedChildNameLabelOverride, &MaterialSelection::GetMaterialSlotLabel)
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->ElementAttribute(AZ::Edit::Attributes::ReadOnly, &MaterialSelection::AreMaterialSlotsReadOnly)
@@ -398,12 +391,6 @@ namespace Physics
}
}
- AZ::u32 MaterialSelection::OnMaterialLibraryChanged()
- {
- SyncSelectionToMaterialLibrary();
- return AZ::Edit::PropertyRefreshLevels::EntireTree;
- }
-
AZStd::string MaterialSelection::GetMaterialSlotLabel(int index)
{
if (index < m_materialSlots.size())
@@ -425,28 +412,9 @@ namespace Physics
}
}
- AZ::Data::AssetId MaterialSelection::GetMaterialLibraryAssetId() const
+ void MaterialSelection::OnMaterialLibraryChanged([[maybe_unused]] const AZ::Data::AssetId& defaultMaterialLibraryId)
{
- return GetMaterialLibraryAsset().GetId();
- }
-
- const Physics::MaterialLibraryAsset* MaterialSelection::GetMaterialLibraryAssetData() const
- {
- return GetMaterialLibraryAsset().Get();
- }
-
- const AZStd::string& MaterialSelection::GetMaterialLibraryAssetHint() const
- {
- return m_materialLibrary.GetHint();
- }
-
- void MaterialSelection::OnDefaultMaterialLibraryChanged(const AZ::Data::AssetId& defaultMaterialLibraryId)
- {
- AZ_UNUSED(defaultMaterialLibraryId);
- if (IsDefaultMaterialLibraryAsset())
- {
- OnMaterialLibraryChanged();
- }
+ SyncSelectionToMaterialLibrary();
}
void MaterialSelection::SetSlotsReadOnly(bool readOnly)
@@ -454,45 +422,6 @@ namespace Physics
m_slotsReadOnly = readOnly;
}
- bool MaterialSelection::IsMaterialLibraryValid() const
- {
- if (GetMaterialLibraryAssetId().IsValid())
- {
- auto materialAsset = LoadAsset();
- const auto& materialsData = materialAsset.Get()->GetMaterialsData();
-
- if (materialsData.size() != 0)
- {
- return true;
- }
- }
- return false;
- }
-
- bool MaterialSelection::GetMaterialConfiguration(Physics::MaterialFromAssetConfiguration& configuration, const Physics::MaterialId& materialId) const
- {
- if (IsMaterialLibraryValid())
- {
- auto materialAsset = LoadAsset();
- if (materialAsset.Get())
- {
- return materialAsset.Get()->GetDataForMaterialId(materialId, configuration);
- }
- }
- return false;
- }
-
- void MaterialSelection::SetMaterialLibrary(const AZ::Data::AssetId& assetId)
- {
- m_materialLibrary = AZ::Data::AssetManager::Instance().GetAsset(assetId, m_materialLibrary.GetAutoLoadBehavior());
- m_materialLibrary.BlockUntilLoadComplete();
- }
-
- void MaterialSelection::ResetToDefaultMaterialLibrary()
- {
- m_materialLibrary = {};
- }
-
void MaterialSelection::SetMaterialSlots(const SlotsArray& slots)
{
if (slots.empty())
@@ -533,74 +462,45 @@ namespace Physics
m_materialIdsAssignedToSlots[slotIndex] = materialId;
}
- AZ::Data::Asset MaterialSelection::LoadAsset() const
- {
- AZ::Data::Asset asset = AZ::Data::AssetManager::Instance()
- .GetAsset(GetMaterialLibraryAssetId(), AZ::Data::AssetLoadBehavior::Default);
-
- asset.BlockUntilLoadComplete();
-
- return asset;
- }
-
void MaterialSelection::SyncSelectionToMaterialLibrary()
{
- if (GetMaterialLibraryAssetId().IsValid())
+ auto* materialLibrary = GetMaterialLibrary().Get();
+ if (!materialLibrary)
{
- auto materialLibraryAsset = AZ::Data::AssetManager::Instance().GetAsset