diff --git a/Assets/Editor/Icons/Components/Disabled/HttpClientComponent_white.png b/Assets/Editor/Icons/Components/Disabled/HttpClientComponent_white.png
deleted file mode 100644
index 12b5be2ccc..0000000000
--- a/Assets/Editor/Icons/Components/Disabled/HttpClientComponent_white.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bfc2ef8c6dbf2fba078e27e4e94384099e090468e679327dd826a5cbf22b04ed
-size 1019
diff --git a/Assets/Editor/Icons/Components/HttpClientComponent.png b/Assets/Editor/Icons/Components/HttpClientComponent.png
deleted file mode 100644
index 7a619a5a59..0000000000
--- a/Assets/Editor/Icons/Components/HttpClientComponent.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:708b12d41229afab78e0f7d59097ae3de855fea8525a920c5c214fc0ce79f1bd
-size 1209
diff --git a/Assets/Editor/Icons/Components/Viewport/HttpClientComponent.png b/Assets/Editor/Icons/Components/Viewport/HttpClientComponent.png
deleted file mode 100644
index 16e4917180..0000000000
--- a/Assets/Editor/Icons/Components/Viewport/HttpClientComponent.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fab63af9b50790dca25330058e70517987ea8bf11c00f9353dd951ebdbd1dbe5
-size 5008
diff --git a/Assets/Editor/Translation/scriptcanvas_en_us.ts b/Assets/Editor/Translation/scriptcanvas_en_us.ts
index 6d436b7caf..5af338426c 100644
--- a/Assets/Editor/Translation/scriptcanvas_en_us.ts
+++ b/Assets/Editor/Translation/scriptcanvas_en_us.ts
@@ -49513,106 +49513,6 @@ An Entity can be selected by using the pick button, or by dragging an Entity fro
-
- Handler: HttpClientComponentNotificationBus
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_NAME
- HttpClientComponentNotificationBus
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_TOOLTIP
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_CATEGORY
- Networking
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTSUCCESS_NAME
- Class/Bus: HttpClientComponentNotificationBus Event/Method: OnHttpRequestSuccess
- OnHttpRequestSuccess
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTSUCCESS_TOOLTIP
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTSUCCESS_CATEGORY
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTSUCCESS_OUT_NAME
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTSUCCESS_OUT_TOOLTIP
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTSUCCESS_IN_NAME
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTSUCCESS_IN_TOOLTIP
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTSUCCESS_OUTPUT0_NAME
- Simple Type: Number C++ Type: int
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTSUCCESS_OUTPUT0_TOOLTIP
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTSUCCESS_OUTPUT1_NAME
- Simple Type: String C++ Type: AZStd::basic_string<char, AZStd::char_traits<char>, allocator>
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTSUCCESS_OUTPUT1_TOOLTIP
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTFAILURE_NAME
- Class/Bus: HttpClientComponentNotificationBus Event/Method: OnHttpRequestFailure
- OnHttpRequestFailure
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTFAILURE_TOOLTIP
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTFAILURE_CATEGORY
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTFAILURE_OUT_NAME
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTFAILURE_OUT_TOOLTIP
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTFAILURE_IN_NAME
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTFAILURE_IN_TOOLTIP
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTFAILURE_OUTPUT0_NAME
- Simple Type: Number C++ Type: int
-
-
-
- HANDLER_HTTPCLIENTCOMPONENTNOTIFICATIONBUS_ONHTTPREQUESTFAILURE_OUTPUT0_TOOLTIP
-
-
-
Handler: InputEventNotificationBus
@@ -69850,477 +69750,6 @@ The element is removed from its current parent and added as a child of the new p
The name of the action triggered when the interactive element is released
-
- EBus: ForceVolumeRequestBus
-
- FORCEVOLUMEREQUESTBUS_NAME
- ForceVolumeRequestBus
-
-
- FORCEVOLUMEREQUESTBUS_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_CATEGORY
- Physics
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRDENSITY_NAME
- Class/Bus: ForceVolumeRequestBus Event/Method: SetAirDensity
- SetAirDensity
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRDENSITY_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRDENSITY_CATEGORY
-
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRDENSITY_OUT_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRDENSITY_OUT_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRDENSITY_IN_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRDENSITY_IN_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRDENSITY_PARAM0_NAME
- Simple Type: Number C++ Type: float
-
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRDENSITY_PARAM0_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRRESISTANCE_NAME
- Class/Bus: ForceVolumeRequestBus Event/Method: GetAirResistance
- GetAirResistance
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRRESISTANCE_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRRESISTANCE_CATEGORY
-
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRRESISTANCE_OUT_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRRESISTANCE_OUT_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRRESISTANCE_IN_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRRESISTANCE_IN_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRRESISTANCE_OUTPUT0_NAME
- C++ Type: float
- Number
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRRESISTANCE_OUTPUT0_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMASSDEPENDENT_NAME
- Class/Bus: ForceVolumeRequestBus Event/Method: GetForceMassDependent
- GetForceMassDependent
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMASSDEPENDENT_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMASSDEPENDENT_CATEGORY
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMASSDEPENDENT_OUT_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMASSDEPENDENT_OUT_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMASSDEPENDENT_IN_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMASSDEPENDENT_IN_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMASSDEPENDENT_OUTPUT0_NAME
- C++ Type: bool
- Boolean
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMASSDEPENDENT_OUTPUT0_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRRESISTANCE_NAME
- Class/Bus: ForceVolumeRequestBus Event/Method: SetAirResistance
- SetAirResistance
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRRESISTANCE_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRRESISTANCE_CATEGORY
-
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRRESISTANCE_OUT_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRRESISTANCE_OUT_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRRESISTANCE_IN_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRRESISTANCE_IN_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRRESISTANCE_PARAM0_NAME
- Simple Type: Number C++ Type: float
-
-
-
- FORCEVOLUMEREQUESTBUS_SETAIRRESISTANCE_PARAM0_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRDENSITY_NAME
- Class/Bus: ForceVolumeRequestBus Event/Method: GetAirDensity
- GetAirDensity
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRDENSITY_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRDENSITY_CATEGORY
-
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRDENSITY_OUT_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRDENSITY_OUT_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRDENSITY_IN_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRDENSITY_IN_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRDENSITY_OUTPUT0_NAME
- C++ Type: float
- Number
-
-
- FORCEVOLUMEREQUESTBUS_GETAIRDENSITY_OUTPUT0_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMODE_NAME
- Class/Bus: ForceVolumeRequestBus Event/Method: GetForceMode
- GetForceMode
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMODE_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMODE_CATEGORY
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMODE_OUT_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMODE_OUT_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMODE_IN_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMODE_IN_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMODE_OUTPUT0_NAME
- C++ Type: int
- Number
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMODE_OUTPUT0_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMAGNITUDE_NAME
- Class/Bus: ForceVolumeRequestBus Event/Method: GetForceMagnitude
- GetForceMagnitude
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMAGNITUDE_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMAGNITUDE_CATEGORY
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMAGNITUDE_OUT_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMAGNITUDE_OUT_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMAGNITUDE_IN_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMAGNITUDE_IN_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMAGNITUDE_OUTPUT0_NAME
- C++ Type: float
- Number
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEMAGNITUDE_OUTPUT0_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMODE_NAME
- Class/Bus: ForceVolumeRequestBus Event/Method: SetForceMode
- SetForceMode
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMODE_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMODE_CATEGORY
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMODE_OUT_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMODE_OUT_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMODE_IN_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMODE_IN_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMODE_PARAM0_NAME
- Simple Type: Number C++ Type: int
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMODE_PARAM0_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMAGNITUDE_NAME
- Class/Bus: ForceVolumeRequestBus Event/Method: SetForceMagnitude
- SetForceMagnitude
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMAGNITUDE_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMAGNITUDE_CATEGORY
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMAGNITUDE_OUT_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMAGNITUDE_OUT_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMAGNITUDE_IN_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMAGNITUDE_IN_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMAGNITUDE_PARAM0_NAME
- Simple Type: Number C++ Type: float
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMAGNITUDE_PARAM0_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMASSDEPENDENT_NAME
- Class/Bus: ForceVolumeRequestBus Event/Method: SetForceMassDependent
- SetForceMassDependent
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMASSDEPENDENT_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMASSDEPENDENT_CATEGORY
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMASSDEPENDENT_OUT_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMASSDEPENDENT_OUT_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMASSDEPENDENT_IN_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMASSDEPENDENT_IN_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMASSDEPENDENT_PARAM0_NAME
- Simple Type: Boolean C++ Type: bool
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEMASSDEPENDENT_PARAM0_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEDIRECTION_NAME
- Class/Bus: ForceVolumeRequestBus Event/Method: SetForceDirection
- SetForceDirection
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEDIRECTION_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEDIRECTION_CATEGORY
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEDIRECTION_OUT_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEDIRECTION_OUT_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEDIRECTION_IN_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEDIRECTION_IN_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEDIRECTION_PARAM0_NAME
- Simple Type: Vector3 C++ Type: const Vector3&
-
-
-
- FORCEVOLUMEREQUESTBUS_SETFORCEDIRECTION_PARAM0_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEDIRECTION_NAME
- Class/Bus: ForceVolumeRequestBus Event/Method: GetForceDirection
- GetForceDirection
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEDIRECTION_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEDIRECTION_CATEGORY
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEDIRECTION_OUT_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEDIRECTION_OUT_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEDIRECTION_IN_NAME
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEDIRECTION_IN_TOOLTIP
-
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEDIRECTION_OUTPUT0_NAME
- C++ Type: const Vector3&
- Vector3
-
-
- FORCEVOLUMEREQUESTBUS_GETFORCEDIRECTION_OUTPUT0_TOOLTIP
-
-
-
Handler: UiDraggableNotificationBus
@@ -73360,553 +72789,6 @@ The element is removed from its current parent and added as a child of the new p
The absolute position where the entity should spawn
-
- EBus: WindVolumeRequestBus
-
- WINDVOLUMEREQUESTBUS_NAME
- Wind Volume
-
-
- WINDVOLUMEREQUESTBUS_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_CATEGORY
- Physics (Legacy)
-
-
- WINDVOLUMEREQUESTBUS_GETVOLUMESIZE_NAME
- Class/Bus: WindVolumeRequestBus Event/Method: GetVolumeSize
- Get Volume Size
-
-
- WINDVOLUMEREQUESTBUS_GETVOLUMESIZE_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETVOLUMESIZE_CATEGORY
-
-
-
- WINDVOLUMEREQUESTBUS_GETVOLUMESIZE_OUT_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_GETVOLUMESIZE_OUT_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETVOLUMESIZE_IN_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_GETVOLUMESIZE_IN_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETVOLUMESIZE_OUTPUT0_NAME
- C++ Type: const Vector3&
- Vector3
-
-
- WINDVOLUMEREQUESTBUS_GETVOLUMESIZE_OUTPUT0_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETAIRRESISTANCE_NAME
- Class/Bus: WindVolumeRequestBus Event/Method: GetAirResistance
- Get Air Resistance
-
-
- WINDVOLUMEREQUESTBUS_GETAIRRESISTANCE_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETAIRRESISTANCE_CATEGORY
-
-
-
- WINDVOLUMEREQUESTBUS_GETAIRRESISTANCE_OUT_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_GETAIRRESISTANCE_OUT_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETAIRRESISTANCE_IN_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_GETAIRRESISTANCE_IN_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETAIRRESISTANCE_OUTPUT0_NAME
- C++ Type: float
- Number
-
-
- WINDVOLUMEREQUESTBUS_GETAIRRESISTANCE_OUTPUT0_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETAIRRESISTANCE_NAME
- Class/Bus: WindVolumeRequestBus Event/Method: SetAirResistance
- Set Air Resistance
-
-
- WINDVOLUMEREQUESTBUS_SETAIRRESISTANCE_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETAIRRESISTANCE_CATEGORY
-
-
-
- WINDVOLUMEREQUESTBUS_SETAIRRESISTANCE_OUT_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_SETAIRRESISTANCE_OUT_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETAIRRESISTANCE_IN_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_SETAIRRESISTANCE_IN_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETAIRRESISTANCE_PARAM0_NAME
- Simple Type: Number C++ Type: float
-
-
-
- WINDVOLUMEREQUESTBUS_SETAIRRESISTANCE_PARAM0_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETAIRDENSITY_NAME
- Class/Bus: WindVolumeRequestBus Event/Method: GetAirDensity
- Get Air Density
-
-
- WINDVOLUMEREQUESTBUS_GETAIRDENSITY_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETAIRDENSITY_CATEGORY
-
-
-
- WINDVOLUMEREQUESTBUS_GETAIRDENSITY_OUT_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_GETAIRDENSITY_OUT_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETAIRDENSITY_IN_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_GETAIRDENSITY_IN_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETAIRDENSITY_OUTPUT0_NAME
- C++ Type: float
- Number
-
-
- WINDVOLUMEREQUESTBUS_GETAIRDENSITY_OUTPUT0_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETSPEED_NAME
- Class/Bus: WindVolumeRequestBus Event/Method: GetSpeed
- Get Speed
-
-
- WINDVOLUMEREQUESTBUS_GETSPEED_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETSPEED_CATEGORY
-
-
-
- WINDVOLUMEREQUESTBUS_GETSPEED_OUT_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_GETSPEED_OUT_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETSPEED_IN_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_GETSPEED_IN_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETSPEED_OUTPUT0_NAME
- C++ Type: float
- Number
-
-
- WINDVOLUMEREQUESTBUS_GETSPEED_OUTPUT0_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETWINDDIRECTION_NAME
- Class/Bus: WindVolumeRequestBus Event/Method: SetWindDirection
- Set Wind Direction
-
-
- WINDVOLUMEREQUESTBUS_SETWINDDIRECTION_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETWINDDIRECTION_CATEGORY
-
-
-
- WINDVOLUMEREQUESTBUS_SETWINDDIRECTION_OUT_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_SETWINDDIRECTION_OUT_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETWINDDIRECTION_IN_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_SETWINDDIRECTION_IN_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETWINDDIRECTION_PARAM0_NAME
- Simple Type: Vector3 C++ Type: const Vector3&
-
-
-
- WINDVOLUMEREQUESTBUS_SETWINDDIRECTION_PARAM0_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETWINDDIRECTION_NAME
- Class/Bus: WindVolumeRequestBus Event/Method: GetWindDirection
- Get Wind Direction
-
-
- WINDVOLUMEREQUESTBUS_GETWINDDIRECTION_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETWINDDIRECTION_CATEGORY
-
-
-
- WINDVOLUMEREQUESTBUS_GETWINDDIRECTION_OUT_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_GETWINDDIRECTION_OUT_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETWINDDIRECTION_IN_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_GETWINDDIRECTION_IN_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETWINDDIRECTION_OUTPUT0_NAME
- C++ Type: const Vector3&
- Vector3
-
-
- WINDVOLUMEREQUESTBUS_GETWINDDIRECTION_OUTPUT0_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETSPEED_NAME
- Class/Bus: WindVolumeRequestBus Event/Method: SetSpeed
- Set Speed
-
-
- WINDVOLUMEREQUESTBUS_SETSPEED_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETSPEED_CATEGORY
-
-
-
- WINDVOLUMEREQUESTBUS_SETSPEED_OUT_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_SETSPEED_OUT_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETSPEED_IN_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_SETSPEED_IN_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETSPEED_PARAM0_NAME
- Simple Type: Number C++ Type: float
-
-
-
- WINDVOLUMEREQUESTBUS_SETSPEED_PARAM0_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETVOLUMESIZE_NAME
- Class/Bus: WindVolumeRequestBus Event/Method: SetVolumeSize
- Set Volume Size
-
-
- WINDVOLUMEREQUESTBUS_SETVOLUMESIZE_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETVOLUMESIZE_CATEGORY
-
-
-
- WINDVOLUMEREQUESTBUS_SETVOLUMESIZE_OUT_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_SETVOLUMESIZE_OUT_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETVOLUMESIZE_IN_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_SETVOLUMESIZE_IN_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETVOLUMESIZE_PARAM0_NAME
- Simple Type: Vector3 C++ Type: const Vector3&
-
-
-
- WINDVOLUMEREQUESTBUS_SETVOLUMESIZE_PARAM0_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETELLIPSOIDAL_NAME
- Class/Bus: WindVolumeRequestBus Event/Method: GetEllipsoidal
- Get Ellipsoidal
-
-
- WINDVOLUMEREQUESTBUS_GETELLIPSOIDAL_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETELLIPSOIDAL_CATEGORY
-
-
-
- WINDVOLUMEREQUESTBUS_GETELLIPSOIDAL_OUT_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_GETELLIPSOIDAL_OUT_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETELLIPSOIDAL_IN_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_GETELLIPSOIDAL_IN_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETELLIPSOIDAL_OUTPUT0_NAME
- C++ Type: bool
- Boolean
-
-
- WINDVOLUMEREQUESTBUS_GETELLIPSOIDAL_OUTPUT0_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETFALLOFFINNER_NAME
- Class/Bus: WindVolumeRequestBus Event/Method: GetFalloffInner
- Get Falloff Inner
-
-
- WINDVOLUMEREQUESTBUS_GETFALLOFFINNER_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETFALLOFFINNER_CATEGORY
-
-
-
- WINDVOLUMEREQUESTBUS_GETFALLOFFINNER_OUT_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_GETFALLOFFINNER_OUT_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETFALLOFFINNER_IN_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_GETFALLOFFINNER_IN_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_GETFALLOFFINNER_OUTPUT0_NAME
- C++ Type: float
- Number
-
-
- WINDVOLUMEREQUESTBUS_GETFALLOFFINNER_OUTPUT0_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETELLIPSOIDAL_NAME
- Class/Bus: WindVolumeRequestBus Event/Method: SetEllipsoidal
- Set Ellipsoidal
-
-
- WINDVOLUMEREQUESTBUS_SETELLIPSOIDAL_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETELLIPSOIDAL_CATEGORY
-
-
-
- WINDVOLUMEREQUESTBUS_SETELLIPSOIDAL_OUT_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_SETELLIPSOIDAL_OUT_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETELLIPSOIDAL_IN_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_SETELLIPSOIDAL_IN_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETELLIPSOIDAL_PARAM0_NAME
- Simple Type: Boolean C++ Type: bool
-
-
-
- WINDVOLUMEREQUESTBUS_SETELLIPSOIDAL_PARAM0_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETFALLOFFINNER_NAME
- Class/Bus: WindVolumeRequestBus Event/Method: SetFalloffInner
- Set Falloff Inner
-
-
- WINDVOLUMEREQUESTBUS_SETFALLOFFINNER_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETFALLOFFINNER_CATEGORY
-
-
-
- WINDVOLUMEREQUESTBUS_SETFALLOFFINNER_OUT_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_SETFALLOFFINNER_OUT_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETFALLOFFINNER_IN_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_SETFALLOFFINNER_IN_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETFALLOFFINNER_PARAM0_NAME
- Simple Type: Number C++ Type: float
-
-
-
- WINDVOLUMEREQUESTBUS_SETFALLOFFINNER_PARAM0_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETAIRDENSITY_NAME
- Class/Bus: WindVolumeRequestBus Event/Method: SetAirDensity
- Set Air Density
-
-
- WINDVOLUMEREQUESTBUS_SETAIRDENSITY_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETAIRDENSITY_CATEGORY
-
-
-
- WINDVOLUMEREQUESTBUS_SETAIRDENSITY_OUT_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_SETAIRDENSITY_OUT_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETAIRDENSITY_IN_NAME
-
-
-
- WINDVOLUMEREQUESTBUS_SETAIRDENSITY_IN_TOOLTIP
-
-
-
- WINDVOLUMEREQUESTBUS_SETAIRDENSITY_PARAM0_NAME
- Simple Type: Number C++ Type: float
-
-
-
- WINDVOLUMEREQUESTBUS_SETAIRDENSITY_PARAM0_TOOLTIP
-
-
-
EBus: ActorComponentNotificationBus
@@ -79046,77 +77928,6 @@ The element is removed from its current parent and added as a child of the new p
-
- EBus: HttpClientComponentRequestBus
-
- HTTPCLIENTCOMPONENTREQUESTBUS_NAME
- HttpClientComponentRequestBus
-
-
- HTTPCLIENTCOMPONENTREQUESTBUS_TOOLTIP
-
-
-
- HTTPCLIENTCOMPONENTREQUESTBUS_CATEGORY
- Networking
-
-
- HTTPCLIENTCOMPONENTREQUESTBUS_MAKEHTTPREQUEST_NAME
- Class/Bus: HttpClientComponentRequestBus Event/Method: MakeHttpRequest
- MakeHttpRequest
-
-
- HTTPCLIENTCOMPONENTREQUESTBUS_MAKEHTTPREQUEST_TOOLTIP
-
-
-
- HTTPCLIENTCOMPONENTREQUESTBUS_MAKEHTTPREQUEST_CATEGORY
-
-
-
- HTTPCLIENTCOMPONENTREQUESTBUS_MAKEHTTPREQUEST_OUT_NAME
-
-
-
- HTTPCLIENTCOMPONENTREQUESTBUS_MAKEHTTPREQUEST_OUT_TOOLTIP
-
-
-
- HTTPCLIENTCOMPONENTREQUESTBUS_MAKEHTTPREQUEST_IN_NAME
-
-
-
- HTTPCLIENTCOMPONENTREQUESTBUS_MAKEHTTPREQUEST_IN_TOOLTIP
-
-
-
- HTTPCLIENTCOMPONENTREQUESTBUS_MAKEHTTPREQUEST_PARAM0_NAME
- Simple Type: String C++ Type: AZStd::basic_string<char, AZStd::char_traits<char>, allocator>
-
-
-
- HTTPCLIENTCOMPONENTREQUESTBUS_MAKEHTTPREQUEST_PARAM0_TOOLTIP
-
-
-
- HTTPCLIENTCOMPONENTREQUESTBUS_MAKEHTTPREQUEST_PARAM1_NAME
- Simple Type: String C++ Type: AZStd::basic_string<char, AZStd::char_traits<char>, allocator>
-
-
-
- HTTPCLIENTCOMPONENTREQUESTBUS_MAKEHTTPREQUEST_PARAM1_TOOLTIP
-
-
-
- HTTPCLIENTCOMPONENTREQUESTBUS_MAKEHTTPREQUEST_PARAM2_NAME
- Simple Type: String C++ Type: AZStd::basic_string<char, AZStd::char_traits<char>, allocator>
-
-
-
- HTTPCLIENTCOMPONENTREQUESTBUS_MAKEHTTPREQUEST_PARAM2_TOOLTIP
-
-
-
Handler: AWSBehaviorURLNotificationsBus
diff --git a/AutomatedTesting/Assets/Destruction/cinder_wall_complex.blast b/AutomatedTesting/Assets/Destruction/cinder_wall_complex.blast
new file mode 100644
index 0000000000..fcf67594c7
Binary files /dev/null and b/AutomatedTesting/Assets/Destruction/cinder_wall_complex.blast differ
diff --git a/AutomatedTesting/Assets/Destruction/cinder_wall_complex.fbx b/AutomatedTesting/Assets/Destruction/cinder_wall_complex.fbx
new file mode 100644
index 0000000000..62c305c35e
--- /dev/null
+++ b/AutomatedTesting/Assets/Destruction/cinder_wall_complex.fbx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7f94f2634eacb4d7bee20dacc45edef96e4d268f1adb7960b8aa8f3b6e2906ed
+size 6867609
diff --git a/AutomatedTesting/Assets/Prefabs/Bush.prefab b/AutomatedTesting/Assets/Prefabs/Bush.prefab
new file mode 100644
index 0000000000..ef497bdcd0
--- /dev/null
+++ b/AutomatedTesting/Assets/Prefabs/Bush.prefab
@@ -0,0 +1,129 @@
+{
+ "ContainerEntity": {
+ "Id": "ContainerEntity",
+ "Name": "Bush",
+ "Components": {
+ "Component_[1140272189295067758]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 1140272189295067758
+ },
+ "Component_[13437832196484687256]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 13437832196484687256
+ },
+ "Component_[1553903646452669645]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 1553903646452669645
+ },
+ "Component_[15914009348632444632]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 15914009348632444632,
+ "Child Entity Order": [
+ "Entity_[7511491868318]"
+ ]
+ },
+ "Component_[18046340308818780248]": {
+ "$type": "EditorPrefabComponent",
+ "Id": 18046340308818780248
+ },
+ "Component_[1948833233489872938]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 1948833233489872938,
+ "Parent Entity": ""
+ },
+ "Component_[2903632350157981339]": {
+ "$type": "SelectionComponent",
+ "Id": 2903632350157981339
+ },
+ "Component_[48827510535192710]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 48827510535192710
+ },
+ "Component_[5609536793322429681]": {
+ "$type": "EditorLockComponent",
+ "Id": 5609536793322429681
+ },
+ "Component_[5859168386298620990]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 5859168386298620990
+ },
+ "Component_[6604616929271524505]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 6604616929271524505
+ }
+ }
+ },
+ "Entities": {
+ "Entity_[7511491868318]": {
+ "Id": "Entity_[7511491868318]",
+ "Name": "Bush",
+ "Components": {
+ "Component_[10227459330338484901]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 10227459330338484901,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 4998941225335869157
+ },
+ {
+ "ComponentId": 9922994635792843826,
+ "SortIndex": 1
+ }
+ ]
+ },
+ "Component_[10972351222359420947]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 10972351222359420947
+ },
+ "Component_[12101122374155214392]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 12101122374155214392
+ },
+ "Component_[1535264614652988260]": {
+ "$type": "SelectionComponent",
+ "Id": 1535264614652988260
+ },
+ "Component_[16367811417907891218]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 16367811417907891218
+ },
+ "Component_[17044216787716682880]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 17044216787716682880
+ },
+ "Component_[2129822594969629430]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 2129822594969629430
+ },
+ "Component_[2838015156782745450]": {
+ "$type": "EditorLockComponent",
+ "Id": 2838015156782745450
+ },
+ "Component_[4998941225335869157]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 4998941225335869157,
+ "Parent Entity": "ContainerEntity"
+ },
+ "Component_[8773358049076362578]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 8773358049076362578
+ },
+ "Component_[9922994635792843826]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 9922994635792843826,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{1201406D-FB20-5B5F-B9B5-6A6E8DE00A14}",
+ "subId": 276506120
+ },
+ "assetHint": "assets/objects/foliage/bush_privet_01.azmodel"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Assets/Prefabs/BushFlowerBlender.prefab b/AutomatedTesting/Assets/Prefabs/BushFlowerBlender.prefab
new file mode 100644
index 0000000000..b938701b6a
--- /dev/null
+++ b/AutomatedTesting/Assets/Prefabs/BushFlowerBlender.prefab
@@ -0,0 +1,2249 @@
+{
+ "ContainerEntity": {
+ "Id": "ContainerEntity",
+ "Name": "BushFlowerBlender",
+ "Components": {
+ "Component_[10351434005293588180]": {
+ "$type": "EditorLockComponent",
+ "Id": 10351434005293588180
+ },
+ "Component_[10967554916960846519]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 10967554916960846519
+ },
+ "Component_[14400678265986305456]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 14400678265986305456
+ },
+ "Component_[15365520792759708998]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 15365520792759708998
+ },
+ "Component_[16281192066639198814]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 16281192066639198814,
+ "Child Entity Order": [
+ "Entity_[263598916892318]"
+ ]
+ },
+ "Component_[16356049875968660722]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 16356049875968660722,
+ "Parent Entity": ""
+ },
+ "Component_[16391695178646515457]": {
+ "$type": "SelectionComponent",
+ "Id": 16391695178646515457
+ },
+ "Component_[16407238476365087382]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 16407238476365087382
+ },
+ "Component_[3542701736829700396]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 3542701736829700396
+ },
+ "Component_[5160094530340900971]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 5160094530340900971
+ },
+ "Component_[6432428663776737136]": {
+ "$type": "EditorPrefabComponent",
+ "Id": 6432428663776737136
+ }
+ }
+ },
+ "Entities": {
+ "Entity_[263573147088542]": {
+ "Id": "Entity_[263573147088542]",
+ "Name": "BushSpawner",
+ "Components": {
+ "Component_[11886309121583108836]": {
+ "$type": "EditorPositionModifierComponent",
+ "Id": 11886309121583108836,
+ "Configuration": {
+ "GradientX": {
+ "GradientId": "Entity_[263590326957726]"
+ },
+ "GradientY": {
+ "GradientId": "Entity_[263590326957726]"
+ },
+ "GradientZ": {
+ "GradientId": ""
+ }
+ }
+ },
+ "Component_[1240444912193942742]": {
+ "$type": "{DD96FD51-A86B-48BC-A6AB-89183B538269} EditorSpawnerComponent",
+ "Id": 1240444912193942742,
+ "PreviewEntity": "Entity_[263573147088542]"
+ },
+ "Component_[12813702285187817973]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 12813702285187817973,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 18133156195370267728
+ },
+ {
+ "ComponentId": 13450250419263773680,
+ "SortIndex": 1
+ },
+ {
+ "ComponentId": 8841963751527151666,
+ "SortIndex": 2
+ },
+ {
+ "ComponentId": 1240444912193942742,
+ "SortIndex": 3
+ },
+ {
+ "ComponentId": 17991239182321715249,
+ "SortIndex": 4
+ },
+ {
+ "ComponentId": 14175761523159824993,
+ "SortIndex": 5
+ },
+ {
+ "ComponentId": 2884829698060689565,
+ "SortIndex": 6
+ },
+ {
+ "ComponentId": 11886309121583108836,
+ "SortIndex": 7
+ }
+ ]
+ },
+ "Component_[13179606361687972691]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 13179606361687972691
+ },
+ "Component_[13450250419263773680]": {
+ "$type": "EditorReferenceShapeComponent",
+ "Id": 13450250419263773680,
+ "Configuration": {
+ "ShapeEntityId": "Entity_[263607506826910]"
+ }
+ },
+ "Component_[13688014277574607552]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 13688014277574607552
+ },
+ "Component_[14175761523159824993]": {
+ "$type": "EditorDistributionFilterComponent",
+ "Id": 14175761523159824993,
+ "Configuration": {
+ "ThresholdMin": 0.289000004529953,
+ "ThresholdMax": 0.5690000057220459,
+ "Gradient": {
+ "GradientId": "Entity_[263603211859614]"
+ }
+ }
+ },
+ "Component_[14232774271081092639]": {
+ "$type": "EditorLockComponent",
+ "Id": 14232774271081092639
+ },
+ "Component_[14811533745267383811]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 14811533745267383811
+ },
+ "Component_[17540078415915694273]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 17540078415915694273
+ },
+ "Component_[17991239182321715249]": {
+ "$type": "EditorRotationModifierComponent",
+ "Id": 17991239182321715249,
+ "Configuration": {
+ "GradientX": {
+ "GradientId": ""
+ },
+ "GradientY": {
+ "GradientId": ""
+ },
+ "GradientZ": {
+ "GradientId": "Entity_[263590326957726]"
+ }
+ }
+ },
+ "Component_[18133156195370267728]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 18133156195370267728,
+ "Parent Entity": "Entity_[263607506826910]"
+ },
+ "Component_[2884829698060689565]": {
+ "$type": "EditorScaleModifierComponent",
+ "Id": 2884829698060689565,
+ "Configuration": {
+ "RangeMin": 0.75,
+ "RangeMax": 1.25,
+ "Gradient": {
+ "GradientId": "Entity_[263590326957726]"
+ }
+ }
+ },
+ "Component_[50628676751372416]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 50628676751372416,
+ "Child Entity Order": [
+ "Entity_[263603211859614]",
+ "Entity_[263590326957726]"
+ ]
+ },
+ "Component_[5689270312836823309]": {
+ "$type": "SelectionComponent",
+ "Id": 5689270312836823309
+ },
+ "Component_[7105803915999711758]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7105803915999711758
+ },
+ "Component_[8841963751527151666]": {
+ "$type": "EditorDescriptorListComponent",
+ "Id": 8841963751527151666,
+ "Configuration": {
+ "Descriptors": [
+ {
+ "SpawnerType": "{74BEEDB5-81CF-409F-B375-0D93D81EF2E3}",
+ "InstanceSpawner": {
+ "$type": "PrefabInstanceSpawner",
+ "SpawnableAsset": {
+ "assetId": {
+ "guid": "{EE51E73C-D753-54AC-A1C0-4F29844FB6C3}",
+ "subId": 2740536329
+ },
+ "assetHint": "assets/prefabs/bush.spawnable"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "Entity_[263577442055838]": {
+ "Id": "Entity_[263577442055838]",
+ "Name": "RandomNoise",
+ "Components": {
+ "Component_[13412023990029767074]": {
+ "$type": "EditorRandomGradientComponent",
+ "Id": 13412023990029767074,
+ "PreviewEntity": "Entity_[263577442055838]"
+ },
+ "Component_[14048059127502350032]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 14048059127502350032,
+ "Parent Entity": "Entity_[263581737023134]"
+ },
+ "Component_[15585968636846328006]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 15585968636846328006
+ },
+ "Component_[17356242264256499333]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 17356242264256499333
+ },
+ "Component_[2157320692130316849]": {
+ "$type": "EditorLockComponent",
+ "Id": 2157320692130316849
+ },
+ "Component_[2167582872687341084]": {
+ "$type": "EditorReferenceShapeComponent",
+ "Id": 2167582872687341084,
+ "Configuration": {
+ "ShapeEntityId": "Entity_[263607506826910]"
+ }
+ },
+ "Component_[2794166072748175035]": {
+ "$type": "SelectionComponent",
+ "Id": 2794166072748175035
+ },
+ "Component_[4784966656524567789]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 4784966656524567789
+ },
+ "Component_[6185400249317227261]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 6185400249317227261
+ },
+ "Component_[639949486729001685]": {
+ "$type": "EditorGradientTransformComponent",
+ "Id": 639949486729001685,
+ "Configuration": {
+ "ShapeReference": "",
+ "Bounds": [
+ 50.0,
+ 50.0,
+ 1.0
+ ]
+ }
+ },
+ "Component_[7347819195697153472]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 7347819195697153472
+ },
+ "Component_[9225409585951117678]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 9225409585951117678,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 14048059127502350032
+ },
+ {
+ "ComponentId": 2167582872687341084,
+ "SortIndex": 1
+ },
+ {
+ "ComponentId": 639949486729001685,
+ "SortIndex": 2
+ },
+ {
+ "ComponentId": 13412023990029767074,
+ "SortIndex": 3
+ }
+ ]
+ },
+ "Component_[9667056664436803603]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 9667056664436803603
+ }
+ }
+ },
+ "Entity_[263581737023134]": {
+ "Id": "Entity_[263581737023134]",
+ "Name": "FlowerSpawner",
+ "Components": {
+ "Component_[10064436441176637741]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 10064436441176637741
+ },
+ "Component_[10418076448308581948]": {
+ "$type": "EditorRotationModifierComponent",
+ "Id": 10418076448308581948,
+ "Configuration": {
+ "GradientX": {
+ "GradientId": ""
+ },
+ "GradientY": {
+ "GradientId": ""
+ },
+ "GradientZ": {
+ "GradientId": "Entity_[263577442055838]"
+ }
+ }
+ },
+ "Component_[12484622175138429315]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 12484622175138429315
+ },
+ "Component_[12590590072231203407]": {
+ "$type": "EditorLockComponent",
+ "Id": 12590590072231203407
+ },
+ "Component_[13079591667184987458]": {
+ "$type": "EditorScaleModifierComponent",
+ "Id": 13079591667184987458,
+ "Configuration": {
+ "RangeMin": 0.75,
+ "RangeMax": 1.25,
+ "Gradient": {
+ "GradientId": "Entity_[263577442055838]"
+ }
+ }
+ },
+ "Component_[13174773394274524631]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 13174773394274524631,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 1915862229814997128
+ },
+ {
+ "ComponentId": 582800388831726963,
+ "SortIndex": 1
+ },
+ {
+ "ComponentId": 18006385801184712266,
+ "SortIndex": 2
+ },
+ {
+ "ComponentId": 6902499453501456890,
+ "SortIndex": 3
+ },
+ {
+ "ComponentId": 10418076448308581948,
+ "SortIndex": 4
+ },
+ {
+ "ComponentId": 13983302912005698250,
+ "SortIndex": 5
+ },
+ {
+ "ComponentId": 13079591667184987458,
+ "SortIndex": 6
+ },
+ {
+ "ComponentId": 7912787520673119502,
+ "SortIndex": 7
+ }
+ ]
+ },
+ "Component_[13200009872392504010]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 13200009872392504010,
+ "Child Entity Order": [
+ "Entity_[263594621925022]",
+ "Entity_[263577442055838]"
+ ]
+ },
+ "Component_[13983302912005698250]": {
+ "$type": "EditorDistributionFilterComponent",
+ "Id": 13983302912005698250,
+ "Configuration": {
+ "ThresholdMin": 0.2879999876022339,
+ "ThresholdMax": 0.5680000185966492,
+ "Gradient": {
+ "GradientId": "Entity_[263586031990430]"
+ }
+ }
+ },
+ "Component_[14726174657215669218]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 14726174657215669218
+ },
+ "Component_[18006385801184712266]": {
+ "$type": "EditorDescriptorListComponent",
+ "Id": 18006385801184712266,
+ "Configuration": {
+ "Descriptors": [
+ {
+ "SpawnerType": "{74BEEDB5-81CF-409F-B375-0D93D81EF2E3}",
+ "InstanceSpawner": {
+ "$type": "PrefabInstanceSpawner",
+ "SpawnableAsset": {
+ "assetId": {
+ "guid": "{80C0CF4E-9A5E-544B-B89E-BC980175A259}",
+ "subId": 3875079122
+ },
+ "assetHint": "assets/prefabs/pinkflower.spawnable"
+ }
+ }
+ },
+ {
+ "SpawnerType": "{74BEEDB5-81CF-409F-B375-0D93D81EF2E3}",
+ "InstanceSpawner": {
+ "$type": "PrefabInstanceSpawner",
+ "SpawnableAsset": {
+ "assetId": {
+ "guid": "{20DD1202-A434-5482-9FB9-AED4C78F6CBF}",
+ "subId": 2669863854
+ },
+ "assetHint": "assets/prefabs/purpleflower.spawnable"
+ }
+ }
+ },
+ {
+ "SpawnerType": "{23C40FD4-A55F-4BD3-BE5B-DC5423F217C2}",
+ "InstanceSpawner": {
+ "$type": "EmptyInstanceSpawner"
+ }
+ }
+ ]
+ }
+ },
+ "Component_[1915862229814997128]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 1915862229814997128,
+ "Parent Entity": "Entity_[263607506826910]"
+ },
+ "Component_[2123416208548010747]": {
+ "$type": "SelectionComponent",
+ "Id": 2123416208548010747
+ },
+ "Component_[4172073657954183661]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 4172073657954183661
+ },
+ "Component_[4297556504463195307]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 4297556504463195307
+ },
+ "Component_[582800388831726963]": {
+ "$type": "EditorReferenceShapeComponent",
+ "Id": 582800388831726963,
+ "Configuration": {
+ "ShapeEntityId": "Entity_[263607506826910]"
+ }
+ },
+ "Component_[6902499453501456890]": {
+ "$type": "{DD96FD51-A86B-48BC-A6AB-89183B538269} EditorSpawnerComponent",
+ "Id": 6902499453501456890,
+ "PreviewEntity": "Entity_[263581737023134]"
+ },
+ "Component_[7912787520673119502]": {
+ "$type": "EditorPositionModifierComponent",
+ "Id": 7912787520673119502,
+ "Configuration": {
+ "GradientX": {
+ "GradientId": "Entity_[263577442055838]"
+ },
+ "GradientY": {
+ "GradientId": "Entity_[263577442055838]"
+ },
+ "GradientZ": {
+ "GradientId": ""
+ }
+ }
+ }
+ }
+ },
+ "Entity_[263586031990430]": {
+ "Id": "Entity_[263586031990430]",
+ "Name": "Invert",
+ "Components": {
+ "Component_[11123278080744920525]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 11123278080744920525
+ },
+ "Component_[1199715693160400161]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 1199715693160400161,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 7438979211266329827
+ },
+ {
+ "ComponentId": 6027557066164356793,
+ "SortIndex": 1
+ },
+ {
+ "ComponentId": 8903771095804438921,
+ "SortIndex": 2
+ }
+ ]
+ },
+ "Component_[12162816428693886169]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 12162816428693886169
+ },
+ "Component_[14493180089799969074]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 14493180089799969074
+ },
+ "Component_[16206759293595766479]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 16206759293595766479
+ },
+ "Component_[17566144032052847628]": {
+ "$type": "SelectionComponent",
+ "Id": 17566144032052847628
+ },
+ "Component_[17784057508127919200]": {
+ "$type": "EditorLockComponent",
+ "Id": 17784057508127919200
+ },
+ "Component_[18377773171420051348]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 18377773171420051348
+ },
+ "Component_[6027557066164356793]": {
+ "$type": "EditorReferenceShapeComponent",
+ "Id": 6027557066164356793,
+ "Configuration": {
+ "ShapeEntityId": "Entity_[263607506826910]"
+ }
+ },
+ "Component_[7438979211266329827]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 7438979211266329827,
+ "Parent Entity": "Entity_[263594621925022]"
+ },
+ "Component_[8421650081106982664]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 8421650081106982664
+ },
+ "Component_[8903771095804438921]": {
+ "$type": "EditorInvertGradientComponent",
+ "Id": 8903771095804438921,
+ "Configuration": {
+ "Gradient": {
+ "GradientId": "Entity_[263594621925022]"
+ }
+ },
+ "PreviewEntity": "Entity_[263586031990430]"
+ }
+ }
+ },
+ "Entity_[263590326957726]": {
+ "Id": "Entity_[263590326957726]",
+ "Name": "RandomNoise",
+ "Components": {
+ "Component_[10420548607186596407]": {
+ "$type": "SelectionComponent",
+ "Id": 10420548607186596407
+ },
+ "Component_[11351507264577024072]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 11351507264577024072,
+ "Parent Entity": "Entity_[263573147088542]"
+ },
+ "Component_[11576941520191560445]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11576941520191560445
+ },
+ "Component_[11787535428542045683]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 11787535428542045683
+ },
+ "Component_[11946132649485953311]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 11946132649485953311
+ },
+ "Component_[11970417753234451570]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 11970417753234451570
+ },
+ "Component_[13743879269876214143]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 13743879269876214143
+ },
+ "Component_[15614946697365576378]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 15614946697365576378
+ },
+ "Component_[17045174842161759045]": {
+ "$type": "EditorLockComponent",
+ "Id": 17045174842161759045
+ },
+ "Component_[3107716031616536910]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 3107716031616536910,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 11351507264577024072
+ },
+ {
+ "ComponentId": 6316453818295975755,
+ "SortIndex": 1
+ },
+ {
+ "ComponentId": 4846745402056100407,
+ "SortIndex": 2
+ },
+ {
+ "ComponentId": 8967153379180885152,
+ "SortIndex": 3
+ }
+ ]
+ },
+ "Component_[4846745402056100407]": {
+ "$type": "EditorGradientTransformComponent",
+ "Id": 4846745402056100407,
+ "Configuration": {
+ "ShapeReference": "",
+ "Bounds": [
+ 50.0,
+ 50.0,
+ 1.0
+ ]
+ }
+ },
+ "Component_[6316453818295975755]": {
+ "$type": "EditorReferenceShapeComponent",
+ "Id": 6316453818295975755,
+ "Configuration": {
+ "ShapeEntityId": "Entity_[263573147088542]"
+ }
+ },
+ "Component_[8967153379180885152]": {
+ "$type": "EditorRandomGradientComponent",
+ "Id": 8967153379180885152,
+ "PreviewEntity": "Entity_[263590326957726]"
+ }
+ }
+ },
+ "Entity_[263594621925022]": {
+ "Id": "Entity_[263594621925022]",
+ "Name": "PerlinNoise",
+ "Components": {
+ "Component_[15798567753940523121]": {
+ "$type": "EditorPerlinGradientComponent",
+ "Id": 15798567753940523121,
+ "Configuration": {
+ "randomSeed": 33,
+ "frequency": 0.25
+ },
+ "PreviewEntity": "Entity_[263594621925022]"
+ },
+ "Component_[16035848776632936419]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 16035848776632936419
+ },
+ "Component_[16434108759160050253]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 16434108759160050253
+ },
+ "Component_[16805003046507210760]": {
+ "$type": "EditorReferenceShapeComponent",
+ "Id": 16805003046507210760,
+ "Configuration": {
+ "ShapeEntityId": "Entity_[263607506826910]"
+ }
+ },
+ "Component_[17679463569742913027]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 17679463569742913027
+ },
+ "Component_[18285870860955961523]": {
+ "$type": "SelectionComponent",
+ "Id": 18285870860955961523
+ },
+ "Component_[2330427084045350198]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 2330427084045350198
+ },
+ "Component_[5921906930080711994]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5921906930080711994,
+ "Child Entity Order": [
+ "Entity_[263586031990430]"
+ ]
+ },
+ "Component_[764117453152842781]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 764117453152842781,
+ "Parent Entity": "Entity_[263581737023134]"
+ },
+ "Component_[7701931249281891300]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 7701931249281891300
+ },
+ "Component_[7967070680905543315]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 7967070680905543315,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 764117453152842781
+ },
+ {
+ "ComponentId": 16805003046507210760,
+ "SortIndex": 1
+ },
+ {
+ "ComponentId": 8029154041194694200,
+ "SortIndex": 2
+ },
+ {
+ "ComponentId": 15798567753940523121,
+ "SortIndex": 3
+ }
+ ]
+ },
+ "Component_[8029154041194694200]": {
+ "$type": "EditorGradientTransformComponent",
+ "Id": 8029154041194694200,
+ "Configuration": {
+ "ShapeReference": "",
+ "Bounds": [
+ 50.0,
+ 50.0,
+ 1.0
+ ]
+ }
+ },
+ "Component_[8660028910391135744]": {
+ "$type": "EditorLockComponent",
+ "Id": 8660028910391135744
+ }
+ }
+ },
+ "Entity_[263598916892318]": {
+ "Id": "Entity_[263598916892318]",
+ "Name": "LandscapeCanvas",
+ "Components": {
+ "Component_[12967746135199800648]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 12967746135199800648
+ },
+ "Component_[13081062505162225823]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 13081062505162225823
+ },
+ "Component_[16021195931295059075]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 16021195931295059075
+ },
+ "Component_[16134261272053586014]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 16134261272053586014
+ },
+ "Component_[17500735767968801510]": {
+ "$type": "EditorLandscapeCanvasComponent",
+ "Id": 17500735767968801510,
+ "Graph": {
+ "m_nodes": [
+ {
+ "Key": 1,
+ "Value": {
+ "$type": "CylinderShapeNode",
+ "m_propertySlots": [
+ {
+ "Key": {
+ "m_name": "EntityName"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9} AZStd::string",
+ "Value": "BushFlowerBlender"
+ }
+ }
+ }
+ ],
+ "m_vegetationEntityId": "Entity_[263607506826910]",
+ "m_componentId": 6683290476113150719
+ }
+ },
+ {
+ "Key": 2,
+ "Value": {
+ "$type": "RandomNoiseGradientNode",
+ "m_propertySlots": [
+ {
+ "Key": {
+ "m_name": "EntityName"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9} AZStd::string",
+ "Value": "RandomNoise"
+ }
+ }
+ }
+ ],
+ "m_inputDataSlots": [
+ {
+ "Key": {
+ "m_name": "PreviewBounds"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ }
+ ],
+ "m_vegetationEntityId": "Entity_[263590326957726]",
+ "m_componentId": 8967153379180885152
+ }
+ },
+ {
+ "Key": 3,
+ "Value": {
+ "$type": "SpawnerAreaNode",
+ "m_propertySlots": [
+ {
+ "Key": {
+ "m_name": "EntityName"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9} AZStd::string",
+ "Value": "BushSpawner"
+ }
+ }
+ }
+ ],
+ "m_inputDataSlots": [
+ {
+ "Key": {
+ "m_name": "PlacementBounds"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ }
+ ],
+ "m_vegetationEntityId": "Entity_[263573147088542]",
+ "m_componentId": 1240444912193942742
+ }
+ },
+ {
+ "Key": 4,
+ "Value": {
+ "$type": "PerlinNoiseGradientNode",
+ "m_propertySlots": [
+ {
+ "Key": {
+ "m_name": "EntityName"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9} AZStd::string",
+ "Value": "PerlinNoise"
+ }
+ }
+ }
+ ],
+ "m_inputDataSlots": [
+ {
+ "Key": {
+ "m_name": "PreviewBounds"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ }
+ ],
+ "m_vegetationEntityId": "Entity_[263603211859614]",
+ "m_componentId": 10160640699095155981
+ }
+ },
+ {
+ "Key": 5,
+ "Value": {
+ "$type": "RandomNoiseGradientNode",
+ "m_propertySlots": [
+ {
+ "Key": {
+ "m_name": "EntityName"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9} AZStd::string",
+ "Value": "RandomNoise"
+ }
+ }
+ }
+ ],
+ "m_inputDataSlots": [
+ {
+ "Key": {
+ "m_name": "PreviewBounds"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ }
+ ],
+ "m_vegetationEntityId": "Entity_[263577442055838]",
+ "m_componentId": 13412023990029767074
+ }
+ },
+ {
+ "Key": 6,
+ "Value": {
+ "$type": "SpawnerAreaNode",
+ "m_propertySlots": [
+ {
+ "Key": {
+ "m_name": "EntityName"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9} AZStd::string",
+ "Value": "FlowerSpawner"
+ }
+ }
+ }
+ ],
+ "m_inputDataSlots": [
+ {
+ "Key": {
+ "m_name": "PlacementBounds"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ }
+ ],
+ "m_vegetationEntityId": "Entity_[263581737023134]",
+ "m_componentId": 6902499453501456890
+ }
+ },
+ {
+ "Key": 7,
+ "Value": {
+ "$type": "AreaBlenderNode",
+ "m_propertySlots": [
+ {
+ "Key": {
+ "m_name": "EntityName"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9} AZStd::string",
+ "Value": "BushFlowerBlender"
+ }
+ }
+ }
+ ],
+ "m_extendableSlots": {
+ "InboundArea": [
+ {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ },
+ {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ },
+ "m_subId": 1
+ }
+ ]
+ },
+ "m_vegetationEntityId": "Entity_[263607506826910]",
+ "m_componentId": 7229206794941734410
+ }
+ },
+ {
+ "Key": 8,
+ "Value": {
+ "$type": "PerlinNoiseGradientNode",
+ "m_propertySlots": [
+ {
+ "Key": {
+ "m_name": "EntityName"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9} AZStd::string",
+ "Value": "PerlinNoise"
+ }
+ }
+ }
+ ],
+ "m_inputDataSlots": [
+ {
+ "Key": {
+ "m_name": "PreviewBounds"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ }
+ ],
+ "m_vegetationEntityId": "Entity_[263594621925022]",
+ "m_componentId": 15798567753940523121
+ }
+ },
+ {
+ "Key": 9,
+ "Value": {
+ "$type": "InvertGradientModifierNode",
+ "m_propertySlots": [
+ {
+ "Key": {
+ "m_name": "EntityName"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9} AZStd::string",
+ "Value": "Invert"
+ }
+ }
+ }
+ ],
+ "m_inputDataSlots": [
+ {
+ "Key": {
+ "m_name": "InboundGradient"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ },
+ {
+ "Key": {
+ "m_name": "PreviewBounds"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ }
+ ],
+ "m_vegetationEntityId": "Entity_[263586031990430]",
+ "m_componentId": 8903771095804438921
+ }
+ },
+ {
+ "Key": 10,
+ "Value": {
+ "$type": "RotationModifierNode",
+ "m_inputDataSlots": [
+ {
+ "Key": {
+ "m_name": "InboundGradientX"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ },
+ {
+ "Key": {
+ "m_name": "InboundGradientY"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ },
+ {
+ "Key": {
+ "m_name": "InboundGradientZ"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ }
+ ],
+ "m_vegetationEntityId": "Entity_[263573147088542]",
+ "m_componentId": 17991239182321715249
+ }
+ },
+ {
+ "Key": 11,
+ "Value": {
+ "$type": "DistributionFilterNode",
+ "m_inputDataSlots": [
+ {
+ "Key": {
+ "m_name": "InboundGradient"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ }
+ ],
+ "m_vegetationEntityId": "Entity_[263573147088542]",
+ "m_componentId": 14175761523159824993
+ }
+ },
+ {
+ "Key": 12,
+ "Value": {
+ "$type": "ScaleModifierNode",
+ "m_inputDataSlots": [
+ {
+ "Key": {
+ "m_name": "InboundGradient"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ }
+ ],
+ "m_vegetationEntityId": "Entity_[263573147088542]",
+ "m_componentId": 2884829698060689565
+ }
+ },
+ {
+ "Key": 13,
+ "Value": {
+ "$type": "PositionModifierNode",
+ "m_inputDataSlots": [
+ {
+ "Key": {
+ "m_name": "InboundGradientX"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ },
+ {
+ "Key": {
+ "m_name": "InboundGradientY"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ },
+ {
+ "Key": {
+ "m_name": "InboundGradientZ"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ }
+ ],
+ "m_vegetationEntityId": "Entity_[263573147088542]",
+ "m_componentId": 11886309121583108836
+ }
+ },
+ {
+ "Key": 14,
+ "Value": {
+ "$type": "RotationModifierNode",
+ "m_inputDataSlots": [
+ {
+ "Key": {
+ "m_name": "InboundGradientX"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ },
+ {
+ "Key": {
+ "m_name": "InboundGradientY"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ },
+ {
+ "Key": {
+ "m_name": "InboundGradientZ"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ }
+ ],
+ "m_vegetationEntityId": "Entity_[263581737023134]",
+ "m_componentId": 10418076448308581948
+ }
+ },
+ {
+ "Key": 15,
+ "Value": {
+ "$type": "DistributionFilterNode",
+ "m_inputDataSlots": [
+ {
+ "Key": {
+ "m_name": "InboundGradient"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ }
+ ],
+ "m_vegetationEntityId": "Entity_[263581737023134]",
+ "m_componentId": 13983302912005698250
+ }
+ },
+ {
+ "Key": 16,
+ "Value": {
+ "$type": "ScaleModifierNode",
+ "m_inputDataSlots": [
+ {
+ "Key": {
+ "m_name": "InboundGradient"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ }
+ ],
+ "m_vegetationEntityId": "Entity_[263581737023134]",
+ "m_componentId": 13079591667184987458
+ }
+ },
+ {
+ "Key": 17,
+ "Value": {
+ "$type": "PositionModifierNode",
+ "m_inputDataSlots": [
+ {
+ "Key": {
+ "m_name": "InboundGradientX"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ },
+ {
+ "Key": {
+ "m_name": "InboundGradientY"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ },
+ {
+ "Key": {
+ "m_name": "InboundGradientZ"
+ },
+ "Value": {
+ "m_value": {
+ "$type": "EntityId",
+ "Value": ""
+ }
+ }
+ }
+ ],
+ "m_vegetationEntityId": "Entity_[263581737023134]",
+ "m_componentId": 7912787520673119502
+ }
+ }
+ ],
+ "m_connections": [
+ {
+ "m_sourceEndpoint": [
+ 8,
+ {
+ "m_name": "OutboundGradient"
+ }
+ ],
+ "m_targetEndpoint": [
+ 9,
+ {
+ "m_name": "InboundGradient"
+ }
+ ]
+ },
+ {
+ "m_sourceEndpoint": [
+ 3,
+ {
+ "m_name": "OutboundArea"
+ }
+ ],
+ "m_targetEndpoint": [
+ 7,
+ {
+ "m_name": "InboundArea"
+ }
+ ]
+ },
+ {
+ "m_sourceEndpoint": [
+ 6,
+ {
+ "m_name": "OutboundArea"
+ }
+ ],
+ "m_targetEndpoint": [
+ 7,
+ {
+ "m_name": "InboundArea",
+ "m_subId": 1
+ }
+ ]
+ },
+ {
+ "m_sourceEndpoint": [
+ 1,
+ {
+ "m_name": "Bounds"
+ }
+ ],
+ "m_targetEndpoint": [
+ 3,
+ {
+ "m_name": "PlacementBounds"
+ }
+ ]
+ },
+ {
+ "m_sourceEndpoint": [
+ 1,
+ {
+ "m_name": "Bounds"
+ }
+ ],
+ "m_targetEndpoint": [
+ 6,
+ {
+ "m_name": "PlacementBounds"
+ }
+ ]
+ },
+ {
+ "m_sourceEndpoint": [
+ 2,
+ {
+ "m_name": "OutboundGradient"
+ }
+ ],
+ "m_targetEndpoint": [
+ 10,
+ {
+ "m_name": "InboundGradientZ"
+ }
+ ]
+ },
+ {
+ "m_sourceEndpoint": [
+ 4,
+ {
+ "m_name": "OutboundGradient"
+ }
+ ],
+ "m_targetEndpoint": [
+ 11,
+ {
+ "m_name": "InboundGradient"
+ }
+ ]
+ },
+ {
+ "m_sourceEndpoint": [
+ 2,
+ {
+ "m_name": "OutboundGradient"
+ }
+ ],
+ "m_targetEndpoint": [
+ 12,
+ {
+ "m_name": "InboundGradient"
+ }
+ ]
+ },
+ {
+ "m_sourceEndpoint": [
+ 2,
+ {
+ "m_name": "OutboundGradient"
+ }
+ ],
+ "m_targetEndpoint": [
+ 13,
+ {
+ "m_name": "InboundGradientX"
+ }
+ ]
+ },
+ {
+ "m_sourceEndpoint": [
+ 2,
+ {
+ "m_name": "OutboundGradient"
+ }
+ ],
+ "m_targetEndpoint": [
+ 13,
+ {
+ "m_name": "InboundGradientY"
+ }
+ ]
+ },
+ {
+ "m_sourceEndpoint": [
+ 5,
+ {
+ "m_name": "OutboundGradient"
+ }
+ ],
+ "m_targetEndpoint": [
+ 14,
+ {
+ "m_name": "InboundGradientZ"
+ }
+ ]
+ },
+ {
+ "m_sourceEndpoint": [
+ 9,
+ {
+ "m_name": "OutboundGradient"
+ }
+ ],
+ "m_targetEndpoint": [
+ 15,
+ {
+ "m_name": "InboundGradient"
+ }
+ ]
+ },
+ {
+ "m_sourceEndpoint": [
+ 5,
+ {
+ "m_name": "OutboundGradient"
+ }
+ ],
+ "m_targetEndpoint": [
+ 16,
+ {
+ "m_name": "InboundGradient"
+ }
+ ]
+ },
+ {
+ "m_sourceEndpoint": [
+ 5,
+ {
+ "m_name": "OutboundGradient"
+ }
+ ],
+ "m_targetEndpoint": [
+ 17,
+ {
+ "m_name": "InboundGradientX"
+ }
+ ]
+ },
+ {
+ "m_sourceEndpoint": [
+ 5,
+ {
+ "m_name": "OutboundGradient"
+ }
+ ],
+ "m_targetEndpoint": [
+ 17,
+ {
+ "m_name": "InboundGradientY"
+ }
+ ]
+ }
+ ],
+ "m_uiMetadata": {
+ "m_sceneMetadata": {
+ "ComponentData": {
+ "{5F84B500-8C45-40D1-8EFC-A5306B241444}": {
+ "$type": "SceneComponentSaveData",
+ "ViewParams": {
+ "Scale": 0.3771495156249999,
+ "AnchorX": -498.4760437011719,
+ "AnchorY": 808.6978149414063
+ }
+ }
+ }
+ },
+ "m_nodeMetadata": [
+ {
+ "Key": 2,
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "GradientNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 100.0,
+ 580.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{2D583FA2-5659-491F-8914-6302420E3F0B}"
+ }
+ }
+ }
+ },
+ {
+ "Key": 3,
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "VegetationAreaNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 480.0,
+ 600.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{A26480C4-A80B-4B36-ADE1-918E4541EA2B}"
+ }
+ }
+ }
+ },
+ {
+ "Key": 5,
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "GradientNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 100.0,
+ 1540.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{6CE9EA8B-85E7-4E17-B1D6-CA97D9D65276}"
+ }
+ }
+ }
+ },
+ {
+ "Key": 6,
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "VegetationAreaNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 480.0,
+ 1560.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{8FABE49F-1D73-46FE-8616-A982EEE46DDD}"
+ }
+ }
+ }
+ },
+ {
+ "Key": 7,
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "VegetationAreaNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 840.0,
+ 1580.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{C5EEBC1D-B91B-4852-A41D-425C6FED3FB9}"
+ }
+ }
+ }
+ },
+ {
+ "Key": 9,
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "GradientModifierNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 480.0,
+ 2060.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{5EB76670-0CBE-4F2A-9AE7-F65709D0BE92}"
+ }
+ }
+ }
+ },
+ {
+ "Key": 10,
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "VegetationAreaNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 6.0,
+ 147.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{5CB69A73-F7BA-4F76-AB86-F343052C3D7D}"
+ }
+ }
+ }
+ },
+ {
+ "Key": 11,
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "VegetationAreaNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 6.0,
+ 367.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{235DEBEC-E3F8-43C1-BA7E-41475B834D70}"
+ }
+ }
+ }
+ },
+ {
+ "Key": 12,
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "VegetationAreaNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 6.0,
+ 288.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{9E56E7B6-2ECE-42F9-9A23-FF7D192209D2}"
+ }
+ }
+ }
+ },
+ {
+ "Key": 13,
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "VegetationAreaNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 6.0,
+ 6.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{61759FE6-E6F7-4F4B-819B-FBFE125D7389}"
+ }
+ }
+ }
+ },
+ {
+ "Key": 14,
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "VegetationAreaNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 6.0,
+ 147.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{0AC1C6C8-7CC1-4068-A87D-F4B92AE8FCAF}"
+ }
+ }
+ }
+ },
+ {
+ "Key": 15,
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "VegetationAreaNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 6.0,
+ 367.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{5D698B90-830F-46FE-ADD8-6164EA098C3E}"
+ }
+ }
+ }
+ },
+ {
+ "Key": 16,
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "VegetationAreaNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 6.0,
+ 288.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{9DE6DE4A-2E6F-44BA-B292-3CD2215C1D5B}"
+ }
+ }
+ }
+ },
+ {
+ "Key": 17,
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "VegetationAreaNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 6.0,
+ 6.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{57FA822D-629F-4949-A8D7-D675544EBC0A}"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "m_nodeWrappings": [
+ {
+ "Key": 10,
+ "Value": [
+ 3,
+ 1
+ ]
+ },
+ {
+ "Key": 11,
+ "Value": [
+ 3,
+ 6
+ ]
+ },
+ {
+ "Key": 12,
+ "Value": [
+ 3,
+ 2
+ ]
+ },
+ {
+ "Key": 13,
+ "Value": [
+ 3,
+ {}
+ ]
+ },
+ {
+ "Key": 14,
+ "Value": [
+ 6,
+ 1
+ ]
+ },
+ {
+ "Key": 15,
+ "Value": [
+ 6,
+ 6
+ ]
+ },
+ {
+ "Key": 16,
+ "Value": [
+ 6,
+ 2
+ ]
+ },
+ {
+ "Key": 17,
+ "Value": [
+ 6,
+ {}
+ ]
+ }
+ ]
+ }
+ },
+ "Component_[17574651838531525263]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 17574651838531525263,
+ "Child Entity Order": [
+ "Entity_[263607506826910]"
+ ]
+ },
+ "Component_[3086205760978540160]": {
+ "$type": "EditorLockComponent",
+ "Id": 3086205760978540160
+ },
+ "Component_[3102230753208284750]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 3102230753208284750,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 5796173638130327223
+ },
+ {
+ "ComponentId": 17500735767968801510,
+ "SortIndex": 1
+ }
+ ]
+ },
+ "Component_[4695341524212000585]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 4695341524212000585
+ },
+ "Component_[5796173638130327223]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 5796173638130327223,
+ "Parent Entity": "ContainerEntity"
+ },
+ "Component_[8278362871021770878]": {
+ "$type": "SelectionComponent",
+ "Id": 8278362871021770878
+ }
+ }
+ },
+ "Entity_[263603211859614]": {
+ "Id": "Entity_[263603211859614]",
+ "Name": "PerlinNoise",
+ "Components": {
+ "Component_[10006546776757889020]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 10006546776757889020
+ },
+ "Component_[10160640699095155981]": {
+ "$type": "EditorPerlinGradientComponent",
+ "Id": 10160640699095155981,
+ "Configuration": {
+ "randomSeed": 33,
+ "frequency": 0.25
+ },
+ "PreviewEntity": "Entity_[263603211859614]"
+ },
+ "Component_[11506183926478566822]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 11506183926478566822
+ },
+ "Component_[13160180411150366392]": {
+ "$type": "EditorLockComponent",
+ "Id": 13160180411150366392
+ },
+ "Component_[15083697380300161163]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 15083697380300161163
+ },
+ "Component_[15404456223257061245]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 15404456223257061245,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 6484803030406851652
+ },
+ {
+ "ComponentId": 4912800286535654244,
+ "SortIndex": 1
+ },
+ {
+ "ComponentId": 2395166459126906105,
+ "SortIndex": 2
+ },
+ {
+ "ComponentId": 10160640699095155981,
+ "SortIndex": 3
+ }
+ ]
+ },
+ "Component_[2395166459126906105]": {
+ "$type": "EditorGradientTransformComponent",
+ "Id": 2395166459126906105,
+ "Configuration": {
+ "ShapeReference": "",
+ "Bounds": [
+ 50.0,
+ 50.0,
+ 1.0
+ ]
+ }
+ },
+ "Component_[4417011400526470160]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 4417011400526470160
+ },
+ "Component_[4601061670472962302]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 4601061670472962302
+ },
+ "Component_[4912800286535654244]": {
+ "$type": "EditorReferenceShapeComponent",
+ "Id": 4912800286535654244,
+ "Configuration": {
+ "ShapeEntityId": "Entity_[263607506826910]"
+ }
+ },
+ "Component_[6233982345083723563]": {
+ "$type": "SelectionComponent",
+ "Id": 6233982345083723563
+ },
+ "Component_[6484803030406851652]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6484803030406851652,
+ "Parent Entity": "Entity_[263573147088542]"
+ },
+ "Component_[6813813525871080299]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 6813813525871080299
+ }
+ }
+ },
+ "Entity_[263607506826910]": {
+ "Id": "Entity_[263607506826910]",
+ "Name": "BushFlowerBlender",
+ "Components": {
+ "Component_[13725600808872754587]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 13725600808872754587
+ },
+ "Component_[15959807606564505710]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 15959807606564505710,
+ "Parent Entity": "Entity_[263598916892318]"
+ },
+ "Component_[1596826146661515925]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 1596826146661515925
+ },
+ "Component_[4525591661239956058]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 4525591661239956058
+ },
+ "Component_[6683290476113150719]": {
+ "$type": "EditorCylinderShapeComponent",
+ "Id": 6683290476113150719,
+ "CylinderShape": {
+ "Configuration": {
+ "Radius": 25.0
+ }
+ }
+ },
+ "Component_[6879394931668195375]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 6879394931668195375,
+ "Child Entity Order": [
+ "Entity_[263573147088542]",
+ "Entity_[263581737023134]"
+ ]
+ },
+ "Component_[7229206794941734410]": {
+ "$type": "EditorAreaBlenderComponent",
+ "Id": 7229206794941734410,
+ "Configuration": {
+ "Operations": [
+ "Entity_[263573147088542]",
+ "Entity_[263581737023134]"
+ ]
+ },
+ "PreviewEntity": "Entity_[263607506826910]"
+ },
+ "Component_[8772711204845372843]": {
+ "$type": "EditorLockComponent",
+ "Id": 8772711204845372843
+ },
+ "Component_[8959345022109725835]": {
+ "$type": "SelectionComponent",
+ "Id": 8959345022109725835
+ },
+ "Component_[9094488642973843583]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 9094488642973843583
+ },
+ "Component_[9112960617967513749]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 9112960617967513749,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 15959807606564505710
+ },
+ {
+ "ComponentId": 7229206794941734410,
+ "SortIndex": 1
+ },
+ {
+ "ComponentId": 6683290476113150719,
+ "SortIndex": 2
+ }
+ ]
+ },
+ "Component_[9541665258597207652]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 9541665258597207652
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Assets/Prefabs/PurpleFlower.prefab b/AutomatedTesting/Assets/Prefabs/PurpleFlower.prefab
new file mode 100644
index 0000000000..a8716ec099
--- /dev/null
+++ b/AutomatedTesting/Assets/Prefabs/PurpleFlower.prefab
@@ -0,0 +1,129 @@
+{
+ "ContainerEntity": {
+ "Id": "ContainerEntity",
+ "Name": "PurpleFlower",
+ "Components": {
+ "Component_[10519928302743666073]": {
+ "$type": "EditorPrefabComponent",
+ "Id": 10519928302743666073
+ },
+ "Component_[13894087802180240181]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 13894087802180240181,
+ "Parent Entity": ""
+ },
+ "Component_[15788541052719571801]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 15788541052719571801
+ },
+ "Component_[15842981265136092481]": {
+ "$type": "SelectionComponent",
+ "Id": 15842981265136092481
+ },
+ "Component_[16360384897559021149]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 16360384897559021149
+ },
+ "Component_[16713545675046303279]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 16713545675046303279
+ },
+ "Component_[1806734194268113785]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 1806734194268113785
+ },
+ "Component_[5392020700593853313]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5392020700593853313,
+ "Child Entity Order": [
+ "Entity_[14335611090324]"
+ ]
+ },
+ "Component_[5995854518752659458]": {
+ "$type": "EditorLockComponent",
+ "Id": 5995854518752659458
+ },
+ "Component_[6963022284400845376]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 6963022284400845376
+ },
+ "Component_[8055275578170091546]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 8055275578170091546
+ }
+ }
+ },
+ "Entities": {
+ "Entity_[14335611090324]": {
+ "Id": "Entity_[14335611090324]",
+ "Name": "PurpleFlower",
+ "Components": {
+ "Component_[10887353073528055802]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 10887353073528055802
+ },
+ "Component_[12641127425852859189]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 12641127425852859189,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{D493A670-6D82-5AE9-A2C8-A2EB02684F71}",
+ "subId": 284799939
+ },
+ "assetHint": "assets/objects/foliage/grass_flower_purple.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[14406733303466080015]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14406733303466080015,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 9231452352781000222
+ },
+ {
+ "ComponentId": 12641127425852859189,
+ "SortIndex": 1
+ }
+ ]
+ },
+ "Component_[1452384341905923012]": {
+ "$type": "EditorLockComponent",
+ "Id": 1452384341905923012
+ },
+ "Component_[2215454016415585892]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 2215454016415585892
+ },
+ "Component_[4104108067383423623]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 4104108067383423623
+ },
+ "Component_[4197335450471807917]": {
+ "$type": "SelectionComponent",
+ "Id": 4197335450471807917
+ },
+ "Component_[6877680739064997650]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 6877680739064997650
+ },
+ "Component_[7372550507186490390]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 7372550507186490390
+ },
+ "Component_[7673532337364366244]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 7673532337364366244
+ },
+ "Component_[9231452352781000222]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 9231452352781000222,
+ "Parent Entity": "ContainerEntity"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Assets/TestAnim/parent_tops.fbx b/AutomatedTesting/Assets/TestAnim/parent_tops.fbx
new file mode 100644
index 0000000000..f13323ae8b
--- /dev/null
+++ b/AutomatedTesting/Assets/TestAnim/parent_tops.fbx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3789abdf439a6d70438fd4bb1e06881ae6686a4699209c6bc371d22d161e5347
+size 26476
diff --git a/AutomatedTesting/Assets/TestAnim/parenting_test_default.fbx b/AutomatedTesting/Assets/TestAnim/parenting_test_default.fbx
new file mode 100644
index 0000000000..d3e189bdc5
--- /dev/null
+++ b/AutomatedTesting/Assets/TestAnim/parenting_test_default.fbx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c987d7d79685fda83efcffb7e1afbcd356c37fc68ec5c663a89b02d4df10caea
+size 46412
diff --git a/AutomatedTesting/Assets/VegDescriptorLists/flower_pink.vegdescriptorlist b/AutomatedTesting/Assets/VegDescriptorLists/flower_pink.vegdescriptorlist
index 372cafbdce..9120d992c7 100644
--- a/AutomatedTesting/Assets/VegDescriptorLists/flower_pink.vegdescriptorlist
+++ b/AutomatedTesting/Assets/VegDescriptorLists/flower_pink.vegdescriptorlist
@@ -2,11 +2,11 @@
-
+
-
+
-
+
diff --git a/AutomatedTesting/Gem/Code/Source/AutoGen/NetworkTestLevelEntityComponent.AutoComponent.xml b/AutomatedTesting/Gem/Code/Source/AutoGen/NetworkTestLevelEntityComponent.AutoComponent.xml
new file mode 100644
index 0000000000..2fd196a2f6
--- /dev/null
+++ b/AutomatedTesting/Gem/Code/Source/AutoGen/NetworkTestLevelEntityComponent.AutoComponent.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/AutomatedTesting/Gem/Code/Source/AutoGen/NetworkTestPlayerComponent.AutoComponent.xml b/AutomatedTesting/Gem/Code/Source/AutoGen/NetworkTestPlayerComponent.AutoComponent.xml
index 251d2b25af..b4dd35d741 100644
--- a/AutomatedTesting/Gem/Code/Source/AutoGen/NetworkTestPlayerComponent.AutoComponent.xml
+++ b/AutomatedTesting/Gem/Code/Source/AutoGen/NetworkTestPlayerComponent.AutoComponent.xml
@@ -29,8 +29,6 @@
-
-
diff --git a/AutomatedTesting/Gem/Code/automatedtesting_files.cmake b/AutomatedTesting/Gem/Code/automatedtesting_files.cmake
index eb619104a4..1f6dbbd772 100644
--- a/AutomatedTesting/Gem/Code/automatedtesting_files.cmake
+++ b/AutomatedTesting/Gem/Code/automatedtesting_files.cmake
@@ -12,4 +12,5 @@ set(FILES
Source/AutomatedTestingSystemComponent.cpp
Source/AutomatedTestingSystemComponent.h
Source/AutoGen/NetworkTestPlayerComponent.AutoComponent.xml
+ Source/AutoGen/NetworkTestLevelEntityComponent.AutoComponent.xml
)
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/AWS/CMakeLists.txt
index c8629bbe8b..10e90ecbfc 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/AWS/CMakeLists.txt
@@ -12,12 +12,6 @@
################################################################################
if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
- # Only enable AWS automated tests on Windows
- set(SUPPORTED_PLATFORMS "Windows" "Linux")
- if (NOT "${PAL_PLATFORM_NAME}" IN_LIST SUPPORTED_PLATFORMS)
- return()
- endif()
-
ly_add_pytest(
NAME AutomatedTesting::AWSTests
TEST_SUITE awsi
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/README.md b/AutomatedTesting/Gem/PythonTests/AWS/README.md
index a25f39d9c2..73ef685261 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/README.md
+++ b/AutomatedTesting/Gem/PythonTests/AWS/README.md
@@ -3,7 +3,7 @@
## Prerequisites
1. Build the O3DE Editor and AutomatedTesting.GameLauncher in Profile.
2. Install the latest version of NodeJs.
-3. AWS CLI is installed and configured following [Configuration and Credential File Settings](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html).
+3. AWS CLI is installed and AWS crendentials are configured via [environment variables](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html) or [default profile](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html).
4. [AWS Cloud Development Kit (CDK)](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html#getting_started_install) is installed.
## Deploy CDK Applications
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/common/aws_credentials.py b/AutomatedTesting/Gem/PythonTests/AWS/common/aws_credentials.py
index c6401f2828..d0bbfe7c3e 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/common/aws_credentials.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/common/aws_credentials.py
@@ -68,6 +68,10 @@ class AwsCredentials:
if (len(self._credentials.sections()) == 0) and (not self._credentials_file_exists):
os.remove(self._credentials_path)
return
+
+ credentials_file_dir = os.path.dirname(self._credentials_path)
+ if not os.path.isdir(credentials_file_dir):
+ os.makedirs(credentials_file_dir)
with open(self._credentials_path, 'w+') as credential_file:
self._credentials.write(credential_file)
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/common/aws_utils.py b/AutomatedTesting/Gem/PythonTests/AWS/common/aws_utils.py
index 92f3762e71..2a5efbd03f 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/common/aws_utils.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/common/aws_utils.py
@@ -16,7 +16,7 @@ logging.getLogger('nose').setLevel(logging.WARNING)
class AwsUtils:
def __init__(self, arn: str, session_name: str, region_name: str):
- local_session = boto3.Session(profile_name='default')
+ local_session = boto3.Session()
local_sts_client = local_session.client('sts')
self._local_account_id = local_sts_client.get_caller_identity()["Account"]
logger.info(f'Local Account Id: {self._local_account_id}')
diff --git a/AutomatedTesting/Gem/PythonTests/AWS/common/constants.py b/AutomatedTesting/Gem/PythonTests/AWS/common/constants.py
index b12aca5f29..a38974073a 100644
--- a/AutomatedTesting/Gem/PythonTests/AWS/common/constants.py
+++ b/AutomatedTesting/Gem/PythonTests/AWS/common/constants.py
@@ -6,11 +6,13 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
"""
import os
+import platform
# ARN of the IAM role to assume for retrieving temporary AWS credentials
ASSUME_ROLE_ARN = os.environ.get('ASSUME_ROLE_ARN', 'arn:aws:iam::645075835648:role/o3de-automation-tests')
# Name of the AWS project deployed by the CDK applications
-AWS_PROJECT_NAME = os.environ.get('O3DE_AWS_PROJECT_NAME', 'AWSAUTO')
+AWS_PROJECT_NAME = os.environ.get('O3DE_AWS_PROJECT_NAME').upper() if os.environ.get('O3DE_AWS_PROJECT_NAME') else \
+ (os.environ.get('BRANCH_NAME', '') + '-' + os.environ.get('PIPELINE_NAME', '') + '-' + platform.system()).upper()
# Region for the existing CloudFormation stacks used by the automation tests
AWS_REGION = os.environ.get('O3DE_AWS_DEPLOY_REGION', 'us-east-1')
# Name of the default resource mapping config file used by the automation tests
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/Atom/TestSuite_Main.py
index f1e66ac492..8fc9838b52 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/TestSuite_Main.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/TestSuite_Main.py
@@ -21,7 +21,11 @@ TEST_DIRECTORY = os.path.join(os.path.dirname(__file__), "tests")
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
class TestAutomation(EditorTestSuite):
- enable_prefab_system = False
+ enable_prefab_system = True
+
+ @pytest.mark.test_case_id("C36529679")
+ class AtomLevelLoadTest_Editor(EditorSharedTest):
+ from Atom.tests import hydra_Atom_LevelLoadTest as test_module
@pytest.mark.test_case_id("C36525657")
class AtomEditorComponents_BloomAdded(EditorSharedTest):
@@ -120,6 +124,14 @@ class TestAutomation(EditorTestSuite):
class AtomEditorComponents_SSAOAdded(EditorSharedTest):
from Atom.tests import hydra_AtomEditorComponents_SSAOAdded as test_module
+ @pytest.mark.test_case_id("C36529666")
+ class AtomEditorComponentsLevel_DiffuseGlobalIlluminationAdded(EditorSharedTest):
+ from Atom.tests import hydra_AtomEditorComponentsLevel_DiffuseGlobalIlluminationAdded as test_module
+
+ @pytest.mark.test_case_id("C36525660")
+ class AtomEditorComponentsLevel_DisplayMapperAdded(EditorSharedTest):
+ from Atom.tests import hydra_AtomEditorComponentsLevel_DisplayMapperAdded as test_module
+
class ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges(EditorSharedTest):
from Atom.tests import hydra_ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges as test_module
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/TestSuite_Sandbox.py b/AutomatedTesting/Gem/PythonTests/Atom/TestSuite_Sandbox.py
index bd0477a1db..5299e55a2b 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/TestSuite_Sandbox.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/TestSuite_Sandbox.py
@@ -26,13 +26,3 @@ class TestAutomation(EditorTestSuite):
@pytest.mark.test_case_id("C36525660")
class AtomEditorComponents_DisplayMapperAdded(EditorSharedTest):
from Atom.tests import hydra_AtomEditorComponents_DisplayMapperAdded as test_module
-
- # this test causes editor to crash when using slices. once automation transitions to prefabs it should pass
- @pytest.mark.test_case_id("C36529666")
- class AtomEditorComponentsLevel_DiffuseGlobalIlluminationAdded(EditorSharedTest):
- from Atom.tests import hydra_AtomEditorComponentsLevel_DiffuseGlobalIlluminationAdded as test_module
-
- # this test causes editor to crash when using slices. once automation transitions to prefabs it should pass
- @pytest.mark.test_case_id("C36525660")
- class AtomEditorComponentsLevel_DisplayMapperAdded(EditorSharedTest):
- from Atom.tests import hydra_AtomEditorComponentsLevel_DisplayMapperAdded as test_module
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/atom_utils/atom_constants.py b/AutomatedTesting/Gem/PythonTests/Atom/atom_utils/atom_constants.py
index e6d6ac7fb1..339108090f 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/atom_utils/atom_constants.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/atom_utils/atom_constants.py
@@ -32,6 +32,8 @@ GLOBAL_ILLUMINATION_QUALITY = {
'High': 2,
}
+# Level list used in Editor Level Load Test
+LEVEL_LIST = ["hermanubis", "hermanubis_high", "macbeth_shaderballs", "PbrMaterialChart", "ShadowTest", "Sponza"]
class AtomComponentProperties:
"""
@@ -195,11 +197,13 @@ class AtomComponentProperties:
def entity_reference(property: str = 'name') -> str:
"""
Entity Reference component properties.
+ - 'EntityIdReferences' component container of entityId references. Initially empty.
:param property: From the last element of the property tree path. Default 'name' for component name string.
:return: Full property path OR component name if no property specified.
"""
properties = {
'name': 'Entity Reference',
+ 'EntityIdReferences': 'Controller|Configuration|EntityIdReferences',
}
return properties[property]
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponentsLevel_DiffuseGlobalIlluminationAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponentsLevel_DiffuseGlobalIlluminationAdded.py
index ddcd5c3c46..0c9b39e354 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponentsLevel_DiffuseGlobalIlluminationAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponentsLevel_DiffuseGlobalIlluminationAdded.py
@@ -60,7 +60,7 @@ def AtomEditorComponentsLevel_DiffuseGlobalIllumination_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Add Diffuse Global Illumination level component to the level entity.
@@ -86,10 +86,10 @@ def AtomEditorComponentsLevel_DiffuseGlobalIllumination_AddedToEntity():
# 4. Set Quality Level property to Low
diffuse_global_illumination_component.set_component_property_value(
- AtomComponentProperties.diffuse_global_illumination('Quality Level', GLOBAL_ILLUMINATION_QUALITY['Low']))
+ AtomComponentProperties.diffuse_global_illumination('Quality Level'), GLOBAL_ILLUMINATION_QUALITY['Low'])
quality = diffuse_global_illumination_component.get_component_property_value(
AtomComponentProperties.diffuse_global_illumination('Quality Level'))
- Report.result(diffuse_global_illumination_quality, quality == GLOBAL_ILLUMINATION_QUALITY['Low'])
+ Report.result(Tests.diffuse_global_illumination_quality, quality == GLOBAL_ILLUMINATION_QUALITY['Low'])
# 5. Enter/Exit game mode.
TestHelper.enter_game_mode(Tests.enter_game_mode)
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponentsLevel_DisplayMapperAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponentsLevel_DisplayMapperAdded.py
index c050dd76d4..f9660957bb 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponentsLevel_DisplayMapperAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponentsLevel_DisplayMapperAdded.py
@@ -67,7 +67,7 @@ def AtomEditorComponentsLevel_DisplayMapper_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Add Display Mapper level component to the level entity.
@@ -102,7 +102,7 @@ def AtomEditorComponentsLevel_DisplayMapper_AddedToEntity():
display_mapper_component.set_component_property_value(
AtomComponentProperties.display_mapper('Enable LDR color grading LUT'), True)
Report.result(
- Test.enable_ldr_color_grading_lut,
+ Tests.enable_ldr_color_grading_lut,
display_mapper_component.get_component_property_value(
AtomComponentProperties.display_mapper('Enable LDR color grading LUT')) is True)
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_BloomAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_BloomAdded.py
index 56b22eb20d..ce29a1de88 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_BloomAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_BloomAdded.py
@@ -97,7 +97,7 @@ def AtomEditorComponents_Bloom_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create an Bloom entity with no components.
@@ -170,10 +170,12 @@ def AtomEditorComponents_Bloom_AddedToEntity():
# 13. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, bloom_entity.exists())
# 14. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not bloom_entity.exists())
# 15. Look for errors and asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DecalAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DecalAdded.py
index e840cf3cf1..eb5e24e3a6 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DecalAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DecalAdded.py
@@ -95,7 +95,7 @@ def AtomEditorComponents_Decal_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a Decal entity with no components.
@@ -162,6 +162,7 @@ def AtomEditorComponents_Decal_AddedToEntity():
# 11. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not decal_entity.exists())
# 12. Look for errors and asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DeferredFogAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DeferredFogAdded.py
index 71163ece94..f1578cbf8d 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DeferredFogAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DeferredFogAdded.py
@@ -97,7 +97,7 @@ def AtomEditorComponents_DeferredFog_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create an Deferred Fog entity with no components.
@@ -174,10 +174,12 @@ def AtomEditorComponents_DeferredFog_AddedToEntity():
# 13. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, deferred_fog_entity.exists())
# 14. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not deferred_fog_entity.exists())
# 15. Look for errors and asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DepthOfFieldAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DepthOfFieldAdded.py
index e2c5f9c77d..3913420981 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DepthOfFieldAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DepthOfFieldAdded.py
@@ -107,7 +107,7 @@ def AtomEditorComponents_DepthOfField_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a DepthOfField entity with no components.
@@ -189,10 +189,12 @@ def AtomEditorComponents_DepthOfField_AddedToEntity():
# 15. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, depth_of_field_entity.exists())
# 16. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not depth_of_field_entity.exists())
# 17. Look for errors and asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DiffuseProbeGridAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DiffuseProbeGridAdded.py
index f42c091057..04b4f7876b 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DiffuseProbeGridAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DiffuseProbeGridAdded.py
@@ -90,7 +90,7 @@ def AtomEditorComponents_DiffuseProbeGrid_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a Diffuse Probe Grid entity with no components.
@@ -168,10 +168,12 @@ def AtomEditorComponents_DiffuseProbeGrid_AddedToEntity():
# 12. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, diffuse_probe_grid_entity.exists())
# 13. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not diffuse_probe_grid_entity.exists())
# 14. Look for errors or asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DirectionalLightAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DirectionalLightAdded.py
index f3ffc0f366..19cfbedcd5 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DirectionalLightAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DirectionalLightAdded.py
@@ -95,7 +95,7 @@ def AtomEditorComponents_DirectionalLight_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a Directional Light entity with no components.
@@ -168,10 +168,12 @@ def AtomEditorComponents_DirectionalLight_AddedToEntity():
# 12. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, directional_light_entity.exists())
# 13. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not directional_light_entity.exists())
# 14. Look for errors and asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DisplayMapperAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DisplayMapperAdded.py
index 558d69046e..d3ea669eab 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DisplayMapperAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_DisplayMapperAdded.py
@@ -91,7 +91,7 @@ def AtomEditorComponents_DisplayMapper_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a Display Mapper entity with no components.
@@ -166,10 +166,12 @@ def AtomEditorComponents_DisplayMapper_AddedToEntity():
# 11. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, display_mapper_entity.exists())
# 12. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not display_mapper_entity.exists())
# 13. Look for errors and asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_EntityReferenceAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_EntityReferenceAdded.py
index dddcca64fa..984774cd37 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_EntityReferenceAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_EntityReferenceAdded.py
@@ -9,37 +9,58 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
class Tests:
creation_undo = (
"UNDO Entity creation success",
- "UNDO Entity creation failed")
+ "P0: UNDO Entity creation failed")
creation_redo = (
"REDO Entity creation success",
- "REDO Entity creation failed")
+ "P0: REDO Entity creation failed")
entity_reference_creation = (
"Entity Reference Entity successfully created",
- "Entity Reference Entity failed to be created")
+ "P0: Entity Reference Entity failed to be created")
entity_reference_component = (
"Entity has an Entity Reference component",
- "Entity failed to find Entity Reference component")
+ "P0: Entity failed to find Entity Reference component")
enter_game_mode = (
"Entered game mode",
- "Failed to enter game mode")
+ "P0: Failed to enter game mode")
exit_game_mode = (
"Exited game mode",
- "Couldn't exit game mode")
+ "P0: Couldn't exit game mode")
is_visible = (
"Entity is visible",
- "Entity was not visible")
+ "P0: Entity was not visible")
is_hidden = (
"Entity is hidden",
- "Entity was not hidden")
+ "P0: Entity was not hidden")
entity_deleted = (
"Entity deleted",
- "Entity was not deleted")
+ "P0: Entity was not deleted")
deletion_undo = (
"UNDO deletion success",
- "UNDO deletion failed")
+ "P0: UNDO deletion failed")
deletion_redo = (
"REDO deletion success",
- "REDO deletion failed")
+ "P0: REDO deletion failed")
+ entity_id_references_is_container = (
+ "EntityIdReferences is a container property",
+ "P1: EntityIdReferences is NOT a container property")
+ container_append = (
+ "EntityIdReferences append succeeded",
+ "P1: EntityIdReferences append did not succeed")
+ container_add = (
+ "EntityIdReferences add succeeded",
+ "P1: EntityIdReferences add did not succeed")
+ container_update = (
+ "EntityIdReferences update succeeded",
+ "P1: EntityIdReferences update did not succeed")
+ container_remove = (
+ "EntityIdReferences remove succeeded",
+ "P1: EntityIdReferences remove did not succeed")
+ container_reset = (
+ "EntityIdReferences reset succeeded",
+ "P1: EntityIdReferences reset did not succeed")
+ entity_reference_component_removed = (
+ "Entity Reference component removed from entity",
+ "P1: Entity Reference component NOT removed from entity")
def AtomEditorComponents_EntityReference_AddedToEntity():
@@ -60,13 +81,21 @@ def AtomEditorComponents_EntityReference_AddedToEntity():
2) Add Entity Reference component to Entity Reference entity.
3) UNDO the entity creation and component addition.
4) REDO the entity creation and component addition.
- 5) Enter/Exit game mode.
- 6) Test IsHidden.
- 7) Test IsVisible.
- 8) Delete Entity Reference entity.
- 9) UNDO deletion.
- 10) REDO deletion.
- 11) Look for errors.
+ 5) 'EntityIdReferences' is a container property
+ 6) Append item to 'EntityIdReferences'
+ 7) Add item to 'EntityIdReferences'
+ 8) Update item in 'EntityIdReferences'
+ 9) Remove item from 'EntityIdReferences'
+ 10) Reset the container property then put one entity reference back for further tests
+ 11) Remove component
+ 12) UNDO component remove
+ 13) Enter/Exit game mode.
+ 14) Test IsHidden.
+ 15) Test IsVisible.
+ 16) Delete Entity Reference entity.
+ 17) UNDO deletion.
+ 18) REDO deletion.
+ 19) Look for errors.
:return: None
"""
@@ -81,7 +110,7 @@ def AtomEditorComponents_EntityReference_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create an Entity Reference entity with no components.
@@ -119,33 +148,107 @@ def AtomEditorComponents_EntityReference_AddedToEntity():
general.idle_wait_frames(1)
Report.result(Tests.creation_redo, entity_reference_entity.exists())
- # 5. Enter/Exit game mode.
+ # Entities for EntityIdReferences tests
+ test_1 = EditorEntity.create_editor_entity('test_1')
+ test_2 = EditorEntity.create_editor_entity('test_2')
+ test_3 = EditorEntity.create_editor_entity('test_3')
+
+ # 5. 'EntityIdReferences' is a container property
+ Report.result(
+ Tests.entity_id_references_is_container,
+ entity_reference_component.is_property_container(
+ AtomComponentProperties.entity_reference('EntityIdReferences')))
+
+ # 6. Append item to 'EntityIdReferences'
+ entity_reference_component.append_container_item(
+ AtomComponentProperties.entity_reference('EntityIdReferences'), test_1.id)
+ Report.result(
+ Tests.container_append,
+ entity_reference_component.get_container_item(
+ AtomComponentProperties.entity_reference('EntityIdReferences'), 0) == test_1.id)
+
+ # 7. Add item to 'EntityIdReferences'
+ entity_reference_component.add_container_item(
+ AtomComponentProperties.entity_reference('EntityIdReferences'), 1, test_1.id)
+ Report.result(
+ Tests.container_add,
+ entity_reference_component.get_container_count(
+ AtomComponentProperties.entity_reference('EntityIdReferences')) == 2)
+
+ # 8. Update item in 'EntityIdReferences'
+ entity_reference_component.update_container_item(
+ AtomComponentProperties.entity_reference('EntityIdReferences'), 1, test_2.id)
+ Report.result(
+ Tests.container_update,
+ entity_reference_component.get_container_item(
+ AtomComponentProperties.entity_reference('EntityIdReferences'), 1) == test_2.id)
+
+ # 9. Remove item from 'EntityIdReferences'
+ entity_reference_component.append_container_item(
+ AtomComponentProperties.entity_reference('EntityIdReferences'), test_3.id)
+ count_before = entity_reference_component.get_container_count(
+ AtomComponentProperties.entity_reference('EntityIdReferences'))
+ entity_reference_component.remove_container_item(
+ AtomComponentProperties.entity_reference('EntityIdReferences'), 1)
+ count_after = entity_reference_component.get_container_count(
+ AtomComponentProperties.entity_reference('EntityIdReferences'))
+ Report.result(
+ Tests.container_remove,
+ ((count_before == 3) and (count_after == 2) and
+ (entity_reference_component.get_container_item(
+ AtomComponentProperties.entity_reference('EntityIdReferences'), 1) == test_3.id)))
+
+ # 10. Reset the container property then put one entity reference back for further tests
+ entity_reference_component.reset_container(AtomComponentProperties.entity_reference('EntityIdReferences'))
+ general.idle_wait_frames(1)
+ Report.result(
+ Tests.container_reset,
+ entity_reference_component.get_container_count(
+ AtomComponentProperties.entity_reference('EntityIdReferences')) == 0)
+ entity_reference_component.append_container_item(
+ AtomComponentProperties.entity_reference('EntityIdReferences'), test_1.id)
+
+ # 11. Remove component
+ entity_reference_entity.remove_component(AtomComponentProperties.entity_reference())
+ general.idle_wait_frames(1)
+ Report.result(Tests.entity_reference_component_removed, not entity_reference_entity.has_component(
+ AtomComponentProperties.entity_reference()))
+
+ # 12. UNDO component remove
+ general.undo()
+ general.idle_wait_frames(1)
+ Report.result(Tests.entity_reference_component, entity_reference_entity.has_component(
+ AtomComponentProperties.entity_reference()))
+
+ # 13. Enter/Exit game mode.
TestHelper.enter_game_mode(Tests.enter_game_mode)
general.idle_wait_frames(1)
TestHelper.exit_game_mode(Tests.exit_game_mode)
- # 6. Test IsHidden.
+ # 14. Test IsHidden.
entity_reference_entity.set_visibility_state(False)
Report.result(Tests.is_hidden, entity_reference_entity.is_hidden() is True)
- # 7. Test IsVisible.
+ # 15. Test IsVisible.
entity_reference_entity.set_visibility_state(True)
general.idle_wait_frames(1)
Report.result(Tests.is_visible, entity_reference_entity.is_visible() is True)
- # 8. Delete Entity Reference entity.
+ # 16. Delete Entity Reference entity.
entity_reference_entity.delete()
Report.result(Tests.entity_deleted, not entity_reference_entity.exists())
- # 9. UNDO deletion.
+ # 17. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, entity_reference_entity.exists())
- # 10. REDO deletion.
+ # 18. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not entity_reference_entity.exists())
- # 11. Look for errors and asserts.
+ # 19. Look for errors and asserts.
TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0)
for error_info in error_tracer.errors:
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_ExposureControlAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_ExposureControlAdded.py
index 6fa9660539..f60f0e18be 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_ExposureControlAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_ExposureControlAdded.py
@@ -101,7 +101,7 @@ def AtomEditorComponents_ExposureControl_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Creation of Exposure Control entity with no components.
@@ -169,10 +169,12 @@ def AtomEditorComponents_ExposureControl_AddedToEntity():
# 12. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, exposure_control_entity.exists())
# 13. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not exposure_control_entity.exists())
# 14. Look for errors and asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_GlobalSkylightIBLAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_GlobalSkylightIBLAdded.py
index 7f0c38e289..0e8e6fa43e 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_GlobalSkylightIBLAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_GlobalSkylightIBLAdded.py
@@ -99,7 +99,7 @@ def AtomEditorComponents_GlobalSkylightIBL_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a Global Skylight (IBL) entity with no components.
@@ -176,10 +176,12 @@ def AtomEditorComponents_GlobalSkylightIBL_AddedToEntity():
# 11. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, global_skylight_entity.exists())
# 12. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not global_skylight_entity.exists())
# 13. Look for errors and asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_GridAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_GridAdded.py
index a77a1f50a4..3c6d261f22 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_GridAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_GridAdded.py
@@ -82,7 +82,7 @@ def AtomEditorComponents_Grid_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a Grid entity with no components.
@@ -139,10 +139,12 @@ def AtomEditorComponents_Grid_AddedToEntity():
# 9. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, grid_entity.exists())
# 10. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not grid_entity.exists())
# 11. Look for errors or asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_HDRColorGradingAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_HDRColorGradingAdded.py
index 4972079fcd..5846206e50 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_HDRColorGradingAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_HDRColorGradingAdded.py
@@ -96,7 +96,7 @@ def AtomEditorComponents_HDRColorGrading_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create an HDR Color Grading entity with no components.
@@ -173,10 +173,12 @@ def AtomEditorComponents_HDRColorGrading_AddedToEntity():
# 13. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, hdr_color_grading_entity.exists())
# 14. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not hdr_color_grading_entity.exists())
# 15. Look for errors and asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_HDRiSkyboxAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_HDRiSkyboxAdded.py
index 0f96bc5424..fc093b60db 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_HDRiSkyboxAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_HDRiSkyboxAdded.py
@@ -87,7 +87,7 @@ def AtomEditorComponents_HDRiSkybox_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create an HDRi Skybox with no components.
@@ -158,10 +158,12 @@ def AtomEditorComponents_HDRiSkybox_AddedToEntity():
# 10. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, hdri_skybox_entity.exists())
# 11. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not hdri_skybox_entity.exists())
# 12. Look for errors or asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_LightAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_LightAdded.py
index 249671556d..75a04612a3 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_LightAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_LightAdded.py
@@ -89,7 +89,7 @@ def AtomEditorComponents_Light_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a Light entity with no components.
@@ -144,10 +144,12 @@ def AtomEditorComponents_Light_AddedToEntity():
# 9. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, light_entity.exists())
# 10. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not light_entity.exists())
# 11. Look for errors asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_LookModificationAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_LookModificationAdded.py
index afb8033426..149af73151 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_LookModificationAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_LookModificationAdded.py
@@ -104,7 +104,7 @@ def AtomEditorComponents_LookModification_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create an Look Modification entity with no components.
@@ -192,10 +192,12 @@ def AtomEditorComponents_LookModification_AddedToEntity():
# 14. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, look_modification_entity.exists())
# 15. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not look_modification_entity.exists())
# 16. Look for errors and asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_MaterialAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_MaterialAdded.py
index c613bb23e7..919a6753f4 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_MaterialAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_MaterialAdded.py
@@ -102,7 +102,7 @@ def AtomEditorComponents_Material_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a Material entity with no components.
@@ -184,10 +184,12 @@ def AtomEditorComponents_Material_AddedToEntity():
# 16. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, material_entity.exists())
# 17. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not material_entity.exists())
# 18. Look for errors or asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_MeshAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_MeshAdded.py
index 9d56753961..a87ee75b53 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_MeshAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_MeshAdded.py
@@ -87,7 +87,7 @@ def AtomEditorComponents_Mesh_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a Mesh entity with no components.
@@ -151,10 +151,12 @@ def AtomEditorComponents_Mesh_AddedToEntity():
# 10. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, mesh_entity.exists())
# 11. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not mesh_entity.exists())
# 12. Look for errors or asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_OcclusionCullingPlaneAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_OcclusionCullingPlaneAdded.py
index 4226ae3dfe..56bb5eb68c 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_OcclusionCullingPlaneAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_OcclusionCullingPlaneAdded.py
@@ -80,7 +80,7 @@ def AtomEditorComponents_OcclusionCullingPlane_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a occlusion culling plane entity with no components.
@@ -140,10 +140,12 @@ def AtomEditorComponents_OcclusionCullingPlane_AddedToEntity():
# 9. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, occlusion_culling_plane_entity.exists())
# 10. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not occlusion_culling_plane_entity.exists())
# 11. Look for errors or asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PhysicalSkyAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PhysicalSkyAdded.py
index fa8c626016..e0c558811e 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PhysicalSkyAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PhysicalSkyAdded.py
@@ -89,7 +89,7 @@ def AtomEditorComponents_PhysicalSky_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a Physical Sky entity with no components.
@@ -146,10 +146,12 @@ def AtomEditorComponents_PhysicalSky_AddedToEntity():
# 9. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, physical_sky_entity.exists())
# 10. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not physical_sky_entity.exists())
# 11. Look for errors and asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PostFXGradientWeightModifierAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PostFXGradientWeightModifierAdded.py
index 6e4ae2d9ac..b36267433f 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PostFXGradientWeightModifierAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PostFXGradientWeightModifierAdded.py
@@ -92,7 +92,7 @@ def AtomEditorComponents_PostFXGradientWeightModifier_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a PostFX Gradient Weight Modifier entity with no components.
@@ -162,10 +162,12 @@ def AtomEditorComponents_PostFXGradientWeightModifier_AddedToEntity():
# 12. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, postfx_gradient_weight_entity.exists())
# 13. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not postfx_gradient_weight_entity.exists())
# 14. Look for errors or asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PostFXLayerAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PostFXLayerAdded.py
index efef4c0a43..07fffb9bde 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PostFXLayerAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PostFXLayerAdded.py
@@ -80,7 +80,7 @@ def AtomEditorComponents_postfx_layer_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a PostFX Layer entity with no components.
@@ -137,10 +137,12 @@ def AtomEditorComponents_postfx_layer_AddedToEntity():
# 9. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, postfx_layer_entity.exists())
# 10. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not postfx_layer_entity.exists())
# 11. Look for errors or asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PostFXRadiusWeightModifierAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PostFXRadiusWeightModifierAdded.py
index 228ddfcdc5..616233d2d2 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PostFXRadiusWeightModifierAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PostFXRadiusWeightModifierAdded.py
@@ -92,7 +92,7 @@ def AtomEditorComponents_PostFXRadiusWeightModifier_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a Post FX Radius Weight Modifier entity with no components.
@@ -161,10 +161,12 @@ def AtomEditorComponents_PostFXRadiusWeightModifier_AddedToEntity():
# 12. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, postfx_radius_weight_entity.exists())
# 13. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not postfx_radius_weight_entity.exists())
# 14. Look for errors and asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PostFxShapeWeightModifierAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PostFxShapeWeightModifierAdded.py
index 0a37ac6bf7..5f7d571a18 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PostFxShapeWeightModifierAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_PostFxShapeWeightModifierAdded.py
@@ -98,7 +98,7 @@ def AtomEditorComponents_postfx_shape_weight_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a PostFx Shape Weight Modifier entity with no components.
@@ -188,10 +188,12 @@ def AtomEditorComponents_postfx_shape_weight_AddedToEntity():
# 15. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, postfx_shape_weight_entity.exists())
# 16. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not postfx_shape_weight_entity.exists())
# 17. Look for errors or asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_ReflectionProbeAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_ReflectionProbeAdded.py
index 70adf9143a..85156b4db6 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_ReflectionProbeAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_ReflectionProbeAdded.py
@@ -97,7 +97,7 @@ def AtomEditorComponents_ReflectionProbe_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a Reflection Probe entity with no components.
@@ -183,10 +183,12 @@ def AtomEditorComponents_ReflectionProbe_AddedToEntity():
# 13. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, reflection_probe_entity.exists())
# 14. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not reflection_probe_entity.exists())
# 15. Look for errors or asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_SSAOAdded.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_SSAOAdded.py
index 15f40f8b70..09f77c4a9f 100644
--- a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_SSAOAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_AtomEditorComponents_SSAOAdded.py
@@ -94,7 +94,7 @@ def AtomEditorComponents_SSAO_AddedToEntity():
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
- TestHelper.open_level("", "Base")
+ TestHelper.open_level("Graphics", "base_empty")
# Test steps begin.
# 1. Create a SSAO entity with no components.
@@ -163,10 +163,12 @@ def AtomEditorComponents_SSAO_AddedToEntity():
# 12. UNDO deletion.
general.undo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, ssao_entity.exists())
# 13. REDO deletion.
general.redo()
+ general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not ssao_entity.exists())
# 14. Look for errors and asserts.
diff --git a/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_Atom_LevelLoadTest.py b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_Atom_LevelLoadTest.py
new file mode 100644
index 0000000000..1efcbe4d01
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/Atom/tests/hydra_Atom_LevelLoadTest.py
@@ -0,0 +1,72 @@
+"""
+Copyright (c) Contributors to the Open 3D Engine Project.
+For complete copyright and license terms please see the LICENSE at the root of this distribution.
+
+SPDX-License-Identifier: Apache-2.0 OR MIT
+"""
+
+
+def Atom_LevelLoadTest():
+ """
+ Summary:
+ Loads all graphics levels within the AutomatedTesting project in editor. For each level this script will verify that
+ the level loads, and can enter/exit gameplay without crashing the editor.
+
+ Test setup:
+ - Store all available levels in a list.
+ - Set up a for loop to run all checks for each level.
+
+ Expected Behavior:
+ Test verifies that each level loads, enters/exits game mode, and reports success for all test actions.
+
+ Test Steps for each level:
+ 1) Create tuple with level load success and failure messages
+ 2) Open the level using the python test tools command
+ 3) Verify level is loaded using a separate command, and report success/failure
+ 4) Enter gameplay and report result using a tuple
+ 5) Exit Gameplay and report result using a tuple
+ 6) Look for errors or asserts.
+
+ :return: None
+ """
+
+ import azlmbr.legacy.general as general
+
+ from editor_python_test_tools.utils import Report, Tracer, TestHelper
+ from Atom.atom_utils.atom_constants import LEVEL_LIST
+
+ with Tracer() as error_tracer:
+
+ for level in LEVEL_LIST:
+
+ # 1. Create tuple with level load success and failure messages
+ level_check_tuple = (f"loaded {level}", f"failed to load {level}")
+
+ # 2. Open the level using the python test tools command
+ TestHelper.init_idle()
+ TestHelper.open_level("Graphics", level)
+
+ # 3. Verify level is loaded using a separate command, and report success/failure
+ Report.result(level_check_tuple, level == general.get_current_level_name())
+
+ # 4. Enter gameplay and report result using a tuple
+ enter_game_mode_tuple = (f"{level} entered gameplay successfully ", f"{level} failed to enter gameplay")
+ TestHelper.enter_game_mode(enter_game_mode_tuple)
+ general.idle_wait_frames(1)
+
+ # 5. Exit gameplay and report result using a tuple
+ exit_game_mode_tuple = (f"{level} exited gameplay successfully ", f"{level} failed to exit gameplay")
+ TestHelper.exit_game_mode(exit_game_mode_tuple)
+
+
+ # 6. Look for errors or asserts.
+ TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0)
+ for error_info in error_tracer.errors:
+ Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")
+ for assert_info in error_tracer.asserts:
+ Report.info(f"Assert: {assert_info.filename} {assert_info.function} | {assert_info.message}")
+
+
+if __name__ == "__main__":
+ from editor_python_test_tools.utils import Report
+ Report.start_test(Atom_LevelLoadTest)
diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_entity_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_entity_utils.py
index c3398406ab..d8d4a77a65 100644
--- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_entity_utils.py
+++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_entity_utils.py
@@ -473,12 +473,11 @@ class EditorEntity:
:param component_names: List of component names to remove
:return: None
"""
- type_ids = EditorComponent.get_type_ids(component_names, EditorEntityType.GAME)
- for type_id in type_ids:
- remove_outcome = editor.EditorComponentAPIBus(bus.Broadcast, "RemoveComponents", self.id, [type_id])
- assert (
- remove_outcome.IsSuccess()
- ), f"Failure: could not remove component from '{self.get_name()}'"
+ component_ids = [component.id for component in self.get_components_of_type(component_names)]
+ remove_success = editor.EditorComponentAPIBus(bus.Broadcast, "RemoveComponents", component_ids)
+ assert (
+ remove_success
+ ), f"Failure: could not remove component from entity '{self.get_name()}'"
def get_components_of_type(self, component_names: list) -> List[EditorComponent]:
"""
diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_editor_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_editor_utils.py
index 36fc6003f7..ac74c611a2 100644
--- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_editor_utils.py
+++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_editor_utils.py
@@ -5,9 +5,9 @@ For complete copyright and license terms please see the LICENSE at the root of t
SPDX-License-Identifier: Apache-2.0 OR MIT
"""
+import collections.abc
from typing import List
from math import isclose
-import collections.abc
import azlmbr.bus as bus
import azlmbr.editor as editor
diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/prefab_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/prefab_utils.py
index 016e01bc95..d0e51c4413 100644
--- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/prefab_utils.py
+++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/prefab_utils.py
@@ -48,8 +48,8 @@ def wait_for_propagation():
# This is a helper class which contains some of the useful information about a prefab instance.
class PrefabInstance:
- def __init__(self, prefab_file_name: str = None, container_entity: EditorEntity = None):
- self.prefab_file_name: str = prefab_file_name
+ def __init__(self, prefab_file_path: str = None, container_entity: EditorEntity = None):
+ self.prefab_file_path: str = prefab_file_path
self.container_entity: EditorEntity = container_entity
def __eq__(self, other):
@@ -66,7 +66,7 @@ class PrefabInstance:
See if this instance is valid to be used with other prefab operations.
:return: Whether the target instance is valid or not.
"""
- return self.container_entity.id.IsValid() and self.prefab_file_name in Prefab.existing_prefabs
+ return self.container_entity.id.IsValid() and self.prefab_file_path in Prefab.existing_prefabs
def has_editor_prefab_component(self) -> bool:
"""
@@ -131,7 +131,7 @@ class PrefabInstance:
has_correct_parent = reparented_container_entity_parent_id.ToString() == parent_entity_id.ToString()
assert has_correct_parent, "Prefab Instance reparented is *not* under the expected parent entity"
- current_instance_prefab = Prefab.get_prefab(self.prefab_file_name)
+ current_instance_prefab = Prefab.get_prefab(self.prefab_file_path)
current_instance_prefab.instances.remove(self)
self.container_entity = reparented_container_entity
@@ -161,46 +161,48 @@ class Prefab:
:param file_path: A unique file path of the target prefab.
:return: Whether the target prefab is loaded or not.
"""
- return file_path in Prefab.existing_prefabs
-
+ for entry in Prefab.existing_prefabs:
+ Report.info(f"PrefabPath: '{entry}'")
+
+ return get_prefab_file_path(file_path) in Prefab.existing_prefabs
@classmethod
def prefab_exists(cls, file_path: str) -> bool:
"""
Check if a prefab exists in the directory for files of prefab tests.
- :param file_name: A unique file name of the target prefab.
+ :param file_path: A unique file path of the target prefab.
:return: Whether the target prefab exists or not.
"""
return path.exists(get_prefab_file_path(file_path))
@classmethod
- def get_prefab(cls, file_name: str) -> Prefab:
+ def get_prefab(cls, file_path: str) -> Prefab:
"""
Return a prefab which can be used immediately.
- :param file_name: A unique file name of the target prefab.
+ :param file_path: A unique file path of the target prefab.
:return: The prefab with given file name.
"""
- assert file_name, "Received an empty file_name"
- if Prefab.is_prefab_loaded(file_name):
- return Prefab.existing_prefabs[file_name]
+ assert file_path, "Received an empty file_path"
+ if Prefab.is_prefab_loaded(file_path):
+ return Prefab.existing_prefabs[get_prefab_file_path(file_path)]
else:
- assert Prefab.prefab_exists(file_name), f"Attempted to get a prefab \"{file_name}\" that doesn't exist"
- new_prefab = Prefab(file_name)
- Prefab.existing_prefabs[file_name] = Prefab(file_name)
+ assert Prefab.prefab_exists(file_path), f"Attempted to get a prefab \"{file_path}\" that doesn't exist"
+ new_prefab = Prefab(file_path)
+ Prefab.existing_prefabs[new_prefab.file_path] = new_prefab
return new_prefab
@classmethod
- def create_prefab(cls, entities: list[EditorEntity], file_name: str, prefab_instance_name: str=None) -> tuple(Prefab, PrefabInstance):
+ def create_prefab(cls, entities: list[EditorEntity], file_path: str, prefab_instance_name: str=None) -> tuple(Prefab, PrefabInstance):
"""
Create a prefab in memory and return it. The very first instance of this prefab will also be created.
:param entities: The entities that should form the new prefab (along with their descendants).
- :param file_name: A unique file name of new prefab.
- :param prefab_instance_name: A name for the very first instance generated while prefab creation. The default instance name is the same as file_name.
+ :param file_path: A unique file path for new prefab.
+ :param prefab_instance_name: A name for the very first instance generated while prefab creation. The default instance name is the same as the file name in file_path.
:return: Created Prefab object and the very first PrefabInstance object owned by the prefab.
"""
- assert not Prefab.is_prefab_loaded(file_name), f"Can't create Prefab '{file_name}' since the prefab already exists"
+ assert not Prefab.is_prefab_loaded(file_path), f"Can't create Prefab '{file_path}' since the prefab already exists"
- new_prefab = Prefab(file_name)
+ new_prefab = Prefab(file_path)
entity_ids = [entity.id for entity in entities]
create_prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'CreatePrefabInMemory', entity_ids, new_prefab.file_path)
assert create_prefab_result.IsSuccess(), f"Prefab operation 'CreatePrefab' failed. Error: {create_prefab_result.GetError()}"
@@ -210,15 +212,14 @@ class Prefab:
children_entity_ids = container_entity.get_children_ids()
assert len(children_entity_ids) == len(entities), f"Entity count of created prefab instance does *not* match the count of given entities."
-
- if prefab_instance_name:
- container_entity.set_name(prefab_instance_name)
-
+
wait_for_propagation()
- new_prefab_instance = PrefabInstance(file_name, EditorEntity(container_entity_id))
+ new_prefab_instance = PrefabInstance(new_prefab.file_path, EditorEntity(container_entity_id))
+ if prefab_instance_name:
+ new_prefab_instance.container_entity.set_name(prefab_instance_name)
new_prefab.instances.add(new_prefab_instance)
- Prefab.existing_prefabs[file_name] = new_prefab
+ Prefab.existing_prefabs[new_prefab.file_path] = new_prefab
return new_prefab, new_prefab_instance
@classmethod
@@ -250,7 +251,7 @@ class Prefab:
assert False, "Not all entities and descendants in target prefabs are deleted."
for instance in prefab_instances:
- instance_deleted_prefab = Prefab.get_prefab(instance.prefab_file_name)
+ instance_deleted_prefab = Prefab.get_prefab(instance.prefab_file_path)
instance_deleted_prefab.instances.remove(instance)
instance = PrefabInstance()
@@ -290,8 +291,7 @@ class Prefab:
prefab_file_path = prefab.PrefabPublicRequestBus(bus.Broadcast, 'GetOwningInstancePrefabPath', duplicate_container_entity_id)
assert prefab_file_path, "Returned file path should *not* be empty."
- prefab_file_name = Path(prefab_file_path).stem
- duplicate_instance_prefab = Prefab.get_prefab(prefab_file_name)
+ duplicate_instance_prefab = Prefab.get_prefab(prefab_file_path)
duplicate_instance = PrefabInstance(prefab_file_path, EditorEntity(duplicate_container_entity_id))
duplicate_instance_prefab.instances.add(duplicate_instance)
duplicate_instances.append(duplicate_instance)
@@ -324,7 +324,7 @@ class Prefab:
wait_for_propagation()
- instance_owner_prefab = Prefab.get_prefab(prefab_instance.prefab_file_name)
+ instance_owner_prefab = Prefab.get_prefab(prefab_instance.prefab_file_path)
instance_owner_prefab.instances.remove(prefab_instance)
prefab_instance = PrefabInstance()
@@ -346,13 +346,13 @@ class Prefab:
container_entity_id = instantiate_prefab_result.GetValue()
container_entity = EditorEntity(container_entity_id)
- if name:
- container_entity.set_name(name)
-
wait_for_propagation()
new_prefab_instance = PrefabInstance(self.file_path, EditorEntity(container_entity_id))
- assert not new_prefab_instance in self.instances, "This prefab instance is already existed before this instantiation."
+ assert not new_prefab_instance in self.instances, "This prefab instance already existed before this instantiation."
+ if name:
+ new_prefab_instance.container_entity.set_name(name)
+
self.instances.add(new_prefab_instance)
assert new_prefab_instance.is_at_position(prefab_position), "This prefab instance is *not* at expected position."
diff --git a/AutomatedTesting/Gem/PythonTests/Multiplayer/TestSuite_Sandbox.py b/AutomatedTesting/Gem/PythonTests/Multiplayer/TestSuite_Sandbox.py
index 20198be597..2b43b8c931 100644
--- a/AutomatedTesting/Gem/PythonTests/Multiplayer/TestSuite_Sandbox.py
+++ b/AutomatedTesting/Gem/PythonTests/Multiplayer/TestSuite_Sandbox.py
@@ -38,4 +38,8 @@ class TestAutomation(TestAutomationBase):
def test_Multiplayer_BasicConnectivity_Connects(self, request, workspace, editor, launcher_platform):
from .tests import Multiplayer_BasicConnectivity_Connects as test_module
- self._run_prefab_test(request, workspace, editor, test_module)
\ No newline at end of file
+ self._run_prefab_test(request, workspace, editor, test_module)
+
+ def test_Multiplayer_SimpleNetworkLevelEntity(self, request, workspace, editor, launcher_platform):
+ from .tests import Multiplayer_SimpleNetworkLevelEntity as test_module
+ self._run_prefab_test(request, workspace, editor, test_module)
diff --git a/AutomatedTesting/Gem/PythonTests/Multiplayer/tests/Multiplayer_SimpleNetworkLevelEntity.py b/AutomatedTesting/Gem/PythonTests/Multiplayer/tests/Multiplayer_SimpleNetworkLevelEntity.py
new file mode 100644
index 0000000000..0d1067269c
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/Multiplayer/tests/Multiplayer_SimpleNetworkLevelEntity.py
@@ -0,0 +1,76 @@
+"""
+Copyright (c) Contributors to the Open 3D Engine Project.
+For complete copyright and license terms please see the LICENSE at the root of this distribution.
+
+SPDX-License-Identifier: Apache-2.0 OR MIT
+"""
+
+
+# Test Case Title : Check that level entities with network bindings are properly replicated.
+# Note: This test should be ran on a fresh editor run; some bugs with spawnables occur only on the first editor play-mode.
+
+
+# fmt: off
+class TestSuccessFailTuples():
+ enter_game_mode = ("Entered game mode", "Failed to enter game mode")
+ exit_game_mode = ("Exited game mode", "Couldn't exit game mode")
+ find_network_player = ("Found network player", "Couldn't find network player")
+# fmt: on
+
+
+def Multiplayer_SimpleNetworkLevelEntity():
+ r"""
+ Summary:
+ Test to make sure that network entities in a level function and are replicated to clients as expected
+
+ Level Description:
+ - Static
+ 1. NetLevelEntity. This is a networked entity which has a script attached which prints logs to ensure it's replicated.
+
+
+ Expected Outcome:
+ We should see logs stating that the net-sync'd level entity exists on both server and client.
+
+ :return:
+ """
+ import azlmbr.legacy.general as general
+ from editor_python_test_tools.utils import Report
+ from editor_python_test_tools.utils import Tracer
+
+ from editor_python_test_tools.utils import TestHelper as helper
+ from ly_remote_console.remote_console_commands import RemoteConsole as RemoteConsole
+
+ level_name = "SimpleNetworkLevelEntity"
+ player_prefab_name = "Player"
+ player_prefab_path = f"levels/multiplayer/{level_name}/{player_prefab_name}.network.spawnable"
+
+ helper.init_idle()
+
+ # 1) Open Level
+ helper.open_level("Multiplayer", level_name)
+
+ with Tracer() as section_tracer:
+ # 2) Enter game mode
+ helper.multiplayer_enter_game_mode(TestSuccessFailTuples.enter_game_mode, player_prefab_path.lower())
+
+ # 3) Make sure the network player was spawned
+ player_id = general.find_game_entity(player_prefab_name)
+ Report.critical_result(TestSuccessFailTuples.find_network_player, player_id.IsValid())
+
+ # 4) Check the editor logs for network spawnable errors
+ ATTEMPTING_INVALID_NETSPAWN_WAIT_TIME_SECONDS = 0.0 # The editor will try to net-spawn its networked level entity before it's even a client. Make sure this didn't happen.
+ helper.fail_if_log_line_found('NetworkEntityManager', "RequestNetSpawnableInstantiation: Requested spawnable Root.network.spawnable doesn't exist in the NetworkSpawnableLibrary. Please make sure it is a network spawnable", section_tracer.errors, ATTEMPTING_INVALID_NETSPAWN_WAIT_TIME_SECONDS)
+
+ # 5) Ensure the script graph attached to the level entity is running on the server
+ SCRIPTGRAPH_ENABLED_WAIT_TIME_SECONDS = 0.25
+ helper.succeed_if_log_line_found('EditorServer', "Script: SimpleNetworkLevelEntity: On Graph Start", section_tracer.prints, SCRIPTGRAPH_ENABLED_WAIT_TIME_SECONDS)
+
+
+ # Exit game mode
+ helper.exit_game_mode(TestSuccessFailTuples.exit_game_mode)
+
+
+
+if __name__ == "__main__":
+ from editor_python_test_tools.utils import Report
+ Report.start_test(Multiplayer_SimpleNetworkLevelEntity)
diff --git a/AutomatedTesting/Gem/PythonTests/Prefab/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/Prefab/TestSuite_Main.py
index 6e1f94d358..1fd48ee3c9 100644
--- a/AutomatedTesting/Gem/PythonTests/Prefab/TestSuite_Main.py
+++ b/AutomatedTesting/Gem/PythonTests/Prefab/TestSuite_Main.py
@@ -38,6 +38,10 @@ class TestAutomation(TestAutomationBase):
from Prefab.tests.instantiate_prefab import InstantiatePrefab_ContainingASingleEntity as test_module
self._run_prefab_test(request, workspace, editor, test_module)
+ def test_InstantiatePrefab_FromCreatedPrefabWithSingleEntity(self, request, workspace, editor, launcher_platform):
+ from Prefab.tests.instantiate_prefab import InstantiatePrefab_FromCreatedPrefabWithSingleEntity as test_module
+ self._run_prefab_test(request, workspace, editor, test_module)
+
def test_DeletePrefab_ContainingASingleEntity(self, request, workspace, editor, launcher_platform):
from Prefab.tests.delete_prefab import DeletePrefab_ContainingASingleEntity as test_module
self._run_prefab_test(request, workspace, editor, test_module)
diff --git a/AutomatedTesting/Gem/PythonTests/Prefab/TestSuite_Main_Optimized.py b/AutomatedTesting/Gem/PythonTests/Prefab/TestSuite_Main_Optimized.py
index bf67b2c661..816b3b8e75 100644
--- a/AutomatedTesting/Gem/PythonTests/Prefab/TestSuite_Main_Optimized.py
+++ b/AutomatedTesting/Gem/PythonTests/Prefab/TestSuite_Main_Optimized.py
@@ -45,8 +45,12 @@ class TestAutomationNoAutoTestMode(EditorTestSuite):
class test_InstantiatePrefab_ContainingASingleEntity(EditorSharedTest):
from .tests.instantiate_prefab import InstantiatePrefab_ContainingASingleEntity as test_module
+ class test_InstantiatePrefab_FromCreatedPrefabWithSingleEntity(EditorSharedTest):
+ from .tests.instantiate_prefab import InstantiatePrefab_FromCreatedPrefabWithSingleEntity as test_module
+
class test_DeletePrefab_ContainingASingleEntity(EditorSharedTest):
from .tests.delete_prefab import DeletePrefab_ContainingASingleEntity as test_module
class test_DuplicatePrefab_ContainingASingleEntity(EditorSharedTest):
- from .tests.duplicate_prefab import DuplicatePrefab_ContainingASingleEntity as test_module
\ No newline at end of file
+ from .tests.duplicate_prefab import DuplicatePrefab_ContainingASingleEntity as test_module
+
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/Prefab/tests/create_prefab/CreatePrefab_UnderAnEntity.py b/AutomatedTesting/Gem/PythonTests/Prefab/tests/create_prefab/CreatePrefab_UnderAnEntity.py
index 5033c1da9c..4fdd5e4c4d 100644
--- a/AutomatedTesting/Gem/PythonTests/Prefab/tests/create_prefab/CreatePrefab_UnderAnEntity.py
+++ b/AutomatedTesting/Gem/PythonTests/Prefab/tests/create_prefab/CreatePrefab_UnderAnEntity.py
@@ -13,7 +13,8 @@ def CreatePrefab_UnderAnEntity():
Test is successful if the new instanced prefab of the child has the parent entity id
"""
- CAR_PREFAB_FILE_NAME = 'car_prefab'
+ from pathlib import Path
+ CAR_PREFAB_FILE_NAME = Path(__file__).stem + 'car_prefab'
from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.prefab_utils import Prefab
diff --git a/AutomatedTesting/Gem/PythonTests/Prefab/tests/create_prefab/CreatePrefab_WithSingleEntity.py b/AutomatedTesting/Gem/PythonTests/Prefab/tests/create_prefab/CreatePrefab_WithSingleEntity.py
index eb8a262a69..cd6d87a630 100644
--- a/AutomatedTesting/Gem/PythonTests/Prefab/tests/create_prefab/CreatePrefab_WithSingleEntity.py
+++ b/AutomatedTesting/Gem/PythonTests/Prefab/tests/create_prefab/CreatePrefab_WithSingleEntity.py
@@ -7,7 +7,8 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
def CreatePrefab_WithSingleEntity():
- CAR_PREFAB_FILE_NAME = 'car_prefab'
+ from pathlib import Path
+ CAR_PREFAB_FILE_NAME = Path(__file__).stem + 'car_prefab'
from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.utils import Report
diff --git a/AutomatedTesting/Gem/PythonTests/Prefab/tests/delete_prefab/DeletePrefab_ContainingASingleEntity.py b/AutomatedTesting/Gem/PythonTests/Prefab/tests/delete_prefab/DeletePrefab_ContainingASingleEntity.py
index 919168019e..e2c4ead034 100644
--- a/AutomatedTesting/Gem/PythonTests/Prefab/tests/delete_prefab/DeletePrefab_ContainingASingleEntity.py
+++ b/AutomatedTesting/Gem/PythonTests/Prefab/tests/delete_prefab/DeletePrefab_ContainingASingleEntity.py
@@ -7,7 +7,8 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
def DeletePrefab_ContainingASingleEntity():
- CAR_PREFAB_FILE_NAME = 'car_prefab'
+ from pathlib import Path
+ CAR_PREFAB_FILE_NAME = Path(__file__).stem + 'car_prefab'
from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.prefab_utils import Prefab
diff --git a/AutomatedTesting/Gem/PythonTests/Prefab/tests/detach_prefab/DetachPrefab_UnderAnotherPrefab.py b/AutomatedTesting/Gem/PythonTests/Prefab/tests/detach_prefab/DetachPrefab_UnderAnotherPrefab.py
index 69dbcfc89c..326d58023f 100644
--- a/AutomatedTesting/Gem/PythonTests/Prefab/tests/detach_prefab/DetachPrefab_UnderAnotherPrefab.py
+++ b/AutomatedTesting/Gem/PythonTests/Prefab/tests/detach_prefab/DetachPrefab_UnderAnotherPrefab.py
@@ -7,8 +7,9 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
def DetachPrefab_UnderAnotherPrefab():
- CAR_PREFAB_FILE_NAME = 'car_prefab2'
- WHEEL_PREFAB_FILE_NAME = 'wheel_prefab2'
+ from pathlib import Path
+ CAR_PREFAB_FILE_NAME = Path(__file__).stem + 'car_prefab'
+ WHEEL_PREFAB_FILE_NAME = Path(__file__).stem + 'wheel_prefab'
import editor_python_test_tools.pyside_utils as pyside_utils
diff --git a/AutomatedTesting/Gem/PythonTests/Prefab/tests/duplicate_prefab/DuplicatePrefab_ContainingASingleEntity.py b/AutomatedTesting/Gem/PythonTests/Prefab/tests/duplicate_prefab/DuplicatePrefab_ContainingASingleEntity.py
index e611303fbb..6acd303e2b 100644
--- a/AutomatedTesting/Gem/PythonTests/Prefab/tests/duplicate_prefab/DuplicatePrefab_ContainingASingleEntity.py
+++ b/AutomatedTesting/Gem/PythonTests/Prefab/tests/duplicate_prefab/DuplicatePrefab_ContainingASingleEntity.py
@@ -7,7 +7,8 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
def DuplicatePrefab_ContainingASingleEntity():
- CAR_PREFAB_FILE_NAME = 'car_prefab'
+ from pathlib import Path
+ CAR_PREFAB_FILE_NAME = Path(__file__).stem + 'car_prefab'
from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.prefab_utils import Prefab
diff --git a/AutomatedTesting/Gem/PythonTests/Prefab/tests/instantiate_prefab/InstantiatePrefab_FromCreatedPrefabWithSingleEntity.py b/AutomatedTesting/Gem/PythonTests/Prefab/tests/instantiate_prefab/InstantiatePrefab_FromCreatedPrefabWithSingleEntity.py
new file mode 100644
index 0000000000..ddd1528533
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/Prefab/tests/instantiate_prefab/InstantiatePrefab_FromCreatedPrefabWithSingleEntity.py
@@ -0,0 +1,34 @@
+"""
+Copyright (c) Contributors to the Open 3D Engine Project.
+For complete copyright and license terms please see the LICENSE at the root of this distribution.
+
+SPDX-License-Identifier: Apache-2.0 OR MIT
+"""
+
+def InstantiatePrefab_FromCreatedPrefabWithSingleEntity():
+
+ from pathlib import Path
+ CAR_PREFAB_FILE_NAME = Path(__file__).stem + 'car_prefab'
+
+ from editor_python_test_tools.editor_entity_utils import EditorEntity
+ from editor_python_test_tools.utils import Report
+ from editor_python_test_tools.prefab_utils import Prefab
+
+ import Prefab.tests.PrefabTestUtils as prefab_test_utils
+
+ prefab_test_utils.open_base_tests_level()
+
+ # Creates a new entity at the root level
+ car_entity = EditorEntity.create_editor_entity()
+ car_prefab_entities = [car_entity]
+
+ # Creates a prefab from the new entity
+ car_prefab, car_prefab_instance = Prefab.create_prefab(car_prefab_entities, CAR_PREFAB_FILE_NAME)
+
+ # Instantiate another instance and verify
+ car_prefab_instance_2 = car_prefab.instantiate()
+ assert car_prefab_instance_2.is_valid(), "Failed to instantiate prefab"
+
+if __name__ == "__main__":
+ from editor_python_test_tools.utils import Report
+ Report.start_test(InstantiatePrefab_FromCreatedPrefabWithSingleEntity)
diff --git a/AutomatedTesting/Gem/PythonTests/Prefab/tests/reparent_prefab/ReparentPrefab_UnderAnotherPrefab.py b/AutomatedTesting/Gem/PythonTests/Prefab/tests/reparent_prefab/ReparentPrefab_UnderAnotherPrefab.py
index 2c460a3298..49aeb97f63 100644
--- a/AutomatedTesting/Gem/PythonTests/Prefab/tests/reparent_prefab/ReparentPrefab_UnderAnotherPrefab.py
+++ b/AutomatedTesting/Gem/PythonTests/Prefab/tests/reparent_prefab/ReparentPrefab_UnderAnotherPrefab.py
@@ -7,8 +7,9 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
def ReparentPrefab_UnderAnotherPrefab():
- CAR_PREFAB_FILE_NAME = 'car_prefab'
- WHEEL_PREFAB_FILE_NAME = 'wheel_prefab'
+ from pathlib import Path
+ CAR_PREFAB_FILE_NAME = Path(__file__).stem + 'car_prefab'
+ WHEEL_PREFAB_FILE_NAME = Path(__file__).stem + 'wheel_prefab'
import editor_python_test_tools.pyside_utils as pyside_utils
diff --git a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/landscape_canvas_utils.py b/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/landscape_canvas_utils.py
index d54e32089a..333422815f 100755
--- a/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/landscape_canvas_utils.py
+++ b/AutomatedTesting/Gem/PythonTests/automatedtesting_shared/landscape_canvas_utils.py
@@ -19,12 +19,16 @@ def find_nodes_matching_entity_component(component_name, entity_id):
:param entity_id: The entity ID to search for the given component node on
:return List of matching nodes
"""
+ component_type_id = hydra.get_component_type_id(component_name)
component = editor.EditorComponentAPIBus(bus.Broadcast, 'GetComponentOfType', entity_id,
- hydra.get_component_type_id(component_name))
+ component_type_id)
+
if component.IsSuccess():
component_id = component.GetValue()
component_node = landscapecanvas.LandscapeCanvasRequestBus(bus.Broadcast, 'GetAllNodesMatchingEntityComponent',
component_id)
if component_node:
print(f"{component_name} node found on entity {entity_id.ToString()}")
+ else:
+ print(f"Failed to find {component_name} node on entity {entity_id.ToString()}")
return component_node
diff --git a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_FileMenuOptions.py b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_FileMenuOptions.py
index 4fcdc371e7..0060a3b29a 100644
--- a/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_FileMenuOptions.py
+++ b/AutomatedTesting/Gem/PythonTests/editor/EditorScripts/Menus_FileMenuOptions.py
@@ -32,10 +32,10 @@ def Menus_FileMenuOptions_Work():
file_menu_options = [
("New Level",),
- #("Open Level",), Temporarily disabled due to https://github.com/o3de/o3de/issues/6605
- #("Import",), Temporarily disabled due to https://github.com/o3de/o3de/issues/6746
+ ("Open Level",),
+ #("Import",), #Temporarily disabled due to https://github.com/o3de/o3de/issues/6746
("Save",),
- #("Save As",), Temporarily disabled due to https://github.com/o3de/o3de/issues/6605
+ ("Save As",),
("Save Level Statistics",),
("Edit Project Settings",),
#("Edit Platform Settings",), Temporarily disabled due to https://github.com/o3de/o3de/issues/6604
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/largeworlds/CMakeLists.txt
index ba607ede32..f016094b26 100644
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/CMakeLists.txt
@@ -14,7 +14,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
NAME AutomatedTesting::DynamicVegetationTests_Main_Optimized
TEST_SERIAL
TEST_SUITE main
- PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg/TestSuite_Main_Optimized.py
+ PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg/TestSuite_Main.py
RUNTIME_DEPENDENCIES
AZ::AssetProcessor
Legacy::Editor
@@ -27,7 +27,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
NAME AutomatedTesting::DynamicVegetationTests_Periodic_Optimized
TEST_SERIAL
TEST_SUITE periodic
- PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg/TestSuite_Periodic_Optimized.py
+ PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg/TestSuite_Periodic.py
RUNTIME_DEPENDENCIES
AZ::AssetProcessor
Legacy::Editor
@@ -43,7 +43,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
NAME AutomatedTesting::LandscapeCanvasTests_Main_Optimized
TEST_SERIAL
TEST_SUITE main
- PATH ${CMAKE_CURRENT_LIST_DIR}/landscape_canvas/TestSuite_Main_Optimized.py
+ PATH ${CMAKE_CURRENT_LIST_DIR}/landscape_canvas/TestSuite_Main.py
RUNTIME_DEPENDENCIES
AZ::AssetProcessor
Legacy::Editor
@@ -58,7 +58,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
NAME AutomatedTesting::GradientSignalTests_Periodic_Optimized
TEST_SERIAL
TEST_SUITE periodic
- PATH ${CMAKE_CURRENT_LIST_DIR}/gradient_signal/TestSuite_Periodic_Optimized.py
+ PATH ${CMAKE_CURRENT_LIST_DIR}/gradient_signal/TestSuite_Periodic.py
RUNTIME_DEPENDENCIES
AZ::AssetProcessor
Legacy::Editor
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude.py
index 66aa6d27ad..aa5e5e4f9c 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude.py
@@ -51,22 +51,18 @@ def AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude():
import os
- import azlmbr.asset as asset
import azlmbr.editor as editor
import azlmbr.legacy.general as general
import azlmbr.bus as bus
import azlmbr.math as math
- import azlmbr.prefab as prefab
import editor_python_test_tools.hydra_editor_utils as hydra
- from editor_python_test_tools.prefab_utils import Prefab
from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg
from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("", "Base")
+ hydra.open_base_level()
# Set view of planting area for visual debugging
general.set_current_view_position(512.0, 500.0, 38.0)
@@ -76,9 +72,9 @@ def AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude():
center_point = math.Vector3(512.0, 512.0, 32.0)
flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
- flower_prefab = dynveg.create_temp_mesh_prefab(flower_asset_path, "PinkFlower")[0]
+ flower_prefab = dynveg.create_temp_mesh_prefab(flower_asset_path, "AltFilter_PinkFlower")[0]
- spawner_entity = dynveg.create_prefab_vegetation_area("Instance Spawner", center_point, 32.0, 32.0, 32.0, flower_prefab)
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", center_point, 32.0, 32.0, 32.0, flower_prefab)
# Add a Vegetation Altitude Filter
spawner_entity.add_component("Vegetation Altitude Filter")
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_FilterStageToggle.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_FilterStageToggle.py
index 06f6c2a7b4..be2c5e4d8c 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_FilterStageToggle.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_FilterStageToggle.py
@@ -32,9 +32,7 @@ def AltitudeFilter_FilterStageToggle():
import os
import azlmbr.legacy.general as general
- import azlmbr.bus as bus
import azlmbr.math as math
- import azlmbr.prefab as prefab
import editor_python_test_tools.hydra_editor_utils as hydra
from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg
@@ -45,17 +43,16 @@ def AltitudeFilter_FilterStageToggle():
POSTPROCESS_INSTANCE_COUNT = 34
# Open an existing simple level
- helper.init_idle()
- helper.open_level("", "Base")
+ hydra.open_base_level()
general.set_current_view_position(512.0, 480.0, 38.0)
# Create basic vegetation entity
position = math.Vector3(512.0, 512.0, 32.0)
flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
- flower_prefab = dynveg.create_temp_mesh_prefab(flower_asset_path, "PinkFlower")[0]
+ flower_prefab = dynveg.create_temp_mesh_prefab(flower_asset_path, "AltFilter_PinkFlower2")[0]
- vegetation = dynveg.create_prefab_vegetation_area("vegetation", position, 16.0, 16.0, 16.0, flower_prefab)
+ vegetation = dynveg.create_temp_prefab_vegetation_area("vegetation", position, 16.0, 16.0, 16.0, flower_prefab)
# Add a Vegetation Altitude Filter to the vegetation area entity
vegetation.add_component("Vegetation Altitude Filter")
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude.py
index 544a58e242..1e9762d7d8 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude.py
@@ -56,8 +56,7 @@ def AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude():
from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("", "Base")
+ hydra.open_base_level()
# Set view of planting area for visual debugging
general.set_current_view_position(512.0, 500.0, 38.0)
@@ -67,9 +66,9 @@ def AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude():
center_point = math.Vector3(512.0, 512.0, 32.0)
flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
- flower_prefab = dynveg.create_temp_mesh_prefab(flower_asset_path, "PinkFlower")[0]
+ flower_prefab = dynveg.create_temp_mesh_prefab(flower_asset_path, "AltFilter_PinkFlower3")[0]
- spawner_entity = dynveg.create_prefab_vegetation_area("Instance Spawner", center_point, 16.0, 16.0, 16.0, flower_prefab)
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", center_point, 16.0, 16.0, 16.0, flower_prefab)
# Add a Vegetation Altitude Filter
spawner_entity.add_component("Vegetation Altitude Filter")
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea.py
index a856256929..7242b0b629 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea.py
@@ -56,19 +56,21 @@ def AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea():
"""
import os
+ from pathlib import Path
import azlmbr.bus as bus
import azlmbr.editor as editor
import azlmbr.legacy.general as general
import azlmbr.math as math
import azlmbr.vegetation as vegetation
+ import azlmbr.prefab as prefab
import editor_python_test_tools.hydra_editor_utils as hydra
from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg
from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper
- def create_asset_list_entity(name, center, dynamic_slice_asset_path):
+ def create_asset_list_entity(name, center, target_prefab):
asset_list_entity = hydra.Entity(name)
asset_list_entity.create_entity(
center,
@@ -77,18 +79,34 @@ def AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea():
if asset_list_entity.id.IsValid():
print(f"'{asset_list_entity.name}' created")
- # Set the Asset List to a Dynamic Slice spawner with a specific slice asset selected
- dynamic_slice_spawner = vegetation.DynamicSliceInstanceSpawner()
- dynamic_slice_spawner.SetSliceAssetPath(dynamic_slice_asset_path)
+ if target_prefab:
+ # Get the in-memory spawnable asset id if exists
+ spawnable_name = Path(target_prefab.file_path).stem
+ spawnable_asset_id = prefab.PrefabPublicRequestBus(bus.Broadcast, 'GetInMemorySpawnableAssetId',
+ spawnable_name)
+
+ # Create the in-memory spawnable asset from given prefab if the spawnable does not exist
+ if not spawnable_asset_id.is_valid():
+ create_spawnable_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'CreateInMemorySpawnableAsset',
+ target_prefab.file_path,
+ spawnable_name)
+ assert create_spawnable_result.IsSuccess(), \
+ f"Prefab operation 'CreateInMemorySpawnableAssets' failed. Error: {create_spawnable_result.GetError()}"
+ spawnable_asset_id = create_spawnable_result.GetValue()
+ else:
+ spawnable_asset_id = None
+
+ # Set the vegetation area to a prefab instance spawner with a specific prefab asset selected
descriptor = hydra.get_component_property_value(asset_list_entity.components[0],
- "Configuration|Embedded Assets|[0]")
- descriptor.spawner = dynamic_slice_spawner
+ 'Configuration|Embedded Assets|[0]')
+ prefab_spawner = vegetation.PrefabInstanceSpawner()
+ prefab_spawner.SetPrefabAssetId(spawnable_asset_id)
+ descriptor.spawner = prefab_spawner
asset_list_entity.get_set_test(0, "Configuration|Embedded Assets|[0]", descriptor)
return asset_list_entity
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Set view of planting area for visual debugging
general.set_current_view_position(512.0, 500.0, 38.0)
@@ -96,11 +114,13 @@ def AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea():
# 2) Create 3 entities with Vegetation Asset List components set to spawn different descriptors
center_point = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- asset_path2 = os.path.join("Slices", "PurpleFlower.dynamicslice")
- asset_list_entity = create_asset_list_entity("Asset List 1", center_point, asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "AssetList_PinkFlower")[0]
+ purple_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ purple_flower_prefab = dynveg.create_temp_mesh_prefab(purple_flower_asset_path, "AssetList_PurpleFlower")[0]
+ asset_list_entity = create_asset_list_entity("Asset List 1", center_point, pink_flower_prefab)
asset_list_entity2 = create_asset_list_entity("Asset List 2", center_point, None)
- asset_list_entity3 = create_asset_list_entity("Asset List 3", center_point, asset_path2)
+ asset_list_entity3 = create_asset_list_entity("Asset List 3", center_point, purple_flower_prefab)
# 3) Create a planting surface and add a Vegetation System Settings level component with instances set to spawn
# on center instead of corner
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AssetWeightSelector_InstancesExpressBasedOnWeight.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AssetWeightSelector_InstancesExpressBasedOnWeight.py
index b8b50f8110..8ea0b6b23d 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AssetWeightSelector_InstancesExpressBasedOnWeight.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/AssetWeightSelector_InstancesExpressBasedOnWeight.py
@@ -56,8 +56,7 @@ def AssetWeightSelector_InstancesExpressBasedOnWeight():
from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Set view of planting area for visual debugging
general.set_current_view_position(512.0, 500.0, 38.0)
@@ -66,14 +65,15 @@ def AssetWeightSelector_InstancesExpressBasedOnWeight():
# 2) Create a new instance spawner entity with multiple Dynamic Slice Instance Spawner descriptors, one set to a
# valid slice entity, and one set to None
spawner_center_point = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0, 16.0,
- asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "AssetWeight_PinkFlower")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0, 16.0,
+ pink_flower_prefab)
desc_asset = hydra.get_component_property_value(spawner_entity.components[2],
"Configuration|Embedded Assets")[0]
desc_list = [desc_asset, desc_asset]
spawner_entity.get_set_test(2, "Configuration|Embedded Assets", desc_list)
- spawner_entity.get_set_test(2, "Configuration|Embedded Assets|[1]|Instance|Slice Asset", None)
+ spawner_entity.get_set_test(2, "Configuration|Embedded Assets|[1]|Instance|Prefab Asset", None)
# Add an Asset Weight Selector component to the spawner entity
spawner_entity.add_component("Vegetation Asset Weight Selector")
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius.py
index ed5501d719..be0fe8dba7 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius.py
@@ -64,16 +64,15 @@ def DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius():
instance_query_point_c = math.Vector3(515.0, 512.5, 32.0)
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
-
+ hydra.open_base_level()
general.set_current_view_position(512.0, 480.0, 38.0)
# 2) Create a new entity with required vegetation area components
spawner_center_point = math.Vector3(520.0, 520.0, 32.0)
- asset_path = os.path.join("Slices", "1m_cube.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0, 16.0,
- asset_path)
+ cube_asset_path = os.path.join("testdata", "multi-mat_fbx", "multi-mat_1m_cube.azmodel")
+ cube_prefab = dynveg.create_temp_mesh_prefab(cube_asset_path, "DistanceBetween_1m_cube2")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0, 16.0,
+ cube_prefab)
# 3) Create a surface to plant on
surface_center_point = math.Vector3(512.0, 512.0, 32.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius.py
index c24ec3c314..b2244fdfa7 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius.py
@@ -62,16 +62,15 @@ def DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius():
instance_query_point_c = math.Vector3(515.0, 512.5, 32.0)
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
-
+ hydra.open_base_level()
general.set_current_view_position(512.0, 480.0, 38.0)
# 2) Create a new entity with required vegetation area components
spawner_center_point = math.Vector3(520.0, 520.0, 32.0)
- asset_path = os.path.join("Slices", "1m_cube.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0, 16.0,
- asset_path)
+ cube_asset_path = os.path.join("testdata", "multi-mat_fbx", "multi-mat_1m_cube.azmodel")
+ cube_prefab = dynveg.create_temp_mesh_prefab(cube_asset_path, "DistanceBetween_1m_cube")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", spawner_center_point,
+ 16.0, 16.0, 16.0, cube_prefab)
# 3) Create a surface to plant on
surface_center_point = math.Vector3(512.0, 512.0, 32.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynVegUtils_TempPrefabCreationWorks.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynVegUtils_TempPrefabCreationWorks.py
index d016473d5e..c1ca3cbfc6 100644
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynVegUtils_TempPrefabCreationWorks.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynVegUtils_TempPrefabCreationWorks.py
@@ -39,11 +39,11 @@ def DynVegUtils_TempPrefabCreationWorks():
with Tracer() as error_tracer:
# Create dictionary for prefab filenames and paths to create using helper function
mesh_prefabs = {
- "PinkFlower": os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel"),
- "PurpleFlower": os.path.join("assets", "objects", "foliage", "grass_flower_purple.azmodel"),
- "1m_Cube": os.path.join("objects", "_primitives", "_box_1x1.azmodel"),
- "CedarTree": os.path.join("assets", "objects", "foliage", "cedar.azmodel"),
- "Bush": os.path.join("assets", "objects", "foliage", "bush_privet_01.azmodel"),
+ "UtilsTest_PinkFlower": os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel"),
+ "UtilsTest_PurpleFlower": os.path.join("assets", "objects", "foliage", "grass_flower_purple.azmodel"),
+ "UtilsTest_1m_Cube": os.path.join("objects", "_primitives", "_box_1x1.azmodel"),
+ "UtilsTest_CedarTree": os.path.join("assets", "objects", "foliage", "cedar.azmodel"),
+ "UtilsTest_Bush": os.path.join("assets", "objects", "foliage", "bush_privet_01.azmodel"),
}
# 1) Open an existing simple level
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks.py
index fcbf85c59d..c8581ad275 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks.py
@@ -71,8 +71,7 @@ def DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks():
from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(512.0, 480.0, 38.0)
# Grab the UUID that we need for creating an Dynamic Slice Instance Spawner
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/EmptyInstanceSpawner_EmptySpawnerWorks.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/EmptyInstanceSpawner_EmptySpawnerWorks.py
index d0a51809b4..91315a6971 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/EmptyInstanceSpawner_EmptySpawnerWorks.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/EmptyInstanceSpawner_EmptySpawnerWorks.py
@@ -57,8 +57,7 @@ def EmptyInstanceSpawner_EmptySpawnerWorks():
from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(512.0, 480.0, 38.0)
# Grab the UUID that we need for creating an Empty Spawner
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/InstanceSpawnerPriority_LayerAndSubPriority.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/InstanceSpawnerPriority_LayerAndSubPriority.py
index 471c8862fd..f83807a62b 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/InstanceSpawnerPriority_LayerAndSubPriority.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/InstanceSpawnerPriority_LayerAndSubPriority.py
@@ -60,8 +60,7 @@ def InstanceSpawnerPriority_LayerAndSubPriority():
from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Set view of planting area for visual debugging
general.set_current_view_position(512.0, 500.0, 38.0)
@@ -69,9 +68,10 @@ def InstanceSpawnerPriority_LayerAndSubPriority():
# 2) Create overlapping areas: 1 instance spawner area, and 1 blocker area
spawner_center_point = math.Vector3(508.0, 508.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0, 1.0,
- asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "Priority_PinkFlower")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0, 1.0,
+ pink_flower_prefab)
blocker_center_point = math.Vector3(516.0, 516.0, 32.0)
blocker_entity = dynveg.create_blocker_area("Instance Blocker", blocker_center_point, 16.0, 16.0, 1.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerBlender_E2E_Editor.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerBlender_E2E_Editor.py
index 6b5a80ee8e..79f2e4169b 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerBlender_E2E_Editor.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerBlender_E2E_Editor.py
@@ -85,18 +85,14 @@ def LayerBlender_E2E_Editor():
# 2) Create 2 vegetation areas with different meshes
purple_position = math.Vector3(504.0, 512.0, 32.0)
- purple_asset_path = os.path.join("Slices", "PurpleFlower.dynamicslice")
- spawner_entity_1 = dynveg.create_dynamic_slice_vegetation_area("Purple Spawner",
- purple_position,
- 16.0, 16.0, 1.0,
- purple_asset_path)
+ purple_flower_prefab_path = os.path.join("assets", "prefabs", "PurpleFlower.spawnable")
+ spawner_entity_1 = dynveg.create_prefab_vegetation_area("Purple Spawner", purple_position, 16.0, 16.0, 1.0,
+ purple_flower_prefab_path)
pink_position = math.Vector3(520.0, 512.0, 32.0)
- pink_asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- spawner_entity_2 = dynveg.create_dynamic_slice_vegetation_area("Pink Spawner",
- pink_position,
- 16.0, 16.0, 1.0,
- pink_asset_path)
+ pink_flower_prefab_path = os.path.join("assets", "prefabs", "PinkFlower.spawnable")
+ spawner_entity_2 = dynveg.create_prefab_vegetation_area("Pink Spawner", pink_position, 16.0, 16.0, 1.0,
+ pink_flower_prefab_path)
base_position = math.Vector3(512.0, 512.0, 32.0)
dynveg.create_surface_entity("Surface Entity",
@@ -135,11 +131,11 @@ def LayerBlender_E2E_Editor():
pink_count = 0
purple_count = 0
for instance in instances:
- purple_asset_path = purple_asset_path.replace("\\", "/").lower()
- pink_asset_path = pink_asset_path.replace("\\", "/").lower()
- if instance.descriptor.spawner.GetSliceAssetPath() == pink_asset_path:
+ purple_flower_prefab_path = purple_flower_prefab_path.replace("\\", "/").lower()
+ pink_flower_prefab_path = pink_flower_prefab_path.replace("\\", "/").lower()
+ if instance.descriptor.spawner.GetPrefabAssetPath() == pink_flower_prefab_path:
pink_count += 1
- elif instance.descriptor.spawner.GetSliceAssetPath() == purple_asset_path:
+ elif instance.descriptor.spawner.GetPrefabAssetPath() == purple_flower_prefab_path:
purple_count += 1
Report.result(Tests.instances_blended, pink_count == purple_count and (pink_count + purple_count == num_expected))
@@ -152,11 +148,10 @@ def LayerBlender_E2E_Editor():
components.TransformBus(bus.Event, "MoveEntity", search_entity_ids[0], cam_position)
azlmbr.components.TransformBus(bus.Event, "SetLocalRotation", search_entity_ids[0], cam_rot_degrees_vector)
- # 6) Save and export to engine
+ # 6) Save the created level
general.save_level()
- general.export_to_engine()
- pak_path = os.path.join(paths.products, "levels", lvl_name, "level.pak")
- success = helper.wait_for_condition(lambda: os.path.exists(pak_path), 10.0)
+ level_prefab_path = os.path.join(paths.products, "levels", lvl_name, f"{lvl_name}.spawnable")
+ success = helper.wait_for_condition(lambda: os.path.exists(level_prefab_path), 5.0)
Report.result(Tests.saved_and_exported, success)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerBlocker_InstancesBlockedInConfiguredArea.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerBlocker_InstancesBlockedInConfiguredArea.py
index b89edcdeb7..5c3083ee3d 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerBlocker_InstancesBlockedInConfiguredArea.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerBlocker_InstancesBlockedInConfiguredArea.py
@@ -17,7 +17,6 @@ class Tests:
)
-
def LayerBlocker_InstancesBlockedInConfiguredArea():
"""
Summary:
@@ -58,8 +57,7 @@ def LayerBlocker_InstancesBlockedInConfiguredArea():
from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Set view of planting area for visual debugging
general.set_current_view_position(512.0, 500.0, 38.0)
@@ -67,9 +65,10 @@ def LayerBlocker_InstancesBlockedInConfiguredArea():
# 2) Create a new instance spawner entity
spawner_center_point = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0, 16.0,
- asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "Blocker_PinkFlower")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", spawner_center_point,
+ 16.0, 16.0, 16.0, pink_flower_prefab)
# 3) Create surface for planting on
dynveg.create_surface_entity("Surface Entity", spawner_center_point, 32.0, 32.0, 1.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_FilterStageToggle.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_FilterStageToggle.py
index 6796f56b11..a277f14a41 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_FilterStageToggle.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_FilterStageToggle.py
@@ -42,16 +42,17 @@ def LayerSpawner_FilterStageToggle():
POSTPROCESS_INSTANCE_COUNT = 19
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(500.49, 498.69, 46.66)
general.set_current_view_rotation(-42.05, 0.00, -36.33)
# Create a vegetation area with all needed components
position = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- vegetation_entity = dynveg.create_dynamic_slice_vegetation_area("vegetation", position, 16.0, 16.0, 16.0, asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "SpawnerFilter_PinkFlower")[0]
+ vegetation_entity = dynveg.create_temp_prefab_vegetation_area("vegetation", position, 16.0, 16.0, 16.0,
+ pink_flower_prefab)
vegetation_entity.add_component("Vegetation Altitude Filter")
vegetation_entity.add_component("Vegetation Position Modifier")
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InheritBehaviorFlag.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InheritBehaviorFlag.py
index 1153ae2657..dc06c298d1 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InheritBehaviorFlag.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InheritBehaviorFlag.py
@@ -42,19 +42,16 @@ def LayerSpawner_InheritBehaviorFlag():
SURFACE_TAG = "test_tag"
- def set_dynamic_slice_asset(entity_obj, component_index, dynamic_slice_asset_path):
- dynamic_slice_spawner = vegetation.DynamicSliceInstanceSpawner()
- dynamic_slice_spawner.SetSliceAssetPath(dynamic_slice_asset_path)
- descriptor = hydra.get_component_property_value(
- entity_obj.components[component_index], "Configuration|Embedded Assets|[0]"
- )
- descriptor.spawner = dynamic_slice_spawner
+ def set_prefab_asset(entity_obj, component_index, spawnable_prefab):
+ descriptor = hydra.get_component_property_value(entity_obj.components[component_index],
+ "Configuration|Embedded Assets|[0]")
+ prefab_spawner = vegetation.PrefabInstanceSpawner()
+ prefab_spawner.SetPrefabAssetId(spawnable_prefab)
+ descriptor.spawner = prefab_spawner
entity_obj.get_set_test(2, "Configuration|Embedded Assets|[0]", descriptor)
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
-
+ hydra.open_base_level()
general.set_current_view_position(512.0, 480.0, 38.0)
# Create Emitter entity and add the required components
@@ -80,7 +77,9 @@ def LayerSpawner_InheritBehaviorFlag():
veg_1.create_entity(
position, ["Vegetation Layer Spawner", "Shape Reference", "Vegetation Asset List"]
)
- set_dynamic_slice_asset(veg_1, 2, os.path.join("Slices", "PinkFlower.dynamicslice"))
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "SpawnerInheritBehavior_PinkFlower")[0]
+ set_prefab_asset(veg_1, 2, pink_flower_prefab)
veg_1.get_set_test(1, "Configuration|Shape Entity Id", blender_entity.id)
# Create second vegetation area and assign a valid asset
@@ -88,7 +87,9 @@ def LayerSpawner_InheritBehaviorFlag():
veg_2.create_entity(
position, ["Vegetation Layer Spawner", "Shape Reference", "Vegetation Asset List"]
)
- set_dynamic_slice_asset(veg_2, 2, os.path.join("Slices", "PurpleFlower.dynamicslice"))
+ purple_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ purple_flower_prefab = dynveg.create_temp_mesh_prefab(purple_flower_asset_path, "temp_PurpleFlower")[0]
+ set_prefab_asset(veg_2, 2, purple_flower_prefab)
veg_2.get_set_test(1, "Configuration|Shape Entity Id", blender_entity.id)
# Assign the vegetation areas to the Blender entity
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InstancesPlantInAllSupportedShapes.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InstancesPlantInAllSupportedShapes.py
index beec54b4eb..662ac63714 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InstancesPlantInAllSupportedShapes.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InstancesPlantInAllSupportedShapes.py
@@ -56,16 +56,14 @@ def LayerSpawner_InstancesPlantInAllSupportedShapes():
Report.result(success, result)
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# 2) Create basic vegetation area entity and set the properties
entity_position = math.Vector3(125.0, 136.0, 32.0)
- asset_path = os.path.join("Slices", "PurpleFlower.dynamicslice")
- vegetation = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner",
- entity_position,
- 10.0, 10.0, 10.0,
- asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "SpawnerShapePlant_PinkFlower")[0]
+ vegetation = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", entity_position, 10.0, 10.0, 10.0,
+ pink_flower_prefab)
vegetation.remove_component("Box Shape")
vegetation.add_component("Shape Reference")
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InstancesRefreshUsingCorrectViewportCamera.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InstancesRefreshUsingCorrectViewportCamera.py
index fe8863c625..deb0376c9b 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InstancesRefreshUsingCorrectViewportCamera.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/LayerSpawner_InstancesRefreshUsingCorrectViewportCamera.py
@@ -43,13 +43,13 @@ def LayerSpawner_InstancesRefreshUsingCorrectViewportCamera():
import azlmbr.legacy.general as general
import azlmbr.math as math
+ import editor_python_test_tools.hydra_editor_utils as hydra
from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg
from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Set up a test environment to validate that switching viewports correctly changes which camera
# the vegetation system uses.
@@ -100,11 +100,12 @@ def LayerSpawner_InstancesRefreshUsingCorrectViewportCamera():
surface_height)
# Create the two vegetation areas
- test_slice_asset_path = os.path.join("Slices", "PurpleFlower.dynamicslice")
- first_veg_entity = dynveg.create_dynamic_slice_vegetation_area("Veg Area 1", first_entity_center_point, box_size, box_size,
- box_size, test_slice_asset_path)
- second_veg_entity = dynveg.create_dynamic_slice_vegetation_area("Veg Area 2", second_entity_center_point, box_size, box_size,
- box_size, test_slice_asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "SpawnerViewportRefresh_PinkFlower")[0]
+ first_veg_entity = dynveg.create_temp_prefab_vegetation_area("Veg Area 1", first_entity_center_point, box_size, box_size,
+ box_size, pink_flower_prefab)
+ second_veg_entity = dynveg.create_temp_prefab_vegetation_area("Veg Area 2", second_entity_center_point, box_size, box_size,
+ box_size, pink_flower_prefab)
# When the first viewport is active, the first area should be full of instances, and the second should be empty
general.set_active_viewport(0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshBlocker_InstancesBlockedByMesh.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshBlocker_InstancesBlockedByMesh.py
index 9777a52c82..7c365d0ee5 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshBlocker_InstancesBlockedByMesh.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshBlocker_InstancesBlockedByMesh.py
@@ -50,19 +50,17 @@ def MeshBlocker_InstancesBlockedByMesh():
from editor_python_test_tools.utils import TestHelper as helper
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(500.49, 498.69, 46.66)
general.set_current_view_rotation(-42.05, 0.00, -36.33)
# Create entity with components "Vegetation Layer Spawner", "Vegetation Asset List", "Box Shape"
entity_position = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PurpleFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner",
- entity_position,
- 10.0, 10.0, 10.0,
- asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "MeshBlocker_PinkFlower")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", entity_position, 10.0, 10.0, 10.0,
+ pink_flower_prefab)
# Create surface entity to plant on
dynveg.create_surface_entity("Surface Entity", entity_position, 10.0, 10.0, 1.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshBlocker_InstancesBlockedByMeshHeightTuning.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshBlocker_InstancesBlockedByMeshHeightTuning.py
index 3c47edeb91..a54a8653f0 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshBlocker_InstancesBlockedByMeshHeightTuning.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshBlocker_InstancesBlockedByMeshHeightTuning.py
@@ -53,19 +53,17 @@ def MeshBlocker_InstancesBlockedByMeshHeightTuning():
from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(500.49, 498.69, 46.66)
general.set_current_view_rotation(-42.05, 0.00, -36.33)
# 2) Create entity with components "Vegetation Layer Spawner", "Vegetation Asset List", "Box Shape"
entity_position = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PurpleFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner",
- entity_position,
- 10.0, 10.0, 10.0,
- asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "MeshBlocker_PinkFlower2")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", entity_position, 10.0, 10.0, 10.0,
+ pink_flower_prefab)
# 3) Create surface entity to plant on
dynveg.create_surface_entity("Surface Entity", entity_position, 10.0, 10.0, 1.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshSurfaceTagEmitter_DependentOnMeshComponent.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshSurfaceTagEmitter_DependentOnMeshComponent.py
index cee8ebe5b6..9af17b0cd5 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshSurfaceTagEmitter_DependentOnMeshComponent.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshSurfaceTagEmitter_DependentOnMeshComponent.py
@@ -58,8 +58,7 @@ def MeshSurfaceTagEmitter_DependentOnMeshComponent():
return editor.EditorComponentAPIBus(bus.Broadcast, "IsComponentEnabled", EntityComponentIdPair)
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# 2) Create a new entity with component "Mesh Surface Tag Emitter"
entity_position = math.Vector3(125.0, 136.0, 32.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully.py
index d7abc66106..cd9963e844 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/MeshSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully.py
@@ -47,8 +47,7 @@ def MeshSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully():
from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# 2) Create a new entity with components "Mesh Surface Tag Emitter", "Mesh"
entity_position = math.Vector3(125.0, 136.0, 32.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PhysXColliderSurfaceTagEmitter_E2E_Editor.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PhysXColliderSurfaceTagEmitter_E2E_Editor.py
index 6232cd374d..cdb2fac80b 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PhysXColliderSurfaceTagEmitter_E2E_Editor.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PhysXColliderSurfaceTagEmitter_E2E_Editor.py
@@ -55,8 +55,7 @@ def PhysXColliderSurfaceTagEmitter_E2E_Editor():
return behavior_context_test_success
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Verify all of the BehaviorContext API:
behavior_context = (
@@ -90,8 +89,10 @@ def PhysXColliderSurfaceTagEmitter_E2E_Editor():
dynveg.create_surface_entity("Baseline Surface", entity_center_point, 32.0, 32.0, 1.0)
# Create a new entity with required vegetation area components
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Veg Area", entity_center_point, 32.0, 32.0, 32.0, asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "PhysXCollider_PinkFlower")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", entity_center_point, test_box_size,
+ test_box_size, test_box_size, pink_flower_prefab)
# Add a Vegetation Surface Mask Filter component to the spawner entity and set it to include the "test" tag
spawner_entity.add_component("Vegetation Surface Mask Filter")
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PositionModifier_AutoSnapToSurfaceWorks.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PositionModifier_AutoSnapToSurfaceWorks.py
index be7e8ad754..85a1cddb95 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PositionModifier_AutoSnapToSurfaceWorks.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PositionModifier_AutoSnapToSurfaceWorks.py
@@ -64,8 +64,7 @@ def PositionModifier_AutoSnapToSurfaceWorks():
'Configuration|Position Z|Range Min', 'Configuration|Position Z|Range Max']
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Set view of planting area for visual debugging
general.set_current_view_position(512.0, 500.0, 38.0)
@@ -73,9 +72,10 @@ def PositionModifier_AutoSnapToSurfaceWorks():
# 2) Create a new entity with required vegetation area components and a Position Modifier
spawner_center_point = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0, 16.0,
- asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "PosMod_PinkFlower")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0,
+ 16.0, pink_flower_prefab)
# Add a Vegetation Position Modifier and set offset values to 0
spawner_entity.add_component("Vegetation Position Modifier")
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PositionModifier_ComponentAndOverrides_InstancesPlantAtSpecifiedOffsets.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PositionModifier_ComponentAndOverrides_InstancesPlantAtSpecifiedOffsets.py
index 07d4fbd067..6be3dc31f7 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PositionModifier_ComponentAndOverrides_InstancesPlantAtSpecifiedOffsets.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PositionModifier_ComponentAndOverrides_InstancesPlantAtSpecifiedOffsets.py
@@ -102,16 +102,17 @@ def PositionModifier_ComponentAndOverrides_InstancesPlantAtSpecifiedOffsets():
return offset_success and offset_success2
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Set view of planting area for visual debugging
general.set_current_view_position(16.0, -5.0, 32.0)
# 2) Create a new entity with required vegetation area components
spawner_center_point = math.Vector3(16.0, 16.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", spawner_center_point, 1.0, 1.0, 1.0, asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "PosMod_PinkFlower2")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", spawner_center_point, 1.0, 1.0,
+ 1.0, pink_flower_prefab)
# Add a Vegetation Position Modifier and set offset values to 0
spawner_entity.add_component("Vegetation Position Modifier")
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_Embedded_E2E.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PrefabInstanceSpawner_Embedded_E2E.py
similarity index 87%
rename from AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_Embedded_E2E.py
rename to AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PrefabInstanceSpawner_Embedded_E2E.py
index b4650c782e..8ce865b5d2 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_Embedded_E2E.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PrefabInstanceSpawner_Embedded_E2E.py
@@ -63,12 +63,14 @@ def DynamicSliceInstanceSpawner_Embedded_E2E():
import azlmbr.entity as entity
import azlmbr.math as math
import azlmbr.paths as paths
+ import azlmbr.vegetation as vegetation
import editor_python_test_tools.hydra_editor_utils as hydra
from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg
from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper
+
# 1) Create a new, temporary level
lvl_name = "tmp_level"
helper.init_idle()
@@ -79,13 +81,14 @@ def DynamicSliceInstanceSpawner_Embedded_E2E():
# 2) Create a new entity with required vegetation area components and Script Canvas component for launcher test
center_point = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", center_point, 16.0, 16.0, 1.0, asset_path)
+ pink_flower_prefab_path = os.path.join("assets", "prefabs", "PinkFlower.spawnable")
+ spawner_entity = dynveg.create_prefab_vegetation_area("Instance Spawner", center_point, 16.0, 16.0, 1.0,
+ pink_flower_prefab_path)
spawner_entity.add_component("Script Canvas")
instance_counter_path = os.path.join("scriptcanvas", "instance_counter.scriptcanvas")
instance_counter_script = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", instance_counter_path,
math.Uuid(), False)
- spawner_entity.get_set_test(3, "Script Canvas Asset|Script Canvas Asset", instance_counter_script)
+ spawner_entity.get_set_test(3, "Properties", instance_counter_script)
Report.result(Tests.spawner_entity_created, spawner_entity.id.IsValid() and hydra.has_components(spawner_entity.id,
["Script Canvas"]))
@@ -106,11 +109,10 @@ def DynamicSliceInstanceSpawner_Embedded_E2E():
search_entity_ids = entity.SearchBus(bus.Broadcast, 'SearchEntities', search_filter)
components.TransformBus(bus.Event, "MoveEntity", search_entity_ids[0], cam_position)
- # 6) Save and export to engine
+ # 6) Save the created level
general.save_level()
- general.export_to_engine()
- pak_path = os.path.join(paths.products, "levels", lvl_name, "level.pak")
- success = helper.wait_for_condition(lambda: os.path.exists(pak_path), 10.0)
+ level_prefab_path = os.path.join(paths.products, "levels", lvl_name, f"{lvl_name}.spawnable")
+ success = helper.wait_for_condition(lambda: os.path.exists(level_prefab_path), 5.0)
Report.result(Tests.saved_and_exported, success)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_External_E2E.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PrefabInstanceSpawner_External_E2E.py
similarity index 96%
rename from AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_External_E2E.py
rename to AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PrefabInstanceSpawner_External_E2E.py
index a5e7e90ce2..a3e60f6337 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/DynamicSliceInstanceSpawner_External_E2E.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PrefabInstanceSpawner_External_E2E.py
@@ -128,11 +128,10 @@ def DynamicSliceInstanceSpawner_External_E2E():
search_entity_ids = entity.SearchBus(bus.Broadcast, 'SearchEntities', search_filter)
components.TransformBus(bus.Event, "MoveEntity", search_entity_ids[0], cam_position)
- # 6) Save and export to engine
+ # 6) Save the created level
general.save_level()
- general.export_to_engine()
- pak_path = os.path.join(paths.products, "levels", lvl_name, "level.pak")
- success = helper.wait_for_condition(lambda: os.path.exists(pak_path), 10.0)
+ level_prefab_path = os.path.join(paths.products, "levels", lvl_name, f"{lvl_name}.spawnable")
+ success = helper.wait_for_condition(lambda: os.path.exists(level_prefab_path), 5.0)
Report.result(Tests.saved_and_exported, success)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/RotationModifierOverrides_InstancesRotateWithinRange.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/RotationModifierOverrides_InstancesRotateWithinRange.py
index c1ea8e03d1..877a38c231 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/RotationModifierOverrides_InstancesRotateWithinRange.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/RotationModifierOverrides_InstancesRotateWithinRange.py
@@ -81,14 +81,15 @@ def RotationModifierOverrides_InstancesRotateWithinRange():
return result
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(512.0, 480.0, 38.0)
# 2) Create vegetation entity and add components
entity_position = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PurpleFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Spawner Entity", entity_position, 16.0, 16.0, 16.0, asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "RotMod_PinkFlower2")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", entity_position, 16.0, 16.0, 16.0,
+ pink_flower_prefab)
spawner_entity.add_component("Vegetation Rotation Modifier")
# Our default vegetation settings places 20 instances per 16 meters, so we expect 20 * 20 total instances.
num_expected = 20 * 20
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/RotationModifier_InstancesRotateWithinRange.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/RotationModifier_InstancesRotateWithinRange.py
index 518c11a0cf..b0999f3195 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/RotationModifier_InstancesRotateWithinRange.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/RotationModifier_InstancesRotateWithinRange.py
@@ -120,13 +120,14 @@ def RotationModifier_InstancesRotateWithinRange():
# Main Script
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(512.0, 480.0, 38.0)
# 2) Set up vegetation entities
- asset_path = os.path.join("Slices", "PurpleFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Spawner Entity", LEVEL_CENTER, 2.0, 2.0, 2.0, asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "RotMod_PinkFlower")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", LEVEL_CENTER, 2.0, 2.0, 2.0,
+ pink_flower_prefab)
additional_components = [
"Vegetation Rotation Modifier"
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ScaleModifierOverrides_InstancesProperlyScale.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ScaleModifierOverrides_InstancesProperlyScale.py
index b2ce6d8afa..42b042e26e 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ScaleModifierOverrides_InstancesProperlyScale.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ScaleModifierOverrides_InstancesProperlyScale.py
@@ -91,16 +91,17 @@ def ScaleModifierOverrides_InstancesProperlyScale():
return False
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(500.49, 498.69, 46.66)
general.set_current_view_rotation(-42.05, 0.00, -36.33)
# 2) Create a new entity with components "Vegetation Layer Spawner", "Vegetation Asset List", "Box Shape"
entity_position = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PurpleFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Spawner Entity", entity_position, 16.0, 16.0, 10.0, asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "ScaleMod_PinkFlower2")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", entity_position, 16.0, 16.0, 16.0,
+ pink_flower_prefab)
# Create a surface to plant on and add a Vegetation Debugger Level component to allow refreshes
dynveg.create_surface_entity("Surface Entity", entity_position, 20.0, 20.0, 1.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ScaleModifier_InstancesProperlyScale.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ScaleModifier_InstancesProperlyScale.py
index fd0df1c83d..8008224e3e 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ScaleModifier_InstancesProperlyScale.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ScaleModifier_InstancesProperlyScale.py
@@ -84,8 +84,7 @@ def ScaleModifier_InstancesProperlyScale():
return False
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(500.49, 498.69, 46.66)
general.set_current_view_rotation(-42.05, 0.00, -36.33)
@@ -93,9 +92,10 @@ def ScaleModifier_InstancesProperlyScale():
# 2) Create a new entity with components Vegetation Layer Spawner, Vegetation Asset List, Box Shape and
# Vegetation Scale Modifier
entity_position = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PurpleFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Spawner Entity", entity_position, 16.0, 16.0, 16.0,
- asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "ScaleMod_PinkFlower")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", entity_position, 16.0, 16.0, 16.0,
+ pink_flower_prefab)
spawner_entity.add_component("Vegetation Scale Modifier")
# Create a surface to plant on and add a Vegetation Debugger Level component to allow refreshes
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ShapeIntersectionFilter_FilterStageToggle.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ShapeIntersectionFilter_FilterStageToggle.py
index b5c00a53b7..5436855433 100644
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ShapeIntersectionFilter_FilterStageToggle.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ShapeIntersectionFilter_FilterStageToggle.py
@@ -49,15 +49,16 @@ def ShapeIntersectionFilter_FilterStageToggle():
from editor_python_test_tools.utils import TestHelper as helper
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(512.0, 480.0, 38.0)
# Create basic vegetation entity
position = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- vegetation = dynveg.create_dynamic_slice_vegetation_area("vegetation", position, 16.0, 16.0, 16.0, asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "ShapeIntersection_PinkFlower")[0]
+ vegetation = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", position, 16.0, 16.0, 16.0,
+ pink_flower_prefab)
# Create Surface for instances to plant on
dynveg.create_surface_entity("Surface_Entity_Parent", position, 16.0, 16.0, 1.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ShapeIntersectionFilter_InstancesPlantInAssignedShape.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ShapeIntersectionFilter_InstancesPlantInAssignedShape.py
index 6678a620af..e9e4c722f1 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ShapeIntersectionFilter_InstancesPlantInAssignedShape.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/ShapeIntersectionFilter_InstancesPlantInAssignedShape.py
@@ -60,8 +60,7 @@ def ShapeIntersectionFilter_InstancesPlantInAssignedShape():
from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Set view of planting area for visual debugging
general.set_current_view_position(512.0, 500.0, 38.0)
@@ -69,9 +68,10 @@ def ShapeIntersectionFilter_InstancesPlantInAssignedShape():
# 2) Create a new entity with required vegetation area components and Vegetation Shape Intersection Filter
center_point = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", center_point, 16.0, 16.0, 1.0,
- asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "ShapeIntersection_PinkFlower2")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", center_point, 16.0, 16.0, 1.0,
+ pink_flower_prefab)
spawner_entity.add_component("Vegetation Shape Intersection Filter")
# Create a planting surface
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeAlignmentModifierOverrides_InstanceSurfaceAlignment.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeAlignmentModifierOverrides_InstanceSurfaceAlignment.py
index c9233d15ea..07dbb3f977 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeAlignmentModifierOverrides_InstanceSurfaceAlignment.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeAlignmentModifierOverrides_InstanceSurfaceAlignment.py
@@ -58,15 +58,16 @@ def SlopeAlignmentModifierOverrides_InstanceSurfaceAlignment():
return False
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(512.0, 480.0, 38.0)
# Create a spawner entity setup with all needed components
center_point = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", center_point, 16.0, 16.0, 32.0, asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "SlopeAlign_PinkFlower2")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", center_point, 16.0, 16.0, 32.0,
+ pink_flower_prefab)
# Create a sloped mesh surface for the instances to plant on
center_point = math.Vector3(502.0, 512.0, 24.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeAlignmentModifier_InstanceSurfaceAlignment.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeAlignmentModifier_InstanceSurfaceAlignment.py
index d92babffa4..088728480b 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeAlignmentModifier_InstanceSurfaceAlignment.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeAlignmentModifier_InstanceSurfaceAlignment.py
@@ -59,15 +59,16 @@ def SlopeAlignmentModifier_InstanceSurfaceAlignment():
return False
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(512.0, 480.0, 38.0)
# Create a spawner entity setup with all needed components
center_point = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", center_point, 16.0, 16.0, 32.0, asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "SlopeAlign_PinkFlower")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", center_point, 16.0, 16.0, 32.0,
+ pink_flower_prefab)
# Create a sloped mesh surface for the instances to plant on
center_point = math.Vector3(502.0, 512.0, 24.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeFilter_ComponentAndOverrides_InstancesPlantOnValidSlope.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeFilter_ComponentAndOverrides_InstancesPlantOnValidSlope.py
index 0f95853156..cc04dc4cb1 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeFilter_ComponentAndOverrides_InstancesPlantOnValidSlope.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SlopeFilter_ComponentAndOverrides_InstancesPlantOnValidSlope.py
@@ -63,16 +63,17 @@ def SlopeFilter_ComponentAndOverrides_InstancesPlantOnValidSlopes():
from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Set view of planting area for visual debugging
general.set_current_view_position(512.0, 475.0, 38.0)
# 2) Create a new entity with required vegetation area components
center_point = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", center_point, 32.0, 32.0, 32.0, asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "Slope_PinkFlower")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", center_point, 32.0, 32.0, 32.0,
+ pink_flower_prefab)
# Add a Vegetation Slope Filter
spawner_entity.add_component("Vegetation Slope Filter")
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SpawnerSlices_SliceCreationAndVisibilityToggleWorks.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SpawnerPrefabs_PrefabCreationAndVisibilityToggleWorks.py
similarity index 52%
rename from AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SpawnerSlices_SliceCreationAndVisibilityToggleWorks.py
rename to AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SpawnerPrefabs_PrefabCreationAndVisibilityToggleWorks.py
index fc55080cec..182bd5510a 100644
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SpawnerSlices_SliceCreationAndVisibilityToggleWorks.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SpawnerPrefabs_PrefabCreationAndVisibilityToggleWorks.py
@@ -7,21 +7,21 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
class Tests:
- spawner_slice_created = (
- "Spawner slice created successfully",
- "Failed to create Spawner slice"
+ spawner_prefab_created = (
+ "Spawner prefab created successfully",
+ "Failed to create Spawner prefab"
)
instance_count_unhidden = (
"Initial instance counts are as expected",
"Found an unexpected number of initial instances"
)
instance_count_hidden = (
- "Instance counts upon hiding the Spawner slice are as expected",
- "Unexpectedly found instances with the Spawner slice hidden"
+ "Instance counts upon hiding the Spawner prefab are as expected",
+ "Unexpectedly found instances with the Spawner prefab hidden"
)
- blender_slice_created = (
- "Blender slice created successfully",
- "Failed to create Blender slice"
+ blender_prefab_created = (
+ "Blender prefab created successfully",
+ "Failed to create Blender prefab"
)
@@ -43,81 +43,76 @@ def SpawnerSlices_SliceCreationAndVisibilityToggleWorks():
import azlmbr.math as math
import azlmbr.legacy.general as general
- import azlmbr.slice as slice
import azlmbr.bus as bus
import azlmbr.editor as editor
- import azlmbr.asset as asset
import editor_python_test_tools.hydra_editor_utils as hydra
from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg
+ from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper
-
- def path_is_valid_asset(asset_path):
- asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", asset_path, math.Uuid(), False)
- return asset_id.invoke("IsValid")
+ from editor_python_test_tools.prefab_utils import Prefab
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(512.0, 480.0, 38.0)
- # 2) C2627900 Verifies if a slice containing the Vegetation Layer Spawner component can be created.
+ # 2) Verifies if a prefab containing the Vegetation Layer Spawner component can be created.
# 2.1) Create basic vegetation entity
position = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- veg_1 = dynveg.create_dynamic_slice_vegetation_area("vegetation_1", position, 16.0, 16.0, 16.0, asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "SpawnerPrefab_PinkFlower")[0]
+ veg_1 = dynveg.create_temp_prefab_vegetation_area("vegetation_1", position, 16.0, 16.0, 16.0,
+ pink_flower_prefab)
- # 2.2) Create slice from the entity
- slice_path = os.path.join("slices", "TestSlice_1.slice")
- slice.SliceRequestBus(bus.Broadcast, "CreateNewSlice", veg_1.id, slice_path)
+ # 2.2) Create prefab from the entity
+ spawner_prefab_filename = "TestPrefab_1"
+ spawner_prefab, spawner_prefab_instance = Prefab.create_prefab([veg_1], spawner_prefab_filename)
- # 2.3) Verify if the slice has been created successfully
- spawner_slice_success = helper.wait_for_condition(lambda: path_is_valid_asset(slice_path), 10.0)
- Report.result(Tests.spawner_slice_created, spawner_slice_success)
+ # Verify if prefab is created
+ Report.result(Tests.spawner_prefab_created, spawner_prefab.is_prefab_loaded(spawner_prefab_filename))
- # 3) C2627904: Hiding a slice containing the component clears any visuals from the Viewport
+ # 3) Hiding a prefab containing the component clears any visuals from the Viewport
# 3.1) Create Surface for instances to plant on
dynveg.create_surface_entity("Surface_Entity", position, 16.0, 16.0, 1.0)
- # 3.2) Initially verify instance count before hiding slice
+ # 3.2) Initially verify instance count before hiding prefab
initial_count_success = helper.wait_for_condition(lambda: dynveg.validate_instance_count(position, 16.0, 400), 5.0)
Report.result(Tests.instance_count_unhidden, initial_count_success)
- # 3.3) Hide the slice and verify instance count
- editor.EditorEntityAPIBus(bus.Event, "SetVisibilityState", veg_1.id, False)
+ # 3.3) Hide the prefab and verify instance count
+ editor.EditorEntityAPIBus(bus.Event, "SetVisibilityState", spawner_prefab_instance.container_entity.id, False)
hidden_instance_count = helper.wait_for_condition(lambda: dynveg.validate_instance_count(position, 16.0, 0), 5.0)
Report.result(Tests.instance_count_hidden, hidden_instance_count)
# 3.4) Unhide the slice
- editor.EditorEntityAPIBus(bus.Event, "SetVisibilityState", veg_1.id, True)
+ editor.EditorEntityAPIBus(bus.Event, "SetVisibilityState", spawner_prefab_instance.container_entity.id, True)
- # 4) C2627905 A slice containing the Vegetation Layer Blender component can be created.
+ # 4) A slice containing the Vegetation Layer Blender component can be created.
# 4.1) Create another vegetation entity to add to blender component
- veg_2 = dynveg.create_dynamic_slice_vegetation_area("vegetation_2", position, 1.0, 1.0, 1.0, "")
+ veg_2 = dynveg.create_empty_vegetation_area("vegetation_2", position, 1.0, 1.0, 1.0)
# 4.2) Create entity with Vegetation Layer Blender
components_to_add = ["Box Shape", "Vegetation Layer Blender"]
- blender_entity = hydra.Entity("blender_entity")
- blender_entity.create_entity(position, components_to_add)
+ blender_entity = EditorEntity.create_editor_entity("blender_entity")
+ blender_entity.add_components(components_to_add)
# 4.3) Pin both the vegetation areas to the blender entity
- pte = hydra.get_property_tree(blender_entity.components[1])
+ pte = blender_entity.components[1].get_property_tree()
path = "Configuration|Vegetation Areas"
pte.update_container_item(path, 0, veg_1.id)
pte.add_container_item(path, 1, veg_2.id)
# 4.4) Drag the simple vegetation areas under the Vegetation Layer Blender entity to create an entity hierarchy.
veg_1.set_test_parent_entity(blender_entity)
- veg_2.set_test_parent_entity(blender_entity)
+ veg_2.set_parent_entity(blender_entity.id)
- # 4.5) Create slice from blender entity
- slice_path = os.path.join("slices", "TestSlice_2.slice")
- slice.SliceRequestBus(bus.Broadcast, "CreateNewSlice", blender_entity.id, slice_path)
+ # 4.5) Create prefab from blender entity
+ blender_prefab_filename = "TestPrefab_2"
+ blender_prefab, blender_prefab_instance = Prefab.create_prefab([veg_2], blender_prefab_filename)
- # 4.6) Verify if the slice has been created successfully
- blender_slice_success = helper.wait_for_condition(lambda: path_is_valid_asset(slice_path), 5.0)
- Report.result(Tests.blender_slice_created, blender_slice_success)
+ # 4.6) Verify if the prefab has been created successfully
+ Report.result(Tests.blender_prefab_created, blender_prefab.is_prefab_loaded(blender_prefab_filename))
if __name__ == "__main__":
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceDataRefreshes_RemainsStable.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceDataRefreshes_RemainsStable.py
index 1ad4f305c3..3612e03bcc 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceDataRefreshes_RemainsStable.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceDataRefreshes_RemainsStable.py
@@ -34,13 +34,12 @@ def SurfaceDataRefreshes_RemainsStable():
import azlmbr.legacy.general as general
import azlmbr.math as math
+ import editor_python_test_tools.hydra_editor_utils as hydra
from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
world_center = math.Vector3(512.0, 512.0, 32.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilterOverrides_MultipleDescriptorOverridesPlantAsExpected.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilterOverrides_MultipleDescriptorOverridesPlantAsExpected.py
index 3e76a03c53..b98b0f0546 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilterOverrides_MultipleDescriptorOverridesPlantAsExpected.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilterOverrides_MultipleDescriptorOverridesPlantAsExpected.py
@@ -67,8 +67,7 @@ def SurfaceMaskFilterOverrides_MultipleDescriptorOverridesPlantAsExpected():
surface_data.SurfaceTag("test_tag3")]
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Set view of planting area for visual debugging
general.set_current_view_position(512.0, 500.0, 38.0)
@@ -76,9 +75,10 @@ def SurfaceMaskFilterOverrides_MultipleDescriptorOverridesPlantAsExpected():
# 2) Create a new instance spawner entity with multiple Dynamic Slice Instance Spawner descriptors
spawner_center_point = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0, 16.0,
- asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "SurfaceMaskOverrides_PinkFlower")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", spawner_center_point, 16.0, 16.0,
+ 16.0, pink_flower_prefab)
asset_list_component = spawner_entity.components[2]
desc_asset = hydra.get_component_property_value(asset_list_component,
"Configuration|Embedded Assets")[0]
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_BasicSurfaceTagCreation.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_BasicSurfaceTagCreation.py
index fee62c04d1..fe17b03c6f 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_BasicSurfaceTagCreation.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_BasicSurfaceTagCreation.py
@@ -39,12 +39,12 @@ def SurfaceMaskFilter_BasicSurfaceTagCreation():
"""
import azlmbr.surface_data as surface_data
+
+ import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
tag1 = surface_data.SurfaceTag()
tag2 = surface_data.SurfaceTag()
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_ExclusionList.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_ExclusionList.py
index 3f298e793e..f5174af3bb 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_ExclusionList.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_ExclusionList.py
@@ -91,18 +91,16 @@ def SurfaceMaskFilter_ExclusionList():
Report.info(f"Failed to add Generated surface tag of {surface_tag}")
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(512.0, 480.0, 38.0)
# 2) Create entity with components "Vegetation Layer Spawner", "Vegetation Asset List", "Box Shape"
entity_position = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PurpleFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner",
- entity_position,
- 10.0, 10.0, 10.0,
- asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "SurfaceMaskTagExclusion_PinkFlower")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", entity_position, 10.0, 10.0, 10.0,
+ pink_flower_prefab)
# 3) Add a Vegetation Surface Mask Filter component to the entity.
spawner_entity.add_component("Vegetation Surface Mask Filter")
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_InclusionList.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_InclusionList.py
index 39b72ff4a9..34d22d3d9b 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_InclusionList.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SurfaceMaskFilter_InclusionList.py
@@ -92,18 +92,16 @@ def SurfaceMaskFilter_InclusionList():
Report.info(f"Failed to add Generated surface tag of {surface_tag}")
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(512.0, 480.0, 38.0)
# 2) Create entity with components "Vegetation Layer Spawner", "Vegetation Asset List", "Box Shape"
entity_position = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PurpleFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Instance Spawner",
- entity_position,
- 10.0, 10.0, 10.0,
- asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "SurfaceMaskTagInclusion_PinkFlower")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", entity_position, 10.0, 10.0, 10.0,
+ pink_flower_prefab)
# 3) Add a Vegetation Surface Mask Filter component to the entity.
spawner_entity.add_component("Vegetation Surface Mask Filter")
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SystemSettings_SectorPointDensity.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SystemSettings_SectorPointDensity.py
index 167fb8901c..7516bfb31d 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SystemSettings_SectorPointDensity.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SystemSettings_SectorPointDensity.py
@@ -47,15 +47,16 @@ def SystemSettings_SectorPointDensity():
INSTANCE_COUNT_AFTER_DENSITY_CHANGE = 100
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(512.0, 480.0, 38.0)
# Create basic vegetation entity
position = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- dynveg.create_dynamic_slice_vegetation_area("vegetation", position, 16.0, 16.0, 1.0, asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "SectorPoint_PinkFlower")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", position, 16.0, 16.0, 1.0,
+ pink_flower_prefab)
dynveg.create_surface_entity("Surface_Entity", position, 16.0, 16.0, 1.0)
# Count the number of vegetation instances in the vegetation area
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SystemSettings_SectorSize.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SystemSettings_SectorSize.py
index 7bb78ac3e0..ef7959a3e7 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SystemSettings_SectorSize.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/SystemSettings_SectorSize.py
@@ -43,15 +43,16 @@ def SystemSettings_SectorSize():
VEGETATION_INSTANCE_COUNT = 400
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
general.set_current_view_position(512.0, 480.0, 38.0)
# Create basic vegetation entity
position = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PinkFlower.dynamicslice")
- vegetation = dynveg.create_dynamic_slice_vegetation_area("vegetation", position, 16.0, 16.0, 1.0, asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "SectorSize_PinkFlower")[0]
+ vegetation = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", position, 16.0, 16.0, 1.0,
+ pink_flower_prefab)
dynveg.create_surface_entity("Surface_Entity", position, 16.0, 16.0, 1.0)
# Add the Vegetation Debugger component to the Level Inspector
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/VegetationInstances_DespawnWhenOutOfRange.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/VegetationInstances_DespawnWhenOutOfRange.py
index 8a6c4d9a17..b6069d1ef5 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/VegetationInstances_DespawnWhenOutOfRange.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/VegetationInstances_DespawnWhenOutOfRange.py
@@ -43,18 +43,20 @@ def VegetationInstances_DespawnWhenOutOfRange():
import azlmbr.legacy.general as general
import azlmbr.math as math
+ import editor_python_test_tools.hydra_editor_utils as hydra
from largeworlds.large_worlds_utils import editor_dynveg_test_helper as dynveg
from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Create vegetation layer spawner
world_center = math.Vector3(512.0, 512.0, 32.0)
- asset_path = os.path.join("Slices", "PurpleFlower.dynamicslice")
- spawner_entity = dynveg.create_dynamic_slice_vegetation_area("Spawner Instance", world_center, 16.0, 16.0, 16.0, asset_path)
+ pink_flower_asset_path = os.path.join("assets", "objects", "foliage", "grass_flower_pink.azmodel")
+ pink_flower_prefab = dynveg.create_temp_mesh_prefab(pink_flower_asset_path, "RangeDespawn_PinkFlower")[0]
+ spawner_entity = dynveg.create_temp_prefab_vegetation_area("Instance Spawner", world_center, 16.0, 16.0, 16.0,
+ pink_flower_prefab)
# Create a surface to spawn on
dynveg.create_surface_entity("Spawner Entity", world_center, 16.0, 16.0, 1.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Main.py
index 06c9c5f615..d508e390cb 100644
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Main.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Main.py
@@ -7,21 +7,171 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
import os
import pytest
-import sys
-sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../../automatedtesting_shared')
-from base import TestAutomationBase
+import ly_test_tools.environment.file_system as file_system
+from ly_test_tools.o3de.editor_test import EditorSingleTest, EditorSharedTest, EditorParallelTest, EditorTestSuite
@pytest.mark.SUITE_main
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
@pytest.mark.parametrize("project", ["AutomatedTesting"])
-class TestAutomation(TestAutomationBase):
+class TestAutomation(EditorTestSuite):
- def test_DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks(self, request, workspace, editor, launcher_platform):
+ # Helpers for test asset cleanup
+ def cleanup_test_level(self, workspace):
+ file_system.delete([os.path.join(workspace.paths.engine_root(), "AutomatedTesting", "Levels", "tmp_level")],
+ True, True)
+
+ class test_AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude(EditorSharedTest):
+ from .EditorScripts import AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude as test_module
+
+ class test_AltitudeFilter_FilterStageToggle(EditorSharedTest):
+ from .EditorScripts import AltitudeFilter_FilterStageToggle as test_module
+
+ class test_AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude(EditorSharedTest):
+ from .EditorScripts import AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude as test_module
+
+ class test_AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea(EditorSharedTest):
+ from .EditorScripts import AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea as test_module
+
+ class test_AssetWeightSelector_InstancesExpressBasedOnWeight(EditorSharedTest):
+ from .EditorScripts import AssetWeightSelector_InstancesExpressBasedOnWeight as test_module
+
+ @pytest.mark.xfail(reason="https://github.com/o3de/o3de/issues/4155")
+ class test_DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius(EditorSharedTest):
+ from .EditorScripts import DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius as test_module
+
+ @pytest.mark.xfail(reason="https://github.com/o3de/o3de/issues/4155")
+ class test_DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius(EditorSharedTest):
+ from .EditorScripts import DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius as test_module
+
+ class test_DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks(EditorSharedTest):
from .EditorScripts import DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
- def test_EmptyInstanceSpawner_EmptySpawnerWorks(self, request, workspace, editor, launcher_platform):
+ class test_EmptyInstanceSpawner_EmptySpawnerWorks(EditorSharedTest):
from .EditorScripts import EmptyInstanceSpawner_EmptySpawnerWorks as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
+
+ class test_InstanceSpawnerPriority_LayerAndSubPriority_HigherValuesPlantOverLower(EditorSharedTest):
+ from .EditorScripts import InstanceSpawnerPriority_LayerAndSubPriority as test_module
+
+ class test_LayerBlender_E2E_Editor(EditorSingleTest):
+ from .EditorScripts import LayerBlender_E2E_Editor as test_module
+
+ # Custom setup/teardown to remove test level created during test
+ def setup(self, request, workspace, editor, editor_test_results, launcher_platform):
+ TestAutomation.cleanup_test_level(self, workspace)
+
+ def teardown(self, request, workspace, editor, editor_test_results, launcher_platform):
+ TestAutomation.cleanup_test_level(self, workspace)
+
+ class test_LayerBlocker_InstancesBlockedInConfiguredArea(EditorSharedTest):
+ from .EditorScripts import LayerBlocker_InstancesBlockedInConfiguredArea as test_module
+
+ class test_LayerSpawner_FilterStageToggle(EditorSharedTest):
+ from .EditorScripts import LayerSpawner_FilterStageToggle as test_module
+
+ class test_LayerSpawner_InheritBehaviorFlag(EditorSharedTest):
+ from .EditorScripts import LayerSpawner_InheritBehaviorFlag as test_module
+
+ class test_LayerSpawner_InstancesPlantInAllSupportedShapes(EditorSharedTest):
+ from .EditorScripts import LayerSpawner_InstancesPlantInAllSupportedShapes as test_module
+
+ @pytest.mark.xfail(reason="https://github.com/o3de/o3de/issues/6549")
+ class test_LayerSpawner_InstancesRefreshUsingCorrectViewportCamera(EditorSharedTest):
+ from .EditorScripts import LayerSpawner_InstancesRefreshUsingCorrectViewportCamera as test_module
+
+ class test_MeshBlocker_InstancesBlockedByMesh(EditorSharedTest):
+ from .EditorScripts import MeshBlocker_InstancesBlockedByMesh as test_module
+
+ class test_MeshBlocker_InstancesBlockedByMeshHeightTuning(EditorSharedTest):
+ from .EditorScripts import MeshBlocker_InstancesBlockedByMeshHeightTuning as test_module
+
+ class test_MeshSurfaceTagEmitter_DependentOnMeshComponent(EditorSharedTest):
+ from .EditorScripts import MeshSurfaceTagEmitter_DependentOnMeshComponent as test_module
+
+ class test_MeshSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully(EditorSharedTest):
+ from .EditorScripts import MeshSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully as test_module
+
+ class test_PhysXColliderSurfaceTagEmitter_E2E_Editor(EditorSharedTest):
+ from .EditorScripts import PhysXColliderSurfaceTagEmitter_E2E_Editor as test_module
+
+ class test_PositionModifier_AutoSnapToSurfaceWorks(EditorSharedTest):
+ from .EditorScripts import PositionModifier_AutoSnapToSurfaceWorks as test_module
+
+ class test_PositionModifier_ComponentAndOverrides_InstancesPlantAtSpecifiedOffsets(EditorSharedTest):
+ from .EditorScripts import \
+ PositionModifier_ComponentAndOverrides_InstancesPlantAtSpecifiedOffsets as test_module
+
+ class test_PrefabInstanceSpawner_Embedded_E2E_Editor(EditorSingleTest):
+ from .EditorScripts import PrefabInstanceSpawner_Embedded_E2E as test_module
+
+ # Custom setup/teardown to remove test level created during test
+ def setup(self, request, workspace, editor, editor_test_results, launcher_platform):
+ TestAutomation.cleanup_test_level(self, workspace)
+
+ def teardown(self, request, workspace, editor, editor_test_results, launcher_platform):
+ TestAutomation.cleanup_test_level(self, workspace)
+
+ class test_PrefabInstanceSpawner_External_E2E_Editor(EditorSingleTest):
+ from .EditorScripts import PrefabInstanceSpawner_External_E2E as test_module
+
+ # Custom setup/teardown to remove test level created during test
+ def setup(self, request, workspace, editor, editor_test_results, launcher_platform):
+ TestAutomation.cleanup_test_level(self, workspace)
+
+ def teardown(self, request, workspace, editor, editor_test_results, launcher_platform):
+ TestAutomation.cleanup_test_level(self, workspace)
+
+ class test_RotationModifier_InstancesRotateWithinRange(EditorSharedTest):
+ from .EditorScripts import RotationModifier_InstancesRotateWithinRange as test_module
+
+ class test_RotationModifierOverrides_InstancesRotateWithinRange(EditorSharedTest):
+ from .EditorScripts import RotationModifierOverrides_InstancesRotateWithinRange as test_module
+
+ class test_ScaleModifier_InstancesProperlyScale(EditorSharedTest):
+ from .EditorScripts import ScaleModifier_InstancesProperlyScale as test_module
+
+ class test_ScaleModifierOverrides_InstancesProperlyScale(EditorSharedTest):
+ from .EditorScripts import ScaleModifierOverrides_InstancesProperlyScale as test_module
+
+ class test_ShapeIntersectionFilter_FilterStageToggle(EditorSharedTest):
+ from .EditorScripts import ShapeIntersectionFilter_FilterStageToggle as test_module
+
+ class test_ShapeIntersectionFilter_InstancesPlantInAssignedShape(EditorSharedTest):
+ from .EditorScripts import ShapeIntersectionFilter_InstancesPlantInAssignedShape as test_module
+
+ class test_SlopeAlignmentModifier_InstanceSurfaceAlignment(EditorSharedTest):
+ from .EditorScripts import SlopeAlignmentModifier_InstanceSurfaceAlignment as test_module
+
+ class test_SlopeAlignmentModifierOverrides_InstanceSurfaceAlignment(EditorSharedTest):
+ from .EditorScripts import SlopeAlignmentModifierOverrides_InstanceSurfaceAlignment as test_module
+
+ class test_SlopeFilter_ComponentAndOverrides_InstancesPlantOnValidSlopes(EditorSharedTest):
+ from .EditorScripts import SlopeFilter_ComponentAndOverrides_InstancesPlantOnValidSlope as test_module
+
+ class test_SpawnerPrefabs_PrefabCreationAndVisibilityToggleWorks(EditorSharedTest):
+ from .EditorScripts import SpawnerPrefabs_PrefabCreationAndVisibilityToggleWorks as test_module
+
+ class test_SurfaceDataRefreshes_RemainsStable(EditorSharedTest):
+ from .EditorScripts import SurfaceDataRefreshes_RemainsStable as test_module
+
+ class test_SurfaceMaskFilter_BasicSurfaceTagCreation(EditorSharedTest):
+ from .EditorScripts import SurfaceMaskFilter_BasicSurfaceTagCreation as test_module
+
+ class test_SurfaceMaskFilter_ExclusiveSurfaceTags_Function(EditorSharedTest):
+ from .EditorScripts import SurfaceMaskFilter_ExclusionList as test_module
+
+ class test_SurfaceMaskFilter_InclusiveSurfaceTags_Function(EditorSharedTest):
+ from .EditorScripts import SurfaceMaskFilter_InclusionList as test_module
+
+ class test_SurfaceMaskFilterOverrides_MultipleDescriptorOverridesPlantAsExpected(EditorSharedTest):
+ from .EditorScripts import SurfaceMaskFilterOverrides_MultipleDescriptorOverridesPlantAsExpected as test_module
+
+ class test_SystemSettings_SectorPointDensity(EditorSharedTest):
+ from .EditorScripts import SystemSettings_SectorPointDensity as test_module
+
+ class test_SystemSettings_SectorSize(EditorSharedTest):
+ from .EditorScripts import SystemSettings_SectorSize as test_module
+
+ class test_VegetationInstances_DespawnWhenOutOfRange(EditorSharedTest):
+ from .EditorScripts import VegetationInstances_DespawnWhenOutOfRange as test_module
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Main_Optimized.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Main_Optimized.py
deleted file mode 100644
index 5b1e504442..0000000000
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Main_Optimized.py
+++ /dev/null
@@ -1,192 +0,0 @@
-"""
-Copyright (c) Contributors to the Open 3D Engine Project.
-For complete copyright and license terms please see the LICENSE at the root of this distribution.
-
-SPDX-License-Identifier: Apache-2.0 OR MIT
-"""
-
-import os
-import pytest
-
-import ly_test_tools.environment.file_system as file_system
-from ly_test_tools.o3de.editor_test import EditorSingleTest, EditorSharedTest, EditorParallelTest, EditorTestSuite
-
-
-@pytest.mark.SUITE_main
-@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
-@pytest.mark.parametrize("project", ["AutomatedTesting"])
-class TestAutomation(EditorTestSuite):
- class test_AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude(EditorParallelTest):
- from .EditorScripts import AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude as test_module
-
- class test_AltitudeFilter_FilterStageToggle(EditorParallelTest):
- from .EditorScripts import AltitudeFilter_FilterStageToggle as test_module
-
- class test_AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude(EditorParallelTest):
- from .EditorScripts import AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude as test_module
-
-
-@pytest.mark.SUITE_main
-@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
-@pytest.mark.parametrize("project", ["AutomatedTesting"])
-class TestAutomation_PrefabNotEnabled(EditorTestSuite):
-
- enable_prefab_system = False
-
- # Helpers for test asset cleanup
- def cleanup_test_level(self, workspace):
- file_system.delete([os.path.join(workspace.paths.engine_root(), "AutomatedTesting", "Levels", "tmp_level")],
- True, True)
-
- def cleanup_test_slices(self, workspace):
- file_system.delete([os.path.join(workspace.paths.engine_root(), "AutomatedTesting", "slices",
- "TestSlice_1.slice")], True, True)
- file_system.delete([os.path.join(workspace.paths.engine_root(), "AutomatedTesting", "slices",
- "TestSlice_2.slice")], True, True)
-
- class test_DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks(EditorParallelTest):
- from .EditorScripts import DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks as test_module
-
- class test_EmptyInstanceSpawner_EmptySpawnerWorks(EditorParallelTest):
- from .EditorScripts import EmptyInstanceSpawner_EmptySpawnerWorks as test_module
-
- class test_SpawnerSlices_SliceCreationAndVisibilityToggleWorks(EditorSingleTest):
- # Custom teardown to remove slice asset created during test
- def teardown(self, request, workspace, editor, editor_test_results, launcher_platform):
- TestAutomation_PrefabNotEnabled.cleanup_test_slices(self, workspace)
- from .EditorScripts import SpawnerSlices_SliceCreationAndVisibilityToggleWorks as test_module
-
- class test_AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea(EditorParallelTest):
- from .EditorScripts import AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea as test_module
-
- class test_AssetWeightSelector_InstancesExpressBasedOnWeight(EditorParallelTest):
- from .EditorScripts import AssetWeightSelector_InstancesExpressBasedOnWeight as test_module
-
- @pytest.mark.skip(reason="https://github.com/o3de/o3de/issues/4155")
- class test_DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius(EditorParallelTest):
- from .EditorScripts import DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius as test_module
-
- @pytest.mark.skip(reason="https://github.com/o3de/o3de/issues/4155")
- class test_DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius(EditorParallelTest):
- from .EditorScripts import DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius as test_module
-
- class test_SurfaceDataRefreshes_RemainsStable(EditorParallelTest):
- from .EditorScripts import SurfaceDataRefreshes_RemainsStable as test_module
-
- class test_VegetationInstances_DespawnWhenOutOfRange(EditorParallelTest):
- from .EditorScripts import VegetationInstances_DespawnWhenOutOfRange as test_module
-
- class test_InstanceSpawnerPriority_LayerAndSubPriority_HigherValuesPlantOverLower(EditorParallelTest):
- from .EditorScripts import InstanceSpawnerPriority_LayerAndSubPriority as test_module
-
- class test_LayerBlocker_InstancesBlockedInConfiguredArea(EditorParallelTest):
- from .EditorScripts import LayerBlocker_InstancesBlockedInConfiguredArea as test_module
-
- class test_LayerSpawner_InheritBehaviorFlag(EditorParallelTest):
- from .EditorScripts import LayerSpawner_InheritBehaviorFlag as test_module
-
- class test_LayerSpawner_InstancesPlantInAllSupportedShapes(EditorParallelTest):
- from .EditorScripts import LayerSpawner_InstancesPlantInAllSupportedShapes as test_module
-
- class test_LayerSpawner_FilterStageToggle(EditorParallelTest):
- from .EditorScripts import LayerSpawner_FilterStageToggle as test_module
-
- @pytest.mark.xfail(reason="https://github.com/o3de/o3de/issues/2038")
- class test_LayerSpawner_InstancesRefreshUsingCorrectViewportCamera(EditorParallelTest):
- from .EditorScripts import LayerSpawner_InstancesRefreshUsingCorrectViewportCamera as test_module
-
- class test_MeshBlocker_InstancesBlockedByMesh(EditorParallelTest):
- from .EditorScripts import MeshBlocker_InstancesBlockedByMesh as test_module
-
- class test_MeshBlocker_InstancesBlockedByMeshHeightTuning(EditorParallelTest):
- from .EditorScripts import MeshBlocker_InstancesBlockedByMeshHeightTuning as test_module
-
- class test_MeshSurfaceTagEmitter_DependentOnMeshComponent(EditorParallelTest):
- from .EditorScripts import MeshSurfaceTagEmitter_DependentOnMeshComponent as test_module
-
- class test_MeshSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully(EditorParallelTest):
- from .EditorScripts import MeshSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully as test_module
-
- class test_PhysXColliderSurfaceTagEmitter_E2E_Editor(EditorParallelTest):
- from .EditorScripts import PhysXColliderSurfaceTagEmitter_E2E_Editor as test_module
-
- class test_PositionModifier_ComponentAndOverrides_InstancesPlantAtSpecifiedOffsets(EditorParallelTest):
- from .EditorScripts import PositionModifier_ComponentAndOverrides_InstancesPlantAtSpecifiedOffsets as test_module
-
- class test_PositionModifier_AutoSnapToSurfaceWorks(EditorParallelTest):
- from .EditorScripts import PositionModifier_AutoSnapToSurfaceWorks as test_module
-
- class test_RotationModifier_InstancesRotateWithinRange(EditorParallelTest):
- from .EditorScripts import RotationModifier_InstancesRotateWithinRange as test_module
-
- class test_RotationModifierOverrides_InstancesRotateWithinRange(EditorParallelTest):
- from .EditorScripts import RotationModifierOverrides_InstancesRotateWithinRange as test_module
-
- class test_ScaleModifier_InstancesProperlyScale(EditorParallelTest):
- from .EditorScripts import ScaleModifier_InstancesProperlyScale as test_module
-
- class test_ScaleModifierOverrides_InstancesProperlyScale(EditorParallelTest):
- from .EditorScripts import ScaleModifierOverrides_InstancesProperlyScale as test_module
-
- class test_ShapeIntersectionFilter_InstancesPlantInAssignedShape(EditorParallelTest):
- from .EditorScripts import ShapeIntersectionFilter_InstancesPlantInAssignedShape as test_module
-
- class test_ShapeIntersectionFilter_FilterStageToggle(EditorParallelTest):
- from .EditorScripts import ShapeIntersectionFilter_FilterStageToggle as test_module
-
- class test_SlopeAlignmentModifier_InstanceSurfaceAlignment(EditorParallelTest):
- from .EditorScripts import SlopeAlignmentModifier_InstanceSurfaceAlignment as test_module
-
- class test_SlopeAlignmentModifierOverrides_InstanceSurfaceAlignment(EditorParallelTest):
- from .EditorScripts import SlopeAlignmentModifierOverrides_InstanceSurfaceAlignment as test_module
-
- class test_SurfaceMaskFilter_BasicSurfaceTagCreation(EditorParallelTest):
- from .EditorScripts import SurfaceMaskFilter_BasicSurfaceTagCreation as test_module
-
- class test_SurfaceMaskFilter_ExclusiveSurfaceTags_Function(EditorParallelTest):
- from .EditorScripts import SurfaceMaskFilter_ExclusionList as test_module
-
- class test_SurfaceMaskFilter_InclusiveSurfaceTags_Function(EditorParallelTest):
- from .EditorScripts import SurfaceMaskFilter_InclusionList as test_module
-
- class test_SurfaceMaskFilterOverrides_MultipleDescriptorOverridesPlantAsExpected(EditorParallelTest):
- from .EditorScripts import SurfaceMaskFilterOverrides_MultipleDescriptorOverridesPlantAsExpected as test_module
-
- class test_SystemSettings_SectorPointDensity(EditorParallelTest):
- from .EditorScripts import SystemSettings_SectorPointDensity as test_module
-
- class test_SystemSettings_SectorSize(EditorParallelTest):
- from .EditorScripts import SystemSettings_SectorSize as test_module
-
- class test_SlopeFilter_ComponentAndOverrides_InstancesPlantOnValidSlopes(EditorParallelTest):
- from .EditorScripts import SlopeFilter_ComponentAndOverrides_InstancesPlantOnValidSlope as test_module
-
- class test_DynamicSliceInstanceSpawner_Embedded_E2E_Editor(EditorSingleTest):
- from .EditorScripts import DynamicSliceInstanceSpawner_Embedded_E2E as test_module
-
- # Custom setup/teardown to remove test level created during test
- def setup(self, request, workspace, editor, editor_test_results, launcher_platform):
- TestAutomation_PrefabNotEnabled.cleanup_test_level(self, workspace)
-
- def teardown(self, request, workspace, editor, editor_test_results, launcher_platform):
- TestAutomation_PrefabNotEnabled.cleanup_test_level(self, workspace)
-
- class test_DynamicSliceInstanceSpawner_External_E2E_Editor(EditorSingleTest):
- from .EditorScripts import DynamicSliceInstanceSpawner_External_E2E as test_module
-
- # Custom setup/teardown to remove test level created during test
- def setup(self, request, workspace, editor, editor_test_results, launcher_platform):
- TestAutomation_PrefabNotEnabled.cleanup_test_level(self, workspace)
-
- def teardown(self, request, workspace, editor, editor_test_results, launcher_platform):
- TestAutomation_PrefabNotEnabled.cleanup_test_level(self, workspace)
-
- class test_LayerBlender_E2E_Editor(EditorSingleTest):
- from .EditorScripts import LayerBlender_E2E_Editor as test_module
-
- # Custom setup/teardown to remove test level created during test
- def setup(self, request, workspace, editor, editor_test_results, launcher_platform):
- TestAutomation_PrefabNotEnabled.cleanup_test_level(self, workspace)
-
- def teardown(self, request, workspace, editor, editor_test_results, launcher_platform):
- TestAutomation_PrefabNotEnabled.cleanup_test_level(self, workspace)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Periodic.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Periodic.py
index 64f6cfdf30..bf7e76f973 100644
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Periodic.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Periodic.py
@@ -7,277 +7,17 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
import os
import pytest
-import sys
-import ly_test_tools.environment.waiter as waiter
import ly_test_tools.environment.file_system as file_system
-import editor_python_test_tools.hydra_test_utils as hydra
-from ly_remote_console.remote_console_commands import RemoteConsole as RemoteConsole
-
-sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../../automatedtesting_shared')
-from base import TestAutomationBase
-
-
-@pytest.fixture
-def remove_test_slice(request, workspace, project):
- file_system.delete([os.path.join(workspace.paths.engine_root(), project, "slices", "TestSlice_1.slice")], True,
- True)
- file_system.delete([os.path.join(workspace.paths.engine_root(), project, "slices", "TestSlice_2.slice")], True,
- True)
-
- def teardown():
- file_system.delete([os.path.join(workspace.paths.engine_root(), project, "slices", "TestSlice_1.slice")], True,
- True)
- file_system.delete([os.path.join(workspace.paths.engine_root(), project, "slices", "TestSlice_2.slice")], True,
- True)
- request.addfinalizer(teardown)
-
-
-@pytest.fixture
-def remote_console_instance(request):
- console = RemoteConsole()
-
- def teardown():
- if console.connected:
- console.stop()
-
- request.addfinalizer(teardown)
- return console
+from ly_test_tools.o3de.editor_test import EditorSingleTest, EditorSharedTest, EditorParallelTest, EditorTestSuite
@pytest.mark.SUITE_periodic
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
@pytest.mark.parametrize("project", ["AutomatedTesting"])
-class TestAutomation(TestAutomationBase):
+class TestAutomation(EditorTestSuite):
- def test_AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import AltitudeFilter_ComponentAndOverrides_InstancesPlantAtSpecifiedAltitude as test_module
- self._run_test(request, workspace, editor, test_module)
+ global_extra_cmdline_args = ["-BatchMode", "-autotest_mode"]
- def test_AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import AltitudeFilter_ShapeSample_InstancesPlantAtSpecifiedAltitude as test_module
- self._run_test(request, workspace, editor, test_module)
-
- def test_AltitudeFilter_FilterStageToggle(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import AltitudeFilter_FilterStageToggle as test_module
- self._run_test(request, workspace, editor, test_module)
-
- def test_SpawnerSlices_SliceCreationAndVisibilityToggleWorks(self, request, workspace, editor, remove_test_slice, launcher_platform):
- from .EditorScripts import SpawnerSlices_SliceCreationAndVisibilityToggleWorks as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import AssetListCombiner_CombinedDescriptorsExpressInConfiguredArea as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_AssetWeightSelector_InstancesExpressBasedOnWeight(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import AssetWeightSelector_InstancesExpressBasedOnWeight as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- @pytest.mark.xfail(reason="https://github.com/o3de/o3de/issues/4155")
- def test_DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- @pytest.mark.xfail(reason="https://github.com/o3de/o3de/issues/4155")
- def test_DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_SurfaceDataRefreshes_RemainsStable(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import SurfaceDataRefreshes_RemainsStable as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_VegetationInstances_DespawnWhenOutOfRange(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import VegetationInstances_DespawnWhenOutOfRange as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_InstanceSpawnerPriority_LayerAndSubPriority_HigherValuesPlantOverLower(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import InstanceSpawnerPriority_LayerAndSubPriority as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LayerBlocker_InstancesBlockedInConfiguredArea(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import LayerBlocker_InstancesBlockedInConfiguredArea as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LayerSpawner_InheritBehaviorFlag(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import LayerSpawner_InheritBehaviorFlag as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LayerSpawner_InstancesPlantInAllSupportedShapes(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import LayerSpawner_InstancesPlantInAllSupportedShapes as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LayerSpawner_FilterStageToggle(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import LayerSpawner_FilterStageToggle as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- @pytest.mark.xfail(reason="https://github.com/o3de/o3de/issues/2038")
- def test_LayerSpawner_InstancesRefreshUsingCorrectViewportCamera(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import LayerSpawner_InstancesRefreshUsingCorrectViewportCamera as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_MeshBlocker_InstancesBlockedByMesh(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import MeshBlocker_InstancesBlockedByMesh as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_MeshBlocker_InstancesBlockedByMeshHeightTuning(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import MeshBlocker_InstancesBlockedByMeshHeightTuning as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_MeshSurfaceTagEmitter_DependentOnMeshComponent(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import MeshSurfaceTagEmitter_DependentOnMeshComponent as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_MeshSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import MeshSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_PhysXColliderSurfaceTagEmitter_E2E_Editor(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import PhysXColliderSurfaceTagEmitter_E2E_Editor as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_PositionModifier_ComponentAndOverrides_InstancesPlantAtSpecifiedOffsets(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import PositionModifier_ComponentAndOverrides_InstancesPlantAtSpecifiedOffsets as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_PositionModifier_AutoSnapToSurfaceWorks(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import PositionModifier_AutoSnapToSurfaceWorks as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_RotationModifier_InstancesRotateWithinRange(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import RotationModifier_InstancesRotateWithinRange as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_RotationModifierOverrides_InstancesRotateWithinRange(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import RotationModifierOverrides_InstancesRotateWithinRange as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_ScaleModifier_InstancesProperlyScale(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import ScaleModifier_InstancesProperlyScale as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_ScaleModifierOverrides_InstancesProperlyScale(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import ScaleModifierOverrides_InstancesProperlyScale as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_ShapeIntersectionFilter_InstancesPlantInAssignedShape(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import ShapeIntersectionFilter_InstancesPlantInAssignedShape as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_ShapeIntersectionFilter_FilterStageToggle(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import ShapeIntersectionFilter_FilterStageToggle as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_SlopeAlignmentModifier_InstanceSurfaceAlignment(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import SlopeAlignmentModifier_InstanceSurfaceAlignment as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_SlopeAlignmentModifierOverrides_InstanceSurfaceAlignment(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import SlopeAlignmentModifierOverrides_InstanceSurfaceAlignment as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_SurfaceMaskFilter_BasicSurfaceTagCreation(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import SurfaceMaskFilter_BasicSurfaceTagCreation as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_SurfaceMaskFilter_ExclusiveSurfaceTags_Function(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import SurfaceMaskFilter_ExclusionList as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_SurfaceMaskFilter_InclusiveSurfaceTags_Function(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import SurfaceMaskFilter_InclusionList as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_SurfaceMaskFilterOverrides_MultipleDescriptorOverridesPlantAsExpected(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import SurfaceMaskFilterOverrides_MultipleDescriptorOverridesPlantAsExpected as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_SystemSettings_SectorPointDensity(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import SystemSettings_SectorPointDensity as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_SystemSettings_SectorSize(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import SystemSettings_SectorSize as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_SlopeFilter_ComponentAndOverrides_InstancesPlantOnValidSlopes(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import SlopeFilter_ComponentAndOverrides_InstancesPlantOnValidSlope as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
-
-@pytest.mark.SUITE_periodic
-@pytest.mark.parametrize("project", ["AutomatedTesting"])
-@pytest.mark.parametrize("level", ["tmp_level"])
-class TestAutomationE2E(TestAutomationBase):
-
- # The following tests must run in order, please do not move tests out of order
-
- @pytest.mark.parametrize("launcher_platform", ['windows_editor'])
- def test_DynamicSliceInstanceSpawner_Embedded_E2E_Editor(self, request, workspace, project, level, editor, launcher_platform):
- # Ensure our test level does not already exist
- file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
-
- from .EditorScripts import DynamicSliceInstanceSpawner_Embedded_E2E as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- @pytest.mark.parametrize("launcher_platform", ['windows'])
- def test_DynamicSliceInstanceSpawner_Embedded_E2E_Launcher(self, workspace, launcher, level,
- remote_console_instance, project, launcher_platform):
-
- expected_lines = [
- "Instances found in area = 400"
- ]
-
- hydra.launch_and_validate_results_launcher(launcher, level, remote_console_instance, expected_lines, launch_ap=False)
-
- # Cleanup our temp level
- file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
-
- @pytest.mark.parametrize("launcher_platform", ['windows_editor'])
- def test_DynamicSliceInstanceSpawner_External_E2E_Editor(self, request, workspace, project, level, editor, launcher_platform):
- # Ensure our test level does not already exist
- file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
-
- from .EditorScripts import DynamicSliceInstanceSpawner_External_E2E as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- @pytest.mark.parametrize("launcher_platform", ['windows'])
- def test_DynamicSliceInstanceSpawner_External_E2E_Launcher(self, workspace, launcher, level,
- remote_console_instance, project, launcher_platform):
-
- expected_lines = [
- "Instances found in area = 400"
- ]
-
- hydra.launch_and_validate_results_launcher(launcher, level, remote_console_instance, expected_lines, launch_ap=False)
-
- # Cleanup our temp level
- file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
-
- @pytest.mark.parametrize("launcher_platform", ['windows_editor'])
- def test_LayerBlender_E2E_Editor(self, request, workspace, project, level, editor, launcher_platform):
- # Ensure our test level does not already exist
- file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
-
- from .EditorScripts import LayerBlender_E2E_Editor as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- @pytest.mark.parametrize("launcher_platform", ['windows'])
- @pytest.mark.xfail(reason="https://github.com/o3de/o3de/issues/4170")
- def test_LayerBlender_E2E_Launcher(self, workspace, launcher, level,
- remote_console_instance, project, launcher_platform):
-
- launcher.args.extend(["-rhi=Null"])
- launcher.start(launch_ap=False)
- assert launcher.is_alive(), "Launcher failed to start"
-
- # Wait for test script to quit the launcher. If wait_for returns exc, test was not successful
- waiter.wait_for(lambda: not launcher.is_alive(), timeout=300)
-
- # Verify launcher quit successfully and did not crash
- ret_code = launcher.get_returncode()
- assert ret_code == 0, "Test failed. See Game.log for details"
-
- # Cleanup our temp level
- file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
+ class test_DynVegUtils_TempPrefabCreationWorks(EditorSharedTest):
+ from .EditorScripts import DynVegUtils_TempPrefabCreationWorks as test_module
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Periodic_Optimized.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Periodic_Optimized.py
deleted file mode 100644
index f87d6567ef..0000000000
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/TestSuite_Periodic_Optimized.py
+++ /dev/null
@@ -1,23 +0,0 @@
-"""
-Copyright (c) Contributors to the Open 3D Engine Project.
-For complete copyright and license terms please see the LICENSE at the root of this distribution.
-
-SPDX-License-Identifier: Apache-2.0 OR MIT
-"""
-
-import os
-import pytest
-
-import ly_test_tools.environment.file_system as file_system
-from ly_test_tools.o3de.editor_test import EditorSingleTest, EditorSharedTest, EditorParallelTest, EditorTestSuite
-
-
-@pytest.mark.SUITE_main
-@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
-@pytest.mark.parametrize("project", ["AutomatedTesting"])
-class TestAutomation(EditorTestSuite):
-
- global_extra_cmdline_args = ["-BatchMode", "-autotest_mode"]
-
- class test_DynVegUtils_TempPrefabCreationWorks(EditorSharedTest):
- from .EditorScripts import DynVegUtils_TempPrefabCreationWorks as test_module
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientGenerators_Incompatibilities.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientGenerators_Incompatibilities.py
index 09cd760647..6979ff1dee 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientGenerators_Incompatibilities.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientGenerators_Incompatibilities.py
@@ -65,8 +65,7 @@ def GradientGenerators_Incompatibilities():
}
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# For every gradient generator component, verify that they are incompatible
# which each vegetation area component
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientModifiers_Incompatibilities.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientModifiers_Incompatibilities.py
index a4d9181744..962a0004f9 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientModifiers_Incompatibilities.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientModifiers_Incompatibilities.py
@@ -74,8 +74,7 @@ def GradientModifiers_Incompatibilities():
}
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# For every gradient modifier component, verify that they are incompatible
# which each vegetation area and gradient generator/modifier component
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin.py
index 3749f93bf5..87f9e1a9b1 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin.py
@@ -86,8 +86,7 @@ def GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin():
return entity
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# 2) Create entity with Random Noise gradient and verify gradient position after clearing pinned entity
clear_entityid_check_position(
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_DefaultPinnedEntityIsSelf.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_DefaultPinnedEntityIsSelf.py
index 3756452710..cd3fd7e1ee 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_DefaultPinnedEntityIsSelf.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientPreviewSettings_DefaultPinnedEntityIsSelf.py
@@ -90,8 +90,7 @@ def GradientPreviewSettings_DefaultPinnedEntityIsSelf():
]
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
for param in param_list:
execute_test(param.required_components[param.accessed_component],
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSampling_GradientReferencesAddRemoveSuccessfully.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSampling_GradientReferencesAddRemoveSuccessfully.py
index 8e85345a6f..f2980d9634 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSampling_GradientReferencesAddRemoveSuccessfully.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSampling_GradientReferencesAddRemoveSuccessfully.py
@@ -61,8 +61,7 @@ def GradientSampling_GradientReferencesAddRemoveSuccessfully():
Report.result(gradient_cleared_from_modifier, entity.Equal(EntityId.EntityId()))
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# 2) Create a new entity with components "Random Noise Gradient", "Gradient Transform Modifier" and "Box Shape"
entity_position = math.Vector3(125.0, 136.0, 32.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_ComponentDependencies.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_ComponentDependencies.py
index f653515a39..0cc325efd1 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_ComponentDependencies.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_ComponentDependencies.py
@@ -42,8 +42,7 @@ def GradientSurfaceTagEmitter_ComponentDependencies():
return editor.EditorComponentAPIBus(bus.Broadcast, "IsComponentEnabled", EntityComponentIdPair)
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Create an entity with Gradient Surface Tag Emitter component
position = math.Vector3(512.0, 512.0, 32.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully.py
index 90840a135d..cf48096a31 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully.py
@@ -36,8 +36,7 @@ def GradientSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully():
from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# 2) Create an entity with Gradient Surface Tag Emitter and Reference Gradient components.
entity_position = math.Vector3(125.0, 136.0, 32.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_ComponentIncompatibleWithExpectedGradients.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_ComponentIncompatibleWithExpectedGradients.py
index 5e6df4d52f..27ef248d6c 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_ComponentIncompatibleWithExpectedGradients.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_ComponentIncompatibleWithExpectedGradients.py
@@ -46,8 +46,7 @@ def GradientTransform_ComponentIncompatibleWithExpectedGradients():
return editor.EditorComponentAPIBus(bus.Broadcast, "IsComponentEnabled", EntityComponentIdPair)
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# 2) Create a new entity with components Gradient Transform Modifier and Box Shape
entity_position = math.Vector3(125.0, 136.0, 32.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_ComponentIncompatibleWithSpawners.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_ComponentIncompatibleWithSpawners.py
index fd65996fdd..9c23cdea75 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_ComponentIncompatibleWithSpawners.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_ComponentIncompatibleWithSpawners.py
@@ -44,8 +44,7 @@ def GradientTransform_ComponentIncompatibleWithSpawners():
return editor.EditorComponentAPIBus(bus.Broadcast, "IsComponentEnabled", EntityComponentIdPair)
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# 2) Create a new entity with components Gradient Transform Modifier and Box Shape
entity_position = math.Vector3(125.0, 136.0, 32.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_FrequencyZoomCanBeSetBeyondSliderRange.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_FrequencyZoomCanBeSetBeyondSliderRange.py
index 530503db86..6d6911ff3a 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_FrequencyZoomCanBeSetBeyondSliderRange.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_FrequencyZoomCanBeSetBeyondSliderRange.py
@@ -54,8 +54,7 @@ def GradientTransform_FrequencyZoomCanBeSetBeyondSliderRange():
from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# 2) Create entity
entity_position = math.Vector3(125.0, 136.0, 32.0)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_RequiresShape.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_RequiresShape.py
index 09cce359d5..ec142f92d2 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_RequiresShape.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/GradientTransform_RequiresShape.py
@@ -47,8 +47,7 @@ def GradientTransform_RequiresShape():
from editor_python_test_tools.utils import TestHelper as helper
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Create a new Entity in the level
entity_id = editor.ToolsApplicationRequestBus(bus.Broadcast, 'CreateNewEntity', entity.EntityId())
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_ProcessedImageAssignedSuccessfully.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_ProcessedImageAssignedSuccessfully.py
index 42458665e1..afe0893da9 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_ProcessedImageAssignedSuccessfully.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_ProcessedImageAssignedSuccessfully.py
@@ -56,8 +56,7 @@ def ImageGradient_ProcessedImageAssignedSuccessfully():
from editor_python_test_tools.utils import TestHelper as helper
# 1) Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# 2) Create an entity with Image Gradient and Gradient Transform Modifier components
components_to_add = ["Image Gradient", "Gradient Transform Modifier", "Box Shape"]
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_RequiresShape.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_RequiresShape.py
index 3b832d160a..85582d198a 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_RequiresShape.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/EditorScripts/ImageGradient_RequiresShape.py
@@ -47,8 +47,7 @@ def ImageGradient_RequiresShape():
from editor_python_test_tools.utils import TestHelper as helper
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Create a new Entity in the level
entity_id = editor.ToolsApplicationRequestBus(bus.Broadcast, 'CreateNewEntity', entity.EntityId())
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/TestSuite_Periodic.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/TestSuite_Periodic.py
index 3ad27eb973..d4199c31f6 100644
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/TestSuite_Periodic.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/TestSuite_Periodic.py
@@ -5,67 +5,51 @@ For complete copyright and license terms please see the LICENSE at the root of t
SPDX-License-Identifier: Apache-2.0 OR MIT
"""
-import os
import pytest
-import sys
-sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../../automatedtesting_shared')
-from base import TestAutomationBase
+from ly_test_tools.o3de.editor_test import EditorSingleTest, EditorSharedTest, EditorParallelTest, EditorTestSuite
@pytest.mark.SUITE_periodic
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
@pytest.mark.parametrize("project", ["AutomatedTesting"])
-class TestAutomation(TestAutomationBase):
+class TestAutomation(EditorTestSuite):
- def test_GradientGenerators_Incompatibilities(self, request, workspace, editor, launcher_platform):
+ class test_GradientGenerators_Incompatibilities(EditorSharedTest):
from .EditorScripts import GradientGenerators_Incompatibilities as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
- def test_GradientModifiers_Incompatibilities(self, request, workspace, editor, launcher_platform):
+ class test_GradientModifiers_Incompatibilities(EditorSharedTest):
from .EditorScripts import GradientModifiers_Incompatibilities as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
- def test_GradientPreviewSettings_DefaultPinnedEntityIsSelf(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import GradientPreviewSettings_DefaultPinnedEntityIsSelf as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin(self, request, workspace, editor, launcher_platform):
+ class test_GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin(EditorSharedTest):
from .EditorScripts import GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
- def test_GradientSampling_GradientReferencesAddRemoveSuccessfully(self, request, workspace, editor, launcher_platform):
+ class test_GradientPreviewSettings_DefaultPinnedEntityIsSelf(EditorSharedTest):
+ from .EditorScripts import GradientPreviewSettings_DefaultPinnedEntityIsSelf as test_module
+
+ class test_GradientSampling_GradientReferencesAddRemoveSuccessfully(EditorSharedTest):
from .EditorScripts import GradientSampling_GradientReferencesAddRemoveSuccessfully as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
- def test_GradientSurfaceTagEmitter_ComponentDependencies(self, request, workspace, editor, launcher_platform):
+ class test_GradientSurfaceTagEmitter_ComponentDependencies(EditorSharedTest):
from .EditorScripts import GradientSurfaceTagEmitter_ComponentDependencies as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
- def test_GradientSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully(self, request, workspace, editor, launcher_platform):
+ class test_GradientSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully(EditorSharedTest):
from .EditorScripts import GradientSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
- def test_GradientTransform_RequiresShape(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import GradientTransform_RequiresShape as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_GradientTransform_FrequencyZoomCanBeSetBeyondSliderRange(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import GradientTransform_FrequencyZoomCanBeSetBeyondSliderRange as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_GradientTransform_ComponentIncompatibleWithSpawners(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import GradientTransform_ComponentIncompatibleWithSpawners as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_GradientTransform_ComponentIncompatibleWithExpectedGradients(self, request, workspace, editor, launcher_platform):
+ class test_GradientTransform_ComponentIncompatibleWithExpectedGradients(EditorSharedTest):
from .EditorScripts import GradientTransform_ComponentIncompatibleWithExpectedGradients as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
- def test_ImageGradient_RequiresShape(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import ImageGradient_RequiresShape as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
+ class test_GradientTransform_ComponentIncompatibleWithSpawners(EditorSharedTest):
+ from .EditorScripts import GradientTransform_ComponentIncompatibleWithSpawners as test_module
- def test_ImageGradient_ProcessedImageAssignedSuccessfully(self, request, workspace, editor, launcher_platform):
+ class test_GradientTransform_FrequencyZoomCanBeSetBeyondSliderRange(EditorSharedTest):
+ from .EditorScripts import GradientTransform_FrequencyZoomCanBeSetBeyondSliderRange as test_module
+
+ class test_GradientTransform_RequiresShape(EditorSharedTest):
+ from .EditorScripts import GradientTransform_RequiresShape as test_module
+
+ class test_ImageGradient_ProcessedImageAssignedSuccessfully(EditorSharedTest):
from .EditorScripts import ImageGradient_ProcessedImageAssignedSuccessfully as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
+
+ class test_ImageGradient_RequiresShape(EditorSharedTest):
+ from .EditorScripts import ImageGradient_RequiresShape as test_module
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/TestSuite_Periodic_Optimized.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/TestSuite_Periodic_Optimized.py
deleted file mode 100644
index 6ac0658b4d..0000000000
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/TestSuite_Periodic_Optimized.py
+++ /dev/null
@@ -1,57 +0,0 @@
-"""
-Copyright (c) Contributors to the Open 3D Engine Project.
-For complete copyright and license terms please see the LICENSE at the root of this distribution.
-
-SPDX-License-Identifier: Apache-2.0 OR MIT
-"""
-
-import pytest
-
-from ly_test_tools.o3de.editor_test import EditorSingleTest, EditorSharedTest, EditorParallelTest, EditorTestSuite
-
-
-@pytest.mark.SUITE_periodic
-@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
-@pytest.mark.parametrize("project", ["AutomatedTesting"])
-class TestAutomation(EditorTestSuite):
-
- enable_prefab_system = False
-
- class test_GradientGenerators_Incompatibilities(EditorSharedTest):
- from .EditorScripts import GradientGenerators_Incompatibilities as test_module
-
- class test_GradientModifiers_Incompatibilities(EditorSharedTest):
- from .EditorScripts import GradientModifiers_Incompatibilities as test_module
-
- class test_GradientPreviewSettings_DefaultPinnedEntityIsSelf(EditorSharedTest):
- from .EditorScripts import GradientPreviewSettings_DefaultPinnedEntityIsSelf as test_module
-
- class test_GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin(EditorSharedTest):
- from .EditorScripts import GradientPreviewSettings_ClearingPinnedEntitySetsPreviewToOrigin as test_module
-
- class test_GradientSampling_GradientReferencesAddRemoveSuccessfully(EditorSharedTest):
- from .EditorScripts import GradientSampling_GradientReferencesAddRemoveSuccessfully as test_module
-
- class test_GradientSurfaceTagEmitter_ComponentDependencies(EditorSharedTest):
- from .EditorScripts import GradientSurfaceTagEmitter_ComponentDependencies as test_module
-
- class test_GradientSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully(EditorSharedTest):
- from .EditorScripts import GradientSurfaceTagEmitter_SurfaceTagsAddRemoveSuccessfully as test_module
-
- class test_GradientTransform_RequiresShape(EditorSharedTest):
- from .EditorScripts import GradientTransform_RequiresShape as test_module
-
- class test_GradientTransform_FrequencyZoomCanBeSetBeyondSliderRange(EditorSharedTest):
- from .EditorScripts import GradientTransform_FrequencyZoomCanBeSetBeyondSliderRange as test_module
-
- class test_GradientTransform_ComponentIncompatibleWithSpawners(EditorSharedTest):
- from .EditorScripts import GradientTransform_ComponentIncompatibleWithSpawners as test_module
-
- class test_GradientTransform_ComponentIncompatibleWithExpectedGradients(EditorSharedTest):
- from .EditorScripts import GradientTransform_ComponentIncompatibleWithExpectedGradients as test_module
-
- class test_ImageGradient_RequiresShape(EditorSharedTest):
- from .EditorScripts import ImageGradient_RequiresShape as test_module
-
- class test_ImageGradient_ProcessedImageAssignedSuccessfully(EditorSharedTest):
- from .EditorScripts import ImageGradient_ProcessedImageAssignedSuccessfully as test_module
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_DependentComponentsAdded.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_DependentComponentsAdded.py
index c69ce77041..09dc6d7d0b 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_DependentComponentsAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_DependentComponentsAdded.py
@@ -68,8 +68,7 @@ def AreaNodes_DependentComponentsAdded():
newEntityId = parameters[0]
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityCreatedOnNodeAdd.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityCreatedOnNodeAdd.py
index f3f4a1862d..95294de2d2 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityCreatedOnNodeAdd.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityCreatedOnNodeAdd.py
@@ -58,7 +58,6 @@ def AreaNodes_EntityCreatedOnNodeAdd():
import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
@@ -67,8 +66,7 @@ def AreaNodes_EntityCreatedOnNodeAdd():
newEntityId = parameters[0]
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityRemovedOnNodeDelete.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityRemovedOnNodeDelete.py
index f8b0539759..4e5e75b3e1 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityRemovedOnNodeDelete.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/AreaNodes_EntityRemovedOnNodeDelete.py
@@ -59,8 +59,8 @@ def AreaNodes_EntityRemovedOnNodeDelete():
import azlmbr.math as math
import azlmbr.paths
+ import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
@@ -73,8 +73,7 @@ def AreaNodes_EntityRemovedOnNodeDelete():
deletedEntityId = parameters[0]
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ComponentUpdates_UpdateGraph.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ComponentUpdates_UpdateGraph.py
index cc40d8b861..1635365a08 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ComponentUpdates_UpdateGraph.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ComponentUpdates_UpdateGraph.py
@@ -1,15 +1,14 @@
"""
Copyright (c) Contributors to the Open 3D Engine Project.
For complete copyright and license terms please see the LICENSE at the root of this distribution.
-
SPDX-License-Identifier: Apache-2.0 OR MIT
"""
class Tests:
- slice_instantiated = (
- "Slice instantiated successfully",
- "Failed to instantiate slice"
+ prefab_instantiated = (
+ "Prefab instantiated successfully",
+ "Failed to instantiate prefab"
)
lc_entity_found = (
"LandscapeCanvas entity found",
@@ -24,7 +23,7 @@ class Tests:
"Failed to find Distribution Filter component on BushSpawner entity"
)
existing_graph_opened = (
- "Opened existing graph from slice",
+ "Opened existing graph from prefab",
"Failed to open existing graph"
)
dist_filter_node_found = (
@@ -66,10 +65,8 @@ def ComponentUpdates_UpdateGraph():
Summary:
This test verifies that the Landscape Canvas graphs update properly when components are added/removed outside of
Landscape Canvas.
-
Expected Behavior:
Graphs properly reflect component changes made to entities outside of Landscape Canvas.
-
Test Steps:
1. Open Level
2. Find LandscapeCanvas named entity
@@ -83,41 +80,36 @@ def ComponentUpdates_UpdateGraph():
9. Add a new entity with unique name as a child of the Landscape Canvas entity
10. Add a Box Shape component to the new child entity
11. Ensure Box Shape node is present on the open graph
-
Note:
- This test file must be called from the Open 3D Engine Editor command terminal
- Any passed and failed tests are written to the Editor.log file.
Parsing the file or running a log_monitor are required to observe the test results.
-
:return: None
"""
import os
- import azlmbr.asset as asset
import azlmbr.bus as bus
import azlmbr.editor as editor
import azlmbr.entity as entity
import azlmbr.legacy.general as general
import azlmbr.landscapecanvas as landscapecanvas
import azlmbr.math as math
- import azlmbr.slice as slice
+ import azlmbr.prefab as prefab
import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper
- # Open a simple level and instantiate LC_BushFlowerBlender.slice
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ # Open a simple level and instantiate BushFlowerBlender.prefab
+ hydra.open_base_level()
transform = math.Transform_CreateIdentity()
position = math.Vector3(64.0, 64.0, 32.0)
transform.invoke('SetPosition', position)
- test_slice_path = os.path.join("Slices", "LC_BushFlowerBlender.slice")
- test_slice_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", test_slice_path, math.Uuid(),
- False)
- test_slice = slice.SliceRequestBus(bus.Broadcast, 'InstantiateSliceFromAssetId', test_slice_id, transform)
- Report.critical_result(Tests.slice_instantiated, test_slice.IsValid())
+ test_prefab_path = os.path.join("Assets", "Prefabs", "BushFlowerBlender.prefab")
+ prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'InstantiatePrefab', test_prefab_path,
+ entity.EntityId(), position)
+ Report.critical_result(Tests.prefab_instantiated, prefab_result.IsSuccess())
# Find root entity in the loaded level
search_filter = entity.SearchFilter()
@@ -126,8 +118,8 @@ def ComponentUpdates_UpdateGraph():
# Allow a few seconds for matching entity to be found
helper.wait_for_condition(lambda: len(entity.SearchBus(bus.Broadcast, 'SearchEntities', search_filter)) > 0, 5.0)
lc_matching_entities = entity.SearchBus(bus.Broadcast, 'SearchEntities', search_filter)
- slice_root_id = lc_matching_entities[0] #Entity with Landscape Canvas component
- Report.critical_result(Tests.lc_entity_found, slice_root_id.IsValid())
+ prefab_root_id = lc_matching_entities[0] #Entity with Landscape Canvas component
+ Report.critical_result(Tests.lc_entity_found, prefab_root_id.IsValid())
# Find the BushSpawner entity
search_filter.names = ["BushSpawner"]
@@ -147,7 +139,7 @@ def ComponentUpdates_UpdateGraph():
# Open Landscape Canvas and the existing graph
general.open_pane('Landscape Canvas')
- open_graph = landscapecanvas.LandscapeCanvasRequestBus(bus.Broadcast, 'OnGraphEntity', slice_root_id)
+ open_graph = landscapecanvas.LandscapeCanvasRequestBus(bus.Broadcast, 'OnGraphEntity', prefab_root_id)
Report.critical_result(Tests.existing_graph_opened, open_graph.IsValid())
# Verify that Distribution Filter node is present on the graph
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Component_AddedRemoved.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Component_AddedRemoved.py
index 7f21a26595..465cf14481 100644
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Component_AddedRemoved.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Component_AddedRemoved.py
@@ -45,11 +45,9 @@ def Component_AddedRemoved():
import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Create an Entity at the root of the level
newEntityId = editor.ToolsApplicationRequestBus(bus.Broadcast, 'CreateNewEntity', entity.EntityId())
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_DisabledNodeDuplication.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_DisabledNodeDuplication.py
index 4dfc227c53..e5b66399cb 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_DisabledNodeDuplication.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_DisabledNodeDuplication.py
@@ -59,8 +59,7 @@ def Edit_DisabledNodeDuplication():
newEntityId = parameters[0]
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_UndoNodeDelete_SliceEntity.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_UndoNodeDelete_PrefabEntity.py
old mode 100755
new mode 100644
similarity index 85%
rename from AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_UndoNodeDelete_SliceEntity.py
rename to AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_UndoNodeDelete_PrefabEntity.py
index a26e16755f..d7735f59c2
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_UndoNodeDelete_SliceEntity.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Edit_UndoNodeDelete_PrefabEntity.py
@@ -1,15 +1,14 @@
"""
Copyright (c) Contributors to the Open 3D Engine Project.
For complete copyright and license terms please see the LICENSE at the root of this distribution.
-
SPDX-License-Identifier: Apache-2.0 OR MIT
"""
class Tests:
- slice_spawned = (
- "Slice instantiated successfully",
- "Failed to instantiate slice"
+ prefab_instantiated = (
+ "Prefab instantiated successfully",
+ "Failed to instantiate prefab"
)
lc_entity_found = (
"Landscape Canvas entity found",
@@ -31,31 +30,28 @@ class Tests:
"Vegetation Layer Spawner node was successfully removed",
"Failed to remove Vegetation Layer Spawner node"
)
-def Edit_UndoNodeDelete_SliceEntity():
+
+
+def Edit_UndoNodeDelete_PrefabEntity():
"""
Summary:
- This test verifies Editor stability after undoing the deletion of nodes on a slice entity.
-
+ This test verifies Editor stability after undoing the deletion of nodes on a prefab entity.
Expected Behavior:
Editor remains stable and free of crashes.
-
Test Steps:
1) Open a simple level
- 2) Instantiate a slice with a Landscape Canvas setup
+ 2) Instantiate a prefab with a Landscape Canvas setup
3) Find a specific node on the graph, and delete it
4) Restore the node with Undo
-
Note:
- This test file must be called from the Open 3D Engine Editor command terminal
- Any passed and failed tests are written to the Editor.log file.
Parsing the file or running a log_monitor are required to observe the test results.
-
:return: None
"""
import os
- import azlmbr.asset as asset
import azlmbr.bus as bus
import azlmbr.editor as editor
import azlmbr.entity as entity
@@ -63,25 +59,23 @@ def Edit_UndoNodeDelete_SliceEntity():
import azlmbr.editor.graph as graph
import azlmbr.landscapecanvas as landscapecanvas
import azlmbr.math as math
- import azlmbr.slice as slice
+ import azlmbr.prefab as prefab
import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Instantiate slice
transform = math.Transform_CreateIdentity()
position = math.Vector3(64.0, 64.0, 32.0)
transform.invoke('SetPosition', position)
- test_slice_path = os.path.join("Slices", "LC_BushFlowerBlender.slice")
- test_slice_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", test_slice_path, math.Uuid(),
- False)
- test_slice = slice.SliceRequestBus(bus.Broadcast, 'InstantiateSliceFromAssetId', test_slice_id, transform)
- Report.result(Tests.slice_spawned, test_slice.IsValid())
+ test_prefab_path = os.path.join("Assets", "Prefabs", "BushFlowerBlender.prefab")
+ prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'InstantiatePrefab', test_prefab_path,
+ entity.EntityId(), position)
+ Report.critical_result(Tests.prefab_instantiated, prefab_result.IsSuccess())
# Find root entity in the loaded level
search_filter = entity.SearchFilter()
@@ -134,5 +128,4 @@ def Edit_UndoNodeDelete_SliceEntity():
if __name__ == "__main__":
from editor_python_test_tools.utils import Report
- Report.start_test(Edit_UndoNodeDelete_SliceEntity)
-
+ Report.start_test(Edit_UndoNodeDelete_PrefabEntity)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientMixer_NodeConstruction.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientMixer_NodeConstruction.py
index c390df7c61..95a9b08fe5 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientMixer_NodeConstruction.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientMixer_NodeConstruction.py
@@ -76,7 +76,6 @@ def GradientMixer_NodeConstruction():
import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
@@ -85,8 +84,7 @@ def GradientMixer_NodeConstruction():
newEntityId = parameters[0]
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityCreatedOnNodeAdd.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityCreatedOnNodeAdd.py
index c3952fe34b..3b6e28ca3d 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityCreatedOnNodeAdd.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityCreatedOnNodeAdd.py
@@ -58,7 +58,6 @@ def GradientModifierNodes_EntityCreatedOnNodeAdd():
import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
@@ -67,8 +66,7 @@ def GradientModifierNodes_EntityCreatedOnNodeAdd():
newEntityId = parameters[0]
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityRemovedOnNodeDelete.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityRemovedOnNodeDelete.py
index d7789a21fb..e6fb61e10a 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityRemovedOnNodeDelete.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientModifierNodes_EntityRemovedOnNodeDelete.py
@@ -58,8 +58,8 @@ def GradientModifierNodes_EntityRemovedOnNodeDelete():
import azlmbr.legacy.general as general
import azlmbr.math as math
+ import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
@@ -72,8 +72,7 @@ def GradientModifierNodes_EntityRemovedOnNodeDelete():
deletedEntityId = parameters[0]
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_DependentComponentsAdded.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_DependentComponentsAdded.py
index 63df9a6fcb..c2007e49e2 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_DependentComponentsAdded.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_DependentComponentsAdded.py
@@ -60,7 +60,6 @@ def GradientNodes_DependentComponentsAdded():
import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
@@ -69,8 +68,7 @@ def GradientNodes_DependentComponentsAdded():
newEntityId = parameters[0]
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityCreatedOnNodeAdd.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityCreatedOnNodeAdd.py
index d5595e342c..5111f45f22 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityCreatedOnNodeAdd.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityCreatedOnNodeAdd.py
@@ -58,7 +58,6 @@ def GradientNodes_EntityCreatedOnNodeAdd():
import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
@@ -67,8 +66,7 @@ def GradientNodes_EntityCreatedOnNodeAdd():
newEntityId = parameters[0]
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityRemovedOnNodeDelete.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityRemovedOnNodeDelete.py
index e5bfbfc7f1..1840fd3f1a 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityRemovedOnNodeDelete.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GradientNodes_EntityRemovedOnNodeDelete.py
@@ -58,8 +58,8 @@ def GradientNodes_EntityRemovedOnNodeDelete():
import azlmbr.legacy.general as general
import azlmbr.math as math
+ import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
@@ -72,8 +72,7 @@ def GradientNodes_EntityRemovedOnNodeDelete():
deletedEntityId = parameters[0]
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnEntityDelete.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnEntityDelete.py
index 0f83688206..1902516fb3 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnEntityDelete.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnEntityDelete.py
@@ -51,8 +51,8 @@ def GraphClosed_OnEntityDelete():
import azlmbr.editor.graph as graph
import azlmbr.legacy.general as general
+ import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
@@ -61,8 +61,7 @@ def GraphClosed_OnEntityDelete():
newRootEntityId = parameters[0]
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnLevelChange.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnLevelChange.py
index 67c2ec6908..d5d46c042d 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnLevelChange.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_OnLevelChange.py
@@ -51,14 +51,13 @@ def GraphClosed_OnLevelChange():
import azlmbr.editor.graph as graph
import azlmbr.legacy.general as general
+ import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
@@ -73,7 +72,7 @@ def GraphClosed_OnLevelChange():
Report.result(Tests.graph_registered, graph_registered)
# Open a different level, which should close any open Landscape Canvas graphs
- general.open_level_no_prompt('WhiteBox/EmptyLevel')
+ general.open_level_no_prompt('Base')
# Make sure the graph we created is now closed
graphIsOpen = graph.AssetEditorRequestBus(bus.Event, 'ContainsGraph', editorId, newGraphId)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_TabbedGraph.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_TabbedGraph.py
index 83762e0afb..d33ee7746f 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_TabbedGraph.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphClosed_TabbedGraph.py
@@ -51,8 +51,8 @@ def GraphClosed_TabbedGraphClosesIndependently():
import azlmbr.editor.graph as graph
import azlmbr.legacy.general as general
+ import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editor_id = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
@@ -65,8 +65,7 @@ def GraphClosed_TabbedGraphClosesIndependently():
return graph_open
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphUpdates_UpdateComponents.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphUpdates_UpdateComponents.py
index c489c738d5..6a007a9014 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphUpdates_UpdateComponents.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/GraphUpdates_UpdateComponents.py
@@ -1,18 +1,17 @@
"""
Copyright (c) Contributors to the Open 3D Engine Project.
For complete copyright and license terms please see the LICENSE at the root of this distribution.
-
SPDX-License-Identifier: Apache-2.0 OR MIT
"""
class Tests:
- slice_instantiated = (
- "Slice instantiated successfully",
- "Failed to instantiate slice"
+ prefab_instantiated = (
+ "Prefab instantiated successfully",
+ "Failed to instantiate prefab"
)
existing_graph_opened = (
- "Opened existing graph from slice",
+ "Opened existing graph from prefab",
"Failed to open existing graph"
)
node_removed = (
@@ -37,13 +36,11 @@ def GraphUpdates_UpdateComponent():
"""
Summary:
This test verifies that components are properly updated as nodes are added/removed/updated.
-
Expected Behavior:
Landscape Canvas node CRUD properly updates component entities.
-
Test Steps:
1. Open Level.
- 2. Open the graph on LC_BushFlowerBlender.slice
+ 2. Open the graph on BushFlowerBlender.prefab
3. Find the Rotation Modifier node on the BushSpawner entity
4. Delete the Rotation Modifier node
5. Ensure the Vegetation Rotation Modifier component is removed from the BushSpawner entity
@@ -51,18 +48,15 @@ def GraphUpdates_UpdateComponent():
7. Ensure BushSpawner entity is deleted
8. Change connection from second Rotation Modifier node to a different Gradient
9. Ensure Gradient reference on component is updated
-
Note:
- This test file must be called from the Open 3D Engine Editor command terminal
- Any passed and failed tests are written to the Editor.log file.
Parsing the file or running a log_monitor are required to observe the test results.
-
:return: None
"""
import os
- import azlmbr.asset as asset
import azlmbr.bus as bus
import azlmbr.editor as editor
import azlmbr.entity as entity
@@ -70,39 +64,37 @@ def GraphUpdates_UpdateComponent():
import azlmbr.editor.graph as graph
import azlmbr.landscapecanvas as landscapecanvas
import azlmbr.math as math
- import azlmbr.slice as slice
+ import azlmbr.prefab as prefab
import automatedtesting_shared.landscape_canvas_utils as lc
import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper
- # Open a simple level and instantiate LC_BushFlowerBlender.slice
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ # Open a simple level and instantiate BushFlowerBlender.prefab
+ hydra.open_base_level()
transform = math.Transform_CreateIdentity()
position = math.Vector3(64.0, 64.0, 32.0)
transform.invoke('SetPosition', position)
- test_slice_path = os.path.join("Slices", "LC_BushFlowerBlender.slice")
- test_slice_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", test_slice_path, math.Uuid(),
- False)
- test_slice = slice.SliceRequestBus(bus.Broadcast, 'InstantiateSliceFromAssetId', test_slice_id, transform)
- Report.critical_result(Tests.slice_instantiated, test_slice.IsValid())
+ test_prefab_path = os.path.join("Assets", "Prefabs", "BushFlowerBlender.prefab")
+ prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'InstantiatePrefab', test_prefab_path,
+ entity.EntityId(), position)
+ Report.critical_result(Tests.prefab_instantiated, prefab_result.IsSuccess())
- # Search for root entity to ensure slice is loaded
+ # Search for root entity to ensure prefab is loaded
search_filter = entity.SearchFilter()
search_filter.names = ["LandscapeCanvas"]
helper.wait_for_condition(lambda: len(entity.SearchBus(bus.Broadcast, 'SearchEntities', search_filter)) > 0, 5.0)
+ prefab_lc_root = entity.SearchBus(bus.Broadcast, 'SearchEntities', search_filter)[0]
# Find needed entities in the loaded level
- slice_root_id = hydra.find_entity_by_name('LandscapeCanvas')
bush_spawner_id = hydra.find_entity_by_name('BushSpawner')
flower_spawner_id = hydra.find_entity_by_name('FlowerSpawner')
inverted_perlin_noise_id = hydra.find_entity_by_name('Invert')
# Open Landscape Canvas and the existing graph
general.open_pane('Landscape Canvas')
- open_graph_id = landscapecanvas.LandscapeCanvasRequestBus(bus.Broadcast, 'OnGraphEntity', slice_root_id)
+ open_graph_id = landscapecanvas.LandscapeCanvasRequestBus(bus.Broadcast, 'OnGraphEntity', prefab_lc_root)
Report.critical_result(Tests.existing_graph_opened, open_graph_id.IsValid())
# Find the Rotation Modifier node on the BushSpawner entity
@@ -110,6 +102,7 @@ def GraphUpdates_UpdateComponent():
# Remove the Rotation Modifier node
graph.GraphControllerRequestBus(bus.Event, 'RemoveNode', open_graph_id, rotation_modifier_node[0])
+ general.idle_wait_frames(2)
# Verify node was removed
rotation_modifier_node = lc.find_nodes_matching_entity_component('Vegetation Rotation Modifier', bush_spawner_id)
@@ -121,14 +114,18 @@ def GraphUpdates_UpdateComponent():
Report.result(Tests.component_removed, not has_rotation_modifier)
# Find the Vegetation Layer Spawner node on the BushSpawner entity
+ open_graph_id = landscapecanvas.LandscapeCanvasRequestBus(bus.Broadcast, 'OnGraphEntity', prefab_lc_root)
layer_spawner_node = lc.find_nodes_matching_entity_component('Vegetation Layer Spawner', bush_spawner_id)
# Remove the Vegetation Layer Spawner node and verify the corresponding entity is deleted
graph.GraphControllerRequestBus(bus.Event, 'RemoveNode', open_graph_id, layer_spawner_node[0])
+ general.idle_wait_frames(2)
+ layer_spawner_node = lc.find_nodes_matching_entity_component('Vegetation Layer Spawner', bush_spawner_id)
bush_spawner_id = hydra.find_entity_by_name('BushSpawner')
- Report.result(Tests.entity_deleted, not bush_spawner_id)
+ Report.result(Tests.entity_deleted, not layer_spawner_node and not bush_spawner_id)
# Connect the FlowerSpawner's Rotation Modifier node to the Invert Gradient Modifier node
+ open_graph_id = landscapecanvas.LandscapeCanvasRequestBus(bus.Broadcast, 'OnGraphEntity', prefab_lc_root)
rotation_modifier_node = lc.find_nodes_matching_entity_component('Vegetation Rotation Modifier', flower_spawner_id)
invert_node = lc.find_nodes_matching_entity_component('Invert Gradient Modifier', inverted_perlin_noise_id)
@@ -137,7 +134,7 @@ def GraphUpdates_UpdateComponent():
graph.GraphControllerRequestBus(bus.Event, 'AddConnectionBySlotId', open_graph_id, invert_node[0],
outbound_gradient_slot, rotation_modifier_node[0], inbound_gradient_z_slot)
- general.idle_wait(1.0) # Add a small wait to ensure component property has time to update
+ general.idle_wait_frames(2) # Add a small wait to ensure component property has time to update
# Verify the Gradient Entity Id reference on the Rotation Modifier component was properly set
rotation_type_id = hydra.get_component_type_id('Vegetation Rotation Modifier')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerBlender_NodeConstruction.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerBlender_NodeConstruction.py
index b2bf20411b..da9a21aee6 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerBlender_NodeConstruction.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerBlender_NodeConstruction.py
@@ -64,7 +64,6 @@ def LayerBlender_NodeConstruction():
import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
@@ -73,8 +72,7 @@ def LayerBlender_NodeConstruction():
newEntityId = parameters[0]
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerExtenderNodes_ComponentEntitySync.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerExtenderNodes_ComponentEntitySync.py
index 510c404614..cd54a741ec 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerExtenderNodes_ComponentEntitySync.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/LayerExtenderNodes_ComponentEntitySync.py
@@ -63,7 +63,6 @@ def LayerExtenderNodes_ComponentEntitySync():
import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
@@ -72,8 +71,7 @@ def LayerExtenderNodes_ComponentEntitySync():
newEntityId = parameters[0]
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/NewGraph_CreatedSuccessfully.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/NewGraph_CreatedSuccessfully.py
index d13c5dfa2f..f7564a643d 100644
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/NewGraph_CreatedSuccessfully.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/NewGraph_CreatedSuccessfully.py
@@ -60,7 +60,6 @@ def NewGraph_CreatedSuccessfully():
import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
@@ -69,8 +68,7 @@ def NewGraph_CreatedSuccessfully():
new_root_entity_id = parameters[0]
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Listen for entity creation notifications so we can check if the entity created
# with the new graph has our Landscape Canvas component automatically added
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Prefab_CreateInstantiate.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Prefab_CreateInstantiate.py
new file mode 100644
index 0000000000..894a69a40e
--- /dev/null
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Prefab_CreateInstantiate.py
@@ -0,0 +1,69 @@
+"""
+Copyright (c) Contributors to the Open 3D Engine Project.
+For complete copyright and license terms please see the LICENSE at the root of this distribution.
+SPDX-License-Identifier: Apache-2.0 OR MIT
+"""
+
+
+class Tests:
+ prefab_created = (
+ "Prefab created successfully",
+ "Failed to create prefab"
+ )
+ prefab_instantiated = (
+ "Prefab instantiated successfully",
+ "Failed to instantiate prefab"
+ )
+
+
+def Prefab_CreateInstantiate():
+ """
+ Summary:
+ A prefab containing the LandscapeCanvas component can be created/instantiated.
+ Expected Result:
+ Prefab is created/processed/instantiated successfully and free of errors/warnings.
+ Test Steps:
+ 1) Open a simple level
+ 2) Create a new entity with a Landscape Canvas component
+ 3) Create a prefab of the new entity
+ 4) Instantiate a new copy of the prefab
+ Note:
+ - This test file must be called from the Open 3D Engine Editor command terminal
+ - Any passed and failed tests are written to the Editor.log file.
+ Parsing the file or running a log_monitor are required to observe the test results.
+ :return: None
+ """
+
+ import azlmbr.math as math
+
+ import editor_python_test_tools.hydra_editor_utils as hydra
+ from editor_python_test_tools.utils import Report
+ from editor_python_test_tools.utils import TestHelper as helper
+ from editor_python_test_tools.prefab_utils import Prefab
+
+ # Open an existing simple level
+ hydra.open_base_level()
+
+ # Create entity with Landscape Canvas component
+ position = math.Vector3(512.0, 512.0, 32.0)
+ landscape_canvas = hydra.Entity("landscape_canvas_entity")
+ landscape_canvas.create_entity(position, ["Landscape Canvas"])
+
+ # Create in-memory prefab from the created entity
+ lc_prefab_filename = "LC_PrefabTest"
+ lc_prefab, lc_prefab_instance = Prefab.create_prefab([landscape_canvas], lc_prefab_filename)
+
+ # Verify if prefab is created
+ helper.wait_for_condition(lambda: lc_prefab.is_prefab_loaded(lc_prefab_filename), 5.0)
+ Report.result(Tests.prefab_created, lc_prefab.is_prefab_loaded(lc_prefab_filename))
+
+ # Instantiate prefab
+ lc_prefab_instance2 = lc_prefab.instantiate()
+ helper.wait_for_condition(lambda: lc_prefab_instance2.has_editor_prefab_component(), 5.0)
+ Report.result(Tests.prefab_instantiated, lc_prefab_instance2.has_editor_prefab_component())
+
+
+if __name__ == "__main__":
+
+ from editor_python_test_tools.utils import Report
+ Report.start_test(Prefab_CreateInstantiate)
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityCreatedOnNodeAdd.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityCreatedOnNodeAdd.py
index 93464c7ad3..c93b377945 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityCreatedOnNodeAdd.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityCreatedOnNodeAdd.py
@@ -58,7 +58,6 @@ def ShapeNodes_EntityCreatedOnNodeAdd():
import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
@@ -66,10 +65,8 @@ def ShapeNodes_EntityCreatedOnNodeAdd():
global newEntityId
newEntityId = parameters[0]
- # Open an existing simple level
-
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ # Open an existing simple level
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityRemovedOnNodeDelete.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityRemovedOnNodeDelete.py
index d2708f643d..4057e7f6e9 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityRemovedOnNodeDelete.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/ShapeNodes_EntityRemovedOnNodeDelete.py
@@ -58,8 +58,8 @@ def ShapeNodes_EntityRemovedOnNodeDelete():
import azlmbr.legacy.general as general
import azlmbr.math as math
+ import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
@@ -72,8 +72,7 @@ def ShapeNodes_EntityRemovedOnNodeDelete():
deletedEntityId = parameters[0]
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Slice_CreateInstantiate.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Slice_CreateInstantiate.py
deleted file mode 100644
index c5ab08f99a..0000000000
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/Slice_CreateInstantiate.py
+++ /dev/null
@@ -1,84 +0,0 @@
-"""
-Copyright (c) Contributors to the Open 3D Engine Project.
-For complete copyright and license terms please see the LICENSE at the root of this distribution.
-
-SPDX-License-Identifier: Apache-2.0 OR MIT
-"""
-
-
-class Tests:
- slice_created = (
- "Slice created successfully",
- "Failed to create slice"
- )
- slice_instantiated = (
- "Slice instantiated successfully",
- "Failed to instantiate slice"
- )
-
-
-def Slice_CreateInstantiate():
- """
- Summary:
- A slice containing the LandscapeCanvas component can be created/instantiated.
-
- Expected Result:
- Slice is created/processed/instantiated successfully and free of errors/warnings.
-
- Test Steps:
- 1) Open a simple level
- 2) Create a new entity with a Landscape Canvas component
- 3) Create a slice of the new entity
- 4) Instantiate a new copy of the slice
-
- Note:
- - This test file must be called from the Open 3D Engine Editor command terminal
- - Any passed and failed tests are written to the Editor.log file.
- Parsing the file or running a log_monitor are required to observe the test results.
- :return: None
- """
-
- import os
-
- import azlmbr.math as math
- import azlmbr.bus as bus
- import azlmbr.asset as asset
- import azlmbr.slice as slice
-
- import editor_python_test_tools.hydra_editor_utils as hydra
- from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
-
- def path_is_valid_asset(asset_path):
- asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", asset_path, math.Uuid(), False)
- return asset_id.invoke("IsValid")
-
- # Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
-
- # Create entity with Landscape Canvas component
- position = math.Vector3(512.0, 512.0, 32.0)
- landscape_canvas = hydra.Entity("landscape_canvas_entity")
- landscape_canvas.create_entity(position, ["Landscape Canvas"])
-
- # Create slice from the created entity
- slice_path = os.path.join("slices", "TestSlice.slice")
- slice.SliceRequestBus(bus.Broadcast, "CreateNewSlice", landscape_canvas.id, slice_path)
-
- # Verify if slice is created
- helper.wait_for_condition(lambda: path_is_valid_asset(slice_path), 5.0)
- Report.result(Tests.slice_created, path_is_valid_asset(slice_path))
-
- # Instantiate slice
- transform = math.Transform_CreateIdentity()
- asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", slice_path, math.Uuid(), False)
- test_slice = slice.SliceRequestBus(bus.Broadcast, "InstantiateSliceFromAssetId", asset_id, transform)
- helper.wait_for_condition(lambda: test_slice.IsValid(), 5.0)
- Report.result(Tests.slice_instantiated, test_slice.IsValid())
-
-
-if __name__ == "__main__":
-
- from editor_python_test_tools.utils import Report
- Report.start_test(Slice_CreateInstantiate)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/SlotConnections_UpdateComponentReferences.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/SlotConnections_UpdateComponentReferences.py
index 3169908621..208849ea61 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/SlotConnections_UpdateComponentReferences.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/EditorScripts/SlotConnections_UpdateComponentReferences.py
@@ -67,7 +67,6 @@ def SlotConnections_UpdateComponentReferences():
import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
editorId = azlmbr.globals.property.LANDSCAPE_CANVAS_EDITOR_ID
@@ -101,8 +100,7 @@ def SlotConnections_UpdateComponentReferences():
newEntityId = parameters[0]
# Open an existing simple level
- helper.init_idle()
- helper.open_level("Physics", "Base")
+ hydra.open_base_level()
# Open Landscape Canvas tool and verify
general.open_pane('Landscape Canvas')
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/TestSuite_Main.py
index dedc9c70c0..12e426e400 100644
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/TestSuite_Main.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/TestSuite_Main.py
@@ -1,29 +1,88 @@
"""
Copyright (c) Contributors to the Open 3D Engine Project.
For complete copyright and license terms please see the LICENSE at the root of this distribution.
-
SPDX-License-Identifier: Apache-2.0 OR MIT
"""
-import os
import pytest
-import sys
-import ly_test_tools.environment.file_system as file_system
-
-sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../../automatedtesting_shared')
-from base import TestAutomationBase
+from ly_test_tools.o3de.editor_test import EditorSingleTest, EditorSharedTest, EditorParallelTest, EditorTestSuite
-@pytest.mark.SUITE_main
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
@pytest.mark.parametrize("project", ["AutomatedTesting"])
-class TestAutomation(TestAutomationBase):
+class TestAutomation(EditorTestSuite):
- def test_LandscapeCanvas_SlotConnections_UpdateComponentReferences(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import SlotConnections_UpdateComponentReferences as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
+ class test_LandscapeCanvas_AreaNodes_DependentComponentsAdded(EditorSharedTest):
+ from .EditorScripts import AreaNodes_DependentComponentsAdded as test_module
- def test_LandscapeCanvas_GradientMixer_NodeConstruction(self, request, workspace, editor, launcher_platform):
+ class test_LandscapeCanvas_AreaNodes_EntityCreatedOnNodeAdd(EditorSharedTest):
+ from .EditorScripts import AreaNodes_EntityCreatedOnNodeAdd as test_module
+
+ class test_LandscapeCanvas_AreaNodes_EntityRemovedOnNodeDelete(EditorSharedTest):
+ from .EditorScripts import AreaNodes_EntityRemovedOnNodeDelete as test_module
+
+ class test_LandscapeCanvas_Component_AddedRemoved(EditorSharedTest):
+ from .EditorScripts import Component_AddedRemoved as test_module
+
+ class test_LandscapeCanvas_ComponentUpdates_UpdateGraph(EditorSharedTest):
+ from .EditorScripts import ComponentUpdates_UpdateGraph as test_module
+
+ class test_LandscapeCanvas_Edit_DisabledNodeDuplication(EditorSharedTest):
+ from .EditorScripts import Edit_DisabledNodeDuplication as test_module
+
+ class test_LandscapeCanvas_Edit_UndoNodeDelete_PrefabEntity(EditorSharedTest):
+ from .EditorScripts import Edit_UndoNodeDelete_PrefabEntity as test_module
+
+ class test_LandscapeCanvas_GradientMixer_NodeConstruction(EditorSharedTest):
from .EditorScripts import GradientMixer_NodeConstruction as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
+
+ class test_LandscapeCanvas_GradientModifierNodes_EntityCreatedOnNodeAdd(EditorSharedTest):
+ from .EditorScripts import GradientModifierNodes_EntityCreatedOnNodeAdd as test_module
+
+ class test_LandscapeCanvas_GradientModifierNodes_EntityRemovedOnNodeDelete(EditorSharedTest):
+ from .EditorScripts import GradientModifierNodes_EntityRemovedOnNodeDelete as test_module
+
+ class test_LandscapeCanvas_GradientNodes_DependentComponentsAdded(EditorSharedTest):
+ from .EditorScripts import GradientNodes_DependentComponentsAdded as test_module
+
+ class test_LandscapeCanvas_GradientNodes_EntityCreatedOnNodeAdd(EditorSharedTest):
+ from .EditorScripts import GradientNodes_EntityCreatedOnNodeAdd as test_module
+
+ class test_LandscapeCanvas_GradientNodes_EntityRemovedOnNodeDelete(EditorSharedTest):
+ from .EditorScripts import GradientNodes_EntityRemovedOnNodeDelete as test_module
+
+ @pytest.mark.xfail(reason="https://github.com/o3de/o3de/issues/2201")
+ class test_LandscapeCanvas_GraphClosed_OnEntityDelete(EditorSharedTest):
+ from .EditorScripts import GraphClosed_OnEntityDelete as test_module
+
+ class test_LandscapeCanvas_GraphClosed_OnLevelChange(EditorSharedTest):
+ from .EditorScripts import GraphClosed_OnLevelChange as test_module
+
+ class test_LandscapeCanvas_GraphClosed_TabbedGraphClosesIndependently(EditorSharedTest):
+ from .EditorScripts import GraphClosed_TabbedGraph as test_module
+
+ @pytest.mark.skip(reason="https://github.com/o3de/o3de/issues/7141" "https://github.com/o3de/o3de/issues/4872")
+ class test_LandscapeCanvas_GraphUpdates_UpdateComponents(EditorSharedTest):
+ from .EditorScripts import GraphUpdates_UpdateComponents as test_module
+
+ class test_LandscapeCanvas_LayerBlender_NodeConstruction(EditorSharedTest):
+ from .EditorScripts import LayerBlender_NodeConstruction as test_module
+
+ class test_LandscapeCanvas_LayerExtenderNodes_ComponentEntitySync(EditorSharedTest):
+ from .EditorScripts import LayerExtenderNodes_ComponentEntitySync as test_module
+
+ class test_LandscapeCanvas_NewGraph_CreatedSuccessfully(EditorSharedTest):
+ from .EditorScripts import NewGraph_CreatedSuccessfully as test_module
+
+ class test_LandscapeCanvas_Prefab_CreateInstantiate(EditorSharedTest):
+ from .EditorScripts import Prefab_CreateInstantiate as test_module
+
+ class test_LandscapeCanvas_ShapeNodes_EntityCreatedOnNodeAdd(EditorSharedTest):
+ from .EditorScripts import ShapeNodes_EntityCreatedOnNodeAdd as test_module
+
+ class test_LandscapeCanvas_ShapeNodes_EntityRemovedOnNodeDelete(EditorSharedTest):
+ from .EditorScripts import ShapeNodes_EntityRemovedOnNodeDelete as test_module
+
+ class test_LandscapeCanvas_SlotConnections_UpdateComponentReferences(EditorSharedTest):
+ from .EditorScripts import SlotConnections_UpdateComponentReferences as test_module
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/TestSuite_Main_Optimized.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/TestSuite_Main_Optimized.py
deleted file mode 100644
index 402df133cb..0000000000
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/TestSuite_Main_Optimized.py
+++ /dev/null
@@ -1,100 +0,0 @@
-"""
-Copyright (c) Contributors to the Open 3D Engine Project.
-For complete copyright and license terms please see the LICENSE at the root of this distribution.
-
-SPDX-License-Identifier: Apache-2.0 OR MIT
-"""
-
-import os
-import pytest
-
-import ly_test_tools.environment.file_system as file_system
-import ly_test_tools._internal.pytest_plugin as internal_plugin
-from ly_test_tools.o3de.editor_test import EditorSingleTest, EditorSharedTest, EditorParallelTest, EditorTestSuite
-
-
-@pytest.mark.SUITE_periodic
-@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
-@pytest.mark.parametrize("project", ["AutomatedTesting"])
-class TestAutomation(EditorTestSuite):
-
- enable_prefab_system = False
-
- class test_LandscapeCanvas_SlotConnections_UpdateComponentReferences(EditorSharedTest):
- from .EditorScripts import SlotConnections_UpdateComponentReferences as test_module
-
- class test_LandscapeCanvas_GradientMixer_NodeConstruction(EditorSharedTest):
- from .EditorScripts import GradientMixer_NodeConstruction as test_module
-
- class test_LandscapeCanvas_AreaNodes_DependentComponentsAdded(EditorSharedTest):
- from .EditorScripts import AreaNodes_DependentComponentsAdded as test_module
-
- class test_LandscapeCanvas_AreaNodes_EntityCreatedOnNodeAdd(EditorSharedTest):
- from .EditorScripts import AreaNodes_EntityCreatedOnNodeAdd as test_module
-
- class test_LandscapeCanvas_AreaNodes_EntityRemovedOnNodeDelete(EditorSharedTest):
- from .EditorScripts import AreaNodes_EntityRemovedOnNodeDelete as test_module
-
- class test_LandscapeCanvas_LayerExtenderNodes_ComponentEntitySync(EditorSharedTest):
- from .EditorScripts import LayerExtenderNodes_ComponentEntitySync as test_module
-
- class test_LandscapeCanvas_Edit_DisabledNodeDuplication(EditorSharedTest):
- from .EditorScripts import Edit_DisabledNodeDuplication as test_module
-
- class test_LandscapeCanvas_Edit_UndoNodeDelete_SliceEntity(EditorSharedTest):
- from .EditorScripts import Edit_UndoNodeDelete_SliceEntity as test_module
-
- class test_LandscapeCanvas_NewGraph_CreatedSuccessfully(EditorSharedTest):
- from .EditorScripts import NewGraph_CreatedSuccessfully as test_module
-
- class test_LandscapeCanvas_Component_AddedRemoved(EditorSharedTest):
- from .EditorScripts import Component_AddedRemoved as test_module
-
- class test_LandscapeCanvas_GraphClosed_OnLevelChange(EditorSharedTest):
- from .EditorScripts import GraphClosed_OnLevelChange as test_module
-
- @pytest.mark.xfail(reason="https://github.com/o3de/o3de/issues/2201")
- class test_LandscapeCanvas_GraphClosed_OnEntityDelete(EditorSharedTest):
- from .EditorScripts import GraphClosed_OnEntityDelete as test_module
-
- class test_LandscapeCanvas_GraphClosed_TabbedGraphClosesIndependently(EditorSharedTest):
- from .EditorScripts import GraphClosed_TabbedGraph as test_module
-
- class test_LandscapeCanvas_Slice_CreateInstantiate(EditorSingleTest):
- from .EditorScripts import Slice_CreateInstantiate as test_module
- # Custom teardown to remove slice asset created during test
- def teardown(self, request, workspace, editor, editor_test_results, launcher_platform):
- file_system.delete([os.path.join(workspace.paths.engine_root(), "AutomatedTesting", "slices",
- "TestSlice.slice")], True, True)
-
- class test_LandscapeCanvas_GradientModifierNodes_EntityCreatedOnNodeAdd(EditorSharedTest):
- from .EditorScripts import GradientModifierNodes_EntityCreatedOnNodeAdd as test_module
-
- class test_LandscapeCanvas_GradientModifierNodes_EntityRemovedOnNodeDelete(EditorSharedTest):
- from .EditorScripts import GradientModifierNodes_EntityRemovedOnNodeDelete as test_module
-
- class test_LandscapeCanvas_GradientNodes_DependentComponentsAdded(EditorSharedTest):
- from .EditorScripts import GradientNodes_DependentComponentsAdded as test_module
-
- class test_LandscapeCanvas_GradientNodes_EntityCreatedOnNodeAdd(EditorSharedTest):
- from .EditorScripts import GradientNodes_EntityCreatedOnNodeAdd as test_module
-
- class test_LandscapeCanvas_GradientNodes_EntityRemovedOnNodeDelete(EditorSharedTest):
- from .EditorScripts import GradientNodes_EntityRemovedOnNodeDelete as test_module
-
- @pytest.mark.skipif("debug" == os.path.basename(internal_plugin.build_directory),
- reason="https://github.com/o3de/o3de/issues/4872")
- class test_LandscapeCanvas_GraphUpdates_UpdateComponents(EditorSharedTest):
- from .EditorScripts import GraphUpdates_UpdateComponents as test_module
-
- class test_LandscapeCanvas_ComponentUpdates_UpdateGraph(EditorSharedTest):
- from .EditorScripts import ComponentUpdates_UpdateGraph as test_module
-
- class test_LandscapeCanvas_LayerBlender_NodeConstruction(EditorSharedTest):
- from .EditorScripts import LayerBlender_NodeConstruction as test_module
-
- class test_LandscapeCanvas_ShapeNodes_EntityCreatedOnNodeAdd(EditorSharedTest):
- from .EditorScripts import ShapeNodes_EntityCreatedOnNodeAdd as test_module
-
- class test_LandscapeCanvas_ShapeNodes_EntityRemovedOnNodeDelete(EditorSharedTest):
- from .EditorScripts import ShapeNodes_EntityRemovedOnNodeDelete as test_module
\ No newline at end of file
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/TestSuite_Periodic.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/TestSuite_Periodic.py
deleted file mode 100644
index a719b1a7c0..0000000000
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/TestSuite_Periodic.py
+++ /dev/null
@@ -1,121 +0,0 @@
-"""
-Copyright (c) Contributors to the Open 3D Engine Project.
-For complete copyright and license terms please see the LICENSE at the root of this distribution.
-
-SPDX-License-Identifier: Apache-2.0 OR MIT
-"""
-
-import os
-import pytest
-import sys
-
-import ly_test_tools.environment.file_system as file_system
-
-sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../../automatedtesting_shared')
-from base import TestAutomationBase
-
-
-@pytest.fixture
-def remove_test_slice(request, workspace, project):
- file_system.delete([os.path.join(workspace.paths.engine_root(), project, "slices", "TestSlice.slice")], True, True)
-
- def teardown():
- file_system.delete([os.path.join(workspace.paths.engine_root(), project, "slices", "TestSlice.slice")], True,
- True)
-
- request.addfinalizer(teardown)
-
-
-@pytest.mark.SUITE_periodic
-@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
-@pytest.mark.parametrize("project", ["AutomatedTesting"])
-class TestAutomation(TestAutomationBase):
-
- def test_LandscapeCanvas_AreaNodes_DependentComponentsAdded(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import AreaNodes_DependentComponentsAdded as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_AreaNodes_EntityCreatedOnNodeAdd(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import AreaNodes_EntityCreatedOnNodeAdd as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_AreaNodes_EntityRemovedOnNodeDelete(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import AreaNodes_EntityRemovedOnNodeDelete as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_LayerExtenderNodes_ComponentEntitySync(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import LayerExtenderNodes_ComponentEntitySync as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_Edit_DisabledNodeDuplication(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import Edit_DisabledNodeDuplication as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_Edit_UndoNodeDelete_SliceEntity(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import Edit_UndoNodeDelete_SliceEntity as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_NewGraph_CreatedSuccessfully(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import NewGraph_CreatedSuccessfully as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_Component_AddedRemoved(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import Component_AddedRemoved as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_GraphClosed_OnLevelChange(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import GraphClosed_OnLevelChange as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- @pytest.mark.xfail(reason="https://github.com/o3de/o3de/issues/2201")
- def test_LandscapeCanvas_GraphClosed_OnEntityDelete(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import GraphClosed_OnEntityDelete as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_GraphClosed_TabbedGraphClosesIndependently(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import GraphClosed_TabbedGraph as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_Slice_CreateInstantiate(self, request, workspace, editor, remove_test_slice, launcher_platform):
- from .EditorScripts import Slice_CreateInstantiate as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_GradientModifierNodes_EntityCreatedOnNodeAdd(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import GradientModifierNodes_EntityCreatedOnNodeAdd as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_GradientModifierNodes_EntityRemovedOnNodeDelete(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import GradientModifierNodes_EntityRemovedOnNodeDelete as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_GradientNodes_DependentComponentsAdded(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import GradientNodes_DependentComponentsAdded as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_GradientNodes_EntityCreatedOnNodeAdd(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import GradientNodes_EntityCreatedOnNodeAdd as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_GradientNodes_EntityRemovedOnNodeDelete(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import GradientNodes_EntityRemovedOnNodeDelete as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_GraphUpdates_UpdateComponents(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import GraphUpdates_UpdateComponents as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_ComponentUpdates_UpdateGraph(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import ComponentUpdates_UpdateGraph as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_LayerBlender_NodeConstruction(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import LayerBlender_NodeConstruction as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_ShapeNodes_EntityCreatedOnNodeAdd(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import ShapeNodes_EntityCreatedOnNodeAdd as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
-
- def test_LandscapeCanvas_ShapeNodes_EntityRemovedOnNodeDelete(self, request, workspace, editor, launcher_platform):
- from .EditorScripts import ShapeNodes_EntityRemovedOnNodeDelete as test_module
- self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/large_worlds_utils/editor_dynveg_test_helper.py b/AutomatedTesting/Gem/PythonTests/largeworlds/large_worlds_utils/editor_dynveg_test_helper.py
index 37afeff8c0..fd6a907b2e 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/large_worlds_utils/editor_dynveg_test_helper.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/large_worlds_utils/editor_dynveg_test_helper.py
@@ -114,7 +114,8 @@ def create_dynamic_slice_vegetation_area(name, center_point, box_size_x, box_siz
return spawner_entity
-def create_prefab_vegetation_area(name, center_point, box_size_x, box_size_y, box_size_z, target_prefab):
+def create_temp_prefab_vegetation_area(name, center_point, box_size_x, box_size_y, box_size_z, target_prefab):
+ """Creates a vegetation area using in-memory prefabs. Use when test is solely contained to Editor"""
# Create a vegetation area entity to use as our test vegetation spawner
spawner_entity = hydra.Entity(name)
spawner_entity.create_entity(
@@ -148,6 +149,31 @@ def create_prefab_vegetation_area(name, center_point, box_size_x, box_size_y, bo
return spawner_entity
+def create_prefab_vegetation_area(name, center_point, box_size_x, box_size_y, box_size_z, prefab_path):
+ """Creates a vegetation area using on-disk spawnable prefabs. Use when test requires saving/loading in Launcher"""
+ # Create a vegetation area entity to use as our test vegetation spawner
+ prefab_asset_id = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", prefab_path, math.Uuid(),
+ False)
+ spawner_entity = hydra.Entity(name)
+ spawner_entity.create_entity(
+ center_point,
+ ["Vegetation Layer Spawner", "Box Shape", "Vegetation Asset List"]
+ )
+ if spawner_entity.id.IsValid():
+ print(f"'{spawner_entity.name}' created")
+ spawner_entity.get_set_test(1, "Box Shape|Box Configuration|Dimensions", math.Vector3(box_size_x, box_size_y,
+ box_size_z))
+
+ # Set the vegetation area to a prefab instance spawner with a specific prefab asset selected
+ descriptor = hydra.get_component_property_value(spawner_entity.components[2],
+ 'Configuration|Embedded Assets|[0]')
+ prefab_spawner = vegetation.PrefabInstanceSpawner()
+ prefab_spawner.SetPrefabAssetId(prefab_asset_id)
+ descriptor.spawner = prefab_spawner
+ spawner_entity.get_set_test(2, "Configuration|Embedded Assets|[0]", descriptor)
+ return spawner_entity
+
+
def create_blocker_area(name, center_point, box_size_x, box_size_y, box_size_z):
# Create a Vegetation Layer Blocker area
blocker_entity = hydra.Entity(name)
@@ -162,6 +188,23 @@ def create_blocker_area(name, center_point, box_size_x, box_size_y, box_size_z):
return blocker_entity
+def create_empty_vegetation_area(name, center_point, box_size_x, box_size_y, box_size_z):
+ # Create a vegetation area entity to use as our test vegetation spawner
+ spawner_entity = EditorEntity.create_editor_entity_at(center_point, name=name)
+ spawner_entity.add_components(["Vegetation Layer Spawner", "Box Shape", "Vegetation Asset List"])
+ if spawner_entity.id.IsValid():
+ print(f"'{spawner_entity.get_name()}' created")
+ spawner_entity.components[1].set_component_property_value("Box Shape|Box Configuration|Dimensions",
+ math.Vector3(box_size_x, box_size_y, box_size_z))
+
+ # Set the vegetation area to an empty spawner
+ empty_spawner = vegetation.EmptyInstanceSpawner()
+ descriptor = spawner_entity.components[2].get_component_property_value("Configuration|Embedded Assets|[0]")
+ descriptor.spawner = empty_spawner
+ spawner_entity.components[2].set_component_property_value("Configuration|Embedded Assets|[0]", descriptor)
+ return spawner_entity
+
+
def validate_instance_count(center, radius, num_expected):
# Verify that we have the correct number of instances in the given area. This creates a bounding box based on a
# sphere radius
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_black.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_black.material
index cc2c9e785b..d15aa620c7 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_black.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_black.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"baseColor": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_green.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_green.material
index a4bfb73d12..579359b085 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_green.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_green.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"baseColor": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_arch.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_arch.material
index fe9c54bc02..88d5fc0fc6 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_arch.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_arch.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"baseColor": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_bricks.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_bricks.material
index a19afa33e2..7244397ee9 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_bricks.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_bricks.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"baseColor": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_floor.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_floor.material
index 0c1208d8fb..8a3f289c26 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_floor.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_floor.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"baseColor": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_roof.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_roof.material
index 6aad4d644a..7bc193978f 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_roof.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_mat_roof.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"baseColor": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_phong5.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_phong5.material
index 302589dc85..a53cbef4e4 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_phong5.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_phong5.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"baseColor": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_red.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_red.material
index 5217a4e4be..6ddb645319 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_red.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_red.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"baseColor": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_white.material b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_white.material
index dba44f7b49..e3d310cd15 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_white.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/TestData/Test_Sponza_Material_Conversion_white.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"emissive": {
"color": [
diff --git a/AutomatedTesting/Gem/Sponza/Assets/objects/lightBlocker_lambert1.material b/AutomatedTesting/Gem/Sponza/Assets/objects/lightBlocker_lambert1.material
index c8e9f1f8f7..35677a81c6 100644
--- a/AutomatedTesting/Gem/Sponza/Assets/objects/lightBlocker_lambert1.material
+++ b/AutomatedTesting/Gem/Sponza/Assets/objects/lightBlocker_lambert1.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"emissive": {
"color": [
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic.material
index 32ac8dfd10..6af3ceb0c1 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic.material
@@ -1,6 +1,6 @@
{
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"baseColor": {
"color": [ 1.0, 1.0, 1.0 ],
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r00.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r00.material
index 1c1096bf12..541bd83981 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r00.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r00.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r01.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r01.material
index 33148f3f73..19691258e0 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r01.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r01.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r02.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r02.material
index 38339454cb..46fda2aab1 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r02.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r02.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r03.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r03.material
index e21ab5775a..79cf4bf401 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r03.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r03.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r04.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r04.material
index 0272e66081..9aabf3e158 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r04.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r04.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r05.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r05.material
index 67d51777a4..8b02f225fc 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r05.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r05.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r06.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r06.material
index 3136f654e6..5b089da4bd 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r06.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r06.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r07.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r07.material
index a79744ea11..25741cf689 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r07.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r07.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r08.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r08.material
index 1372283500..04103273f2 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r08.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r08.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r09.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r09.material
index d1c951e53c..74eb68da99 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r09.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r09.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r10.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r10.material
index d34fc46530..3533ca6676 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r10.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m00_r10.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 0.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r00.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r00.material
index 92ddfec7c4..d2ce0fadc9 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r00.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r00.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r01.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r01.material
index 874422384a..8d96ea6217 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r01.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r01.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r02.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r02.material
index b017add10b..e8feb87283 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r02.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r02.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r03.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r03.material
index 5353d651c8..c14591bd52 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r03.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r03.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r04.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r04.material
index 6dd47e4e3b..60a3167f02 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r04.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r04.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r05.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r05.material
index 04912cbfd4..d71ff06961 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r05.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r05.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r06.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r06.material
index 27f7f6ff42..6fa8cfe1a6 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r06.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r06.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r07.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r07.material
index e2b5df681c..773cc66f03 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r07.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r07.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r08.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r08.material
index 5418f9c855..6971597d1d 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r08.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r08.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r09.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r09.material
index dd1ec3489a..c2d8cc47bd 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r09.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r09.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r10.material b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r10.material
index 5f9317d2cc..906879b0ea 100644
--- a/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r10.material
+++ b/AutomatedTesting/Levels/Graphics/PbrMaterialChart/materials/basic_m10_r10.material
@@ -1,7 +1,7 @@
{
"parentMaterial": "./basic.material",
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"metallic": {
"factor": 1.0
diff --git a/AutomatedTesting/Levels/Graphics/base_empty/base_empty.prefab b/AutomatedTesting/Levels/Graphics/base_empty/base_empty.prefab
new file mode 100644
index 0000000000..f7e42e7731
--- /dev/null
+++ b/AutomatedTesting/Levels/Graphics/base_empty/base_empty.prefab
@@ -0,0 +1,53 @@
+{
+ "ContainerEntity": {
+ "Id": "Entity_[1146574390643]",
+ "Name": "Level",
+ "Components": {
+ "Component_[10641544592923449938]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 10641544592923449938
+ },
+ "Component_[12039882709170782873]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 12039882709170782873
+ },
+ "Component_[12265484671603697631]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 12265484671603697631
+ },
+ "Component_[14126657869720434043]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 14126657869720434043
+ },
+ "Component_[15230859088967841193]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 15230859088967841193,
+ "Parent Entity": ""
+ },
+ "Component_[16239496886950819870]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 16239496886950819870
+ },
+ "Component_[5688118765544765547]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 5688118765544765547
+ },
+ "Component_[6545738857812235305]": {
+ "$type": "SelectionComponent",
+ "Id": 6545738857812235305
+ },
+ "Component_[7247035804068349658]": {
+ "$type": "EditorPrefabComponent",
+ "Id": 7247035804068349658
+ },
+ "Component_[9307224322037797205]": {
+ "$type": "EditorLockComponent",
+ "Id": 9307224322037797205
+ },
+ "Component_[9562516168917670048]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9562516168917670048
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Levels/Graphics/base_empty/tags.txt b/AutomatedTesting/Levels/Graphics/base_empty/tags.txt
new file mode 100644
index 0000000000..0d6c1880e7
--- /dev/null
+++ b/AutomatedTesting/Levels/Graphics/base_empty/tags.txt
@@ -0,0 +1,12 @@
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
diff --git a/AutomatedTesting/Levels/Multiplayer/SimpleNetworkLevelEntity/Player.prefab b/AutomatedTesting/Levels/Multiplayer/SimpleNetworkLevelEntity/Player.prefab
new file mode 100644
index 0000000000..975319a516
--- /dev/null
+++ b/AutomatedTesting/Levels/Multiplayer/SimpleNetworkLevelEntity/Player.prefab
@@ -0,0 +1,151 @@
+{
+ "ContainerEntity": {
+ "Id": "ContainerEntity",
+ "Name": "Player",
+ "Components": {
+ "Component_[10626669441604518614]": {
+ "$type": "EditorPrefabComponent",
+ "Id": 10626669441604518614
+ },
+ "Component_[15284109105474306026]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 15284109105474306026
+ },
+ "Component_[1884250773831675865]": {
+ "$type": "SelectionComponent",
+ "Id": 1884250773831675865
+ },
+ "Component_[3027124663594865592]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 3027124663594865592
+ },
+ "Component_[3314300526416851038]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 3314300526416851038,
+ "Child Entity Order": [
+ "Entity_[1340484004600]"
+ ]
+ },
+ "Component_[5583377204116393478]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 5583377204116393478
+ },
+ "Component_[5897955848881060165]": {
+ "$type": "EditorLockComponent",
+ "Id": 5897955848881060165
+ },
+ "Component_[6405389103180201977]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6405389103180201977,
+ "Parent Entity": ""
+ },
+ "Component_[7695912346724202125]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 7695912346724202125
+ },
+ "Component_[775363990560391238]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 775363990560391238
+ },
+ "Component_[904355854135646057]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 904355854135646057
+ }
+ }
+ },
+ "Entities": {
+ "Entity_[1340484004600]": {
+ "Id": "Entity_[1340484004600]",
+ "Name": "Player",
+ "Components": {
+ "Component_[12294726333564087591]": {
+ "$type": "SelectionComponent",
+ "Id": 12294726333564087591
+ },
+ "Component_[13587084088242540786]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 13587084088242540786,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 6819443882832501114
+ },
+ {
+ "ComponentId": 4337571454344109612,
+ "SortIndex": 1
+ },
+ {
+ "ComponentId": 16457408099527309065,
+ "SortIndex": 2
+ },
+ {
+ "ComponentId": 5577505593558922067,
+ "SortIndex": 3
+ }
+ ]
+ },
+ "Component_[14335168881008289852]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 14335168881008289852
+ },
+ "Component_[16308902899170829847]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 16308902899170829847
+ },
+ "Component_[16457408099527309065]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 16457408099527309065,
+ "m_template": {
+ "$type": "Multiplayer::NetworkTransformComponent"
+ }
+ },
+ "Component_[16541569566865026527]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 16541569566865026527
+ },
+ "Component_[2002761223483048905]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 2002761223483048905
+ },
+ "Component_[4337571454344109612]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 4337571454344109612,
+ "m_template": {
+ "$type": "NetBindComponent"
+ }
+ },
+ "Component_[477591477979440744]": {
+ "$type": "EditorLockComponent",
+ "Id": 477591477979440744
+ },
+ "Component_[5577505593558922067]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 5577505593558922067,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{6DE0E9A8-A1C7-5D0F-9407-4E627C1F223C}",
+ "subId": 284780167
+ },
+ "assetHint": "models/sphere.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[5828214869455694702]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5828214869455694702
+ },
+ "Component_[6819443882832501114]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6819443882832501114,
+ "Parent Entity": "ContainerEntity"
+ },
+ "Component_[8838623765985560328]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 8838623765985560328
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Levels/Multiplayer/SimpleNetworkLevelEntity/SimpleNetworkLevelEntity.prefab b/AutomatedTesting/Levels/Multiplayer/SimpleNetworkLevelEntity/SimpleNetworkLevelEntity.prefab
new file mode 100644
index 0000000000..abe458246a
--- /dev/null
+++ b/AutomatedTesting/Levels/Multiplayer/SimpleNetworkLevelEntity/SimpleNetworkLevelEntity.prefab
@@ -0,0 +1,580 @@
+{
+ "ContainerEntity": {
+ "Id": "Entity_[1146574390643]",
+ "Name": "Level",
+ "Components": {
+ "Component_[10641544592923449938]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 10641544592923449938
+ },
+ "Component_[12039882709170782873]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 12039882709170782873
+ },
+ "Component_[12265484671603697631]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 12265484671603697631
+ },
+ "Component_[14126657869720434043]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 14126657869720434043,
+ "Child Entity Order": [
+ "Entity_[1176639161715]",
+ "Entity_[806656324666]"
+ ]
+ },
+ "Component_[15230859088967841193]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 15230859088967841193,
+ "Parent Entity": ""
+ },
+ "Component_[16239496886950819870]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 16239496886950819870
+ },
+ "Component_[5688118765544765547]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 5688118765544765547
+ },
+ "Component_[6545738857812235305]": {
+ "$type": "SelectionComponent",
+ "Id": 6545738857812235305
+ },
+ "Component_[7247035804068349658]": {
+ "$type": "EditorPrefabComponent",
+ "Id": 7247035804068349658
+ },
+ "Component_[9307224322037797205]": {
+ "$type": "EditorLockComponent",
+ "Id": 9307224322037797205
+ },
+ "Component_[9562516168917670048]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9562516168917670048
+ }
+ }
+ },
+ "Entities": {
+ "Entity_[1155164325235]": {
+ "Id": "Entity_[1155164325235]",
+ "Name": "Sun",
+ "Components": {
+ "Component_[10440557478882592717]": {
+ "$type": "SelectionComponent",
+ "Id": 10440557478882592717
+ },
+ "Component_[13620450453324765907]": {
+ "$type": "EditorLockComponent",
+ "Id": 13620450453324765907
+ },
+ "Component_[2134313378593666258]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 2134313378593666258
+ },
+ "Component_[234010807770404186]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 234010807770404186
+ },
+ "Component_[2970359110423865725]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 2970359110423865725
+ },
+ "Component_[3722854130373041803]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3722854130373041803
+ },
+ "Component_[5992533738676323195]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5992533738676323195
+ },
+ "Component_[7378860763541895402]": {
+ "$type": "AZ::Render::EditorDirectionalLightComponent",
+ "Id": 7378860763541895402,
+ "Controller": {
+ "Configuration": {
+ "Intensity": 1.0,
+ "CameraEntityId": "",
+ "ShadowFilterMethod": 1
+ }
+ }
+ },
+ "Component_[7892834440890947578]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 7892834440890947578,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Translate": [
+ 0.0,
+ 0.0,
+ 13.487043380737305
+ ],
+ "Rotate": [
+ -76.13099670410156,
+ -0.847000002861023,
+ -15.8100004196167
+ ]
+ }
+ },
+ "Component_[8599729549570828259]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 8599729549570828259
+ },
+ "Component_[952797371922080273]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 952797371922080273
+ }
+ }
+ },
+ "Entity_[1159459292531]": {
+ "Id": "Entity_[1159459292531]",
+ "Name": "Ground",
+ "Components": {
+ "Component_[11701138785793981042]": {
+ "$type": "SelectionComponent",
+ "Id": 11701138785793981042
+ },
+ "Component_[12260880513256986252]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 12260880513256986252
+ },
+ "Component_[13711420870643673468]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 13711420870643673468
+ },
+ "Component_[138002849734991713]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 138002849734991713
+ },
+ "Component_[16578565737331764849]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 16578565737331764849,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[16919232076966545697]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 16919232076966545697
+ },
+ "Component_[5182430712893438093]": {
+ "$type": "EditorMaterialComponent",
+ "Id": 5182430712893438093
+ },
+ "Component_[5675108321710651991]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 5675108321710651991,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{0CD745C0-6AA8-569A-A68A-73A3270986C4}",
+ "subId": 277889906
+ },
+ "assetHint": "objects/groudplane/groundplane_512x512m.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[5681893399601237518]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5681893399601237518
+ },
+ "Component_[592692962543397545]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 592692962543397545
+ },
+ "Component_[7090012899106946164]": {
+ "$type": "EditorLockComponent",
+ "Id": 7090012899106946164
+ },
+ "Component_[9410832619875640998]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 9410832619875640998
+ }
+ }
+ },
+ "Entity_[1163754259827]": {
+ "Id": "Entity_[1163754259827]",
+ "Name": "Camera",
+ "Components": {
+ "Component_[11895140916889160460]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11895140916889160460
+ },
+ "Component_[16880285896855930892]": {
+ "$type": "{CA11DA46-29FF-4083-B5F6-E02C3A8C3A3D} EditorCameraComponent",
+ "Id": 16880285896855930892,
+ "Controller": {
+ "Configuration": {
+ "Field of View": 55.0,
+ "EditorEntityId": 9021008456353177945
+ }
+ }
+ },
+ "Component_[17187464423780271193]": {
+ "$type": "EditorLockComponent",
+ "Id": 17187464423780271193
+ },
+ "Component_[17495696818315413311]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 17495696818315413311
+ },
+ "Component_[18086214374043522055]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 18086214374043522055,
+ "Parent Entity": "Entity_[1176639161715]",
+ "Transform Data": {
+ "Translate": [
+ -2.3000001907348633,
+ -3.9368600845336914,
+ 1.0
+ ],
+ "Rotate": [
+ -2.050307512283325,
+ 1.9552897214889526,
+ -43.623355865478516
+ ]
+ }
+ },
+ "Component_[18387556550380114975]": {
+ "$type": "SelectionComponent",
+ "Id": 18387556550380114975
+ },
+ "Component_[2654521436129313160]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 2654521436129313160
+ },
+ "Component_[5265045084611556958]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5265045084611556958
+ },
+ "Component_[7169798125182238623]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7169798125182238623
+ },
+ "Component_[7255796294953281766]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 7255796294953281766,
+ "m_template": {
+ "$type": "FlyCameraInputComponent"
+ }
+ },
+ "Component_[8866210352157164042]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 8866210352157164042
+ },
+ "Component_[9129253381063760879]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 9129253381063760879
+ }
+ }
+ },
+ "Entity_[1168049227123]": {
+ "Id": "Entity_[1168049227123]",
+ "Name": "Grid",
+ "Components": {
+ "Component_[11443347433215807130]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 11443347433215807130
+ },
+ "Component_[11779275529534764488]": {
+ "$type": "SelectionComponent",
+ "Id": 11779275529534764488
+ },
+ "Component_[14249419413039427459]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14249419413039427459
+ },
+ "Component_[15448581635946161318]": {
+ "$type": "AZ::Render::EditorGridComponent",
+ "Id": 15448581635946161318,
+ "Controller": {
+ "Configuration": {
+ "primarySpacing": 4.0,
+ "primaryColor": [
+ 0.501960813999176,
+ 0.501960813999176,
+ 0.501960813999176
+ ],
+ "secondarySpacing": 0.5,
+ "secondaryColor": [
+ 0.250980406999588,
+ 0.250980406999588,
+ 0.250980406999588
+ ]
+ }
+ }
+ },
+ "Component_[1843303322527297409]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 1843303322527297409
+ },
+ "Component_[380249072065273654]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 380249072065273654,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[7476660583684339787]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 7476660583684339787
+ },
+ "Component_[7557626501215118375]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 7557626501215118375
+ },
+ "Component_[7984048488947365511]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 7984048488947365511
+ },
+ "Component_[8118181039276487398]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 8118181039276487398
+ },
+ "Component_[9189909764215270515]": {
+ "$type": "EditorLockComponent",
+ "Id": 9189909764215270515
+ }
+ }
+ },
+ "Entity_[1176639161715]": {
+ "Id": "Entity_[1176639161715]",
+ "Name": "Atom Default Environment",
+ "Components": {
+ "Component_[10757302973393310045]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 10757302973393310045,
+ "Parent Entity": "Entity_[1146574390643]"
+ },
+ "Component_[14505817420424255464]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 14505817420424255464,
+ "ComponentOrderEntryArray": [
+ {
+ "ComponentId": 10757302973393310045
+ }
+ ]
+ },
+ "Component_[14988041764659020032]": {
+ "$type": "EditorLockComponent",
+ "Id": 14988041764659020032
+ },
+ "Component_[15808690248755038124]": {
+ "$type": "SelectionComponent",
+ "Id": 15808690248755038124
+ },
+ "Component_[15900837685796817138]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 15900837685796817138
+ },
+ "Component_[3298767348226484884]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3298767348226484884
+ },
+ "Component_[4076975109609220594]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 4076975109609220594
+ },
+ "Component_[5679760548946028854]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 5679760548946028854
+ },
+ "Component_[5855590796136709437]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 5855590796136709437,
+ "Child Entity Order": [
+ "Entity_[1155164325235]",
+ "Entity_[1180934129011]",
+ "Entity_[1168049227123]",
+ "Entity_[1163754259827]",
+ "Entity_[1159459292531]"
+ ]
+ },
+ "Component_[9277695270015777859]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 9277695270015777859
+ }
+ }
+ },
+ "Entity_[1180934129011]": {
+ "Id": "Entity_[1180934129011]",
+ "Name": "Global Sky",
+ "Components": {
+ "Component_[11231930600558681245]": {
+ "$type": "AZ::Render::EditorHDRiSkyboxComponent",
+ "Id": 11231930600558681245,
+ "Controller": {
+ "Configuration": {
+ "CubemapAsset": {
+ "assetId": {
+ "guid": "{215E47FD-D181-5832-B1AB-91673ABF6399}",
+ "subId": 1000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_skyboxcm.exr.streamingimage"
+ }
+ }
+ }
+ },
+ "Component_[11980494120202836095]": {
+ "$type": "SelectionComponent",
+ "Id": 11980494120202836095
+ },
+ "Component_[1428633914413949476]": {
+ "$type": "EditorLockComponent",
+ "Id": 1428633914413949476
+ },
+ "Component_[14936200426671614999]": {
+ "$type": "AZ::Render::EditorImageBasedLightComponent",
+ "Id": 14936200426671614999,
+ "Controller": {
+ "Configuration": {
+ "diffuseImageAsset": {
+ "assetId": {
+ "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+ "subId": 3000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_ibldiffuse.exr.streamingimage"
+ },
+ "specularImageAsset": {
+ "assetId": {
+ "guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
+ "subId": 2000
+ },
+ "assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_iblspecular.exr.streamingimage"
+ }
+ }
+ }
+ },
+ "Component_[14994774102579326069]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 14994774102579326069
+ },
+ "Component_[15417479889044493340]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 15417479889044493340
+ },
+ "Component_[15826613364991382688]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 15826613364991382688
+ },
+ "Component_[1665003113283562343]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 1665003113283562343
+ },
+ "Component_[3704934735944502280]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 3704934735944502280
+ },
+ "Component_[5698542331457326479]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 5698542331457326479
+ },
+ "Component_[6644513399057217122]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 6644513399057217122,
+ "Parent Entity": "Entity_[1176639161715]"
+ },
+ "Component_[931091830724002070]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 931091830724002070
+ }
+ }
+ },
+ "Entity_[806656324666]": {
+ "Id": "Entity_[806656324666]",
+ "Name": "NetEntity",
+ "Components": {
+ "Component_[10272449525230713408]": {
+ "$type": "EditorScriptCanvasComponent",
+ "Id": 10272449525230713408,
+ "m_name": "SimpleNetworkLevelEntity.scriptcanvas",
+ "runtimeDataIsValid": true,
+ "runtimeDataOverrides": {
+ "source": {
+ "id": "{C8F17F94-1225-5FFB-A89F-7C5546FF9DD2}",
+ "path": "C:/prj/o3de/AutomatedTesting/Levels/Multiplayer/SimpleNetworkLevelEntity/SimpleNetworkLevelEntity.scriptcanvas"
+ }
+ },
+ "sourceHandle": {
+ "id": "{C8F17F94-1225-5FFB-A89F-7C5546FF9DD2}",
+ "path": "C:/prj/o3de/AutomatedTesting/Levels/Multiplayer/SimpleNetworkLevelEntity/SimpleNetworkLevelEntity.scriptcanvas"
+ }
+ },
+ "Component_[12604265186664827718]": {
+ "$type": "EditorDisabledCompositionComponent",
+ "Id": 12604265186664827718
+ },
+ "Component_[12971088454284742740]": {
+ "$type": "EditorInspectorComponent",
+ "Id": 12971088454284742740
+ },
+ "Component_[13637345797899267673]": {
+ "$type": "EditorPendingCompositionComponent",
+ "Id": 13637345797899267673
+ },
+ "Component_[14691827217729577086]": {
+ "$type": "EditorVisibilityComponent",
+ "Id": 14691827217729577086
+ },
+ "Component_[17587769654029626028]": {
+ "$type": "AZ::Render::EditorMeshComponent",
+ "Id": 17587769654029626028,
+ "Controller": {
+ "Configuration": {
+ "ModelAsset": {
+ "assetId": {
+ "guid": "{6DE0E9A8-A1C7-5D0F-9407-4E627C1F223C}",
+ "subId": 284780167
+ },
+ "assetHint": "models/sphere.azmodel"
+ }
+ }
+ }
+ },
+ "Component_[3583806849894952953]": {
+ "$type": "EditorOnlyEntityComponent",
+ "Id": 3583806849894952953
+ },
+ "Component_[3992057042487734240]": {
+ "$type": "EditorLockComponent",
+ "Id": 3992057042487734240
+ },
+ "Component_[4205899043279271481]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 4205899043279271481,
+ "m_template": {
+ "$type": "Multiplayer::NetworkTransformComponent"
+ }
+ },
+ "Component_[4416976521140638764]": {
+ "$type": "EditorEntityIconComponent",
+ "Id": 4416976521140638764
+ },
+ "Component_[4951162661196722987]": {
+ "$type": "EditorEntitySortComponent",
+ "Id": 4951162661196722987
+ },
+ "Component_[57491843687005111]": {
+ "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
+ "Id": 57491843687005111,
+ "Parent Entity": "Entity_[1146574390643]",
+ "Transform Data": {
+ "Translate": [
+ -0.010266244411468506,
+ 0.09999752044677734,
+ 0.4922151565551758
+ ]
+ }
+ },
+ "Component_[7427201282284088219]": {
+ "$type": "SelectionComponent",
+ "Id": 7427201282284088219
+ },
+ "Component_[9767802049284917261]": {
+ "$type": "GenericComponentWrapper",
+ "Id": 9767802049284917261,
+ "m_template": {
+ "$type": "NetBindComponent"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Levels/Multiplayer/SimpleNetworkLevelEntity/SimpleNetworkLevelEntity.scriptcanvas b/AutomatedTesting/Levels/Multiplayer/SimpleNetworkLevelEntity/SimpleNetworkLevelEntity.scriptcanvas
new file mode 100644
index 0000000000..7f41ed9af2
--- /dev/null
+++ b/AutomatedTesting/Levels/Multiplayer/SimpleNetworkLevelEntity/SimpleNetworkLevelEntity.scriptcanvas
@@ -0,0 +1,228 @@
+{
+ "Type": "JsonSerialization",
+ "Version": 1,
+ "ClassName": "ScriptCanvasData",
+ "ClassData": {
+ "m_scriptCanvas": {
+ "Id": {
+ "id": 5227099818161821361
+ },
+ "Name": "Script Canvas Graph",
+ "Components": {
+ "Component_[14745706451564425001]": {
+ "$type": "EditorGraphVariableManagerComponent",
+ "Id": 14745706451564425001
+ },
+ "Component_[6188351434280490877]": {
+ "$type": "EditorGraph",
+ "Id": 6188351434280490877,
+ "m_graphData": {
+ "m_nodes": [
+ {
+ "Id": {
+ "id": 1181151842701
+ },
+ "Name": "SC-Node(Print)",
+ "Components": {
+ "Component_[11204048151736284490]": {
+ "$type": "Print",
+ "Id": 11204048151736284490,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{A417FF98-493E-4DE6-AD3A-E7A1848661E4}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "In",
+ "toolTip": "Input signal",
+ "Descriptor": {
+ "ConnectionType": 1,
+ "SlotType": 1
+ }
+ },
+ {
+ "id": {
+ "m_id": "{38BC2AB1-7654-407E-9903-4B5D77EDB6F3}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ }
+ ],
+ "m_format": "SimpleNetworkLevelEntity: On Graph Start\n",
+ "m_unresolvedString": [
+ "SimpleNetworkLevelEntity: On Graph Start\n"
+ ]
+ }
+ }
+ },
+ {
+ "Id": {
+ "id": 811784655245
+ },
+ "Name": "SC-Node(Start)",
+ "Components": {
+ "Component_[2986280341871382503]": {
+ "$type": "Start",
+ "Id": 2986280341871382503,
+ "Slots": [
+ {
+ "id": {
+ "m_id": "{61FBEFC6-23BA-4A53-89BF-D0D0E834608C}"
+ },
+ "contracts": [
+ {
+ "$type": "SlotTypeContract"
+ }
+ ],
+ "slotName": "Out",
+ "toolTip": "Signaled when the entity that owns this graph is fully activated.",
+ "Descriptor": {
+ "ConnectionType": 2,
+ "SlotType": 1
+ }
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "m_connections": [
+ {
+ "Id": {
+ "id": 2521181639053
+ },
+ "Name": "srcEndpoint=(On Graph Start: Out), destEndpoint=(Print: In)",
+ "Components": {
+ "Component_[16295428600276205051]": {
+ "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection",
+ "Id": 16295428600276205051,
+ "sourceEndpoint": {
+ "nodeId": {
+ "id": 811784655245
+ },
+ "slotId": {
+ "m_id": "{61FBEFC6-23BA-4A53-89BF-D0D0E834608C}"
+ }
+ },
+ "targetEndpoint": {
+ "nodeId": {
+ "id": 1181151842701
+ },
+ "slotId": {
+ "m_id": "{A417FF98-493E-4DE6-AD3A-E7A1848661E4}"
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ "m_assetType": "{00000000-0000-0000-D033-B2489A010000}",
+ "versionData": {
+ "_grammarVersion": 1,
+ "_runtimeVersion": 1,
+ "_fileVersion": 1
+ },
+ "GraphCanvasData": [
+ {
+ "Key": {
+ "id": 811784655245
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "TimeNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 340.0,
+ 180.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{6045F7F7-02B0-442A-96C7-A0CBCEFF7275}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 1181151842701
+ },
+ "Value": {
+ "ComponentData": {
+ "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": {
+ "$type": "NodeSaveData"
+ },
+ "{328FF15C-C302-458F-A43D-E1794DE0904E}": {
+ "$type": "GeneralNodeTitleComponentSaveData",
+ "PaletteOverride": "StringNodeTitlePalette"
+ },
+ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": {
+ "$type": "GeometrySaveData",
+ "Position": [
+ 580.0,
+ 180.0
+ ]
+ },
+ "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": {
+ "$type": "StylingComponentSaveData"
+ },
+ "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": {
+ "$type": "PersistentIdComponentSaveData",
+ "PersistentId": "{589F773E-D82A-4EDD-AEBD-3ADC07FC67CE}"
+ }
+ }
+ }
+ },
+ {
+ "Key": {
+ "id": 5227099818161821361
+ },
+ "Value": {
+ "ComponentData": {
+ "{5F84B500-8C45-40D1-8EFC-A5306B241444}": {
+ "$type": "SceneComponentSaveData"
+ }
+ }
+ }
+ }
+ ],
+ "StatisticsHelper": {
+ "InstanceCounter": [
+ {
+ "Key": 4199610336680704683,
+ "Value": 1
+ },
+ {
+ "Key": 10684225535275896474,
+ "Value": 1
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AutomatedTesting/Levels/Multiplayer/SimpleNetworkLevelEntity/tags.txt b/AutomatedTesting/Levels/Multiplayer/SimpleNetworkLevelEntity/tags.txt
new file mode 100644
index 0000000000..0d6c1880e7
--- /dev/null
+++ b/AutomatedTesting/Levels/Multiplayer/SimpleNetworkLevelEntity/tags.txt
@@ -0,0 +1,12 @@
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
+0,0,0,0,0,0
diff --git a/AutomatedTesting/Materials/DefaultPBRTransparent.material b/AutomatedTesting/Materials/DefaultPBRTransparent.material
index 7c8aa6cf94..a7000d5371 100644
--- a/AutomatedTesting/Materials/DefaultPBRTransparent.material
+++ b/AutomatedTesting/Materials/DefaultPBRTransparent.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/StandardPBR.materialtype",
"parentMaterial": "Materials/Presets/PBR/default_grid.material",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"opacity": {
"mode": "Blended"
diff --git a/AutomatedTesting/Materials/basic_grey.material b/AutomatedTesting/Materials/basic_grey.material
index 0b890db4c6..6ecc1e029a 100644
--- a/AutomatedTesting/Materials/basic_grey.material
+++ b/AutomatedTesting/Materials/basic_grey.material
@@ -1,6 +1,6 @@
{
"materialType": "Materials/Types/StandardPBR.materialtype",
- "propertyLayoutVersion": 1,
+ "materialTypeVersion": 1,
"properties": {
"baseColor": {
"color": [ 0.18, 0.18, 0.18 ],
diff --git a/AutomatedTesting/Objects/MorphTargets/DisplayWrinkleMaskBlendValues.material b/AutomatedTesting/Objects/MorphTargets/DisplayWrinkleMaskBlendValues.material
index 878b3ac39f..52c323b454 100644
--- a/AutomatedTesting/Objects/MorphTargets/DisplayWrinkleMaskBlendValues.material
+++ b/AutomatedTesting/Objects/MorphTargets/DisplayWrinkleMaskBlendValues.material
@@ -2,7 +2,7 @@
"description": "",
"materialType": "Materials/Types/Skin.materialtype",
"parentMaterial": "",
- "propertyLayoutVersion": 3,
+ "materialTypeVersion": 3,
"properties": {
"wrinkleLayers": {
"count": 3,
diff --git a/Gems/ScriptCanvas/Assets/TranslationAssets/AZEvents/AuthorityToAutonomousNoParamsNotifyEvent.names b/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AuthorityToAutonomousNoParamsNotifyEvent.names
similarity index 100%
rename from Gems/ScriptCanvas/Assets/TranslationAssets/AZEvents/AuthorityToAutonomousNoParamsNotifyEvent.names
rename to AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AuthorityToAutonomousNoParamsNotifyEvent.names
diff --git a/Gems/ScriptCanvas/Assets/TranslationAssets/AZEvents/AuthorityToAutonomousNotifyEvent.names b/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AuthorityToAutonomousNotifyEvent.names
similarity index 100%
rename from Gems/ScriptCanvas/Assets/TranslationAssets/AZEvents/AuthorityToAutonomousNotifyEvent.names
rename to AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AuthorityToAutonomousNotifyEvent.names
diff --git a/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AuthorityToAutonomous_PlayerNumberNotifyEvent.names b/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AuthorityToAutonomous_PlayerNumberNotifyEvent.names
new file mode 100644
index 0000000000..7255c61d23
--- /dev/null
+++ b/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AuthorityToAutonomous_PlayerNumberNotifyEvent.names
@@ -0,0 +1,56 @@
+{
+ "entries": [
+ {
+ "base": "AuthorityToAutonomous_PlayerNumber Notify Event",
+ "context": "AZEventHandler",
+ "variant": "",
+ "details": {
+ "name": "Authority To Autonomous_ Player Number Notify Event"
+ },
+ "slots": [
+ {
+ "base": "player_number",
+ "details": {
+ "name": "player_number"
+ }
+ },
+ {
+ "base": "AuthorityToAutonomous_PlayerNumber Notify Event",
+ "details": {
+ "name": "AuthorityToAutonomous_PlayerNumber Notify Event"
+ }
+ },
+ {
+ "base": "Connect",
+ "details": {
+ "name": "Connect"
+ }
+ },
+ {
+ "base": "Disconnect",
+ "details": {
+ "name": "Disconnect"
+ }
+ },
+ {
+ "base": "On Connected",
+ "details": {
+ "name": "On Connected"
+ }
+ },
+ {
+ "base": "On Disconnected",
+ "details": {
+ "name": "On Disconnected"
+ }
+ },
+ {
+ "base": "OnEvent",
+ "details": {
+ "name": "OnEvent"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Gems/ScriptCanvas/Assets/TranslationAssets/AZEvents/AuthorityToClientNoParamsNotifyEvent.names b/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AuthorityToClientNoParamsNotifyEvent.names
similarity index 100%
rename from Gems/ScriptCanvas/Assets/TranslationAssets/AZEvents/AuthorityToClientNoParamsNotifyEvent.names
rename to AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AuthorityToClientNoParamsNotifyEvent.names
diff --git a/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AuthorityToClientNoParams_PlayFxNotifyEvent.names b/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AuthorityToClientNoParams_PlayFxNotifyEvent.names
new file mode 100644
index 0000000000..3e0207a705
--- /dev/null
+++ b/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AuthorityToClientNoParams_PlayFxNotifyEvent.names
@@ -0,0 +1,50 @@
+{
+ "entries": [
+ {
+ "base": "AuthorityToClientNoParams_PlayFx Notify Event",
+ "context": "AZEventHandler",
+ "variant": "",
+ "details": {
+ "name": "Authority To Client No Params_ Play Fx Notify Event"
+ },
+ "slots": [
+ {
+ "base": "AuthorityToClientNoParams_PlayFx Notify Event",
+ "details": {
+ "name": "AuthorityToClientNoParams_PlayFx Notify Event"
+ }
+ },
+ {
+ "base": "Connect",
+ "details": {
+ "name": "Connect"
+ }
+ },
+ {
+ "base": "Disconnect",
+ "details": {
+ "name": "Disconnect"
+ }
+ },
+ {
+ "base": "On Connected",
+ "details": {
+ "name": "On Connected"
+ }
+ },
+ {
+ "base": "On Disconnected",
+ "details": {
+ "name": "On Disconnected"
+ }
+ },
+ {
+ "base": "OnEvent",
+ "details": {
+ "name": "OnEvent"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Gems/ScriptCanvas/Assets/TranslationAssets/AZEvents/AuthorityToClientNotifyEvent.names b/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AuthorityToClientNotifyEvent.names
similarity index 100%
rename from Gems/ScriptCanvas/Assets/TranslationAssets/AZEvents/AuthorityToClientNotifyEvent.names
rename to AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AuthorityToClientNotifyEvent.names
diff --git a/Gems/ScriptCanvas/Assets/TranslationAssets/AZEvents/AutonomousToAuthorityNoParamsNotifyEvent.names b/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AutonomousToAuthorityNoParamsNotifyEvent.names
similarity index 100%
rename from Gems/ScriptCanvas/Assets/TranslationAssets/AZEvents/AutonomousToAuthorityNoParamsNotifyEvent.names
rename to AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AutonomousToAuthorityNoParamsNotifyEvent.names
diff --git a/Gems/ScriptCanvas/Assets/TranslationAssets/AZEvents/AutonomousToAuthorityNotifyEvent.names b/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AutonomousToAuthorityNotifyEvent.names
similarity index 100%
rename from Gems/ScriptCanvas/Assets/TranslationAssets/AZEvents/AutonomousToAuthorityNotifyEvent.names
rename to AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/AutonomousToAuthorityNotifyEvent.names
diff --git a/Gems/ScriptCanvas/Assets/TranslationAssets/AZEvents/ServerToAuthorityNoParamNotifyEvent.names b/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/ServerToAuthorityNoParamNotifyEvent.names
similarity index 100%
rename from Gems/ScriptCanvas/Assets/TranslationAssets/AZEvents/ServerToAuthorityNoParamNotifyEvent.names
rename to AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/ServerToAuthorityNoParamNotifyEvent.names
diff --git a/Gems/ScriptCanvas/Assets/TranslationAssets/AZEvents/ServerToAuthorityNotifyEvent.names b/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/ServerToAuthorityNotifyEvent.names
similarity index 100%
rename from Gems/ScriptCanvas/Assets/TranslationAssets/AZEvents/ServerToAuthorityNotifyEvent.names
rename to AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/ServerToAuthorityNotifyEvent.names
diff --git a/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/ServerToAuthority_DealDamageNotifyEvent.names b/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/ServerToAuthority_DealDamageNotifyEvent.names
new file mode 100644
index 0000000000..2505d9593a
--- /dev/null
+++ b/AutomatedTesting/ScriptCanvas/TranslationAssets/AZEvents/ServerToAuthority_DealDamageNotifyEvent.names
@@ -0,0 +1,56 @@
+{
+ "entries": [
+ {
+ "base": "ServerToAuthority_DealDamage Notify Event",
+ "context": "AZEventHandler",
+ "variant": "",
+ "details": {
+ "name": "Server To Authority_ Deal Damage Notify Event"
+ },
+ "slots": [
+ {
+ "base": "damage",
+ "details": {
+ "name": "damage"
+ }
+ },
+ {
+ "base": "ServerToAuthority_DealDamage Notify Event",
+ "details": {
+ "name": "ServerToAuthority_DealDamage Notify Event"
+ }
+ },
+ {
+ "base": "Connect",
+ "details": {
+ "name": "Connect"
+ }
+ },
+ {
+ "base": "Disconnect",
+ "details": {
+ "name": "Disconnect"
+ }
+ },
+ {
+ "base": "On Connected",
+ "details": {
+ "name": "On Connected"
+ }
+ },
+ {
+ "base": "On Disconnected",
+ "details": {
+ "name": "On Disconnected"
+ }
+ },
+ {
+ "base": "OnEvent",
+ "details": {
+ "name": "OnEvent"
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Gems/ScriptCanvas/Assets/TranslationAssets/Classes/NetworkTestPlayerComponent.names b/AutomatedTesting/ScriptCanvas/TranslationAssets/Classes/NetworkTestPlayerComponent.names
similarity index 90%
rename from Gems/ScriptCanvas/Assets/TranslationAssets/Classes/NetworkTestPlayerComponent.names
rename to AutomatedTesting/ScriptCanvas/TranslationAssets/Classes/NetworkTestPlayerComponent.names
index 22636e0453..03e949f784 100644
--- a/Gems/ScriptCanvas/Assets/TranslationAssets/Classes/NetworkTestPlayerComponent.names
+++ b/AutomatedTesting/ScriptCanvas/TranslationAssets/Classes/NetworkTestPlayerComponent.names
@@ -8,64 +8,6 @@
"name": "Network Test Player Component"
},
"methods": [
- {
- "base": "AutonomousToAuthority",
- "context": "NetworkTestPlayerComponent",
- "entry": {
- "name": "In",
- "tooltip": "When signaled, this will invoke Autonomous To Authority"
- },
- "exit": {
- "name": "Out",
- "tooltip": "Signaled after Autonomous To Authority is invoked"
- },
- "details": {
- "name": "Autonomous To Authority"
- },
- "params": [
- {
- "typeid": "{CA5E5C37-98A6-04D2-E15C-1B4BFEE4C7DD}",
- "details": {
- "name": "Network Test Player Component"
- }
- },
- {
- "typeid": "{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}",
- "details": {
- "name": "float"
- }
- }
- ]
- },
- {
- "base": "ServerToAuthority",
- "context": "NetworkTestPlayerComponent",
- "entry": {
- "name": "In",
- "tooltip": "When signaled, this will invoke Server To Authority"
- },
- "exit": {
- "name": "Out",
- "tooltip": "Signaled after Server To Authority is invoked"
- },
- "details": {
- "name": "Server To Authority"
- },
- "params": [
- {
- "typeid": "{CA5E5C37-98A6-04D2-E15C-1B4BFEE4C7DD}",
- "details": {
- "name": "Network Test Player Component"
- }
- },
- {
- "typeid": "{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}",
- "details": {
- "name": "float"
- }
- }
- ]
- },
{
"base": "AutonomousToAuthorityByEntityId",
"context": "NetworkTestPlayerComponent",
@@ -97,18 +39,72 @@
]
},
{
- "base": "ServerToAuthorityByEntityId",
+ "base": "AuthorityToClientNoParams_PlayFxByEntityId",
"context": "NetworkTestPlayerComponent",
"entry": {
"name": "In",
- "tooltip": "When signaled, this will invoke Server To Authority By Entity Id"
+ "tooltip": "When signaled, this will invoke Authority To Client No Params_ Play Fx By Entity Id"
},
"exit": {
"name": "Out",
- "tooltip": "Signaled after Server To Authority By Entity Id is invoked"
+ "tooltip": "Signaled after Authority To Client No Params_ Play Fx By Entity Id is invoked"
},
"details": {
- "name": "Server To Authority By Entity Id"
+ "name": "Authority To Client No Params_ Play Fx By Entity Id"
+ },
+ "params": [
+ {
+ "typeid": "{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}",
+ "details": {
+ "name": "Source",
+ "tooltip": "The Source containing the NetworkTestPlayerComponentController"
+ }
+ }
+ ]
+ },
+ {
+ "base": "AuthorityToAutonomous_PlayerNumberByEntityId",
+ "context": "NetworkTestPlayerComponent",
+ "entry": {
+ "name": "In",
+ "tooltip": "When signaled, this will invoke Authority To Autonomous_ Player Number By Entity Id"
+ },
+ "exit": {
+ "name": "Out",
+ "tooltip": "Signaled after Authority To Autonomous_ Player Number By Entity Id is invoked"
+ },
+ "details": {
+ "name": "Authority To Autonomous_ Player Number By Entity Id"
+ },
+ "params": [
+ {
+ "typeid": "{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}",
+ "details": {
+ "name": "Source",
+ "tooltip": "The Source containing the NetworkTestPlayerComponentController"
+ }
+ },
+ {
+ "typeid": "{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}",
+ "details": {
+ "name": "player_number"
+ }
+ }
+ ]
+ },
+ {
+ "base": "ServerToAuthority_DealDamageByEntityId",
+ "context": "NetworkTestPlayerComponent",
+ "entry": {
+ "name": "In",
+ "tooltip": "When signaled, this will invoke Server To Authority_ Deal Damage By Entity Id"
+ },
+ "exit": {
+ "name": "Out",
+ "tooltip": "Signaled after Server To Authority_ Deal Damage By Entity Id is invoked"
+ },
+ "details": {
+ "name": "Server To Authority_ Deal Damage By Entity Id"
},
"params": [
{
@@ -121,47 +117,48 @@
{
"typeid": "{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}",
"details": {
- "name": "some Float"
+ "name": "damage"
}
}
]
},
{
- "base": "AutonomousToAuthorityNoParams",
+ "base": "AutonomousToAuthorityNoParamsByEntityId",
"context": "NetworkTestPlayerComponent",
"entry": {
"name": "In",
- "tooltip": "When signaled, this will invoke Autonomous To Authority No Params"
+ "tooltip": "When signaled, this will invoke Autonomous To Authority No Params By Entity Id"
},
"exit": {
"name": "Out",
- "tooltip": "Signaled after Autonomous To Authority No Params is invoked"
+ "tooltip": "Signaled after Autonomous To Authority No Params By Entity Id is invoked"
},
"details": {
- "name": "Autonomous To Authority No Params"
+ "name": "Autonomous To Authority No Params By Entity Id"
},
"params": [
{
- "typeid": "{CA5E5C37-98A6-04D2-E15C-1B4BFEE4C7DD}",
+ "typeid": "{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}",
"details": {
- "name": "Network Test Player Component"
+ "name": "Source",
+ "tooltip": "The Source containing the NetworkTestPlayerComponentController"
}
}
]
},
{
- "base": "AuthorityToAutonomous",
+ "base": "ServerToAuthority_DealDamage",
"context": "NetworkTestPlayerComponent",
"entry": {
"name": "In",
- "tooltip": "When signaled, this will invoke Authority To Autonomous"
+ "tooltip": "When signaled, this will invoke Server To Authority_ Deal Damage"
},
"exit": {
"name": "Out",
- "tooltip": "Signaled after Authority To Autonomous is invoked"
+ "tooltip": "Signaled after Server To Authority_ Deal Damage is invoked"
},
"details": {
- "name": "Authority To Autonomous"
+ "name": "Server To Authority_ Deal Damage"
},
"params": [
{
@@ -179,18 +176,18 @@
]
},
{
- "base": "AuthorityToClientNoParams",
+ "base": "AutonomousToAuthority",
"context": "NetworkTestPlayerComponent",
"entry": {
"name": "In",
- "tooltip": "When signaled, this will invoke Authority To Client No Params"
+ "tooltip": "When signaled, this will invoke Autonomous To Authority"
},
"exit": {
"name": "Out",
- "tooltip": "Signaled after Authority To Client No Params is invoked"
+ "tooltip": "Signaled after Autonomous To Authority is invoked"
},
"details": {
- "name": "Authority To Client No Params"
+ "name": "Autonomous To Authority"
},
"params": [
{
@@ -198,6 +195,41 @@
"details": {
"name": "Network Test Player Component"
}
+ },
+ {
+ "typeid": "{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}",
+ "details": {
+ "name": "float"
+ }
+ }
+ ]
+ },
+ {
+ "base": "AuthorityToAutonomous_PlayerNumber",
+ "context": "NetworkTestPlayerComponent",
+ "entry": {
+ "name": "In",
+ "tooltip": "When signaled, this will invoke Authority To Autonomous_ Player Number"
+ },
+ "exit": {
+ "name": "Out",
+ "tooltip": "Signaled after Authority To Autonomous_ Player Number is invoked"
+ },
+ "details": {
+ "name": "Authority To Autonomous_ Player Number"
+ },
+ "params": [
+ {
+ "typeid": "{CA5E5C37-98A6-04D2-E15C-1B4BFEE4C7DD}",
+ "details": {
+ "name": "Network Test Player Component"
+ }
+ },
+ {
+ "typeid": "{72039442-EB38-4D42-A1AD-CB68F7E0EEF6}",
+ "details": {
+ "name": "int"
+ }
}
]
},
@@ -308,79 +340,47 @@
]
},
{
- "base": "AuthorityToClientNoParamsByEntityId",
+ "base": "AutonomousToAuthorityNoParams",
"context": "NetworkTestPlayerComponent",
"entry": {
"name": "In",
- "tooltip": "When signaled, this will invoke Authority To Client No Params By Entity Id"
+ "tooltip": "When signaled, this will invoke Autonomous To Authority No Params"
},
"exit": {
"name": "Out",
- "tooltip": "Signaled after Authority To Client No Params By Entity Id is invoked"
+ "tooltip": "Signaled after Autonomous To Authority No Params is invoked"
},
"details": {
- "name": "Authority To Client No Params By Entity Id"
+ "name": "Autonomous To Authority No Params"
},
"params": [
{
- "typeid": "{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}",
+ "typeid": "{CA5E5C37-98A6-04D2-E15C-1B4BFEE4C7DD}",
"details": {
- "name": "Source",
- "tooltip": "The Source containing the NetworkTestPlayerComponentController"
+ "name": "Network Test Player Component"
}
}
]
},
{
- "base": "AuthorityToAutonomousByEntityId",
+ "base": "AuthorityToClientNoParams_PlayFx",
"context": "NetworkTestPlayerComponent",
"entry": {
"name": "In",
- "tooltip": "When signaled, this will invoke Authority To Autonomous By Entity Id"
+ "tooltip": "When signaled, this will invoke Authority To Client No Params_ Play Fx"
},
"exit": {
"name": "Out",
- "tooltip": "Signaled after Authority To Autonomous By Entity Id is invoked"
+ "tooltip": "Signaled after Authority To Client No Params_ Play Fx is invoked"
},
"details": {
- "name": "Authority To Autonomous By Entity Id"
+ "name": "Authority To Client No Params_ Play Fx"
},
"params": [
{
- "typeid": "{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}",
+ "typeid": "{CA5E5C37-98A6-04D2-E15C-1B4BFEE4C7DD}",
"details": {
- "name": "Source",
- "tooltip": "The Source containing the NetworkTestPlayerComponentController"
- }
- },
- {
- "typeid": "{EA2C3E90-AFBE-44D4-A90D-FAAF79BAF93D}",
- "details": {
- "name": "some Float"
- }
- }
- ]
- },
- {
- "base": "AutonomousToAuthorityNoParamsByEntityId",
- "context": "NetworkTestPlayerComponent",
- "entry": {
- "name": "In",
- "tooltip": "When signaled, this will invoke Autonomous To Authority No Params By Entity Id"
- },
- "exit": {
- "name": "Out",
- "tooltip": "Signaled after Autonomous To Authority No Params By Entity Id is invoked"
- },
- "details": {
- "name": "Autonomous To Authority No Params By Entity Id"
- },
- "params": [
- {
- "typeid": "{6383F1D3-BB27-4E6B-A49A-6409B2059EAA}",
- "details": {
- "name": "Source",
- "tooltip": "The Source containing the NetworkTestPlayerComponentController"
+ "name": "Network Test Player Component"
}
}
]
diff --git a/Gems/ScriptCanvas/Assets/TranslationAssets/Classes/NetworkTestPlayerComponentNetworkInput.names b/AutomatedTesting/ScriptCanvas/TranslationAssets/Classes/NetworkTestPlayerComponentNetworkInput.names
similarity index 100%
rename from Gems/ScriptCanvas/Assets/TranslationAssets/Classes/NetworkTestPlayerComponentNetworkInput.names
rename to AutomatedTesting/ScriptCanvas/TranslationAssets/Classes/NetworkTestPlayerComponentNetworkInput.names
diff --git a/AutomatedTesting/ScriptCanvas/instance_counter.scriptcanvas b/AutomatedTesting/ScriptCanvas/instance_counter.scriptcanvas
index 0e5524273c..4ef5f0a8d5 100644
--- a/AutomatedTesting/ScriptCanvas/instance_counter.scriptcanvas
+++ b/AutomatedTesting/ScriptCanvas/instance_counter.scriptcanvas
@@ -5,7 +5,7 @@
"ClassData": {
"m_scriptCanvas": {
"Id": {
- "id": 3744110453276
+ "id": 337666590525276931
},
"Name": "instance_counter",
"Components": {
@@ -87,7 +87,6 @@
],
"Datums": [
{
- "isOverloadedStorage": false,
"scriptCanvasType": {
"m_type": 3
},
@@ -228,7 +227,6 @@
],
"Datums": [
{
- "isOverloadedStorage": false,
"scriptCanvasType": {
"m_type": 1
},
@@ -237,7 +235,7 @@
"value": {
"id": 2901262558
},
- "label": "Source"
+ "label": "EntityID: 0"
}
],
"methodType": 0,
@@ -340,7 +338,6 @@
],
"Datums": [
{
- "isOverloadedStorage": false,
"scriptCanvasType": {
"m_type": 3
},
@@ -587,26 +584,10 @@
"m_assetType": "{3E2AC8CD-713F-453E-967F-29517F331784}",
"versionData": {
"_grammarVersion": 1,
- "_runtimeVersion": 1
+ "_runtimeVersion": 1,
+ "_fileVersion": 1
},
"GraphCanvasData": [
- {
- "Key": {
- "id": 3744110453276
- },
- "Value": {
- "ComponentData": {
- "{5F84B500-8C45-40D1-8EFC-A5306B241444}": {
- "$type": "SceneComponentSaveData",
- "ViewParams": {
- "Scale": 0.9218543514249998,
- "AnchorX": 50.98419189453125,
- "AnchorY": -272.27728271484375
- }
- }
- }
- }
- },
{
"Key": {
"id": 3748405420572
@@ -757,6 +738,18 @@
}
}
}
+ },
+ {
+ "Key": {
+ "id": 337666590525276931
+ },
+ "Value": {
+ "ComponentData": {
+ "{5F84B500-8C45-40D1-8EFC-A5306B241444}": {
+ "$type": "SceneComponentSaveData"
+ }
+ }
+ }
}
],
"StatisticsHelper": {
diff --git a/AutomatedTesting/project.json b/AutomatedTesting/project.json
index 5a4b303570..a928547f20 100644
--- a/AutomatedTesting/project.json
+++ b/AutomatedTesting/project.json
@@ -16,4 +16,4 @@
"external_subdirectories": [
"Gem"
]
-}
\ No newline at end of file
+}
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c81581fe0f..3f9f56a606 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -44,60 +44,26 @@ include(cmake/SettingsRegistry.cmake)
include(cmake/TestImpactFramework/LYTestImpactFramework.cmake)
include(cmake/CMakeFiles.cmake)
include(cmake/O3DEJson.cmake)
+include(cmake/Subdirectories.cmake)
-################################################################################
-# Subdirectory processing
-################################################################################
-
-# this function is building up the LY_EXTERNAL_SUBDIRS global property
-function(add_engine_gem_json_external_subdirectories gem_path)
- set(gem_json_path ${gem_path}/gem.json)
- if(EXISTS ${gem_json_path})
- read_json_external_subdirs(gem_external_subdirs ${gem_path}/gem.json)
- foreach(gem_external_subdir ${gem_external_subdirs})
- file(REAL_PATH ${gem_external_subdir} real_external_subdir BASE_DIRECTORY ${gem_path})
- set_property(GLOBAL APPEND PROPERTY LY_EXTERNAL_SUBDIRS ${real_external_subdir})
- add_engine_gem_json_external_subdirectories(${real_external_subdir})
- endforeach()
- endif()
-endfunction()
-
-function(add_engine_json_external_subdirectories)
- read_json_external_subdirs(engine_external_subdirs ${LY_ROOT_FOLDER}/engine.json)
- foreach(engine_external_subdir ${engine_external_subdirs})
- file(REAL_PATH ${engine_external_subdir} real_external_subdir BASE_DIRECTORY ${LY_ROOT_FOLDER})
- set_property(GLOBAL APPEND PROPERTY LY_EXTERNAL_SUBDIRS ${real_external_subdir})
- add_engine_gem_json_external_subdirectories(${real_external_subdir})
- endforeach()
-endfunction()
-
-function(add_subdirectory_on_externalsubdirs)
- get_property(external_subdirs GLOBAL PROPERTY LY_EXTERNAL_SUBDIRS)
- list(APPEND LY_EXTERNAL_SUBDIRS ${external_subdirs})
- # Loop over the additional external subdirectories and invoke add_subdirectory on them
- foreach(external_directory ${LY_EXTERNAL_SUBDIRS})
- # Hash the external_directory name and append it to the Binary Directory section of add_subdirectory
- # This is to deal with potential situations where multiple external directories has the same last directory name
- # For example if D:/Company1/RayTracingGem and F:/Company2/Path/RayTracingGem were both added as a subdirectory
- file(REAL_PATH ${external_directory} full_directory_path)
- string(SHA256 full_directory_hash ${full_directory_path})
- # Truncate the full_directory_hash down to 8 characters to avoid hitting the Windows 260 character path limit
- # when the external subdirectory contains relative paths of significant length
- string(SUBSTRING ${full_directory_hash} 0 8 full_directory_hash)
- # Use the last directory as the suffix path to use for the Binary Directory
- get_filename_component(directory_name ${external_directory} NAME)
- add_subdirectory(${external_directory} ${CMAKE_BINARY_DIR}/External/${directory_name}-${full_directory_hash})
- endforeach()
-endfunction()
+# Gather the list of o3de_manifest external Subdirectories
+# into the LY_EXTERNAL_SUBDIRS_O3DE_MANIFEST_PROPERTY
+add_o3de_manifest_json_external_subdirectories()
# Add the projects first so the Launcher can find them
include(cmake/Projects.cmake)
+if(LY_EXTERNAL_SUBDIRS)
+ set_property(GLOBAL APPEND PROPERTY LY_EXTERNAL_SUBDIRS ${LY_EXTERNAL_SUBDIRS})
+endif()
+
if(NOT INSTALLED_ENGINE)
# Add external subdirectories listed in the engine.json. LY_EXTERNAL_SUBDIRS is a cache variable so the user can add extra
- # external subdirectories. This should go before adding the rest of the targets so the targets are availbe to the launcher.
+ # external subdirectories. This should go before adding the rest of the targets so the targets are available to the launcher.
add_engine_json_external_subdirectories()
- add_subdirectory_on_externalsubdirs()
+
+ # Invoke add_subdirectory on external subdirectories that should be used a this point
+ add_subdirectory_on_external_subdirs()
# Add the rest of the targets
add_subdirectory(Assets)
@@ -110,7 +76,7 @@ if(NOT INSTALLED_ENGINE)
else()
ly_find_o3de_packages()
- add_subdirectory_on_externalsubdirs()
+ add_subdirectory_on_external_subdirs()
endif()
################################################################################
diff --git a/Code/Editor/AzAssetBrowser/AssetBrowserWindow.cpp b/Code/Editor/AzAssetBrowser/AssetBrowserWindow.cpp
deleted file mode 100644
index 1a45d1e391..0000000000
--- a/Code/Editor/AzAssetBrowser/AssetBrowserWindow.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#include "AzAssetBrowserWindow.h"
-#include "AzAssetBrowser/ui_AssetBrowserWindow.h"
-
-#include
-#include
-#include
-#include
-#include
-
-const char* ASSET_BROWSER_PREVIEW_NAME = "Asset Browser (PREVIEW)";
-
-AzAssetBrowserWindow::AzAssetBrowserWindow(const QString& name, QWidget* parent)
- : QDialog(parent)
- , m_ui(new Ui::AssetBrowserWindowClass())
- , m_assetDatabaseSortFilterProxyModel(new AssetBrowser::UI::SortFilterProxyModel(parent))
- , m_name(name)
- , m_assetBrowser(new AssetBrowser::UI::AssetTreeView(name, this))
- {
- EBUS_EVENT_RESULT(m_assetBrowserModel, AssetBrowser::AssetCache::AssetCacheRequestsBus, GetAssetBrowserModel);
- AZ_Assert(m_assetBrowserModel, "Failed to get filebrowser model");
- m_assetDatabaseSortFilterProxyModel->setSourceModel(m_assetBrowserModel);
-
- m_ui->setupUi(this);
-
- connect(m_ui->searchCriteriaWidget,
- &AzToolsFramework::SearchCriteriaWidget::SearchCriteriaChanged,
- m_assetDatabaseSortFilterProxyModel.data(),
- &AssetBrowser::UI::SortFilterProxyModel::OnSearchCriteriaChanged);
-
- connect(m_assetBrowser, &QTreeView::customContextMenuRequested, this, &AzAssetBrowserWindow::OnContextMenu);
- }
-
- AzAssetBrowserWindow::~AzAssetBrowserWindow()
- {
- m_assetBrowser->SaveState();
- }
-
- //////////////////////////////////////////////////////////////////////////
- const AZ::Uuid& AzAssetBrowserWindow::GetClassID()
- {
- return AZ::AzTypeInfo::Uuid();
- }
-
- void AzAssetBrowserWindow::OnContextMenu(const QPoint& point)
- {
- (void)point;
- //get the selected entries
- QModelIndexList sourceIndexes;
- for (const auto& index : m_assetBrowser->selectedIndexes())
- {
- sourceIndexes.push_back(m_assetDatabaseSortFilterProxyModel->mapToSource(index));
- }
- AZStd::vector entries;
- m_assetBrowserModel->SourceIndexesToAssetDatabaseEntries(sourceIndexes, entries);
-
- if (entries.empty() || entries.size() > 1)
- {
- return;
- }
- auto entry = entries.front();
-
- EBUS_EVENT(AssetBrowser::AssetBrowserRequestBus::Bus, OnItemContextMenu, this, entry);
- }
-
-#include
-
diff --git a/Code/Editor/AzAssetBrowser/AssetBrowserWindow.h b/Code/Editor/AzAssetBrowser/AssetBrowserWindow.h
deleted file mode 100644
index a16cc4b494..0000000000
--- a/Code/Editor/AzAssetBrowser/AssetBrowserWindow.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-#pragma once
-
-#if !defined(Q_MOC_RUN)
-#include
-#include
-
-#include
-#endif
-
-namespace Ui
-{
- class AssetBrowserWindowClass;
-}
-
-namespace AssetBrowser
-{
- namespace UI
- {
- class AssetTreeView;
- class SortFilterProxyModel;
- class AssetBrowserModel;
- }
-}
-
-class AzAssetBrowserWindow
- : public QDialog
-{
- Q_OBJECT
-public:
- AZ_CLASS_ALLOCATOR(AzAssetBrowserWindow, AZ::SystemAllocator, 0);
- AZ_TYPE_INFO(AzAssetBrowserWindow, "{20238D23-2670-44BC-9110-A51374C18B5A}");
-
- explicit AzAssetBrowserWindow(const QString& name = "default", QWidget* parent = nullptr);
- virtual ~AzAssetBrowserWindow();
-
- static const AZ::Uuid& GetClassID();
-
-protected Q_SLOTS:
- void OnContextMenu(const QPoint& point);
-
-private:
- QScopedPointer m_ui;
- QScopedPointer m_assetDatabaseModel;
- QScopedPointer m_assetDatabaseSortFilterProxyModel;
- QString m_name;
- AssetBrowser::UI::AssetTreeView* m_assetBrowser;
- AssetBrowser::UI::AssetBrowserModel* m_assetBrowserModel;
-};
-
-extern const char* ASSET_BROWSER_PREVIEW_NAME;
diff --git a/Code/Editor/CMakeLists.txt b/Code/Editor/CMakeLists.txt
index 9d74f8e3a2..3f340e37d8 100644
--- a/Code/Editor/CMakeLists.txt
+++ b/Code/Editor/CMakeLists.txt
@@ -104,13 +104,11 @@ ly_add_target(
3rdParty::Qt::Concurrent
3rdParty::TIFF
3rdParty::squish-ccr
- 3rdParty::AWSNativeSDK::STS
Legacy::CryCommon
Legacy::EditorCommon
AZ::AzCore
AZ::AzToolsFramework
Gem::LmbrCentral.Static
- AZ::AWSNativeSDKInit
AZ::AtomCore
Gem::Atom_RPI.Edit
Gem::Atom_RPI.Public
@@ -119,7 +117,6 @@ ly_add_target(
Gem::AtomViewportDisplayInfo
${additional_dependencies}
PUBLIC
- 3rdParty::AWSNativeSDK::Core
3rdParty::Qt::Network
Legacy::EditorCore
RUNTIME_DEPENDENCIES
diff --git a/Code/Editor/CVarMenu.cpp b/Code/Editor/CVarMenu.cpp
deleted file mode 100644
index 6449be9b3c..0000000000
--- a/Code/Editor/CVarMenu.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include "EditorDefs.h"
-
-#include "CVarMenu.h"
-
-CVarMenu::CVarMenu(QWidget* parent)
- : QMenu(parent)
-{
-}
-
-void CVarMenu::AddCVarToggleItem(CVarToggle cVarToggle)
-{
- // Add CVar toggle action
- QAction* action = addAction(cVarToggle.m_displayName);
- connect(action, &QAction::triggered, [this, cVarToggle](bool checked)
- {
- // Update the CVar's value based on the action's new checked state
- ICVar* cVar = gEnv->pConsole->GetCVar(cVarToggle.m_cVarName.toUtf8().data());
- if (cVar)
- {
- SetCVar(cVar, checked ? cVarToggle.m_onValue : cVarToggle.m_offValue);
- }
- });
- action->setCheckable(true);
-
- // Initialize the action's checked state based on the associated CVar's value
- ICVar* cVar = gEnv->pConsole->GetCVar(cVarToggle.m_cVarName.toUtf8().data());
- bool checked = (cVar && cVar->GetFVal() == cVarToggle.m_onValue);
- action->setChecked(checked);
-}
-
-void CVarMenu::AddCVarValuesItem(QString cVarName,
- QString displayName,
- CVarDisplayNameValuePairs availableCVarValues,
- float offValue)
-{
- // Add a submenu offering multiple values for one CVar
- QMenu* menu = addMenu(displayName);
- QActionGroup* group = new QActionGroup(menu);
- group->setExclusive(true);
-
- ICVar* cVar = gEnv->pConsole->GetCVar(cVarName.toUtf8().data());
- float cVarValue = cVar ? cVar->GetFVal() : 0.0f;
- for (const auto& availableCVarValue : availableCVarValues)
- {
- QAction* action = menu->addAction(availableCVarValue.first);
- action->setCheckable(true);
- group->addAction(action);
-
- float availableOnValue = availableCVarValue.second;
- connect(action, &QAction::triggered, [this, action, cVarName, availableOnValue, offValue](bool checked)
- {
- ICVar* cVar = gEnv->pConsole->GetCVar(cVarName.toUtf8().data());
- if (cVar)
- {
- if (!checked)
- {
- SetCVar(cVar, offValue);
- }
- else
- {
- // Toggle the CVar and update the action's checked state to
- // allow none of the items to be checked in the exclusive group.
- // Otherwise we could have just used the action's currently checked
- // state and updated the CVar's value only
- bool cVarOn = (cVar->GetFVal() == availableOnValue);
- checked = !cVarOn;
- SetCVar(cVar, checked ? availableOnValue : offValue);
- action->setChecked(checked);
- }
- }
- });
-
- // Initialize the action's checked state based on the CVar's current value
- bool checked = (cVarValue == availableOnValue);
- action->setChecked(checked);
- }
-}
-
-void CVarMenu::AddUniqueCVarsItem(QString displayName,
- AZStd::vector availableCVars)
-{
- // Add a submenu of actions offering values for unique CVars
- QMenu* menu = addMenu(displayName);
- QActionGroup* group = new QActionGroup(menu);
- group->setExclusive(true);
-
- for (const CVarToggle& availableCVar : availableCVars)
- {
- QAction* action = menu->addAction(availableCVar.m_displayName);
- action->setCheckable(true);
- group->addAction(action);
-
- connect(action, &QAction::triggered, [this, action, availableCVar, availableCVars](bool checked)
- {
- ICVar* cVar = gEnv->pConsole->GetCVar(availableCVar.m_cVarName.toUtf8().data());
- if (cVar)
- {
- if (!checked)
- {
- SetCVar(cVar, availableCVar.m_offValue);
- }
- else
- {
- // Toggle the CVar and update the action's checked state to
- // allow none of the items to be checked in the exclusive group.
- // Otherwise we could have just used the action's currently checked
- // state and updated the CVar's value only
- bool cVarOn = (cVar->GetFVal() == availableCVar.m_onValue);
- bool cVarChecked = !cVarOn;
- SetCVar(cVar, cVarChecked ? availableCVar.m_onValue : availableCVar.m_offValue);
- action->setChecked(cVarChecked);
- if (cVarChecked)
- {
- // Set the rest of the CVars in the group to their off values
- SetCVarsToOffValue(availableCVars, availableCVar);
- }
- }
- }
- });
-
- // Initialize the action's checked state based on its associated CVar's current value
- ICVar* cVar = gEnv->pConsole->GetCVar(availableCVar.m_cVarName.toUtf8().data());
- bool cVarChecked = (cVar && cVar->GetFVal() == availableCVar.m_onValue);
- action->setChecked(cVarChecked);
- if (cVarChecked)
- {
- // Set the rest of the CVars in the group to their off values
- SetCVarsToOffValue(availableCVars, availableCVar);
- }
- }
-}
-
-void CVarMenu::AddResetCVarsItem()
-{
- QAction* action = addAction(tr("Reset to Default"));
- connect(action, &QAction::triggered, this, [this]()
- {
- for (auto it : m_originalCVarValues)
- {
- ICVar* cVar = gEnv->pConsole->GetCVar(it.first.c_str());
- if (cVar)
- {
- cVar->Set(it.second);
- }
- }
- });
-}
-
-void CVarMenu::SetCVarsToOffValue(const AZStd::vector& cVarToggles, const CVarToggle& excludeCVarToggle)
-{
- // Set all but the specified CVars to their off values
- for (const CVarToggle& cVarToggle : cVarToggles)
- {
- if (cVarToggle.m_cVarName != excludeCVarToggle.m_cVarName
- || cVarToggle.m_onValue != excludeCVarToggle.m_onValue)
- {
- ICVar* cVar = gEnv->pConsole->GetCVar(cVarToggle.m_cVarName.toUtf8().data());
- if (cVar)
- {
- SetCVar(cVar, cVarToggle.m_offValue);
- }
- }
- }
-}
-
-void CVarMenu::SetCVar(ICVar* cVar, float newValue)
-{
- float oldValue = cVar->GetFVal();
- cVar->Set(newValue);
-
- // Store original value for CVar if not already in the list
- m_originalCVarValues.emplace(AZStd::string(cVar->GetName()), oldValue);
-}
-
-void CVarMenu::AddSeparator()
-{
- addSeparator();
-}
diff --git a/Code/Editor/CVarMenu.h b/Code/Editor/CVarMenu.h
deleted file mode 100644
index 5195bd99d7..0000000000
--- a/Code/Editor/CVarMenu.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#pragma once
-
-#include
-#include
-
-#include
-#include
-#include
-#include
-
-struct ICVar;
-
-class CVarMenu
- : public QMenu
-{
- Q_OBJECT
-public:
- // CVar that can be toggled on and off
- struct CVarToggle
- {
- QString m_cVarName;
- QString m_displayName;
- float m_onValue;
- float m_offValue;
- };
-
- // List of a CVar's available values and their descriptions
- using CVarDisplayNameValuePairs = AZStd::vector>;
-
- CVarMenu(QWidget* parent = nullptr);
-
- // Add an action that turns a CVar on/off
- void AddCVarToggleItem(CVarToggle cVarToggle);
-
- // Add a submenu of actions for a CVar that offers multiple values for exclusive selection
- void AddCVarValuesItem(QString cVarName,
- QString displayName,
- CVarDisplayNameValuePairs availableCVarValues,
- float offValue);
-
- // Add a submenu of actions for exclusively turning unique CVars on/off
- void AddUniqueCVarsItem(QString displayName,
- AZStd::vector availableCVars);
-
- // Add an action to reset all CVars to their original values before they
- // were modified by this menu
- void AddResetCVarsItem();
-
- void AddSeparator();
-
-private:
- void SetCVarsToOffValue(const AZStd::vector& cVarToggles, const CVarToggle& excludeCVarToggle);
- void SetCVar(ICVar* cVar, float newValue);
-
- // Original CVar values before they were modified by this menu
- AZStd::unordered_map m_originalCVarValues;
-};
diff --git a/Code/Editor/Commands/CommandManagerBus.h b/Code/Editor/Commands/CommandManagerBus.h
deleted file mode 100644
index a5edceaee8..0000000000
--- a/Code/Editor/Commands/CommandManagerBus.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#pragma once
-
-#include
-
-class CommandManagerRequests : public AZ::EBusTraits
-{
-public:
-
- struct CommandDetails
- {
- AZStd::string m_name;
- AZStd::vector m_arguments;
- };
-
- virtual AZStd::vector GetCommands() const = 0;
- virtual void ExecuteCommand(const AZStd::string& commandLine) {}
-
- virtual void GetCommandDetails(AZStd::string commandName, CommandDetails& outArguments) const = 0;
-
-};
-
-using CommandManagerRequestBus = AZ::EBus;
diff --git a/Code/Editor/ConfigGroup.cpp b/Code/Editor/ConfigGroup.cpp
deleted file mode 100644
index 42236e43dd..0000000000
--- a/Code/Editor/ConfigGroup.cpp
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-
-#include "EditorDefs.h"
-
-#include "ConfigGroup.h"
-
-namespace Config
-{
- CConfigGroup::CConfigGroup()
- {
- }
-
- CConfigGroup::~CConfigGroup()
- {
- for (IConfigVar* var : m_vars)
- {
- delete var;
- }
- }
-
- void CConfigGroup::AddVar(IConfigVar* var)
- {
- m_vars.push_back(var);
- }
-
- AZ::u32 CConfigGroup::GetVarCount()
- {
- return aznumeric_cast(m_vars.size());
- }
-
- IConfigVar* CConfigGroup::GetVar(const char* szName)
- {
- for (IConfigVar* var : m_vars)
- {
- if (0 == _stricmp(szName, var->GetName().c_str()))
- {
- return var;
- }
- }
-
- return nullptr;
- }
-
- const IConfigVar* CConfigGroup::GetVar(const char* szName) const
- {
- for (const IConfigVar* var : m_vars)
- {
- if (0 == _stricmp(szName, var->GetName().c_str()))
- {
- return var;
- }
-
- }
-
- return nullptr;
- }
-
- IConfigVar* CConfigGroup::GetVar(AZ::u32 index)
- {
- if (index < m_vars.size())
- {
- return m_vars[index];
- }
-
- return nullptr;
- }
-
- const IConfigVar* CConfigGroup::GetVar(AZ::u32 index) const
- {
- if (index < m_vars.size())
- {
- return m_vars[index];
- }
-
- return nullptr;
- }
-
- void CConfigGroup::SaveToXML(XmlNodeRef node)
- {
- // save only values that don't have default values
- for (const IConfigVar* var : m_vars)
- {
- if (var->IsFlagSet(IConfigVar::eFlag_DoNotSave) || var->IsDefault())
- {
- continue;
- }
-
- const char* szName = var->GetName().c_str();
-
- switch (var->GetType())
- {
- case IConfigVar::eType_BOOL:
- {
- bool currentValue = false;
- var->Get(¤tValue);
- node->setAttr(szName, currentValue);
- break;
- }
-
- case IConfigVar::eType_INT:
- {
- int currentValue = 0;
- var->Get(¤tValue);
- node->setAttr(szName, currentValue);
- break;
- }
-
- case IConfigVar::eType_FLOAT:
- {
- float currentValue = 0;
- var->Get(¤tValue);
- node->setAttr(szName, currentValue);
- break;
- }
-
- case IConfigVar::eType_STRING:
- {
- AZStd::string currentValue;
- var->Get(¤tValue);
- node->setAttr(szName, currentValue.c_str());
- break;
- }
- }
- }
- }
-
- void CConfigGroup::LoadFromXML(XmlNodeRef node)
- {
- // load values that are save-able
- for (IConfigVar* var : m_vars)
- {
- if (var->IsFlagSet(IConfigVar::eFlag_DoNotSave))
- {
- continue;
- }
- const char* szName = var->GetName().c_str();
-
- switch (var->GetType())
- {
- case IConfigVar::eType_BOOL:
- {
- bool currentValue = false;
- var->GetDefault(¤tValue);
- if (node->getAttr(szName, currentValue))
- {
- var->Set(¤tValue);
- }
- break;
- }
-
- case IConfigVar::eType_INT:
- {
- int currentValue = 0;
- var->GetDefault(¤tValue);
- if (node->getAttr(szName, currentValue))
- {
- var->Set(¤tValue);
- }
- break;
- }
-
- case IConfigVar::eType_FLOAT:
- {
- float currentValue = 0;
- var->GetDefault(¤tValue);
- if (node->getAttr(szName, currentValue))
- {
- var->Set(¤tValue);
- }
- break;
- }
-
- case IConfigVar::eType_STRING:
- {
- AZStd::string currentValue;
- var->GetDefault(¤tValue);
- QString readValue(currentValue.c_str());
- if (node->getAttr(szName, readValue))
- {
- currentValue = readValue.toUtf8().data();
- var->Set(¤tValue);
- }
- break;
- }
- }
- }
- }
-}
diff --git a/Code/Editor/ConfigGroup.h b/Code/Editor/ConfigGroup.h
deleted file mode 100644
index 004725e32c..0000000000
--- a/Code/Editor/ConfigGroup.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-
-#pragma once
-#include
-#include
-#include
-
-struct ICVar;
-class XmlNodeRef;
-
-namespace Config
-{
- // Abstract configurable variable
- struct IConfigVar
- {
- public:
- enum EType
- {
- eType_BOOL,
- eType_INT,
- eType_FLOAT,
- eType_STRING,
- };
-
- enum EFlags
- {
- eFlag_NoUI = 1 << 0,
- eFlag_NoCVar = 1 << 1,
- eFlag_DoNotSave = 1 << 2,
- };
-
- IConfigVar(const char* szName, const char* szDescription, EType varType, AZ::u8 flags)
- : m_name(szName)
- , m_description(szDescription)
- , m_type(varType)
- , m_flags(flags)
- , m_ptr(nullptr)
- {};
-
- virtual ~IConfigVar() = default;
-
- AZ_FORCE_INLINE EType GetType() const
- {
- return m_type;
- }
-
- AZ_FORCE_INLINE const AZStd::string& GetName() const
- {
- return m_name;
- }
-
- AZ_FORCE_INLINE const AZStd::string& GetDescription() const
- {
- return m_description;
- }
-
- AZ_FORCE_INLINE bool IsFlagSet(EFlags flag) const
- {
- return 0 != (m_flags & flag);
- }
-
- virtual void Get(void* outPtr) const = 0;
- virtual void Set(const void* ptr) = 0;
- virtual bool IsDefault() const = 0;
- virtual void GetDefault(void* outPtr) const = 0;
- virtual void Reset() = 0;
-
- static constexpr EType TranslateType(const bool&) { return eType_BOOL; }
- static constexpr EType TranslateType(const int&) { return eType_INT; }
- static constexpr EType TranslateType(const float&) { return eType_FLOAT; }
- static constexpr EType TranslateType(const AZStd::string&) { return eType_STRING; }
-
- protected:
- EType m_type;
- AZ::u8 m_flags;
- AZStd::string m_name;
- AZStd::string m_description;
- void* m_ptr;
- ICVar* m_pCVar;
- };
-
- // Group of configuration variables with optional mapping to CVars
- class CConfigGroup
- {
- private:
- using TConfigVariables = AZStd::vector ;
- TConfigVariables m_vars;
-
- using TConsoleVariables = AZStd::vector;
- TConsoleVariables m_consoleVars;
-
- public:
- CConfigGroup();
- virtual ~CConfigGroup();
-
- void AddVar(IConfigVar* var);
- AZ::u32 GetVarCount();
- IConfigVar* GetVar(const char* szName);
- IConfigVar* GetVar(AZ::u32 index);
- const IConfigVar* GetVar(const char* szName) const;
- const IConfigVar* GetVar(AZ::u32 index) const;
-
- void SaveToXML(XmlNodeRef node);
- void LoadFromXML(XmlNodeRef node);
- };
-};
diff --git a/Code/Editor/Controls/ReflectedPropertyControl/PropertyAnimationCtrl.cpp b/Code/Editor/Controls/ReflectedPropertyControl/PropertyAnimationCtrl.cpp
deleted file mode 100644
index 4fb18e438c..0000000000
--- a/Code/Editor/Controls/ReflectedPropertyControl/PropertyAnimationCtrl.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#include "EditorDefs.h"
-
-#include "PropertyAnimationCtrl.h"
-
-// Qt
-#include
-#include
-#include
-
-// Editor
-#include "Util/UIEnumerations.h"
-#include "IResourceSelectorHost.h"
-
-AnimationPropertyCtrl::AnimationPropertyCtrl(QWidget *pParent)
- : QWidget(pParent)
-{
- m_animationLabel = new QLabel;
-
- m_pApplyButton = new QToolButton;
- m_pApplyButton->setIcon(QIcon(":/reflectedPropertyCtrl/img/apply.png"));
-
- m_pApplyButton->setFocusPolicy(Qt::StrongFocus);
-
- QHBoxLayout *pLayout = new QHBoxLayout(this);
- pLayout->setContentsMargins(0, 0, 0, 0);
- pLayout->addWidget(m_animationLabel, 1);
- pLayout->addWidget(m_pApplyButton);
-
- connect(m_pApplyButton, &QAbstractButton::clicked, this, &AnimationPropertyCtrl::OnApplyClicked);
-};
-
-AnimationPropertyCtrl::~AnimationPropertyCtrl()
-{
-}
-
-
-void AnimationPropertyCtrl::SetValue(const CReflectedVarAnimation &animation)
-{
- m_animation = animation;
- m_animationLabel->setText(animation.m_animation.c_str());
-}
-
-CReflectedVarAnimation AnimationPropertyCtrl::value() const
-{
- return m_animation;
-}
-
-void AnimationPropertyCtrl::OnApplyClicked()
-{
- QStringList cSelectedAnimations;
- int nTotalAnimations(0);
- int nCurrentAnimation(0);
-
- QString combinedString = GetIEditor()->GetResourceSelectorHost()->GetGlobalSelection("animation");
- SplitString(combinedString, cSelectedAnimations, ',');
-
- nTotalAnimations = cSelectedAnimations.size();
- for (nCurrentAnimation = 0; nCurrentAnimation < nTotalAnimations; ++nCurrentAnimation)
- {
- QString& rstrCurrentAnimAction = cSelectedAnimations[nCurrentAnimation];
- if (!rstrCurrentAnimAction.isEmpty())
- {
- m_animation.m_animation = rstrCurrentAnimAction.toUtf8().data();
- m_animationLabel->setText(m_animation.m_animation.c_str());
- emit ValueChanged(m_animation);
- }
- }
-}
-
-QWidget* AnimationPropertyCtrl::GetFirstInTabOrder()
-{
- return m_pApplyButton;
-}
-QWidget* AnimationPropertyCtrl::GetLastInTabOrder()
-{
- return m_pApplyButton;
-}
-
-void AnimationPropertyCtrl::UpdateTabOrder()
-{
- setTabOrder(m_pApplyButton, m_pApplyButton);
-}
-
-
-QWidget* AnimationPropertyWidgetHandler::CreateGUI(QWidget *pParent)
-{
- AnimationPropertyCtrl* newCtrl = aznew AnimationPropertyCtrl(pParent);
- connect(newCtrl, &AnimationPropertyCtrl::ValueChanged, newCtrl, [newCtrl]()
- {
- EBUS_EVENT(AzToolsFramework::PropertyEditorGUIMessages::Bus, RequestWrite, newCtrl);
- });
- return newCtrl;
-}
-
-
-void AnimationPropertyWidgetHandler::ConsumeAttribute(AnimationPropertyCtrl* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, const char* debugName)
-{
- Q_UNUSED(GUI);
- Q_UNUSED(attrib);
- Q_UNUSED(attrValue);
- Q_UNUSED(debugName);
-}
-
-void AnimationPropertyWidgetHandler::WriteGUIValuesIntoProperty(size_t index, AnimationPropertyCtrl* GUI, property_t& instance, AzToolsFramework::InstanceDataNode* node)
-{
- Q_UNUSED(index);
- Q_UNUSED(node);
- CReflectedVarAnimation val = GUI->value();
- instance = static_cast(val);
-}
-
-bool AnimationPropertyWidgetHandler::ReadValuesIntoGUI(size_t index, AnimationPropertyCtrl* GUI, const property_t& instance, AzToolsFramework::InstanceDataNode* node)
-{
- Q_UNUSED(index);
- Q_UNUSED(node);
- CReflectedVarAnimation val = instance;
- GUI->SetValue(val);
- return false;
-}
-
-
-#include
-
diff --git a/Code/Editor/Controls/ReflectedPropertyControl/PropertyAnimationCtrl.h b/Code/Editor/Controls/ReflectedPropertyControl/PropertyAnimationCtrl.h
deleted file mode 100644
index 6f3e5b44f3..0000000000
--- a/Code/Editor/Controls/ReflectedPropertyControl/PropertyAnimationCtrl.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#ifndef CRYINCLUDE_EDITOR_UTILS_PROPERTYANIMATIONCTRL_H
-#define CRYINCLUDE_EDITOR_UTILS_PROPERTYANIMATIONCTRL_H
-#pragma once
-
-#if !defined(Q_MOC_RUN)
-#include
-#include
-#include
-#include "ReflectedVar.h"
-#include
-#include
-#endif
-
-class QToolButton;
-class QLabel;
-class QHBoxLayout;
-
-class AnimationPropertyCtrl
- : public QWidget
-{
- Q_OBJECT
-public:
- AZ_CLASS_ALLOCATOR(AnimationPropertyCtrl, AZ::SystemAllocator, 0);
-
- AnimationPropertyCtrl(QWidget* pParent = nullptr);
- virtual ~AnimationPropertyCtrl();
-
- CReflectedVarAnimation value() const;
-
- QWidget* GetFirstInTabOrder();
- QWidget* GetLastInTabOrder();
- void UpdateTabOrder();
-
-signals:
- void ValueChanged(CReflectedVarAnimation value);
-
-public slots:
- void SetValue(const CReflectedVarAnimation& animation);
-
-protected slots:
- void OnApplyClicked();
-
-private:
- QToolButton* m_pApplyButton;
- QLabel* m_animationLabel;
-
- CReflectedVarAnimation m_animation;
-};
-
-class AnimationPropertyWidgetHandler
- : QObject
- , public AzToolsFramework::PropertyHandler < CReflectedVarAnimation, AnimationPropertyCtrl >
-{
-public:
- AZ_CLASS_ALLOCATOR(AnimationPropertyWidgetHandler, AZ::SystemAllocator, 0);
-
- virtual AZ::u32 GetHandlerName(void) const override { return AZ_CRC("Animation", 0x8d5284dc); }
- virtual bool IsDefaultHandler() const override { return true; }
- virtual QWidget* GetFirstInTabOrder(AnimationPropertyCtrl* widget) override { return widget->GetFirstInTabOrder(); }
- virtual QWidget* GetLastInTabOrder(AnimationPropertyCtrl* widget) override { return widget->GetLastInTabOrder(); }
- virtual void UpdateWidgetInternalTabbing(AnimationPropertyCtrl* widget) override { widget->UpdateTabOrder(); }
-
- virtual QWidget* CreateGUI(QWidget* pParent) override;
- virtual void ConsumeAttribute(AnimationPropertyCtrl* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, const char* debugName) override;
- virtual void WriteGUIValuesIntoProperty(size_t index, AnimationPropertyCtrl* GUI, property_t& instance, AzToolsFramework::InstanceDataNode* node) override;
- virtual bool ReadValuesIntoGUI(size_t index, AnimationPropertyCtrl* GUI, const property_t& instance, AzToolsFramework::InstanceDataNode* node) override;
-};
-
-
-#endif // CRYINCLUDE_EDITOR_UTILS_PROPERTYANIMATIONCTRL_H
diff --git a/Code/Editor/CryEdit.cpp b/Code/Editor/CryEdit.cpp
index 3beaf4d438..b9081c3f90 100644
--- a/Code/Editor/CryEdit.cpp
+++ b/Code/Editor/CryEdit.cpp
@@ -36,14 +36,6 @@ AZ_POP_DISABLE_WARNING
#include
#include
-// Aws Native SDK
-#include
-#include
-#include
-#include
-#include
-#include
-
// AzCore
#include
#include
@@ -144,9 +136,7 @@ AZ_POP_DISABLE_WARNING
#include "Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.h"
-// AWSNativeSDK
#include
-#include
#if defined(AZ_PLATFORM_WINDOWS)
@@ -1830,10 +1820,7 @@ bool CCryEditApp::InitInstance()
if (GetIEditor()->GetCommandManager()->IsRegistered("editor.open_lnm_editor"))
{
CCommand0::SUIInfo uiInfo;
-#if !defined(NDEBUG)
- bool ok =
-#endif
- GetIEditor()->GetCommandManager()->GetUIInfo("editor.open_lnm_editor", uiInfo);
+ [[maybe_unused]] bool ok = GetIEditor()->GetCommandManager()->GetUIInfo("editor.open_lnm_editor", uiInfo);
assert(ok);
}
@@ -2125,8 +2112,6 @@ bool CCryEditApp::FixDanglingSharedMemory(const QString& sharedMemName) const
int CCryEditApp::ExitInstance(int exitCode)
{
- AZ_TracePrintf("Exit", "Called ExitInstance() with exit code: 0x%x", exitCode);
-
if (m_pEditor)
{
m_pEditor->OnBeginShutdownSequence();
@@ -3363,6 +3348,10 @@ CCryEditDoc* CCryEditApp::OpenDocumentFile(const char* filename, bool addToMostR
return GetIEditor()->GetDocument();
}
+ bool usePrefabSystemForLevels = false;
+ AzFramework::ApplicationRequests::Bus::BroadcastResult(
+ usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled);
+
// If we are loading and we're in simulate mode, then switch it off before we do anything else
if (GetIEditor()->GetGameEngine() && GetIEditor()->GetGameEngine()->GetSimulationMode())
{
@@ -3370,6 +3359,15 @@ CCryEditDoc* CCryEditApp::OpenDocumentFile(const char* filename, bool addToMostR
bool bIsDocModified = GetIEditor()->GetDocument()->IsModified();
OnSwitchPhysics();
GetIEditor()->GetDocument()->SetModifiedFlag(bIsDocModified);
+
+ if (usePrefabSystemForLevels)
+ {
+ auto* rootSpawnableInterface = AzFramework::RootSpawnableInterface::Get();
+ if (rootSpawnableInterface)
+ {
+ rootSpawnableInterface->ProcessSpawnableQueue();
+ }
+ }
}
// We're about to start loading a level, so start recording errors to display at the end.
diff --git a/Code/Editor/CryEditDoc.cpp b/Code/Editor/CryEditDoc.cpp
index 9d93fd5f5b..c7d719184d 100644
--- a/Code/Editor/CryEditDoc.cpp
+++ b/Code/Editor/CryEditDoc.cpp
@@ -57,7 +57,6 @@
// LmbrCentral
#include
-#include // for LmbrCentral::EditorLightComponentRequestBus
static const char* kAutoBackupFolder = "_autobackup";
static const char* kHoldFolder = "$tmp_hold"; // conform to the ignored file types $tmp[0-9]*_ regex
@@ -2130,52 +2129,13 @@ void CCryEditDoc::ReleaseXmlArchiveArray(TDocMultiArchive& arrXmlAr)
//////////////////////////////////////////////////////////////////////////
// AzToolsFramework::EditorEntityContextNotificationBus interface implementation
-void CCryEditDoc::OnSliceInstantiated(const AZ::Data::AssetId& sliceAssetId, AZ::SliceComponent::SliceInstanceAddress& sliceAddress, const AzFramework::SliceInstantiationTicket& /*ticket*/)
+void CCryEditDoc::OnSliceInstantiated([[maybe_unused]] const AZ::Data::AssetId& sliceAssetId, [[maybe_unused]] AZ::SliceComponent::SliceInstanceAddress& sliceAddress, [[maybe_unused]] const AzFramework::SliceInstantiationTicket& ticket)
{
- if (m_envProbeSliceAssetId == sliceAssetId)
- {
- const AZ::SliceComponent::EntityList& entities = sliceAddress.GetInstance()->GetInstantiated()->m_entities;
- const AZ::Uuid editorEnvProbeComponentId("{8DBD6035-583E-409F-AFD9-F36829A0655D}");
- AzToolsFramework::EntityIdList entityIds;
- entityIds.reserve(entities.size());
- for (const AZ::Entity* entity : entities)
- {
- if (entity->FindComponent(editorEnvProbeComponentId))
- {
- // Update Probe Area size to cover the whole terrain
- LmbrCentral::EditorLightComponentRequestBus::Event(entity->GetId(), &LmbrCentral::EditorLightComponentRequests::SetProbeAreaDimensions, AZ::Vector3(m_terrainSize, m_terrainSize, m_envProbeHeight));
-
- // Force update the light to apply cubemap
- LmbrCentral::EditorLightComponentRequestBus::Event(entity->GetId(), &LmbrCentral::EditorLightComponentRequests::RefreshLight);
- }
- entityIds.push_back(entity->GetId());
- }
-
- //Detach instantiated env probe entities from engine slice
- AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Broadcast(
- &AzToolsFramework::SliceEditorEntityOwnershipServiceRequests::DetachSliceEntities, entityIds);
-
- sliceAddress.SetInstance(nullptr);
- sliceAddress.SetReference(nullptr);
- SetModifiedFlag(true);
- SetModifiedModules(eModifiedEntities);
-
- AzToolsFramework::SliceEditorEntityOwnershipServiceNotificationBus::Handler::BusDisconnect();
-
- //save after level default slice fully instantiated
- Save();
- }
GetIEditor()->ResumeUndo();
}
-
-void CCryEditDoc::OnSliceInstantiationFailed(const AZ::Data::AssetId& sliceAssetId, const AzFramework::SliceInstantiationTicket& /*ticket*/)
+void CCryEditDoc::OnSliceInstantiationFailed([[maybe_unused]] const AZ::Data::AssetId& sliceAssetId, [[maybe_unused]] const AzFramework::SliceInstantiationTicket& ticket)
{
- if (m_envProbeSliceAssetId == sliceAssetId)
- {
- AzToolsFramework::SliceEditorEntityOwnershipServiceNotificationBus::Handler::BusDisconnect();
- AZ_Warning("Editor", false, "Failed to instantiate default environment probe slice.");
- }
GetIEditor()->ResumeUndo();
}
//////////////////////////////////////////////////////////////////////////
diff --git a/Code/Editor/CryEditDoc.h b/Code/Editor/CryEditDoc.h
index 5d20bddf45..3874914396 100644
--- a/Code/Editor/CryEditDoc.h
+++ b/Code/Editor/CryEditDoc.h
@@ -200,7 +200,6 @@ protected:
QString m_pathName;
QString m_slicePathName;
QString m_title;
- AZ::Data::AssetId m_envProbeSliceAssetId;
float m_terrainSize;
const char* m_envProbeSliceRelativePath = "EngineAssets/Slices/DefaultLevelSetup.slice";
const float m_envProbeHeight = 200.0f;
diff --git a/Code/Editor/EditorDefs.h b/Code/Editor/EditorDefs.h
index 97c03b2b45..e86f007604 100644
--- a/Code/Editor/EditorDefs.h
+++ b/Code/Editor/EditorDefs.h
@@ -123,9 +123,7 @@
#include "Util/XmlTemplate.h"
// Utility classes.
-#include "Util/bitarray.h"
#include "Util/RefCountBase.h"
-#include "Util/TRefCountBase.h"
#include "Util/MemoryBlock.h"
#include "Util/PathUtil.h"
@@ -168,18 +166,3 @@
#ifdef LoadCursor
#undef LoadCursor
#endif
-
-
-#ifdef _DEBUG
-#if !defined(AZ_PLATFORM_LINUX)
-#ifdef assert
-#undef assert
-#if defined(USE_AZ_ASSERT)
-#define assert(condition) AZ_Assert(condition, "")
-#else
-#define assert CRY_ASSERT
-#endif
-#endif // !defined(AZ_PLATFORM_LINUX)
-#endif
-#endif
-
diff --git a/Code/Editor/EditorPreferencesBus.h b/Code/Editor/EditorPreferencesBus.h
deleted file mode 100644
index d6c9e3ed55..0000000000
--- a/Code/Editor/EditorPreferencesBus.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-#pragma once
-
-#include
-
-//! Allows handlers to be notified when settings are changed to refresh accordingly
-class EditorPreferencesNotifications
- : public AZ::EBusTraits
-{
-public:
- static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple;
- static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
-
- //! Notifies about changes in the Editor Preferences
- virtual void OnEditorPreferencesChanged() {}
-};
-using EditorPreferencesNotificationBus = AZ::EBus;
diff --git a/Code/Editor/EditorPreferencesPageAWS.cpp b/Code/Editor/EditorPreferencesPageAWS.cpp
index 9279dce7bc..968969245d 100644
--- a/Code/Editor/EditorPreferencesPageAWS.cpp
+++ b/Code/Editor/EditorPreferencesPageAWS.cpp
@@ -101,7 +101,7 @@ void CEditorPreferencesPage_AWS::SaveSettingsRegistryFile()
return;
}
- bool saved{};
+ [[maybe_unused]] bool saved{};
constexpr auto configurationMode =
AZ::IO::SystemFile::SF_OPEN_CREATE | AZ::IO::SystemFile::SF_OPEN_CREATE_PATH | AZ::IO::SystemFile::SF_OPEN_WRITE_ONLY;
if (AZ::IO::SystemFile outputFile; outputFile.Open(resolvedPath.data(), configurationMode))
diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp
index a8180bcace..9a9e9f5ad3 100644
--- a/Code/Editor/EditorViewportWidget.cpp
+++ b/Code/Editor/EditorViewportWidget.cpp
@@ -89,6 +89,7 @@
#include
// Atom
+#include
#include
#include
#include
@@ -584,7 +585,7 @@ void EditorViewportWidget::OnEditorNotifyEvent(EEditorNotifyEvent event)
m_renderViewport->SetScene(nullptr);
break;
- case eNotify_OnEndSceneOpen:
+ case eNotify_OnEndLoad:
UpdateScene();
SetDefaultCamera();
break;
@@ -2324,7 +2325,26 @@ void EditorViewportWidget::UpdateScene()
{
AZ::RPI::SceneNotificationBus::Handler::BusDisconnect();
m_renderViewport->SetScene(mainScene);
- AZ::RPI::SceneNotificationBus::Handler::BusConnect(m_renderViewport->GetViewportContext()->GetRenderScene()->GetId());
+ auto viewportContext = m_renderViewport->GetViewportContext();
+ AZ::RPI::SceneNotificationBus::Handler::BusConnect(viewportContext->GetRenderScene()->GetId());
+
+ // Don't enable the render pipeline until a level has been loaded
+ // Also show/hide the RenderViewportWidget accordingly so that we get the
+ // expected gradient background when no level is loaded
+ auto renderPipeline = viewportContext->GetCurrentPipeline();
+ if (renderPipeline)
+ {
+ if (GetIEditor()->IsLevelLoaded())
+ {
+ m_renderViewport->show();
+ renderPipeline->AddToRenderTick();
+ }
+ else
+ {
+ m_renderViewport->hide();
+ renderPipeline->RemoveFromRenderTick();
+ }
+ }
}
}
}
diff --git a/Code/Editor/ErrorRecorder.h b/Code/Editor/ErrorRecorder.h
index beacc3f0e5..9a0bad7d91 100644
--- a/Code/Editor/ErrorRecorder.h
+++ b/Code/Editor/ErrorRecorder.h
@@ -14,7 +14,7 @@
#define CRYINCLUDE_EDITOR_CORE_ERRORRECORDER_H
#pragma once
-#include "Include/EditorCoreAPI.h"
+#include
//////////////////////////////////////////////////////////////////////////
//! Automatic class to record and display error.
diff --git a/Code/Editor/ErrorReport.h b/Code/Editor/ErrorReport.h
index 98d230e383..a80bb36404 100644
--- a/Code/Editor/ErrorReport.h
+++ b/Code/Editor/ErrorReport.h
@@ -17,9 +17,6 @@
// forward declarations.
class CParticleItem;
-#include
-#include
-
#include "Objects/BaseObject.h"
#include "Include/EditorCoreAPI.h"
#include "Include/IErrorReport.h"
diff --git a/Code/Editor/GameEngine.cpp b/Code/Editor/GameEngine.cpp
index 9786dcf1b8..8aab168b6d 100644
--- a/Code/Editor/GameEngine.cpp
+++ b/Code/Editor/GameEngine.cpp
@@ -18,6 +18,7 @@
// AzCore
#include
#include
+#include
#include
#include
diff --git a/Code/Editor/IEditor.h b/Code/Editor/IEditor.h
index 90f1b63f55..52f8c1ac6f 100644
--- a/Code/Editor/IEditor.h
+++ b/Code/Editor/IEditor.h
@@ -19,8 +19,6 @@
#include "Util/UndoUtil.h"
#include
-#include
-
#include
#include
@@ -66,11 +64,6 @@ struct SEditorSettings;
class CGameExporter;
class IAWSResourceManager;
-namespace WinWidget
-{
- class WinWidgetManager;
-}
-
struct ISystem;
struct IRenderer;
struct AABB;
@@ -323,17 +316,6 @@ enum MouseCallbackFlags
MK_CALLBACK_FLAGS = 0x100
};
-//! Types of database items
-enum EDataBaseItemType
-{
- EDB_TYPE_MATERIAL,
- EDB_TYPE_PARTICLE,
- EDB_TYPE_MUSIC,
- EDB_TYPE_EAXPRESET,
- EDB_TYPE_SOUNDMOOD,
- EDB_TYPE_FLARE
-};
-
enum EEditorPathName
{
EDITOR_PATH_OBJECTS,
@@ -597,10 +579,6 @@ struct IEditor
virtual bool SetViewFocus(const char* sViewClassName) = 0;
virtual void CloseView(const GUID& classId) = 0; // close ALL panels related to classId, used when unloading plugins.
- // We want to open a view object but not wrap it in a view pane)
- virtual QWidget* OpenWinWidget(WinWidgetId openId) = 0;
- virtual WinWidget::WinWidgetManager* GetWinWidgetManager() const = 0;
-
//! Opens standard color selection dialog.
//! Initialized with the color specified in color parameter.
//! Returns true if selection is made and false if selection is canceled.
diff --git a/Code/Editor/IEditorImpl.cpp b/Code/Editor/IEditorImpl.cpp
index 38006c6fca..d3f881a252 100644
--- a/Code/Editor/IEditorImpl.cpp
+++ b/Code/Editor/IEditorImpl.cpp
@@ -12,16 +12,11 @@
#include "EditorDefs.h"
#include "IEditorImpl.h"
+#include
// Qt
#include
-// AWS Native SDK
-AZ_PUSH_DISABLE_WARNING(4251 4355 4996, "-Wunknown-warning-option")
-#include
-#include
-AZ_POP_DISABLE_WARNING
-
// AzCore
#include
#include
@@ -75,12 +70,6 @@ AZ_POP_DISABLE_WARNING
#include "Editor/AzAssetBrowser/AzAssetBrowserRequestHandler.h"
#include "Editor/AssetEditor/AssetEditorRequestsHandler.h"
-// EditorCommon
-#include
-
-// AWSNativeSDK
-#include
-
#include "Core/QtEditorApplication.h" // for Editor::EditorQtApplication
static CCryEditDoc * theDocument;
@@ -132,7 +121,6 @@ CEditorImpl::CEditorImpl()
, m_pSettingsManager(nullptr)
, m_pLevelIndependentFileMan(nullptr)
, m_pExportManager(nullptr)
- , m_awsResourceManager(nullptr)
, m_bMatEditMode(false)
, m_bShowStatusText(true)
, m_bInitialized(false)
@@ -177,8 +165,6 @@ CEditorImpl::CEditorImpl()
DetectVersion();
RegisterTools();
- m_winWidgetManager.reset(new WinWidget::WinWidgetManager);
-
m_pAssetDatabaseLocationListener = nullptr;
m_pAssetBrowserRequestHandler = nullptr;
m_assetEditorRequestsHandler = nullptr;
@@ -847,20 +833,6 @@ const QtViewPane* CEditorImpl::OpenView(QString sViewClassName, bool reuseOpened
return QtViewPaneManager::instance()->OpenPane(sViewClassName, openMode);
}
-QWidget* CEditorImpl::OpenWinWidget(WinWidgetId openId)
-{
- if (m_winWidgetManager)
- {
- return m_winWidgetManager->OpenWinWidget(openId);
- }
- return nullptr;
-}
-
-WinWidget::WinWidgetManager* CEditorImpl::GetWinWidgetManager() const
-{
- return m_winWidgetManager.get();
-}
-
QWidget* CEditorImpl::FindView(QString viewClassName)
{
return QtViewPaneManager::instance()->GetView(viewClassName);
diff --git a/Code/Editor/IEditorImpl.h b/Code/Editor/IEditorImpl.h
index 7867912941..08629e434b 100644
--- a/Code/Editor/IEditorImpl.h
+++ b/Code/Editor/IEditorImpl.h
@@ -53,11 +53,6 @@ namespace Editor
class EditorQtApplication;
}
-namespace WinWidget
-{
- class WinWidgetManager;
-}
-
namespace AssetDatabase
{
class AssetDatabaseLocationListener;
@@ -221,9 +216,6 @@ public:
bool CloseView(const char* sViewClassName) override;
bool SetViewFocus(const char* sViewClassName) override;
- QWidget* OpenWinWidget(WinWidgetId openId) override;
- WinWidget::WinWidgetManager* GetWinWidgetManager() const override;
-
// close ALL panels related to classId, used when unloading plugins.
void CloseView(const GUID& classId) override;
bool SelectColor(QColor &color, QWidget *parent = 0) override;
@@ -369,8 +361,6 @@ protected:
QString m_selectFileBuffer;
QString m_levelNameBuffer;
- IAWSResourceManager* m_awsResourceManager;
- std::unique_ptr m_winWidgetManager;
//! True if the editor is in material edit mode. Fast preview of materials.
//! In this mode only very limited functionality is available.
diff --git a/Code/Editor/IObservable.h b/Code/Editor/IObservable.h
deleted file mode 100644
index 9de78a7bc1..0000000000
--- a/Code/Editor/IObservable.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-
-#ifndef CRYINCLUDE_EDITOR_IOBSERVABLE_H
-#define CRYINCLUDE_EDITOR_IOBSERVABLE_H
-#pragma once
-
-//! Observable macro to be used in pure interfaces
-#define DEFINE_OBSERVABLE_PURE_METHODS(observerClassName) \
- virtual bool RegisterObserver(observerClassName * pObserver) = 0; \
- virtual bool UnregisterObserver(observerClassName * pObserver) = 0; \
- virtual void UnregisterAllObservers() = 0;
-
-#endif // CRYINCLUDE_EDITOR_IOBSERVABLE_H
diff --git a/Code/Editor/Include/SandboxAPI.h b/Code/Editor/Include/SandboxAPI.h
index 4e0cafea4a..757b799837 100644
--- a/Code/Editor/Include/SandboxAPI.h
+++ b/Code/Editor/Include/SandboxAPI.h
@@ -21,7 +21,7 @@
#endif
#if defined(SANDBOX_IMPORTS) && defined(SANDBOX_EXPORTS)
-#error SANDBOX_EXPORTS and SANDBOX_IMPORTS can't be defined at the same time
+#error SANDBOX_EXPORTS and SANDBOX_IMPORTS cannot be defined at the same time
#endif
#if defined(SANDBOX_EXPORTS)
diff --git a/Code/Editor/Launcher/editor_launcher.rc b/Code/Editor/Launcher/editor_launcher.rc
deleted file mode 100644
index 26dad7a3da..0000000000
--- a/Code/Editor/Launcher/editor_launcher.rc
+++ /dev/null
@@ -1,2 +0,0 @@
-IDI_ICON1 ICON DISCARDABLE "..\\res\\lyeditor.ico"
-
diff --git a/Code/Editor/Lib/Tests/IEditorMock.h b/Code/Editor/Lib/Tests/IEditorMock.h
index aaee34c2c6..b2f7e2627f 100644
--- a/Code/Editor/Lib/Tests/IEditorMock.h
+++ b/Code/Editor/Lib/Tests/IEditorMock.h
@@ -128,8 +128,6 @@ public:
MOCK_METHOD1(CloseView, bool(const char* ));
MOCK_METHOD1(SetViewFocus, bool(const char* ));
MOCK_METHOD1(CloseView, void(const GUID& ));
- MOCK_METHOD1(OpenWinWidget, QWidget* (WinWidgetId ));
- MOCK_CONST_METHOD0(GetWinWidgetManager, WinWidget::WinWidgetManager* ());
MOCK_METHOD2(SelectColor, bool(QColor &, QWidget *));
MOCK_METHOD0(GetUndoManager, class CUndoManager* ());
MOCK_METHOD0(BeginUndo, void());
diff --git a/Code/Editor/Lib/Tests/test_EditorPythonBindings.cpp b/Code/Editor/Lib/Tests/test_EditorPythonBindings.cpp
index 49b65f7ffc..0c5e221d21 100644
--- a/Code/Editor/Lib/Tests/test_EditorPythonBindings.cpp
+++ b/Code/Editor/Lib/Tests/test_EditorPythonBindings.cpp
@@ -25,7 +25,6 @@
#include
#include
#include
-#include
#include
#include "IEditorMock.h"
diff --git a/Code/Editor/Lib/Tests/test_ModularViewportCameraController.cpp b/Code/Editor/Lib/Tests/test_ModularViewportCameraController.cpp
index 67d89ad967..5009c626e2 100644
--- a/Code/Editor/Lib/Tests/test_ModularViewportCameraController.cpp
+++ b/Code/Editor/Lib/Tests/test_ModularViewportCameraController.cpp
@@ -47,12 +47,12 @@ namespace UnitTest
void ViewportMouseCursorRequestImpl::BeginCursorCapture()
{
- m_inputChannelMapper->SetCursorCaptureEnabled(true);
+ m_inputChannelMapper->SetCursorMode(AzToolsFramework::CursorInputMode::CursorModeCaptured);
}
void ViewportMouseCursorRequestImpl::EndCursorCapture()
{
- m_inputChannelMapper->SetCursorCaptureEnabled(false);
+ m_inputChannelMapper->SetCursorMode(AzToolsFramework::CursorInputMode::CursorModeNone);
}
bool ViewportMouseCursorRequestImpl::IsMouseOver() const
diff --git a/Code/Editor/MainWindow.cpp b/Code/Editor/MainWindow.cpp
index bbebac96a3..3a52bb85a1 100644
--- a/Code/Editor/MainWindow.cpp
+++ b/Code/Editor/MainWindow.cpp
@@ -11,11 +11,6 @@
#include
-// AWs Native SDK
-AZ_PUSH_DISABLE_WARNING(4251 4355 4996, "-Wunknown-warning-option")
-#include
-AZ_POP_DISABLE_WARNING
-
// Qt
#include
#include
@@ -77,7 +72,6 @@ AZ_POP_DISABLE_WARNING
#include "ToolbarManager.h"
#include "Core/QtEditorApplication.h"
#include "UndoDropDown.h"
-#include "CVarMenu.h"
#include "EditorViewportSettings.h"
#include "KeyboardCustomizationSettings.h"
diff --git a/Code/Editor/MainWindow.h b/Code/Editor/MainWindow.h
index 1e375b08f2..9759dadade 100644
--- a/Code/Editor/MainWindow.h
+++ b/Code/Editor/MainWindow.h
@@ -49,7 +49,6 @@ class ToolbarCustomizationDialog;
class QWidgetAction;
class ActionManager;
class ShortcutDispatcher;
-class CVarMenu;
namespace AzQtComponents
{
@@ -64,11 +63,11 @@ namespace AzToolsFramework
//! @name Reverse URLs.
//! Used to identify common actions and override them when necessary.
//@{
- constexpr inline AZ::Crc32 EditModeMove = AZ_CRC_CE("com.o3de.action.editor.editmode.move");
- constexpr inline AZ::Crc32 EditModeRotate = AZ_CRC_CE("com.o3de.action.editor.editmode.rotate");
- constexpr inline AZ::Crc32 EditModeScale = AZ_CRC_CE("com.o3de.action.editor.editmode.scale");
- constexpr inline AZ::Crc32 SnapToGrid = AZ_CRC_CE("com.o3de.action.editor.snaptogrid");
- constexpr inline AZ::Crc32 SnapAngle = AZ_CRC_CE("com.o3de.action.editor.snapangle");
+ constexpr inline AZ::Crc32 EditModeMove = AZ_CRC_CE("org.o3de.action.editor.editmode.move");
+ constexpr inline AZ::Crc32 EditModeRotate = AZ_CRC_CE("org.o3de.action.editor.editmode.rotate");
+ constexpr inline AZ::Crc32 EditModeScale = AZ_CRC_CE("org.o3de.action.editor.editmode.scale");
+ constexpr inline AZ::Crc32 SnapToGrid = AZ_CRC_CE("org.o3de.action.editor.snaptogrid");
+ constexpr inline AZ::Crc32 SnapAngle = AZ_CRC_CE("org.o3de.action.editor.snapangle");
//@}
}
diff --git a/Code/Editor/Objects/BaseObject.h b/Code/Editor/Objects/BaseObject.h
index fea248c7f7..666d9f3e1d 100644
--- a/Code/Editor/Objects/BaseObject.h
+++ b/Code/Editor/Objects/BaseObject.h
@@ -31,7 +31,6 @@ class CUndoBaseObject;
class CObjectManager;
class CGizmo;
class CObjectArchive;
-struct SSubObjSelectionModifyContext;
struct SRayHitInfo;
class CPopupMenuItem;
class QMenu;
diff --git a/Code/Editor/Objects/SubObjSelection.cpp b/Code/Editor/Objects/SubObjSelection.cpp
deleted file mode 100644
index 3a67b8dfb7..0000000000
--- a/Code/Editor/Objects/SubObjSelection.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-
-#include "EditorDefs.h"
-
-#include "SubObjSelection.h"
-
-SSubObjSelOptions g_SubObjSelOptions;
-
-/*
-
-//////////////////////////////////////////////////////////////////////////
-bool CSubObjSelContext::IsEmpty() const
-{
- if (GetCount() == 0)
- return false;
- for (int i = 0; i < GetCount(); i++)
- {
- CSubObjectSelection *pSel = GetSelection(i);
- if (!pSel->IsEmpty())
- return true;
- }
- return false;
-}
-
-//////////////////////////////////////////////////////////////////////////
-void CSubObjSelContext::ModifySelection( SSubObjSelectionModifyContext &modCtx )
-{
- for (int n = 0; n < GetCount(); n++)
- {
- CSubObjectSelection *pSel = GetSelection(n);
- if (pSel->IsEmpty())
- continue;
- modCtx.pSubObjSelection = pSel;
- pSel->pGeometry->SubObjSelectionModify( modCtx );
- }
- if (modCtx.type == SO_MODIFY_MOVE)
- {
- OnSelectionChange();
- }
-}
-
-//////////////////////////////////////////////////////////////////////////
-void CSubObjSelContext::AcceptModifySelection()
-{
- for (int n = 0; n < GetCount(); n++)
- {
- CSubObjectSelection *pSel = GetSelection(n);
- if (pSel->IsEmpty())
- continue;
- if (pSel->pGeometry)
- pSel->pGeometry->Update();
- }
-}
-
-*/
diff --git a/Code/Editor/Objects/SubObjSelection.h b/Code/Editor/Objects/SubObjSelection.h
deleted file mode 100644
index 9e07bdc203..0000000000
--- a/Code/Editor/Objects/SubObjSelection.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
-
-
-#ifndef CRYINCLUDE_EDITOR_OBJECTS_SUBOBJSELECTION_H
-#define CRYINCLUDE_EDITOR_OBJECTS_SUBOBJSELECTION_H
-#pragma once
-
-//////////////////////////////////////////////////////////////////////////
-// Sub Object element type.
-//////////////////////////////////////////////////////////////////////////
-enum ESubObjElementType
-{
- SO_ELEM_NONE = 0,
- SO_ELEM_VERTEX,
- SO_ELEM_EDGE,
- SO_ELEM_FACE,
- SO_ELEM_POLYGON,
- SO_ELEM_UV,
-};
-
-//////////////////////////////////////////////////////////////////////////
-enum ESubObjDisplayType
-{
- SO_DISPLAY_WIREFRAME,
- SO_DISPLAY_FLAT,
- SO_DISPLAY_GEOMETRY,
-};
-
-//////////////////////////////////////////////////////////////////////////
-// Options for sub-object selection.
-//////////////////////////////////////////////////////////////////////////
-struct SSubObjSelOptions
-{
- bool bSelectByVertex;
- bool bIgnoreBackfacing;
- int nMatID;
-
- bool bSoftSelection;
- float fSoftSelFalloff;
-
- // Display options.
- bool bDisplayBackfacing;
- bool bDisplayNormals;
- float fNormalsLength;
- ESubObjDisplayType displayType;
-
- SSubObjSelOptions()
- {
- bSelectByVertex = false;
- bIgnoreBackfacing = false;
- bSoftSelection = false;
- nMatID = 0;
- fSoftSelFalloff = 1;
-
- bDisplayBackfacing = true;
- bDisplayNormals = false;
- displayType = SO_DISPLAY_FLAT;
- fNormalsLength = 0.4f;
- }
-};
-
-extern SSubObjSelOptions g_SubObjSelOptions;
-
-
-//////////////////////////////////////////////////////////////////////////
-enum ESubObjSelectionModifyType
-{
- SO_MODIFY_UNSELECT,
- SO_MODIFY_MOVE,
- SO_MODIFY_ROTATE,
- SO_MODIFY_SCALE,
-};
-
-//////////////////////////////////////////////////////////////////////////
-// This structure is passed when user is dragging sub object selection.
-//////////////////////////////////////////////////////////////////////////
-struct SSubObjSelectionModifyContext
-{
- CViewport* view;
- ESubObjSelectionModifyType type;
- Vec3 vValue;
- Matrix34 worldRefFrame;
-};
-
-#endif // CRYINCLUDE_EDITOR_OBJECTS_SUBOBJSELECTION_H
diff --git a/Code/Editor/Platform/Common/GCC/editor_lib_gcc.cmake b/Code/Editor/Platform/Common/GCC/editor_lib_gcc.cmake
new file mode 100644
index 0000000000..bc945f55c9
--- /dev/null
+++ b/Code/Editor/Platform/Common/GCC/editor_lib_gcc.cmake
@@ -0,0 +1,9 @@
+#
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+#
+
+set(LY_COMPILE_OPTIONS PRIVATE -fexceptions)
diff --git a/Code/Editor/Plugin.h b/Code/Editor/Plugin.h
index 5fa45ac140..dd2637f0e9 100644
--- a/Code/Editor/Plugin.h
+++ b/Code/Editor/Plugin.h
@@ -15,45 +15,6 @@
#include "Util/GuidUtil.h"
#include