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/Gem/Code/runtime_dependencies.cmake b/AutomatedTesting/Gem/Code/runtime_dependencies.cmake
index 33c2bf8d5f..15715f2136 100644
--- a/AutomatedTesting/Gem/Code/runtime_dependencies.cmake
+++ b/AutomatedTesting/Gem/Code/runtime_dependencies.cmake
@@ -43,6 +43,7 @@ set(GEM_DEPENDENCIES
Gem::GradientSignal
Gem::Vegetation
Gem::Atom_AtomBridge
+ Gem::AtomFont
Gem::NvCloth
Gem::Blast
Gem::AWSCore
diff --git a/AutomatedTesting/Gem/Code/tool_dependencies.cmake b/AutomatedTesting/Gem/Code/tool_dependencies.cmake
index d4a49bfad5..1c0db5753b 100644
--- a/AutomatedTesting/Gem/Code/tool_dependencies.cmake
+++ b/AutomatedTesting/Gem/Code/tool_dependencies.cmake
@@ -52,7 +52,10 @@ set(GEM_DEPENDENCIES
Gem::LandscapeCanvas.Editor
Gem::EMotionFX.Editor
Gem::ImGui.Editor
+ Gem::Atom_RHI.Private
+ Gem::Atom_Feature_Common.Editor
Gem::Atom_AtomBridge.Editor
+ Gem::AtomFont
Gem::NvCloth.Editor
Gem::Blast.Editor
Gem::AWSCore.Editor
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..da4898b8a9
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/test_password_signin.py
@@ -0,0 +1,97 @@
+"""
+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']
+
+ 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']
+
+ 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/AutomatedTesting/Gem/PythonTests/AWS/Windows/resource_mappings/resource_mappings.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/resource_mappings/resource_mappings.py
index c8d8cff828..b3fa3011ce 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/resource_mappings/resource_mappings.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/resource_mappings/resource_mappings.py
@@ -39,6 +39,7 @@ class ResourceMappings:
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}'
@@ -79,6 +80,7 @@ class ResourceMappings:
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)
@@ -103,6 +105,9 @@ class ResourceMappings:
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(
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/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..904075c747 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])}"
@@ -135,7 +135,9 @@ def run():
# Delete all existing entities initially
search_filter = azlmbr.entity.SearchFilter()
all_entities = entity.SearchBus(azlmbr.bus.Broadcast, "SearchEntities", search_filter)
+ general.idle_wait_frames(1)
editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntities", all_entities)
+ general.idle_wait_frames(1)
class ComponentTests:
"""Test launcher for each component."""
@@ -147,9 +149,11 @@ def run():
def run_component_tests(self):
# Run common and additional tests
entity_obj = create_entity_undo_redo_component_addition(self.component_name)
+ general.idle_wait(0.5)
# Enter/Exit game mode test
verify_enter_exit_game_mode(self.component_name)
+ general.idle_wait(0.5)
# Any additional tests are executed here
for test in self.additional_tests:
@@ -157,13 +161,16 @@ def run():
# Hide/Unhide entity test
verify_hide_unhide_entity(self.component_name, entity_obj)
+ general.idle_wait(0.5)
# Deletion/Undo/Redo test
verify_deletion_undo_redo(self.component_name, entity_obj)
+ general.idle_wait(0.5)
# DepthOfField Component
camera_entity = hydra.Entity("camera_entity")
camera_entity.create_entity(math.Vector3(512.0, 512.0, 34.0), ["Camera"])
+ general.idle_wait(0.5)
depth_of_field = "DepthOfField"
ComponentTests(
depth_of_field,
diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py
index 0b75760e05..3da1c27e67 100644
--- a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py
+++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py
@@ -27,6 +27,7 @@ TEST_DIRECTORY = os.path.join(os.path.dirname(__file__), "atom_hydra_scripts")
@pytest.mark.parametrize("level", ["auto_test"])
class TestAtomEditorComponentsMain(object):
+ @pytest.mark.xfail(reason="Timing out sporadically, LYN-3956")
@pytest.mark.test_case_id(
"C32078130", # Display Mapper
"C32078129", # Light
@@ -163,7 +164,8 @@ class TestAtomEditorComponentsMain(object):
]
unexpected_lines = [
- "failed to open",
+ "Trace::Assert",
+ "Trace::Error",
"Traceback (most recent call last):",
]
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_Docking.py b/AutomatedTesting/Gem/PythonTests/editor/test_Docking.py
index a75b3b36cd..c2d515e250 100644
--- a/AutomatedTesting/Gem/PythonTests/editor/test_Docking.py
+++ b/AutomatedTesting/Gem/PythonTests/editor/test_Docking.py
@@ -40,7 +40,7 @@ class TestDocking(object):
@pytest.mark.test_case_id("C6376081")
@pytest.mark.SUITE_periodic
- def test_basic_docked_tools(self, request, editor, level, launcher_platform):
+ 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..70a22f9e2a 100644
--- a/AutomatedTesting/Gem/PythonTests/editor/test_Menus.py
+++ b/AutomatedTesting/Gem/PythonTests/editor/test_Menus.py
@@ -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",
diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBuilder_Works.py b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBuilder_Works.py
index 10df59e086..5381fd9fd8 100644
--- a/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBuilder_Works.py
+++ b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBuilder_Works.py
@@ -20,7 +20,6 @@ import subprocess
@pytest.mark.SUITE_smoke
class TestCLIToolAssetBuilderWorks(object):
- @pytest.mark.xfail(reason="Ignoring failure temporarily - SPEC-6905")
def test_CLITool_AssetBuilder_Works(self, build_directory):
file_path = os.path.join(build_directory, "AssetBuilder")
help_message = "AssetBuilder is part of the Asset Processor"
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/ClientAuthPasswordSignIn.ly b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/ClientAuthPasswordSignIn.ly
new file mode 100644
index 0000000000..24fe4f2482
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/ClientAuthPasswordSignIn.ly
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:43b1a23b62fe2ffa05545ac99524f40b6fff49d6e35925b9d6138c00d8082e86
+size 9073
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/PasswordSignIn.scriptcanvas b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/PasswordSignIn.scriptcanvas
new file mode 100644
index 0000000000..ffc3064084
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/PasswordSignIn.scriptcanvas
@@ -0,0 +1,6642 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/filelist.xml b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/filelist.xml
new file mode 100644
index 0000000000..454b94a80a
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/filelist.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/level.pak b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/level.pak
new file mode 100644
index 0000000000..14e6b3274b
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/level.pak
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f583e0b1b7016a11583383e6c6fcd29f9e796c1a9cd4b6ddb10f7dc91deec17a
+size 3557
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/tags.txt b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/tags.txt
new file mode 100644
index 0000000000..0d6c1880e7
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignIn/tags.txt
@@ -0,0 +1,12 @@
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/ClientAuthPasswordSignUp.ly b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/ClientAuthPasswordSignUp.ly
new file mode 100644
index 0000000000..f853ec3890
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/ClientAuthPasswordSignUp.ly
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3b948461412d201b3a80abafa60e916f860e46e28109333fbd263a2d5fc53c5a
+size 9103
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/PasswordSignUp.scriptcanvas b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/PasswordSignUp.scriptcanvas
new file mode 100644
index 0000000000..632d27d5b0
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/PasswordSignUp.scriptcanvas
@@ -0,0 +1,4408 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/filelist.xml b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/filelist.xml
new file mode 100644
index 0000000000..5e47a51414
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/filelist.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/level.pak b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/level.pak
new file mode 100644
index 0000000000..72ac9c767f
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/level.pak
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8cdb456f6eb348be27249d80e9d2262e1e0bdabf2c1ff02c1a64a5609dcd823c
+size 3553
diff --git a/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/tags.txt b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/tags.txt
new file mode 100644
index 0000000000..0d6c1880e7
--- /dev/null
+++ b/AutomatedTesting/Levels/AWS/ClientAuthPasswordSignUp/tags.txt
@@ -0,0 +1,12 @@
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
diff --git a/AutomatedTesting/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/CMakeLists.txt b/CMakeLists.txt
index 2ee08a8d16..63177e9d60 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -124,13 +124,13 @@ foreach(external_directory ${LY_EXTERNAL_SUBDIRS})
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})
+ add_subdirectory(${external_directory} ${CMAKE_BINARY_DIR}/External/${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
# 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
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/AzFramework/AzFramework/Viewport/CameraInput.cpp b/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.cpp
index 79c1a28e5d..bd826544a1 100644
--- a/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.cpp
@@ -193,13 +193,12 @@ namespace AzFramework
bool handling = false;
for (auto& cameraInput : m_activeCameraInputs)
{
- cameraInput->HandleEvents(event, cursorDelta, scrollDelta);
- handling = !cameraInput->Idle() || handling;
+ handling = cameraInput->HandleEvents(event, cursorDelta, scrollDelta) || handling;
}
for (auto& cameraInput : m_idleCameraInputs)
{
- cameraInput->HandleEvents(event, cursorDelta, scrollDelta);
+ handling = cameraInput->HandleEvents(event, cursorDelta, scrollDelta) || handling;
}
return handling;
@@ -262,17 +261,26 @@ namespace AzFramework
{
m_activeCameraInputs[i]->Reset();
m_idleCameraInputs.push_back(m_activeCameraInputs[i]);
- m_activeCameraInputs[i] = m_activeCameraInputs[m_activeCameraInputs.size() - 1];
+ using AZStd::swap;
+ swap(m_activeCameraInputs[i], m_activeCameraInputs[m_activeCameraInputs.size() - 1]);
m_activeCameraInputs.pop_back();
}
}
+ void Cameras::Clear()
+ {
+ Reset();
+ AZ_Assert(m_activeCameraInputs.empty(), "Active Camera Inputs is not empty");
+
+ m_idleCameraInputs.clear();
+ }
+
RotateCameraInput::RotateCameraInput(const InputChannelId rotateChannelId)
: m_rotateChannelId(rotateChannelId)
{
}
- void RotateCameraInput::HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, [[maybe_unused]] float scrollDelta)
+ bool RotateCameraInput::HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, [[maybe_unused]] float scrollDelta)
{
const ClickDetector::ClickEvent clickEvent = [&event, this] {
if (const auto& input = AZStd::get_if(&event))
@@ -304,6 +312,11 @@ namespace AzFramework
// noop
break;
}
+
+ // note - must also check !ending to ensure the mouse up (release) event
+ // is not consumed and can be propagated to other systems.
+ // (don't swallow mouse up events)
+ return !Idle() && !Ending();
}
Camera RotateCameraInput::StepCamera(
@@ -330,7 +343,7 @@ namespace AzFramework
{
}
- void PanCameraInput::HandleEvents(
+ bool PanCameraInput::HandleEvents(
const InputEvent& event, [[maybe_unused]] const ScreenVector& cursorDelta, [[maybe_unused]] float scrollDelta)
{
if (const auto& input = AZStd::get_if(&event))
@@ -347,6 +360,8 @@ namespace AzFramework
}
}
}
+
+ return !Idle();
}
Camera PanCameraInput::StepCamera(
@@ -411,7 +426,7 @@ namespace AzFramework
{
}
- void TranslateCameraInput::HandleEvents(
+ bool TranslateCameraInput::HandleEvents(
const InputEvent& event, [[maybe_unused]] const ScreenVector& cursorDelta, [[maybe_unused]] float scrollDelta)
{
if (const auto& input = AZStd::get_if(&event))
@@ -429,7 +444,8 @@ namespace AzFramework
m_boost = true;
}
}
- else if (input->m_state == InputChannel::State::Ended)
+ // ensure we don't process end events in the idle state
+ else if (input->m_state == InputChannel::State::Ended && !Idle())
{
m_translation &= ~(translationFromKey(input->m_channelId));
if (m_translation == TranslationType::Nil)
@@ -442,6 +458,8 @@ namespace AzFramework
}
}
}
+
+ return !Idle();
}
Camera TranslateCameraInput::StepCamera(
@@ -503,7 +521,7 @@ namespace AzFramework
m_boost = false;
}
- void OrbitCameraInput::HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta)
+ bool OrbitCameraInput::HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta)
{
if (const auto* input = AZStd::get_if(&event))
{
@@ -522,8 +540,10 @@ namespace AzFramework
if (Active())
{
- m_orbitCameras.HandleEvents(event, cursorDelta, scrollDelta);
+ return m_orbitCameras.HandleEvents(event, cursorDelta, scrollDelta);
}
+
+ return !Idle();
}
Camera OrbitCameraInput::StepCamera(
@@ -533,7 +553,7 @@ namespace AzFramework
if (Beginning())
{
- const auto hasLookAt = [&nextCamera, &targetCamera, lookAtFn = m_lookAtFn] {
+ const auto hasLookAt = [&nextCamera, &targetCamera, &lookAtFn = m_lookAtFn] {
if (lookAtFn)
{
if (const auto lookAt = lookAtFn())
@@ -585,13 +605,15 @@ namespace AzFramework
return nextCamera;
}
- void OrbitDollyScrollCameraInput::HandleEvents(
+ bool OrbitDollyScrollCameraInput::HandleEvents(
const InputEvent& event, [[maybe_unused]] const ScreenVector& cursorDelta, [[maybe_unused]] float scrollDelta)
{
if (const auto* scroll = AZStd::get_if(&event))
{
BeginActivation();
}
+
+ return !Idle();
}
Camera OrbitDollyScrollCameraInput::StepCamera(
@@ -609,7 +631,7 @@ namespace AzFramework
{
}
- void OrbitDollyCursorMoveCameraInput::HandleEvents(
+ bool OrbitDollyCursorMoveCameraInput::HandleEvents(
const InputEvent& event, [[maybe_unused]] const ScreenVector& cursorDelta, [[maybe_unused]] float scrollDelta)
{
if (const auto& input = AZStd::get_if(&event))
@@ -626,6 +648,8 @@ namespace AzFramework
}
}
}
+
+ return !Idle();
}
Camera OrbitDollyCursorMoveCameraInput::StepCamera(
@@ -637,13 +661,15 @@ namespace AzFramework
return nextCamera;
}
- void ScrollTranslationCameraInput::HandleEvents(
+ bool ScrollTranslationCameraInput::HandleEvents(
const InputEvent& event, [[maybe_unused]] const ScreenVector& cursorDelta, [[maybe_unused]] float scrollDelta)
{
if (const auto* scroll = AZStd::get_if(&event))
{
BeginActivation();
}
+
+ return !Idle();
}
Camera ScrollTranslationCameraInput::StepCamera(
diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.h b/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.h
index b6b2bc1e6a..582fb5a6de 100644
--- a/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.h
+++ b/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.h
@@ -149,7 +149,7 @@ namespace AzFramework
ResetImpl();
}
- virtual void HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) = 0;
+ virtual bool HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) = 0;
virtual Camera StepCamera(const Camera& targetCamera, const ScreenVector& cursorDelta, float scrollDelta, float deltaTime) = 0;
virtual bool Exclusive() const
@@ -171,16 +171,29 @@ namespace AzFramework
class Cameras
{
public:
- void AddCamera(AZStd::shared_ptr cameraInput);
bool HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta);
Camera StepCamera(const Camera& targetCamera, const ScreenVector& cursorDelta, float scrollDelta, float deltaTime);
+
+ void AddCamera(AZStd::shared_ptr cameraInput);
+ //! Reset the state of all cameras.
void Reset();
+ //! Remove all cameras that were added.
+ void Clear();
+ //! Is one of the cameras in the active camera inputs marked as 'exclusive'.
+ //! @note This implies no other sibling cameras can begin while the exclusive camera is running.
+ bool Exclusive() const;
private:
AZStd::vector> m_activeCameraInputs;
AZStd::vector> m_idleCameraInputs;
};
+ inline bool Cameras::Exclusive() const
+ {
+ return AZStd::any_of(
+ m_activeCameraInputs.begin(), m_activeCameraInputs.end(), [](const auto& cameraInput) { return cameraInput->Exclusive(); });
+ }
+
class CameraSystem
{
public:
@@ -200,7 +213,7 @@ namespace AzFramework
explicit RotateCameraInput(InputChannelId rotateChannelId);
// CameraInput overrides ...
- void HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override;
+ bool HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override;
Camera StepCamera(const Camera& targetCamera, const ScreenVector& cursorDelta, float scrollDelta, float deltaTime) override;
private:
@@ -241,7 +254,7 @@ namespace AzFramework
PanCameraInput(InputChannelId panChannelId, PanAxesFn panAxesFn);
// CameraInput overrides ...
- void HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override;
+ bool HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override;
Camera StepCamera(const Camera& targetCamera, const ScreenVector& cursorDelta, float scrollDelta, float deltaTime) override;
private:
@@ -282,7 +295,7 @@ namespace AzFramework
explicit TranslateCameraInput(TranslationAxesFn translationAxesFn);
// CameraInput overrides ...
- void HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override;
+ bool HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override;
Camera StepCamera(const Camera& targetCamera, const ScreenVector& cursorDelta, float scrollDelta, float deltaTime) override;
void ResetImpl() override;
@@ -352,7 +365,7 @@ namespace AzFramework
{
public:
// CameraInput overrides ...
- void HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override;
+ bool HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override;
Camera StepCamera(const Camera& targetCamera, const ScreenVector& cursorDelta, float scrollDelta, float deltaTime) override;
};
@@ -362,7 +375,7 @@ namespace AzFramework
explicit OrbitDollyCursorMoveCameraInput(InputChannelId dollyChannelId);
// CameraInput overrides ...
- void HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override;
+ bool HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override;
Camera StepCamera(const Camera& targetCamera, const ScreenVector& cursorDelta, float scrollDelta, float deltaTime) override;
private:
@@ -373,7 +386,7 @@ namespace AzFramework
{
public:
// CameraInput overrides ...
- void HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override;
+ bool HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override;
Camera StepCamera(const Camera& targetCamera, const ScreenVector& cursorDelta, float scrollDelta, float deltaTime) override;
};
@@ -383,7 +396,7 @@ namespace AzFramework
using LookAtFn = AZStd::function()>;
// CameraInput overrides ...
- void HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override;
+ bool HandleEvents(const InputEvent& event, const ScreenVector& cursorDelta, float scrollDelta) override;
Camera StepCamera(const Camera& targetCamera, const ScreenVector& cursorDelta, float scrollDelta, float deltaTime) override;
bool Exclusive() const override;
diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/ClickDetector.cpp b/Code/Framework/AzFramework/AzFramework/Viewport/ClickDetector.cpp
index 4b8fbca36a..c276463554 100644
--- a/Code/Framework/AzFramework/AzFramework/Viewport/ClickDetector.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Viewport/ClickDetector.cpp
@@ -17,6 +17,17 @@ namespace AzFramework
{
ClickDetector::ClickOutcome ClickDetector::DetectClick(const ClickEvent clickEvent, const ScreenVector& cursorDelta)
{
+ const auto previousDetectionState = m_detectionState;
+ if (previousDetectionState == DetectionState::WaitingForMove)
+ {
+ // only allow the action to begin if the mouse has been moved a small amount
+ m_moveAccumulator += ScreenVectorLength(cursorDelta);
+ if (m_moveAccumulator > m_deadZone)
+ {
+ m_detectionState = DetectionState::Moved;
+ }
+ }
+
if (clickEvent == ClickEvent::Down)
{
const auto now = std::chrono::steady_clock::now();
@@ -52,15 +63,9 @@ namespace AzFramework
return clickOutcome;
}
- if (m_detectionState == DetectionState::WaitingForMove)
+ if (previousDetectionState == DetectionState::WaitingForMove && m_detectionState == DetectionState::Moved)
{
- // only allow the action to begin if the mouse has been moved a small amount
- m_moveAccumulator += ScreenVectorLength(cursorDelta);
- if (m_moveAccumulator > m_deadZone)
- {
- m_detectionState = DetectionState::Moved;
- return ClickOutcome::Move;
- }
+ return ClickOutcome::Move;
}
return ClickOutcome::Nil;
diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/ClickDetector.h b/Code/Framework/AzFramework/AzFramework/Viewport/ClickDetector.h
index 997ccd07d9..a595735d28 100644
--- a/Code/Framework/AzFramework/AzFramework/Viewport/ClickDetector.h
+++ b/Code/Framework/AzFramework/AzFramework/Viewport/ClickDetector.h
@@ -50,7 +50,11 @@ namespace AzFramework
//! Called from any type of 'handle event' function.
ClickOutcome DetectClick(ClickEvent clickEvent, const ScreenVector& cursorDelta);
+ //! Override the default double click interval.
+ //! @note Default is 400ms - system default.
void SetDoubleClickInterval(float doubleClickInterval);
+ //! Override the dead zone before a 'move' outcome will be triggered.
+ void SetDeadZone(float deadZone);
private:
//! Internal state of ClickDetector based on incoming events.
@@ -72,4 +76,9 @@ namespace AzFramework
{
m_doubleClickInterval = doubleClickInterval;
}
+
+ inline void ClickDetector::SetDeadZone(const float deadZone)
+ {
+ m_deadZone = deadZone;
+ }
} // namespace AzFramework
diff --git a/Code/Framework/AzNetworking/AzNetworking/TcpTransport/TcpSocketManager_Select.cpp b/Code/Framework/AzNetworking/AzNetworking/TcpTransport/TcpSocketManager_Select.cpp
index 4070f74d67..e8b2527638 100644
--- a/Code/Framework/AzNetworking/AzNetworking/TcpTransport/TcpSocketManager_Select.cpp
+++ b/Code/Framework/AzNetworking/AzNetworking/TcpTransport/TcpSocketManager_Select.cpp
@@ -46,6 +46,12 @@ namespace AzNetworking
void TcpSocketManager::ProcessEvents(AZ::TimeMs maxBlockMs, const SocketEventCallback& readCallback, const SocketEventCallback& writeCallback)
{
+ if(static_cast(m_maxFd) <= 0 && m_socketFds.empty())
+ {
+ // There are no available sockets to process
+ return;
+ }
+
m_readerFdSet = m_sourceFdSet;
m_writerFdSet = m_sourceFdSet;
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp
index e6bb8c7dee..571aea5875 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp
@@ -84,6 +84,7 @@ namespace AzToolsFramework
AZStd::vector entities;
AZStd::vector> instances;
+ AZStd::unordered_map nestedInstanceLinkPatchesMap;
// Retrieve all entities affected and identify Instances
if (!RetrieveAndSortPrefabEntitiesAndInstances(inputEntityList, commonRootEntityOwningInstance->get(), entities, instances))
@@ -96,6 +97,16 @@ namespace AzToolsFramework
// target templates of the other instances.
for (auto& nestedInstance : instances)
{
+ auto linkRef = m_prefabSystemComponentInterface->FindLink(nestedInstance->GetLinkId());
+
+ if (linkRef.has_value())
+ {
+ PrefabDom oldLinkPatches;
+ oldLinkPatches.CopyFrom(linkRef->get().GetLinkDom(), oldLinkPatches.GetAllocator());
+
+ nestedInstanceLinkPatchesMap.emplace(nestedInstance.get(), AZStd::move(oldLinkPatches));
+ }
+
RemoveLink(nestedInstance, commonRootEntityOwningInstance->get().GetTemplateId(), undoBatch.GetUndoBatch());
}
@@ -122,6 +133,9 @@ namespace AzToolsFramework
AZ::EntityId containerEntityId = instanceToCreate->get().GetContainerEntityId();
+ // Apply the correct transform to the container for the new instance, and store the patch for use when creating the link.
+ PrefabDom patch = ApplyContainerTransformAndGeneratePatch(containerEntityId, commonRootEntityId, topLevelEntities);
+
// Parent the non-container top level entities to the container entity.
// Parenting the top level container entities will be done during the creation of links.
for (AZ::Entity* topLevelEntity : topLevelEntities)
@@ -141,35 +155,55 @@ namespace AzToolsFramework
instanceToCreate->get().GetNestedInstances([&](AZStd::unique_ptr& nestedInstance) {
AZ_Assert(nestedInstance, "Invalid nested instance found in the new prefab created.");
+
EntityOptionalReference nestedInstanceContainerEntity = nestedInstance->GetContainerEntity();
AZ_Assert(
nestedInstanceContainerEntity, "Invalid container entity found for the nested instance used in prefab creation.");
- AZ::EntityId parentId;
- AZ::TransformBus::EventResult(
- parentId, nestedInstanceContainerEntity->get().GetId(), &AZ::TransformBus::Events::GetParentId);
+ AZ::EntityId nestedInstanceContainerEntityId = nestedInstanceContainerEntity->get().GetId();
+ PrefabDom previousPatch;
- auto entityIterator = AZStd::find_if(
- entities.begin(), entities.end(), [parentId](AZ::Entity* entity) { return entity->GetId() == parentId; });
-
- // If the previous parent entity of the nested instance is not part of the entities of the newly created prefab,
- // then set the parent of the nested prefab as the container entity of the newly created prefab.
- if (entityIterator == entities.end())
+ // Retrieve the previous patch if it exists
+ if (nestedInstanceLinkPatchesMap.contains(nestedInstance.get()))
{
- parentId = containerEntityId;
+ previousPatch = AZStd::move(nestedInstanceLinkPatchesMap[nestedInstance.get()]);
}
// These link creations shouldn't be undone because that would put the template in a non-usable state if a user
// chooses to instantiate the template after undoing the creation.
- CreateLink(
- {&nestedInstanceContainerEntity->get()}, *nestedInstance, instanceToCreate->get().GetTemplateId(),
- undoBatch.GetUndoBatch(), parentId, false);
+ CreateLink(*nestedInstance, instanceToCreate->get().GetTemplateId(), undoBatch.GetUndoBatch(), AZStd::move(previousPatch), false);
+
+ // If this nested instance's container is a top level entity in the new prefab, re-parent it and apply the change.
+ if (AZStd::find(topLevelEntities.begin(), topLevelEntities.end(), &nestedInstanceContainerEntity->get()) != topLevelEntities.end())
+ {
+ Prefab::PrefabDom containerEntityDomBefore;
+ m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomBefore, *nestedInstanceContainerEntity);
+
+ AZ::TransformBus::Event(nestedInstanceContainerEntityId, &AZ::TransformBus::Events::SetParent, containerEntityId);
+
+ PrefabDom containerEntityDomAfter;
+ m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomAfter, *nestedInstanceContainerEntity);
+
+ PrefabDom reparentPatch;
+ m_instanceToTemplateInterface->GeneratePatch(reparentPatch, containerEntityDomBefore, containerEntityDomAfter);
+ m_instanceToTemplateInterface->AppendEntityAliasToPatchPaths(reparentPatch, nestedInstanceContainerEntityId);
+
+ // Update the cache - this prevents these changes from being stored in the regular undo/redo nodes as a separate step
+ m_prefabUndoCache.Store(nestedInstanceContainerEntityId, AZStd::move(containerEntityDomAfter));
+
+ // Save these changes as patches to the link
+ PrefabUndoLinkUpdate* linkUpdate = aznew PrefabUndoLinkUpdate(AZStd::to_string(static_cast(nestedInstanceContainerEntityId)));
+ linkUpdate->SetParent(undoBatch.GetUndoBatch());
+ linkUpdate->Capture(reparentPatch, nestedInstance->GetLinkId());
+
+ linkUpdate->Redo();
+ }
});
// Create a link between the templates of the newly created instance and the instance it's being parented under.
CreateLink(
- topLevelEntities, instanceToCreate->get(), commonRootEntityOwningInstance->get().GetTemplateId(),
- undoBatch.GetUndoBatch(), commonRootEntityId);
+ instanceToCreate->get(), commonRootEntityOwningInstance->get().GetTemplateId(), undoBatch.GetUndoBatch(),
+ AZStd::move(patch));
for (AZ::Entity* topLevelEntity : topLevelEntities)
{
@@ -199,6 +233,40 @@ namespace AzToolsFramework
return AZ::Success();
}
+ PrefabDom PrefabPublicHandler::ApplyContainerTransformAndGeneratePatch(AZ::EntityId containerEntityId, AZ::EntityId parentEntityId, const EntityList& childEntities)
+ {
+ AZ::Entity* containerEntity = GetEntityById(containerEntityId);
+ AZ_Assert(containerEntity, "Invalid container entity passed to ApplyContainerTransformAndGeneratePatch.");
+
+ // Generate the transform for the container entity out of the top level entities, and set it
+ // This step needs to be done before anything is parented to the container, else children position will be wrong
+ Prefab::PrefabDom containerEntityDomBefore;
+ m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomBefore, *containerEntity);
+
+ AZ::Vector3 containerEntityTranslation(AZ::Vector3::CreateZero());
+ AZ::Quaternion containerEntityRotation(AZ::Quaternion::CreateZero());
+
+ // Set container entity to be child of common root
+ AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetParent, parentEntityId);
+
+ // Set the transform (translation, rotation) of the container entity
+ GenerateContainerEntityTransform(childEntities, containerEntityTranslation, containerEntityRotation);
+ AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetLocalTranslation, containerEntityTranslation);
+ AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, containerEntityRotation);
+
+ PrefabDom containerEntityDomAfter;
+ m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomAfter, *containerEntity);
+
+ PrefabDom patch;
+ m_instanceToTemplateInterface->GeneratePatch(patch, containerEntityDomBefore, containerEntityDomAfter);
+ m_instanceToTemplateInterface->AppendEntityAliasToPatchPaths(patch, containerEntityId);
+
+ // Update the cache - this prevents these changes from being stored in the regular undo/redo nodes
+ m_prefabUndoCache.Store(containerEntityId, AZStd::move(containerEntityDomAfter));
+
+ return AZStd::move(patch);
+ }
+
PrefabOperationResult PrefabPublicHandler::InstantiatePrefab(
AZStd::string_view filePath, AZ::EntityId parent, const AZ::Vector3& position)
{
@@ -249,10 +317,10 @@ namespace AzToolsFramework
// Initialize Undo Batch object
ScopedUndoBatch undoBatch("Instantiate Prefab");
+ // Instantiate the Prefab
PrefabDom instanceToParentUnderDomBeforeCreate;
m_instanceToTemplateInterface->GenerateDomForInstance(instanceToParentUnderDomBeforeCreate, instanceToParentUnder->get());
- // Instantiate the Prefab
auto instanceToCreate = prefabEditorEntityOwnershipInterface->InstantiatePrefab(relativePath, instanceToParentUnder);
if (!instanceToCreate)
@@ -264,11 +332,32 @@ namespace AzToolsFramework
PrefabUndoHelpers::UpdatePrefabInstance(
instanceToParentUnder->get(), "Update prefab instance", instanceToParentUnderDomBeforeCreate, undoBatch.GetUndoBatch());
- CreateLink({}, instanceToCreate->get(), instanceToParentUnder->get().GetTemplateId(), undoBatch.GetUndoBatch(), parent);
+ // Create Link with correct container patches
AZ::EntityId containerEntityId = instanceToCreate->get().GetContainerEntityId();
+ AZ::Entity* containerEntity = GetEntityById(containerEntityId);
+ AZ_Assert(containerEntity, "Invalid container entity detected in InstantiatePrefab.");
- // Apply position
+ Prefab::PrefabDom containerEntityDomBefore;
+ m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomBefore, *containerEntity);
+
+ // Set container entity's parent
+ AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetParent, parent);
+
+ // Set the position of the container entity
AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetWorldTranslation, position);
+
+ PrefabDom containerEntityDomAfter;
+ m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomAfter, *containerEntity);
+
+ // Generate patch to be stored in the link
+ PrefabDom patch;
+ m_instanceToTemplateInterface->GeneratePatch(patch, containerEntityDomBefore, containerEntityDomAfter);
+ m_instanceToTemplateInterface->AppendEntityAliasToPatchPaths(patch, containerEntityId);
+
+ CreateLink(instanceToCreate->get(), instanceToParentUnder->get().GetTemplateId(), undoBatch.GetUndoBatch(), AZStd::move(patch));
+
+ // Update the cache - this prevents these changes from being stored in the regular undo/redo nodes
+ m_prefabUndoCache.Store(containerEntityId, AZStd::move(containerEntityDomAfter));
}
return AZ::Success();
@@ -335,33 +424,9 @@ namespace AzToolsFramework
}
void PrefabPublicHandler::CreateLink(
- const EntityList& topLevelEntities, Instance& sourceInstance, TemplateId targetTemplateId,
- UndoSystem::URSequencePoint* undoBatch, AZ::EntityId commonRootEntityId, const bool isUndoRedoSupportNeeded)
+ Instance& sourceInstance, TemplateId targetTemplateId,
+ UndoSystem::URSequencePoint* undoBatch, PrefabDom patch, const bool isUndoRedoSupportNeeded)
{
- AZ::EntityId containerEntityId = sourceInstance.GetContainerEntityId();
- AZ::Entity* containerEntity = GetEntityById(containerEntityId);
- Prefab::PrefabDom containerEntityDomBefore;
- m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomBefore, *containerEntity);
-
- AZ::Vector3 containerEntityTranslation(AZ::Vector3::CreateZero());
- AZ::Quaternion containerEntityRotation(AZ::Quaternion::CreateZero());
-
- // Set the transform (translation, rotation) of the container entity
- GenerateContainerEntityTransform(topLevelEntities, containerEntityTranslation, containerEntityRotation);
-
- // Set container entity to be child of common root
- AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetParent, commonRootEntityId);
-
- AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetLocalTranslation, containerEntityTranslation);
- AZ::TransformBus::Event(containerEntityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, containerEntityRotation);
-
- PrefabDom containerEntityDomAfter;
- m_instanceToTemplateInterface->GenerateDomForEntity(containerEntityDomAfter, *containerEntity);
-
- PrefabDom patch;
- m_instanceToTemplateInterface->GeneratePatch(patch, containerEntityDomBefore, containerEntityDomAfter);
- m_instanceToTemplateInterface->AppendEntityAliasToPatchPaths(patch, containerEntityId);
-
LinkId linkId;
if (isUndoRedoSupportNeeded)
{
@@ -377,9 +442,6 @@ namespace AzToolsFramework
}
sourceInstance.SetLinkId(linkId);
-
- // Update the cache - this prevents these changes from being stored in the regular undo/redo nodes
- m_prefabUndoCache.Store(containerEntityId, AZStd::move(containerEntityDomAfter));
}
void PrefabPublicHandler::RemoveLink(
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h
index d88086dda9..5ad5b4a9cf 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h
@@ -68,20 +68,32 @@ namespace AzToolsFramework
InstanceOptionalReference GetOwnerInstanceByEntityId(AZ::EntityId entityId) const;
bool EntitiesBelongToSameInstance(const EntityIdList& entityIds) const;
+
+ /**
+ * Applies the correct transform changes to the container entity based on the parent and child entities provided, and returns an appropriate patch.
+ * The container will be parented to parentId, moved to the average transform of the future direct children and its cache will be updated.
+ * This helper function won't support undo/redo, update the templates or create any links. All that needs to be done by the caller.
+ *
+ * \param containerEntityId The container to apply the changes to.
+ * \param parentEntityId The id of the entity the container should be parented to.
+ * \param childEntities A list of entities that will subsequently be parented to this container.
+ * \return The PrefabDom containing the patches that should be stored in the parent link.
+ */
+ PrefabDom ApplyContainerTransformAndGeneratePatch(
+ AZ::EntityId containerEntityId, AZ::EntityId parentEntityId, const EntityList& childEntities);
/**
* Creates a link between the templates of an instance and its parent.
*
- * \param topLevelEntities The list of entities that are immediate children to the container entity of the instance.
* \param sourceInstance The instance that corresponds to the source template of the link.
* \param targetInstance The id of the target template.
* \param undoBatch The undo batch to set as parent for this create link action.
- * \param commonRootEntityId The id of the entity that the source instance should be parented under.
+ * \param patch The patch to store in the newly created link dom.
* \param isUndoRedoSupportNeeded The flag indicating whether the link should be created with undo/redo support or not.
*/
void CreateLink(
- const EntityList& topLevelEntities, Instance& sourceInstance, TemplateId targetTemplateId,
- UndoSystem::URSequencePoint* undoBatch, AZ::EntityId commonRootEntityId, const bool isUndoRedoSupportNeeded = true);
+ Instance& sourceInstance, TemplateId targetTemplateId, UndoSystem::URSequencePoint* undoBatch,
+ PrefabDom patch, const bool isUndoRedoSupportNeeded = true);
/**
* Removes the link between template of the sourceInstance and the template corresponding to targetTemplateId.
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp
index bc7afbf085..3edc190fb7 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp
@@ -93,28 +93,12 @@ namespace AzToolsFramework
EditorContextMenuBus::Handler::BusConnect();
PrefabInstanceContainerNotificationBus::Handler::BusConnect();
AZ::Interface::Register(this);
-
- bool prefabWipFeaturesEnabled = false;
- AzFramework::ApplicationRequests::Bus::BroadcastResult(
- prefabWipFeaturesEnabled, &AzFramework::ApplicationRequests::ArePrefabWipFeaturesEnabled);
-
- if (prefabWipFeaturesEnabled)
- {
- AssetBrowser::AssetBrowserSourceDropBus::Handler::BusConnect(s_prefabFileExtension);
- }
+ AssetBrowser::AssetBrowserSourceDropBus::Handler::BusConnect(s_prefabFileExtension);
}
PrefabIntegrationManager::~PrefabIntegrationManager()
{
- bool prefabWipFeaturesEnabled = false;
- AzFramework::ApplicationRequests::Bus::BroadcastResult(
- prefabWipFeaturesEnabled, &AzFramework::ApplicationRequests::ArePrefabWipFeaturesEnabled);
-
- if (prefabWipFeaturesEnabled)
- {
- AssetBrowser::AssetBrowserSourceDropBus::Handler::BusDisconnect();
- }
-
+ AssetBrowser::AssetBrowserSourceDropBus::Handler::BusDisconnect();
AZ::Interface::Unregister(this);
PrefabInstanceContainerNotificationBus::Handler::BusDisconnect();
EditorContextMenuBus::Handler::BusDisconnect();
@@ -137,66 +121,63 @@ namespace AzToolsFramework
void PrefabIntegrationManager::PopulateEditorGlobalContextMenu(QMenu* menu) const
{
- bool prefabWipFeaturesEnabled = false;
- AzFramework::ApplicationRequests::Bus::BroadcastResult(
- prefabWipFeaturesEnabled, &AzFramework::ApplicationRequests::ArePrefabWipFeaturesEnabled);
-
AzToolsFramework::EntityIdList selectedEntities;
AzToolsFramework::ToolsApplicationRequestBus::BroadcastResult(
selectedEntities, &AzToolsFramework::ToolsApplicationRequests::GetSelectedEntities);
- if (prefabWipFeaturesEnabled)
+ bool prefabWipFeaturesEnabled = false;
+ AzFramework::ApplicationRequests::Bus::BroadcastResult(
+ prefabWipFeaturesEnabled, &AzFramework::ApplicationRequests::ArePrefabWipFeaturesEnabled);
+
+ // Create Prefab
{
- // Create Prefab
+ if (!selectedEntities.empty())
{
- if (!selectedEntities.empty())
+ // Hide if the only selected entity is the Level Container
+ if (selectedEntities.size() > 1 || !s_prefabPublicInterface->IsLevelInstanceContainerEntity(selectedEntities[0]))
{
- // Hide if the only selected entity is the Level Container
- if (selectedEntities.size() > 1 || !s_prefabPublicInterface->IsLevelInstanceContainerEntity(selectedEntities[0]))
+ bool layerInSelection = false;
+
+ for (AZ::EntityId entityId : selectedEntities)
{
- bool layerInSelection = false;
-
- for (AZ::EntityId entityId : selectedEntities)
- {
- if (!layerInSelection)
- {
- AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
- layerInSelection, entityId,
- &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::HasLayer);
-
- if (layerInSelection)
- {
- break;
- }
- }
- }
-
- // Layers can't be in prefabs.
if (!layerInSelection)
{
- QAction* createAction = menu->addAction(QObject::tr("Create Prefab..."));
- createAction->setToolTip(QObject::tr("Creates a prefab out of the currently selected entities."));
+ AzToolsFramework::Layers::EditorLayerComponentRequestBus::EventResult(
+ layerInSelection, entityId,
+ &AzToolsFramework::Layers::EditorLayerComponentRequestBus::Events::HasLayer);
- QObject::connect(createAction, &QAction::triggered, createAction, [this, selectedEntities] {
- ContextMenu_CreatePrefab(selectedEntities);
- });
+ if (layerInSelection)
+ {
+ break;
+ }
}
}
+
+ // Layers can't be in prefabs.
+ if (!layerInSelection)
+ {
+ QAction* createAction = menu->addAction(QObject::tr("Create Prefab..."));
+ createAction->setToolTip(QObject::tr("Creates a prefab out of the currently selected entities."));
+
+ QObject::connect(createAction, &QAction::triggered, createAction, [this, selectedEntities] {
+ ContextMenu_CreatePrefab(selectedEntities);
+ });
+ }
}
}
-
- // Instantiate Prefab
- {
- QAction* instantiateAction = menu->addAction(QObject::tr("Instantiate Prefab..."));
- instantiateAction->setToolTip(QObject::tr("Instantiates a prefab file in the scene."));
-
- QObject::connect(
- instantiateAction, &QAction::triggered, instantiateAction, [this] { ContextMenu_InstantiatePrefab(); });
- }
-
- menu->addSeparator();
}
+ // Instantiate Prefab
+ {
+ QAction* instantiateAction = menu->addAction(QObject::tr("Instantiate Prefab..."));
+ instantiateAction->setToolTip(QObject::tr("Instantiates a prefab file in the scene."));
+
+ QObject::connect(
+ instantiateAction, &QAction::triggered, instantiateAction, [this] { ContextMenu_InstantiatePrefab(); });
+ }
+
+ menu->addSeparator();
+
bool itemWasShown = false;
// Edit/Save Prefab
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h
index ee95412376..8e91dc945d 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h
@@ -18,6 +18,7 @@
#include
#include
#include
+#include
#include
#include
@@ -304,4 +305,24 @@ namespace AzToolsFramework
return entityContextId;
}
+
+ //! Maps a mouse interaction event to a ClickDetector event.
+ //! @note Function only cares about up or down events, all other events are mapped to Nil (ignored).
+ inline AzFramework::ClickDetector::ClickEvent ClickDetectorEventFromViewportInteraction(
+ const ViewportInteraction::MouseInteractionEvent& mouseInteraction)
+ {
+ if (mouseInteraction.m_mouseInteraction.m_mouseButtons.Left())
+ {
+ if (mouseInteraction.m_mouseEvent == ViewportInteraction::MouseEvent::Down)
+ {
+ return AzFramework::ClickDetector::ClickEvent::Down;
+ }
+
+ if (mouseInteraction.m_mouseEvent == ViewportInteraction::MouseEvent::Up)
+ {
+ return AzFramework::ClickDetector::ClickEvent::Up;
+ }
+ }
+ return AzFramework::ClickDetector::ClickEvent::Nil;
+ }
} // namespace AzToolsFramework
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.cpp
index 2e467caa4c..531cffb561 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.cpp
@@ -14,6 +14,7 @@
#include
#include
+#include
#include
@@ -27,8 +28,11 @@ namespace AzToolsFramework
{
AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::AzToolsFramework);
- if (mouseInteraction.m_mouseInteraction.m_mouseButtons.Left() &&
- mouseInteraction.m_mouseEvent == ViewportInteraction::MouseEvent::Down)
+ m_cursorState.SetCurrentPosition(mouseInteraction.m_mouseInteraction.m_mousePick.m_screenCoordinates);
+
+ const auto selectClickEvent = ClickDetectorEventFromViewportInteraction(mouseInteraction);
+ const auto clickOutcome = m_clickDetector.DetectClick(selectClickEvent, m_cursorState.CursorDelta());
+ if (clickOutcome == AzFramework::ClickDetector::ClickOutcome::Move)
{
if (m_leftMouseDown)
{
@@ -58,8 +62,7 @@ namespace AzToolsFramework
}
}
- if (mouseInteraction.m_mouseInteraction.m_mouseButtons.Left() &&
- mouseInteraction.m_mouseEvent == ViewportInteraction::MouseEvent::Up)
+ if (clickOutcome == AzFramework::ClickDetector::ClickOutcome::Release)
{
if (m_leftMouseUp)
{
@@ -77,6 +80,8 @@ namespace AzToolsFramework
{
AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::AzToolsFramework);
+ m_cursorState.Update();
+
if (m_boxSelectRegion)
{
debugDisplay.DepthTestOff();
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.h
index 7f50b16325..c115220755 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.h
@@ -14,6 +14,8 @@
#include
#include
+#include
+#include
#include
#include
@@ -26,49 +28,49 @@ namespace AzFramework
namespace AzToolsFramework
{
- /// Utility to provide box select (click and drag) support for viewport types.
- /// Users can override the mouse event callbacks and display scene function to customize behavior.
+ //! Utility to provide box select (click and drag) support for viewport types.
+ //! Users can override the mouse event callbacks and display scene function to customize behavior.
class EditorBoxSelect
{
public:
EditorBoxSelect() = default;
- /// Return if a box select action is currently taking place.
+ //! Return if a box select action is currently taking place.
bool Active() const { return m_boxSelectRegion.has_value(); }
- /// Update the box select for various mouse events.
- /// Call HandleMouseInteraction from type/system implementing MouseViewportRequests interface.
+ //! Update the box select for various mouse events.
+ //! Call HandleMouseInteraction from type/system implementing MouseViewportRequests interface.
void HandleMouseInteraction(
const ViewportInteraction::MouseInteractionEvent& mouseInteraction);
- /// Responsible for drawing the 2d box representing the selection in screen space.
+ //! Responsible for drawing the 2d box representing the selection in screen space.
void Display2d(const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay);
- /// Custom drawing behavior to happen during a box select.
+ //! Custom drawing behavior to happen during a box select.
void DisplayScene(
const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay);
- /// Set the left mouse down callback.
+ //! Set the left mouse down callback.
void InstallLeftMouseDown(
const AZStd::function& leftMouseDown);
- /// Set the mouse move callback.
+ //! Set the mouse move callback.
void InstallMouseMove(
const AZStd::function& mouseMove);
- /// Set the left mouse up callback.
+ //! Set the left mouse up callback.
void InstallLeftMouseUp(
const AZStd::function& leftMouseUp);
- /// Set the display scene callback.
+ //! Set the display scene callback.
void InstallDisplayScene(
const AZStd::function& displayScene);
- /// Return the box select region.
- /// If a box selection is being made, return the current rectangle representing the area.
- /// If there is currently no active box select, then the Maybe type will be empty (there will be no region/area).
+ //! Return the box select region.
+ //! If a box selection is being made, return the current rectangle representing the area.
+ //! If there is currently no active box select, then the Maybe type will be empty (there will be no region/area).
const AZStd::optional& BoxRegion() const { return m_boxSelectRegion; }
- /// Return the active modifiers from the previous frame.
+ //! Return the active modifiers from the previous frame.
ViewportInteraction::KeyboardModifiers PreviousModifiers() const { return m_previousModifiers; }
private:
@@ -79,7 +81,9 @@ namespace AzToolsFramework
AZStd::function m_displayScene;
- AZStd::optional m_boxSelectRegion; ///< Maybe/optional value to store box select region while active.
- ViewportInteraction::KeyboardModifiers m_previousModifiers; ///< Modifier keys active on the previous frame.
+ AZStd::optional m_boxSelectRegion; //!< Maybe/optional value to store box select region while active.
+ ViewportInteraction::KeyboardModifiers m_previousModifiers; //!< Modifier keys active on the previous frame.
+ AzFramework::ClickDetector m_clickDetector; //!< Utility type to detect if a mouse click or move has occurred.
+ AzFramework::CursorState m_cursorState; //!< Utility type to track the current cursor position (and movement/delta).
};
} // namespace AzToolsFramework
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp
index 6e49f7c601..91644dc6ac 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp
@@ -1782,22 +1782,7 @@ namespace AzToolsFramework
m_cachedEntityIdUnderCursor = m_editorHelpers->HandleMouseInteraction(cameraState, mouseInteraction);
- const AzFramework::ClickDetector::ClickEvent selectClickEvent = [&mouseInteraction] {
- if (mouseInteraction.m_mouseInteraction.m_mouseButtons.Left())
- {
- if (mouseInteraction.m_mouseEvent == ViewportInteraction::MouseEvent::Down)
- {
- return AzFramework::ClickDetector::ClickEvent::Down;
- }
-
- if (mouseInteraction.m_mouseEvent == ViewportInteraction::MouseEvent::Up)
- {
- return AzFramework::ClickDetector::ClickEvent::Up;
- }
- }
- return AzFramework::ClickDetector::ClickEvent::Nil;
- }();
-
+ const auto selectClickEvent = ClickDetectorEventFromViewportInteraction(mouseInteraction);
m_cursorState.SetCurrentPosition(mouseInteraction.m_mouseInteraction.m_mousePick.m_screenCoordinates);
const auto clickOutcome = m_clickDetector.DetectClick(selectClickEvent, m_cursorState.CursorDelta());
diff --git a/Code/Framework/Tests/CameraInputTests.cpp b/Code/Framework/Tests/CameraInputTests.cpp
new file mode 100644
index 0000000000..6fe9837c22
--- /dev/null
+++ b/Code/Framework/Tests/CameraInputTests.cpp
@@ -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.
+ *
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace UnitTest
+{
+ class CameraInputFixture : public AllocatorsTestFixture
+ {
+ public:
+ AzFramework::Camera m_camera;
+ AzFramework::Camera m_targetCamera;
+ AZStd::shared_ptr m_cameraSystem;
+
+ bool HandleEventAndUpdate(const AzFramework::InputEvent& event)
+ {
+ constexpr float deltaTime = 0.01666f; // 60fps
+ const bool consumed = m_cameraSystem->HandleEvents(event);
+ m_camera = m_cameraSystem->StepCamera(m_targetCamera, deltaTime);
+ return consumed;
+ }
+
+ void SetUp() override
+ {
+ AllocatorsTestFixture::SetUp();
+
+ AzFramework::ReloadCameraKeyBindings();
+
+ m_cameraSystem = AZStd::make_shared();
+
+ auto firstPersonRotateCamera = AZStd::make_shared(AzFramework::InputDeviceMouse::Button::Right);
+ auto firstPersonTranslateCamera = AZStd::make_shared(AzFramework::LookTranslation);
+
+ auto orbitCamera = AZStd::make_shared();
+ auto orbitRotateCamera = AZStd::make_shared(AzFramework::InputDeviceMouse::Button::Left);
+ auto orbitTranslateCamera = AZStd::make_shared(AzFramework::OrbitTranslation);
+
+ orbitCamera->m_orbitCameras.AddCamera(orbitRotateCamera);
+ orbitCamera->m_orbitCameras.AddCamera(orbitTranslateCamera);
+
+ m_cameraSystem->m_cameras.AddCamera(firstPersonRotateCamera);
+ m_cameraSystem->m_cameras.AddCamera(firstPersonTranslateCamera);
+ m_cameraSystem->m_cameras.AddCamera(orbitCamera);
+ }
+
+ void TearDown() override
+ {
+ m_cameraSystem->m_cameras.Clear();
+ m_cameraSystem.reset();
+
+ AllocatorsTestFixture::TearDown();
+ }
+ };
+
+ TEST_F(CameraInputFixture, BeginEndOrbitCameraConsumesCorrectEvents)
+ {
+ // set initial mouse position
+ const bool consumed1 = HandleEventAndUpdate(AzFramework::CursorEvent{AzFramework::ScreenPoint(5, 5)});
+ // begin orbit camera
+ const bool consumed2 = HandleEventAndUpdate(
+ AzFramework::DiscreteInputEvent{AzFramework::InputDeviceKeyboard::Key::ModifierAltL, AzFramework::InputChannel::State::Began});
+ // begin listening for orbit rotate (click detector) - event is not consumed
+ const bool consumed3 = HandleEventAndUpdate(
+ AzFramework::DiscreteInputEvent{AzFramework::InputDeviceMouse::Button::Left, AzFramework::InputChannel::State::Began});
+ // begin orbit rotate (mouse has moved sufficient distance to initiate)
+ const bool consumed4 = HandleEventAndUpdate(AzFramework::CursorEvent{AzFramework::ScreenPoint(10, 10)});
+ // end orbit (mouse up) - event is not consumed
+ const bool consumed5 = HandleEventAndUpdate(
+ AzFramework::DiscreteInputEvent{AzFramework::InputDeviceMouse::Button::Left, AzFramework::InputChannel::State::Ended});
+
+ const auto allConsumed = AZStd::vector{consumed1, consumed2, consumed3, consumed4, consumed5};
+
+ using ::testing::ElementsAre;
+ EXPECT_THAT(allConsumed, ElementsAre(false, true, false, true, false));
+ }
+} // namespace UnitTest
diff --git a/Code/Framework/Tests/ClickDetectorTests.cpp b/Code/Framework/Tests/ClickDetectorTests.cpp
index 7e6f9634c8..64f06ee66c 100644
--- a/Code/Framework/Tests/ClickDetectorTests.cpp
+++ b/Code/Framework/Tests/ClickDetectorTests.cpp
@@ -139,4 +139,21 @@ namespace UnitTest
EXPECT_THAT(secondaryDownOutcome, Eq(ClickDetector::ClickOutcome::Nil)); // ignored double click
EXPECT_THAT(secondaryUpOutcome, Eq(ClickDetector::ClickOutcome::Nil)); // click not registered
}
+
+ // if the click detector registers a mouse down event, but then all intermediate calls are ignored
+ // (another system may start intercepting events and swallowing them) then when we do receive a mouse
+ // up event we should ensure we take into account the current delta - if the delta is large, then the
+ // outcome will be release
+ TEST_F(ClickDetectorFixture, ClickIsNotRegisteredAfterIgnoringMouseMovesBeforeMouseUpWithLargeDelta)
+ {
+ using ::testing::Eq;
+
+ const ClickDetector::ClickOutcome downOutcome =
+ m_clickDetector.DetectClick(ClickDetector::ClickEvent::Down, ScreenVector(0, 0));
+ const ClickDetector::ClickOutcome upOutcome =
+ m_clickDetector.DetectClick(ClickDetector::ClickEvent::Up, ScreenVector(50, 50));
+
+ EXPECT_THAT(downOutcome, Eq(ClickDetector::ClickOutcome::Nil));
+ EXPECT_THAT(upOutcome, Eq(ClickDetector::ClickOutcome::Release));
+ }
} // namespace UnitTest
diff --git a/Code/Framework/Tests/frameworktests_files.cmake b/Code/Framework/Tests/frameworktests_files.cmake
index e249cf6e64..197bcc9fce 100644
--- a/Code/Framework/Tests/frameworktests_files.cmake
+++ b/Code/Framework/Tests/frameworktests_files.cmake
@@ -17,6 +17,7 @@ set(FILES
BinToTextEncode.cpp
ComponentAddRemove.cpp
ComponentAdapterTests.cpp
+ CameraInputTests.cpp
ClickDetectorTests.cpp
CursorStateTests.cpp
EntityContext.cpp
diff --git a/Code/Sandbox/Editor/EditorViewportWidget.cpp b/Code/Sandbox/Editor/EditorViewportWidget.cpp
index 85c40f2092..f72801a4d3 100644
--- a/Code/Sandbox/Editor/EditorViewportWidget.cpp
+++ b/Code/Sandbox/Editor/EditorViewportWidget.cpp
@@ -457,15 +457,6 @@ void EditorViewportWidget::Update()
return;
}
- static bool sentOnWindowCreated = false;
- if (!sentOnWindowCreated && windowHandle()->isActive())
- {
- sentOnWindowCreated = true;
- AzFramework::WindowSystemNotificationBus::Broadcast(
- &AzFramework::WindowSystemNotificationBus::Handler::OnWindowCreated,
- reinterpret_cast(winId()));
- }
-
m_updatingCameraPosition = true;
if (!ed_useNewCameraSystem)
{
diff --git a/Code/Sandbox/Editor/ModernViewportCameraController.cpp b/Code/Sandbox/Editor/ModernViewportCameraController.cpp
index af161af493..83ab2ef0b5 100644
--- a/Code/Sandbox/Editor/ModernViewportCameraController.cpp
+++ b/Code/Sandbox/Editor/ModernViewportCameraController.cpp
@@ -97,17 +97,38 @@ namespace SandboxEditor
AzFramework::ViewportDebugDisplayEventBus::Handler::BusDisconnect();
}
+ // should the camera system respond to this particular event
+ static bool ShouldHandle(const AzFramework::ViewportControllerPriority priority, const bool exclusive)
+ {
+ // ModernViewportCameraControllerInstance receives events at all priorities, it should only respond
+ // to normal priority events if it is not in 'exclusive' mode and when in 'exclusive' mode it should
+ // only respond to the highest priority events
+ return !exclusive && priority == AzFramework::ViewportControllerPriority::Normal ||
+ exclusive && priority == AzFramework::ViewportControllerPriority::Highest;
+ }
+
bool ModernViewportCameraControllerInstance::HandleInputChannelEvent(const AzFramework::ViewportControllerInputEvent& event)
{
AzFramework::WindowSize windowSize;
AzFramework::WindowRequestBus::EventResult(
windowSize, event.m_windowHandle, &AzFramework::WindowRequestBus::Events::GetClientAreaSize);
- return m_cameraSystem.HandleEvents(AzFramework::BuildInputEvent(event.m_inputChannel, windowSize));
+ if (ShouldHandle(event.m_priority, m_cameraSystem.m_cameras.Exclusive()))
+ {
+ return m_cameraSystem.HandleEvents(AzFramework::BuildInputEvent(event.m_inputChannel, windowSize));
+ }
+
+ return false;
}
void ModernViewportCameraControllerInstance::UpdateViewport(const AzFramework::ViewportControllerUpdateEvent& event)
{
+ // only update for a single priority (normal is the default)
+ if (event.m_priority != AzFramework::ViewportControllerPriority::Normal)
+ {
+ return;
+ }
+
if (auto viewportContext = RetrieveViewportContext(GetViewportId()))
{
m_updatingTransform = true;
diff --git a/Code/Sandbox/Editor/ModernViewportCameraController.h b/Code/Sandbox/Editor/ModernViewportCameraController.h
index 066c8efaa8..39e3c9cbb3 100644
--- a/Code/Sandbox/Editor/ModernViewportCameraController.h
+++ b/Code/Sandbox/Editor/ModernViewportCameraController.h
@@ -22,7 +22,9 @@
namespace SandboxEditor
{
class ModernViewportCameraControllerInstance;
- class ModernViewportCameraController : public AzFramework::MultiViewportController
+ class ModernViewportCameraController
+ : public AzFramework::MultiViewportController<
+ ModernViewportCameraControllerInstance, AzFramework::ViewportControllerPriority::DispatchToAllPriorities>
{
public:
using CameraListBuilder = AZStd::function;
diff --git a/Code/Tools/ProjectManager/Resources/ArrowDownLine.svg b/Code/Tools/ProjectManager/Resources/ArrowDownLine.svg
new file mode 100644
index 0000000000..8418431f11
--- /dev/null
+++ b/Code/Tools/ProjectManager/Resources/ArrowDownLine.svg
@@ -0,0 +1,3 @@
+
diff --git a/Code/Tools/ProjectManager/Resources/ArrowUpLine.svg b/Code/Tools/ProjectManager/Resources/ArrowUpLine.svg
new file mode 100644
index 0000000000..d7f26fdad5
--- /dev/null
+++ b/Code/Tools/ProjectManager/Resources/ArrowUpLine.svg
@@ -0,0 +1,3 @@
+
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp
index 5737a188de..3c221d6055 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp
@@ -58,13 +58,6 @@ namespace O3DE::ProjectManager
hLayout->addWidget(m_gemListView);
hLayout->addWidget(m_gemInspector);
-
-
- // Select the first entry after everything got correctly sized
- QTimer::singleShot(100, [=]{
- QModelIndex firstModelIndex = m_gemListView->model()->index(0,0);
- m_gemListView->selectionModel()->select(firstModelIndex, QItemSelectionModel::ClearAndSelect);
- });
}
QVector GemCatalogScreen::GenerateTestData()
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemInfo.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemInfo.cpp
index 729935fc8e..5b7127bdbe 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemInfo.cpp
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemInfo.cpp
@@ -32,21 +32,36 @@ namespace O3DE::ProjectManager
{
switch (platform)
{
- case O3DE::ProjectManager::GemInfo::Android:
+ case Android:
return "Android";
- case O3DE::ProjectManager::GemInfo::iOS:
+ case iOS:
return "iOS";
- case O3DE::ProjectManager::GemInfo::Linux:
+ case Linux:
return "Linux";
- case O3DE::ProjectManager::GemInfo::macOS:
+ case macOS:
return "macOS";
- case O3DE::ProjectManager::GemInfo::Windows:
+ case Windows:
return "Windows";
default:
return "";
}
}
+ QString GemInfo::GetTypeString(Type type)
+ {
+ switch (type)
+ {
+ case Asset:
+ return "Asset";
+ case Code:
+ return "Code";
+ case Tool:
+ return "Tool";
+ default:
+ return "";
+ }
+ }
+
bool GemInfo::IsPlatformSupported(Platform platform) const
{
return (m_platforms & platform);
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemInfo.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemInfo.h
index 7ee619702f..28b2fab451 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemInfo.h
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemInfo.h
@@ -36,6 +36,16 @@ namespace O3DE::ProjectManager
Q_DECLARE_FLAGS(Platforms, Platform)
static QString GetPlatformString(Platform platform);
+ enum Type
+ {
+ Asset = 1 << 0,
+ Code = 1 << 1,
+ Tool = 1 << 2,
+ NumTypes = 3
+ };
+ Q_DECLARE_FLAGS(Types, Type)
+ static QString GetTypeString(Type type);
+
GemInfo() = default;
GemInfo(const QString& name, const QString& creator, const QString& summary, Platforms platforms, bool isAdded);
bool IsPlatformSupported(Platform platform) const;
@@ -50,6 +60,7 @@ namespace O3DE::ProjectManager
bool m_isAdded = false; //! Is the gem currently added and enabled in the project?
QString m_summary;
Platforms m_platforms;
+ Types m_types; //! Asset and/or Code and/or Tool
QStringList m_features;
QString m_directoryLink;
QString m_documentationLink;
@@ -62,3 +73,4 @@ namespace O3DE::ProjectManager
} // namespace O3DE::ProjectManager
Q_DECLARE_OPERATORS_FOR_FLAGS(O3DE::ProjectManager::GemInfo::Platforms)
+Q_DECLARE_OPERATORS_FOR_FLAGS(O3DE::ProjectManager::GemInfo::Types)
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.cpp
index 1112c656f3..addf59783d 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.cpp
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.cpp
@@ -10,7 +10,8 @@
*
*/
-#include "GemModel.h"
+#include
+#include
namespace O3DE::ProjectManager
{
@@ -32,8 +33,11 @@ namespace O3DE::ProjectManager
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
item->setData(gemInfo.m_name, RoleName);
+ const QString uuidString = gemInfo.m_uuid.ToString().c_str();
+ item->setData(uuidString, RoleUuid);
item->setData(gemInfo.m_creator, RoleCreator);
- item->setData(static_cast(gemInfo.m_platforms), RolePlatforms);
+ item->setData(aznumeric_cast(gemInfo.m_platforms), RolePlatforms);
+ item->setData(aznumeric_cast(gemInfo.m_types), RoleTypes);
item->setData(gemInfo.m_summary, RoleSummary);
item->setData(gemInfo.m_isAdded, RoleIsAdded);
@@ -48,6 +52,8 @@ namespace O3DE::ProjectManager
item->setData(gemInfo.m_features, RoleFeatures);
appendRow(item);
+
+ m_uuidToNameMap[uuidString] = gemInfo.m_displayName;
}
void GemModel::Clear()
@@ -65,11 +71,21 @@ namespace O3DE::ProjectManager
return modelIndex.data(RoleCreator).toString();
}
+ QString GemModel::GetUuidString(const QModelIndex& modelIndex)
+ {
+ return modelIndex.data(RoleUuid).toString();
+ }
+
GemInfo::Platforms GemModel::GetPlatforms(const QModelIndex& modelIndex)
{
return static_cast(modelIndex.data(RolePlatforms).toInt());
}
+ GemInfo::Types GemModel::GetTypes(const QModelIndex& modelIndex)
+ {
+ return static_cast(modelIndex.data(RoleTypes).toInt());
+ }
+
QString GemModel::GetSummary(const QModelIndex& modelIndex)
{
return modelIndex.data(RoleSummary).toString();
@@ -90,9 +106,35 @@ namespace O3DE::ProjectManager
return modelIndex.data(RoleDocLink).toString();
}
+ AZ::Outcome GemModel::FindGemNameByUuidString(const QString& uuidString) const
+ {
+ const auto iterator = m_uuidToNameMap.find(uuidString);
+ if (iterator != m_uuidToNameMap.end())
+ {
+ return AZ::Success(iterator.value());
+ }
+
+ return AZ::Failure();
+ }
+
QStringList GemModel::GetDependingGems(const QModelIndex& modelIndex)
{
- return modelIndex.data(RoleDependingGems).toStringList();
+ QStringList result = modelIndex.data(RoleDependingGems).toStringList();
+ if (result.isEmpty())
+ {
+ return {};
+ }
+
+ for (QString& dependingGemString : result)
+ {
+ AZ::Outcome gemNameOutcome = FindGemNameByUuidString(dependingGemString);
+ if (gemNameOutcome.IsSuccess())
+ {
+ dependingGemString = gemNameOutcome.GetValue();
+ }
+ }
+
+ return result;
}
QStringList GemModel::GetConflictingGems(const QModelIndex& modelIndex)
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.h
index fba65e7009..76211b1f22 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.h
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.h
@@ -13,7 +13,8 @@
#pragma once
#if !defined(Q_MOC_RUN)
-#include "GemInfo.h"
+#include
+#include
#include
#include
#include
@@ -33,14 +34,18 @@ namespace O3DE::ProjectManager
void AddGem(const GemInfo& gemInfo);
void Clear();
+ AZ::Outcome FindGemNameByUuidString(const QString& uuidString) const;
+ QStringList GetDependingGems(const QModelIndex& modelIndex);
+
static QString GetName(const QModelIndex& modelIndex);
static QString GetCreator(const QModelIndex& modelIndex);
+ static QString GetUuidString(const QModelIndex& modelIndex);
static GemInfo::Platforms GetPlatforms(const QModelIndex& modelIndex);
+ static GemInfo::Types GetTypes(const QModelIndex& modelIndex);
static QString GetSummary(const QModelIndex& modelIndex);
static bool IsAdded(const QModelIndex& modelIndex);
static QString GetDirectoryLink(const QModelIndex& modelIndex);
static QString GetDocLink(const QModelIndex& modelIndex);
- static QStringList GetDependingGems(const QModelIndex& modelIndex);
static QStringList GetConflictingGems(const QModelIndex& modelIndex);
static QString GetVersion(const QModelIndex& modelIndex);
static QString GetLastUpdated(const QModelIndex& modelIndex);
@@ -51,6 +56,7 @@ namespace O3DE::ProjectManager
enum UserRole
{
RoleName = Qt::UserRole,
+ RoleUuid,
RoleCreator,
RolePlatforms,
RoleSummary,
@@ -63,8 +69,10 @@ namespace O3DE::ProjectManager
RoleLastUpdated,
RoleBinarySize,
RoleFeatures,
+ RoleTypes
};
+ QHash m_uuidToNameMap;
QItemSelectionModel* m_selectionModel = nullptr;
};
} // namespace O3DE::ProjectManager
diff --git a/Code/Tools/ProjectManager/Source/LinkWidget.cpp b/Code/Tools/ProjectManager/Source/LinkWidget.cpp
index fddc4cd8c9..a6308f6c62 100644
--- a/Code/Tools/ProjectManager/Source/LinkWidget.cpp
+++ b/Code/Tools/ProjectManager/Source/LinkWidget.cpp
@@ -27,7 +27,12 @@ namespace O3DE::ProjectManager
void LinkLabel::mousePressEvent([[maybe_unused]] QMouseEvent* event)
{
- QDesktopServices::openUrl(m_url);
+ if (m_url.isValid())
+ {
+ QDesktopServices::openUrl(m_url);
+ }
+
+ emit clicked();
}
void LinkLabel::enterEvent([[maybe_unused]] QEvent* event)
diff --git a/Code/Tools/ProjectManager/Source/LinkWidget.h b/Code/Tools/ProjectManager/Source/LinkWidget.h
index 7055dce2af..b3a34cd63a 100644
--- a/Code/Tools/ProjectManager/Source/LinkWidget.h
+++ b/Code/Tools/ProjectManager/Source/LinkWidget.h
@@ -26,10 +26,16 @@ namespace O3DE::ProjectManager
class LinkLabel
: public QLabel
{
+ Q_OBJECT // AUTOMOC
+
public:
- LinkLabel(const QString& text, const QUrl& url = {}, QWidget* parent = nullptr);
+ LinkLabel(const QString& text = {}, const QUrl& url = {}, QWidget* parent = nullptr);
void SetUrl(const QUrl& url);
+
+ signals:
+ void clicked();
+
private:
void mousePressEvent(QMouseEvent* event) override;
void enterEvent(QEvent* event) override;
diff --git a/Code/Tools/ProjectManager/Source/PythonBindings.cpp b/Code/Tools/ProjectManager/Source/PythonBindings.cpp
index e925c81032..e4642c95e0 100644
--- a/Code/Tools/ProjectManager/Source/PythonBindings.cpp
+++ b/Code/Tools/ProjectManager/Source/PythonBindings.cpp
@@ -426,7 +426,7 @@ namespace O3DE::ProjectManager
{
// required
gemInfo.m_name = Py_To_String(data["Name"]);
- gemInfo.m_uuid = AZ::Uuid(Py_To_String(data["Uuid"]));
+ gemInfo.m_uuid = AZ::Uuid(Py_To_String(data["Uuid"]));
// optional
gemInfo.m_displayName = Py_To_String_Optional(data, "DisplayName", gemInfo.m_name);
@@ -437,7 +437,8 @@ namespace O3DE::ProjectManager
{
for (auto dependency : data["Dependencies"])
{
- gemInfo.m_dependingGemUuids.push_back(Py_To_String(dependency["Uuid"]));
+ const AZ::Uuid uuid = Py_To_String(dependency["Uuid"]);
+ gemInfo.m_dependingGemUuids.push_back(uuid.ToString().c_str());
}
}
if (data.contains("Tags"))
@@ -507,6 +508,42 @@ namespace O3DE::ProjectManager
}
}
+ bool PythonBindings::AddGemToProject(const QString& gemPath, const QString& projectPath)
+ {
+ bool result = ExecuteWithLock([&] {
+ pybind11::str pyGemPath = gemPath.toStdString();
+ pybind11::str pyProjectPath = projectPath.toStdString();
+
+ m_registration.attr("add_gem_to_project")(
+ pybind11::none(), // gem_name
+ pyGemPath,
+ pybind11::none(), // gem_target
+ pybind11::none(), // project_name
+ pyProjectPath
+ );
+ });
+
+ return result;
+ }
+
+ bool PythonBindings::RemoveGemFromProject(const QString& gemPath, const QString& projectPath)
+ {
+ bool result = ExecuteWithLock([&] {
+ pybind11::str pyGemPath = gemPath.toStdString();
+ pybind11::str pyProjectPath = projectPath.toStdString();
+
+ m_registration.attr("remove_gem_to_project")(
+ pybind11::none(), // gem_name
+ pyGemPath,
+ pybind11::none(), // gem_target
+ pybind11::none(), // project_name
+ pyProjectPath
+ );
+ });
+
+ return result;
+ }
+
bool PythonBindings::UpdateProject([[maybe_unused]] const ProjectInfo& projectInfo)
{
return false;
diff --git a/Code/Tools/ProjectManager/Source/PythonBindings.h b/Code/Tools/ProjectManager/Source/PythonBindings.h
index ffabf99b49..892e13a65b 100644
--- a/Code/Tools/ProjectManager/Source/PythonBindings.h
+++ b/Code/Tools/ProjectManager/Source/PythonBindings.h
@@ -47,6 +47,8 @@ namespace O3DE::ProjectManager
AZ::Outcome GetProject(const QString& path) override;
AZ::Outcome> GetProjects() override;
bool UpdateProject(const ProjectInfo& projectInfo) override;
+ bool AddGemToProject(const QString& gemPath, const QString& projectPath) override;
+ bool RemoveGemFromProject(const QString& gemPath, const QString& projectPath) override;
// ProjectTemplate
AZ::Outcome> GetProjectTemplates() override;
diff --git a/Code/Tools/ProjectManager/Source/PythonBindingsInterface.h b/Code/Tools/ProjectManager/Source/PythonBindingsInterface.h
index 2377da1461..b5c8f1a76a 100644
--- a/Code/Tools/ProjectManager/Source/PythonBindingsInterface.h
+++ b/Code/Tools/ProjectManager/Source/PythonBindingsInterface.h
@@ -96,6 +96,22 @@ namespace O3DE::ProjectManager
*/
virtual bool UpdateProject(const ProjectInfo& projectInfo) = 0;
+ /**
+ * Add a gem to a project
+ * @param gemPath the absolute path to the gem
+ * @param projectPath the absolute path to the project
+ * @return true on success, false on failure
+ */
+ virtual bool AddGemToProject(const QString& gemPath, const QString& projectPath) = 0;
+
+ /**
+ * Remove gem to a project
+ * @param gemPath the absolute path to the gem
+ * @param projectPath the absolute path to the project
+ * @return true on success, false on failure
+ */
+ virtual bool RemoveGemFromProject(const QString& gemPath, const QString& projectPath) = 0;
+
// Project Templates
diff --git a/Code/Tools/ProjectManager/project_manager.qrc b/Code/Tools/ProjectManager/project_manager.qrc
index 3c23bc24ff..f36633142f 100644
--- a/Code/Tools/ProjectManager/project_manager.qrc
+++ b/Code/Tools/ProjectManager/project_manager.qrc
@@ -9,6 +9,8 @@
Resources/iOS.svg
Resources/Linux.svg
Resources/macOS.svg
+ Resources/ArrowDownLine.svg
+ Resources/ArrowUpLine.svg
Resources/Backgrounds/FirstTimeBackgroundImage.jpg
diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp
index 3dc14814de..d2818f3653 100644
--- a/Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp
+++ b/Code/Tools/SceneAPI/FbxSceneBuilder/DllMain.cpp
@@ -41,18 +41,6 @@ namespace AZ
static AZ::SceneAPI::FbxSceneImporter::FbxImportRequestHandler* g_fbxImporter = nullptr;
static AZStd::vector g_componentDescriptors;
- void Initialize()
- {
- // Currently it's still needed to explicitly create an instance of this instead of letting
- // it be a normal component. This is because ResourceCompilerScene needs to return
- // the list of available extensions before it can start the application.
- if (!g_fbxImporter)
- {
- g_fbxImporter = aznew AZ::SceneAPI::FbxSceneImporter::FbxImportRequestHandler();
- g_fbxImporter->Activate();
- }
- }
-
void Reflect(AZ::SerializeContext* /*context*/)
{
// Descriptor registration is done in Reflect instead of Initialize because the ResourceCompilerScene initializes the libraries before
@@ -64,6 +52,7 @@ namespace AZ
{
// Global importer and behavior
g_componentDescriptors.push_back(FbxSceneBuilder::FbxImporter::CreateDescriptor());
+ g_componentDescriptors.push_back(FbxSceneImporter::FbxImportRequestHandler::CreateDescriptor());
// Node and attribute importers
g_componentDescriptors.push_back(AssImpBitangentStreamImporter::CreateDescriptor());
@@ -125,7 +114,6 @@ namespace AZ
extern "C" AZ_DLL_EXPORT void InitializeDynamicModule(void* env)
{
AZ::Environment::Attach(static_cast(env));
- AZ::SceneAPI::FbxSceneBuilder::Initialize();
}
extern "C" AZ_DLL_EXPORT void Reflect(AZ::SerializeContext* context)
{
diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp
index 155209f1b5..a43f1e16b8 100644
--- a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp
+++ b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.cpp
@@ -10,12 +10,16 @@
*
*/
+#include
+#include
#include
-#include
+#include
+#include
+#include
+#include
#include
#include
#include
-#include
namespace AZ
{
@@ -23,10 +27,25 @@ namespace AZ
{
namespace FbxSceneImporter
{
- const char* FbxImportRequestHandler::s_extension = ".fbx";
+ void SceneImporterSettings::Reflect(AZ::ReflectContext* context)
+ {
+ if (auto serializeContext = azrtti_cast(context); serializeContext)
+ {
+ serializeContext->Class()
+ ->Version(1)
+ ->Field("SupportedFileTypeExtensions", &SceneImporterSettings::m_supportedFileTypeExtensions);
+ }
+ }
void FbxImportRequestHandler::Activate()
{
+ auto settingsRegistry = AZ::SettingsRegistry::Get();
+
+ if (settingsRegistry)
+ {
+ settingsRegistry->GetObject(m_settings, "/O3DE/SceneAPI/AssetImporter");
+ }
+
BusConnect();
}
@@ -37,21 +56,29 @@ namespace AZ
void FbxImportRequestHandler::Reflect(ReflectContext* context)
{
+ SceneImporterSettings::Reflect(context);
+
SerializeContext* serializeContext = azrtti_cast(context);
if (serializeContext)
{
- serializeContext->Class()->Version(1);
+ serializeContext->Class()->Version(1)->Attribute(
+ AZ::Edit::Attributes::SystemComponentTags,
+ AZStd::vector({AssetBuilderSDK::ComponentTags::AssetBuilder}));
+
}
}
void FbxImportRequestHandler::GetSupportedFileExtensions(AZStd::unordered_set& extensions)
{
- extensions.insert(s_extension);
+ extensions.insert(m_settings.m_supportedFileTypeExtensions.begin(), m_settings.m_supportedFileTypeExtensions.end());
}
Events::LoadingResult FbxImportRequestHandler::LoadAsset(Containers::Scene& scene, const AZStd::string& path, const Uuid& guid, [[maybe_unused]] RequestingApplication requester)
{
- if (!AzFramework::StringFunc::Path::IsExtension(path.c_str(), s_extension))
+ AZStd::string extension;
+ StringFunc::Path::GetExtension(path.c_str(), extension);
+
+ if (!m_settings.m_supportedFileTypeExtensions.contains(extension))
{
return Events::LoadingResult::Ignored;
}
@@ -73,6 +100,11 @@ namespace AZ
return Events::LoadingResult::AssetFailure;
}
}
+
+ void FbxImportRequestHandler::GetProvidedServices(ComponentDescriptor::DependencyArrayType& provided)
+ {
+ provided.emplace_back(AZ_CRC_CE("AssetImportRequestHandler"));
+ }
} // namespace Import
} // namespace SceneAPI
} // namespace AZ
diff --git a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h
index 8b33051f1e..12c7c6f877 100644
--- a/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h
+++ b/Code/Tools/SceneAPI/FbxSceneBuilder/FbxImportRequestHandler.h
@@ -21,12 +21,21 @@ namespace AZ
{
namespace FbxSceneImporter
{
+ struct SceneImporterSettings
+ {
+ AZ_TYPE_INFO(SceneImporterSettings, "{8BB6C7AD-BF99-44DC-9DA1-E7AD3F03DC10}");
+
+ static void Reflect(AZ::ReflectContext* context);
+
+ AZStd::unordered_set m_supportedFileTypeExtensions;
+ };
+
class FbxImportRequestHandler
- : public SceneCore::BehaviorComponent
+ : public AZ::Component
, public Events::AssetImportRequestBus::Handler
{
public:
- AZ_COMPONENT(FbxImportRequestHandler, "{9F4B189C-0A96-4F44-A5F0-E087FF1561F8}", SceneCore::BehaviorComponent);
+ AZ_COMPONENT(FbxImportRequestHandler, "{9F4B189C-0A96-4F44-A5F0-E087FF1561F8}");
~FbxImportRequestHandler() override = default;
@@ -38,8 +47,13 @@ namespace AZ
Events::LoadingResult LoadAsset(Containers::Scene& scene, const AZStd::string& path, const Uuid& guid,
RequestingApplication requester) override;
+ static void GetProvidedServices(ComponentDescriptor::DependencyArrayType& provided);
+
private:
- static const char* s_extension;
+
+ SceneImporterSettings m_settings;
+
+ static constexpr const char* SettingsFilename = "AssetImporterSettings.json";
};
} // namespace FbxSceneImporter
} // namespace SceneAPI
diff --git a/Gems/AWSClientAuth/Code/Source/AWSClientAuthModule.cpp b/Gems/AWSClientAuth/Code/Source/AWSClientAuthModule.cpp
index 9f027613b6..ccf71cb89e 100644
--- a/Gems/AWSClientAuth/Code/Source/AWSClientAuthModule.cpp
+++ b/Gems/AWSClientAuth/Code/Source/AWSClientAuthModule.cpp
@@ -39,4 +39,4 @@ namespace AWSClientAuth
// DO NOT MODIFY THIS LINE UNLESS YOU RENAME THE GEM
// The first parameter should be GemName_GemIdLower
// The second should be the fully qualified name of the class above
-AZ_DECLARE_MODULE_CLASS(AWSClientAuth_c74f2756f5874c0d8d29646dfc9cb0ad, AWSClientAuth::AWSClientAuthModule)
+AZ_DECLARE_MODULE_CLASS(Gem_AWSClientAuth, AWSClientAuth::AWSClientAuthModule)
diff --git a/Gems/AWSClientAuth/cdk/cognito/cognito_user_pool.py b/Gems/AWSClientAuth/cdk/cognito/cognito_user_pool.py
index a903217f40..f0a2acf208 100755
--- a/Gems/AWSClientAuth/cdk/cognito/cognito_user_pool.py
+++ b/Gems/AWSClientAuth/cdk/cognito/cognito_user_pool.py
@@ -76,7 +76,7 @@ class CognitoUserPool:
scope,
'CognitoUserPoolId',
description="Cognito User pool id",
- value=self._user_pool.attr_provider_name)
+ value=self._user_pool.ref)
core.CfnOutput(
scope,
diff --git a/Gems/AWSMetrics/Code/Source/AWSMetricsModule.cpp b/Gems/AWSMetrics/Code/Source/AWSMetricsModule.cpp
index 4967202483..f180e3e248 100644
--- a/Gems/AWSMetrics/Code/Source/AWSMetricsModule.cpp
+++ b/Gems/AWSMetrics/Code/Source/AWSMetricsModule.cpp
@@ -32,4 +32,4 @@ namespace AWSMetrics
// DO NOT MODIFY THIS LINE UNLESS YOU RENAME THE GEM
// The first parameter should be GemName_GemIdLower
// The second should be the fully qualified name of the class above
-AZ_DECLARE_MODULE_CLASS(AWSMetrics_cc6fc7a18fc047039a369a26100fcbbe, AWSMetrics::AWSMetricsModule)
+AZ_DECLARE_MODULE_CLASS(Gem_AWSMetrics, AWSMetrics::AWSMetricsModule)
diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Include/Atom/ImageProcessing/ImageProcessingBus.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Include/Atom/ImageProcessing/ImageProcessingBus.h
index b8deb50cc5..9f6b6e629f 100644
--- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Include/Atom/ImageProcessing/ImageProcessingBus.h
+++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Include/Atom/ImageProcessing/ImageProcessingBus.h
@@ -13,8 +13,14 @@
#pragma once
#include
+#include
#include
+namespace AssetBuilderSDK
+{
+ struct JobProduct;
+}
+
namespace ImageProcessingAtom
{
class ImageProcessingRequests
@@ -35,4 +41,39 @@ namespace ImageProcessingAtom
virtual IImageObjectPtr LoadImagePreview(const AZStd::string& filePath) = 0;
};
using ImageProcessingRequestBus = AZ::EBus;
+
+ class ImageBuilderRequests
+ : public AZ::EBusTraits
+ {
+ public:
+ //////////////////////////////////////////////////////////////////////////
+ // EBusTraits overrides
+ static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
+ static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
+ /////////////////////////////////////////////////////////////////////////
+
+ //! Create an image object
+ virtual IImageObjectPtr CreateImage(
+ AZ::u32 width,
+ AZ::u32 height,
+ AZ::u32 maxMipCount,
+ EPixelFormat pixelFormat) = 0;
+
+ //! Convert an image and save its products to the specified folder
+ virtual AZStd::vector ConvertImageObject(
+ IImageObjectPtr imageObject,
+ const AZStd::string& presetName,
+ const AZStd::string& platformName,
+ const AZStd::string& outputDir,
+ const AZ::Data::AssetId& sourceAssetId,
+ const AZStd::string& sourceAssetName) = 0;
+
+ //! Return whether the specified platform is supported by the image builder
+ virtual bool DoesSupportPlatform(const AZStd::string& platformId) = 0;
+
+ //! Return whether the specified preset requires an image to be square and a power of 2
+ virtual bool IsPresetFormatSquarePow2(const AZStd::string& presetName, const AZStd::string& platformName) = 0;
+ };
+
+ using ImageBuilderRequestBus = AZ::EBus;
} // namespace ImageProcessingAtom
diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Include/Atom/ImageProcessing/ImageProcessingEditorBus.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Include/Atom/ImageProcessing/ImageProcessingEditorBus.h
index acd1d7a2da..bf5289bc45 100644
--- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Include/Atom/ImageProcessing/ImageProcessingEditorBus.h
+++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Include/Atom/ImageProcessing/ImageProcessingEditorBus.h
@@ -13,8 +13,6 @@
#include
-class QString;
-
namespace ImageProcessingAtomEditor
{
class ImageProcessingEditorRequests
diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageBuilderComponent.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageBuilderComponent.cpp
index 59c799a601..34d18a26eb 100644
--- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageBuilderComponent.cpp
+++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageBuilderComponent.cpp
@@ -88,11 +88,13 @@ namespace ImageProcessingAtom
m_assetHandlers.emplace_back(AZ::RPI::MakeAssetHandler());
ImageProcessingRequestBus::Handler::BusConnect();
+ ImageBuilderRequestBus::Handler::BusConnect();
}
void BuilderPluginComponent::Deactivate()
{
ImageProcessingRequestBus::Handler::BusDisconnect();
+ ImageBuilderRequestBus::Handler::BusDisconnect();
m_imageBuilder.BusDisconnect();
BuilderSettingManager::DestroyInstance();
CPixelFormats::DestroyInstance();
@@ -146,6 +148,78 @@ namespace ImageProcessingAtom
return image;
}
+ IImageObjectPtr BuilderPluginComponent::CreateImage(
+ AZ::u32 width,
+ AZ::u32 height,
+ AZ::u32 maxMipCount,
+ EPixelFormat pixelFormat)
+ {
+ IImageObjectPtr image(IImageObject::CreateImage(width, height, maxMipCount, pixelFormat));
+ return image;
+ }
+
+ AZStd::vector BuilderPluginComponent::ConvertImageObject(
+ IImageObjectPtr imageObject,
+ const AZStd::string& presetName,
+ const AZStd::string& platformName,
+ const AZStd::string& outputDir,
+ const AZ::Data::AssetId& sourceAssetId,
+ const AZStd::string& sourceAssetName)
+ {
+ AZStd::vector outProducts;
+
+ AZStd::string_view presetFilePath;
+ const PresetSettings* preset = BuilderSettingManager::Instance()->GetPreset(presetName, platformName, &presetFilePath);
+ if (preset == nullptr)
+ {
+ AZ_Assert(false, "Cannot find preset with name %s.", presetName.c_str());
+ return outProducts;
+ }
+
+ AZStd::unique_ptr desc = AZStd::make_unique();
+ TextureSettings& textureSettings = desc->m_textureSetting;
+ textureSettings.m_preset = preset->m_uuid;
+ desc->m_inputImage = imageObject;
+ desc->m_presetSetting = *preset;
+ desc->m_isPreview = false;
+ desc->m_platform = platformName;
+ desc->m_filePath = presetFilePath;
+ desc->m_isStreaming = BuilderSettingManager::Instance()->GetBuilderSetting(platformName)->m_enableStreaming;
+ desc->m_imageName = sourceAssetName;
+ desc->m_outputFolder = outputDir;
+ desc->m_sourceAssetId = sourceAssetId;
+
+ // Create an image convert process
+ ImageConvertProcess process(AZStd::move(desc));
+ process.ProcessAll();
+ bool result = process.IsSucceed();
+ if (result)
+ {
+ process.GetAppendOutputProducts(outProducts);
+ }
+
+ return outProducts;
+ }
+
+ bool BuilderPluginComponent::DoesSupportPlatform(const AZStd::string& platformId)
+ {
+ return ImageProcessingAtom::BuilderSettingManager::Instance()->DoesSupportPlatform(platformId);
+ }
+
+ bool BuilderPluginComponent::IsPresetFormatSquarePow2(const AZStd::string& presetName, const AZStd::string& platformName)
+ {
+ AZStd::string_view filePath;
+ const PresetSettings* preset = BuilderSettingManager::Instance()->GetPreset(presetName, platformName, &filePath);
+ if (preset == nullptr)
+ {
+ AZ_Assert(false, "Cannot find preset with name %s.", presetName.c_str());
+ return false;
+ }
+
+ const PixelFormatInfo* info = CPixelFormats::GetInstance().GetPixelFormatInfo(preset->m_pixelFormat);
+ return info->bSquarePow2;
+ }
+
void ImageBuilderWorker::ShutDown()
{
// it is important to note that this will be called on a different thread than your process job thread
diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageBuilderComponent.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageBuilderComponent.h
index fd099eb08a..a88ad3f587 100644
--- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageBuilderComponent.h
+++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageBuilderComponent.h
@@ -47,6 +47,7 @@ namespace ImageProcessingAtom
class BuilderPluginComponent
: public AZ::Component
, protected ImageProcessingRequestBus::Handler
+ , protected ImageBuilderRequestBus::Handler
{
public:
AZ_COMPONENT(BuilderPluginComponent, "{A227F803-D2E4-406E-93EC-121EF45A64A1}")
@@ -71,6 +72,24 @@ namespace ImageProcessingAtom
IImageObjectPtr LoadImagePreview(const AZStd::string& filePath) override;
////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////
+ // ImageBuilderRequestBus interface implementation
+ IImageObjectPtr CreateImage(
+ AZ::u32 width,
+ AZ::u32 height,
+ AZ::u32 maxMipCount,
+ EPixelFormat pixelFormat) override;
+ AZStd::vector ConvertImageObject(
+ IImageObjectPtr imageObject,
+ const AZStd::string& presetName,
+ const AZStd::string& platformName,
+ const AZStd::string& outputDir,
+ const AZ::Data::AssetId& sourceAssetId,
+ const AZStd::string& sourceAssetName) override;
+ bool DoesSupportPlatform(const AZStd::string& platformId) override;
+ bool IsPresetFormatSquarePow2(const AZStd::string& presetName, const AZStd::string& platformName) override;
+ ////////////////////////////////////////////////////////////////////////
+
private:
BuilderPluginComponent(const BuilderPluginComponent&) = delete;
diff --git a/Gems/Atom/Asset/Shader/Code/CMakeLists.txt b/Gems/Atom/Asset/Shader/Code/CMakeLists.txt
index 7d82ca5869..a06aa79d24 100644
--- a/Gems/Atom/Asset/Shader/Code/CMakeLists.txt
+++ b/Gems/Atom/Asset/Shader/Code/CMakeLists.txt
@@ -98,7 +98,6 @@ ly_add_target(
Gem::Atom_RPI.Edit
RUNTIME_DEPENDENCIES
3rdParty::DirectXShaderCompilerDxc
- 3rdParty::DirectXShaderCompilerDxcAz
3rdParty::SPIRVCross
3rdParty::azslc
)
diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslBuilder.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslBuilder.cpp
index 0ce7109067..668d6866d3 100644
--- a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslBuilder.cpp
+++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslBuilder.cpp
@@ -185,7 +185,8 @@ namespace AZ
// we can't use a temporary folder because CreateJobs API does not warrant side effects, and does not prepare a temp folder.
// we can't use the OS temp folder anyway, because many includes (eg #include "../RPI/Shadow.h") are relative and will only work from the original location
AZStd::string prependedPath = ShaderBuilderUtility::DumpAzslPrependedCode(
- BuilderName, prependedAzslSourceCode, originalLocation, ShaderBuilderUtility::ExtractStemName(fullPath.c_str()), shaderPlatformInterface->GetAPIName().GetStringView());
+ BuilderName, prependedAzslSourceCode, originalLocation, ShaderBuilderUtility::ExtractStemName(fullPath.c_str()),
+ shaderPlatformInterface->GetAPIName().GetStringView());
// run mcpp
PreprocessorData preprocessorData = PreprocessSource(prependedPath, fullPath, buildOptions.m_preprocessorSettings);
jobDescriptor.m_jobParameters[(u32)JobParameterIndices::PreprocessorError] = preprocessorData.diagnostics; // save for ProcessJob
@@ -221,7 +222,7 @@ namespace AZ
}
// eg: ("D:/p/x.a", "D:/p/x.b") -> yes
- static bool HasSameStemName(const AZStd::string& lhsPath, const AZStd::string& rhsPath)
+ static bool HasSameFileName(const AZStd::string& lhsPath, const AZStd::string& rhsPath)
{
using namespace StringFunc::Path;
AZStd::string stem1;
@@ -307,7 +308,8 @@ namespace AZ
buildOptions.m_compilerArguments.Merge(shaderAssetSource.m_compiler);
// Earlier, we declared a job dependency on the .azsl's job, let's access the produced assets:
- uint32_t subId = ShaderBuilderUtility::MakeAzslBuildProductSubId(RPI::ShaderAssetSubId::GeneratedSource, platformInterface->GetAPIType());
+ uint32_t subId = ShaderBuilderUtility::MakeAzslBuildProductSubId(
+ RPI::ShaderAssetSubId::GeneratedHlslSource, platformInterface->GetAPIType());
auto assetIdOutcome = RPI::AssetUtils::MakeAssetId(inputFiles->m_azslSourceFullPath, subId);
AZ_Warning(BuilderName, assetIdOutcome.IsSuccess(), "Product of dependency %s not found: this is an oddity but build can continue.", inputFiles->m_azslSourceFullPath.c_str());
if (assetIdOutcome.IsSuccess())
@@ -325,7 +327,7 @@ namespace AZ
AZ_TracePrintf(BuilderName, "Product output already built by %s is not reusable because of incompatible azslc CompilerHints: launching independent build", inputFiles->m_azslSourceFullPath.c_str());
}
- if (HasSameStemName(fullSourcePath, inputFiles->m_azslSourceFullPath))
+ if (HasSameFileName(fullSourcePath, inputFiles->m_azslSourceFullPath))
{
// let's add a "distinguisher" to the names of the outproduct artifacts of this build round.*
// Because otherwise the asset processor is not going to accept an overwrite of the ones output by the .azsl job
diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp
index 417a5b4a88..e3b482742b 100644
--- a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp
+++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp
@@ -26,6 +26,7 @@
#include
#include
+#include // [GFX TODO] Remove when [ATOM-15472]
#include
#include
@@ -122,7 +123,7 @@ namespace AZ
namespace SubProducts = ShaderBuilderUtility::AzslSubProducts;
- Outcome AzslCompiler::EmitFullData(const AZStd::string& parameters, const AZStd::string& outputFile /* = ""*/) const
+ Outcome AzslCompiler::EmitFullData(const AZStd::string& parameters, const AZStd::string& outputFile /* = ""*/, const char * addSuffix) const
{
bool success = Compile("--full " + parameters, outputFile);
if (!success)
@@ -133,11 +134,22 @@ namespace AZ
SubProducts::Paths productPaths = SubProducts::Paths(SubProducts::Paths::capacity());
for (auto subProduct : SubProducts::SuffixListMembers)
{
- productPaths[subProduct.m_value] = outputFile.empty() ? m_inputFilePath : outputFile; // that's a reproduction of azslc's behavior (no "-o" = input name is used)
- AzFramework::StringFunc::Path::ReplaceExtension(productPaths[subProduct.m_value], subProduct.m_string.data());
+ AZStd::string subProductFilePath = outputFile.empty() ? m_inputFilePath : outputFile; // that's a reproduction of azslc's behavior (no "-o" = input name is used)
+ AzFramework::StringFunc::Path::ReplaceExtension(subProductFilePath, subProduct.m_string.data());
// append .json if it's one of those subs:
auto listOfJsons = { SubProducts::ia, SubProducts::om, SubProducts::srg, SubProducts::options, SubProducts::bindingdep };
- productPaths[subProduct.m_value] += AZStd::any_of(AZ_BEGIN_END(listOfJsons), [&](auto v) { return v == subProduct.m_value; }) ? ".json" : "";
+ subProductFilePath += AZStd::any_of(AZ_BEGIN_END(listOfJsons), [&](auto v) { return v == subProduct.m_value; }) ? ".json" : "";
+
+ // [GFX TODO] Remove when [ATOM-15472]
+ if (addSuffix)
+ {
+ // Rename the product file.
+ AZStd::string finalSubProductFilePath = AZStd::string::format("%s%s", subProductFilePath.c_str(), addSuffix);
+ AZ::IO::Move(subProductFilePath.c_str(), finalSubProductFilePath.c_str());
+ subProductFilePath = finalSubProductFilePath;
+ }
+
+ productPaths[subProduct.m_value] = subProductFilePath;
}
productPaths[SubProducts::azslin] = GetInputFilePath(); // post-fixup this one after the loop, because it's not an output of azslc, it's an output of the builder though.
return { productPaths };
diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.h b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.h
index cb30da068f..8da03cd6e5 100644
--- a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.h
+++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.h
@@ -38,8 +38,9 @@ namespace AZ
//! @param inputFilePath The target input file to compile. Should be a valid AZSL file with no preprocessing directives.
AzslCompiler(const AZStd::string& inputFilePath);
+ //! [GFX TODO] Remove @addSuffix when [ATOM-15472]
//! compile with --full and generate all .json files
- Outcome EmitFullData(const AZStd::string& parameters, const AZStd::string& outputFile = "") const;
+ Outcome EmitFullData(const AZStd::string& parameters, const AZStd::string& outputFile = "", const char * addSuffix = nullptr) const;
//! compile to HLSL independently
bool EmitShader(AZ::IO::GenericStream& outputStream, const AZStd::string& extraCompilerParams) const;
//! compile with --ia independently and populate document @output
diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslData.h b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslData.h
index 4ea7a51fb1..303e2f355f 100644
--- a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslData.h
+++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslData.h
@@ -83,23 +83,41 @@ namespace AZ
AZStd::string m_azslFileName; //!< Name for the source .azsl file
};
- struct AzslCodeTopData
- {
- SrgDataContainer m_srgData;
- AzslFunctions m_functions;
- StructContainer m_structs;
- RootConstantData m_rootConstantData;
- };
+ //! DEPRECATED [ATOM-15472]
+ //! This class is used to collect all the json files produced by the compilation
+ //! of an AZSL file as objects.
struct AzslData
{
AzslData(const AZStd::shared_ptr& a_sources) : m_sources(a_sources) { }
AZStd::shared_ptr m_sources;
AZStd::string m_preprocessedFullPath; // Full path to a preprocessed version of the original AZSL file
- AZStd::string m_shaderCodePrefix; // AssetProcessor generated shader code which is added to the
- // AZSLc emitted code prior to invoking the native shader compiler
- AzslCodeTopData m_topData;
+ AZStd::string m_shaderCodePrefix; // AssetProcessor generated shader code which is added to the
+ // AZSLc emitted code prior to invoking the native shader compiler
+
+ SrgDataContainer m_srgData;
+ AzslFunctions m_functions;
+ StructContainer m_structs;
+ RootConstantData m_rootConstantData;
+ };
+
+ //! This class is used to collect all the json files produced by the compilation
+ //! of an AZSL file as objects.
+ struct AzslData2
+ {
+ AzslData2(const AZStd::shared_ptr& a_sources)
+ : m_sources(a_sources)
+ {
+ }
+
+ AZStd::shared_ptr m_sources;
+ AZStd::string m_preprocessedFullPath; // Full path to a preprocessed version of the original AZSL file
+
+ SrgDataContainer m_srgData;
+ AzslFunctions m_functions;
+ StructContainer m_structs;
+ RootConstantData m_rootConstantData;
};
} // ShaderBuilder
} // AZ
diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslShaderBuilderSystemComponent.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslShaderBuilderSystemComponent.cpp
index a0f9f7db22..bc2e810f84 100644
--- a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslShaderBuilderSystemComponent.cpp
+++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslShaderBuilderSystemComponent.cpp
@@ -86,7 +86,7 @@ namespace AZ
// Register AZSL's compilation products Builder
AssetBuilderSDK::AssetBuilderDesc azslBuilderDescriptor;
azslBuilderDescriptor.m_name = "AZSL Builder";
- azslBuilderDescriptor.m_version = 7; // LKG Merge
+ azslBuilderDescriptor.m_version = 8; // ATOM-15276
// register all extensions thay may carry azsl code. header. main shader. or SRG
azslBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern(AZStd::string::format("*.%s", RPI::ShaderSourceData::Extension), AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard));
azslBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern("*.azsl", AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard));
@@ -102,7 +102,7 @@ namespace AZ
// Register Shader Resource Group Layout Builder
AssetBuilderSDK::AssetBuilderDesc srgLayoutBuilderDescriptor;
srgLayoutBuilderDescriptor.m_name = "Shader Resource Group Layout Builder";
- srgLayoutBuilderDescriptor.m_version = 54; // Enable Null Rhi for AutomatedTesting
+ srgLayoutBuilderDescriptor.m_version = 55; // ATOM-15276
srgLayoutBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern("*.azsl", AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard));
srgLayoutBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern("*.azsli", AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard));
@@ -118,7 +118,7 @@ namespace AZ
// Register Shader Asset Builder
AssetBuilderSDK::AssetBuilderDesc shaderAssetBuilderDescriptor;
shaderAssetBuilderDescriptor.m_name = "Shader Asset Builder";
- shaderAssetBuilderDescriptor.m_version = 98; // Enable Null Rhi for AutomatedTesting
+ shaderAssetBuilderDescriptor.m_version = 100; // ATOM-14298
// .shader file changes trigger rebuilds
shaderAssetBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern( AZStd::string::format("*.%s", RPI::ShaderSourceData::Extension), AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard));
shaderAssetBuilderDescriptor.m_busId = azrtti_typeid();
@@ -133,7 +133,7 @@ namespace AZ
shaderVariantAssetBuilderDescriptor.m_name = "Shader Variant Asset Builder";
// Both "Shader Variant Asset Builder" and "Shader Asset Builder" produce ShaderVariantAsset products. If you update
// ShaderVariantAsset you will need to update BOTH version numbers, not just "Shader Variant Asset Builder".
- shaderVariantAssetBuilderDescriptor.m_version = 19; // Enable Null Rhi for AutomatedTesting
+ shaderVariantAssetBuilderDescriptor.m_version = 21; // ATOM-14298
shaderVariantAssetBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern(AZStd::string::format("*.%s", RPI::ShaderVariantListSourceData::Extension), AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard));
shaderVariantAssetBuilderDescriptor.m_busId = azrtti_typeid();
shaderVariantAssetBuilderDescriptor.m_createJobFunction = AZStd::bind(&ShaderVariantAssetBuilder::CreateJobs, &m_shaderVariantAssetBuilder, AZStd::placeholders::_1, AZStd::placeholders::_2);
@@ -145,7 +145,7 @@ namespace AZ
// Register Precompiled Shader Builder
AssetBuilderSDK::AssetBuilderDesc precompiledShaderBuilderDescriptor;
precompiledShaderBuilderDescriptor.m_name = "Precompiled Shader Builder";
- precompiledShaderBuilderDescriptor.m_version = 7; // ATOM-14780
+ precompiledShaderBuilderDescriptor.m_version = 8; // ATOM-15276
precompiledShaderBuilderDescriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern(AZStd::string::format("*.%s", AZ::PrecompiledShaderBuilder::Extension), AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard));
precompiledShaderBuilderDescriptor.m_busId = azrtti_typeid();
precompiledShaderBuilderDescriptor.m_createJobFunction = AZStd::bind(&PrecompiledShaderBuilder::CreateJobs, &m_precompiledShaderBuilder, AZStd::placeholders::_1, AZStd::placeholders::_2);
@@ -153,6 +153,43 @@ namespace AZ
m_precompiledShaderBuilder.BusConnect(precompiledShaderBuilderDescriptor.m_busId);
AssetBuilderSDK::AssetBuilderBus::Broadcast(&AssetBuilderSDK::AssetBuilderBus::Handler::RegisterBuilderInformation, precompiledShaderBuilderDescriptor);
+
+ // Register Shader Asset Builder 2
+ AssetBuilderSDK::AssetBuilderDesc shaderAssetBuilder2Descriptor;
+ shaderAssetBuilder2Descriptor.m_name = "Shader Asset Builder 2";
+ shaderAssetBuilder2Descriptor.m_version = 1; // ATOM-15276
+ // .shader2 file changes trigger rebuilds
+ shaderAssetBuilder2Descriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern(
+ AZStd::string::format("*.%s", RPI::ShaderSourceData::Extension2),
+ AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard));
+ shaderAssetBuilder2Descriptor.m_busId = azrtti_typeid();
+ shaderAssetBuilder2Descriptor.m_createJobFunction =
+ AZStd::bind(&ShaderAssetBuilder2::CreateJobs, &m_shaderAssetBuilder2, AZStd::placeholders::_1, AZStd::placeholders::_2);
+ shaderAssetBuilder2Descriptor.m_processJobFunction =
+ AZStd::bind(&ShaderAssetBuilder2::ProcessJob, &m_shaderAssetBuilder2, AZStd::placeholders::_1, AZStd::placeholders::_2);
+
+ m_shaderAssetBuilder2.BusConnect(shaderAssetBuilder2Descriptor.m_busId);
+ AssetBuilderSDK::AssetBuilderBus::Broadcast(
+ &AssetBuilderSDK::AssetBuilderBus::Handler::RegisterBuilderInformation, shaderAssetBuilder2Descriptor);
+
+ // Register Shader Variant Asset Builder 2
+ AssetBuilderSDK::AssetBuilderDesc shaderVariantAssetBuilder2Descriptor;
+ shaderVariantAssetBuilder2Descriptor.m_name = "Shader Variant Asset Builder 2";
+ // Both "Shader Variant Asset Builder" and "Shader Asset Builder" produce ShaderVariantAsset products. If you update
+ // ShaderVariantAsset you will need to update BOTH version numbers, not just "Shader Variant Asset Builder".
+ shaderVariantAssetBuilder2Descriptor.m_version = 1; // ATOM-15276
+ shaderVariantAssetBuilder2Descriptor.m_patterns.push_back(AssetBuilderSDK::AssetBuilderPattern(
+ AZStd::string::format("*.%s", RPI::ShaderVariantListSourceData::Extension2),
+ AssetBuilderSDK::AssetBuilderPattern::PatternType::Wildcard));
+ shaderVariantAssetBuilder2Descriptor.m_busId = azrtti_typeid();
+ shaderVariantAssetBuilder2Descriptor.m_createJobFunction = AZStd::bind(
+ &ShaderVariantAssetBuilder2::CreateJobs, &m_shaderVariantAssetBuilder2, AZStd::placeholders::_1, AZStd::placeholders::_2);
+ shaderVariantAssetBuilder2Descriptor.m_processJobFunction = AZStd::bind(
+ &ShaderVariantAssetBuilder2::ProcessJob, &m_shaderVariantAssetBuilder2, AZStd::placeholders::_1, AZStd::placeholders::_2);
+
+ m_shaderVariantAssetBuilder2.BusConnect(shaderVariantAssetBuilder2Descriptor.m_busId);
+ AssetBuilderSDK::AssetBuilderBus::Broadcast(
+ &AssetBuilderSDK::AssetBuilderBus::Handler::RegisterBuilderInformation, shaderVariantAssetBuilder2Descriptor);
}
void AzslShaderBuilderSystemComponent::Deactivate()
@@ -161,6 +198,8 @@ namespace AZ
m_srgLayoutBuilder.BusDisconnect();
m_shaderVariantAssetBuilder.BusDisconnect();
m_precompiledShaderBuilder.BusDisconnect();
+ m_shaderAssetBuilder2.BusDisconnect();
+ m_shaderVariantAssetBuilder2.BusDisconnect();
RHI::ShaderPlatformInterfaceRegisterBus::Handler::BusDisconnect();
ShaderPlatformInterfaceRequestBus::Handler::BusDisconnect();
diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslShaderBuilderSystemComponent.h b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslShaderBuilderSystemComponent.h
index 9d685c0d12..2f881f45d2 100644
--- a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslShaderBuilderSystemComponent.h
+++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslShaderBuilderSystemComponent.h
@@ -18,12 +18,14 @@
#include
-#include
-#include
-#include
-#include
-#include
-#include
+#include "AzslBuilder.h"
+#include "SrgLayoutBuilder.h"
+#include "ShaderAssetBuilder.h"
+#include "ShaderVariantAssetBuilder.h"
+#include "PrecompiledShaderBuilder.h"
+#include "ShaderPlatformInterfaceRequest.h"
+#include "ShaderAssetBuilder2.h"
+#include "ShaderVariantAssetBuilder2.h"
namespace AZ
{
@@ -71,6 +73,8 @@ namespace AZ
ShaderAssetBuilder m_shaderAssetBuilder;
ShaderVariantAssetBuilder m_shaderVariantAssetBuilder;
PrecompiledShaderBuilder m_precompiledShaderBuilder;
+ ShaderAssetBuilder2 m_shaderAssetBuilder2;
+ ShaderVariantAssetBuilder2 m_shaderVariantAssetBuilder2;
/// Contains the ShaderPlatformInterface for all registered RHIs
AZStd::unordered_map m_shaderPlatformInterfaces;
diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/GlobalBuildOptions.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/GlobalBuildOptions.cpp
index c9d23aecd1..5f2acf251c 100644
--- a/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/GlobalBuildOptions.cpp
+++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/GlobalBuildOptions.cpp
@@ -62,7 +62,7 @@ namespace AZ
}
}
- GlobalBuildOptions ReadBuildOptions(const char* builderName)
+ GlobalBuildOptions ReadBuildOptions(const char* builderName, const char* optionalIncludeFolder)
{
GlobalBuildOptions output;
// try to parse some config file for eventual additional options
@@ -79,7 +79,7 @@ namespace AZ
{
AZ_TracePrintf(builderName, "config file [%s] not found.", globalBuildOption.c_str());
}
- InitializePreprocessorOptions(output.m_preprocessorSettings, builderName);
+ InitializePreprocessorOptions(output.m_preprocessorSettings, builderName, optionalIncludeFolder);
return output;
}
}
diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/GlobalBuildOptions.h b/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/GlobalBuildOptions.h
index f55d395609..9e85f5bcdd 100644
--- a/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/GlobalBuildOptions.h
+++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/GlobalBuildOptions.h
@@ -33,6 +33,9 @@ namespace AZ
RHI::ShaderCompilerArguments m_compilerArguments;
};
- GlobalBuildOptions ReadBuildOptions(const char* builderName);
+ //! Reads the global options used when compiling shaders. The options are defined in /Config/shader_global_build_options.json
+ //! @param builderName: A string with the name of the builder calling this API. Used for trace debugging.
+ //! @param optionalIncludeFolder: An additional directory to add to the list of include folders for the C-preprocessor.
+ GlobalBuildOptions ReadBuildOptions(const char* builderName, const char* optionalIncludeFolder = nullptr);
}
}
diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/Preprocessor.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/Preprocessor.cpp
index 84a95b2c54..1e471f8644 100644
--- a/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/Preprocessor.cpp
+++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/Preprocessor.cpp
@@ -58,6 +58,37 @@ namespace AZ
}
}
+ void PreprocessorOptions::RemovePredefinedMacros(const AZStd::vector& macroNames)
+ {
+ m_predefinedMacros.erase(
+ AZStd::remove_if(
+ m_predefinedMacros.begin(), m_predefinedMacros.end(),
+ [&](const AZStd::string& predefinedMacro)
+ {
+ for (const auto& macroName : macroNames)
+ {
+ // Haystack, needle, bCaseSensitive
+ if (!AzFramework::StringFunc::StartsWith(predefinedMacro, macroName, true))
+ {
+ return false;
+ }
+ // If found, let's make sure it is not just a substring.
+ if (predefinedMacro.size() == macroName.size())
+ {
+ return true;
+ }
+ // The predefinedMacro can be a string like "macro=value". If we find '=' it is a match.
+ if (predefinedMacro.c_str()[macroName.size()] == '=')
+ {
+ return true;
+ }
+ return false;
+ }
+ return false;
+ }),
+ m_predefinedMacros.end());
+ }
+
//! Binder helper to Matsui C-Pre-Processor library
class McppBinder
{
@@ -286,7 +317,8 @@ namespace AZ
}
// populate options with scan folders and contents of parsing shader_global_build_options.json
- void InitializePreprocessorOptions(PreprocessorOptions& options, [[maybe_unused]] const char* builderName)
+ void InitializePreprocessorOptions(
+ PreprocessorOptions& options, [[maybe_unused]] const char* builderName, const char* optionalIncludeFolder)
{
AZ_TraceContext("Init include-paths lookup options", "preprocessor");
@@ -303,6 +335,10 @@ namespace AZ
// Add the project path to list of include paths
AZ::IO::FixedMaxPathString projectPath = AZ::Utils::GetProjectPath();
scanFoldersSet.emplace(projectPath.c_str(), projectPath.size());
+ if (optionalIncludeFolder)
+ {
+ scanFoldersSet.emplace(optionalIncludeFolder, strnlen(optionalIncludeFolder, AZ::IO::MaxPathLength));
+ }
// but while we transfer to the set, we're going to keep only folders where +/ShaderLib exists
for (AZStd::string folder : scanFoldersVector)
{
diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/Preprocessor.h b/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/Preprocessor.h
index 7718dba6c4..b5fbf438a3 100644
--- a/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/Preprocessor.h
+++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/Preprocessor.h
@@ -47,9 +47,13 @@ namespace AZ
//! folders are relative to the dev folder of the project
AZStd::vector m_projectIncludePaths;
- //! passed as -D macro1[=value1] -D macro2 ...
+ //! Each string is of the type "name[=value]"
+ //! passed as -Dmacro1[=value1] -Dmacro2 ... to MCPP.
AZStd::vector m_predefinedMacros;
+ //! Removes all macros from @m_predefinedMacros that appear in @macroNames
+ void RemovePredefinedMacros(const AZStd::vector& macroNames);
+
//! if needed, we may add configurations like
//! "keep comments" or "don't predefine non-standard macros"
//! or "output diagnostics to std.err" or "enable digraphs/trigraphs"...
@@ -59,7 +63,10 @@ namespace AZ
//! It will populate your option with a default base of include folders given by the Asset Processor scan folders.
//! This is going to look for a Config/shader_global_build_options.json in one of the scan folders
//! (that file can specify additional include files and preprocessor macros).
- void InitializePreprocessorOptions(PreprocessorOptions& options, const char* builderName);
+ //! @param options: Outout parameter, will contain the preprocessor options.
+ //! @param builderName: Used for debugging.
+ //! @param optionalIncludeFolder: If not null, will be added to the list of include folders for the c-preprocessor in @options.
+ void InitializePreprocessorOptions(PreprocessorOptions& options, const char* builderName, const char* optionalIncludeFolder = nullptr);
/**
* Runs the preprocessor on the given source file path, and stores results in outputData.
diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp
index d6197ff279..8d491d5d4d 100644
--- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp
+++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp
@@ -166,17 +166,6 @@ namespace AZ
response.m_result = AssetBuilderSDK::CreateJobsResultCode::Success;
}
- static uint32_t GetRootVariantAssetSubId(const RHI::ShaderPlatformInterface& shaderPlatformInterface)
- {
- //The 2 Most significant bits encode the the RHI::API unique index.
- const uint32_t apiUniqueIndex = shaderPlatformInterface.GetAPIUniqueIndex();
- AZ_Assert(apiUniqueIndex <= RHI::Limits::APIType::PerPlatformApiUniqueIndexMax,
- "Invalid api unique index [%u] from ShaderPlatformInterface [%s]", apiUniqueIndex, shaderPlatformInterface.GetAPIName().GetCStr());
- const uint32_t rhiApiSubId = apiUniqueIndex << 30;
- const uint32_t productSubID = rhiApiSubId | static_cast(RPI::ShaderAssetSubId::RootShaderVariantAsset);
- return productSubID;
- }
-
static AssetBuilderSDK::ProcessJobResultCode CompileForAPI(
const ShaderBuilderUtility::AzslSubProducts::Paths& pathOfProductFiles,
RPI::ShaderAssetCreator& shaderAssetCreator,
@@ -201,7 +190,7 @@ namespace AZ
if (shaderSourceDataDescriptor.m_programSettings.m_entryPoints.empty())
{
AZ_TracePrintf(ShaderAssetBuilderName, "ProgramSettings do not specify entry points, will use GetDefaultEntryPointsFromShader()\n");
- ShaderVariantAssetBuilder::GetDefaultEntryPointsFromAzslData(azslData, shaderEntryPoints);
+ ShaderBuilderUtility::GetDefaultEntryPointsFromFunctionDataList(azslData.m_functions, shaderEntryPoints);
}
else
{
@@ -249,7 +238,9 @@ namespace AZ
// so the root ShaderVariantAsset is found when the ShaderAsset is deserialized.
AZStd::string fullSourcePath;
AzFramework::StringFunc::Path::ConstructFull(request.m_watchFolder.c_str(), request.m_sourceFile.c_str(), fullSourcePath, true);
- const uint32_t productSubID = GetRootVariantAssetSubId(*shaderPlatformInterface);
+ const uint32_t productSubID = RPI::ShaderAsset::MakeAssetProductSubId(
+ shaderPlatformInterface->GetAPIUniqueIndex(),
+ aznumeric_cast(RPI::ShaderAssetSubId::RootShaderVariantAsset));
auto assetIdOutcome = RPI::AssetUtils::MakeAssetId(fullSourcePath, productSubID);
AZ_Assert(assetIdOutcome.IsSuccess(), "Failed to get AssetId from shader %s", fullSourcePath.c_str());
const Data::AssetId variantAssetId = assetIdOutcome.TakeValue();
@@ -288,12 +279,13 @@ namespace AZ
// add byproducts as job output products:
if (variantCreationContext.m_outputByproducts)
{
+ uint32_t subProductType = aznumeric_cast(RPI::ShaderAssetSubId::GeneratedHlslSource) + 1;
for (const AZStd::string& byproduct : variantCreationContext.m_outputByproducts->m_intermediatePaths)
{
AssetBuilderSDK::JobProduct jobProduct;
jobProduct.m_productFileName = byproduct;
jobProduct.m_productAssetType = Uuid::CreateName("DebugInfoByProduct-PdbOrDxilTxt");
- jobProduct.m_productSubID = ShaderBuilderUtility::MakeDebugByproductSubId(shaderPlatformInterface->GetAPIType(), byproduct);
+ jobProduct.m_productSubID = RPI::ShaderAsset::MakeAssetProductSubId(shaderPlatformInterface->GetAPIUniqueIndex(), subProductType++);
response.m_outputProducts.push_back(AZStd::move(jobProduct));
}
}
@@ -305,12 +297,12 @@ namespace AZ
attributeMaps.resize(RHI::ShaderStageCount);
for (const auto& shaderEntry : shaderSourceDataDescriptor.m_programSettings.m_entryPoints)
{
- auto findId = AZStd::find_if(AZ_BEGIN_END(azslData.m_topData.m_functions), [&shaderEntry](const auto& func)
+ auto findId = AZStd::find_if(AZ_BEGIN_END(azslData.m_functions), [&shaderEntry](const auto& func)
{
return func.m_name == shaderEntry.m_name;
});
- if (findId == azslData.m_topData.m_functions.end())
+ if (findId == azslData.m_functions.end())
{
// shaderData.m_functions only contains Vertex, Fragment and Compute entries for now
// Tessellation shaders will need to be handled too
diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder2.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder2.cpp
new file mode 100644
index 0000000000..1668b57866
--- /dev/null
+++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder2.cpp
@@ -0,0 +1,684 @@
+/*
+* 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 "ShaderAssetBuilder2.h"
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "AzslBuilder.h"
+#include "ShaderVariantAssetBuilder2.h"
+#include "ShaderBuilderUtility.h"
+#include "ShaderPlatformInterfaceRequest.h"
+#include "AtomShaderConfig.h"
+
+#include
+#include
+namespace AZ
+{
+ namespace ShaderBuilder
+ {
+ static constexpr char ShaderAssetBuilder2Name[] = "ShaderAssetBuilder2";
+ static constexpr uint32_t ShaderAssetBuildTimestampParam = 0;
+
+ void ShaderAssetBuilder2::CreateJobs(const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response) const
+ {
+ AZStd::string fullPath;
+ AzFramework::StringFunc::Path::ConstructFull(request.m_watchFolder.data(), request.m_sourceFile.data(), fullPath, true);
+
+ AZ_TracePrintf(ShaderAssetBuilder2Name, "CreateJobs for Shader \"%s\"\n", fullPath.data());
+
+ // Used to synchronize versions of the ShaderAsset and ShaderVariantTreeAsset, especially during hot-reload.
+ // Note it's probably important for this to be set once outside the platform loop so every platform's ShaderAsset
+ // has the same value, because later the ShaderVariantTreeAsset job will fetch this value from the local ShaderAsset
+ // which could cross platforms (i.e. building an android ShaderVariantTreeAsset on PC would fetch the tiemstamp from
+ // the PC's ShaderAsset).
+ AZStd::sys_time_t shaderAssetBuildTimestamp = AZStd::GetTimeNowMicroSecond();
+
+ // Need to get the name of the azsl file from the .shader source asset, to be able to declare a dependency to SRG Layout Job.
+ // and the macro options to preprocess.
+ auto descriptorParseOutcome = ShaderBuilderUtility::LoadShaderDataJson(fullPath);
+ if (!descriptorParseOutcome.IsSuccess())
+ {
+ AZ_Error(
+ ShaderAssetBuilder2Name, false, "Failed to parse Shader Descriptor JSON: %s",
+ descriptorParseOutcome.GetError().c_str());
+ return;
+ }
+
+ RPI::ShaderSourceData shaderSourceData = descriptorParseOutcome.TakeValue();
+
+ AZStd::string azslFullPath;
+ ShaderBuilderUtility::GetAbsolutePathToAzslFile(fullPath, shaderSourceData.m_source, azslFullPath);
+ if (!IO::FileIOBase::GetInstance()->Exists(azslFullPath.c_str()))
+ {
+ AZ_Error(
+ ShaderAssetBuilder2Name, false, "Shader program listed as the source entry does not exist: %s.", azslFullPath.c_str());
+ response.m_result = AssetBuilderSDK::CreateJobsResultCode::Failed;
+ return;
+ }
+
+
+ GlobalBuildOptions buildOptions = ReadBuildOptions(ShaderAssetBuilder2Name);
+
+ // [GFX TODO] [ATOM-14966] In principle, based on macro definitions, included files can change per supervariant.
+ // So, the list of source asset dependencies must be collected by running MCPP on each supervariant.
+ // For now, we will run MCPP only once because CreateJobs() should be as light as possible.
+ //
+ // Regardless of the PlatformInfo and enabled ShaderPlatformInterfaces, the azsl file will be preprocessed
+ // with the sole purpose of extracting all included files. For each included file a SourceDependency will be declared.
+ PreprocessorData output;
+ buildOptions.m_compilerArguments.Merge(shaderSourceData.m_compiler);
+ PreprocessFile(azslFullPath, output, buildOptions.m_preprocessorSettings, true, true);
+ for (auto includePath : output.includedPaths)
+ {
+ // m_sourceFileDependencyList does not support paths with "." or ".." for relative lookup, but the preprocessor
+ // may produce path strings like "C:/a/b/c/../../d/file.azsli" so we have to normalize
+ AzFramework::StringFunc::Path::Normalize(includePath);
+
+ AssetBuilderSDK::SourceFileDependency includeFileDependency;
+ includeFileDependency.m_sourceFileDependencyPath = includePath;
+ response.m_sourceFileDependencyList.emplace_back(includeFileDependency);
+ }
+
+ {
+ // Add the AZSL as source dependency
+ AssetBuilderSDK::SourceFileDependency azslFileDependency;
+ azslFileDependency.m_sourceFileDependencyPath = azslFullPath;
+ response.m_sourceFileDependencyList.emplace_back(azslFileDependency);
+ }
+
+ for (const AssetBuilderSDK::PlatformInfo& platformInfo : request.m_enabledPlatforms)
+ {
+ AZ_TraceContext("For platform", platformInfo.m_identifier.data());
+
+ // Get the platform interfaces to be able to access the prepend file
+ AZStd::vector platformInterfaces = ShaderBuilderUtility::DiscoverValidShaderPlatformInterfaces(platformInfo);
+ if (platformInterfaces.empty())
+ {
+ continue;
+ }
+
+ AssetBuilderSDK::JobDescriptor jobDescriptor;
+ jobDescriptor.m_priority = 2;
+ // [GFX TODO][ATOM-2830] Set 'm_critical' back to 'false' once proper fix for Atom startup issues are in
+ jobDescriptor.m_critical = true;
+ jobDescriptor.m_jobKey = ShaderAssetBuilder2JobKey;
+ jobDescriptor.SetPlatformIdentifier(platformInfo.m_identifier.c_str());
+ jobDescriptor.m_jobParameters.emplace(ShaderAssetBuildTimestampParam, AZStd::to_string(shaderAssetBuildTimestamp));
+
+ response.m_createJobOutputs.push_back(jobDescriptor);
+ } // for all request.m_enabledPlatforms
+
+ response.m_result = AssetBuilderSDK::CreateJobsResultCode::Success;
+ }
+
+ static bool SerializeOutShaderAsset(Data::Asset shaderAsset,
+ const AZStd::string& tempDirPath,
+ AssetBuilderSDK::ProcessJobResponse& response)
+ {
+ AZStd::string shaderAssetFileName = AZStd::string::format("%s.%s", shaderAsset->GetName().GetCStr(), RPI::ShaderAsset2::Extension);
+ AZStd::string shaderAssetOutputPath;
+ AzFramework::StringFunc::Path::ConstructFull(tempDirPath.data(), shaderAssetFileName.data(), shaderAssetOutputPath, true);
+
+ if (!Utils::SaveObjectToFile(shaderAssetOutputPath, DataStream::ST_BINARY, shaderAsset.Get()))
+ {
+ AZ_Error(ShaderAssetBuilder2Name, false, "Failed to output Shader Descriptor");
+ return false;
+ }
+
+ AssetBuilderSDK::JobProduct shaderJobProduct;
+ if (!AssetBuilderSDK::OutputObject(shaderAsset.Get(), shaderAssetOutputPath, azrtti_typeid(),
+ aznumeric_cast(RPI::ShaderAsset2ProductSubId::ShaderAsset2), shaderJobProduct))
+ {
+ AZ_Error(ShaderAssetBuilder2Name, false, "Failed to output product dependencies.");
+ return false;
+ }
+ response.m_outputProducts.push_back(AZStd::move(shaderJobProduct));
+
+ return true;
+ }
+
+ static AZ::Outcome BuildAttributesMap(
+ const RHI::ShaderPlatformInterface* shaderPlatformInterface,
+ const AzslData& azslData,
+ const MapOfStringToStageType& shaderEntryPoints,
+ bool& hasRasterProgram)
+ {
+ hasRasterProgram = false;
+ bool hasComputeProgram = false;
+ bool hasRayTracingProgram = false;
+ RHI::ShaderStageAttributeMapList attributeMaps;
+ attributeMaps.resize(RHI::ShaderStageCount);
+ for (const auto& shaderEntryPoint : shaderEntryPoints)
+ {
+ auto shaderEntryName = shaderEntryPoint.first;
+ auto shaderStageType = shaderEntryPoint.second;
+ auto assetBuilderShaderType = ShaderBuilderUtility::ToAssetBuilderShaderType(shaderStageType);
+ hasRasterProgram |= shaderPlatformInterface->IsShaderStageForRaster(assetBuilderShaderType);
+ hasComputeProgram |= shaderPlatformInterface->IsShaderStageForCompute(assetBuilderShaderType);
+ hasRayTracingProgram |= shaderPlatformInterface->IsShaderStageForRayTracing(assetBuilderShaderType);
+
+ auto findId = AZStd::find_if(AZ_BEGIN_END(azslData.m_functions), [&shaderEntryPoint](const auto& func) {
+ return func.m_name == shaderEntryPoint.first;
+ });
+
+ if (findId == azslData.m_functions.end())
+ {
+ // shaderData.m_functions only contains Vertex, Fragment and Compute entries for now
+ // Tessellation shaders will need to be handled too
+ continue;
+ }
+
+ const auto shaderStage = ToRHIShaderStage(assetBuilderShaderType);
+ for (const auto& attr : findId->attributesList)
+ {
+ // Some stages like RHI::ShaderStage::Tessellation are compound and consist of two or more shader entries
+ const Name& attributeName = attr.first;
+ const RHI::ShaderStageAttributeArguments& args = attr.second;
+ const auto stageIndex = static_cast(shaderStage);
+ AZ_Assert(stageIndex < RHI::ShaderStageCount, "Invalid shader stage specified!");
+ attributeMaps[stageIndex][attributeName] = args;
+ }
+ }
+
+ if (hasRasterProgram && hasComputeProgram)
+ {
+ return AZ::Failure(AZStd::string(" Shader asset descriptor defines both a raster entry point and a compute entry point."));
+ }
+
+ if (!hasRasterProgram && !hasComputeProgram && !hasRayTracingProgram)
+ {
+ AZStd::string entryPointNames = ShaderBuilderUtility::GetAcceptableDefaultEntryPointNames(azslData);
+ return AZ::Failure(
+ AZStd::string::format( "Shader asset descriptor has a program variant that does not define any entry points. Either declare entry "
+ "points in the .shader file, or use one of the available default names (not case-sensitive): [%s]",
+ entryPointNames.c_str()));
+ }
+
+ return AZ::Success(attributeMaps);
+ }
+
+ void ShaderAssetBuilder2::ProcessJob(const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response) const
+ {
+ const AZStd::sys_time_t startTime = AZStd::GetTimeNowTicks();
+ AZStd::string shaderFullPath;
+ AzFramework::StringFunc::Path::ConstructFull(request.m_watchFolder.c_str(), request.m_sourceFile.c_str(), shaderFullPath, true);
+ // Save .shader file name (no extension and no parent directory path)
+ AZStd::string shaderFileName;
+ AzFramework::StringFunc::Path::GetFileName(request.m_sourceFile.c_str(), shaderFileName);
+
+ // No error checking because the same calls were already executed during CreateJobs()
+ auto descriptorParseOutcome = ShaderBuilderUtility::LoadShaderDataJson(shaderFullPath);
+ RPI::ShaderSourceData shaderSourceData = descriptorParseOutcome.TakeValue();
+ AZStd::string azslFullPath;
+ ShaderBuilderUtility::GetAbsolutePathToAzslFile(shaderFullPath, shaderSourceData.m_source, azslFullPath);
+ AZ_TracePrintf(ShaderAssetBuilder2Name, "Original AZSL File: %s \n", azslFullPath.c_str());
+
+ // The directory where the Azsl file was found must be added to the list of include paths
+ AZStd::string azslFolderPath;
+ AzFramework::StringFunc::Path::GetFolderPath(azslFullPath.c_str(), azslFolderPath);
+ GlobalBuildOptions buildOptions = ReadBuildOptions(ShaderAssetBuilder2Name, azslFolderPath.c_str());
+
+ // Request the list of valid shader platform interfaces for the target platform.
+ AZStd::vector platformInterfaces = ShaderBuilderUtility::DiscoverEnabledShaderPlatformInterfaces(
+ request.m_platformInfo, shaderSourceData);
+ if (platformInterfaces.empty())
+ {
+ //No work to do. Exit gracefully.
+ AZ_TracePrintf(ShaderAssetBuilder2Name,
+ "No azshader is produced on behalf of %s because all valid RHI backends were disabled for this shader.\n",
+ shaderFullPath.c_str());
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success;
+ return;
+ }
+
+ // Get the time stamp string as sys_time_t, and also convert back to string to make sure it was converted correctly.
+ AZStd::sys_time_t shaderAssetBuildTimestamp = 0;
+ auto shaderAssetBuildTimestampIterator = request.m_jobDescription.m_jobParameters.find(ShaderAssetBuildTimestampParam);
+ if (shaderAssetBuildTimestampIterator != request.m_jobDescription.m_jobParameters.end())
+ {
+ shaderAssetBuildTimestamp = AZStd::stoull(shaderAssetBuildTimestampIterator->second);
+
+ if (AZStd::to_string(shaderAssetBuildTimestamp) != shaderAssetBuildTimestampIterator->second)
+ {
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
+ AZ_Assert(false, "Incorrect conversion of ShaderAssetBuildTimestampParam");
+ return;
+ }
+ }
+
+ auto supervariantList = ShaderBuilderUtility::GetSupervariantListFromShaderSourceData(shaderSourceData);
+
+ RPI::ShaderAssetCreator2 shaderAssetCreator;
+ shaderAssetCreator.Begin(Uuid::CreateRandom());
+
+ shaderAssetCreator.SetName(AZ::Name{shaderFileName.c_str()});
+ shaderAssetCreator.SetDrawListName(Name(shaderSourceData.m_drawListName));
+ shaderAssetCreator.SetShaderAssetBuildTimestamp(shaderAssetBuildTimestamp);
+
+ // The ShaderOptionGroupLayout must be the same across all supervariants because
+ // there can be only a single ShaderVariantTreeAsset per ShaderAsset.
+ // We will store here the one that results when the *.azslin file is
+ // compiled for the default, nameless, supervariant.
+ // For all other supervariants we just make sure the hashes are the same
+ // as this one.
+ RPI::Ptr finalShaderOptionGroupLayout = nullptr;
+
+
+ // Time to describe the big picture.
+ // 1- Preprocess an AZSL file with MCPP (a C-Preprocessor), and generate a flat AZSL file without #include lines and any macros in it.
+ // Let's call it the Flat-AZSL file. There are two levels of macro definition that need to be merged before we can invoke MCPP:
+ // 1.1- From /Config/shader_global_build_options.json, which we have stored in the local variable @buildOptions.
+ // 1.2- From the "Supervariant" definition key, which can be different for each supervariant.
+ // 2- There will be one Flat-AZSL per supervariant. Each Flat-AZSL will be transpiled to HLSL with AZSLc. This means there will be one HLSL file
+ // per supervariant.
+ // 3- The generated HLSL (one HLSL per supervariant) file may contain C-Preprocessor Macros inserted by AZSLc. And that file will be given to DXC.
+ // DXC has a preprocessor embedded in it. DXC will be executed once for each entry function listed in the .shader file.
+ // There will be one DXIL compiled binary for each entry function. All the DXIL compiled binaries for each supervariant will be combined
+ // in the ROOT ShaderVariantAsset.
+
+ // Remark: In general, the work done by the ShaderVariantAssetBuilder is similar, but it will start from the HLSL file created; in step 2, mentioned above; by this builder,
+ // for each supervariant.
+
+ // At this moment We have global build options that should be merged with the build options that are common
+ // to all the supervariants of this shader.
+ buildOptions.m_compilerArguments.Merge(shaderSourceData.m_compiler);
+
+ for (RHI::ShaderPlatformInterface* shaderPlatformInterface : platformInterfaces)
+ {
+ AZStd::string apiName(shaderPlatformInterface->GetAPIName().GetCStr());
+ AZ_TraceContext("Platform API", apiName);
+ // Signal the begin of shader data for an RHI API.
+ shaderAssetCreator.BeginAPI(shaderPlatformInterface->GetAPIType());
+
+ // Each shaderPlatformInterface has its own azsli header that needs to be prepended to the AZSL file before
+ // preprocessing. We will create a new temporary file that contains the combined data.
+ RHI::PrependArguments args;
+ args.m_sourceFile = azslFullPath.c_str();
+ args.m_prependFile = shaderPlatformInterface->GetAzslHeader(request.m_platformInfo);
+ args.m_addSuffixToFileName = apiName.c_str();
+ args.m_destinationFolder = request.m_tempDirPath.c_str();
+
+ AZStd::string prependedAzslFilePath = RHI::PrependFile(args);
+ if (prependedAzslFilePath == azslFullPath)
+ {
+ // For some reason the combined azsl file was not created in the temporary
+ // directory assigned to this job.
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
+ return;
+ }
+
+ // Cache common AZSLC invokation arguments related with the current RHI Backend.
+ // Each supervariant can, optionally, remove or add more arguments for AZSLc.
+ AZStd::string commonAzslcCompilerParameters =
+ shaderPlatformInterface->GetAzslCompilerParameters(buildOptions.m_compilerArguments);
+ commonAzslcCompilerParameters += " ";
+ commonAzslcCompilerParameters +=
+ shaderPlatformInterface->GetAzslCompilerWarningParameters(buildOptions.m_compilerArguments);
+ AtomShaderConfig::AddParametersFromConfigFile(commonAzslcCompilerParameters, request.m_platformInfo);
+
+ // The register number only makes sense if the platform uses "spaces",
+ // since the register Id of the resource will not change even if the pipeline layout changes.
+ // We can pass in a default ShaderCompilerArguments because all we care about is whether the shaderPlatformInterface
+ // appends the "--use-spaces" flag.
+ const bool platformUsesRegisterSpaces =
+ (AzFramework::StringFunc::Find(commonAzslcCompilerParameters, "--use-spaces") != AZStd::string::npos);
+
+ uint32_t supervariantIndex = 0;
+ for (const auto& supervariantInfo : supervariantList)
+ {
+ AssetBuilderSDK::JobCancelListener jobCancelListener(request.m_jobId);
+ if (jobCancelListener.IsCancelled())
+ {
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Cancelled;
+ return;
+ }
+
+ shaderAssetCreator.BeginSupervariant(supervariantInfo.m_name);
+
+ // Let's combine the global macro definitions, with the macro definitions particular to this
+ // supervariant. Two steps:
+ // 1- Supervariants can specify which macros to remove from the global definitions.
+ AZStd::vector macroDefinitionNamesToRemove = supervariantInfo.GetCombinedListOfMacroDefinitionNamesToRemove();
+ PreprocessorOptions preprocessorOptions = buildOptions.m_preprocessorSettings;
+ preprocessorOptions.RemovePredefinedMacros(macroDefinitionNamesToRemove);
+ // 2- Supervariants can specify which macros to add.
+ AZStd::vector macroDefinitionsToAdd = supervariantInfo.GetMacroDefinitionsToAdd();
+ preprocessorOptions.m_predefinedMacros.insert(
+ preprocessorOptions.m_predefinedMacros.end(), macroDefinitionsToAdd.begin(), macroDefinitionsToAdd.end());
+ // Run the preprocessor.
+ PreprocessorData output;
+ PreprocessFile(prependedAzslFilePath, output, preprocessorOptions, true, true);
+ RHI::ReportErrorMessages(ShaderAssetBuilder2Name, output.diagnostics);
+ // Dump the preprocessed string as a flat AZSL file with extension .azslin, which will be given to AZSLc to generate the HLSL file.
+ AZStd::string superVariantAzslinStemName = shaderFileName;
+ if (!supervariantInfo.m_name.IsEmpty())
+ {
+ superVariantAzslinStemName += AZStd::string::format("-%s", supervariantInfo.m_name.GetCStr());
+ }
+ AZStd::string azslinFullPath = ShaderBuilderUtility::DumpPreprocessedCode(
+ ShaderAssetBuilder2Name, output.code, request.m_tempDirPath, superVariantAzslinStemName,
+ apiName, true /*add2*/);
+ if (azslinFullPath.empty())
+ {
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
+ return;
+ }
+ AZ_TracePrintf(ShaderAssetBuilder2Name, "Preprocessed AZSL File: %s \n", prependedAzslFilePath.c_str());
+
+ // Before transpiling the flat-AZSL(.azslin) file into HLSL it is necessary
+ // to setup the AZSLc arguments as required by the current supervariant.
+ AZStd::string azslcCompilerParameters = supervariantInfo.GetCustomizedArgumentsForAzslc(commonAzslcCompilerParameters);
+
+ // Ready to transpile the azslin file into HLSL.
+ ShaderBuilder::AzslCompiler azslc(azslinFullPath);
+ AZStd::string hlslFullPath = AZStd::string::format("%s_%s.hlsl2", superVariantAzslinStemName.c_str(), apiName.c_str());
+ AzFramework::StringFunc::Path::Join(request.m_tempDirPath.c_str(), hlslFullPath.c_str(), hlslFullPath, true);
+ auto emitFullOutcome = azslc.EmitFullData(azslcCompilerParameters, hlslFullPath, "2");
+ if (!emitFullOutcome.IsSuccess())
+ {
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
+ return;
+ }
+ ShaderBuilderUtility::AzslSubProducts::Paths subProductsPaths = emitFullOutcome.TakeValue();
+
+ // In addition to the hlsl file, there are other json files that were generated.
+ // Each output file will become a product.
+ for (int i = 0; i < subProductsPaths.size(); ++i)
+ {
+ AssetBuilderSDK::JobProduct jobProduct;
+ jobProduct.m_productFileName = subProductsPaths[i];
+ static const AZ::Uuid AzslOutcomeType = "{6977AEB1-17AD-4992-957B-23BB2E85B18B}";
+ jobProduct.m_productAssetType = AzslOutcomeType;
+ // uint32_t rhiApiUniqueIndex, uint32_t supervariantIndex, uint32_t subProductType
+ jobProduct.m_productSubID = RPI::ShaderAsset2::MakeProductAssetSubId(
+ shaderPlatformInterface->GetAPIUniqueIndex(), supervariantIndex,
+ aznumeric_cast(ShaderBuilderUtility::AzslSubProducts::SubList[i]));
+ jobProduct.m_dependenciesHandled = true;
+ // Note that the output products are not traditional product assets that will be used by the game project.
+ // They are artifacts that are produced once, cached, and used later by other AssetBuilders as a way to centralize
+ // build organization.
+ response.m_outputProducts.push_back(AZStd::move(jobProduct));
+ }
+
+ AZStd::shared_ptr files(new ShaderFiles);
+ AzslData azslData(files);
+ azslData.m_preprocessedFullPath = azslinFullPath;
+ RPI::ShaderResourceGroupLayoutList srgLayoutList;
+ RPI::Ptr shaderOptionGroupLayout = RPI::ShaderOptionGroupLayout::Create();
+ BindingDependencies bindingDependencies;
+ RootConstantData rootConstantData;
+ AssetBuilderSDK::ProcessJobResultCode azslJsonReadResult = ShaderBuilderUtility::PopulateAzslDataFromJsonFiles(
+ ShaderAssetBuilder2Name, subProductsPaths, platformUsesRegisterSpaces, azslData, srgLayoutList, shaderOptionGroupLayout,
+ bindingDependencies, rootConstantData);
+ if (azslJsonReadResult != AssetBuilderSDK::ProcessJobResult_Success)
+
+ {
+ response.m_resultCode = azslJsonReadResult;
+ return;
+ }
+
+ shaderAssetCreator.SetSrgLayoutList(srgLayoutList);
+
+ if (!finalShaderOptionGroupLayout)
+ {
+ finalShaderOptionGroupLayout = shaderOptionGroupLayout;
+ shaderAssetCreator.SetShaderOptionGroupLayout(finalShaderOptionGroupLayout);
+ const uint32_t usedShaderOptionBits = shaderOptionGroupLayout->GetBitSize();
+ AZ_TracePrintf(
+ ShaderAssetBuilder2Name, "Note: This shader uses %u of %u available shader variant key bits. \n",
+ usedShaderOptionBits, RPI::ShaderVariantKeyBitCount);
+ }
+ else
+ {
+ if (finalShaderOptionGroupLayout->GetHash() != shaderOptionGroupLayout->GetHash())
+ {
+ AZ_Error(
+ ShaderAssetBuilder2Name, false, "Supervariant %s has a different ShaderOptionGroupLayout",
+ supervariantInfo.m_name.GetCStr())
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
+ return;
+ }
+ }
+
+ // Discover entry points & type of programs.
+ MapOfStringToStageType shaderEntryPoints;
+ if (shaderSourceData.m_programSettings.m_entryPoints.empty())
+ {
+ AZ_TracePrintf(
+ ShaderAssetBuilder2Name,
+ "ProgramSettings do not specify entry points, will use GetDefaultEntryPointsFromShader()\n");
+ ShaderBuilderUtility::GetDefaultEntryPointsFromFunctionDataList(azslData.m_functions, shaderEntryPoints);
+ }
+ else
+ {
+ for (const auto& entryPoint : shaderSourceData.m_programSettings.m_entryPoints)
+ {
+ shaderEntryPoints[entryPoint.m_name] = entryPoint.m_type;
+ }
+ }
+
+ bool hasRasterProgram = false;
+ auto attributeMapsOutcome = BuildAttributesMap(shaderPlatformInterface, azslData, shaderEntryPoints, hasRasterProgram);
+ if (!attributeMapsOutcome.IsSuccess())
+ {
+ AZ_Error(ShaderAssetBuilder2Name, false, "%s\n", attributeMapsOutcome.GetError().c_str());
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
+ return;
+ }
+ shaderAssetCreator.SetShaderStageAttributeMapList(attributeMapsOutcome.TakeValue());
+
+ // Check if we were canceled before we do any heavy processing of
+ // the shader data (compiling the shader kernels, processing SRG
+ // and pipeline layout data, etc.).
+ if (jobCancelListener.IsCancelled())
+ {
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Cancelled;
+ return;
+ }
+
+ RHI::Ptr pipelineLayoutDescriptor =
+ ShaderBuilderUtility::BuildPipelineLayoutDescriptorForApi(
+ ShaderAssetBuilder2Name, srgLayoutList, shaderEntryPoints, buildOptions.m_compilerArguments, rootConstantData,
+ shaderPlatformInterface, bindingDependencies);
+ if (!pipelineLayoutDescriptor)
+ {
+ AZ_Error(
+ ShaderAssetBuilder2Name, false, "Failed to build pipeline layout descriptor for api=[%s]",
+ shaderPlatformInterface->GetAPIName().GetCStr());
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
+ return;
+ }
+
+ shaderAssetCreator.SetPipelineLayout(pipelineLayoutDescriptor);
+
+
+ RPI::ShaderInputContract shaderInputContract;
+ RPI::ShaderOutputContract shaderOutputContract;
+ size_t colorAttachmentCount = 0;
+ ShaderBuilderUtility::CreateShaderInputAndOutputContracts(
+ azslData, shaderEntryPoints, *shaderOptionGroupLayout.get(),
+ subProductsPaths[ShaderBuilderUtility::AzslSubProducts::om],
+ subProductsPaths[ShaderBuilderUtility::AzslSubProducts::ia],
+ shaderInputContract, shaderOutputContract, colorAttachmentCount);
+ shaderAssetCreator.SetInputContract(shaderInputContract);
+ shaderAssetCreator.SetOutputContract(shaderOutputContract);
+
+ if (hasRasterProgram)
+ {
+ // Set the various states to what is in the descriptor.
+ const RHI::TargetBlendState& targetBlendState = shaderSourceData.m_blendState;
+ RHI::RenderStates renderStates;
+ renderStates.m_rasterState = shaderSourceData.m_rasterState;
+ renderStates.m_depthStencilState = shaderSourceData.m_depthStencilState;
+ // [GFX TODO][ATOM-930] We should support unique blend states per RT
+ for (size_t i = 0; i < colorAttachmentCount; ++i)
+ {
+ renderStates.m_blendState.m_targets[i] = targetBlendState;
+ }
+
+ shaderAssetCreator.SetRenderStates(renderStates);
+ }
+
+ Outcome hlslSourceCodeOutcome = Utils::ReadFile(hlslFullPath);
+ if (!hlslSourceCodeOutcome.IsSuccess())
+ {
+ AZ_Error(
+ ShaderAssetBuilder2Name, false, "Failed to obtain shader source from %s. [%s]", hlslFullPath.c_str(),
+ hlslSourceCodeOutcome.GetError().c_str());
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
+ return;
+ }
+ AZStd::string hlslSourceCode = hlslSourceCodeOutcome.TakeValue();
+
+ // The root ShaderVariantAsset needs to be created with the known uuid of the source .shader asset because
+ // the ShaderAsset owns a Data::Asset<> reference that gets serialized. It must have the correct uuid
+ // so the root ShaderVariantAsset is found when the ShaderAsset is deserialized.
+ uint32_t rootVariantProductSubId = RPI::ShaderAsset2::MakeProductAssetSubId(
+ shaderPlatformInterface->GetAPIUniqueIndex(), supervariantIndex,
+ aznumeric_cast(RPI::ShaderAsset2ProductSubId::RootShaderVariantAsset));
+ auto assetIdOutcome = RPI::AssetUtils::MakeAssetId(shaderFullPath, rootVariantProductSubId);
+ AZ_Assert(assetIdOutcome.IsSuccess(), "Failed to get AssetId from shader %s", shaderFullPath.c_str());
+ const Data::AssetId variantAssetId = assetIdOutcome.TakeValue();
+
+ RPI::ShaderVariantListSourceData::VariantInfo rootVariantInfo;
+ ShaderVariantCreationContext2 shaderVariantCreationContext = {
+ *shaderPlatformInterface,
+ request.m_platformInfo,
+ buildOptions.m_compilerArguments,
+ request.m_tempDirPath,
+ startTime,
+ shaderSourceData,
+ *shaderOptionGroupLayout.get(),
+ shaderEntryPoints,
+ variantAssetId,
+ superVariantAzslinStemName,
+ hlslFullPath,
+ hlslSourceCode};
+
+
+ AZStd::optional outputByproducts;
+ auto rootShaderVariantAssetOutcome = ShaderVariantAssetBuilder2::CreateShaderVariantAsset(rootVariantInfo, shaderVariantCreationContext, outputByproducts);
+ if (!rootShaderVariantAssetOutcome.IsSuccess())
+ {
+ AZ_Error(ShaderAssetBuilder2Name, false, "%s\n", rootShaderVariantAssetOutcome.GetError().c_str())
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
+ return;
+ }
+ Data::Asset rootShaderVariantAsset = rootShaderVariantAssetOutcome.TakeValue();
+
+ shaderAssetCreator.SetRootShaderVariantAsset(rootShaderVariantAsset);
+
+ if (!shaderAssetCreator.EndSupervariant())
+ {
+ AZ_Error(
+ ShaderAssetBuilder2Name, false, "Failed to create shader asset for supervariant [%s]", supervariantInfo.m_name.GetCStr())
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
+ return;
+ }
+
+ // Time to save the root variant related assets in the cache.
+ AssetBuilderSDK::JobProduct assetProduct;
+ if (!ShaderVariantAssetBuilder2::SerializeOutShaderVariantAsset(
+ rootShaderVariantAsset, superVariantAzslinStemName, request.m_tempDirPath, *shaderPlatformInterface,
+ rootVariantProductSubId,
+ assetProduct))
+ {
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
+ return;
+ }
+ response.m_outputProducts.push_back(assetProduct);
+
+ if (outputByproducts)
+ {
+ // add byproducts as job output products:
+ uint32_t subProductType = aznumeric_cast(RPI::ShaderAsset2ProductSubId::FirstByProduct);
+ for (const AZStd::string& byproduct : outputByproducts.value().m_intermediatePaths)
+ {
+ AssetBuilderSDK::JobProduct jobProduct;
+ jobProduct.m_productFileName = byproduct;
+ jobProduct.m_productAssetType = Uuid::CreateName("DebugInfoByProduct-PdbOrDxilTxt");
+ jobProduct.m_productSubID = RPI::ShaderAsset2::MakeProductAssetSubId(
+ shaderPlatformInterface->GetAPIUniqueIndex(), supervariantIndex,
+ subProductType++);
+ response.m_outputProducts.push_back(AZStd::move(jobProduct));
+ }
+ }
+
+
+ supervariantIndex++;
+
+ } // end for the supervariant
+
+ shaderAssetCreator.EndAPI();
+
+ } // end for all ShaderPlatformInterfaces
+
+ Data::Asset shaderAsset;
+ if (!shaderAssetCreator.End(shaderAsset))
+ {
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
+ return;
+ }
+
+ if (!SerializeOutShaderAsset(shaderAsset, request.m_tempDirPath, response))
+ {
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed;
+ return;
+ }
+
+ response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success;
+
+ const AZStd::sys_time_t endTime = AZStd::GetTimeNowTicks();
+ const AZStd::sys_time_t deltaTime = endTime - startTime;
+ const float elapsedTimeSeconds = (float)(deltaTime) / (float)AZStd::GetTimeTicksPerSecond();
+
+ AZ_TracePrintf(ShaderAssetBuilder2Name, "Finished processing %s in %.2f seconds\n", request.m_sourceFile.c_str(), elapsedTimeSeconds);
+
+ ShaderBuilderUtility::LogProfilingData(ShaderAssetBuilder2Name, shaderFileName);
+ }
+
+ } // ShaderBuilder
+} // AZ
diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder2.h b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder2.h
new file mode 100644
index 0000000000..915d4e53d0
--- /dev/null
+++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder2.h
@@ -0,0 +1,60 @@
+/*
+* 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
+
+namespace AZ
+{
+ namespace Data
+ {
+ class AssetHandler;
+ }
+
+ namespace RHI
+ {
+ class ShaderPlatformInterface;
+ }
+
+ namespace ShaderBuilder
+ {
+ struct AzslData;
+
+ class ShaderAssetBuilder2
+ : public AssetBuilderSDK::AssetBuilderCommandBus::Handler
+ {
+ public:
+ AZ_TYPE_INFO(ShaderAssetBuilder2, "{C94DA151-82BC-4475-86FA-E6C92A0BD6F8}");
+
+ static constexpr const char* ShaderAssetBuilder2JobKey = "Shader Asset 2";
+
+ ShaderAssetBuilder2() = default;
+ ~ShaderAssetBuilder2() = default;
+
+ // Asset Builder Callback Functions ...
+ void CreateJobs(const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response) const;
+ void ProcessJob(const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response) const;
+
+ // AssetBuilderSDK::AssetBuilderCommandBus interface overrides ...
+ void ShutDown() override { };
+
+ private:
+ AZ_DISABLE_COPY_MOVE(ShaderAssetBuilder2);
+ };
+
+ } // ShaderBuilder
+} // AZ
diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp
index 19b2f328c1..a20b9c869b 100644
--- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp
+++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp
@@ -29,7 +29,8 @@
#include
#include
-#include
+#include // DEPRECATED - [ATOM-15472]
+#include
#include
#include
@@ -41,13 +42,15 @@
#include "ShaderPlatformInterfaceRequest.h"
#include "AtomShaderConfig.h"
+#include "SrgLayoutUtility.h"
+
namespace AZ
{
namespace ShaderBuilder
{
namespace ShaderBuilderUtility
{
- static const char* ShaderBuilderUtilityName = "ShaderBuilderUtility";
+ static constexpr char ShaderBuilderUtilityName[] = "ShaderBuilderUtility";
Outcome LoadShaderDataJson(const AZStd::string& fullPathToJsonFile)
{
@@ -84,22 +87,8 @@ namespace AZ
AzFramework::StringFunc::Path::ReplaceExtension(absoluteAzslPath, "azsl");
}
- uint32_t MakeDebugByproductSubId(RHI::APIType apiType, const AZStd::string& productFileName)
- {
- // bits: ----- 24 -----|- 4 -|- 4 -
- // fn hash | id + api | 0xF
- uint32_t subId = 0xF; // to avoid collisions with subid of other source outputs using RPI::ShaderAssetSubId::GeneratedSource + api
- uint32_t id_api = static_cast(RPI::ShaderAssetSubId::DebugByProduct);
- id_api += apiType;
- id_api <<= 4;
- subId |= id_api;
- size_t fnHash = AZStd::hash()(productFileName);
- subId |= static_cast(fnHash) & 0xFFFFFF00;
- return subId;
- }
-
static bool LoadShaderResourceGroupAssets(
- [[maybe_unused]] const char* BuilderName,
+ [[maybe_unused]] const char* builderName,
const SrgDataContainer& resourceGroups,
ShaderResourceGroupAssets& srgAssets)
{
@@ -121,7 +110,7 @@ namespace AZ
if (!assetFound)
{
- AZ_Error(BuilderName, false, "Could not find asset identified by path '%s'", srgFilePath.c_str());
+ AZ_Error(builderName, false, "Could not find asset identified by path '%s'", srgFilePath.c_str());
readSRGsSuccessfuly = false;
continue;
}
@@ -139,7 +128,7 @@ namespace AZ
: asset.GetStatus() == Status::ReadyPreNotify ? "ready-pre-notify"
: asset.GetStatus() == Status::Error ? "error" : "not-loaded/ready/unknown";
- AZ_Error(BuilderName, false, "Searching SRG [%s]: Could not load SRG asset. (asset status [%s]) AssetId='%s' Path='%s'",
+ AZ_Error(builderName, false, "Searching SRG [%s]: Could not load SRG asset. (asset status [%s]) AssetId='%s' Path='%s'",
srgData.m_name.c_str(),
statusString.c_str(),
assetId.ToString().c_str(), srgFilePath.c_str());
@@ -148,7 +137,7 @@ namespace AZ
}
else if (!asset->IsValid())
{
- AZ_Error(BuilderName, false, "SRG asset has no layout information. AssetId='%s' Path='%s'",
+ AZ_Error(builderName, false, "SRG asset has no layout information. AssetId='%s' Path='%s'",
assetId.ToString().c_str(), srgFilePath.c_str());
readSRGsSuccessfuly = false;
continue;
@@ -182,8 +171,10 @@ namespace AZ
return files;
}
+
+ //! [GFX TODO] [ATOM-15472] Deprecated, remove when this ticket is addressed.
AssetBuilderSDK::ProcessJobResultCode PopulateAzslDataFromJsonFiles(
- const char* BuilderName,
+ const char* builderName,
const AzslSubProducts::Paths& pathOfJsonFiles,
AzslData& azslData,
ShaderResourceGroupAssets& srgAssets,
@@ -204,7 +195,7 @@ namespace AZ
outcomes[i] = JsonSerializationUtils::ReadJsonFile(pathOfJsonFiles[i]);
if (!outcomes[i].IsSuccess())
{
- AZ_Error(BuilderName, false, "%s", outcomes[i].GetError().c_str());
+ AZ_Error(builderName, false, "%s", outcomes[i].GetError().c_str());
allReadSuccess = false;
}
}
@@ -215,22 +206,22 @@ namespace AZ
// Get full list of functions eligible for vertex shader entry points
// along with metadata for constructing the InputAssembly for each of them
- if (!azslc.ParseIaPopulateFunctionData(outcomes[AzslSubProducts::ia].GetValue(), azslData.m_topData.m_functions))
+ if (!azslc.ParseIaPopulateFunctionData(outcomes[AzslSubProducts::ia].GetValue(), azslData.m_functions))
{
return AssetBuilderSDK::ProcessJobResult_Failed;
}
// Each SRG is built as a separate asset in the SrgLayoutBuilder, here we just
// build the list and load the data from multiple dependency assets.
- if (!azslc.ParseSrgPopulateSrgData(outcomes[AzslSubProducts::srg].GetValue(), azslData.m_topData.m_srgData))
+ if (!azslc.ParseSrgPopulateSrgData(outcomes[AzslSubProducts::srg].GetValue(), azslData.m_srgData))
{
return AssetBuilderSDK::ProcessJobResult_Failed;
}
// Add all Shader Resource Group Assets that were defined in the shader code to the shader asset
- if (!LoadShaderResourceGroupAssets(BuilderName, azslData.m_topData.m_srgData, srgAssets))
+ if (!LoadShaderResourceGroupAssets(builderName, azslData.m_srgData, srgAssets))
{
- AZ_Error(BuilderName, false, "Failed to obtain shader resource group assets");
+ AZ_Error(builderName, false, "Failed to obtain shader resource group assets");
return AssetBuilderSDK::ProcessJobResult_Failed;
}
@@ -238,7 +229,7 @@ namespace AZ
// for each option and what is its default value.
if (!azslc.ParseOptionsPopulateOptionGroupLayout(outcomes[AzslSubProducts::options].GetValue(), shaderOptionGroupLayout))
{
- AZ_Error(BuilderName, false, "Failed to find a valid list of shader options!");
+ AZ_Error(builderName, false, "Failed to find a valid list of shader options!");
return AssetBuilderSDK::ProcessJobResult_Failed;
}
@@ -246,14 +237,100 @@ namespace AZ
// and informs us on register indexes and shader stages using these resources
if (!azslc.ParseBindingdepPopulateBindingDependencies(outcomes[AzslSubProducts::bindingdep].GetValue(), bindingDependencies)) // consuming data from binding-dep
{
- AZ_Error(BuilderName, false, "Failed to obtain shader resource binding reflection");
+ AZ_Error(builderName, false, "Failed to obtain shader resource binding reflection");
return AssetBuilderSDK::ProcessJobResult_Failed;
}
// access the root constants reflection
if (!azslc.ParseSrgPopulateRootConstantData(outcomes[AzslSubProducts::srg].GetValue(), rootConstantData)) // consuming data from --srg ("InlineConstantBuffer" subjson section)
{
- AZ_Error(BuilderName, false, "Failed to obtain root constant data reflection");
+ AZ_Error(builderName, false, "Failed to obtain root constant data reflection");
+ return AssetBuilderSDK::ProcessJobResult_Failed;
+ }
+
+ return AssetBuilderSDK::ProcessJobResult_Success;
+ }
+
+
+ AssetBuilderSDK::ProcessJobResultCode PopulateAzslDataFromJsonFiles(
+ const char* builderName,
+ const AzslSubProducts::Paths& pathOfJsonFiles,
+ const bool platformUsesRegisterSpaces,
+ AzslData& azslData,
+ RPI::ShaderResourceGroupLayoutList& srgLayoutList,
+ RPI::Ptr shaderOptionGroupLayout,
+ BindingDependencies& bindingDependencies,
+ RootConstantData& rootConstantData)
+ {
+ AzslCompiler azslc(
+ azslData
+ .m_preprocessedFullPath); // set the input file for eventual error messages, but the compiler won't be called on it.
+ bool allReadSuccess = true;
+ // read: input assembly reflection
+ // shader resource group reflection
+ // options reflection
+ // binding dependencies reflection
+ int indicesOfInterest[] = {
+ AzslSubProducts::ia, AzslSubProducts::srg, AzslSubProducts::options, AzslSubProducts::bindingdep};
+ AZStd::unordered_map> outcomes;
+ for (int i : indicesOfInterest)
+ {
+ outcomes[i] = JsonSerializationUtils::ReadJsonFile(pathOfJsonFiles[i]);
+ if (!outcomes[i].IsSuccess())
+ {
+ AZ_Error(builderName, false, "%s", outcomes[i].GetError().c_str());
+ allReadSuccess = false;
+ }
+ }
+ if (!allReadSuccess)
+ {
+ return AssetBuilderSDK::ProcessJobResult_Failed;
+ }
+
+ // Get full list of functions eligible for vertex shader entry points
+ // along with metadata for constructing the InputAssembly for each of them
+ if (!azslc.ParseIaPopulateFunctionData(outcomes[AzslSubProducts::ia].GetValue(), azslData.m_functions))
+ {
+ return AssetBuilderSDK::ProcessJobResult_Failed;
+ }
+
+ // Each SRG is built as a separate asset in the SrgLayoutBuilder, here we just
+ // build the list and load the data from multiple dependency assets.
+ if (!azslc.ParseSrgPopulateSrgData(outcomes[AzslSubProducts::srg].GetValue(), azslData.m_srgData))
+ {
+ return AssetBuilderSDK::ProcessJobResult_Failed;
+ }
+
+ // Add all Shader Resource Group Assets that were defined in the shader code to the shader asset
+ if (!SrgLayoutUtility::LoadShaderResourceGroupLayouts(builderName, azslData.m_srgData, platformUsesRegisterSpaces, srgLayoutList))
+ {
+ AZ_Error(builderName, false, "Failed to obtain shader resource group assets");
+ return AssetBuilderSDK::ProcessJobResult_Failed;
+ }
+
+ // The shader options define what options are available, what are the allowed values/range
+ // for each option and what is its default value.
+ if (!azslc.ParseOptionsPopulateOptionGroupLayout(outcomes[AzslSubProducts::options].GetValue(), shaderOptionGroupLayout))
+ {
+ AZ_Error(builderName, false, "Failed to find a valid list of shader options!");
+ return AssetBuilderSDK::ProcessJobResult_Failed;
+ }
+
+ // It analyzes the shader external bindings (all SRG contents)
+ // and informs us on register indexes and shader stages using these resources
+ if (!azslc.ParseBindingdepPopulateBindingDependencies(
+ outcomes[AzslSubProducts::bindingdep].GetValue(), bindingDependencies)) // consuming data from binding-dep
+ {
+ AZ_Error(builderName, false, "Failed to obtain shader resource binding reflection");
+ return AssetBuilderSDK::ProcessJobResult_Failed;
+ }
+
+ // access the root constants reflection
+ if (!azslc.ParseSrgPopulateRootConstantData(
+ outcomes[AzslSubProducts::srg].GetValue(),
+ rootConstantData)) // consuming data from --srg ("InlineConstantBuffer" subjson section)
+ {
+ AZ_Error(builderName, false, "Failed to obtain root constant data reflection");
return AssetBuilderSDK::ProcessJobResult_Failed;
}
@@ -312,7 +389,7 @@ namespace AZ
}
RHI::Ptr BuildPipelineLayoutDescriptorForApi(
- [[maybe_unused]] const char* BuilderName,
+ [[maybe_unused]] const char* builderName,
RHI::ShaderPlatformInterface* shaderPlatformInterface,
BindingDependencies& bindingDependencies /*inout*/,
const ShaderResourceGroupAssets& srgAssets,
@@ -356,7 +433,7 @@ namespace AZ
const BindingDependencies::SrgResources* srgResources = bindingDependencies.GetSrg(srgName);
if (!srgResources)
{
- AZ_Error(BuilderName, false, "SRG %s not found in the dependency dataset", srgName.data());
+ AZ_Error(builderName, false, "SRG %s not found in the dependency dataset", srgName.data());
return nullptr;
}
@@ -385,23 +462,21 @@ namespace AZ
for (const auto& constantData : rootConstantData->m_constants)
{
RHI::ShaderInputConstantDescriptor rootConstantDesc(
- constantData.m_nameId,
- constantData.m_constantByteOffset,
- constantData.m_constantByteSize,
+ constantData.m_nameId, constantData.m_constantByteOffset, constantData.m_constantByteSize,
rootConstantData->m_bindingInfo.m_registerId);
-
+
rootConstantsLayout->AddShaderInput(rootConstantDesc);
}
}
-
+
if (!rootConstantsLayout->Finalize())
{
- AZ_Error(BuilderName, false, "Failed to finalize root constants layout");
+ AZ_Error(builderName, false, "Failed to finalize root constants layout");
return nullptr;
}
pipelineLayoutDescriptor->SetRootConstantsLayout(*rootConstantsLayout);
-
+
RHI::ShaderPlatformInterface::RootConstantsInfo rootConstantInfo;
if (rootConstantData)
{
@@ -415,14 +490,15 @@ namespace AZ
rootConstantInfo.m_registerId = dummyRootConstantData.m_bindingInfo.m_registerId;
}
rootConstantInfo.m_totalSizeInBytes = rootConstantsLayout->GetDataSize();
-
+
// Build platform-specific PipelineLayoutDescriptor data, and finalize
- if (!shaderPlatformInterface->BuildPipelineLayoutDescriptor(pipelineLayoutDescriptor, srgInfos, rootConstantInfo, shaderCompilerArguments))
+ if (!shaderPlatformInterface->BuildPipelineLayoutDescriptor(
+ pipelineLayoutDescriptor, srgInfos, rootConstantInfo, shaderCompilerArguments))
{
- AZ_Error(BuilderName, false, "Failed to build pipeline layout descriptor");
+ AZ_Error(builderName, false, "Failed to build pipeline layout descriptor");
return nullptr;
}
-
+
return pipelineLayoutDescriptor;
}
@@ -442,7 +518,7 @@ namespace AZ
}
else
{
- formatted = AZStd::string::format("%s.%s.%s", stemName.c_str(), apiTypeString.c_str(), extension.c_str());
+ formatted = AZStd::string::format("%s_%s.%s", stemName.c_str(), apiTypeString.c_str(), extension.c_str());
}
AzFramework::StringFunc::Path::Join(dumpDirectory.c_str(), formatted.c_str(), finalFilePath, true, true);
AZ::IO::FileIOStream outFileStream(finalFilePath.data(), AZ::IO::OpenMode::ModeWrite);
@@ -463,14 +539,20 @@ namespace AZ
return finalFilePath;
}
- AZStd::string DumpPreprocessedCode(const char* builderName, const AZStd::string& preprocessedCode, const AZStd::string& tempDirPath, const AZStd::string& stemName, const AZStd::string& apiTypeString)
+ // [GFX TODO] Remove 'add2' when [ATOM-15472]
+ AZStd::string DumpPreprocessedCode(const char* builderName, const AZStd::string& preprocessedCode, const AZStd::string& tempDirPath, const AZStd::string& stemName, const AZStd::string& apiTypeString, bool add2)
{
+ if (add2)
+ {
+ return DumpCode(builderName, preprocessedCode, tempDirPath, stemName, apiTypeString, "azslin2");
+ }
+
return DumpCode(builderName, preprocessedCode, tempDirPath, stemName, apiTypeString, "azslin");
}
AZStd::string DumpAzslPrependedCode(const char* builderName, const AZStd::string& nonPreprocessedYetAzslSource, const AZStd::string& tempDirPath, const AZStd::string& stemName, const AZStd::string& apiTypeString)
{
- return DumpCode(builderName, nonPreprocessedYetAzslSource, tempDirPath, stemName, apiTypeString, "azsl.prepend");
+ return DumpCode(builderName, nonPreprocessedYetAzslSource, tempDirPath, stemName, apiTypeString, "azslprepend");
}
AZStd::string ExtractStemName(const char* path)
@@ -489,6 +571,83 @@ namespace AZ
return platformInterfaces;
}
+
+ AZStd::vector DiscoverEnabledShaderPlatformInterfaces(const AssetBuilderSDK::PlatformInfo& info, const RPI::ShaderSourceData& shaderSourceData)
+ {
+ // Request the list of valid shader platform interfaces for the target platform.
+ AZStd::vector platformInterfaces;
+ ShaderPlatformInterfaceRequestBus::BroadcastResult(
+ platformInterfaces, &ShaderPlatformInterfaceRequest::GetShaderPlatformInterface, info);
+
+ // Let's remove the unwanted RHI interfaces from the list.
+ platformInterfaces.erase(
+ AZStd::remove_if(AZ_BEGIN_END(platformInterfaces),
+ [&](const RHI::ShaderPlatformInterface* shaderPlatformInterface) {
+ return !shaderPlatformInterface ||
+ shaderSourceData.IsRhiBackendDisabled(shaderPlatformInterface->GetAPIName()) ||
+ (shaderPlatformInterface->GetAPIUniqueIndex() == static_cast(AZ::RHI::APIIndex::Null));
+ }),
+ platformInterfaces.end());
+ return platformInterfaces;
+ }
+
+ static bool IsValidSupervariantName(const AZStd::string& supervariantName)
+ {
+ return AZStd::all_of(AZ_BEGIN_END(supervariantName),
+ [](AZStd::string::value_type ch)
+ {
+ return AZStd::is_alnum(ch); // allow alpha numeric only
+ }
+ );
+ }
+
+ AZStd::vector GetSupervariantListFromShaderSourceData(
+ const RPI::ShaderSourceData& shaderSourceData)
+ {
+ AZStd::vector supervariants;
+ supervariants.reserve(shaderSourceData.m_supervariants.size() + 1);
+
+ // Add the supervariants, always making sure that:
+ // 1- The default, nameless, supervariant goes to the front.
+ // 2- Each supervariant has a unique name
+ AZStd::unordered_set uniqueSuperVariants; // This set helps duplicate detection.
+ // Although it is not common, it is possible to declare a nameless supervariant.
+ bool addedNamelessSupervariant = false;
+ for (const auto& supervariantInfo : shaderSourceData.m_supervariants)
+ {
+ if (!IsValidSupervariantName(supervariantInfo.m_name.GetStringView()))
+ {
+ AZ_Error(
+ ShaderBuilderUtilityName, false, "The supervariant name: [%s] contains invalid characters. Only [a-zA-Z0-9] are supported",
+ supervariantInfo.m_name.GetCStr());
+ return {}; // Return an empty vector.
+ }
+ if (uniqueSuperVariants.count(supervariantInfo.m_name))
+ {
+ AZ_Error(
+ ShaderBuilderUtilityName, false, "It is invalid to specify more than one supervariant with the same name: [%s]",
+ supervariantInfo.m_name.GetCStr());
+ return {}; // Return an empty vector.
+ }
+ uniqueSuperVariants.emplace(supervariantInfo.m_name);
+ supervariants.push_back(supervariantInfo);
+ if (supervariantInfo.m_name.IsEmpty())
+ {
+ addedNamelessSupervariant = true;
+ // Always move the default, nameless, variant to the begining of the list.
+ AZStd::swap(supervariants.front(), supervariants.back());
+ }
+ }
+ if (!addedNamelessSupervariant)
+ {
+ supervariants.push_back({});
+ // Always move the default, nameless, variant to the begining of the list.
+ AZStd::swap(supervariants.front(), supervariants.back());
+ }
+
+ return supervariants;
+ }
+
static void ReadShaderCompilerProfiling([[maybe_unused]] const char* builderName, RHI::ShaderCompilerProfiling& shaderCompilerProfiling, AZStd::string_view shaderPath)
{
AZStd::string folderPath;
@@ -561,12 +720,64 @@ namespace AZ
uint32_t MakeAzslBuildProductSubId(RPI::ShaderAssetSubId subId, RHI::APIType apiType)
{
- auto subIdMaxEnumerator = RPI::ShaderAssetSubId::GeneratedSource;
+ auto subIdMaxEnumerator = RPI::ShaderAssetSubId::GeneratedHlslSource;
// separate bit space between subid enum, and api-type:
int shiftLeft = static_cast(log2(static_cast(subIdMaxEnumerator))) + 1;
return static_cast(subId) + (apiType << shiftLeft);
}
+ Outcome ObtainBuildArtifactPathFromShaderAssetBuilder2(
+ const uint32_t rhiUniqueIndex, const AZStd::string& platformIdentifier, const AZStd::string& shaderJsonPath,
+ const uint32_t supervariantIndex, RPI::ShaderAssetSubId shaderAssetSubId)
+ {
+ // platform id from identifier
+ AzFramework::PlatformId platformId = AzFramework::PlatformId::PC;
+ if (platformIdentifier == "pc")
+ {
+ platformId = AzFramework::PlatformId::PC;
+ }
+ else if (platformIdentifier == "osx_gl")
+ {
+ platformId = AzFramework::PlatformId::OSX;
+ }
+ else if (platformIdentifier == "es3")
+ {
+ platformId = AzFramework::PlatformId::ES3;
+ }
+ else if (platformIdentifier == "ios")
+ {
+ platformId = AzFramework::PlatformId::IOS;
+ }
+
+ uint32_t assetSubId = RPI::ShaderAsset2::MakeProductAssetSubId(rhiUniqueIndex, supervariantIndex, aznumeric_cast(shaderAssetSubId));
+ auto assetIdOutcome = RPI::AssetUtils::MakeAssetId(shaderJsonPath, assetSubId);
+ if (!assetIdOutcome.IsSuccess())
+ {
+ return Failure(AZStd::string::format(
+ "Missing ShaderAssetBuilder2 product %s, for sub %d", shaderJsonPath.c_str(), (uint32_t)shaderAssetSubId));
+ }
+
+ Data::AssetId assetId = assetIdOutcome.TakeValue();
+ // get the relative path:
+ AZStd::string assetPath;
+ Data::AssetCatalogRequestBus::BroadcastResult(assetPath, &Data::AssetCatalogRequests::GetAssetPathById, assetId);
+
+ // get the root:
+ AZStd::string assetRoot = AzToolsFramework::PlatformAddressedAssetCatalog::GetAssetRootForPlatform(platformId);
+ // join
+ AZStd::string assetFullPath;
+ AzFramework::StringFunc::Path::Join(assetRoot.c_str(), assetPath.c_str(), assetFullPath);
+ bool fileExists = IO::FileIOBase::GetInstance()->Exists(assetFullPath.c_str()) &&
+ !IO::FileIOBase::GetInstance()->IsDirectory(assetFullPath.c_str());
+ if (!fileExists)
+ {
+ return Failure(AZStd::string::format(
+ "asset [%s] from shader source %s and subId %d doesn't exist", assetFullPath.c_str(), shaderJsonPath.c_str(),
+ (uint32_t)shaderAssetSubId));
+ }
+ return AZ::Success(assetFullPath);
+ }
+
Outcome ObtainBuildArtifactsFromAzslBuilder([[maybe_unused]] const char* builderName, const AZStd::string& sourceFullPath, RHI::APIType apiType, const AZStd::string& platform)
{
AzslSubProducts::Paths products;
@@ -619,6 +830,7 @@ namespace AZ
return AZ::Success(products);
}
+ // DEPRECATED [ATOM-15472]
// See header for info.
// REMARK: The approach to string searching and matching done in this function is kind of naive
// because the strings can match text within a comment block, etc. So it is not 100% fool proof.
@@ -672,6 +884,399 @@ namespace AZ
return SrgSkipFileResult::ContinueProcess;
}
+
+ RHI::Ptr BuildPipelineLayoutDescriptorForApi(
+ const char* builderName, const RPI::ShaderResourceGroupLayoutList& srgLayoutList, const MapOfStringToStageType& shaderEntryPoints,
+ const RHI::ShaderCompilerArguments& shaderCompilerArguments, const RootConstantData& rootConstantData,
+ RHI::ShaderPlatformInterface* shaderPlatformInterface, BindingDependencies& bindingDependencies /*inout*/)
+ {
+ PruneNonEntryFunctions(bindingDependencies, shaderEntryPoints);
+
+ // Translates from a list of function names that use a resource to a shader stage mask.
+ auto getRHIShaderStageMask = [&shaderEntryPoints](const BindingDependencies::FunctionsNameVector& functions) {
+ RHI::ShaderStageMask mask = RHI::ShaderStageMask::None;
+ // Iterate through all the functions that are using the resource.
+ for (const auto& functionName : functions)
+ {
+ // Search the function name into the list of valid entry points into the shader.
+ auto findId =
+ AZStd::find_if(shaderEntryPoints.begin(), shaderEntryPoints.end(), [&functionName, &mask](const auto& item) {
+ return item.first == functionName;
+ });
+
+ if (findId != shaderEntryPoints.end())
+ {
+ // Use the entry point shader stage type to calculate the mask.
+ RHI::ShaderHardwareStage hardwareStage = ToAssetBuilderShaderType(findId->second);
+ mask |= static_cast(AZ_BIT(static_cast(RHI::ToRHIShaderStage(hardwareStage))));
+ }
+ }
+
+ return mask;
+ };
+
+ // Build general PipelineLayoutDescriptor data that is provided for all platforms
+ RHI::Ptr pipelineLayoutDescriptor =
+ shaderPlatformInterface->CreatePipelineLayoutDescriptor();
+ RHI::ShaderPlatformInterface::ShaderResourceGroupInfoList srgInfos;
+ for (const auto& srgLayout : srgLayoutList)
+ {
+ // Search the binding info for a Shader Resource Group.
+ AZStd::string_view srgName = srgLayout->GetName().GetStringView();
+ const BindingDependencies::SrgResources* srgResources = bindingDependencies.GetSrg(srgName);
+ if (!srgResources)
+ {
+ AZ_Error(builderName, false, "SRG %s not found in the dependency dataset", srgName.data());
+ return nullptr;
+ }
+
+ RHI::ShaderResourceGroupBindingInfo srgBindingInfo;
+ srgBindingInfo.m_spaceId = srgResources->m_registerSpace;
+ const RHI::ShaderResourceGroupLayout* layout = srgLayout.get();
+ // Calculate the binding in for the constant data. All constant data share the same binding info.
+ srgBindingInfo.m_constantDataBindingInfo = {
+ getRHIShaderStageMask(srgResources->m_srgConstantsDependencies.m_binding.m_dependentFunctions),
+ srgResources->m_srgConstantsDependencies.m_binding.m_registerId};
+ // Calculate the binding info for each resource of the Shader Resource Group.
+ for (auto const& resource : srgResources->m_resources)
+ {
+ auto const& resourceInfo = resource.second;
+ srgBindingInfo.m_resourcesRegisterMap.insert(
+ {AZ::Name(resourceInfo.m_selfName),
+ RHI::ResourceBindingInfo(
+ getRHIShaderStageMask(resourceInfo.m_dependentFunctions), resourceInfo.m_registerId)});
+ }
+ pipelineLayoutDescriptor->AddShaderResourceGroupLayoutInfo(*layout, srgBindingInfo);
+ srgInfos.push_back(RHI::ShaderPlatformInterface::ShaderResourceGroupInfo{layout, srgBindingInfo});
+ }
+
+ RHI::Ptr rootConstantsLayout = RHI::ConstantsLayout::Create();
+ for (const auto& constantData : rootConstantData.m_constants)
+ {
+ RHI::ShaderInputConstantDescriptor rootConstantDesc(
+ constantData.m_nameId, constantData.m_constantByteOffset, constantData.m_constantByteSize,
+ rootConstantData.m_bindingInfo.m_registerId);
+
+ rootConstantsLayout->AddShaderInput(rootConstantDesc);
+ }
+
+
+ if (!rootConstantsLayout->Finalize())
+ {
+ AZ_Error(builderName, false, "Failed to finalize root constants layout");
+ return nullptr;
+ }
+
+ pipelineLayoutDescriptor->SetRootConstantsLayout(*rootConstantsLayout);
+
+ RHI::ShaderPlatformInterface::RootConstantsInfo rootConstantInfo;
+ rootConstantInfo.m_spaceId = rootConstantData.m_bindingInfo.m_space;
+ rootConstantInfo.m_registerId = rootConstantData.m_bindingInfo.m_registerId;
+ rootConstantInfo.m_totalSizeInBytes = rootConstantsLayout->GetDataSize();
+
+ // Build platform-specific PipelineLayoutDescriptor data, and finalize
+ if (!shaderPlatformInterface->BuildPipelineLayoutDescriptor(
+ pipelineLayoutDescriptor, srgInfos, rootConstantInfo, shaderCompilerArguments))
+ {
+ AZ_Error(builderName, false, "Failed to build pipeline layout descriptor");
+ return nullptr;
+ }
+
+ return pipelineLayoutDescriptor;
+ }
+
+ static bool IsSystemValueSemantic(const AZStd::string_view semantic)
+ {
+ // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-semantics#system-value-semantics
+ return AzFramework::StringFunc::StartsWith(semantic, "sv_", false);
+ }
+
+ static bool CreateShaderInputContract(
+ const AzslData& azslData,
+ const AZStd::string& vertexShaderName,
+ const RPI::ShaderOptionGroupLayout& shaderOptionGroupLayout,
+ const AZStd::string& pathToIaJson,
+ RPI::ShaderInputContract& contract)
+ {
+ StructData inputStruct;
+ inputStruct.m_id = "";
+
+ auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(pathToIaJson);
+ if (!jsonOutcome.IsSuccess())
+ {
+ AZ_Error(ShaderBuilderUtilityName, false, "%s", jsonOutcome.GetError().c_str());
+ return AssetBuilderSDK::ProcessJobResult_Failed;
+ }
+
+ AzslCompiler azslc(azslData.m_preprocessedFullPath);
+ if (!azslc.ParseIaPopulateStructData(jsonOutcome.GetValue(), vertexShaderName, inputStruct))
+ {
+ AZ_Error(ShaderBuilderUtilityName, false, "Failed to parse input layout\n");
+ return false;
+ }
+
+ if (inputStruct.m_id.empty())
+ {
+ AZ_Error(
+ ShaderBuilderUtilityName, false, "Failed to find the input struct for vertex shader %s.",
+ vertexShaderName.c_str());
+ return false;
+ }
+
+ for (const auto& member : inputStruct.m_members)
+ {
+ RHI::ShaderSemantic streamChannelSemantic{Name{member.m_semanticText}, static_cast(member.m_semanticIndex)};
+
+ // Semantics that represent a system-generated value do not map to an input stream
+ if (IsSystemValueSemantic(streamChannelSemantic.m_name.GetStringView()))
+ {
+ continue;
+ }
+
+ contract.m_streamChannels.push_back();
+ contract.m_streamChannels.back().m_semantic = streamChannelSemantic;
+
+ if (member.m_variable.m_typeModifier == MatrixMajor::ColumnMajor)
+ {
+ contract.m_streamChannels.back().m_componentCount = member.m_variable.m_cols;
+ }
+ else
+ {
+ contract.m_streamChannels.back().m_componentCount = member.m_variable.m_rows;
+ }
+
+ // [GFX_TODO][ATOM-14475]: Come up with a more elegant way to mark optional channels and their corresponding shader
+ // option
+ static const char OptionalInputStreamPrefix[] = "m_optional_";
+ if (AzFramework::StringFunc::StartsWith(member.m_variable.m_name, OptionalInputStreamPrefix, true))
+ {
+ AZStd::string expectedOptionName = AZStd::string::format(
+ "o_%s_isBound", member.m_variable.m_name.substr(strlen(OptionalInputStreamPrefix)).c_str());
+
+ RPI::ShaderOptionIndex shaderOptionIndex = shaderOptionGroupLayout.FindShaderOptionIndex(Name{expectedOptionName});
+ if (!shaderOptionIndex.IsValid())
+ {
+ AZ_Error(
+ ShaderBuilderUtilityName, false, "Shader option '%s' not found for optional input stream '%s'",
+ expectedOptionName.c_str(), member.m_variable.m_name.c_str());
+ return false;
+ }
+
+ const RPI::ShaderOptionDescriptor& option = shaderOptionGroupLayout.GetShaderOption(shaderOptionIndex);
+ if (option.GetType() != RPI::ShaderOptionType::Boolean)
+ {
+ AZ_Error(ShaderBuilderUtilityName, false, "Shader option '%s' must be a bool.", expectedOptionName.c_str());
+ return false;
+ }
+
+ if (option.GetDefaultValue().GetStringView() != "false")
+ {
+ AZ_Error(
+ ShaderBuilderUtilityName, false, "Shader option '%s' must default to false.",
+ expectedOptionName.c_str());
+ return false;
+ }
+
+ contract.m_streamChannels.back().m_isOptional = true;
+ contract.m_streamChannels.back().m_streamBoundIndicatorIndex = shaderOptionIndex;
+ }
+ }
+
+ return true;
+ }
+
+ static bool CreateShaderOutputContract(
+ const AzslData& azslData,
+ const AZStd::string& fragmentShaderName,
+ const AZStd::string& pathToOmJson,
+ RPI::ShaderOutputContract& contract)
+ {
+ StructData outputStruct;
+ outputStruct.m_id = "";
+
+ auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(pathToOmJson);
+ if (!jsonOutcome.IsSuccess())
+ {
+ AZ_Error(ShaderBuilderUtilityName, false, "%s", jsonOutcome.GetError().c_str());
+ return AssetBuilderSDK::ProcessJobResult_Failed;
+ }
+
+ AzslCompiler azslc(azslData.m_preprocessedFullPath);
+ if (!azslc.ParseOmPopulateStructData(jsonOutcome.GetValue(), fragmentShaderName, outputStruct))
+ {
+ AZ_Error(ShaderBuilderUtilityName, false, "Failed to parse output layout\n");
+ return false;
+ }
+
+ for (const auto& member : outputStruct.m_members)
+ {
+ RHI::ShaderSemantic semantic = RHI::ShaderSemantic::Parse(member.m_semanticText);
+
+ bool depthFound = false;
+
+ if (semantic.m_name.GetStringView() == "SV_Target")
+ {
+ contract.m_requiredColorAttachments.push_back();
+ // Render targets only support 1-D vector types and those are always column-major (per DXC)
+ contract.m_requiredColorAttachments.back().m_componentCount = member.m_variable.m_cols;
+ }
+ else if (
+ semantic.m_name.GetStringView() == "SV_Depth" || semantic.m_name.GetStringView() == "SV_DepthGreaterEqual" ||
+ semantic.m_name.GetStringView() == "SV_DepthLessEqual")
+ {
+ if (depthFound)
+ {
+ AZ_Error(
+ ShaderBuilderUtilityName, false,
+ "SV_Depth specified more than once in the fragment shader output structure");
+ return false;
+ }
+ depthFound = true;
+ }
+ else
+ {
+ AZ_Error(
+ ShaderBuilderUtilityName, false, "Unsupported shader output semantic '%s'.", semantic.m_name.GetCStr());
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ bool CreateShaderInputAndOutputContracts(
+ const AzslData& azslData,
+ const MapOfStringToStageType& shaderEntryPoints,
+ const RPI::ShaderOptionGroupLayout& shaderOptionGroupLayout,
+ const AZStd::string& pathToOmJson,
+ const AZStd::string& pathToIaJson,
+ RPI::ShaderInputContract& shaderInputContract,
+ RPI::ShaderOutputContract& shaderOutputContract,
+ size_t& colorAttachmentCount)
+ {
+ bool success = true;
+ for (const auto& shaderEntryPoint : shaderEntryPoints)
+ {
+ auto shaderEntryName = shaderEntryPoint.first;
+ auto shaderStageType = shaderEntryPoint.second;
+
+ if (shaderStageType == RPI::ShaderStageType::Vertex)
+ {
+ const bool layoutCreated = CreateShaderInputContract(azslData, shaderEntryName, shaderOptionGroupLayout, pathToIaJson, shaderInputContract);
+ if (!layoutCreated)
+ {
+ success = false;
+ AZ_Error(
+ ShaderBuilderUtilityName, false, "Could not create the input contract for the vertex function %s",
+ shaderEntryName.c_str());
+ continue; // Using continue to report all the errors found
+ }
+ }
+
+ if (shaderStageType == RPI::ShaderStageType::Fragment)
+ {
+ const bool layoutCreated =
+ CreateShaderOutputContract(azslData, shaderEntryName, pathToOmJson, shaderOutputContract);
+ if (!layoutCreated)
+ {
+ success = false;
+ AZ_Error(
+ ShaderBuilderUtilityName, false, "Could not create the output contract for the fragment function %s",
+ shaderEntryName.c_str());
+ continue; // Using continue to report all the errors found
+ }
+
+ colorAttachmentCount = shaderOutputContract.m_requiredColorAttachments.size();
+ }
+ }
+ return success;
+ }
+
+
+ //! Returns a list of acceptable default entry point names
+ static void GetAcceptableDefaultEntryPoints(
+ const AZStd::vector& azslFunctionDataList,
+ AZStd::unordered_map& defaultEntryPoints)
+ {
+ for (const auto& func : azslFunctionDataList)
+ {
+ if (!func.m_hasShaderStageVaryings)
+ {
+ // Not declaring any semantics for a shader entry is valid, but unusual.
+ // A shader entry with no semantics must be explicitly listed and won't be selected by default.
+ continue;
+ }
+
+ if (func.m_name.starts_with("VS") || func.m_name.ends_with("VS"))
+ {
+ defaultEntryPoints[func.m_name] = RPI::ShaderStageType::Vertex;
+ AZ_TracePrintf(
+ ShaderBuilderUtilityName, "Assuming \"%s\" is a valid Vertex shader entry point.\n", func.m_name.c_str());
+ }
+ else if (func.m_name.starts_with("PS") || func.m_name.ends_with("PS"))
+ {
+ defaultEntryPoints[func.m_name] = RPI::ShaderStageType::Fragment;
+ AZ_TracePrintf(
+ ShaderBuilderUtilityName, "Assuming \"%s\" is a valid Fragment shader entry point.\n",
+ func.m_name.c_str());
+ }
+ else if (func.m_name.starts_with("CS") || func.m_name.ends_with("CS"))
+ {
+ defaultEntryPoints[func.m_name] = RPI::ShaderStageType::Compute;
+ AZ_TracePrintf(
+ ShaderBuilderUtilityName, "Assuming \"%s\" is a valid Compute shader entry point.\n", func.m_name.c_str());
+ }
+ }
+ }
+
+
+ // DEPRECATED [ATOM-15472
+ //! Returns a list of acceptable default entry point names
+ //! This function
+ static void GetAcceptableDefaultEntryPoints(
+ const AzslData& azslData, AZStd::unordered_map& defaultEntryPoints)
+ {
+ return GetAcceptableDefaultEntryPoints(azslData.m_functions, defaultEntryPoints);
+ }
+
+
+ void GetDefaultEntryPointsFromFunctionDataList(
+ const AZStd::vector azslFunctionDataList,
+ AZStd::unordered_map& shaderEntryPoints)
+ {
+ AZStd::unordered_map defaultEntryPoints;
+ GetAcceptableDefaultEntryPoints(azslFunctionDataList, defaultEntryPoints);
+
+ for (const auto& functionData : azslFunctionDataList)
+ {
+ for (const auto& defaultEntryPoint : defaultEntryPoints)
+ {
+ // Equal defaults to case insensitive compares...
+ if (AzFramework::StringFunc::Equal(defaultEntryPoint.first.c_str(), functionData.m_name.c_str()))
+ {
+ shaderEntryPoints[defaultEntryPoint.first] = defaultEntryPoint.second;
+ break; // stop looping default entry points and go to the next shader function
+ }
+ }
+ }
+ }
+
+ AZStd::string GetAcceptableDefaultEntryPointNames(const AzslData& azslData)
+ {
+ AZStd::unordered_map defaultEntryPointList;
+ GetAcceptableDefaultEntryPoints(azslData, defaultEntryPointList);
+
+ AZStd::vector defaultEntryPointNamesList;
+ for (const auto& shaderEntryPoint : defaultEntryPointList)
+ {
+ defaultEntryPointNamesList.push_back(shaderEntryPoint.first);
+ }
+ AZStd::string shaderEntryPoints;
+ AzFramework::StringFunc::Join(
+ shaderEntryPoints, defaultEntryPointNamesList.begin(), defaultEntryPointNamesList.end(), ", ");
+ return AZStd::move(shaderEntryPoints);
+ }
+
} // namespace ShaderBuilderUtility
} // namespace ShaderBuilder
} // AZ
diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.h b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.h
index d6926d0086..e31c6c70a1 100644
--- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.h
+++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.h
@@ -18,8 +18,10 @@
#include
#include
+#include