1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- """
- 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:
- enter_game_mode = (
- "Entered Game Mode",
- "Failed to enter Game Mode"
- )
- glass_cube_moves = (
- "Glass cube started moving",
- "Glass cube has unexpectedly remained stationary"
- )
- cubes_are_stationary = (
- "Cubes have both come to a rest",
- "One or both cubes are unexpectedly still moving"
- )
- exit_game_mode = (
- "Exited Game Mode",
- "Failed to exit Game Mode"
- )
- def TerrainPhysicsCollider_MaterialMapping_Works():
- """
- Summary:
- Opens an existing level with a Terrain Layer Spawner split into 2 different surface areas with 2 different Physics
- Materials applied. Test verifies that physicalized objects properly interact with the specified Physics Material
- mapped surfaces on terrain.
- :return: None
- """
- import azlmbr.legacy.general as general
- import azlmbr.bus as bus
- import azlmbr.components as components
- from editor_python_test_tools.utils import Report
- from editor_python_test_tools.utils import TestHelper as helper
- def vector_is_close_to_zero(vector):
- return abs(vector.x) <= 0.001 and abs(vector.y) <= 0.001 and abs(vector.z) <= 0.001
- def is_stationary(entity):
- velocity = azlmbr.physics.RigidBodyRequestBus(bus.Event, "GetLinearVelocity", entity)
- return vector_is_close_to_zero(velocity)
- # Open a level with preconfigured terrain with surfaces mapped to Physics Materials
- helper.init_idle()
- helper.open_level("Terrain", "TerrainPhysicsCollider_MaterialMapping_Works")
- # Enter Game Mode
- helper.enter_game_mode(Tests.enter_game_mode)
- # Find the needed entities
- physics_cube_glass = general.find_game_entity("PhysicsCube_Glass")
- physics_cube_rubber = general.find_game_entity("PhysicsCube_Rubber")
- # Get the initial positions of each Physics Cube
- glass_start = components.TransformBus(bus.Event, "GetWorldTranslation", physics_cube_glass)
- rubber_start = components.TransformBus(bus.Event, "GetWorldTranslation", physics_cube_rubber)
- # Wait for cube on glass to start moving, then wait for both cubes to become stationary, re-check positions, and
- # calculate distance traveled
- glass_is_moving = helper.wait_for_condition(lambda: not is_stationary(physics_cube_glass), 3.0)
- Report.result(Tests.glass_cube_moves, glass_is_moving)
- glass_is_stationary = helper.wait_for_condition(lambda: is_stationary(physics_cube_glass), 30.0)
- rubber_is_stationary = helper.wait_for_condition(lambda: is_stationary(physics_cube_rubber), 10.0)
- Report.result(Tests.cubes_are_stationary, glass_is_stationary and rubber_is_stationary)
- glass_finish = components.TransformBus(bus.Event, "GetWorldTranslation", physics_cube_glass)
- rubber_finish = components.TransformBus(bus.Event, "GetWorldTranslation", physics_cube_rubber)
- glass_distance = glass_finish.GetDistance(glass_start)
- rubber_distance = rubber_finish.GetDistance(rubber_start)
- # Report results on distance traveled and validate that the Cube on the glass surface travels further
- expected_glass_distance = 10.0
- expected_rubber_distance = 1.0
- material_interaction = (
- f"PhysicsCube_Glass moved {glass_distance:.3f}m, to PhysicsCube_Rubber's {rubber_distance:.3f}m",
- f"PhysicsCube_Rubber: Moved {rubber_distance:.3f}m, expected < {expected_rubber_distance}m. "
- f"PhysicsCube_Glass: Moved {glass_distance:.3f}m, expected > {expected_glass_distance}m"
- )
- Report.result(material_interaction, glass_distance > expected_glass_distance and
- rubber_distance < expected_rubber_distance)
- # Exit Game Mode
- helper.exit_game_mode(Tests.exit_game_mode)
- if __name__ == "__main__":
- from editor_python_test_tools.utils import Report
- Report.start_test(TerrainPhysicsCollider_MaterialMapping_Works)
|