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/C5296614_PhysXMaterial_Coll...

159 lines
5.9 KiB
Python

"""
Copyright (c) Contributors to the Open 3D Engine Project
SPDX-License-Identifier: Apache-2.0 OR MIT
"""
# Test case ID : C5296614
# Test Case Title : Check that unless you assign a shape to a physX collider component,
# the material assigned to it does not take affect
# fmt: off
class Tests:
# level
enter_game_mode = ("Entered game mode", "Failed to enter game mode")
exit_game_mode = ("Exited game mode", "Couldn't exit game mode")
collider_1_found = ("collider_1 was found", "collider_1 was not found")
collider_2_found = ("collider_2 was found", "collider_2 was not found")
ball_1_found = ("ball_1 was found", "ball_1 was not found")
ball_1_gravity = ("ball_1 gravity is disabled", "ball_1 gravity is enabled")
ball_1_collision = ("ball_1 collided with collider_1", "ball_1 passed through collider_1")
ball_2_found = ("ball_2 was found", "ball_2 was not found")
ball_2_gravity = ("ball_2 gravity is disabled", "ball_2 gravity is enabled")
ball_2_collision = ("ball_2 passed through collider_2", "ball_2 collided with collider_2")
trigger_1_found = ("trigger_1 was found", "trigger_1 was not found")
trigger_2_found = ("trigger_2 was found", "trigger_2 was not found")
# fmt: on
def C5296614_PhysXMaterial_ColliderShape():
"""
Summary:
Runs an automated test to verify that unless you assign a shape to a PhysX collider component,
the material assigned to it does not take affect
Level Description:
4 colliders named "collider_1", "collider_2", "ball_1" and "ball_2", all with PhysX Collider component.
collider_1 has no shape assigned to it, but collider_2 has box shape.
ball_1 and ball_2 have sphere shape, PhysX Rigid Body component, gravity disabled and initial linear velocity
of 20 m/s on Y axis.
Each ball is positioned in front of its respective collider.
Expected Behavior:
The balls are supposed to move towards the colliders.
Ball_1 should pass through collider_1 WITHOUT collision, and enter trigger_1.
Ball_2 should collide with collider_2 and NOT enter trigger_2.
Test Steps:
1) Load the level
2) Enter game mode
3) Setup entities
4) Wait for balls to collide with colliders and/or triggers
5) Report results
6) Exit game mode
7) Close editor
"""
import os
import sys
import ImportPathHelper as imports
imports.init()
from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper
import azlmbr.legacy.general as general
import azlmbr.bus
# Constants
TIME_OUT = 2.0
def get_test(entity_name, suffix):
return Tests.__dict__[entity_name + suffix]
class Entity:
def __init__(self, name):
self.name = name
self.validate_ID()
def validate_ID(self):
self.id = general.find_game_entity(self.name)
found_tuple = get_test(self.name, "_found")
Report.critical_result(found_tuple, self.id.IsValid())
class Ball(Entity):
def __init__(self, name, collider, trigger):
Entity.__init__(self, name)
self.collider = collider
self.trigger = trigger
self.collided_with_collider = False
self.collided_with_trigger = False
self.validate_gravity()
self.setup_collision_handler()
def validate_gravity(self):
gravity_enabled = azlmbr.physics.RigidBodyRequestBus(azlmbr.bus.Event, "IsGravityEnabled", self.id)
gravity_tuple = get_test(self.name, "_gravity")
Report.critical_result(gravity_tuple, not gravity_enabled)
def collider_hit(self, args):
colliding_entity_id = args[0]
if colliding_entity_id.Equal(self.id):
Report.info(self.name + " collided with " + self.collider.name)
self.collided_with_collider = True
def trigger_hit(self, args):
colliding_entity_id = args[0]
if colliding_entity_id.Equal(self.id):
Report.info(self.name + " collided with " + self.trigger.name)
self.collided_with_trigger = True
def setup_collision_handler(self):
self.collider.handler = azlmbr.physics.CollisionNotificationBusHandler()
self.collider.handler.connect(self.collider.id)
self.collider.handler.add_callback("OnCollisionBegin", self.collider_hit)
self.trigger.handler = azlmbr.physics.TriggerNotificationBusHandler()
self.trigger.handler.connect(self.trigger.id)
self.trigger.handler.add_callback("OnTriggerEnter", self.trigger_hit)
def both_balls_have_moved():
return ball_1.collided_with_trigger and ball_2.collided_with_collider
helper.init_idle()
# 1) Load the level
helper.open_level("Physics", "C5296614_PhysXMaterial_ColliderShape")
# 2) Enter game mode
helper.enter_game_mode(Tests.enter_game_mode)
# 3) Setup entities
collider_1 = Entity("collider_1")
collider_2 = Entity("collider_2")
trigger_1 = Entity("trigger_1")
trigger_2 = Entity("trigger_2")
ball_1 = Ball("ball_1", collider_1, trigger_1)
ball_2 = Ball("ball_2", collider_2, trigger_2)
# 4) Wait for balls to collide
helper.wait_for_condition(both_balls_have_moved, TIME_OUT)
# 5) Report results
Report.result(Tests.ball_1_collision, not ball_1.collided_with_collider and ball_1.collided_with_trigger)
Report.result(Tests.ball_2_collision, ball_2.collided_with_collider and not ball_2.collided_with_trigger)
# 6) 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(C5296614_PhysXMaterial_ColliderShape)