123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- #
- # 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
- #
- #
- import sys
- import azlmbr
- from pathlib import Path
- def fixup_current_level(threshold):
- nonUniformScaleComponentId = azlmbr.editor.EditorNonUniformScaleComponentTypeId
- # iterate over all entities in the level
- entityIdList = azlmbr.entity.SearchBus(azlmbr.bus.Broadcast, 'SearchEntities', azlmbr.entity.SearchFilter())
- for entityId in entityIdList:
- name = azlmbr.editor.EditorEntityInfoRequestBus(azlmbr.bus.Event, 'GetName', entityId)
- local = azlmbr.components.TransformBus(azlmbr.bus.Event, 'GetLocalScale', entityId)
- # only process entities where the non-uniformity is greater than the threshold
- local_max = max(local.x, local.y, local.z)
- local_min = min(local.x, local.y, local.z)
- if local_max / local_min > 1 + threshold:
- # check if there is already a Non-uniform Scale component
- getComponentOutcome = azlmbr.editor.EditorComponentAPIBus(azlmbr.bus.Broadcast, 'GetComponentOfType', entityId, nonUniformScaleComponentId)
- if getComponentOutcome.IsSuccess():
- print(f"skipping {name} as it already has a Non-uniform Scale component")
- else:
- # add Non-uniform Scale component and set it to the non-uniform part of the local scale
- azlmbr.editor.EditorComponentAPIBus(azlmbr.bus.Broadcast,'AddComponentsOfType', entityId, [nonUniformScaleComponentId])
- vec = azlmbr.math.Vector3(local.x / local_max, local.y / local_max, local.z / local_max)
- azlmbr.entity.NonUniformScaleRequestBus(azlmbr.bus.Event, 'SetScale', entityId, vec)
- print(f"added non-uniform scale component for {name}: {local.x}, {local.y}, {local.z}")
- if __name__ == '__main__':
- # handle the arguments manually since argparse causes problems when run through EditorPythonBindings
- process_all_levels = "--all" in sys.argv
- # ignore entities where the relative difference between the min and max scale values is less than this threshold
- threshold = 0.001
- for i in range(len(sys.argv) - 1):
- if sys.argv[i] == "--threshold":
- try:
- threshold = float(sys.argv[i + 1])
- except ValueError:
- print(f"invalid threshold value {sys.argv[i + 1]}, using default value {threshold}")
- pass
- if process_all_levels:
- game_folder = Path(azlmbr.legacy.general.get_game_folder())
- level_folder = game_folder / 'Levels'
- levels = [str(level) for level in level_folder.rglob('*.ly')] + [str(level) for level in level_folder.rglob('*.cry')]
- for level in levels:
- if "_savebackup" not in level:
- print(f'loading level {level}')
- azlmbr.legacy.general.open_level_no_prompt(level)
- azlmbr.legacy.general.idle_wait(2.0)
- fixup_current_level(threshold)
- azlmbr.legacy.general.save_level()
- else:
- fixup_current_level(threshold)
|