diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/largeworlds/CMakeLists.txt
index 72e3bec3df..c7fd43c7b2 100644
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/CMakeLists.txt
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/CMakeLists.txt
@@ -13,22 +13,21 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
## DynVeg ##
- # Temporarily moving all tests to periodic suite - SPEC-6553
- #ly_add_pytest(
- # NAME AutomatedTesting::DynamicVegetationTests_Main
- # TEST_SERIAL
- # TEST_SUITE main
- # PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg
- # PYTEST_MARKS "not SUITE_sandbox and not SUITE_periodic and not SUITE_benchmark"
- # TIMEOUT 1500
- # RUNTIME_DEPENDENCIES
- # AZ::AssetProcessor
- # Legacy::Editor
- # AutomatedTesting.GameLauncher
- # AutomatedTesting.Assets
- # COMPONENT
- # LargeWorlds
- #)
+ ly_add_pytest(
+ NAME AutomatedTesting::DynamicVegetationTests_Main
+ TEST_SERIAL
+ TEST_SUITE main
+ PATH ${CMAKE_CURRENT_LIST_DIR}/dyn_veg
+ PYTEST_MARKS "not SUITE_sandbox and not SUITE_periodic and not SUITE_benchmark"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ Legacy::Editor
+ AutomatedTesting.GameLauncher
+ AutomatedTesting.Assets
+ COMPONENT
+ LargeWorlds
+ )
ly_add_pytest(
@@ -137,21 +136,21 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_
LargeWorlds
)
## LandscapeCanvas ##
- # Temporarily moving all tests to periodic suite - SPEC-6553
- #ly_add_pytest(
- # NAME AutomatedTesting::LandscapeCanvasTests_Main
- # TEST_SERIAL
- # TEST_SUITE main
- # PATH ${CMAKE_CURRENT_LIST_DIR}/largeworlds/landscape_canvas
- # PYTEST_MARKS "not SUITE_sandbox and not SUITE_periodic and not SUITE_benchmark"
- # TIMEOUT 1500
- # RUNTIME_DEPENDENCIES
- # AZ::AssetProcessor
- # Legacy::Editor
- # AutomatedTesting.Assets
- # COMPONENT
- # LargeWorlds
- #)
+
+ ly_add_pytest(
+ NAME AutomatedTesting::LandscapeCanvasTests_Main
+ TEST_SERIAL
+ TEST_SUITE main
+ PATH ${CMAKE_CURRENT_LIST_DIR}/landscape_canvas
+ PYTEST_MARKS "not SUITE_sandbox and not SUITE_periodic and not SUITE_benchmark"
+ TIMEOUT 1500
+ RUNTIME_DEPENDENCIES
+ AZ::AssetProcessor
+ Legacy::Editor
+ AutomatedTesting.Assets
+ COMPONENT
+ LargeWorlds
+ )
ly_add_pytest(
NAME AutomatedTesting::LandscapeCanvasTests_Periodic
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py
index 9898570692..ead1e8779c 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DynamicSliceInstanceSpawner.py
@@ -41,7 +41,7 @@ class TestDynamicSliceInstanceSpawner(object):
return console
@pytest.mark.test_case_id("C28851763")
- @pytest.mark.SUITE_periodic
+ @pytest.mark.SUITE_main
@pytest.mark.dynveg_area
@pytest.mark.parametrize("launcher_platform", ['windows_editor'])
def test_DynamicSliceInstanceSpawner_DynamicSliceSpawnerWorks(self, request, editor, level, workspace, project,
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py
index 7bd8484cf4..ca71cd2137 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_EmptyInstanceSpawner.py
@@ -37,7 +37,7 @@ class TestEmptyInstanceSpawner(object):
file_system.delete([os.path.join(workspace.paths.engine_root(), project, "Levels", level)], True, True)
@pytest.mark.test_case_id("C28851762")
- @pytest.mark.SUITE_periodic
+ @pytest.mark.SUITE_main
@pytest.mark.dynveg_area
def test_EmptyInstanceSpawner_EmptySpawnerWorks(self, request, editor, level, launcher_platform):
cfg_args = [level]
diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GraphComponentSync.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GraphComponentSync.py
index efeba3b74a..855764fa6f 100755
--- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GraphComponentSync.py
+++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/test_GraphComponentSync.py
@@ -118,7 +118,7 @@ class TestGraphComponentSync(object):
@pytest.mark.test_case_id('C15987206')
@pytest.mark.SUITE_main
- def test_LandscapeCanvas_GradientMixerNodeConstruction(self, request, editor, level, launcher_platform):
+ def test_LandscapeCanvas_GradientMixer_NodeConstruction(self, request, editor, level, launcher_platform):
"""
Verifies a Gradient Mixer can be setup in Landscape Canvas and all references are property set.
"""
@@ -141,7 +141,7 @@ class TestGraphComponentSync(object):
@pytest.mark.test_case_id('C21333743')
@pytest.mark.SUITE_periodic
- def test_LandscapeCanvas_LayerBlenderNodeConstruction(self, request, editor, level, launcher_platform):
+ def test_LandscapeCanvas_LayerBlender_NodeConstruction(self, request, editor, level, launcher_platform):
"""
Verifies a Layer Blender can be setup in Landscape Canvas and all references are property set.
"""
diff --git a/Code/Framework/AzAndroid/java/com/amazon/lumberyard/LumberyardActivity.java b/Code/Framework/AzAndroid/java/com/amazon/lumberyard/LumberyardActivity.java
index b5d3de8164..5c1a120df6 100644
--- a/Code/Framework/AzAndroid/java/com/amazon/lumberyard/LumberyardActivity.java
+++ b/Code/Framework/AzAndroid/java/com/amazon/lumberyard/LumberyardActivity.java
@@ -244,7 +244,7 @@ public class LumberyardActivity extends NativeActivity
boolean useMainObb = GetBooleanResource("use_main_obb");
boolean usePatchObb = GetBooleanResource("use_patch_obb");
- if (IsBootstrapInAPK() && (useMainObb || usePatchObb))
+ if (AreAssetsInAPK() && (useMainObb || usePatchObb))
{
Log.d(TAG, "Using OBB expansion files for game assets");
@@ -421,12 +421,12 @@ public class LumberyardActivity extends NativeActivity
}
////////////////////////////////////////////////////////////////
- private boolean IsBootstrapInAPK()
+ private boolean AreAssetsInAPK()
{
try
{
- InputStream bootstrap = getAssets().open("bootstrap.cfg", AssetManager.ACCESS_UNKNOWN);
- bootstrap.close();
+ InputStream engine = getAssets().open("engine.json", AssetManager.ACCESS_UNKNOWN);
+ engine.close();
return true;
}
catch (IOException exception)
diff --git a/Code/Framework/AzCore/AzCore/Android/Utils.cpp b/Code/Framework/AzCore/AzCore/Android/Utils.cpp
index efbbf50d1d..d6435c67be 100644
--- a/Code/Framework/AzCore/AzCore/Android/Utils.cpp
+++ b/Code/Framework/AzCore/AzCore/Android/Utils.cpp
@@ -148,7 +148,7 @@ namespace AZ
}
}
- AZ_Assert(false, "Failed to locate the bootstrap.cfg path");
+ AZ_Assert(false, "Failed to locate the engine.json path");
return nullptr;
}
diff --git a/Code/Framework/AzCore/AzCore/Android/Utils.h b/Code/Framework/AzCore/AzCore/Android/Utils.h
index 222fac80ad..0862d53aa4 100644
--- a/Code/Framework/AzCore/AzCore/Android/Utils.h
+++ b/Code/Framework/AzCore/AzCore/Android/Utils.h
@@ -73,8 +73,8 @@ namespace AZ
//! \return The pointer position of the relative asset path
AZ::IO::FixedMaxPath StripApkPrefix(const char* filePath);
- //! Searches application storage and the APK for bootstrap.cfg. Will return nullptr
- //! if bootstrap.cfg is not found.
+ //! Searches application storage and the APK for engine.json. Will return nullptr
+ //! if engine.json is not found.
const char* FindAssetsDirectory();
//! Calls into Java to show the splash screen on the main UI (Java) thread
diff --git a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp
index 8a170f5d89..f03b1aac76 100644
--- a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp
+++ b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp
@@ -462,8 +462,6 @@ namespace AZ
// for the application root.
CalculateAppRoot();
- // Merge the bootstrap.cfg file into the Settings Registry as soon as the OSAllocator has been created.
- SettingsRegistryMergeUtils::MergeSettingsToRegistry_Bootstrap(*m_settingsRegistry);
SettingsRegistryMergeUtils::MergeSettingsToRegistry_O3deUserRegistry(*m_settingsRegistry, AZ_TRAIT_OS_PLATFORM_CODENAME, {});
SettingsRegistryMergeUtils::MergeSettingsToRegistry_CommandLine(*m_settingsRegistry, m_commandLine, executeRegDumpCommands);
SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*m_settingsRegistry);
diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp
index 82bf1db484..5870c66633 100644
--- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp
+++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp
@@ -494,13 +494,6 @@ namespace AZ::SettingsRegistryMergeUtils
return configFileParsed;
}
- void MergeSettingsToRegistry_Bootstrap(SettingsRegistryInterface& registry)
- {
- ConfigParserSettings parserSettings;
- parserSettings.m_registryRootPointerPath = BootstrapSettingsRootKey;
- MergeSettingsToRegistry_ConfigFile(registry, "bootstrap.cfg", parserSettings);
- }
-
void MergeSettingsToRegistry_AddRuntimeFilePaths(SettingsRegistryInterface& registry)
{
using FixedValueString = AZ::SettingsRegistryInterface::FixedValueString;
diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.h b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.h
index 576066c29f..b482530d24 100644
--- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.h
+++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.h
@@ -172,9 +172,6 @@ namespace AZ::SettingsRegistryMergeUtils
bool MergeSettingsToRegistry_ConfigFile(SettingsRegistryInterface& registry, AZStd::string_view filePath,
const ConfigParserSettings& configParserSettings);
- //! Loads bootstrap.cfg into the Settings Registry. This file does not support specializations.
- void MergeSettingsToRegistry_Bootstrap(SettingsRegistryInterface& registry);
-
//! Extracts file path information from the environment and bootstrap to calculate the various file paths and adds those
//! to the Settings Registry under the FilePathsRootKey.
void MergeSettingsToRegistry_AddRuntimeFilePaths(SettingsRegistryInterface& registry);
diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/TransformSerializerTests.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/TransformSerializerTests.cpp
index e1e9bd237d..7eabd6e5e0 100644
--- a/Code/Framework/AzCore/Tests/Serialization/Json/TransformSerializerTests.cpp
+++ b/Code/Framework/AzCore/Tests/Serialization/Json/TransformSerializerTests.cpp
@@ -112,7 +112,7 @@ namespace JsonSerializationTests
AZ::Transform testTransform = AZ::Transform::CreateIdentity();
AZ::Transform expectedTransform =
AZ::Transform::CreateFromQuaternion(AZ::Quaternion(0.25f, 0.5f, 0.75f, 1.0f));
- expectedTransform.SetScale(AZ::Vector3(5.5f));
+ expectedTransform.SetUniformScale(5.5f);
rapidjson::Document json;
json.Parse(R"({ "Rotation": [ 0.25, 0.5, 0.75, 1.0 ], "Scale": 5.5 })");
@@ -128,7 +128,7 @@ namespace JsonSerializationTests
{
AZ::Transform testTransform = AZ::Transform::CreateIdentity();
AZ::Transform expectedTransform = AZ::Transform::CreateTranslation(AZ::Vector3(2.25f, 3.5f, 4.75f));
- expectedTransform.SetScale(AZ::Vector3(5.5f));
+ expectedTransform.SetUniformScale(5.5f);
rapidjson::Document json;
json.Parse(R"({ "Translation": [ 2.25, 3.5, 4.75 ], "Scale": 5.5 })");
diff --git a/Code/Framework/AzFramework/AzFramework/Application/Application.cpp b/Code/Framework/AzFramework/AzFramework/Application/Application.cpp
index e02892de4e..c65ba373f8 100644
--- a/Code/Framework/AzFramework/AzFramework/Application/Application.cpp
+++ b/Code/Framework/AzFramework/AzFramework/Application/Application.cpp
@@ -679,8 +679,6 @@ namespace AzFramework
{
auto fileIoBase = m_archiveFileIO.get();
// Set up the default file aliases based on the settings registry
- fileIoBase->SetAlias("@assets@", "");
- fileIoBase->SetAlias("@root@", GetEngineRoot());
fileIoBase->SetAlias("@engroot@", GetEngineRoot());
fileIoBase->SetAlias("@projectroot@", GetEngineRoot());
fileIoBase->SetAlias("@exefolder@", GetExecutableFolder());
@@ -694,8 +692,8 @@ namespace AzFramework
pathAliases.clear();
if (m_settingsRegistry->Get(pathAliases.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_CacheRootFolder))
{
- fileIoBase->SetAlias("@projectplatformcache@", pathAliases.c_str());
fileIoBase->SetAlias("@assets@", pathAliases.c_str());
+ fileIoBase->SetAlias("@projectplatformcache@", pathAliases.c_str());
fileIoBase->SetAlias("@root@", pathAliases.c_str()); // Deprecated Use @projectplatformcache@
}
pathAliases.clear();
diff --git a/Code/Framework/AzFramework/AzFramework/ProjectManager/ProjectManager.cpp b/Code/Framework/AzFramework/AzFramework/ProjectManager/ProjectManager.cpp
index bdbfe6197f..2742b90f4c 100644
--- a/Code/Framework/AzFramework/AzFramework/ProjectManager/ProjectManager.cpp
+++ b/Code/Framework/AzFramework/AzFramework/ProjectManager/ProjectManager.cpp
@@ -46,7 +46,6 @@ namespace AzFramework::ProjectManager
// Store the Command line to the Setting Registry
AZ::SettingsRegistryImpl settingsRegistry;
AZ::SettingsRegistryMergeUtils::StoreCommandLineToRegistry(settingsRegistry, commandLine);
- AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_Bootstrap(settingsRegistry);
AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_O3deUserRegistry(settingsRegistry, AZ_TRAIT_OS_PLATFORM_CODENAME, {});
// Retrieve Command Line from Settings Registry, it may have been updated by the call to FindEngineRoot()
// in MergeSettingstoRegistry_ConfigFile
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Local.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Local.svg
new file mode 100644
index 0000000000..2017cabe21
--- /dev/null
+++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Local.svg
@@ -0,0 +1,8 @@
+
+
\ No newline at end of file
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Parent.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Parent.svg
new file mode 100644
index 0000000000..c0b9580985
--- /dev/null
+++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/Parent.svg
@@ -0,0 +1,8 @@
+
+
\ No newline at end of file
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/World.svg b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/World.svg
new file mode 100644
index 0000000000..4d77775e3d
--- /dev/null
+++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/toolbar/World.svg
@@ -0,0 +1,8 @@
+
+
\ No newline at end of file
diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc b/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc
index 8ea4755a24..00fa95d094 100644
--- a/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc
+++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc
@@ -354,6 +354,7 @@
img/UI20/toolbar/Grid.svg
img/UI20/toolbar/Lighting.svg
img/UI20/toolbar/Load.svg
+ img/UI20/toolbar/Local.svg
img/UI20/toolbar/Locked.svg
img/UI20/toolbar/LUA.svg
img/UI20/toolbar/Material.svg
@@ -362,6 +363,7 @@
img/UI20/toolbar/Object_follow_terrain.svg
img/UI20/toolbar/Object_height.svg
img/UI20/toolbar/Object_list.svg
+ img/UI20/toolbar/Parent.svg
img/UI20/toolbar/particle.svg
img/UI20/toolbar/Play.svg
img/UI20/toolbar/Redo.svg
@@ -380,6 +382,7 @@
img/UI20/toolbar/undo.svg
img/UI20/toolbar/Unlocked.svg
img/UI20/toolbar/Vertex_snapping.svg
+ img/UI20/toolbar/World.svg
img/UI20/toolbar/X_axis.svg
img/UI20/toolbar/Y_axis.svg
img/UI20/toolbar/Z_axis.svg
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Maths/TransformUtils.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Maths/TransformUtils.h
index 97add27604..a3cc12566f 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Maths/TransformUtils.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Maths/TransformUtils.h
@@ -23,7 +23,7 @@ namespace AzToolsFramework
inline AZ::Transform TransformNormalizedScale(const AZ::Transform& transform)
{
AZ::Transform transformNormalizedScale = transform;
- transformNormalizedScale.SetScale(AZ::Vector3::CreateOne());
+ transformNormalizedScale.SetUniformScale(1.0f);
return transformNormalizedScale;
}
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp
index 7b4761c39a..2965148172 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp
@@ -41,7 +41,7 @@ namespace AzToolsFramework
[[maybe_unused]] bool result =
settingsRegistry->Get(m_projectPathWithOsSeparator.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_ProjectPath);
- AZ_Assert(result, "Couldn't retrieve project root path");
+ AZ_Warning("Prefab", result, "Couldn't retrieve project root path");
m_projectPathWithSlashSeparator = AZ::IO::Path(m_projectPathWithOsSeparator.Native(), '/').MakePreferred();
AZ::Interface::Register(this);
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp
index 86744ab16d..0edbc4f8b5 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp
@@ -435,7 +435,7 @@ namespace AzToolsFramework
}
}
- static void DestroyTransformModeSelectionCluster(const ViewportUi::ClusterId clusterId)
+ static void DestroyCluster(const ViewportUi::ClusterId clusterId)
{
ViewportUi::ViewportUiRequestBus::Event(
ViewportUi::DefaultViewportId,
@@ -483,6 +483,26 @@ namespace AzToolsFramework
return worldFromLocal.TransformPoint(CalculateCenterOffset(entityId, pivot));
}
+ void EditorTransformComponentSelection::UpdateSpaceCluster(const ReferenceFrame referenceFrame)
+ {
+ auto buttonIdFromFrameFn = [this](const ReferenceFrame referenceFrame) {
+ switch (referenceFrame)
+ {
+ case ReferenceFrame::Local:
+ return m_spaceCluster.m_localButtonId;
+ case ReferenceFrame::Parent:
+ return m_spaceCluster.m_parentButtonId;
+ case ReferenceFrame::World:
+ return m_spaceCluster.m_worldButtonId;
+ }
+ return m_spaceCluster.m_parentButtonId;
+ };
+
+ ViewportUi::ViewportUiRequestBus::Event(
+ ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::SetClusterActiveButton, m_spaceCluster.m_spaceClusterId,
+ buttonIdFromFrameFn(referenceFrame));
+ }
+
namespace ETCS
{
PivotOrientationResult CalculatePivotOrientation(
@@ -789,13 +809,13 @@ namespace AzToolsFramework
EntityIdManipulators& entityIdManipulators,
OptionalFrame& pivotOverrideFrame,
ViewportInteraction::KeyboardModifiers& prevModifiers,
- bool& transformChangedInternally)
+ bool& transformChangedInternally, SpaceCluster spaceCluster)
{
AZ_PROFILE_FUNCTION(AZ::Debug::ProfileCategory::AzToolsFramework);
entityIdManipulators.m_manipulators->SetLocalPosition(action.LocalPosition());
- const ReferenceFrame referenceFrame = ReferenceFrameFromModifiers(action.m_modifiers);
+ const ReferenceFrame referenceFrame = spaceCluster.m_spaceLock ? spaceCluster.m_currentSpace : ReferenceFrameFromModifiers(action.m_modifiers);
if (action.m_modifiers.Ctrl())
{
@@ -1027,6 +1047,7 @@ namespace AzToolsFramework
EditorManipulatorCommandUndoRedoRequestBus::Handler::BusConnect(entityContextId);
CreateTransformModeSelectionCluster();
+ CreateSpaceSelectionCluster();
RegisterActions();
SetupBoxSelect();
RefreshSelectedEntityIdsAndRegenerateManipulators();
@@ -1037,7 +1058,9 @@ namespace AzToolsFramework
m_selectedEntityIds.clear();
DestroyManipulators(m_entityIdManipulators);
- DestroyTransformModeSelectionCluster(m_transformModeClusterId);
+ DestroyCluster(m_transformModeClusterId);
+ DestroyCluster(m_spaceCluster.m_spaceClusterId);
+
UnregisterActions();
m_pivotOverrideFrame.Reset();
@@ -1274,8 +1297,8 @@ namespace AzToolsFramework
[this, prevModifiers, manipulatorEntityIds](const LinearManipulator::Action& action) mutable -> void
{
UpdateTranslationManipulator(
- action, manipulatorEntityIds->m_entityIds, m_entityIdManipulators,
- m_pivotOverrideFrame, prevModifiers, m_transformChangedInternally);
+ action, manipulatorEntityIds->m_entityIds, m_entityIdManipulators, m_pivotOverrideFrame, prevModifiers,
+ m_transformChangedInternally, m_spaceCluster);
});
translationManipulators->InstallLinearManipulatorMouseUpCallback(
@@ -1305,8 +1328,8 @@ namespace AzToolsFramework
[this, prevModifiers, manipulatorEntityIds](const PlanarManipulator::Action& action) mutable -> void
{
UpdateTranslationManipulator(
- action, manipulatorEntityIds->m_entityIds, m_entityIdManipulators,
- m_pivotOverrideFrame, prevModifiers, m_transformChangedInternally);
+ action, manipulatorEntityIds->m_entityIds, m_entityIdManipulators, m_pivotOverrideFrame, prevModifiers,
+ m_transformChangedInternally, m_spaceCluster);
});
translationManipulators->InstallPlanarManipulatorMouseUpCallback(
@@ -1335,8 +1358,8 @@ namespace AzToolsFramework
[this, prevModifiers, manipulatorEntityIds](const SurfaceManipulator::Action& action) mutable -> void
{
UpdateTranslationManipulator(
- action, manipulatorEntityIds->m_entityIds, m_entityIdManipulators,
- m_pivotOverrideFrame, prevModifiers, m_transformChangedInternally);
+ action, manipulatorEntityIds->m_entityIds, m_entityIdManipulators, m_pivotOverrideFrame, prevModifiers,
+ m_transformChangedInternally, m_spaceCluster);
});
translationManipulators->InstallSurfaceManipulatorMouseUpCallback(
@@ -1414,7 +1437,7 @@ namespace AzToolsFramework
[this, prevModifiers, sharedRotationState]
(const AngularManipulator::Action& action) mutable -> void
{
- const ReferenceFrame referenceFrame = ReferenceFrameFromModifiers(action.m_modifiers);
+ const ReferenceFrame referenceFrame = m_spaceCluster.m_spaceLock ? m_spaceCluster.m_currentSpace : ReferenceFrameFromModifiers(action.m_modifiers);
const AZ::Quaternion manipulatorOrientation = action.m_start.m_rotation * action.m_current.m_delta;
// store the pivot override frame when positioning the manipulator manually (ctrl)
@@ -2566,6 +2589,67 @@ namespace AzToolsFramework
m_transformModeSelectionHandler);
}
+ void EditorTransformComponentSelection::CreateSpaceSelectionCluster()
+ {
+ // create the cluster for switching spaces/reference frames
+ ViewportUi::ViewportUiRequestBus::EventResult(
+ m_spaceCluster.m_spaceClusterId, ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::CreateCluster,
+ ViewportUi::Alignment::TopRight);
+
+ // create and register the buttons (strings correspond to icons even if the values appear different)
+ m_spaceCluster.m_worldButtonId = RegisterClusterButton(m_spaceCluster.m_spaceClusterId, "World");
+ m_spaceCluster.m_parentButtonId = RegisterClusterButton(m_spaceCluster.m_spaceClusterId, "Parent");
+ m_spaceCluster.m_localButtonId = RegisterClusterButton(m_spaceCluster.m_spaceClusterId, "Local");
+
+ auto onButtonClicked = [this](ViewportUi::ButtonId buttonId) {
+ if (buttonId == m_spaceCluster.m_localButtonId)
+ {
+ // Unlock
+ if (m_spaceCluster.m_spaceLock && m_spaceCluster.m_currentSpace == ReferenceFrame::Local)
+ {
+ m_spaceCluster.m_spaceLock = false;
+ }
+ else
+ {
+ m_spaceCluster.m_spaceLock = true;
+ m_spaceCluster.m_currentSpace = ReferenceFrame::Local;
+ }
+ }
+ else if (buttonId == m_spaceCluster.m_parentButtonId)
+ {
+ // Unlock
+ if (m_spaceCluster.m_spaceLock && m_spaceCluster.m_currentSpace == ReferenceFrame::Parent)
+ {
+ m_spaceCluster.m_spaceLock = false;
+ }
+ else
+ {
+ m_spaceCluster.m_spaceLock = true;
+ m_spaceCluster.m_currentSpace = ReferenceFrame::Parent;
+ }
+ }
+ else if (buttonId == m_spaceCluster.m_worldButtonId)
+ {
+ // Unlock
+ if (m_spaceCluster.m_spaceLock && m_spaceCluster.m_currentSpace == ReferenceFrame::World)
+ {
+ m_spaceCluster.m_spaceLock = false;
+ }
+ else
+ {
+ m_spaceCluster.m_spaceLock = true;
+ m_spaceCluster.m_currentSpace = ReferenceFrame::World;
+ }
+ }
+ };
+
+ m_spaceCluster.m_spaceSelectionHandler = AZ::Event::Handler(onButtonClicked);
+
+ ViewportUi::ViewportUiRequestBus::Event(
+ ViewportUi::DefaultViewportId, &ViewportUi::ViewportUiRequestBus::Events::RegisterClusterEventHandler,
+ m_spaceCluster.m_spaceClusterId, m_spaceCluster.m_spaceSelectionHandler);
+ }
+
EditorTransformComponentSelectionRequests::Mode EditorTransformComponentSelection::GetTransformMode()
{
return m_mode;
@@ -2963,7 +3047,7 @@ namespace AzToolsFramework
if (transformIt != transformsBefore.end())
{
AZ::Transform transformBefore = transformIt->second;
- transformBefore.ExtractScale();
+ transformBefore.ExtractUniformScale();
AZ::Transform newWorldFromLocal = transformBefore * scaleTransform;
SetEntityWorldTransform(entityId, newWorldFromLocal);
@@ -3277,7 +3361,10 @@ namespace AzToolsFramework
ViewportInteraction::BuildMouseButtons(
QGuiApplication::mouseButtons()), m_boxSelect.Active());
- const ReferenceFrame referenceFrame = ReferenceFrameFromModifiers(modifiers);
+ const ReferenceFrame referenceFrame =
+ m_spaceCluster.m_spaceLock ? m_spaceCluster.m_currentSpace : ReferenceFrameFromModifiers(modifiers);
+
+ UpdateSpaceCluster(referenceFrame);
bool refresh = false;
if (referenceFrame != m_referenceFrame)
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h
index 500ae484f8..4be84df26e 100644
--- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h
+++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h
@@ -106,6 +106,17 @@ namespace AzToolsFramework
World, //!< World space (space aligned to world axes - identity).
};
+ struct SpaceCluster
+ {
+ ViewportUi::ClusterId m_spaceClusterId;
+ ViewportUi::ButtonId m_localButtonId;
+ ViewportUi::ButtonId m_parentButtonId;
+ ViewportUi::ButtonId m_worldButtonId;
+ AZ::Event::Handler m_spaceSelectionHandler;
+ ReferenceFrame m_currentSpace = ReferenceFrame::Parent;
+ bool m_spaceLock = false;
+ };
+
//! Entity selection/interaction handling.
//! Provide a suite of functionality for manipulating entities, primarily through their TransformComponent.
class EditorTransformComponentSelection
@@ -160,6 +171,7 @@ namespace AzToolsFramework
void RegenerateManipulators();
void CreateTransformModeSelectionCluster();
+ void CreateSpaceSelectionCluster();
void ClearManipulatorTranslationOverride();
void ClearManipulatorOrientationOverride();
@@ -285,6 +297,9 @@ namespace AzToolsFramework
AZ::Event::Handler m_transformModeSelectionHandler; //!< Event handler for the Viewport UI cluster.
AzFramework::ClickDetector m_clickDetector; //!< Detect different types of mouse click.
AzFramework::CursorState m_cursorState; //!< Track the mouse position and delta movement each frame.
+
+ SpaceCluster m_spaceCluster;
+ void UpdateSpaceCluster(ReferenceFrame referenceFrame);
};
//! The ETCS (EntityTransformComponentSelection) namespace contains functions and data used exclusively by
diff --git a/Code/Framework/AzToolsFramework/Tests/AssetSeedManager.cpp b/Code/Framework/AzToolsFramework/Tests/AssetSeedManager.cpp
index 5ccbd95f09..3d45c10fca 100644
--- a/Code/Framework/AzToolsFramework/Tests/AssetSeedManager.cpp
+++ b/Code/Framework/AzToolsFramework/Tests/AssetSeedManager.cpp
@@ -15,6 +15,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -62,6 +63,12 @@ namespace UnitTest
m_assetSeedManager = new AzToolsFramework::AssetSeedManager();
m_assetRegistry = new AzFramework::AssetRegistry();
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
m_application->Start(AzFramework::Application::Descriptor());
for (int idx = 0; idx < s_totalAssets; idx++)
diff --git a/Code/Framework/AzToolsFramework/Tests/PlatformAddressedAssetCatalogTests.cpp b/Code/Framework/AzToolsFramework/Tests/PlatformAddressedAssetCatalogTests.cpp
index 328bf5dea5..4cc98106d6 100644
--- a/Code/Framework/AzToolsFramework/Tests/PlatformAddressedAssetCatalogTests.cpp
+++ b/Code/Framework/AzToolsFramework/Tests/PlatformAddressedAssetCatalogTests.cpp
@@ -10,6 +10,8 @@
*
*/
+#include
+#include
#include
#include
#include
@@ -49,6 +51,14 @@ namespace UnitTest
using namespace AZ::Data;
m_application = new ToolsTestApplication("AddressedAssetCatalogManager"); // Shorter name because Setting Registry
// specialization are 32 characters max.
+
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
m_application->Start(AzFramework::Application::Descriptor());
// Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
// shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash
diff --git a/Code/Framework/Tests/ArchiveCompressionTests.cpp b/Code/Framework/Tests/ArchiveCompressionTests.cpp
index fb6beca0b5..c648262599 100644
--- a/Code/Framework/Tests/ArchiveCompressionTests.cpp
+++ b/Code/Framework/Tests/ArchiveCompressionTests.cpp
@@ -11,6 +11,7 @@
*/
#include
+#include
#include
#include
#include
@@ -40,6 +41,13 @@ namespace UnitTest
void SetUp() override
{
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
m_application->Start({});
// Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
// shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash
diff --git a/Code/Framework/Tests/ArchiveTests.cpp b/Code/Framework/Tests/ArchiveTests.cpp
index aaca043c4b..6dc081ee72 100644
--- a/Code/Framework/Tests/ArchiveTests.cpp
+++ b/Code/Framework/Tests/ArchiveTests.cpp
@@ -16,6 +16,7 @@
#include
#include // for max path decl
+#include
#include
#include
#include // for function<> in the find files callback.
@@ -42,6 +43,14 @@ namespace UnitTest
{
AZ::ComponentApplication::Descriptor descriptor;
descriptor.m_stackRecordLevels = 30;
+
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
m_application->Start(descriptor);
// Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
// shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash
diff --git a/Code/Framework/Tests/AssetCatalog.cpp b/Code/Framework/Tests/AssetCatalog.cpp
index 8a89ba349c..1575b0a469 100644
--- a/Code/Framework/Tests/AssetCatalog.cpp
+++ b/Code/Framework/Tests/AssetCatalog.cpp
@@ -23,6 +23,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -304,6 +305,13 @@ namespace UnitTest
m_app.reset(aznew AzFramework::Application());
AZ::ComponentApplication::Descriptor desc;
desc.m_useExistingAllocator = true;
+
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
m_app->Start(desc);
// Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
diff --git a/Code/Framework/Tests/ComponentAddRemove.cpp b/Code/Framework/Tests/ComponentAddRemove.cpp
index 4fd6db7dde..f635a5ee3b 100644
--- a/Code/Framework/Tests/ComponentAddRemove.cpp
+++ b/Code/Framework/Tests/ComponentAddRemove.cpp
@@ -12,6 +12,7 @@
#include
#include
+#include
#include
#include
@@ -572,6 +573,12 @@ namespace UnitTest
{
AllocatorsTestFixture::SetUp();
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
AzFramework::Application::Descriptor descriptor;
descriptor.m_enableDrilling = false;
m_app.Start(descriptor);
diff --git a/Code/Framework/Tests/FileFunc.cpp b/Code/Framework/Tests/FileFunc.cpp
index d703164582..8db77fd79b 100644
--- a/Code/Framework/Tests/FileFunc.cpp
+++ b/Code/Framework/Tests/FileFunc.cpp
@@ -17,6 +17,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -278,6 +279,12 @@ namespace UnitTest
{
FrameworkApplicationFixture::SetUp();
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
m_serializeContext = AZStd::make_unique();
m_jsonRegistrationContext = AZStd::make_unique();
m_jsonSystemComponent = AZStd::make_unique();
diff --git a/Code/Framework/Tests/FileTagTests.cpp b/Code/Framework/Tests/FileTagTests.cpp
index 989c811111..b94131afee 100644
--- a/Code/Framework/Tests/FileTagTests.cpp
+++ b/Code/Framework/Tests/FileTagTests.cpp
@@ -83,6 +83,7 @@ namespace UnitTest
void SetUp() override
{
AllocatorsFixture::SetUp();
+
m_data = AZStd::make_unique();
using namespace AzFramework::FileTag;
AZ::ComponentApplication::Descriptor desc;
diff --git a/Code/Framework/Tests/FrameworkApplicationFixture.h b/Code/Framework/Tests/FrameworkApplicationFixture.h
index f3a90864e7..c2fea389e0 100644
--- a/Code/Framework/Tests/FrameworkApplicationFixture.h
+++ b/Code/Framework/Tests/FrameworkApplicationFixture.h
@@ -54,7 +54,7 @@ namespace UnitTest
};
void SetUp() override
- {
+ {
m_appDescriptor.m_allocationRecords = true;
m_appDescriptor.m_allocationRecordsSaveNames = true;
m_appDescriptor.m_recordingMode = AZ::Debug::AllocationRecords::Mode::RECORD_FULL;
diff --git a/Code/Framework/Tests/GenericComponentWrapperTest.cpp b/Code/Framework/Tests/GenericComponentWrapperTest.cpp
index b3dac90777..25af10b339 100644
--- a/Code/Framework/Tests/GenericComponentWrapperTest.cpp
+++ b/Code/Framework/Tests/GenericComponentWrapperTest.cpp
@@ -12,6 +12,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -59,6 +60,12 @@ class WrappedEditorComponentTest
protected:
void SetUp() override
{
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
m_app.Start(AZ::ComponentApplication::Descriptor());
// Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
@@ -178,6 +185,12 @@ class FindWrappedComponentsTest
public:
void SetUp() override
{
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
m_app.Start(AzFramework::Application::Descriptor());
// Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
diff --git a/Code/Framework/Tests/Slices.cpp b/Code/Framework/Tests/Slices.cpp
index 6a9ce858c0..8a20c43fb5 100644
--- a/Code/Framework/Tests/Slices.cpp
+++ b/Code/Framework/Tests/Slices.cpp
@@ -22,6 +22,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -1059,6 +1060,12 @@ namespace UnitTest
void SetUp() override
{
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
m_app.Start(AzFramework::Application::Descriptor());
// Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
diff --git a/Code/Tools/AssetBundler/tests/applicationManagerTests.cpp b/Code/Tools/AssetBundler/tests/applicationManagerTests.cpp
index 4156a6790d..f2477782d0 100644
--- a/Code/Tools/AssetBundler/tests/applicationManagerTests.cpp
+++ b/Code/Tools/AssetBundler/tests/applicationManagerTests.cpp
@@ -17,6 +17,7 @@
#include
#include
#include
+#include
#include
#include
@@ -57,6 +58,22 @@ namespace AssetBundler
UnitTest::ScopedAllocatorSetupFixture::SetUp();
m_data = AZStd::make_unique();
+ AZ::SettingsRegistryInterface* registry = nullptr;
+ if (!AZ::SettingsRegistry::Get())
+ {
+ AZ::SettingsRegistry::Register(&m_registry);
+ registry = &m_registry;
+ }
+ else
+ {
+ registry = AZ::SettingsRegistry::Get();
+ }
+ auto projectPathKey = AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey)
+ + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
+
m_data->m_applicationManager.reset(aznew MockApplicationManagerTest(0, 0));
m_data->m_applicationManager->Start(AzFramework::Application::Descriptor());
@@ -84,6 +101,12 @@ namespace AssetBundler
delete m_data->m_localFileIO;
AZ::IO::FileIOBase::SetInstance(m_data->m_priorFileIO);
+ auto settingsRegistry = AZ::SettingsRegistry::Get();
+ if(settingsRegistry == &m_registry)
+ {
+ AZ::SettingsRegistry::Unregister(settingsRegistry);
+ }
+
m_data->m_applicationManager->Stop();
m_data->m_applicationManager.reset();
m_data.reset();
@@ -99,6 +122,7 @@ namespace AssetBundler
};
AZStd::unique_ptr m_data;
+ AZ::SettingsRegistryImpl m_registry;
};
TEST_F(ApplicationManagerTest, ValidatePlatformFlags_ReadConfigFiles_OK)
diff --git a/Code/Tools/AssetBundler/tests/tests_main.cpp b/Code/Tools/AssetBundler/tests/tests_main.cpp
index 9e12623b0d..53b19c5eb4 100644
--- a/Code/Tools/AssetBundler/tests/tests_main.cpp
+++ b/Code/Tools/AssetBundler/tests/tests_main.cpp
@@ -97,7 +97,28 @@ namespace AssetBundler
{
public:
void SetUp() override
- {
+ {
+ AZ::SettingsRegistryInterface* registry = nullptr;
+ if (!AZ::SettingsRegistry::Get())
+ {
+ AZ::SettingsRegistry::Register(&m_registry);
+ registry = &m_registry;
+ }
+ else
+ {
+ registry = AZ::SettingsRegistry::Get();
+ }
+ auto projectPathKey = AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey)
+ + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
+ AZ::IO::FixedMaxPath engineRoot = AZ::Utils::GetEnginePath();
+ if (engineRoot.empty())
+ {
+ GTEST_FATAL_FAILURE_(AZStd::string::format("Unable to locate engine root.\n").c_str());
+ }
+
m_data = AZStd::make_unique();
m_data->m_application.reset(aznew AzToolsFramework::ToolsApplication());
m_data->m_application.get()->Start(AzFramework::Application::Descriptor());
@@ -107,19 +128,6 @@ namespace AssetBundler
// in the unit tests.
AZ::UserSettingsComponentRequestBus::Broadcast(&AZ::UserSettingsComponentRequests::DisableSaveOnFinalize);
- if (!AZ::SettingsRegistry::Get())
- {
- AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_Bootstrap(m_registry);
- AZ::SettingsRegistry::Register(&m_registry);
- }
-
- AZ::IO::FixedMaxPath engineRoot = AZ::Utils::GetEnginePath();
- if (engineRoot.empty())
- {
- GTEST_FATAL_FAILURE_(AZStd::string::format("Unable to locate engine root.\n").c_str());
- }
-
-
m_data->m_testEngineRoot = (engineRoot / RelativeTestFolder).LexicallyNormal().String();
m_data->m_localFileIO = aznew AZ::IO::LocalFileIO();
@@ -144,14 +152,24 @@ namespace AssetBundler
}
void TearDown() override
{
- AZ::IO::FileIOBase::SetInstance(nullptr);
- delete m_data->m_localFileIO;
- AZ::IO::FileIOBase::SetInstance(m_data->m_priorFileIO);
+ if (m_data)
+ {
+ AZ::IO::FileIOBase::SetInstance(nullptr);
+ delete m_data->m_localFileIO;
+ AZ::IO::FileIOBase::SetInstance(m_data->m_priorFileIO);
+
+ m_data->m_gemInfoList.set_capacity(0);
+ m_data->m_gemSeedFilePairList.set_capacity(0);
+ m_data->m_application.get()->Stop();
+ m_data->m_application.reset();
+ }
+
+ if(auto settingsRegistry = AZ::SettingsRegistry::Get();
+ settingsRegistry == &m_registry)
+ {
+ AZ::SettingsRegistry::Unregister(settingsRegistry);
+ }
- m_data->m_gemInfoList.set_capacity(0);
- m_data->m_gemSeedFilePairList.set_capacity(0);
- m_data->m_application.get()->Stop();
- m_data->m_application.reset();
}
void AddGemData(const char* engineRoot, const char* gemName, bool seedFileExists = true)
diff --git a/Code/Tools/AssetProcessor/native/InternalBuilders/SettingsRegistryBuilder.cpp b/Code/Tools/AssetProcessor/native/InternalBuilders/SettingsRegistryBuilder.cpp
index 523e39d622..3d7cc3b8b4 100644
--- a/Code/Tools/AssetProcessor/native/InternalBuilders/SettingsRegistryBuilder.cpp
+++ b/Code/Tools/AssetProcessor/native/InternalBuilders/SettingsRegistryBuilder.cpp
@@ -291,7 +291,6 @@ namespace AssetProcessor
}
}
- AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_Bootstrap(registry);
AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_EngineRegistry(registry, platform, specialization, &scratchBuffer);
AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_GemRegistries(registry, platform, specialization, &scratchBuffer);
AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_ProjectRegistry(registry, platform, specialization, &scratchBuffer);
diff --git a/Code/Tools/AssetProcessor/native/tests/AssetCatalog/AssetCatalogUnitTests.cpp b/Code/Tools/AssetProcessor/native/tests/AssetCatalog/AssetCatalogUnitTests.cpp
index e92e9afba5..3d9ecd3f5e 100644
--- a/Code/Tools/AssetProcessor/native/tests/AssetCatalog/AssetCatalogUnitTests.cpp
+++ b/Code/Tools/AssetProcessor/native/tests/AssetCatalog/AssetCatalogUnitTests.cpp
@@ -130,6 +130,9 @@ namespace AssetProcessor
auto cacheRootKey =
AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_cache_path";
settingsRegistry->Set(cacheRootKey, m_data->m_temporarySourceDir.absoluteFilePath("Cache").toUtf8().constData());
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ settingsRegistry->Set(projectPathKey, "AutomatedTesting");
AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*settingsRegistry);
AssetUtilities::ComputeProjectCacheRoot(m_data->m_cacheRootDir);
QString normalizedCacheRoot = AssetUtilities::NormalizeDirectoryPath(m_data->m_cacheRootDir.absolutePath());
diff --git a/Code/Tools/AssetProcessor/native/tests/AssetProcessorTest.cpp b/Code/Tools/AssetProcessor/native/tests/AssetProcessorTest.cpp
index d04e13aef2..7b88321ad9 100644
--- a/Code/Tools/AssetProcessor/native/tests/AssetProcessorTest.cpp
+++ b/Code/Tools/AssetProcessor/native/tests/AssetProcessorTest.cpp
@@ -12,7 +12,7 @@
#include "AssetProcessorTest.h"
-
+#include
#include
#include "BaseAssetProcessorTest.h"
@@ -67,6 +67,12 @@ namespace AssetProcessor
static char processName[] = {"AssetProcessorBatch"};
static char* namePtr = &processName[0];
static char** paramStringArray = &namePtr;
+
+ auto registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
m_application.reset(new UnitTestAppManager(&numParams, ¶mStringArray));
ASSERT_EQ(m_application->BeforeRun(), ApplicationManager::Status_Success);
diff --git a/Code/Tools/AssetProcessor/native/tests/AssetProcessorTest.h b/Code/Tools/AssetProcessor/native/tests/AssetProcessorTest.h
index c866a933dd..4ea0695f1c 100644
--- a/Code/Tools/AssetProcessor/native/tests/AssetProcessorTest.h
+++ b/Code/Tools/AssetProcessor/native/tests/AssetProcessorTest.h
@@ -14,6 +14,7 @@
#include
#include
#include
+#include
#include
#include
#include // for the assert absorber.
@@ -44,7 +45,18 @@ namespace AssetProcessor
AZ::AllocatorInstance::Create();
}
m_errorAbsorber = new UnitTestUtils::AssertAbsorber();
+
m_application = AZStd::make_unique();
+
+ // Inject the AutomatedTesting project as a project path into test fixture
+ using FixedValueString = AZ::SettingsRegistryInterface::FixedValueString;
+ constexpr auto projectPathKey = FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey)
+ + "/project_path";
+ if(auto settingsRegistry = AZ::SettingsRegistry::Get(); settingsRegistry != nullptr)
+ {
+ settingsRegistry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*settingsRegistry);
+ }
}
void TearDown() override
diff --git a/Code/Tools/AssetProcessor/native/tests/assetmanager/AssetProcessorManagerTest.cpp b/Code/Tools/AssetProcessor/native/tests/assetmanager/AssetProcessorManagerTest.cpp
index 07d1e48229..d592ecb012 100644
--- a/Code/Tools/AssetProcessor/native/tests/assetmanager/AssetProcessorManagerTest.cpp
+++ b/Code/Tools/AssetProcessor/native/tests/assetmanager/AssetProcessorManagerTest.cpp
@@ -204,6 +204,9 @@ void AssetProcessorManagerTest::SetUp()
auto cacheRootKey =
AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_cache_path";
registry->Set(cacheRootKey, tempPath.absoluteFilePath("Cache").toUtf8().constData());
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
m_data->m_databaseLocationListener.BusConnect();
diff --git a/Code/Tools/AssetProcessor/native/tests/platformconfiguration/platformconfigurationtests.cpp b/Code/Tools/AssetProcessor/native/tests/platformconfiguration/platformconfigurationtests.cpp
index 31e4996b1e..829d63472d 100644
--- a/Code/Tools/AssetProcessor/native/tests/platformconfiguration/platformconfigurationtests.cpp
+++ b/Code/Tools/AssetProcessor/native/tests/platformconfiguration/platformconfigurationtests.cpp
@@ -39,7 +39,6 @@ void PlatformConfigurationUnitTests::SetUp()
m_qApp = new QCoreApplication(m_argc, m_argv);
AssetProcessorTest::SetUp();
AssetUtilities::ResetAssetRoot();
-
}
void PlatformConfigurationUnitTests::TearDown()
diff --git a/Code/Tools/AssetProcessor/native/tests/platformconfiguration/platformconfigurationtests.h b/Code/Tools/AssetProcessor/native/tests/platformconfiguration/platformconfigurationtests.h
index fe669460a8..0fb67ab947 100644
--- a/Code/Tools/AssetProcessor/native/tests/platformconfiguration/platformconfigurationtests.h
+++ b/Code/Tools/AssetProcessor/native/tests/platformconfiguration/platformconfigurationtests.h
@@ -37,6 +37,5 @@ private:
int m_argc;
char** m_argv;
QCoreApplication* m_qApp;
-
};
diff --git a/Code/Tools/DeltaCataloger/Tests/tests_main.cpp b/Code/Tools/DeltaCataloger/Tests/tests_main.cpp
index 67d6767a17..887889edcb 100644
--- a/Code/Tools/DeltaCataloger/Tests/tests_main.cpp
+++ b/Code/Tools/DeltaCataloger/Tests/tests_main.cpp
@@ -13,6 +13,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -45,6 +46,12 @@ public:
protected:
void SetUp() override
{
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
AZ::ComponentApplication::Descriptor desc;
desc.m_useExistingAllocator = true;
desc.m_enableDrilling = false; // we already created a memory driller for the test (AllocatorsFixture)
diff --git a/Code/Tools/ProjectManager/Resources/ProjectManager.qrc b/Code/Tools/ProjectManager/Resources/ProjectManager.qrc
index ac55c48a6b..2e60e84326 100644
--- a/Code/Tools/ProjectManager/Resources/ProjectManager.qrc
+++ b/Code/Tools/ProjectManager/Resources/ProjectManager.qrc
@@ -15,5 +15,7 @@
ArrowDownLine.svg
ArrowUpLine.svg
Backgrounds/FirstTimeBackgroundImage.jpg
+ ArrowDownLine.svg
+ ArrowUpLine.svg
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.cpp
new file mode 100644
index 0000000000..6e9ad42017
--- /dev/null
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.cpp
@@ -0,0 +1,49 @@
+/*
+* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+* its licensors.
+*
+* For complete copyright and license terms please see the LICENSE at the root of this
+* distribution (the "License"). All use of this software is governed by the License,
+* or, if provided, by the license below or the license accompanying this file. Do not
+* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*
+*/
+
+#include
+#include
+#include
+#include
+
+namespace O3DE::ProjectManager
+{
+ GemCatalogHeaderWidget::GemCatalogHeaderWidget(GemSortFilterProxyModel* filterProxyModel, QWidget* parent)
+ : QFrame(parent)
+ {
+ QHBoxLayout* hLayout = new QHBoxLayout();
+ hLayout->setAlignment(Qt::AlignLeft);
+ hLayout->setMargin(0);
+ setLayout(hLayout);
+
+ setStyleSheet("background-color: #1E252F;");
+
+ QLabel* titleLabel = new QLabel(tr("Gem Catalog"));
+ titleLabel->setStyleSheet("font-size: 21px;");
+ hLayout->addWidget(titleLabel);
+
+ hLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding));
+
+ AzQtComponents::SearchLineEdit* filterLineEdit = new AzQtComponents::SearchLineEdit();
+ filterLineEdit->setStyleSheet("background-color: #DDDDDD;");
+ connect(filterLineEdit, &QLineEdit::textChanged, this, [=](const QString& text)
+ {
+ filterProxyModel->SetSearchString(text);
+ });
+ hLayout->addWidget(filterLineEdit);
+
+ hLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding));
+ hLayout->addSpacerItem(new QSpacerItem(220, 0, QSizePolicy::Fixed));
+
+ setFixedHeight(60);
+ }
+} // namespace O3DE::ProjectManager
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.h
new file mode 100644
index 0000000000..3e065edd8f
--- /dev/null
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogHeaderWidget.h
@@ -0,0 +1,31 @@
+/*
+* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+* its licensors.
+*
+* For complete copyright and license terms please see the LICENSE at the root of this
+* distribution (the "License"). All use of this software is governed by the License,
+* or, if provided, by the license below or the license accompanying this file. Do not
+* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*
+*/
+
+#pragma once
+
+#if !defined(Q_MOC_RUN)
+#include
+#include
+#endif
+
+namespace O3DE::ProjectManager
+{
+ class GemCatalogHeaderWidget
+ : public QFrame
+ {
+ Q_OBJECT // AUTOMOC
+
+ public:
+ explicit GemCatalogHeaderWidget(GemSortFilterProxyModel* filterProxyModel, QWidget* parent = nullptr);
+ ~GemCatalogHeaderWidget() = default;
+ };
+} // namespace O3DE::ProjectManager
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp
index 7d8cee45b4..2d243e7f8b 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp
@@ -12,6 +12,8 @@
#include
#include
+#include
+#include
#include
#include
#include
@@ -34,6 +36,9 @@ namespace O3DE::ProjectManager
vLayout->setSpacing(0);
setLayout(vLayout);
+ GemCatalogHeaderWidget* headerWidget = new GemCatalogHeaderWidget(proxyModel);
+ vLayout->addWidget(headerWidget);
+
QHBoxLayout* hLayout = new QHBoxLayout();
hLayout->setMargin(0);
vLayout->addLayout(hLayout);
@@ -64,9 +69,12 @@ namespace O3DE::ProjectManager
GemFilterWidget* filterWidget = new GemFilterWidget(proxyModel);
filterWidget->setFixedWidth(250);
+ GemListHeaderWidget* listHeaderWidget = new GemListHeaderWidget(proxyModel);
+
QVBoxLayout* middleVLayout = new QVBoxLayout();
middleVLayout->setMargin(0);
middleVLayout->setSpacing(0);
+ middleVLayout->addWidget(listHeaderWidget);
middleVLayout->addWidget(m_gemListView);
hLayout->addWidget(filterWidget);
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemFilterWidget.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemFilterWidget.cpp
index c6651b7295..3ece7760cf 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemFilterWidget.cpp
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemFilterWidget.cpp
@@ -124,12 +124,12 @@ namespace O3DE::ProjectManager
{
if (m_collapseButton->isChecked())
{
- m_collapseButton->setIcon(QIcon(":/Resources/ArrowDownLine.svg"));
+ m_collapseButton->setIcon(QIcon(":/ArrowDownLine.svg"));
m_mainWidget->hide();
}
else
{
- m_collapseButton->setIcon(QIcon(":/Resources/ArrowUpLine.svg"));
+ m_collapseButton->setIcon(QIcon(":/ArrowUpLine.svg"));
m_mainWidget->show();
}
}
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemInfo.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemInfo.h
index b96a1f242f..06b0adad32 100644
--- a/Code/Tools/ProjectManager/Source/GemCatalog/GemInfo.h
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemInfo.h
@@ -62,20 +62,20 @@ namespace O3DE::ProjectManager
bool IsValid() const;
QString m_path;
- QString m_name;
- QString m_displayName;
+ QString m_name = "Unknown Gem Name";
+ QString m_displayName = "Unknown Gem Name";
AZ::Uuid m_uuid;
- QString m_creator;
+ QString m_creator = "Unknown Creator";
GemOrigin m_gemOrigin = Local;
bool m_isAdded = false; //! Is the gem currently added and enabled in the project?
- QString m_summary;
+ QString m_summary = "No summary provided.";
Platforms m_platforms;
Types m_types; //! Asset and/or Code and/or Tool
QStringList m_features;
QString m_directoryLink;
QString m_documentationLink;
- QString m_version;
- QString m_lastUpdatedDate;
+ QString m_version = "Unknown Version";
+ QString m_lastUpdatedDate = "Unknown Date";
int m_binarySizeInKB = 0;
QStringList m_dependingGemUuids;
QStringList m_conflictingGemUuids;
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemListHeaderWidget.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemListHeaderWidget.cpp
new file mode 100644
index 0000000000..128fb93345
--- /dev/null
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemListHeaderWidget.cpp
@@ -0,0 +1,78 @@
+/*
+* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+* its licensors.
+*
+* For complete copyright and license terms please see the LICENSE at the root of this
+* distribution (the "License"). All use of this software is governed by the License,
+* or, if provided, by the license below or the license accompanying this file. Do not
+* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*
+*/
+
+#include
+#include
+#include
+#include
+#include
+
+namespace O3DE::ProjectManager
+{
+ GemListHeaderWidget::GemListHeaderWidget(GemSortFilterProxyModel* proxyModel, QWidget* parent)
+ : QFrame(parent)
+ {
+ QVBoxLayout* vLayout = new QVBoxLayout();
+ vLayout->setMargin(0);
+ setLayout(vLayout);
+
+ setStyleSheet("background-color: #333333;");
+
+ vLayout->addSpacing(20);
+
+ // Top section
+ QHBoxLayout* topLayout = new QHBoxLayout();
+ topLayout->setMargin(0);
+ topLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding));
+
+ QLabel* showCountLabel = new QLabel();
+ showCountLabel->setStyleSheet("font-size: 11pt; font: italic;");
+ topLayout->addWidget(showCountLabel);
+ connect(proxyModel, &GemSortFilterProxyModel::OnInvalidated, this, [=]
+ {
+ const int numGemsShown = proxyModel->rowCount();
+ showCountLabel->setText(QString(tr("showing %1 Gems")).arg(numGemsShown));
+ });
+
+ topLayout->addSpacing(GemItemDelegate::s_contentMargins.right() + GemItemDelegate::s_borderWidth);
+
+ vLayout->addLayout(topLayout);
+
+ vLayout->addSpacing(20);
+
+ // Separating line
+ QFrame* hLine = new QFrame();
+ hLine->setFrameShape(QFrame::HLine);
+ hLine->setStyleSheet("color: #666666;");
+ vLayout->addWidget(hLine);
+
+ vLayout->addSpacing(GemItemDelegate::s_contentMargins.top());
+
+ // Bottom section
+ QHBoxLayout* columnHeaderLayout = new QHBoxLayout();
+ columnHeaderLayout->setAlignment(Qt::AlignLeft);
+
+ columnHeaderLayout->addSpacing(31);
+
+ QLabel* gemNameLabel = new QLabel(tr("Gem Name"));
+ gemNameLabel->setStyleSheet("font-size: 11pt;");
+ columnHeaderLayout->addWidget(gemNameLabel);
+
+ columnHeaderLayout->addSpacing(111);
+
+ QLabel* gemSummaryLabel = new QLabel(tr("Gem Summary"));
+ gemSummaryLabel->setStyleSheet("font-size: 11pt;");
+ columnHeaderLayout->addWidget(gemSummaryLabel);
+
+ vLayout->addLayout(columnHeaderLayout);
+ }
+} // namespace O3DE::ProjectManager
diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemListHeaderWidget.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemListHeaderWidget.h
new file mode 100644
index 0000000000..b16a654ad0
--- /dev/null
+++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemListHeaderWidget.h
@@ -0,0 +1,33 @@
+/*
+* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
+* its licensors.
+*
+* For complete copyright and license terms please see the LICENSE at the root of this
+* distribution (the "License"). All use of this software is governed by the License,
+* or, if provided, by the license below or the license accompanying this file. Do not
+* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*
+*/
+
+#pragma once
+
+#if !defined(Q_MOC_RUN)
+#include
+#include
+#include
+#include
+#endif
+
+namespace O3DE::ProjectManager
+{
+ class GemListHeaderWidget
+ : public QFrame
+ {
+ Q_OBJECT // AUTOMOC
+
+ public:
+ explicit GemListHeaderWidget(GemSortFilterProxyModel* proxyModel, QWidget* parent = nullptr);
+ ~GemListHeaderWidget() = default;
+ };
+} // namespace O3DE::ProjectManager
diff --git a/Code/Tools/ProjectManager/project_manager_files.cmake b/Code/Tools/ProjectManager/project_manager_files.cmake
index 5fd2b4a9d8..a41ddad21e 100644
--- a/Code/Tools/ProjectManager/project_manager_files.cmake
+++ b/Code/Tools/ProjectManager/project_manager_files.cmake
@@ -58,6 +58,8 @@ set(FILES
Source/LinkWidget.cpp
Source/TagWidget.h
Source/TagWidget.cpp
+ Source/GemCatalog/GemCatalogHeaderWidget.h
+ Source/GemCatalog/GemCatalogHeaderWidget.cpp
Source/GemCatalog/GemCatalogScreen.h
Source/GemCatalog/GemCatalogScreen.cpp
Source/GemCatalog/GemFilterWidget.h
@@ -70,6 +72,8 @@ set(FILES
Source/GemCatalog/GemItemDelegate.cpp
Source/GemCatalog/GemListView.h
Source/GemCatalog/GemListView.cpp
+ Source/GemCatalog/GemListHeaderWidget.h
+ Source/GemCatalog/GemListHeaderWidget.cpp
Source/GemCatalog/GemModel.h
Source/GemCatalog/GemModel.cpp
Source/GemCatalog/GemSortFilterProxyModel.h
diff --git a/Gems/AssetValidation/Code/Tests/AssetValidationTestShared.h b/Gems/AssetValidation/Code/Tests/AssetValidationTestShared.h
index ab9e65b896..d67260de3e 100644
--- a/Gems/AssetValidation/Code/Tests/AssetValidationTestShared.h
+++ b/Gems/AssetValidation/Code/Tests/AssetValidationTestShared.h
@@ -152,8 +152,11 @@ struct AssetValidationTest
{
AZ::SettingsRegistry::Register(&m_registry);
- AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_Bootstrap(m_registry);
+ auto projectPathKey = AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey)
+ + "/project_path";
+ m_registry.Set(projectPathKey, "AutomatedTesting");
AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(m_registry);
+
// Set the engine root to the temporary directory and re-update the runtime file paths
auto enginePathKey = AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey)
+ "/engine_path";
diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp
index a20b9c869b..89ca76bd01 100644
--- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp
+++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp
@@ -886,7 +886,7 @@ namespace AZ
}
RHI::Ptr BuildPipelineLayoutDescriptorForApi(
- const char* builderName, const RPI::ShaderResourceGroupLayoutList& srgLayoutList, const MapOfStringToStageType& shaderEntryPoints,
+ [[maybe_unused]] const char* builderName, const RPI::ShaderResourceGroupLayoutList& srgLayoutList, const MapOfStringToStageType& shaderEntryPoints,
const RHI::ShaderCompilerArguments& shaderCompilerArguments, const RootConstantData& rootConstantData,
RHI::ShaderPlatformInterface* shaderPlatformInterface, BindingDependencies& bindingDependencies /*inout*/)
{
diff --git a/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingFeatureProcessor.cpp
index c4e9306dc9..7c13daea3b 100644
--- a/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingFeatureProcessor.cpp
+++ b/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingFeatureProcessor.cpp
@@ -318,7 +318,7 @@ namespace AZ
{
AZ::Transform meshTransform = transformFeatureProcessor->GetTransformForId(TransformServiceFeatureProcessorInterface::ObjectId(mesh.first));
AZ::Transform noScaleTransform = meshTransform;
- noScaleTransform.ExtractScale();
+ noScaleTransform.ExtractUniformScale();
AZ::Matrix3x3 rotationMatrix = Matrix3x3::CreateFromTransform(noScaleTransform);
rotationMatrix = rotationMatrix.GetInverseFull().GetTranspose();
diff --git a/Gems/Atom/Feature/Common/Code/Source/TransformService/TransformServiceFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/TransformService/TransformServiceFeatureProcessor.cpp
index acb6e4a287..fb73d0f416 100644
--- a/Gems/Atom/Feature/Common/Code/Source/TransformService/TransformServiceFeatureProcessor.cpp
+++ b/Gems/Atom/Feature/Common/Code/Source/TransformService/TransformServiceFeatureProcessor.cpp
@@ -231,7 +231,7 @@ namespace AZ
AZ_Error("TransformServiceFeatureProcessor", id.IsValid(), "Attempting to get the transform for an invalid handle.");
AZ::Matrix3x4 matrix3x4 = AZ::Matrix3x4::CreateFromRowMajorFloat12(m_objectToWorldTransforms.at(id.GetIndex()).m_transform);
AZ::Transform transform = AZ::Transform::CreateFromMatrix3x4(matrix3x4);
- transform.ExtractScale();
+ transform.ExtractUniformScale();
return transform;
}
diff --git a/Gems/Atom/RHI/Code/Tests/UtilsTests.cpp b/Gems/Atom/RHI/Code/Tests/UtilsTests.cpp
index 506edc0d1e..afeca6e617 100644
--- a/Gems/Atom/RHI/Code/Tests/UtilsTests.cpp
+++ b/Gems/Atom/RHI/Code/Tests/UtilsTests.cpp
@@ -60,7 +60,9 @@ namespace UnitTest
TEST_F(UtilsTests, LoadFileString_Error_DoesNotExist)
{
+ AZ_TEST_START_TRACE_SUPPRESSION;
auto outcome = AZ::RHI::LoadFileString("FileDoesNotExist");
+ AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
EXPECT_FALSE(outcome.IsSuccess());
EXPECT_TRUE(outcome.GetError().find("Could not open file") != AZStd::string::npos);
EXPECT_TRUE(outcome.GetError().find("FileDoesNotExist") != AZStd::string::npos);
@@ -68,7 +70,9 @@ namespace UnitTest
TEST_F(UtilsTests, LoadFileBytes_Error_DoesNotExist)
{
+ AZ_TEST_START_TRACE_SUPPRESSION;
auto outcome = AZ::RHI::LoadFileBytes("FileDoesNotExist");
+ AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
EXPECT_FALSE(outcome.IsSuccess());
EXPECT_TRUE(outcome.GetError().find("Could not open file") != AZStd::string::npos);
EXPECT_TRUE(outcome.GetError().find("FileDoesNotExist") != AZStd::string::npos);
diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomBridgeSystemComponent.cpp b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomBridgeSystemComponent.cpp
index 9148cdba6f..4a19c08174 100644
--- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomBridgeSystemComponent.cpp
+++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomBridgeSystemComponent.cpp
@@ -158,47 +158,8 @@ namespace AZ
void AtomBridgeSystemComponent::OnBootstrapSceneReady(AZ::RPI::Scene* bootstrapScene)
{
- AZStd::shared_ptr windowContext;
- AZ::Render::Bootstrap::DefaultWindowBus::BroadcastResult(windowContext, &AZ::Render::Bootstrap::DefaultWindowInterface::GetDefaultWindowContext);
-
- if (!windowContext)
- {
- AZ_Warning("Atom", false, "Cannot initialize Atom because no window context is available");
- return;
- }
-
- AZ::RPI::RenderPipelinePtr renderPipeline = bootstrapScene->GetDefaultRenderPipeline();
-
- // If RenderPipeline doesn't have a default view, create a view and make it the default view.
- // These settings will be overridden by the editor or game camera.
- if (renderPipeline->GetDefaultView() == nullptr)
- {
- auto viewContextManager = AZ::Interface::Get();
- m_view = AZ::RPI::View::CreateView(AZ::Name("AtomSystem Default View"), RPI::View::UsageCamera);
- viewContextManager->PushView(viewContextManager->GetDefaultViewportContextName(), m_view);
- const auto& viewport = windowContext->GetViewport();
- const float aspectRatio = viewport.m_maxX / viewport.m_maxY;
-
- // Note: This is projection assumes a setup for reversed depth
- AZ::Matrix4x4 viewToClipMatrix;
- AZ::MakePerspectiveFovMatrixRH(viewToClipMatrix, AZ::Constants::HalfPi, aspectRatio, 0.1f, 100.f, true);
-
- m_view->SetViewToClipMatrix(viewToClipMatrix);
-
- renderPipeline = bootstrapScene->GetDefaultRenderPipeline();
- renderPipeline->SetDefaultView(m_view);
- }
- else
- {
- m_view = renderPipeline->GetDefaultView();
- }
- auto auxGeomFP = bootstrapScene->GetFeatureProcessor();
- if (auxGeomFP)
- {
- auxGeomFP->GetOrCreateDrawQueueForView(m_view.get());
- }
-
- // Make default AtomDebugDisplayViewportInterface for the scene
+ AZ_UNUSED(bootstrapScene);
+ // Make default AtomDebugDisplayViewportInterface
AZStd::shared_ptr mainEntityDebugDisplay = AZStd::make_shared(AzFramework::g_defaultSceneEntityDebugDisplayId);
m_activeViewportsList[AzFramework::g_defaultSceneEntityDebugDisplayId] = mainEntityDebugDisplay;
}
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Animation/AttachmentComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Animation/AttachmentComponent.cpp
index 138d619d97..4d43d75406 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Animation/AttachmentComponent.cpp
+++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Animation/AttachmentComponent.cpp
@@ -243,14 +243,14 @@ namespace AZ
{
// apply offset in world-space
finalTransform = m_targetEntityTransform * m_targetBoneTransform;
- finalTransform.SetScale(AZ::Vector3::CreateOne());
+ finalTransform.SetUniformScale(1.0f);
finalTransform *= m_targetOffset;
}
else if (m_scaleSource == AttachmentConfiguration::ScaleSource::TargetEntityScale)
{
// apply offset in target-entity-space (ignoring bone scale)
AZ::Transform boneNoScale = m_targetBoneTransform;
- boneNoScale.SetScale(AZ::Vector3::CreateOne());
+ boneNoScale.SetUniformScale(1.0f);
finalTransform = m_targetEntityTransform * boneNoScale * m_targetOffset;
}
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/CapsuleLightDelegate.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/CapsuleLightDelegate.cpp
index 4ffb917f65..4291ce4d97 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/CapsuleLightDelegate.cpp
+++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/CapsuleLightDelegate.cpp
@@ -35,7 +35,7 @@ namespace AZ
// This equation is based off of the integration of a line segment against a perpendicular normal pointing at the center of the
// line segment from some distance away.
- float scale = GetTransform().GetScale().GetMaxElement();
+ float scale = GetTransform().GetUniformScale();
float h = GetInteriorHeight() * scale;
float t2 = lightThreshold * lightThreshold;
float h2 = h * h;
@@ -54,7 +54,7 @@ namespace AZ
const auto endpoints = m_shapeBus->GetCapsulePoints();
GetFeatureProcessor()->SetCapsuleLineSegment(GetLightHandle(), endpoints.m_begin, endpoints.m_end);
- float scale = GetTransform().GetScale().GetMaxElement();
+ float scale = GetTransform().GetUniformScale();
float radius = m_shapeBus->GetRadius();
GetFeatureProcessor()->SetCapsuleRadius(GetLightHandle(), scale * radius);
}
@@ -62,7 +62,7 @@ namespace AZ
float CapsuleLightDelegate::GetSurfaceArea() const
{
- float scale = GetTransform().GetScale().GetMaxElement();
+ float scale = GetTransform().GetUniformScale();
float radius = m_shapeBus->GetRadius();
float capsArea = 4.0f * Constants::Pi * radius * radius; // both caps make a sphere
float sideArea = 2.0f * Constants::Pi * radius * GetInteriorHeight(); // cylindrical area of capsule
@@ -77,7 +77,7 @@ namespace AZ
float radius = CalculateAttenuationRadius(AreaLightComponentConfig::CutoffIntensity);
// Add on the caps for the attenuation radius
- float scale = GetTransform().GetScale().GetMaxElement();
+ float scale = GetTransform().GetUniformScale();
float height = m_shapeBus->GetHeight() * scale;
debugDisplay.SetColor(color);
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DiskLightDelegate.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DiskLightDelegate.cpp
index 7805a92cd1..8abc790ada 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DiskLightDelegate.cpp
+++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DiskLightDelegate.cpp
@@ -48,7 +48,7 @@ namespace AZ::Render
float DiskLightDelegate::GetRadius() const
{
- return m_shapeBus->GetRadius() * GetTransform().GetScale().GetMaxElement();
+ return m_shapeBus->GetRadius() * GetTransform().GetUniformScale();
}
void DiskLightDelegate::DrawDebugDisplay(const Transform& transform, const Color& /*color*/, AzFramework::DebugDisplayRequests& debugDisplay, bool isSelected) const
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorDirectionalLightComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorDirectionalLightComponent.cpp
index a40557f2f1..308a4ebd11 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorDirectionalLightComponent.cpp
+++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorDirectionalLightComponent.cpp
@@ -217,7 +217,7 @@ namespace AZ
GetEntityId(),
&TransformBus::Events::GetWorldTM);
- transform.ExtractScale();
+ transform.ExtractUniformScale();
const Vector3 origin = transform.GetTranslation();
const Vector3 originOffset = origin - (transform.TransformVector(forward) * arrowOffset);
const Vector3 target = origin - (transform.TransformVector(forward) * (arrowLength + arrowOffset));
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/PolygonLightDelegate.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/PolygonLightDelegate.cpp
index e01559041c..0cc01f4066 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/PolygonLightDelegate.cpp
+++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/PolygonLightDelegate.cpp
@@ -73,7 +73,7 @@ namespace AZ
twiceArea += vertices.at(i).GetX() * vertices.at(j).GetY();
twiceArea -= vertices.at(i).GetY() * vertices.at(j).GetX();
}
- float scale = GetTransform().GetScale().GetMaxElement();
+ float scale = GetTransform().GetUniformScale();
return GetAbs(twiceArea * 0.5f * scale * scale);
}
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SphereLightDelegate.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SphereLightDelegate.cpp
index e3cf1fac78..afb63dce9b 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SphereLightDelegate.cpp
+++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SphereLightDelegate.cpp
@@ -50,7 +50,7 @@ namespace AZ
float SphereLightDelegate::GetRadius() const
{
- return m_shapeBus->GetRadius() * GetTransform().GetScale().GetMaxElement();
+ return m_shapeBus->GetRadius() * GetTransform().GetUniformScale();
}
void SphereLightDelegate::DrawDebugDisplay(const Transform& transform, const Color& color, AzFramework::DebugDisplayRequests& debugDisplay, bool isSelected) const
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SkyBox/HDRiSkyboxComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SkyBox/HDRiSkyboxComponentController.cpp
index 2c44124564..72cc765238 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SkyBox/HDRiSkyboxComponentController.cpp
+++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SkyBox/HDRiSkyboxComponentController.cpp
@@ -228,7 +228,7 @@ namespace AZ
// remove scale
Transform worldNoScale = world;
- worldNoScale.ExtractScale();
+ worldNoScale.ExtractUniformScale();
AZ::Matrix3x4 transformMatrix = AZ::Matrix3x4::CreateFromTransform(worldNoScale);
transformMatrix.StoreToRowMajorFloat12(matrix);
diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SkyBox/PhysicalSkyComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SkyBox/PhysicalSkyComponentController.cpp
index 4a6b1608a4..192c1ad509 100644
--- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SkyBox/PhysicalSkyComponentController.cpp
+++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SkyBox/PhysicalSkyComponentController.cpp
@@ -218,7 +218,7 @@ namespace AZ
SunPosition PhysicalSkyComponentController::GetSunTransform(const AZ::Transform& world)
{
Transform worldNoScale = world;
- worldNoScale.ExtractScale();
+ worldNoScale.ExtractUniformScale();
AZ::Vector3 sunPositionAtom = worldNoScale.TransformVector(AZ::Vector3(0, -1, 0)); // transform Sun from default position
// Convert sun position to Y-up coordinate
diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/synthetic_env.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/synthetic_env.py
index 86e4b68488..6a3340788b 100644
--- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/synthetic_env.py
+++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/synthetic_env.py
@@ -384,8 +384,7 @@ def stash_env(_SYNTH_ENV_DICT = OrderedDict()):
# changed to just make the fallback what is set in boostrap
# so now it's less of a fallnack and more correct if not
# explicitly set
- _LY_PROJECT = os.getenv(ENVAR_LY_PROJECT,
- get_current_project(_LY_DEV))
+ _LY_PROJECT = os.getenv(ENVAR_LY_PROJECT)
_SYNTH_ENV_DICT[ENVAR_LY_PROJECT] = _LY_PROJECT
_LY_BUILD_DIR_NAME = os.getenv(ENVAR_LY_BUILD_DIR_NAME,
diff --git a/Gems/Blast/Code/Source/Actor/BlastActorImpl.cpp b/Gems/Blast/Code/Source/Actor/BlastActorImpl.cpp
index 0336ae8c09..6c4c78c412 100644
--- a/Gems/Blast/Code/Source/Actor/BlastActorImpl.cpp
+++ b/Gems/Blast/Code/Source/Actor/BlastActorImpl.cpp
@@ -68,7 +68,7 @@ namespace Blast
auto transform = AZ::Transform::CreateFromQuaternionAndTranslation(
m_bodyConfiguration.m_orientation, m_bodyConfiguration.m_position);
- transform.MultiplyByScale(AZ::Vector3(m_scale));
+ transform.MultiplyByUniformScale(m_scale);
AZ::TransformBus::Event(m_entity->GetId(), &AZ::TransformInterface::SetWorldTM, transform);
diff --git a/Gems/Blast/Code/Source/Family/BlastFamilyImpl.cpp b/Gems/Blast/Code/Source/Family/BlastFamilyImpl.cpp
index 5fe1e0ab30..25c0f904e3 100644
--- a/Gems/Blast/Code/Source/Family/BlastFamilyImpl.cpp
+++ b/Gems/Blast/Code/Source/Family/BlastFamilyImpl.cpp
@@ -202,7 +202,7 @@ namespace Blast
if (parentBody)
{
parentTransform = parentBody->GetTransform();
- parentTransform.MultiplyByScale(AZ::Vector3(m_initialTransform.GetScale().GetMaxElement()));
+ parentTransform.MultiplyByUniformScale(m_initialTransform.GetUniformScale());
}
else
{
@@ -254,7 +254,7 @@ namespace Blast
actorDesc.m_parentCenterOfMass = transform.GetTranslation();
actorDesc.m_parentLinearVelocity = AZ::Vector3::CreateZero();
actorDesc.m_bodyConfiguration = configuration;
- actorDesc.m_scale = transform.GetScale().GetMaxElement();
+ actorDesc.m_scale = transform.GetUniformScale();
return actorDesc;
}
diff --git a/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.cpp b/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.cpp
index 1f677d7b6f..1304c7b392 100644
--- a/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.cpp
+++ b/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.cpp
@@ -274,12 +274,15 @@ namespace DebugDraw
AzFramework::DebugDisplayRequests* debugDisplay =
AzFramework::DebugDisplayRequestBus::FindFirstHandler(debugDisplayBus);
- OnTickAabbs(*debugDisplay);
- OnTickLines(*debugDisplay);
- OnTickObbs(*debugDisplay);
- OnTickRays(*debugDisplay);
- OnTickSpheres(*debugDisplay);
- OnTickText(*debugDisplay);
+ if (debugDisplay)
+ {
+ OnTickAabbs(*debugDisplay);
+ OnTickLines(*debugDisplay);
+ OnTickObbs(*debugDisplay);
+ OnTickRays(*debugDisplay);
+ OnTickSpheres(*debugDisplay);
+ OnTickText(*debugDisplay);
+ }
}
template
diff --git a/Gems/EMotionFX/Code/Tests/SystemComponentFixture.h b/Gems/EMotionFX/Code/Tests/SystemComponentFixture.h
index 04a1ca4f81..f8c70a5fee 100644
--- a/Gems/EMotionFX/Code/Tests/SystemComponentFixture.h
+++ b/Gems/EMotionFX/Code/Tests/SystemComponentFixture.h
@@ -59,7 +59,16 @@ namespace EMotionFX
{
public:
- ComponentFixtureApp() = default;
+ ComponentFixtureApp()
+ {
+ using FixedValueString = AZ::SettingsRegistryInterface::FixedValueString;
+ constexpr auto projectPathKey = FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ if(auto settingsRegistry = AZ::SettingsRegistry::Get(); settingsRegistry != nullptr)
+ {
+ settingsRegistry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*settingsRegistry);
+ }
+ }
AZ::ComponentTypeList GetRequiredSystemComponents() const override
{
diff --git a/Gems/EMotionFX/Code/Tests/UI/CanUseFileMenu.cpp b/Gems/EMotionFX/Code/Tests/UI/CanUseFileMenu.cpp
index 8045499b4a..8e3a19c1ca 100644
--- a/Gems/EMotionFX/Code/Tests/UI/CanUseFileMenu.cpp
+++ b/Gems/EMotionFX/Code/Tests/UI/CanUseFileMenu.cpp
@@ -77,7 +77,6 @@ namespace EMotionFX
{
auto testAssetsPath = AZ::IO::Path(GetEMotionFX().GetAssetCacheFolder()) / "TmpTestAssets";
QString dataDir = QString::fromUtf8(testAssetsPath.c_str(), aznumeric_cast(testAssetsPath.Native().size()));
- dataDir += "TmpTestAssets";
if (!QDir(dataDir).exists())
{
diff --git a/Gems/EditorPythonBindings/Code/Tests/EditorPythonBindingsTest.cpp b/Gems/EditorPythonBindings/Code/Tests/EditorPythonBindingsTest.cpp
index 86628d08a1..440638c61f 100644
--- a/Gems/EditorPythonBindings/Code/Tests/EditorPythonBindingsTest.cpp
+++ b/Gems/EditorPythonBindings/Code/Tests/EditorPythonBindingsTest.cpp
@@ -18,6 +18,7 @@
#include
#include
+#include
#include
#include
@@ -322,6 +323,13 @@ sys.version
void SetUp() override
{
PythonTestingFixture::SetUp();
+
+ auto registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey = AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey)
+ + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
m_app.RegisterComponentDescriptor(EditorPythonBindings::PythonSystemComponent::CreateDescriptor());
}
diff --git a/Gems/LmbrCentral/Code/Source/Shape/CapsuleShape.cpp b/Gems/LmbrCentral/Code/Source/Shape/CapsuleShape.cpp
index e935ed4009..1026c8addc 100644
--- a/Gems/LmbrCentral/Code/Source/Shape/CapsuleShape.cpp
+++ b/Gems/LmbrCentral/Code/Source/Shape/CapsuleShape.cpp
@@ -203,7 +203,7 @@ namespace LmbrCentral
const AZ::Transform& currentTransform, const CapsuleShapeConfig& configuration,
[[maybe_unused]] const AZ::Vector3& currentNonUniformScale)
{
- const float entityScale = currentTransform.GetScale().GetMaxElement();
+ const float entityScale = currentTransform.GetUniformScale();
m_axisVector = currentTransform.GetBasisZ().GetNormalizedSafe() * entityScale;
const float internalCylinderHeight = configuration.m_height - configuration.m_radius * 2.0f;
diff --git a/Gems/LmbrCentral/Code/Source/Shape/CylinderShape.cpp b/Gems/LmbrCentral/Code/Source/Shape/CylinderShape.cpp
index 047261862f..a0ba157fc1 100644
--- a/Gems/LmbrCentral/Code/Source/Shape/CylinderShape.cpp
+++ b/Gems/LmbrCentral/Code/Source/Shape/CylinderShape.cpp
@@ -273,7 +273,7 @@ namespace LmbrCentral
const AZ::Transform& currentTransform, const CylinderShapeConfig& configuration,
[[maybe_unused]] const AZ::Vector3& currentNonUniformScale)
{
- const float entityScale = currentTransform.GetScale().GetMaxElement();
+ const float entityScale = currentTransform.GetUniformScale();
m_axisVector = currentTransform.GetBasisZ().GetNormalizedSafe() * entityScale;
m_baseCenterPoint = currentTransform.GetTranslation() - m_axisVector * (configuration.m_height * 0.5f);
m_axisVector = m_axisVector * configuration.m_height;
diff --git a/Gems/LmbrCentral/Code/Source/Shape/DiskShape.cpp b/Gems/LmbrCentral/Code/Source/Shape/DiskShape.cpp
index a302a83316..6aff6ed98c 100644
--- a/Gems/LmbrCentral/Code/Source/Shape/DiskShape.cpp
+++ b/Gems/LmbrCentral/Code/Source/Shape/DiskShape.cpp
@@ -167,7 +167,7 @@ namespace LmbrCentral
{
m_position = currentTransform.GetTranslation();
m_normal = currentTransform.GetBasisZ().GetNormalized();
- m_radius = configuration.m_radius * currentTransform.GetScale().GetMaxElement();
+ m_radius = configuration.m_radius * currentTransform.GetUniformScale();
}
const DiskShapeConfig& DiskShape::GetDiskConfiguration() const
diff --git a/Gems/LmbrCentral/Code/Source/Shape/EditorBoxShapeComponent.cpp b/Gems/LmbrCentral/Code/Source/Shape/EditorBoxShapeComponent.cpp
index c0b49b8e55..e323d58c2a 100644
--- a/Gems/LmbrCentral/Code/Source/Shape/EditorBoxShapeComponent.cpp
+++ b/Gems/LmbrCentral/Code/Source/Shape/EditorBoxShapeComponent.cpp
@@ -174,6 +174,6 @@ namespace LmbrCentral
AZ::Vector3 EditorBoxShapeComponent::GetBoxScale()
{
- return AZ::Vector3(m_boxShape.GetCurrentTransform().GetScale().GetMaxElement() * m_boxShape.GetCurrentNonUniformScale());
+ return AZ::Vector3(m_boxShape.GetCurrentTransform().GetUniformScale() * m_boxShape.GetCurrentNonUniformScale());
}
} // namespace LmbrCentral
diff --git a/Gems/LmbrCentral/Code/Source/Shape/EditorSplineComponent.cpp b/Gems/LmbrCentral/Code/Source/Shape/EditorSplineComponent.cpp
index 212ec49c93..44ed73733c 100644
--- a/Gems/LmbrCentral/Code/Source/Shape/EditorSplineComponent.cpp
+++ b/Gems/LmbrCentral/Code/Source/Shape/EditorSplineComponent.cpp
@@ -349,7 +349,7 @@ namespace LmbrCentral
const AZ::Vector3& src, const AZ::Vector3& dir, float& distance)
{
const auto rayIntersectData = IntersectSpline(m_cachedUniformScaleTransform, src, dir, *m_splineCommon.m_spline);
- distance = rayIntersectData.m_rayDistance * m_cachedUniformScaleTransform.GetScale().GetMaxElement();
+ distance = rayIntersectData.m_rayDistance * m_cachedUniformScaleTransform.GetUniformScale();
AzFramework::CameraState cameraState;
AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::EventResult(
diff --git a/Gems/LmbrCentral/Code/Source/Shape/SphereShape.cpp b/Gems/LmbrCentral/Code/Source/Shape/SphereShape.cpp
index c06d38a612..05472df8be 100644
--- a/Gems/LmbrCentral/Code/Source/Shape/SphereShape.cpp
+++ b/Gems/LmbrCentral/Code/Source/Shape/SphereShape.cpp
@@ -136,7 +136,7 @@ namespace LmbrCentral
[[maybe_unused]] const AZ::Vector3& currentNonUniformScale)
{
m_position = currentTransform.GetTranslation();
- m_radius = configuration.m_radius * currentTransform.GetScale().GetMaxElement();
+ m_radius = configuration.m_radius * currentTransform.GetUniformScale();
}
void DrawSphereShape(
diff --git a/Gems/LmbrCentral/Code/Tests/Builders/LevelBuilderTest.cpp b/Gems/LmbrCentral/Code/Tests/Builders/LevelBuilderTest.cpp
index 58e7e9e093..470a2abff6 100644
--- a/Gems/LmbrCentral/Code/Tests/Builders/LevelBuilderTest.cpp
+++ b/Gems/LmbrCentral/Code/Tests/Builders/LevelBuilderTest.cpp
@@ -15,6 +15,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -98,6 +99,12 @@ class LevelBuilderTest
protected:
void SetUp() override
{
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
m_app.Start(m_descriptor);
// Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
// shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash
diff --git a/Gems/LmbrCentral/Code/Tests/Builders/LuaBuilderTests.cpp b/Gems/LmbrCentral/Code/Tests/Builders/LuaBuilderTests.cpp
index b8911738f7..99213484fc 100644
--- a/Gems/LmbrCentral/Code/Tests/Builders/LuaBuilderTests.cpp
+++ b/Gems/LmbrCentral/Code/Tests/Builders/LuaBuilderTests.cpp
@@ -15,6 +15,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -32,6 +33,12 @@ namespace UnitTest
{
void SetUp() override
{
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
m_app.Start(m_descriptor);
// Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
// shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash
diff --git a/Gems/LmbrCentral/Code/Tests/Builders/SeedBuilderTests.cpp b/Gems/LmbrCentral/Code/Tests/Builders/SeedBuilderTests.cpp
index 20dd3db446..49fc06c160 100644
--- a/Gems/LmbrCentral/Code/Tests/Builders/SeedBuilderTests.cpp
+++ b/Gems/LmbrCentral/Code/Tests/Builders/SeedBuilderTests.cpp
@@ -12,6 +12,7 @@
#include "LmbrCentral_precompiled.h"
#include
+#include
#include
#include
#include
@@ -22,6 +23,12 @@ class SeedBuilderTests
{
void SetUp() override
{
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
m_app.Start(AZ::ComponentApplication::Descriptor());
// Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
diff --git a/Gems/LyShine/Code/Tests/LyShineEditorTest.cpp b/Gems/LyShine/Code/Tests/LyShineEditorTest.cpp
index 9e57ac26fd..68da6e6009 100644
--- a/Gems/LyShine/Code/Tests/LyShineEditorTest.cpp
+++ b/Gems/LyShine/Code/Tests/LyShineEditorTest.cpp
@@ -16,6 +16,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -88,6 +89,12 @@ protected:
m_data->m_stubEnv.pSystem = &m_data->m_mockSystem;
gEnv = &m_data->m_stubEnv;
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
m_app.Start(m_descriptor);
// Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
// shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash
diff --git a/Gems/PhysX/Code/Editor/DebugDraw.cpp b/Gems/PhysX/Code/Editor/DebugDraw.cpp
index fffb1e1350..b73e3f22bd 100644
--- a/Gems/PhysX/Code/Editor/DebugDraw.cpp
+++ b/Gems/PhysX/Code/Editor/DebugDraw.cpp
@@ -685,7 +685,7 @@ namespace PhysX
// Let each collider decide how to scale itself, so extract the scale here.
AZ::Transform entityWorldTransformWithoutScale = AZ::Transform::CreateIdentity();
AZ::TransformBus::EventResult(entityWorldTransformWithoutScale, m_entityId, &AZ::TransformInterface::GetWorldTM);
- entityWorldTransformWithoutScale.ExtractScale();
+ entityWorldTransformWithoutScale.ExtractUniformScale();
auto* physXDebug = AZ::Interface::Get();
if (physXDebug == nullptr)
diff --git a/Gems/PhysX/Code/Editor/EditorSubComponentModeSnapRotation.cpp b/Gems/PhysX/Code/Editor/EditorSubComponentModeSnapRotation.cpp
index 502d60d8d9..e8e93e0d6e 100644
--- a/Gems/PhysX/Code/Editor/EditorSubComponentModeSnapRotation.cpp
+++ b/Gems/PhysX/Code/Editor/EditorSubComponentModeSnapRotation.cpp
@@ -89,7 +89,7 @@ namespace PhysX
AZ::Transform worldTransform = AZ::Transform::CreateIdentity();
AZ::TransformBus::EventResult(
worldTransform, m_entityComponentId.GetEntityId(), &AZ::TransformInterface::GetWorldTM);
- worldTransform.ExtractScale();
+ worldTransform.ExtractUniformScale();
AZ::Transform localTransform = AZ::Transform::CreateIdentity();
EditorJointRequestBus::EventResult(
diff --git a/Gems/PhysX/Code/Source/EditorColliderComponent.cpp b/Gems/PhysX/Code/Source/EditorColliderComponent.cpp
index e9b9c41da3..26700a7103 100644
--- a/Gems/PhysX/Code/Source/EditorColliderComponent.cpp
+++ b/Gems/PhysX/Code/Source/EditorColliderComponent.cpp
@@ -603,7 +603,7 @@ namespace PhysX
}
AZ::Transform colliderTransform = GetWorldTM();
- colliderTransform.ExtractScale();
+ colliderTransform.ExtractUniformScale();
AzPhysics::StaticRigidBodyConfiguration configuration;
configuration.m_orientation = colliderTransform.GetRotation();
configuration.m_position = colliderTransform.GetTranslation();
diff --git a/Gems/PhysX/Code/Source/EditorRigidBodyComponent.cpp b/Gems/PhysX/Code/Source/EditorRigidBodyComponent.cpp
index efd65181da..f68c4d17d8 100644
--- a/Gems/PhysX/Code/Source/EditorRigidBodyComponent.cpp
+++ b/Gems/PhysX/Code/Source/EditorRigidBodyComponent.cpp
@@ -365,7 +365,7 @@ namespace PhysX
}
AZ::Transform colliderTransform = GetWorldTM();
- colliderTransform.ExtractScale();
+ colliderTransform.ExtractUniformScale();
AzPhysics::RigidBodyConfiguration configuration = m_config;
configuration.m_orientation = colliderTransform.GetRotation();
diff --git a/Gems/PhysX/Code/Source/EditorShapeColliderComponent.cpp b/Gems/PhysX/Code/Source/EditorShapeColliderComponent.cpp
index 379afc3f2d..692fbf96f3 100644
--- a/Gems/PhysX/Code/Source/EditorShapeColliderComponent.cpp
+++ b/Gems/PhysX/Code/Source/EditorShapeColliderComponent.cpp
@@ -205,7 +205,7 @@ namespace PhysX
}
AZ::Transform transform = GetWorldTM();
- transform.ExtractScale();
+ transform.ExtractUniformScale();
const size_t numPoints = m_geometryCache.m_cachedSamplePoints.size();
for (size_t pointIndex = 0; pointIndex < numPoints; ++pointIndex)
{
diff --git a/Gems/PhysX/Code/Source/Pipeline/MeshAssetHandler.cpp b/Gems/PhysX/Code/Source/Pipeline/MeshAssetHandler.cpp
index 3987936b8c..430ef7aef3 100644
--- a/Gems/PhysX/Code/Source/Pipeline/MeshAssetHandler.cpp
+++ b/Gems/PhysX/Code/Source/Pipeline/MeshAssetHandler.cpp
@@ -196,7 +196,7 @@ namespace PhysX
AZ::Transform::CreateFromQuaternionAndTranslation(colliderConfiguration.m_rotation, colliderConfiguration.m_position);
AZ::Transform shapeTransform = *m_transform;
- shapeTransform.ExtractScale();
+ shapeTransform.ExtractUniformScale();
shapeTransform = existingTransform * shapeTransform;
diff --git a/Gems/PhysX/Code/Source/Utils.cpp b/Gems/PhysX/Code/Source/Utils.cpp
index a85426d532..55be7c92f7 100644
--- a/Gems/PhysX/Code/Source/Utils.cpp
+++ b/Gems/PhysX/Code/Source/Utils.cpp
@@ -718,7 +718,7 @@ namespace PhysX
const float boundsInflationFactor = 1.0f;
AZ::Transform overallTransformNoScale = GetColliderWorldTransform(worldTransform,
colliderConfiguration.m_position, colliderConfiguration.m_rotation);
- overallTransformNoScale.ExtractScale();
+ overallTransformNoScale.ExtractUniformScale();
const physx::PxBounds3 bounds = physx::PxGeometryQuery::getWorldBounds(geometryHolder.any(),
PxMathConvert(overallTransformNoScale),
boundsInflationFactor);
@@ -1378,7 +1378,7 @@ namespace PhysX
AZ::TransformBus::EventResult(worldTransformWithoutScale
, entityId
, &AZ::TransformInterface::GetWorldTM);
- worldTransformWithoutScale.ExtractScale();
+ worldTransformWithoutScale.ExtractUniformScale();
return worldTransformWithoutScale;
}
@@ -1386,10 +1386,10 @@ namespace PhysX
const AZ::Transform& entityWorldTransform)
{
AZ::Transform jointWorldTransformWithoutScale = jointWorldTransform;
- jointWorldTransformWithoutScale.ExtractScale();
+ jointWorldTransformWithoutScale.ExtractUniformScale();
AZ::Transform entityWorldTransformWithoutScale = entityWorldTransform;
- entityWorldTransformWithoutScale.ExtractScale();
+ entityWorldTransformWithoutScale.ExtractUniformScale();
AZ::Transform entityWorldTransformInverse = entityWorldTransformWithoutScale.GetInverse();
return entityWorldTransformInverse * jointWorldTransformWithoutScale;
@@ -1399,10 +1399,10 @@ namespace PhysX
const AZ::Transform& entityWorldTransform)
{
AZ::Transform jointLocalTransformWithoutScale = jointLocalTransform;
- jointLocalTransformWithoutScale.ExtractScale();
+ jointLocalTransformWithoutScale.ExtractUniformScale();
AZ::Transform entityWorldTransformWithoutScale = entityWorldTransform;
- entityWorldTransformWithoutScale.ExtractScale();
+ entityWorldTransformWithoutScale.ExtractUniformScale();
return entityWorldTransformWithoutScale * jointLocalTransformWithoutScale;
}
diff --git a/Gems/Prefab/PrefabBuilder/PrefabBuilderTests.cpp b/Gems/Prefab/PrefabBuilder/PrefabBuilderTests.cpp
index 2bb0d8aaf3..ace089b9bd 100644
--- a/Gems/Prefab/PrefabBuilder/PrefabBuilderTests.cpp
+++ b/Gems/Prefab/PrefabBuilder/PrefabBuilderTests.cpp
@@ -14,6 +14,7 @@
#include
#include
#include
+#include
#include
namespace UnitTest
@@ -172,6 +173,12 @@ namespace UnitTest
void PrefabBuilderTests::SetUp()
{
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
AZ::ComponentApplication::Descriptor desc;
m_app.Start(desc);
m_app.CreateReflectionManager();
diff --git a/Gems/SceneProcessing/Code/Tests/SceneBuilder/SceneBuilderPhasesTests.cpp b/Gems/SceneProcessing/Code/Tests/SceneBuilder/SceneBuilderPhasesTests.cpp
index 5f96353996..2a89911fda 100644
--- a/Gems/SceneProcessing/Code/Tests/SceneBuilder/SceneBuilderPhasesTests.cpp
+++ b/Gems/SceneProcessing/Code/Tests/SceneBuilder/SceneBuilderPhasesTests.cpp
@@ -16,6 +16,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -139,6 +140,12 @@ class SceneBuilderPhasesFixture
public:
void SetUp() override
{
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
m_app.Start(AZ::ComponentApplication::Descriptor());
// Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
diff --git a/Gems/SceneProcessing/Code/Tests/SceneBuilder/SceneBuilderTests.cpp b/Gems/SceneProcessing/Code/Tests/SceneBuilder/SceneBuilderTests.cpp
index 66fd717508..2287077c89 100644
--- a/Gems/SceneProcessing/Code/Tests/SceneBuilder/SceneBuilderTests.cpp
+++ b/Gems/SceneProcessing/Code/Tests/SceneBuilder/SceneBuilderTests.cpp
@@ -13,6 +13,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -30,6 +31,12 @@ class SceneBuilderTests
protected:
void SetUp() override
{
+ AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get();
+ auto projectPathKey =
+ AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path";
+ registry->Set(projectPathKey, "AutomatedTesting");
+ AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry);
+
m_app.Start(AZ::ComponentApplication::Descriptor());
AZ::Debug::TraceMessageBus::Handler::BusConnect();
// Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
diff --git a/Gems/Vegetation/Code/Source/DynamicSliceInstanceSpawner.cpp b/Gems/Vegetation/Code/Source/DynamicSliceInstanceSpawner.cpp
index 597d0ca079..a185c9a601 100644
--- a/Gems/Vegetation/Code/Source/DynamicSliceInstanceSpawner.cpp
+++ b/Gems/Vegetation/Code/Source/DynamicSliceInstanceSpawner.cpp
@@ -309,7 +309,7 @@ namespace Vegetation
// Create a Transform that represents our instance.
AZ::Transform world = AZ::Transform::CreateFromQuaternionAndTranslation(instanceData.m_alignment * instanceData.m_rotation, instanceData.m_position);
- world.MultiplyByScale(AZ::Vector3(instanceData.m_scale));
+ world.MultiplyByUniformScale(instanceData.m_scale);
// Request a new dynamic slice instance.
AzFramework::SliceInstantiationTicket* ticket = new AzFramework::SliceInstantiationTicket();
diff --git a/Gems/WhiteBox/Code/Source/Components/WhiteBoxColliderComponent.cpp b/Gems/WhiteBox/Code/Source/Components/WhiteBoxColliderComponent.cpp
index 41d0a4c5e3..cda82c82b0 100644
--- a/Gems/WhiteBox/Code/Source/Components/WhiteBoxColliderComponent.cpp
+++ b/Gems/WhiteBox/Code/Source/Components/WhiteBoxColliderComponent.cpp
@@ -139,7 +139,7 @@ namespace WhiteBox
{
const AZ::Transform worldTransformWithoutScale = [worldTransform = world]() mutable
{
- worldTransform.SetScale(AZ::Vector3::CreateOne());
+ worldTransform.SetUniformScale(1.0f);
return worldTransform;
}();
diff --git a/Gems/WhiteBox/Code/Source/Util/WhiteBoxMathUtil.cpp b/Gems/WhiteBox/Code/Source/Util/WhiteBoxMathUtil.cpp
index 9d423d5519..840d1f4590 100644
--- a/Gems/WhiteBox/Code/Source/Util/WhiteBoxMathUtil.cpp
+++ b/Gems/WhiteBox/Code/Source/Util/WhiteBoxMathUtil.cpp
@@ -73,7 +73,7 @@ namespace WhiteBox
const AZ::Transform spaceFromLocal = localFromSpace.GetInverse();
const AZ::Vector3 spacePosition = spaceFromLocal.TransformPoint(localPosition);
const AZ::Vector3 spaceScaledPosition =
- AZ::Transform::CreateScale(AZ::Vector3(scale)).TransformPoint(spacePosition);
+ AZ::Transform::CreateUniformScale(scale).TransformPoint(spacePosition);
return localFromSpace.TransformPoint(spaceScaledPosition);
}
diff --git a/Tools/LyTestTools/ly_test_tools/_internal/managers/abstract_resource_locator.py b/Tools/LyTestTools/ly_test_tools/_internal/managers/abstract_resource_locator.py
index 5f6db7ac05..5a14ef9419 100755
--- a/Tools/LyTestTools/ly_test_tools/_internal/managers/abstract_resource_locator.py
+++ b/Tools/LyTestTools/ly_test_tools/_internal/managers/abstract_resource_locator.py
@@ -250,9 +250,6 @@ class AbstractResourceLocator(object):
"""
return os.path.join(self.build_directory(), 'CrySCompileServer')
- def bootstrap_config_file(self):
- return os.path.join(self.engine_root(), 'bootstrap.cfg')
-
def asset_processor_config_file(self):
return os.path.join(self.engine_root(), 'Registry', 'AssetProcessorPlatformConfig.setreg')
diff --git a/Tools/LyTestTools/ly_test_tools/launchers/platforms/base.py b/Tools/LyTestTools/ly_test_tools/launchers/platforms/base.py
index 1b0afb3efe..386de62048 100755
--- a/Tools/LyTestTools/ly_test_tools/launchers/platforms/base.py
+++ b/Tools/LyTestTools/ly_test_tools/launchers/platforms/base.py
@@ -123,7 +123,6 @@ class Launcher(object):
"""
backup_path = self.workspace.settings.get_temp_path()
log.debug(f"Performing automatic backup of bootstrap, platform and user settings in path {backup_path}")
- self.workspace.settings.backup_bootstrap_settings(backup_path)
self.workspace.settings.backup_platform_settings(backup_path)
self.workspace.settings.backup_shader_compiler_settings(backup_path)
diff --git a/Tools/LyTestTools/ly_test_tools/o3de/asset_processor.py b/Tools/LyTestTools/ly_test_tools/o3de/asset_processor.py
index 5507588ae3..d8b08cad24 100644
--- a/Tools/LyTestTools/ly_test_tools/o3de/asset_processor.py
+++ b/Tools/LyTestTools/ly_test_tools/o3de/asset_processor.py
@@ -664,8 +664,7 @@ class AssetProcessor(object):
make_dir = os.path.join(self._temp_asset_root, copy_dir)
if not os.path.isdir(make_dir):
os.makedirs(make_dir)
- for copyfile_name in ['bootstrap.cfg',
- 'Registry/AssetProcessorPlatformConfig.setreg',
+ for copyfile_name in ['Registry/AssetProcessorPlatformConfig.setreg',
os.path.join(self._workspace.project, "project.json"),
os.path.join('Assets', 'Engine', 'exclude.filetag')]:
shutil.copyfile(os.path.join(self._workspace.paths.engine_root(), copyfile_name),
diff --git a/Tools/LyTestTools/ly_test_tools/o3de/settings.py b/Tools/LyTestTools/ly_test_tools/o3de/settings.py
index 9677a4d3a3..a1e83abe51 100644
--- a/Tools/LyTestTools/ly_test_tools/o3de/settings.py
+++ b/Tools/LyTestTools/ly_test_tools/o3de/settings.py
@@ -57,14 +57,6 @@ class LySettings(object):
"""
self._backup_settings(self._resource_locator.platform_config_file(), backup_path)
- def backup_bootstrap_settings(self, backup_path=None):
- """
- Creates a backup of the bootstrap settings file (~/dev/bootstrap.cfg) in the backup_path. If no path is
- provided, it will store in the workspace temp path (the contents of the workspace temp directory are removed
- during workspace teardown)
- """
- self._backup_settings(self._resource_locator.bootstrap_config_file(), backup_path)
-
def backup_shader_compiler_settings(self, backup_path=None):
self._backup_settings(self._resource_locator.shader_compiler_config_file(), backup_path)
@@ -79,14 +71,6 @@ class LySettings(object):
"""
self._restore_settings(self._resource_locator.platform_config_file(), backup_path)
- def restore_bootstrap_settings(self, backup_path=None):
- """
- Restores the bootstrap settings file (~/dev/bootstrap.cfg) from its backup.
- The backup is stored in the backup_path.
- If no backup_path is provided, it will attempt to retrieve the backup from the workspace temp path.
- """
- self._restore_settings(self._resource_locator.bootstrap_config_file(), backup_path)
-
def restore_shader_compiler_settings(self, backup_path=None):
self._restore_settings(self._resource_locator.shader_compiler_config_file(), backup_path)
diff --git a/Tools/LyTestTools/tests/unit/test_abstract_resource_locator.py b/Tools/LyTestTools/tests/unit/test_abstract_resource_locator.py
index e46fefa461..12286b3dd7 100755
--- a/Tools/LyTestTools/tests/unit/test_abstract_resource_locator.py
+++ b/Tools/LyTestTools/tests/unit/test_abstract_resource_locator.py
@@ -158,13 +158,6 @@ class TestAbstractResourceLocator(object):
assert mock_abstract_resource_locator.shader_cache() == expected_path
- def test_BootstrapConfigFile_IsCalled_ReturnBootstrapConfigFilePath(self):
- mock_abstract_resource_locator = abstract_resource_locator.AbstractResourceLocator(
- mock_build_directory, mock_project)
- expected_path = os.path.join(mock_abstract_resource_locator.engine_root(), 'bootstrap.cfg')
-
- assert mock_abstract_resource_locator.bootstrap_config_file() == expected_path
-
def test_AssetProcessorConfigFile_IsCalled_ReturnsAssetProcessorConfigFilePath(self):
mock_abstract_resource_locator = abstract_resource_locator.AbstractResourceLocator(
mock_build_directory, mock_project)
diff --git a/bootstrap.cfg b/bootstrap.cfg
deleted file mode 100644
index 858e9093f5..0000000000
--- a/bootstrap.cfg
+++ /dev/null
@@ -1,12 +0,0 @@
-; This file is deprecated and is only use currently for setting the path when running O3DE in an engine-centric manner
-; By engine-centric, what is meant is using CMake to configure from the directory and passing in the LY_PROJECTS value
-
-project_path=AutomatedTesting
-
-; The Asset Processor Specific settings are now the /Engine/Registry/bootstrap.setreg settings
-; The Engine specific settings can be overridden in order of least precedence to most
-; 1. Override the settings in a "/Registry/*.setreg(patch)" file (Shared per Gem Settings)
-; 2. Override the settings in a "/Registry/*.setreg(patch)" file (Shared per Project Settings)
-; 3. Override the settings in a "/user/Registry/*.setreg(patch)" file (User per Project Settings)
-; 4. Override the settings in a "~/.o3de/Registry/*.setreg(patch)" file (User Global Settings)
-; Where "~" is %USERPROFILE% on Windows and $HOME on Unix like platforms
diff --git a/cmake/Tools/common.py b/cmake/Tools/common.py
index b271c59766..8189bb3ca3 100755
--- a/cmake/Tools/common.py
+++ b/cmake/Tools/common.py
@@ -137,19 +137,32 @@ def get_config_file_values(config_file_path, keys_to_extract):
return result_map
-def get_bootstrap_values(engine_root, keys_to_extract):
+def get_bootstrap_values(bootstrap_dir, keys_to_extract):
"""
- Extract requested values from the bootstrap.cfg file in the def root folder
- :param engine_root: The engine root folder where bootstrap.cfg exists
+ Extract requested values from the bootstrap.setreg file in the Registry folder
+ :param bootstrap_dir: The parent directory of the bootstrap.setreg file
:param keys_to_extract: The keys to extract into a dictionary
:return: Dictionary of keys and its values (for matched keys)
"""
- bootstrap_file = os.path.join(engine_root, 'bootstrap.cfg')
+ bootstrap_file = os.path.join(bootstrap_dir, 'bootstrap.setreg')
if not os.path.isfile(bootstrap_file):
- raise LmbrCmdError("Missing 'bootstrap.cfg' file from engine root ('{}')".format(engine_root),
- ERROR_CODE_FILE_NOT_FOUND)
+ raise logging.error(f'Bootstrap.setreg file {bootstrap_file} does not exist.')
+
+ result_map = {}
+ with bootstrap_file.open('r') as f:
+ try:
+ json_data = json.load(f)
+ except Exception as e:
+ logging.error(f'Bootstrap.setreg failed to load: {str(e)}')
+ else:
+ for search_key in keys_to_extract:
+ try:
+ search_result = json_data["Amazon"]["AzCore"]["Bootstrap"][f'"{search_key}"']
+ except KeyError as e:
+ logging.error(f'Bootstrap.setreg cannot find Amazon:AzCore:Bootstrap:{search_result}: {str(e)}')
+ else:
+ result_map[search_key] = search_result
- result_map = get_config_file_values(bootstrap_file, keys_to_extract)
return result_map
diff --git a/cmake/Tools/generate_game_paks.py b/cmake/Tools/generate_game_paks.py
deleted file mode 100755
index 6a1ff1e458..0000000000
--- a/cmake/Tools/generate_game_paks.py
+++ /dev/null
@@ -1,244 +0,0 @@
-#
-# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-# its licensors.
-#
-# For complete copyright and license terms please see the LICENSE at the root of this
-# distribution (the "License"). All use of this software is governed by the License,
-# or, if provided, by the license below or the license accompanying this file. Do not
-# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#
-
-import argparse
-import datetime
-import logging
-import pathlib
-import platform
-import sys
-import os
-import subprocess
-
-ROOT_DEV_PATH = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', '..'))
-if ROOT_DEV_PATH not in sys.path:
- sys.path.append(ROOT_DEV_PATH)
-
-from cmake.Tools import common
-
-# The location of this python script is not portable relative to the engine root, we determine the engine root based
-# on its relative location
-DEV_ROOT = os.path.realpath(os.path.join(__file__, '../../..'))
-
-BOOTSTRAP_CFG = os.path.join(DEV_ROOT, 'bootstrap.cfg')
-
-EXECUTABLE_EXTN = '.exe' if platform.system() == 'Windows' else ''
-RC_NAME = f'rc{EXECUTABLE_EXTN}'
-APB_NAME = f'AssetProcessorBatch{EXECUTABLE_EXTN}'
-
-# Depending on the user request for verbosity, the argument list to subprocess may or may not redirect stdout to NULL
-VERBOSE_CALL_ARGS = dict(
- shell=True,
- cwd=DEV_ROOT
-)
-NON_VERBOSE_CALL_ARGS = dict(
- **VERBOSE_CALL_ARGS,
- stdout=subprocess.DEVNULL
-)
-
-
-def command_arg(arg):
- """
- Work-around for an issue when running subprocess on Linux: subprocess.check_call will take in the argument as an array
- but only invokes the first item in the array, ignoring the arguments. As quick fix, we will combine the array into the
- full command line and execute it that way on non-windows platforms
- """
- if platform.system() == 'Windows':
- return arg
- else:
- return ' '.join(arg)
-
-
-def validate(binfolder, game_name, pak_script):
-
- #
- # Validate the binfolder is relative and contains 'rc' and 'AssetProcessorBatch'
- #
- if os.path.isabs(binfolder):
- raise common.LmbrCmdError("Invalid value for '-b/--binfolder'. It must be a path relative to the engine root folder",
- common.ERROR_CODE_ERROR_DIRECTORY)
-
- binfolder_abs_path = pathlib.Path(DEV_ROOT) / binfolder
- if not binfolder_abs_path.is_dir():
- raise common.LmbrCmdError("Invalid value for '-b/--binfolder'. Path does not exist or is not a directory",
- common.ERROR_CODE_ERROR_DIRECTORY)
-
- rc_check = binfolder_abs_path / RC_NAME
- if not rc_check.is_file():
- raise common.LmbrCmdError(f"Invalid value for '-b/--binfolder'. Path does not contain {RC_NAME}",
- common.ERROR_CODE_ERROR_DIRECTORY)
-
- apb_check = binfolder_abs_path / APB_NAME
- if not apb_check.is_file():
- raise common.LmbrCmdError(f"Invalid value for '-b/--binfolder'. Path does not contain {APB_NAME}",
- common.ERROR_CODE_ERROR_DIRECTORY)
-
- #
- # Validate the game name represents a game project within the game engine
- #
- gamefolder_abs_path = pathlib.Path(DEV_ROOT) / game_name
- if not gamefolder_abs_path.is_dir():
- raise common.LmbrCmdError(f"Invalid value for '-g/--game-name'. No game '{game_name} exists.",
- common.ERROR_CODE_ERROR_DIRECTORY)
-
- project_json_path = gamefolder_abs_path / 'project.json'
- if not project_json_path.is_file():
- raise common.LmbrCmdError(
- f"Invalid value for '-g/--game-name'. Folder '{game_name} is not a valid game project.",
- common.ERROR_CODE_FILE_NOT_FOUND)
-
- if not os.path.isfile(pak_script):
- raise common.LmbrCmdError(f'Pak script file {pak_script} does not exist.',
- common.ERROR_CODE_FILE_NOT_FOUND)
-
-
-def process(binfolder, game_name, asset_platform, autorun_assetprocessor, recompress, fastest_compression, target,
- pak_script, warn_on_assetprocessor_error, verbose):
-
- logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG if verbose else logging.INFO)
-
- target_path_root_abs = pathlib.Path(DEV_ROOT) / target
- if target_path_root_abs.is_file():
- raise common.LmbrCmdError(f"Target '{target}' already exists as a file.",
- common.ERROR_CODE_GENERAL_ERROR)
- os.makedirs(target_path_root_abs.absolute(), exist_ok=True)
-
- target_pak_folder_name = f'{game_name.lower()}_{asset_platform}_paks'
- target_pak = target_path_root_abs / target_pak_folder_name
-
- # Prepare the asset processor batch arguments and execute if requested
- if autorun_assetprocessor:
- ap_executable = os.path.join(binfolder, APB_NAME)
- ap_cmd_args = [ap_executable,
- f'/gamefolder={game_name}',
- f'/platforms={asset_platform}']
- logging.debug("Calling {}".format(' '.join(ap_cmd_args)))
- try:
- logging.info(f"Running {APB_NAME} on {game_name}")
- start_time = datetime.datetime.now()
-
- call_args = VERBOSE_CALL_ARGS if verbose else NON_VERBOSE_CALL_ARGS
-
- subprocess.check_call(command_arg(ap_cmd_args),
- **call_args)
-
- total_time = datetime.datetime.now() - start_time
- logging.info(f"Asset Processing Complete. Elapse: {total_time}")
- except subprocess.CalledProcessError:
- if warn_on_assetprocessor_error:
- logging.warning('AssetProcessorBatch reported errors')
- else:
- raise common.LmbrCmdError("AssetProcessorBatch has one or more failed assets.",
- common.ERROR_CODE_GENERAL_ERROR)
-
- rc_executable = os.path.join(binfolder, RC_NAME)
- rc_cmd_args = [rc_executable,
- f'/job={pak_script}',
- f'/p={asset_platform}',
- f'/game={game_name}',
- f'/trg={target_pak}']
- if recompress:
- rc_cmd_args.append('/recompress=1')
- if fastest_compression:
- rc_cmd_args.append('/use_fastest=1')
- logging.debug("Calling {}".format(' '.join(rc_cmd_args)))
-
- try:
- logging.info(f"Running {APB_NAME} on {game_name}")
- start_time = datetime.datetime.now()
-
- call_args = VERBOSE_CALL_ARGS if verbose else NON_VERBOSE_CALL_ARGS
-
- subprocess.check_call(command_arg(rc_cmd_args),
- **call_args)
-
- total_time = datetime.datetime.now() - start_time
- logging.info(f"Asset Processing Complete. Elapse: {total_time}")
- logging.info(f"Pak files for {game_name} written to {target_pak}")
-
- except subprocess.CalledProcessError as err:
- raise common.LmbrCmdError(f"{RC_NAME} returned an error: {str(err)}.",
- err.returncode)
-
-
-def main(args):
-
- parser = argparse.ArgumentParser()
-
- parser.add_argument('-b', '--binfolder',
- help='The relative location of the binary folder that contains the resource compiler and asset processor')
-
- bootstrap = common.get_bootstrap_values(DEV_ROOT, ['project_path'])
- parser.add_argument('-g', '--game-name',
- help='The name of the Game whose asset pak will be generated for',
- default=bootstrap.get('project_path'))
-
- parser.add_argument('-p', '--asset-platform',
- help='The asset platform type to process')
-
- parser.add_argument('-a', '--autorun-assetprocessor',
- help='Option to automatically invoke asset processor batch on the game before generating the pak',
- action='store_true')
-
- parser.add_argument('-w', '--warn-on-assetprocessor-error',
- help='When -a/--autorun-assetprocessor is specified, warn on asset processor failure rather than aborting the process',
- action='store_true')
-
- parser.add_argument('-r', '--recompress',
- action='store_true',
- help='If present, the ResourceCompiler (RC.exe) will decompress and compress back each PAK file '
- 'found as they are transferred from the cache folder to the game_pc_pak folder.')
- parser.add_argument('-fc', '--fastest-compression',
- action='store_true',
- help='As each file is being added to its PAK file, they will be compressed across all available '
- 'codecs (ZLIB, ZSTD and LZ4) and the one with the fastest decompression time will be '
- 'chosen. The default is to always use ZLIB')
- parser.add_argument('--target',
- default='Pak',
- help='Specify a target folder for the pak files. (Default : Pak)')
- parser.add_argument('--pak-script',
- default=f'{DEV_ROOT}/{os.path.normpath("Code/Tools/RC/Config/rc/RCJob_Generic_MakePaks.xml")}',
- help="The absolute path of the pak script configuration file to use to create the paks.")
-
- parser.add_argument('-v', '--verbose',
- help='Enable debug messages',
- action='store_true')
-
- parsed = parser.parse_args(args)
-
- validate(binfolder=parsed.binfolder,
- game_name=parsed.game_name,
- pak_script=parsed.pak_script)
-
- process(binfolder=parsed.binfolder,
- game_name=parsed.game_name,
- asset_platform=parsed.asset_platform,
- autorun_assetprocessor=parsed.autorun_assetprocessor,
- recompress=parsed.recompress,
- fastest_compression=parsed.fastest_compression,
- target=parsed.target,
- pak_script=parsed.pak_script,
- warn_on_assetprocessor_error=parsed.warn_on_assetprocessor_error,
- verbose=parsed.verbose)
-
-
-if __name__ == '__main__':
- try:
- if not os.path.isfile(BOOTSTRAP_CFG):
- raise common.LmbrCmdError("Invalid dev root, missing bootstrap.cfg.",
- common.ERROR_CODE_FILE_NOT_FOUND)
-
- main(sys.argv[1:])
- exit(0)
-
- except common.LmbrCmdError as err:
- print(str(err), file=sys.stderr)
- exit(err.code)
diff --git a/cmake/Tools/layout_tool.py b/cmake/Tools/layout_tool.py
index 8f573b61f5..69f5b34ae7 100755
--- a/cmake/Tools/layout_tool.py
+++ b/cmake/Tools/layout_tool.py
@@ -78,19 +78,19 @@ def verify_layout(layout_dir, platform_name, project_path, asset_mode, asset_typ
if remote_on_check is None:
# Validate that if '_connect_to_remote is enabled, that the 'input_remote_ip' is not set to local host
if input_remote_connect == '1' and input_remote_ip == LOCAL_HOST:
- return _warn("'bootstrap.cfg' is configured to connect to Asset Processor remotely, but the 'remote_ip' "
+ return _warn("'bootstrap.setreg' is configured to connect to Asset Processor remotely, but the 'remote_ip' "
" is configured for LOCAL HOST")
else:
if remote_on_check:
# Verify we are set for remote AP connection
if input_remote_ip == LOCAL_HOST:
- return _warn(f"'bootstrap.cfg' is not configured for a remote Asset Processor connection (remote_ip={input_remote_ip})")
+ return _warn(f"'bootstrap.setreg' is not configured for a remote Asset Processor connection (remote_ip={input_remote_ip})")
if input_remote_connect != '1':
- return _warn(f"'bootstrap.cfg' is not configured for a remote Asset Processor connection ({platform_name}_connect_to_remote={input_remote_connect}")
+ return _warn(f"'bootstrap.setreg' is not configured for a remote Asset Processor connection ({platform_name}_connect_to_remote={input_remote_connect}")
else:
# Verify we are disabled for remote AP connection
if input_remote_connect != '0':
- return _warn(f"'bootstrap.cfg' is not configured for a remote Asset Processor connection ({platform_name}_connect_to_remote={input_remote_connect}")
+ return _warn(f"'bootstrap.setreg' is not configured for a remote Asset Processor connection ({platform_name}_connect_to_remote={input_remote_connect}")
return 0
@@ -107,20 +107,15 @@ def verify_layout(layout_dir, platform_name, project_path, asset_mode, asset_typ
project_name_lower = project_path.lower()
layout_path = pathlib.Path(layout_dir)
- # Validate bootstrap.cfg exists
- bootstrap_file = layout_path / 'bootstrap.cfg'
- if not bootstrap_file.is_file():
- warning_count += _warn(f"'bootstrap.cfg' is missing from {str(layout_path)}")
- bootstrap_values = None
- else:
- bootstrap_values = common.get_config_file_values(str(bootstrap_file), [f'{platform_name_lower}_remote_filesystem',
- f'{platform_name_lower}_connect_to_remote',
- f'{platform_name_lower}_wait_for_connect',
- f'{platform_name_lower}_assets',
- f'assets',
- f'{platform_name_lower}_remote_ip',
- f'remote_ip'
- ])
+ bootstrap_path = layout_path / 'Registry'
+ bootstrap_values = common.get_bootstrap_values(str(bootstrap_path), [f'{platform_name_lower}_remote_filesystem',
+ f'{platform_name_lower}_connect_to_remote',
+ f'{platform_name_lower}_wait_for_connect',
+ f'{platform_name_lower}_assets',
+ f'assets',
+ f'{platform_name_lower}_remote_ip',
+ f'remote_ip'
+ ])
# Validate the system_{platform}_{asset type}.cfg exists
platform_system_cfg_file = layout_path / f'system_{platform_name_lower}_{asset_type}.cfg'
@@ -141,9 +136,9 @@ def verify_layout(layout_dir, platform_name, project_path, asset_mode, asset_typ
# Validate that the asset type for the platform matches the one set for the build
bootstrap_asset_type = bootstrap_values.get(f'{platform_name_lower}_assets') or bootstrap_values.get('assets')
if not bootstrap_asset_type:
- warning_count += _warn("'bootstrap.cfg' is missing specifications for asset type.")
+ warning_count += _warn("'bootstrap.setreg' is missing specifications for asset type.")
elif bootstrap_asset_type != asset_type:
- warning_count += _warn(f"The asset type specified in bootstrap.cfg ({bootstrap_asset_type}) does not match the asset type specified for this deployment({asset_type}).")
+ warning_count += _warn(f"The asset type specified in bootstrap.setreg ({bootstrap_asset_type}) does not match the asset type specified for this deployment({asset_type}).")
# Validate that if '_connect_to_remote is enabled, that the 'remote_ip' is not set to local host
warning_count += _validate_remote_ap(remote_ip, remote_connect, None)
@@ -211,7 +206,7 @@ def verify_layout(layout_dir, platform_name, project_path, asset_mode, asset_typ
elif asset_mode == ASSET_MODE_VFS:
remote_file_system = bootstrap_values.get(f'{platform_name_lower}_remote_filesystem') or '0'
if not remote_file_system != '1':
- warning_count += _warn("Remote file system is not configured in bootstrap.cfg for VFS mode.")
+ warning_count += _warn("Remote file system is not configured in bootstrap.setreg for VFS mode.")
else:
warning_count += _validate_remote_ap(remote_ip, remote_connect, True)
diff --git a/cmake/Tools/unit_test_common.py b/cmake/Tools/unit_test_common.py
index 58f89876c3..655c2a32c1 100755
--- a/cmake/Tools/unit_test_common.py
+++ b/cmake/Tools/unit_test_common.py
@@ -48,60 +48,6 @@ def test_determine_engine_root(tmpdir, engine_json_content, expected_success):
assert result is None
-TEST_BOOTSTRAP_CONTENT_1 = """
-project_path = Game1
-foo = bar
-key1 = value1
-key2 = value2
-assets = pc
---No Assets
-"""
-
-TEST_BOOTSTRAP_CONTENT_2 = """
-project_path = Game2
- foo = bar
-#-------------------------
- key1 = value1
-key2 = value2
-assets = pc
---No Assets
-"""
-
-
-@pytest.mark.parametrize(
- "contents, input_keys, expected_result_map", [
- pytest.param(TEST_BOOTSTRAP_CONTENT_1, ['project_path', 'foo', 'assets'], {'project_path': 'Game1',
- 'foo': 'bar',
- 'assets': 'pc'}, id="TestFullMatch"),
- pytest.param(TEST_BOOTSTRAP_CONTENT_2, ['project_path', 'foo', 'barnone'], {'project_path': 'Game2',
- 'foo': 'bar'}, id="TestPartialMatch"),
- pytest.param(TEST_BOOTSTRAP_CONTENT_2, ['project_pathnone', 'foonone', 'barnone'], {}, id="TestNoMatch")
- ]
-)
-def test_get_bootstrap_values_success(tmpdir, contents, input_keys, expected_result_map):
-
- test_dev_root = 'dev'
- tmpdir.ensure('{}/bootstrap.cfg'.format(test_dev_root))
- bootstrap_file = tmpdir.join('{}/bootstrap.cfg'.format(test_dev_root))
- bootstrap_file.write(contents)
-
- bootstrap_file_path = str(tmpdir.join(test_dev_root).realpath())
-
- result = common.get_bootstrap_values(bootstrap_file_path, input_keys)
-
- assert expected_result_map == result
-
-
-def test_get_bootstrap_values_fail():
- try:
- bad_file = 'x:\\foo\\bar\\file\\'
- common.get_bootstrap_values(bad_file, ['input_keys'])
- except common.LmbrCmdError as err:
- assert 'Missing' in str(err)
- else:
- assert False, "Excepted LayoutToolError (missing file)"
-
-
TEST_AP_CONFIG_1 = """
[Platforms]
;pc=enabled
@@ -245,7 +191,6 @@ def test_verify_game_project_and_dev_root_success(tmpdir):
game_name = 'MyFoo'
game_folder = 'myfoo'
game_project_json = TEST_GAME_PROJECT_JSON_FORMAT.format(project_name=game_name)
- tmpdir.ensure(f'{dev_root}/bootstrap.cfg')
tmpdir.ensure(f'{dev_root}/{game_folder}/project.json')
project_json_path = tmpdir / dev_root / game_folder / 'project.json'
project_json_path.write_text(game_project_json, encoding='ascii')
@@ -285,72 +230,6 @@ asset_deploy_type={test_asset_deploy_type}
assert result.asset_deploy_type == test_asset_deploy_type
-def test_transform_bootstrap_project_path(tmpdir):
-
- tmpdir.ensure('bootstrap.cfg')
-
- test_bootstrap_content = """
--- Blah Blah
--- Blah Blah
-
-project_path=OldProject
-
--- remote_filesystem - enable Virtual File System (VFS)
--- This feature allows a remote instance of the game to run off assets
--- on the asset processor computers cache instead of deploying them the remote device
--- By default it is off and can be overridden for any platform
-remote_filesystem=0
-"""
- test_src_bootstrap = tmpdir / 'bootstrap.cfg'
- test_src_bootstrap.write_text(test_bootstrap_content, encoding='ascii')
-
- test_dst_bootstrap = tmpdir / 'bootstrap.transformed.cfg'
- test_game_name = 'FooBar'
-
- common.transform_bootstrap_for_project(game_name=test_game_name,
- src_bootstrap=str(test_src_bootstrap),
- dst_bootstrap=str(test_dst_bootstrap))
-
- transformed_text = test_dst_bootstrap.read_text('ascii')
-
- search_gamename = re.search(r"project_path\s*=\s*(.*)", transformed_text)
- assert search_gamename
- assert search_gamename.group(1)
- assert search_gamename.group(1) == test_game_name
-
-
-def test_transform_bootstrap_project_path_missing(tmpdir):
-
- tmpdir.ensure('bootstrap.cfg')
-
- test_bootstrap_content = """
--- Blah Blah
--- Blah Blah
-
--- remote_filesystem - enable Virtual File System (VFS)
--- This feature allows a remote instance of the game to run off assets
--- on the asset processor computers cache instead of deploying them the remote device
--- By default it is off and can be overridden for any platform
-remote_filesystem=0
-"""
- test_src_bootstrap = tmpdir / 'bootstrap.cfg'
- test_src_bootstrap.write_text(test_bootstrap_content, encoding='ascii')
-
- test_dst_bootstrap = tmpdir / 'bootstrap.transformed.cfg'
- test_game_name = 'FooBar'
-
- common.transform_bootstrap_for_project(game_name=test_game_name,
- src_bootstrap=str(test_src_bootstrap),
- dst_bootstrap=str(test_dst_bootstrap))
-
- transformed_text = test_dst_bootstrap.read_text('ascii')
-
- search_gamename = re.search(r"project_path\s*=\s*(.*)", transformed_text)
- assert search_gamename
- assert search_gamename.group(1)
- assert search_gamename.group(1) == test_game_name
-
-
def test_cmake_dependency_success(tmpdir):
test_module = 'FooBar'
diff --git a/cmake/Tools/unit_test_current_project.py b/cmake/Tools/unit_test_current_project.py
deleted file mode 100755
index 7db48b62aa..0000000000
--- a/cmake/Tools/unit_test_current_project.py
+++ /dev/null
@@ -1,102 +0,0 @@
-#
-# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-# its licensors.
-#
-# For complete copyright and license terms please see the LICENSE at the root of this
-# distribution (the "License"). All use of this software is governed by the License,
-# or, if provided, by the license below or the license accompanying this file. Do not
-# remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#
-
-import os
-import pytest
-
-from . import current_project
-
-TEST_BOOTSTRAP_CONTENT_1 = """
-project_path = Game1
-foo = bar
-key1 = value1
-key2 = value2
-assets = pc
-"""
-TEST_BOOTSTRAP_CONTENT_2 = """
-project_path=Game1
-foo = bar
-key1 = value1
-key2 = value2
-assets = pc
-"""
-TEST_BOOTSTRAP_CONTENT_3 = """
-project_path= Game1
-foo = bar
-key1 = value1
-key2 = value2
-assets = pc
-"""
-TEST_BOOTSTRAP_CONTENT_4 = """
-project_path =Game1
-foo = bar
-key1 = value1
-key2 = value2
-assets = pc
-"""
-TEST_BOOTSTRAP_CONTENT_5 = """
-project_path = Game1
-foo = bar
-key1 = value1
-key2 = value2
-assets = pc
-"""
-
-@pytest.mark.parametrize(
- "contents, expected_result", [
- pytest.param(TEST_BOOTSTRAP_CONTENT_1, 'Game1'),
- pytest.param(TEST_BOOTSTRAP_CONTENT_2, 'Game1'),
- pytest.param(TEST_BOOTSTRAP_CONTENT_3, 'Game1'),
- pytest.param(TEST_BOOTSTRAP_CONTENT_4, 'Game1'),
- pytest.param(TEST_BOOTSTRAP_CONTENT_5, 'Game1'),
- ]
-)
-def test_get_current_project(tmpdir, contents, expected_result):
- dev_root = str(tmpdir.join('dev').realpath()).replace('\\', '/')
- os.makedirs(dev_root, exist_ok=True)
-
- bootstrap_file = f'{dev_root}/bootstrap.cfg'
- if os.path.isfile(bootstrap_file):
- os.unlink(bootstrap_file)
- with open(bootstrap_file, 'a') as s:
- s.write(contents)
-
- result = current_project.get_current_project(dev_root)
- assert expected_result == result
-
-
-@pytest.mark.parametrize(
- "contents, project_to_set, expected_result", [
- pytest.param(TEST_BOOTSTRAP_CONTENT_1, 'Test1', 0),
- pytest.param(TEST_BOOTSTRAP_CONTENT_1, ' Test2', 0),
- pytest.param(TEST_BOOTSTRAP_CONTENT_1, 'Test3 ', 0),
- pytest.param(TEST_BOOTSTRAP_CONTENT_1, '/Test4', 1),
- pytest.param(TEST_BOOTSTRAP_CONTENT_1, '=Test5', 1),
- ]
-)
-def test_set_current_project(tmpdir, contents, project_to_set, expected_result):
- dev_root = str(tmpdir.join('dev').realpath()).replace('\\', '/')
- os.makedirs(dev_root, exist_ok=True)
-
- bootstrap_file = f'{dev_root}/bootstrap.cfg'
- if os.path.isfile(bootstrap_file):
- os.unlink(bootstrap_file)
- with open(bootstrap_file, 'a') as s:
- s.write(contents)
-
- result = current_project.set_current_project(dev_root, project_to_set)
- assert expected_result == result
-
- if result == 0:
- project_that_is_set = current_project.get_current_project(dev_root)
- print(project_that_is_set)
- print(project_to_set)
- assert project_to_set.strip() == project_that_is_set
\ No newline at end of file
diff --git a/cmake/Tools/unit_test_layout_tool.py b/cmake/Tools/unit_test_layout_tool.py
index 5be2c23f11..37684654b1 100755
--- a/cmake/Tools/unit_test_layout_tool.py
+++ b/cmake/Tools/unit_test_layout_tool.py
@@ -212,16 +212,15 @@ def test_create_link_error():
@pytest.mark.parametrize(
- "project_path, asset_type, ensure_path, warn_on_missing, expected_result", [
- pytest.param('Foo', 'pc', 'Foo/Cache/pc/bootstrap.cfg', False, 'Foo/Cache/pc'),
- pytest.param('Foo', 'pc', 'dev/bootstrap.cfg', True, None),
- pytest.param('Foo', 'pc', 'Foo/Cache/es3/bootstrap.cfg', True, None),
- pytest.param('Foo', 'pc', 'dev/bootstrap.cfg', False, common.LmbrCmdError),
- pytest.param('Foo', 'pc', 'Foo/Cache/es3/bootstrap.cfg', False, common.LmbrCmdError),
+ "project_path, asset_type, warn_on_missing, expected_result", [
+ pytest.param('Foo', 'pc', False, 'Foo/Cache/pc'),
+ pytest.param('Foo', 'pc', True, None),
+ pytest.param('Foo', 'pc', True, None),
+ pytest.param('Foo', 'pc', False, common.LmbrCmdError),
+ pytest.param('Foo', 'pc', False, common.LmbrCmdError),
]
)
-def test_construct_and_validate_cache_game_asset_folder_success(tmpdir, project_path, asset_type, ensure_path, warn_on_missing, expected_result):
- tmpdir.ensure(ensure_path)
+def test_construct_and_validate_cache_game_asset_folder_success(tmpdir, project_path, asset_type, warn_on_missing, expected_result):
if isinstance(expected_result, str):
expected_path_realpath = str(tmpdir.join(expected_result).realpath())
elif expected_result == common.LmbrCmdError:
@@ -385,7 +384,6 @@ def test_sync_layout_non_vfs_success(tmpdir, mode, existing_game_link, existing_
old_remove_link = layout_tool.remove_link
try:
# Simple Test Parameters
- tmpdir.ensure('engine-root/bootstrap.cfg')
engine_root_realpath = str(tmpdir.join('engine-root').realpath())
test_project_path = str(tmpdir.join('Foo').realpath())
test_project_name_lower = 'foo'
diff --git a/scripts/build/package/package.py b/scripts/build/package/package.py
index 96b39f0753..4cb09f3918 100755
--- a/scripts/build/package/package.py
+++ b/scripts/build/package/package.py
@@ -25,9 +25,6 @@ from glob3 import glob
def package(options):
package_env = PackageEnv(options.platform, options.type, options.package_env)
- # Override values in bootstrap.cfg for PC package
- override_bootstrap_cfg(package_env)
-
if not package_env.get('SKIP_BUILD'):
print(package_env.get('SKIP_BUILD'))
print('SKIP_BUILD is False, running CMake build...')
@@ -51,34 +48,6 @@ def get_python_path(package_env):
return os.path.join(package_env.get('ENGINE_ROOT'), 'python', 'python.sh')
-def override_bootstrap_cfg(package_env):
- print('Override values in bootstrap.cfg')
- engine_root = package_env.get('ENGINE_ROOT')
- bootstrap_path = os.path.join(engine_root, 'bootstrap.cfg')
- replace_values = {'project_path':'{}'.format(package_env.get('BOOTSTRAP_CFG_GAME_FOLDER'))}
- try:
- with open(bootstrap_path, 'r') as bootstrap_cfg:
- content = bootstrap_cfg.read()
- except:
- error('Cannot read file {}'.format(bootstrap_path))
- content = content.split('\n')
- new_content = []
- for line in content:
- if not line.startswith('--'):
- strs = line.split('=')
- if len(strs):
- key = strs[0].strip(' ')
- if key in replace_values:
- line = '{}={}'.format(key, replace_values[key])
- new_content.append(line)
- try:
- with open(bootstrap_path, 'w') as out:
- out.write('\n'.join(new_content))
- except:
- error('Cannot write to file {}'.format(bootstrap_path))
- print('{} updated with value {}'.format(bootstrap_path, replace_values))
-
-
def cmake_build(package_env):
build_targets = package_env.get('BUILD_TARGETS')
for build_target in build_targets: