123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477 |
- """
- 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
- """
- # Test case ID : 4044455
- # Test Case Title : Verify that any change in any of the values including the name of the material,
- # once saved, is immediately reflected in the component and functionality
- # fmt: off
- class Tests:
- enter_game_mode_0 = ("Entered game mode 0", "Failed to enter game mode 0")
- exit_game_mode_0 = ("Exited game mode 0", "Couldn't exit game mode 0")
- enter_game_mode_1 = ("Entered game mode 1", "Failed to enter game mode 1")
- exit_game_mode_1 = ("Exited game mode 1", "Couldn't exit game mode 1")
- terrain_found_0 = ("terrain entity found 0", "terrain entity not found 0")
- block_found_0 = ("block entity found 0", "block entity not found 0")
- trigger_found_0 = ("trigger entity found 0", "trigger entity not found 0")
- terrain_found_1 = ("terrain entity found 1", "terrain entity not found 1")
- block_found_1 = ("block entity found 1", "block entity not found 1")
- trigger_found_1 = ("trigger entity found 1", "trigger entity not found 1")
- material_changes = ("material changes were made", "material changes couldn't be made")
- # Material Modifications
- static_friction = ("Static friction was modified", "Static friction wasn't modified")
- dynamic_friction = ("Dynamic friction was modified", "Dynamic friction wasn't modified")
- restitution = ("Restitution was modified", "Restition wasn't modified")
- friction_combine = ("Friction combine was modified", "Friction combine wasn't modified")
- restitution_combine = ("Restition combine was modified", "Restitution combine wasn't modified")
- delete_material = ("Material deleted successfully", "Material wasn't deleted")
- # sphere_0 test 0
- sphere_0_found_0 = ("Test 0: sphere_0 found", "Test 0: sphere_0 not found")
- sphere_0_initial_position_0 = ("Test 0: sphere_0 is in valid position", "Test 0: sphere_0 isn't in valid position")
- sphere_0_initial_velocity_0 = ("Test 0: sphere_0 initial velocity valid", "Test 0: sphere_0 initial velocity invalid")
- sphere_0_collision_0 = ("Test 0: sphere_0 collided with terrain", "Test 0: sphere_0 collided with terrain")
- sphere_0_final_position_0 = ("Test 0: sphere_0 final position valid", "Test 0: sphere_0 final position invalid")
- sphere_0_final_velocity_0 = ("Test 0: sphere_0 final velocity valid", "Test 0: sphere_0 final velocity invalid")
- # sphere_0 test 1
- sphere_0_found_1 = ("Test 1: sphere_0 found", "Test 1: sphere_0 not found")
- sphere_0_initial_position_1 = ("Test 1: sphere_0 is in valid position", "Test 1: sphere_0 isn't in valid position")
- sphere_0_initial_velocity_1 = ("Test 1: sphere_0 initial velocity valid", "Test 1: sphere_0 initial velocity invalid")
- sphere_0_collision_1 = ("Test 1: sphere_0 collided with terrain", "Test 1: sphere_0 collided with terrain")
- sphere_0_final_position_1 = ("Test 1: sphere_0 final position valid", "Test 1: sphere_0 final position invalid")
- sphere_0_final_velocity_1 = ("Test 1: sphere_0 final velocity valid", "Test 1: sphere_0 final velocity invalid")
- # sphere_1 test 0
- sphere_1_found_0 = ("Test 0: sphere_1 found", "Test 0: sphere_1 not found")
- sphere_1_initial_position_0 = ("Test 0: sphere_1 is in valid position", "Test 0: sphere_1 isn't in valid position")
- sphere_1_initial_velocity_0 = ("Test 0: sphere_1 initial velocity valid", "Test 0: sphere_1 initial velocity invalid")
- sphere_1_collision_0 = ("Test 0: sphere_1 collided with terrain", "Test 0: sphere_1 collided with terrain")
- sphere_1_final_position_0 = ("Test 0: sphere_1 final position valid", "Test 0: sphere_1 final position invalid")
- sphere_1_final_velocity_0 = ("Test 0: sphere_1 final velocity valid", "Test 0: sphere_1 final velocity invalid")
- # sphere_1 test 1
- sphere_1_found_1 = ("Test 1: sphere_1 found", "Test 1: sphere_1 not found")
- sphere_1_initial_position_1 = ("Test 1: sphere_1 is in valid position", "Test 1: sphere_1 isn't in valid position")
- sphere_1_initial_velocity_1 = ("Test 1: sphere_1 initial velocity valid", "Test 1: sphere_1 initial velocity invalid")
- sphere_1_collision_1 = ("Test 1: sphere_1 collided with terrain", "Test 1: sphere_1 collided with terrain")
- sphere_1_final_position_1 = ("Test 1: sphere_1 final position valid", "Test 1: sphere_1 final position invalid")
- sphere_1_final_velocity_1 = ("Test 1: sphere_1 final velocity valid", "Test 1: sphere_1 final velocity invalid")
- # sphere_2 test 0
- sphere_2_found_0 = ("Test 0: sphere_2 found", "Test 0: sphere_2 not found")
- sphere_2_initial_position_0 = ("Test 0: sphere_2 is in valid position", "Test 0: sphere_2 isn't in valid position")
- sphere_2_initial_velocity_0 = ("Test 0: sphere_2 initial velocity valid", "Test 0: sphere_2 initial velocity invalid")
- sphere_2_collision_0 = ("Test 0: sphere_2 collided with terrain", "Test 0: sphere_2 collided with terrain")
- sphere_2_final_position_0 = ("Test 0: sphere_2 final position valid", "Test 0: sphere_2 final position invalid")
- sphere_2_final_velocity_0 = ("Test 0: sphere_2 final velocity valid", "Test 0: sphere_2 final velocity invalid")
- # sphere_2 test 1
- sphere_2_found_1 = ("Test 1: sphere_2 found", "Test 1: sphere_2 not found")
- sphere_2_initial_position_1 = ("Test 1: sphere_2 is in valid position", "Test 1: sphere_2 isn't in valid position")
- sphere_2_initial_velocity_1 = ("Test 1: sphere_2 initial velocity valid", "Test 1: sphere_2 initial velocity invalid")
- sphere_2_collision_1 = ("Test 1: sphere_2 collided with terrain", "Test 1: sphere_2 collided with terrain")
- sphere_2_final_position_1 = ("Test 1: sphere_2 final position valid", "Test 1: sphere_2 final position invalid")
- sphere_2_final_velocity_1 = ("Test 1: sphere_2 final velocity valid", "Test 1: sphere_2 final velocity invalid")
- # cube_0 test 0
- cube_0_found_0 = ("Test 0: cube_0 found", "Test 0: cube_0 not found")
- cube_0_initial_position_0 = ("Test 0: cube_0 is in correct position", "Test 0: cube_0 isn't in correct position")
- cube_0_initial_velocity_0 = ("Test 0: cube_0 initial velocity valid", "Test 0: cube_0 initial velocity invalid")
- cube_0_final_position_0 = ("Test 0: cube_0 has stopped moving", "Test 0: cube_0 hasn't stopped moving")
- cube_0_final_velocity_0 = ("Test 0: cube_0 final velocity valid", "Test 0: cube_0 final velocity invalid")
- # cube_0 test 1
- cube_0_found_1 = ("Test 1: cube_0 found", "Test 1: cube_0 not found")
- cube_0_initial_position_1 = ("Test 1: cube_0 is in correct position", "Test 1: cube_0 isn't in correct position")
- cube_0_initial_velocity_1 = ("Test 1: cube_0 initial velocity valid", "Test 1: cube_0 initial velocity invalid")
- cube_0_final_position_1 = ("Test 1: cube_0 has stopped moving", "Test 1: cube_0 has not stopped moving")
- cube_0_final_velocity_1 = ("Test 1: cube_0 final velocity valid", "Test 1: cube_0 final velocity invalid")
- # cube_1 test 0
- cube_1_found_0 = ("Test 0: cube_1 found", "Test 0: cube_1 not found")
- cube_1_initial_position_0 = ("Test 0: cube_1 is in correct position", "Test 0: cube_1 isn't in correct position")
- cube_1_initial_velocity_0 = ("Test 0: cube_1 initial velocity valid", "Test 0: cube_1 initial velocity invalid")
- cube_1_final_position_0 = ("Test 0: cube_1 has stopped moving", "Test 0: cube_1 hasn't stopped moving")
- cube_1_final_velocity_0 = ("Test 0: cube_1 final velocity valid", "Test 0: cube_1 final velocity invalid")
- # cube_1 test 1
- cube_1_found_1 = ("Test 1: cube_1 found", "Test 1: cube_1 not found")
- cube_1_initial_position_1 = ("Test 1: cube_1 is in correct position", "Test 1: cube_1 isn't in correct position")
- cube_1_initial_velocity_1 = ("Test 1: cube_1 initial velocity valid", "Test 1: cube_1 initial velocity invalid")
- cube_1_final_position_1 = ("Test 1: cube_1 has stopped moving", "Test 1: cube_1 hasn't stopped moving")
- cube_1_final_velocity_1 = ("Test 1: cube_1 final velocity valid", "Test 1: cube_1 final velocity invalid")
- # cube_2 test 0
- cube_2_found_0 = ("Test 0: cube_2 found", "Test 0: cube_2 not found")
- cube_2_initial_position_0 = ("Test 0: cube_2 is in correct position", "Test 0: cube_2 isn't in correct position")
- cube_2_initial_velocity_0 = ("Test 0: cube_2 initial velocity valid", "Test 0: cube_2 initial velocity invalid")
- cube_2_final_position_0 = ("Test 0: cube_2 has stopped moving", "Test 0: cube_2 hasn't stopped moving")
- cube_2_final_velocity_0 = ("Test 0: cube_2 final velocity valid", "Test 0: cube_2 final velocity invalid")
- # cube_2 test 1
- cube_2_found_1 = ("Test 1: cube_2 found", "Test 1: cube_2 not found")
- cube_2_initial_position_1 = ("Test 1: cube_2 is in correct position", "Test 1: cube_2 isn't in correct position")
- cube_2_initial_velocity_1 = ("Test 1: cube_2 initial velocity valid", "Test 1: cube_2 initial velocity invalid")
- cube_2_final_position_1 = ("Test 1: cube_2 has stopped moving", "Test 1: cube_2 hasn't stopped moving")
- cube_2_final_velocity_1 = ("Test 1: cube_2 final velocity valid", "Test 1: cube_2 final velocity invalid")
- # fmt: on
- def Material_LibraryChangesReflectInstantly():
- """
- Summary: Verify that any change in any of the values of the material, once saved, is immediately reflected
- in the component and functionality
- Level Description:
- Three sphere entities (sphere_0, sphere_1, sphere_2) - They start between the terrain and trigger with
- velocity of 10 m/s in the negative z direction; has physx collider with sphere shape, physx rigid body,
- sphere shape, has "to_change_restitution", "to_change_restitution_combine", and "to_delete" materials
- applied respectively.
- Three cube entities (cube_0, cube_1, cube_2) - On top of the negative y side of the block, gravity enabled, no
- initial velocity, 0.0 linear damping; has physx collider with box shape, physx rigid body, box shape, and
- has "to_change_static_friction", "to_change_dynamic_friction", and "to_change_friction_combine" materials
- applied respectively
- trigger - Stationary trigger above the three spheres, used to indicate if the material was modified correctly; has
- physx collider with box shape (20.0, 5.0, 0.25) and trigger enabled and box shape (20.0, 5.0, 0.25)
- block - Stationary block that has all cubes sitting on it. Used as a controlled surface for friction testing; has
- physx collider with box shape (10.0, 10.0, 10.0) and box shape (10.0, 10.0, 10.0)
- terrain - terrain component holder lined up with terrain default height; has terrain component
- Material Library: Contains a different material for each entity with distinct collider shape. These materials are
- designed to provide the largest difference in result after change (sphere: velocity, cube: distance). All spheres
- should not bounce off of the terrain initially but will be able to hit the trigger post change. The cubes will
- experience higher friction after the change and not travel as far along the ramp entity.
- Expected Behavior: Before editing the material library the spheres in both levels will not bounce off of the terrain
- and the cubes will go some distance along the ramp. After the material file is edited the spheres will bounce off
- of the terrain and hit the trigger and the cubes will travel a smaller distance than before
- Main Script Steps:
- 1) Open Level
- 2) Create test objects
- 3) Run test 0
- 4) Modify material library
- 5) Run test 1
- 6) Validate results
- 7) Close Editor
- Test Loop Steps:
- 1) Enter game mode
- 2) Find and Validate entities
- 3) Wait for spheres to collide with terrain
- 4) Wait for spheres to enter the trigger
- 5) Log sphere results
- 6) Push cubes
- 7) Wait for cubes to stop moving
- 8) Log and validate cube results
- 9) Exit game mode
- 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
- 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
- import azlmbr.math as math
- from Physmaterial_Editor import Physmaterial_Editor
- # Constants
- FLOAT_THRESHOLD = 0.001
- # Timeout in seconds
- TIMEOUT = 2.0
- CUBE_IMPULSE = math.Vector3(0.0, 5.0, 0.0)
- CUBE_Y_POSITION = 536.0
- CUBE_INITIAL_VELOCITY = math.Vector3(0.0, 0.0, 0.0)
- PROPAGATION_FRAMES = 500
- # Helper Functions
- class Entity:
- terrain_id = None
- def __init__(self, name, test_index):
- # Type (str, int, int, Entity) -> None
- self.id = general.find_game_entity(name)
- self.name = name
- self.test_index = test_index
- self.collision_happened = False
- self.hit_trigger = False
- # Check Entity ID
- found = Tests.__dict__["{}_found_{}".format(self.name, self.test_index)]
- Report.critical_result(found, self.id.IsValid())
- @property
- def position(self):
- return azlmbr.components.TransformBus(azlmbr.bus.Event, "GetWorldTranslation", self.id)
- @property
- def velocity(self):
- 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
- )
- @property
- def is_not_moving(self):
- # Type () -> bool
- return (
- abs(self.velocity.x) < FLOAT_THRESHOLD
- and abs(self.velocity.y) < FLOAT_THRESHOLD
- and abs(self.velocity.z) < FLOAT_THRESHOLD
- )
- def on_collision_begin(self, args):
- # Type ([]) -> None
- if Entity.terrain_id.equal(args[0]):
- self.collision_happened = True
-
- class Sphere(Entity):
- def __init__(self, name, test_index):
- Entity.__init__(self, name, test_index)
- self.handler = azlmbr.physics.CollisionNotificationBusHandler()
- self.handler.connect(self.id)
- self.handler.add_callback("OnCollisionBegin", self.on_collision_begin)
- class Material_Test:
- def __init__(self, index):
- self.index = index
- self.sphere_list = None
- # List to hold how far the cube traveled
- self.cube_distances = []
- # List to hold wether the sphere hit the trigger and its velocities
- self.sphere_values = []
- def verify_sphere_initial_position(self, sphere, terrain, trigger):
- # Type (Entity, Entity, Entity) -> None
- # Validates sphere is where it should be
- position_valid = terrain.position.z < sphere.position.z < trigger.position.z
- initial_position = Tests.__dict__["{}_initial_position_{}".format(sphere.name, self.index)]
- Report.critical_result(initial_position, position_valid)
- def verify_sphere_initial_velocity(self, sphere):
- # Type (Entity) -> None
- # Validates that sphere in moving in the correct direction
- initial_velocity = Tests.__dict__["{}_initial_velocity_{}".format(sphere.name, self.index)]
- Report.critical_result(initial_velocity, not sphere.is_moving_up)
- def verify_sphere_collision(self, sphere):
- # Type (Entity) -> None
- # Reports sphere collision, ends test if it hasn't occurred
- collision = Tests.__dict__["{}_collision_{}".format(sphere.name, self.index)]
- Report.critical_result(collision, sphere.collision_happened)
- def verify_sphere_final_velocity(self, sphere):
- # Type (Entity) -> None
- # Validates that sphere is moving in the correct direction
- final_velocity = Tests.__dict__["{}_final_velocity_{}".format(sphere.name, self.index)]
- Report.result(final_velocity, sphere.is_moving_up or sphere.is_not_moving)
- def verify_sphere_final_position(self, sphere, terrain):
- # Type (Entity, Entity) -> None
- # Validats that sphere is not where it shouldn't be
- final_position = Tests.__dict__["{}_final_position_{}".format(sphere.name, self.index)]
- Report.result(final_position, sphere.position.z > terrain.position.z)
- def verify_cube_initial_position(self, cube, block):
- # Type (Entity, Entity) -> None
- # Cube initially starts at a standstill
- initial_position = Tests.__dict__["{}_initial_position_{}".format(cube.name, self.index)]
- Report.result(
- initial_position,
- cube.position.z > block.position.z and abs(cube.position.y - CUBE_Y_POSITION) < FLOAT_THRESHOLD,
- )
- def verify_cube_initial_velocity(self, cube):
- # Type (Entity) -> None
- # Ensures that the cube starts not moving
- initial_velocity = Tests.__dict__["{}_initial_velocity_{}".format(cube.name, self.index)]
- Report.result(initial_velocity, cube.velocity.IsClose(CUBE_INITIAL_VELOCITY, 0.01))
- def push_cubes(self, cube_list):
- # Type ([Entity]) -> None
- # Imparts a velocity into each cube in the y-direction
- for cube in cube_list:
- azlmbr.physics.RigidBodyRequestBus(azlmbr.bus.Event, "SetLinearVelocity", cube.id, CUBE_IMPULSE)
- def verify_cube_final_velocity(self, cube):
- # Type (Entity) -> None
- # Ensures that cube has stopped moving
- final_velocity = Tests.__dict__["{}_final_velocity_{}".format(cube.name, self.index)]
- Report.result(final_velocity, cube.velocity.IsClose(CUBE_INITIAL_VELOCITY, 0.01))
- def verify_cube_final_position(self, cube, block):
- # Type (Entity, Entity) -> None
- # Validates that cube is not somewhere it shouldn't be
- final_position = Tests.__dict__["{}_final_position_{}".format(cube.name, self.index)]
- Report.result(final_position, cube.position.z > block.position.z)
- def log_values(self, entity):
- # Type (Entity) -> None
- # Logs needed values for comparison
- if isinstance(entity, Sphere):
- self.sphere_values.append([entity.velocity, entity.hit_trigger])
- else:
- self.cube_distances.append(entity.position)
- def set_trigger(self, trigger):
- self.handler = azlmbr.physics.TriggerNotificationBusHandler()
- self.handler.connect(trigger.id)
- self.handler.add_callback("OnTriggerEnter", self.on_trigger_enter)
- def on_trigger_enter(self, args):
- for sphere in self.sphere_list:
- if sphere.id.equal(args[0]):
- sphere.hit_trigger = True
- def modify_material_library():
- # Type () -> bool
- # Uses a Physmaterial_Editor option to modify the material library associated with this level.
- # Changes are made to maximize the in level affect.
- material_library = Physmaterial_Editor("c4044455_material_librarychangesinstantly.physmaterial")
- dynamic_friction_modified = material_library.modify_material("to_change_dynamic_friction", "DynamicFriction", 10.0)
- static_friction_modified = material_library.modify_material("to_change_static_friction", "StaticFriction", 10.0)
- friction_combine_modified = material_library.modify_material(
- "to_change_friction_combine", "FrictionCombine", "Maximum"
- )
- restitution_combine_modified = material_library.modify_material(
- "to_change_restitution_combine", "RestitutionCombine", "Maximum"
- )
- restitution_modified = material_library.modify_material("to_change_restitution", "Restitution", 1.0)
- material_deleted = material_library.delete_material("to_delete")
- material_library.save_changes()
- return (
- material_deleted
- and dynamic_friction_modified
- and static_friction_modified
- and friction_combine_modified
- and restitution_combine_modified
- and restitution_modified
- )
- def check_sphere(sphere_values_0, sphere_values_1, index):
- # Type ([[vector3, bool]], [[vector3, bool]]) -> bool
- hit_trigger = not sphere_values_0[index][1] and sphere_values_1[index][1]
- velocity_valid = sphere_values_0[index][0].z < sphere_values_1[index][0].z
- return hit_trigger and velocity_valid
- def check_static_friction(cube_distances_0, cube_distances_1):
- # Type ([float],[float]) -> bool
- return cube_distances_0[0].y > cube_distances_1[0].y
- def check_dynamic_friction(cube_distances_0, cube_distances_1):
- # Type ([float],[float]) -> bool
- return cube_distances_0[1].y > cube_distances_1[1].y
- def check_friction_combine(cube_distances_0, cube_distances_1):
- # Type ([float],[float]) -> bool
- return cube_distances_0[2].y > cube_distances_1[2].y
- def run_test(test):
- # Type (Material_Test) -> None
- # This loop runs the test steps and logs data to the given Material_Test object
- # 1) Enter game mode
- helper.enter_game_mode(Tests.__dict__["enter_game_mode_{}".format(test.index)])
- # 2) Find and Validate entities
- terrain = Entity("terrain", test.index)
- Entity.terrain_id = terrain.id
- block = Entity("block", test.index)
- trigger = Entity("trigger", test.index)
- sphere_0 = Sphere("sphere_0", test.index)
- sphere_1 = Sphere("sphere_1", test.index)
- sphere_2 = Sphere("sphere_2", test.index)
- sphere_list = [sphere_0, sphere_1, sphere_2]
- cube_0 = Entity("cube_0", test.index)
- cube_1 = Entity("cube_1", test.index)
- cube_2 = Entity("cube_2", test.index)
- cube_list = [cube_0, cube_1, cube_2]
- test.sphere_list = sphere_list
- test.set_trigger(trigger)
- for sphere in sphere_list:
- test.verify_sphere_initial_position(sphere, terrain, trigger)
- test.verify_sphere_initial_velocity(sphere)
- for cube in cube_list:
- test.verify_cube_initial_position(cube, block)
- test.verify_cube_initial_velocity(cube)
- # 3) Wait for spheres to collide with terrain
- helper.wait_for_condition(lambda: all([sphere.collision_happened for sphere in sphere_list]), TIMEOUT)
- # 4) Wait for spheres to enter the trigger
- helper.wait_for_condition(lambda: all([sphere.hit_trigger for sphere in sphere_list]), TIMEOUT)
- for sphere in sphere_list:
- test.log_values(sphere)
- # 5) Log sphere results
- for sphere in sphere_list:
- test.verify_sphere_collision(sphere)
- test.verify_sphere_final_position(sphere, terrain)
- test.verify_sphere_final_velocity(sphere)
- # 6) Push cubes
- test.push_cubes(cube_list)
- # 7) Wait for cubes to stop moving
- helper.wait_for_condition(lambda: all([cube.is_not_moving for cube in cube_list]), TIMEOUT)
- # 8) Log and validate cube results
- for cube in cube_list:
- test.verify_cube_final_position(cube, block)
- test.verify_cube_final_velocity(cube)
- test.log_values(cube)
- # 9) Exit game mode
- helper.exit_game_mode(Tests.__dict__["exit_game_mode_{}".format(test.index)])
- # Main Script
- helper.init_idle()
- # 1) Open Level
- helper.open_level("Physics", "C4044455_Material_LibraryChangesInstantly")
- # 2) Create test objects
- test_0 = Material_Test(0)
- test_1 = Material_Test(1)
- # 3) Run test 0
- run_test(test_0)
- # 4) Modify material library
- Report.result(Tests.material_changes, modify_material_library())
- # Wait for modifications to the material library to propagate.
- general.idle_wait_frames(PROPAGATION_FRAMES)
- # 5) Run test 1
- run_test(test_1)
- # 6) Validate results
- # Restitution Modification Successful
- Report.result(Tests.restitution, check_sphere(test_0.sphere_values, test_1.sphere_values, index=0))
- # Static Friction Modification Successful
- Report.result(Tests.static_friction, check_static_friction(test_0.cube_distances, test_1.cube_distances))
- # Dynamic Friction Modification Successful
- Report.result(Tests.dynamic_friction, check_dynamic_friction(test_0.cube_distances, test_1.cube_distances))
- # Friction Combine Modification Successful
- Report.result(Tests.friction_combine, check_friction_combine(test_0.cube_distances, test_1.cube_distances))
- # Restitution Combine Modification Successful
- Report.result(Tests.restitution_combine, check_sphere(test_0.sphere_values, test_1.sphere_values, index=1))
- # Material Delete Successful
- Report.result(Tests.delete_material, check_sphere(test_0.sphere_values, test_1.sphere_values, index=2))
- if __name__ == "__main__":
- from editor_python_test_tools.utils import Report
- Report.start_test(Material_LibraryChangesReflectInstantly)
|