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/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_1000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_1000.dds deleted file mode 100644 index 872d7b71d4..0000000000 --- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_1000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f454e6505870d9159eaac1eb0c53751e45e803cf50bf94e5c5f51ba2232cebba -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_2000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_2000.dds deleted file mode 100644 index 97ed5efe4d..0000000000 --- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_2000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1047fad9be53568fc471bdb5633445a030efaed6bf9b5e9d47abb09efb4d01e -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_3000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_3000.dds deleted file mode 100644 index 337e63a40c..0000000000 --- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_3000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11b5326877643b06a5687cf1470e388752296df64ce3abb69aa06f1933e0f3b8 -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_4000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_4000.dds deleted file mode 100644 index 2e6b3a3eda..0000000000 --- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_4000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de54072f3eca1a1de6250b1585335a1aa6fa9e07e4e7ad00cd37ea5f809a303c -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_5000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_5000.dds deleted file mode 100644 index 4a80ce04e1..0000000000 --- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_5000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac0f98198af41590052eff6550d34f05d0e3ca374bc59e7ece314be2380c210f -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_6000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_6000.dds deleted file mode 100644 index d7e0e74fca..0000000000 --- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_6000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be47d7c0a2a64b17925e51b65abba72dd22735ef7f3913e9aa389f8c31124ede -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_7000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_7000.dds deleted file mode 100644 index 391bd3ec9f..0000000000 --- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_7000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:372359625eec486abbbe7f9ab438b51627939bfbd39002d136b6d6b9c61bbe1b -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_8000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_8000.dds deleted file mode 100644 index 418a7ee3ed..0000000000 --- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_8000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91ba2bd2504a10a199964b35014df14a4405cf8fd47955a6c4ef9ca4f300637d -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_9000.dds b/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_9000.dds deleted file mode 100644 index 9c11c2fa43..0000000000 --- a/Tests/Atom/GoldenImages/Windows/amd/Baseviewer/BistroBenchmark/screenshot_bistro_9000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d8442967964bab77d02a572e6e7f8fcd158e62308b7e6340d4d56be13f7f455 -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_1000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_1000.dds deleted file mode 100644 index f9a46c53c8..0000000000 --- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_1000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5bf373730d725a14b6833b7862c6268a93d8f9d847032a60cdc99ce14fea9dfe -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_2000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_2000.dds deleted file mode 100644 index 25cce25c63..0000000000 --- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_2000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:181c31eb7fa068027d3e42c415006fd70d1fbeb0bfe373b3290aea6e3002d762 -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_3000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_3000.dds deleted file mode 100644 index a1c5d4e1b8..0000000000 --- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_3000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:efc4fbc90bfd01a1ba09ebd925b8379e67263b7156f37473dd13a91f346ed1c4 -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_4000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_4000.dds deleted file mode 100644 index 4cafe4e613..0000000000 --- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_4000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b48137886ef2a38312eedbddb111367b3f3924ab5425b49f81a92ae7d4ea898e -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_5000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_5000.dds deleted file mode 100644 index bb74f06212..0000000000 --- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_5000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea47fd8d68dab6ba54e45bfc50d84d380ec2f5b7e6915713dc9e9aa41423d4ea -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_6000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_6000.dds deleted file mode 100644 index 8bc6e3de17..0000000000 --- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_6000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9bd3fe0208cbee26cfcf00cba0a127c5938061b8bea2143d05e28fbc7f55d9ca -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_7000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_7000.dds deleted file mode 100644 index 4c286062d0..0000000000 --- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_7000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30f6aac28e74da435ad6c018b6a7e9b7cee1ad74ec5452778e56036a7d438ec9 -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_8000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_8000.dds deleted file mode 100644 index 31023d437e..0000000000 --- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_8000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2628992a8c8774ff5e77152999009ba3cbb3b68ee79d53669dd16aebe978da27 -size 5946320 diff --git a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_9000.dds b/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_9000.dds deleted file mode 100644 index a5f85d6b22..0000000000 --- a/Tests/Atom/GoldenImages/Windows/nvidia/Baseviewer/BistroBenchmark/screenshot_bistro_9000.dds +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42faae0235f0c74bc0201dd8fc805a9c01f086b093026b654e207f83ea0f3f90 -size 5946320 diff --git a/Tests/Atom/__init__.py b/Tests/Atom/__init__.py deleted file mode 100755 index 36d43bea05..0000000000 --- a/Tests/Atom/__init__.py +++ /dev/null @@ -1,9 +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. diff --git a/Tests/Atom/image_comparison_utils.py b/Tests/Atom/image_comparison_utils.py deleted file mode 100755 index 698901710a..0000000000 --- a/Tests/Atom/image_comparison_utils.py +++ /dev/null @@ -1,105 +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. - -# Utility functions for image comparison tests. -# """ -# import test_tools.shared.images.qssim as qssim -# import PythonMagick -# import logging -# import os -# import shared.s3_utils -# import platform - - -#################################### -# Commented out due to need to shift to new LyTestTools, Python3 and new screenshot workflow -# Don't merge to Mainline -#################################### - - -# def create_image_path(screenshot, path, extension, golden): - # """ - # Create image path from name, path and extension - # From a specified path, create the path for the diff image - # :param screenshot: path to the screenshot which needs to be saved - # :param path: path to where screenshot should be saved - # :param extension: extension of the diff image (.dds, .jpg) - # :param golden: True or False whether screenshot is golden image or not - # :return diff_full_path: path of the iamge to be saved - # """ - # screenshot_name = os.path.basename(screenshot) - # if golden: - # diff_name = "{}_golden{}".format(screenshot_name.split('.')[:-1][0], extension) - # else: - # diff_name = "{}{}".format(screenshot_name.split('.')[:-1][0], extension) - # diff_full_path = os.path.join(path, diff_name) - # return diff_full_path - - -# def convert_dds_to_jpg(image, path, golden): - # """ - # Convert DDS to JPEG - # :param image: DDS image to convert - # :param path: path to where iamge will be saved - # :return screenshotJPG_path: path to the newly JPEG-converted DDS image - # """ - # # Convert image as JPEG for quick review - # screenshotJPG_path = create_image_path(image, path, '.jpg', golden) - # screenshot = PythonMagick.Image(image) - # screenshot.quality(100) - # screenshot.magick('JPEG') - # screenshot.write(screenshotJPG_path) - # return screenshotJPG_path - - -# def compare_screenshot_to_golden_image(screenshot, golden_image, path, threshold=0.985): - # """ - # Compare Screenshots to Golden Images - # Function to compare a newly taken screenshot with the golden image - # :param screenshot: path of the screenshot - # :param golden_image: path of the golden image (in Perforce) - # :param path: path to where the screenshot diff image will be saved - # :param threshold: threshold for the image comparison test to fail/pass (optional) - # :return failure_not_found: True or False whether screenshots are similar (due to threshold) or not - # """ - # failure_not_found = True - # logging.info("Comparing screenshot {}".format(screenshot)) - # # Calculating screenshots similarity - # quaternion_similarity = qssim.qssim(screenshot, golden_image, diff_path = path) - # # Converting original screenshots to jpg - # convert_dds_to_jpg(screenshot, path, False) - # convert_dds_to_jpg(golden_image, path, True) - # # Checking if similarity index is bypassing the threshold - # if (quaternion_similarity < threshold): - # failure_not_found = False - # logging.error("%s failed the image comparison with %s", screenshot, golden_image) - # else: - # logging.info("Comparison successful, screenshots are similar.") - # return failure_not_found - - -# def upload_screenshots_to_s3(folder_path, folder_name): - # """ - # Uploading screenshots to certain s3 bucket - # Will require certain credentials (from the IAM that has access to l-qa@amazon acc) on the machine to work - # :param folder_path: full path to folder that needs to be uploaded to s3 - # :param folder_name: name of the folder to be uploaded to s3 - # :return: None - # """ - # host_name = platform.uname()[1] - # s3_folder_name = '_'.join([folder_name, host_name]) - - # logging.info("Trying to create a folder on S3; bucket: ly.screenshot.automation.artifacts, folder: {}".format(s3_folder_name)) - # shared.s3_utils.create_folder_in_bucket('ly.screenshot.automation.artifacts', s3_folder_name) - - # for file in os.listdir(folder_path): - # key = '{}/{}'.format(s3_folder_name, file) - # shared.s3_utils.upload_to_bucket('ly.screenshot.automation.artifacts', '{}/{}'.format(folder_path, file), key) - diff --git a/Tests/Atom/windows/__init__.py b/Tests/Atom/windows/__init__.py deleted file mode 100755 index 36d43bea05..0000000000 --- a/Tests/Atom/windows/__init__.py +++ /dev/null @@ -1,9 +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. diff --git a/Tests/Atom/windows/atomsampleviewer_tests_stability.py b/Tests/Atom/windows/atomsampleviewer_tests_stability.py deleted file mode 100755 index b480a7bc1a..0000000000 --- a/Tests/Atom/windows/atomsampleviewer_tests_stability.py +++ /dev/null @@ -1,91 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -This is a file to test basic functionality of the Base Viewer executable -""" - -import os -import pytest -import subprocess -import time -import re -from ly_test_tools.environment.process_utils import kill_processes_named as kill_processes_named - -dev_dir = os.path.abspath(os.path.join(os.path.abspath(__file__), '..', '..', '..', '..')) -bin_dir = 'Bin64vc141' - - -def gather_sample_names(): - """ - Gathers the currently eligible samples from the output of a single run of baseviewer.exe (with no sample argument). - For use in the fixture parameters. - """ - viewer_dir = os.path.join(dev_dir, bin_dir) - os.chdir(viewer_dir) - process = subprocess.Popen(['BaseViewer.exe', '-timeout', '5'], stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - out = process.communicate()[0] - log = out.splitlines() - samples = [] - for line in log: - line = str(line) - if "SampleComponentManager" in line and '-' not in line and 'Not Supported' not in line: - line_regexp = re.search('\[.*\]', line) - line = line_regexp.group(0) - sample = line.replace('[', '').replace(']', '') - samples.append(sample) - kill_processes_named('AssetProcessor', ignore_extensions=True) - if samples is not None: - return samples - - -@pytest.fixture -def kill_AP(request): - def teardown(): - kill_processes_named('AssetProcessor', ignore_extensions=True) - request.addfinalizer(teardown) - - -@pytest.mark.parametrize("samples", gather_sample_names()) -class TestBaseViewerExe(object): - - def test_OpenSampleLevel_CorrectFormat_ShouldPass(self, samples, kill_AP): - """ - Opens the specific BaseViewer samples individually and verifies they're stable for a few seconds and then exit - cleanly - """ - viewer_dir = os.path.join(dev_dir, bin_dir) - os.chdir(viewer_dir) - return_code = subprocess.check_call(['BaseViewer.exe', '-sample', samples, '-timeout', '20'], timeout=30) - assert return_code == 0, "Sample '{}' did not exit properly with code '{}'".format(samples, str(returncode)) - - def test_OpenSampleLevel_NoErrors_ShouldPass(self, samples, kill_AP): - """ - Opens the specific BaseViewer samples individually and verifies there are no errors in the output while running - """ - viewer_dir = os.path.join(dev_dir, bin_dir) - os.chdir(viewer_dir) - output = subprocess.check_output(['BaseViewer.exe', '-sample', samples, '-timeout', '20'], timeout=30) - log = output.splitlines() - errors = [] - assertions = [] - for i in range(len(log)): - line = str(log[i]) - surrounding_lines = str(log[i:i+3]) - if "Trace::Error" in line: - errors.append(surrounding_lines) - if "Trace::Assert" in line: - assertions.append(surrounding_lines) - - assert len(errors) == 0, "Sample '{}' had the following errors when run: {}".format(samples, "\n".join(errors)) - assert len(assertions) == 0, "Sample '{}' had the following assertions when run: {}".format(samples, "\n".join(assertions)) - diff --git a/Tests/Atom/windows/conftest.py b/Tests/Atom/windows/conftest.py deleted file mode 100755 index e0766a4015..0000000000 --- a/Tests/Atom/windows/conftest.py +++ /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. - -# Conftest file for providing additional configuration for Screenshot Comparison tests -# """ - - - -#################################### -# Commented out due to need to shift to new LyTestTools, Python3 and new screenshot workflow -# Don't merge to Mainline -#################################### - - -# import pytest - -# def pytest_addoption(parser): - # parser.addoption( - # '--graphics_vendor', action='store', help='graphics vendor name: nvidia or amd', required=True - # ) - # parser.addoption( - # '--upload_results_to_s3', action='store_true', default=False, help='Specify if you need to upload screenshot artifacts to s3' - # ) - -# @pytest.fixture -# def graphics_vendor(request): - # return request.config.getoption('--graphics_vendor') - -# @pytest.fixture -# def upload_results_to_s3(request): - # return request.config.getoption('--upload_results_to_s3') - diff --git a/Tests/Atom/windows/screenshot_comparison_atomsampleviewer_windows.py b/Tests/Atom/windows/screenshot_comparison_atomsampleviewer_windows.py deleted file mode 100755 index fca50c9901..0000000000 --- a/Tests/Atom/windows/screenshot_comparison_atomsampleviewer_windows.py +++ /dev/null @@ -1,143 +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. - -# BaseViewer image comparison tests on windows -# """ - -# import Atom.image_comparison_utils as image_comparison_utils -# import test_tools.builtin.fixtures as fixtures -# import subprocess -# import pytest -# import os -# import logging -# import time -# import datetime -# from test_tools import WINDOWS -# from test_tools.shared.process_utils import kill_processes_named -# from test_tools.shared.waiter import wait_for - - - - -#################################### -# Commented out due to need to shift to new LyTestTools, Python3 and new screenshot workflow -# Don't merge to Mainline -#################################### - - - - -# workspace = fixtures.use_fixture(fixtures.builtin_workspace_fixture, scope='function') -# logger = logging.getLogger(__name__) - -# @pytest.fixture(scope='session', autouse=True) -# def closing_ap(request): - # """ - # Fixture to call once per all tests to teardown AP at the end - # :param request: pytest request - # """ - # def teardown(): - # kill_processes_named('AssetProcessor_tmp', ignore_extensions=True) - # kill_processes_named('AssetProcessor', ignore_extensions=True) - # kill_processes_named('AssetProcessorBatch', ignore_extensions=True) - # kill_processes_named('AssetBuilder', ignore_extensions=True) - # kill_processes_named('rc', ignore_extensions=True) - # request.addfinalizer(teardown) - -# @pytest.fixture() -# def screenshots_setup(request, workspace, sample, graphics_vendor, upload_results_to_s3): - # """ - # Fixture for setting up workspace needed for screenshot comparison test - # :param request: pytest request - # :param workspace: pythontesttools workspace object - # :param sample: name of BaseViwer sample - # :return final_path: path to folder where output screenshots will be stored - # """ - # # Creating output folder - # tests_path = os.path.dirname(os.path.realpath(__file__)) - # dir_name = "{}_screenshot_tests_{}_{}_{}_{}".format(datetime.datetime.now().strftime("%Y-%m-%d_%H_%M_%S_%f"), sample.replace('/', ""), workspace.release.platform, workspace.release.configuration, - # graphics_vendor) - # dir_name = dir_name.replace(":", '_') - # final_path = os.path.join(tests_path, dir_name) - # os.mkdir(final_path) - - # # Teardown to clean up Cache from .dds screenshots that are produced by BaseViewer.exe - # def teardown(): - # cache = os.path.join(workspace.release.paths.dev(), "Cache", "BaseViewer", "pc", "baseviewer") - # files = os.listdir(cache) - # for file in files: - # name, file_extension = os.path.splitext(file) - # if 'screenshot' in name and file_extension == '.dds': - # screen_to_remove = os.path.join(cache, file) - # logger.info('Deleting temp screenshot file {}.'.format(screen_to_remove)) - # os.remove(screen_to_remove) - # kill_processes_named('BaseViewer', ignore_extensions=True) - # # uploading screenshots to s3 - # if upload_results_to_s3: - # image_comparison_utils.upload_screenshots_to_s3(final_path, dir_name) - # request.addfinalizer(teardown) - # return final_path - - -# # Commenting out debug due to ATOM-1677 -# @pytest.mark.parametrize("platform,configuration,project,spec,sample", [ - # pytest.param("win_x64_vs2017", "profile", "BaseViewer", "all", "RPI/BistroBenchmark", - # marks=pytest.mark.skipif(not WINDOWS, reason="Only supported on Windows hosts")), - # #pytest.param("win_x64_vs2017", "debug", "BaseViewer", "all", "RPI/BistroBenchmark", - # # marks=pytest.mark.skipif(not WINDOWS, reason="Only supported on Windows hosts")), - # ]) -# class TestBaseViewerScreenshots(object): - # def test_BistroBenchmarkSample_CompareScreenshots(self, request, workspace, sample, screenshots_setup, graphics_vendor): - # """ - # Launches BaseViewer.exe RPI/BistoBenchmark, taking screenshot and comparing on certain frames. - # """ - # base_path = workspace.release.paths.dev() - # # Generating frames list parameter - # frames_list = range(1000,10000,1000) - # frames_param = "" - # screenshot_names = [] - # for parameter in frames_list: - # frames_param += '{},'.format(parameter) - # screenshot_names.append('screenshot_bistro_{}.dds'.format(parameter)) - # frames_param = frames_param[:-1] - # # Loading BaseViewer - # self.load_baseviewer_directly(workspace, sample, frames_param, timeout=100) - - # logger.info('Comparing screenshots to golden images') - # taken_screens_path = os.path.join(base_path, "Cache", "BaseViewer", "pc", "baseviewer") - # golden_screens_path = os.path.join(base_path, "Tests", "Atom", "GoldenImages", "Windows", graphics_vendor, "Baseviewer", "BistroBenchmark") - # failed_screenshots = [] - # for screen in screenshot_names: - # taken_image = os.path.join(taken_screens_path, screen) - # golden_image = os.path.join(golden_screens_path, screen) - # if not image_comparison_utils.compare_screenshot_to_golden_image(taken_image, golden_image, screenshots_setup): - # failed_screenshots.append(screen) - # if len(failed_screenshots) > 0: - # assert False, "A failure has been found during image comparison for the following images: {}".format(failed_screenshots) - - - # def load_baseviewer_directly(self, workspace, sample, frames, timeout): - # """ - # Launch directly Baseviewer without using the launcher (since Atom is not yet integrated in Lumberyard) - # :param workspace: pythontesttools workspace object - # :param sample: name of the sample from BaseViewer - # :param frames: list of frames to take screenshots at - # :param timeout: time in seconds to wait BaseViewer to take screenshots - # """ - # base_path = workspace.release.paths.dev() - # bin_dir = workspace.release.paths.bin_dir() - # cmd_path = os.path.join(base_path, bin_dir) - # os.chdir(cmd_path) - # p = subprocess.Popen(['BaseViewer.exe', '-sample', sample, '-screenshot', frames]) - # # Wait for BaseViewer to run and take screenshot - # last_screenshot = frames.split(',')[-1] - # screenshot_file = os.path.join(base_path, "Cache", "BaseViewer", "pc", "baseviewer", "screenshot_bistro_{}.dds".format(last_screenshot)) - # wait_for(lambda: os.path.exists(screenshot_file), timeout) - diff --git a/Tests/BuildSystems/__init__.py b/Tests/BuildSystems/__init__.py deleted file mode 100755 index 6ed3dc4bda..0000000000 --- a/Tests/BuildSystems/__init__.py +++ /dev/null @@ -1,10 +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. -""" \ No newline at end of file diff --git a/Tests/BuildSystems/test_BuildBAT.py b/Tests/BuildSystems/test_BuildBAT.py deleted file mode 100755 index 1521508550..0000000000 --- a/Tests/BuildSystems/test_BuildBAT.py +++ /dev/null @@ -1,212 +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. - -BuildSystems BAT to automate building on packages for Windows -""" -import logging -import pytest -import os - -pytest.importorskip('ly_test_tools') - -import ly_test_tools.builtin.helpers as helpers -from .test_lib import build_helper - -logger = logging.getLogger(__name__) - - -@pytest.mark.BAT -@pytest.mark.parametrize('spec', ['all']) -@pytest.mark.parametrize('project', ['AutomatedTesting']) - -class TestWindowsBuildConfig(object): - """ - Automated tests for all the build configurations for Windows. - Test cases live in Repository/Build System/Lumberyard Builds/Configurations - """ - @pytest.mark.test_case_id('C15723869') - @pytest.mark.parametrize('platform', ['win_x64_vs2017']) - @pytest.mark.parametrize('configuration', ['profile']) - @pytest.mark.build - def test_build_win_x64_vs2017_profile(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15723870') - @pytest.mark.parametrize('platform', ['win_x64_vs2017']) - @pytest.mark.parametrize('configuration', ['profile_dedicated']) - @pytest.mark.build - def test_build_win_x64_vs2017_profile_dedicated(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15723871') - @pytest.mark.parametrize('platform', ['win_x64_vs2017']) - @pytest.mark.parametrize('configuration', ['profile_test']) - @pytest.mark.build - def test_build_win_x64_vs2017_profile_test(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15723872') - @pytest.mark.parametrize('platform', ['win_x64_vs2017']) - @pytest.mark.parametrize('configuration', ['profile_test_dedicated']) - @pytest.mark.build - def test_build_win_x64_vs2017_profile_test_dedicated(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15716369') - @pytest.mark.parametrize('platform', ['win_x64_vs2017']) - @pytest.mark.parametrize('configuration', ['debug']) - @pytest.mark.build - def test_build_win_x64_vs2017_debug(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15716370') - @pytest.mark.parametrize('platform', ['win_x64_vs2017']) - @pytest.mark.parametrize('configuration', ['debug_dedicated']) - @pytest.mark.build - def test_build_win_x64_vs2017_debug_dedicated(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15716371') - @pytest.mark.parametrize('platform', ['win_x64_vs2019']) - @pytest.mark.parametrize('configuration', ['debug_test']) - @pytest.mark.build - def test_build_win_x64_vs2019_debug_test(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15716372') - @pytest.mark.parametrize('platform', ['win_x64_vs2017']) - @pytest.mark.parametrize('configuration', ['debug_test_dedicated']) - @pytest.mark.build - def test_build_win_x64_vs2017_debug_test_dedicated(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15723889') - @pytest.mark.parametrize('platform', ['win_x64_vs2017']) - @pytest.mark.parametrize('configuration', ['release']) - @pytest.mark.build - def test_build_win_x64_vs2017_release(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15723890') - @pytest.mark.parametrize('platform', ['win_x64_vs2017']) - @pytest.mark.parametrize('configuration', ['release_dedicated']) - @pytest.mark.build - def test_build_win_x64_vs2017_release_dedicated(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15815180') - @pytest.mark.parametrize('platform', ['win_x64_vs2019']) - @pytest.mark.parametrize('configuration', ['profile']) - @pytest.mark.build - def test_build_win_x64_vs2019_profile(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15815181') - @pytest.mark.parametrize('platform', ['win_x64_vs2019']) - @pytest.mark.parametrize('configuration', ['profile_dedicated']) - @pytest.mark.build - def test_build_win_x64_vs2019_profile_dedicated(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15815182') - @pytest.mark.parametrize('platform', ['win_x64_vs2019']) - @pytest.mark.parametrize('configuration', ['profile_test']) - @pytest.mark.build - def test_build_win_x64_vs2019_profile_test(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15815183') - @pytest.mark.parametrize('platform', ['win_x64_vs2019']) - @pytest.mark.parametrize('configuration', ['profile_test_dedicated']) - @pytest.mark.build - def test_build_win_x64_vs2019_profile_test_dedicated(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15815174') - @pytest.mark.parametrize('platform', ['win_x64_vs2019']) - @pytest.mark.parametrize('configuration', ['debug']) - @pytest.mark.build - def test_build_win_x64_vs2019_debug(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15815175') - @pytest.mark.parametrize('platform', ['win_x64_vs2019']) - @pytest.mark.parametrize('configuration', ['debug_dedicated']) - @pytest.mark.build - def test_build_win_x64_vs2019_debug_dedicated(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15815176') - @pytest.mark.parametrize('platform', ['win_x64_vs2019']) - @pytest.mark.parametrize('configuration', ['debug_test']) - @pytest.mark.build - def test_build_win_x64_vs2019_debug_test(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15815177') - @pytest.mark.parametrize('platform', ['win_x64_vs2019']) - @pytest.mark.parametrize('configuration', ['debug_test_dedicated']) - @pytest.mark.build - def test_build_win_x64_vs2019_debug_test_dedicated(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15815190') - @pytest.mark.parametrize('platform', ['win_x64_vs2019']) - @pytest.mark.parametrize('configuration', ['release']) - @pytest.mark.build - def test_build_win_x64_vs2019_release(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) - - @pytest.mark.test_case_id('C15815191') - @pytest.mark.parametrize('platform', ['win_x64_vs2019']) - @pytest.mark.parametrize('configuration', ['release_dedicated']) - @pytest.mark.build - def test_build_win_x64_vs2019_release_dedicated(self, workspace, platform, configuration, project, spec): - workspace.build() - build_log = os.path.join(workspace.artifact_manager.dest_path, 'waf_build.log') - assert build_helper.verify_build_log(build_log, platform, configuration) \ No newline at end of file diff --git a/Tests/BuildSystems/test_lib/__init__.py b/Tests/BuildSystems/test_lib/__init__.py deleted file mode 100755 index 6ed3dc4bda..0000000000 --- a/Tests/BuildSystems/test_lib/__init__.py +++ /dev/null @@ -1,10 +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. -""" \ No newline at end of file diff --git a/Tests/BuildSystems/test_lib/build_helper.py b/Tests/BuildSystems/test_lib/build_helper.py deleted file mode 100755 index c2213d139b..0000000000 --- a/Tests/BuildSystems/test_lib/build_helper.py +++ /dev/null @@ -1,38 +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. - -Helper functions for build systems -""" -import os -import logging - -logger = logging.getLogger(__name__) - - -def verify_build_log(build_log_path, platform, configuration): - """ - This will search the log file for an expected success message for a specific platform configuration. - :param build_log_path: the full path to the log file. e.g. \\dev\TestResults\timestamp_folder\pytest_results\... - :param platform: the compiler to use, e.g. "win_x64_vs2017" - :param configuration: the flavor of the build, e.g. "profile" - :return: True, if success message is found within the build log. False, if success message is not found and raise an assertion error if the build log cannot be found. - """ - success_message = "[WAF] 'build_{0}_{1}' finished successfully".format(platform, configuration) - if os.path.exists(build_log_path): - with open(build_log_path) as build_file: - for line in build_file: - if success_message in line: - logger.info('Success message was found for {0}_{1}'.format(platform, configuration)) - return True - logger.info('Success message not found for {0}_{1}'.format(platform, configuration)) - return False - else: - logger.info('We cannot find the build log and this is the path we are looking for {0}'.format(build_log_path)) - raise AssertionError diff --git a/Tests/README.txt b/Tests/README.txt deleted file mode 100644 index 71598c7890..0000000000 --- a/Tests/README.txt +++ /dev/null @@ -1 +0,0 @@ -This folder contains integration tests which do not ship with Lumberyard. Tests that ship with the product can be found in folders adjacent to the code that they test. \ No newline at end of file diff --git a/Tests/__init__.py b/Tests/__init__.py deleted file mode 100755 index 6ed3dc4bda..0000000000 --- a/Tests/__init__.py +++ /dev/null @@ -1,10 +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. -""" \ No newline at end of file diff --git a/Tests/ai/EditorScripts/LY_114727_NavigationComponent_MovementMethods.py b/Tests/ai/EditorScripts/LY_114727_NavigationComponent_MovementMethods.py deleted file mode 100755 index 75a13b8e17..0000000000 --- a/Tests/ai/EditorScripts/LY_114727_NavigationComponent_MovementMethods.py +++ /dev/null @@ -1,46 +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. -# -''' -This script tests movement methods Transform, Physics and Custom -''' -import sys, os -import time -import azlmbr.legacy.general as general - -from tests_common import TestHelper - -class TestMovementMethods(TestHelper): - def __init__(self): - TestHelper.__init__(self, log_prefix = 'LY-114727', args=['level']) - - def run_test(self): - # Start by assuming we'll crash and fail - self.test_success = False - # Open the level non-interactively - level_opened = self.open_level(self.get_arg('level')) - if not level_opened: - return - - # Enter game mode, so that physics in the test level starts running. - general.enter_game_mode() - # Wait for game mode to start. (Not sure if this is necessary, just being extra-cautious) - while (general.is_in_game_mode() != True): - general.idle_wait(1.0) - # Wait for game mode to finish. Entities should be navigating - while (general.is_in_game_mode() == True): - general.idle_wait(2.0) - - # We finished and haven't crashed, so assume success and exit the Editor. - self.test_success = True - -test = TestMovementMethods() -test.run() - diff --git a/Tests/ai/EditorScripts/tests_common.py b/Tests/ai/EditorScripts/tests_common.py deleted file mode 100755 index 76ad183c60..0000000000 --- a/Tests/ai/EditorScripts/tests_common.py +++ /dev/null @@ -1,163 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -import sys, os -import azlmbr.legacy.general as general -import azlmbr.legacy.settings as settings - -class TestHelper: - def __init__(self, log_prefix, args = None): - self.log_prefix = log_prefix + ': ' - self.test_success = True - self.args = {} - if args: - # Get the level name and heightmap name from command-line args - if (len(sys.argv) == (len(args) + 1)): - for arg_index in range(len(args)): - self.args[args[arg_index]] = sys.argv[arg_index + 1] - else: - test_success = False - self.log('Expected command-line args: {}'.format(args)) - - - # Test Setup - # Set helpers - # Set viewport size - # Turn off display mode, antialiasing - # set log prefix, log test started - # TODO: Turn off user dialogs like Amazon login, surveys, etc... - def setup(self): - self.log('test started') - - def after_level_load(self): - # Enable the Editor to start running its idle loop. - # This is needed for Python scripts passed into the Editor startup. Since they're executed - # during the startup flow, they run before idle processing starts. Without this, the engine loop - # won't run during idle_wait, which will prevent our test level from working. - general.idle_enable(True) - - # Give everything a second to initialize - general.idle_wait(1.0) - - self.original_settings = settings.get_misc_editor_settings() - self.helpers_visible = general.is_helpers_shown() - self.viewport_size = general.get_viewport_size() - # Turn off the helper gizmos if visible - if (self.helpers_visible): - general.toggle_helpers() - general.idle_wait(1.0) - - # Set Editor viewport to a well-defined size - general.set_viewport_size(1280, 720) - general.idle_wait(1.0) - - # 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) - - - - # Test Teardown - # Restore everything from above - # log test results, exit editor - def teardown(self): - # Restore the original Editor settings - settings.set_misc_editor_settings(self.original_settings) - # If the helper gizmos were on at the start, restore them - if (self.helpers_visible): - general.toggle_helpers() - # Set the viewport back to whatever size it was at the start - general.set_viewport_size(self.viewport_size.x, self.viewport_size.y) - general.idle_wait(1.0) - - self.log('test finished') - - if self.test_success == True: - self.log('result=SUCCESS') - general.set_result_to_success() - else: - self.log('result=FAILURE') - general.set_result_to_failure() - - general.exit_no_prompt() - - def run_test(self): - self.log('run') - - def run(self): - self.setup() - - # Only run the actual test if we didn't have setup issues - if self.test_success: - self.run_test() - - self.teardown() - - def get_arg(self, arg_name): - if arg_name in self.args: - return self.args[arg_name] - return '' - - - # general logger that adds prefix? - def log(self, log_line): - general.log(self.log_prefix + log_line) - - # isclose: Compares two floating-point values for "nearly-equal" - # From https://www.python.org/dev/peps/pep-0485/#proposed-implementation : - def isclose(self, a, b, rel_tol=1e-9, abs_tol=0.0): - return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol) - - - # Create a new empty level - def create_level(self, level_name, heightmap_resolution, heightmap_meters_per_pixel, terrain_texture_resolution, use_terrain): - self.log('Creating level {}'.format(level_name)) - result = general.create_level_no_prompt(level_name, heightmap_resolution, heightmap_meters_per_pixel, terrain_texture_resolution, use_terrain) - - # Result codes are ECreateLevelResult defined in CryEdit.h - if (result == 1): - self.log('Temp level already exists') - elif (result == 2): - self.log('Failed to create directory') - elif (result == 3): - self.log('Directory length is too long') - elif (result != 0): - self.log('Unknown error, failed to create level') - else: - self.log('Level created successfully') - self.after_level_load() - - return (result == 0) - - def open_level(self, level_name): - # Open the level non-interactively - self.log('Opening level {}'.format(level_name)) - result = general.open_level_no_prompt(level_name) - self.after_level_load() - if result: - self.log('Level opened successfully') - else: - self.log('Unknown error, level failed to open') - - return result - - # Take Screenshot - def take_screenshot(self, posX, posY, posZ, rotX, rotY, rotZ): - # Set our camera position / rotation and wait for the Editor to acknowledge it - general.set_current_view_position(posX, posY, posZ) - general.set_current_view_rotation(rotX, rotY, rotZ) - general.idle_wait(1.0) - # Request a screenshot and wait for the Editor to process it - general.run_console("r_GetScreenShot=2") - general.idle_wait(1.0) - diff --git a/Tests/ai/LY_114727_NavigationComponent_test.py b/Tests/ai/LY_114727_NavigationComponent_test.py deleted file mode 100755 index 3eff39c787..0000000000 --- a/Tests/ai/LY_114727_NavigationComponent_test.py +++ /dev/null @@ -1,70 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - - -""" -ly102242: Runs the ly-102242 level in the Editor which reproduces the appropriate steps for -bug ly-102242 to crash when spawning an invalid touchbending asset. The touchbending asset -can be made invalid by including multiple meshes - one with skinning data and one without. -NOTE: In the bugfixed case, a crash will not occur, but touchbending will not occur and errors -will be printed to the console every time a new asset gets "touched" (spawned in the physics system). -""" -import pytest -pytest.importorskip('ly_test_tools') -import logging -import os - -from ..ly_shared import hydra_lytt_test_utils as hydra_utils - -logger = logging.getLogger(__name__) -test_directory = os.path.join(os.path.dirname(__file__), 'EditorScripts') -editor_timeout = 30 - -@pytest.mark.parametrize('platform', ['win_x64_vs2017']) -@pytest.mark.parametrize('configuration', ['profile']) -@pytest.mark.parametrize('project', ['AutomatedTesting']) -@pytest.mark.parametrize('spec', ['all']) -@pytest.mark.parametrize('level', ['AI/NavigationComponentTest']) -class TestNavigationComponent(object): - @pytest.fixture(autouse=True) - def setup_teardown(self, request): - def teardown(): - if hasattr(self, 'cfg_file_name'): - hydra_utils.cleanup_cfg_file(self.cfg_file_name) - - # Setup - add the teardown finalizer - request.addfinalizer(teardown) - - # entities with Transform, Physics and Custom movement methods navigate to the goal - def test_NavigationComponent(self, request, legacy_editor, level): - - cfg_args = [level] - - expected_lines = [ - "OnActivate NavigationAgentCustom", - "OnActivate NavigationAgentPhysics", - "OnActivate NavigationAgentTransform", - - "OnTraversalComplete NavigationAgentCustom", - "OnTraversalComplete NavigationAgentPhysics", - "OnTraversalComplete NavigationAgentTransform", - ] - - unexpected_lines = [ - "OnTraversalCanceled NavigationAgentCustom", - "OnTraversalCanceled NavigationAgentPhysics", - "OnTraversalCanceled NavigationAgentTransform", - ] - - hydra_utils.launch_and_validate_results(request, test_directory, legacy_editor, - 'LY_114727_NavigationComponent_MovementMethods.py', - expected_lines, unexpected_lines, timeout=editor_timeout, cfg_args=cfg_args) - diff --git a/Tests/ai/__init__.py b/Tests/ai/__init__.py deleted file mode 100755 index e912252f4e..0000000000 --- a/Tests/ai/__init__.py +++ /dev/null @@ -1,12 +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. -""" - diff --git a/Tests/demos/__init__.py b/Tests/demos/__init__.py deleted file mode 100755 index e912252f4e..0000000000 --- a/Tests/demos/__init__.py +++ /dev/null @@ -1,12 +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. -""" - diff --git a/Tests/demos/launcher_loading_tests.py b/Tests/demos/launcher_loading_tests.py deleted file mode 100755 index 6d23f56f1b..0000000000 --- a/Tests/demos/launcher_loading_tests.py +++ /dev/null @@ -1,183 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -""" -import pytest -import ly_test_tools - -import os -import shutil -import subprocess -from ly_test_tools.builtin.helpers import * -import tempfile -import time -# The following imports are used to detect capabilities in the current system - -from ly_test_tools.environment.process_utils import * -import Tests.shared.asset_processor_utils as aputil - -# Built-in fixture: provides a ready to use workspace. -from Tests.shared import substring -from ly_test_tools.environment.waiter import wait_for - -LAUNCHER_TIMEOUT = 120 - - -@pytest.mark.system -class TestProjectLauncher: - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, launcher): - path_to_cache = workspace.paths.asset_cache() - # Remove previous artifacts from cache - if os.path.isdir(os.path.join(path_to_cache, "user")): - shutil.rmtree(os.path.join(path_to_cache, "user")) - - user_cfg_path = os.path.join(workspace.paths.dev(), "user.cfg") - cfg_staging_path = None - - # Backup user.cfg if one exists - if os.path.exists(user_cfg_path): - cfg_staging_path = os.path.join(tempfile.gettempdir(), "user.cfg") - shutil.move(user_cfg_path, cfg_staging_path) - - # Configure the headless client - with open(user_cfg_path, "w") as user_cfg: - user_cfg.write("r_driver=NULL\n") - user_cfg.write("sys_audio_disable=1\n") - user_cfg.write("sys_skip_input=1\n") - - def teardown(): - launcher.kill() - - aputil.kill_asset_processor() - - # Restore previous user.cfg if one existed and unconfigure the headless client - if cfg_staging_path: - shutil.move(os.path.join(tempfile.gettempdir(), "user.cfg"), user_cfg_path) - elif os.path.exists(user_cfg_path): - os.remove(user_cfg_path) - - # save logs,screenshots - if os.path.exists(workspace.paths.project_log()): - workspace.artifact_manager.save_artifact(workspace.paths.project_log()) - if os.path.isdir(workspace.paths.project_screenshots()): - workspace.artifact_manager.save_artifact(workspace.paths.project_screenshots()) - - request.addfinalizer(teardown) - - @pytest.mark.parametrize('level', ['Samples/Fur_Technical_Sample', 'Samples/Advanced_RinLocomotion', 'UI/UiFeatures','Samples/Simple_JackLocomotion', - 'Samples/ScriptedEntityTweenerSample/SampleFullscreenAnimation', 'UI/UiMainMenuLuaSample', 'Samples/Metastream_Sample', - 'Samples/ScriptCanvas_Sample/ScriptCanvas_Basic_Sample', 'UI/UiIn3DWorld', 'Samples/Audio_Sample']) - @pytest.mark.test_case_id('C1698289,C1698287,C1698294,C1698280,C1698295,C1698293,C1698289,C1698290,C1698292,C1698288') - @pytest.mark.parametrize('platform', ['win_x64_vs2017', 'win_x64_vs2019']) - @pytest.mark.parametrize('configuration', ['profile']) - @pytest.mark.parametrize('project', ['SamplesProject']) - @pytest.mark.parametrize('spec', ['all']) - def test_LaunchAndWait_LoadsLevelAndQuit_NoCrash(self, workspace, level, launcher): - """ - Launch the Project Launcher and sets the specified level. - Performs the console steps by passing in args. - Loads the specified level and quit's the launcher. - """ - # Fast fail if the level doesn't exist - assert os.path.exists(os.path.join(workspace.paths.project(), "Levels", level)) and os.path.isdir( - os.path.join(workspace.paths.project(), "Levels", level)), "Level Doesn't Exist" - - launcher.args = ["+map", level] - launcher.launch() - - pattern_string = "Loading level " + level - test = os.path.join(workspace.paths.project_log(), "Game.log") - wait_for(lambda: os.path.exists(os.path.join(workspace.paths.project_log(), "Game.log"))) - wait_for(lambda: substring.in_file( - os.path.join(workspace.paths.project_log(), "Game.log"), pattern_string), LAUNCHER_TIMEOUT) - assert not os.path.exists( - os.path.join(workspace.paths.project_log(), "error.log")), "Launcher Crashed Unexpectedly" - - # This is a convenient place to also verify LY-90255 for free here - # (as well as any other text that must appear in the log). - # writing a separate test to launch the launcher and examine the log would just waste time as the - # above test already launches the launcher, and waits for it to finish anyway. - - assert substring.in_file(os.path.join(workspace.paths.project_log(), "Game.log"), "Initializing CryFont done, MemUsage") - - - - @pytest.mark.parametrize('level',['UI/UiFeatures','Samples/Metastream_Sample']) - @pytest.mark.parametrize('platform', ['win_x64_vs2017', 'win_x64_vs2019']) - @pytest.mark.parametrize('configuration', ['profile']) - @pytest.mark.parametrize('project', ['SamplesProject']) - @pytest.mark.parametrize('spec', ['all']) - def test_LaunchAndWait_LoadsLevelFromPakAndQuit_NoCrash(self, workspace, level, launcher): - """ - This test ensure that the Launcher can load levels from inside paks - """ - - if workspace.platform == 'win_x64_vs2017': - binDirPath = os.path.join(workspace.paths._dev_path, 'Bin64vc141') - if workspace.platform == 'win_x64_vs2019': - binDirPath = os.path.join(workspace.paths._dev_path, 'Bin64vc142') - - # Launch APBatch so that it can process all assets and quit - subprocess.check_call( - [os.path.join(binDirPath, 'AssetProcessorBatch'), "/gamefolder=SamplesProject"]) - - lowercaseProjectName = workspace.project.lower() - cacheLevelDir = os.path.join(workspace.paths.platform_cache(), lowercaseProjectName, "levels") - cacheTempLevelDir = os.path.join(workspace.paths.platform_cache(), lowercaseProjectName, "templevels") - - # Rename levels dir so that runtime cannot load levels from it - os.rename(cacheLevelDir, cacheTempLevelDir) - # Make an empty levels folder - os.mkdir(cacheLevelDir) - - # make an archive of all the levels - outputLevelsArchive = os.path.join(cacheLevelDir, "templevels") - shutil.make_archive(outputLevelsArchive, 'zip', cacheTempLevelDir) - # make archive will make a zip file - outputLevelsArchive = outputLevelsArchive + ".zip" - - # change extension from zip to pak - baseFileName = os.path.splitext(outputLevelsArchive)[0] - os.rename(outputLevelsArchive, baseFileName + ".pak") - - # Launching AP again for SamplesProject gameproject - subprocess.Popen([os.path.join(binDirPath, 'AssetProcessor'), "/gamefolder=SamplesProject", "--zeroAnalysisMode"]) - - # Waiting to give AP time some time to start the listening thread otherwise the launcher will try to launch another instance of AP - time.sleep(1) - - # ensure that in the cache level does not exist on disk - assert not os.path.exists(os.path.join(cacheLevelDir, level)) - - # load the levels - launcher.args = ["+map", level] - launcher.launch() - - pattern_string = "Loading level " + level - wait_for(lambda: os.path.exists(os.path.join(workspace.paths.project_log(), "Game.log"))) - wait_for(lambda: substring.in_file( - os.path.join(workspace.paths.project_log(), "Game.log"), pattern_string), LAUNCHER_TIMEOUT) - assert not os.path.exists( - os.path.join(workspace.paths.project_log(), "error.log")), "Launcher Crashed Unexpectedly" - - loaded_level_pattern = "Level " + level + " loaded" - wait_for(lambda: substring.in_file( - os.path.join(workspace.paths.project_log(), "Game.log"), loaded_level_pattern), LAUNCHER_TIMEOUT) - - launcher.stop() - - aputil.kill_asset_processor() - - shutil.rmtree(cacheLevelDir) - os.rename(cacheTempLevelDir, cacheLevelDir) - - - diff --git a/Tests/demos/mac/__init__.py b/Tests/demos/mac/__init__.py deleted file mode 100755 index e912252f4e..0000000000 --- a/Tests/demos/mac/__init__.py +++ /dev/null @@ -1,12 +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. -""" - diff --git a/Tests/demos/mac/demos_mac.py b/Tests/demos/mac/demos_mac.py deleted file mode 100755 index a2a44eab20..0000000000 --- a/Tests/demos/mac/demos_mac.py +++ /dev/null @@ -1,142 +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. - -These tests will validate that StarterGame and SamplesProject can be setup and built, have no failing assets processed, -and will then have a screen shot taken to verify that it renders normally. All the logs and screenshots will be -transferred to the test results to be zipped up and added to the Flume result. These projects will be run in profile -and debug. -""" -import logging -import os -import pytest - -from demos.test_lib.demos_testlib import load_level, remote_console_take_screenshot, start_launcher, start_remote_console -import shared.shader_compile_server_utils as compile_server -import test_tools.shared.file_utils as file_utils -from test_tools.shared.launcher_testlib import configure_setup, assert_build_success, assert_process_assets - -import test_tools.builtin.fixtures as fixtures -from test_tools import MAC_LAUNCHER -import test_tools.launchers.phase -from test_tools.shared.remote_console_commands import RemoteConsole - -logger = logging.getLogger(__name__) - -workspace = fixtures.use_fixture(fixtures.builtin_workspace_fixture, scope='function') - - -@pytest.fixture -def launcher_instance(request, workspace, level): - """ - Creates a launcher fixture instance with an extra teardown for error log grabbing. - """ - def teardown(): - """ - Tries to grab any error logs before moving on to the next test. - """ - compile_server.stop_shader_compile_server() - - if os.path.exists(launcher.workspace.release.paths.project_log()): - for file_name in os.listdir(launcher.workspace.release.paths.project_log()): - file_utils.move_file(launcher.workspace.release.paths.project_log(), - launcher.workspace.artifact_manager.get_save_artifact_path(), - file_name) - - logs_exist = lambda: file_utils.gather_error_logs( - launcher.workspace.release.paths.dev(), - launcher.workspace.artifact_manager.get_save_artifact_path()) - try: - test_tools.shared.waiter.wait_for(logs_exist) - except AssertionError: - print("No error logs found. Completing test...") - - request.addfinalizer(teardown) - - launcher = fixtures.launcher(request, workspace, level) - return launcher - - -@pytest.fixture -def remote_console_instance(request): - """ - Creates a remote console instance to send console commands. - """ - console = RemoteConsole() - - def teardown(): - try: - console.stop() - except: - pass - - request.addfinalizer(teardown) - - return console - - -@pytest.mark.parametrize("platform,configuration,project,spec,level", [ - pytest.param("darwin_x64", "profile", "StarterGame", "all", "StarterGame", - marks=pytest.mark.skipif(not MAC_LAUNCHER, reason="Only supported on Mac hosts")), - pytest.param("darwin_x64", "debug", "StarterGame", "all", "StarterGame", - marks=pytest.mark.skipif(not MAC_LAUNCHER, reason="Only supported on Mac hosts")), - ]) -class TestSingleLevel(object): - def test_single_level(self, launcher_instance, configuration, level, remote_console_instance): - """ - Verifies projects with a given demo-level can compile and successfully launch. - """ - configure_setup(launcher_instance) - - assert_build_success(launcher_instance) - assert_process_assets(launcher_instance) - - compile_server.start_mac_shader_compile_server(os.path.join(launcher_instance.workspace.release.paths.dev(), - "Tools"), configuration) - start_launcher(launcher_instance) - start_remote_console(launcher_instance, remote_console_instance) - - load_level(launcher_instance, remote_console_instance, level) - remote_console_take_screenshot(launcher_instance, remote_console_instance, level) - - -@pytest.mark.parametrize("platform,configuration,project,spec,level,levels", [ - pytest.param("darwin_x64", "profile", "SamplesProject", "all", "Advanced_RinLocomotion", - ["Advanced_RinLocomotion", "Audio_Sample", "Fur_Technical_Sample", - "Gems_InAppPurchases_Sample", "Metastream_Sample", "ScriptCanvas_Basic_Sample", - "Simple_JackLocomotion", "SampleFullscreenAnimation", "UiFeatures", "UiIn3DWorld", - "UiMainMenuLuaSample", "UiMainMenuScriptCanvasSample"], - marks=pytest.mark.skipif(not MAC_LAUNCHER, reason="Only supported on Mac hosts")), - pytest.param("darwin_x64", "debug", "SamplesProject", "all", "Advanced_RinLocomotion", - ["Advanced_RinLocomotion", "Audio_Sample", "Fur_Technical_Sample", - "Gems_InAppPurchases_Sample", "Metastream_Sample", "ScriptCanvas_Basic_Sample", - "Simple_JackLocomotion", "SampleFullscreenAnimation", "UiFeatures", "UiIn3DWorld", - "UiMainMenuLuaSample", "UiMainMenuScriptCanvasSample"], - marks=pytest.mark.skipif(not MAC_LAUNCHER, reason="Only supported on Mac hosts")), - ]) -# Testing for projects with multiple demo levels -class TestMultipleLevels(object): - """ - Verifies projects with multiple demo-levels can compile and successfully launch. - """ - def test_multiple_levels(self, launcher_instance, configuration, levels, remote_console_instance): - configure_setup(launcher_instance) - - assert_build_success(launcher_instance) - assert_process_assets(launcher_instance) - - compile_server.start_mac_shader_compile_server(os.path.join(launcher_instance.workspace.release.paths.dev(), - "Tools"), configuration) - start_launcher(launcher_instance) - start_remote_console(launcher_instance, remote_console_instance) - - # Switch to each level, check if it loads and takes a screen shot, then move to test folder for Flume - for level in levels: - load_level(launcher_instance, remote_console_instance, level) - remote_console_take_screenshot(launcher_instance, remote_console_instance, level) diff --git a/Tests/demos/test_lib/__init__.py b/Tests/demos/test_lib/__init__.py deleted file mode 100755 index e912252f4e..0000000000 --- a/Tests/demos/test_lib/__init__.py +++ /dev/null @@ -1,12 +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. -""" - diff --git a/Tests/demos/test_lib/demos_testlib.py b/Tests/demos/test_lib/demos_testlib.py deleted file mode 100755 index 46ed627cab..0000000000 --- a/Tests/demos/test_lib/demos_testlib.py +++ /dev/null @@ -1,70 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -This demos_testlib file is used for a collection of reusable functionality that QA will use in their scripts specific -to the setup of demo level tests. -""" -import sys - -import shared.network_utils as network_utils -from shared.screenshot_utils import move_screenshots, take_screenshot_with_retries - -from test_tools.shared.launcher_testlib import * - -import test_tools.shared.waiter - - -def start_launcher(launcher): - """ - For PC: Used to start launcher and give time to load. - """ - launcher.launch() - launcher.run(test_tools.launchers.phase.TimePhase(120, 120)) - - -def load_level(launcher, remote_console, level): - """ - Uses the remote console to use the map command to load a level and checks the console output for a successful load. - """ - command = 'map {}'.format(level) - load = remote_console.expect_log_line('LEVEL_LOAD_COMPLETE', 300) - retry_console_command(remote_console, command, "Executing console command '{}'".format(command)) - assert load(), "{} level failed to load.".format(level) - - # Allow one minute to let level fully render and to test for stability - launcher.run(test_tools.launchers.phase.TimePhase(60, 60)) - - -def start_remote_console(launcher, remote_console, on_devkit=False): - """ - Starts the remote console. Used in QA scripts that require the use of remote console. - """ - if on_devkit: - test_tools.shared.waiter.wait_for(lambda: network_utils.check_for_remote_listening_port(4600, launcher.ip), - timeout=600, exc=AssertionError('Port 4600 not listening.')) - else: - test_tools.shared.waiter.wait_for(lambda: network_utils.check_for_listening_port(4600), timeout=300, - exc=AssertionError('Port 4600 not listening.')) - - remote_console.start() - - # Allows remote console time to connect to launcher. - launcher.run(test_tools.launchers.phase.TimePhase(60, 60)) - - -def remote_console_take_screenshot(launcher, remote_console, level): - """ - Uses the remote console to run the r_GetScreenshot command to take a screenshot of the current launcher and move - the screenshot to the test results location. - """ - screenshot_path = os.path.join(launcher.workspace.release.paths.platform_cache(), "user", "screenshots") - take_screenshot_with_retries(remote_console, launcher, level) - if os.path.exists(screenshot_path): - move_screenshots(screenshot_path, '.jpg', launcher.workspace.artifact_manager.get_save_artifact_path()) diff --git a/Tests/demos/win/__init__.py b/Tests/demos/win/__init__.py deleted file mode 100755 index 4d5680a30d..0000000000 --- a/Tests/demos/win/__init__.py +++ /dev/null @@ -1,10 +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. -# diff --git a/Tests/demos/win/demos_pc.py b/Tests/demos/win/demos_pc.py deleted file mode 100755 index cb8b9a0e4b..0000000000 --- a/Tests/demos/win/demos_pc.py +++ /dev/null @@ -1,151 +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. - -These tests will validate that each project can be setup and built, have no failing assets processed, and will then -have a screenshot taken to verify that it renders normally. All the logs and screenshots will be transferred to the -test results to be zipped up and added to the Flume result. These projects will be run in profile and debug. -Currently SearchForEden and Bistro are failing and are temporarily commented out of these tests. -""" -import logging -import os -import pytest - -from demos.test_lib.demos_testlib import load_level, remote_console_take_screenshot, start_launcher, start_remote_console -from test_tools.shared.file_utils import gather_error_logs, move_file -from test_tools.shared.launcher_testlib import configure_setup, assert_build_success, assert_process_assets - -from test_tools import WINDOWS_LAUNCHER -import test_tools.builtin.fixtures as fixtures -import test_tools.launchers.phase -from test_tools.shared.remote_console_commands import RemoteConsole - -logger = logging.getLogger(__name__) - -# use_fixture registers the imported fixture in pytest at the specified scope. The test should provide all the -# parameters in the fixture's signature -workspace = fixtures.use_fixture(fixtures.builtin_workspace_fixture, scope='function') - - -@pytest.fixture -def launcher_instance(request, workspace, level): - """ - Creates a launcher fixture instance with an extra teardown for error log grabbing. - """ - def teardown(): - """ - Tries to grab any error logs before moving on to the next test. - """ - if os.path.exists(launcher.workspace.release.paths.project_log()): - for file_name in os.listdir(launcher.workspace.release.paths.project_log()): - move_file(launcher.workspace.release.paths.project_log(), - launcher.workspace.artifact_manager.get_save_artifact_path(), - file_name) - - logs_exist = lambda: gather_error_logs( - launcher.workspace.release.paths.dev(), - launcher.workspace.artifact_manager.get_save_artifact_path()) - try: - test_tools.shared.waiter.wait_for(logs_exist) - except AssertionError: - print("No error logs found. Completing test...") - - request.addfinalizer(teardown) - - launcher = fixtures.launcher(request, workspace, level) - return launcher - - -@pytest.fixture -def remote_console_instance(request): - """ - Creates a remote console instance to send console commands. - """ - console = RemoteConsole() - - def teardown(): - try: - console.stop() - except: - pass - - request.addfinalizer(teardown) - - return console - - -@pytest.mark.parametrize("platform,configuration,project,spec,level", [ - pytest.param("win_x64_vs2017", "profile", "StarterGame", "all", "StarterGame", - marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")), - pytest.param("win_x64_vs2019", "profile", "StarterGame", "all", "StarterGame", - marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")), - pytest.param("win_x64_vs2017", "debug", "StarterGame", "all", "StarterGame", - marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")), - pytest.param("win_x64_vs2019", "debug", "StarterGame", "all", "StarterGame", - marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")), - ]) -class TestSingleLevel(object): - def test_single_level(self, launcher_instance, level, remote_console_instance): - """ - Verifies projects with a given demo-level can compile and successfully launch. - """ - configure_setup(launcher_instance) - - assert_build_success(launcher_instance) - assert_process_assets(launcher_instance) - - start_launcher(launcher_instance) - start_remote_console(launcher_instance, remote_console_instance) - - load_level(launcher_instance, remote_console_instance, level) - remote_console_take_screenshot(launcher_instance, remote_console_instance, level) - - -@pytest.mark.parametrize("platform,configuration,project,spec,level,levels", [ - pytest.param("win_x64_vs2017", "profile", "SamplesProject", "all", "Advanced_RinLocomotion", - ["Advanced_RinLocomotion", "Audio_Sample", "Fur_Technical_Sample", "Gems_InAppPurchases_Sample", - "Metastream_Sample", "ScriptCanvas_Basic_Sample", "Simple_JackLocomotion", - "SampleFullscreenAnimation", "UiDrawCallsSample", "UiFeatures", "UiIn3DWorld", "UiMainMenuLuaSample", - "UiMainMenuScriptCanvasSample", "UiTextureAtlasSample"], - marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")), - pytest.param("win_x64_vs2019", "profile", "SamplesProject", "all", "Advanced_RinLocomotion", - ["Advanced_RinLocomotion", "Audio_Sample", "Fur_Technical_Sample", "Gems_InAppPurchases_Sample", - "Metastream_Sample", "ScriptCanvas_Basic_Sample", "Simple_JackLocomotion", - "SampleFullscreenAnimation", "UiDrawCallsSample", "UiFeatures", "UiIn3DWorld", "UiMainMenuLuaSample", - "UiMainMenuScriptCanvasSample", "UiTextureAtlasSample"], - marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")), - pytest.param("win_x64_vs2017", "debug", "SamplesProject", "all", "Advanced_RinLocomotion", - ["Advanced_RinLocomotion", "Audio_Sample", "Fur_Technical_Sample", "Gems_InAppPurchases_Sample", - "Metastream_Sample", "ScriptCanvas_Basic_Sample", "Simple_JackLocomotion", - "SampleFullscreenAnimation", "UiDrawCallsSample", "UiFeatures", "UiIn3DWorld", "UiMainMenuLuaSample", - "UiMainMenuScriptCanvasSample", "UiTextureAtlasSample"], - marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")), - pytest.param("win_x64_vs2019", "debug", "SamplesProject", "all", "Advanced_RinLocomotion", - ["Advanced_RinLocomotion", "Audio_Sample", "Fur_Technical_Sample", "Gems_InAppPurchases_Sample", - "Metastream_Sample", "ScriptCanvas_Basic_Sample", "Simple_JackLocomotion", - "SampleFullscreenAnimation", "UiDrawCallsSample", "UiFeatures", "UiIn3DWorld", "UiMainMenuLuaSample", - "UiMainMenuScriptCanvasSample", "UiTextureAtlasSample"], - marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")) - ]) -class TestMultipleLevels(object): - def test_multiple_levels(self, launcher_instance, levels, remote_console_instance): - """ - Verifies projects with multiple demo-levels can compile and successfully launch. - """ - configure_setup(launcher_instance) - - assert_build_success(launcher_instance) - assert_process_assets(launcher_instance) - - start_launcher(launcher_instance) - start_remote_console(launcher_instance, remote_console_instance) - - for level in levels: - load_level(launcher_instance, remote_console_instance, level) - remote_console_take_screenshot(launcher_instance, remote_console_instance, level) diff --git a/Tests/graphics/__init__.py b/Tests/graphics/__init__.py deleted file mode 100755 index 6ed3dc4bda..0000000000 --- a/Tests/graphics/__init__.py +++ /dev/null @@ -1,10 +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. -""" \ No newline at end of file diff --git a/Tests/graphics/ly107748_LightningArcProperties.cfg b/Tests/graphics/ly107748_LightningArcProperties.cfg deleted file mode 100644 index fe05f5f782..0000000000 --- a/Tests/graphics/ly107748_LightningArcProperties.cfg +++ /dev/null @@ -1,2 +0,0 @@ -# this file is copied to $/dev/editor_autoexec.cfg so the the Editor automation runs for this Hydra test -pyRunFile @devroot@/Tests/graphics/ly107748_LightningArcProperties_test_case.py \ No newline at end of file diff --git a/Tests/graphics/ly107748_LightningArcProperties_test.py b/Tests/graphics/ly107748_LightningArcProperties_test.py deleted file mode 100755 index 59cc3d8d1b..0000000000 --- a/Tests/graphics/ly107748_LightningArcProperties_test.py +++ /dev/null @@ -1,83 +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. -""" - -# -# This is a pytest module to test the in-Editor Python API from PythonEditorFuncs -# -import pytest -pytest.importorskip('test_tools') -import time -import logging -import os -import shutil - -from test_tools import WINDOWS_LAUNCHER -import test_tools.shared.log_monitor -import test_tools.launchers.phase -import test_tools.builtin.fixtures as fixtures - -# Use the built-in workspace and editor fixtures. -# These will configure the requested project and run the editor. -workspace = fixtures.use_fixture(fixtures.builtin_workspace_fixture, scope='function') -editor = fixtures.use_fixture(fixtures.editor, scope='function') - -logger = logging.getLogger(__name__) - - -@pytest.mark.parametrize("platform,configuration,project,spec", [ - pytest.param("win_x64_vs2017", "profile", "AutomatedTesting", "all", marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")), -]) -class TestLightningArcPropertyRanges(object): - - @pytest.fixture(autouse=True) - def setup_teardown(self, request, workspace, editor): - def teardown(): - editor.ensure_stopped() - - file_utils.delete_level(editor, "LightningArcTestLevel") - - request.addfinalizer(teardown) - - def test_change_properties(self, request, editor, project): - logger.debug("Running automated test") - - request.addfinalizer(editor.ensure_stopped) - - editor.deploy() - editor.launch(["--exec", "@engroot@/Tests/graphics/ly107748_LightningArcProperties.cfg"]) - - editorlog_file = os.path.join(editor.workspace.release.paths.project_log(), 'Editor.log') - - # LY-107861 LY-108088 - # expected failure cases are commented out pending implementation of property validation by hydra - expected_lines = [ - "Created new entity.", - "Lightning Arc component added to entity.", - #"ChangeProperty m_config|Arc Parameters|Segment Count to 0 failed.", - "ChangeProperty m_config|Arc Parameters|Segment Count to 1 succeeded.", - "ChangeProperty m_config|Arc Parameters|Segment Count to 25 succeeded.", - "ChangeProperty m_config|Arc Parameters|Segment Count to 50 succeeded.", - "ChangeProperty m_config|Arc Parameters|Segment Count to 70 succeeded.", - #"ChangeProperty m_config|Arc Parameters|Segment Count to 75 failed.", - #"ChangeProperty m_config|Arc Parameters|Segment Count to 100 failed.", - #"ChangeProperty m_config|Arc Parameters|Point Count to 0 failed.", - "ChangeProperty m_config|Arc Parameters|Point Count to 1 succeeded.", - "ChangeProperty m_config|Arc Parameters|Point Count to 25 succeeded.", - "ChangeProperty m_config|Arc Parameters|Point Count to 50 succeeded.", - "ChangeProperty m_config|Arc Parameters|Point Count to 70 succeeded.", - #"ChangeProperty m_config|Arc Parameters|Point Count to 75 failed.", - #"ChangeProperty m_config|Arc Parameters|Point Count to 100 failed.", - ] - - test_tools.shared.log_monitor.monitor_for_expected_lines(editor, editorlog_file, expected_lines) - - # Rely on the test script to quit after running - editor.run(test_tools.launchers.phase.WaitForLauncherToQuit(editor, 10)) diff --git a/Tests/graphics/ly107748_LightningArcProperties_test_case.py b/Tests/graphics/ly107748_LightningArcProperties_test_case.py deleted file mode 100755 index dd0c72e893..0000000000 --- a/Tests/graphics/ly107748_LightningArcProperties_test_case.py +++ /dev/null @@ -1,80 +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. -""" - -# Tests a portion of the Component Property Get/Set Python API while the Editor is running - -import azlmbr.legacy.general as general -import azlmbr.bus as bus -import azlmbr.entity as entity -import azlmbr.editor as editor -import azlmbr.math as math - - -# Create a test level -general.create_level_no_prompt("LightningArcTestLevel", 1024, 1, 1024, True) - -def ChangeProperty(component, path, value): - getPropertyOutcome = editor.EditorComponentAPIBus(bus.Broadcast, 'GetComponentProperty', component, path) - if not(getPropertyOutcome.IsSuccess()): - print("GetComponentProperty " + path + " failed.") - else: - oldValue = getPropertyOutcome.GetValue() - - setPropertyOutcome = editor.EditorComponentAPIBus(bus.Broadcast, 'SetComponentProperty', component, path, value) - if not(setPropertyOutcome.IsSuccess()): - print("SetComponentProperty " + path + " to " + str(value) + " failed.") - - getPropertyOutcome = editor.EditorComponentAPIBus(bus.Broadcast, 'GetComponentProperty', component, path) - if not(getPropertyOutcome.IsSuccess()): - print("GetComponentProperty " + path + " failed.") - else: - newValue = getPropertyOutcome.GetValue() - - if not(newValue == oldValue): - print("ChangeProperty " + path + " to " + str(value) + " succeeded.") - else: - print("ChangeProperty " + path + " to " + str(value) + " failed.") - -# Create new Entity -entityId = editor.ToolsApplicationRequestBus(bus.Broadcast, 'CreateNewEntity', entity.EntityId()) - -if (entityId.IsValid()): - print("Created new entity.") - -# Get Component Type for Lightning Arc -typeIdsList = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeIdsByEntityType', ["Lightning Arc"], entity.EntityType().Game) - -componentOutcome = editor.EditorComponentAPIBus(bus.Broadcast, 'AddComponentsOfType', entityId, typeIdsList) - -if (componentOutcome.IsSuccess()): - print("Lightning Arc component added to entity.") - -components = componentOutcome.GetValue() -component = components[0] - -# Tests for GetComponentProperty/SetComponentProperty -ChangeProperty(component, "m_config|Arc Parameters|Segment Count", 0) -ChangeProperty(component, "m_config|Arc Parameters|Segment Count", 1) -ChangeProperty(component, "m_config|Arc Parameters|Segment Count", 25) -ChangeProperty(component, "m_config|Arc Parameters|Segment Count", 50) -ChangeProperty(component, "m_config|Arc Parameters|Segment Count", 70) -ChangeProperty(component, "m_config|Arc Parameters|Segment Count", 75) -ChangeProperty(component, "m_config|Arc Parameters|Segment Count", 100) - -ChangeProperty(component, "m_config|Arc Parameters|Point Count", 0) -ChangeProperty(component, "m_config|Arc Parameters|Point Count", 1) -ChangeProperty(component, "m_config|Arc Parameters|Point Count", 25) -ChangeProperty(component, "m_config|Arc Parameters|Point Count", 50) -ChangeProperty(component, "m_config|Arc Parameters|Point Count", 70) -ChangeProperty(component, "m_config|Arc Parameters|Point Count", 75) -ChangeProperty(component, "m_config|Arc Parameters|Point Count", 100) - -general.exit_no_prompt() diff --git a/Tests/hydra/ctests/open_level_tweak_and_exit.py b/Tests/hydra/ctests/open_level_tweak_and_exit.py deleted file mode 100755 index de81327852..0000000000 --- a/Tests/hydra/ctests/open_level_tweak_and_exit.py +++ /dev/null @@ -1,46 +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. -""" - -# --runpythontest @devroot@\tests\hydra\ctests\open_level_tweak_and_exit.py -# An example of how a create a level, make an entity, and terminate successfully - -import time -import azlmbr.editor -import azlmbr.entity -import azlmbr.framework -import azlmbr.legacy.general as general -from azlmbr.bus import Broadcast - -handler = None - -def open_level(level): - print('opening level {}'.format(level)) - azlmbr.editor.EditorToolsApplicationRequestBus(Broadcast, 'OpenLevelNoPrompt', level) - general.idle_wait(1.0) - -def on_entity_registered(args): - print('on_entity_registered') - azlmbr.framework.Terminate(0) - -def main(): - print ('open_level_tweak_and_exit - starting') - open_level('auto_test') - - azlmbr.editor.ToolsApplicationRequestBus(Broadcast, 'CreateNewEntity', azlmbr.entity.EntityId()) - general.idle_wait(1.0) - - handler = azlmbr.editor.ToolsApplicationNotificationBusHandler() - handler.connect() - handler.add_callback('EntityRegistered', on_entity_registered) - azlmbr.editor.ToolsApplicationRequestBus(Broadcast, 'CreateNewEntity', azlmbr.entity.EntityId()) - -if __name__ == "__main__": - main() diff --git a/Tests/hydra/ctests/start_stop.py b/Tests/hydra/ctests/start_stop.py deleted file mode 100755 index c8fd670a97..0000000000 --- a/Tests/hydra/ctests/start_stop.py +++ /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. -""" - -# --runpythontest @devroot@\tests\hydra\ctests\start_stop.py -# an example of a test script that loads a level, listens for the first entity, and terminates the Editor with a 0 - -import azlmbr.framework -import azlmbr.editor -import azlmbr.bus - -handler = None - -def on_entity_registered(args): - print('on_entity_registered') - azlmbr.framework.Terminate(0) - -def main(): - print ('hello, start_stop') - handler = azlmbr.editor.ToolsApplicationNotificationBusHandler() - handler.connect() - handler.add_callback('EntityRegistered', on_entity_registered) - azlmbr.editor.EditorToolsApplicationRequestBus(azlmbr.bus.Broadcast, 'OpenLevelNoPrompt', 'auto_test') - print ('start_stop started') - -if __name__ == "__main__": - main() diff --git a/Tests/hydra/ctests/start_with_args.py b/Tests/hydra/ctests/start_with_args.py deleted file mode 100755 index e8b99b54ac..0000000000 --- a/Tests/hydra/ctests/start_with_args.py +++ /dev/null @@ -1,28 +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. -""" - -# --runpythontest @devroot@\tests\hydra\ctests\start_with_args.py --runpythonargs foo bar baz -# An example of how to use runpythontest with a main() + args - -import azlmbr.framework - -def main(): - print("hello, start_with_args") - - # print command line arguments - for arg in sys.argv: - print (arg) - - azlmbr.framework.Terminate(0) - -if __name__ == "__main__": - main() - diff --git a/Tests/hydra/ctests/stop_with_error_one.py b/Tests/hydra/ctests/stop_with_error_one.py deleted file mode 100755 index b17b5247aa..0000000000 --- a/Tests/hydra/ctests/stop_with_error_one.py +++ /dev/null @@ -1,17 +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. -""" - -# --runpythontest @devroot@\tests\hydra\ctests\stop_with_error_one.py -# an example terminating with a non-zero return code from Editor.exe - -import azlmbr.framework -print ('hello, stop_with_error_one') -azlmbr.framework.Terminate(1) diff --git a/Tests/hydra/ctests/stop_with_zero.py b/Tests/hydra/ctests/stop_with_zero.py deleted file mode 100755 index d1d3f4f58d..0000000000 --- a/Tests/hydra/ctests/stop_with_zero.py +++ /dev/null @@ -1,17 +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. -""" - -# --runpythontest @devroot@\tests\hydra\ctests\stop_with_zero.py -# An example of how a test script stops the Editor.exe with a succuessful zero return code - -import azlmbr.framework -print ('hello, stop_with_zero') -azlmbr.framework.Terminate(0) diff --git a/Tests/hydra/ctests/throws_exception.py b/Tests/hydra/ctests/throws_exception.py deleted file mode 100755 index e8b4507fb1..0000000000 --- a/Tests/hydra/ctests/throws_exception.py +++ /dev/null @@ -1,19 +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. -""" - -# --runpythontest @devroot@\tests\hydra\ctests\throws_exception.py -# An example of how a test script to fatal from Editor.exe when a Python exception happens - -print ('hello, throws_exception') -foo = 1.0 -bar = 0.0 -baz = foo / bar - diff --git a/Tests/ly_shared/PlatformSetting.py b/Tests/ly_shared/PlatformSetting.py deleted file mode 100755 index b215275c16..0000000000 --- a/Tests/ly_shared/PlatformSetting.py +++ /dev/null @@ -1,69 +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. - -Class for querying and setting a system setting/preference. - -""" - -import pytest -import logging -from typing import Optional, Any - -import ly_test_tools.o3de.pipeline_utils as utils - -logger = logging.getLogger(__name__) - - -class PlatformSetting: - """ - Interface for managing different platforms' system variables. - """ - - class DATA_TYPE: - """Platform-agnostic data type enums""" - - INT = 1 - STR = 2 - STR_LIST = 3 - - def __init__(self, workspace: pytest.fixture, subkey: str, key: str) -> None: - self._workspace = workspace - self._key = key - self._subkey = subkey - - def get_value(self, get_type: bool = False) -> object: - """Gets the current setting's value (and optionally type as tuple) from the system. Returns None if entry DNE""" - raise NotImplementedError("Virtual PlatformSetting not implemented. Instantiate a specific platform") - - def set_value(self, value: any) -> bool: - """Sets the current setting's value. Creates the entry if it DNE. Returns True for success.""" - raise NotImplementedError("Virtual PlatformSetting not implemented. Instantiate a specific platform") - - def delete_entry(self) -> bool: - """Deletes the settings entry. Returns boolean for success.""" - raise NotImplementedError("Virtual PlatformSetting not implemented. Instantiate a specific platform") - - def entry_exists(self) -> bool: - """Checks if the settings entry exists.""" - raise NotImplementedError("Virtual PlatformSetting not implemented. Instantiate a specific platform") - - @staticmethod - def get_system_setting(workspace: pytest.fixture, subkey: str, key: str, hive: Optional[str] = None) -> Any: - """Factory method creates a platform-specific system setting accessor""" - if workspace.asset_processor_platform is 'windows': - # import WindowsSetting and return an instance - from Tests.ly_shared.WindowsRegistrySetting import WindowsRegistrySetting - - return WindowsRegistrySetting(workspace, subkey, key, hive) - # ######################################################## - # Insert Mac (and Linux?) Setting implementations - # ######################################################## - else: - raise NotImplementedError(f"Platform: {workspace.platform} not supported yet") diff --git a/Tests/ly_shared/PlatformSettingTest.py b/Tests/ly_shared/PlatformSettingTest.py deleted file mode 100755 index f0ef8b6d1a..0000000000 --- a/Tests/ly_shared/PlatformSettingTest.py +++ /dev/null @@ -1,92 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -Tests the functionality of the PlatformSetting class -""" - -import pytest - -import ly_test_tools.builtin.helpers as helpers -from Tests.ly_shared.PlatformSetting import PlatformSetting - -all_platforms = helpers.all_host_platforms_params() -automatic_platform_skipping = helpers.automatic_platform_skipping -targetProjects = ["Helios"] - - -@pytest.mark.usefixtures("automatic_platform_skipping") -@pytest.mark.parametrize("platform", all_platforms) -@pytest.mark.parametrize("configuration", ["profile"]) -@pytest.mark.parametrize("spec", ["all"]) -@pytest.mark.parametrize("project", targetProjects) -class TestsPlatformSetting(object): - """ - Tests for the PlatformSetting class - """ - - def test_PlatformSetting(self, workspace): - - key = "Software" - subkey = "TemporarySystemSetting" - - # Create setting reference - setting = PlatformSetting.get_system_setting(workspace, subkey, key) - - # Test storing integer - value = 74 - setting.set_value(value) - - # Test creation of subkey - assert setting.entry_exists(), f"Failed creating key:subkey, {key}:{subkey}" - - # Test data retrieval (without type) - retrieved = setting.get_value() - # fmt:off - assert retrieved == value, \ - f"Unexpected value retrieved from system settings. Expected: {value}, Actual: {retrieved}" - # fmt:on - - # Test data retrieval (with type) - retrieved = setting.get_value(get_type=True) - assert type(retrieved) == tuple, "Getting value with type DID NOT return a tuple" - assert len(retrieved) == 2, f"Getting value with type returned a tuple of size {len(retrieved)}: expected 2" - assert retrieved[1] == PlatformSetting.DATA_TYPE.INT, "Value stored was int, but type retrieved was NOT int" - assert type(retrieved[0]) == int, "Value stored was int, but value retrieved was NOT int" - - # fmt:off - assert retrieved[0] == value, \ - f"Unexpected value retrieved from system settings. Expected: {value}, Actual: {retrieved[0]}" - # fmt:on - - # Test storing string - value = "Some Text" - setting.set_value(value) - retrieved = setting.get_value(get_type=True) - assert ( - retrieved[1] == PlatformSetting.DATA_TYPE.STR - ), "Value stored was string, but type retrieved was NOT string" - assert type(retrieved[0]) == str, "Value stored was string, but value retrieved was NOT string" - assert value == retrieved[0], f"Value retrieved not expected. Expected: {value}, Actual: {retrieved[0]}" - - # Test storing list of strings - value = ["Some", "List", "Of", "Text"] - setting.set_value(value) - retrieved = setting.get_value(get_type=True) - assert ( - retrieved[1] == PlatformSetting.DATA_TYPE.STR_LIST - ), "Value stored was string list, but type retrieved was NOT string list" - assert type(retrieved[0]) == list, "Value stored was string, but value retrieved was NOT string" - # fmt:off - assert sorted(value) == sorted(retrieved[0]), f"Value retrieved not expected. " \ - f"Expected: {value}, Actual: {retrieved[0]}" - # fmt:on - - setting.delete_entry() - assert not setting.entry_exists(), f"Failed to delete key:subkey, {key}:{subkey}" diff --git a/Tests/ly_shared/WindowsRegistrySetting.py b/Tests/ly_shared/WindowsRegistrySetting.py deleted file mode 100755 index c1aa4e4a98..0000000000 --- a/Tests/ly_shared/WindowsRegistrySetting.py +++ /dev/null @@ -1,165 +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. - -Class for querying and setting a windows registry setting. - -""" -import pytest -import logging -from typing import List, Optional, Tuple, Any - -from winreg import ( - CreateKey, - OpenKey, - QueryValueEx, - DeleteValue, - SetValueEx, - KEY_ALL_ACCESS, - KEY_WRITE, - REG_SZ, - REG_MULTI_SZ, - REG_DWORD, - HKEY_CURRENT_USER, -) - - -from Tests.ly_shared.PlatformSetting import PlatformSetting - -logger = logging.getLogger(__name__) - - -class WindowsRegistrySetting(PlatformSetting): - def __init__(self, workspace: pytest.fixture, subkey: str, key: str, hive: Optional[str] = None) -> None: - super().__init__(workspace, subkey, key) - self._hive = None - try: - if hive is not None: - self._hive = self._str_to_hive(hive) - except ValueError: - logger.warning(f"Windows Registry Hive {hive} not recognized, using default: HKEY_CURRENT_USER") - finally: - if self._hive is None: - self._hive = HKEY_CURRENT_USER - - def get_value(self, get_type: Optional[bool] = False) -> Any: - """Retrieves the fast scan value in Windows registry (and optionally the type). If entry DNE, returns None.""" - if self.entry_exists(): - registryKey = OpenKey(self._hive, self._key) - value = QueryValueEx(registryKey, self._subkey) - registryKey.Close() - # Convert windows data type to universal data type flag: PlatformSettings.DATA_TYPE - # And handles unicode conversion for strings - value = self._convert_value(value) - return value if get_type else value[0] - - else: - logger.warning(f"Could not retrieve Registry entry; key: {self._key}, subkey: {self._subkey}.") - return None - - def set_value(self, value: Any) -> bool: - """Sets the Windows registry value.""" - value, win_type = self._format_data(value) - registryKey = None - result = False - try: - CreateKey(self._hive, self._subkey) - registryKey = OpenKey(self._hive, self._key, 0, KEY_WRITE) - SetValueEx(registryKey, self._subkey, 0, win_type, value) - result = True - except WindowsError as e: - logger.warning(f"Windows error caught while setting fast scan registry: {e}") - finally: - if registryKey is not None: - # Close key if it's been opened successfully - registryKey.Close() - return result - - def delete_entry(self) -> bool: - """Deletes the Windows registry entry for fast scan enabled""" - try: - if self.entry_exists(): - registryKey = OpenKey(self._hive, self._key, 0, KEY_ALL_ACCESS) - DeleteValue(registryKey, self._subkey) - registryKey.Close() - return True - except WindowsError: - logger.error(f"Could not delete registry entry; key: {self._key}, subkey: {self._subkey}") - finally: - return False - - def entry_exists(self) -> bool: - """Checks for existence of the setting in Windows registry.""" - try: - # Attempt to open and query key. If fails then the entry DNE - registryKey = OpenKey(self._hive, self._key) - QueryValueEx(registryKey, self._subkey) - registryKey.Close() - return True - - except WindowsError: - return False - - @staticmethod - def _format_data(value: bool or int or str or List[str]) -> Tuple[int or str or List[str], int]: - """Formats the type of the value provided. Returns the formatted value and the windows registry type (int).""" - if type(value) == str: - return value, REG_SZ - elif type(value) == bool: - value = "true" if value else "false" - return value, REG_SZ - elif type(value) == int or type(value) == float: - if type(value) == float: - logger.warning(f"Windows registry does not support floats. Truncating {value} to integer") - value = int(value) - return value, REG_DWORD - elif type(value) == list: - for single_value in value: - if type(single_value) != str: - # fmt:off - raise ValueError( - f"Windows Registry lists only support strings, got a {type(single_value)} in the list") - # fmt:on - return value, REG_MULTI_SZ - else: - raise ValueError(f"Windows registry expected types: int, str and [str], found {type(value)}") - - @staticmethod - def _convert_value(value_tuple: Tuple[Any, int]) -> Tuple[Any, PlatformSetting.DATA_TYPE]: - """Converts the Windows registry data and type (tuple) to a (standardized) data and PlatformSetting.DATA_TYPE""" - value, windows_type = value_tuple - if windows_type == REG_SZ: - # Convert from unicode to string - return value, PlatformSetting.DATA_TYPE.STR - elif windows_type == REG_MULTI_SZ: - # Convert from unicode to string - return [string for string in value], PlatformSetting.DATA_TYPE.STR_LIST - elif windows_type == REG_DWORD: - return value, PlatformSetting.DATA_TYPE.INT - else: - raise ValueError(f"Type flag not recognized: {windows_type}") - - @staticmethod - def _str_to_hive(hive_str: str) -> int: - """Converts a string to a Windows Registry Hive enum (int)""" - from winreg import HKEY_CLASSES_ROOT, HKEY_CURRENT_CONFIG, HKEY_LOCAL_MACHINE, HKEY_USERS - - lower = hive_str.lower() - if lower == "hkey_current_user" or lower == "current_user": - return HKEY_CURRENT_USER - elif lower == "hkey_classes_root" or lower == "classes_root": - return HKEY_CLASSES_ROOT - elif lower == "hkey_current_config" or lower == "current_config": - return HKEY_CURRENT_CONFIG - elif lower == "hkey_local_machine" or lower == "local_machine": - return HKEY_LOCAL_MACHINE - elif lower == "hkey_users" or lower == "users": - return HKEY_USERS - else: - raise ValueError(f"Hive: {hive_str} not recognized") diff --git a/Tests/ly_shared/__init__.py b/Tests/ly_shared/__init__.py deleted file mode 100755 index 6ed3dc4bda..0000000000 --- a/Tests/ly_shared/__init__.py +++ /dev/null @@ -1,10 +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. -""" \ No newline at end of file diff --git a/Tests/ly_shared/asset_database_utils.py b/Tests/ly_shared/asset_database_utils.py deleted file mode 100755 index da8ad3651e..0000000000 --- a/Tests/ly_shared/asset_database_utils.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -import sqlite3 -import os -from typing import List - -# Index for ProductID in Products table in DB -PRODUCT_ID_INDEX = 0 - - -def do_select(asset_db_path, cmd): - try: - connection = sqlite3.connect(asset_db_path) - # Get ProductID from database - db_rows = connection.execute(cmd) - return_result = db_rows.fetchall() - connection.close() - return return_result - except sqlite3.Error as sqlite_error: - print(f'select on db {asset_db_path} failed with exception {sqlite_error}') - return [] - - -def get_active_platforms_from_db(asset_db_path) -> List[str]: - """Returns a list of platforms that are active in the database, based on what jobs were run""" - platform_rows = do_select(asset_db_path, f"select distinct Platform from Jobs") - # Condense this into a single list of platforms. - platforms = [platform[0] for platform in platform_rows] - return platforms - - -# Convert a source product path into a db product path -# cache_platform/projectname/product_path -def get_db_product_path(workspace, source_path, cache_platform): - product_path = os.path.join(cache_platform, workspace.project, source_path) - product_path = product_path.replace('\\', '/') - return product_path - - -def get_product_id(asset_db_path, product_name) -> str: - # Get ProductID from database - product_id = list(do_select(asset_db_path, f"SELECT ProductID FROM Products where ProductName='{product_name}'")) - if len(product_id) == 0: - return product_id # return empty list - return product_id[0][PRODUCT_ID_INDEX] # Get product id from 'first' row - - -# Retrieve a product_id given a source_path assuming the source is copied into the cache with the same -# name or a product name without cache_platform or projectname prepended -def get_product_id_from_relative(workspace, source_path, asset_platform): - return get_product_id(workspace.paths.asset_db(), get_db_product_path(workspace, source_path, asset_platform)) - - -def get_missing_dependencies(asset_db_path, product_id) -> List[str]: - return list(do_select(asset_db_path, f"SELECT * FROM MissingProductDependencies where ProductPK={product_id}")) - - -def do_single_transaction(asset_db_path, cmd): - try: - connection = sqlite3.connect(asset_db_path) - cursor = connection.cursor() # SQL cursor used for issuing commands - cursor.execute(cmd) - connection.commit() # Save changes - connection.close() - except sqlite3.Error as sqlite_error: - print(f'transaction on db {asset_db_path} cmd {cmd} failed with exception {sqlite_error}') - - -def clear_missing_dependencies(asset_db_path, product_id) -> None: - do_single_transaction(asset_db_path, f"DELETE FROM MissingProductDependencies where ProductPK={product_id}") - - -def clear_all_missing_dependencies(asset_db_path) -> None: - do_single_transaction(asset_db_path, "DELETE FROM MissingProductDependencies;") diff --git a/Tests/ly_shared/asset_processor_utils.py b/Tests/ly_shared/asset_processor_utils.py deleted file mode 100755 index 13dc50ea83..0000000000 --- a/Tests/ly_shared/asset_processor_utils.py +++ /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. -""" - - -import logging -import os -import subprocess - -from ly_test_tools.environment.process_utils import kill_processes_named as kill_processes_named -logger = logging.getLogger(__name__) - - -def start_asset_processor(bin_dir): - """ - Starts the AssetProcessor from the given bin directory. Raises a RuntimeError if the process fails. - :param bin_dir: The bin directory from which to launch the AssetProcessor executable. - :return: A subprocess.Popen object for the AssetProcessor process. - """ - os.chdir(bin_dir) - asset_processor = subprocess.Popen(['AssetProcessor.exe']) - return_code = asset_processor.poll() - - if return_code is not None and return_code != 0: - logger.error("Failed to start AssetProcessor") - raise RuntimeError("AssetProcessor exited with code {}".format(return_code)) - else: - logger.info("AssetProcessor is running") - return asset_processor - - -def kill_asset_processor(): - """ - Kill the AssetProcessor and all its related processes . - """ - - kill_processes_named('AssetProcessor_tmp', ignore_extensions=True) - kill_processes_named('AssetProcessor', ignore_extensions=True) - kill_processes_named('AssetProcessorBatch', ignore_extensions=True) - kill_processes_named('AssetBuilder', ignore_extensions=True) - kill_processes_named('rc', ignore_extensions=True) - - - diff --git a/Tests/ly_shared/file_utils.py b/Tests/ly_shared/file_utils.py deleted file mode 100755 index 2fc93d7538..0000000000 --- a/Tests/ly_shared/file_utils.py +++ /dev/null @@ -1,169 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -import os -import shutil -import logging -import stat - -import ly_test_tools.environment.file_system as file_system -import ly_test_tools.environment.waiter as waiter - -logger = logging.getLogger(__name__) - - -def clear_out_file(file_path): - """ - Clears out the specified config file to be empty. - :param file_path: The full path to the file. - """ - if os.path.exists(file_path): - file_system.unlock_file(file_path) - with open(file_path, 'w') as file_to_write: - file_to_write.write('') - else: - logger.debug(f'{file_path} not found while attempting to clear out file.') - - -def add_commands_to_config_file(config_file_dir, config_file_name, command_list): - """ - From the command list, appends each command to the specified config file. - :param config_file_dir: The directory the config file is contained in. - :param config_file_name: The config file name. - :param command_list: The commands to add to the file. - :return: - """ - config_file_path = os.path.join(config_file_dir, config_file_name) - os.chmod(config_file_path, stat.S_IWRITE | stat.S_IREAD | stat.S_IEXEC) - with open(config_file_path, 'w') as launch_config_file: - for command in command_list: - launch_config_file.write("{}\n".format(command)) - - -def gather_error_logs(workspace): - """ - Grabs all error logs (if there are any) and puts them into the specified logs path. - :param workspace: The AbstractWorkspaceManager object that contains all of the paths - """ - error_log_path = os.path.join(workspace.paths.project_log(), 'error.log') - error_dump_path = os.path.join(workspace.paths.project_log(), 'error.dmp') - if os.path.exists(error_dump_path): - workspace.artifact_manager.save_artifact(error_dump_path) - if os.path.exists(error_log_path): - workspace.artifact_manager.save_artifact(error_log_path) - - -def delete_screenshot_folder(workspace): - """ - Deletes screenshot folder from platform path - :param workspace: The AbstractWorkspaceManager object that contains all of the paths - """ - shutil.rmtree(workspace.paths.project_screenshots(), ignore_errors=True) - - -def move_file(src_dir, dest_dir, file_name, timeout=120): - """ - Attempts to move a file from the source directory to the destination directory. Raises an IOError if - the file is in use. - :param src_dir: Directory of the file to be moved. - :param dest_dir: Directory where the file will be moved to. - :param file_name: Name of the file to be moved. - :param timeout: Number of seconds to wait for the file to be released. - """ - file_path = os.path.join(src_dir, file_name) - if os.path.exists(file_path): - waiter.wait_for(lambda: move_file_check(src_dir, dest_dir, file_name), timeout=timeout, - exc=IOError('Cannot move file {} while in use'.format(file_path))) - - -def move_file_check(src_dir, dest_dir, file_name): - """ - Moves file and checks if the file has been moved from the source to the destination directory. - :param src_dir: Source directory of the file to be moved - :param dest_dir: Destination directory where the file should move to - :param file_name: The name of the file to be moved - :return: - """ - try: - shutil.move(os.path.join(src_dir, file_name), os.path.join(dest_dir, file_name)) - except OSError as e: - logger.info(e) - return False - - return True - - -def rename_file(file_path, dest_path, timeout=10): - # type: (str, str, int) -> None - """ - Renames a file by moving it. Waits for file to become available and raises and exception if timeout occurs. - :param file_path: absolute path to the source file - :param dest_path: absolute path to the new file - :param timeout: timeout to wait for function to complete - :return: None - """ - def _rename_file_check(): - try: - shutil.move(file_path, dest_path) - except OSError as e: - logger.debug(f'Attempted to rename file: {file_path} but an error occurred, retrying.' - f'\nError: {e}', - stackinfo=True) - return False - return True - - if os.path.exists(file_path): - waiter.wait_for(lambda: _rename_file_check(), timeout=timeout, - exc=OSError('Cannot rename file {} while in use'.format(file_path))) - - -def delete_level(workspace, level_dir, timeout=120): - """ - Attempts to delete an entire level folder from the project. - :param workspace: The workspace instance to delete the level from. - :param level_dir: The level folder to delete - """ - - if not level_dir: - logger.warning("level_dir is empty, nothing to delete.") - return - - full_level_dir = os.path.join(workspace.paths.project(), 'Levels', level_dir) - if not os.path.isdir(full_level_dir): - if os.path.exists(full_level_dir): - logger.error("level '{}' isn't a directory, it won't be deleted.".format(full_level_dir)) - else: - logger.info("level '{}' doesn't exist, nothing to delete.".format(full_level_dir)) - return - - waiter.wait_for(lambda: delete_check(full_level_dir), - timeout=timeout, - exc=IOError('Cannot delete directory {} while in use'.format(full_level_dir))) - -def delete_check(src_dir): - """ - Deletes directory and verifies that it's been deleted. - :param src_dir: The directory to delete - """ - try: - def handle_delete_error(action, path, exception_info): - logger.info("Error deleting '{}' ({}), changing permissions to writeable.".format(path, exception_info)) - os.chmod(path, stat.S_IWRITE) - # Try the passed-in action (delete) again - action(path) - - shutil.rmtree(src_dir, onerror=handle_delete_error) - except OSError as e: - logger.debug("Delete for '{}' failed: {}".format(src_dir, e)) - return False - - return not os.path.exists(src_dir) - diff --git a/Tests/ly_shared/hydra_editor_utils.py b/Tests/ly_shared/hydra_editor_utils.py deleted file mode 100755 index b75e680cf8..0000000000 --- a/Tests/ly_shared/hydra_editor_utils.py +++ /dev/null @@ -1,340 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -import azlmbr.bus as bus -import azlmbr.editor as editor -import azlmbr.entity as entity -import azlmbr.object - -from typing import List -from math import isclose -import collections.abc - - -def find_entity_by_name(entity_name): - """ - Gets an entity ID from the entity with the given entity_name - :param entity_name: String of entity name to search for - :return entity ID - """ - search_filter = entity.SearchFilter() - search_filter.names = [entity_name] - matching_entity_list = entity.SearchBus(bus.Broadcast, 'SearchEntities', search_filter) - if matching_entity_list: - matching_entity = matching_entity_list[0] - if matching_entity.IsValid(): - print(f'{entity_name} entity found with ID {matching_entity.ToString()}') - return matching_entity - else: - return matching_entity_list - - -def get_component_type_id(component_name): - """ - Gets the component_type_id from a given component name - :param component_name: String of component name to search for - :return component type ID - """ - type_ids_list = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeIdsByEntityType', [component_name], entity.EntityType().Game) - component_type_id = type_ids_list[0] - return component_type_id - - -def add_component(componentName, entityId): - """ - Given a component name, finds component TypeId, adds to given entity, and verifies successful add/active state. - :param componentName: String of component name to add. - :param entityId: Entity to add component to. - :return: Component object. - """ - typeIdsList = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeIdsByEntityType', [componentName], entity.EntityType().Game) - typeNamesList = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeNames', typeIdsList) - componentOutcome = editor.EditorComponentAPIBus(bus.Broadcast, 'AddComponentsOfType', entityId, typeIdsList) - isActive = editor.EditorComponentAPIBus(bus.Broadcast, 'IsComponentEnabled', componentOutcome.GetValue()[0]) - hasComponent = editor.EditorComponentAPIBus(bus.Broadcast, 'HasComponentOfType', entityId, typeIdsList[0]) - if componentOutcome.IsSuccess() and isActive: - print('{} component was added to entity'.format(typeNamesList[0])) - elif componentOutcome.IsSuccess() and not isActive: - print('{} component was added to entity, but the component is disabled'.format(typeNamesList[0])) - elif not componentOutcome.IsSuccess(): - print('Failed to add {} component to entity'.format(typeNamesList[0])) - if hasComponent: - print('Entity has a {} component'.format(typeNamesList[0])) - return componentOutcome.GetValue()[0] - - -def get_component_property_value(component, component_propertyPath): - """ - Given a component name and component property path, outputs the property's value. - :param component: Component object to act on. - :param componentPropertyPath: String of component property. (e.g. 'Settings|Visible') - :return: Value set in given componentPropertyPath - """ - componentPropertyObj = editor.EditorComponentAPIBus(bus.Broadcast, 'GetComponentProperty', component, - component_propertyPath) - if componentPropertyObj.IsSuccess(): - componentProperty = componentPropertyObj.GetValue() - print(f'{component_propertyPath} set to {componentProperty}') - return componentProperty - else: - print(f'FAILURE: Could not get value from {component_propertyPath}') - return None - - -def get_property_tree(component): - """ - Given a configured component object, prints the property tree info from that component - :param component: Component object to act on. - """ - pteObj = editor.EditorComponentAPIBus(bus.Broadcast, 'BuildComponentPropertyTreeEditor', component) - pte = pteObj.GetValue() - print(pte.build_paths_list()) - return pte - - -def compare_values(first_object: object, second_object: object, name: str) -> bool: - # Quick case - can we just directly compare the two objects successfully? - if (first_object == second_object): - result = True - # No, so get a lot more specific - elif isinstance(first_object, collections.abc.Container): - # If they aren't both containers, they're different - if not isinstance(second_object, collections.abc.Container): - result = False - # If they have different lengths, they're different - elif len(first_object) != len (second_object): - result = False - # If they're different strings, they're containers but they failed the == check so - # we know they're different - elif isinstance(first_object, str): - result = False - else: - # It's a collection of values, so iterate through them all... - collection_idx = 0 - result = True - for val1, val2 in zip(first_object, second_object): - result = result and compare_values(val1, val2, f"{name} (index [{collection_idx}])") - collection_idx = collection_idx + 1 - - else: - # Do approximate comparisons for floats - if isinstance(first_object, float) and isclose(first_object, second_object, rel_tol=0.001): - result = True - # We currently don't have a generic way to compare PythonProxyObject contents, so return a - # false positive result for now. - elif isinstance(first_object, azlmbr.object.PythonProxyObject): - print(f"{name}: validation inconclusive, the two objects cannot be directly compared.") - result = True - else: - result = False - - if not result: - print(f"compare_values failed: {first_object} ({type(first_object)}) vs {second_object} ({type(second_object)})") - - print(f"{name}: {'SUCCESS' if result else 'FAILURE'}") - return result - - -class Entity: - """ - Entity class used to create entity objects - :param name: String for the name of the Entity - :param id: The ID of the entity - """ - - def __init__(self, name: str, id: object = entity.EntityId()): - self.name: str = name - self.id: object = id - self.components: List[object] = None - self.parent_id = None - self.parent_name = None - - def create_entity(self, entity_position, components, parent_id=entity.EntityId()): - self.id = editor.ToolsApplicationRequestBus( - bus.Broadcast, "CreateNewEntityAtPosition", entity_position, entity.EntityId() - ) - if self.id.IsValid(): - print(f"{self.name} Entity successfully created") - editor.EditorEntityAPIBus(bus.Event, 'SetName', self.id, self.name) - self.components = [] - for component in components: - new_component = add_component(component, self.id) - self.components.append(new_component) - - def get_parent_info(self): - """ - Sets the value for parent_id and parent_name on the entity (self) - Prints the string for papertrail - :return: None - """ - self.parent_id = editor.EditorEntityInfoRequestBus(bus.Event, "GetParent", self.id) - self.parent_name = editor.EditorEntityInfoRequestBus(bus.Event, "GetName", self.parent_id) - print(f"The parent entity of {self.name} is {self.parent_name}") - - def set_test_parent_entity(self, parent_entity_obj): - editor.EditorEntityAPIBus(bus.Event, "SetParent", self.id, parent_entity_obj.id) - self.get_parent_info() - - def get_set_test(self, component_index: int, path: str, value: object, expected_result: object = None) -> bool: - """ - Used to set and validate changes in component values - :param component_index: Index location in the self.components list - :param path: asset path in the component - :param value: new value for the variable being changed in the component - :param expected_result: (optional) check the result against a specific expected value - """ - - if expected_result is None: - expected_result = value - - # Test Get/Set (get old value, set new value, check that new value was set correctly) - print(f"Entity {self.name} Path {path} Component Index {component_index} ") - - component = self.components[component_index] - old_value = get_component_property_value(component, path) - - if old_value is not None: - print(f"SUCCESS: Retrieved property Value for {self.name}") - else: - print(f"FAILURE: Failed to find value in {self.name} {path}") - return False - - if old_value == expected_result: - print((f"WARNING: get_set_test on {self.name} is setting the same value that already exists ({old_value})." - "The set results will be inconclusive.")) - - editor.EditorComponentAPIBus(bus.Broadcast, "SetComponentProperty", component, path, value) - - new_value = get_component_property_value(self.components[component_index], path) - - if new_value is not None: - print(f"SUCCESS: Retrieved new property Value for {self.name}") - else: - print(f"FAILURE: Failed to find new value in {self.name}") - return False - - return compare_values(new_value, expected_result, f"{self.name} {path}") - - -def get_set_test(entity: object, component_index: int, path: str, value: object) -> bool: - """ - Used to set and validate changes in component values - :param component_index: Index location in the entity.components list - :param path: asset path in the component - :param value: new value for the variable being changed in the component - """ - return entity.get_set_test(component_index, path, value) - - -def get_set_property_test(ly_object: object, attribute_name: str, value: object, expected_result: object = None) -> bool: - """ - Used to set and validate BehaviorContext property changes in Lumberyard objects - :param ly_object: The lumberyard object to test - :param attribute_name: property (attribute) name in the BehaviorContext - :param value: new value for the variable being changed in the component - :param expected_result: (optional) check the result against a specific expected value other than the one set - """ - - if expected_result is None: - expected_result = value - - # Test Get/Set (get old value, set new value, check that new value was set correctly) - print(f"Attempting to set {ly_object.typename}.{attribute_name} = {value} (expected result is {expected_result})") - - if hasattr(ly_object, attribute_name): - print(f"SUCCESS: Located attribute {attribute_name} for {ly_object.typename}") - else: - print(f"FAILURE: Failed to find attribute {attribute_name} in {ly_object.typename}") - return False - - old_value = getattr(ly_object, attribute_name) - - if old_value is not None: - print(f"SUCCESS: Retrieved existing value {old_value} for {attribute_name} in {ly_object.typename}") - else: - print(f"FAILURE: Failed to retrieve value for {attribute_name} in {ly_object.typename}") - return False - - if old_value == expected_result: - print((f"WARNING: get_set_test on {attribute_name} is setting the same value that already exists ({old_value})." - "The 'set' result for the test will be inconclusive.")) - - setattr(ly_object, attribute_name, expected_result) - - new_value = getattr(ly_object, attribute_name) - - if new_value is not None: - print(f"SUCCESS: Retrieved new value {new_value} for {attribute_name} in {ly_object.typename}") - else: - print(f"FAILURE: Failed to retrieve value for {attribute_name} in {ly_object.typename}") - return False - - return compare_values(new_value, expected_result, f"{ly_object.typename}.{attribute_name}") -def has_components(entity_id: object, component_list: list) -> bool: - """ - Used to verify if a given entity has all the components of components_list. Returns True if all the - components are present, else False - :param entity_id: entity id of the entity - :param component_list: list of component names to be verified - """ - typeIdsList = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeIdsByEntityType', component_list , entity.EntityType().Game) - for type_id in typeIdsList: - if not editor.EditorComponentAPIBus(bus.Broadcast, 'HasComponentOfType', entity_id, type_id): - return False - return True - -class PathNotFoundError(Exception): - def __init__(self, path): - self.path = path - - def __str__(self): - return f"Path \"{self.path}\" not found in Editor Settings" - -def get_editor_settings_path_list(): - """ - Get the list of Editor Settings paths - """ - paths = editor.EditorSettingsAPIBus(bus.Broadcast, 'BuildSettingsList') - return paths - -def get_editor_settings_by_path(path): - """ - Get the value of Editor Settings based on the path. - :param path: path to the Editor Settings to get the value - """ - if path not in get_editor_settings_path_list(): - raise PathNotFoundError(path) - outcome = editor.EditorSettingsAPIBus(bus.Broadcast, 'GetValue', path) - if outcome.isSuccess(): - return outcome.GetValue() - raise RuntimeError(f"GetValue for path '{path}' failed") - -def set_editor_settings_by_path(path, value, is_bool = False): - """ - Set the value of Editor Settings based on the path. - # NOTE: Some Editor Settings may need an Editor restart to apply. - # Ex: Enabling or disabling New Viewport Interaction Model - :param path: path to the Editor Settings to get the value - :param value: value to be set - :param is_bool: True for Boolean settings (enable/disable), False for other settings - """ - if path not in get_editor_settings_path_list(): - raise PathNotFoundError(path) - if is_bool and not isinstance(value, bool): - def ParseBoolValue(value): - if(value == "0"): - return False - return True - value = ParseBoolValue(value) - outcome = editor.EditorSettingsAPIBus(bus.Broadcast, 'SetValue', path, value) - if not outcome.isSuccess(): - raise RuntimeError(f"SetValue for path '{path}' failed") - print(f"Value for path '{path}' is set to {value}") diff --git a/Tests/ly_shared/hydra_lytt_test_utils.py b/Tests/ly_shared/hydra_lytt_test_utils.py deleted file mode 100755 index bbdcbc6cb6..0000000000 --- a/Tests/ly_shared/hydra_lytt_test_utils.py +++ /dev/null @@ -1,77 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -import logging -import os -import tempfile -import ly_test_tools.log.log_monitor -import ly_test_tools.environment.process_utils as process_utils -import ly_test_tools.environment.waiter as waiter - -logger = logging.getLogger(__name__) - - -def teardown_editor(editor): - """ - :param editor: Configured editor object - :return: - """ - process_utils.kill_processes_named('AssetProcessor.exe') - logger.debug('Ensuring Editor is stopped') - editor.ensure_stopped() - - -def launch_and_validate_results(request, test_directory, editor, editor_script, expected_lines, unexpected_lines=[], - halt_on_unexpected=False, auto_test_mode=True, run_python="--runpythontest", cfg_args=[], timeout=60, log_creation_max_wait=60): - """ - Creates a temporary config file for Hydra execution, runs the Editor with the specified script, and monitors for - expected log lines. - :param request: Special fixture providing information of the requesting test function. - :param test_directory: Path to test directory that editor_script lives in. - :param editor: Configured editor object to run test against. - :param editor_script: Name of script that will execute in the Editor. - :param expected_lines: Expected lines to search log for. - :param unexpected_lines: Unexpected lines to search log for. Defaults to none. - :param halt_on_unexpected: Halts test if unexpected lines are found. Defaults to False. - :param auto_test_mode: Defaults to True. Runs the test in auto_test_mode. - :param run_python: Defaults to "--runpythontest", other option is "--runpython". - :param cfg_args: Additional arguments for CFG, such as LevelName. - :param timeout: Length of time for test to run. Default is 60. - :param log_creation_max_wait: Length of time for waiting to find the log file. Default is 60. - """ - test_case = os.path.join(test_directory, editor_script) - request.addfinalizer(lambda: teardown_editor(editor)) - logger.debug("Running automated test: {}".format(editor_script)) - - editor.args.extend(["--skipWelcomeScreenDialog"]) - if auto_test_mode: editor.args.extend(["--autotest_mode"]) - editor.args.extend([run_python, test_case, "--runpythonargs", cfg_args]) - - with editor.start(): - - editorlog_file = os.path.join(editor.workspace.paths.project_log(), 'Editor.log') - log_monitor = ly_test_tools.log.log_monitor.LogMonitor(launcher=editor, log_file_path=editorlog_file, log_creation_max_wait_time=log_creation_max_wait) - log_monitor.monitor_log_for_lines(expected_lines=expected_lines, unexpected_lines=unexpected_lines, - halt_on_unexpected=halt_on_unexpected, timeout=timeout) - - -def remove_files(artifact_path, suffix): - """ - Removes files with the specified suffix from the specified path - :param artifact_path: Path to search for files - :param suffix: File extension to remove - """ - if not os.path.isdir(artifact_path): - return - - for file_name in os.listdir(artifact_path): - if file_name.endswith(suffix): - os.remove(os.path.join(artifact_path, file_name)) diff --git a/Tests/ly_shared/network_utils.py b/Tests/ly_shared/network_utils.py deleted file mode 100755 index 8b772303f1..0000000000 --- a/Tests/ly_shared/network_utils.py +++ /dev/null @@ -1,66 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -import logging -import psutil -import socket - - -logger = logging.getLogger(__name__) - - -def check_for_listening_port(port): - """ - Checks to see if the connection to the designated port was established. - :param port: Port to listen to. - :return: True if port is listening. - """ - port_listening = False - for conn in psutil.net_connections(): - if 'port={}'.format(port) in str(conn): - port_listening = True - return port_listening - - -def check_for_remote_listening_port(port, ip_addr='127.0.0.1'): - """ - Tries to connect to a port to see if port is listening. - :param port: Port being tested. - :param ip_addr: IP address of the host being connected to. - :return: True if connection to the port is established. - """ - port_listening = True - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - try: - sock.connect((ip_addr, port)) - except socket.error as err: - # Socket error: Connection refused, error code 10061 - if err.errno == 10061: - port_listening = False - finally: - sock.close() - return port_listening - - -def get_local_ip_address(): - """ - Finds the IP address for the primary ethernet adapter by opening a connection and grabbing its IP address. - :return: The IP address for the adapter used to make the connection. - """ - sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - try: - # Connecting to Google's public DNS so there is an open connection - # and then getting the address used for that connection - sock.connect(('8.8.8.8', 80)) - host_ip = sock.getsockname()[0] - finally: - sock.close() - return host_ip diff --git a/Tests/ly_shared/phase.py b/Tests/ly_shared/phase.py deleted file mode 100755 index 4bb827b3ad..0000000000 --- a/Tests/ly_shared/phase.py +++ /dev/null @@ -1,198 +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. - -This represents one "phase" of a test. The test runner communicates with the launcher by running phases and waiting -for results, however they appear. -""" - -import logging -import os -import time -import xml.etree.ElementTree - -import ly_test_tools.launchers.exceptions as exceptions -from ly_test_tools.launchers.platforms.base import Launcher - -_POLL_INTERVAL_SEC = 1 -_CRASH_TIMEOUT = 5 - -logger = logging.getLogger(__name__) - - -class Phase(object): - """ - A generic test phase for running the launcher. With the launcher running elsewhere (at a minimum in a different - process, possibly on a different device altogether) the following kind of phases might occur: - - - Wait for a specific file to show up / complete processing. - - Send commands to the launcher over the network and wait for response. - - Wait for multiple launchers to coordinate networking testing. - - Wait for a specific amount of time. - - Each phase can then compile the artifacts for the next phase. - """ - def __init__(self, timeout): - """ - :param timeout: Maximum time allocated for phase. - """ - self.timeout = timeout - - def _start(self, previous_phase=None): - """ - Start the phase. - - :return: None - """ - logger.debug("start: {}".format(self.__class__.__name__)) - - def _is_complete(self): - """ - Check if the phase is complete. This is the only required function. - - :return: None - """ - raise NotImplementedError - - def _compile_artifacts(self): - """ - Compile artifacts after a completed phase. - """ - logger.debug("compile_artifacts: {}".format(self.__class__.__name__)) - - def _update(self, elapsed_time): - """ - Update the test phase if necessary. - - :param elapsed_time: Time since the last update. - :return: None - """ - logger.debug("update: {}".format(self.__class__.__name__)) - - def _wait(self, launcher): - """ - Wait for the phase to complete. - - :return: None. - :raises: TimeoutError, CrashError - """ - dead_time = -1 - logger.debug("wait begin: {}".format(self.__class__.__name__)) - start = time.time() - - while not self._is_complete(): - - if time.time() - start > self.timeout: - message = "Timeout exceeded {}s in {}".format(self.timeout, self.__class__.__name__) - logger.error(message) - raise exceptions.TimeoutError(message) - elif not launcher.is_alive(): - # The final result may arrive after the app closes. - if dead_time == -1: - dead_time = time.time() - if time.time() - dead_time > _CRASH_TIMEOUT: - message = "Unexpected termination in {} after {:0.2f}s".format( - self.__class__.__name__, time.time() - start) - logger.error(message) - raise exceptions.CrashError(message) - - sleep_start = time.time() - time.sleep(_POLL_INTERVAL_SEC) - - self._update(time.time() - sleep_start) - - logger.debug("wait end: {}, duration: {:.2f}".format(self.__class__.__name__, time.time() - start)) - - -class FileExistsPhase(Phase): - """ - Test phase that completes when a specific file is created. - """ - def __init__(self, path, timeout=60, non_empty=False): - super(FileExistsPhase, self).__init__(timeout) - self.path = path - self.non_empty = non_empty - - def _is_complete(self): - if self.path is not None and os.path.exists(self.path): - if self.non_empty: - return os.path.getsize(self.path) > 0 - else: - return True - - return False - - -class XMLValidPhase(FileExistsPhase): - """ - Test phase that completes when a valid XML file is found. - """ - def __init__(self, path, timeout=60): - super(XMLValidPhase, self).__init__(path, timeout, non_empty=True) - self.path = path - self.xml = None - - def _is_complete(self): - if not super(XMLValidPhase, self)._is_complete(): - return False - - try: - self.xml = xml.etree.ElementTree.parse(self.path) - except xml.etree.ElementTree.ParseError: - return False - - return True - - -class TimePhase(Phase): - """ - Simple class to complete in a specified time. Can be used to test timeout. - """ - def __init__(self, timeout, complete_time): - super(TimePhase, self).__init__(timeout) - self.complete_time = complete_time - - def _start(self, previous_phase=None): - super(TimePhase, self)._start(previous_phase) - self.start_time = time.time() - - def _is_complete(self): - return time.time() - self.start_time > self.complete_time - - -class ElapsedTimePhase(Phase): - """ - Simple class to complete in a specified time using elapsed time. Can be used to test timeout and elapsed time. - """ - def __init__(self, timeout, complete_time): - super(ElapsedTimePhase, self).__init__(timeout) - self.complete_time = complete_time - self.total_time = None - - def _start(self, previous_phase=None): - super(ElapsedTimePhase, self)._start(previous_phase) - self.total_time = 0 - - def _update(self, elapsed_time): - super(ElapsedTimePhase, self)._update(elapsed_time) - self.total_time += elapsed_time - - def _is_complete(self): - return self.total_time > self.complete_time - - -class WaitForLauncherToQuit(Phase): - def __init__(self, launcher, timeout=60): - # type: (Launcher, int) -> None - super(WaitForLauncherToQuit, self).__init__(timeout) - self.launcher = launcher - - def _is_complete(self): - # type: () -> bool - return not self.launcher.is_alive() diff --git a/Tests/ly_shared/pyside_utils.py b/Tests/ly_shared/pyside_utils.py deleted file mode 100755 index 1dfdcdb5c0..0000000000 --- a/Tests/ly_shared/pyside_utils.py +++ /dev/null @@ -1,939 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -import azlmbr.qt -import azlmbr.qt_helpers -import asyncio -import re -from shiboken2 import wrapInstance, getCppPointer -from PySide2 import QtCore, QtWidgets, QtGui, QtTest -from PySide2.QtWidgets import QAction, QWidget -from PySide2.QtCore import Qt -from PySide2.QtTest import QTest -import azlmbr.legacy.general as general -import traceback -import threading -import types - - -qApp = QtWidgets.QApplication.instance() -# Monkey patch static method calls -QtWidgets.QApplication.activeModalWidget = qApp.activeModalWidget - - -class LmbrQtEventLoop(asyncio.AbstractEventLoop): - def __init__(self): - self.running = False - self.shutdown = threading.Event() - self.blocked_events = set() - self.finished_events = set() - self.queue = [] - self._wait_future = None - self._event_loop_nesting = 0 - - def get_debug(self): - return False - - def time(self): - return azlmbr.qt_helpers.time() - - def wait_for_condition(self, condition, action, on_timeout=None, timeout=1.0): - timeout = self.time() + timeout if timeout is not None else None - def callback(time): - # Run our action and remove us from the queue if our condition is satisfied - if condition(): - action() - return True - # Give up if timeout has elapsed - if time > timeout: - if on_timeout is not None: - on_timeout() - return True - return False - self.queue.append((callback)) - - def event_loop(self): - time = self.time() - def run_event(event): - if event in self.blocked_events or event in self.finished_events: - return False - self.blocked_events.add(event) - try: - if event(time): - self.finished_events.add(event) - except Exception: - traceback.print_exc() - self.finished_events.add(event) - finally: - self.blocked_events.remove(event) - - self._event_loop_nesting += 1 - try: - for event in self.queue: - run_event(event) - finally: - self._event_loop_nesting -= 1 - - # Clear out any finished events if the queue is safe to mutate - if self._event_loop_nesting == 0: - self.queue = [event for event in self.queue if event not in self.finished_events] - self.finished_events = set() - - if not self.running or self._wait_future is not None and self._wait_future.done(): - self.close() - - def run_until_shutdown(self): - # Run our event loop callback (via azlmbr.qt_helpers) by pumping the Qt event loop - # azlmbr.qt_helpers will attempt to ensure our event loop is always run, even when a - # new event loop is started and run from the main event loop - self.running = True - self.shutdown.clear() - azlmbr.qt_helpers.set_loop_callback(self.event_loop) - while not self.shutdown.is_set(): - qApp.processEvents(QtCore.QEventLoop.AllEvents, 0) - - def run_forever(self): - self._wait_future = None - self.run_until_shutdown() - - def run_until_complete(self, future): - # Wrap coroutines into Tasks (future-like analogs) - if isinstance(future, types.CoroutineType): - future = self.create_task(future) - self._wait_future = future - self.run_until_shutdown() - - def _timer_handle_cancelled(self, handle): - pass - - def is_running(self): - return self.running - - def is_closed(self): - return not azlmbr.qt_helpers.loop_is_running() - - def stop(self): - self.running = False - - def close(self): - self.running = False - self.shutdown.set() - azlmbr.qt_helpers.clear_loop_callback() - - def shutdown_asyncgens(self): - pass - - def call_exception_handler(self, context): - try: - raise context.get('exception', None) - except: - traceback.print_exc() - - def call_soon(self, callback, *args, **kw): - h = asyncio.Handle(callback, args, self) - def callback_wrapper(time): - if not h.cancelled(): - h._run() - return True - self.queue.append(callback_wrapper) - return h - - def call_later(self, delay, callback, *args, **kw): - if delay < 0: - raise Exception("Can't schedule in the past") - return self.call_at(self.time() + delay, callback, *args) - - def call_at(self, when, callback, *args, **kw): - h = asyncio.TimerHandle(when, callback, args, self) - h._scheduled = True - def callback_wrapper(time): - if time > when: - if not h.cancelled(): - h._run() - return True - return False - self.queue.append(callback_wrapper) - return h - - def create_task(self, coro): - return asyncio.Task(coro, loop=self) - - def create_future(self): - return asyncio.Future(loop=self) - - -class EventLoopTimeoutException(Exception): - pass - - -event_loop = LmbrQtEventLoop() -def wait_for_condition(condition, timeout=1.0): - """ - Asynchronously waits for `condition` to evaluate to True. - condition: A function with the signature def condition() -> bool - This condition will be evaluated until it evaluates to True or the timeout elapses - timeout: The time in seconds to wait - if 0, this will wait forever - Throws pyside_utils.EventLoopTimeoutException on timeout. - """ - future = event_loop.create_future() - def on_complete(): - future.set_result(True) - def on_timeout(): - future.set_exception(EventLoopTimeoutException()) - event_loop.wait_for_condition(condition, on_complete, on_timeout=on_timeout, timeout=timeout) - return future - - -async def wait_for(expression, timeout=1.0): - """ - Asynchronously waits for "expression" to evaluate to a non-None value, - then returns that value. - - expression: A function with the signature def expression() -> Generic[Any,None] - The result of expression will be returned as soon as it returns a non-None value. - timeout: The time in seconds to wait - if 0, this will wait forever - Throws pyside_utils.EventLoopTimeoutException on timeout. - """ - result = None - def condition(): - nonlocal result - result = expression() - return result is not None - await wait_for_condition(condition, timeout) - return result - - -def run_soon(fn): - """ - Runs a function on the event loop to enable asynchronous execution. - - fn: The function to run, should be a function that takes no arguments - Returns a future that will be popualted with the result of fn or the exception it threw. - """ - future = event_loop.create_future() - def coroutine(): - try: - fn() - future.set_result(True) - except Exception as e: - future.set_exception(e) - event_loop.call_soon(coroutine) - return future - - -def run_async(awaitable): - """ - Synchronously runs a coroutine or a future on the event loop. - This can be used in lieu of "await" in non-async functions. - - awaitable: The coroutine or future to await. - Returns the result of operation specified. - """ - if isinstance(awaitable, types.CoroutineType): - awaitable = event_loop.create_task(awaitable) - event_loop.run_until_complete(awaitable) - return awaitable.result() - - -def wrap_async(fn): - """ - This decorator enables an async function's execution from a synchronous one. - - For example: - @pyside_utils.wrap_async - async def foo(): - result = await long_operation() - return result - - def non_async_fn(): - x = foo() # this will return the correct result by executing the event loop - - fn: The function to wrap - Returns the decorated function. - """ - def wrapper(*args, **kw): - result = fn(*args, **kw) - return run_async(result) - return wrapper - - -def get_editor_main_window(): - """ - Fetches the main Editor instance of QMainWindow for use with PySide tests - :return Instance of QMainWindow for the Editor - """ - params = azlmbr.qt.QtForPythonRequestBus(azlmbr.bus.Broadcast, "GetQtBootstrapParameters") - editor_id = QtWidgets.QWidget.find(params.mainWindowId) - main_window = wrapInstance(int(getCppPointer(editor_id)[0]), QtWidgets.QMainWindow) - return main_window - - -def get_action_for_menu_path(editor_window: QtWidgets.QMainWindow, main_menu_item: str, *menu_item_path: str): - """ - main_menu_item: Main menu item among the MenuBar actions. Ex: "File" - menu_item_path: Path to any nested menu item. Ex: "Viewport", "Goto Coordinates" - returns: QAction object for the corresponding path. - """ - # Check if path is valid - menu_bar = editor_window.menuBar() - menu_bar_actions = [index.iconText() for index in menu_bar.actions()] - - # Verify if the given Menu exists in the Menubar - if main_menu_item not in menu_bar_actions: - print(f"QAction not found for main menu item '{main_menu_item}'") - return None - curr_action = menu_bar.actions()[menu_bar_actions.index(main_menu_item)] - curr_menu = curr_action.menu() - for index, element in enumerate(menu_item_path): - curr_menu_actions = [index.iconText() for index in curr_menu.actions()] - if element not in curr_menu_actions: - print(f"QAction not found for menu item '{element}'") - return None - if index == len(menu_item_path) - 1: - return curr_menu.actions()[curr_menu_actions.index(element)] - curr_action = curr_menu.actions()[curr_menu_actions.index(element)] - curr_menu = curr_action.menu() - return None - - -def _pattern_to_dict(pattern, **kw): - """ - Helper function, turns a pattern match parameter into a normalized dictionary - """ - - def is_string_or_regex(x): - return isinstance(x, str) or isinstance(x, re.Pattern) - - # If it's None, just make an empty dict - if pattern is None: - pattern = {} - # If our pattern is a string or regex, turn it into a text match - elif is_string_or_regex(pattern): - pattern = dict(text=pattern) - # If our pattern is an (int, int) tuple, turn it into a row/column match - elif isinstance(pattern, tuple) and isinstance(pattern[0], int) and isinstance(pattern[1], int): - pattern = dict(row=pattern[0], column=pattern[1]) - # If our pattern is a QObject type, turn it into a type match - elif isinstance(pattern, type(QtCore.QObject)): - pattern = dict(type=pattern) - # Otherwise assume it's a dict and make a copy - else: - pattern = dict(pattern) - - # Merge with any kw arguments - for key, value in kw.items(): - pattern[key] = value - return pattern - - -def _match_pattern(obj, pattern): - """ - Helper function, determines whether obj matches the pattern specified by pattern. - - It is required that pattern is normalized into a dict before calling this. - """ - - def compare(value1, value2): - # Do a regex search if it's a regex, otherwise do a normal compare - if isinstance(value2, re.Pattern): - return re.search(value2, value1) - return value1 == value2 - - item_roles = Qt.ItemDataRole.values.values() - for key, value in pattern.items(): - if key == "type": # Class type - if not isinstance(obj, value): - return False - elif key == "text": # Default 'text' path, depends on type - text_values = [] - - def get_from_attrs(*args): - for attr in args: - try: - text_values.append(getattr(obj, attr)()) - except Exception: - pass - - # Use any of the following fields for default matching, if they're defined - get_from_attrs("text", "objectName", "windowTitle") - # Additionally, use the DisplayRole for QModelIndexes - if isinstance(obj, QtCore.QModelIndex): - text_values.append(obj.data(Qt.DisplayRole)) - - if not any(compare(text, value) for text in text_values): - return False - elif key in item_roles: # QAbstractItemModel display role - if not isinstance(obj, QtCore.QModelIndex): - raise RuntimeError(f"Attempted to match data role on unsupported object {obj}") - if not compare(obj.data(key), value): - return False - elif hasattr(obj, key): - # Look up our key on the object itself - objectValue = getattr(obj, key) - # Invoke it if it's a getter - if callable(objectValue): - objectValue = objectValue() - if not compare(objectValue, value): - return False - else: - return False - - return True - - -def get_child_indexes(model, parent_index=QtCore.QModelIndex()): - indexes = [parent_index] - while len(indexes) > 0: - parent_index = indexes.pop(0) - for row in range(model.rowCount(parent_index)): - # FIXME - # PySide appears to have a bug where-in it thinks columnCount is private - # Bail gracefully for now, we can add a C++ wrapper to work around if needed - try: - column_count = model.columnCount(parent_index) - except Exception: - column_count = 1 - for col in range(column_count): - cur_index = model.index(row, col, parent_index) - yield cur_index - - -def _get_children(obj): - """ - Helper function. Get the direct descendants from a given PySide object. - This includes all: QObject children, QActions owned by the object, and QModelIndexes if applicable - """ - if isinstance(obj, QtCore.QObject): - yield from obj.children() - if isinstance(obj, QtWidgets.QWidget): - yield from obj.actions() - if isinstance(obj, (QtWidgets.QAbstractItemView, QtCore.QModelIndex)): - model = obj.model() - if model is None: - return - - # For a QAbstractItemView (e.g. QTreeView, QListView), the parent index - # will be an invalid QModelIndex(), which will use find all indexes on the root. - # For a QModelIndex, we use the actual QModelIndex as the parent_index so that - # it will find any child indexes under it - parent_index = QtCore.QModelIndex() - if isinstance(obj, QtCore.QModelIndex): - parent_index = obj - - yield from get_child_indexes(model, parent_index) - - -def _get_parents_to_search(obj_entry_or_list): - """ - Helper function, turns obj_entry_or_list into a list of parents to search - - If obj_entry_or_list is None, returns all visible top level widgets - If obj_entry_or_list is iterable, return it as a list - Otherwise, return a list containing obj_entry_or_list - """ - if obj_entry_or_list is None: - return [widget for widget in QtWidgets.QApplication.topLevelWidgets() if widget.isVisible()] - try: - return list(obj_entry_or_list) - except TypeError: - return [obj_entry_or_list] - - -def find_children_by_pattern(obj=None, pattern=None, recursive=True, **kw): - """ - Finds the children of an object that match a given pattern. - See find_child_by_pattern for more information on usage. - """ - pattern = _pattern_to_dict(pattern, **kw) - parents_to_search = _get_parents_to_search(obj) - - while len(parents_to_search) > 0: - parent = parents_to_search.pop(0) - for child in _get_children(parent): - if _match_pattern(child, pattern): - yield child - if recursive: - parents_to_search.append(child) - - -def find_child_by_pattern(obj=None, pattern=None, recursive=True, **kw): - """ - Finds the child of an object that matches a given pattern. - A "child" in this context is not necessarily a QObject child. - QActions are also considered children, as are the QModelIndex children of QAbstractItemViews. - obj: The object to search - should be either a QObject or a QModelIndex, or a list of them - If None this will search all top level windows. - pattern: The pattern to match, the first child that matches all of the criteria specified will - be returned. This is a dictionary with any combination of the following: - - - "text": generic text to match, will search object names for QObjects, display role text - for QModelIndexes, or action text() for QActions - - "type": a class type, e.g. QtWidgets.QMenu, a child will only match if it's of this type - - "row" / "column": integer row and column indices of a QModelIndex - - "type": type class (e.g. PySide.QtWidgets.QComboBox) that the object must inherit from - - A Qt.ItemDataRole: matches for QModelIndexes with data of a given value - - Any other fields will fall back on being looked up on the object itself by name, e.g. - {"windowTitle": "Foo"} would match a windowTitle named "Foo" - - Any instances where a field is specified as text can also be specified as a regular expression: - find_child_by_pattern(obj, {text: re.compile("Foo_.*")}) would find a child with text starting - with "Foo_" - - For convenience, these parameter types may also be specified as keyword arguments: - find_child_by_pattern(obj, text="foo", type=QtWidgets.QAction) - is equivalent to - find_child_by_pattern(obj, {"text": "foo", "type": QtWidgets.QAction}) - - If pattern is specified as a string, it will turn into a pattern matching "text": - find_child_by_pattern(obj, "foo") - is equivalent to - find_child_by_pattern(obj, {"text": "foo"}) - - If a pattern is specified as an (int, int) tuple, it will turn into a row/column match: - find_child_by_pattern(obj, (0, 2)) - is equivalent to - find_child_by_pattern(obj, {"row": 0, "column": 2}) - - If a pattern is specified as a type, like PySide.QtWidgets.QLabel, it will turn into a type match: - find_child_by_pattern(obj, PySide.QtWidgets.QLabel) - is equivalent to - find_child_by_pattern(obj, {"type": PySide.QtWidgets.QLabel}) - """ - # Return the first match result, if found - for match in find_children_by_pattern(obj, pattern=pattern, recursive=recursive, **kw): - return match - return None - - -def find_child_by_hierarchy(parent, *patterns): - """ - Searches for a hierarchy of children descending from parent. - parent: The Qt object (or list of Qt obejcts) to search within - If none, this will search all top level windows. - patterns: A list of patterns to match to find a hierarchy of descendants. - These patterns will be tested in order. - - For example, to look for the QComboBox in a hierarchy like the following: - QWidget (window) - -QTabWidget - -QWidget named "m_exampleTab" - -QComboBox - One might invoke: - find_child_by_hierarchy(window, QtWidgets.QTabWidget, "m_exampleTab", QtWidgets.QComboBox) - - Alternatively, "..." may be specified in place of a parent, where the hierarchy will match any - ancestors along the path, so the above might be shortened to: - find_child_by_hierarchy(window, ..., "m_exampleTab", QtWidgets.QComboBox) - """ - search_recursively = False - current_objects = _get_parents_to_search(parent) - for pattern in patterns: - # If it's an ellipsis, do the next search recursively as we're looking for any number of intermediate ancestors - if pattern is ...: - search_recursively = True - continue - - candidates = [] - for parent_candidate in current_objects: - candidates += find_children_by_pattern(parent_candidate, pattern=pattern, recursive=search_recursively) - if len(candidates) == 0: - return None - current_objects = candidates - - search_recursively = False - return current_objects[0] - -async def wait_for_child_by_hierarchy(parent, *patterns, timeout=1.0): - """ - Searches for a hierarchy of children descending from parent until timeout occurs. - Returns a future that will result in either the found child or an EventLoopTimeoutException. - - See find_child_by_hierarchy for usage information. - """ - match = None - def condition(): - nonlocal match - match = find_child_by_hierarchy(parent, *patterns) - return match is not None - await wait_for_condition(condition, timeout) - return match - - -async def wait_for_child_by_pattern(obj=None, pattern=None, recursive=True, timeout=1.0, **kw): - """ - Finds the child of an object that matches a given pattern. - Returns a future that will result in either the found child or an EventLoopTimeoutException. - - See find_child_by_hierarchy for usage information. - """ - match = None - def condition(): - nonlocal match - match = find_child_by_pattern(obj, pattern, recursive, **kw) - return match is not None - await wait_for_condition(condition, timeout) - return match - - -def find_child_by_property(obj, obj_type, property_name, property_value, reg_exp_search=False): - """ - Finds the child of an object which has the property name matching the property value - of type obj_type - obj: The property value is searched through obj children - obj_type: Type of object to be matched - property_name: Property of the child which should be verified for the required value. - property_value: Property value that needs to be matched - reg_exp_search: If True searches for the property_value based on re search. Defaults to False. - """ - for child in obj.children(): - if reg_exp_search and re.search(property_value, getattr(child, property_name)()): - return child - if not reg_exp_search and isinstance(child, obj_type) and getattr(child, property_name)() == property_value: - return child - return None - -def get_item_view_index(item_view, row, column=0, parent=QtCore.QModelIndex()): - """ - Retrieve the index for a specified row/column, with optional parent - This is necessary when needing to reference into nested hierarchies in a QTreeView - item_view: The QAbstractItemView instance - row: The requested row index - column: The requested column index (defaults to 0 in case of single column) - parent: Parent index (defaults to invalid) - """ - item_model = item_view.model() - model_index = item_model.index(row, column, parent) - return model_index - - -def get_item_view_index_rect(item_view, index): - """ - Gets the QRect for a given index in a QAbstractItemView (e.g. QTreeView, QTableView, QListView). - This is helpful because for sending mouse events to a QAbstractItemView, you have to send them to - the viewport() widget of the QAbstractItemView. - item_view: The QAbstractItemView instance - index: A QModelIndex for the item index - """ - return item_view.visualRect(index) - - -def item_view_index_mouse_click(item_view, index, button=QtCore.Qt.LeftButton, modifier=QtCore.Qt.NoModifier): - """ - Helper method version of QTest.mouseClick for injecting mouse clicks on a QAbstractItemView - item_view: The QAbstractItemView instance - index: A QModelIndex for the item index to be clicked - """ - item_index_rect = get_item_view_index_rect(item_view, index) - item_index_center = item_index_rect.center() - - # For QAbstractItemView widgets, the events need to be forwarded to the actual viewport() widget - QTest.mouseClick(item_view.viewport(), button, modifier, item_index_center) - - -def item_view_mouse_click(item_view, row, column=0, button=QtCore.Qt.LeftButton, modifier=QtCore.Qt.NoModifier): - """ - Helper method version of 'item_view_index_mouse_click' using a row, column instead of a QModelIndex - item_view: The QAbstractItemView instance - row: The requested row index - column: The requested column index (defaults to 0 in case of single column) - """ - index = get_item_view_index(item_view, row, column) - item_view_index_mouse_click(item_view, index, button, modifier) - - -async def wait_for_action_in_menu(menu, pattern, timeout=1.0): - """ - Finds a QAction inside a menu, based on the specified pattern. - - menu: The QMenu to search - pattern: The action text or pattern to match (see find_child_by_pattern) - If pattern specifies a QWidget, this will search for the associated QWidgetAction - """ - action = await wait_for_child_by_pattern(menu, pattern, timeout=timeout) - if action is None: - raise TimeoutError(f"Failed to find context menu action for {pattern}") - - # If we've found a valid QAction, we're good to go - if hasattr(action, 'trigger'): - return action - - # If pattern matches a widget and not a QAction, look for an associated QWidgetAction - widget_actions = find_children_by_pattern(menu, type=QtWidgets.QWidgetAction) - underlying_widget_action = None - for widget_action in widget_actions: - widgets_to_check = [widget_action.defaultWidget()] + widget_action.createdWidgets() - for check_widget in widgets_to_check: - if action in _get_children(check_widget): - underlying_widget_action = widget_action - break - if underlying_widget_action is not None: - action = underlying_widget_action - break - - if not hasattr(action, 'trigger'): - raise RuntimeError(f"Failed to find action associated with widget {action}") - return action - - -def queue_hide_event(widget): - """ - Explicitly post a hide event for the next frame, this can be used to ensure modal dialogs exit correctly. - - widget: The widget to hide - """ - qApp.postEvent(widget, QtGui.QHideEvent()) - - -async def wait_for_destroyed(obj, timeout=1.0): - """ - Waits for a QObject (including a widget) to be fully destroyed - - This can be used to wait for a modal dialog to shut down properly - - obj: The object to wait on destruction - timeout: The time, in seconds to wait. 0 for an indefinite wait. - """ - was_destroyed = False - def on_destroyed(): - nonlocal was_destroyed - was_destroyed = True - obj.destroyed.connect(on_destroyed) - return await wait_for_condition(lambda: was_destroyed, timeout=timeout) - - -async def close_modal(modal_widget, timeout=1.0): - """ - Closes a modal dialog and waits for it to be cleaned up. - - This attempts to ensure the modal event loop gets properly exited. - - modal_widget: The widget to close - timeout: The time, in seconds, to wait. 0 for an indefinite wait. - """ - queue_hide_event(modal_widget) - return await wait_for_destroyed(modal_widget, timeout=timeout) - - -def trigger_context_menu_entry(widget, pattern, pos=None, index=None): - """ - Trigger a context menu event on a widget and activate an entry - widget: The widget to trigger the event on - pattern: The action text or pattern to match (see find_child_by_pattern) - pos: Optional, the QPoint to set as the event origin - index: Optional, the QModelIndex to click in widget - widget must be a QAbstractItemView - """ - async def async_wrapper(): - menu = await open_context_menu(widget, pos=pos, index=index) - action = await wait_for_action_in_menu(menu, pattern) - action.trigger() - queue_hide_event(menu) - - result = async_wrapper() - # If we have an event loop, go ahead and just return the coroutine - # Otherwise, do a synchronous wait - if event_loop.is_running(): - return result - else: - return run_async(result) - - -async def open_context_menu(widget, pos=None, index=None, timeout=1.0): - """ - Trigger a context menu event on a widget - widget: The widget to trigger the event on - pos: Optional, the QPoint to set as the event origin - index: Optional, the QModelIndex to click in widget - widget must be a QAbstractItemView - - Returns the menu that was created. - """ - if index is not None: - if pos is not None: - raise RuntimeError("Error: 'index' and 'pos' are mutually exclusive") - pos = widget.visualRect(index).center() - parent = widget - widget = widget.viewport() - pos = widget.mapFrom(parent, pos) - if pos is None: - pos = widget.rect().center() - - # Post both a mouse event and a context menu to let the widget handle whichever is appropriate - qApp.postEvent(widget, QtGui.QContextMenuEvent(QtGui.QContextMenuEvent.Mouse, pos)) - QtTest.QTest.mouseClick(widget, Qt.RightButton, Qt.NoModifier, pos) - - menu = None - # Wait for a menu popup - def menu_has_focus(): - nonlocal menu - for fw in [qApp.activePopupWidget(), qApp.activeModalWidget(), qApp.focusWidget(), qApp.activeWindow()]: - if fw and isinstance(fw, QtWidgets.QMenu) and fw.isVisible(): - menu = fw - return True - return False - await wait_for_condition(menu_has_focus, timeout) - return menu - - -def move_mouse(widget, position): - """ - Helper method to move the mouse to a specified position on a widget - widget: The widget to trigger the event on - position: The QPoint (local to widget) to move the mouse to - """ - # For some reason, Qt wouldn't register the mouse movement correctly unless both of these ways are invoked. - # The QTest.mouseMove seems to update the global cursor position, but doesn't always result in the MouseMove event being - # triggered, which prevents drag/drop being able to be simulated. - # Similarly, if only the MouseMove event is sent by itself to the core application, the global cursor position wasn't - # updated properly, so drag/drop logic that depends on grabbing the globalPos didn't work. - QtTest.QTest.mouseMove(widget, position) - event = QtGui.QMouseEvent(QtCore.QEvent.MouseMove, position, widget.mapToGlobal(position), QtCore.Qt.LeftButton, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier) - QtCore.QCoreApplication.sendEvent(widget, event) - - -def drag_and_drop(source, target, source_point = QtCore.QPoint(), target_point = QtCore.QPoint()): - """ - Simulate a drag/drop event from a source object to a specified target - This has special case handling if the source is a QDockWidget (for docking) vs normal drag/drop - source: The source object to initiate the drag from - This is either a QWidget, or a tuple of (QAbstractItemView, QModelIndex) for dragging an item view item - target: The target object to drop on after dragging - This is either a QWidget, or a tuple of (QAbstractItemView, QModelIndex) for dropping on an item view item - source_point: Optional, The QPoint to initiate the drag from. If none is specified, the center of the source will be used. - target_point: Optional, The QPoint to drop on. If none is specified, the center of the target will be used. - """ - # Flag if this drag/drop is for docking, which has some special cases - docking = False - - # If the source is a tuple of (QAbstractItemView, QModelIndex), we need to use the - # viewport() as the source, and find the location of the index - if isinstance(source, tuple) and len(source) == 2: - source_item_view = source[0] - source_widget = source_item_view.viewport() - source_model_index = source[1] - source_rect = source_item_view.visualRect(source_model_index) - else: - # There are some special case actions if we are doing this drag for docking, - # so figure this out by checking if the source is a QDockWidget - if isinstance(source, QtWidgets.QDockWidget): - docking = True - - source_widget = source - source_rect = source.rect() - - # If the target is a tuple of (QAbstractItemView, QModelIndex), we need to use the - # viewport() as the target, and find the location of the index - if isinstance(target, tuple) and len(target) == 2: - target_item_view = target[0] - target_widget = target_item_view.viewport() - target_model_index = target[1] - target_rect = target_item_view.visualRect(target_model_index) - else: - # If we are doing a drag for docking, we actually want all the mouse events - # to still be directed through the source widget - if docking: - target_widget = source_widget - else: - target_widget = target - target_rect = target.rect() - - # If no source_point is specified, we need to find the center point of - # the source widget - if source_point.isNull(): - # If we are dragging for docking, initiate the drag from the center of the - # dock widget title bar - if docking: - title_bar_widget = source.titleBarWidget() - if title_bar_widget: - source_point = title_bar_widget.geometry().center() - else: - raise RuntimeError("No titleBarWidget found for QDockWidget") - # Otherwise, can just find the center of the rect - else: - source_point = source_rect.center() - - # If no target_point was specified, we need to find the center point of the target widget - if target_point.isNull(): - target_point = target_rect.center() - - # If we are dragging for docking and we aren't dragging within the same source/target, - # the mouse movements need to be directed to the source_widget, so we need to use the - # difference in global positions of our source and target widgets to adjust the target_point - # to be relative to the source - if docking and source != target: - source_top_left = source.mapToGlobal(QtCore.QPoint(0, 0)) - target_top_left = target.mapToGlobal(QtCore.QPoint(0, 0)) - offset = target_top_left - source_top_left - target_point += offset - - # Move the mouse to the source spot where we will start the drag - move_mouse(source_widget, source_point) - - # Press the left-mouse button to begin the drag - QtTest.QTest.mousePress(source_widget, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier, source_point) - - # If we are dragging for docking, we first need to drag the mouse past the minimum distance to - # trigger the docking system properly - if docking: - drag_distance = QtWidgets.QApplication.startDragDistance() + 1 - docking_trigger_point = source_point + QtCore.QPoint(drag_distance, drag_distance) - move_mouse(source_widget, docking_trigger_point) - - # Drag the mouse to the target widget over the desired point - move_mouse(target_widget, target_point) - - # Release the left-mouse button to complete the drop. - # If we are docking, we need to delay the actual mouse button release because the docking system has - # a delay before the drop zone becomes active after it has been hovered, which can be found here: - # FancyDockingDropZoneConstants::dockingTargetDelayMS = 110 ms - # So we need to delay greater than dockingTargetDelayMS after the final mouse move - # over the intended target. - delay = -1 - if docking: - delay = 200 - QtTest.QTest.mouseRelease(target_widget, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier, target_point, delay) - - # Some drag/drop events have extra processing on the following event tick, so let those processEvents - # first before we complete the drag/drop operation - QtWidgets.QApplication.processEvents() - - -def trigger_action_async(action): - """ - Convenience function. Triggers an action asynchronously. - This can be used if calling action.trigger might block (e.g. if it opens a modal dialog) - - action: The action to trigger - """ - return run_soon(lambda: action.trigger()) - - -def click_button_async(button): - """ - Convenience function. Clicks a button asynchronously. - This can be used if calling button.click might block (e.g. if it opens a modal dialog) - - button: The button to click - """ - return run_soon(lambda: button.click()) - - -async def wait_for_modal_widget(timeout=1.0): - """ - Waits for an active modal widget and returns it. - """ - return await wait_for(lambda: qApp.activeModalWidget(), timeout=timeout) - -async def wait_for_popup_widget(timeout=1.0): - """ - Waits for an active popup widget and returns it. - """ - return await wait_for(lambda: qApp.activePopupWidget(), timeout=timeout) \ No newline at end of file diff --git a/Tests/ly_shared/s3_utils.py b/Tests/ly_shared/s3_utils.py deleted file mode 100755 index 5c516094f3..0000000000 --- a/Tests/ly_shared/s3_utils.py +++ /dev/null @@ -1,131 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" -import pytest -pytest.importorskip("boto3") -import boto3 -import botocore.exceptions -import logging -import os - -import ly_test_tools.environment.file_system as file_system - -logger = logging.getLogger(__name__) - - -class KeyExistsError(Exception): - pass - - -class KeyDoesNotExistError(Exception): - pass - - -class S3Utils(object): - """ - Stores a boto3 S3 client to use for AWS S3 functionalities. - """ - DEFAULT_REGION = 'us-west-2' - - def __init__(self, boto3_session=None): - # type: (boto3.Session) -> None - """ - The boto3 session can be set during init, or a default one will be created. - :param boto3_session: A boto3 session - """ - if boto3_session: - self._session = boto3_session - else: - logger.info("No session provided, using default profile for s3 resource") - self._session = boto3.session.Session() - self._s3_resource = self._session.resource('s3') - - def upload_to_bucket(self, bucket_name, file_path, overwrite=False): - """ - Uploads a given file to the given S3 bucket. - :param bucket_name: Name of the S3 bucket where the file should be uploaded. - :param file_path: Path to the target file. - :param overwrite: Overwrite the key if it exists. - """ - if not self.bucket_exists_in_s3(bucket_name): - self._s3_resource.create_bucket(Bucket=bucket_name) - - s3_bucket = self._s3_resource.Bucket(bucket_name) - - file_key = os.path.basename(file_path) - if not overwrite and self.key_exists_in_bucket(bucket_name, file_key): - raise KeyExistsError("Key '{}' already exists in S3 bucket {}".format(file_key, bucket_name)) - - s3_bucket.upload_file(file_path, file_key) - logger.info("Uploading {} to S3 bucket {}".format(file_key, bucket_name)) - - def download_from_bucket(self, bucket_name, file_key, destination_dir, file_name=None): - """ - Download the given key from the given S3 bucket to the given destination. Logs an error if there is not enough \ - space available for the download. - :param bucket_name: Name of the S3 bucket containing the desired file. - :param file_key: Name of the file stored in S3. - :param destination_dir: Directory where the file should be downloaded to. - :param file_name: The name of the file you want to save it as. Defaults to the file_key. - """ - self.bucket_exists_in_s3(bucket_name) - - if not self.key_exists_in_bucket(bucket_name, file_key): - raise KeyDoesNotExistError("Key '{}' does not exist in S3 bucket {}".format(file_key, bucket_name)) - - obj_summary = self._s3_resource.ObjectSummary(bucket_name, file_key) - required_space = obj_summary.size - - file_system.check_free_space(destination_dir, required_space, "Insufficient space available for download:") - - if not os.path.exists(destination_dir): - os.makedirs(destination_dir) - - if file_name is None: - file_name = file_key - destination_path = os.path.join(destination_dir, file_name) - self._s3_resource.Object(bucket_name, file_key).download_file(destination_path) - logger.info("Downloading {} to {}".format(file_key, destination_path)) - - def bucket_exists_in_s3(self, bucket_name): - """ - Verifies that the S3 bucket exists. - :param bucket_name: Name of the S3 bucket that may or may not exist. - :return: True if the bucket exists. False otherwise. - """ - bucket_exists = True - - try: - self._s3_resource.meta.client.head_bucket(Bucket=bucket_name) - except botocore.exceptions.ClientError as err: - if err.response['Error']['Code'] == '404': - bucket_exists = False - - return bucket_exists - - def key_exists_in_bucket(self, bucket_name, file_key): - """ - Verifies that the given key does not already exist in the given S3 bucket. - :param bucket_name: Name of the S3 bucket that may or may not contain the file key. - :param file_key: Name of the file key in question. - :return: True if the key exists. False otherwise. - """ - key_exists = True - obj_summary = self._s3_resource.ObjectSummary(bucket_name, file_key) - - # Attempting to access any member of ObjectSummary for a nonexistent key will throw an exception - # There is no built-in way to check key existence otherwise - try: - obj_summary.size - except botocore.exceptions.ClientError as err: - if err.response['Error']['Code'] == '404': - key_exists = False - - return key_exists diff --git a/Tests/ly_shared/screenshot_utils.py b/Tests/ly_shared/screenshot_utils.py deleted file mode 100755 index c000cd8258..0000000000 --- a/Tests/ly_shared/screenshot_utils.py +++ /dev/null @@ -1,195 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -import os -import string - -from .file_utils import move_file -from . import phase as phase -from ly_test_tools.environment.waiter import wait_for -from ly_test_tools.image.screenshot_compare_qssim import qssim as compare_screenshots - -from ly_remote_console.remote_console_commands import capture_screenshot_command as capture_screenshot_command -from ly_remote_console.remote_console_commands import send_command_and_expect_response as send_command_and_expect_response - - -def get_next_screenshot_at_path(screenshot_path, prefix='screenshot', num_digits=4): - """ - :param screenshot_path: Root folder where the screenshots are being generated by the Launcher pr Editor. - :param prefix: Generated screenshot files are named sequentially using the prefix. - e.g: screenshot0000.jpg, screenshot0001.jpg and so on. - :param num_digits: How many digits are used for file name formation. - :return: A string with the file name (relative to screenshot_path). - """ - max_counter = 10**num_digits - counter = 0 - while counter < max_counter: - numberstr = "{}".format(counter) - formattednumber = numberstr.zfill(num_digits) - filename = "{}{}.jpg".format(prefix, formattednumber) - filepath = os.path.join(screenshot_path, filename) - if not os.path.exists(filepath): - #This filename is available. - return filename - raise AssertionError("All possible screenshot names at directory {} are taken".format(screenshot_path)) - - -def take_screenshot(remote_console_instance, workspace, screenshot_name): - """ - Takes an in game screenshot using the remote console instance passed in, validates that the screenshot exists - and then renames that screenshot to something defined by the user of this function. - :param remote_console_instance: Remote console instance that is attached to a specific launcher instance - :param workspace: workspace instance so we can get the platform cache folder. - :param screenshot_name: Name of the screenshot - :return: None - """ - screenshot_path = os.path.join(workspace.paths.platform_cache(), 'user', 'screenshots') - expected_screenshot_name = get_next_screenshot_at_path(screenshot_path) - capture_screenshot_command(remote_console_instance) - wait_for(lambda: os.path.exists(os.path.join(screenshot_path, expected_screenshot_name)), - timeout=10, - exc=AssertionError('Screenshot at path:{} and with name:{} not found.'.format(screenshot_path, expected_screenshot_name)) ) - wait_for(lambda: rename_screenshot(screenshot_path, screenshot_name), - timeout=10, - exc=AssertionError('Screenshot at path:{} and with name:{} is still in use.'.format(screenshot_path, screenshot_name))) - - -def rename_screenshot(screenshot_path, screenshot_name): - """ - Tries to rename the screenshot when the file is done being written to - :param screenshot_path: Path to the Screenshot folder - :param screenshot_name: Name we wish to change the screenshot to - :return: True when operation is completed, False if the file is still in use - """ - try: - src_img = os.path.join(screenshot_path, 'screenshot0000.jpg') - dst_img = os.path.join(screenshot_path, '{}.jpg'.format(screenshot_name)) - print('Trying to rename {} to {}'.format(src_img, dst_img)) - os.rename(src_img, dst_img) - return True - except Exception as e: - print('Found error {0} when trying to rename screenshot.'.format(str(e))) - return False - - -def move_screenshots(screenshot_path, file_type, logs_path): - """ - Moves screenshots of a specific file type to the flume location so we can gather all of the screenshots we took. - :param screenshot_path: Path to the screenshot folder - :param file_type: Types of Files to look for. IE .jpg, .tif, etc - :param logs_path: Path where flume gathers logs to be upload - """ - for file_name in os.listdir(screenshot_path): - if file_name.endswith(file_type): - move_file(screenshot_path, logs_path, file_name) - -def move_screenshots_to_artifacts(screenshot_path, file_type, artifact_manager): - """ - Saves screenshots of a specific file type to the artifact manager then removes the original files - :param screenshot_path: Path to the screenshot folder - :param file_type: Types of Files to look for. IE .jpg, .tif, etc - :param artifact_manager: The artifact manager to save the artifacts to - """ - for file_name in os.listdir(screenshot_path): - if file_name.endswith(file_type): - full_path_name = os.path.join(screenshot_path, file_name) - artifact_manager.save_artifact(full_path_name) - os.remove(full_path_name) - - - -def compare_golden_image(similarity_threshold, screenshot, screenshot_path, golden_image_name, - golden_image_path=None): - """ - This function assumes that your golden image filename contains the same base screenshot name and the word "golden" - ex. pc_gamelobby_golden - - :param similarity_threshold: A float from 0.0 - 1.0 that determines how similar images must be or an asserts - :param screenshot: A string that is the full name of the screenshot (ex. 'gamelobby_host.jpg') - :param screenshot_path: A string that contains the path to the screenshots - :param golden_image_path: A string that contains the path to the golden images, defaults to the screenshot_path - :return: - """ - if golden_image_path is None: - golden_image_path = screenshot_path - - mean_similarity = compare_screenshots((os.path.join(screenshot_path, screenshot)), - (os.path.join(golden_image_path, golden_image_name))) - assert mean_similarity > similarity_threshold, \ - '{} screenshot comparison failed! Mean similarity value is: {}'\ - .format(screenshot, mean_similarity) - -def download_qa_golden_images(project_name, destination_dir, platform): - """ - Downloads the golden images for a specified project from s3. The project_name, platform, and filetype are used to - filter which images will be downloaded as the golden images. - - https://s3.console.aws.amazon.com/s3/buckets/ly-qae-jenkins-configs/golden-images/?region=us-west-1&tab=overview - - :param project_name: a string of the project name of the folder in s3. ex: 'MultiplayerSample' - :param destination_dir: a string of where the images will be downloaded to - :param platform: a string for the platform type ('pc', 'android', 'ios', 'darwin') - :param filetype: a string for the file type. ex: '.jpg', '.png' - :return: - """ - - # Currently we import s3_utils here instead of at the top because this is the only method that needs it, - # and s3_utils has an unmet dependency on boto3 that hasn't been resolved. Once s3_utils is functional again, - # this can move back to the top of the file. - try: - from . import s3_utils as s3_utils - except ImportError: - raise Exception("Failed to import s3_utils") - # end s3_utils import - - bucket_name = 'ly-qae-jenkins-configs' - path = 'golden-images/{}/{}/'.format(project_name, platform) - - if not s3_utils.key_exists_in_bucket(bucket_name, path): - raise s3_utils.KeyDoesNotExistError("Key '{}' does not exist in S3 bucket {}".format(path, bucket_name)) - for image in s3_utils.s3.Bucket(bucket_name).objects.filter(Prefix=path): - file_name = string.replace(image.key, path, '') - if file_name != '': - s3_utils.download_from_bucket(bucket_name, image.key, destination_dir, file_name) - - -def _retry_command(remote_console_instance, command, output, tries=10, timeout=10): - """ - Retries specified console command multiple times and asserts if it still can not send. - :param remote_console: the remote console connected to the launcher. - :param command: the command to send to the console. - :param output: The expected output to check if the command was sent successfully. - :param tries: The amount of times to try before asserting. - :param timeout: The amount of time in seconds to wait for each retry send. - :return: True if succeeded, will assert otherwise. - """ - while tries > 0: - tries -= 1 - try: - send_command_and_expect_response(remote_console_instance, command, output) - return True - except: - pass #Do nothing. Let the number of tries get to 0 if necessary. - assert False, "Command \"{}\" failed to run in remote console.".format(command) - - -def prepare_for_screenshot_compare(remote_console_instance): - """ - Prepares launcher for screenshot comparison. Removes any debug text and antialiasing that may result in interference - with the comparison. - - :param remote_console_instance: Remote console instance that is attached to a specific launcher instance - :return: - """ - wait_for(lambda: _retry_command(remote_console_instance, 'r_displayinfo 0', - '$3r_DisplayInfo = $60 $5[DUMPTODISK, RESTRICTEDMODE]$4')) - wait_for(lambda: _retry_command(remote_console_instance, 'r_antialiasingmode 0', - '$3r_AntialiasingMode = $60 $5[]$4')) diff --git a/Tests/performance/Scripts/apbatch_perf_summary.py b/Tests/performance/Scripts/apbatch_perf_summary.py deleted file mode 100755 index ed34cbf490..0000000000 --- a/Tests/performance/Scripts/apbatch_perf_summary.py +++ /dev/null @@ -1,211 +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. -""" - -""" -Script is designed to help with asset processor performance testing. - -This script is capable of running AssetProcessorBatch.exe and -calculating how much time did it take to execute it. Also it is -processing ap batch output and grabbing actual asset processing time. - -Apart from that script is capable of logging folder size -(files, folders, actual size in bytes). - -Usage: -python apbatch_perf_summary.py [-h] {folder_size,run_apbatch} - -python apbatch_perf_summary.py folder_size path project -cache - -Will show folder size: files, folders and actual size in bytes. - -build_path: Full path to the build dev directory, e.g. F:\builds\lumberyard-0.0-639162-pc-1985\dev -project: Full project name (e.g. StarterGame or SamplesProject). --cache: specify if you need to check cache folder instead of source assets. - -python apbatch_perf_summary.py run_apbatch build_path platform num_launches -delete_cache - -Will launch AssetProcessorBatch.exe num_launches times. Will return average -running time and average asset processing time. - -build_path: Full path to the build dev directory, e.g. F:\builds\lumberyard-0.0-639162-pc-1985\dev -platform: Which platform to launch - one of following: vc141, vc142, mac -num_launches: How many times do you want to launch ap batch. --delete_cache: specify if you want to delete Cache before each run -""" - - -import subprocess -import time -import os -import argparse -import test_tools.shared.file_system as fs -import errno - - -def run_ap_batch(build_path, platform): - """ - Given a path to build will run ap batch and return total running and processing times. - :param build_path: Full path to build dev, e.g. F:\builds\lumberyard-0.0-639162-pc-1985\dev - :param platform: Specify platform where to run apbatch: vc141, vc142 or mac. - :return: (processing_time, total_running_time) tuple. - """ - assert os.path.exists(build_path) - - now = time.time() - process = subprocess.Popen(['AssetProcessorBatch'], cwd=os.path.join(build_path, platform), - shell=True, stdout=subprocess.PIPE) - for line in iter(process.stdout.readline, ''): - if 'Total Assets Processing Time' in line: - processing_time = line.split(':')[2] - process.wait() - end = time.time() - - print 'Processing time: {}'.format(processing_time.strip()) - print 'Total time: {}s'.format(end - now) - - return float(processing_time.split('s')[0]), float(end - now) - - -def run_several_times(build_path, platform, num_launches, erase_cache): - """ - Given path to build, project name and boolean parameter (whether there is need to delete a cache) - will run AssetProcessorBatch.exe num_launches and will return average running and processing times. - :param build_path: Full path to build dev, e.g. F:\builds\lumberyard-0.0-639162-pc-1985\dev - :param platform: Specify platform where to run apbatch: vc141, vc142 or mac. - :param num_launches: How many times user needs to launch ap batch. - :param erase_cache: yes/no or True/False in case user needs Cache folder to be deleted prior to apbatch launch. - :return: (avg_processing_time, avg_running_time) tuple. - """ - if not os.path.exists(build_path): - raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), build_path) - - average_processing_time = 0 - average_total_time = 0 - - # running apbatch num_launches times and getting times - for i in range(num_launches): - if erase_cache and os.path.exists(os.path.join(build_path, 'Cache')): - fs.delete([os.path.join(build_path, 'Cache')], False, True) - print 'Iteration # {}'.format(i) - processing_time, total_time = run_ap_batch(build_path, platform) - average_processing_time += processing_time - average_total_time += total_time - - # calculating average times - average_processing_time /= num_launches - average_total_time /= num_launches - - return average_processing_time, average_total_time - - -def folder_size(path): - """ - Given path to a build will calculate folder size. - :param path: Full path to the folder for which you need folder size info. - :return: (total_files_count, total_folders_count, total_size_in_bytes). - """ - total_size = 0 - total_files_count = 0 - total_folder_count = 0 - - if not os.path.exists(path): - raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), path) - - # walking over the folder and calculating files, folder; total files size - for dirpath, dirnames, filenames in os.walk(path): - total_folder_count += len(dirnames) - total_files_count += len(filenames) - for f in filenames: - fp = os.path.join(dirpath, f) - total_size += os.path.getsize(fp) - - return total_files_count, total_folder_count, total_size - - -def run_apbatch(args): - """ - Function for argparse command run_apbatch: - running run_several_times function and printing its results. - :param args: args.build_path: see run_several_times build_path. - args.num_launches: see run_several_times num_launches. - args.platform: see run_several_times platform. - args.delete: see run_several_times erase_cache. - :return: None - """ - platform_bin = { - 'vc141': 'Bin64vc141', - 'vc142': 'Bin64vc142', - 'mac': 'BinMac64' - } - running_times = run_several_times(args.build_path, platform_bin[args.platform], args.num_launches, args.delete_cache) - print '\nAssets processing time: {}s'.format(running_times[0]) - print 'Total running time: {}s'.format(running_times[1]) - - -def print_folder_size(args): - """ - Function for argparse command folder_size: - running folder_size function and printing its results. - :param args: args.build_path: see folder_size path. - args.project: specified project which folder will be analyzed. - args.cache: yes/no or True/False - whether user need to check Cache folder or not. - :return: None - """ - print '{} (cache: {}) folder size:'.format(args.project, args.cache) - if args.cache: - path = os.path.join(args.build_path, 'Cache', args.project) - else: - path = os.path.join(args.build_path, args.project) - folder_size_data = folder_size(path) - print 'Files: {}'.format(folder_size_data[0]) - print 'Folders: {}'.format(folder_size_data[1]) - print 'Size: {}'.format(folder_size_data[2]) - - -def main(): - """Main function with set-up and commands execution""" - # creating command line arguments parser - parser = argparse.ArgumentParser(prog = 'apbatch_perf_summary') - subparsers = parser.add_subparsers(help = 'sub-command help', dest='command') - - parser_folder_size = subparsers.add_parser('folder_size', - help='Will show folder size: files, folders and actual size in bytes. ') - parser_run_apbatch = subparsers.add_parser('run_apbatch', help='run_apbatch help') - - parser_run_apbatch.add_argument('build_path', - help='Full path to the build dev directory, e.g. ' - 'F:\\builds\\lumberyard-0.0-639162-pc-1985\\dev') - parser_run_apbatch.add_argument('platform', choices=['vc141', 'vc142', 'mac'], help='vc141, vc142 or mac') - parser_run_apbatch.add_argument('num_launches', type=int, help='How many times do you want to launch ap batch.') - parser_run_apbatch.add_argument('-delete_cache', default=False, action='store_true', - help='Specify if you want to delete Cache before and between runs') - - parser_run_apbatch.set_defaults(func=run_apbatch) - - parser_folder_size.add_argument('build_path', - help='Full path to the build dev directory, e.g. ' - 'F:\\builds\\lumberyard-0.0-639162-pc-1985\dev') - parser_folder_size.add_argument('project', help='Full project name (e.g. StarterGame or SamplesProject).') - parser_folder_size.add_argument('-cache', default=False, action='store_true', - help='Specify if you want to check cache folder', required=False) - parser_folder_size.set_defaults(func=print_folder_size) - - args = parser.parse_args() - - # executing passed commands - args.func(args) - - -# calling main function if script is launched as standalone module -if __name__ == '__main__': - main() - diff --git a/Tests/pipeline/__init__.py b/Tests/pipeline/__init__.py deleted file mode 100755 index e912252f4e..0000000000 --- a/Tests/pipeline/__init__.py +++ /dev/null @@ -1,12 +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. -""" - diff --git a/Tests/pipeline/product_dependency_tests/AssetDependencyTests.py b/Tests/pipeline/product_dependency_tests/AssetDependencyTests.py deleted file mode 100755 index 25e94b150c..0000000000 --- a/Tests/pipeline/product_dependency_tests/AssetDependencyTests.py +++ /dev/null @@ -1,88 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -Automated scripts for tests calling AssetProcessorBatch validating basic features. - -""" - -from TestFixtures import HeliosProjectFixture - -import os -import pytest -import sqlite3 -import time -import codecs - -def AssertProductHasDependencies(engineRoot, projectName, buildInfo, dbCheckWaitTime, product, pathDependencies, assetIdDependencies): - productNameInDB = os.path.join(buildInfo.cacheSubfolder, projectName, product) - productNameInDB = productNameInDB.replace("\\", "/") - - sqlDatabasePath = os.path.join(engineRoot, "Cache", projectName, "assetdb.sqlite") - print (" * Connecting to database {}".format(sqlDatabasePath)) - sqlConnection = sqlite3.connect(sqlDatabasePath) - productRowsList = list() - productDbWait = dbCheckWaitTime - while len(productRowsList) == 0 and productDbWait > 0: - productRows = sqlConnection.execute( - "SELECT ProductID FROM Products where ProductName='{}'".format(productNameInDB)) - productRowsList = list(productRows.fetchall()) - time.sleep(1) - productDbWait = productDbWait - 1 - assert len(productRowsList) == 1, str.format("productRowsList= {}", productRowsList) - productId = int(productRowsList[0][0]) - - foundDependencies = list() - dependencyDbTimeout = dbCheckWaitTime - while len(foundDependencies) == 0 and dependencyDbTimeout > 0: - dependencyRows = sqlConnection.execute( - "SELECT * FROM ProductDependencies where ProductPK={}".format(productId)) - foundDependencies = list(dependencyRows.fetchall()) - time.sleep(1) - dependencyDbTimeout = dependencyDbTimeout - 1 - - foundAssetIds = list() - foundUnresolvedPaths = list() - - uuidIndex = 2 - subIdIndex = 3 - unresolvedPathIndex = 6 - for foundDependency in foundDependencies: - if foundDependency[unresolvedPathIndex] != "": - # If there's a path, there won't be an asset ID - foundUnresolvedPaths.append(foundDependency[unresolvedPathIndex]) - else: - dependencyUUIDAsHex = codecs.encode(foundDependency[uuidIndex], 'hex_codec') - subId = str(foundDependency[subIdIndex]) - assetId = "{}:{}".format(dependencyUUIDAsHex.decode('utf8'), subId) - foundAssetIds.append(assetId) - - assert sorted(pathDependencies) == sorted(foundUnresolvedPaths) - assert sorted(assetIdDependencies) == sorted(foundAssetIds) - - -def test_VegdescriptorlistValidDependencies_DependenciesInDb(HeliosProjectFixture): - engineRoot, projectName, buildInfo, dbCheckWaitTime = HeliosProjectFixture - pathDependencies = {} - assetIdDependencies = { - # MeshAsset reference to "objects/default/primative_wedge_30.cgf" - "e8b39f901f905e3998aa6f8ec4e91507:0", - # MaterialAsset reference to "materials/am_grass1.mtl" - "1151f14d38a65579888abe3139882e68:0" - } - AssertProductHasDependencies(engineRoot, projectName, buildInfo, dbCheckWaitTime, "heliosvegetation.vegdescriptorlist", pathDependencies, assetIdDependencies) - -def test_CloudLibrarytValidDependencies_DependenciesInDb(HeliosProjectFixture): - engineRoot, projectName, buildInfo, dbCheckWaitTime = HeliosProjectFixture - pathDependencies = {} - assetIdDependencies = { - # MaterialAsset reference to "materials/clouds/baseclouds.mtl" - "f249f13854055cfba3b6d95bdc1a3db0:0" - } - AssertProductHasDependencies(engineRoot, projectName, buildInfo, dbCheckWaitTime, "libs/clouds/default.xml", pathDependencies, assetIdDependencies) diff --git a/Tests/pipeline/product_dependency_tests/LvlDepTestDynamicSlice.py b/Tests/pipeline/product_dependency_tests/LvlDepTestDynamicSlice.py deleted file mode 100755 index de7609c92c..0000000000 --- a/Tests/pipeline/product_dependency_tests/LvlDepTestDynamicSlice.py +++ /dev/null @@ -1,228 +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. - -Automated scripts for tests calling AssetProcessorBatch validating basic features. - -""" - -from TestFixtures import EmptyProjectFixture - -import fileinput -import os -import pytest -import shutil -import sqlite3 -import time - -import SubprocessUtils - -def MakeEditorPythonFile(testLevelName, assetGuid, tempFolder, templatePythonFile): - outputFileName = templatePythonFile.replace(".template", ".py") - outputFilePath = os.path.join(tempFolder, outputFileName) - shutil.copy(os.path.join(os.path.dirname(os.path.realpath( - __file__)), templatePythonFile), outputFilePath) - for line in fileinput.FileInput(outputFilePath, inplace=1): - line = line.replace("${LevelName}", str.format('"{}"', testLevelName)) - line = line.replace("${MeshGuid}", str.format('"{}"', assetGuid)) - print (line) - return outputFilePath - -@pytest.mark.skip(reason="This test takes too long on Jenkins, and bundler tests catch everything we want from here") -def test_productDependencies_EntityInLevelWithAssetReference_ReferencedAssetIsLevelProductDependency( - EmptyProjectFixture, tmpdir): - print ("RunLvlDynamicSliceTest") - engineRoot, projectName, buildInfo, dbCheckWaitTime = EmptyProjectFixture - - - tempFolder = tmpdir.mkdir("EditorPyScripts") - print (" * Launch editor with dynamic slice test creation script") - - testLevelName = "SimpleLevel" - expectedDependencyGuid = "81C4A6AF-C57D-5734-81B7-822074358C4D" - exportLevelScriptPath = MakeEditorPythonFile(testLevelName, expectedDependencyGuid, str(tempFolder), "export_test_level.template") - - lyCommand = [buildInfo.editorExe, '/BatchMode', '/runpython', exportLevelScriptPath] - SubprocessUtils.SubprocessWithTimeout(lyCommand, engineRoot, 60) - - # Logic that the export_test_level.py script will run in the editor: - # * Create new level - # * Place an entity in the level - # * Add the mesh component to the entity - # * Assign a test asset to that component [dev\Engine\Objects\default\primitive_sphere.cgf] - # * Export the level - - print (" * Wait for the Asset Processor to copy the asset to the cache and update the asset database") - - projectCacheRoot = os.path.join(engineRoot, "Cache", projectName) - levelRelativeSubFolder = os.path.join("Levels", testLevelName) - cachePath = os.path.join(projectCacheRoot, buildInfo.cacheSubfolder, projectName, levelRelativeSubFolder, "level.pak") - # On an i7 running Lumberyard on an SSD, it normally takes about 1-2 minutes to complete this step. - # Add a few minutes onto that because the Jenkins machines may not be as fast. - pakTimeoutSeconds = 10 * 60 - pakTimeoutWaitTimeSeconds = 1 - # Wait for the level.pak file to exist in the cache - while not os.path.exists(cachePath) and pakTimeoutSeconds > 0: - time.sleep(pakTimeoutWaitTimeSeconds) - pakTimeoutSeconds -= pakTimeoutWaitTimeSeconds - - assert(os.path.exists(cachePath)) - - print (" * Open the asset database, check that the correct product dependency is set for the exported level.pak") - - # A newly created level will have all of these dependencies by default. - # These are tracked by the relative source path instead of the UUID because it's more readable. - expectedDependencyPaths = { - "materials/material_terrain_default.mtl", # from leveldata.xml - "EngineAssets/Materials/sky/sky.mtl", # from mission_mission0.xml - "EngineAssets/Materials/Water/ocean_default.mtl", # from mission_mission0.xml - "textures/skys/night/half_moon.tif" - } - - # Nothing is currently expected to unresolved, but this is left here in case that changes. - expectedUnresolvedPaths = { - # Hardcoded levelbuilder relative path output - os.path.join(levelRelativeSubFolder, "auto_resourcelist.txt"), - os.path.join(levelRelativeSubFolder, "level.cfg"), - os.path.join(levelRelativeSubFolder, "levelparticles.xml"), - os.path.join(levelRelativeSubFolder, "occluder.ocm"), - os.path.join(levelRelativeSubFolder, "preloadlibs.txt"), - os.path.join(levelRelativeSubFolder, "terrain", "cover.ctc"), - os.path.join(levelRelativeSubFolder, "terrain", "merged_meshes_sectors", "mmrm_used_meshes.lst"), - os.path.join(levelRelativeSubFolder, str.format("{}.xml",testLevelName)) - } - - # All expected GUIDs should match the format in the database: Lowercase, with no separators. - expectedDependencyGuids = { - expectedDependencyGuid.lower().replace('-','') - } - - CheckDatabaseForDependency(projectCacheRoot, projectName, testLevelName, expectedDependencyGuids, - expectedDependencyPaths, expectedUnresolvedPaths, buildInfo, dbCheckWaitTime) - - print ("/RunLvlDynamicSliceTest") - - -def CheckDatabaseForDependency(projectCacheRoot, projectName, testLevelName, expectedDependencyGuids, expectedDependencyPaths, expectedUnresolvedPaths, buildInfo, dbCheckWaitTime): - print ("CheckDatabaseForDependency") - - print (str.format(" * Checking expected dependencies for level.pak for level {}", testLevelName)) - print (str.format(" * Searching for these GUIDs as dependencies: {}", str(expectedDependencyGuids))) - print (str.format(" * Searching for these paths as dependencies: {}", str(expectedDependencyPaths))) - print (str.format(" * Searching for these paths as unresolved paths: {}", str(expectedUnresolvedPaths))) - - sqlDatabasePath = os.path.join(projectCacheRoot, "assetdb.sqlite") - print (" * Connecting to database " + sqlDatabasePath) - sqlConnection = sqlite3.connect(sqlDatabasePath) - try: - # Not using os.path.join because this is an expected string in a database - levelPakProduct = str.format('{}/{}/levels/{}/level.pak', buildInfo.cacheSubfolder, projectName.lower(), testLevelName.lower()) - print (" * Looking in product table for " + levelPakProduct) - productRows = sqlConnection.execute( - str.format("SELECT ProductID FROM Products where ProductName='{}'", levelPakProduct)) - - productRowsList = list(productRows.fetchall()) - - productDbWait = dbCheckWaitTime - while len(productRowsList) == 0 and productDbWait > 0: - time.sleep(1) - productDbWait = productDbWait - 1 - productRows = sqlConnection.execute( - str.format("SELECT ProductID FROM Products where ProductName='{}'", levelPakProduct)) - productRowsList = list(productRows.fetchall()) - - - assert len(productRowsList) == 1, "productRowsList= {}".format(productRowsList) - - print (" * Searching product results for product ID") - productId = int(productRowsList[0][0]) - - assert productId - - print (str.format(" * Searching for dependencies for product ID {}", str(productId))) - dependencyDbSuccess = False - dependencyDbTimeout = dbCheckWaitTime - # Make copies of the list in case multiple runs are required - expectedUnresolvedPathsCopy = [] - expectedDependencyGuidsCopy = [] - remainingDependencies = [] - - while (not dependencyDbSuccess) and dependencyDbTimeout > 0: - expectedUnresolvedPathsCopy = expectedUnresolvedPaths.copy() - expectedDependencyGuidsCopy = expectedDependencyGuids.copy() - productDependencyRows = sqlConnection.execute("SELECT * FROM ProductDependencies where ProductPK={}".format(productId)) - - dependencyRowIndex_SourceId = 2 - dependencyRowIndex_SubId = 3 - dependencyRowIndex_UnresolvedPath = 6 - - productDependencyRowList = list(productDependencyRows.fetchall()) - - expectedDependencyCount = len(expectedDependencyGuidsCopy) + len( - expectedDependencyPaths) + len(expectedUnresolvedPathsCopy) - - dependencyDbSuccess = len( - productDependencyRowList) == expectedDependencyCount - - expectedSubId = 0 - - # This will contain SQL data buffers, which are not hashable. - remainingDependencies = [] - - for dependencyRow in productDependencyRowList: - dependencySourceId = dependencyRow[dependencyRowIndex_SourceId] - dependencySubId = int(dependencyRow[dependencyRowIndex_SubId]) - dependencyDbSuccess = dependencyDbSuccess and dependencySubId == expectedSubId - - dependencySourceAsHex = str(dependencySourceId).encode('hex') - wasExpectedDependency = False - # If this dependency's UUID is in our expected UUID list, then count it as found. - if dependencySourceAsHex in expectedDependencyGuidsCopy: - wasExpectedDependency = True - expectedDependencyGuidsCopy.remove(dependencySourceAsHex) - - # If this dependency has an unresolved path that we expect, then count it as found. - unresolvedPath = dependencyRow[dependencyRowIndex_UnresolvedPath] - if unresolvedPath in expectedUnresolvedPathsCopy: - wasExpectedDependency = True - expectedUnresolvedPathsCopy.remove(unresolvedPath) - - if not wasExpectedDependency: - remainingDependencies.append(dependencySourceId) - - dependencyDbSuccess = dependencyDbSuccess and (len(expectedDependencyGuidsCopy) == 0 and - len(expectedUnresolvedPathsCopy) == 0 and - len(remainingDependencies) == len(expectedDependencyPaths)) - if not dependencyDbSuccess: - time.sleep(1) - dependencyDbTimeout = dependencyDbTimeout - 1 - - # do all the checks in asserts, instead of just assert dependencyDbSuccess so that error messages are more specific - assert len(productDependencyRowList) == expectedDependencyCount, str.format("Expected {} dependencies, found {}", expectedDependencyCount, len(productDependencyRowList)) - assert len(expectedDependencyGuidsCopy) == 0, str.format( - "Expected dependencies were not found in the asset database: {}", str(expectedDependencyGuids)) - assert len(expectedUnresolvedPathsCopy) == 0, str.format( - "Expected unresolved paths were not found in the asset database: {}", str(expectedUnresolvedPathsCopy)) - assert len(remainingDependencies) == len(expectedDependencyPaths), str.format("Expected dependency sizes do not match for {} and {}", str(remainingDependencies), str(expectedDependencyPaths)) - - for remainingDependency in remainingDependencies: - sourceRows = sqlConnection.execute("SELECT SourceName FROM Sources where SourceGuid=?", (sqlite3.Binary(remainingDependency),) ) - sourceRowsList = list(sourceRows.fetchall()) - assert len(sourceRowsList) == 1, str.format("Expected to find 1 entry for {}, found {} instead.", str(remainingDependency).encode('hex'), len(sourceRowsList)) - sourcePath = sourceRowsList[0][0] - assert sourcePath in expectedDependencyPaths, str.format("Could not find {} for UUID {} in the list of expected dependencies.", str(sourcePath), str(remainingDependency).encode('hex')) - expectedDependencyPaths.remove(sourcePath) - assert len(expectedDependencyPaths) == 0, str.format("Missing expected dependencies {}", str(expectedDependencyPaths)) - - print (" * Found all expected dependencies") - finally: - print (" * Closing database connection") - sqlConnection.close() - print ("/CheckDatabaseForDependency") - diff --git a/Tests/pipeline/product_dependency_tests/SubprocessUtils.py b/Tests/pipeline/product_dependency_tests/SubprocessUtils.py deleted file mode 100755 index d5637527f2..0000000000 --- a/Tests/pipeline/product_dependency_tests/SubprocessUtils.py +++ /dev/null @@ -1,52 +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. - -Automated scripts for tests calling AssetProcessorBatch validating basic features. - -""" - -import subprocess -import threading -import time - -class ThreadedSubprocess(): - def __init__(self, command, workingDirectory, timeOutMinutes): - self.command = command - self.workingDirectory = workingDirectory - self.timeOutSeconds=timeOutMinutes*60 - self.process = None - self.logOutput = [] - # Pytest doesn't handle asserts on other threads, capture them and report on the main thread. - self.assertError = None - - def RunCommand(self): - def RunThread(): - print (str.format("Subprocess thread starting for command: {}", self.command)) - self.process = subprocess.Popen(self.command, cwd=self.workingDirectory, shell=True, stdout=subprocess.PIPE, universal_newlines=True) - for stdoutLine in iter(self.process.stdout.readline, ""): - self.logOutput.append(stdoutLine) - self.process.communicate() - if self.process.returncode is None: - self.assertError = str.format("Subprocess call '{}' had no return code", self.command) - elif self.process.returncode != 0: - self.assertError = str.format("Subprocess call '{}' returned code {}", self.command, self.process.returncode) - print (str.format("Finished command, result {}: {}", self.process.returncode, self.command)) - - commandThread = threading.Thread(target=RunThread) - commandThread.start() - commandThread.join(self.timeOutSeconds) - assert not commandThread.is_alive(), str.format("Subprocess call '{}' timed out", self.command) - assert self.assertError is None, self.assertError - - -def SubprocessWithTimeout(command, workingDirectory, timeOutMinutes): - threadedSubprocess = ThreadedSubprocess(command, workingDirectory, timeOutMinutes) - threadedSubprocess.RunCommand() - return threadedSubprocess.logOutput diff --git a/Tests/pipeline/product_dependency_tests/TestAssets/updated_xml_schema_test.xmlschema b/Tests/pipeline/product_dependency_tests/TestAssets/updated_xml_schema_test.xmlschema deleted file mode 100644 index a979a1b245..0000000000 --- a/Tests/pipeline/product_dependency_tests/TestAssets/updated_xml_schema_test.xmlschema +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Tests/pipeline/product_dependency_tests/TestAssets/xml_schema_test.xml b/Tests/pipeline/product_dependency_tests/TestAssets/xml_schema_test.xml deleted file mode 100644 index 95b20dc6c8..0000000000 --- a/Tests/pipeline/product_dependency_tests/TestAssets/xml_schema_test.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/Tests/pipeline/product_dependency_tests/TestAssets/xml_schema_test.xmlschema b/Tests/pipeline/product_dependency_tests/TestAssets/xml_schema_test.xmlschema deleted file mode 100644 index 69be99578d..0000000000 --- a/Tests/pipeline/product_dependency_tests/TestAssets/xml_schema_test.xmlschema +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Tests/pipeline/product_dependency_tests/TestCleanup.py b/Tests/pipeline/product_dependency_tests/TestCleanup.py deleted file mode 100755 index d57119db26..0000000000 --- a/Tests/pipeline/product_dependency_tests/TestCleanup.py +++ /dev/null @@ -1,76 +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. - -Automated scripts for tests calling AssetProcessorBatch validating basic features. - -""" - -import os, subprocess, shutil, time - -import SubprocessUtils - -def KillProcess_Windows(processName): - # This only runs on Windows - processList = subprocess.check_output(str.format('tasklist /NH /FO CSV /FI "IMAGENAME eq {}"', processName)) - if processList is None or processList.startswith("INFO: No tasks are running which match the specified criteria."): - # Asset processor isn't running, no need to kill it. - return - os.system(str.format('taskkill /F /IM {}', processName)) - -def KillLumberyardTools(): - if os.name == 'nt': - KillProcess_Windows("Editor.exe") - KillProcess_Windows("AssetProcessor.exe") - else: - # Other operating systems are not yet supported, so have the test fail - assert False - - -def RemoveFolder(folderPath): - # The Asset Processor may take a bit to shut down, retry a few times if it's still holding a lock on a file. - retryCount = 5 - for retry in range(retryCount): - if os.path.exists(folderPath) == False: - return - - try: - shutil.rmtree(folderPath) - except: - if retry < retryCount-1: - # Wait a few seconds for whatever has the file handle open to close it. - time.sleep(5) - continue - else: - raise - - -def cleanUpArtifacts(engineRoot, projectName, buildInfo): - print ("cleanUpArtifacts") - - print (" * Shutting down Asset Processor") - KillLumberyardTools() - - # Setting the active project to one that is in Perforce will make sure other commands work correctly. Once the - # project created here is destroyed, lmbr_waf commands won't work. - if os.path.exists(os.path.join(buildInfo.buildFolder,buildInfo.lmbrCommand)): - print (" * Setting project to Helios") - SubprocessUtils.SubprocessWithTimeout(str.format("{} projects set-active Helios", buildInfo.lmbrCommand), buildInfo.buildFolder, 60) - else: - print (" * Cannot set project to FeatureTests, lmbr executable is not available.") - # Clearing the cache to guarantee that no data persists between tests. - print (" * Clearing the asset cache") - cachePath = os.path.join(engineRoot, "Cache", projectName) - RemoveFolder(cachePath) - - print (" * Clearing generated data") - projectPath = os.path.join(engineRoot, projectName) - RemoveFolder(projectPath) - - print ("/cleanUpArtifacts") diff --git a/Tests/pipeline/product_dependency_tests/TestFixtures.py b/Tests/pipeline/product_dependency_tests/TestFixtures.py deleted file mode 100755 index 91151748a5..0000000000 --- a/Tests/pipeline/product_dependency_tests/TestFixtures.py +++ /dev/null @@ -1,63 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -Automated scripts for tests calling AssetProcessorBatch validating basic features. - -""" - -import os -import pytest - -import LmbrBuildInfo -import SubprocessUtils -import TestCleanup -import TestSetup - -@pytest.fixture(scope="session") -def EmptyProjectFixture(request): - print ("EmptyProjectFixture") - engineRoot = TestSetup.FindEngineRoot() - assert engineRoot - projectName = "LevelDepTestProj" - buildInfo = LmbrBuildInfo.GetBuildInfo(request.config.option.buildFlavor, engineRoot) - TestCleanup.cleanUpArtifacts(engineRoot, projectName, buildInfo) - - TestSetup.CreateLvlDepTestProject(engineRoot, projectName, buildInfo, request.config.option.thirdPartyPath) - # cleanUpArtifacts deleted the temp dir, so create it. - print ("Finished EmptyProjectFixture setup") - yield engineRoot, projectName, buildInfo, int(request.config.option.dbWaitTimes) - - print ("Tearing down EmptyProjectFixture") - TestCleanup.cleanUpArtifacts(engineRoot, projectName, buildInfo) - print ("Finished EmptyProjectFixture tear down") - - -# These tests require the Helios project to be built in profile and active before they are run. -# This external requirement allows faster iteration on these tests on Jenkins and locally. -@pytest.fixture(scope="session") -def HeliosProjectFixture(request): - print ("HeliosProjectFixture") - engineRoot = TestSetup.FindEngineRoot() - assert engineRoot - projectName = "Helios" - buildInfo = LmbrBuildInfo.GetBuildInfo(request.config.option.buildFlavor, engineRoot) - - # These tests are run on Jenkins after other tests, to minimize time spent on Jenkins jobs. - # Verify that the correct project has been set before this test starts. - - # Temporarily disabling while LY-103017 is not in Helios branch - # Creating a task to revert this change later: LY-103334 - - # Run asset processor once to process all assets, so the tests themselves can run at consistent speeds. - SubprocessUtils.SubprocessWithTimeout([buildInfo.assetProcessorBatch], engineRoot, 120) - - print ("Finished HeliosProjectFixture setup") - yield engineRoot, projectName, buildInfo, int(request.config.option.dbWaitTimes) - print ("Tearing down EmptyProjectFixture") diff --git a/Tests/pipeline/product_dependency_tests/XmlSchemaSystemTests.py b/Tests/pipeline/product_dependency_tests/XmlSchemaSystemTests.py deleted file mode 100755 index 51a349c185..0000000000 --- a/Tests/pipeline/product_dependency_tests/XmlSchemaSystemTests.py +++ /dev/null @@ -1,212 +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. - -Automated scripts for tests calling AssetProcessorBatch validating basic features. - -""" - -from TestFixtures import HeliosProjectFixture - -import pytest -import shutil -import subprocess -import os -import sqlite3 -import time - -TEST_ASSETS_FOLDER_NAME = 'TestAssetS' -TEST_XML_NAME = 'xml_schema_test.xml' -TEST_SCHEMA_NAME = 'xml_schema_test.xmlschema' -UPDATED_TEST_SCHEMA_NAME = 'updated_xml_schema_test.xmlschema' -SCHEMA_FOLDER_NAME = 'Schema' - -def test_XmlSchemaSystem_AddNewSchema_ReprocessXml(HeliosProjectFixture): - engineRoot, projectName, buildInfo, dbCheckWaitTime = HeliosProjectFixture - projectFolder = os.path.join(engineRoot, projectName) - - testAssetsFolder = os.path.dirname(os.path.realpath(__file__)) - testAssetsFolder = os.path.join(testAssetsFolder, TEST_ASSETS_FOLDER_NAME) - testXmlPath = os.path.join(testAssetsFolder, TEST_XML_NAME) - testSchemaPath = os.path.join(testAssetsFolder, TEST_SCHEMA_NAME) - updatedTestSchemaPath = os.path.join(testAssetsFolder, UPDATED_TEST_SCHEMA_NAME) - - projectXmlPath = os.path.join(projectFolder, TEST_XML_NAME) - schemaFolderInProject = os.path.join(projectFolder, SCHEMA_FOLDER_NAME) - projectSchemaPath = os.path.join(schemaFolderInProject, TEST_SCHEMA_NAME) - - # Clean up the existing test xml and schema assets - if CleanUpTestAsset(projectXmlPath) or CleanUpTestAsset(projectSchemaPath): - # Remove the test assets and its dependencies from the database - subprocess.call( - [os.path.join(buildInfo.buildFolder, 'AssetProcessorBatch'), "/gamefolder=Helios"]) - - # Copy test XML asset to the project - # No product dependency should be output for the XML asset without a corresponding schema - print ("Add new XML asset") - expectedUnresolvedPaths = {} - UpdateProjectAsset(testXmlPath, projectXmlPath, engineRoot, projectName, - expectedUnresolvedPaths, buildInfo, dbCheckWaitTime, False) - - # Copy the XML schema asset to the project - # XML assets are expected to be reprocessed and output product dependencies - print ("Add new XML schema") - if not os.path.exists(schemaFolderInProject): - os.makedirs(schemaFolderInProject) - expectedUnresolvedPaths = { 'dependency1' } - UpdateProjectAsset(testSchemaPath, projectSchemaPath, engineRoot, projectName, - expectedUnresolvedPaths, buildInfo, dbCheckWaitTime, False) - - # Update the XML schema asset inside the project - # XML assets are expected to be reprocessed and output product dependencies - print ("Update XML schema") - expectedUnresolvedPaths = { 'dependency1', 'dependency2'} - UpdateProjectAsset(updatedTestSchemaPath, projectSchemaPath, engineRoot, projectName, - expectedUnresolvedPaths, buildInfo, dbCheckWaitTime, False) - - # Delete the schema asset in the project folder - # No product dependency should be output for the XML asset since the schema has been deleted - print ("Delete XML schema") - expectedUnresolvedPaths = {} - UpdateProjectAsset(updatedTestSchemaPath, projectSchemaPath, engineRoot, projectName, - expectedUnresolvedPaths, buildInfo, dbCheckWaitTime, True) - - # Clean up the test assets - CleanUpTestAsset(projectXmlPath) - if not os.listdir(schemaFolderInProject): - os.rmdir(schemaFolderInProject) - -def test_XmlSchemaSystem_MoveSchemaToGem_ReprocessXml(HeliosProjectFixture): - engineRoot, projectName, buildInfo, dbCheckWaitTime = HeliosProjectFixture - - projectFolder = os.path.join(engineRoot, projectName) - testAssetsFolder = os.path.dirname(os.path.realpath(__file__)) - testAssetsFolder = os.path.join(testAssetsFolder, TEST_ASSETS_FOLDER_NAME) - testXmlPath = os.path.join(testAssetsFolder, TEST_XML_NAME) - testSchemaPath = os.path.join(testAssetsFolder, TEST_SCHEMA_NAME) - projectXmlPath = os.path.join(projectFolder, TEST_XML_NAME) - projectSchemaPath = os.path.join(projectFolder, SCHEMA_FOLDER_NAME, TEST_SCHEMA_NAME) - # The CertificateManager Gem was arbitrarily chosen. Schema can be added to any enabled gem - gemSchemaFolder = os.path.join(engineRoot, 'Gems', 'CertificateManager', 'Assets', SCHEMA_FOLDER_NAME) - gemSchemaPath = os.path.join(gemSchemaFolder, TEST_SCHEMA_NAME) - - # Clean up all the potential test xml and schema assets - if CleanUpTestAsset(projectXmlPath) or CleanUpTestAsset(projectSchemaPath) or CleanUpTestAsset(gemSchemaPath): - # Remove the test assets and its dependencies from the database - subprocess.call( - [os.path.join(buildInfo.buildFolder, 'AssetProcessorBatch'), "/gamefolder=Helios"]) - - print ('Add XML schema to CertificateManager gem') - if not os.path.exists(gemSchemaFolder): - os.makedirs(gemSchemaFolder) - shutil.copyfile(testSchemaPath, gemSchemaPath) - - print ('Reprocess test assets') - expectedUnresolvedPaths = { 'dependency1' } - UpdateProjectAsset(testXmlPath, projectXmlPath, engineRoot, projectName, expectedUnresolvedPaths, buildInfo, dbCheckWaitTime, False) - - # Clean up the test assets - CleanUpTestAsset(projectXmlPath) - CleanUpTestAsset(gemSchemaPath) - if not os.listdir(gemSchemaFolder): - os.rmdir(gemSchemaFolder) - -def CleanUpTestAsset(assetName): - assetExists = False; - if os.path.exists(assetName): - assetExists = True; - os.remove(assetName) - - assert not os.path.exists(assetName) - - return assetExists - - -def UpdateProjectAsset(testAssetPath, projectAssetPath, engineRoot, projectName, expectedUnresolvedPaths, buildInfo, dbCheckWaitTime, deleteAsset): - if deleteAsset: - os.remove(projectAssetPath) - else: - shutil.copyfile(testAssetPath, projectAssetPath) - - # Let AP reprocess the new/updated asset - subprocess.call( - [os.path.join(buildInfo.buildFolder, 'AssetProcessorBatch'), "/gamefolder=Helios"]) - - projectCacheRoot = os.path.join(engineRoot, 'Cache', projectName) - CheckDatabaseForDependency(projectCacheRoot, projectName, - expectedUnresolvedPaths, buildInfo, dbCheckWaitTime) - - -def CheckDatabaseForDependency(projectCacheRoot, projectName, expectedUnresolvedPaths, buildInfo, dbCheckWaitTime): - print ("CheckDatabaseForDependency") - - print (" * Searching for these paths as unresolved paths: {}".format(str(expectedUnresolvedPaths))) - - sqlDatabasePath = os.path.join(projectCacheRoot, "assetdb.sqlite") - print (" * Connecting to database " + sqlDatabasePath) - sqlConnection = sqlite3.connect(sqlDatabasePath) - try: - # Not using os.path.join because this is an expected string in a database - xmlProduct = '{}/{}/xml_schema_test.xml'.format(buildInfo.cacheSubfolder, projectName.lower()) - print (" * Looking in product table for " + xmlProduct) - productRows = sqlConnection.execute( - "SELECT ProductID FROM Products where ProductName='{}'".format(xmlProduct)) - productRowsList = list(productRows.fetchall()) - - productDbWait = dbCheckWaitTime - while len(productRowsList) == 0 and productDbWait > 0: - time.sleep(1) - productDbWait = productDbWait - 1 - productRows = sqlConnection.execute( - "SELECT ProductID FROM Products where ProductName='{}'".format(xmlProduct)) - productRowsList = list(productRows.fetchall()) - - assert len(productRowsList) == 1, "productRowsList= {}".format(productRowsList) - - print (" * Searching product results for product ID") - productId = int(productRowsList[0][0]) - - assert productId - - print (" * Searching for dependencies for product ID {}".format(productId)) - dependencyDbSuccess = False - dependencyDbTimeout = dbCheckWaitTime - # Make copies of the list in case multiple runs are required - expectedUnresolvedPathsCopy = [] - dependencyRowIndex_UnresolvedPath = 6 - while (not dependencyDbSuccess) and dependencyDbTimeout > 0: - expectedUnresolvedPathsCopy = expectedUnresolvedPaths.copy() - productDependencyRows = sqlConnection.execute("SELECT * FROM ProductDependencies where ProductPK={}".format(productId)) - - productDependencyRowList = list(productDependencyRows.fetchall()) - expectedDependencyCount = len(expectedUnresolvedPathsCopy) - dependencyDbSuccess = len( - productDependencyRowList) == expectedDependencyCount - - for dependencyRow in productDependencyRowList: - # If this dependency has an unresolved path that we expect, then count it as found. - unresolvedPath = dependencyRow[dependencyRowIndex_UnresolvedPath] - if unresolvedPath in expectedUnresolvedPathsCopy: - expectedUnresolvedPathsCopy.remove(unresolvedPath) - - dependencyDbSuccess = dependencyDbSuccess and len(expectedUnresolvedPathsCopy) == 0 - - if not dependencyDbSuccess: - time.sleep(1) - dependencyDbTimeout = dependencyDbTimeout - 1 - - # do all the checks in asserts, instead of just assert dependencyDbSuccess so that error messages are more specific - assert len(expectedUnresolvedPathsCopy) == 0, str.format( - "Expected unresolved paths were not found in the asset database: {}", str(expectedUnresolvedPathsCopy)) - - print (" * Found all expected dependencies") - finally: - print (" * Closing database connection") - sqlConnection.close() - print ("/CheckDatabaseForDependency") \ No newline at end of file diff --git a/Tests/pipeline/product_dependency_tests/conftest.py b/Tests/pipeline/product_dependency_tests/conftest.py deleted file mode 100755 index cdac03401a..0000000000 --- a/Tests/pipeline/product_dependency_tests/conftest.py +++ /dev/null @@ -1,36 +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. - -Automated scripts for tests calling AssetProcessorBatch validating basic features. - -""" - -def pytest_addoption(parser): - parser.addoption( - "--buildFlavor", action="store", default="WindowsVS2017", help="Sets the build type (see lmbrBuildInfo.py for what's available)" - ) - - parser.addoption( - "--dbWaitTimes", action="store", default=60, help="How long (in seconds) to wait for a condition to be met in the database before timing out" - ) - - parser.addoption( - "--thirdPartyPath", action="store", help="Path to the 3rd party folder" - ) - -def pytest_generate_tests(metafunc): - if "buildFlavor" in metafunc.fixturenames: - metafunc.parametrize("buildFlavor", metafunc.config.getoption("buildFlavor"), scope="session") - - if "dbWaitTimes" in metafunc.fixturenames: - metafunc.parametrize("dbWaitTimes", metafunc.config.getoption("dbWaitTimes"), scope="session") - - if "thirdPartyPath" in metafunc.fixturenames: - metafunc.parametrize("thirdPartyPath", metafunc.config.getoption("thirdPartyPath"), scope="session") \ No newline at end of file diff --git a/Tests/pipeline/product_dependency_tests/export_test_level.template b/Tests/pipeline/product_dependency_tests/export_test_level.template deleted file mode 100644 index 2a6567904e..0000000000 --- a/Tests/pipeline/product_dependency_tests/export_test_level.template +++ /dev/null @@ -1,38 +0,0 @@ -# -# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -# its licensors. -# -# For complete copyright and license terms please see the LICENSE at the root of this -# distribution (the "License"). All use of this software is governed by the License, -# or, if provided, by the license below or the license accompanying this file. Do not -# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# - -import os - -game_folder = general.get_game_folder() -levelName = ${LevelName} -meshGuid = ${MeshGuid} - -# Don't use terrain because creating a level with terrain causes a popup message that requires user input. -general.create_level(levelName, 128, 1, False) -levelPath = os.path.join(game_folder, "Levels", levelName, str.format("{}.ly", levelName)) - -if not isinstance(input, str): - # general.open_level_no_prompt expects the file path in utf8 format - levelPath = levelName.encode("utf-8") - -general.open_level_no_prompt(levelPath) - -newEntityIdStr = str(general.create_entity("TestEntityName")) - -componentResult = general.add_mesh_component_with_mesh(newEntityIdStr, meshGuid) - -if not componentResult: - raise Exception('Export Test Level', str.format('Failed to add mesh ID {} to entity ID {}', str(meshGuid), str(newEntityIdStr))) - -general.save_level() -general.export_to_engine() - -general.exit() diff --git a/Tests/samples/__init__.py b/Tests/samples/__init__.py deleted file mode 100755 index e912252f4e..0000000000 --- a/Tests/samples/__init__.py +++ /dev/null @@ -1,12 +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. -""" - diff --git a/Tests/samples/sample_tests.py b/Tests/samples/sample_tests.py deleted file mode 100755 index aef6dc0f97..0000000000 --- a/Tests/samples/sample_tests.py +++ /dev/null @@ -1,163 +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. - -Sample tests to demonstrate typical functionality of PythonTestTools and how to integrate into the BAT. -""" -# Workaround for tests which depend on old tools, before they are updated to ly_test_tools and Python 3 -import pytest -pytest.importorskip('test_tools') - -# System level imports -import os -import subprocess - -# Basic PythonTestTools imports, in most cases you should always import these -import test_tools.builtin.fixtures as fixtures -from test_tools import HOST_PLATFORM, WINDOWS_LAUNCHER - -# test_tools and shared are modules with a lot of useful utility functions already written, use them! -# Pick and choose the ones below that you need, don't just blindly copy/paste -import test_tools.launchers.phase -import test_tools.shared.process_utils as process_utils -from test_tools.shared.file_utils import gather_error_logs, clear_out_config_file, delete_screenshot_folder, move_file -from shared.network_utils import check_for_listening_port -from test_tools.shared.remote_console_commands import RemoteConsole -from test_tools.shared.waiter import wait_for - - -# This is where you should access lumberyard - building, asset processing, finding paths/logs, etc. Do NOT change or -# remove this unless you know what you're doing. -# See the documentation for PythonTestTools for more information. -workspace = fixtures.use_fixture(fixtures.builtin_empty_workspace_fixture, scope='function') - -# What are fixtures? -# Fixtures set up a testing process (or test) by running all necessary code to satisfy its preconditions. -# More reading here: https://docs.pytest.org/en/latest/fixture.html - -# This is a shared instance of the remote console that be used across multiple tests. It must have the @pytest.fixture! -# You should remove this if you aren't going to use the remote console. -@pytest.fixture -def remote_console_instance(request): - """ - Creates a remote console instance to send console commands. - """ - console = RemoteConsole() - - def teardown(): - try: - console.stop() - except: - pass - - request.addfinalizer(teardown) - - return console - - -# This is a shared instance of the launcher that can be used across multiple tests within this file and any that it -# includes. It must have the @pytest.fixture for pytest to automatically pass it around! -# You should remove this if you aren't going to use the level-specific launchers. -@pytest.fixture -def launcher_instance(request, workspace, level): - """ - Creates a launcher fixture instance with an extra teardown for error log grabbing. - """ - def teardown_launcher_copy_logs(): - """ - Tries to grab any error logs before moving on to the next test. - """ - - for file_name in os.listdir(launcher.workspace.release.paths.project_log()): - move_file(launcher.workspace.release.paths.project_log(), - launcher.workspace.artifact_manager.get_save_artifact_path(), - file_name) - - logs_exist = lambda: gather_error_logs( - launcher.workspace.release.paths.dev(), - launcher.workspace.artifact_manager.get_save_artifact_path()) - try: - test_tools.shared.waiter.wait_for(logs_exist) - except AssertionError: - print("No error logs found. Completing test...") - - request.addfinalizer(teardown_launcher_copy_logs) - - launcher = fixtures.launcher(request, workspace, level) - return launcher - -# For the rest of the file, these are sample tests that you should remove entirely, or cannibalize them to help your -# own test-writing process. -class TestSamplesAPBatch: - - # This is a shared instance of test teardown that will be used across all tests in this class. - # It must have the @pytest.fixture(autouse=True)! - @pytest.fixture(autouse=True) - def setup_teardown(self, request): - - # This is the teardown function that will be run after *each* test finishes - def teardown(): - pass - - # This is the setup section that will be run before *each* test starts - request.addfinalizer(teardown) - - # mark.BAT adds this test to the BAT. - # mark.test_case is used to link to your testrail id. - # mark.parameterize allows you to run the same test multiple times but with different parameters, such as platform, - # configuration, project, level, and more. See more on parameters here: https://docs.pytest.org/en/latest/parametrize.html - @pytest.mark.BAT - @pytest.mark.test_case(testrail_id='Foo') - @pytest.mark.parametrize('platform,configuration,project,spec', ( - pytest.param('win_x64_vs2017', 'profile', 'StarterGame', 'all', - marks=pytest.mark.skipif(HOST_PLATFORM != 'win_x64', reason='Only supported on Windows hosts')), - pytest.param('darwin_x64', 'profile', 'StarterGame', 'all', - marks=pytest.mark.skipif(HOST_PLATFORM != 'darwin_x64', reason='Only supported on Mac hosts')), - )) - def test_RunAPBatch_WorkspacePreconfigured_NoLeftoverProcessesExist(self, workspace): - """ - Tests that the Asset Processor Batch and run and doesn't leave leftover processes. - """ - # Your function docstrings (the above text) will be part of the test catalog! - - subprocess.check_call([os.path.join(workspace.release.paths.bin(), 'AssetProcessorBatch')]) - - # This is how you should do timeouts - wait_for(lambda: not process_utils.process_exists('AssetProcessorBatch', True), timeout=10) - - # Make sure to include an informative assert message to make debugging easier - assert not process_utils.process_exists('rc', True), 'rc process still exists' - assert not process_utils.process_exists('AssetBuilder', True), 'AssetBuilder process still exists' - - -# Notice that you can put the marks both on the class and on the individual methods (seen above). -@pytest.mark.BAT -@pytest.mark.parametrize("platform,configuration,project,spec,level", [ - pytest.param("win_x64_vs2017", "profile", "StarterGame", "all", "StarterGame", - marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")), - pytest.param("win_x64_vs2019", "profile", "StarterGame", "all", "StarterGame", - marks=pytest.mark.skipif(not WINDOWS_LAUNCHER, reason="Only supported on Windows hosts")) -]) -class TestSamplesRemoteConsole(object): - - # Notice here that both the launcher_instance and remote_console_instance fixtures are being reused from above - def test_LaunchRemoteConsoleAndLauncher_CanLaunch(self, launcher_instance, platform, configuration, project, spec, - level, remote_console_instance): - """ - Verifies launcher & remote console can successfully launch. Notice that there are no asserts here, and that is - because the called functions will raise exceptions if there is unexpected behavior. - """ - launcher_instance.launch() - - launcher_instance.run(test_tools.launchers.phase.TimePhase(120, 120)) - - test_tools.shared.waiter.wait_for(lambda: check_for_listening_port(4600), timeout=300, - exc=AssertionError('Port 4600 not listening.')) - - remote_console_instance.start() diff --git a/Tests/samples/sanity_test.py b/Tests/samples/sanity_test.py deleted file mode 100755 index 062bfeea63..0000000000 --- a/Tests/samples/sanity_test.py +++ /dev/null @@ -1,58 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -A simple sanity test. -""" -import os -import pytest - -import ly_test_tools.builtin.helpers - - -class TestSanity: - - @pytest.fixture(autouse=True) - def setup_teardown(self, request, legacy_workspace): - def teardown(): - # Per-test cleanup goes here - pass - request.addfinalizer(teardown) # adds teardown to pytest important to hook before setup in case setup fails - - # Per-test setup goes here - - # builtin_empty_workspace_fixture doesn't configure lumberyard to run, it leaves all the configuration to - # the test. - # To run lumberayrd you need to at least setup 3rdParty and run setup assistant using the following lines. - # Alternatively, you can use 'builtin_workspace_fixture'. - # This sanity test only checks if the framework is sane, so there is no need to configure LY. - # workspace.run_waf_configure() - # workspace.setup_assistant.enable_default_capabilities() - - @pytest.mark.bvt - # Example of dynamically parametrized test, these parameters are consumed by the workspace fixture: - # TODO LY-109331 @pytest.mark.parametrize("platform", ["win_x64_vs2017", "win_x64_vs2019", "darwin_x64"]) - @pytest.mark.parametrize("platform", ["win_x64_vs2017", "win_x64_vs2019"]) - @pytest.mark.parametrize("configuration", ["profile"]) - @pytest.mark.parametrize("project", ["AutomatedTesting"]) - @pytest.mark.parametrize("spec", ["all"]) - def test_Paths_DevPathExists_PathItsADirectory(self, legacy_workspace, platform, configuration, project, spec): - # type: (WorkspaceManager, str, str, str, str) -> None - - # Test code goes here - # os.makedirs(workspace.paths.dev()) - - # These asserts verify that the parameters were correctly received by the workspace fixture - assert legacy_workspace.platform == platform, "Platform does not match parameters" - assert legacy_workspace.configuration == configuration, "Configuration does not match parameters" - assert legacy_workspace.project == project, "Project does not match parameters" - assert legacy_workspace.spec == spec, "Spec does not match parameters" - - # Verify that the dev folder exists - assert os.path.isdir(legacy_workspace.paths.dev()) diff --git a/Tests/shared/__init__.py b/Tests/shared/__init__.py deleted file mode 100755 index e912252f4e..0000000000 --- a/Tests/shared/__init__.py +++ /dev/null @@ -1,12 +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. -""" - diff --git a/Tests/shared/file_utils.py b/Tests/shared/file_utils.py deleted file mode 100755 index 98bf08c29a..0000000000 --- a/Tests/shared/file_utils.py +++ /dev/null @@ -1,182 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -import os -import shutil -import subprocess -import logging - -import test_tools.shared.file_system as file_system -from test_tools.shared.waiter import wait_for - -logger = logging.getLogger(__name__) - - -def clear_out_config_file(project_path, script_name): - """ - Clears out the specified config file to be empty. - :param project_path: The directory where the file is. - :param script_name: The file name. - """ - path = os.path.join(project_path, '{}.cfg'.format(script_name)) - - if os.path.exists(path): - # Clears read only flag - file_system.unlock_file(path) - - with open(path, 'w') as initialmap_script: - initialmap_script.write('') - - -def add_commands_to_config_file(config_file_dir, config_file_name, command_list): - """ - From the command list, appends each command to the specified config file. - :param config_file_dir: The directory the config file is contained in. - :param config_file_name: The config file name. - :param command_list: The commands to add to the file. - :return: - """ - config_file_path = os.path.join(config_file_dir, config_file_name) - os.chmod(config_file_path, 0755) - with open(config_file_path, 'w') as launch_config_file: - for command in command_list: - launch_config_file.write("{}\n".format(command)) - - -def gather_error_logs(dev_path, logs_path): - """ - Grabs all error logs (if there are any) and puts them into the specified logs path. - :param dev_path: Path to the dev directory. - :param logs_path: Path to the destination directory for the logs (the test results path). - """ - error_logs_sent = False - error_log_path = os.path.join(dev_path, 'error.log') - artifact_log_path = os.path.join(logs_path, 'error.log') - error_dump_path = os.path.join(dev_path, 'error.dmp') - artifact_dump_path = os.path.join(logs_path, 'error.dmp') - if os.path.exists(error_dump_path) and os.path.exists(error_log_path): - shutil.move(error_dump_path, artifact_dump_path) - shutil.move(error_log_path, artifact_log_path) - error_logs_sent = True - return error_logs_sent - - -def delete_screenshot_folder(platform_path): - """ - Deletes screenshot folder from platform path - :param platform_path: Platform Path - :return: None - """ - platform_path = r'{}\user\screenshots'.format(platform_path) - shutil.rmtree(platform_path, ignore_errors=True) - - -def move_file(src_dir, dest_dir, file_name, timeout=120): - """ - Attempts to move a file from the source directory to the destination directory. Raises an IOError if - the file is in use. - :param src_dir: Directory of the file to be moved. - :param dest_dir: Directory where the file will be moved to. - :param file_name: Name of the file to be moved. - :param timeout: Number of seconds to wait for the file to be released. - """ - file_path = os.path.join(src_dir, file_name) - if os.path.exists(file_path): - wait_for(lambda: move_file_check(src_dir, dest_dir, file_name), - timeout=timeout, - exc=IOError('Cannot move file {} while in use'.format(file_path))) - - -def move_file_check(src_dir, dest_dir, file_name): - """ - Moves file and checks if the file has been moved from the source to the destination directory. - """ - try: - shutil.move(os.path.join(src_dir, file_name), os.path.join(dest_dir, file_name)) - except OSError as e: - print e - return False - - return True - - -def revert_config_files(launcher): - """ - Reverts modified config files from test. Runs the perforce revert command. - :param launcher: The launcher instance to revert files from. - """ - files_revert = [os.path.join(launcher.workspace.release.paths.dev(), 'bootstrap.cfg'), - os.path.join(launcher.workspace.release.paths.dev(), 'AssetProcessorPlatformConfig.ini'), - launcher.workspace.release.paths.platform_config_file()] - - for file_path in files_revert: - subprocess.check_call(['p4', 'revert', file_path]) - subprocess.check_call(['p4', 'sync', '-f', file_path]) - - -def create_file(path, file_name): - """ - Creates a file with specified file name - :param path: The path of where the file needs to be created - :param file_name: The file name - :return: - """ - file_path = os.path.join(path, file_name) - - if not os.path.exists(file_path): - new_file = open(file_path, "w") - new_file.close() - else: - print "{} already exists".format(file_name) - -def delete_level(launcher, level_dir, timeout=120): - """ - Attempts to delete an entire level folder from the project. - :param launcher: The launcher instance to delete the level from. - :param level_dir: The level folder to delete - """ - - if (not level_dir): - logger.warning("level_dir is empty, nothing to delete.") - return - - full_level_dir = os.path.join(launcher.workspace.release.paths.project(), 'Levels', level_dir) - if (not os.path.isdir(full_level_dir)): - if (os.path.exists(full_level_dir)): - logger.error("level '{}' isn't a directory, it won't be deleted.".format(full_level_dir)) - else: - logger.info("level '{}' doesn't exist, nothing to delete.".format(full_level_dir)) - return - - wait_for(lambda: delete_check(full_level_dir), - timeout=timeout, - exc=IOError('Cannot delete directory {} while in use'.format(full_level_dir))) - -def delete_check(src_dir): - """ - Deletes directory and verifies that it's been deleted. - :param src_dir: The directory to delete - """ - try: - shutil.rmtree(src_dir) - except OSError as e: - logger.debug("Delete for '{}' failed: {}".format(src_dir, e)) - return False - - return (not os.path.exists(src_dir)) - -def get_log_file_path(launcher, project_name): - """ - Creates a log file path. - :param launcher: The launcher instance to get a path from. - :param project_name: The name of the project. - """ - return os.path.join(launcher.workspace.release.paths.dev(), 'Cache', project_name, 'pc', 'user', 'log', 'Editor.log') diff --git a/Tests/shared/hydra_test_utils.py b/Tests/shared/hydra_test_utils.py deleted file mode 100755 index cce54a0f45..0000000000 --- a/Tests/shared/hydra_test_utils.py +++ /dev/null @@ -1,78 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -import logging -import os -import tempfile -import test_tools.shared.log_monitor -import test_tools.launchers.phase - -logger = logging.getLogger(__name__) - - -def prepare_cfg_file(editor_python_script_name, args=[]): - """ - Create a temporary .cfg file containing the python script and args to pass to the Editor. - Ex: If you pass in 'create_level.py', ['LevelName'], you'll get a cfg file with this: - pyRunFile create_level.py LevelName - :param editor_python_script_name: Name of script that will execute in the Editor. - :param args: Additional arguments for CFG, such as LevelName. - :return Config file for Hydra execution - """ - cfg_contents = '-- Auto-generated cfg file\n' - cfg_contents += 'pyRunFile ' + editor_python_script_name - for arg in args: - cfg_contents += ' ' + arg - cfg_contents += '\n' - - logger.debug("Preparing a cfg file with the following contents:\n{}".format(cfg_contents)) - f = tempfile.NamedTemporaryFile(mode='w+', suffix='.cfg', delete=False) - cfg_filename = f.name - f.write(cfg_contents) - f.close() - logger.debug("Cfg file name: {}".format(cfg_filename)) - return cfg_filename - - -def cleanup_cfg_file(cfg_filename): - """ - Removes the temporary cfg file created in prepare_cfg_file. - :param cfg_filename: Config file for Hydra execution to delete - """ - logger.debug('Cleaning up the generated cfg file') - if os.path.exists(cfg_filename): - os.remove(cfg_filename) - - -def launch_and_validate_results(test_directory, editor, editor_script, editor_timeout, expected_lines, cfg_args=[]): - """ - Creates a temporary config file for Hydra execution, runs the Editor with the specified script, and monitors for - expected log lines. - :param test_directory: Path to test directory that editor_script lives in. - :param editor: Configured editor object to run test against. - :param editor_script: Name of script that will execute in the Editor. - :param editor_timeout: Timeout for editor run. - :param expected_lines: Expected lines to search log for. - :param cfg_args: Additional arguments for CFG, such as LevelName. - """ - cfg_file_name = prepare_cfg_file(os.path.join(test_directory, editor_script), cfg_args) - - logger.debug("Running automated test: {}".format(editor_script)) - - editor.deploy() - editor.launch(["--skipWelcomeScreenDialog", "--autotest_mode", "--exec", cfg_file_name]) - - editorlog_file = os.path.join(editor.workspace.release.paths.project_log(), 'Editor.log') - - test_tools.shared.log_monitor.monitor_for_expected_lines(editor, editorlog_file, expected_lines) - - # Rely on the test script to quit after running - editor.run(test_tools.launchers.phase.WaitForLauncherToQuit(editor, editor_timeout)) diff --git a/Tests/shared/jenkins-3rdparty-symlink/symlink_utils.py b/Tests/shared/jenkins-3rdparty-symlink/symlink_utils.py deleted file mode 100755 index c8fa8b7023..0000000000 --- a/Tests/shared/jenkins-3rdparty-symlink/symlink_utils.py +++ /dev/null @@ -1,71 +0,0 @@ -""" - - All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or - its licensors. - - For complete copyright and license terms please see the LICENSE at the root of this - distribution (the "License"). All use of this software is governed by the License, - or, if provided, by the license below or the license accompanying this file. Do not - remove or modify any license notices. This file is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -import argparse -import logging -import os -import subprocess - -logger = logging.getLogger(__name__) - - -def create_symlink(path, name, reference): - """ - Checks if the defined symlink exists and returns True if it does. If it does not, it will create a - new symlink and return True. Unsuccessful commands will return False. - :param path: Path to where symlink should be created. - :param name: Name of the symlink. - :param reference: Source path of directory. - """ - sym_path = os.path.join(path, name) - - if not os.path.exists(sym_path): - if os.path.isfile(reference): - proc = subprocess.Popen('cmd /c mklink "{}" "{}"'.format(name, reference), cwd=path, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - elif os.path.isdir(reference): - proc = subprocess.Popen('cmd /c mklink /J "{}" "{}"'.format(name, reference), cwd=path, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - exit_code = proc.wait() - - if exit_code == 0: - logger.info("Successfully created symlink from {} to {}".format(reference, sym_path)) - return True - elif "You do not have sufficient privilege to perform this operation" in proc.stderr.read(): - raise AssertionError("Permissions denied. You should be running this script with Admin rights.") - - else: - raise AssertionError("The command could not run successfully.") - - else: - logger.info("Directory or file already exists: {}".format(os.path.join(path, name))) - return False - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description='Creates 3rdParty symlink.') - parser.add_argument('-symlink_path', metavar='symlink_path', type=str, required=True, - help='The path to create the 3rdParty symlink. If folder exists, symlinks will be' - 'created inside the 3rdParty folder.') - parser.add_argument('-name', metavar='symlink_name', type=str, default='3rdParty', - help='Name of symlink created. Defaults to 3rdParty.') - parser.add_argument('-source_path', metavar='source_path', type=str, required=True, - help='The path where the source 3rdParty is located.') - args = parser.parse_args() - - sym_path = os.path.join(args.symlink_path, args.name) - - # If there is an existing directory, copy all source contents as symlinks. - if not create_symlink(args.symlink_path, args.name, args.source_path): - for file_dir in os.listdir(args.source_path): - create_symlink(sym_path, file_dir, os.path.join(args.source_path, file_dir)) diff --git a/Tests/shared/logging_utils.py b/Tests/shared/logging_utils.py deleted file mode 100755 index 0d822c077d..0000000000 --- a/Tests/shared/logging_utils.py +++ /dev/null @@ -1,36 +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. -""" - -def extract_log_lines(start_line_marker, end_line_marker, log_file, platform, level): - """ - Parses log for a start and end marker, and extracts all lines between the markers. - :param start_line_marker: String that marks beginning of loglines to extract. - :param end_line_marker: String that marks end of loglines to extract. - :param log_file: Path to log to parse. - :param platform: Platform under test passed from test parameterization. - :param level: Level under test passed from test parameterization. - """ - extracted_log = '{}_{}_log.txt'.format(platform, level) - - with open(log_file) as log: - match = False - new_log = None - - for line in log: - if start_line_marker in line: - match = True - new_log = open(extracted_log, 'w') - elif end_line_marker in line: - break - elif match: - new_log.write(line) - if new_log: - new_log.close() diff --git a/Tests/shared/network_utils.py b/Tests/shared/network_utils.py deleted file mode 100755 index b51e12e2c5..0000000000 --- a/Tests/shared/network_utils.py +++ /dev/null @@ -1,65 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -import logging -import psutil -import socket - - -logger = logging.getLogger(__name__) - - -def check_for_listening_port(port): - """ - Checks to see if the connection to the designated port was established. - :param port: Port to listen to. - :return: True if port is listening. - """ - port_listening = False - for conn in psutil.net_connections(): - if 'port={}'.format(port) in str(conn): - port_listening = True - return port_listening - - -def check_for_remote_listening_port(port, ip_addr='127.0.0.1'): - """ - Tries to connect to a port to see if port is listening. - :param port: Port being tested. - :param ip_addr: IP address of the host being connected to. - :return: True if connection to the port is established. - """ - port_listening = True - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - try: - sock.connect((ip_addr, port)) - except socket.error as err: - if err.errno == 10061: - port_listening = False - finally: - sock.close() - return port_listening - - -def get_local_ip_address(): - """ - Finds the IP address for the primary ethernet adapter by opening a connection and grabbing its IP address. - :return: The IP address for the adapter used to make the connection. - """ - sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - try: - # Connecting to Google's public DNS so there is an open connection - # and then getting the address used for that connection - sock.connect(('8.8.8.8', 80)) - host_ip = sock.getsockname()[0] - finally: - sock.close() - return host_ip diff --git a/Tests/shared/pipeline_utils.py b/Tests/shared/pipeline_utils.py deleted file mode 100755 index a909c7a685..0000000000 --- a/Tests/shared/pipeline_utils.py +++ /dev/null @@ -1,170 +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. - -Small library of functions to support autotests for asset processor - -""" - -import os -import shutil -import re -import ly_test_tools.environment.file_system as fs -import hashlib -import shutil -import logging - -logger = logging.getLogger(__name__) - -def compare_assets_with_cache(assets, assets_cache_path): - """ - Given a list of assets names, will try to find them (disrespecting file extensions) from project's Cache folder with test assets - :param assets: A list of assets to be compared with Cache - :param assets_cache_path: A path to cache test assets folder - :return: A tuple with two lists - first is missing in cache assets, second is existing in cache assets - """ - missing_assets = [] - existing_assets = [] - if os.path.exists(assets_cache_path): - files_in_cache = list(map(fs.remove_path_and_extension, os.listdir(assets_cache_path))) - for asset in assets: - file_without_ext = fs.remove_path_and_extension(asset).lower() - if file_without_ext in files_in_cache: - existing_assets.append(file_without_ext) - files_in_cache.remove(file_without_ext) - else: - missing_assets.append(file_without_ext) - else: - missing_assets = assets - return missing_assets, existing_assets - - -def copy_assets_to_project(assets, source_directory, target_asset_dir): - """ - Given a list of asset names and a directory, copy those assets into the target project directory - :param assets: A list of asset names to be copied - :param source_directory: A path string where assets are located - :param target_asset_dir: A path to project tests assets directory where assets will be copied over to - :return: None - """ - for asset in assets: - full_name = os.path.join(source_directory, asset) - shutil.copy(full_name, target_asset_dir) - - -def prepare_test_assets(assets_path, function_name, project_test_assets_dir): - """ - Given function name and assets cache path, will clear cache and copy test assets assigned to function name to project's folder - :param assets_path: Path to tests assets folder - :param function_name: Name of a function that corresponds to folder with assets - :param project_test_assets_dir: A path to project directory with test assets - :return: Returning path to copied assets folder - """ - test_assets_folder = os.path.join(assets_path, 'assets', function_name) - copy_assets_to_project(os.listdir(test_assets_folder), test_assets_folder, project_test_assets_dir) - return test_assets_folder - - -def find_joblog_file(joblogs_path, regexp): - """ - Given path to joblogs files and asset name in form of regexp, will try to find joblog file for provided asset; if multiple - will return first occurrence - :param joblogs_path: Path to a folder with joblogs files to look for needed file - :param regexp: Python Regexp containing name of the asset that was processed, for which we're looking joblog file for - :return: Full path to joblog file, empty string if not found - """ - for file_name in os.listdir(joblogs_path): - if re.match(regexp, file_name): - return os.path.join(joblogs_path, file_name) - return '' - - -def find_missing_lines_in_joblog(joblog_location, strings_to_verify): - """ - Given joblog file full path and list of strings to verify, will find all missing strings in the file - :param joblog_location: Full path to joblog file - :param strings_to_verify: List of string to look for in joblog file - :return: Subset of original strings list, that were not found in the file - """ - lines_not_found = [] - with open(joblog_location, 'r') as f: - read_data = f.read() - for line in strings_to_verify: - if line not in read_data: - lines_not_found.append(line) - return lines_not_found - - -def clear_project_test_assets_dir(test_assets_dir): - """ - On call - deletes test assets dir if it exists and creates new empty one - :param test_assets_dir: A path to tests assets dir - :return: None - """ - if os.path.exists(test_assets_dir): - fs.delete([test_assets_dir], True, True) - os.mkdir(test_assets_dir) - - -def get_files_hashsum(path_to_files_dir): - """ - On call - calculates md5 hashsums for filecontents. - :param path_to_files_dir: A path to files directory - :return: Returns a dict with initial filenames from path_to_files_dir as keys and their contents hashsums as values - """ - checksum_dict = {} - try: - for fname in os.listdir(path_to_files_dir): - with open(os.path.join(path_to_files_dir, fname), 'rb') as fopen: - checksum_dict[fname] = hashlib.sha256(fopen.read()).digest() - except IOError: - logger.error('An error occured trying to read file') - return checksum_dict - - -def append_to_filename(file_name, path_to_file, append_text, ignore_extension): - """ - Function for appending text to file and folder names - :param file_name: Name of a file or folder - :param path_to_file: Path to file or folder - :param append_text: Text to append - :param ignore_extension: True or False for ignoring extensions - :return: None - """ - new_name = '' - if not ignore_extension: - (name, extension) = file_name.split('.') - new_name = name + append_text + '.' + extension - else: - new_name = file_name + append_text - os.rename(os.path.join(path_to_file, file_name), os.path.join(path_to_file, new_name)) - - -def create_asset_processor_backup_directories(backup_root_directory, test_backup_directory): - """ - Function for creating the asset processor logs backup directory structure - :param backup_root_directory: The location where logs should be stored - :param test_backup_directory: The directory for the specific test being ran - :return: None - """ - if not os.path.exists(os.path.join(backup_root_directory, test_backup_directory)): - os.makedirs(os.path.join(backup_root_directory, test_backup_directory)) - - -def backup_asset_processor_logs(bin_directory, backup_directory): - """ - Function for backing up the logs created by asset processor to designated backup directory - :param bin_directory: The bin directory created by the lumberyard build process - :param backup_directory: The location where asset processor logs should be backed up to - :return: None - """ - ap_logs = os.path.join(bin_directory, 'logs') - - if os.path.exists(ap_logs): - destination = os.path.join(backup_directory, 'logs') - shutil.copytree(ap_logs, destination) diff --git a/Tests/shared/process_utils.py b/Tests/shared/process_utils.py deleted file mode 100755 index 33ab175600..0000000000 --- a/Tests/shared/process_utils.py +++ /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. -""" - -from contextlib import contextmanager -import psutil -import subprocess - - -@contextmanager -def managed_popen(args_list, cwd=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT): - """ - Context manager for subprocess.Popen objects which allows Popen to be used in a with/as statement. - This should not be used with processes that are to continue running outside of the with block. - :param args_list: Sequence of arguments as they would be passed to a terminal. - :param cwd: The current working directory to use when issuing the command. - :param stdout: File handle or pipe to use for stdout. - :param stderr: File handle or pipe to use for stderr. - """ - process = subprocess.Popen(args_list, cwd=cwd, stdout=stdout, stderr=stderr) - try: - yield process - finally: - if not process.poll(): - process.terminate() - - -def get_psutil_process(process_name): - """ - Gets a reference to a psutil.Process object with the given process name. - :return: A reference to the first process encountered with the given name or None if no process is found. - """ - for process in psutil.process_iter(): - if process_name == process.name(): - return process - return None diff --git a/Tests/shared/s3_utils.py b/Tests/shared/s3_utils.py deleted file mode 100755 index 403cf75642..0000000000 --- a/Tests/shared/s3_utils.py +++ /dev/null @@ -1,145 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -import boto3 -import botocore.exceptions -import logging -import os - -import test_tools.shared.file_system as file_system - -logger = logging.getLogger(__name__) -s3 = boto3.resource('s3') - - -class BucketNotExists(Exception): - pass - - -class KeyExistsError(Exception): - pass - - -class KeyDoesNotExistError(Exception): - pass - - -def create_folder_in_bucket(bucket_name, folder_key): - """ - Given bucket name and folder key will create specified folder if it doesn't exist - :param bucket_name: name of the bucket where folder will be created - :param folder_key: key in s3 where folder will be created (i.e. specifying full path to folder in s3) - :return: True if folder was successfully created, False otherwise, will raise BucketNotExists exception if - bucket doesn't exist - """ - if not bucket_exists_in_s3(bucket_name): - raise BucketNotExists("Bucket {} does not exist.".format(bucket_name)) - - if key_exists_in_bucket(bucket_name, '{}/'.format(folder_key)): - logger.error("Key {} already exists in bucket {}".format(folder_key, bucket_name)) - return False - - s3_bucket = s3.Bucket(bucket_name) - logger.info("Creating {} folder in a {} bucket".format(folder_key, bucket_name)) - s3_bucket.put_object(Bucket=bucket_name, Key=(folder_key+'/')) - return True - - -def upload_to_bucket(bucket_name, file_path, file_key=None, overwrite=False): - """ - Uploads a given file to the given S3 bucket. - :param bucket_name: Name of the S3 bucket where the file should be uploaded. - :param file_path: Full Path to the target file on hard drive. - :param file_key: Needed path to file on s3 (including file name). - :param overwrite: Overwrite the key if it exists. - """ - if not bucket_exists_in_s3(bucket_name): - s3.create_bucket(Bucket=bucket_name) - - s3_bucket = s3.Bucket(bucket_name) - - if file_key is None: - file_key = os.path.basename(file_path) - - if not overwrite and key_exists_in_bucket(bucket_name, file_key): - raise KeyExistsError("Key '{}' already exists in S3 bucket {}".format(file_key, bucket_name)) - - s3_bucket.upload_file(file_path, file_key) - logger.info("Uploading {} to S3 bucket {}".format(file_key, bucket_name)) - - -def download_from_bucket(bucket_name, file_key, destination_dir, file_name=None): - """ - Download the given key from the given S3 bucket to the given destination. Logs an error if there is not enough \ - space available for the download. - :param bucket_name: Name of the S3 bucket containing the desired file. - :param file_key: Name of the file stored in S3. - :param destination_dir: Directory where the file should be downloaded to. - :param file_name: The name of the file you want to save it as. Defaults to the file_key. - """ - bucket_exists_in_s3(bucket_name) - - if not key_exists_in_bucket(bucket_name, file_key): - raise KeyDoesNotExistError("Key '{}' does not exist in S3 bucket {}".format(file_key, bucket_name)) - - obj_summary = s3.ObjectSummary(bucket_name, file_key) - required_space = obj_summary.size - disk_name = os.path.splitdrive(destination_dir)[0] - - file_system.check_free_space(disk_name, required_space, "Insufficient space available for download:") - - if not os.path.exists(destination_dir): - os.makedirs(destination_dir) - - if file_name is None: - file_name = file_key - destination_path = os.path.join(destination_dir, file_name) - s3.Object(bucket_name, file_key).download_file(destination_path) - logger.info("Downloading {} to {}".format(file_key, destination_path)) - - -def bucket_exists_in_s3(bucket_name): - """ - Verifies that the S3 bucket exists. - :param bucket_name: Name of the S3 bucket that may or may not exist. - :return: True if the bucket exists. False otherwise. - """ - bucket_exists = True - - try: - s3.meta.client.head_bucket(Bucket=bucket_name) - except botocore.exceptions.ClientError as err: - if err.response['Error']['Code'] == '404': - bucket_exists = False - - return bucket_exists - - -def key_exists_in_bucket(bucket_name, file_key): - """ - Verifies that the given key does not already exist in the given S3 bucket. - :param bucket_name: Name of the S3 bucket that may or may not contain the file key. - :param file_key: Name of the file key in question. - :return: True if the key exists. False otherwise. - """ - key_exists = True - obj_summary = s3.ObjectSummary(bucket_name, file_key) - - # Attempting to access any member of ObjectSummary for a nonexistent key will throw an exception - # There is no built-in way to check key existence otherwise - try: - obj_summary.size - except botocore.exceptions.ClientError as err: - if err.response['Error']['Code'] == '404': - key_exists = False - - return key_exists - diff --git a/Tests/shared/screenshot_utils.py b/Tests/shared/screenshot_utils.py deleted file mode 100755 index 0c64bb848a..0000000000 --- a/Tests/shared/screenshot_utils.py +++ /dev/null @@ -1,203 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -import os -import botocore.exceptions -import string -import boto3 - -from test_tools.shared.file_utils import move_file - -import test_tools.launchers.phase as phase -import shared.s3_utils as s3_utils -from test_tools.shared.remote_console_commands import get_screenshot_command -from test_tools.shared.waiter import wait_for -from test_tools import HOST_PLATFORM -from test_tools.shared.images.qssim import qssim as compare_screenshots -from test_tools.shared.launcher_testlib import retry_console_command - - -def take_screenshot(remote_console_instance, launcher, screenshot_name): - """ - Takes an in game screenshot using the remote console instance passed in, validates that the screenshot exists - and then renames that screenshot to something defined by the user of this function. - :param remote_console_instance: Remote console instance that is attached to a specific launcher instance - :param launcher: Launcher instance so we can use the file exists functionality provided by test_tools - :param screenshot_name: Name of the screenshot - :return: None - """ - get_screenshot_command(remote_console_instance) - screenshot_path = os.path.join(launcher.workspace.release.paths.platform_cache(), 'user', 'screenshots') - launcher.run(phase.FileExistsPhase(os.path.join(screenshot_path, 'screenshot0000.jpg'))) - wait_for(lambda: rename_screenshot(screenshot_path, screenshot_name), - timeout=120, - exc=AssertionError('Screenshot at path:{} and with name:{} is still in use.'.format(screenshot_path, screenshot_name))) - - -def rename_screenshot(screenshot_path, screenshot_name): - """ - Tries to rename the screenshot when the file is done being written to - :param screenshot_path: Path to the Screenshot folder - :param screenshot_name: Name we wish to change the screenshot to - :return: True when operation is completed, False if the file is still in use - """ - try: - print 'Trying to rename {} to {}.'.format(os.path.join(screenshot_path, 'screenshot0000.jpg'), os.path.join(screenshot_path, '{}.jpg'.format(screenshot_name))) - os.rename(os.path.join(screenshot_path, 'screenshot0000.jpg'), - os.path.join(screenshot_path, '{}.jpg'.format(screenshot_name))) - return True - except OSError as e: - print ('Found error {0} when trying to rename screenshot. {1}'.format(str(e), str(e.message))) - return False - - -def move_screenshots(screenshot_path, file_type, logs_path): - """ - Moves screenshots of a specific file type to the flume location so we can gather all of the screenshots we took. - :param screenshot_path: Path to the screenshot folder - :param file_type: Types of Files to look for. IE .jpg, .tif, etc - :param logs_path: Path where flume gathers logs to be upload - """ - for file_name in os.listdir(screenshot_path): - if file_name.endswith(file_type): - move_file(screenshot_path, logs_path, file_name) - - -def screenshot_command(remote_console_instance, command_to_run, expected_log_line): - """ - This is just a helper function to help send and validate against screenshot console commands. - :param remote_console_instance: Remote console instance - :param command_to_run: The Screenshot command that you wish to run - :param expected_log_line: The console log line to expect in order to set the event to true - :return: - """ - return retry_console_command(remote_console_instance, command_to_run, expected_log_line) - - -def get_screenshot_command_with_retries(remote_console_instance): - """ - Used for an in-game screenshot - :param remote_console_instance: Remote console instance - :return: None - """ - if (HOST_PLATFORM == 'win_x64'): - command = 'Screenshot: @user@\screenshots/' - else: - command = 'Screenshot: @user@/screenshots/' - - wait_for(lambda: screenshot_command(remote_console_instance, 'r_GetScreenShot 1', command), timeout=240, - exc=AssertionError('Screenshot command failed')) - - -def take_screenshot_with_retries(remote_console_instance, launcher, screenshot_name): - """ - Takes an in game screenshot using the remote console instance passed in, validates that the screenshot exists - and then renames that screenshot to something defined by the user of this function. - :param remote_console_instance: Remote console instance that is attached to a specific launcher instance - :param launcher: Launcher instance so we can use the file exists functionality provided by test_tools - :param screenshot_name: Name of the screenshot - :return: None - """ - get_screenshot_command_with_retries(remote_console_instance) - screenshot_path = os.path.join(launcher.workspace.release.paths.platform_cache(), 'user', 'screenshots') - launcher.run(phase.FileExistsPhase(os.path.join(screenshot_path, 'screenshot0000.jpg'))) - wait_for(lambda: rename_screenshot(screenshot_path, screenshot_name), - timeout=120, - exc=AssertionError('Screenshot taken is still in use')) - - -def compare_golden_image(similarity_threshold, screenshot, screenshot_path, golden_image_name, - golden_image_path=None): - """ - This function assumes that your golden image filename contains the same base screenshot name and the word "golden" - ex. pc_gamelobby_golden - - :param similarity_threshold: A float from 0.0 - 1.0 that determines how similar images must be or an asserts - :param screenshot: A string that is the full name of the screenshot (ex. 'gamelobby_host.jpg') - :param screenshot_path: A string that contains the path to the screenshots - :param golden_image_path: A string that contains the path to the golden images, defaults to the screenshot_path - :return: - """ - if golden_image_path is None: - golden_image_path = screenshot_path - - mean_similarity = compare_screenshots('{}\{}'.format(screenshot_path, screenshot), - '{}\{}'.format(golden_image_path, golden_image_name)) - assert mean_similarity > similarity_threshold, \ - '{} screenshot comparison failed! Mean similarity value is: {}'\ - .format(screenshot, mean_similarity) - - -def take_screenshot_and_compare(remote_console, launcher, screenshot, similarity_threshold, - golden_image_name, screenshot_path=None, file_type='.jpg'): - """ - Takes a screenshot and compares it with its golden image. This utilizes the take_screenshot_with_retries function - which is only used for PC. There are some assumptions with the golden image naming convention that is explained in - the compare_golden_image function. This also assumes it is a jpg file. - - This function enforces a naming convention such that the golden image and screenshot share part of the same name. - Also, the screenshot will be appended with the screenshot_key as shown below. - - The screenshot name will be screenshot_base + screenshot_key + filetype - (ex. 'gamelobby_host.jpg', 'MultiplayerSampleClient_1.png') - - :param screenshot_base: A string that is the base name of the screenshot (ex. 'gamelobby') - :param screenshot_key: A string that acts as a key identifier for the screenshot. - :param similarity_threshold: A float from 0.0 - 1.0 that determines how similar images must be or it asserts - :param screenshot_path: A string for the screenshot path. Defaults to user/screenshots - :param file_type: A string for the screenshot filetype. Defaults to '.jpg' - :return: - """ - if screenshot_path is None: - screenshot_path = r'{}\user\screenshots'.format(launcher.workspace.release.paths.platform_cache()) - - take_screenshot_with_retries(remote_console, launcher, screenshot) - compare_golden_image(similarity_threshold, '{}{}'.format(screenshot, file_type), - screenshot_path, golden_image_name) - - -def download_qa_golden_images(project_name, destination_dir, platform): - """ - Downloads the golden images for a specified project from s3. The project_name, platform, and filetype are used to - filter which images will be downloaded as the golden images. - - https://s3.console.aws.amazon.com/s3/buckets/ly-qae-jenkins-configs/golden-images/?region=us-west-1&tab=overview - - :param project_name: a string of the project name of the folder in s3. ex: 'MultiplayerSample' - :param destination_dir: a string of where the images will be downloaded to - :param platform: a string for the platform type ('pc', 'android', 'ios', 'darwin') - :param filetype: a string for the file type. ex: '.jpg', '.png' - :return: - """ - bucket_name = 'ly-qae-jenkins-configs' - path = 'golden-images/{}/{}/'.format(project_name, platform) - - if not s3_utils.key_exists_in_bucket(bucket_name, path): - raise s3_utils.KeyDoesNotExistError("Key '{}' does not exist in S3 bucket {}".format(path, bucket_name)) - for image in s3_utils.s3.Bucket(bucket_name).objects.filter(Prefix=path): - file_name = string.replace(image.key, path, '') - if file_name != '': - s3_utils.download_from_bucket(bucket_name, image.key, destination_dir, file_name) - - -def prepare_for_screenshot_compare(remote_console_instance): - """ - Prepares launcher for screenshot comparison. Removes any debug text and antialiasing that may result in interference - with the comparison. - - :param remote_console_instance: Remote console instance that is attached to a specific launcher instance - :return: - """ - wait_for(lambda: retry_console_command(remote_console_instance, 'r_displayinfo 0', - '$3r_DisplayInfo = $60 $5[DUMPTODISK, RESTRICTEDMODE]$4'), timeout=120) - wait_for(lambda: retry_console_command(remote_console_instance, 'r_antialiasingmode 0', - '$3r_AntialiasingMode = $60 $5[]$4'), timeout=120) - diff --git a/Tests/shared/shader_compile_server_utils.py b/Tests/shared/shader_compile_server_utils.py deleted file mode 100755 index 4c93970561..0000000000 --- a/Tests/shared/shader_compile_server_utils.py +++ /dev/null @@ -1,120 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -""" - -import logging -import os -import psutil -import subprocess - -import test_tools.shared.file_system as file_system -from test_tools.shared.process_utils import kill_processes_named -from test_tools import HOST_PLATFORM - -logger = logging.getLogger(__name__) - - -def start_shader_compile_server(tools_dir, build_config, win_x64_compiler, clean=True): - """ - Starts the shader compile server for the given compiler version. Failure is currently not checked due to issues - with detecting if the process is alive immediately after requesting it to be spun up. - :param tools_dir: Tools directory inside of the dev root. - :param build_config: Build configuration name (profile, debug, etc.). - :param win_x64_compiler: Windows compiler version used to build the project. - :param clean: Removes Cache, Error, Shaders, and Temp directories if set to True. - """ - shader_compile_server_dir = os.path.join(tools_dir, 'CrySCompileServer', 'x64', build_config) - os.chdir(shader_compile_server_dir) - - shader_compile_server_exe = build_shader_compile_server_file_name(win_x64_compiler) - - # Only one shader compile server can run at a time, so kill the currently running process if any - kill_processes_named(shader_compile_server_exe) - - if clean: - clean_shader_compile_server_files(tools_dir, build_config) - - logger.info("Attempting to start shader compile server") - # Running with basic user permissions since the shader compile server warns against running as admin - subprocess.Popen(['RunAs', '/trustlevel:0x20000', shader_compile_server_exe]) - - -def start_mac_shader_compile_server(tools_dir, build_config, clean=True): - """ - Mac version of starting shader compiler given build configuration. Failure is currently not checked due to issues - with detecting if the process is alive immediately after requesting it to be spun up. - :param tools_dir: Tools directory inside of the dev root. - :param build_config: Build configuration name (profile, debug, etc.). - :param clean: Removes Cache, Error, Shaders, and Temp directories if set to True. - :return: Returns the actual process. - """ - shader_compile_server_dir = os.path.join(tools_dir, 'CrySCompileServer', 'osx', build_config) - os.chdir(shader_compile_server_dir) - - kill_processes_named('CrySCompileServer') - - if clean: - clean_shader_compile_server_files(tools_dir, build_config) - - logger.info("Attempting to start shader compile server") - subprocess.Popen('./CrySCompileServer', shell=True) - - -def build_shader_compile_server_file_name(win_x64_compiler): - """ - Puts together the shader compile server file name based on the specified VC compiler version. - :param win_x64_compiler: The VC compiler version specified in vsyyyy format, where yyyy is a year (ex: vs2017) - :return: The shader compile server file name complete with extension. - """ - shader_compile_server_exe = 'CrySCompileServer' - - return '{}.exe'.format(shader_compile_server_exe) - - -def clean_shader_compile_server_files(tools_dir, build_config): - """ - Removes the shader compile server generated Cache, Error, Shaders, and Temp directories. - :param tools_dir: Tools directory inside of the dev root. - :param build_config: Build configuration name (profile, debug, etc.). - """ - if HOST_PLATFORM == 'win_x64': - shader_compile_server_dir = os.path.join(tools_dir, 'CrySCompileServer', 'x64', build_config) - else: - shader_compile_server_dir = os.path.join(tools_dir, 'CrySCompileServer', 'osx', build_config) - os.chdir(shader_compile_server_dir) - - shader_compile_server_dirs = [os.path.join(shader_compile_server_dir, 'Cache'), - os.path.join(shader_compile_server_dir, 'Error'), - os.path.join(shader_compile_server_dir, 'Shaders'), - os.path.join(shader_compile_server_dir, 'Temp')] - if not file_system.delete(shader_compile_server_dirs, True, True): - directories_still_present = [] - for directory in shader_compile_server_dirs: - if os.path.exists(directory): - directories_still_present.append(directory) - raise RuntimeError("Failed to clean folders {} from directory {}".format(directories_still_present, - shader_compile_server_dir)) - - -def stop_shader_compile_server(): - """ - Finds any process with CrySCompileServer in its name and kills it. - """ - # This is necessary because the shader compile server is spawned from another process which - # immediately terminates after spawning its child - for process in psutil.process_iter(): - try: - if 'CrySCompileServer' in process.name(): - success_code = process.kill() - if success_code == 0: - logger.error("Failed to terminate CrySCompileServer process") - except psutil.NoSuchProcess: - # Process was already killed but caught as a zombie process, so pass as normal. - pass diff --git a/Tests/shared/substring.py b/Tests/shared/substring.py deleted file mode 100755 index 45c5f6d3af..0000000000 --- a/Tests/shared/substring.py +++ /dev/null @@ -1,73 +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. - -String and search related functions. -""" -import os -import re - - -def in_file(file_path, pattern_string): - """ - This method checks if pattern_string exists in any line in the file specified in file_path. - It cannot match multi-line patterns. - :param file_path: files path for the file to search in - :param pattern_string: string to search for. - :return: True if the String is found, False otherwise. - """ - if not os.path.exists(file_path): - raise RuntimeError("File does not exist at {}".format(file_path)) - if not pattern_string: - raise RuntimeError("Must provide string to search for") - - with open(file_path, "r") as game_log: - for line in game_log.readlines(): - if pattern_string in line: - return True - return False - - -def regex_in_file(file_path, pattern_string): - """ - This method uses regex to check if pattern_string exists in the file specified in file_path. - It can match multi-line patterns but is a lot heavier as it parses whole file as string. - :param file_path: files path for the file to search in - :param pattern_string: regex-pattern to search for. - :return: True if the regex-pattern is found found in file, False otherwise. - """ - if not os.path.exists(file_path): - raise RuntimeError("File does not exist at {}".format(file_path)) - if not pattern_string: - raise RuntimeError("Must provide string to search for") - - re.compile(pattern_string) - with open(file_path, "r") as game_log: - return re.search(pattern_string, game_log.read()) - - -def regex_in_lines_in_file(file_path, pattern_string): - """ - This method uses regex to check if pattern_string exists in any line in the file specified in file_path. - It cannot match multi-line patterns, but will often more performant than regex_in_file. - :param file_path: files path for the file to search in - :param pattern_string: regex-pattern to search for. - :return: True if the regex-pattern is found found in file, False otherwise. - """ - if not os.path.exists(file_path): - raise RuntimeError("File does not exist at {}".format(file_path)) - if not pattern_string: - raise RuntimeError("Must provide string to search for") - - re.compile(pattern_string) - with open(file_path, "r") as game_log: - for line in game_log.readlines(): - if re.search(pattern_string, line): - return True - return False diff --git a/Tests/shared/windows_registry_utils.py b/Tests/shared/windows_registry_utils.py deleted file mode 100755 index 9f10317ea9..0000000000 --- a/Tests/shared/windows_registry_utils.py +++ /dev/null @@ -1,96 +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. - -Small library of functions to support autotests for utilizing Windows Utilities - -""" - -import logging -import winreg -logger = logging.getLogger(__name__) - - -def registry_key_exists(registry_hive, registry_key, registry_subkey): - """ - Searches the Windows registry for the existance of a registry key - :param registry_hive: The hive in which to find keys & subkeys. EG: HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER - :param registry_key: The bin directory from which to launch the AssetProcessor executable. - :param registry_subkey: The subkey that can contain a value assignment - :return: A boolean value of the existance of the key - """ - - try: - registryKey = winreg.OpenKey(registry_hive, registry_key) - logger.debug("Registry Key: {0} found.".format(registry_key)) - - winreg.QueryValueEx(registryKey, registry_subkey) - logger.debug("Registry Subkey: {0} found.".format(registry_subkey)) - - registryKey.Close() - - return True - except WindowsError: - # Do not raise an assert since tests could revolve around a non-existant key - logger.debug("Registry SubKey: {0} was not found.".format(registry_key)) - return False - - -def get_registry_key_value(registry_hive, registry_key, registry_subkey): - """ - If a registry key exists, it will return the value else return None - :param registry_hive: The hive in which to find keys & subkeys. EG: HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER - :param registry_key: The bin directory from which to launch the AssetProcessor executable. - :param registry_subkey: The subkey that can contain a value assignment - :return: The value of the registry key value - """ - - if registry_key_exists(registry_hive, registry_key, registry_subkey): - - registryKey = winreg.OpenKey(registry_hive, registry_key) - logger.debug("Registry Key: {0} found.".format(registry_key)) - - subkeyValue = winreg.QueryValueEx(registryKey, registry_subkey) - logger.debug("Registry Subkey: {0} value found is is set to {1}".format(registry_subkey, subkeyValue)) - - registryKey.Close() - logger.debug("Registry Key hander closed") - - return str(subkeyValue[0]) # Index 0 contains the value, Index 1 contains the registry value type - else: - assert None, "Could not retrieve Registry Key Value since Registry Key '{0}' was not found.".format(registry_key) - - -def check_registry_key_value(registry_hive, registry_key, registry_subkey, expected='', case_sensitive=True): - """ - If registry key exists, then case insensitively checks that the registry key value is as expected - :param registry_hive: The hive in which to find keys & subkeys. EG: HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER - :param registry_key: The bin directory from which to launch the AssetProcessor executable. - :param registry_subkey: The subkey that can contain a value assignment - :param expected: The expected value to be found in the registry - :param case_sensitive: Whether or not to perform a case sensitive or insentive validation - :return: A boolean value if the registry key value matches expected - """ - - if registry_key_exists(registry_hive, registry_key, registry_subkey): - - subkeyValue = get_registry_key_value(registry_hive, registry_key, registry_subkey) - - if case_sensitive: - logger.debug("Case sensitive comparison of Subkey '{0}' to Expected Value '{1}'" - .format(subkeyValue, expected)) - return subkeyValue == expected - else: - logger.debug("Case insensitive comparison of Subkey '{0}' to Expected Value '{1}'" - .format(subkeyValue, expected)) - return subkeyValue.lower() == expected.lower() - else: - logger.debug("Could not compare Subkey Value to expected value, Subkey '{0}' was not found at Key {1}." - .format(registry_subkey, registry_key)) - return False diff --git a/Tests/shared/windows_utils.py b/Tests/shared/windows_utils.py deleted file mode 100755 index a6bcff8d91..0000000000 --- a/Tests/shared/windows_utils.py +++ /dev/null @@ -1,130 +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. - -Small library of functions to support autotests for utilizing Windows Utilities - -""" - -import logging -import psutil -import os -import subprocess -import pyscreenshot as winScreenshot - -from _winreg import * - -logger = logging.getLogger(__name__) - -def kill_app_by_name(project): - """ - Kills the app on windows for the specified app name - :param name: name of app running on the devkit to kill - """ - process_name = project + 'Launcher.exe' - for proc in psutil.process_iter(): - # check whether the process to kill name matches - if proc.name() == process_name: - proc.kill() - -def take_screenshot(result_path, image_filename, project=None): - """ - Takes a windows screenshot - :param result_path: path for the output file - :param image_filename: filename for the new image - :param project: project name for the running process, if provided only the window for this process will be captured - """ - if not os.path.exists(result_path): - os.mkdir(result_path) - - filename = "{}.png".format(image_filename) - filename = os.path.join(result_path, filename) - - image = winScreenshot.grab() # bbox=(10, 10, 510, 510)) # X1,Y1,X2,Y2 - image.save(filename) - - if not os.path.exists(filename): - # Capture failed - return False - - return True - -def launch(bin_path, project, parameters = None): - command_line = [os.path.join(bin_path, project + 'Launcher.exe')] - if parameters != None: - command_line = command_line + parameters - process = subprocess.Popen(command_line, stdout=subprocess.PIPE) - process.poll() - -def check_registry_key_exits(registry_key): - """ - Searches the Windows registry for the existance of a registry key - :param registry_key: The bin directory from which to launch the AssetProcessor executable. - :return: A boolean value of the existance of the key - """ - try: - registryHandle = ConnectRegistry(None, HKEY_LOCAL_MACHINE) - registryKey = OpenKey(registryHandle, registry_key) - - logger.info("Registry Key: {0} found.".format(registry_key)) - registryKey.Close() - registryHandle.Close() - - return True - except: - logger.error("Registry Key: {0} was not found.".format(registry_key)) - return False - -def get_registry_key_value(registry_key): - """ - If a registry key exists, it will return the value else return None - :param registry_key: The bin directory from which to launch the AssetProcessor executable. - :return: The value of the registry key value - """ - if check_registry_key_exits(registry_key): - logger.log("Retrieving the value of Registry Key '{0}'" - .format(registry_key)) - - registryHandle = ConnectRegistry(None, HKEY_LOCAL_MACHINE) - registryKey = OpenKey(registryHandle, registry_key) - - keyValue = registryKey.Value() - - registryKey.Close() - registryHandle.Close() - - return keyValue - else: - logger.error("Could not retrieve Registry Key Value since Registry Key '{0}' was not found." - .format(registry_key)) - return None - - -def check_registry_key_value(registry_key, expected): - """ - If registry key exists, then checks that the registry key value is as expected - :param registry_key: The bin directory from which to launch the AssetProcessor executable. - :return: A boolean value if the registry key value matches expected - """ - if check_registry_key_exits(registry_key): - - keyValue = get_registry_key_value(registry_key) - - if str.lower(keyValue) == str.lower(expected): - logger.info("The value of Registry Key '{0}' matched the expected '{1}'" - .format(registry_key, expected)) - return True - else: - logger.error("The value of Registry Key '{0}' die not match the expected '{1}'" - .format(registry_key, expected)) - return False - else: - logger.error("Could not compare Registry Key Value to expected Registry Key '{0}' was not found." - .format(registry_key)) - return False diff --git a/Tests/test_lib/launcher_testlib.py b/Tests/test_lib/launcher_testlib.py deleted file mode 100755 index 00ff8bc598..0000000000 --- a/Tests/test_lib/launcher_testlib.py +++ /dev/null @@ -1,194 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -This launcher_testlib file is used for a collection of reusable functionality that QA will use in their scripts. -""" - -import os - -import test_tools.shared.asset_processor_utils as asset_processor_utils -import test_tools.shared.file_utils as file_utils -import shared.shader_compile_server_utils as compile_server -import test_tools.shared.file_system as file_system - - -def setup_win_launcher_test(launcher): - """ - Assert that the launcher was able to build and that assets were processed successfully. - - :param launcher: The test-tools Launcher to be built. - """ - assert_build_success(launcher) - assert_process_assets(launcher) - - -def setup_mac_launcher_test(launcher, configuration): - """ - Assert that the launcher was able to build and that assets were processed successfully. Also starts the Mac - shader compile server. - - :param launcher: The test-tools Launcher to be built. - :param configuration: The shader compile server configuration to be launched. - """ - assert_build_success(launcher) - assert_process_assets(launcher) - start_mac_shader_compile_server(launcher, configuration, '127.0.0.1') - - -def setup_android_launcher_test(launcher, configuration, win_x64_compiler_version): - """ - Builds the Windows asset processor, asserts that the launcher was able to build and that assets were processed - successfully, and starts the Windows shader compile server. - - :param launcher: The test-tools Launcher to be built. - :param configuration: The shader compile server configuration to be launched. - :param win_x64_compiler_version: The msvc compiler version used to build the shader compile server executable. - """ - assert_asset_processor_build_success(launcher.workspace.release, win_x64_compiler_version) - assert_build_success(launcher) - assert_process_assets(launcher) - - start_shader_compile_server(launcher, configuration, '127.0.0.1', win_x64_compiler_version) - - -def assert_asset_processor_build_success(release, win_x64_compiler_version): - """ - Builds the win_x64 AssetProcessor and asserts on build failure. - - For use with platforms that require Windows tools but not the Windows launcher. - - :param release: The test-tools Release which holds path info for the test environment in use. - :param win_x64_compiler_version: The msvc compiler version used to build the AssetProcessor. - """ - asset_proc_build_success = asset_processor_utils.build_win_x64(release.paths.dev(), release.configuration, - win_x64_compiler_version) - assert asset_proc_build_success, "AssetProcessor did not build properly" - - -def assert_process_assets(launcher): - """ - Runs the Asset Processor Batch and asserts if any assets fail to process. - - :param launcher: The test-tools Launcher to be built. - """ - process_assets_success = launcher.workspace.release.process_assets() - assert process_assets_success, 'Assets did not process correctly' - - -def assert_build_success(launcher): - """ - Runs the build command for specified launcher configuration and asserts if the build fails. - - :param launcher: The test-tools Launcher to be built. - """ - build_success = launcher.workspace.release.build() - assert build_success, "{} - Build Failed! - {} {} {}".format(launcher.workspace.release.project, - launcher.workspace.release.platform, - launcher.workspace.release.configuration, - launcher.workspace.release.spec) - -def start_shader_compile_server(launcher, configuration, ip_addr, win_x64_compiler_version): - """ - Deals with the extra setup to start the Windows shader compiler. - - :param launcher: The test-tools Launcher to be built. - :param configuration: The shader compile server configuration to be launched. - :param ip_addr: The IP address of the remote shader compile server and AssetProcessor. - :param win_x64_compiler_version: The msvc compiler version used to build the shader compile server executable. - """ - launcher.workspace.release.modify_bootstrap_setting('remote_ip', ip_addr) - launcher.workspace.release.modify_platform_setting('r_ShaderCompilerServer', ip_addr) - launcher.workspace.release.modify_platform_setting('log_RemoteConsoleAllowedAddresses', ip_addr) - compile_server.start_shader_compile_server(launcher.workspace.release.paths.tools(), configuration, - win_x64_compiler_version) - - -def start_mac_shader_compile_server(launcher, configuration, ip_addr='127.0.0.1'): - """ - Deals with the extra setup to start the Mac shader compiler. - - :param launcher: The test-tools Launcher to be built. - :param configuration: The shader compile server configuration to be launched. - :param ip_addr: The IP address of the remote shader compile server and AssetProcessor. - """ - launcher.workspace.release.modify_bootstrap_setting('remote_ip', ip_addr) - launcher.workspace.release.modify_platform_setting('r_ShaderCompilerServer', ip_addr) - launcher.workspace.release.modify_platform_setting('log_RemoteConsoleAllowedAddresses', ip_addr) - compile_server.start_mac_shader_compile_server(launcher.workspace.release.paths.tools(), configuration) - - -def set_launcher_startup_config_file(launcher, project_name, config_name, commands): - """ - Clears out the specified config_name file and adds the commands specified to the cfg file. - - :param launcher: The test-tools Launcher to be built. - :param project_name: Name of the game project in test. - :param config_name: Name of the config file holding the launcher's startup commands. - :param commands: List of commands to append to the specified config file. - """ - file_utils.clear_out_config_file(launcher.workspace.release.paths.project(), config_name) - config_path = os.path.join(launcher.workspace.release.paths.platform_cache(), project_name) - file_utils.add_commands_to_config_file(config_path, '{}.cfg'.format(config_name), commands) - - -def configure_setup(launcher, delete_logs=True, delete_shaders=True): - """ - Deletes old artifact folders and clears out any config files. - - :param launcher: - :param delete_logs: Delete the game project's logs directory if True. - :param delete_shaders: Delete the project's cache directory if True. - """ - if delete_logs: - delete_project_logs(launcher) - - if delete_shaders: - delete_shader_cache(launcher) - - file_utils.delete_screenshot_folder(launcher.workspace.release.paths.platform_cache()) - - file_utils.clear_out_config_file(launcher.workspace.release.paths.project(), 'initialmap') - file_utils.clear_out_config_file(launcher.workspace.release.paths.project(), 'autoexec') - - -def delete_project_logs(launcher): - """ - Deletes project logs in the launcher's project folder. - """ - if os.path.exists(launcher.workspace.release.paths.project_log()): - file_system.delete([launcher.workspace.release.paths.project_log()], True, True) - - -def delete_shader_cache(launcher, asset_type="pc"): - """ - Deletes shader cache in the launcher's project folder. - """ - user_folder = os.path.join(launcher.workspace.release.paths.project_cache(), asset_type, "user", "cache") - if os.path.exists(user_folder): - file_system.delete([user_folder], True, True) - - -def retry_console_command(remote_console, command, output, tries=10, timeout=10): - """ - Retries specified console command multiple times and asserts if it still can not send. - :param remote_console: the remote console connected to the launcher. - :param command: the command to send to the console. - :param output: The expected output to check if the command was sent successfully. - :param tries: The amount of times to try before asserting. - :param timeout: The amount of time in seconds to wait for each retry send. - :return: True if succeeded, will assert otherwise. - """ - while tries > 0: - check_command = remote_console.expect_log_line(output, timeout) - remote_console.send_command(command) - if check_command(): - return True - tries -= 1 - assert False, "Command \"{}\" failed to run in remote console.".format(command) diff --git a/Tests/workflow/__init__.py b/Tests/workflow/__init__.py deleted file mode 100755 index e912252f4e..0000000000 --- a/Tests/workflow/__init__.py +++ /dev/null @@ -1,12 +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. -""" - diff --git a/Tests/workflow/android/__init__.py b/Tests/workflow/android/__init__.py deleted file mode 100755 index e912252f4e..0000000000 --- a/Tests/workflow/android/__init__.py +++ /dev/null @@ -1,12 +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. -""" - diff --git a/Tests/workflow/android/workflow_android.py b/Tests/workflow/android/workflow_android.py deleted file mode 100755 index 4eb0f578b1..0000000000 --- a/Tests/workflow/android/workflow_android.py +++ /dev/null @@ -1,15 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -""" -import logging -import pytest - -import workflow.shared.workflow_shared as workflow_shared \ No newline at end of file diff --git a/Tests/workflow/ios/__init__.py b/Tests/workflow/ios/__init__.py deleted file mode 100755 index e912252f4e..0000000000 --- a/Tests/workflow/ios/__init__.py +++ /dev/null @@ -1,12 +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. -""" - diff --git a/Tests/workflow/ios/workflow_ios.py b/Tests/workflow/ios/workflow_ios.py deleted file mode 100755 index 4eb0f578b1..0000000000 --- a/Tests/workflow/ios/workflow_ios.py +++ /dev/null @@ -1,15 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -""" -import logging -import pytest - -import workflow.shared.workflow_shared as workflow_shared \ No newline at end of file diff --git a/Tests/workflow/mac/__init__.py b/Tests/workflow/mac/__init__.py deleted file mode 100755 index e912252f4e..0000000000 --- a/Tests/workflow/mac/__init__.py +++ /dev/null @@ -1,12 +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. -""" - diff --git a/Tests/workflow/mac/workflow_mac.py b/Tests/workflow/mac/workflow_mac.py deleted file mode 100755 index 4eb0f578b1..0000000000 --- a/Tests/workflow/mac/workflow_mac.py +++ /dev/null @@ -1,15 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -""" -import logging -import pytest - -import workflow.shared.workflow_shared as workflow_shared \ No newline at end of file diff --git a/Tests/workflow/shared/__init__.py b/Tests/workflow/shared/__init__.py deleted file mode 100755 index e912252f4e..0000000000 --- a/Tests/workflow/shared/__init__.py +++ /dev/null @@ -1,12 +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. -""" - diff --git a/Tests/workflow/shared/workflow_shared.py b/Tests/workflow/shared/workflow_shared.py deleted file mode 100755 index 3581f9349e..0000000000 --- a/Tests/workflow/shared/workflow_shared.py +++ /dev/null @@ -1,95 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -This demos_testlib file is used for a collection of reusable functionality that QA will use in their scripts specific -to the setup of demo level tests. -""" -import sys - -import shared.network_utils as network_utils -from shared.screenshot_utils import move_screenshots, take_screenshot_with_retries - -from test_tools.shared.launcher_testlib import * - -import test_tools.shared.waiter -import test_tools.launchers.phase - - -def start_launcher(launcher): - """ - For PC: Used to start launcher and give time to load. - """ - launcher.launch() - launcher.run(test_tools.launchers.phase.TimePhase(120, 120)) - - -def remote_console_load_level(launcher, remote_console, level): - """ - Uses the remote console to use the map command to load a level and checks the console output for a successful load. - """ - command = 'map {}'.format(level) - load = remote_console.expect_log_line('LEVEL_LOAD_COMPLETE', 300) - retry_console_command(remote_console, command, "Executing console command '{}'".format(command)) - assert load(), "{} level failed to load.".format(level) - - # Allow one minute to let level fully render and to test for stability - launcher.run(test_tools.launchers.phase.TimePhase(60, 60)) - - -def start_remote_console(launcher, remote_console, on_devkit=False): - """ - Starts the remote console. Used in QA scripts that require the use of remote console. - """ - if on_devkit: - test_tools.shared.waiter.wait_for(lambda: network_utils.check_for_remote_listening_port(4600, launcher.ip), - timeout=600, exc=AssertionError('Port 4600 not listening.')) - else: - test_tools.shared.waiter.wait_for(lambda: network_utils.check_for_listening_port(4600), timeout=300, - exc=AssertionError('Port 4600 not listening.')) - - remote_console.start() - - # Allows remote console time to connect to launcher. - launcher.run(test_tools.launchers.phase.TimePhase(60, 60)) - - -def remote_console_take_screenshot(launcher, remote_console, level): - """ - Uses the remote console to run the r_GetScreenshot command to take a screenshot of the current launcher and move - the screenshot to the test results location. - """ - screenshot_path = os.path.join(launcher.workspace.release.paths.platform_cache(), "user", "screenshots") - take_screenshot_with_retries(remote_console, launcher, level) - if os.path.exists(screenshot_path): - move_screenshots(screenshot_path, '.jpg', launcher.workspace.artifact_manager.get_save_artifact_path()) - - -def build_setup(launcher, project_dir): - game_cfg = os.path.join(project_dir, 'game.cfg') - test_tools.shared.settings.edit_text_settings_file(game_cfg, 'sys_primaryUserSelectionEnabled', 0) - test_tools.shared.settings.edit_text_settings_file(game_cfg, 'sys_localUserLobbyEnabled', 0) - - -def enable_full_mode(launcher, console_remote_filesystem, console_paks): - print("Enabling FULL Mode") - launcher.workspace.release.modify_bootstrap_setting(console_remote_filesystem, 0) - launcher.workspace.release.modify_user_setting(console_paks, "False") - - -def enable_pak_mode(launcher, console_remote_filesystem, console_paks): - print("Enabling PAK Mode") - launcher.workspace.release.modify_bootstrap_setting(console_remote_filesystem, 0) - launcher.workspace.release.modify_user_setting(console_paks, "True") - - -def enable_vfs_mode(launcher, console_remote_filesystem, console_paks): - print("Enabling VFS Mode") - launcher.workspace.release.modify_bootstrap_setting(console_remote_filesystem, 1) - launcher.workspace.release.modify_user_setting(console_paks, "False") diff --git a/Tests/workflow/win/__init__.py b/Tests/workflow/win/__init__.py deleted file mode 100755 index e912252f4e..0000000000 --- a/Tests/workflow/win/__init__.py +++ /dev/null @@ -1,12 +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. -""" - diff --git a/Tests/workflow/win/workflow_win.py b/Tests/workflow/win/workflow_win.py deleted file mode 100755 index 4eb0f578b1..0000000000 --- a/Tests/workflow/win/workflow_win.py +++ /dev/null @@ -1,15 +0,0 @@ -""" -All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -its licensors. - -For complete copyright and license terms please see the LICENSE at the root of this -distribution (the "License"). All use of this software is governed by the License, -or, if provided, by the license below or the license accompanying this file. Do not -remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -""" -import logging -import pytest - -import workflow.shared.workflow_shared as workflow_shared \ No newline at end of file