Merge branch 'development' of https://github.com/o3de/o3de into cgalvan/DraftStreamingImageAssetPixelAPI
This commit is contained in:
+1
-8
@@ -2,18 +2,14 @@
|
||||
.vs/
|
||||
.vscode/
|
||||
__pycache__
|
||||
AssetProcessorTemp/**
|
||||
[Bb]uild/
|
||||
[Oo]ut/**
|
||||
CMakeUserPresets.json
|
||||
[Cc]ache/
|
||||
/[Ii]nstall/
|
||||
Editor/EditorEventLog.xml
|
||||
Editor/EditorLayout.xml
|
||||
**/*egg-info/**
|
||||
**/*egg-link
|
||||
**/[Rr]estricted
|
||||
UserSettings.xml
|
||||
[Uu]ser/
|
||||
FrameCapture/**
|
||||
.DS_Store
|
||||
@@ -22,9 +18,6 @@ client*.cfg
|
||||
server*.cfg
|
||||
.mayaSwatches/
|
||||
_savebackup/
|
||||
#Output folder for test results when running Automated Tests
|
||||
TestResults/**
|
||||
*.swatches
|
||||
/imgui.ini
|
||||
/scripts/project_manager/logs/
|
||||
/AutomatedTesting/Gem/PythonTests/scripting/TestResults
|
||||
|
||||
|
||||
+10
-3
@@ -5,15 +5,22 @@ For complete copyright and license terms please see the LICENSE at the root of t
|
||||
SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
"""
|
||||
|
||||
from typing import List
|
||||
from math import isclose
|
||||
import collections.abc
|
||||
|
||||
import azlmbr.bus as bus
|
||||
import azlmbr.editor as editor
|
||||
import azlmbr.entity as entity
|
||||
import azlmbr.legacy.general as general
|
||||
import azlmbr.object
|
||||
|
||||
from typing import List
|
||||
from math import isclose
|
||||
import collections.abc
|
||||
from editor_python_test_tools.utils import TestHelper as helper
|
||||
|
||||
|
||||
def open_base_level():
|
||||
helper.init_idle()
|
||||
helper.open_level("Prefab", "Base")
|
||||
|
||||
|
||||
def find_entity_by_name(entity_name):
|
||||
|
||||
+5
-5
@@ -108,7 +108,7 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
|
||||
"""
|
||||
helper = bundler_batch_helper
|
||||
seed_list = os.path.join(workspace.paths.engine_root(), "Assets", "Engine", "SeedAssetList.seed") # Engine seed list
|
||||
asset = r"levels\testdependencieslevel\level.pak"
|
||||
asset = r"levels\testdependencieslevel\testdependencieslevel.spawnable"
|
||||
|
||||
# Create Asset list
|
||||
helper.call_assetLists(
|
||||
@@ -191,7 +191,7 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
|
||||
"""
|
||||
helper = bundler_batch_helper
|
||||
seed_list = os.path.join(workspace.paths.engine_root(), "Assets", "Engine", "SeedAssetList.seed") # Engine seed list
|
||||
asset = r"levels\testdependencieslevel\level.pak"
|
||||
asset = r"levels\testdependencieslevel\testdependencieslevel.spawnable"
|
||||
|
||||
# Useful bundle locations / names (2 for comparing contents)
|
||||
# fmt:off
|
||||
@@ -924,7 +924,7 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
|
||||
# Create a seed file
|
||||
helper.call_seeds(
|
||||
seedListFile=helper["seed_list_file"],
|
||||
addSeed=r"levels\testdependencieslevel\level.pak",
|
||||
addSeed=r"levels\testdependencieslevel\testdependencieslevel.spawnable",
|
||||
platform="pc",
|
||||
)
|
||||
|
||||
@@ -947,9 +947,9 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
|
||||
# Specifying platform but not "add" or "remove" should fail
|
||||
result, _ = helper.call_assetLists(
|
||||
assetListFile=helper["asset_info_file_request"],
|
||||
allowOverwrites="",
|
||||
seedListFile=helper["seed_list_file"],
|
||||
platform="pc",
|
||||
allowOverwrites="",
|
||||
)
|
||||
assert result, "Overwriting with override threw an error"
|
||||
|
||||
@@ -982,7 +982,7 @@ class TestsAssetBundlerBatch_WindowsAndMac(object):
|
||||
request.addfinalizer(lambda: fs.delete([bundle_result_path], True, False))
|
||||
|
||||
bundles_folder = os.path.join(workspace.paths.project(), "Bundles")
|
||||
level_pak = r"levels\testdependencieslevel\level.pak"
|
||||
level_pak = r"levels\testdependencieslevel\testdependencieslevel.spawnable"
|
||||
bundle_request_path = os.path.join(bundles_folder, "bundle.pak")
|
||||
bundle_result_path = os.path.join(bundles_folder,
|
||||
helper.platform_file_name("bundle.pak", workspace.asset_processor_platform))
|
||||
|
||||
+2
-3
@@ -23,12 +23,11 @@ from ..ap_fixtures.timeout_option_fixture import timeout_option_fixture as timeo
|
||||
@pytest.mark.SUITE_periodic
|
||||
@pytest.mark.parametrize('launcher_platform', ['windows_editor'])
|
||||
@pytest.mark.parametrize('project', ['AutomatedTesting'])
|
||||
@pytest.mark.parametrize('level', ['auto_test'])
|
||||
@pytest.mark.parametrize('level', ['TestDependenciesLevel'])
|
||||
class TestBundleMode(object):
|
||||
def test_bundle_mode_with_levels_mounts_bundles_correctly(self, request, editor, level, launcher_platform,
|
||||
asset_processor, workspace, bundler_batch_helper):
|
||||
level_pak = os.path.join("levels", level, "level.pak")
|
||||
|
||||
level_pak = os.path.join("levels", level, "TestDependenciesLevel.spawnable")
|
||||
bundles_folder = os.path.join(workspace.paths.project(), "Bundles")
|
||||
bundle_request_path = os.path.join(bundles_folder, "bundle.pak")
|
||||
bundle_result_path = os.path.join(bundles_folder,
|
||||
|
||||
@@ -182,7 +182,7 @@ class TestAutomationBase:
|
||||
@staticmethod
|
||||
def _kill_ly_processes(include_asset_processor=True):
|
||||
LY_PROCESSES = [
|
||||
'Editor', 'Profiler', 'RemoteConsole', 'AutomatedTesting.ServerLauncher'
|
||||
'Editor', 'Profiler', 'RemoteConsole', 'AutomatedTesting.ServerLauncher', 'o3de'
|
||||
]
|
||||
AP_PROCESSES = [
|
||||
'AssetProcessor', 'AssetProcessorBatch', 'AssetBuilder', 'CrySCompileServer',
|
||||
|
||||
@@ -9,10 +9,10 @@
|
||||
if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_FOUNDATION_TEST_SUPPORTED)
|
||||
|
||||
ly_add_pytest(
|
||||
NAME AutomatedTesting::EditorTests_Main_Optimized
|
||||
NAME AutomatedTesting::EditorTests_Main
|
||||
TEST_SUITE main
|
||||
TEST_SERIAL
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Main_Optimized.py
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Main.py
|
||||
PYTEST_MARKS "not REQUIRES_gpu"
|
||||
RUNTIME_DEPENDENCIES
|
||||
Legacy::Editor
|
||||
@@ -27,7 +27,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
|
||||
TEST_SUITE main
|
||||
TEST_SERIAL
|
||||
TEST_REQUIRES gpu
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Main_Optimized.py
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Main.py
|
||||
PYTEST_MARKS "REQUIRES_gpu"
|
||||
RUNTIME_DEPENDENCIES
|
||||
Legacy::Editor
|
||||
@@ -37,17 +37,4 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
|
||||
Editor
|
||||
)
|
||||
|
||||
ly_add_pytest(
|
||||
NAME AutomatedTesting::EditorTests_Sandbox_Optimized
|
||||
TEST_SUITE sandbox
|
||||
TEST_SERIAL
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Sandbox_Optimized.py
|
||||
RUNTIME_DEPENDENCIES
|
||||
Legacy::Editor
|
||||
AZ::AssetProcessor
|
||||
AutomatedTesting.Assets
|
||||
COMPONENT
|
||||
Editor
|
||||
)
|
||||
|
||||
endif()
|
||||
|
||||
+2
-3
@@ -59,8 +59,8 @@ def AssetBrowser_SearchFiltering():
|
||||
|
||||
import azlmbr.legacy.general as general
|
||||
|
||||
import editor_python_test_tools.hydra_editor_utils as hydra
|
||||
from editor_python_test_tools.utils import Report
|
||||
from editor_python_test_tools.utils import TestHelper as helper
|
||||
|
||||
def verify_files_appeared(model, allowed_asset_extensions, parent_index=QtCore.QModelIndex()):
|
||||
indexes = [parent_index]
|
||||
@@ -80,8 +80,7 @@ def AssetBrowser_SearchFiltering():
|
||||
return True
|
||||
|
||||
# 1) Open an existing simple level
|
||||
helper.init_idle()
|
||||
helper.open_level("Physics", "Base")
|
||||
hydra.open_base_level()
|
||||
|
||||
# 2) Open Asset Browser (if not opened already)
|
||||
editor_window = pyside_utils.get_editor_main_window()
|
||||
|
||||
+2
-2
@@ -53,6 +53,7 @@ def AssetBrowser_TreeNavigation():
|
||||
import azlmbr.legacy.general as general
|
||||
|
||||
import editor_python_test_tools.pyside_utils as pyside_utils
|
||||
import editor_python_test_tools.hydra_editor_utils as hydra
|
||||
from editor_python_test_tools.utils import Report
|
||||
from editor_python_test_tools.utils import TestHelper as helper
|
||||
|
||||
@@ -69,8 +70,7 @@ def AssetBrowser_TreeNavigation():
|
||||
file_path = ("AutomatedTesting", "Assets", "ImageGradients", "image_grad_test_gsi.png")
|
||||
|
||||
# 1) Open an existing simple level
|
||||
helper.init_idle()
|
||||
helper.open_level("Physics", "Base")
|
||||
hydra.open_base_level()
|
||||
|
||||
# 2) Open Asset Browser (if not opened already)
|
||||
editor_window = pyside_utils.get_editor_main_window()
|
||||
|
||||
@@ -215,8 +215,7 @@ def AssetPicker_UI_UX():
|
||||
QtTest.QTest.keyClick(tree, Qt.Key_Enter, Qt.NoModifier)
|
||||
|
||||
# 1) Open an existing simple level
|
||||
helper.init_idle()
|
||||
helper.open_level("Physics", "Base")
|
||||
hydra.open_base_level()
|
||||
|
||||
# 2) Create entity and add Mesh component
|
||||
entity_position = math.Vector3(125.0, 136.0, 32.0)
|
||||
|
||||
+2
-4
@@ -56,19 +56,17 @@ def BasicEditorWorkflows_ExistingLevel_EntityComponentCRUD():
|
||||
06. delete parent entity
|
||||
"""
|
||||
|
||||
import editor_python_test_tools.hydra_editor_utils as hydra
|
||||
from editor_python_test_tools.utils import Report
|
||||
from editor_python_test_tools.editor_entity_utils import EditorEntity
|
||||
|
||||
import azlmbr.bus as bus
|
||||
import azlmbr.editor as editor
|
||||
import azlmbr.entity as entity
|
||||
import azlmbr.legacy.general as general
|
||||
import azlmbr.object
|
||||
|
||||
# 01. load an existing level
|
||||
test_level = 'Simple'
|
||||
general.open_level_no_prompt(test_level)
|
||||
Report.result(Tests.load_level, general.get_current_level_name() == test_level)
|
||||
hydra.open_base_level()
|
||||
|
||||
# 02. create parent entity and set name
|
||||
# Delete any exiting entity and Create a new Entity at the root level
|
||||
|
||||
+13
-17
@@ -31,7 +31,7 @@ class Tests:
|
||||
"Component removed from entity successfully",
|
||||
"Failed to remove component from entity"
|
||||
)
|
||||
level_saved_and_exported = (
|
||||
saved_and_exported = (
|
||||
"Level saved and exported successfully",
|
||||
"Failed to save/export level"
|
||||
)
|
||||
@@ -52,8 +52,7 @@ def BasicEditorWorkflows_LevelEntityComponentCRUD():
|
||||
- A new entity can be created
|
||||
- Entity hierarchy can be adjusted
|
||||
- Components can be added/removed/updated
|
||||
- Level can be saved
|
||||
- Level can be exported
|
||||
- Level can be saved/exported
|
||||
|
||||
Note:
|
||||
- This test file must be called from the O3DE Editor command terminal
|
||||
@@ -70,7 +69,7 @@ def BasicEditorWorkflows_LevelEntityComponentCRUD():
|
||||
import azlmbr.editor as editor
|
||||
import azlmbr.entity as entity
|
||||
import azlmbr.math as math
|
||||
import azlmbr.paths
|
||||
import azlmbr.paths as paths
|
||||
|
||||
import editor_python_test_tools.hydra_editor_utils as hydra
|
||||
from editor_python_test_tools.utils import Report
|
||||
@@ -84,7 +83,7 @@ def BasicEditorWorkflows_LevelEntityComponentCRUD():
|
||||
return None
|
||||
|
||||
# 1) Create a new level
|
||||
level = "tmp_level"
|
||||
lvl_name = "tmp_level"
|
||||
editor_window = pyside_utils.get_editor_main_window()
|
||||
new_level_action = pyside_utils.get_action_for_menu_path(editor_window, "File", "New Level")
|
||||
pyside_utils.trigger_action_async(new_level_action)
|
||||
@@ -95,23 +94,24 @@ def BasicEditorWorkflows_LevelEntityComponentCRUD():
|
||||
Report.info("New Level dialog opened")
|
||||
grp_box = new_level_dlg.findChild(QtWidgets.QGroupBox, "STATIC_GROUP1")
|
||||
level_name = grp_box.findChild(QtWidgets.QLineEdit, "LEVEL")
|
||||
level_name.setText(level)
|
||||
level_name.setText(lvl_name)
|
||||
button_box = new_level_dlg.findChild(QtWidgets.QDialogButtonBox, "buttonBox")
|
||||
button_box.button(QtWidgets.QDialogButtonBox.Ok).click()
|
||||
|
||||
# Verify new level was created successfully
|
||||
level_create_success = await pyside_utils.wait_for_condition(lambda: editor.EditorToolsApplicationRequestBus(
|
||||
bus.Broadcast, "GetCurrentLevelName") == level, 5.0)
|
||||
bus.Broadcast, "GetCurrentLevelName") == lvl_name, 5.0)
|
||||
Report.critical_result(Tests.level_created, level_create_success)
|
||||
|
||||
# 2) Delete existing entities, and create and manipulate new entities via Entity Inspector
|
||||
search_filter = azlmbr.entity.SearchFilter()
|
||||
all_entities = entity.SearchBus(azlmbr.bus.Broadcast, "SearchEntities", search_filter)
|
||||
editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntities", all_entities)
|
||||
entity_outliner_widget = editor_window.findChild(QtWidgets.QWidget, "OutlinerWidgetUI")
|
||||
entity_outliner_widget = editor_window.findChild(QtWidgets.QWidget, "EntityOutlinerWidgetUI")
|
||||
outliner_object_list = entity_outliner_widget.findChild(QtWidgets.QWidget, "m_objectList_Contents")
|
||||
outliner_tree = outliner_object_list.findChild(QtWidgets.QWidget, "m_objectTree")
|
||||
await pyside_utils.trigger_context_menu_entry(outliner_tree, "Create entity")
|
||||
outliner_viewport = outliner_tree.findChild(QtWidgets.QWidget, "qt_scrollarea_viewport")
|
||||
await pyside_utils.trigger_context_menu_entry(outliner_viewport, "Create entity")
|
||||
|
||||
# Find the new entity
|
||||
parent_entity_id = find_entity_by_name("Entity1")
|
||||
@@ -153,14 +153,10 @@ def BasicEditorWorkflows_LevelEntityComponentCRUD():
|
||||
save_level_action = pyside_utils.get_action_for_menu_path(editor_window, "File", "Save")
|
||||
pyside_utils.trigger_action_async(save_level_action)
|
||||
|
||||
# 5) Export the level
|
||||
export_action = pyside_utils.get_action_for_menu_path(editor_window, "Game", "Export to Engine")
|
||||
pyside_utils.trigger_action_async(export_action)
|
||||
level_pak_file = os.path.join(
|
||||
"AutomatedTesting", "Levels", level, "level.pak"
|
||||
)
|
||||
export_success = await pyside_utils.wait_for_condition(lambda: os.path.exists(level_pak_file), 5.0)
|
||||
Report.result(Tests.level_saved_and_exported, export_success)
|
||||
# 5) Verify the save/export of the level
|
||||
level_prefab_path = os.path.join(paths.products, "levels", lvl_name, f"{lvl_name}.spawnable")
|
||||
success = await pyside_utils.wait_for_condition(lambda: os.path.exists(level_prefab_path), 5.0)
|
||||
Report.result(Tests.saved_and_exported, success)
|
||||
|
||||
run_test()
|
||||
|
||||
|
||||
+2
-4
@@ -63,7 +63,7 @@ def ComponentCRUD_Add_Delete_Components():
|
||||
:return: None
|
||||
"""
|
||||
|
||||
from PySide2 import QtWidgets, QtTest, QtCore
|
||||
from PySide2 import QtWidgets, QtTest
|
||||
from PySide2.QtCore import Qt
|
||||
|
||||
import azlmbr.legacy.general as general
|
||||
@@ -74,7 +74,6 @@ def ComponentCRUD_Add_Delete_Components():
|
||||
|
||||
import editor_python_test_tools.hydra_editor_utils as hydra
|
||||
from editor_python_test_tools.utils import Report
|
||||
from editor_python_test_tools.utils import TestHelper as helper
|
||||
|
||||
async def add_component(component_name):
|
||||
pyside_utils.click_button_async(add_comp_btn)
|
||||
@@ -88,8 +87,7 @@ def ComponentCRUD_Add_Delete_Components():
|
||||
QtTest.QTest.keyClick(tree, Qt.Key_Enter, Qt.NoModifier)
|
||||
|
||||
# 1) Open an existing simple level
|
||||
helper.init_idle()
|
||||
helper.open_level("Physics", "Base")
|
||||
hydra.open_base_level()
|
||||
|
||||
# 2) Create entity
|
||||
entity_position = math.Vector3(125.0, 136.0, 32.0)
|
||||
|
||||
@@ -62,12 +62,11 @@ def Docking_BasicDockedTools():
|
||||
import azlmbr.editor as editor
|
||||
import azlmbr.entity as entity
|
||||
|
||||
import editor_python_test_tools.hydra_editor_utils as hydra
|
||||
from editor_python_test_tools.utils import Report
|
||||
from editor_python_test_tools.utils import TestHelper as helper
|
||||
|
||||
# Open an existing simple level
|
||||
helper.init_idle()
|
||||
helper.open_level("Physics", "Base")
|
||||
hydra.open_base_level()
|
||||
|
||||
# Make sure the Entity Outliner, Entity Inspector and Console tools are open
|
||||
general.open_pane("Entity Outliner (PREVIEW)")
|
||||
@@ -80,7 +79,7 @@ def Docking_BasicDockedTools():
|
||||
editor.EditorEntityAPIBus(bus.Event, 'SetName', entity_id, entity_original_name)
|
||||
|
||||
editor_window = pyside_utils.get_editor_main_window()
|
||||
entity_outliner = editor_window.findChild(QtWidgets.QDockWidget, "Entity Outliner (PREVIEW)")
|
||||
entity_outliner = editor_window.findChild(QtWidgets.QDockWidget, "Entity Outliner")
|
||||
|
||||
# 1) Open the tools and dock them together in a floating tabbed widget.
|
||||
# We drag/drop it over the viewport since it doesn't allow docking, so this will undock it
|
||||
@@ -88,15 +87,15 @@ def Docking_BasicDockedTools():
|
||||
pyside_utils.drag_and_drop(entity_outliner, render_overlay)
|
||||
|
||||
# We need to grab a new reference to the Entity Outliner QDockWidget because when it gets moved
|
||||
# to the floating window, its parent changes so the wrapped intance we had becomes invalid
|
||||
entity_outliner = editor_window.findChild(QtWidgets.QDockWidget, "Entity Outliner (PREVIEW)")
|
||||
# to the floating window, its parent changes so the wrapped instance we had becomes invalid
|
||||
entity_outliner = editor_window.findChild(QtWidgets.QDockWidget, "Entity Outliner")
|
||||
|
||||
# Dock the Entity Inspector tabbed with the floating Entity Outliner
|
||||
entity_inspector = editor_window.findChild(QtWidgets.QDockWidget, "Entity Inspector")
|
||||
pyside_utils.drag_and_drop(entity_inspector, entity_outliner)
|
||||
|
||||
# We need to grab a new reference to the Entity Inspector QDockWidget because when it gets moved
|
||||
# to the floating window, its parent changes so the wrapped intance we had becomes invalid
|
||||
# to the floating window, its parent changes so the wrapped instance we had becomes invalid
|
||||
entity_inspector = editor_window.findChild(QtWidgets.QDockWidget, "Entity Inspector")
|
||||
|
||||
# Dock the Console tabbed with the floating Entity Inspector
|
||||
@@ -106,7 +105,7 @@ def Docking_BasicDockedTools():
|
||||
# Check to ensure all the tools are parented to the same QStackedWidget
|
||||
def check_all_panes_tabbed():
|
||||
entity_inspector = editor_window.findChild(QtWidgets.QDockWidget, "Entity Inspector")
|
||||
entity_outliner = editor_window.findChild(QtWidgets.QDockWidget, "Entity Outliner (PREVIEW)")
|
||||
entity_outliner = editor_window.findChild(QtWidgets.QDockWidget, "Entity Outliner")
|
||||
console = editor_window.findChild(QtWidgets.QDockWidget, "Console")
|
||||
entity_inspector_parent = entity_inspector.parentWidget()
|
||||
entity_outliner_parent = entity_outliner.parentWidget()
|
||||
@@ -122,7 +121,7 @@ def Docking_BasicDockedTools():
|
||||
|
||||
# 2.1,2) Select an Entity in the Entity Outliner.
|
||||
entity_inspector = editor_window.findChild(QtWidgets.QDockWidget, "Entity Inspector")
|
||||
entity_outliner = editor_window.findChild(QtWidgets.QDockWidget, "Entity Outliner (PREVIEW)")
|
||||
entity_outliner = editor_window.findChild(QtWidgets.QDockWidget, "Entity Outliner")
|
||||
console = editor_window.findChild(QtWidgets.QDockWidget, "Console")
|
||||
object_tree = entity_outliner.findChild(QtWidgets.QTreeView, "m_objectTree")
|
||||
test_entity_index = pyside_utils.find_child_by_pattern(object_tree, entity_original_name)
|
||||
|
||||
+6
-5
@@ -30,11 +30,13 @@ def EntityOutliner_EntityOrdering():
|
||||
5) Add another new entity, ensure the rest of the order is unchanged
|
||||
"""
|
||||
|
||||
import editor_python_test_tools.pyside_utils as pyside_utils
|
||||
from PySide2 import QtCore
|
||||
|
||||
import azlmbr.legacy.general as general
|
||||
|
||||
import editor_python_test_tools.hydra_editor_utils as hydra
|
||||
import editor_python_test_tools.pyside_utils as pyside_utils
|
||||
from editor_python_test_tools.utils import Report
|
||||
from editor_python_test_tools.utils import TestHelper as helper
|
||||
from PySide2 import QtCore, QtWidgets, QtGui, QtTest
|
||||
|
||||
# Grab the Editor, Entity Outliner, and Outliner Model
|
||||
editor_window = pyside_utils.get_editor_main_window()
|
||||
@@ -110,8 +112,7 @@ def EntityOutliner_EntityOrdering():
|
||||
expected_order = []
|
||||
|
||||
# 1) Open the empty Prefab Base level
|
||||
helper.init_idle()
|
||||
helper.open_level("Prefab", "Base")
|
||||
hydra.open_base_level()
|
||||
|
||||
# 2) Add 5 entities to the outliner
|
||||
ENTITIES_TO_ADD = 5
|
||||
|
||||
+2
-3
@@ -69,8 +69,8 @@ def InputBindings_Add_Remove_Input_Events():
|
||||
|
||||
import azlmbr.legacy.general as general
|
||||
|
||||
import editor_python_test_tools.hydra_editor_utils as hydra
|
||||
from editor_python_test_tools.utils import Report
|
||||
from editor_python_test_tools.utils import TestHelper as helper
|
||||
|
||||
def open_asset_editor():
|
||||
general.open_pane("Asset Editor")
|
||||
@@ -81,8 +81,7 @@ def InputBindings_Add_Remove_Input_Events():
|
||||
return not general.is_pane_visible("Asset Editor")
|
||||
|
||||
# 1) Open an existing simple level
|
||||
helper.init_idle()
|
||||
helper.open_level("Physics", "Base")
|
||||
hydra.open_base_level()
|
||||
|
||||
# 2) Open Asset Editor
|
||||
Report.result(Tests.asset_editor_opened, open_asset_editor())
|
||||
|
||||
@@ -26,9 +26,9 @@ def Menus_EditMenuOptions_Work():
|
||||
:return: None
|
||||
"""
|
||||
|
||||
import editor_python_test_tools.hydra_editor_utils as hydra
|
||||
import editor_python_test_tools.pyside_utils as pyside_utils
|
||||
from editor_python_test_tools.utils import Report
|
||||
from editor_python_test_tools.utils import TestHelper as helper
|
||||
|
||||
edit_menu_options = [
|
||||
("Undo",),
|
||||
@@ -52,19 +52,20 @@ def Menus_EditMenuOptions_Work():
|
||||
("Editor Settings", "Global Preferences"),
|
||||
("Editor Settings", "Editor Settings Manager"),
|
||||
("Editor Settings", "Keyboard Customization", "Customize Keyboard"),
|
||||
("Editor Settings", "Keyboard Customization", "Export Keyboard Settings"),
|
||||
("Editor Settings", "Keyboard Customization", "Import Keyboard Settings"),
|
||||
# The following menu options are temporarily disabled due to https://github.com/o3de/o3de/issues/6746
|
||||
#("Editor Settings", "Keyboard Customization", "Export Keyboard Settings"),
|
||||
#("Editor Settings", "Keyboard Customization", "Import Keyboard Settings"),
|
||||
]
|
||||
|
||||
# 1) Open an existing simple level
|
||||
helper.init_idle()
|
||||
helper.open_level("Physics", "Base")
|
||||
hydra.open_base_level()
|
||||
|
||||
# 2) Interact with Edit Menu options
|
||||
editor_window = pyside_utils.get_editor_main_window()
|
||||
for option in edit_menu_options:
|
||||
try:
|
||||
action = pyside_utils.get_action_for_menu_path(editor_window, "Edit", *option)
|
||||
Report.info(f"Triggering {action.iconText()}")
|
||||
action.trigger()
|
||||
action_triggered = True
|
||||
except Exception as e:
|
||||
|
||||
@@ -26,35 +26,34 @@ def Menus_FileMenuOptions_Work():
|
||||
:return: None
|
||||
"""
|
||||
|
||||
import editor_python_test_tools.hydra_editor_utils as hydra
|
||||
import editor_python_test_tools.pyside_utils as pyside_utils
|
||||
from editor_python_test_tools.utils import Report
|
||||
from editor_python_test_tools.utils import TestHelper as helper
|
||||
|
||||
file_menu_options = [
|
||||
("New Level",),
|
||||
("Open Level",),
|
||||
("Import",),
|
||||
#("Open Level",), Temporarily disabled due to https://github.com/o3de/o3de/issues/6605
|
||||
#("Import",), Temporarily disabled due to https://github.com/o3de/o3de/issues/6746
|
||||
("Save",),
|
||||
("Save As",),
|
||||
#("Save As",), Temporarily disabled due to https://github.com/o3de/o3de/issues/6605
|
||||
("Save Level Statistics",),
|
||||
("Edit Project Settings",),
|
||||
("Edit Platform Settings",),
|
||||
#("Edit Platform Settings",), Temporarily disabled due to https://github.com/o3de/o3de/issues/6604
|
||||
("New Project",),
|
||||
("Open Project",),
|
||||
("Show Log File",),
|
||||
("Resave All Slices",),
|
||||
("Exit",),
|
||||
]
|
||||
|
||||
# 1) Open an existing simple level
|
||||
helper.init_idle()
|
||||
helper.open_level("Physics", "Base")
|
||||
hydra.open_base_level()
|
||||
|
||||
# 2) Interact with File Menu options
|
||||
editor_window = pyside_utils.get_editor_main_window()
|
||||
for option in file_menu_options:
|
||||
try:
|
||||
action = pyside_utils.get_action_for_menu_path(editor_window, "File", *option)
|
||||
Report.info(f"Triggering {action.iconText()}")
|
||||
action.trigger()
|
||||
action_triggered = True
|
||||
except Exception as e:
|
||||
|
||||
@@ -26,13 +26,15 @@ def Menus_ViewMenuOptions_Work():
|
||||
:return: None
|
||||
"""
|
||||
|
||||
import editor_python_test_tools.hydra_editor_utils as hydra
|
||||
import editor_python_test_tools.pyside_utils as pyside_utils
|
||||
from editor_python_test_tools.utils import Report
|
||||
from editor_python_test_tools.utils import TestHelper as helper
|
||||
|
||||
view_menu_options = [
|
||||
("Center on Selection",),
|
||||
("Show Quick Access Bar",),
|
||||
("Layouts", "Component Entity Layout",),
|
||||
("Layouts", "Save Layout",),
|
||||
("Viewport", "Configure Layout"),
|
||||
("Viewport", "Go to Position"),
|
||||
("Viewport", "Center on Selection"),
|
||||
@@ -45,14 +47,14 @@ def Menus_ViewMenuOptions_Work():
|
||||
]
|
||||
|
||||
# 1) Open an existing simple level
|
||||
helper.init_idle()
|
||||
helper.open_level("Physics", "Base")
|
||||
hydra.open_base_level()
|
||||
|
||||
# 2) Interact with View Menu options
|
||||
editor_window = pyside_utils.get_editor_main_window()
|
||||
for option in view_menu_options:
|
||||
try:
|
||||
action = pyside_utils.get_action_for_menu_path(editor_window, "View", *option)
|
||||
Report.info(f"Triggering {action.iconText()}")
|
||||
action.trigger()
|
||||
action_triggered = True
|
||||
except Exception as e:
|
||||
|
||||
@@ -7,48 +7,77 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
|
||||
import os
|
||||
import pytest
|
||||
import sys
|
||||
|
||||
import ly_test_tools.environment.file_system as file_system
|
||||
|
||||
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared')
|
||||
from base import TestAutomationBase
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def remove_test_level(request, workspace, project):
|
||||
file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", "tmp_level")], True, True)
|
||||
|
||||
def teardown():
|
||||
file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", "tmp_level")], True, True)
|
||||
|
||||
request.addfinalizer(teardown)
|
||||
from ly_test_tools.o3de.editor_test import EditorSingleTest, EditorSharedTest, EditorParallelTest, EditorTestSuite
|
||||
|
||||
|
||||
@pytest.mark.SUITE_main
|
||||
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
|
||||
@pytest.mark.parametrize("project", ["AutomatedTesting"])
|
||||
class TestAutomation(TestAutomationBase):
|
||||
class TestAutomationNoAutoTestMode(EditorTestSuite):
|
||||
|
||||
def test_BasicEditorWorkflows_LevelEntityComponentCRUD(self, request, workspace, editor, launcher_platform,
|
||||
remove_test_level):
|
||||
# Disable -autotest_mode and -BatchMode. Tests cannot run in -BatchMode due to UI interactions, and these tests
|
||||
# interact with modal dialogs
|
||||
global_extra_cmdline_args = []
|
||||
|
||||
class test_AssetPicker_UI_UX(EditorSharedTest):
|
||||
from .EditorScripts import AssetPicker_UI_UX as test_module
|
||||
|
||||
class test_BasicEditorWorkflows_ExistingLevel_EntityComponentCRUD(EditorSharedTest):
|
||||
from .EditorScripts import BasicEditorWorkflows_ExistingLevel_EntityComponentCRUD as test_module
|
||||
|
||||
class test_BasicEditorWorkflows_LevelEntityComponentCRUD(EditorSingleTest):
|
||||
# Custom teardown to remove level created during test
|
||||
def teardown(self, request, workspace, editor, editor_test_results, launcher_platform):
|
||||
file_system.delete([os.path.join(workspace.paths.engine_root(), "AutomatedTesting", "Levels", "tmp_level")],
|
||||
True, True)
|
||||
from .EditorScripts import BasicEditorWorkflows_LevelEntityComponentCRUD as test_module
|
||||
self._run_test(request, workspace, editor, test_module, batch_mode=False, autotest_mode=False, enable_prefab_system=False)
|
||||
|
||||
@pytest.mark.REQUIRES_gpu
|
||||
def test_BasicEditorWorkflows_GPU_LevelEntityComponentCRUD(self, request, workspace, editor, launcher_platform,
|
||||
remove_test_level):
|
||||
from .EditorScripts import BasicEditorWorkflows_LevelEntityComponentCRUD as test_module
|
||||
self._run_test(request, workspace, editor, test_module, batch_mode=False, autotest_mode=False,
|
||||
use_null_renderer=False, enable_prefab_system=False)
|
||||
class test_BasicEditorWorkflows_GPU_LevelEntityComponentCRUD(EditorSingleTest):
|
||||
# Disable null renderer
|
||||
use_null_renderer = False
|
||||
|
||||
def test_EntityOutlienr_EntityOrdering(self, request, workspace, editor, launcher_platform):
|
||||
# Custom teardown to remove level created during test
|
||||
def teardown(self, request, workspace, editor, editor_test_results, launcher_platform):
|
||||
file_system.delete([os.path.join(workspace.paths.engine_root(), "AutomatedTesting", "Levels", "tmp_level")],
|
||||
True, True)
|
||||
from .EditorScripts import BasicEditorWorkflows_LevelEntityComponentCRUD as test_module
|
||||
|
||||
class test_InputBindings_Add_Remove_Input_Events(EditorSharedTest):
|
||||
from .EditorScripts import InputBindings_Add_Remove_Input_Events as test_module
|
||||
|
||||
|
||||
@pytest.mark.SUITE_main
|
||||
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
|
||||
@pytest.mark.parametrize("project", ["AutomatedTesting"])
|
||||
class TestAutomationAutoTestMode(EditorTestSuite):
|
||||
|
||||
# Enable only -autotest_mode for these tests. Tests cannot run in -BatchMode due to UI interactions
|
||||
global_extra_cmdline_args = ["-autotest_mode"]
|
||||
|
||||
class test_AssetBrowser_SearchFiltering(EditorSharedTest):
|
||||
from .EditorScripts import AssetBrowser_SearchFiltering as test_module
|
||||
|
||||
class test_AssetBrowser_TreeNavigation(EditorSharedTest):
|
||||
from .EditorScripts import AssetBrowser_TreeNavigation as test_module
|
||||
|
||||
class test_ComponentCRUD_Add_Delete_Components(EditorSharedTest):
|
||||
from .EditorScripts import ComponentCRUD_Add_Delete_Components as test_module
|
||||
|
||||
@pytest.mark.skip("Passes locally/fails on Jenkins. https://github.com/o3de/o3de/issues/6747")
|
||||
class test_Docking_BasicDockedTools(EditorSharedTest):
|
||||
from .EditorScripts import Docking_BasicDockedTools as test_module
|
||||
|
||||
class test_EntityOutliner_EntityOrdering(EditorSharedTest):
|
||||
from .EditorScripts import EntityOutliner_EntityOrdering as test_module
|
||||
self._run_test(
|
||||
request,
|
||||
workspace,
|
||||
editor,
|
||||
test_module,
|
||||
batch_mode=False,
|
||||
autotest_mode=True,
|
||||
)
|
||||
|
||||
class test_Menus_EditMenuOptions_Work(EditorSharedTest):
|
||||
from .EditorScripts import Menus_EditMenuOptions as test_module
|
||||
|
||||
class test_Menus_FileMenuOptions_Work(EditorSharedTest):
|
||||
from .EditorScripts import Menus_FileMenuOptions as test_module
|
||||
|
||||
class test_Menus_ViewMenuOptions_Work(EditorSharedTest):
|
||||
from .EditorScripts import Menus_ViewMenuOptions as test_module
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
"""
|
||||
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 os
|
||||
import pytest
|
||||
|
||||
import ly_test_tools.environment.file_system as file_system
|
||||
from ly_test_tools.o3de.editor_test import EditorSingleTest, EditorSharedTest, EditorParallelTest, EditorTestSuite
|
||||
|
||||
|
||||
@pytest.mark.xfail(reason="Optimized tests are experimental, we will enable xfail and monitor them temporarily.")
|
||||
@pytest.mark.SUITE_main
|
||||
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
|
||||
@pytest.mark.parametrize("project", ["AutomatedTesting"])
|
||||
class TestAutomationNoAutoTestMode(EditorTestSuite):
|
||||
|
||||
# Disable -autotest_mode and -BatchMode. Tests cannot run in -BatchMode due to UI interactions, and these tests
|
||||
# interact with modal dialogs
|
||||
global_extra_cmdline_args = []
|
||||
|
||||
enable_prefab_system = False
|
||||
|
||||
class test_BasicEditorWorkflows_LevelEntityComponentCRUD(EditorSingleTest):
|
||||
# Custom teardown to remove slice asset created during test
|
||||
def teardown(self, request, workspace, editor, editor_test_results, launcher_platform):
|
||||
file_system.delete([os.path.join(workspace.paths.engine_root(), "AutomatedTesting", "Levels", "tmp_level")],
|
||||
True, True)
|
||||
from .EditorScripts import BasicEditorWorkflows_LevelEntityComponentCRUD as test_module
|
||||
|
||||
@pytest.mark.REQUIRES_gpu
|
||||
class test_BasicEditorWorkflows_GPU_LevelEntityComponentCRUD(EditorSingleTest):
|
||||
# Disable null renderer
|
||||
use_null_renderer = False
|
||||
|
||||
# Custom teardown to remove slice asset created during test
|
||||
def teardown(self, request, workspace, editor, editor_test_results, launcher_platform):
|
||||
file_system.delete([os.path.join(workspace.paths.engine_root(), "AutomatedTesting", "Levels", "tmp_level")],
|
||||
True, True)
|
||||
from .EditorScripts import BasicEditorWorkflows_LevelEntityComponentCRUD as test_module
|
||||
|
||||
class test_InputBindings_Add_Remove_Input_Events(EditorSharedTest):
|
||||
from .EditorScripts import InputBindings_Add_Remove_Input_Events as test_module
|
||||
|
||||
class test_AssetPicker_UI_UX(EditorSharedTest):
|
||||
from .EditorScripts import AssetPicker_UI_UX as test_module
|
||||
|
||||
|
||||
@pytest.mark.SUITE_main
|
||||
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
|
||||
@pytest.mark.parametrize("project", ["AutomatedTesting"])
|
||||
class TestAutomationAutoTestMode(EditorTestSuite):
|
||||
|
||||
# Enable only -autotest_mode for these tests. Tests cannot run in -BatchMode due to UI interactions
|
||||
global_extra_cmdline_args = ["-autotest_mode"]
|
||||
|
||||
enable_prefab_system = False
|
||||
|
||||
class test_AssetBrowser_TreeNavigation(EditorSharedTest):
|
||||
from .EditorScripts import AssetBrowser_TreeNavigation as test_module
|
||||
|
||||
class test_AssetBrowser_SearchFiltering(EditorSharedTest):
|
||||
from .EditorScripts import AssetBrowser_SearchFiltering as test_module
|
||||
|
||||
class test_ComponentCRUD_Add_Delete_Components(EditorSharedTest):
|
||||
from .EditorScripts import ComponentCRUD_Add_Delete_Components as test_module
|
||||
|
||||
class test_Menus_ViewMenuOptions_Work(EditorSharedTest):
|
||||
from .EditorScripts import Menus_ViewMenuOptions as test_module
|
||||
|
||||
@pytest.mark.skip(reason="Times out due to dialogs failing to dismiss: LYN-4208")
|
||||
class test_Menus_FileMenuOptions_Work(EditorSharedTest):
|
||||
from .EditorScripts import Menus_FileMenuOptions as test_module
|
||||
|
||||
class test_BasicEditorWorkflows_ExistingLevel_EntityComponentCRUD(EditorSharedTest):
|
||||
from .EditorScripts import BasicEditorWorkflows_ExistingLevel_EntityComponentCRUD as test_module
|
||||
@@ -1,60 +0,0 @@
|
||||
"""
|
||||
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 os
|
||||
import pytest
|
||||
import sys
|
||||
|
||||
import ly_test_tools.environment.file_system as file_system
|
||||
|
||||
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared')
|
||||
from base import TestAutomationBase
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def remove_test_level(request, workspace, project):
|
||||
file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", "tmp_level")], True, True)
|
||||
|
||||
def teardown():
|
||||
file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", "tmp_level")], True, True)
|
||||
|
||||
request.addfinalizer(teardown)
|
||||
|
||||
|
||||
@pytest.mark.SUITE_periodic
|
||||
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
|
||||
@pytest.mark.parametrize("project", ["AutomatedTesting"])
|
||||
class TestAutomation(TestAutomationBase):
|
||||
|
||||
def test_AssetBrowser_TreeNavigation(self, request, workspace, editor, launcher_platform):
|
||||
from .EditorScripts import AssetBrowser_TreeNavigation as test_module
|
||||
self._run_test(request, workspace, editor, test_module, batch_mode=False, enable_prefab_system=False)
|
||||
|
||||
def test_AssetBrowser_SearchFiltering(self, request, workspace, editor, launcher_platform):
|
||||
from .EditorScripts import AssetBrowser_SearchFiltering as test_module
|
||||
self._run_test(request, workspace, editor, test_module, batch_mode=False, enable_prefab_system=False)
|
||||
|
||||
def test_AssetPicker_UI_UX(self, request, workspace, editor, launcher_platform):
|
||||
from .EditorScripts import AssetPicker_UI_UX as test_module
|
||||
self._run_test(request, workspace, editor, test_module, autotest_mode=False, batch_mode=False, enable_prefab_system=False)
|
||||
|
||||
def test_ComponentCRUD_Add_Delete_Components(self, request, workspace, editor, launcher_platform):
|
||||
from .EditorScripts import ComponentCRUD_Add_Delete_Components as test_module
|
||||
self._run_test(request, workspace, editor, test_module, batch_mode=False, enable_prefab_system=False)
|
||||
|
||||
def test_InputBindings_Add_Remove_Input_Events(self, request, workspace, editor, launcher_platform):
|
||||
from .EditorScripts import InputBindings_Add_Remove_Input_Events as test_module
|
||||
self._run_test(request, workspace, editor, test_module, batch_mode=False, autotest_mode=False, enable_prefab_system=False)
|
||||
|
||||
def test_Menus_ViewMenuOptions_Work(self, request, workspace, editor, launcher_platform):
|
||||
from .EditorScripts import Menus_ViewMenuOptions as test_module
|
||||
self._run_test(request, workspace, editor, test_module, batch_mode=False, enable_prefab_system=False)
|
||||
|
||||
@pytest.mark.skip(reason="Times out due to dialogs failing to dismiss: LYN-4208")
|
||||
def test_Menus_FileMenuOptions_Work(self, request, workspace, editor, launcher_platform):
|
||||
from .EditorScripts import Menus_FileMenuOptions as test_module
|
||||
self._run_test(request, workspace, editor, test_module, batch_mode=False, enable_prefab_system=False)
|
||||
@@ -1,27 +0,0 @@
|
||||
"""
|
||||
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 os
|
||||
import pytest
|
||||
import sys
|
||||
|
||||
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared')
|
||||
from base import TestAutomationBase
|
||||
|
||||
|
||||
@pytest.mark.SUITE_sandbox
|
||||
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
|
||||
@pytest.mark.parametrize("project", ["AutomatedTesting"])
|
||||
class TestAutomation(TestAutomationBase):
|
||||
|
||||
def test_Menus_EditMenuOptions_Work(self, request, workspace, editor, launcher_platform):
|
||||
from .EditorScripts import Menus_EditMenuOptions as test_module
|
||||
self._run_test(request, workspace, editor, test_module, batch_mode=False, enable_prefab_system=False)
|
||||
|
||||
def test_Docking_BasicDockedTools(self, request, workspace, editor, launcher_platform):
|
||||
from .EditorScripts import Docking_BasicDockedTools as test_module
|
||||
self._run_test(request, workspace, editor, test_module, batch_mode=False, enable_prefab_system=False)
|
||||
@@ -1,28 +0,0 @@
|
||||
"""
|
||||
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 os
|
||||
import pytest
|
||||
|
||||
from ly_test_tools.o3de.editor_test import EditorSingleTest, EditorSharedTest, EditorParallelTest, EditorTestSuite
|
||||
|
||||
|
||||
@pytest.mark.SUITE_sandbox
|
||||
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
|
||||
@pytest.mark.parametrize("project", ["AutomatedTesting"])
|
||||
class TestAutomationAutoTestMode(EditorTestSuite):
|
||||
|
||||
# Enable only -autotest_mode for these tests. Tests cannot run in -BatchMode due to UI interactions
|
||||
global_extra_cmdline_args = ["-autotest_mode"]
|
||||
|
||||
enable_prefab_system = False
|
||||
|
||||
class test_Docking_BasicDockedTools(EditorSharedTest):
|
||||
from .EditorScripts import Docking_BasicDockedTools as test_module
|
||||
|
||||
class test_Menus_EditMenuOptions_Work(EditorSharedTest):
|
||||
from .EditorScripts import Menus_EditMenuOptions as test_module
|
||||
@@ -31,19 +31,6 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS)
|
||||
Smoke
|
||||
)
|
||||
|
||||
ly_add_pytest(
|
||||
NAME AutomatedTesting::EditorTestWithGPU
|
||||
TEST_REQUIRES gpu
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/test_Editor_NewExistingLevels_Works.py
|
||||
TIMEOUT 100
|
||||
RUNTIME_DEPENDENCIES
|
||||
AZ::AssetProcessor
|
||||
AZ::PythonBindingsExample
|
||||
Legacy::Editor
|
||||
AutomatedTesting.GameLauncher
|
||||
AutomatedTesting.Assets
|
||||
)
|
||||
|
||||
ly_add_pytest(
|
||||
NAME AutomatedTesting::GameLauncherWithGPU
|
||||
TEST_SUITE sandbox
|
||||
|
||||
@@ -1,143 +0,0 @@
|
||||
"""
|
||||
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 Title: Create Test for UI apps- Editor
|
||||
"""
|
||||
|
||||
|
||||
class Tests():
|
||||
level_created = ("Level created", "Failed to create level")
|
||||
entity_found = ("New Entity created in level", "Failed to create New Entity in level")
|
||||
mesh_added = ("Mesh Component added", "Failed to add Mesh Component")
|
||||
enter_game_mode = ("Game Mode successfully entered", "Failed to enter in Game Mode")
|
||||
exit_game_mode = ("Game Mode successfully exited", "Failed to exit in Game Mode")
|
||||
level_opened = ("Level opened successfully", "Failed to open level")
|
||||
level_exported = ("Level exported successfully", "Failed to export level")
|
||||
mesh_removed = ("Mesh Component removed", "Failed to remove Mesh Component")
|
||||
entity_deleted = ("Entity deleted", "Failed to delete Entity")
|
||||
level_edits_present = ("Level edits persist after saving", "Failed to save level edits after saving")
|
||||
|
||||
|
||||
def Editor_NewExistingLevels_Works():
|
||||
"""
|
||||
Summary: Perform the below operations on Editor
|
||||
|
||||
1) Launch & Close editor
|
||||
2) Create new level
|
||||
3) Saving and loading levels
|
||||
4) Level edits persist after saving
|
||||
5) Export Level
|
||||
6) Can switch to play mode (ctrl+g) and exit that
|
||||
7) Run editor python bindings test
|
||||
8) Create an Entity
|
||||
9) Delete an Entity
|
||||
10) Add a component to an Entity
|
||||
|
||||
Expected Behavior:
|
||||
All operations succeed and do not cause a crash
|
||||
|
||||
Test Steps:
|
||||
1) Launch editor and Create a new level
|
||||
2) Create a new entity
|
||||
3) Add Mesh component
|
||||
4) Verify enter/exit game mode
|
||||
5) Save, Load and Export level
|
||||
6) Remove Mesh component
|
||||
7) Delete entity
|
||||
8) Open an existing level
|
||||
9) Create a new entity in an existing level
|
||||
10) Save, Load and Export an existing level and close editor
|
||||
|
||||
Note:
|
||||
- This test file must be called from the O3DE 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 editor_python_test_tools.hydra_editor_utils as hydra
|
||||
from editor_python_test_tools.utils import TestHelper as helper
|
||||
from editor_python_test_tools.utils import Report
|
||||
import azlmbr.bus as bus
|
||||
import azlmbr.editor as editor
|
||||
import azlmbr.legacy.general as general
|
||||
import azlmbr.math as math
|
||||
|
||||
# 1) Launch editor and Create a new level
|
||||
helper.init_idle()
|
||||
test_level_name = "temp_level"
|
||||
general.create_level_no_prompt(test_level_name, 128, 1, 128, False)
|
||||
helper.wait_for_condition(lambda: general.get_current_level_name() == test_level_name, 2.0)
|
||||
Report.result(Tests.level_created, general.get_current_level_name() == test_level_name)
|
||||
|
||||
# 2) Create a new entity
|
||||
entity_position = math.Vector3(200.0, 200.0, 38.0)
|
||||
new_entity = hydra.Entity("Entity1")
|
||||
new_entity.create_entity(entity_position, [])
|
||||
test_entity = hydra.find_entity_by_name("Entity1")
|
||||
Report.result(Tests.entity_found, test_entity.IsValid())
|
||||
|
||||
# 3) Add Mesh component
|
||||
new_entity.add_component("Mesh")
|
||||
Report.result(Tests.mesh_added, hydra.has_components(new_entity.id, ["Mesh"]))
|
||||
|
||||
# 4) Verify enter/exit game mode
|
||||
helper.enter_game_mode(Tests.enter_game_mode)
|
||||
helper.exit_game_mode(Tests.exit_game_mode)
|
||||
|
||||
# 5) Save, Load and Export level
|
||||
# Save Level
|
||||
general.save_level()
|
||||
# Open Level
|
||||
general.open_level(test_level_name)
|
||||
Report.result(Tests.level_opened, general.get_current_level_name() == test_level_name)
|
||||
# Export Level
|
||||
general.export_to_engine()
|
||||
level_pak_file = os.path.join("AutomatedTesting", "Levels", test_level_name, "level.pak")
|
||||
Report.result(Tests.level_exported, os.path.exists(level_pak_file))
|
||||
|
||||
# 6) Remove Mesh component
|
||||
new_entity.remove_component("Mesh")
|
||||
Report.result(Tests.mesh_removed, not hydra.has_components(new_entity.id, ["Mesh"]))
|
||||
|
||||
# 7) Delete entity
|
||||
editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntityById", new_entity.id)
|
||||
test_entity = hydra.find_entity_by_name("Entity1")
|
||||
Report.result(Tests.entity_deleted, len(test_entity) == 0)
|
||||
|
||||
# 8) Open an existing level
|
||||
general.open_level(test_level_name)
|
||||
Report.result(Tests.level_opened, general.get_current_level_name() == test_level_name)
|
||||
|
||||
# 9) Create a new entity in an existing level
|
||||
entity_position = math.Vector3(200.0, 200.0, 38.0)
|
||||
new_entity_2 = hydra.Entity("Entity2")
|
||||
new_entity_2.create_entity(entity_position, [])
|
||||
test_entity = hydra.find_entity_by_name("Entity2")
|
||||
Report.result(Tests.entity_found, test_entity.IsValid())
|
||||
|
||||
# 10) Save, Load and Export an existing level
|
||||
# Save Level
|
||||
general.save_level()
|
||||
# Open Level
|
||||
general.open_level(test_level_name)
|
||||
Report.result(Tests.level_opened, general.get_current_level_name() == test_level_name)
|
||||
entity_id = hydra.find_entity_by_name(new_entity_2.name)
|
||||
Report.result(Tests.level_edits_present, entity_id == new_entity_2.id)
|
||||
# Export Level
|
||||
general.export_to_engine()
|
||||
level_pak_file = os.path.join("AutomatedTesting", "Levels", test_level_name, "level.pak")
|
||||
Report.result(Tests.level_exported, os.path.exists(level_pak_file))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
from editor_python_test_tools.utils import Report
|
||||
|
||||
Report.start_test(Editor_NewExistingLevels_Works)
|
||||
@@ -1,34 +0,0 @@
|
||||
"""
|
||||
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 should run in both gpu and non gpu
|
||||
"""
|
||||
|
||||
import pytest
|
||||
import os
|
||||
from automatedtesting_shared.base import TestAutomationBase
|
||||
|
||||
import ly_test_tools
|
||||
import ly_test_tools.environment.file_system as file_system
|
||||
|
||||
|
||||
@pytest.mark.SUITE_smoke
|
||||
@pytest.mark.skipif(not ly_test_tools.WINDOWS, reason="Only succeeds on windows https://github.com/o3de/o3de/issues/5539")
|
||||
@pytest.mark.parametrize("launcher_platform", ["windows_editor"])
|
||||
@pytest.mark.parametrize("project", ["AutomatedTesting"])
|
||||
@pytest.mark.parametrize("level", ["temp_level"])
|
||||
class TestAutomation(TestAutomationBase):
|
||||
def test_Editor_NewExistingLevels_Works(self, request, workspace, editor, level, project, launcher_platform):
|
||||
def teardown():
|
||||
file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
|
||||
|
||||
request.addfinalizer(teardown)
|
||||
file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
|
||||
|
||||
from . import Editor_NewExistingLevels_Works as test_module
|
||||
|
||||
self._run_test(request, workspace, editor, test_module, enable_prefab_system=False)
|
||||
@@ -1,14 +0,0 @@
|
||||
<Environment>
|
||||
<Fog ViewDistance="8000" ViewDistanceLowSpec="1000"/>
|
||||
<Terrain DetailLayersViewDistRatio="1.0" HeightMapAO="0"/>
|
||||
<EnvState WindVector="1,0,0" BreezeGeneration="0" BreezeStrength="1.f" BreezeMovementSpeed="8.f" BreezeVariation="1.f" BreezeLifeTime="15.f" BreezeCount="4" BreezeSpawnRadius="25.f" BreezeSpread="0.f" BreezeRadius="5.f" ConsoleMergedMeshesPool="2750" ShowTerrainSurface="1" SunShadowsMinSpec="1" SunShadowsAdditionalCascadeMinSpec="0" SunShadowsClipPlaneRange="256.0f" SunShadowsClipPlaneRangeShift="0.0f" UseLayersActivation="0" SunLinkedToTOD="1"/>
|
||||
<VolFogShadows Enable="0" EnableForClouds="0"/>
|
||||
<CloudShadows CloudShadowTexture="" CloudShadowSpeed="0,0,0" CloudShadowTiling="1.0" CloudShadowBrightness="1.0" CloudShadowInvert="0"/>
|
||||
<ParticleLighting AmbientMul="1.0" LightsMul="1.0"/>
|
||||
<SkyBox Material="EngineAssets/Materials/Sky/Sky" MaterialLowSpec="EngineAssets/Materials/Sky/Sky" Angle="0" Stretching="0.5"/>
|
||||
<Ocean Material="EngineAssets/Materials/Water/Ocean_default" CausticsDistanceAtten="100.0" CausticDepth="8.0" CausticIntensity="1.0" CausticsTilling="1.0"/>
|
||||
<OceanAnimation WindDirection="1.0" WindSpeed="4.0" WavesAmount="1.5" WavesSize="0.4" WavesSpeed="1.0"/>
|
||||
<Moon Latitude="240.0" Longitude="45.0" Size="0.5" Texture="Textures/Skys/Night/half_moon.dds"/>
|
||||
<DynTexSource Width="256" Height="256"/>
|
||||
<Total_Illumination_v2 Active="0" IntegrationMode="0" NumberOfBounces="1" DiffuseConeWidth="24" ConeMaxLength="12.0" UseLightProbes="0" InjectionMultiplier="1.0" AmbientOffsetRed="1.0" AmbientOffsetGreen="1.0" AmbientOffsetBlue="1.0" AmbientOffsetBias="0.1" Saturation="0.8" SSAOAmount="0.7"/>
|
||||
</Environment>
|
||||
@@ -1,7 +0,0 @@
|
||||
<TerrainTexture TileCountX="1" TileCountY="1" TileResolution="512">
|
||||
<RGBLayer>
|
||||
<Tiles>
|
||||
<tile X="0" Y="0" Size="512"/>
|
||||
</Tiles>
|
||||
</RGBLayer>
|
||||
</TerrainTexture>
|
||||
@@ -1,356 +0,0 @@
|
||||
<TimeOfDay Time="13.5" TimeStart="13.5" TimeEnd="13.5" TimeAnimSpeed="0">
|
||||
<Variable Name="Sun color" Color="0.99989021,0.99946922,0.9991194">
|
||||
<Spline Keys="-0.000628322:(0.783538:0.89627:0.930341):36,0:(0.783538:0.887923:0.921582):36,0.229167:(0.783538:0.879623:0.921582):36,0.25:(0.947307:0.745404:0.577581):36,0.458333:(1:1:1):36,0.5625:(1:1:1):36,0.75:(0.947307:0.745404:0.577581):36,0.770833:(0.783538:0.879623:0.921582):36,1:(0.783538:0.89627:0.930556):36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sun intensity" Value="92366.68">
|
||||
<Spline Keys="0:1000:36,0.229167:1000:36,0.5:120000:36,0.770833:1000:65572,0.999306:1000:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sun specular multiplier" Value="1">
|
||||
<Spline Keys="0:1:36,0.25:1:36,0.5:1:36,0.75:1:36,1:1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Fog color" Color="0.27049801,0.47353199,0.83076996">
|
||||
<Spline Keys="0:(0.00651209:0.00972122:0.0137021):36,0.229167:(0.00604883:0.00972122:0.0137021):36,0.25:(0.270498:0.473532:0.83077):36,0.5:(0.270498:0.473532:0.83077):458788,0.75:(0.270498:0.473532:0.83077):36,0.770833:(0.00604883:0.00972122:0.0137021):36,1:(0.00651209:0.00972122:0.0137021):36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Fog color multiplier" Value="1">
|
||||
<Spline Keys="0:0.5:36,0.229167:0.5:36,0.25:1:36,0.5:1:36,0.75:1:36,0.770833:0.5:36,1:0.5:65572,"/>
|
||||
</Variable>
|
||||
<Variable Name="Fog height (bottom)" Value="0">
|
||||
<Spline Keys="0:0:36,0.25:0:36,0.5:0:36,0.75:0:36,1:0:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Fog layer density (bottom)" Value="1">
|
||||
<Spline Keys="0:1:36,0.25:1:36,0.5:1:36,0.75:1:36,1:1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Fog color (top)" Color="0.597202,0.72305501,0.91309899">
|
||||
<Spline Keys="0:(0.00699541:0.00972122:0.0122865):36,0.229167:(0.00699541:0.00972122:0.0122865):36,0.25:(0.597202:0.723055:0.913099):36,0.5:(0.597202:0.723055:0.913099):458788,0.75:(0.597202:0.723055:0.913099):36,0.770833:(0.00699541:0.00972122:0.0122865):36,1:(0.00699541:0.00972122:0.0122865):36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Fog color (top) multiplier" Value="0.88389361">
|
||||
<Spline Keys="-4.40702e-06:0.5:36,0.0297507:0.499195:36,0.229167:0.5:36,0.5:1:36,0.770833:0.5:36,1:0.5:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Fog height (top)" Value="100.00001">
|
||||
<Spline Keys="0:100:36,0.25:100:36,0.5:100:36,0.75:100:65572,1:100:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Fog layer density (top)" Value="9.9999997e-05">
|
||||
<Spline Keys="0:0.0001:36,0.25:0.0001:36,0.5:0.0001:65572,0.75:0.0001:36,1:0.0001:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Fog color height offset" Value="0">
|
||||
<Spline Keys="0:0:36,0.25:0:36,0.5:0:36,0.75:0:36,1:0:65572,"/>
|
||||
</Variable>
|
||||
<Variable Name="Fog color (radial)" Color="0.78592348,0.52744436,0.17234583">
|
||||
<Spline Keys="0:(0:0:0):36,0.229167:(0.00439144:0.00367651:0.00334654):36,0.25:(0.838799:0.564712:0.184475):36,0.5:(0.768151:0.514918:0.168269):458788,0.75:(0.838799:0.564712:0.184475):36,0.770833:(0.00402472:0.00334654:0.00303527):36,1:(0:0:0):36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Fog color (radial) multiplier" Value="6">
|
||||
<Spline Keys="0:0:36,0.25:6:36,0.5:6:36,0.75:6:36,1:0:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Fog radial size" Value="0.85000002">
|
||||
<Spline Keys="0:0:36,0.25:0.85:65572,0.5:0.85:36,0.75:0.85:36,1:0:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Fog radial lobe" Value="0.75">
|
||||
<Spline Keys="0:0:36,0.25:0.75:36,0.5:0.75:36,0.75:0.75:65572,1:0:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog: Final density clamp" Value="1">
|
||||
<Spline Keys="0:1:36,0.25:1:36,0.5:1:65572,0.75:1:36,1:1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog: Global density" Value="1.5">
|
||||
<Spline Keys="0:1.5:36,0.25:1.5:36,0.5:1.5:65572,0.75:1.5:36,1:1.5:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog: Ramp start" Value="25.000002">
|
||||
<Spline Keys="0:25:36,0.25:25:36,0.5:25:65572,0.75:25:36,1:25:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog: Ramp end" Value="1000.0001">
|
||||
<Spline Keys="0:1000:36,0.25:1000:36,0.5:1000:65572,0.75:1000:36,1:1000:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog: Ramp influence" Value="0.69999993">
|
||||
<Spline Keys="0:0.7:36,0.25:0.7:36,0.5:0.7:65572,0.75:0.7:36,1:0.7:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog: Shadow darkening" Value="0.20000002">
|
||||
<Spline Keys="0:0.2:36,0.25:0.2:36,0.5:0.2:65572,0.75:0.2:36,1:0.2:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog: Shadow darkening sun" Value="0.5">
|
||||
<Spline Keys="0:0.5:36,0.25:0.5:36,0.5:0.5:65572,0.75:0.5:36,1:0.5:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog: Shadow darkening ambient" Value="1">
|
||||
<Spline Keys="0:1:36,0.25:1:36,0.5:1:65572,0.75:1:36,1:1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog: Shadow range" Value="0.10000001">
|
||||
<Spline Keys="0:0.1:36,0.25:0.1:36,0.5:0.1:65572,0.75:0.1:36,1:0.1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Fog height (bottom)" Value="0">
|
||||
<Spline Keys="0:0:0,1:0:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Fog layer density (bottom)" Value="1">
|
||||
<Spline Keys="0:1:0,1:1:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Fog height (top)" Value="4000">
|
||||
<Spline Keys="0:4000:0,1:4000:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Fog layer density (top)" Value="9.9999997e-05">
|
||||
<Spline Keys="0:0.0001:0,1:0.0001:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Global fog density" Value="0.1">
|
||||
<Spline Keys="0:0.1:0,1:0.1:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Ramp start" Value="0">
|
||||
<Spline Keys="0:0:0,1:0:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Ramp end" Value="0">
|
||||
<Spline Keys="0:0:0,1:0:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Fog albedo color (atmosphere)" Color="1,1,1">
|
||||
<Spline Keys="0:(1:1:1):0,1:(1:1:1):0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Anisotropy factor (atmosphere)" Value="0.60000002">
|
||||
<Spline Keys="0:0.6:0,1:0.6:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Fog albedo color (sun radial)" Color="1,1,1">
|
||||
<Spline Keys="0:(1:1:1):0,1:(1:1:1):0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Anisotropy factor (sun radial)" Value="0.94999999">
|
||||
<Spline Keys="0:0.95:0,1:0.95:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Blend factor for sun scattering" Value="1">
|
||||
<Spline Keys="0:1:0,1:1:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Blend mode for sun scattering" Value="0">
|
||||
<Spline Keys="0:0:0,1:0:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Fog albedo color (entities)" Color="1,1,1">
|
||||
<Spline Keys="0:(1:1:1):0,1:(1:1:1):0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Anisotropy factor (entities)" Value="0.60000002">
|
||||
<Spline Keys="0:0.6:0,1:0.6:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Maximum range of ray-marching" Value="64">
|
||||
<Spline Keys="0:64:0,1:64:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: In-scattering factor" Value="1">
|
||||
<Spline Keys="0:1:0,1:1:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Extinction factor" Value="0.30000001">
|
||||
<Spline Keys="0:0.3:0,1:0.3:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Analytical volumetric fog visibility" Value="0.5">
|
||||
<Spline Keys="0:0.5:0,1:0.5:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Volumetric fog 2: Final density clamp" Value="1">
|
||||
<Spline Keys="0:1:0,0.5:1:36,1:1:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sky light: Sun intensity" Color="1,1,1">
|
||||
<Spline Keys="0:(1:1:1):36,0.25:(1:1:1):36,0.494381:(1:1:1):65572,0.5:(1:1:1):36,0.75:(1:1:1):36,1:(1:1:1):36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sky light: Sun intensity multiplier" Value="200.00002">
|
||||
<Spline Keys="0:200:36,0.25:200:36,0.5:200:36,0.75:200:36,1:200:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sky light: Mie scattering" Value="6.779707">
|
||||
<Spline Keys="0:40:36,0.5:2:36,1:40:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sky light: Rayleigh scattering" Value="0.20000002">
|
||||
<Spline Keys="0:0.2:36,0.229167:0.2:36,0.25:1:36,0.291667:0.2:36,0.5:0.2:36,0.729167:0.2:36,0.75:1:36,0.770833:0.2:36,1:0.2:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sky light: Sun anisotropy factor" Value="-0.99989998">
|
||||
<Spline Keys="0:-0.9999:36,0.25:-0.9999:36,0.5:-0.9999:65572,0.75:-0.9999:36,1:-0.9999:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sky light: Wavelength (R)" Value="694">
|
||||
<Spline Keys="0:694:36,0.25:694:36,0.5:694:65572,0.75:694:36,1:694:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sky light: Wavelength (G)" Value="596.99994">
|
||||
<Spline Keys="0:597:36,0.25:597:36,0.5:597:36,0.75:597:36,1:597:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sky light: Wavelength (B)" Value="488">
|
||||
<Spline Keys="0:488:36,0.25:488:36,0.5:488:65572,0.75:488:36,1:488:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Night sky: Horizon color" Color="0.27049801,0.39157301,0.52711499">
|
||||
<Spline Keys="0:(0.270498:0.391573:0.520996):36,0.25:(0.270498:0.391573:0.527115):36,0.5:(0.270498:0.391573:0.527115):262180,0.75:(0.270498:0.391573:0.527115):36,1:(0.270498:0.391573:0.520996):36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Night sky: Horizon color multiplier" Value="0">
|
||||
<Spline Keys="0:0.1:36,0.25:0:36,0.5:0:65572,0.75:0:36,1:0.1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Night sky: Zenith color" Color="0.36130697,0.434154,0.46778399">
|
||||
<Spline Keys="0:(0.361307:0.434154:0.467784):36,0.25:(0.361307:0.434154:0.467784):36,0.5:(0.361307:0.434154:0.467784):262180,0.75:(0.361307:0.434154:0.467784):36,1:(0.361307:0.434154:0.467784):36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Night sky: Zenith color multiplier" Value="0">
|
||||
<Spline Keys="0:0.02:36,0.25:0:36,0.5:0:65572,0.75:0:36,1:0.02:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Night sky: Zenith shift" Value="0.5">
|
||||
<Spline Keys="0:0.5:36,0.25:0.5:36,0.5:0.5:65572,0.75:0.5:36,1:0.5:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Night sky: Star intensity" Value="0">
|
||||
<Spline Keys="0:3:36,0.25:0:36,0.5:0:65572,0.75:0:36,0.836647:1.03977:36,1:3:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Night sky: Moon color" Color="1,1,1">
|
||||
<Spline Keys="0:(1:1:1):36,0.25:(1:1:1):36,0.5:(1:1:1):458788,0.75:(1:1:1):36,1:(1:1:1):36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Night sky: Moon color multiplier" Value="0">
|
||||
<Spline Keys="0:0.4:36,0.25:0:36,0.5:0:36,0.75:0:65572,1:0.4:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Night sky: Moon inner corona color" Color="0.904661,1,1">
|
||||
<Spline Keys="0:(0.89627:1:1):36,0.25:(0.904661:1:1):36,0.5:(0.904661:1:1):393252,0.75:(0.904661:1:1):36,0.836647:(0.89627:1:1):36,1:(0.89627:1:1):36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Night sky: Moon inner corona color multiplier" Value="0">
|
||||
<Spline Keys="0:0.1:36,0.25:0:36,0.5:0:65572,0.75:0:36,1:0.1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Night sky: Moon inner corona scale" Value="0">
|
||||
<Spline Keys="0:2:36,0.25:0:36,0.5:0:65572,0.75:0:36,0.836647:0.693178:36,1:2:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Night sky: Moon outer corona color" Color="0.201556,0.22696599,0.25415203">
|
||||
<Spline Keys="0:(0.198069:0.226966:0.250158):36,0.25:(0.201556:0.226966:0.254152):36,0.5:(0.201556:0.226966:0.254152):36,0.75:(0.201556:0.226966:0.254152):36,1:(0.198069:0.226966:0.250158):36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Night sky: Moon outer corona color multiplier" Value="0">
|
||||
<Spline Keys="0:0.1:36,0.25:0:36,0.5:0:65572,0.75:0:36,1:0.1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Night sky: Moon outer corona scale" Value="0">
|
||||
<Spline Keys="0:0.01:36,0.25:0:36,0.5:0:65572,0.75:0:36,1:0.01:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cloud shading: Sun light multiplier" Value="1">
|
||||
<Spline Keys="0:1:36,0.25:1:36,0.5:1:65572,0.75:1:36,1:1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cloud shading: Sun custom color" Color="0.83076996,0.76815104,0.65837508">
|
||||
<Spline Keys="0:(0.737911:0.737911:0.737911):36,0.25:(0.83077:0.768151:0.658375):36,0.5:(0.83077:0.768151:0.658375):458788,0.75:(0.83077:0.768151:0.658375):36,1:(0.737911:0.737911:0.737911):36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cloud shading: Sun custom color multiplier" Value="1">
|
||||
<Spline Keys="0:0.1:36,0.25:1:36,0.5:1:65572,0.75:1:36,1:0.1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cloud shading: Sun custom color influence" Value="0">
|
||||
<Spline Keys="0:0.5:36,0.25:0:36,0.5:0:65572,0.75:0:36,1:0.5:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sun shafts visibility" Value="0">
|
||||
<Spline Keys="0:0:36,0.25:0:36,0.5:0:65572,0.75:0:36,1:0:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sun rays visibility" Value="1.5">
|
||||
<Spline Keys="0:1:36,0.25:1.5:36,0.5:1.5:65572,0.75:1.5:36,1:1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sun rays attenuation" Value="1.5">
|
||||
<Spline Keys="0:0.1:36,0.25:1.5:36,0.5:1.5:65572,0.75:1.5:36,1:0.1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sun rays suncolor influence" Value="0.5">
|
||||
<Spline Keys="0:0.5:36,0.25:0.5:36,0.5:0.5:65572,0.75:0.5:36,1:0.5:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sun rays custom color" Color="0.66538697,0.83879906,0.94730699">
|
||||
<Spline Keys="0:(0.665387:0.838799:0.947307):36,0.25:(0.665387:0.838799:0.947307):36,0.5:(0.665387:0.838799:0.947307):458788,0.75:(0.665387:0.838799:0.947307):36,1:(0.665387:0.838799:0.947307):36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Ocean fog color" Color="0.0012141101,0.0091340598,0.017642001">
|
||||
<Spline Keys="0:(0.00121411:0.00913406:0.017642):36,0.25:(0.00121411:0.00913406:0.017642):36,0.5:(0.00121411:0.00913406:0.017642):458788,0.75:(0.00121411:0.00913406:0.017642):36,1:(0.00121411:0.00913406:0.017642):36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Ocean fog color multiplier" Value="0.5">
|
||||
<Spline Keys="0:0.5:36,0.25:0.5:36,0.5:0.5:65572,0.75:0.5:36,1:0.5:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Ocean fog density" Value="0.5">
|
||||
<Spline Keys="0:0.5:36,0.25:0.5:36,0.5:0.5:65572,0.75:0.5:36,1:0.5:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Skybox multiplier" Value="1">
|
||||
<Spline Keys="0:1:36,0.25:1:36,0.5:1:65572,0.75:1:36,1:1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Film curve shoulder scale" Value="2.232213">
|
||||
<Spline Keys="0:3:36,0.229167:3:36,0.5:2:36,0.770833:3:36,1:3:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Film curve midtones scale" Value="0.88389361">
|
||||
<Spline Keys="0:0.5:36,0.229167:0.5:36,0.5:1:36,0.770833:0.5:36,1:0.5:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Film curve toe scale" Value="1">
|
||||
<Spline Keys="0:1:36,0.25:1:36,0.5:1:65572,0.75:1:36,1:1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Film curve whitepoint" Value="4">
|
||||
<Spline Keys="0:4:36,0.25:4:36,0.5:4:65572,0.75:4:36,1:4:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Saturation" Value="1">
|
||||
<Spline Keys="0:0.8:36,0.229167:0.8:36,0.5:1:36,0.751391:1:65572,0.770833:0.8:36,1:0.8:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Color balance" Color="1,1,1">
|
||||
<Spline Keys="0:(1:1:1):36,0.25:(1:1:1):36,0.5:(1:1:1):36,0.75:(1:1:1):36,1:(1:1:1):36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Scene key" Value="0.18000002">
|
||||
<Spline Keys="0:0.18:36,0.25:0.18:36,0.5:0.18:65572,0.75:0.18:36,1:0.18:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Min exposure" Value="1">
|
||||
<Spline Keys="0:1:36,0.25:1:36,0.5:1:65572,0.75:1:36,1:1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Max exposure" Value="2.6142297">
|
||||
<Spline Keys="0:2:36,0.229167:2:36,0.5:2.8:36,0.770833:2:36,1:2:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="EV Min" Value="4.5">
|
||||
<Spline Keys="0:4.5:0,1:4.5:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="EV Max" Value="17">
|
||||
<Spline Keys="0:17:0,1:17:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="EV Auto compensation" Value="1.5">
|
||||
<Spline Keys="0:1.5:0,1:1.5:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="Bloom amount" Value="0.30899152">
|
||||
<Spline Keys="0:1:36,0.229167:1:36,0.5:0.1:36,0.770833:1:36,1:1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Filters: grain" Value="0">
|
||||
<Spline Keys="0:0.3:65572,0.229167:0.3:36,0.25:0:36,0.5:0:36,0.75:0:36,1:0.3:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Filters: photofilter color" Color="0,0,0">
|
||||
<Spline Keys="0:(0:0:0):36,0.25:(0:0:0):36,0.5:(0:0:0):458788,0.75:(0:0:0):36,1:(0:0:0):36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Filters: photofilter density" Value="0">
|
||||
<Spline Keys="0:0:36,0.25:0:36,0.5:0:36,0.75:0:36,1:0:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Dof: focus range" Value="500.00003">
|
||||
<Spline Keys="0:500:36,0.25:500:36,0.5:500:65572,0.75:500:36,1:500:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Dof: blur amount" Value="0.10000001">
|
||||
<Spline Keys="0:0.1:36,0.25:0.1:36,0.5:0.1:65572,0.75:0.1:36,1:0.1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cascade 0: Bias" Value="0.10000001">
|
||||
<Spline Keys="0:0.1:36,0.25:0.1:36,0.5:0.1:65572,0.75:0.1:36,1:0.1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cascade 0: Slope Bias" Value="64">
|
||||
<Spline Keys="0:64:36,0.25:64:36,0.5:64:65572,0.75:64:36,1:64:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cascade 1: Bias" Value="0.10000001">
|
||||
<Spline Keys="0:0.1:36,0.25:0.1:36,0.5:0.1:65572,0.75:0.1:36,1:0.1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cascade 1: Slope Bias" Value="23">
|
||||
<Spline Keys="0:23:36,0.25:23:36,0.5:23:65572,0.75:23:36,1:23:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cascade 2: Bias" Value="0.10000001">
|
||||
<Spline Keys="0:0.1:36,0.25:0.1:36,0.5:0.1:65572,0.75:0.1:36,1:0.1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cascade 2: Slope Bias" Value="4">
|
||||
<Spline Keys="0:4:36,0.25:4:36,0.5:4:65572,0.75:4:36,1:4:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cascade 3: Bias" Value="0.10000001">
|
||||
<Spline Keys="0:0.1:36,0.25:0.1:36,0.5:0.1:36,0.75:0.1:36,1:0.1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cascade 3: Slope Bias" Value="1">
|
||||
<Spline Keys="0:1:36,0.25:1:36,0.5:1:65572,0.75:1:36,1:1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cascade 4: Bias" Value="0.10000001">
|
||||
<Spline Keys="0:0.1:0,0.25:0.1:36,0.5:0.1:65572,0.75:0.1:36,1:0.1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cascade 4: Slope Bias" Value="1">
|
||||
<Spline Keys="0:1:0,0.25:1:36,0.5:1:65572,0.75:1:36,1:1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cascade 5: Bias" Value="0.0099999998">
|
||||
<Spline Keys="0:0.01:0,0.25:0.01:36,0.5:0.01:65572,0.75:0.01:36,1:0.01:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cascade 5: Slope Bias" Value="1">
|
||||
<Spline Keys="0:1:0,0.25:1:36,0.5:1:65572,0.75:1:36,1:1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cascade 6: Bias" Value="0.10000001">
|
||||
<Spline Keys="0:0.1:0,0.25:0.1:36,0.5:0.1:36,0.75:0.1:36,1:0.1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cascade 6: Slope Bias" Value="1">
|
||||
<Spline Keys="0:1:0,0.25:1:36,0.5:1:65572,0.75:1:36,1:1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cascade 7: Bias" Value="0.10000001">
|
||||
<Spline Keys="0:0.1:0,0.25:0.1:36,0.5:0.1:36,0.75:0.1:36,1:0.1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Cascade 7: Slope Bias" Value="1">
|
||||
<Spline Keys="0:1:0,0.25:1:36,0.5:1:65572,0.75:1:36,1:1:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Shadow jittering" Value="2.4999998">
|
||||
<Spline Keys="0:5:36,0.25:2.5:36,0.5:2.5:65572,0.75:2.5:36,1:5:0,"/>
|
||||
</Variable>
|
||||
<Variable Name="HDR dynamic power factor" Value="0">
|
||||
<Spline Keys="0:0:36,0.25:0:36,0.5:0:65572,0.75:0:36,1:0:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sky brightening (terrain occlusion)" Value="0">
|
||||
<Spline Keys="0:0:36,0.25:0:36,0.5:0:36,0.75:0:36,1:0:36,"/>
|
||||
</Variable>
|
||||
<Variable Name="Sun color multiplier" Value="9.999999">
|
||||
<Spline Keys="0:0.1:36,0.25:10:36,0.5:10:36,0.75:10:36,1:0.1:36,"/>
|
||||
</Variable>
|
||||
</TimeOfDay>
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0e6a5435c928079b27796f6b202bbc2623e7e454244ddc099a3cadf33b7cb9e9
|
||||
size 63
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8739c76e681f900923b900c9df0ef75cf421d39cabb54650c4b9ad19b6a76d85
|
||||
size 22
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:825828fe7c183e765315f933a8b1eb25283739d34d62cb84c34e2dcb56591d6e
|
||||
size 12415
|
||||
@@ -0,0 +1,555 @@
|
||||
{
|
||||
"ContainerEntity": {
|
||||
"Id": "Entity_[1146574390643]",
|
||||
"Name": "Level",
|
||||
"Components": {
|
||||
"Component_[10641544592923449938]": {
|
||||
"$type": "EditorInspectorComponent",
|
||||
"Id": 10641544592923449938
|
||||
},
|
||||
"Component_[12039882709170782873]": {
|
||||
"$type": "EditorOnlyEntityComponent",
|
||||
"Id": 12039882709170782873
|
||||
},
|
||||
"Component_[12265484671603697631]": {
|
||||
"$type": "EditorPendingCompositionComponent",
|
||||
"Id": 12265484671603697631
|
||||
},
|
||||
"Component_[14126657869720434043]": {
|
||||
"$type": "EditorEntitySortComponent",
|
||||
"Id": 14126657869720434043,
|
||||
"Child Entity Order": [
|
||||
"Entity_[1176639161715]"
|
||||
]
|
||||
},
|
||||
"Component_[15230859088967841193]": {
|
||||
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
|
||||
"Id": 15230859088967841193,
|
||||
"Parent Entity": ""
|
||||
},
|
||||
"Component_[16239496886950819870]": {
|
||||
"$type": "EditorDisabledCompositionComponent",
|
||||
"Id": 16239496886950819870
|
||||
},
|
||||
"Component_[5688118765544765547]": {
|
||||
"$type": "EditorEntityIconComponent",
|
||||
"Id": 5688118765544765547
|
||||
},
|
||||
"Component_[6545738857812235305]": {
|
||||
"$type": "SelectionComponent",
|
||||
"Id": 6545738857812235305
|
||||
},
|
||||
"Component_[7247035804068349658]": {
|
||||
"$type": "EditorPrefabComponent",
|
||||
"Id": 7247035804068349658
|
||||
},
|
||||
"Component_[9307224322037797205]": {
|
||||
"$type": "EditorLockComponent",
|
||||
"Id": 9307224322037797205
|
||||
},
|
||||
"Component_[9562516168917670048]": {
|
||||
"$type": "EditorVisibilityComponent",
|
||||
"Id": 9562516168917670048
|
||||
}
|
||||
}
|
||||
},
|
||||
"Entities": {
|
||||
"Entity_[1155164325235]": {
|
||||
"Id": "Entity_[1155164325235]",
|
||||
"Name": "Sun",
|
||||
"Components": {
|
||||
"Component_[10440557478882592717]": {
|
||||
"$type": "SelectionComponent",
|
||||
"Id": 10440557478882592717
|
||||
},
|
||||
"Component_[13620450453324765907]": {
|
||||
"$type": "EditorLockComponent",
|
||||
"Id": 13620450453324765907
|
||||
},
|
||||
"Component_[2134313378593666258]": {
|
||||
"$type": "EditorInspectorComponent",
|
||||
"Id": 2134313378593666258
|
||||
},
|
||||
"Component_[234010807770404186]": {
|
||||
"$type": "EditorVisibilityComponent",
|
||||
"Id": 234010807770404186
|
||||
},
|
||||
"Component_[2970359110423865725]": {
|
||||
"$type": "EditorEntityIconComponent",
|
||||
"Id": 2970359110423865725
|
||||
},
|
||||
"Component_[3722854130373041803]": {
|
||||
"$type": "EditorOnlyEntityComponent",
|
||||
"Id": 3722854130373041803
|
||||
},
|
||||
"Component_[5992533738676323195]": {
|
||||
"$type": "EditorDisabledCompositionComponent",
|
||||
"Id": 5992533738676323195
|
||||
},
|
||||
"Component_[7378860763541895402]": {
|
||||
"$type": "AZ::Render::EditorDirectionalLightComponent",
|
||||
"Id": 7378860763541895402,
|
||||
"Controller": {
|
||||
"Configuration": {
|
||||
"Intensity": 1.0,
|
||||
"CameraEntityId": "",
|
||||
"ShadowFilterMethod": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
"Component_[7892834440890947578]": {
|
||||
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
|
||||
"Id": 7892834440890947578,
|
||||
"Parent Entity": "Entity_[1176639161715]",
|
||||
"Transform Data": {
|
||||
"Translate": [
|
||||
0.0,
|
||||
0.0,
|
||||
13.487043380737305
|
||||
],
|
||||
"Rotate": [
|
||||
-76.13099670410156,
|
||||
-0.847000002861023,
|
||||
-15.8100004196167
|
||||
]
|
||||
}
|
||||
},
|
||||
"Component_[8599729549570828259]": {
|
||||
"$type": "EditorEntitySortComponent",
|
||||
"Id": 8599729549570828259
|
||||
},
|
||||
"Component_[952797371922080273]": {
|
||||
"$type": "EditorPendingCompositionComponent",
|
||||
"Id": 952797371922080273
|
||||
}
|
||||
}
|
||||
},
|
||||
"Entity_[1159459292531]": {
|
||||
"Id": "Entity_[1159459292531]",
|
||||
"Name": "Ground",
|
||||
"Components": {
|
||||
"Component_[11701138785793981042]": {
|
||||
"$type": "SelectionComponent",
|
||||
"Id": 11701138785793981042
|
||||
},
|
||||
"Component_[12260880513256986252]": {
|
||||
"$type": "EditorEntityIconComponent",
|
||||
"Id": 12260880513256986252
|
||||
},
|
||||
"Component_[13711420870643673468]": {
|
||||
"$type": "EditorDisabledCompositionComponent",
|
||||
"Id": 13711420870643673468
|
||||
},
|
||||
"Component_[138002849734991713]": {
|
||||
"$type": "EditorOnlyEntityComponent",
|
||||
"Id": 138002849734991713
|
||||
},
|
||||
"Component_[16578565737331764849]": {
|
||||
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
|
||||
"Id": 16578565737331764849,
|
||||
"Parent Entity": "Entity_[1176639161715]"
|
||||
},
|
||||
"Component_[16919232076966545697]": {
|
||||
"$type": "EditorInspectorComponent",
|
||||
"Id": 16919232076966545697
|
||||
},
|
||||
"Component_[5182430712893438093]": {
|
||||
"$type": "EditorMaterialComponent",
|
||||
"Id": 5182430712893438093
|
||||
},
|
||||
"Component_[5675108321710651991]": {
|
||||
"$type": "AZ::Render::EditorMeshComponent",
|
||||
"Id": 5675108321710651991,
|
||||
"Controller": {
|
||||
"Configuration": {
|
||||
"ModelAsset": {
|
||||
"assetId": {
|
||||
"guid": "{0CD745C0-6AA8-569A-A68A-73A3270986C4}",
|
||||
"subId": 277889906
|
||||
},
|
||||
"assetHint": "objects/groudplane/groundplane_512x512m.azmodel"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Component_[5681893399601237518]": {
|
||||
"$type": "EditorEntitySortComponent",
|
||||
"Id": 5681893399601237518
|
||||
},
|
||||
"Component_[592692962543397545]": {
|
||||
"$type": "EditorPendingCompositionComponent",
|
||||
"Id": 592692962543397545
|
||||
},
|
||||
"Component_[7090012899106946164]": {
|
||||
"$type": "EditorLockComponent",
|
||||
"Id": 7090012899106946164
|
||||
},
|
||||
"Component_[9410832619875640998]": {
|
||||
"$type": "EditorVisibilityComponent",
|
||||
"Id": 9410832619875640998
|
||||
}
|
||||
}
|
||||
},
|
||||
"Entity_[1163754259827]": {
|
||||
"Id": "Entity_[1163754259827]",
|
||||
"Name": "Camera",
|
||||
"Components": {
|
||||
"Component_[11895140916889160460]": {
|
||||
"$type": "EditorEntityIconComponent",
|
||||
"Id": 11895140916889160460
|
||||
},
|
||||
"Component_[16880285896855930892]": {
|
||||
"$type": "{CA11DA46-29FF-4083-B5F6-E02C3A8C3A3D} EditorCameraComponent",
|
||||
"Id": 16880285896855930892,
|
||||
"Controller": {
|
||||
"Configuration": {
|
||||
"Field of View": 55.0,
|
||||
"EditorEntityId": 3342481886060234850
|
||||
}
|
||||
}
|
||||
},
|
||||
"Component_[17187464423780271193]": {
|
||||
"$type": "EditorLockComponent",
|
||||
"Id": 17187464423780271193
|
||||
},
|
||||
"Component_[17495696818315413311]": {
|
||||
"$type": "EditorEntitySortComponent",
|
||||
"Id": 17495696818315413311
|
||||
},
|
||||
"Component_[18086214374043522055]": {
|
||||
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
|
||||
"Id": 18086214374043522055,
|
||||
"Parent Entity": "Entity_[1176639161715]",
|
||||
"Transform Data": {
|
||||
"Translate": [
|
||||
-2.3000001907348633,
|
||||
-3.9368600845336914,
|
||||
1.0
|
||||
],
|
||||
"Rotate": [
|
||||
-2.050307512283325,
|
||||
1.9552897214889526,
|
||||
-43.623355865478516
|
||||
]
|
||||
}
|
||||
},
|
||||
"Component_[18387556550380114975]": {
|
||||
"$type": "SelectionComponent",
|
||||
"Id": 18387556550380114975
|
||||
},
|
||||
"Component_[2654521436129313160]": {
|
||||
"$type": "EditorVisibilityComponent",
|
||||
"Id": 2654521436129313160
|
||||
},
|
||||
"Component_[5265045084611556958]": {
|
||||
"$type": "EditorDisabledCompositionComponent",
|
||||
"Id": 5265045084611556958
|
||||
},
|
||||
"Component_[7169798125182238623]": {
|
||||
"$type": "EditorPendingCompositionComponent",
|
||||
"Id": 7169798125182238623
|
||||
},
|
||||
"Component_[7255796294953281766]": {
|
||||
"$type": "GenericComponentWrapper",
|
||||
"Id": 7255796294953281766,
|
||||
"m_template": {
|
||||
"$type": "FlyCameraInputComponent"
|
||||
}
|
||||
},
|
||||
"Component_[8866210352157164042]": {
|
||||
"$type": "EditorInspectorComponent",
|
||||
"Id": 8866210352157164042
|
||||
},
|
||||
"Component_[9129253381063760879]": {
|
||||
"$type": "EditorOnlyEntityComponent",
|
||||
"Id": 9129253381063760879
|
||||
}
|
||||
}
|
||||
},
|
||||
"Entity_[1168049227123]": {
|
||||
"Id": "Entity_[1168049227123]",
|
||||
"Name": "Grid",
|
||||
"Components": {
|
||||
"Component_[11443347433215807130]": {
|
||||
"$type": "EditorEntityIconComponent",
|
||||
"Id": 11443347433215807130
|
||||
},
|
||||
"Component_[11779275529534764488]": {
|
||||
"$type": "SelectionComponent",
|
||||
"Id": 11779275529534764488
|
||||
},
|
||||
"Component_[14249419413039427459]": {
|
||||
"$type": "EditorInspectorComponent",
|
||||
"Id": 14249419413039427459
|
||||
},
|
||||
"Component_[15448581635946161318]": {
|
||||
"$type": "AZ::Render::EditorGridComponent",
|
||||
"Id": 15448581635946161318,
|
||||
"Controller": {
|
||||
"Configuration": {
|
||||
"primarySpacing": 4.0,
|
||||
"primaryColor": [
|
||||
0.501960813999176,
|
||||
0.501960813999176,
|
||||
0.501960813999176
|
||||
],
|
||||
"secondarySpacing": 0.5,
|
||||
"secondaryColor": [
|
||||
0.250980406999588,
|
||||
0.250980406999588,
|
||||
0.250980406999588
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"Component_[1843303322527297409]": {
|
||||
"$type": "EditorDisabledCompositionComponent",
|
||||
"Id": 1843303322527297409
|
||||
},
|
||||
"Component_[380249072065273654]": {
|
||||
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
|
||||
"Id": 380249072065273654,
|
||||
"Parent Entity": "Entity_[1176639161715]"
|
||||
},
|
||||
"Component_[7476660583684339787]": {
|
||||
"$type": "EditorPendingCompositionComponent",
|
||||
"Id": 7476660583684339787
|
||||
},
|
||||
"Component_[7557626501215118375]": {
|
||||
"$type": "EditorEntitySortComponent",
|
||||
"Id": 7557626501215118375
|
||||
},
|
||||
"Component_[7984048488947365511]": {
|
||||
"$type": "EditorVisibilityComponent",
|
||||
"Id": 7984048488947365511
|
||||
},
|
||||
"Component_[8118181039276487398]": {
|
||||
"$type": "EditorOnlyEntityComponent",
|
||||
"Id": 8118181039276487398
|
||||
},
|
||||
"Component_[9189909764215270515]": {
|
||||
"$type": "EditorLockComponent",
|
||||
"Id": 9189909764215270515
|
||||
}
|
||||
}
|
||||
},
|
||||
"Entity_[1172344194419]": {
|
||||
"Id": "Entity_[1172344194419]",
|
||||
"Name": "Shader Ball",
|
||||
"Components": {
|
||||
"Component_[10789351944715265527]": {
|
||||
"$type": "EditorOnlyEntityComponent",
|
||||
"Id": 10789351944715265527
|
||||
},
|
||||
"Component_[12037033284781049225]": {
|
||||
"$type": "EditorEntitySortComponent",
|
||||
"Id": 12037033284781049225
|
||||
},
|
||||
"Component_[13759153306105970079]": {
|
||||
"$type": "EditorPendingCompositionComponent",
|
||||
"Id": 13759153306105970079
|
||||
},
|
||||
"Component_[14135560884830586279]": {
|
||||
"$type": "EditorInspectorComponent",
|
||||
"Id": 14135560884830586279
|
||||
},
|
||||
"Component_[16247165675903986673]": {
|
||||
"$type": "EditorVisibilityComponent",
|
||||
"Id": 16247165675903986673
|
||||
},
|
||||
"Component_[18082433625958885247]": {
|
||||
"$type": "EditorDisabledCompositionComponent",
|
||||
"Id": 18082433625958885247
|
||||
},
|
||||
"Component_[6472623349872972660]": {
|
||||
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
|
||||
"Id": 6472623349872972660,
|
||||
"Parent Entity": "Entity_[1176639161715]",
|
||||
"Transform Data": {
|
||||
"Rotate": [
|
||||
0.0,
|
||||
0.10000000149011612,
|
||||
180.0
|
||||
]
|
||||
}
|
||||
},
|
||||
"Component_[6495255223970673916]": {
|
||||
"$type": "AZ::Render::EditorMeshComponent",
|
||||
"Id": 6495255223970673916,
|
||||
"Controller": {
|
||||
"Configuration": {
|
||||
"ModelAsset": {
|
||||
"assetId": {
|
||||
"guid": "{FD340C30-755C-5911-92A3-19A3F7A77931}",
|
||||
"subId": 281415304
|
||||
},
|
||||
"assetHint": "objects/shaderball/shaderball_default_1m.azmodel"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Component_[8056625192494070973]": {
|
||||
"$type": "SelectionComponent",
|
||||
"Id": 8056625192494070973
|
||||
},
|
||||
"Component_[8550141614185782969]": {
|
||||
"$type": "EditorEntityIconComponent",
|
||||
"Id": 8550141614185782969
|
||||
},
|
||||
"Component_[9439770997198325425]": {
|
||||
"$type": "EditorLockComponent",
|
||||
"Id": 9439770997198325425
|
||||
}
|
||||
}
|
||||
},
|
||||
"Entity_[1176639161715]": {
|
||||
"Id": "Entity_[1176639161715]",
|
||||
"Name": "Atom Default Environment",
|
||||
"Components": {
|
||||
"Component_[10757302973393310045]": {
|
||||
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
|
||||
"Id": 10757302973393310045,
|
||||
"Parent Entity": "Entity_[1146574390643]"
|
||||
},
|
||||
"Component_[14505817420424255464]": {
|
||||
"$type": "EditorInspectorComponent",
|
||||
"Id": 14505817420424255464,
|
||||
"ComponentOrderEntryArray": [
|
||||
{
|
||||
"ComponentId": 10757302973393310045
|
||||
}
|
||||
]
|
||||
},
|
||||
"Component_[14988041764659020032]": {
|
||||
"$type": "EditorLockComponent",
|
||||
"Id": 14988041764659020032
|
||||
},
|
||||
"Component_[15808690248755038124]": {
|
||||
"$type": "SelectionComponent",
|
||||
"Id": 15808690248755038124
|
||||
},
|
||||
"Component_[15900837685796817138]": {
|
||||
"$type": "EditorVisibilityComponent",
|
||||
"Id": 15900837685796817138
|
||||
},
|
||||
"Component_[3298767348226484884]": {
|
||||
"$type": "EditorOnlyEntityComponent",
|
||||
"Id": 3298767348226484884
|
||||
},
|
||||
"Component_[4076975109609220594]": {
|
||||
"$type": "EditorPendingCompositionComponent",
|
||||
"Id": 4076975109609220594
|
||||
},
|
||||
"Component_[5679760548946028854]": {
|
||||
"$type": "EditorDisabledCompositionComponent",
|
||||
"Id": 5679760548946028854
|
||||
},
|
||||
"Component_[5855590796136709437]": {
|
||||
"$type": "EditorEntitySortComponent",
|
||||
"Id": 5855590796136709437,
|
||||
"Child Entity Order": [
|
||||
"Entity_[1155164325235]",
|
||||
"Entity_[1180934129011]",
|
||||
"Entity_[1172344194419]",
|
||||
"Entity_[1168049227123]",
|
||||
"Entity_[1163754259827]",
|
||||
"Entity_[1159459292531]"
|
||||
]
|
||||
},
|
||||
"Component_[9277695270015777859]": {
|
||||
"$type": "EditorEntityIconComponent",
|
||||
"Id": 9277695270015777859
|
||||
}
|
||||
}
|
||||
},
|
||||
"Entity_[1180934129011]": {
|
||||
"Id": "Entity_[1180934129011]",
|
||||
"Name": "Global Sky",
|
||||
"Components": {
|
||||
"Component_[11231930600558681245]": {
|
||||
"$type": "AZ::Render::EditorHDRiSkyboxComponent",
|
||||
"Id": 11231930600558681245,
|
||||
"Controller": {
|
||||
"Configuration": {
|
||||
"CubemapAsset": {
|
||||
"assetId": {
|
||||
"guid": "{215E47FD-D181-5832-B1AB-91673ABF6399}",
|
||||
"subId": 1000
|
||||
},
|
||||
"assetHint": "lightingpresets/highcontrast/goegap_4k_skyboxcm.exr.streamingimage"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Component_[11980494120202836095]": {
|
||||
"$type": "SelectionComponent",
|
||||
"Id": 11980494120202836095
|
||||
},
|
||||
"Component_[1428633914413949476]": {
|
||||
"$type": "EditorLockComponent",
|
||||
"Id": 1428633914413949476
|
||||
},
|
||||
"Component_[14936200426671614999]": {
|
||||
"$type": "AZ::Render::EditorImageBasedLightComponent",
|
||||
"Id": 14936200426671614999,
|
||||
"Controller": {
|
||||
"Configuration": {
|
||||
"diffuseImageAsset": {
|
||||
"assetId": {
|
||||
"guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
|
||||
"subId": 3000
|
||||
},
|
||||
"assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_ibldiffuse.exr.streamingimage"
|
||||
},
|
||||
"specularImageAsset": {
|
||||
"assetId": {
|
||||
"guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
|
||||
"subId": 2000
|
||||
},
|
||||
"assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_iblspecular.exr.streamingimage"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Component_[14994774102579326069]": {
|
||||
"$type": "EditorDisabledCompositionComponent",
|
||||
"Id": 14994774102579326069
|
||||
},
|
||||
"Component_[15417479889044493340]": {
|
||||
"$type": "EditorPendingCompositionComponent",
|
||||
"Id": 15417479889044493340
|
||||
},
|
||||
"Component_[15826613364991382688]": {
|
||||
"$type": "EditorEntitySortComponent",
|
||||
"Id": 15826613364991382688
|
||||
},
|
||||
"Component_[1665003113283562343]": {
|
||||
"$type": "EditorOnlyEntityComponent",
|
||||
"Id": 1665003113283562343
|
||||
},
|
||||
"Component_[3704934735944502280]": {
|
||||
"$type": "EditorEntityIconComponent",
|
||||
"Id": 3704934735944502280
|
||||
},
|
||||
"Component_[5698542331457326479]": {
|
||||
"$type": "EditorVisibilityComponent",
|
||||
"Id": 5698542331457326479
|
||||
},
|
||||
"Component_[6644513399057217122]": {
|
||||
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
|
||||
"Id": 6644513399057217122,
|
||||
"Parent Entity": "Entity_[1176639161715]"
|
||||
},
|
||||
"Component_[931091830724002070]": {
|
||||
"$type": "EditorInspectorComponent",
|
||||
"Id": 931091830724002070
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Instances": {
|
||||
"Instance_[425258647110]": {
|
||||
"Source": "assets/simple_pot_fbx.procprefab"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
<download name="TestDependenciesLevel" type="Map">
|
||||
<index src="filelist.xml" dest="filelist.xml"/>
|
||||
<files>
|
||||
<file src="level.pak" dest="level.pak" size="43382" md5="052a5c022ddb134f88f24182a978ad2d"/>
|
||||
</files>
|
||||
</download>
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:2611b691998640a0e802461f47b5b876f6832fbece62d34cc25da53e135e1c38
|
||||
size 44525
|
||||
+21
-2
@@ -1352,8 +1352,27 @@ void CCryEditApp::CompileCriticalAssets() const
|
||||
}
|
||||
}
|
||||
assetsInQueueNotifcation.BusDisconnect();
|
||||
CCryEditApp::OutputStartupMessage(QString("Asset Processor is now ready."));
|
||||
|
||||
// Signal the "CriticalAssetsCompiled" lifecycle event
|
||||
// Also reload the "assetcatalog.xml" if it exists
|
||||
if (auto settingsRegistry = AZ::SettingsRegistry::Get(); settingsRegistry != nullptr)
|
||||
{
|
||||
AZ::ComponentApplicationLifecycle::SignalEvent(*settingsRegistry, "CriticalAssetsCompiled", R"({})");
|
||||
// Reload the assetcatalog.xml at this point again
|
||||
// Start Monitoring Asset changes over the network and load the AssetCatalog
|
||||
auto LoadCatalog = [settingsRegistry](AZ::Data::AssetCatalogRequests* assetCatalogRequests)
|
||||
{
|
||||
if (AZ::IO::FixedMaxPath assetCatalogPath;
|
||||
settingsRegistry->Get(assetCatalogPath.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_CacheRootFolder))
|
||||
{
|
||||
assetCatalogPath /= "assetcatalog.xml";
|
||||
assetCatalogRequests->LoadCatalog(assetCatalogPath.c_str());
|
||||
}
|
||||
};
|
||||
AZ::Data::AssetCatalogRequestBus::Broadcast(AZStd::move(LoadCatalog));
|
||||
}
|
||||
|
||||
CCryEditApp::OutputStartupMessage(QString("Asset Processor is now ready."));
|
||||
}
|
||||
|
||||
bool CCryEditApp::ConnectToAssetProcessor() const
|
||||
@@ -1669,7 +1688,7 @@ bool CCryEditApp::InitInstance()
|
||||
return false;
|
||||
}
|
||||
|
||||
if (AZ::SettingsRegistryInterface* settingsRegistry = AZ::SettingsRegistry::Get())
|
||||
if (auto settingsRegistry = AZ::SettingsRegistry::Get(); settingsRegistry != nullptr)
|
||||
{
|
||||
AZ::ComponentApplicationLifecycle::SignalEvent(*settingsRegistry, "LegacySystemInterfaceCreated", R"({})");
|
||||
}
|
||||
|
||||
@@ -454,9 +454,6 @@ void EditorViewportWidget::Update()
|
||||
|
||||
// Render
|
||||
{
|
||||
// TODO: Move out this logic to a controller and refactor to work with Atom
|
||||
ProcessRenderLisneters(m_displayContext);
|
||||
|
||||
m_displayContext.Flush2D();
|
||||
|
||||
// Post Render Callback
|
||||
|
||||
@@ -52,7 +52,6 @@ class CUIEnumsDatabase;
|
||||
struct ISourceControl;
|
||||
struct IEditorClassFactory;
|
||||
struct ITransformManipulator;
|
||||
class IFacialEditor;
|
||||
class CDialog;
|
||||
#if defined(AZ_PLATFORM_WINDOWS)
|
||||
class C3DConnexionDriver;
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
// Description : Standard interface for console connectivity plugins.
|
||||
|
||||
|
||||
#ifndef CRYINCLUDE_EDITOR_INCLUDE_ICONSOLECONNECTIVITY_H
|
||||
#define CRYINCLUDE_EDITOR_INCLUDE_ICONSOLECONNECTIVITY_H
|
||||
#pragma once
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Description
|
||||
// This interface provide access to the console connectivity
|
||||
// functionality.
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
struct IConsoleConnectivity
|
||||
: public IUnknown
|
||||
{
|
||||
DEFINE_UUID(0x4DAA85E1, 0x8498, 0x402f, 0x9B, 0x85, 0x7F, 0x62, 0x9D, 0x76, 0x79, 0x8A);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//TODO: Must add the useful interface here.
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Description:
|
||||
// Checks if a development console is connected to the development PC.
|
||||
// See Also:
|
||||
// Arguments:
|
||||
// Nothing
|
||||
// Return:
|
||||
// bool - true if it is connected, false otherwise.
|
||||
virtual bool IsConnectedToConsole() = 0;
|
||||
|
||||
// Description:
|
||||
// Send a file from the specified local filename to the console platform creating the full path
|
||||
// as required so it can copy to the remote filename.
|
||||
// See Also:
|
||||
// Nothing
|
||||
// Arguments:
|
||||
// szLocalFileName - is the local filename from which you want to copy the file.
|
||||
// szRemoteFilename - is the full path and filename to where you want to copy the file.
|
||||
// Return:
|
||||
// bool - true if the copy succeeded, false otherwise.
|
||||
virtual bool SendFile(const char* szLocalFileName, const char* szRemoteFilename) = 0;
|
||||
|
||||
// Description:
|
||||
// Notifies to the console that a file has been changed, typically uploaded.
|
||||
// This will be usually called after a SendFile (see above) call, so that the
|
||||
// system running on the console may decide what to do with this new file.
|
||||
// Typically the system will have to load or reloads this new file.
|
||||
// See Also:
|
||||
// SendFile
|
||||
// Arguments:
|
||||
// szRemoteFilename - is the full path and filename in the console of the changed
|
||||
// file.
|
||||
// Return:
|
||||
// bool - true if succeeded sending the notification, false otherwise.
|
||||
virtual bool NotifyFileChange(const char* szRemoteFilename) = 0;
|
||||
|
||||
|
||||
// Description:
|
||||
// Gets the the title IP for the connected console .
|
||||
// Arguments:
|
||||
// dwConsoleAddressPlaceholder - is the pointer to the placeholder of the variable
|
||||
// which will contain the title IP of the console.
|
||||
// Return:
|
||||
// bool - true if dwConsoleAddressPlaceholder now contains the IP address, else false.
|
||||
virtual bool GetConsoleAddress(DWORD* dwConsoleAddressPlaceholder) = 0;
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// IUnknown
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject) { return E_NOINTERFACE; };
|
||||
virtual ULONG STDMETHODCALLTYPE AddRef() { return 0; };
|
||||
virtual ULONG STDMETHODCALLTYPE Release() { return 0; };
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
};
|
||||
|
||||
#endif // CRYINCLUDE_EDITOR_INCLUDE_ICONSOLECONNECTIVITY_H
|
||||
@@ -1,43 +0,0 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef CRYINCLUDE_EDITOR_INCLUDE_IFACIALEDITOR_H
|
||||
#define CRYINCLUDE_EDITOR_INCLUDE_IFACIALEDITOR_H
|
||||
#pragma once
|
||||
|
||||
|
||||
class IFacialEditor
|
||||
{
|
||||
public:
|
||||
enum EyeType
|
||||
{
|
||||
EYE_LEFT,
|
||||
EYE_RIGHT
|
||||
};
|
||||
|
||||
virtual int GetNumMorphTargets() const = 0;
|
||||
virtual const char* GetMorphTargetName(int index) const = 0;
|
||||
virtual void PreviewEffector(int index, float value) = 0;
|
||||
virtual void ClearAllPreviewEffectors() = 0;
|
||||
virtual void SetForcedNeckRotation(const Quat& rotation) = 0;
|
||||
virtual void SetForcedEyeRotation(const Quat& rotation, EyeType eye) = 0;
|
||||
virtual int GetJoystickCount() const = 0;
|
||||
virtual const char* GetJoystickName(int joystickIndex) const = 0;
|
||||
virtual void SetJoystickPosition(int joystickIndex, float x, float y) = 0;
|
||||
virtual void GetJoystickPosition(int joystickIndex, float& x, float& y) const = 0;
|
||||
virtual void LoadJoystickFile(const char* filename) = 0;
|
||||
virtual void LoadCharacter(const char* filename) = 0;
|
||||
virtual void LoadSequence(const char* filename) = 0;
|
||||
virtual void SetVideoFrameResolution(int width, int height, int bpp) = 0;
|
||||
virtual int GetVideoFramePitch() = 0;
|
||||
virtual void* GetVideoFrameBits() = 0;
|
||||
virtual void ShowVideoFramePane() = 0;
|
||||
};
|
||||
|
||||
#endif // CRYINCLUDE_EDITOR_INCLUDE_IFACIALEDITOR_H
|
||||
@@ -1,29 +0,0 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
// Description : Interface for rendering custom 3D elements in the main
|
||||
// render viewport. Particularly usefull for debug geometries.
|
||||
|
||||
|
||||
#ifndef CRYINCLUDE_EDITOR_INCLUDE_IRENDERLISTENER_H
|
||||
#define CRYINCLUDE_EDITOR_INCLUDE_IRENDERLISTENER_H
|
||||
#pragma once
|
||||
|
||||
|
||||
struct DisplayContext;
|
||||
|
||||
struct IRenderListener
|
||||
: public IUnknown
|
||||
{
|
||||
DEFINE_UUID(0x8D52F857, 0x1027, 0x4346, 0xAC, 0x7B, 0xF6, 0x20, 0xDA, 0x7C, 0xCE, 0x42)
|
||||
|
||||
virtual void Render(DisplayContext& rDisplayContext) = 0;
|
||||
};
|
||||
|
||||
#endif // CRYINCLUDE_EDITOR_INCLUDE_IRENDERLISTENER_H
|
||||
@@ -1,38 +0,0 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
// Description : This file declares the interface used by the texture viewer
|
||||
// and (implemented first implemented by the Texture Database Creator) to
|
||||
// syncronize their threads. A thread interace could be useful there.
|
||||
|
||||
#ifndef CRYINCLUDE_EDITOR_INCLUDE_ITEXTUREDATABASEUPDATER_H
|
||||
#define CRYINCLUDE_EDITOR_INCLUDE_ITEXTUREDATABASEUPDATER_H
|
||||
#pragma once
|
||||
|
||||
|
||||
class CTextureDatabaseItem;
|
||||
|
||||
struct ITextureDatabaseUpdater
|
||||
{
|
||||
public:
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Thread control
|
||||
virtual void NotifyShutDown() = 0;
|
||||
virtual void Lock() = 0;
|
||||
virtual void Unlock() = 0;
|
||||
virtual void WaitForThread() = 0;
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Data access
|
||||
virtual CTextureDatabaseItem* GetItem(const char* szAddItem) = 0;
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
};
|
||||
|
||||
#endif // CRYINCLUDE_EDITOR_INCLUDE_ITEXTUREDATABASEUPDATER_H
|
||||
@@ -166,7 +166,6 @@
|
||||
<file>arhitype_tree_01.png</file>
|
||||
<file>arhitype_tree_02.png</file>
|
||||
<file>arhitype_tree_03.png</file>
|
||||
<file>water.png</file>
|
||||
<file>bmp00005_00.png</file>
|
||||
<file>bmp00005_01.png</file>
|
||||
<file>bmp00005_02.png</file>
|
||||
|
||||
@@ -196,7 +196,6 @@
|
||||
#define ID_FILE_EXPORT_TERRAINAREA 33904
|
||||
#define ID_FILE_EXPORT_TERRAINAREAWITHOBJECTS 33910
|
||||
#define ID_FILE_EXPORT_SELECTEDOBJECTS 33911
|
||||
#define ID_TERRAIN_TIMEOFDAY 33912
|
||||
#define ID_SPLINE_PREVIOUS_KEY 33916
|
||||
#define ID_SPLINE_NEXT_KEY 33917
|
||||
#define ID_SPLINE_FLATTEN_ALL 33918
|
||||
@@ -290,7 +289,6 @@
|
||||
#define ID_TV_TRACKS_TOOLBAR_LAST 35183 // for up to 100 "Add Tracks..." dynamically added Track View Track buttons
|
||||
#define ID_OPEN_TERRAIN_EDITOR 36007
|
||||
#define ID_OPEN_UICANVASEDITOR 36010
|
||||
#define ID_TERRAIN_TIMEOFDAYBUTTON 36011
|
||||
#define ID_OPEN_TERRAINTEXTURE_EDITOR 36012
|
||||
#define ID_SKINS_REFRESH 36014
|
||||
#define ID_FILE_GENERATETERRAIN 36016
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:5201dbba6c8114914ed680b04b72a5e18e22c0519a514bcccdc7ae8d32670b4e
|
||||
size 993
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:48a7250ad41c5e298079ddd13910b58baca2ef592defcc162ccc9df542d28905
|
||||
size 981
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:98b9e9abcc54b4f3e6903ad74bb50f364bfe4c8cd9fedc9653a6603d64a1ee0a
|
||||
size 838
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1199c834fc8de69f9d7c76e8c7fbd84e9b92713b9f07b513137085e5089432cb
|
||||
size 857
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:79b44be1dbe5518e06dc8c8823d00462136d39ffe60a32ef4f64dc0712654d33
|
||||
size 646
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6ea7450c1a278570e2a1dba3a8b4d7d4e5f0d054e8371139ebdb5220c405d355
|
||||
size 537
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:bc73f0720f2ff877aff5c6646938b7fc509a69d92e766fecb9fa010eecadee7b
|
||||
size 606
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e63519ed54fc19a4b4a2a38cb2c5f148b7404ac614d4aab039b71fee64cd7425
|
||||
size 569
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8742cad4b8f8f5bba59abb9cc028db84de222ed8b393398f6837fea16bb4a1d8
|
||||
size 563
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ef85628301b4edc4f858f0988e4f072772be3feb92d27a2ec33b72a27bcee7ff
|
||||
size 583
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d17bfbdee6d37566b241adf64241ef47b62145aaac3e9e8f9691d1fb866b5fcb
|
||||
size 717
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:98b629abf927bcea41d8857b1761d12a37836471d7106b2f5210337c0ace0d9c
|
||||
size 1103
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e949111b33e28834995807cab30ecb58d988a81a2d58fa166117962c85b8e149
|
||||
size 849
|
||||
@@ -30,7 +30,6 @@
|
||||
#include "Objects/ObjectManager.h"
|
||||
#include "Util/3DConnexionDriver.h"
|
||||
#include "PluginManager.h"
|
||||
#include "Include/IRenderListener.h"
|
||||
#include "GameEngine.h"
|
||||
#include "Settings.h"
|
||||
|
||||
@@ -227,61 +226,6 @@ void QtViewport::GetDimensions(int* pWidth, int* pHeight) const
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void QtViewport::RegisterRenderListener(IRenderListener* piListener)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
size_t nCount(0);
|
||||
size_t nTotal(0);
|
||||
|
||||
nTotal = m_cRenderListeners.size();
|
||||
for (nCount = 0; nCount < nTotal; ++nCount)
|
||||
{
|
||||
if (m_cRenderListeners[nCount] == piListener)
|
||||
{
|
||||
assert(!"Registered the same RenderListener multiple times.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif //_DEBUG
|
||||
m_cRenderListeners.push_back(piListener);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
bool QtViewport::UnregisterRenderListener(IRenderListener* piListener)
|
||||
{
|
||||
size_t nCount(0);
|
||||
size_t nTotal(0);
|
||||
|
||||
nTotal = m_cRenderListeners.size();
|
||||
for (nCount = 0; nCount < nTotal; ++nCount)
|
||||
{
|
||||
if (m_cRenderListeners[nCount] == piListener)
|
||||
{
|
||||
m_cRenderListeners.erase(m_cRenderListeners.begin() + nCount);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
bool QtViewport::IsRenderListenerRegistered(IRenderListener* piListener)
|
||||
{
|
||||
size_t nCount(0);
|
||||
size_t nTotal(0);
|
||||
|
||||
nTotal = m_cRenderListeners.size();
|
||||
for (nCount = 0; nCount < nTotal; ++nCount)
|
||||
{
|
||||
if (m_cRenderListeners[nCount] == piListener)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void QtViewport::AddPostRenderer(IPostRenderer* pPostRenderer)
|
||||
{
|
||||
@@ -1164,18 +1108,6 @@ bool QtViewport::GetAdvancedSelectModeFlag()
|
||||
return m_bAdvancedSelectMode;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void QtViewport::ProcessRenderLisneters(DisplayContext& rstDisplayContext)
|
||||
{
|
||||
size_t nCount(0);
|
||||
size_t nTotal(0);
|
||||
|
||||
nTotal = m_cRenderListeners.size();
|
||||
for (nCount = 0; nCount < nTotal; ++nCount)
|
||||
{
|
||||
m_cRenderListeners[nCount]->Render(rstDisplayContext);
|
||||
}
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
#if defined(AZ_PLATFORM_WINDOWS)
|
||||
// Note: Both CreateAnglesYPR and CreateOrientationYPR were copied verbatim from Cry_Camera.h which has been removed.
|
||||
|
||||
@@ -43,7 +43,6 @@ class CLayoutViewPane;
|
||||
class CViewManager;
|
||||
class CBaseObjectsCache;
|
||||
struct HitContext;
|
||||
struct IRenderListener;
|
||||
class CImageEx;
|
||||
class QMenu;
|
||||
|
||||
@@ -104,10 +103,6 @@ public:
|
||||
//! Access to view manager.
|
||||
CViewManager* GetViewManager() const { return m_viewManager; };
|
||||
|
||||
virtual void RegisterRenderListener(IRenderListener* piListener) = 0;
|
||||
virtual bool UnregisterRenderListener(IRenderListener* piListener) = 0;
|
||||
virtual bool IsRenderListenerRegistered(IRenderListener* piListener) = 0;
|
||||
|
||||
virtual void AddPostRenderer(IPostRenderer* pPostRenderer) = 0;
|
||||
virtual bool RemovePostRenderer(IPostRenderer* pPostRenderer) = 0;
|
||||
|
||||
@@ -477,10 +472,6 @@ public:
|
||||
void ResetCursor() override;
|
||||
void SetSupplementaryCursorStr(const QString& str) override;
|
||||
|
||||
void RegisterRenderListener(IRenderListener* piListener) override;
|
||||
bool UnregisterRenderListener(IRenderListener* piListener) override;
|
||||
bool IsRenderListenerRegistered(IRenderListener* piListener) override;
|
||||
|
||||
void AddPostRenderer(IPostRenderer* pPostRenderer) override;
|
||||
bool RemovePostRenderer(IPostRenderer* pPostRenderer) override;
|
||||
|
||||
@@ -508,8 +499,6 @@ protected:
|
||||
void setRenderOverlayVisible(bool);
|
||||
bool isRenderOverlayVisible() const;
|
||||
|
||||
void ProcessRenderLisneters(DisplayContext& rstDisplayContext);
|
||||
|
||||
void mousePressEvent(QMouseEvent* event) override;
|
||||
void mouseReleaseEvent(QMouseEvent* event) override;
|
||||
void mouseDoubleClickEvent(QMouseEvent* event) override;
|
||||
@@ -597,8 +586,6 @@ protected:
|
||||
// Same construction matrix is shared by all viewports.
|
||||
Matrix34 m_constructionMatrix[LAST_COORD_SYSTEM];
|
||||
|
||||
std::vector<IRenderListener*> m_cRenderListeners;
|
||||
|
||||
typedef std::vector<_smart_ptr<IPostRenderer> > PostRenderers;
|
||||
PostRenderers m_postRenderers;
|
||||
AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING
|
||||
|
||||
@@ -270,7 +270,6 @@ set(FILES
|
||||
Include/Command.h
|
||||
Include/HitContext.h
|
||||
Include/ICommandManager.h
|
||||
Include/IConsoleConnectivity.h
|
||||
Include/IDisplayViewport.h
|
||||
Include/IEditorClassFactory.h
|
||||
Include/IEventLoopHook.h
|
||||
@@ -282,9 +281,7 @@ set(FILES
|
||||
Include/IObjectManager.h
|
||||
Include/IPlugin.h
|
||||
Include/IPreferencesPage.h
|
||||
Include/IRenderListener.h
|
||||
Include/ISourceControl.h
|
||||
Include/ITextureDatabaseUpdater.h
|
||||
Include/ITransformManipulator.h
|
||||
Include/IViewPane.h
|
||||
Include/ObjectEvent.h
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4abde33fa9c29e927e403e275979536e7defbb6476eb375e85f847396645953f
|
||||
size 41419
|
||||
@@ -149,3 +149,79 @@
|
||||
#if !defined(AZ_COMMAND_LINE_LEN)
|
||||
# define AZ_COMMAND_LINE_LEN 2048
|
||||
#endif
|
||||
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
#include <memory>
|
||||
#include <cstdint>
|
||||
#include <cstring>
|
||||
|
||||
// First check if the feature if is_constant_evaluated is available via the feature test macro
|
||||
// https://en.cppreference.com/w/User:D41D8CD98F/feature_testing_macros#C.2B.2B20
|
||||
#if __cpp_lib_is_constant_evaluated
|
||||
#define az_builtin_is_constant_evaluated() std::is_constant_evaluated()
|
||||
#endif
|
||||
|
||||
// Next check if there is a __builtin_is_constant_evaluated that can be used
|
||||
// This works on MSVC 19.28+ toolsets when using C++17, as well as
|
||||
// clang 9.0.0+ when using C++17.
|
||||
// Finally it works on gcc 9.0+ when using C++17
|
||||
#if !defined(az_builtin_is_constant_evaluated)
|
||||
#if defined(__has_builtin)
|
||||
#if __has_builtin(__builtin_is_constant_evaluated)
|
||||
#define az_builtin_is_constant_evaluated() __builtin_is_constant_evaluated()
|
||||
#define az_has_builtin_is_constant_evaluated() true
|
||||
#endif
|
||||
#elif AZ_COMPILER_MSVC >= 1928
|
||||
#define az_builtin_is_constant_evaluated() __builtin_is_constant_evaluated()
|
||||
#define az_has_builtin_is_constant_evaluated() true
|
||||
#elif AZ_COMPILER_GCC
|
||||
#define az_builtin_is_constant_evaluated() __builtin_is_constant_evaluated()
|
||||
#define az_has_builtin_is_constant_evaluated() true
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// In this case no support for the determining whether an operation is occuring
|
||||
// at compile time is supported so assume that evaluation is always occuring at compile time
|
||||
// in order to make sure the "safe" operation is being performed
|
||||
#if !defined(az_builtin_is_constant_evaluated)
|
||||
namespace AZ::Internal
|
||||
{
|
||||
constexpr bool builtin_is_constant_evaluated()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
#define az_builtin_is_constant_evaluated() AZ::Internal::builtin_is_constant_evaluated()
|
||||
#define az_has_builtin_is_constant_evaluated() false
|
||||
#endif
|
||||
|
||||
// define builtin functions used by char_traits class for efficient compile time and runtime
|
||||
// operations
|
||||
#if defined(__has_builtin)
|
||||
#if __has_builtin(__builtin_memcpy)
|
||||
#define az_has_builtin_memcpy true
|
||||
#endif
|
||||
#if __has_builtin(__builtin_wmemcpy)
|
||||
#define az_has_builtin_wmemcpy true
|
||||
#endif
|
||||
#if __has_builtin(__builtin_memmove)
|
||||
#define az_has_builtin_memmove true
|
||||
#endif
|
||||
#if __has_builtin(__builtin_wmemmove)
|
||||
#define az_has_builtin_wmemmove true
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(az_has_builtin_memcpy)
|
||||
#define az_has_builtin_memcpy false
|
||||
#endif
|
||||
#if !defined(az_has_builtin_wmemcpy)
|
||||
#define az_has_builtin_wmemcpy false
|
||||
#endif
|
||||
#if !defined(az_has_builtin_memmove)
|
||||
#define az_has_builtin_memmove false
|
||||
#endif
|
||||
#if !defined(az_has_builtin_wmemmove)
|
||||
#define az_has_builtin_wmemmove false
|
||||
#endif
|
||||
|
||||
@@ -11,17 +11,17 @@
|
||||
|
||||
namespace AZStd
|
||||
{
|
||||
stateless_allocator::stateless_allocator(const char* name)
|
||||
: m_name(name) {}
|
||||
stateless_allocator::stateless_allocator() = default;
|
||||
stateless_allocator::stateless_allocator(const char*)
|
||||
{}
|
||||
|
||||
const char* stateless_allocator::get_name() const
|
||||
{
|
||||
return m_name;
|
||||
return "AZStd::stateless_allocator";
|
||||
}
|
||||
|
||||
void stateless_allocator::set_name(const char* name)
|
||||
void stateless_allocator::set_name(const char*)
|
||||
{
|
||||
m_name = name;
|
||||
}
|
||||
|
||||
auto stateless_allocator::allocate(size_type byteSize) -> pointer_type
|
||||
|
||||
@@ -26,7 +26,8 @@ namespace AZStd
|
||||
using difference_type = ptrdiff_t;
|
||||
using allow_memory_leaks = AZStd::true_type;
|
||||
|
||||
stateless_allocator(const char* name = "AZStd::stateless_allocator");
|
||||
stateless_allocator();
|
||||
explicit stateless_allocator(const char*); // Stateless allocator does not store a name
|
||||
stateless_allocator(const stateless_allocator& rhs) = default;
|
||||
|
||||
stateless_allocator& operator=(const stateless_allocator& rhs) = default;
|
||||
@@ -51,9 +52,6 @@ namespace AZStd
|
||||
bool is_lock_free();
|
||||
bool is_stale_read_allowed();
|
||||
bool is_delayed_recycling();
|
||||
|
||||
private:
|
||||
const char* m_name;
|
||||
};
|
||||
|
||||
bool operator==(const stateless_allocator& left, const stateless_allocator& right);
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/std/utils.h>
|
||||
#include <AzCore/std/typetraits/is_constructible.h>
|
||||
#include <AzCore/std/typetraits/remove_cvref.h>
|
||||
|
||||
/* Microsoft C++ ABI puts 1 byte of padding between each empty base class when multiple inheritance is being used
|
||||
@@ -20,7 +21,7 @@
|
||||
#if defined(AZ_COMPILER_MSVC)
|
||||
#define AZSTD_COMPRESSED_PAIR_EMPTY_BASE_OPTIMIZATION __declspec(empty_bases)
|
||||
#else
|
||||
#define AZSTD_COMPRESSED_PAIR_EMPTY_BASE_OPTIMIZATION
|
||||
#define AZSTD_COMPRESSED_PAIR_EMPTY_BASE_OPTIMIZATION
|
||||
#endif
|
||||
|
||||
namespace AZStd
|
||||
@@ -97,16 +98,14 @@ namespace AZStd
|
||||
using second_base_value_type = typename second_base_type::value_type;
|
||||
|
||||
public:
|
||||
// First template argument is a placeholder argument of void as MSVC examines the types
|
||||
// of a templated function to determine if they are the same template
|
||||
// Due to the "template <class T> compressed_pair(skip_element_tag, T&&)"
|
||||
// constructor below, the default constructor template types needs to be distinguished from it
|
||||
template <typename = void, typename = AZStd::enable_if_t<
|
||||
AZStd::is_default_constructible<first_base_value_type>::value
|
||||
&& AZStd::is_default_constructible<second_base_value_type>::value>>
|
||||
// First template argument is used to perform a substitution into AZStd::enable_if_t
|
||||
// so that SFINAE can trigger
|
||||
template <typename Unused = void, typename = AZStd::enable_if_t<
|
||||
AZStd::is_default_constructible_v<first_base_value_type>
|
||||
&& AZStd::is_default_constructible_v<second_base_value_type>, Unused>>
|
||||
constexpr compressed_pair();
|
||||
|
||||
template <typename T, AZStd::enable_if_t<!is_same<remove_cvref_t<T>, compressed_pair>::value, bool> = true>
|
||||
template <typename T, AZStd::enable_if_t<!is_same_v<remove_cvref_t<T>, compressed_pair>, bool> = true>
|
||||
constexpr explicit compressed_pair(T&& firstElement);
|
||||
|
||||
template <typename T>
|
||||
|
||||
@@ -75,7 +75,7 @@ namespace AZStd
|
||||
}
|
||||
|
||||
template <typename T1, typename T2>
|
||||
template <typename T, AZStd::enable_if_t<!is_same<remove_cvref_t<T>, compressed_pair<T1, T2>>::value, bool>>
|
||||
template <typename T, AZStd::enable_if_t<!is_same_v<remove_cvref_t<T>, compressed_pair<T1, T2>>, bool>>
|
||||
inline constexpr compressed_pair<T1, T2>::compressed_pair(T&& firstElement)
|
||||
: first_base_type{ AZStd::forward<T>(firstElement) }
|
||||
, second_base_type{}
|
||||
@@ -117,7 +117,7 @@ namespace AZStd
|
||||
{
|
||||
return static_cast<const first_base_type&>(*this).get();
|
||||
}
|
||||
|
||||
|
||||
template <typename T1, typename T2>
|
||||
inline constexpr auto compressed_pair<T1, T2>::second() -> second_base_value_type&
|
||||
{
|
||||
|
||||
@@ -343,26 +343,6 @@ namespace AZStd
|
||||
static decltype(auto) format(const wchar_t* format, ...);
|
||||
|
||||
protected:
|
||||
template<class InputIt>
|
||||
constexpr auto append_iter(InputIt first, InputIt last)
|
||||
-> enable_if_t<Internal::is_input_iterator_v<InputIt> && !is_convertible_v<InputIt, size_type>, basic_fixed_string&>;
|
||||
|
||||
template<class InputIt>
|
||||
constexpr auto construct_iter(InputIt first, InputIt last)
|
||||
-> enable_if_t<Internal::is_input_iterator_v<InputIt> && !is_convertible_v<InputIt, size_type>>;
|
||||
|
||||
template<class InputIt>
|
||||
constexpr auto assign_iter(InputIt first, InputIt last)
|
||||
-> enable_if_t<Internal::is_input_iterator_v<InputIt> && !is_convertible_v<InputIt, size_type>, basic_fixed_string&>;
|
||||
|
||||
template<class InputIt>
|
||||
constexpr auto insert_iter(const_iterator insertPos, InputIt first, InputIt last)
|
||||
-> enable_if_t<Internal::is_input_iterator_v<InputIt> && !is_convertible_v<InputIt, size_type>, iterator>;
|
||||
|
||||
template<class InputIt>
|
||||
constexpr auto replace_iter(const_iterator first, const_iterator last, InputIt first2, InputIt last2)
|
||||
-> enable_if_t<Internal::is_input_iterator_v<InputIt> && !is_convertible_v<InputIt, size_type>, basic_fixed_string&>;
|
||||
|
||||
constexpr auto fits_in_capacity(size_type newSize) -> bool;
|
||||
|
||||
inline static constexpr size_type Capacity = MaxElementCount; // current storage reserved for string not including null-terminator
|
||||
|
||||
@@ -62,14 +62,7 @@ namespace AZStd
|
||||
template<class InputIt, typename>
|
||||
inline constexpr basic_fixed_string<Element, MaxElementCount, Traits>::basic_fixed_string(InputIt first, InputIt last)
|
||||
{ // construct from [first, last)
|
||||
if (first == last)
|
||||
{
|
||||
Traits::assign(m_buffer[0], Element()); // terminate
|
||||
}
|
||||
else
|
||||
{
|
||||
construct_iter(first, last);
|
||||
}
|
||||
assign(first, last);
|
||||
}
|
||||
|
||||
// #7
|
||||
@@ -98,8 +91,7 @@ namespace AZStd
|
||||
template<typename T, typename>
|
||||
inline constexpr basic_fixed_string<Element, MaxElementCount, Traits>::basic_fixed_string(const T& convertibleToView)
|
||||
{
|
||||
AZStd::basic_string_view<Element, Traits> view = convertibleToView;
|
||||
assign(view.begin(), view.end());
|
||||
assign(convertibleToView);
|
||||
}
|
||||
|
||||
// #11
|
||||
@@ -313,15 +305,7 @@ namespace AZStd
|
||||
if (count > 0 && fits_in_capacity(num))
|
||||
{
|
||||
pointer data = m_buffer;
|
||||
// make room and append new stuff using assign
|
||||
if (count == 1)
|
||||
{
|
||||
Traits::assign(*(data + m_size), ch);
|
||||
}
|
||||
else
|
||||
{
|
||||
Traits::assign(data + m_size, count, ch);
|
||||
}
|
||||
Traits::assign(data + m_size, count, ch);
|
||||
m_size = static_cast<internal_size_type>(num);
|
||||
Traits::assign(data[num], Element()); // terminate
|
||||
}
|
||||
@@ -332,13 +316,47 @@ namespace AZStd
|
||||
template<class InputIt>
|
||||
inline constexpr auto basic_fixed_string<Element, MaxElementCount, Traits>::append(InputIt first, InputIt last)
|
||||
-> enable_if_t<Internal::is_input_iterator_v<InputIt> && !is_convertible_v<InputIt, size_type>, basic_fixed_string&>
|
||||
{ // append [first, last)
|
||||
return append_iter(first, last);
|
||||
{
|
||||
if constexpr (Internal::satisfies_contiguous_iterator_concept_v<InputIt>
|
||||
&& is_same_v<typename AZStd::iterator_traits<InputIt>::value_type, value_type>)
|
||||
{
|
||||
return append(AZStd::to_address(first), AZStd::distance(first, last));
|
||||
}
|
||||
else if constexpr (Internal::is_forward_iterator_v<InputIt>)
|
||||
{
|
||||
// Input Iterator pointer type doesn't match the const_pointer type
|
||||
// So the elements need to be appended one by one into the buffer
|
||||
size_type newSize = m_size + AZStd::distance(first, last);
|
||||
if (fits_in_capacity(newSize))
|
||||
{
|
||||
for (size_t updateIndex = m_size; first != last; ++first, ++updateIndex)
|
||||
{
|
||||
Traits::assign(m_buffer[updateIndex], static_cast<Element>(*first));
|
||||
}
|
||||
m_size = static_cast<internal_size_type>(newSize);
|
||||
Traits::assign(m_buffer[newSize], Element()); // terminate
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
else
|
||||
{
|
||||
// input iterator that aren't forward iterators can only be used in a single pass
|
||||
// algorithm. Therefore AZStd::distance can't be used
|
||||
// So the input is copied into a local string and then delegated
|
||||
// to use the (const_pointer, size_type) overload
|
||||
basic_fixed_string inputCopy;
|
||||
for (; first != last; ++first)
|
||||
{
|
||||
inputCopy.push_back(static_cast<Element>(*first));
|
||||
}
|
||||
|
||||
return append(inputCopy.c_str(), inputCopy.size());
|
||||
}
|
||||
}
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
inline constexpr auto basic_fixed_string<Element, MaxElementCount, Traits>::append(AZStd::initializer_list<Element> ilist) -> basic_fixed_string&
|
||||
{ // append [first, last)
|
||||
return append_iter(ilist.begin(), ilist.end());
|
||||
{
|
||||
return append(ilist.begin(), ilist.size());
|
||||
}
|
||||
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
@@ -420,18 +438,10 @@ namespace AZStd
|
||||
inline constexpr auto basic_fixed_string<Element, MaxElementCount, Traits>::assign(size_type count, Element ch) -> basic_fixed_string&
|
||||
{
|
||||
// assign count * ch
|
||||
AZSTD_CONTAINER_ASSERT(count != npos, "result is too long!");
|
||||
if (fits_in_capacity(count))
|
||||
{ // make room and assign new stuff
|
||||
pointer data = m_buffer;
|
||||
if (count == 1)
|
||||
{
|
||||
Traits::assign(*(data), ch);
|
||||
}
|
||||
else
|
||||
{
|
||||
Traits::assign(data, count, ch);
|
||||
}
|
||||
Traits::assign(data, count, ch);
|
||||
m_size = static_cast<internal_size_type>(count);
|
||||
Traits::assign(data[count], Element()); // terminate
|
||||
}
|
||||
@@ -443,12 +453,46 @@ namespace AZStd
|
||||
inline constexpr auto basic_fixed_string<Element, MaxElementCount, Traits>::assign(InputIt first, InputIt last)
|
||||
-> enable_if_t<Internal::is_input_iterator_v<InputIt> && !is_convertible_v<InputIt, size_type>, basic_fixed_string&>
|
||||
{
|
||||
return assign_iter(first, last);
|
||||
if constexpr (Internal::satisfies_contiguous_iterator_concept_v<InputIt>
|
||||
&& is_same_v<typename AZStd::iterator_traits<InputIt>::value_type, value_type>)
|
||||
{
|
||||
return assign(AZStd::to_address(first), AZStd::distance(first, last));
|
||||
}
|
||||
else if constexpr (Internal::is_forward_iterator_v<InputIt>)
|
||||
{
|
||||
// Input Iterator pointer type doesn't match the const_pointer type
|
||||
// So the elements need to be assigned one by one into the buffer
|
||||
size_type newSize = AZStd::distance(first, last);
|
||||
if (fits_in_capacity(newSize))
|
||||
{
|
||||
for (size_t updateIndex = 0; first != last; ++first, ++updateIndex)
|
||||
{
|
||||
Traits::assign(m_buffer[updateIndex], static_cast<Element>(*first));
|
||||
}
|
||||
m_size = static_cast<internal_size_type>(newSize);
|
||||
Traits::assign(m_buffer[newSize], Element()); // terminate
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
else
|
||||
{
|
||||
// input iterator that aren't forward iterators can only be used in a single pass
|
||||
// algorithm. Therefore AZStd::distance can't be used
|
||||
// So the input is copied into a local string and then delegated
|
||||
// to use the (const_pointer, size_type) overload
|
||||
basic_fixed_string inputCopy;
|
||||
for (; first != last; ++first)
|
||||
{
|
||||
inputCopy.push_back(static_cast<Element>(*first));
|
||||
}
|
||||
|
||||
return assign(inputCopy.c_str(), inputCopy.size());
|
||||
}
|
||||
}
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
inline constexpr auto basic_fixed_string<Element, MaxElementCount, Traits>::assign(AZStd::initializer_list<Element> ilist) -> basic_fixed_string&
|
||||
{
|
||||
return assign_iter(ilist.begin(), ilist.end());
|
||||
return assign(ilist.begin(), ilist.size());
|
||||
}
|
||||
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
@@ -536,14 +580,7 @@ namespace AZStd
|
||||
pointer data = m_buffer;
|
||||
// make room and insert new stuff
|
||||
Traits::copy_backward(data + offset + count, data + offset, m_size - offset); // empty out hole
|
||||
if (count == 1)
|
||||
{
|
||||
Traits::assign(*(data + offset), ch);
|
||||
}
|
||||
else
|
||||
{
|
||||
Traits::assign(data + offset, count, ch);
|
||||
}
|
||||
Traits::assign(data + offset, count, ch);
|
||||
m_size = static_cast<internal_size_type>(num);
|
||||
Traits::assign(data[num], Element()); // terminate
|
||||
}
|
||||
@@ -582,14 +619,51 @@ namespace AZStd
|
||||
inline constexpr auto basic_fixed_string<Element, MaxElementCount, Traits>::insert(const_iterator insertPos,
|
||||
InputIt first, InputIt last)-> enable_if_t<Internal::is_input_iterator_v<InputIt> && !is_convertible_v<InputIt, size_type>, iterator>
|
||||
{ // insert [_First, _Last) at _Where
|
||||
return insert_iter(insertPos, first, last);
|
||||
size_type insertOffset = AZStd::distance(cbegin(), insertPos);
|
||||
if constexpr (Internal::satisfies_contiguous_iterator_concept_v<InputIt>
|
||||
&& is_same_v<typename AZStd::iterator_traits<InputIt>::value_type, value_type>)
|
||||
{
|
||||
insert(insertOffset, AZStd::to_address(first), AZStd::distance(first, last));
|
||||
}
|
||||
else if constexpr (Internal::is_forward_iterator_v<InputIt>)
|
||||
{
|
||||
// Input Iterator pointer type doesn't match the const_pointer type
|
||||
// So the elements need to be inserted one by one into the buffer
|
||||
size_type count = AZStd::distance(first, last);
|
||||
size_type newSize = m_size + count;
|
||||
if (fits_in_capacity(newSize))
|
||||
{
|
||||
Traits::copy_backward(m_buffer + insertOffset + count, m_buffer + insertOffset, m_size - insertOffset); // empty out hole
|
||||
for (size_t updateIndex = insertOffset; first != last; ++first, ++updateIndex)
|
||||
{
|
||||
Traits::assign(m_buffer[updateIndex], static_cast<Element>(*first));
|
||||
}
|
||||
m_size = static_cast<internal_size_type>(newSize);
|
||||
Traits::assign(m_buffer[newSize], Element()); // terminate
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// input iterator that aren't forward iterators can only be used in a single pass
|
||||
// algorithm. Therefore AZStd::distance can't be used
|
||||
// So the input is copied into a local string and then delegated
|
||||
// to use the (const_pointer, size_type) overload
|
||||
basic_fixed_string inputCopy;
|
||||
for (; first != last; ++first)
|
||||
{
|
||||
inputCopy.push_back(static_cast<Element>(*first));
|
||||
}
|
||||
|
||||
insert(insertOffset, inputCopy.c_str(), inputCopy.size());
|
||||
}
|
||||
return begin() + insertOffset;
|
||||
}
|
||||
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
inline constexpr auto basic_fixed_string<Element, MaxElementCount, Traits>::insert(const_iterator insertPos,
|
||||
AZStd::initializer_list<Element> ilist) -> iterator
|
||||
{ // insert [_First, _Last) at _Where
|
||||
return insert_iter(insertPos, ilist.begin(), ilist.end());
|
||||
return insert(insertPos, ilist.begin(), ilist.end());
|
||||
}
|
||||
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
@@ -604,7 +678,7 @@ namespace AZStd
|
||||
{
|
||||
// move elements down
|
||||
pointer data = m_buffer;
|
||||
Traits::copy(data + offset, data + offset + count, m_size - offset - count);
|
||||
Traits::move(data + offset, data + offset + count, m_size - offset - count);
|
||||
m_size = static_cast<internal_size_type>(m_size - count);
|
||||
Traits::assign(data[m_size], Element()); // terminate
|
||||
}
|
||||
@@ -643,7 +717,7 @@ namespace AZStd
|
||||
const basic_fixed_string& rhs) -> basic_fixed_string&
|
||||
{
|
||||
// replace [offset, offset + count) with rhs
|
||||
return replace(offset, count, rhs, size_type(0), npos);
|
||||
return replace(offset, count, rhs.c_str(), rhs.size());
|
||||
}
|
||||
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
@@ -651,56 +725,7 @@ namespace AZStd
|
||||
const basic_fixed_string& rhs, size_type rhsOffset, size_type rhsCount) -> basic_fixed_string&
|
||||
{
|
||||
// replace [offset, offset + count) with rhs [rhsOffset, rhsOffset + rhsCount)
|
||||
AZSTD_CONTAINER_ASSERT(m_size >= offset && rhs.m_size >= rhsOffset, "Invalid offsets");
|
||||
if (m_size - offset < count)
|
||||
{
|
||||
count = m_size - offset; // trim count to size
|
||||
}
|
||||
size_type num = rhs.m_size - rhsOffset;
|
||||
if (num < rhsCount)
|
||||
{
|
||||
rhsCount = num; // trim rhsCount to size
|
||||
}
|
||||
AZSTD_CONTAINER_ASSERT(npos - rhsCount > m_size - count, "Result is too long");
|
||||
|
||||
size_type nm = m_size - count - offset; // length of preserved tail
|
||||
size_type newSize = m_size + rhsCount - count;
|
||||
if (fits_in_capacity(newSize))
|
||||
{
|
||||
pointer data = m_buffer;
|
||||
const_pointer rhsData = rhs.m_buffer;
|
||||
|
||||
if (this != &rhs)
|
||||
{ // no overlap, just move down and copy in new stuff
|
||||
Traits::copy_backward(data + offset + rhsCount, data + offset + count, nm); // empty hole
|
||||
Traits::copy(data + offset, rhsData + rhsOffset, rhsCount); // fill hole
|
||||
}
|
||||
else if (rhsCount <= count)
|
||||
{ // hole doesn't get larger, just copy in substring
|
||||
Traits::copy(data + offset, data + rhsOffset, rhsCount); // fill hole
|
||||
Traits::copy_backward(data + offset + rhsCount, data + offset + count, nm); // move tail down
|
||||
}
|
||||
else if (rhsOffset <= offset)
|
||||
{ // hole gets larger, substring begins before hole
|
||||
Traits::copy_backward(data + offset + rhsCount, data + offset + count, nm); // move tail down
|
||||
Traits::copy(data + offset, data + rhsOffset, rhsCount); // fill hole
|
||||
}
|
||||
else if (offset + count <= rhsOffset)
|
||||
{ // hole gets larger, substring begins after hole
|
||||
Traits::copy_backward(data + offset + rhsCount, data + offset + count, nm); // move tail down
|
||||
Traits::copy(data + offset, data + (rhsOffset + rhsCount - count), rhsCount); // fill hole
|
||||
}
|
||||
else
|
||||
{ // hole gets larger, substring begins in hole
|
||||
Traits::copy(data + offset, data + rhsOffset, count); // fill old hole
|
||||
Traits::copy_backward(data + offset + rhsCount, data + offset + count, nm); // move tail down
|
||||
Traits::copy(data + offset + count, data + rhsOffset + rhsCount, rhsCount - count); // fill rest of new hole
|
||||
}
|
||||
|
||||
m_size = static_cast<internal_size_type>(newSize);
|
||||
Traits::assign(data[newSize], Element()); // terminate
|
||||
}
|
||||
return *this;
|
||||
return replace(offset, count, rhs.c_str() + rhsOffset, AZStd::min(rhsCount, rhs.size() - rhsOffset));
|
||||
}
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
template<typename T>
|
||||
@@ -720,35 +745,83 @@ namespace AZStd
|
||||
pointer data = m_buffer;
|
||||
// replace [offset, offset + count) with [ptr, ptr + ptrCount)
|
||||
AZSTD_CONTAINER_ASSERT(m_size >= offset, "Invalid offset");
|
||||
if (m_size - offset < count)
|
||||
{
|
||||
count = m_size - offset; // trim _N0 to size
|
||||
}
|
||||
AZSTD_CONTAINER_ASSERT(npos - ptrCount > m_size - count, "Result too long");
|
||||
// Make sure count is within is no larger than the distance from the offset
|
||||
// to the end of this string
|
||||
count = AZStd::min(count, m_size - offset);
|
||||
|
||||
size_type nm = m_size - count - offset;
|
||||
if (ptrCount < count)
|
||||
size_type newSize = m_size + ptrCount - count;
|
||||
if (fits_in_capacity(newSize))
|
||||
{
|
||||
Traits::copy(data + offset + ptrCount, data + offset + count, nm); // smaller hole, move tail up
|
||||
}
|
||||
size_type num = m_size + ptrCount - count;
|
||||
if ((0 != ptrCount || 0 != count) && fits_in_capacity(num))
|
||||
{
|
||||
data = m_buffer;
|
||||
// make room and rearrange
|
||||
if (count < ptrCount)
|
||||
// The code assumes that compile time evaluation will not need to deal with overlapping input
|
||||
size_type charsAfterCountToMove = m_size - count - offset;
|
||||
if (az_builtin_is_constant_evaluated() || !((ptr >= data + offset && ptr < data + offset + count)
|
||||
|| (ptr + ptrCount > data + offset && ptr + ptrCount <= data + offset + count)))
|
||||
{
|
||||
Traits::copy_backward(data + offset + ptrCount, data + offset + count, nm); // move tail down
|
||||
// Ex1. this = "ABCDEFG", offset = 1, count = 4
|
||||
// Input string is "CDE"
|
||||
// First the text post offset + count is moved to right after the input string will be copied
|
||||
// "ABCDFG"
|
||||
// ^^^
|
||||
// Next the input string is copied into the buffer
|
||||
// "ACDEFG"
|
||||
//
|
||||
// Ex2. this = "ABCDEFG", offset = 1, count = 2
|
||||
// Input string is "CDE"
|
||||
// Performing the same two steps above, the string transform as follows
|
||||
// "ABCDEFG" -> "ABCDDEFG" -> "ACDEDEFG"
|
||||
// ^^^
|
||||
if (count != ptrCount)
|
||||
{
|
||||
Traits::move(data + offset + ptrCount, data + offset + count, charsAfterCountToMove);
|
||||
}
|
||||
if (ptrCount > 0)
|
||||
{
|
||||
// Copy bytes up to the minimum of this string count and input string count
|
||||
Traits::copy(data + offset, ptr, ptrCount);
|
||||
}
|
||||
}
|
||||
|
||||
if (ptrCount > 0)
|
||||
else
|
||||
{
|
||||
Traits::copy(data + offset, ptr, ptrCount); // fill hole
|
||||
// Overlap checks for fixed_string only needs to check between this string
|
||||
// [offset, offset + count) due to fixed_string never moving memory
|
||||
//
|
||||
// Ex. this = "ABCDEFG", offset = 1, count=4
|
||||
// substring is "CDE"
|
||||
// The text from offset 1 for 4 chars "BCDE": should be replaced with "CDE"
|
||||
// making a whole for the bytes results in output = "ABCDFG"
|
||||
// Afterwards output = "ACDEFG"
|
||||
// The input string overlaps with this string in this case
|
||||
// So the string is copied piecewise
|
||||
if (ptrCount <= count)
|
||||
{ // hole doesn't get larger, just copy in substring
|
||||
Traits::move(data + offset, ptr, ptrCount); // fill hole
|
||||
Traits::copy(data + offset + ptrCount, data + offset + count, charsAfterCountToMove); // move tail down
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ptr <= data + offset)
|
||||
{ // hole gets larger, substring begins before hole
|
||||
Traits::copy_backward(data + offset + ptrCount, data + offset + count, charsAfterCountToMove); // move tail down
|
||||
Traits::copy(data + offset, ptr, ptrCount); // fill hole
|
||||
}
|
||||
else if (data + offset + count <= ptr)
|
||||
{ // hole gets larger, substring begins after hole
|
||||
Traits::copy_backward(data + offset + ptrCount, data + offset + count, charsAfterCountToMove); // move tail down
|
||||
Traits::copy(data + offset, ptr + (ptrCount - count), ptrCount); // fill hole
|
||||
}
|
||||
else
|
||||
{ // hole gets larger, substring begins in hole
|
||||
Traits::copy(data + offset, ptr, count); // fill old hole
|
||||
Traits::copy_backward(data + offset + ptrCount, data + offset + count, charsAfterCountToMove); // move tail down
|
||||
Traits::copy(data + offset + count, ptr + ptrCount, ptrCount - count); // fill rest of new hole
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_size = static_cast<internal_size_type>(num);
|
||||
Traits::assign(data[num], Element()); // terminate
|
||||
}
|
||||
|
||||
m_size = static_cast<internal_size_type>(newSize);
|
||||
Traits::assign(data[newSize], Element()); // terminate
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
@@ -793,14 +866,7 @@ namespace AZStd
|
||||
{
|
||||
Traits::copy_backward(data + offset + num, data + offset + count, nm); // move tail down
|
||||
}
|
||||
if (count == 1)
|
||||
{
|
||||
Traits::assign(*(data + offset), ch);
|
||||
}
|
||||
else
|
||||
{
|
||||
Traits::assign(data + offset, num, ch);
|
||||
}
|
||||
Traits::assign(data + offset, num, ch);
|
||||
m_size = static_cast<internal_size_type>(numToGrow);
|
||||
Traits::assign(data[numToGrow], Element()); // terminate
|
||||
}
|
||||
@@ -851,15 +917,54 @@ namespace AZStd
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
template<class InputIt>
|
||||
inline constexpr auto basic_fixed_string<Element, MaxElementCount, Traits>::replace(const_iterator first, const_iterator last,
|
||||
InputIt first2, InputIt last2) -> enable_if_t<Internal::is_input_iterator_v<InputIt> && !is_convertible_v<InputIt, size_type>, basic_fixed_string&>
|
||||
{ // replace [first, last) with [first2,last2)
|
||||
return replace_iter(first, last, first2, last2);
|
||||
InputIt replaceFirst, InputIt replaceLast) -> enable_if_t<Internal::is_input_iterator_v<InputIt> && !is_convertible_v<InputIt, size_type>, basic_fixed_string&>
|
||||
{ // replace [first, last) with [replaceFirst,replaceLast)
|
||||
if constexpr (Internal::satisfies_contiguous_iterator_concept_v<InputIt>
|
||||
&& is_same_v<typename AZStd::iterator_traits<InputIt>::value_type, value_type>)
|
||||
{
|
||||
return replace(first, last, AZStd::to_address(replaceFirst), AZStd::distance(replaceFirst, replaceLast));
|
||||
}
|
||||
else if constexpr (Internal::is_forward_iterator_v<InputIt>)
|
||||
{
|
||||
// Input Iterator pointer type doesn't match the const_pointer type
|
||||
// So the elements need to be appended one by one into the buffer
|
||||
|
||||
size_type insertOffset = AZStd::distance(cbegin(), first);
|
||||
size_type postInsertOffset = AZStd::distance(cbegin(), last);
|
||||
size_type count = AZStd::distance(replaceFirst, replaceLast);
|
||||
size_type newSize = m_size + count - AZStd::distance(first, last);
|
||||
if (fits_in_capacity(newSize))
|
||||
{
|
||||
Traits::move(first + count, last, m_size - postInsertOffset); // empty out hole
|
||||
for (size_t updateIndex = insertOffset; replaceFirst != replaceLast; ++replaceFirst, ++updateIndex)
|
||||
{
|
||||
Traits::assign(m_buffer[updateIndex], static_cast<Element>(*replaceFirst));
|
||||
}
|
||||
m_size = static_cast<internal_size_type>(newSize);
|
||||
Traits::assign(m_buffer[newSize], Element()); // terminate
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
else
|
||||
{
|
||||
// input iterator that aren't forward iterators can only be used in a single pass
|
||||
// algorithm. Therefore AZStd::distance can't be used
|
||||
// So the input is copied into a local string and then delegated
|
||||
// to use the (const_pointer, size_type) overload
|
||||
basic_fixed_string inputCopy;
|
||||
for (; replaceFirst != replaceLast; ++replaceFirst)
|
||||
{
|
||||
inputCopy.push_back(static_cast<Element>(*replaceFirst));
|
||||
}
|
||||
|
||||
return replace(first, last, inputCopy.c_str(), inputCopy.size());
|
||||
}
|
||||
}
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
inline constexpr auto basic_fixed_string<Element, MaxElementCount, Traits>::replace(const_iterator first, const_iterator last,
|
||||
AZStd::initializer_list<Element> ilist) -> basic_fixed_string&
|
||||
{ // replace [first, last) with [first2,last2)
|
||||
return replace_iter(first, last, ilist.begin(), ilist.end());
|
||||
{
|
||||
return replace(first, last, ilist.begin(), ilist.end());
|
||||
}
|
||||
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
@@ -1411,54 +1516,6 @@ namespace AZStd
|
||||
return result;
|
||||
}
|
||||
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
template<class InputIt>
|
||||
inline constexpr auto basic_fixed_string<Element, MaxElementCount, Traits>::construct_iter(InputIt first, InputIt last)
|
||||
-> enable_if_t<Internal::is_input_iterator_v<InputIt> && !is_convertible_v<InputIt, size_type>>
|
||||
{
|
||||
// initialize from [first, last), input iterators
|
||||
for (; first != last; ++first)
|
||||
{
|
||||
append((size_type)1, (Element)* first);
|
||||
}
|
||||
}
|
||||
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
template<class InputIt>
|
||||
inline constexpr auto basic_fixed_string<Element, MaxElementCount, Traits>::append_iter(InputIt first, InputIt last)
|
||||
-> enable_if_t<Internal::is_input_iterator_v<InputIt> && !is_convertible_v<InputIt, size_type>, basic_fixed_string&>
|
||||
{ // append [first, last), input iterators
|
||||
return replace(end(), end(), first, last);
|
||||
}
|
||||
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
template<class InputIt>
|
||||
inline constexpr auto basic_fixed_string<Element, MaxElementCount, Traits>::assign_iter(InputIt first, InputIt last)
|
||||
-> enable_if_t<Internal::is_input_iterator_v<InputIt> && !is_convertible_v<InputIt, size_type>, basic_fixed_string&>
|
||||
{
|
||||
return replace(begin(), end(), first, last);
|
||||
}
|
||||
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
template<class InputIt>
|
||||
inline constexpr auto basic_fixed_string<Element, MaxElementCount, Traits>::insert_iter(const_iterator insertPos, InputIt first,
|
||||
InputIt last) -> enable_if_t<Internal::is_input_iterator_v<InputIt> && !is_convertible_v<InputIt, size_type>, iterator>
|
||||
{ // insert [first, last) at insertPos, input iterators
|
||||
difference_type offset = insertPos - cbegin();
|
||||
replace(insertPos, insertPos, first, last);
|
||||
return iterator(m_buffer + offset);
|
||||
}
|
||||
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
template<class InputIt>
|
||||
inline constexpr auto basic_fixed_string<Element, MaxElementCount, Traits>::replace_iter(const_iterator first, const_iterator last,
|
||||
InputIt first2, InputIt last2) -> enable_if_t<Internal::is_input_iterator_v<InputIt> && !is_convertible_v<InputIt, size_type>, basic_fixed_string&>
|
||||
{ // replace [first, last) with [first2, last2), input iterators
|
||||
basic_fixed_string rhs(first2, last2);
|
||||
replace(first, last, rhs);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<class Element, size_t MaxElementCount, class Traits>
|
||||
inline constexpr auto basic_fixed_string<Element, MaxElementCount, Traits>::fits_in_capacity(size_type newSize)-> bool
|
||||
{
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -280,18 +280,36 @@ namespace AZStd
|
||||
static constexpr char_type* assign(char_type* dest, size_t count, char_type ch) noexcept
|
||||
{
|
||||
AZ_Assert(dest, "Invalid input!");
|
||||
for (char_type* iter = dest; count; --count, ++iter)
|
||||
|
||||
if constexpr (AZStd::is_same_v<char_type, char>)
|
||||
{
|
||||
assign(*iter, ch);
|
||||
// Use builtin_memset if available for char type
|
||||
if (az_builtin_is_constant_evaluated())
|
||||
{
|
||||
for (char_type* iter = dest; count; --count, ++iter)
|
||||
{
|
||||
assign(*iter, ch);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
::memset(dest, ch, count);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (char_type* iter = dest; count; --count, ++iter)
|
||||
{
|
||||
assign(*iter, ch);
|
||||
}
|
||||
}
|
||||
|
||||
return dest;
|
||||
}
|
||||
static constexpr bool eq(char_type left, char_type right) noexcept { return left == right; }
|
||||
static constexpr bool lt(char_type left, char_type right) noexcept { return left < right; }
|
||||
static constexpr int compare(const char_type* s1, const char_type* s2, size_t count) noexcept
|
||||
{
|
||||
// Regression in VS2017 15.8 and 15.9 where __builtin_memcmp fails in valid checks in constexpr evaluation
|
||||
#if !defined(AZ_COMPILER_MSVC) || AZ_COMPILER_MSVC < 1915 || AZ_COMPILER_MSVC > 1916
|
||||
if constexpr (AZStd::is_same_v<char_type, char>)
|
||||
{
|
||||
return __builtin_memcmp(s1, s2, count);
|
||||
@@ -301,7 +319,6 @@ namespace AZStd
|
||||
return __builtin_wmemcmp(s1, s2, count);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
for (; count; --count, ++s1, ++s2)
|
||||
{
|
||||
@@ -339,10 +356,6 @@ namespace AZStd
|
||||
}
|
||||
static constexpr const char_type* find(const char_type* s, size_t count, const char_type& ch) noexcept
|
||||
{
|
||||
// There is a bug with the __builtin_char_memchr intrinsic in Visual Studio 2017 15.8.x and 15.9.x
|
||||
// It reads in one more additional character than the value of count.
|
||||
// This is probably due to assuming null-termination
|
||||
#if !defined(AZ_COMPILER_MSVC) || AZ_COMPILER_MSVC < 1915 || AZ_COMPILER_MSVC > 1916
|
||||
if constexpr (AZStd::is_same_v<char_type, char>)
|
||||
{
|
||||
return __builtin_char_memchr(s, ch, count);
|
||||
@@ -353,7 +366,6 @@ namespace AZStd
|
||||
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
for (; count; --count, ++s)
|
||||
{
|
||||
@@ -368,64 +380,112 @@ namespace AZStd
|
||||
static constexpr char_type* move(char_type* dest, const char_type* src, size_t count) noexcept
|
||||
{
|
||||
AZ_Assert(dest != nullptr && src != nullptr, "Invalid input!");
|
||||
if (count == 0)
|
||||
if (count == 0 || src == dest)
|
||||
{
|
||||
return dest;
|
||||
}
|
||||
char_type* result = dest;
|
||||
// The less than(<), greater than(>) and other variants(<=, >=)
|
||||
// Cannot be compare pointers within a constexpr due to the potential for undefined behavior
|
||||
// per the bullet linked in the C++ standard at http://eel.is/c++draft/expr.compound#expr.rel-5
|
||||
// Now clang and gcc compilers allow the use of this relation operators in a constexpr, but
|
||||
// msvc is not so forgiving
|
||||
// So a workaround of iterating the src pointer, checking for equality with the dest pointer
|
||||
// is used to check for overlap
|
||||
auto should_copy_forward = [](const char_type* dest1, const char_type* src2, size_t count2) constexpr -> bool
|
||||
|
||||
#if az_has_builtin_memmove
|
||||
__builtin_memmove(dest, src, count * sizeof(char_type));
|
||||
#else
|
||||
auto NonBuiltinMove = [](char_type* dest1, const char_type* src1, size_t count1) constexpr
|
||||
-> char_type*
|
||||
{
|
||||
bool dest_less_than_src{ true };
|
||||
for(const char_type* src_iter = src2; src_iter != src2 + count2; ++src_iter)
|
||||
if (az_builtin_is_constant_evaluated())
|
||||
{
|
||||
if (src_iter == dest1)
|
||||
// The less than(<), greater than(>) and other variants(<=, >=)
|
||||
// Cannot be compare pointers within a constexpr due to the potential for undefined behavior
|
||||
// per the bullet linked in the C++ standard at http://eel.is/c++draft/expr.compound#expr.rel-5
|
||||
// Now clang and gcc compilers allow the use of this relation operators in a constexpr, but
|
||||
// msvc is not so forgiving
|
||||
// So a workaround of iterating the src pointer, checking for equality with the dest pointer
|
||||
// is used to check for overlap
|
||||
auto should_copy_forward = [](const char_type* dest2, const char_type* src2, size_t count2) constexpr -> bool
|
||||
{
|
||||
dest_less_than_src = false;
|
||||
break;
|
||||
bool dest_less_than_src{ true };
|
||||
for (const char_type* src_iter = src2; src_iter != src2 + count2; ++src_iter)
|
||||
{
|
||||
if (src_iter == dest2)
|
||||
{
|
||||
dest_less_than_src = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return dest_less_than_src;
|
||||
};
|
||||
|
||||
if (should_copy_forward(dest1, src1, count1))
|
||||
{
|
||||
copy(dest1, src1, count1);
|
||||
}
|
||||
else
|
||||
{
|
||||
copy_backward(dest1, src1, count1);
|
||||
}
|
||||
}
|
||||
return dest_less_than_src;
|
||||
else
|
||||
{
|
||||
// Use the faster ::memmove operation at runtime
|
||||
::memmove(dest1, src1, count1 * sizeof(char_type));
|
||||
}
|
||||
|
||||
return dest1;
|
||||
};
|
||||
NonBuiltinMove(dest, src, count);
|
||||
#endif
|
||||
|
||||
if (should_copy_forward(dest, src, count))
|
||||
{
|
||||
copy(dest, src, count);
|
||||
}
|
||||
else
|
||||
{
|
||||
copy_backward(dest, src, count);
|
||||
}
|
||||
|
||||
return result;
|
||||
return dest;
|
||||
}
|
||||
static constexpr char_type* copy(char_type* dest, const char_type* src, size_t count) noexcept
|
||||
{
|
||||
AZ_Assert(dest != nullptr && src != nullptr, "Invalid input!");
|
||||
char_type* result = dest;
|
||||
for(; count; --count, ++dest, ++src)
|
||||
|
||||
#if az_has_builtin_memcpy
|
||||
__builtin_memcpy(dest, src, count * sizeof(char_type));
|
||||
#else
|
||||
auto NonBuiltinCopy = [](char_type* dest1, const char_type* src1, size_t count1) constexpr
|
||||
-> char_type*
|
||||
{
|
||||
assign(*dest, *src);
|
||||
}
|
||||
return result;
|
||||
if (az_builtin_is_constant_evaluated())
|
||||
{
|
||||
for (; count1; --count1, ++dest1, ++src1)
|
||||
{
|
||||
assign(*dest1, *src1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
::memcpy(dest1, src1, count1 * sizeof(char_type));
|
||||
}
|
||||
return dest1;
|
||||
};
|
||||
NonBuiltinCopy(dest, src, count);
|
||||
#endif
|
||||
|
||||
return dest;
|
||||
}
|
||||
// Extension for constexpr workarounds: Addresses of a string literal cannot be compared at compile time and MSVC and clang will just refuse to compile the constexpr
|
||||
// Adding a copy_backwards overload that always copies backwards.
|
||||
static constexpr char_type* copy_backward(char_type* dest, const char_type*src, size_t count) noexcept
|
||||
static constexpr char_type* copy_backward(char_type* dest, const char_type* src, size_t count) noexcept
|
||||
{
|
||||
char_type* result = dest;
|
||||
dest += count;
|
||||
src += count;
|
||||
for (; count; --count)
|
||||
#if az_has_builtin_memmove
|
||||
__builtin_memmove(dest, src, count * sizeof(char_type));
|
||||
#else
|
||||
if (az_builtin_is_constant_evaluated())
|
||||
{
|
||||
assign(*--dest, *--src);
|
||||
dest += count;
|
||||
src += count;
|
||||
for (; count; --count)
|
||||
{
|
||||
assign(*--dest, *--src);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
::memmove(dest, src, count);
|
||||
}
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,13 @@
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="AZStd::compressed_pair_element<*,*,*>">
|
||||
<DisplayString>{m_element}</DisplayString>
|
||||
</Type>
|
||||
<Type Name="AZStd::compressed_pair_element<*,*,1>">
|
||||
<DisplayString>{$T1} is empty</DisplayString>
|
||||
</Type>
|
||||
|
||||
<Type Name="AZStd::reverse_iterator<*>" Priority="Medium">
|
||||
<DisplayString>reverse_iterator base() {m_current}</DisplayString>
|
||||
<Expand>
|
||||
@@ -388,35 +395,41 @@
|
||||
|
||||
<!-- -->
|
||||
|
||||
<Type Name="AZStd::basic_string<char,*>">
|
||||
<DisplayString Condition="m_capacity < SSO_BUF_SIZE">{m_buffer,s}</DisplayString>
|
||||
<DisplayString Condition="m_capacity >= SSO_BUF_SIZE">{m_data,s}</DisplayString>
|
||||
<StringView Condition="m_capacity < SSO_BUF_SIZE">m_buffer,s</StringView>
|
||||
<StringView Condition="m_capacity >= SSO_BUF_SIZE">m_data,s</StringView>
|
||||
<Type Name="AZStd::basic_string<char,*,*>">
|
||||
<DisplayString Condition="((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">{((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_buffer,s}</DisplayString>
|
||||
<DisplayString Condition="!((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">{((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_allocatedData.m_data,s}</DisplayString>
|
||||
<StringView Condition="((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_buffer,s</StringView>
|
||||
<StringView Condition="!((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_allocatedData.m_data,s</StringView>
|
||||
<Expand>
|
||||
<Item Name="[size]">m_size</Item>
|
||||
<Item Name="[capacity]">m_capacity</Item>
|
||||
<Item Name="[size]" Condition="((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">(size_t)((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_size</Item>
|
||||
<Item Name="[size]" Condition="!((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_allocatedData.m_size</Item>
|
||||
<Item Name="[capacity]" Condition="((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.Capacity</Item>
|
||||
<Item Name="[capacity]" Condition="!((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_allocatedData.m_capacity</Item>
|
||||
<ArrayItems>
|
||||
<Size>m_size</Size>
|
||||
<ValuePointer Condition="m_capacity < SSO_BUF_SIZE">m_buffer</ValuePointer>
|
||||
<ValuePointer Condition="m_capacity >= SSO_BUF_SIZE">m_data</ValuePointer>
|
||||
<Size Condition="((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_size,u</Size>
|
||||
<Size Condition="!((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_allocatedData.m_size</Size>
|
||||
<ValuePointer Condition="((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_buffer</ValuePointer>
|
||||
<ValuePointer Condition="!((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<char,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_allocatedData.m_data</ValuePointer>
|
||||
</ArrayItems>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="AZStd::basic_string<wchar_t,*>">
|
||||
<AlternativeType Name="AZStd::basic_string<unsigned short,*>" />
|
||||
<DisplayString Condition="m_capacity < SSO_BUF_SIZE">{m_buffer,su}</DisplayString>
|
||||
<DisplayString Condition="m_capacity >= SSO_BUF_SIZE">{m_data,su}</DisplayString>
|
||||
<StringView Condition="m_capacity < SSO_BUF_SIZE">m_buffer,su</StringView>
|
||||
<StringView Condition="m_capacity >= SSO_BUF_SIZE">m_data,su</StringView>
|
||||
<DisplayString Condition="((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">{((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_buffer,su}</DisplayString>
|
||||
<DisplayString Condition="!((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">{((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_allocatedData.m_data,su}</DisplayString>
|
||||
<StringView Condition="((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_buffer,su</StringView>
|
||||
<StringView Condition="!((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_allocatedData.m_data,su</StringView>
|
||||
<Expand>
|
||||
<Item Name="[size]">m_size</Item>
|
||||
<Item Name="[capacity]">m_capacity</Item>
|
||||
<Item Name="[size]" Condition="((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">(size_t)((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_size</Item>
|
||||
<Item Name="[size]" Condition="!((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_allocatedData.m_size</Item>
|
||||
<Item Name="[capacity]" Condition="((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.Capacity</Item>
|
||||
<Item Name="[capacity]" Condition="!((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_allocatedData.m_capacity</Item>
|
||||
<ArrayItems>
|
||||
<Size>m_size</Size>
|
||||
<ValuePointer Condition="m_capacity < SSO_BUF_SIZE">m_buffer</ValuePointer>
|
||||
<ValuePointer Condition="m_capacity >= SSO_BUF_SIZE">m_data</ValuePointer>
|
||||
<Size Condition="((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_size,u</Size>
|
||||
<Size Condition="!((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_allocatedData.m_size</Size>
|
||||
<ValuePointer Condition="((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_buffer</ValuePointer>
|
||||
<ValuePointer Condition="!((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_shortData.m_ssoActive">((AZStd::compressed_pair_element<AZStd::basic_string<wchar_t,$T1,$T2>::Storage,0,0>&)m_storage).m_element.m_allocatedData.m_data</ValuePointer>
|
||||
</ArrayItems>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -97,19 +97,38 @@ namespace AzFramework
|
||||
AZStd::vector<AZStd::string> registeredAssetPaths;
|
||||
AZ::Data::AssetCatalogRequestBus::BroadcastResult(registeredAssetPaths, &AZ::Data::AssetCatalogRequests::GetRegisteredAssetPaths);
|
||||
|
||||
const char* dependencyXmlPattern = "*_dependencies.xml";
|
||||
constexpr const char* dependencyXmlPattern = "_dependencies.xml";
|
||||
for (const AZStd::string& assetPath : registeredAssetPaths)
|
||||
{
|
||||
if (!AZStd::wildcard_match(dependencyXmlPattern, assetPath.c_str()))
|
||||
if (assetPath.ends_with(dependencyXmlPattern))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!m_excludeFileQueryManager.get()->LoadEngineDependencies(assetPath))
|
||||
{
|
||||
AZ_Error("ExcludeFileComponent", false, "Failed to add assets referenced from %s to the blocked list", assetPath.c_str());
|
||||
AZ_VerifyError("ExcludeFileComponent", m_excludeFileQueryManager.get()->LoadEngineDependencies(assetPath),
|
||||
"Failed to add assets referenced from %s to the blocked list", assetPath.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ExcludeFileComponent::OnCatalogAssetChanged(const AZ::Data::AssetId& assetId)
|
||||
{
|
||||
// Reload any modified "<name>_dependencies.xml" files
|
||||
AZ::IO::Path assetPath;
|
||||
auto GetAssetPath = [&assetId, &assetPath](AZ::Data::AssetCatalogRequests* assetCatalogRequests)
|
||||
{
|
||||
assetPath = assetCatalogRequests->GetAssetPathById(assetId);
|
||||
};
|
||||
|
||||
AZ::Data::AssetCatalogRequestBus::Broadcast(AZStd::move(GetAssetPath));
|
||||
constexpr const char* dependencyXmlPattern = "_dependencies.xml";
|
||||
if (assetPath.Native().ends_with(dependencyXmlPattern))
|
||||
{
|
||||
AZ_VerifyError("ExcludeFileComponent", m_excludeFileQueryManager.get()->LoadEngineDependencies(assetPath.Native()),
|
||||
"Failed to add assets referenced from %s to the blocked list", assetPath.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void ExcludeFileComponent::OnCatalogAssetAdded(const AZ::Data::AssetId& assetId)
|
||||
{
|
||||
OnCatalogAssetChanged(assetId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,6 +65,8 @@ namespace AzFramework
|
||||
void Deactivate() override;
|
||||
|
||||
void OnCatalogLoaded(const char* catalogFile) override;
|
||||
void OnCatalogAssetChanged(const AZ::Data::AssetId& assetId) override;
|
||||
void OnCatalogAssetAdded(const AZ::Data::AssetId& assetId) override;
|
||||
|
||||
static void Reflect(AZ::ReflectContext* context);
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#include <AzCore/Asset/AssetManager.h>
|
||||
#include <AzCore/Asset/AssetSerializer.h>
|
||||
#include <AzCore/Component/ComponentApplicationLifecycle.h>
|
||||
#include <AzCore/Settings/SettingsRegistry.h>
|
||||
#include <AzCore/Serialization/SerializeContext.h>
|
||||
#include <AzFramework/Spawnable/SpawnableMetaData.h>
|
||||
@@ -61,15 +62,6 @@ namespace AzFramework
|
||||
m_entitiesManager.ProcessQueue(SpawnableEntitiesManager::CommandQueuePriority::High);
|
||||
}
|
||||
|
||||
void SpawnableSystemComponent::OnCatalogLoaded([[maybe_unused]] const char* catalogFile)
|
||||
{
|
||||
if (!m_catalogAvailable)
|
||||
{
|
||||
m_catalogAvailable = true;
|
||||
LoadRootSpawnableFromSettingsRegistry();
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t SpawnableSystemComponent::AssignRootSpawnable(AZ::Data::Asset<Spawnable> rootSpawnable)
|
||||
{
|
||||
uint32_t generation = 0;
|
||||
@@ -157,20 +149,29 @@ namespace AzFramework
|
||||
// Register with AssetDatabase
|
||||
AZ_Assert(AZ::Data::AssetManager::IsReady(), "Spawnables can't be registered because the Asset Manager is not ready yet.");
|
||||
AZ::Data::AssetManager::Instance().RegisterHandler(&m_assetHandler, AZ::AzTypeInfo<Spawnable>::Uuid());
|
||||
|
||||
|
||||
// Register with AssetCatalog
|
||||
AZ::Data::AssetCatalogRequestBus::Broadcast(
|
||||
&AZ::Data::AssetCatalogRequestBus::Events::EnableCatalogForAsset, AZ::AzTypeInfo<Spawnable>::Uuid());
|
||||
AZ::Data::AssetCatalogRequestBus::Broadcast(
|
||||
&AZ::Data::AssetCatalogRequestBus::Events::AddExtension, Spawnable::FileExtension);
|
||||
|
||||
AssetCatalogEventBus::Handler::BusConnect();
|
||||
// Register for the CriticalAssetsCompiled lifecycle event to trigger the loading of the root spawnable
|
||||
auto settingsRegistry = AZ::SettingsRegistry::Get();
|
||||
AZ_Assert(settingsRegistry, "Unable to change root spawnable callback because Settings Registry is not available.");
|
||||
|
||||
auto LifecycleCallback = [this](AZStd::string_view, AZ::SettingsRegistryInterface::Type)
|
||||
{
|
||||
LoadRootSpawnableFromSettingsRegistry();
|
||||
};
|
||||
AZ::ComponentApplicationLifecycle::RegisterHandler(*settingsRegistry, m_criticalAssetsHandler,
|
||||
AZStd::move(LifecycleCallback), "CriticalAssetsCompiled");
|
||||
|
||||
|
||||
RootSpawnableNotificationBus::Handler::BusConnect();
|
||||
AZ::TickBus::Handler::BusConnect();
|
||||
|
||||
auto registry = AZ::SettingsRegistry::Get();
|
||||
AZ_Assert(registry, "Unable to change root spawnable callback because Settings Registry is not available.");
|
||||
m_registryChangeHandler = registry->RegisterNotifier([this](AZStd::string_view path, AZ::SettingsRegistryInterface::Type /*type*/)
|
||||
m_registryChangeHandler = settingsRegistry->RegisterNotifier([this](AZStd::string_view path, AZ::SettingsRegistryInterface::Type /*type*/)
|
||||
{
|
||||
if (path.starts_with(RootSpawnableRegistryKey))
|
||||
{
|
||||
@@ -187,13 +188,14 @@ namespace AzFramework
|
||||
|
||||
AZ::TickBus::Handler::BusDisconnect();
|
||||
RootSpawnableNotificationBus::Handler::BusDisconnect();
|
||||
AssetCatalogEventBus::Handler::BusDisconnect();
|
||||
// Unregister Lifecycle event handler
|
||||
m_criticalAssetsHandler = {};
|
||||
|
||||
if (m_catalogAvailable)
|
||||
if (m_rootSpawnableId.IsValid())
|
||||
{
|
||||
ReleaseRootSpawnable();
|
||||
|
||||
// The SpawnalbleSystemComponent needs to guarantee there's no more processing left to do by the
|
||||
// The SpawnableSystemComponent needs to guarantee there's no more processing left to do by the
|
||||
// entity manager before it can safely destroy it on shutdown, but also to make sure that are no
|
||||
// more calls to the callback registered to the root spawnable as that accesses this component.
|
||||
m_rootSpawnableContainer.Clear();
|
||||
@@ -210,8 +212,6 @@ namespace AzFramework
|
||||
|
||||
void SpawnableSystemComponent::LoadRootSpawnableFromSettingsRegistry()
|
||||
{
|
||||
AZ_Assert(m_catalogAvailable, "Attempting to load root spawnable while the catalog is not available yet.");
|
||||
|
||||
auto registry = AZ::SettingsRegistry::Get();
|
||||
AZ_Assert(registry, "Unable to check for root spawnable because the Settings Registry is not available.");
|
||||
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
#include <AzCore/Component/TickBus.h>
|
||||
#include <AzCore/Settings/SettingsRegistry.h>
|
||||
#include <AzCore/std/parallel/atomic.h>
|
||||
#include <AzFramework/Asset/AssetCatalogBus.h>
|
||||
#include <AzFramework/Spawnable/RootSpawnableInterface.h>
|
||||
#include <AzFramework/Spawnable/Spawnable.h>
|
||||
#include <AzFramework/Spawnable/SpawnableAssetHandler.h>
|
||||
@@ -25,7 +24,6 @@ namespace AzFramework
|
||||
: public AZ::Component
|
||||
, public AZ::TickBus::Handler
|
||||
, public AZ::SystemTickBus::Handler
|
||||
, public AssetCatalogEventBus::Handler
|
||||
, public RootSpawnableInterface::Registrar
|
||||
, public RootSpawnableNotificationBus::Handler
|
||||
{
|
||||
@@ -63,12 +61,6 @@ namespace AzFramework
|
||||
|
||||
void OnSystemTick() override;
|
||||
|
||||
//
|
||||
// AssetCatalogEventBus
|
||||
//
|
||||
|
||||
void OnCatalogLoaded(const char* catalogFile) override;
|
||||
|
||||
//
|
||||
// RootSpawnableInterface
|
||||
//
|
||||
@@ -97,6 +89,6 @@ namespace AzFramework
|
||||
AZ::SettingsRegistryInterface::NotifyEventHandler m_registryChangeHandler;
|
||||
|
||||
AZ::Data::AssetId m_rootSpawnableId;
|
||||
bool m_catalogAvailable{ false };
|
||||
AZ::SettingsRegistryInterface::NotifyEventHandler m_criticalAssetsHandler;
|
||||
};
|
||||
} // namespace AzFramework
|
||||
|
||||
@@ -1460,7 +1460,7 @@ QString DoubleSpinBox::stringValue(double value, bool truncated) const
|
||||
numDecimals = 0;
|
||||
}
|
||||
|
||||
return toString(value, numDecimals, locale(), isGroupSeparatorShown());
|
||||
return toString(value, numDecimals, locale(), isGroupSeparatorShown(), true);
|
||||
}
|
||||
|
||||
void DoubleSpinBox::updateToolTip(double value)
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
#include <AzTest/AzTest.h>
|
||||
#include <AzCore/Math/Color.h>
|
||||
#include <AzQtComponents/Components/Widgets/ColorPicker/Palette.h>
|
||||
#include <AzQtComponents/Utilities/Conversions.h>
|
||||
#include <QLocale>
|
||||
|
||||
// Environments subclass from AZ::Test::ITestEnvironment
|
||||
class AzQtComponentsTestEnvironment : public AZ::Test::ITestEnvironment
|
||||
@@ -34,3 +36,17 @@ protected:
|
||||
};
|
||||
|
||||
AZ_UNIT_TEST_HOOK(new AzQtComponentsTestEnvironment);
|
||||
|
||||
TEST(AzQtComponents, ToStringReturnsTruncatedString)
|
||||
{
|
||||
double testVal = 1.2399999;
|
||||
QString result = AzQtComponents::toString(testVal, 3, QLocale(), false, false);
|
||||
EXPECT_TRUE(result == "1.239");
|
||||
}
|
||||
|
||||
TEST(AzQtComponents, ToStringReturnsRoundedString)
|
||||
{
|
||||
double testVal = 1.2399999;
|
||||
QString result = AzQtComponents::toString(testVal, 3, QLocale(), false, true);
|
||||
EXPECT_TRUE(result == "1.24");
|
||||
}
|
||||
|
||||
@@ -39,15 +39,23 @@ namespace AzQtComponents
|
||||
return AZ::Color(static_cast<float>(rgb.redF()), static_cast<float>(rgb.greenF()), static_cast<float>(rgb.blueF()), static_cast<float>(rgb.alphaF()));
|
||||
}
|
||||
|
||||
QString toString(double value, int numDecimals, const QLocale& locale, bool showGroupSeparator)
|
||||
QString toString(double value, int numDecimals, const QLocale& locale, bool showGroupSeparator, bool round)
|
||||
{
|
||||
const QChar decimalPoint = locale.decimalPoint();
|
||||
const QChar zeroDigit = locale.zeroDigit();
|
||||
const int numToStringDecimals = AZStd::max(numDecimals, 20);
|
||||
QString retValue;
|
||||
|
||||
// We want to truncate, not round. toString will round, so we add extra decimal places to the formatting
|
||||
// so we can remove the last values
|
||||
QString retValue = locale.toString(value, 'f', (numDecimals > 0) ? numToStringDecimals : 0);
|
||||
// If we want to truncate, not round, we add extra decimal places to the formatting
|
||||
// so we can remove the last values otherwise we allow rounding
|
||||
if (round)
|
||||
{
|
||||
retValue = locale.toString(value, 'f', (numDecimals > 0) ? numDecimals : 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
retValue = locale.toString(value, 'f', (numDecimals > 0) ? numToStringDecimals : 0);
|
||||
}
|
||||
|
||||
// Handle special cases when we have decimals in our value
|
||||
if (numDecimals > 0)
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace AzQtComponents
|
||||
|
||||
AZ_QT_COMPONENTS_API AZ::Color fromQColor(const QColor& color);
|
||||
|
||||
AZ_QT_COMPONENTS_API QString toString(double value, int numDecimals, const QLocale& locale, bool showGroupSeparator = false);
|
||||
AZ_QT_COMPONENTS_API QString toString(double value, int numDecimals, const QLocale& locale, bool showGroupSeparator = false, bool round = false);
|
||||
|
||||
// Maintained for backwards compile compatibility
|
||||
inline QColor ToQColor(const AZ::Color& color)
|
||||
|
||||
@@ -8,57 +8,41 @@
|
||||
|
||||
#include <AzCore/PlatformIncl.h>
|
||||
|
||||
#include <AzCore/std/string/conversions.h>
|
||||
#include <AzCore/IO/Path/Path.h>
|
||||
#include <AzCore/std/functional.h>
|
||||
#include <AzCore/IO/SystemFile.h>
|
||||
#include <AzTest/Platform.h>
|
||||
#include <AzTest/Utils.h>
|
||||
|
||||
namespace AZ
|
||||
namespace AZ::Test
|
||||
{
|
||||
namespace Test
|
||||
ScopedAutoTempDirectory::ScopedAutoTempDirectory()
|
||||
{
|
||||
ScopedAutoTempDirectory::ScopedAutoTempDirectory()
|
||||
using UuidString = AZStd::fixed_string<AZ::Uuid::MaxStringBuffer>;
|
||||
constexpr DWORD bufferSize = static_cast<DWORD>(AZ::IO::MaxPathLength);
|
||||
|
||||
wchar_t tempDirW[AZ::IO::MaxPathLength]{};
|
||||
GetTempPathW(bufferSize, tempDirW);
|
||||
|
||||
AZ::IO::FixedMaxPath tempDirectoryRoot;
|
||||
AZStd::to_string(tempDirectoryRoot.Native(), tempDirW);
|
||||
|
||||
constexpr int MaxAttempts = 255;
|
||||
for (int i = 0; i < MaxAttempts; ++i)
|
||||
{
|
||||
constexpr const DWORD bufferSize = static_cast<DWORD>(AZ::IO::MaxPathLength);
|
||||
|
||||
char tempDir[bufferSize] = {0};
|
||||
GetTempPathA(bufferSize, tempDir);
|
||||
|
||||
char workingTempPathBuffer[bufferSize] = {'\0'};
|
||||
|
||||
int maxAttempts = 2000; // Prevent an infinite loop by setting an arbitrary maximum attempts at finding an available temp folder name
|
||||
while (maxAttempts > 0)
|
||||
AZ::IO::FixedMaxPath testPath = tempDirectoryRoot /
|
||||
AZ::IO::FixedMaxPathString::format("UnitTest-%s",
|
||||
AZ::Uuid::CreateRandom().ToString<UuidString>().c_str());
|
||||
// Try to create the temp directory if it doesn't exist
|
||||
if (!AZ::IO::SystemFile::Exists(testPath.c_str()) && AZ::IO::SystemFile::CreateDir(testPath.c_str()))
|
||||
{
|
||||
// Use the system's tick count to base the folder name
|
||||
ULONGLONG currentTick = GetTickCount64();
|
||||
azsnprintf(workingTempPathBuffer, bufferSize, "%sUnitTest-%X", tempDir, aznumeric_cast<unsigned int>(currentTick));
|
||||
|
||||
// Check if the requested directory name is available and re-generate if it already exists
|
||||
bool exists = AZ::IO::SystemFile::Exists(workingTempPathBuffer);
|
||||
if (exists)
|
||||
{
|
||||
Sleep(1);
|
||||
maxAttempts--;
|
||||
continue;
|
||||
}
|
||||
azstrncpy(AZStd::data(m_tempDirectory), AZStd::size(m_tempDirectory),
|
||||
testPath.c_str(), testPath.Native().size());
|
||||
break;
|
||||
}
|
||||
|
||||
AZ_Error("AzTest", maxAttempts > 0, "Unable to determine a temp directory");
|
||||
|
||||
if (maxAttempts > 0)
|
||||
{
|
||||
// Create the temp directory and track it for deletion
|
||||
bool tempDirectoryCreated = AZ::IO::SystemFile::CreateDir(workingTempPathBuffer);
|
||||
if (tempDirectoryCreated)
|
||||
{
|
||||
azstrncpy(m_tempDirectory, AZ::IO::MaxPathLength, workingTempPathBuffer, AZ::IO::MaxPathLength);
|
||||
}
|
||||
else
|
||||
{
|
||||
AZ_Error("AzTest", false, "Unable to create temp directory %s", workingTempPathBuffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
} // Test
|
||||
} // AZ
|
||||
|
||||
AZ_Error("AzTest", m_tempDirectory[0] != '\0', "Unable to create temp path within directory %s after %d attempts",
|
||||
tempDirectoryRoot.c_str(), MaxAttempts);
|
||||
}
|
||||
} // AZ::Test
|
||||
|
||||
+18
-2
@@ -226,7 +226,15 @@ namespace AzToolsFramework
|
||||
AZ::EntityId EditorEntityContextComponent::CreateNewEditorEntity(const char* name)
|
||||
{
|
||||
AZ::Entity* entity = CreateEntity(name);
|
||||
FinalizeEditorEntity(entity);
|
||||
AZ_Assert(entity != nullptr, "Entity with name %s couldn't be created.", name);
|
||||
if (m_isLegacySliceService)
|
||||
{
|
||||
FinalizeEditorEntity(entity);
|
||||
}
|
||||
else
|
||||
{
|
||||
EditorEntityContextNotificationBus::Broadcast(&EditorEntityContextNotification::OnEditorEntityCreated, entity->GetId());
|
||||
}
|
||||
return entity->GetId();
|
||||
}
|
||||
|
||||
@@ -253,8 +261,16 @@ namespace AzToolsFramework
|
||||
return AZ::EntityId();
|
||||
}
|
||||
entity = aznew AZ::Entity(entityId, name);
|
||||
AZ_Assert(entity != nullptr, "Entity with name %s couldn't be created.", name);
|
||||
AddEntity(entity);
|
||||
FinalizeEditorEntity(entity);
|
||||
if (m_isLegacySliceService)
|
||||
{
|
||||
FinalizeEditorEntity(entity);
|
||||
}
|
||||
else
|
||||
{
|
||||
EditorEntityContextNotificationBus::Broadcast(&EditorEntityContextNotification::OnEditorEntityCreated, entity->GetId());
|
||||
}
|
||||
|
||||
return entity->GetId();
|
||||
}
|
||||
|
||||
@@ -275,7 +275,7 @@ namespace UnitTest
|
||||
QString testString = "0" + QString(testLocale.decimalPoint()) + "9999999";
|
||||
QString value = setupTruncationTest(testString);
|
||||
|
||||
testString = "0" + QString(testLocale.decimalPoint()) + "999";
|
||||
testString = "1" + QString(testLocale.decimalPoint()) + "0";
|
||||
EXPECT_TRUE(value == testString);
|
||||
}
|
||||
|
||||
@@ -295,19 +295,19 @@ namespace UnitTest
|
||||
QString testString = "0" + QString(testLocale.decimalPoint()) + "12395";
|
||||
QString value = setupTruncationTest(testString);
|
||||
|
||||
testString = "0" + QString(testLocale.decimalPoint()) + "123";
|
||||
testString = "0" + QString(testLocale.decimalPoint()) + "124";
|
||||
EXPECT_TRUE(value == testString);
|
||||
|
||||
testString = "0" + QString(testLocale.decimalPoint()) + "94496";
|
||||
value = setupTruncationTest(testString);
|
||||
|
||||
testString = "0" + QString(testLocale.decimalPoint()) + "944";
|
||||
testString = "0" + QString(testLocale.decimalPoint()) + "945";
|
||||
EXPECT_TRUE(value == testString);
|
||||
|
||||
testString = "0" + QString(testLocale.decimalPoint()) + "0009999";
|
||||
value = setupTruncationTest(testString);
|
||||
|
||||
testString = "0" + QString(testLocale.decimalPoint()) + "0";
|
||||
testString = "0" + QString(testLocale.decimalPoint()) + "001";
|
||||
EXPECT_TRUE(value == testString);
|
||||
}
|
||||
|
||||
|
||||
@@ -229,33 +229,65 @@ namespace O3DELauncher
|
||||
|
||||
void CreateRemoteFileIO();
|
||||
|
||||
bool ConnectToAssetProcessor()
|
||||
// This function make sure the launcher has signaled the "CriticalAssetsCompiled"
|
||||
// lifecycle event as well as to load the "assetcatalog.xml" file if it exists
|
||||
void CompileCriticalAssets()
|
||||
{
|
||||
bool connectedToAssetProcessor{};
|
||||
// When the AssetProcessor is already launched it should take less than a second to perform a connection
|
||||
// but when the AssetProcessor needs to be launch it could take up to 15 seconds to have the AssetProcessor initialize
|
||||
// and able to negotiate a connection when running a debug build
|
||||
// and to negotiate a connection
|
||||
// Setting the connectTimeout to 3 seconds if not set within the settings registry
|
||||
|
||||
AzFramework::AssetSystem::ConnectionSettings connectionSettings;
|
||||
AzFramework::AssetSystem::ReadConnectionSettingsFromSettingsRegistry(connectionSettings);
|
||||
|
||||
connectionSettings.m_launchAssetProcessorOnFailedConnection = true;
|
||||
connectionSettings.m_connectionIdentifier = AzFramework::AssetSystem::ConnectionIdentifiers::Game;
|
||||
connectionSettings.m_loggingCallback = []([[maybe_unused]] AZStd::string_view logData)
|
||||
if (auto settingsRegistry = AZ::SettingsRegistry::Get(); settingsRegistry != nullptr)
|
||||
{
|
||||
AZ_TracePrintf("Launcher", "%.*s", aznumeric_cast<int>(logData.size()), logData.data());
|
||||
};
|
||||
AZ::ComponentApplicationLifecycle::SignalEvent(*settingsRegistry, "CriticalAssetsCompiled", R"({})");
|
||||
// Reload the assetcatalog.xml at this point again
|
||||
// Start Monitoring Asset changes over the network and load the AssetCatalog
|
||||
auto LoadCatalog = [settingsRegistry](AZ::Data::AssetCatalogRequests* assetCatalogRequests)
|
||||
{
|
||||
if (AZ::IO::FixedMaxPath assetCatalogPath;
|
||||
settingsRegistry->Get(assetCatalogPath.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_CacheRootFolder))
|
||||
{
|
||||
assetCatalogPath /= "assetcatalog.xml";
|
||||
assetCatalogRequests->LoadCatalog(assetCatalogPath.c_str());
|
||||
}
|
||||
};
|
||||
AZ::Data::AssetCatalogRequestBus::Broadcast(AZStd::move(LoadCatalog));
|
||||
}
|
||||
}
|
||||
|
||||
AzFramework::AssetSystemRequestBus::BroadcastResult(connectedToAssetProcessor, &AzFramework::AssetSystemRequestBus::Events::EstablishAssetProcessorConnection, connectionSettings);
|
||||
|
||||
if (connectedToAssetProcessor)
|
||||
// If the connect option is false, this function will return true
|
||||
// to make sure the Launcher passes the connected to AP check
|
||||
// If REMOTE_ASSET_PROCESSOR is not defined, then the launcher doesn't need
|
||||
// to connect to the AssetProcessor and therefore this function returns true
|
||||
bool ConnectToAssetProcessor([[maybe_unused]] bool connect)
|
||||
{
|
||||
bool connectedToAssetProcessor = true;
|
||||
#if defined(REMOTE_ASSET_PROCESSOR)
|
||||
if (connect)
|
||||
{
|
||||
AZ_TracePrintf("Launcher", "Connected to Asset Processor\n");
|
||||
CreateRemoteFileIO();
|
||||
// When the AssetProcessor is already launched it should take less than a second to perform a connection
|
||||
// but when the AssetProcessor needs to be launch it could take up to 15 seconds to have the AssetProcessor initialize
|
||||
// and able to negotiate a connection when running a debug build
|
||||
// and to negotiate a connection
|
||||
// Setting the connectTimeout to 3 seconds if not set within the settings registry
|
||||
|
||||
AzFramework::AssetSystem::ConnectionSettings connectionSettings;
|
||||
AzFramework::AssetSystem::ReadConnectionSettingsFromSettingsRegistry(connectionSettings);
|
||||
|
||||
connectionSettings.m_launchAssetProcessorOnFailedConnection = true;
|
||||
connectionSettings.m_connectionIdentifier = AzFramework::AssetSystem::ConnectionIdentifiers::Game;
|
||||
connectionSettings.m_loggingCallback = []([[maybe_unused]] AZStd::string_view logData)
|
||||
{
|
||||
AZ_TracePrintf("Launcher", "%.*s", aznumeric_cast<int>(logData.size()), logData.data());
|
||||
};
|
||||
|
||||
AzFramework::AssetSystemRequestBus::BroadcastResult(connectedToAssetProcessor, &AzFramework::AssetSystemRequestBus::Events::EstablishAssetProcessorConnection, connectionSettings);
|
||||
|
||||
if (connectedToAssetProcessor)
|
||||
{
|
||||
AZ_TracePrintf("Launcher", "Connected to Asset Processor\n");
|
||||
CreateRemoteFileIO();
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
CompileCriticalAssets();
|
||||
return connectedToAssetProcessor;
|
||||
}
|
||||
|
||||
@@ -403,25 +435,21 @@ namespace O3DELauncher
|
||||
|
||||
gameApplication.Start({}, gameApplicationStartupParams);
|
||||
|
||||
#if defined(REMOTE_ASSET_PROCESSOR)
|
||||
bool allowedEngineConnection = !systemInitParams.bToolMode && !systemInitParams.bTestMode && bg_ConnectToAssetProcessor;
|
||||
|
||||
//connect to the asset processor using the bootstrap values
|
||||
if (allowedEngineConnection)
|
||||
const bool allowedEngineConnection = !systemInitParams.bToolMode && !systemInitParams.bTestMode && bg_ConnectToAssetProcessor;
|
||||
if (!ConnectToAssetProcessor(allowedEngineConnection))
|
||||
{
|
||||
if (!ConnectToAssetProcessor())
|
||||
AZ::s64 waitForConnect{};
|
||||
AZ::SettingsRegistryMergeUtils::PlatformGet(*settingsRegistry, waitForConnect,
|
||||
AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey, "wait_for_connect");
|
||||
if (waitForConnect != 0)
|
||||
{
|
||||
AZ::s64 waitForConnect{};
|
||||
AZ::SettingsRegistryMergeUtils::PlatformGet(*settingsRegistry, waitForConnect,
|
||||
AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey, "wait_for_connect");
|
||||
if (waitForConnect != 0)
|
||||
{
|
||||
AZ_Error("Launcher", false, "Failed to connect to AssetProcessor.");
|
||||
return ReturnCode::ErrAssetProccessor;
|
||||
}
|
||||
AZ_Error("Launcher", false, "Failed to connect to AssetProcessor.");
|
||||
return ReturnCode::ErrAssetProccessor;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
AZ_Assert(AZ::AllocatorInstance<AZ::SystemAllocator>::IsReady(), "System allocator was not created or creation failed.");
|
||||
//Initialize the Debug trace instance to create necessary environment variables
|
||||
AZ::Debug::Trace::Instance().Init();
|
||||
|
||||
@@ -25,7 +25,7 @@ static bool IsSubfolder(const QString& folderA, const QString& folderB)
|
||||
using AZStd::begin;
|
||||
using AZStd::end;
|
||||
|
||||
constexpr auto isSlash = [](const QChar c) constexpr
|
||||
auto isSlash = [](const QChar c) constexpr
|
||||
{
|
||||
return c == AZ::IO::WindowsPathSeparator || c == AZ::IO::PosixPathSeparator;
|
||||
};
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
@echo off
|
||||
|
||||
REM
|
||||
REM Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
REM For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
REM
|
||||
REM SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
REM
|
||||
REM
|
||||
|
||||
PUSHD "%~dp0"
|
||||
|
||||
SET CWD="%~dp0"
|
||||
SET EXEPATH141="../../../../Bin64vc141/PythonBindingsExample.exe"
|
||||
SET EXEPATH142="../../../../Bin64vc142/PythonBindingsExample.exe"
|
||||
SET EXEPATH=""
|
||||
|
||||
IF EXIST %EXEPATH141% (
|
||||
SET EXEPATH=%EXEPATH141%
|
||||
) ELSE (
|
||||
IF EXIST %EXEPATH142% (
|
||||
SET EXEPATH=%EXEPATH142%
|
||||
) ELSE (
|
||||
ECHO PythonBindingsExample.exe not found.
|
||||
)
|
||||
)
|
||||
IF /I %EXEPATH% EQU "" (
|
||||
ECHO [FAILED] Could not run tests since a build of PythonBindingsExample.exe is missing
|
||||
GOTO exit_app
|
||||
)
|
||||
|
||||
ECHO Testing basics of tool Python bindings in %CWD%
|
||||
|
||||
%EXEPATH% --file test_hello_tool.py
|
||||
IF %ERRORLEVEL% EQU 0 (
|
||||
ECHO [WORKED] test_hello_tool.py
|
||||
) ELSE (
|
||||
ECHO [FAILED] test_hello_tool.py with %ERRORLEVEL%
|
||||
GOTO exit_app
|
||||
)
|
||||
|
||||
%EXEPATH% --file test_framework.py --arg entity
|
||||
IF %ERRORLEVEL% EQU 0 (
|
||||
ECHO [WORKED] test_framework.py --arg entity
|
||||
) ELSE (
|
||||
ECHO [FAILED] test_framework.py --arg entity with %ERRORLEVEL%
|
||||
GOTO exit_app
|
||||
)
|
||||
|
||||
%EXEPATH% --file test_framework.py --arg math
|
||||
IF %ERRORLEVEL% EQU 0 (
|
||||
ECHO [WORKED] test_framework.py --arg math
|
||||
) ELSE (
|
||||
ECHO [FAILED] test_framework.py --arg math with %ERRORLEVEL%
|
||||
GOTO exit_app
|
||||
)
|
||||
|
||||
:exit_app
|
||||
POPD
|
||||
@@ -79,10 +79,6 @@ namespace AZ
|
||||
return false;
|
||||
}
|
||||
|
||||
// Load the asset catalog so that we can find any nested assets successfully. We also need to tick the tick bus
|
||||
// so that the OnCatalogLoaded event gets processed now, instead of during application shutdown.
|
||||
application.Tick();
|
||||
|
||||
AZStd::string logggingScratchBuffer;
|
||||
SetupLogging(logggingScratchBuffer, convertSettings.m_reporting, *commandLine);
|
||||
|
||||
|
||||
@@ -72,12 +72,11 @@ namespace AWSCoreUnitTest
|
||||
AWSCore::RequestBuilder requestBuilder{};
|
||||
EXPECT_TRUE(request.parameters.BuildRequest(requestBuilder));
|
||||
std::shared_ptr<Aws::StringStream> bodyContent = requestBuilder.GetBodyContent();
|
||||
EXPECT_TRUE(bodyContent != nullptr);
|
||||
EXPECT_NE(nullptr, bodyContent);
|
||||
|
||||
AZStd::string bodyString;
|
||||
std::istreambuf_iterator<AZStd::string::value_type> eos;
|
||||
bodyString = AZStd::string{ std::istreambuf_iterator<AZStd::string::value_type>(*bodyContent), eos };
|
||||
AZ_Printf("AWSAttributionServiceApiTest", bodyString.c_str());
|
||||
EXPECT_TRUE(bodyString.find(AZStd::string::format("{\"%s\":\"1.1\"", AwsAttributionAttributeKeyVersion)) != AZStd::string::npos);
|
||||
AZStd::string bodyString{ std::istreambuf_iterator<AZStd::string::value_type>(*bodyContent), eos };
|
||||
AZ_Printf("AWSAttributionServiceApiTest", "%s", bodyString.c_str());
|
||||
EXPECT_TRUE(bodyString.contains(AZStd::string::format("{\"%s\":\"1.1\"", AwsAttributionAttributeKeyVersion)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,11 +100,10 @@ namespace AWSMetrics
|
||||
AWSCore::RequestBuilder requestBuilder{};
|
||||
EXPECT_TRUE(request.parameters.BuildRequest(requestBuilder));
|
||||
std::shared_ptr<Aws::StringStream> bodyContent = requestBuilder.GetBodyContent();
|
||||
EXPECT_TRUE(bodyContent != nullptr);
|
||||
ASSERT_NE(nullptr, bodyContent);
|
||||
|
||||
AZStd::string bodyString;
|
||||
std::istreambuf_iterator<AZStd::string::value_type> eos;
|
||||
bodyString = AZStd::string{ std::istreambuf_iterator<AZStd::string::value_type>(*bodyContent), eos };
|
||||
EXPECT_TRUE(bodyString.find(AZStd::string::format("{\"%s\":[{\"event_timestamp\":", AwsMetricsRequestParameterKeyEvents)) != AZStd::string::npos);
|
||||
AZStd::string bodyString{ std::istreambuf_iterator<AZStd::string::value_type>(*bodyContent), eos };
|
||||
EXPECT_TRUE(bodyString.contains(AZStd::string::format("{\"%s\":[{\"event_timestamp\":", AwsMetricsRequestParameterKeyEvents)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,7 +155,7 @@ namespace AZ
|
||||
{
|
||||
Initialize();
|
||||
},
|
||||
"LegacySystemInterfaceCreated");
|
||||
"CriticalAssetsCompiled");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -34,8 +34,7 @@ namespace AZ
|
||||
RPISystemInterface() = default;
|
||||
virtual ~RPISystemInterface() = default;
|
||||
|
||||
//! Pre-load some system assets. This should be called once the asset catalog is ready and before create any RPI instances.
|
||||
//! Note: can't rely on the AzFramework::AssetCatalogEventBus's OnCatalogLoaded since the order of calling handlers is undefined.
|
||||
//! Pre-load some system assets. This should be called once Critical Asset have compiled ready and before create any RPI instances.
|
||||
virtual void InitializeSystemAssets() = 0;
|
||||
|
||||
//! Was the RPI system initialized properly
|
||||
|
||||
@@ -141,6 +141,7 @@ namespace AZ
|
||||
void DynamicDrawContext::InitVertexFormat(const AZStd::vector<VertexChannel>& vertexChannels)
|
||||
{
|
||||
AZ_Assert(!m_initialized, "Can't call InitVertexFormat after context was initialized (EndInit was called)");
|
||||
AZ_Assert(m_pipelineState, "Can't call InitVertexFormat before InitShader is called with a valid shader");
|
||||
|
||||
m_perVertexDataSize = 0;
|
||||
RHI::InputStreamLayoutBuilder layoutBuilder;
|
||||
@@ -150,7 +151,10 @@ namespace AZ
|
||||
bufferBuilder->Channel(channel.m_channel, channel.m_format);
|
||||
m_perVertexDataSize += RHI::GetFormatSize(channel.m_format);
|
||||
}
|
||||
m_pipelineState->InputStreamLayout() = layoutBuilder.End();
|
||||
if (m_pipelineState)
|
||||
{
|
||||
m_pipelineState->InputStreamLayout() = layoutBuilder.End();
|
||||
}
|
||||
}
|
||||
|
||||
void DynamicDrawContext::InitDrawListTag(RHI::DrawListTag drawListTag)
|
||||
|
||||
+17
-2
@@ -12,6 +12,7 @@
|
||||
#include <AtomToolsFramework/Window/AtomToolsMainWindowFactoryRequestBus.h>
|
||||
#include <AtomToolsFramework/Window/AtomToolsMainWindowRequestBus.h>
|
||||
|
||||
#include <AzCore/Component/ComponentApplicationLifecycle.h>
|
||||
#include <AzCore/IO/Path/Path.h>
|
||||
#include <AzCore/Settings/SettingsRegistryMergeUtils.h>
|
||||
#include <AzCore/Utils/Utils.h>
|
||||
@@ -295,10 +296,24 @@ namespace AtomToolsFramework
|
||||
QMessageBox::critical(
|
||||
activeWindow(), QString("Failed to compile critical assets"),
|
||||
QString("Failed to compile the following critical assets:\n%1\n%2")
|
||||
.arg(failedAssets.join(",\n"))
|
||||
.arg("Make sure this is an Atom project."));
|
||||
.arg(failedAssets.join(",\n"))
|
||||
.arg("Make sure this is an Atom project."));
|
||||
ExitMainLoop();
|
||||
}
|
||||
|
||||
AZ::ComponentApplicationLifecycle::SignalEvent(*m_settingsRegistry, "CriticalAssetsCompiled", R"({})");
|
||||
// Reload the assetcatalog.xml at this point again
|
||||
// Start Monitoring Asset changes over the network and load the AssetCatalog
|
||||
auto LoadCatalog = [settingsRegistry = m_settingsRegistry.get()](AZ::Data::AssetCatalogRequests* assetCatalogRequests)
|
||||
{
|
||||
if (AZ::IO::FixedMaxPath assetCatalogPath;
|
||||
settingsRegistry->Get(assetCatalogPath.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_CacheRootFolder))
|
||||
{
|
||||
assetCatalogPath /= "assetcatalog.xml";
|
||||
assetCatalogRequests->LoadCatalog(assetCatalogPath.c_str());
|
||||
}
|
||||
};
|
||||
AZ::Data::AssetCatalogRequestBus::Broadcast(AZStd::move(LoadCatalog));
|
||||
}
|
||||
|
||||
void AtomToolsApplication::SaveSettings()
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
#include <AzCore/Serialization/SerializeContext.h>
|
||||
#include <AzFramework/Asset/AssetSystemBus.h>
|
||||
#include <AzFramework/IO/LocalFileIO.h>
|
||||
#include <AzFramework/StringFunc/StringFunc.h>
|
||||
#include <AzCore/StringFunc/StringFunc.h>
|
||||
#include <AzToolsFramework/API/EditorAssetSystemAPI.h>
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserEntry.h>
|
||||
#include <Viewport/MaterialViewportComponent.h>
|
||||
@@ -165,12 +165,12 @@ namespace MaterialEditor
|
||||
// AssetCatalogRequestBus::EnumerateAssets can lead to deadlocked)
|
||||
AZ::Data::AssetCatalogRequests::AssetEnumerationCB enumerateCB = [this]([[maybe_unused]] const AZ::Data::AssetId id, const AZ::Data::AssetInfo& info)
|
||||
{
|
||||
if (AzFramework::StringFunc::EndsWith(info.m_relativePath.c_str(), ".lightingpreset.azasset"))
|
||||
if (AZ::StringFunc::EndsWith(info.m_relativePath.c_str(), ".lightingpreset.azasset"))
|
||||
{
|
||||
m_lightingPresetAssets[info.m_assetId] = { info.m_assetId, info.m_assetType };
|
||||
AZ::Data::AssetBus::MultiHandler::BusConnect(info.m_assetId);
|
||||
}
|
||||
else if (AzFramework::StringFunc::EndsWith(info.m_relativePath.c_str(), ".modelpreset.azasset"))
|
||||
else if (AZ::StringFunc::EndsWith(info.m_relativePath.c_str(), ".modelpreset.azasset"))
|
||||
{
|
||||
m_modelPresetAssets[info.m_assetId] = { info.m_assetId, info.m_assetType };
|
||||
AZ::Data::AssetBus::MultiHandler::BusConnect(info.m_assetId);
|
||||
@@ -429,4 +429,51 @@ namespace MaterialEditor
|
||||
ReloadContent();
|
||||
});
|
||||
}
|
||||
|
||||
void MaterialViewportComponent::OnCatalogAssetChanged(const AZ::Data::AssetId& assetId)
|
||||
{
|
||||
auto ReloadLightingAndModelPresets = [this, &assetId](AZ::Data::AssetCatalogRequests* assetCatalogRequests)
|
||||
{
|
||||
AZ::Data::AssetInfo assetInfo = assetCatalogRequests->GetAssetInfoById(assetId);
|
||||
AZ::Data::Asset<AZ::RPI::AnyAsset>* modifiedPresetAsset{};
|
||||
if (AZ::StringFunc::EndsWith(assetInfo.m_relativePath.c_str(), ".lightingpreset.azasset"))
|
||||
{
|
||||
m_lightingPresetAssets[assetInfo.m_assetId] = { assetInfo.m_assetId, assetInfo.m_assetType };
|
||||
AZ::Data::AssetBus::MultiHandler::BusConnect(assetInfo.m_assetId);
|
||||
modifiedPresetAsset = &m_lightingPresetAssets[assetInfo.m_assetId];
|
||||
}
|
||||
else if (AzFramework::StringFunc::EndsWith(assetInfo.m_relativePath.c_str(), ".modelpreset.azasset"))
|
||||
{
|
||||
m_modelPresetAssets[assetInfo.m_assetId] = { assetInfo.m_assetId, assetInfo.m_assetType };
|
||||
AZ::Data::AssetBus::MultiHandler::BusConnect(assetInfo.m_assetId);
|
||||
modifiedPresetAsset = &m_modelPresetAssets[assetInfo.m_assetId];
|
||||
}
|
||||
|
||||
// Queue a load on the changed asset
|
||||
if (modifiedPresetAsset != nullptr)
|
||||
{
|
||||
modifiedPresetAsset->QueueLoad();
|
||||
}
|
||||
};
|
||||
AZ::Data::AssetCatalogRequestBus::Broadcast(AZStd::move(ReloadLightingAndModelPresets));
|
||||
}
|
||||
|
||||
void MaterialViewportComponent::OnCatalogAssetAdded(const AZ::Data::AssetId& assetId)
|
||||
{
|
||||
OnCatalogAssetChanged(assetId);
|
||||
}
|
||||
|
||||
void MaterialViewportComponent::OnCatalogAssetRemoved(const AZ::Data::AssetId& assetId, const AZ::Data::AssetInfo& assetInfo)
|
||||
{
|
||||
if (AZ::StringFunc::EndsWith(assetInfo.m_relativePath.c_str(), ".lightingpreset.azasset"))
|
||||
{
|
||||
AZ::Data::AssetBus::MultiHandler::BusDisconnect(assetInfo.m_assetId);
|
||||
m_lightingPresetAssets.erase(assetId);
|
||||
}
|
||||
if (AZ::StringFunc::EndsWith(assetInfo.m_relativePath.c_str(), ".modelpreset.azasset"))
|
||||
{
|
||||
AZ::Data::AssetBus::MultiHandler::BusDisconnect(assetInfo.m_assetId);
|
||||
m_modelPresetAssets.erase(assetId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,6 +95,9 @@ namespace MaterialEditor
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// AzFramework::AssetCatalogEventBus::Handler overrides ...
|
||||
void OnCatalogLoaded(const char* catalogFile) override;
|
||||
void OnCatalogAssetChanged(const AZ::Data::AssetId& assetId) override;
|
||||
void OnCatalogAssetAdded(const AZ::Data::AssetId& assetId) override;
|
||||
void OnCatalogAssetRemoved(const AZ::Data::AssetId& assetId, const AZ::Data::AssetInfo& assetInfo) override;
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
AZStd::unordered_map<AZ::Data::AssetId, AZ::Data::Asset<AZ::RPI::AnyAsset>> m_lightingPresetAssets;
|
||||
|
||||
+11
-9
@@ -6,6 +6,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <AzCore/Component/ComponentApplicationLifecycle.h>
|
||||
#include <AzCore/Serialization/EditContext.h>
|
||||
#include <AzCore/Serialization/EditContextConstants.inl>
|
||||
#include <AzCore/Serialization/SerializeContext.h>
|
||||
@@ -88,14 +89,22 @@ namespace AZ
|
||||
|
||||
AzToolsFramework::EditorLevelNotificationBus::Handler::BusConnect();
|
||||
AzToolsFramework::AssetBrowser::PreviewerRequestBus::Handler::BusConnect();
|
||||
AzFramework::AssetCatalogEventBus::Handler::BusConnect();
|
||||
if (auto settingsRegistry{ AZ::SettingsRegistry::Get() }; settingsRegistry != nullptr)
|
||||
{
|
||||
auto LifecycleCallback = [this](AZStd::string_view, AZ::SettingsRegistryInterface::Type)
|
||||
{
|
||||
SetupThumbnails();
|
||||
};
|
||||
AZ::ComponentApplicationLifecycle::RegisterHandler(*settingsRegistry, m_criticalAssetsHandler,
|
||||
AZStd::move(LifecycleCallback), "CriticalAssetsCompiled");
|
||||
}
|
||||
AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusConnect();
|
||||
}
|
||||
|
||||
void EditorCommonFeaturesSystemComponent::Deactivate()
|
||||
{
|
||||
AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusDisconnect();
|
||||
AzFramework::AssetCatalogEventBus::Handler::BusDisconnect();
|
||||
m_criticalAssetsHandler = {};
|
||||
AzToolsFramework::EditorLevelNotificationBus::Handler::BusDisconnect();
|
||||
AzToolsFramework::AssetBrowser::PreviewerRequestBus::Handler::BusDisconnect();
|
||||
|
||||
@@ -192,13 +201,6 @@ namespace AZ
|
||||
}
|
||||
}
|
||||
|
||||
void EditorCommonFeaturesSystemComponent::OnCatalogLoaded([[maybe_unused]] const char* catalogFile)
|
||||
{
|
||||
AZ::TickBus::QueueFunction([this](){
|
||||
SetupThumbnails();
|
||||
});
|
||||
}
|
||||
|
||||
const AzToolsFramework::AssetBrowser::PreviewerFactory* EditorCommonFeaturesSystemComponent::GetPreviewerFactory(
|
||||
const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) const
|
||||
{
|
||||
|
||||
+1
-4
@@ -28,7 +28,6 @@ namespace AZ
|
||||
, public AzToolsFramework::EditorLevelNotificationBus::Handler
|
||||
, public AzToolsFramework::SliceEditorEntityOwnershipServiceNotificationBus::Handler
|
||||
, public AzToolsFramework::AssetBrowser::PreviewerRequestBus::Handler
|
||||
, public AzFramework::AssetCatalogEventBus::Handler
|
||||
, public AzFramework::ApplicationLifecycleEvents::Bus::Handler
|
||||
{
|
||||
public:
|
||||
@@ -58,9 +57,6 @@ namespace AZ
|
||||
const AZ::Data::AssetId&, AZ::SliceComponent::SliceInstanceAddress&, const AzFramework::SliceInstantiationTicket&) override;
|
||||
void OnSliceInstantiationFailed(const AZ::Data::AssetId&, const AzFramework::SliceInstantiationTicket&) override;
|
||||
|
||||
// AzFramework::AssetCatalogEventBus::Handler overrides ...
|
||||
void OnCatalogLoaded(const char* catalogFile) override;
|
||||
|
||||
// AzToolsFramework::AssetBrowser::PreviewerRequestBus::Handler overrides...
|
||||
const AzToolsFramework::AssetBrowser::PreviewerFactory* GetPreviewerFactory(
|
||||
const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) const override;
|
||||
@@ -80,6 +76,7 @@ namespace AZ
|
||||
|
||||
AZStd::unique_ptr<AZ::LyIntegration::SharedThumbnailRenderer> m_thumbnailRenderer;
|
||||
AZStd::unique_ptr<LyIntegration::SharedPreviewerFactory> m_previewerFactory;
|
||||
AZ::SettingsRegistryInterface::NotifyEventHandler m_criticalAssetsHandler;
|
||||
};
|
||||
} // namespace Render
|
||||
} // namespace AZ
|
||||
|
||||
@@ -49,7 +49,7 @@ namespace EMotionFX
|
||||
for (int i = 0; i < params.m_numStates; ++i)
|
||||
{
|
||||
AnimGraphNode* state = aznew AnimGraphMotionNode();
|
||||
state->SetName(AZStd::string(1, startChar + i).c_str());
|
||||
state->SetName(AZStd::string(1, static_cast<char>(startChar + i)).c_str());
|
||||
m_rootStateMachine->AddChildNode(state);
|
||||
AddTransitionWithTimeCondition(prevState, state, /*blendTime*/params.m_transitionBlendTime, /*countDownTime*/params.m_conditionCountDownTime);
|
||||
prevState = state;
|
||||
|
||||
@@ -90,7 +90,7 @@ namespace EMotionFX
|
||||
for (int i = 0; i < param.m_numStates; ++i)
|
||||
{
|
||||
AnimGraphBindPoseNode* state = aznew AnimGraphBindPoseNode();
|
||||
state->SetName(AZStd::string(1, startChar + i).c_str());
|
||||
state->SetName(AZStd::string(1, static_cast<char>(startChar + i)).c_str());
|
||||
m_rootStateMachine->AddChildNode(state);
|
||||
AddTransitionWithTimeCondition(prevState, state, /*blendTime*/param.m_blendTime, /*countDownTime*/param.m_countDownTime);
|
||||
prevState = state;
|
||||
|
||||
@@ -121,75 +121,4 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS)
|
||||
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
# Tests
|
||||
################################################################################
|
||||
if(PAL_TRAIT_BUILD_TESTS_SUPPORTED)
|
||||
ly_add_target(
|
||||
NAME LmbrCentral.Mocks HEADERONLY
|
||||
NAMESPACE Gem
|
||||
FILES_CMAKE
|
||||
lmbrcentral_mocks_files.cmake
|
||||
INCLUDE_DIRECTORIES
|
||||
INTERFACE
|
||||
Mocks
|
||||
)
|
||||
|
||||
ly_add_target(
|
||||
NAME LmbrCentral.Tests ${PAL_TRAIT_TEST_TARGET_TYPE}
|
||||
NAMESPACE Gem
|
||||
FILES_CMAKE
|
||||
lmbrcentral_tests_files.cmake
|
||||
lmbrcentral_shared_files.cmake
|
||||
INCLUDE_DIRECTORIES
|
||||
PRIVATE
|
||||
Source
|
||||
Tests
|
||||
BUILD_DEPENDENCIES
|
||||
PRIVATE
|
||||
AZ::AzTest
|
||||
AZ::AzTestShared
|
||||
Legacy::CryCommon
|
||||
AZ::AzFramework
|
||||
Gem::LmbrCentral.Static
|
||||
Gem::LmbrCentral.Mocks
|
||||
)
|
||||
ly_add_googletest(
|
||||
NAME Gem::LmbrCentral.Tests
|
||||
)
|
||||
|
||||
if (PAL_TRAIT_BUILD_HOST_TOOLS)
|
||||
ly_add_target(
|
||||
NAME LmbrCentral.Editor.Tests ${PAL_TRAIT_TEST_TARGET_TYPE}
|
||||
NAMESPACE Gem
|
||||
FILES_CMAKE
|
||||
lmbrcentral_editor_tests_files.cmake
|
||||
INCLUDE_DIRECTORIES
|
||||
PRIVATE
|
||||
.
|
||||
Source
|
||||
Tests
|
||||
COMPILE_DEFINITIONS
|
||||
PRIVATE
|
||||
LMBR_CENTRAL_EDITOR
|
||||
BUILD_DEPENDENCIES
|
||||
PRIVATE
|
||||
3rdParty::Qt::Gui
|
||||
3rdParty::Qt::Widgets
|
||||
Legacy::CryCommon
|
||||
Legacy::Editor.Headers
|
||||
AZ::AzTest
|
||||
AZ::AzCore
|
||||
AZ::AzTestShared
|
||||
AZ::AzToolsFramework
|
||||
AZ::AzToolsFrameworkTestCommon
|
||||
AZ::AssetBuilderSDK
|
||||
AZ::AzManipulatorTestFramework.Static
|
||||
Gem::LmbrCentral.Static
|
||||
Gem::LmbrCentral.Editor.Static
|
||||
)
|
||||
ly_add_googletest(
|
||||
NAME Gem::LmbrCentral.Editor.Tests
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
add_subdirectory(Tests)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user