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

181 lines
7.4 KiB
Python

"""
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 : C15845879
# Test Case Title : Check that linear damping with high values do not make the object to quiver
# fmt: off
class Tests:
enter_game_mode = ("Entered game mode", "Failed to enter game mode")
exit_game_mode = ("Exited game mode", "Couldn't exit game mode")
sphere_found = ("Found sphere", "Did not find sphere")
force_region_found = ("Found force region", "Did not find force region")
check_relative_position = ("Sphere is above force region", "Sphere isn't above force region")
sphere_moving_down = ("Sphere heading to force region", "Sphere has invalid initial velocity")
sphere_entered_force_region = ("Sphere has entered force region", "Sphere never entered force region")
sphere_stopped_moving = ("Sphere final velocity is zero", "Sphere final velocity invalid")
sphere_still_above_force_region = ("Sphere still above force region", "Sphere not above force region")
no_quiver = ("Sphere is not quivering", "Sphere quivering in force region")
# fmt: on
def C15845879_ForceRegion_HighLinearDampingForce():
"""
Summary: Check that linear damping with high values do not make the object to quiver
Level Description:
sphere - Starts above the force_region entity with initial velocity in the negative z direction and
gravity disabbled; has physx collider in sphere shape, physx rigid body, and sphere shape
force_region - Sits below sphere entity, has linear damping force set at 100 and region has scaling
(5,5,5); has physx collider in box shape and physx force region
Expected Behavior: Sphere falls into force region and is stuck by the damping force. It specifically should
not quiver up and down.
Test Steps:
1) Open Level
2) Enter Game Mode
3) Create and Validate Entities
4) Setup handler and wait for sphere to enter force region
5) Validate the Sphere remains in Force Region
6) Check to see if the sphere is quivering
7) Exit Game Mode
8) Close Editor
Note:
- This test file must be called from the Open 3D Engine Editor command terminal
- Any passed and failed tests are written to the Editor.log file.
Parsing the file or running a log_monitor are required to observe the test results.
:return: None
"""
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
FLOAT_THRESHOLD = sys.float_info.epsilon
TIMEOUT = 1
VELOCITY_THRESHOLD = 0.01
QUIVER_THRESHOLD = 0.01
SLOWDOWN_FRAMES = 30
SPHERE_STOP_OFFSET = 3.5
# Helper Functions
class Entity:
def __init__(self, name):
self.id = general.find_game_entity(name)
self.name = name
self.force_region_id = None
self.entered_force_region = False
self.quiver_reference = None
Report.critical_result(Tests.__dict__[self.name + "_found"], self.id.isValid())
@property
def position(self):
# type () -> Vector3
return azlmbr.components.TransformBus(azlmbr.bus.Event, "GetWorldTranslation", self.id)
@property
def velocity(self):
# type () -> Vector3
return azlmbr.physics.RigidBodyRequestBus(azlmbr.bus.Event, "GetLinearVelocity", self.id)
@property
def is_moving_up(self):
# type () -> bool
return (
abs(self.velocity.x) < FLOAT_THRESHOLD
and abs(self.velocity.y) < FLOAT_THRESHOLD
and self.velocity.z > 0.0
)
def set_handler(self):
self.handler = azlmbr.physics.ForceRegionNotificationBusHandler()
self.handler.connect(None)
self.handler.add_callback("OnCalculateNetForce", self.on_calculate_net_force)
def on_calculate_net_force(self, args):
# type (list) -> None
# Flips the collision happened boolean for the sphere object and prints the force values.
if self.force_region_id.Equal(args[0]) and self.id.Equal(args[1]) and not self.entered_force_region:
self.entered_force_region = True
def sphere_not_quivering():
# type () -> bool
# Returns False if sphere "quivers" from its initial position, True if it stays close to it's original position
return abs(sphere.position.z - sphere.quiver_reference) > QUIVER_THRESHOLD
def sphere_above_force_region(sphere_position, force_region_position):
# type () -> bool
return (
abs(sphere_position.x - force_region_position.x) < FLOAT_THRESHOLD
and abs(sphere_position.y - force_region_position.y) < FLOAT_THRESHOLD
and sphere_position.z > force_region_position.z
)
# Main Script
helper.init_idle()
# 1) Open Level
helper.open_level("Physics", "C15845879_ForceRegion_HighLinearDampingForce")
# 2) Enter Game Mode
helper.enter_game_mode(Tests.enter_game_mode)
# 3) Create and Validate Entities
sphere = Entity("sphere")
force_region = Entity("force_region")
sphere.force_region_id = force_region.id
Report.critical_result(Tests.sphere_moving_down, not sphere.is_moving_up)
Report.critical_result(
Tests.check_relative_position, sphere_above_force_region(sphere.position, force_region.position)
)
# 4) Setup handler and wait for sphere to enter force region
sphere.set_handler()
Report.critical_result(
Tests.sphere_entered_force_region, helper.wait_for_condition(lambda: sphere.entered_force_region, TIMEOUT)
)
# 5) Validate the Sphere remains in Force Region
# Must wait for the sphere to slow down
Report.result(Tests.sphere_stopped_moving, helper.wait_for_condition(lambda: sphere.velocity.IsZero(VELOCITY_THRESHOLD), TIMEOUT))
# Force region has scaling (5,5,5). Thus the upper edge of the force region is 2.5m above the transform. With proper offset we can
# see that sphere is stuck on top of the force region and did not bounce off.
Report.result(Tests.sphere_still_above_force_region, (sphere.position.z - force_region.position.z) < SPHERE_STOP_OFFSET)
# 6) Check to see if the sphere is quivering
sphere.quiver_reference = sphere.position.z
Report.result(Tests.no_quiver, not helper.wait_for_condition(sphere_not_quivering, TIMEOUT))
# 7) 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(C15845879_ForceRegion_HighLinearDampingForce)