# 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 : C5959765 # Test Case Title : Check that rigid body (asset) gets impulse from force region # fmt: off class Tests: enter_game_mode = ("Entered game mode", "Failed to enter game mode") find_asset = ("Entity asset found", "Asset not found") find_force_region = ("Force Region found", "Force Region not found") asset_gained_height = ("Asset went up", "Asset didn't go up") force_region_success = ("Force Region impulsed asset", "Force Region didn't impulse asset") exit_game_mode = ("Exited game mode", "Couldn't exit game mode") tests_completed = ("Tests completed", "Tests did not complete") # fmt: on def C5959765_ForceRegion_AssetGetsImpulsed(): """ # This run() function will open a a level and validate that a asset gets impulsed by a force region. # It does this by: # 1) Open level # 2) Enters Game mode # 3) Finds the entities in the scene # 4) Set values for Asset and force region # 5) Listens for asset to enter the force region # 6) Gets the vector and magnitude when asset is in force region # 7) Lets the asset travel up # 8) Validate if Asset gained height and entered force region # 9) Checks if test completed # 10) Exits game mode and editor # Level setup: Sedan asset above force region # First Asset: Name = "Sedan" This entity should drop vertically, collide with force region, and be shot up # First force region: Name = "Force Region" Should shoot Sedan entity up upon entry """ # 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 class Asset: id = None gained_height = False # Did the Asset gain height z_end_position = 0 z_start_position = 0 # Listen for Force Region events class RegionData: def __init__(self, ID): self.force_region_id = ID self.force_region_entered = False self.force_vector = None self.force_magnitude_on_asset = 0 # Magnitude applied on Asset self.force_region_magnitude = 0 # Magnitude value for the force region set in the editor self.force_region_magnitude_range = ( 0.01 ) # Delta value allowed between magnitude force_magnitude_on_asset and force_region_magnitude def force_region_in_range(self): return abs(self.force_magnitude_on_asset - self.force_region_magnitude) < 0.01 # 0.01 for buffer room def ifVectorAxisClose(vec1, vec2): return abs(vec1 - vec2) < 0.01 # 0.01 For buffer room for dif in the two vectors. helper.init_idle() # *****Variables***** TIME_OUT = 4.0 # Seconds UPWARD_Z_VECTOR = 1.0 # 1) Open level helper.open_level("Physics", "C5959765_ForceRegion_AssetGetsImpulsed") # 2) Enters Game mode helper.enter_game_mode(Tests.enter_game_mode) # 3) Finds the entities in the scene Asset.id = general.find_game_entity("Sedan") Report.critical_result(Tests.find_asset, Asset.id.IsValid()) RegionObject = RegionData(general.find_game_entity("Force Region")) Report.critical_result(Tests.find_force_region, RegionObject.force_region_id.IsValid()) # 4) Set values for Asset and force region Asset.z_start_position = azlmbr.components.TransformBus(azlmbr.bus.Event, "GetWorldZ", Asset.id) RegionObject.force_region_magnitude = azlmbr.physics.ForcePointRequestBus( azlmbr.bus.Event, "GetMagnitude", RegionObject.force_region_id ) Report.info("Asset start z position = {}".format(Asset.z_start_position)) # 5) Listens for asset to enter the force region def on_calculate_net_force(args): """ Called when there is a collision in the level Args: args[0] - force region entity args[1] - entity entering args[2] - vector args[3] - magnitude """ # 6) Gets the vector and magnitude when asset is in force region vect = args[2] mag = args[3] if RegionObject.force_region_id.Equal(args[0]) and not RegionObject.force_region_entered: RegionObject.force_region_entered = True RegionObject.force_vector = vect RegionObject.force_magnitude_on_asset = mag Report.info("Force Region entered") # Assign the handler handler = azlmbr.physics.ForceRegionNotificationBusHandler() handler.connect(None) handler.add_callback("OnCalculateNetForce", on_calculate_net_force) def test_completed(): # test_completed() will return a bool saying if all the Necessary actions in the test have been completed. # Necessary Actions: 1) Asset entered Force Region 2) Asset end_height > start_height Asset.z_end_position = azlmbr.components.TransformBus(azlmbr.bus.Event, "GetWorldZ", Asset.id) Asset.gained_height = Asset.z_end_position > (Asset.z_start_position + 0.5) # 0.5 for buffer # 8) Validate if Asset gained height and entered force region if Asset.gained_height and RegionObject.force_region_entered: Report.success(Tests.asset_gained_height) return True return False # 7) Lets the asset travel up test_is_completed = helper.wait_for_condition(test_completed, TIME_OUT) # 9) Checks if test completed if not test_is_completed: Report.info("The test timed out, check log for possible solutions or adjust the time out time") Report.failure(Tests.tests_completed) else: # Did Force Region succeed. True if vector z is close to 1 and force region magnitude is close to magnitude applied on Asset force_region_result = ( ifVectorAxisClose(RegionObject.force_vector.z, UPWARD_Z_VECTOR) and RegionObject.force_region_in_range() ) Report.result(Tests.force_region_success, force_region_result) Report.success(Tests.tests_completed) # Report test info to log Report.info("******* FINAL ENTITY INFORMATION *********") Report.info("Asset Entered force region = {}".format(RegionObject.force_region_entered)) Report.info("Start Z Position = {} End Z Position = {}".format(Asset.z_start_position, Asset.z_end_position)) Report.info("Asset Gained height = {}".format(Asset.gained_height)) Report.info("Vector = {} Magnitude = {}".format(RegionObject.force_vector.z, RegionObject.force_magnitude_on_asset)) # 10) Exit game mode and close the editor Report.result(Tests.tests_completed, test_is_completed) 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(C5959765_ForceRegion_AssetGetsImpulsed)