# coding=utf-8 """ All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or its licensors. For complete copyright and license terms please see the LICENSE at the root of this distribution (the "License"). All use of this software is governed by the License, or, if provided, by the license below or the license accompanying this file. Do not remove or modify any license notices. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. """ # Test case ID : C5932043 # Test Case Title : Check that force region exerts simple drag force on rigid bodies # fmt: off class Tests: enter_game_mode = ("Entered game mode", "Failed to enter game mode") find_sphere = ("Sphere found", "Sphere not found") find_force_region = ("Force Region found", "Force Region not found") # entity_actions_success refers to if the entity completed all expected actions in the test. For this test, this # will be, did the Sphere enter and exit the force region entity_actions_success = ("Entity actions completed", "Entity actions not completed") sphere_lost_height = ("Sphere went down", "Sphere didn't go down") force_region_slows = ("Force Region slowed Sphere", "Force Region didn't slow Sphere") exit_game_mode = ("Exited game mode", "Couldn't exit game mode") # fmt: on def C5932043_ForceRegion_SimpleDragOnRigidBodies(): # This run() function will open a a level and validate that the force region slows down a spheres fall. # It does this by: # 1) Opens level with sphere above a force region # 2) Enters Game mode # 3) Finds the entities in the scene # 4) Listens for sphere to enter the force region # 5) Gets z velocity and position of sphere # 6) Listens for sphere to exit force region # 7) Gets new velocity and position of sphere # 8) Validate the results # 9) Exits game mode and editor # Setup path import os, 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 # Holds details about the sphere class Sphere: id = None start_velocity_z = 0.0 end_velocity_z = 0.0 sphere_start_z_position = 0.0 sphere_end_z_position = 0.0 entered_force_region = False exited_force_region = False TIME_OUT = 4.0 # Time given to test to complete. helper.init_idle() # 1) Open level helper.open_level("Physics", "C5932043_ForceRegion_SimpleDragOnRigidBody") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) # 3) Get Entities Sphere.id = general.find_game_entity("Sphere") Report.result(Tests.find_sphere, Sphere.id.IsValid()) force_region_id = general.find_game_entity("Force Region") Report.result(Tests.find_force_region, force_region_id.IsValid()) # Called if Sphere enters force region def on_trigger_begin(args): other_id = args[0] if other_id.Equal(Sphere.id): Report.info("Entered force region") Sphere.entered_force_region = True # 5) Gets z velocity and position of sphere Sphere.start_velocity_z = azlmbr.physics.RigidBodyRequestBus(azlmbr.bus.Event, "GetLinearVelocity", Sphere.id).z Sphere.sphere_start_z_position = azlmbr.components.TransformBus(azlmbr.bus.Event, "GetWorldZ", Sphere.id) Report.info( "Sphere Start Z position = {} Z Start Velocity = {}".format( Sphere.sphere_start_z_position, Sphere.start_velocity_z ) ) # Called when sphere exits force region def on_trigger_end(args): other_id = args[0] if other_id.Equal(Sphere.id): Report.info("Exited force region") Sphere.exited_force_region = True # 7) Gets new velocity and position of sphere Sphere.end_velocity_z = azlmbr.physics.RigidBodyRequestBus(azlmbr.bus.Event, "GetLinearVelocity", Sphere.id).z Sphere.sphere_end_z_position = azlmbr.components.TransformBus(azlmbr.bus.Event, "GetWorldZ", Sphere.id) Report.info( "Sphere End Z position = {} Sphere End Z Velocity = {}".format( Sphere.sphere_end_z_position, Sphere.end_velocity_z ) ) handler = azlmbr.physics.TriggerNotificationBusHandler() handler.connect(force_region_id) # 4) Listens for sphere to enter the force region handler.add_callback("OnTriggerEnter", on_trigger_begin) # 6) Listens for sphere to exit force region handler.add_callback("OnTriggerExit", on_trigger_end) # Wait until all entities in scene are done performing their actions or test times out. def done_with_entity_actions(): return Sphere.entered_force_region and Sphere.exited_force_region test_completed = helper.wait_for_condition(done_with_entity_actions, TIME_OUT) Report.result(Tests.entity_actions_success, test_completed) # 8) Validate the results if test_completed: # Did Sphere fall sphere_descended = Sphere.sphere_end_z_position + 0.5 < Sphere.sphere_start_z_position # 0.5 for buffer Report.result(Tests.sphere_lost_height, sphere_descended) # Did Force Region slow down sphere's falling # Note: The faster a sphere falls, the greater its negative/downward velocity will be. Adding 1.0 for buffer. force_region_result = round(Sphere.end_velocity_z, 2) > round(Sphere.start_velocity_z, 2) + 1.0 Report.result(Tests.force_region_slows, force_region_result) # 9) Exits game mode and editor 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(C5932043_ForceRegion_SimpleDragOnRigidBodies)