You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/AutomatedTesting/Gem/PythonTests/physics/C5689518_PhysXTerrain_Colli...

120 lines
4.2 KiB
Python

"""
Copyright (c) Contributors to the Open 3D Engine Project
SPDX-License-Identifier: Apache-2.0 OR MIT
"""
# Test case ID : C5689518
# Test Case Title : PhysX entities collide with PhysX Terrain
# A ball is suspended slightly over PhysX Terrain to check that it collides when dropped
# fmt: off
class Tests():
enter_game_mode = ("Entered game mode", "Failed to enter game mode")
find_sphere = ("Sphere entity found", "Sphere entity not found")
find_terrain = ("Terrain found", "Terrain not found")
sphere_above_terrain = ("Sphere position above ground", "Sphere is not above the ground")
time_out = ("No time out occurred", "A time out occurred, please validate level setup")
touched_ground = ("Touched ground before time out", "Did not touch ground before time out")
exit_game_mode = ("Exited game mode", "Couldn't exit game mode")
# fmt: on
def C5689518_PhysXTerrain_CollidesWithPhysXTerrain():
"""
Summary:
Runs a test to make sure that a PhysX Rigid Body and Collider can successfully collide with a PhysX Terrain entity.
Level Description:
A sphere with rigid body and collider is positioned above a PhysX terrain. The terrain and sphere have the same
collision group/layer assigned.
Expected Outcome:
Once game mode is entered, the sphere should fall toward and collide with the terrain.
Steps:
1) Open level and enter game mode
2) Retrieve entities and positions
3) Wait for sphere to collide with terrain OR time out
4) Exit game mode
5) Close the editor
:return:
"""
import os
import sys
import ImportPathHelper as imports
imports.init()
import azlmbr.legacy.general as general
import azlmbr.bus
from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper
# Global time out
TIME_OUT = 1.0
# 1) Open level / Enter game mode
helper.init_idle()
helper.open_level("Physics", "C5689518_PhysXEntity_collides_with_PhysXTerrain")
helper.enter_game_mode(Tests.enter_game_mode)
# 2) Retrieve entities and positions
sphere_id = general.find_game_entity("PhysX_Sphere")
Report.critical_result(Tests.find_sphere, sphere_id.IsValid())
terrain_id = general.find_game_entity("PhysX_Terrain")
Report.critical_result(Tests.find_terrain, terrain_id.IsValid())
sphere_pos = azlmbr.components.TransformBus(azlmbr.bus.Event, "GetWorldTM", sphere_id).GetPosition()
terrain_pos = azlmbr.components.TransformBus(azlmbr.bus.Event, "GetWorldTM", terrain_id).GetPosition()
Report.info_vector3(sphere_pos, "Sphere:")
Report.info_vector3(terrain_pos, "Terrain:")
Report.critical_result(
Tests.sphere_above_terrain,
sphere_pos.z > terrain_pos.z,
"Please make sure the sphere entity is set above the terrain",
)
# Enable gravity (just in case it is not enabled)
if not azlmbr.physics.RigidBodyRequestBus(azlmbr.bus.Event, "IsGravityEnabled", sphere_id):
azlmbr.physics.RigidBodyRequestBus(azlmbr.bus.Event, "SetGravityEnabled", sphere_id, True)
class TouchGround:
value = False
# Collision event handler
def on_collision_begin(args):
other_id = args[0]
if other_id.Equal(terrain_id):
Report.info("Touched ground")
TouchGround.value = True
# Assign event handler to sphere
handler = azlmbr.physics.CollisionNotificationBusHandler()
handler.connect(sphere_id)
handler.add_callback("OnCollisionBegin", on_collision_begin)
# 3) Wait for the sphere to hit the ground OR time out
test_completed = helper.wait_for_condition((lambda: TouchGround.value), TIME_OUT)
Report.critical_result(Tests.time_out, test_completed)
Report.result(Tests.touched_ground, TouchGround.value)
# 4) Exit game mode
helper.exit_game_mode(Tests.exit_game_mode)
if __name__ == "__main__":
import ImportPathHelper as imports
imports.init()
from editor_python_test_tools.utils import Report
Report.start_test(C5689518_PhysXTerrain_CollidesWithPhysXTerrain)