diff --git a/Assets/Editor/UI/releaseTranslations.py b/Assets/Editor/UI/releaseTranslations.py deleted file mode 100755 index 9ab0345d98..0000000000 --- a/Assets/Editor/UI/releaseTranslations.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -# -# 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 - -os.chdir('qml') -startDir = os.getcwd() - -# since it's a .exe file it will only work on windows, but we may as well -# construct the path in a platform-independent way. -lreleaseCmd = os.path.join(startDir, '..', '..', '..', - 'Code', 'SDKs', 'Qt', 'x64', 'bin', 'lrelease.exe ') - -print(startDir) - -# Korean, Japanese and Simplified Chinese -targetLanguages = ['ko', 'ja', 'zh_CN'] - -for lang in targetLanguages: - os.chdir(startDir) - tgtLang = '-target-language ' + lang - os.system(lreleaseCmd + 'this_' + lang + '.ts') - - for fileName in os.listdir(): - if not fileName.endswith(".ts"): - continue - - os.system(lreleaseCmd + ' ' + fileName) - - print(('Finished processing: ' + fileName)) diff --git a/AutomatedTesting/Config/aws_resource_mappings.json b/AutomatedTesting/Config/default_aws_resource_mappings.json similarity index 100% rename from AutomatedTesting/Config/aws_resource_mappings.json rename to AutomatedTesting/Config/default_aws_resource_mappings.json diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py index 511d9b3ecd..d8fd8b145a 100644 --- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py +++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py @@ -112,7 +112,7 @@ def remove_file(file_path: str) -> None: @pytest.mark.parametrize('project', ['AutomatedTesting']) @pytest.mark.parametrize('level', ['AWS/Metrics']) @pytest.mark.parametrize('feature_name', [AWS_METRICS_FEATURE_NAME]) -@pytest.mark.parametrize('resource_mappings_filename', ['aws_resource_mappings.json']) +@pytest.mark.parametrize('resource_mappings_filename', ['default_aws_resource_mappings.json']) @pytest.mark.parametrize('profile_name', ['AWSAutomationTest']) @pytest.mark.parametrize('region_name', ['us-west-2']) @pytest.mark.parametrize('assume_role_arn', ['arn:aws:iam::645075835648:role/o3de-automation-tests']) diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/test_anonymous_credentials.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/test_anonymous_credentials.py index f8aa5b85eb..a477e89821 100644 --- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/test_anonymous_credentials.py +++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/test_anonymous_credentials.py @@ -36,7 +36,7 @@ logger = logging.getLogger(__name__) @pytest.mark.usefixtures('cdk') @pytest.mark.parametrize('feature_name', [AWS_CLIENT_AUTH_FEATURE_NAME]) @pytest.mark.usefixtures('resource_mappings') -@pytest.mark.parametrize('resource_mappings_filename', ['aws_resource_mappings.json']) +@pytest.mark.parametrize('resource_mappings_filename', ['default_aws_resource_mappings.json']) @pytest.mark.usefixtures('aws_utils') @pytest.mark.parametrize('region_name', ['us-west-2']) @pytest.mark.parametrize('assume_role_arn', ['arn:aws:iam::645075835648:role/o3de-automation-tests']) diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/test_password_signin.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/test_password_signin.py index 28b17fdeee..a0bcf56b0d 100644 --- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/test_password_signin.py +++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/test_password_signin.py @@ -35,7 +35,7 @@ logger = logging.getLogger(__name__) @pytest.mark.usefixtures('cdk') @pytest.mark.parametrize('feature_name', [AWS_CLIENT_AUTH_FEATURE_NAME]) @pytest.mark.usefixtures('resource_mappings') -@pytest.mark.parametrize('resource_mappings_filename', ['aws_resource_mappings.json']) +@pytest.mark.parametrize('resource_mappings_filename', ['default_aws_resource_mappings.json']) @pytest.mark.usefixtures('aws_utils') @pytest.mark.parametrize('region_name', ['us-west-2']) @pytest.mark.parametrize('assume_role_arn', ['arn:aws:iam::645075835648:role/o3de-automation-tests']) diff --git a/AutomatedTesting/Gem/PythonTests/editor/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/editor/CMakeLists.txt index 834254134e..4441b4ac23 100644 --- a/AutomatedTesting/Gem/PythonTests/editor/CMakeLists.txt +++ b/AutomatedTesting/Gem/PythonTests/editor/CMakeLists.txt @@ -15,7 +15,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_ TEST_SUITE main TEST_SERIAL PATH ${CMAKE_CURRENT_LIST_DIR} - PYTEST_MARKS "not SUITE_sandbox and not SUITE_periodic and not SUITE_benchmark" + PYTEST_MARKS "SUITE_main and not REQUIRES_gpu" TIMEOUT 1500 RUNTIME_DEPENDENCIES Legacy::Editor @@ -30,7 +30,23 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_ TEST_SUITE periodic TEST_SERIAL PATH ${CMAKE_CURRENT_LIST_DIR} - PYTEST_MARKS "SUITE_periodic" + PYTEST_MARKS "SUITE_periodic and not REQUIRES_gpu" + TIMEOUT 1500 + RUNTIME_DEPENDENCIES + Legacy::Editor + AZ::AssetProcessor + AutomatedTesting.Assets + COMPONENT + Editor + ) + + ly_add_pytest( + NAME AutomatedTesting::EditorTests_Main_GPU + TEST_SUITE main + TEST_SERIAL + TEST_REQUIRES gpu + PATH ${CMAKE_CURRENT_LIST_DIR} + PYTEST_MARKS "SUITE_main and REQUIRES_gpu" TIMEOUT 1500 RUNTIME_DEPENDENCIES Legacy::Editor diff --git a/AutomatedTesting/Gem/PythonTests/editor/test_BasicEditorWorkflows.py b/AutomatedTesting/Gem/PythonTests/editor/test_BasicEditorWorkflows.py index f65401f007..1f0842dbaa 100644 --- a/AutomatedTesting/Gem/PythonTests/editor/test_BasicEditorWorkflows.py +++ b/AutomatedTesting/Gem/PythonTests/editor/test_BasicEditorWorkflows.py @@ -66,3 +66,35 @@ class TestBasicEditorWorkflows(object): timeout=log_monitor_timeout, auto_test_mode=False ) + + @pytest.mark.test_case_id("C6351273", "C6384955", "C16929880", "C15167490", "C15167491") + @pytest.mark.SUITE_main + @pytest.mark.REQUIRES_gpu + def test_BasicEditorWorkflows_GPU_LevelEntityComponentCRUD(self, request, editor, level, launcher_platform): + + # Skip test if running against Debug build + if "debug" in internal_plugin.build_directory: + pytest.skip("Does not execute against debug builds.") + + expected_lines = [ + "Create and load new level: True", + "New entity creation: True", + "Create entity hierarchy: True", + "Add component: True", + "Component update: True", + "Remove component: True", + "Save and Export: True", + "BasicEditorWorkflows_LevelEntityComponent: result=SUCCESS", + ] + + hydra.launch_and_validate_results( + request, + test_directory, + editor, + "BasicEditorWorkflows_LevelEntityComponentCRUD.py", + expected_lines, + cfg_args=[level], + timeout=log_monitor_timeout, + auto_test_mode=False, + null_renderer=False + ) diff --git a/AutomatedTesting/Registry/awscoreconfiguration.setreg b/AutomatedTesting/Registry/awscoreconfiguration.setreg index b7c60b0fb9..1927909328 100644 --- a/AutomatedTesting/Registry/awscoreconfiguration.setreg +++ b/AutomatedTesting/Registry/awscoreconfiguration.setreg @@ -4,7 +4,7 @@ "AWSCore": { "ProfileName": "AWSAutomationTest", - "ResourceMappingConfigFileName": "aws_resource_mappings.json" + "ResourceMappingConfigFileName": "default_aws_resource_mappings.json" } } } \ No newline at end of file diff --git a/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDrive_Windows.h b/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDrive_Windows.h index 479828c9d3..d51fdc36f3 100644 --- a/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDrive_Windows.h +++ b/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StorageDrive_Windows.h @@ -44,8 +44,7 @@ namespace AZ::IO //! make adjustments. For the most optimal performance align read buffers to the physicalSectorSize. u8 m_enableUnbufferedReads : 1; //! Globally enable file sharing. This allows files to used outside AZ::IO::Streamer, including other applications - //! while in use by AZ::IO::Streamer. File sharing can negatively impact performance and is recommended for - //! development only. + //! while in use by AZ::IO::Streamer. u8 m_enableSharing : 1; //! If true, only information that's explicitly requested or issues are reported. If false, status information //! such as when drives are created and destroyed is reported as well. diff --git a/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StreamerConfiguration_Windows.cpp b/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StreamerConfiguration_Windows.cpp index 5a19bc4f54..28831a00b0 100644 --- a/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StreamerConfiguration_Windows.cpp +++ b/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StreamerConfiguration_Windows.cpp @@ -312,7 +312,7 @@ namespace AZ::IO { if (reportHardware) { - AZ_Printf("Streamer", "Skipping drive '%s' because to no paths make use of it.\n", driveIt); + AZ_Printf("Streamer", "Skipping drive '%s' because no paths make use of it.\n", driveIt); } while (*driveIt++); continue; diff --git a/Code/Framework/AzCore/Tests/Platform/Windows/Tests/IO/Streamer/StorageDriveTests_Windows.cpp b/Code/Framework/AzCore/Tests/Platform/Windows/Tests/IO/Streamer/StorageDriveTests_Windows.cpp index bab531deb6..ecf6873052 100644 --- a/Code/Framework/AzCore/Tests/Platform/Windows/Tests/IO/Streamer/StorageDriveTests_Windows.cpp +++ b/Code/Framework/AzCore/Tests/Platform/Windows/Tests/IO/Streamer/StorageDriveTests_Windows.cpp @@ -46,6 +46,7 @@ namespace AZ::IO options.m_hasSeekPenalty = HasSeekPenalty; options.m_enableUnbufferedReads = TestEnableUnbufferReads; options.m_enableSharing = TestEnableSharedReads; + options.m_minimalReporting = true; return StorageDriveWin({ "c:/" }, TestMaxFileHandles, TestMaxMetaDataEntries, TestPhysicalSectorSize, TestLogicalSectorSize, TestMaxIOChannels, TestOverCommit, options); @@ -151,6 +152,7 @@ namespace AZ::IO m_configurationOptions.m_hasSeekPenalty = HasSeekPenalty; m_configurationOptions.m_enableUnbufferedReads = TestEnableUnbufferReads; m_configurationOptions.m_enableSharing = TestEnableSharedReads; + m_configurationOptions.m_minimalReporting = true; m_storageDriveWin = AZStd::make_shared(AZStd::vector{drive}, TestMaxFileHandles, TestMaxMetaDataEntries, TestPhysicalSectorSize, TestLogicalSectorSize, TestMaxIOChannels, overCommit, m_configurationOptions); @@ -1148,3 +1150,142 @@ namespace AZ::IO azfree(buffers[numRequests - 1]); } } // namespace AZ::IO + +#if defined(HAVE_BENCHMARK) + +#include + +namespace Benchmark +{ + class StorageDriveWindowsFixture : public benchmark::Fixture + { + public: + constexpr static char* TestFileName = "StreamerBenchmark.bin"; + constexpr static size_t FileSize = 64_mib; + + void SetupStreamer(bool enableFileSharing) + { + using namespace AZ::IO; + + m_fileIO = new UnitTest::TestFileIOBase(); + m_previousFileIO = AZ::IO::FileIOBase::GetInstance(); + AZ::IO::FileIOBase::SetInstance(nullptr); + AZ::IO::FileIOBase::SetInstance(m_fileIO); + + SystemFile file; + file.Open(TestFileName, SystemFile::OpenMode::SF_OPEN_CREATE | SystemFile::OpenMode::SF_OPEN_READ_WRITE); + AZStd::unique_ptr buffer(new char[FileSize]); + ::memset(buffer.get(), 'c', FileSize); + + file.Write(buffer.get(), FileSize); + file.Close(); + + AZStd::optional absolutePath = AZ::Utils::ConvertToAbsolutePath(TestFileName); + if (absolutePath.has_value()) + { + AZStd::string drive; + AZ::StringFunc::Path::GetDrive(absolutePath->c_str(), drive); + + m_absolutePath = *absolutePath; + + StorageDriveWin::ConstructionOptions options; + options.m_hasSeekPenalty = false; + options.m_enableUnbufferedReads = true; // Leave this on otherwise repeated loads will be using the Windows cache instead. + options.m_enableSharing = enableFileSharing; + options.m_minimalReporting = true; + AZStd::shared_ptr storageDriveWin = + AZStd::make_shared(AZStd::vector{ drive }, 32, 32, 4_kib, 512, 8, 0, options); + + AZStd::unique_ptr stack = AZStd::make_unique(AZStd::move(storageDriveWin)); + m_streamer = aznew Streamer(AZStd::thread_desc{}, AZStd::move(stack)); + } + } + + void TearDown([[maybe_unused]] const ::benchmark::State& state) override + { + using namespace AZ::IO; + + AZStd::string temp; + m_absolutePath.swap(temp); + + delete m_streamer; + + SystemFile::Delete(TestFileName); + + AZ::IO::FileIOBase::SetInstance(nullptr); + AZ::IO::FileIOBase::SetInstance(m_previousFileIO); + delete m_fileIO; + } + + void RepeatedlyReadFile(benchmark::State& state) + { + using namespace AZ::IO; + using namespace AZStd::chrono; + + AZStd::unique_ptr buffer(new char[FileSize]); + + for (auto _ : state) + { + AZStd::binary_semaphore waitForReads; + AZStd::atomic end; + auto callback = [&end, &waitForReads]([[maybe_unused]] FileRequestHandle request) + { + benchmark::DoNotOptimize(end = high_resolution_clock::now()); + waitForReads.release(); + }; + + FileRequestPtr request = m_streamer->Read(m_absolutePath, buffer.get(), state.range(0), state.range(0)); + m_streamer->SetRequestCompleteCallback(request, callback); + + system_clock::time_point start; + benchmark::DoNotOptimize(start = high_resolution_clock::now()); + m_streamer->QueueRequest(request); + + waitForReads.try_acquire_for(AZStd::chrono::seconds(5)); + auto durationInSeconds = duration_cast>(end.load() - start); + + state.SetIterationTime(durationInSeconds.count()); + + m_streamer->QueueRequest(m_streamer->FlushCaches()); + } + } + + AZStd::string m_absolutePath; + AZ::IO::Streamer* m_streamer{}; + AZ::IO::FileIOBase* m_previousFileIO{}; + UnitTest::TestFileIOBase* m_fileIO{}; + }; + + BENCHMARK_DEFINE_F(StorageDriveWindowsFixture, ReadsBaseline)(benchmark::State& state) + { + constexpr bool EnableFileSharing = false; + SetupStreamer(EnableFileSharing); + RepeatedlyReadFile(state); + } + + BENCHMARK_DEFINE_F(StorageDriveWindowsFixture, ReadsWithFileReadSharingEnabled)(benchmark::State& state) + { + using namespace AZ::IO; + + constexpr bool EnableFileSharing = true; + SetupStreamer(EnableFileSharing); + RepeatedlyReadFile(state); + } + + // For these benchmarks the CPU stat doesn't provide useful information because it uses GetThreadTimes on Window but since the main + // thread is mostly sleeping while waiting for the read on the Streamer thread to complete this will report values (close to) zero. + + BENCHMARK_REGISTER_F(StorageDriveWindowsFixture, ReadsBaseline) + ->RangeMultiplier(8) + ->Range(1024, 64_mib) + ->UseManualTime() + ->Unit(benchmark::kMillisecond); + + BENCHMARK_REGISTER_F(StorageDriveWindowsFixture, ReadsWithFileReadSharingEnabled) + ->RangeMultiplier(8) + ->Range(1024, 64_mib) + ->UseManualTime() + ->Unit(benchmark::kMillisecond); + +} // namespace Benchmark +#endif // HAVE_BENCHMARK diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.h b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.h index 8236683163..d50e239f9a 100644 --- a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.h +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.h @@ -198,11 +198,13 @@ namespace AzFramework AZ::SerializeContext* m_serializeContext{ nullptr }; //! The priority at which this call will be executed. SpawnablePriority m_priority{ SpawnablePriority_Default }; - //! Entity references are resolved by referring to the last entity spawned from a template entity in the spawnable. If this - //! is set to false entities from previous spawn calls are not taken into account. If set to true entity references may be - //! resolved to a previously spawned entity. A lookup table has to be constructed when true, which may negatively impact - //! performance, especially if a large number of entities are present on a ticket. - bool m_referencePreviouslySpawnedEntities{ false }; + //! Entity references are resolved by referring to the most recent entity spawned from a template entity in the spawnable. + //! If the entity referred to hasn't been spawned yet, the reference will be resolved to the first one that *will* be spawned. + //! If this flag is set to "true", the id mappings will persist across SpawnEntites calls, and the entity references will resolve + //! correctly across them. + //! When "false", the entity id mappings will be reset on this call, so entity references will only work within this call, or + //! potentially with any subsequent SpawnEntities call where the flag is true once again. + bool m_referencePreviouslySpawnedEntities{ true }; }; struct DespawnAllEntitiesOptionalArgs final diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.cpp b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.cpp index d6d005a944..8cbc60d94e 100644 --- a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.cpp +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.cpp @@ -250,10 +250,47 @@ namespace AzFramework AZ::Entity* SpawnableEntitiesManager::CloneSingleEntity(const AZ::Entity& entityTemplate, EntityIdMap& templateToCloneMap, AZ::SerializeContext& serializeContext) { - return AZ::IdUtils::Remapper::CloneObjectAndGenerateNewIdsAndFixRefs( + // If the same ID gets remapped more than once, preserve the original remapping instead of overwriting it. + constexpr bool allowDuplicateIds = false; + + return AZ::IdUtils::Remapper::CloneObjectAndGenerateNewIdsAndFixRefs( &entityTemplate, templateToCloneMap, &serializeContext); } + void SpawnableEntitiesManager::InitializeEntityIdMappings( + const Spawnable::EntityList& entities, EntityIdMap& idMap, AZStd::unordered_set& previouslySpawned) + { + // Make sure we don't have any previous data lingering around. + idMap.clear(); + previouslySpawned.clear(); + + idMap.reserve(entities.size()); + previouslySpawned.reserve(entities.size()); + + for (auto& entity : entities) + { + idMap.emplace(entity->GetId(), AZ::Entity::MakeId()); + } + } + + void SpawnableEntitiesManager::RefreshEntityIdMapping( + const AZ::EntityId& entityId, EntityIdMap& idMap, AZStd::unordered_set& previouslySpawned) + { + if (previouslySpawned.contains(entityId)) + { + // This entity has already been spawned at least once before, so we need to generate a new id for it and + // preserve the new id to fix up any future entity references to this entity. + idMap[entityId] = AZ::Entity::MakeId(); + } + else + { + // This entity hasn't been spawned yet, so use the first id we've already generated for this entity and mark + // it as spawned so we know not to reuse this id next time. + previouslySpawned.emplace(entityId); + } + } + + bool SpawnableEntitiesManager::ProcessRequest(SpawnAllEntitiesCommand& request) { Ticket& ticket = *request.m_ticket; @@ -269,18 +306,24 @@ namespace AzFramework const Spawnable::EntityList& entitiesToSpawn = ticket.m_spawnable->GetEntities(); size_t entitiesToSpawnSize = entitiesToSpawn.size(); - // Map keeps track of ids from template (spawnable) to clone (instance) - // Allowing patch ups of fields referring to entityIds outside of a given entity - EntityIdMap templateToCloneEntityIdMap; - // Reserve buffers spawnedEntities.reserve(spawnedEntities.size() + entitiesToSpawnSize); spawnedEntityIndices.reserve(spawnedEntityIndices.size() + entitiesToSpawnSize); - templateToCloneEntityIdMap.reserve(entitiesToSpawnSize); + + // Pre-generate the full set of entity id to new entity id mappings, so that during the clone operation below, + // any entity references that point to a not-yet-cloned entity will still get their ids remapped correctly. + // We clear out and regenerate the set of IDs on every SpawnAllEntities call, because presumably every entity reference + // in every entity we're about to instantiate is intended to point to an entity in our newly-instantiated batch, regardless + // of spawn order. If we didn't clear out the map, it would be possible for some entities here to have references to + // previously-spawned entities from a previous SpawnEntities or SpawnAllEntities call. + InitializeEntityIdMappings(entitiesToSpawn, ticket.m_entityIdReferenceMap, ticket.m_previouslySpawned); for (size_t i = 0; i < entitiesToSpawnSize; ++i) { - AZ::Entity* clone = CloneSingleEntity(*entitiesToSpawn[i], templateToCloneEntityIdMap, *request.m_serializeContext); + // If this entity has previously been spawned, give it a new id in the reference map + RefreshEntityIdMapping(entitiesToSpawn[i].get()->GetId(), ticket.m_entityIdReferenceMap, ticket.m_previouslySpawned); + + AZ::Entity* clone = CloneSingleEntity(*entitiesToSpawn[i], ticket.m_entityIdReferenceMap, *request.m_serializeContext); AZ_Assert(clone != nullptr, "Failed to clone spawnable entity."); spawnedEntities.emplace_back(clone); @@ -337,21 +380,17 @@ namespace AzFramework const Spawnable::EntityList& entitiesToSpawn = ticket.m_spawnable->GetEntities(); size_t entitiesToSpawnSize = request.m_entityIndices.size(); - // Reconstruct the template to entity mapping. - EntityIdMap templateToCloneEntityIdMap; - if (!request.m_referencePreviouslySpawnedEntities) + if (ticket.m_entityIdReferenceMap.empty() || !request.m_referencePreviouslySpawnedEntities) { - templateToCloneEntityIdMap.reserve(entitiesToSpawnSize); - } - else - { - templateToCloneEntityIdMap.reserve(spawnedEntitiesInitialCount + entitiesToSpawnSize); - SpawnableConstIndexEntityContainerView indexEntityView( - spawnedEntities.begin(), spawnedEntityIndices.begin(), spawnedEntities.size()); - for (auto& entry : indexEntityView) - { - templateToCloneEntityIdMap.insert_or_assign(entitiesToSpawn[entry.GetIndex()]->GetId(), entry.GetEntity()->GetId()); - } + // This map keeps track of ids from template (spawnable) to clone (instance) allowing patch ups of fields referring + // to entityIds outside of a given entity. + // We pre-generate the full set of entity id to new entity id mappings, so that during the clone operation below, + // any entity references that point to a not-yet-cloned entity will still get their ids remapped correctly. + // By default, we only initialize this map once because it needs to persist across multiple SpawnEntities calls, so + // that reference fixups work even when the entity being referenced is spawned in a different SpawnEntities + // (or SpawnAllEntities) call. + // However, the caller can also choose to reset the map by passing in "m_referencePreviouslySpawnedEntities = false". + InitializeEntityIdMappings(entitiesToSpawn, ticket.m_entityIdReferenceMap, ticket.m_previouslySpawned); } spawnedEntities.reserve(spawnedEntities.size() + entitiesToSpawnSize); @@ -361,7 +400,12 @@ namespace AzFramework { if (index < entitiesToSpawn.size()) { - AZ::Entity* clone = CloneSingleEntity(*entitiesToSpawn[index], templateToCloneEntityIdMap, *request.m_serializeContext); + // If this entity has previously been spawned, give it a new id in the reference map + RefreshEntityIdMapping( + entitiesToSpawn[index].get()->GetId(), ticket.m_entityIdReferenceMap, ticket.m_previouslySpawned); + + AZ::Entity* clone = + CloneSingleEntity(*entitiesToSpawn[index], ticket.m_entityIdReferenceMap, *request.m_serializeContext); AZ_Assert(clone != nullptr, "Failed to clone spawnable entity."); spawnedEntities.push_back(clone); @@ -451,9 +495,11 @@ namespace AzFramework ticket.m_spawnedEntities.clear(); const Spawnable::EntityList& entities = request.m_spawnable->GetEntities(); - // Map keeps track of ids from template (spawnable) to clone (instance) - // Allowing patch ups of fields referring to entityIds outside of a given entity - EntityIdMap templateToCloneEntityIdMap; + // Pre-generate the full set of entity id to new entity id mappings, so that during the clone operation below, + // any entity references that point to a not-yet-cloned entity will still get their ids remapped correctly. + // This map is intentionally cleared out and regenerated here to ensure that we're starting fresh with mappings that + // match the new set of template entities getting spawned. + InitializeEntityIdMappings(entities, ticket.m_entityIdReferenceMap, ticket.m_previouslySpawned); if (ticket.m_loadAll) { @@ -461,11 +507,13 @@ namespace AzFramework // to spawn every entity, simply start over. ticket.m_spawnedEntityIndices.clear(); size_t entitiesToSpawnSize = entities.size(); - templateToCloneEntityIdMap.reserve(entitiesToSpawnSize); for (size_t i = 0; i < entitiesToSpawnSize; ++i) { - AZ::Entity* clone = CloneSingleEntity(*entities[i], templateToCloneEntityIdMap, *request.m_serializeContext); + // If this entity has previously been spawned, give it a new id in the reference map + RefreshEntityIdMapping(entities[i].get()->GetId(), ticket.m_entityIdReferenceMap, ticket.m_previouslySpawned); + + AZ::Entity* clone = CloneSingleEntity(*entities[i], ticket.m_entityIdReferenceMap, *request.m_serializeContext); AZ_Assert(clone != nullptr, "Failed to clone spawnable entity."); ticket.m_spawnedEntities.push_back(clone); @@ -475,7 +523,7 @@ namespace AzFramework else { size_t entitiesSize = entities.size(); - templateToCloneEntityIdMap.reserve(entitiesSize); + for (size_t index : ticket.m_spawnedEntityIndices) { // It's possible for the new spawnable to have a different number of entities, so guard against this. @@ -483,7 +531,10 @@ namespace AzFramework // detected and will result in the incorrect entities being spawned. if (index < entitiesSize) { - AZ::Entity* clone = CloneSingleEntity(*entities[index], templateToCloneEntityIdMap, *request.m_serializeContext); + // If this entity has previously been spawned, give it a new id in the reference map + RefreshEntityIdMapping(entities[index].get()->GetId(), ticket.m_entityIdReferenceMap, ticket.m_previouslySpawned); + + AZ::Entity* clone = CloneSingleEntity(*entities[index], ticket.m_entityIdReferenceMap, *request.m_serializeContext); AZ_Assert(clone != nullptr, "Failed to clone spawnable entity."); ticket.m_spawnedEntities.push_back(clone); } diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.h b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.h index 5f659182d3..0c3f1c9ef5 100644 --- a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.h +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesManager.h @@ -85,6 +85,22 @@ namespace AzFramework AZ_CLASS_ALLOCATOR(Ticket, AZ::ThreadPoolAllocator, 0); static constexpr uint32_t Processing = AZStd::numeric_limits::max(); + //! Map of template entity ids to their associated instance ids. + //! Tickets can be used to spawn the same template entities multiple times, in any order, across multiple calls. + //! Since template entities can reference other entities, this map is used to fix up those references across calls + //! using the following policy: + //! - Entities referencing an entity that hasn't been spawned yet will get a reference to the id that *will* be used + //! the first time that entity will be spawned. The reference will be invalid until that entity is spawned, but + //! will be valid if/when it gets spawned. + //! - Entities referencing an entity that *has* been spawned will get a reference to the id that was *last* used to + //! spawn the entity. + //! Note that this implies a certain level of non-determinism when spawning across calls, because the entity references + //! will be based on the order in which the SpawnEntity calls occur, which can be affected by things like priority. + EntityIdMap m_entityIdReferenceMap; + //! For this to work, we also need to keep track of whether or not each entity has been spawned at least once, so we know + //! whether or not to replace the id in the map when spawning a new instance of that entity. + AZStd::unordered_set m_previouslySpawned; + AZStd::vector m_spawnedEntities; AZStd::vector m_spawnedEntityIndices; AZ::Data::Asset m_spawnable; @@ -194,6 +210,15 @@ namespace AzFramework bool ProcessRequest(BarrierCommand& request); bool ProcessRequest(DestroyTicketCommand& request); + //! Generate a base set of original-to-new entity ID mappings to use during spawning. + //! Since Entity references get fixed up on an entity-by-entity basis while spawning, it's important to have the complete + //! set of new IDs available right at the start. This way, entities that refer to other entities that haven't spawned yet + //! will still get their references remapped correctly. + void InitializeEntityIdMappings( + const Spawnable::EntityList& entities, EntityIdMap& idMap, AZStd::unordered_set& previouslySpawned); + void RefreshEntityIdMapping( + const AZ::EntityId& entityId, EntityIdMap& idMap, AZStd::unordered_set& previouslySpawned); + Queue m_highPriorityQueue; Queue m_regularPriorityQueue; diff --git a/Code/Framework/Tests/Spawnable/SpawnableEntitiesManagerTests.cpp b/Code/Framework/Tests/Spawnable/SpawnableEntitiesManagerTests.cpp index f0614aa13b..462cf949b0 100644 --- a/Code/Framework/Tests/Spawnable/SpawnableEntitiesManagerTests.cpp +++ b/Code/Framework/Tests/Spawnable/SpawnableEntitiesManagerTests.cpp @@ -32,6 +32,33 @@ namespace UnitTest } }; + // Test component that has a reference to a different entity for use in validating per-instance entity id fixups. + class ComponentWithEntityReference : public AZ::Component + { + public: + AZ_COMPONENT(ComponentWithEntityReference, "{CF5FDE59-86E5-40B6-9272-BBC1C4AFD061}"); + + void Activate() override + { + } + + void Deactivate() override + { + } + + static void Reflect(AZ::ReflectContext* reflection) + { + if (auto* serializeContext = azrtti_cast(reflection)) + { + serializeContext->Class() + ->Field("EntityReference", &ComponentWithEntityReference::m_entityReference) + ; + } + } + + AZ::EntityId m_entityReference; + }; + class SpawnableEntitiesManagerTest : public AllocatorsFixture { public: @@ -42,6 +69,8 @@ namespace UnitTest m_application = new TestApplication(); AZ::ComponentApplication::Descriptor descriptor; m_application->Start(descriptor); + m_application->RegisterComponentDescriptor(ComponentWithEntityReference::CreateDescriptor()); + // 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 // in the unit tests. @@ -80,6 +109,7 @@ namespace UnitTest void FillSpawnable(size_t numElements) { AzFramework::Spawnable::EntityList& entities = m_spawnable->GetEntities(); + entities.clear(); entities.reserve(numElements); for (size_t i=0; iGetEntities(); + size_t numElements = entities.size(); + for (size_t i = 0; i < numElements; ++i) + { + AZStd::unique_ptr& entity = entities[i]; + auto component = entity->CreateComponent(); + switch (refScheme) + { + case EntityReferenceScheme::AllReferenceFirst : + component->m_entityReference = entities[0]->GetId(); + break; + case EntityReferenceScheme::AllReferenceLast: + component->m_entityReference = entities[numElements - 1]->GetId(); + break; + case EntityReferenceScheme::AllReferenceThemselves: + component->m_entityReference = entities[i]->GetId(); + break; + case EntityReferenceScheme::AllReferenceNextCircular: + component->m_entityReference = entities[(i + 1) % numElements]->GetId(); + break; + case EntityReferenceScheme::AllReferencePreviousCircular: + component->m_entityReference = entities[(i + numElements - 1) % numElements]->GetId(); + break; + } + } + } + + // Verify that the entity references are pointing to the correct other entities within the same spawn batch. + // A "spawn batch" is the set of entities produced for each SpawnAllEntities command. + void ValidateEntityReferences( + EntityReferenceScheme refScheme, size_t entitiesPerBatch, AzFramework::SpawnableConstEntityContainerView entities) + { + size_t numElements = entities.size(); + + for (size_t i = 0; i < numElements; ++i) + { + // Calculate the element offset that's the start of each batch of entities spawned. + size_t curSpawnBatch = i / entitiesPerBatch; + size_t curBatchOffset = curSpawnBatch * entitiesPerBatch; + size_t curBatchIndex = i - curBatchOffset; + + const AZ::Entity* const entity = *(entities.begin() + i); + + auto component = entity->FindComponent(); + ASSERT_NE(nullptr, component); + AZ::EntityId comparisonId; + // Ids should be local to a batch, so each of these will be compared within a batch of entities, not globally across + // the entire set. + switch (refScheme) + { + case EntityReferenceScheme::AllReferenceFirst: + // Compare against the first entity in each batch + comparisonId = (*(entities.begin() + curBatchOffset))->GetId(); + break; + case EntityReferenceScheme::AllReferenceLast: + // Compare against the last entity in each batch + comparisonId = (*(entities.begin() + curBatchOffset + (entitiesPerBatch - 1)))->GetId(); + break; + case EntityReferenceScheme::AllReferenceThemselves: + // Compare against itself + comparisonId = entity->GetId(); + break; + case EntityReferenceScheme::AllReferenceNextCircular: + // Compare against the next entity in each batch, looping around so that the last entity in the batch should refer + // to the first entity in the batch. + comparisonId = (*(entities.begin() + curBatchOffset + ((curBatchIndex + 1) % entitiesPerBatch)))->GetId(); + break; + case EntityReferenceScheme::AllReferencePreviousCircular: + // Compare against the previous entity in each batch, looping around so that the first entity in the batch should refer + // to the last entity in the batch. + comparisonId = (*(entities.begin() + curBatchOffset + ((curBatchIndex + numElements - 1) % entitiesPerBatch)))->GetId(); + break; + } + EXPECT_EQ(comparisonId, component->m_entityReference); + } + }; + protected: AZ::Data::Asset* m_spawnableAsset { nullptr }; AzFramework::SpawnableEntitiesManager* m_manager { nullptr }; @@ -185,6 +303,73 @@ namespace UnitTest m_manager->ProcessQueue(AzFramework::SpawnableEntitiesManager::CommandQueuePriority::Regular); } + TEST_F(SpawnableEntitiesManagerTest, SpawnAllEntities_AllEntitiesReferenceOtherEntities_EntityIdsAreMappedCorrectly) + { + // This tests that entity id references get mapped correctly in a SpawnAllEntities call whether they're forward referencing + // in the list, backwards referencing, or self-referencing. The circular tests are to ensure the implementation works regardless + // of entity ordering. + for (EntityReferenceScheme refScheme : { + EntityReferenceScheme::AllReferenceFirst, EntityReferenceScheme::AllReferenceLast, + EntityReferenceScheme::AllReferenceThemselves, EntityReferenceScheme::AllReferenceNextCircular, + EntityReferenceScheme::AllReferencePreviousCircular }) + { + constexpr size_t NumEntities = 4; + FillSpawnable(NumEntities); + CreateEntityReferences(refScheme); + + auto callback = [this, refScheme, NumEntities] + (AzFramework::EntitySpawnTicket::Id, AzFramework::SpawnableConstEntityContainerView entities) + { + ValidateEntityReferences(refScheme, NumEntities, entities); + }; + AzFramework::SpawnAllEntitiesOptionalArgs optionalArgs; + optionalArgs.m_completionCallback = AZStd::move(callback); + m_manager->SpawnAllEntities(*m_ticket, AZStd::move(optionalArgs)); + m_manager->ProcessQueue(AzFramework::SpawnableEntitiesManager::CommandQueuePriority::Regular); + } + } + + TEST_F(SpawnableEntitiesManagerTest, SpawnAllEntities_AllEntitiesReferenceOtherEntities_EntityIdsOnlyReferWithinASingleCall) + { + // This tests that entity id references get mapped correctly with multiple SpawnAllEntities calls. Each call should only map + // the entities to other entities within the same call, regardless of forward or backward mapping. + // For example, suppose entities 1, 2, and 3 refer to 4. In the first SpawnAllEntities call, entities 1-3 will refer to 4. + // In the second SpawnAllEntities call, entities 1-3 will refer to the second 4, not the previously-spawned 4. + for (EntityReferenceScheme refScheme : + { EntityReferenceScheme::AllReferenceFirst, EntityReferenceScheme::AllReferenceLast, + EntityReferenceScheme::AllReferenceThemselves, EntityReferenceScheme::AllReferenceNextCircular, + EntityReferenceScheme::AllReferencePreviousCircular + }) + { + // Make sure we start with a fresh ticket each time, or else each iteration through this loop would continue to build up + // more and more entities. + delete m_ticket; + m_ticket = new AzFramework::EntitySpawnTicket(*m_spawnableAsset); + + constexpr size_t NumEntities = 4; + FillSpawnable(NumEntities); + CreateEntityReferences(refScheme); + + auto callback = [this, refScheme, NumEntities] + (AzFramework::EntitySpawnTicket::Id, AzFramework::SpawnableConstEntityContainerView entities) + { + ValidateEntityReferences(refScheme, NumEntities, entities); + }; + + // Spawn twice. + constexpr size_t NumSpawnAllCalls = 2; + for (int spawns = 0; spawns < NumSpawnAllCalls; spawns++) + { + AzFramework::SpawnAllEntitiesOptionalArgs optionalArgs; + optionalArgs.m_completionCallback = AZStd::move(callback); + m_manager->SpawnAllEntities(*m_ticket, AZStd::move(optionalArgs)); + } + + m_manager->ListEntities(*m_ticket, callback); + m_manager->ProcessQueue(AzFramework::SpawnableEntitiesManager::CommandQueuePriority::Regular); + } + } + TEST_F(SpawnableEntitiesManagerTest, SpawnAllEntities_DeleteTicketBeforeCall_NoCrash) { { @@ -363,6 +548,180 @@ namespace UnitTest m_manager->ProcessQueue(AzFramework::SpawnableEntitiesManager::CommandQueuePriority::Regular); } + TEST_F(SpawnableEntitiesManagerTest, SpawnEntities_AllEntitiesReferenceOtherEntities_ForwardReferencesWorkInSingleCall) + { + constexpr EntityReferenceScheme refScheme = EntityReferenceScheme::AllReferenceNextCircular; + constexpr size_t NumEntities = 4; + FillSpawnable(NumEntities); + CreateEntityReferences(refScheme); + + auto callback = + [this, refScheme, NumEntities](AzFramework::EntitySpawnTicket::Id, AzFramework::SpawnableConstEntityContainerView entities) + { + ValidateEntityReferences(refScheme, NumEntities, entities); + }; + + // Verify that by default, entities that refer to other entities that haven't been spawned yet have the correct references + // when the spawning all occurs in the same call + m_manager->SpawnEntities(*m_ticket, { 0, 1, 2, 3 }); + m_manager->ListEntities(*m_ticket, callback); + m_manager->ProcessQueue(AzFramework::SpawnableEntitiesManager::CommandQueuePriority::Regular); + } + + TEST_F(SpawnableEntitiesManagerTest, SpawnEntities_AllEntitiesReferenceOtherEntities_ForwardReferencesWorkAcrossCalls) + { + constexpr EntityReferenceScheme refScheme = EntityReferenceScheme::AllReferenceNextCircular; + constexpr size_t NumEntities = 4; + FillSpawnable(NumEntities); + CreateEntityReferences(refScheme); + + auto callback = + [this, refScheme, NumEntities](AzFramework::EntitySpawnTicket::Id, AzFramework::SpawnableConstEntityContainerView entities) + { + ValidateEntityReferences(refScheme, NumEntities, entities); + }; + + // Verify that by default, entities that refer to other entities that haven't been spawned yet have the correct references + // even when the spawning is across multiple calls + m_manager->SpawnEntities(*m_ticket, { 0 }); + m_manager->SpawnEntities(*m_ticket, { 1 }); + m_manager->SpawnEntities(*m_ticket, { 2 }); + m_manager->SpawnEntities(*m_ticket, { 3 }); + m_manager->ListEntities(*m_ticket, callback); + m_manager->ProcessQueue(AzFramework::SpawnableEntitiesManager::CommandQueuePriority::Regular); + } + + TEST_F(SpawnableEntitiesManagerTest, SpawnEntities_AllEntitiesReferenceOtherEntities_ReferencesPointToFirstOrLatest) + { + // With SpawnEntities, entity references should either refer to the first entity that *will* be spawned, or the last entity + // that *has* been spawned. This test will create entities 0 1 2 3 that all refer to entity 3, and it will create two batches + // of those. In the first batch, they'll forward-reference. In the second batch, they should backward-reference, except for + // the second entity 3, which will now refer to itself as the last one that's been spawned. + constexpr EntityReferenceScheme refScheme = EntityReferenceScheme::AllReferenceLast; + constexpr size_t NumEntities = 4; + FillSpawnable(NumEntities); + CreateEntityReferences(refScheme); + + auto callback = + [this, refScheme, NumEntities](AzFramework::EntitySpawnTicket::Id, AzFramework::SpawnableConstEntityContainerView entities) + { + size_t numElements = entities.size(); + + for (size_t i = 0; i < numElements; ++i) + { + const AZ::Entity* const entity = *(entities.begin() + i); + + auto component = entity->FindComponent(); + ASSERT_NE(nullptr, component); + AZ::EntityId comparisonId; + if (i < (numElements - 1)) + { + // There are two batches of NumEntities elements. Every entity should either forward-reference or backward-reference + // to the last entity of the first batch, except for the very last entity of the second batch, which should reference + // itself. + comparisonId = (*(entities.begin() + (NumEntities- 1)))->GetId(); + } + else + { + // The very last entity of the second batch should reference itself because it's now the latest instance of that + // entity to be spawned. + comparisonId = entity->GetId(); + } + + EXPECT_EQ(comparisonId, component->m_entityReference); + } + }; + + // Create 2 batches of forward references. In the first batch, entities 0 1 2 will point forward to 3. In the second batch, + // entities 0 1 2 will point *backward* to the first 3, and the second entity 3 will point to itself. + m_manager->SpawnEntities(*m_ticket, { 0, 1, 2, 3 }); + m_manager->SpawnEntities(*m_ticket, { 0, 1, 2, 3 }); + m_manager->ListEntities(*m_ticket, callback); + m_manager->ProcessQueue(AzFramework::SpawnableEntitiesManager::CommandQueuePriority::Regular); + } + + TEST_F(SpawnableEntitiesManagerTest, SpawnEntities_AllEntitiesReferenceOtherEntities_MultipleSpawnsInSameCallReferenceCorrectly) + { + // With SpawnEntities, entity references should either refer to the first entity that *will* be spawned, or the last entity + // that *has* been spawned. This test will create entities 0 1 2 3 that all refer to entity 3, and it will create three sets + // of those in the same call, with the following results: + // - The first 0 1 2 will forward-reference to the first 3 + // - The first 3 will reference itself + // - The second 0 1 2 will backwards-reference to the first 3 + // - The second 3 will reference itself + // - The third 0 1 2 will backwards-reference to the second 3 + // - The third 3 will reference itself + constexpr EntityReferenceScheme refScheme = EntityReferenceScheme::AllReferenceLast; + constexpr size_t NumEntities = 4; + FillSpawnable(NumEntities); + CreateEntityReferences(refScheme); + + auto callback = + [this, refScheme, NumEntities](AzFramework::EntitySpawnTicket::Id, AzFramework::SpawnableConstEntityContainerView entities) + { + size_t numElements = entities.size(); + + for (size_t i = 0; i < numElements; ++i) + { + const AZ::Entity* const entity = *(entities.begin() + i); + + auto component = entity->FindComponent(); + ASSERT_NE(nullptr, component); + AZ::EntityId comparisonId; + + if (i < ((NumEntities * 2) - 1)) + { + // The first 7 entities (0 1 2 3 0 1 2) will all refer to the 4th one (1st '3'). + comparisonId = (*(entities.begin() + (NumEntities - 1)))->GetId(); + } + else if (i < (numElements - 1)) + { + // The next 4 entities (3 0 1 2) will all refer to the 8th one (2nd '3'). + comparisonId = (*(entities.begin() + ((NumEntities * 2) - 1)))->GetId(); + } + else + { + // The very last entity (3) will reference itself (3rd '3'). + comparisonId = entity->GetId(); + } + + EXPECT_EQ(comparisonId, component->m_entityReference); + } + }; + + // Create the 3 batches of entities 0, 1, 2, 3. The entity references should work as described at the top of the test. + m_manager->SpawnEntities(*m_ticket, { 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3 }); + m_manager->ListEntities(*m_ticket, callback); + m_manager->ProcessQueue(AzFramework::SpawnableEntitiesManager::CommandQueuePriority::Regular); + } + + TEST_F(SpawnableEntitiesManagerTest, SpawnEntities_AllEntitiesReferenceOtherEntities_OptionalFlagClearsReferenceMap) + { + constexpr EntityReferenceScheme refScheme = EntityReferenceScheme::AllReferenceLast; + constexpr size_t NumEntities = 4; + FillSpawnable(NumEntities); + CreateEntityReferences(refScheme); + + auto callback = + [this, refScheme, NumEntities](AzFramework::EntitySpawnTicket::Id, AzFramework::SpawnableConstEntityContainerView entities) + { + ValidateEntityReferences(refScheme, NumEntities, entities); + }; + + // By setting the "referencePreviouslySpawnedEntities" flag to false, the map will get cleared on each call, so in both batches + // the entities will forward-reference to the last entity in the batch. If the flag were true, entities 0 1 2 in the second + // batch would refer backwards to the first entity 3. + + AzFramework::SpawnEntitiesOptionalArgs optionalArgsSecondBatch; + optionalArgsSecondBatch.m_completionCallback = AZStd::move(callback); + optionalArgsSecondBatch.m_referencePreviouslySpawnedEntities = false; + + m_manager->SpawnEntities(*m_ticket, { 0, 1, 2, 3 }, optionalArgsSecondBatch); + m_manager->SpawnEntities(*m_ticket, { 0, 1, 2, 3 }, AZStd::move(optionalArgsSecondBatch)); + m_manager->ListEntities(*m_ticket, callback); + m_manager->ProcessQueue(AzFramework::SpawnableEntitiesManager::CommandQueuePriority::Regular); + } + TEST_F(SpawnableEntitiesManagerTest, SpawnEntities_DeleteTicketBeforeCall_NoCrash) { { diff --git a/Code/Tools/ProjectManager/Resources/ProjectManager.qrc b/Code/Tools/ProjectManager/Resources/ProjectManager.qrc index 33acfa9e1b..014a098a91 100644 --- a/Code/Tools/ProjectManager/Resources/ProjectManager.qrc +++ b/Code/Tools/ProjectManager/Resources/ProjectManager.qrc @@ -31,5 +31,6 @@ CarrotArrowDown.svg Summary.svg WindowClose.svg + Warning.svg diff --git a/Code/Tools/ProjectManager/Resources/Warning.svg b/Code/Tools/ProjectManager/Resources/Warning.svg new file mode 100644 index 0000000000..28f7bc5f42 --- /dev/null +++ b/Code/Tools/ProjectManager/Resources/Warning.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/Code/Tools/ProjectManager/Source/CreateProjectCtrl.cpp b/Code/Tools/ProjectManager/Source/CreateProjectCtrl.cpp index 0e3a4ba95d..93f8895079 100644 --- a/Code/Tools/ProjectManager/Source/CreateProjectCtrl.cpp +++ b/Code/Tools/ProjectManager/Source/CreateProjectCtrl.cpp @@ -206,7 +206,11 @@ namespace O3DE::ProjectManager PythonBindingsInterface::Get()->AddProject(projectInfo.m_path); #ifdef TEMPLATE_GEM_CONFIGURATION_ENABLED - m_gemCatalogScreen->EnableDisableGemsForProject(projectInfo.m_path); + if (!m_gemCatalogScreen->EnableDisableGemsForProject(projectInfo.m_path)) + { + QMessageBox::critical(this, tr("Failed to configure gems"), tr("Failed to configure gems for template.")); + return; + } #endif // TEMPLATE_GEM_CONFIGURATION_ENABLED projectInfo.m_needsBuild = true; diff --git a/Code/Tools/ProjectManager/Source/EngineSettingsScreen.cpp b/Code/Tools/ProjectManager/Source/EngineSettingsScreen.cpp index cf597745ea..4efa9d1d0f 100644 --- a/Code/Tools/ProjectManager/Source/EngineSettingsScreen.cpp +++ b/Code/Tools/ProjectManager/Source/EngineSettingsScreen.cpp @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include @@ -46,28 +46,28 @@ namespace O3DE::ProjectManager m_engineVersion->lineEdit()->setReadOnly(true); layout->addWidget(m_engineVersion); - m_thirdParty = new FormBrowseEditWidget(tr("3rd Party Software Folder"), engineInfo.m_thirdPartyPath, this); + m_thirdParty = new FormFolderBrowseEditWidget(tr("3rd Party Software Folder"), engineInfo.m_thirdPartyPath, this); m_thirdParty->lineEdit()->setValidator(new PathValidator(PathValidator::PathMode::ExistingFolder, this)); m_thirdParty->lineEdit()->setReadOnly(true); m_thirdParty->setErrorLabelText(tr("Please provide a valid path to a folder that exists")); connect(m_thirdParty->lineEdit(), &QLineEdit::textChanged, this, &EngineSettingsScreen::OnTextChanged); layout->addWidget(m_thirdParty); - m_defaultProjects = new FormBrowseEditWidget(tr("Default Projects Folder"), engineInfo.m_defaultProjectsFolder, this); + m_defaultProjects = new FormFolderBrowseEditWidget(tr("Default Projects Folder"), engineInfo.m_defaultProjectsFolder, this); m_defaultProjects->lineEdit()->setValidator(new PathValidator(PathValidator::PathMode::ExistingFolder, this)); m_defaultProjects->lineEdit()->setReadOnly(true); m_defaultProjects->setErrorLabelText(tr("Please provide a valid path to a folder that exists")); connect(m_defaultProjects->lineEdit(), &QLineEdit::textChanged, this, &EngineSettingsScreen::OnTextChanged); layout->addWidget(m_defaultProjects); - m_defaultGems = new FormBrowseEditWidget(tr("Default Gems Folder"), engineInfo.m_defaultGemsFolder, this); + m_defaultGems = new FormFolderBrowseEditWidget(tr("Default Gems Folder"), engineInfo.m_defaultGemsFolder, this); m_defaultGems->lineEdit()->setValidator(new PathValidator(PathValidator::PathMode::ExistingFolder, this)); m_defaultGems->lineEdit()->setReadOnly(true); m_defaultGems->setErrorLabelText(tr("Please provide a valid path to a folder that exists")); connect(m_defaultGems->lineEdit(), &QLineEdit::textChanged, this, &EngineSettingsScreen::OnTextChanged); layout->addWidget(m_defaultGems); - m_defaultProjectTemplates = new FormBrowseEditWidget(tr("Default Project Templates Folder"), engineInfo.m_defaultTemplatesFolder, this); + m_defaultProjectTemplates = new FormFolderBrowseEditWidget(tr("Default Project Templates Folder"), engineInfo.m_defaultTemplatesFolder, this); m_defaultProjectTemplates->lineEdit()->setValidator(new PathValidator(PathValidator::PathMode::ExistingFolder, this)); m_defaultProjectTemplates->lineEdit()->setReadOnly(true); m_defaultProjectTemplates->setErrorLabelText(tr("Please provide a valid path to a folder that exists")); diff --git a/Code/Tools/ProjectManager/Source/FormBrowseEditWidget.cpp b/Code/Tools/ProjectManager/Source/FormBrowseEditWidget.cpp index c30d6a7b30..9a2227cf4a 100644 --- a/Code/Tools/ProjectManager/Source/FormBrowseEditWidget.cpp +++ b/Code/Tools/ProjectManager/Source/FormBrowseEditWidget.cpp @@ -11,13 +11,9 @@ */ #include -#include + #include #include -#include -#include -#include -#include namespace O3DE::ProjectManager { @@ -30,20 +26,4 @@ namespace O3DE::ProjectManager connect(browseButton, &QPushButton::pressed, this, &FormBrowseEditWidget::HandleBrowseButton); m_frameLayout->addWidget(browseButton); } - - void FormBrowseEditWidget::HandleBrowseButton() - { - QString defaultPath = m_lineEdit->text(); - if (defaultPath.isEmpty()) - { - defaultPath = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); - } - - QString directory = QDir::toNativeSeparators(QFileDialog::getExistingDirectory(this, tr("Browse"), defaultPath)); - if (!directory.isEmpty()) - { - m_lineEdit->setText(directory); - } - - } } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/FormBrowseEditWidget.h b/Code/Tools/ProjectManager/Source/FormBrowseEditWidget.h index 887fc29dd9..1eba97654b 100644 --- a/Code/Tools/ProjectManager/Source/FormBrowseEditWidget.h +++ b/Code/Tools/ProjectManager/Source/FormBrowseEditWidget.h @@ -27,7 +27,7 @@ namespace O3DE::ProjectManager explicit FormBrowseEditWidget(const QString& labelText, const QString& valueText = "", QWidget* parent = nullptr); ~FormBrowseEditWidget() = default; - private slots: - void HandleBrowseButton(); + protected slots: + virtual void HandleBrowseButton() = 0; }; } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/FormFolderBrowseEditWidget.cpp b/Code/Tools/ProjectManager/Source/FormFolderBrowseEditWidget.cpp new file mode 100644 index 0000000000..2c4cad5adb --- /dev/null +++ b/Code/Tools/ProjectManager/Source/FormFolderBrowseEditWidget.cpp @@ -0,0 +1,42 @@ +/* +* 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 +{ + FormFolderBrowseEditWidget::FormFolderBrowseEditWidget(const QString& labelText, const QString& valueText, QWidget* parent) + : FormBrowseEditWidget(labelText, valueText, parent) + { + } + + void FormFolderBrowseEditWidget::HandleBrowseButton() + { + QString defaultPath = m_lineEdit->text(); + if (defaultPath.isEmpty()) + { + defaultPath = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); + } + + QString directory = QDir::toNativeSeparators(QFileDialog::getExistingDirectory(this, tr("Browse"), defaultPath)); + if (!directory.isEmpty()) + { + m_lineEdit->setText(directory); + } + + } +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/FormFolderBrowseEditWidget.h b/Code/Tools/ProjectManager/Source/FormFolderBrowseEditWidget.h new file mode 100644 index 0000000000..a99fe3b5c2 --- /dev/null +++ b/Code/Tools/ProjectManager/Source/FormFolderBrowseEditWidget.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 +#endif + +namespace O3DE::ProjectManager +{ + class FormFolderBrowseEditWidget + : public FormBrowseEditWidget + { + Q_OBJECT + + public: + explicit FormFolderBrowseEditWidget(const QString& labelText, const QString& valueText = "", QWidget* parent = nullptr); + ~FormFolderBrowseEditWidget() = default; + + protected: + void HandleBrowseButton() override; + }; +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/FormImageBrowseEditWidget.cpp b/Code/Tools/ProjectManager/Source/FormImageBrowseEditWidget.cpp new file mode 100644 index 0000000000..5bb9d61dd6 --- /dev/null +++ b/Code/Tools/ProjectManager/Source/FormImageBrowseEditWidget.cpp @@ -0,0 +1,35 @@ +/* + * 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 +{ + FormImageBrowseEditWidget::FormImageBrowseEditWidget(const QString& labelText, const QString& valueText, QWidget* parent) + : FormBrowseEditWidget(labelText, valueText, parent) + { + } + + void FormImageBrowseEditWidget::HandleBrowseButton() + { + QString file = QDir::toNativeSeparators(QFileDialog::getOpenFileName( + this, tr("Select Image"), m_lineEdit->text(), tr("PNG (*.png)"))); + if (!file.isEmpty()) + { + m_lineEdit->setText(file); + } + } +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/FormImageBrowseEditWidget.h b/Code/Tools/ProjectManager/Source/FormImageBrowseEditWidget.h new file mode 100644 index 0000000000..e01e9254f8 --- /dev/null +++ b/Code/Tools/ProjectManager/Source/FormImageBrowseEditWidget.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 +#endif + +namespace O3DE::ProjectManager +{ + class FormImageBrowseEditWidget + : public FormBrowseEditWidget + { + Q_OBJECT + + public: + explicit FormImageBrowseEditWidget(const QString& labelText, const QString& valueText = "", QWidget* parent = nullptr); + ~FormImageBrowseEditWidget() = default; + + protected: + void HandleBrowseButton() override; + }; +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp index 2c92af4e51..763c9dfb75 100644 --- a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -144,12 +145,23 @@ namespace O3DE::ProjectManager } } - void GemCatalogScreen::EnableDisableGemsForProject(const QString& projectPath) + bool GemCatalogScreen::EnableDisableGemsForProject(const QString& projectPath) { IPythonBindings* pythonBindings = PythonBindingsInterface::Get(); QVector toBeAdded = m_gemModel->GatherGemsToBeAdded(); QVector toBeRemoved = m_gemModel->GatherGemsToBeRemoved(); + if (m_gemModel->DoGemsToBeAddedHaveRequirements()) + { + GemRequirementDialog* confirmRequirementsDialog = new GemRequirementDialog(m_gemModel, toBeAdded, this); + confirmRequirementsDialog->exec(); + + if (confirmRequirementsDialog->GetButtonResult() != QDialogButtonBox::ApplyRole) + { + return false; + } + } + for (const QModelIndex& modelIndex : toBeAdded) { const QString gemPath = GemModel::GetPath(modelIndex); @@ -158,6 +170,8 @@ namespace O3DE::ProjectManager { QMessageBox::critical(nullptr, "Operation failed", QString("Cannot add gem %1 to project.\n\nError:\n%2").arg(GemModel::GetName(modelIndex), result.GetError().c_str())); + + return false; } } @@ -169,8 +183,12 @@ namespace O3DE::ProjectManager { QMessageBox::critical(nullptr, "Operation failed", QString("Cannot remove gem %1 from project.\n\nError:\n%2").arg(GemModel::GetName(modelIndex), result.GetError().c_str())); + + return false; } } + + return true; } ProjectManagerScreen GemCatalogScreen::GetScreenEnum() diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.h index f5092e837a..fc771d9168 100644 --- a/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.h +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemCatalogScreen.h @@ -33,7 +33,7 @@ namespace O3DE::ProjectManager ProjectManagerScreen GetScreenEnum() override; void ReinitForProject(const QString& projectPath, bool isNewProject); - void EnableDisableGemsForProject(const QString& projectPath); + bool EnableDisableGemsForProject(const QString& projectPath); private: void FillModel(const QString& projectPath, bool isNewProject); diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemInfo.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemInfo.h index 722783ece1..f99e9689f3 100644 --- a/Code/Tools/ProjectManager/Source/GemCatalog/GemInfo.h +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemInfo.h @@ -73,6 +73,7 @@ namespace O3DE::ProjectManager Platforms m_platforms; Types m_types; //! Asset and/or Code and/or Tool QStringList m_features; + QString m_requirement; QString m_directoryLink; QString m_documentationLink; QString m_version = "Unknown Version"; diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemInspector.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemInspector.cpp index 3ecc18231e..119ec68d3a 100644 --- a/Code/Tools/ProjectManager/Source/GemCatalog/GemInspector.cpp +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemInspector.cpp @@ -16,6 +16,7 @@ #include #include #include +#include namespace O3DE::ProjectManager { @@ -70,6 +71,22 @@ namespace O3DE::ProjectManager m_directoryLinkLabel->SetUrl(m_model->GetDirectoryLink(modelIndex)); m_documentationLinkLabel->SetUrl(m_model->GetDocLink(modelIndex)); + if (m_model->HasRequirement(modelIndex)) + { + m_reqirementsIconLabel->show(); + m_reqirementsTitleLabel->show(); + m_reqirementsTextLabel->show(); + + m_reqirementsTitleLabel->setText("Requirement"); + m_reqirementsTextLabel->setText(m_model->GetRequirement(modelIndex)); + } + else + { + m_reqirementsIconLabel->hide(); + m_reqirementsTitleLabel->hide(); + m_reqirementsTextLabel->hide(); + } + // Depending and conflicting gems m_dependingGems->Update("Depending Gems", "The following Gems will be automatically enabled with this Gem.", m_model->GetDependingGemNames(modelIndex)); m_conflictingGems->Update("Conflicting Gems", "The following Gems will be automatically disabled with this Gem.", m_model->GetConflictingGemNames(modelIndex)); @@ -134,6 +151,28 @@ namespace O3DE::ProjectManager m_mainLayout->addSpacing(10); + // Requirements + m_reqirementsTitleLabel = GemInspector::CreateStyledLabel(m_mainLayout, 16, s_headerColor); + + QHBoxLayout* requrementsLayout = new QHBoxLayout(); + requrementsLayout->setAlignment(Qt::AlignTop); + requrementsLayout->setMargin(0); + requrementsLayout->setSpacing(0); + + m_reqirementsIconLabel = new QLabel(); + m_reqirementsIconLabel->setPixmap(QIcon(":/Warning.svg").pixmap(24, 24)); + requrementsLayout->addWidget(m_reqirementsIconLabel); + + m_reqirementsTextLabel = GemInspector::CreateStyledLabel(requrementsLayout, 10, s_textColor); + m_reqirementsTextLabel->setWordWrap(true); + + QSpacerItem* reqirementsSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding); + requrementsLayout->addSpacerItem(reqirementsSpacer); + + m_mainLayout->addLayout(requrementsLayout); + + m_mainLayout->addSpacing(20); + // Depending and conflicting gems m_dependingGems = new GemsSubWidget(); m_mainLayout->addWidget(m_dependingGems); diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemInspector.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemInspector.h index 69c065c81e..4363ea3bc1 100644 --- a/Code/Tools/ProjectManager/Source/GemCatalog/GemInspector.h +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemInspector.h @@ -76,6 +76,11 @@ namespace O3DE::ProjectManager LinkLabel* m_directoryLinkLabel = nullptr; LinkLabel* m_documentationLinkLabel = nullptr; + // Requirements + QLabel* m_reqirementsTitleLabel = nullptr; + QLabel* m_reqirementsIconLabel = nullptr; + QLabel* m_reqirementsTextLabel = nullptr; + // Depending and conflicting gems GemsSubWidget* m_dependingGems = nullptr; GemsSubWidget* m_conflictingGems = nullptr; diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemItemDelegate.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemItemDelegate.cpp index 03787de7e8..6529e4cf3d 100644 --- a/Code/Tools/ProjectManager/Source/GemCatalog/GemItemDelegate.cpp +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemItemDelegate.cpp @@ -11,7 +11,7 @@ */ #include -#include "GemModel.h" +#include #include #include #include diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemItemDelegate.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemItemDelegate.h index 48f173ec3f..a155d9ece0 100644 --- a/Code/Tools/ProjectManager/Source/GemCatalog/GemItemDelegate.h +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemItemDelegate.h @@ -62,7 +62,7 @@ namespace O3DE::ProjectManager inline constexpr static int s_buttonCircleRadius = s_buttonBorderRadius - 2; inline constexpr static qreal s_buttonFontSize = 10.0; - private: + protected: void CalcRects(const QStyleOptionViewItem& option, QRect& outFullRect, QRect& outItemRect, QRect& outContentRect) const; QRect GetTextRect(QFont& font, const QString& text, qreal fontSize) const; QRect CalcButtonRect(const QRect& contentRect) const; @@ -71,6 +71,7 @@ namespace O3DE::ProjectManager QAbstractItemModel* m_model = nullptr; + private: // Platform icons void AddPlatformIcon(GemInfo::Platform platform, const QString& iconPath); inline constexpr static int s_platformIconSize = 12; diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemListView.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemListView.cpp index 2838277696..575c09db05 100644 --- a/Code/Tools/ProjectManager/Source/GemCatalog/GemListView.cpp +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemListView.cpp @@ -10,11 +10,9 @@ * */ -#include "GemListView.h" -#include "GemItemDelegate.h" +#include +#include #include -#include -#include namespace O3DE::ProjectManager { diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemListView.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemListView.h index 178de2395f..5f1a018b9f 100644 --- a/Code/Tools/ProjectManager/Source/GemCatalog/GemListView.h +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemListView.h @@ -13,7 +13,6 @@ #pragma once #if !defined(Q_MOC_RUN) -#include "GemInfo.h" #include #include #include diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.cpp index 5dc40723c9..7d9d86e3a7 100644 --- a/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.cpp +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.cpp @@ -49,6 +49,7 @@ namespace O3DE::ProjectManager item->setData(gemInfo.m_binarySizeInKB, RoleBinarySize); item->setData(gemInfo.m_features, RoleFeatures); item->setData(gemInfo.m_path, RolePath); + item->setData(gemInfo.m_requirement, RoleRequirement); appendRow(item); @@ -183,6 +184,11 @@ namespace O3DE::ProjectManager return modelIndex.data(RolePath).toString(); } + QString GemModel::GetRequirement(const QModelIndex& modelIndex) + { + return modelIndex.data(RoleRequirement).toString(); + } + bool GemModel::IsAdded(const QModelIndex& modelIndex) { return modelIndex.data(RoleIsAdded).toBool(); @@ -208,6 +214,24 @@ namespace O3DE::ProjectManager return (modelIndex.data(RoleWasPreviouslyAdded).toBool() && !modelIndex.data(RoleIsAdded).toBool()); } + bool GemModel::HasRequirement(const QModelIndex& modelIndex) + { + return !modelIndex.data(RoleRequirement).toString().isEmpty(); + } + + bool GemModel::DoGemsToBeAddedHaveRequirements() const + { + for (int row = 0; row < rowCount(); ++row) + { + const QModelIndex modelIndex = index(row, 0); + if (NeedsToBeAdded(modelIndex) && HasRequirement(modelIndex)) + { + return true; + } + } + return false; + } + QVector GemModel::GatherGemsToBeAdded() const { QVector result; diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.h index 2e05472cdf..301053a9bf 100644 --- a/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.h +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemModel.h @@ -53,12 +53,16 @@ namespace O3DE::ProjectManager static int GetBinarySizeInKB(const QModelIndex& modelIndex); static QStringList GetFeatures(const QModelIndex& modelIndex); static QString GetPath(const QModelIndex& modelIndex); + static QString GetRequirement(const QModelIndex& modelIndex); static bool IsAdded(const QModelIndex& modelIndex); static void SetIsAdded(QAbstractItemModel& model, const QModelIndex& modelIndex, bool isAdded); static void SetWasPreviouslyAdded(QAbstractItemModel& model, const QModelIndex& modelIndex, bool wasAdded); static bool NeedsToBeAdded(const QModelIndex& modelIndex); static bool NeedsToBeRemoved(const QModelIndex& modelIndex); + static bool HasRequirement(const QModelIndex& modelIndex); + + bool DoGemsToBeAddedHaveRequirements() const; QVector GatherGemsToBeAdded() const; QVector GatherGemsToBeRemoved() const; @@ -84,7 +88,8 @@ namespace O3DE::ProjectManager RoleBinarySize, RoleFeatures, RoleTypes, - RolePath + RolePath, + RoleRequirement }; QHash m_nameToIndexMap; diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementDelegate.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementDelegate.cpp new file mode 100644 index 0000000000..07024a799b --- /dev/null +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementDelegate.cpp @@ -0,0 +1,93 @@ +/* +* 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 + +namespace O3DE::ProjectManager +{ + GemRequirementDelegate::GemRequirementDelegate(QAbstractItemModel* model, QObject* parent) + : GemItemDelegate(model, parent) + { + } + + void GemRequirementDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& modelIndex) const + { + if (!modelIndex.isValid()) + { + return; + } + + QStyleOptionViewItem options(option); + initStyleOption(&options, modelIndex); + + painter->save(); + painter->setRenderHint(QPainter::Antialiasing); + + QRect fullRect, itemRect, contentRect; + CalcRects(options, fullRect, itemRect, contentRect); + + QFont standardFont(options.font); + standardFont.setPixelSize(s_fontSize); + QFontMetrics standardFontMetrics(standardFont); + + painter->save(); + painter->setClipping(true); + painter->setClipRect(fullRect); + painter->setFont(options.font); + + // Draw background + painter->fillRect(fullRect, m_backgroundColor); + + // Draw item background + const QColor itemBackgroundColor = m_itemBackgroundColor; + painter->fillRect(itemRect, itemBackgroundColor); + + // Gem name + QString gemName = GemModel::GetName(modelIndex); + QFont gemNameFont(options.font); + const int firstColumnMaxTextWidth = s_summaryStartX - 30; + gemName = QFontMetrics(gemNameFont).elidedText(gemName, Qt::TextElideMode::ElideRight, firstColumnMaxTextWidth); + gemNameFont.setPixelSize(s_gemNameFontSize); + gemNameFont.setBold(true); + QRect gemNameRect = GetTextRect(gemNameFont, gemName, s_gemNameFontSize); + gemNameRect.moveTo(contentRect.left(), contentRect.center().y() - s_gemNameFontSize); + + painter->setFont(gemNameFont); + painter->setPen(m_textColor); + painter->drawText(gemNameRect, Qt::TextSingleLine, gemName); + + // Gem requirement + const QSize requirementSize = QSize(contentRect.width() - s_summaryStartX - s_itemMargins.right(), contentRect.height()); + const QRect requirementRect = QRect(QPoint(contentRect.left() + s_summaryStartX, contentRect.top()), requirementSize); + + painter->setFont(standardFont); + painter->setPen(m_textColor); + + const QString requirement = GemModel::GetRequirement(modelIndex); + painter->drawText(requirementRect, Qt::AlignLeft | Qt::TextWordWrap, requirement); + + painter->restore(); + } + + bool GemRequirementDelegate::editorEvent( + [[maybe_unused]] QEvent* event, + [[maybe_unused]] QAbstractItemModel* model, + [[maybe_unused]] const QStyleOptionViewItem& option, + [[maybe_unused]] const QModelIndex& modelIndex) + { + // Do nothing here + return false; + } +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementDelegate.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementDelegate.h new file mode 100644 index 0000000000..b221dcb8fe --- /dev/null +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementDelegate.h @@ -0,0 +1,37 @@ +/* +* 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 +#endif + + +namespace O3DE::ProjectManager +{ + class GemRequirementDelegate + : public GemItemDelegate + { + Q_OBJECT // AUTOMOC + + public: + explicit GemRequirementDelegate(QAbstractItemModel* model, QObject* parent = nullptr); + ~GemRequirementDelegate() = default; + + void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& modelIndex) const override; + bool editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& modelIndex) override; + + const QColor m_backgroundColor = QColor("#444444"); // Outside of the actual gem item + const QColor m_itemBackgroundColor = QColor("#393939"); // Background color of the gem item + }; +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementDialog.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementDialog.cpp new file mode 100644 index 0000000000..ad0e64b1ca --- /dev/null +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementDialog.cpp @@ -0,0 +1,92 @@ +/* + * 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 +#include +#include +#include +#include + +namespace O3DE::ProjectManager +{ + GemRequirementDialog::GemRequirementDialog(GemModel* model, const QVector& gemsToAdd, QWidget* parent) + : QDialog(parent) + { + setWindowTitle(tr("Manual setup is required")); + setModal(true); + + QVBoxLayout* vLayout = new QVBoxLayout(); + vLayout->setMargin(0); + vLayout->setContentsMargins(25, 10, 25, 10); + vLayout->setSizeConstraint(QLayout::SetFixedSize); + setLayout(vLayout); + + QHBoxLayout* instructionLayout = new QHBoxLayout(); + instructionLayout->setMargin(0); + + QLabel* instructionIconLabel = new QLabel(); + instructionIconLabel->setPixmap(QIcon(":/Warning.svg").pixmap(32, 32)); + instructionLayout->addWidget(instructionIconLabel); + + instructionLayout->addSpacing(10); + + QLabel* instructionLabel = new QLabel(tr("The following Gem(s) require manual setup before the project can be built successfully.")); + instructionLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); + instructionLayout->addWidget(instructionLabel); + + QSpacerItem* instructionSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum); + instructionLayout->addSpacerItem(instructionSpacer); + + vLayout->addLayout(instructionLayout); + + vLayout->addSpacing(20); + + GemRequirementFilterProxyModel* proxModel = new GemRequirementFilterProxyModel(model, gemsToAdd, this); + + GemRequirementListView* m_gemListView = new GemRequirementListView(proxModel, proxModel->GetSelectionModel(), this); + vLayout->addWidget(m_gemListView); + + QDialogButtonBox* dialogButtons = new QDialogButtonBox(); + dialogButtons->setObjectName("footer"); + vLayout->addWidget(dialogButtons); + + QPushButton* cancelButton = dialogButtons->addButton(tr("Cancel"), QDialogButtonBox::RejectRole); + cancelButton->setProperty("secondary", true); + QPushButton* continueButton = dialogButtons->addButton(tr("Continue"), QDialogButtonBox::ApplyRole); + + connect(cancelButton, &QPushButton::clicked, this, &GemRequirementDialog::CancelButtonPressed); + connect(continueButton, &QPushButton::clicked, this, &GemRequirementDialog::ContinueButtonPressed); + } + + QDialogButtonBox::ButtonRole GemRequirementDialog::GetButtonResult() + { + return m_buttonResult; + } + + void GemRequirementDialog::CancelButtonPressed() + { + m_buttonResult = QDialogButtonBox::RejectRole; + close(); + } + + void GemRequirementDialog::ContinueButtonPressed() + { + m_buttonResult = QDialogButtonBox::ApplyRole; + close(); + } + +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementDialog.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementDialog.h new file mode 100644 index 0000000000..4295c5d586 --- /dev/null +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementDialog.h @@ -0,0 +1,41 @@ +/* + * 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 +{ + QT_FORWARD_DECLARE_CLASS(GemModel) + + class GemRequirementDialog + : public QDialog + { + Q_OBJECT // AUTOMOC + public: + explicit GemRequirementDialog(GemModel* model, const QVector& gemsToAdd, QWidget *parent = nullptr); + ~GemRequirementDialog() = default; + + QDialogButtonBox::ButtonRole GetButtonResult(); + + private: + void CancelButtonPressed(); + void ContinueButtonPressed(); + + QDialogButtonBox::ButtonRole m_buttonResult = QDialogButtonBox::RejectRole; + }; +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementFilterProxyModel.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementFilterProxyModel.cpp new file mode 100644 index 0000000000..120ec63313 --- /dev/null +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementFilterProxyModel.cpp @@ -0,0 +1,51 @@ +/* +* 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 + +namespace O3DE::ProjectManager +{ + GemRequirementFilterProxyModel::GemRequirementFilterProxyModel(GemModel* sourceModel, const QVector& addedGems, QObject* parent) + : QSortFilterProxyModel(parent) + , m_sourceModel(sourceModel) + , m_addedGems(addedGems) + { + setSourceModel(sourceModel); + m_selectionProxyModel = new AzQtComponents::SelectionProxyModel(sourceModel->GetSelectionModel(), this, parent); + } + + bool GemRequirementFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const + { + // Do not use sourceParent->child because an invalid parent does not produce valid children (which our index function does) + QModelIndex sourceIndex = sourceModel()->index(sourceRow, 0, sourceParent); + if (!sourceIndex.isValid()) + { + return false; + } + + if (!m_addedGems.contains(sourceIndex)) + { + return false; + } + + if (!m_sourceModel->HasRequirement(sourceIndex)) + { + return false; + } + + return true; + } + +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementFilterProxyModel.h b/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementFilterProxyModel.h new file mode 100644 index 0000000000..a891d63d0c --- /dev/null +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementFilterProxyModel.h @@ -0,0 +1,44 @@ +/* +* 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 + +QT_FORWARD_DECLARE_CLASS(QItemSelectionModel) + +namespace O3DE::ProjectManager +{ + QT_FORWARD_DECLARE_CLASS(GemModel) + + class GemRequirementFilterProxyModel + : public QSortFilterProxyModel + { + Q_OBJECT // AUTOMOC + + public: + GemRequirementFilterProxyModel(GemModel* sourceModel, const QVector& addedGems, QObject* parent = nullptr); + + AzQtComponents::SelectionProxyModel* GetSelectionModel() const { return m_selectionProxyModel; } + + bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const override; + + private: + GemModel* m_sourceModel = nullptr; + AzQtComponents::SelectionProxyModel* m_selectionProxyModel = nullptr; + + QVector m_addedGems; + }; +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementListView.cpp b/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementListView.cpp new file mode 100644 index 0000000000..a86ae876c2 --- /dev/null +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementListView.cpp @@ -0,0 +1,30 @@ +/* +* 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 + +namespace O3DE::ProjectManager +{ + GemRequirementListView::GemRequirementListView(QAbstractItemModel* model, QItemSelectionModel* selectionModel, QWidget* parent) + : QListView(parent) + { + setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + + setStyleSheet("background-color: #444444;"); + + setModel(model); + setSelectionModel(selectionModel); + setItemDelegate(new GemRequirementDelegate(model, this)); + } +} // namespace O3DE::ProjectManager diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/StaticMeshMotionVector.azsl b/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementListView.h similarity index 52% rename from Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/StaticMeshMotionVector.azsl rename to Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementListView.h index 11bc528f3b..25b2837e30 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/StaticMeshMotionVector.azsl +++ b/Code/Tools/ProjectManager/Source/GemCatalog/GemRequirementListView.h @@ -10,23 +10,23 @@ * */ -#include "./MeshMotionVectorCommon.azsli" +#pragma once -struct VSInput +#if !defined(Q_MOC_RUN) +#include +#include +#include +#endif + +namespace O3DE::ProjectManager { - float3 m_position : POSITION; -}; - -VSOutput MainVS(VSInput IN) -{ - VSOutput OUT; - - OUT.m_worldPos = mul(SceneSrg::GetObjectToWorldMatrix(ObjectSrg::m_objectId), float4(IN.m_position, 1.0)).xyz; - OUT.m_position = mul(ViewSrg::m_viewProjectionMatrix, float4(OUT.m_worldPos, 1.0)); - OUT.m_worldPosPrev = mul(SceneSrg::GetObjectToWorldMatrixPrev(ObjectSrg::m_objectId), float4(IN.m_position, 1.0)).xyz; - - return OUT; -} - - + class GemRequirementListView + : public QListView + { + Q_OBJECT // AUTOMOC + public: + explicit GemRequirementListView(QAbstractItemModel* model, QItemSelectionModel* selectionModel, QWidget* parent = nullptr); + ~GemRequirementListView() = default; + }; +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.cpp b/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.cpp index 5faa6cb8bd..efe34f6fa6 100644 --- a/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.cpp +++ b/Code/Tools/ProjectManager/Source/NewProjectSettingsScreen.cpp @@ -12,8 +12,8 @@ #include #include -#include #include +#include #include #include #include diff --git a/Code/Tools/ProjectManager/Source/ProjectBuilder.cpp b/Code/Tools/ProjectManager/Source/ProjectBuilder.cpp index 8cdab93c6a..62f879963f 100644 --- a/Code/Tools/ProjectManager/Source/ProjectBuilder.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectBuilder.cpp @@ -11,6 +11,7 @@ */ #include +#include #include #include @@ -30,8 +31,6 @@ namespace O3DE::ProjectManager { // 10 Minutes constexpr int MaxBuildTimeMSecs = 600000; - static const QString BuildPathPostfix = "windows_vs2019"; - static const QString ErrorLogPathPostfix = "CMakeFiles/CMakeProjectBuildError.log"; ProjectBuilderWorker::ProjectBuilderWorker(const ProjectInfo& projectInfo) : QObject() @@ -83,7 +82,7 @@ namespace O3DE::ProjectManager QStringList { "-B", - QDir(m_projectInfo.m_path).filePath(BuildPathPostfix), + QDir(m_projectInfo.m_path).filePath(ProjectBuildPathPostfix), "-S", m_projectInfo.m_path, "-G", @@ -123,7 +122,7 @@ namespace O3DE::ProjectManager QStringList { "--build", - QDir(m_projectInfo.m_path).filePath(BuildPathPostfix), + QDir(m_projectInfo.m_path).filePath(ProjectBuildPathPostfix), "--target", m_projectInfo.m_projectName + ".GameLauncher", "Editor", @@ -159,8 +158,8 @@ namespace O3DE::ProjectManager QString ProjectBuilderWorker::LogFilePath() const { QDir logFilePath(m_projectInfo.m_path); - logFilePath.cd(BuildPathPostfix); - return logFilePath.filePath(ErrorLogPathPostfix); + logFilePath.cd(ProjectBuildPathPostfix); + return logFilePath.filePath(ProjectBuildErrorLogPathPostfix); } void ProjectBuilderWorker::WriteErrorLog(const QString& log) diff --git a/Code/Tools/ProjectManager/Source/ProjectButtonWidget.cpp b/Code/Tools/ProjectManager/Source/ProjectButtonWidget.cpp index 3bde0a310d..aaf87fd9cf 100644 --- a/Code/Tools/ProjectManager/Source/ProjectButtonWidget.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectButtonWidget.cpp @@ -11,6 +11,7 @@ */ #include +#include #include #include @@ -22,12 +23,11 @@ #include #include #include +#include +#include namespace O3DE::ProjectManager { - inline constexpr static int s_projectImageWidth = 210; - inline constexpr static int s_projectImageHeight = 280; - LabelButton::LabelButton(QWidget* parent) : QLabel(parent) { @@ -92,11 +92,6 @@ namespace O3DE::ProjectManager : QFrame(parent) , m_projectInfo(projectInfo) { - if (m_projectInfo.m_imagePath.isEmpty()) - { - m_projectInfo.m_imagePath = ":/DefaultProjectImage.png"; - } - BaseSetup(); if (processing) { @@ -118,20 +113,25 @@ namespace O3DE::ProjectManager setLayout(vLayout); m_projectImageLabel = new LabelButton(this); - m_projectImageLabel->setFixedSize(s_projectImageWidth, s_projectImageHeight); + m_projectImageLabel->setFixedSize(ProjectPreviewImageWidth, ProjectPreviewImageHeight); m_projectImageLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); connect(m_projectImageLabel, &LabelButton::triggered, [this]() { emit OpenProject(m_projectInfo.m_path); }); vLayout->addWidget(m_projectImageLabel); - m_projectImageLabel->setPixmap( - QPixmap(m_projectInfo.m_imagePath).scaled(m_projectImageLabel->size(), Qt::KeepAspectRatioByExpanding)); + QString projectPreviewPath = QDir(m_projectInfo.m_path).filePath(m_projectInfo.m_iconPath); + QFileInfo doesPreviewExist(projectPreviewPath); + if (!doesPreviewExist.exists() || !doesPreviewExist.isFile()) + { + projectPreviewPath = ":/DefaultProjectImage.png"; + } + m_projectImageLabel->setPixmap(QPixmap(projectPreviewPath).scaled(m_projectImageLabel->size(), Qt::KeepAspectRatioByExpanding)); m_projectFooter = new QFrame(this); QHBoxLayout* hLayout = new QHBoxLayout(); hLayout->setContentsMargins(0, 0, 0, 0); m_projectFooter->setLayout(hLayout); { - QLabel* projectNameLabel = new QLabel(m_projectInfo.m_displayName, this); + QLabel* projectNameLabel = new QLabel(m_projectInfo.GetProjectDisplayName(), this); hLayout->addWidget(projectNameLabel); } diff --git a/Code/Tools/ProjectManager/Source/ProjectInfo.cpp b/Code/Tools/ProjectManager/Source/ProjectInfo.cpp index 99649cbfdf..e7d8a6d0e7 100644 --- a/Code/Tools/ProjectManager/Source/ProjectInfo.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectInfo.cpp @@ -10,33 +10,74 @@ * */ -#include "ProjectInfo.h" +#include +#include + +#include namespace O3DE::ProjectManager { - ProjectInfo::ProjectInfo(const QString& path, const QString& projectName, const QString& displayName, - const QString& origin, const QString& summary, const QString& imagePath, const QString& backgroundImagePath, + ProjectInfo::ProjectInfo( + const QString& path, + const QString& projectName, + const QString& displayName, + const QString& origin, + const QString& summary, + const QString& iconPath, + const QString& newPreviewImagePath, + const QString& newBackgroundImagePath, bool needsBuild) : m_path(path) , m_projectName(projectName) , m_displayName(displayName) , m_origin(origin) , m_summary(summary) - , m_imagePath(imagePath) - , m_backgroundImagePath(backgroundImagePath) + , m_iconPath(iconPath) + , m_newPreviewImagePath(newPreviewImagePath) + , m_newBackgroundImagePath(newBackgroundImagePath) , m_needsBuild(needsBuild) { } - bool ProjectInfo::operator==(const ProjectInfo& rhs) + bool ProjectInfo::operator==(const ProjectInfo& rhs) const { - return m_path == rhs.m_path - && m_projectName == rhs.m_projectName - && m_imagePath == rhs.m_imagePath - && m_backgroundImagePath == rhs.m_backgroundImagePath; + if (m_path != rhs.m_path) + { + return false; + } + if (m_projectName != rhs.m_projectName) + { + return false; + } + if (m_displayName != rhs.m_displayName) + { + return false; + } + if (m_origin != rhs.m_origin) + { + return false; + } + if (m_summary != rhs.m_summary) + { + return false; + } + if (m_iconPath != rhs.m_iconPath) + { + return false; + } + if (m_newPreviewImagePath != rhs.m_newPreviewImagePath) + { + return false; + } + if (m_newBackgroundImagePath != rhs.m_newBackgroundImagePath) + { + return false; + } + + return true; } - bool ProjectInfo::operator!=(const ProjectInfo& rhs) + bool ProjectInfo::operator!=(const ProjectInfo& rhs) const { return !operator==(rhs); } @@ -45,4 +86,16 @@ namespace O3DE::ProjectManager { return !m_path.isEmpty() && !m_projectName.isEmpty(); } + + const QString& ProjectInfo::GetProjectDisplayName() const + { + if (!m_displayName.isEmpty()) + { + return m_displayName; + } + else + { + return m_projectName; + } + } } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/ProjectInfo.h b/Code/Tools/ProjectManager/Source/ProjectInfo.h index 184916a514..72f64408f4 100644 --- a/Code/Tools/ProjectManager/Source/ProjectInfo.h +++ b/Code/Tools/ProjectManager/Source/ProjectInfo.h @@ -31,14 +31,16 @@ namespace O3DE::ProjectManager const QString& displayName, const QString& origin, const QString& summary, - const QString& imagePath, - const QString& backgroundImagePath, + const QString& iconPath, + const QString& newPreviewImagePath, + const QString& newBackgroundImagePath, bool needsBuild); - bool operator==(const ProjectInfo& rhs); - bool operator!=(const ProjectInfo& rhs); + bool operator==(const ProjectInfo& rhs) const; + bool operator!=(const ProjectInfo& rhs) const; bool IsValid() const; + const QString& GetProjectDisplayName() const; // from o3de_manifest.json and o3de_projects.json QString m_path; @@ -48,14 +50,14 @@ namespace O3DE::ProjectManager QString m_displayName; QString m_origin; QString m_summary; + QString m_iconPath; QStringList m_userTags; - // Used on projects home screen - QString m_imagePath; - QString m_backgroundImagePath; + // Used as temp variable for replace images + QString m_newPreviewImagePath; + QString m_newBackgroundImagePath; // Used in project creation - bool m_needsBuild = false; //! Does this project need to be built }; } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/ProjectManagerDefs.h b/Code/Tools/ProjectManager/Source/ProjectManagerDefs.h new file mode 100644 index 0000000000..eafab28a60 --- /dev/null +++ b/Code/Tools/ProjectManager/Source/ProjectManagerDefs.h @@ -0,0 +1,24 @@ +/* + * 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 + +#include + +namespace O3DE::ProjectManager +{ + inline constexpr static int ProjectPreviewImageWidth = 210; + inline constexpr static int ProjectPreviewImageHeight = 280; + + static const QString ProjectBuildPathPostfix = "Windows_VS2019"; + static const QString ProjectBuildErrorLogPathPostfix = "CMakeFiles/CMakeProjectBuildError.log"; + static const QString ProjectPreviewImagePath = "preview.png"; +} // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.cpp b/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.cpp index b198724353..9dbbf26aa4 100644 --- a/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.cpp @@ -11,7 +11,7 @@ */ #include -#include +#include #include #include #include @@ -47,7 +47,7 @@ namespace O3DE::ProjectManager connect(m_projectName->lineEdit(), &QLineEdit::textChanged, this, &ProjectSettingsScreen::ValidateProjectName); m_verticalLayout->addWidget(m_projectName); - m_projectPath = new FormBrowseEditWidget(tr("Project Location"), "", this); + m_projectPath = new FormFolderBrowseEditWidget(tr("Project Location"), "", this); m_projectPath->lineEdit()->setReadOnly(true); connect(m_projectPath->lineEdit(), &QLineEdit::textChanged, this, &ProjectSettingsScreen::Validate); m_verticalLayout->addWidget(m_projectPath); diff --git a/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.h b/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.h index 0d75bbbc64..1b1f03051d 100644 --- a/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.h +++ b/Code/Tools/ProjectManager/Source/ProjectSettingsScreen.h @@ -32,9 +32,9 @@ namespace O3DE::ProjectManager ~ProjectSettingsScreen() = default; ProjectManagerScreen GetScreenEnum() override; - ProjectInfo GetProjectInfo(); + virtual ProjectInfo GetProjectInfo(); - bool Validate(); + virtual bool Validate(); protected slots: virtual bool ValidateProjectName(); diff --git a/Code/Tools/ProjectManager/Source/ProjectUtils.cpp b/Code/Tools/ProjectManager/Source/ProjectUtils.cpp index 3e2b3c13e1..91e7f0a719 100644 --- a/Code/Tools/ProjectManager/Source/ProjectUtils.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectUtils.cpp @@ -29,11 +29,8 @@ namespace O3DE::ProjectManager if (!QDir(path).isEmpty()) { QMessageBox::StandardButton warningResult = QMessageBox::warning( - parent, - QObject::tr("Overwrite Directory"), - QObject::tr("Directory is not empty! Are you sure you want to overwrite it?"), - QMessageBox::No | QMessageBox::Yes - ); + parent, QObject::tr("Overwrite Directory"), + QObject::tr("Directory is not empty! Are you sure you want to overwrite it?"), QMessageBox::No | QMessageBox::Yes); if (warningResult != QMessageBox::Yes) { @@ -53,14 +50,13 @@ namespace O3DE::ProjectManager { if (ancestor == descendent) { - return false; + return true; } descendent.cdUp(); - } - while (!descendent.isRoot()); + } while (!descendent.isRoot()); - return true; + return false; } static bool CopyDirectory(const QString& origPath, const QString& newPath) @@ -138,7 +134,7 @@ namespace O3DE::ProjectManager bool CopyProject(const QString& origPath, const QString& newPath) { // Disallow copying from or into subdirectory - if (!IsDirectoryDescedent(origPath, newPath) || !IsDirectoryDescedent(newPath, origPath)) + if (IsDirectoryDescedent(origPath, newPath) || IsDirectoryDescedent(newPath, origPath)) { return false; } @@ -173,20 +169,66 @@ namespace O3DE::ProjectManager return false; } - bool MoveProject(const QString& origPath, const QString& newPath, QWidget* parent) + bool MoveProject(QString origPath, QString newPath, QWidget* parent, bool ignoreRegister) { - if (!WarnDirectoryOverwrite(newPath, parent) || !UnregisterProject(origPath)) + origPath = QDir::toNativeSeparators(origPath); + newPath = QDir::toNativeSeparators(newPath); + + if (!WarnDirectoryOverwrite(newPath, parent) || (!ignoreRegister && !UnregisterProject(origPath))) { return false; } - QDir directory; - if (directory.rename(origPath, newPath)) + QDir newDirectory(newPath); + if (!newDirectory.removeRecursively()) { - return directory.rename(origPath, newPath); + return false; + } + if (!newDirectory.rename(origPath, newPath)) + { + // Likely failed because trying to move to another partition, try copying + if (!CopyProject(origPath, newPath)) + { + return false; + } + + DeleteProjectFiles(origPath, true); } - if (!RegisterProject(newPath)) + if (!ignoreRegister && !RegisterProject(newPath)) + { + return false; + } + + return true; + } + + bool ReplaceFile(const QString& origFile, const QString& newFile, QWidget* parent, bool interactive) + { + QFileInfo original(origFile); + if (original.exists()) + { + if (interactive) + { + QMessageBox::StandardButton warningResult = QMessageBox::warning( + parent, + QObject::tr("Overwrite File?"), + QObject::tr("Replacing this will overwrite the current file on disk. Are you sure?"), + QMessageBox::No | QMessageBox::Yes); + + if (warningResult == QMessageBox::No) + { + return false; + } + } + + if (!QFile::remove(origFile)) + { + return false; + } + } + + if (!QFile::copy(newFile, origFile)) { return false; } diff --git a/Code/Tools/ProjectManager/Source/ProjectUtils.h b/Code/Tools/ProjectManager/Source/ProjectUtils.h index 9c711ad187..2fa1258e8f 100644 --- a/Code/Tools/ProjectManager/Source/ProjectUtils.h +++ b/Code/Tools/ProjectManager/Source/ProjectUtils.h @@ -24,7 +24,9 @@ namespace O3DE::ProjectManager bool CopyProjectDialog(const QString& origPath, QWidget* parent = nullptr); bool CopyProject(const QString& origPath, const QString& newPath); bool DeleteProjectFiles(const QString& path, bool force = false); - bool MoveProject(const QString& origPath, const QString& newPath, QWidget* parent = nullptr); + bool MoveProject(QString origPath, QString newPath, QWidget* parent = nullptr, bool ignoreRegister = false); + + bool ReplaceFile(const QString& origFile, const QString& newFile, QWidget* parent = nullptr, bool interactive = true); bool IsVS2019Installed(); diff --git a/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp b/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp index 6633558406..d0534c1e76 100644 --- a/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp @@ -12,6 +12,7 @@ #include +#include #include #include #include @@ -35,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -218,16 +218,7 @@ namespace O3DE::ProjectManager ProjectButton* ProjectsScreen::CreateProjectButton(ProjectInfo& project, QLayout* flowLayout, bool processing) { - ProjectButton* projectButton; - - QString projectPreviewPath = project.m_path + m_projectPreviewImagePath; - QFileInfo doesPreviewExist(projectPreviewPath); - if (doesPreviewExist.exists() && doesPreviewExist.isFile()) - { - project.m_imagePath = projectPreviewPath; - } - - projectButton = new ProjectButton(project, this, processing); + ProjectButton* projectButton = new ProjectButton(project, this, processing); flowLayout->addWidget(projectButton); @@ -438,7 +429,7 @@ namespace O3DE::ProjectManager { QMessageBox::information(this, tr("Project Should be rebuilt."), - projectInfo.m_projectName + tr(" project likely needs to be rebuilt.")); + projectInfo.GetProjectDisplayName() + tr(" project likely needs to be rebuilt.")); } } @@ -499,8 +490,8 @@ namespace O3DE::ProjectManager { QMessageBox::StandardButton buildProject = QMessageBox::information( this, - tr("Building \"%1\"").arg(projectInfo.m_projectName), - tr("Ready to build \"%1\"?").arg(projectInfo.m_projectName), + tr("Building \"%1\"").arg(projectInfo.GetProjectDisplayName()), + tr("Ready to build \"%1\"?").arg(projectInfo.GetProjectDisplayName()), QMessageBox::No | QMessageBox::Yes); if (buildProject == QMessageBox::Yes) diff --git a/Code/Tools/ProjectManager/Source/ProjectsScreen.h b/Code/Tools/ProjectManager/Source/ProjectsScreen.h index bc28d4ef30..b86c2b0240 100644 --- a/Code/Tools/ProjectManager/Source/ProjectsScreen.h +++ b/Code/Tools/ProjectManager/Source/ProjectsScreen.h @@ -80,8 +80,6 @@ namespace O3DE::ProjectManager QQueue m_buildQueue; ProjectBuilderController* m_currentBuilder = nullptr; - const QString m_projectPreviewImagePath = "/preview.png"; - inline constexpr static int s_contentMargins = 80; inline constexpr static int s_spacerSize = 20; }; diff --git a/Code/Tools/ProjectManager/Source/PythonBindings.cpp b/Code/Tools/ProjectManager/Source/PythonBindings.cpp index 0e00319b6b..db376fb195 100644 --- a/Code/Tools/ProjectManager/Source/PythonBindings.cpp +++ b/Code/Tools/ProjectManager/Source/PythonBindings.cpp @@ -12,6 +12,7 @@ #include +#include // Qt defines slots, which interferes with the use here. #pragma push_macro("slots") @@ -660,6 +661,7 @@ namespace O3DE::ProjectManager gemInfo.m_displayName = Py_To_String_Optional(data, "DisplayName", gemInfo.m_name); gemInfo.m_summary = Py_To_String_Optional(data, "Summary", ""); gemInfo.m_version = Py_To_String_Optional(data, "Version", ""); + gemInfo.m_requirement = Py_To_String_Optional(data, "Requirements", ""); if (data.contains("Tags")) { @@ -693,6 +695,7 @@ namespace O3DE::ProjectManager projectInfo.m_displayName = Py_To_String_Optional(projectData, "display_name", projectInfo.m_projectName); projectInfo.m_origin = Py_To_String_Optional(projectData, "origin", projectInfo.m_origin); projectInfo.m_summary = Py_To_String_Optional(projectData, "summary", projectInfo.m_summary); + projectInfo.m_iconPath = Py_To_String_Optional(projectData, "icon", ProjectPreviewImagePath); if (projectData.contains("user_tags")) { for (auto tag : projectData["user_tags"]) @@ -786,7 +789,7 @@ namespace O3DE::ProjectManager pybind11::str(projectInfo.m_origin.toStdString()), // new_origin pybind11::str(projectInfo.m_displayName.toStdString()), // new_display pybind11::str(projectInfo.m_summary.toStdString()), // new_summary - pybind11::str(projectInfo.m_imagePath.toStdString()), // new_icon + pybind11::str(projectInfo.m_iconPath.toStdString()), // new_icon pybind11::none(), // add_tags not used pybind11::none(), // remove_tags not used pybind11::list(pybind11::cast(newTags))); // replace_tags diff --git a/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp b/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp index 409c51315d..e51d9e4996 100644 --- a/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp +++ b/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp @@ -11,6 +11,7 @@ */ #include +#include #include #include #include @@ -24,6 +25,7 @@ #include #include #include +#include namespace O3DE::ProjectManager { @@ -101,8 +103,11 @@ namespace O3DE::ProjectManager void UpdateProjectCtrl::HandleGemsButton() { - m_stack->setCurrentWidget(m_gemCatalogScreen); - Update(); + if (UpdateProjectSettings(true)) + { + m_stack->setCurrentWidget(m_gemCatalogScreen); + Update(); + } } void UpdateProjectCtrl::HandleBackButton() @@ -114,7 +119,10 @@ namespace O3DE::ProjectManager } else { - emit GotoPreviousScreenRequest(); + if (UpdateProjectSettings(true)) + { + emit GotoPreviousScreenRequest(); + } } } @@ -124,44 +132,19 @@ namespace O3DE::ProjectManager if (m_stack->currentIndex() == ScreenOrder::Settings && m_updateSettingsScreen) { - if (m_updateSettingsScreen) + if (!UpdateProjectSettings()) { - if (!m_updateSettingsScreen->Validate()) - { - QMessageBox::critical(this, tr("Invalid project settings"), tr("Invalid project settings")); - return; - } - - ProjectInfo newProjectSettings = m_updateSettingsScreen->GetProjectInfo(); - - // Update project if settings changed - if (m_projectInfo != newProjectSettings) - { - auto result = PythonBindingsInterface::Get()->UpdateProject(newProjectSettings); - if (!result.IsSuccess()) - { - QMessageBox::critical(this, tr("Project update failed"), tr(result.GetError().c_str())); - return; - } - } - - // Check if project path has changed and move it - if (newProjectSettings.m_path != m_projectInfo.m_path) - { - if (!ProjectUtils::MoveProject(m_projectInfo.m_path, newProjectSettings.m_path)) - { - QMessageBox::critical(this, tr("Project move failed"), tr("Failed to move project.")); - return; - } - } - - m_projectInfo = newProjectSettings; + return; } } else if (m_stack->currentIndex() == ScreenOrder::Gems && m_gemCatalogScreen) { // Enable or disable the gems that got adjusted in the gem catalog and apply them to the given project. - m_gemCatalogScreen->EnableDisableGemsForProject(m_projectInfo.m_path); + if (!m_gemCatalogScreen->EnableDisableGemsForProject(m_projectInfo.m_path)) + { + QMessageBox::critical(this, tr("Failed to configure gems"), tr("Failed to configure gems for project.")); + return; + } shouldRebuild = true; } @@ -190,14 +173,15 @@ namespace O3DE::ProjectManager { if (m_stack->currentIndex() == ScreenOrder::Gems) { - m_header->setTitle(QString(tr("Edit Project Settings: \"%1\"")).arg(m_projectInfo.m_projectName)); + + m_header->setTitle(QString(tr("Edit Project Settings: \"%1\"")).arg(m_projectInfo.GetProjectDisplayName())); m_header->setSubTitle(QString(tr("Configure Gems"))); - m_nextButton->setText(tr("Finalize")); + m_nextButton->setText(tr("Save")); } else { m_header->setTitle(""); - m_header->setSubTitle(QString(tr("Edit Project Settings: \"%1\"")).arg(m_projectInfo.m_projectName)); + m_header->setSubTitle(QString(tr("Edit Project Settings: \"%1\"")).arg(m_projectInfo.GetProjectDisplayName())); m_nextButton->setText(tr("Save")); } } @@ -207,4 +191,70 @@ namespace O3DE::ProjectManager m_updateSettingsScreen->SetProjectInfo(m_projectInfo); } + bool UpdateProjectCtrl::UpdateProjectSettings(bool shouldConfirm) + { + AZ_Assert(m_updateSettingsScreen, "Update settings screen is nullptr.") + + ProjectInfo newProjectSettings = m_updateSettingsScreen->GetProjectInfo(); + + if (m_projectInfo != newProjectSettings) + { + if (shouldConfirm) + { + QMessageBox::StandardButton warningResult = QMessageBox::warning( + this, + QObject::tr("Unsaved Changes!"), + QObject::tr("Would you like to save your changes to project settings?"), + QMessageBox::No | QMessageBox::Yes + ); + + if (warningResult == QMessageBox::No) + { + return true; + } + } + + if (!m_updateSettingsScreen->Validate()) + { + QMessageBox::critical(this, tr("Invalid project settings"), tr("Invalid project settings")); + return false; + } + + // Update project if settings changed + { + auto result = PythonBindingsInterface::Get()->UpdateProject(newProjectSettings); + if (!result.IsSuccess()) + { + QMessageBox::critical(this, tr("Project update failed"), tr(result.GetError().c_str())); + return false; + } + } + + // Check if project path has changed and move it + if (newProjectSettings.m_path != m_projectInfo.m_path) + { + if (!ProjectUtils::MoveProject(m_projectInfo.m_path, newProjectSettings.m_path)) + { + QMessageBox::critical(this, tr("Project move failed"), tr("Failed to move project.")); + return false; + } + } + + if (!newProjectSettings.m_newPreviewImagePath.isEmpty()) + { + if (!ProjectUtils::ReplaceFile( + QDir(newProjectSettings.m_path).filePath(newProjectSettings.m_iconPath), newProjectSettings.m_newPreviewImagePath)) + { + QMessageBox::critical(this, tr("File replace failed"), tr("Failed to replace project preview image.")); + return false; + } + m_updateSettingsScreen->ResetProjectPreviewPath(); + } + + m_projectInfo = newProjectSettings; + } + + return true; + } + } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.h b/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.h index 231bfb8f19..b8b57c0c20 100644 --- a/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.h +++ b/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.h @@ -46,6 +46,7 @@ namespace O3DE::ProjectManager private: void Update(); void UpdateSettingsScreen(); + bool UpdateProjectSettings(bool shouldConfirm = false); enum ScreenOrder { diff --git a/Code/Tools/ProjectManager/Source/UpdateProjectSettingsScreen.cpp b/Code/Tools/ProjectManager/Source/UpdateProjectSettingsScreen.cpp index c29be3c7fd..f7be7e84c3 100644 --- a/Code/Tools/ProjectManager/Source/UpdateProjectSettingsScreen.cpp +++ b/Code/Tools/ProjectManager/Source/UpdateProjectSettingsScreen.cpp @@ -11,17 +11,43 @@ */ #include -#include +#include +#include #include +#include #include #include +#include +#include namespace O3DE::ProjectManager { UpdateProjectSettingsScreen::UpdateProjectSettingsScreen(QWidget* parent) : ProjectSettingsScreen(parent) + , m_userChangedPreview(false) { + m_projectPreview = new FormImageBrowseEditWidget(tr("Project Preview"), "", this); + m_projectPreview->lineEdit()->setReadOnly(true); + connect(m_projectPreview->lineEdit(), &QLineEdit::textChanged, this, &ProjectSettingsScreen::Validate); + connect(m_projectPreview->lineEdit(), &QLineEdit::textChanged, this, &UpdateProjectSettingsScreen::PreviewPathChanged); + connect(m_projectPath->lineEdit(), &QLineEdit::textChanged, this, &UpdateProjectSettingsScreen::UpdateProjectPreviewPath); + m_verticalLayout->addWidget(m_projectPreview); + + QVBoxLayout* previewExtrasLayout = new QVBoxLayout(this); + previewExtrasLayout->setAlignment(Qt::AlignLeft); + previewExtrasLayout->setContentsMargins(50, 0, 0, 0); + + QLabel* projectPreviewLabel = new QLabel(tr("Select an image (PNG). Minimum %1 x %2 pixels.") + .arg(QString::number(ProjectPreviewImageWidth), QString::number(ProjectPreviewImageHeight))); + previewExtrasLayout->addWidget(projectPreviewLabel); + + m_projectPreviewImage = new QLabel(this); + m_projectPreviewImage->setFixedSize(ProjectPreviewImageWidth, ProjectPreviewImageHeight); + m_projectPreviewImage->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); + previewExtrasLayout->addWidget(m_projectPreviewImage); + + m_verticalLayout->addLayout(previewExtrasLayout); } ProjectManagerScreen UpdateProjectSettingsScreen::GetScreenEnum() @@ -29,10 +55,58 @@ namespace O3DE::ProjectManager return ProjectManagerScreen::UpdateProjectSettings; } + ProjectInfo UpdateProjectSettingsScreen::GetProjectInfo() + { + m_projectInfo.m_displayName = m_projectName->lineEdit()->text(); + m_projectInfo.m_path = m_projectPath->lineEdit()->text(); + + if (m_userChangedPreview) + { + m_projectInfo.m_iconPath = ProjectPreviewImagePath; + m_projectInfo.m_newPreviewImagePath = m_projectPreview->lineEdit()->text(); + } + return m_projectInfo; + } + void UpdateProjectSettingsScreen::SetProjectInfo(const ProjectInfo& projectInfo) { - m_projectName->lineEdit()->setText(projectInfo.m_projectName); + m_projectInfo = projectInfo; + + m_projectName->lineEdit()->setText(projectInfo.GetProjectDisplayName()); + m_projectPath->lineEdit()->setText(projectInfo.m_path); + UpdateProjectPreviewPath(); + } + + void UpdateProjectSettingsScreen::UpdateProjectPreviewPath() + { + if (!m_userChangedPreview) + { + m_projectPreview->lineEdit()->setText(QDir(m_projectPath->lineEdit()->text()).filePath(m_projectInfo.m_iconPath)); + // Setting the text sets m_userChangedPreview to true + // Set it back to false because it should only be true when changed by user + m_userChangedPreview = false; + } + } + + bool UpdateProjectSettingsScreen::Validate() + { + return ProjectSettingsScreen::Validate() && ValidateProjectPreview(); + } + + void UpdateProjectSettingsScreen::ResetProjectPreviewPath() + { + m_userChangedPreview = false; + UpdateProjectPreviewPath(); + } + + void UpdateProjectSettingsScreen::PreviewPathChanged() + { + m_userChangedPreview = true; + + // Update with latest image + m_projectPreviewImage->setPixmap( + QPixmap(m_projectPreview->lineEdit()->text()).scaled(m_projectPreviewImage->size(), Qt::KeepAspectRatioByExpanding)); } bool UpdateProjectSettingsScreen::ValidateProjectPath() @@ -48,4 +122,39 @@ namespace O3DE::ProjectManager return projectPathIsValid; } + bool UpdateProjectSettingsScreen::ValidateProjectPreview() + { + bool projectPreviewIsValid = true; + + if (m_projectPreview->lineEdit()->text().isEmpty()) + { + projectPreviewIsValid = false; + m_projectPreview->setErrorLabelText(tr("Please select a file.")); + } + else + { + if (m_userChangedPreview) + { + QFileInfo previewFile(m_projectPreview->lineEdit()->text()); + if (!previewFile.exists() || !previewFile.isFile()) + { + projectPreviewIsValid = false; + m_projectPreview->setErrorLabelText(tr("Please select a valid png file.")); + } + else + { + QString fileType = previewFile.completeSuffix().toLower(); + if (fileType != "png") + { + projectPreviewIsValid = false; + m_projectPreview->setErrorLabelText(tr("Please select a png image.")); + } + } + } + } + + m_projectPreview->setErrorLabelVisible(!projectPreviewIsValid); + return projectPreviewIsValid; + } + } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/Source/UpdateProjectSettingsScreen.h b/Code/Tools/ProjectManager/Source/UpdateProjectSettingsScreen.h index 95bbceb9c6..1961648b5b 100644 --- a/Code/Tools/ProjectManager/Source/UpdateProjectSettingsScreen.h +++ b/Code/Tools/ProjectManager/Source/UpdateProjectSettingsScreen.h @@ -15,6 +15,8 @@ #include #endif +QT_FORWARD_DECLARE_CLASS(QLabel) + namespace O3DE::ProjectManager { class UpdateProjectSettingsScreen @@ -25,10 +27,26 @@ namespace O3DE::ProjectManager ~UpdateProjectSettingsScreen() = default; ProjectManagerScreen GetScreenEnum() override; + ProjectInfo GetProjectInfo() override; void SetProjectInfo(const ProjectInfo& projectInfo); + bool Validate() override; + + void ResetProjectPreviewPath(); + + public slots: + void UpdateProjectPreviewPath(); + void PreviewPathChanged(); + protected: bool ValidateProjectPath() override; + virtual bool ValidateProjectPreview(); + + FormBrowseEditWidget* m_projectPreview; + QLabel* m_projectPreviewImage; + + ProjectInfo m_projectInfo; + bool m_userChangedPreview; //! Did the user change the project preview path }; } // namespace O3DE::ProjectManager diff --git a/Code/Tools/ProjectManager/project_manager_files.cmake b/Code/Tools/ProjectManager/project_manager_files.cmake index 587b5907bb..7eaeed0b96 100644 --- a/Code/Tools/ProjectManager/project_manager_files.cmake +++ b/Code/Tools/ProjectManager/project_manager_files.cmake @@ -13,6 +13,7 @@ set(FILES Source/Application.h Source/Application.cpp + Source/ProjectManagerDefs.h Source/ScreenDefs.h Source/ScreenFactory.h Source/ScreenFactory.cpp @@ -25,6 +26,10 @@ set(FILES Source/FormLineEditWidget.cpp Source/FormBrowseEditWidget.h Source/FormBrowseEditWidget.cpp + Source/FormFolderBrowseEditWidget.h + Source/FormFolderBrowseEditWidget.cpp + Source/FormImageBrowseEditWidget.h + Source/FormImageBrowseEditWidget.cpp Source/PathValidator.h Source/PathValidator.cpp Source/ProjectManagerWindow.h @@ -82,6 +87,14 @@ set(FILES Source/GemCatalog/GemListHeaderWidget.cpp Source/GemCatalog/GemModel.h Source/GemCatalog/GemModel.cpp + Source/GemCatalog/GemRequirementDialog.h + Source/GemCatalog/GemRequirementDialog.cpp + Source/GemCatalog/GemRequirementDelegate.h + Source/GemCatalog/GemRequirementDelegate.cpp + Source/GemCatalog/GemRequirementFilterProxyModel.h + Source/GemCatalog/GemRequirementFilterProxyModel.cpp + Source/GemCatalog/GemRequirementListView.h + Source/GemCatalog/GemRequirementListView.cpp Source/GemCatalog/GemSortFilterProxyModel.h Source/GemCatalog/GemSortFilterProxyModel.cpp ) diff --git a/Code/Tools/ProjectManager/project_manager_tests_files.cmake b/Code/Tools/ProjectManager/project_manager_tests_files.cmake index e1e84a43a7..e340469bcc 100644 --- a/Code/Tools/ProjectManager/project_manager_tests_files.cmake +++ b/Code/Tools/ProjectManager/project_manager_tests_files.cmake @@ -14,4 +14,5 @@ set(FILES Resources/ProjectManager.qss tests/ApplicationTests.cpp tests/main.cpp + tests/UtilsTests.cpp ) diff --git a/Code/Tools/ProjectManager/tests/UtilsTests.cpp b/Code/Tools/ProjectManager/tests/UtilsTests.cpp new file mode 100644 index 0000000000..e248d37bee --- /dev/null +++ b/Code/Tools/ProjectManager/tests/UtilsTests.cpp @@ -0,0 +1,120 @@ +/* + * 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 +#include +#include +#include +#include +#include + +namespace O3DE::ProjectManager +{ + namespace ProjectUtils + { + class ProjectManagerUtilsTests + : public ::UnitTest::ScopedAllocatorSetupFixture + { + public: + ProjectManagerUtilsTests() + { + m_application = AZStd::make_unique(); + m_application->Init(false); + + QDir dir; + dir.mkdir("ProjectA"); + dir.mkdir("ProjectB"); + + QFile origFile("ProjectA/origFile.txt"); + if (origFile.open(QIODevice::ReadWrite)) + { + QTextStream stream(&origFile); + stream << "orig" << Qt::endl; + origFile.close(); + } + + QFile replaceFile("ProjectA/replaceFile.txt"); + if (replaceFile.open(QIODevice::ReadWrite)) + { + QTextStream stream(&replaceFile); + stream << "replace" << Qt::endl; + replaceFile.close(); + } + } + + ~ProjectManagerUtilsTests() + { + QDir dirA("ProjectA"); + dirA.removeRecursively(); + + QDir dirB("ProjectB"); + dirB.removeRecursively(); + + m_application.reset(); + } + + AZStd::unique_ptr m_application; + }; + +#if AZ_TRAIT_DISABLE_FAILED_PROJECT_MANAGER_TESTS + TEST_F(ProjectManagerUtilsTests, DISABLED_MoveProject_Succeeds) +#else + TEST_F(ProjectManagerUtilsTests, MoveProject_Succeeds) +#endif // !AZ_TRAIT_DISABLE_FAILED_PROJECT_MANAGER_TESTS + { + EXPECT_TRUE(MoveProject( + QDir::currentPath() + QDir::separator() + "ProjectA", + QDir::currentPath() + QDir::separator() + "ProjectB", + nullptr, true)); + + QFileInfo origFile("ProjectA/origFile.txt"); + EXPECT_TRUE(!origFile.exists()); + + QFileInfo replaceFile("ProjectA/replaceFile.txt"); + EXPECT_TRUE(!replaceFile.exists()); + + QFileInfo origFileMoved("ProjectB/origFile.txt"); + EXPECT_TRUE(origFileMoved.exists() && origFileMoved.isFile()); + + QFileInfo replaceFileMoved("ProjectB/replaceFile.txt"); + EXPECT_TRUE(replaceFileMoved.exists() && replaceFileMoved.isFile()); + } + +#if AZ_TRAIT_DISABLE_FAILED_PROJECT_MANAGER_TESTS + TEST_F(ProjectManagerUtilsTests, DISABLED_ReplaceFile_Succeeds) +#else + TEST_F(ProjectManagerUtilsTests, ReplaceFile_Succeeds) +#endif // !AZ_TRAIT_DISABLE_FAILED_PROJECT_MANAGER_TESTS + { + EXPECT_TRUE(ReplaceFile("ProjectA/origFile.txt", "ProjectA/replaceFile.txt", nullptr, false)); + + QFile origFile("ProjectA/origFile.txt"); + if (origFile.open(QIODevice::ReadOnly)) + { + QTextStream stream(&origFile); + QString line = stream.readLine(); + EXPECT_EQ(line, "replace"); + + origFile.close(); + } + else + { + FAIL(); + } + } + } // namespace ProjectUtils +} // namespace O3DE::ProjectManager diff --git a/Gems/AWSClientAuth/Code/Source/Authentication/AWSCognitoAuthenticationProvider.cpp b/Gems/AWSClientAuth/Code/Source/Authentication/AWSCognitoAuthenticationProvider.cpp index 74865c0044..20f5bf68cc 100644 --- a/Gems/AWSClientAuth/Code/Source/Authentication/AWSCognitoAuthenticationProvider.cpp +++ b/Gems/AWSClientAuth/Code/Source/Authentication/AWSCognitoAuthenticationProvider.cpp @@ -146,12 +146,12 @@ namespace AWSClientAuth void AWSCognitoAuthenticationProvider::DeviceCodeGrantSignInAsync() { - AZ_Assert(true, "Not supported"); + AZ_Assert(false, "Not supported"); } void AWSCognitoAuthenticationProvider::DeviceCodeGrantConfirmSignInAsync() { - AZ_Assert(true, "Not supported"); + AZ_Assert(false, "Not supported"); } void AWSCognitoAuthenticationProvider::RefreshTokensAsync() diff --git a/Gems/AWSClientAuth/Code/Source/Authentication/AuthenticationProviderManager.cpp b/Gems/AWSClientAuth/Code/Source/Authentication/AuthenticationProviderManager.cpp index d4d2d0d67b..fe8c526a11 100644 --- a/Gems/AWSClientAuth/Code/Source/Authentication/AuthenticationProviderManager.cpp +++ b/Gems/AWSClientAuth/Code/Source/Authentication/AuthenticationProviderManager.cpp @@ -53,7 +53,7 @@ namespace AWSClientAuth if (!m_settingsRegistry->MergeSettingsFile(resolvedPath.data(), AZ::SettingsRegistryInterface::Format::JsonMergePatch)) { - AZ_Error("AuthenticationProviderManager", true, "Error merging settings registry for path: %s", resolvedPath.data()); + AZ_Error("AuthenticationProviderManager", false, "Error merging settings registry for path: %s", resolvedPath.data()); return false; } @@ -199,7 +199,7 @@ namespace AWSClientAuth { return enumValue.value(); } - AZ_Warning("AuthenticationProviderManager", true, "Incorrect string value for enum: %s", name.c_str()); + AZ_Warning("AuthenticationProviderManager", false, "Incorrect string value for enum: %s", name.c_str()); return ProviderNameEnum::None; } diff --git a/Gems/AWSClientAuth/Code/Source/Authentication/GoogleAuthenticationProvider.cpp b/Gems/AWSClientAuth/Code/Source/Authentication/GoogleAuthenticationProvider.cpp index 7762b3919b..efabaf5fc1 100644 --- a/Gems/AWSClientAuth/Code/Source/Authentication/GoogleAuthenticationProvider.cpp +++ b/Gems/AWSClientAuth/Code/Source/Authentication/GoogleAuthenticationProvider.cpp @@ -39,7 +39,7 @@ namespace AWSClientAuth { if (!settingsRegistry.lock()->GetObject(m_settings.get(), azrtti_typeid(m_settings.get()), GoogleSettingsPath)) { - AZ_Warning("AWSCognitoAuthenticationProvider", true, "Failed to get Google settings object for path %s", GoogleSettingsPath); + AZ_Warning("AWSCognitoAuthenticationProvider", false, "Failed to get Google settings object for path %s", GoogleSettingsPath); return false; } return true; @@ -49,21 +49,21 @@ namespace AWSClientAuth { AZ_UNUSED(username); AZ_UNUSED(password); - AZ_Assert(true, "Not supported"); + AZ_Assert(false, "Not supported"); } void GoogleAuthenticationProvider::PasswordGrantMultiFactorSignInAsync(const AZStd::string& username, const AZStd::string& password) { AZ_UNUSED(username); AZ_UNUSED(password); - AZ_Assert(true, "Not supported"); + AZ_Assert(false, "Not supported"); } void GoogleAuthenticationProvider::PasswordGrantMultiFactorConfirmSignInAsync(const AZStd::string& username, const AZStd::string& confirmationCode) { AZ_UNUSED(username); AZ_UNUSED(confirmationCode); - AZ_Assert(true, "Not supported"); + AZ_Assert(false, "Not supported"); } // Call Google authentication provider device code end point. diff --git a/Gems/AWSClientAuth/Code/Source/Authentication/LWAAuthenticationProvider.cpp b/Gems/AWSClientAuth/Code/Source/Authentication/LWAAuthenticationProvider.cpp index a86e01a58e..f43611f2c0 100644 --- a/Gems/AWSClientAuth/Code/Source/Authentication/LWAAuthenticationProvider.cpp +++ b/Gems/AWSClientAuth/Code/Source/Authentication/LWAAuthenticationProvider.cpp @@ -38,7 +38,7 @@ namespace AWSClientAuth { if (!settingsRegistry.lock()->GetObject(m_settings.get(), azrtti_typeid(m_settings.get()), LwaSettingsPath)) { - AZ_Warning("AWSCognitoAuthenticationProvider", true, "Failed to get login with Amazon settings object for path %s", LwaSettingsPath); + AZ_Warning("AWSCognitoAuthenticationProvider", false, "Failed to get login with Amazon settings object for path %s", LwaSettingsPath); return false; } return true; @@ -48,21 +48,21 @@ namespace AWSClientAuth { AZ_UNUSED(username); AZ_UNUSED(password); - AZ_Assert(true, "Not supported"); + AZ_Assert(false, "Not supported"); } void LWAAuthenticationProvider::PasswordGrantMultiFactorSignInAsync(const AZStd::string& username, const AZStd::string& password) { AZ_UNUSED(username); AZ_UNUSED(password); - AZ_Assert(true, "Not supported"); + AZ_Assert(false, "Not supported"); } void LWAAuthenticationProvider::PasswordGrantMultiFactorConfirmSignInAsync(const AZStd::string& username, const AZStd::string& confirmationCode) { AZ_UNUSED(username); AZ_UNUSED(confirmationCode); - AZ_Assert(true, "Not supported"); + AZ_Assert(false, "Not supported"); } // Call LWA authentication provider device code end point. diff --git a/Gems/AWSClientAuth/Code/Source/Authorization/AWSCognitoAuthorizationController.cpp b/Gems/AWSClientAuth/Code/Source/Authorization/AWSCognitoAuthorizationController.cpp index 5e2c07bdbb..1cae2bd0b1 100644 --- a/Gems/AWSClientAuth/Code/Source/Authorization/AWSCognitoAuthorizationController.cpp +++ b/Gems/AWSClientAuth/Code/Source/Authorization/AWSCognitoAuthorizationController.cpp @@ -149,7 +149,7 @@ namespace AWSClientAuth } else { - AZ_Warning("AWSCognitoAuthorizationController", true, "No logins found. Fetching anonymous/unauthenticated credentials"); + AZ_Warning("AWSCognitoAuthorizationController", false, "No logins found. Fetching anonymous/unauthenticated credentials"); } AZ::JobContext* jobContext = nullptr; @@ -277,7 +277,7 @@ namespace AWSClientAuth // Check anonymous credentials as they are optional settings in Cognito Identity pool. if (!m_cognitoCachingAnonymousCredentialsProvider->GetAWSCredentials().IsEmpty()) { - AZ_Warning("AWSCognitoAuthorizationCredentialHandler", true, "No logins found. Using Anonymous credential provider"); + AZ_Warning("AWSCognitoAuthorizationCredentialHandler", false, "No logins found. Using Anonymous credential provider"); return m_cognitoCachingAnonymousCredentialsProvider; } diff --git a/Gems/AWSClientAuth/Code/Tests/Authentication/AuthenticationProviderManagerScriptCanvasBusTest.cpp b/Gems/AWSClientAuth/Code/Tests/Authentication/AuthenticationProviderManagerScriptCanvasBusTest.cpp index 7673840299..6aef72af7e 100644 --- a/Gems/AWSClientAuth/Code/Tests/Authentication/AuthenticationProviderManagerScriptCanvasBusTest.cpp +++ b/Gems/AWSClientAuth/Code/Tests/Authentication/AuthenticationProviderManagerScriptCanvasBusTest.cpp @@ -257,5 +257,5 @@ TEST_F(AuthenticationProviderManagerScriptCanvasTest, Initialize_Fail_InvalidPat { AZ_TEST_START_TRACE_SUPPRESSION; ASSERT_FALSE(m_mockController->Initialize(m_enabledProviderNames, "")); - AZ_TEST_STOP_TRACE_SUPPRESSION(1); + AZ_TEST_STOP_TRACE_SUPPRESSION(2); } diff --git a/Gems/AWSClientAuth/Code/Tests/Authentication/AuthenticationProviderManagerTest.cpp b/Gems/AWSClientAuth/Code/Tests/Authentication/AuthenticationProviderManagerTest.cpp index 4b5bdfb841..ce91e29a1a 100644 --- a/Gems/AWSClientAuth/Code/Tests/Authentication/AuthenticationProviderManagerTest.cpp +++ b/Gems/AWSClientAuth/Code/Tests/Authentication/AuthenticationProviderManagerTest.cpp @@ -256,5 +256,5 @@ TEST_F(AuthenticationProviderManagerTest, Initialize_Fail_InvalidPath) { AZ_TEST_START_TRACE_SUPPRESSION; ASSERT_FALSE(m_mockController->Initialize(m_enabledProviderNames, "")); - AZ_TEST_STOP_TRACE_SUPPRESSION(1); + AZ_TEST_STOP_TRACE_SUPPRESSION(2); } diff --git a/Gems/AWSClientAuth/cdk/README.md b/Gems/AWSClientAuth/cdk/README.md index 4fe668cb9d..3bc2b59fc1 100644 --- a/Gems/AWSClientAuth/cdk/README.md +++ b/Gems/AWSClientAuth/cdk/README.md @@ -51,6 +51,13 @@ To add additional dependencies, for example other CDK libraries, just add them to your requirements.txt file and rerun the `..\..\..\Lumberyard\python\pip.cmd install -r .\Gems\AWSClientAuth\cdk\requirements.txt` command. + +## Update Authorization Permissions +To give permissions to call AWS resources, please update CognitoIdentityPoolRole class with correct policy statements. + +An example IAM permission policy is provided to grant both authenticated and unauthenticated the permission to list S3 buckets in the project. +However, it is expected that developers replace these permissions with those required by your users to use your resources. + ## Useful commands * `cdk ls` list all stacks in the app diff --git a/Gems/AWSClientAuth/cdk/auth/cognito_identity_pool_role.py b/Gems/AWSClientAuth/cdk/auth/cognito_identity_pool_role.py index 3a2e413617..52df897db9 100755 --- a/Gems/AWSClientAuth/cdk/auth/cognito_identity_pool_role.py +++ b/Gems/AWSClientAuth/cdk/auth/cognito_identity_pool_role.py @@ -53,14 +53,17 @@ class CognitoIdentityPoolRole: } }, assume_role_action='sts:AssumeRoleWithWebIdentity')) - # basic permissions + # The above role is created for developers to add custom permissions that they need to provide authorized + # clients. Developers should update the policy statements below to add their required permissions. + # As an example s3:ListBuckets permissions are provided. + # Note: There must be at least one policy statement here. stack_statement = iam.PolicyStatement( actions=[ 's3:ListBuckets' ], effect=iam.Effect.ALLOW, resources=[ - '*' + f'arn:aws:s3:::{project_name}/*' ], sid=name_utils.format_aws_resource_sid(feature_name, project_name, iam.PolicyStatement.__name__) ) diff --git a/Gems/AWSClientAuth/cdk/auth/cognito_user_pool_sms_role.py b/Gems/AWSClientAuth/cdk/auth/cognito_user_pool_sms_role.py index 286b439a76..c4a442f481 100755 --- a/Gems/AWSClientAuth/cdk/auth/cognito_user_pool_sms_role.py +++ b/Gems/AWSClientAuth/cdk/auth/cognito_user_pool_sms_role.py @@ -32,12 +32,18 @@ class CognitoUserPoolSMSRole: name_utils.format_aws_resource_id(feature_name, project_name, env, iam.Role.__name__), description='Role permissions used by Cognito user pool to send sms', assumed_by=iam.ServicePrincipal("cognito-idp.amazonaws.com"), + # Deny all others and then allow only for the current sms role. inline_policies={ 'SNSRoleInlinePolicy': iam.PolicyDocument( statements=[ + # SMS role will be used by CognitoIDP tp allow to publish to SNS topic owned by CognitoIDP + # team to push a sms. + # Need to use * as the resource name used by CognitoIDP principal service is unknown. iam.PolicyStatement( - actions=["sns:Publish"], resources=["*"] + effect=iam.Effect.ALLOW, + actions=['sns:Publish'], + resources=['*'] ) ] ) diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp index 7114b50906..7697b7820b 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp @@ -72,22 +72,43 @@ namespace AZ static constexpr uint32_t ShaderVariantJobVariantParam = 3; static constexpr uint32_t ShouldExitEarlyFromProcessJobParam = 4; - static void AddShaderAssetJobDependency( - AssetBuilderSDK::JobDescriptor& jobDescriptor, - const AssetBuilderSDK::PlatformInfo& platformInfo, - const AZStd::string& shaderVariantListFilePath, - const AZStd::string& shaderFilePath) + //! Adds source file dependencies for every place a referenced file may appear, and detects if one of + //! those possible paths resolves to the expected file. + //! @param currentFilePath - the full path to the file being processed + //! @param referencedParentPath - the path to a reference file, which may be relative to the @currentFilePath, or may be a full asset path. + //! @param sourceFileDependencies - new source file dependencies will be added to this list + //! @param foundSourceFile - if one of the source file dependencies is found, the highest priority one will be indicated here, otherwise this will be empty. + //! @return true if the referenced file was found and @foundSourceFile was set + bool LocateReferencedSourceFile( + AZStd::string_view currentFilePath, AZStd::string_view referencedParentPath, + AZStd::vector& sourceFileDependencies, + AZStd::string& foundSourceFile) { - AZStd::vector possibleDependencies = AZ::RPI::AssetUtils::GetPossibleDepenencyPaths(shaderVariantListFilePath, shaderFilePath); + foundSourceFile.clear(); + + bool found = false; + + AZStd::vector possibleDependencies = RPI::AssetUtils::GetPossibleDepenencyPaths(currentFilePath, referencedParentPath); for (auto& file : possibleDependencies) { - AssetBuilderSDK::JobDependency jobDependency; - jobDependency.m_jobKey = ShaderAssetBuilder::ShaderAssetBuilderJobKey; - jobDependency.m_platformIdentifier = platformInfo.m_identifier; - jobDependency.m_type = AssetBuilderSDK::JobDependencyType::Order; - jobDependency.m_sourceFile.m_sourceFileDependencyPath = file; - jobDescriptor.m_jobDependencyList.push_back(jobDependency); + AssetBuilderSDK::SourceFileDependency sourceFileDependency; + sourceFileDependency.m_sourceFileDependencyPath = file; + sourceFileDependencies.push_back(sourceFileDependency); + + if (!found) + { + AZ::Data::AssetInfo sourceInfo; + AZStd::string watchFolder; + AzToolsFramework::AssetSystemRequestBus::BroadcastResult(found, &AzToolsFramework::AssetSystem::AssetSystemRequest::GetSourceInfoBySourcePath, file.c_str(), sourceInfo, watchFolder); + + if (found) + { + foundSourceFile = file; + } + } } + + return found; } //! Returns true if @sourceFileFullPath starts with a valid asset processor scan folder, false otherwise. @@ -334,6 +355,9 @@ namespace AZ response.m_result = AssetBuilderSDK::CreateJobsResultCode::Success; return; } + + AZStd::string foundShaderFile; + LocateReferencedSourceFile(variantListFullPath, shaderVariantList.m_shaderFilePath, response.m_sourceFileDependencyList, foundShaderFile); for (const AssetBuilderSDK::PlatformInfo& info : request.m_enabledPlatforms) { @@ -349,8 +373,16 @@ namespace AZ jobDescriptor.m_jobKey = GetShaderVariantTreeAssetJobKey(); jobDescriptor.SetPlatformIdentifier(info.m_identifier.data()); - - AddShaderAssetJobDependency(jobDescriptor, info, variantListFullPath, shaderVariantList.m_shaderFilePath); + + if (!foundShaderFile.empty()) + { + AssetBuilderSDK::JobDependency jobDependency; + jobDependency.m_jobKey = ShaderAssetBuilder::ShaderAssetBuilderJobKey; + jobDependency.m_platformIdentifier = info.m_identifier; + jobDependency.m_type = AssetBuilderSDK::JobDependencyType::Order; + jobDependency.m_sourceFile.m_sourceFileDependencyPath = foundShaderFile; + jobDescriptor.m_jobDependencyList.push_back(jobDependency); + } jobDescriptor.m_jobParameters.emplace(ShaderSourceFilePathJobParam, shaderSourceFileFullPath); diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/SrgLayoutBuilder.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/SrgLayoutBuilder.cpp index a7721c84a2..9a3eda055e 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/SrgLayoutBuilder.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/SrgLayoutBuilder.cpp @@ -203,6 +203,16 @@ namespace AZ // queue up AzslBuilder dependencies: for (RHI::ShaderPlatformInterface* shaderPlatformInterface : platformInterfaces) { + const bool isAzsli = AzFramework::StringFunc::Path::IsExtension(fullPath.c_str(), "azsli"); + if (isAzsli) + { + auto skipCheck = ShaderBuilderUtility::ShouldSkipFileForSrgProcessing(SrgLayoutBuilderName, fullPath); + if (skipCheck != ShaderBuilderUtility::SrgSkipFileResult::ContinueProcess) + { + continue; + } + } + AddAzslBuilderJobDependency(jobDescriptor, info.m_identifier, shaderPlatformInterface->GetAPIName().GetCStr(), fullPath); } response.m_createJobOutputs.push_back(jobDescriptor); diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype index c635f94d56..a71fc65e2a 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype @@ -1465,14 +1465,9 @@ "file": "./EnhancedPBR_DepthPass_WithPS.shader", "tag": "DepthPass_WithPS" }, - // [GFX TODO][ATOM-4726] Use an "isSkinnedMesh" external material property and a functor that enables/disables the appropriate motion-vector shader { - "file": "Shaders/MotionVector/StaticMeshMotionVector.shader", - "tag": "StaticMeshMotionVector" - }, - { - "file": "Shaders/MotionVector/SkinnedMeshMotionVector.shader", - "tag": "SkinnedMeshMotionVector" + "file": "Shaders/MotionVector/MeshMotionVector.shader", + "tag": "MeshMotionVector" }, // Used by the light culling system to produce accurate depth bounds for this object when it uses blended transparency { @@ -1669,4 +1664,3 @@ "UV1": "Unwrapped" } } - diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype index dfe2fad60f..fe86576cf8 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype @@ -980,14 +980,9 @@ "file": "Shaders/Depth/DepthPass.shader", "tag": "DepthPass" }, - // [GFX TODO][ATOM-4726] Use an "isSkinnedMesh" external material property and a functor that enables/disables the appropriate motion-vector shader { - "file": "Shaders/MotionVector/StaticMeshMotionVector.shader", - "tag": "StaticMeshMotionVector" - }, - { - "file": "Shaders/MotionVector/SkinnedMeshMotionVector.shader", - "tag": "SkinnedMeshMotionVector" + "file": "Shaders/MotionVector/MeshMotionVector.shader", + "tag": "MeshMotionVector" } ], "functors": [ diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype index d9a21e7662..bccb530eb4 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR.materialtype @@ -2632,14 +2632,9 @@ "file": "./StandardMultilayerPBR_DepthPass_WithPS.shader", "tag": "DepthPass_WithPS" }, - // [GFX TODO][ATOM-4726] Use an "isSkinnedMesh" external material property and a functor that enables/disables the appropriate motion-vector shader { - "file": "Shaders/MotionVector/StaticMeshMotionVector.shader", - "tag": "StaticMeshMotionVector" - }, - { - "file": "Shaders/MotionVector/SkinnedMeshMotionVector.shader", - "tag": "SkinnedMeshMotionVector" + "file": "Shaders/MotionVector/MeshMotionVector.shader", + "tag": "MeshMotionVector" } ], "functors": [ @@ -3103,4 +3098,3 @@ "UV1": "Unwrapped" } } - diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype index fd2c74dae0..93220973df 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardPBR.materialtype @@ -1030,14 +1030,9 @@ "file": "./StandardPBR_DepthPass_WithPS.shader", "tag": "DepthPass_WithPS" }, - // [GFX TODO][ATOM-4726] Use an "isSkinnedMesh" external material property and a functor that enables/disables the appropriate motion-vector shader { - "file": "Shaders/MotionVector/StaticMeshMotionVector.shader", - "tag": "StaticMeshMotionVector" - }, - { - "file": "Shaders/MotionVector/SkinnedMeshMotionVector.shader", - "tag": "SkinnedMeshMotionVector" + "file": "Shaders/MotionVector/MeshMotionVector.shader", + "tag": "MeshMotionVector" }, // Used by the light culling system to produce accurate depth bounds for this object when it uses blended transparency { @@ -1187,4 +1182,3 @@ "UV1": "Unwrapped" } } - diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli index 893df85e3e..03d00d21f9 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli @@ -427,6 +427,7 @@ float DirectionalLightShadow::SamplePcfBicubic() shadowCoord.y >= 0. && shadowCoord.y * size < size - PixelMargin && shadowCoord.z < 1. - DepthMargin) { + m_debugInfo.m_cascadeIndex = indexOfCascade; return SamplePcfBicubic(shadowCoord, indexOfCascade); } } diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/MeshMotionVector.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/MeshMotionVector.azsl new file mode 100644 index 0000000000..3fb3fc0fd8 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/MeshMotionVector.azsl @@ -0,0 +1,86 @@ +/* +* 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 + +struct VSInput +{ + float3 m_position : POSITION; + + // This gets set automatically by the system at runtime only if it's available. + // There is a soft naming convention that associates this with o_prevPosition_isBound, which will be set to true whenever m_optional_prevPosition is available. + // (search "m_optional_" in ShaderVariantAssetBuilder for details on the naming convention). + // [GFX TODO][ATOM-14475]: Come up with a more elegant way to associate the isBound flag with the input stream. + // Vertex position of last frame to capture small scale motion due to vertex animation + float3 m_optional_prevPosition : POSITIONT; +}; + +struct VSOutput +{ + float4 m_position : SV_Position; + float3 m_worldPos : TEXCOORD0; + float3 m_worldPosPrev: TEXCOORD1; +}; + +struct PSOutput +{ + float2 m_motion : SV_Target0; +}; + +// Indicates whether the vertex input struct's "m_optional_prevPosition" is bound. If false, it is not safe to read from m_optional_prevPosition. +// This option gets set automatically by the system at runtime; there is a soft naming convention that associates it with m_optional_prevPosition. +// (search "m_optional_" in ShaderVariantAssetBuilder for details on the naming convention). +// [GFX TODO][ATOM-14475]: Come up with a more elegant way to associate the isBound flag with the input stream. +option bool o_prevPosition_isBound; + +VSOutput MainVS(VSInput IN) +{ + VSOutput OUT; + + OUT.m_worldPos = mul(SceneSrg::GetObjectToWorldMatrix(ObjectSrg::m_objectId), float4(IN.m_position, 1.0)).xyz; + OUT.m_position = mul(ViewSrg::m_viewProjectionMatrix, float4(OUT.m_worldPos, 1.0)); + + if (o_prevPosition_isBound) + { + OUT.m_worldPosPrev = mul(SceneSrg::GetObjectToWorldMatrixPrev(ObjectSrg::m_objectId), float4(IN.m_optional_prevPosition, 1.0)).xyz; + } + else + { + OUT.m_worldPosPrev = mul(SceneSrg::GetObjectToWorldMatrixPrev(ObjectSrg::m_objectId), float4(IN.m_position, 1.0)).xyz; + } + + return OUT; +} + +PSOutput MainPS(VSOutput IN) +{ + PSOutput OUT; + + // Current clip position + float4 clipPos = mul(ViewSrg::m_viewProjectionMatrix, float4(IN.m_worldPos, 1.0)); + + // Reprojected last frame's clip position, for skinned mesh it also implies last key frame + float4 clipPosPrev = mul(ViewSrg::m_viewProjectionPrevMatrix, float4(IN.m_worldPosPrev, 1.0)); + + float2 motion = (clipPos.xy / clipPos.w - clipPosPrev.xy / clipPosPrev.w) * 0.5; + + OUT.m_motion = motion; + + // Flip y to line up with uv coordinates + OUT.m_motion.y = -OUT.m_motion.y; + + return OUT; +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/StaticMeshMotionVector.shader b/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/MeshMotionVector.shader similarity index 89% rename from Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/StaticMeshMotionVector.shader rename to Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/MeshMotionVector.shader index 0d580b1b10..c585060f3d 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/StaticMeshMotionVector.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/MeshMotionVector.shader @@ -1,5 +1,5 @@ { - "Source" : "StaticMeshMotionVector", + "Source" : "MeshMotionVector", "DepthStencilState" : { "Depth" : { "Enable" : true, "CompareFunc" : "GreaterEqual" } diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/MeshMotionVectorCommon.azsli b/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/MeshMotionVectorCommon.azsli deleted file mode 100644 index ff2758af87..0000000000 --- a/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/MeshMotionVectorCommon.azsli +++ /dev/null @@ -1,49 +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. -* -*/ - -#include -#include - -#include -#include - -struct VSOutput -{ - float4 m_position : SV_Position; - float3 m_worldPos : TEXCOORD0; - float3 m_worldPosPrev: TEXCOORD1; -}; - -struct PSOutput -{ - float2 m_motion : SV_Target0; -}; - -PSOutput MainPS(VSOutput IN) -{ - PSOutput OUT; - - // Current clip position - float4 clipPos = mul(ViewSrg::m_viewProjectionMatrix, float4(IN.m_worldPos, 1.0)); - - // Reprojected last frame's clip position, for skinned mesh it also implies last key frame - float4 clipPosPrev = mul(ViewSrg::m_viewProjectionPrevMatrix, float4(IN.m_worldPosPrev, 1.0)); - - float2 motion = (clipPos.xy / clipPos.w - clipPosPrev.xy / clipPosPrev.w) * 0.5; - - OUT.m_motion = motion; - - // Flip y to line up with uv coordinates - OUT.m_motion.y = -OUT.m_motion.y; - - return OUT; -} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/SkinnedMeshMotionVector.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/SkinnedMeshMotionVector.azsl deleted file mode 100644 index dcbba22b2a..0000000000 --- a/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/SkinnedMeshMotionVector.azsl +++ /dev/null @@ -1,34 +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. -* -*/ - -#include "./MeshMotionVectorCommon.azsli" - -struct VSInput -{ - float3 m_position : POSITION; - // Vertex position of last frame to capture small scale motion due to vertex animation - float3 m_prevPosition : POSITIONT; -}; - -VSOutput MainVS(VSInput IN) -{ - VSOutput OUT; - - OUT.m_worldPos = mul(SceneSrg::GetObjectToWorldMatrix(ObjectSrg::m_objectId), float4(IN.m_position, 1.0)).xyz; - OUT.m_position = mul(ViewSrg::m_viewProjectionMatrix, float4(OUT.m_worldPos, 1.0)); - OUT.m_worldPosPrev = mul(SceneSrg::GetObjectToWorldMatrixPrev(ObjectSrg::m_objectId), float4(IN.m_prevPosition, 1.0)).xyz; - - return OUT; -} - - - diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/SkinnedMeshMotionVector.shader b/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/SkinnedMeshMotionVector.shader deleted file mode 100644 index 66d2fd88c5..0000000000 --- a/Gems/Atom/Feature/Common/Assets/Shaders/MotionVector/SkinnedMeshMotionVector.shader +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Source" : "SkinnedMeshMotionVector", - - "DepthStencilState" : { - "Depth" : { "Enable" : true, "CompareFunc" : "GreaterEqual" } - }, - - "DrawList" : "motion", - - "ProgramSettings": - { - "EntryPoints": - [ - { - "name": "MainVS", - "type": "Vertex" - }, - { - "name": "MainPS", - "type": "Fragment" - } - ] - } -} diff --git a/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake b/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake index 3dfabc586a..6a2721d4af 100644 --- a/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake +++ b/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake @@ -354,11 +354,8 @@ set(FILES Shaders/MorphTargets/MorphTargetSRG.azsli Shaders/MotionVector/CameraMotionVector.azsl Shaders/MotionVector/CameraMotionVector.shader - Shaders/MotionVector/MeshMotionVectorCommon.azsli - Shaders/MotionVector/SkinnedMeshMotionVector.azsl - Shaders/MotionVector/SkinnedMeshMotionVector.shader - Shaders/MotionVector/StaticMeshMotionVector.azsl - Shaders/MotionVector/StaticMeshMotionVector.shader + Shaders/MotionVector/MeshMotionVector.azsl + Shaders/MotionVector/MeshMotionVector.shader Shaders/PostProcessing/AcesOutputTransformLut.azsl Shaders/PostProcessing/AcesOutputTransformLut.shader Shaders/PostProcessing/ApplyShaperLookupTable.azsl diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessor.h index 0d61ef82d1..391a60a68d 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessor.h @@ -72,7 +72,6 @@ namespace AZ void UpdateDrawPackets(bool forceUpdate = false); void BuildCullable(); void UpdateCullBounds(const TransformServiceFeatureProcessor* transformService); - void SelectMotionVectorShader(Data::Instance material); void UpdateObjectSrg(); bool MaterialRequiresForwardPassIblSpecular(Data::Instance material) const; @@ -82,11 +81,11 @@ namespace AZ RPI::Cullable m_cullable; MaterialAssignmentMap m_materialAssignments; + MeshHandleDescriptor m_descriptor; Data::Instance m_model; //! A reference to the original model asset in case it got cloned before creating the model instance. Data::Asset m_originalModelAsset; - MeshFeatureProcessorInterface::RequiresCloneCallback m_requiresCloningCallback; Data::Instance m_shaderResourceGroup; AZStd::unique_ptr m_meshLoader; @@ -99,10 +98,7 @@ namespace AZ bool m_cullableNeedsRebuild = false; bool m_objectSrgNeedsUpdate = true; bool m_excludeFromReflectionCubeMaps = false; - bool m_skinnedMeshWithMotion = false; - bool m_rayTracingEnabled = true; bool m_visible = true; - bool m_useForwardPassIblSpecular = false; bool m_hasForwardPassIblSpecularMaterial = false; }; @@ -132,17 +128,11 @@ namespace AZ void OnEndPrepareRender() override; MeshHandle AcquireMesh( - const Data::Asset& modelAsset, - const MaterialAssignmentMap& materials = {}, - bool skinnedMeshWithMotion = false, - bool rayTracingEnabled = true, - RequiresCloneCallback requiresCloneCallback = {}) override; + const MeshHandleDescriptor& descriptor, + const MaterialAssignmentMap& materials = {}) override; MeshHandle AcquireMesh( - const Data::Asset &modelAsset, - const Data::Instance& material, - bool skinnedMeshWithMotion = false, - bool rayTracingEnabled = true, - RequiresCloneCallback requiresCloneCallback = {}) override; + const MeshHandleDescriptor& descriptor, + const Data::Instance& material) override; bool ReleaseMesh(MeshHandle& meshHandle) override; MeshHandle CloneMesh(const MeshHandle& meshHandle) override; diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessorInterface.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessorInterface.h index fb5bff5584..7cf9ab9685 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessorInterface.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Mesh/MeshFeatureProcessorInterface.h @@ -26,6 +26,17 @@ namespace AZ { class MeshDataInstance; + //! Settings to apply to a mesh handle when acquiring it for the first time + struct MeshHandleDescriptor + { + using RequiresCloneCallback = AZStd::function& modelAsset)>; + + Data::Asset m_modelAsset; + bool m_isRayTracingEnabled = true; + bool m_useForwardPassIblSpecular = false; + RequiresCloneCallback m_requiresCloneCallback = {}; + }; + //! MeshFeatureProcessorInterface provides an interface to acquire and release a MeshHandle from the underlying MeshFeatureProcessor class MeshFeatureProcessorInterface : public RPI::FeatureProcessor @@ -35,23 +46,16 @@ namespace AZ using MeshHandle = StableDynamicArrayHandle; using ModelChangedEvent = Event>; - using RequiresCloneCallback = AZStd::function& modelAsset)>; //! Acquires a model with an optional collection of material assignments. //! @param requiresCloneCallback The callback indicates whether cloning is required for a given model asset. virtual MeshHandle AcquireMesh( - const Data::Asset& modelAsset, - const MaterialAssignmentMap& materials = {}, - bool skinnedMeshWithMotion = false, - bool rayTracingEnabled = true, - RequiresCloneCallback requiresCloneCallback = {}) = 0; + const MeshHandleDescriptor& descriptor, + const MaterialAssignmentMap& materials = {}) = 0; //! Acquires a model with a single material applied to all its meshes. virtual MeshHandle AcquireMesh( - const Data::Asset& modelAsset, - const Data::Instance& material, - bool skinnedMeshWithMotion = false, - bool rayTracingEnabled = true, - RequiresCloneCallback requiresCloneCallback = {}) = 0; + const MeshHandleDescriptor& descriptor, + const Data::Instance& material) = 0; //! Releases the mesh handle virtual bool ReleaseMesh(MeshHandle& meshHandle) = 0; //! Creates a new instance and handle of a mesh using an existing MeshId. Currently, this will reset the new mesh to default materials. diff --git a/Gems/Atom/Feature/Common/Code/Mocks/MockMeshFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Mocks/MockMeshFeatureProcessor.h index 418ee0cfb8..2ffd26a380 100644 --- a/Gems/Atom/Feature/Common/Code/Mocks/MockMeshFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Mocks/MockMeshFeatureProcessor.h @@ -37,8 +37,8 @@ namespace UnitTest MOCK_METHOD1(GetSortKey, AZ::RHI::DrawItemSortKey(const MeshHandle&)); MOCK_METHOD2(SetLodOverride, void(const MeshHandle&, AZ::RPI::Cullable::LodOverride)); MOCK_METHOD1(GetLodOverride, AZ::RPI::Cullable::LodOverride(const MeshHandle&)); - MOCK_METHOD5(AcquireMesh, MeshHandle (const AZ::Data::Asset&, const AZ::Render::MaterialAssignmentMap&, bool, bool, AZ::Render::MeshFeatureProcessorInterface::RequiresCloneCallback)); - MOCK_METHOD5(AcquireMesh, MeshHandle (const AZ::Data::Asset&, const AZ::Data::Instance&, bool, bool, AZ::Render::MeshFeatureProcessorInterface::RequiresCloneCallback)); + MOCK_METHOD2(AcquireMesh, MeshHandle (const AZ::Render::MeshHandleDescriptor&, const AZ::Render::MaterialAssignmentMap&)); + MOCK_METHOD2(AcquireMesh, MeshHandle (const AZ::Render::MeshHandleDescriptor&, const AZ::Data::Instance&)); MOCK_METHOD2(SetRayTracingEnabled, void (const MeshHandle&, bool)); MOCK_METHOD2(SetVisible, void (const MeshHandle&, bool)); MOCK_METHOD2(SetUseForwardPassIblSpecular, void (const MeshHandle&, bool)); diff --git a/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp index 3001831817..7867faf02a 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp @@ -149,46 +149,33 @@ namespace AZ } MeshFeatureProcessor::MeshHandle MeshFeatureProcessor::AcquireMesh( - const Data::Asset& modelAsset, - const MaterialAssignmentMap& materials, - bool skinnedMeshWithMotion, - bool rayTracingEnabled, - RequiresCloneCallback requiresCloneCallback) + const MeshHandleDescriptor& descriptor, + const MaterialAssignmentMap& materials) { AZ_PROFILE_FUNCTION(Debug::ProfileCategory::AzRender); // don't need to check the concurrency during emplace() because the StableDynamicArray won't move the other elements during insertion MeshHandle meshDataHandle = m_meshData.emplace(); - // Mark skinned meshes to enable special processes to generate motion vector - meshDataHandle->m_skinnedMeshWithMotion = skinnedMeshWithMotion; - - // set ray tracing flag, but always disable on skinned meshes - // [GFX TODO][ATOM-13067] Enable raytracing on skinned meshes - meshDataHandle->m_rayTracingEnabled = rayTracingEnabled && (skinnedMeshWithMotion == false); - + meshDataHandle->m_descriptor = descriptor; meshDataHandle->m_scene = GetParentScene(); meshDataHandle->m_materialAssignments = materials; meshDataHandle->m_objectId = m_transformService->ReserveObjectId(); - meshDataHandle->m_originalModelAsset = modelAsset; - meshDataHandle->m_requiresCloningCallback = requiresCloneCallback; - meshDataHandle->m_meshLoader = AZStd::make_unique(modelAsset, &*meshDataHandle); + meshDataHandle->m_originalModelAsset = descriptor.m_modelAsset; + meshDataHandle->m_meshLoader = AZStd::make_unique(descriptor.m_modelAsset, &*meshDataHandle); return meshDataHandle; } MeshFeatureProcessor::MeshHandle MeshFeatureProcessor::AcquireMesh( - const Data::Asset& modelAsset, - const Data::Instance& material, - bool skinnedMeshWithMotion, - bool rayTracingEnabled, - RequiresCloneCallback requiresCloneCallback) + const MeshHandleDescriptor& descriptor, + const Data::Instance& material) { Render::MaterialAssignmentMap materials; Render::MaterialAssignment& defaultMaterial = materials[AZ::Render::DefaultMaterialAssignmentId]; defaultMaterial.m_materialInstance = material; - return AcquireMesh(modelAsset, materials, skinnedMeshWithMotion, rayTracingEnabled, requiresCloneCallback); + return AcquireMesh(descriptor, materials); } bool MeshFeatureProcessor::ReleaseMesh(MeshHandle& meshHandle) @@ -210,7 +197,7 @@ namespace AZ { if (meshHandle.IsValid()) { - MeshHandle clone = AcquireMesh(meshHandle->m_originalModelAsset, meshHandle->m_materialAssignments); + MeshHandle clone = AcquireMesh(meshHandle->m_descriptor, meshHandle->m_materialAssignments); return clone; } return MeshFeatureProcessor::MeshHandle(); @@ -377,6 +364,14 @@ namespace AZ if (meshHandle.IsValid()) { meshHandle->m_excludeFromReflectionCubeMaps = excludeFromReflectionCubeMaps; + if (excludeFromReflectionCubeMaps) + { + meshHandle->m_cullable.m_cullData.m_hideFlags |= RPI::View::UsageReflectiveCubeMap; + } + else + { + meshHandle->m_cullable.m_cullData.m_hideFlags &= ~RPI::View::UsageReflectiveCubeMap; + } } } @@ -385,12 +380,12 @@ namespace AZ if (meshHandle.IsValid()) { // update the ray tracing data based on the current state and the new state - if (rayTracingEnabled && !meshHandle->m_rayTracingEnabled) + if (rayTracingEnabled && !meshHandle->m_descriptor.m_isRayTracingEnabled) { // add to ray tracing meshHandle->SetRayTracingData(); } - else if (!rayTracingEnabled && meshHandle->m_rayTracingEnabled) + else if (!rayTracingEnabled && meshHandle->m_descriptor.m_isRayTracingEnabled) { // remove from ray tracing if (m_rayTracingFeatureProcessor) @@ -400,7 +395,7 @@ namespace AZ } // set new state - meshHandle->m_rayTracingEnabled = rayTracingEnabled; + meshHandle->m_descriptor.m_isRayTracingEnabled = rayTracingEnabled; } } @@ -416,7 +411,7 @@ namespace AZ { if (meshHandle.IsValid()) { - meshHandle->m_useForwardPassIblSpecular = useForwardPassIblSpecular; + meshHandle->m_descriptor.m_useForwardPassIblSpecular = useForwardPassIblSpecular; meshHandle->m_objectSrgNeedsUpdate = true; if (meshHandle->m_model) @@ -450,7 +445,7 @@ namespace AZ // we need to rebuild the Srg for any meshes that are using the forward pass IBL specular option for (auto& meshInstance : m_meshData) { - if (meshInstance.m_useForwardPassIblSpecular) + if (meshInstance.m_descriptor.m_useForwardPassIblSpecular) { meshInstance.m_objectSrgNeedsUpdate = true; } @@ -507,8 +502,8 @@ namespace AZ Data::Instance model; // Check if a requires cloning callback got set and if so check if cloning the model asset is requested. - if (m_parent->m_requiresCloningCallback && - m_parent->m_requiresCloningCallback(modelAsset)) + if (m_parent->m_descriptor.m_requiresCloneCallback && + m_parent->m_descriptor.m_requiresCloneCallback(modelAsset)) { // Clone the model asset to force create another model instance. AZ::Data::AssetId newId(AZ::Uuid::CreateRandom(), /*subId=*/0); @@ -598,7 +593,7 @@ namespace AZ objectIdIndex.AssertValid(); } - if (m_rayTracingEnabled) + if (m_descriptor.m_isRayTracingEnabled) { SetRayTracingData(); } @@ -665,13 +660,11 @@ namespace AZ } } - SelectMotionVectorShader(material); - // setup the mesh draw packet RPI::MeshDrawPacket drawPacket(modelLod, meshIndex, material, m_shaderResourceGroup, materialAssignment.m_matModUvOverrides); // set the shader option to select forward pass IBL specular if necessary - if (!drawPacket.SetShaderOption(AZ::Name("o_meshUseForwardPassIBLSpecular"), AZ::RPI::ShaderOptionValue{ m_useForwardPassIblSpecular })) + if (!drawPacket.SetShaderOption(AZ::Name("o_meshUseForwardPassIBLSpecular"), AZ::RPI::ShaderOptionValue{ m_descriptor.m_useForwardPassIblSpecular })) { AZ_Warning("MeshDrawPacket", false, "Failed to set o_meshUseForwardPassIBLSpecular on mesh draw packet"); } @@ -682,7 +675,7 @@ namespace AZ m_hasForwardPassIblSpecularMaterial |= materialRequiresForwardPassIblSpecular; // stencil bits - uint8_t stencilRef = m_useForwardPassIblSpecular || materialRequiresForwardPassIblSpecular ? Render::StencilRefs::None : Render::StencilRefs::UseIBLSpecularPass; + uint8_t stencilRef = m_descriptor.m_useForwardPassIblSpecular || materialRequiresForwardPassIblSpecular ? Render::StencilRefs::None : Render::StencilRefs::UseIBLSpecularPass; stencilRef |= Render::StencilRefs::UseDiffuseGIPass; drawPacket.SetStencilRef(stencilRef); @@ -1091,29 +1084,6 @@ namespace AZ m_cullBoundsNeedsUpdate = false; } - void MeshDataInstance::SelectMotionVectorShader(Data::Instance material) - { - // Two motion vector shaders are defined in the material for static mesh (only animated by transform matrix) - // and skinned mesh (per vertex animation) respectively, it's because they have different input signatures - // (skinned mesh needs two streaming channels while static mesh only needs one) that cannot be addressed by shader option - // itself. Therefore this function is used to pick one to use and disable the other one depending on the type of the mesh - // so it won't cause errors due to missing input streaming channel. - - //[GFX TODO][ATOM-4726] Replace this with a "isSkinnedMesh" external material property and a functor that enables/disables the appropriate shader - for (auto& shaderItem : material->GetShaderCollection()) - { - if (shaderItem.GetShaderAsset()->GetName() == Name{ "StaticMeshMotionVector" } && m_skinnedMeshWithMotion) - { - shaderItem.SetEnabled(false); - } - - if (shaderItem.GetShaderAsset()->GetName() == Name{ "SkinnedMeshMotionVector" } && (!m_skinnedMeshWithMotion)) - { - shaderItem.SetEnabled(false); - } - } - } - void MeshDataInstance::UpdateObjectSrg() { if (!m_shaderResourceGroup) @@ -1123,7 +1093,7 @@ namespace AZ ReflectionProbeFeatureProcessor* reflectionProbeFeatureProcessor = m_scene->GetFeatureProcessor(); - if (reflectionProbeFeatureProcessor && (m_useForwardPassIblSpecular || m_hasForwardPassIblSpecularMaterial)) + if (reflectionProbeFeatureProcessor && (m_descriptor.m_useForwardPassIblSpecular || m_hasForwardPassIblSpecularMaterial)) { // retrieve probe constant indices AZ::RHI::ShaderInputConstantIndex posConstantIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name("m_reflectionProbeData.m_aabbPos")); diff --git a/Gems/Atom/Feature/Common/Code/Source/OcclusionCullingPlane/OcclusionCullingPlane.cpp b/Gems/Atom/Feature/Common/Code/Source/OcclusionCullingPlane/OcclusionCullingPlane.cpp index 10004a72e4..159df0d3bc 100644 --- a/Gems/Atom/Feature/Common/Code/Source/OcclusionCullingPlane/OcclusionCullingPlane.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/OcclusionCullingPlane/OcclusionCullingPlane.cpp @@ -39,7 +39,7 @@ namespace AZ "Models/OcclusionCullingPlane.azmodel", AZ::RPI::AssetUtils::TraceLevel::Assert); - m_visualizationMeshHandle = m_meshFeatureProcessor->AcquireMesh(m_visualizationModelAsset); + m_visualizationMeshHandle = m_meshFeatureProcessor->AcquireMesh(MeshHandleDescriptor{ m_visualizationModelAsset }); m_meshFeatureProcessor->SetExcludeFromReflectionCubeMaps(m_visualizationMeshHandle, true); m_meshFeatureProcessor->SetRayTracingEnabled(m_visualizationMeshHandle, false); m_meshFeatureProcessor->SetTransform(m_visualizationMeshHandle, AZ::Transform::CreateIdentity()); diff --git a/Gems/Atom/Feature/Common/Code/Source/ReflectionProbe/ReflectionProbe.cpp b/Gems/Atom/Feature/Common/Code/Source/ReflectionProbe/ReflectionProbe.cpp index 3e9e316a5a..a84db69911 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ReflectionProbe/ReflectionProbe.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/ReflectionProbe/ReflectionProbe.cpp @@ -67,7 +67,7 @@ namespace AZ "Models/ReflectionProbeSphere.azmodel", AZ::RPI::AssetUtils::TraceLevel::Assert); - m_visualizationMeshHandle = m_meshFeatureProcessor->AcquireMesh(m_visualizationModelAsset); + m_visualizationMeshHandle = m_meshFeatureProcessor->AcquireMesh(MeshHandleDescriptor{ m_visualizationModelAsset }); m_meshFeatureProcessor->SetExcludeFromReflectionCubeMaps(m_visualizationMeshHandle, true); m_meshFeatureProcessor->SetRayTracingEnabled(m_visualizationMeshHandle, false); m_meshFeatureProcessor->SetTransform(m_visualizationMeshHandle, AZ::Transform::CreateIdentity()); diff --git a/Gems/Atom/Feature/Common/Code/Source/ReflectionScreenSpace/ReflectionScreenSpaceBlurChildPass.cpp b/Gems/Atom/Feature/Common/Code/Source/ReflectionScreenSpace/ReflectionScreenSpaceBlurChildPass.cpp index 2d4b6ee85f..690a2d63c2 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ReflectionScreenSpace/ReflectionScreenSpaceBlurChildPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/ReflectionScreenSpace/ReflectionScreenSpaceBlurChildPass.cpp @@ -47,8 +47,12 @@ namespace AZ m_updateSrg = true; } - params.m_viewportState = RHI::Viewport(0, static_cast(m_imageSize.m_width), 0, static_cast(m_imageSize.m_height)); - params.m_scissorState = RHI::Scissor(0, 0, m_imageSize.m_width, m_imageSize.m_height); + float inverseScale = 1.0f / m_outputScale; + uint32_t outputWidth = m_imageSize.m_width * inverseScale; + uint32_t outputHeight = m_imageSize.m_height * inverseScale; + + params.m_viewportState = RHI::Viewport(0, static_cast(outputWidth), 0, static_cast(outputHeight)); + params.m_scissorState = RHI::Scissor(0, 0, outputWidth, outputHeight); FullscreenTrianglePass::FrameBeginInternal(params); } diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Common/AssetUtils.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Common/AssetUtils.h index 554d20dede..4db2187551 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Common/AssetUtils.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Common/AssetUtils.h @@ -66,6 +66,7 @@ namespace AZ //! it's possible that b.json could be found in either MyGem/Assets/Foo/Bar/a.json or in MyGem/Assets/Bar/a.json. //! @param originatingSourceFilePath Path to a file that references referencedSourceFilePath. May be absolute or relative to asset-root. //! @param referencedSourceFilePath The referenced path as it appears in the originating file. May be relative to the originating file location or relative to asset-root. + //! @return the list of possible paths, ordered from highest priority to lowest priority AZStd::vector GetPossibleDepenencyPaths(const AZStd::string& originatingSourceFilePath, const AZStd::string& referencedSourceFilePath); // Definitions... diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Material/Material.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Material/Material.h index fa1bb57166..6cffe4a47d 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Material/Material.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Material/Material.h @@ -105,7 +105,6 @@ namespace AZ ChangeId GetCurrentChangeId() const; //! Return the set of shaders to be run by this material. - ShaderCollection& GetShaderCollection(); const ShaderCollection& GetShaderCollection() const; //! Attempts to set the value of a system-level shader option that is controlled by this material. diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp b/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp index d31b6b3802..d52bba2482 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp @@ -67,16 +67,41 @@ namespace AZ BusDisconnect(); } - void AddPossibleJobDependencies(const char* jobKey, AZStd::string_view currentFilePath, AZStd::string_view referencedParentPath, AZStd::vector& jobDependencies) + //! Adds all relevant dependencies for a referenced source file, considering that the path might be relative to the original file location or a full asset path. + //! This will usually include multiple source dependencies and a single job dependency, but will include only source dependencies if the file is not found. + //! Note the AssetBuilderSDK::JobDependency::m_platformIdentifier will not be set by this function. The calling code must set this value before passing back + //! to the AssetBuilderSDK::CreateJobsResponse. + void AddPossibleDependencies( + AZStd::string_view currentFilePath, AZStd::string_view referencedParentPath, + AZStd::vector& sourceFileDependencies, + const char* jobKey, AZStd::vector& jobDependencies) { - AZStd::vector possibleDependencies = AssetUtils::GetPossibleDepenencyPaths(currentFilePath, referencedParentPath); + bool dependencyFileFound = false; + + AZStd::vector possibleDependencies = RPI::AssetUtils::GetPossibleDepenencyPaths(currentFilePath, referencedParentPath); for (auto& file : possibleDependencies) { - AssetBuilderSDK::JobDependency jobDependency; - jobDependency.m_jobKey = jobKey; - jobDependency.m_type = AssetBuilderSDK::JobDependencyType::Order; - jobDependency.m_sourceFile.m_sourceFileDependencyPath = file; - jobDependencies.push_back(jobDependency); + AssetBuilderSDK::SourceFileDependency sourceFileDependency; + sourceFileDependency.m_sourceFileDependencyPath = file; + sourceFileDependencies.push_back(sourceFileDependency); + + // The first path found is the highest priority, and will have a job dependency, as this is the one + // the builder will actually use + if (!dependencyFileFound) + { + AZ::Data::AssetInfo sourceInfo; + AZStd::string watchFolder; + AzToolsFramework::AssetSystemRequestBus::BroadcastResult(dependencyFileFound, &AzToolsFramework::AssetSystem::AssetSystemRequest::GetSourceInfoBySourcePath, file.c_str(), sourceInfo, watchFolder); + + if (dependencyFileFound) + { + AssetBuilderSDK::JobDependency jobDependency; + jobDependency.m_jobKey = jobKey; + jobDependency.m_type = AssetBuilderSDK::JobDependencyType::Order; + jobDependency.m_sourceFile.m_sourceFileDependencyPath = file; + jobDependencies.push_back(jobDependency); + } + } } } @@ -123,7 +148,7 @@ namespace AZ // We'll build up this one JobDescriptor and reuse it to register each of the platforms AssetBuilderSDK::JobDescriptor outputJobDescriptor; outputJobDescriptor.m_jobKey = JobKey; - + // Load the file so we can detect and report dependencies. // If the file is a .materialtype, report dependencies on the .shader files. // If the file is a .material, report a dependency on the .materialtype and parent .material file @@ -152,7 +177,9 @@ namespace AZ for (auto& shader : materialTypeSourceData.GetValue().m_shaderCollection) { - AddPossibleJobDependencies("Shader Asset", request.m_sourceFile, shader.m_shaderFilePath, outputJobDescriptor.m_jobDependencyList); + AddPossibleDependencies(request.m_sourceFile, shader.m_shaderFilePath, + response.m_sourceFileDependencyList, "Shader Asset", + outputJobDescriptor.m_jobDependencyList); } for (auto& functor : materialTypeSourceData.GetValue().m_materialFunctorSourceData) @@ -161,7 +188,9 @@ namespace AZ for (const MaterialFunctorSourceData::AssetDependency& dependency : dependencies) { - AddPossibleJobDependencies(dependency.m_jobKey.c_str(), request.m_sourceFile, dependency.m_sourceFilePath, outputJobDescriptor.m_jobDependencyList); + AddPossibleDependencies(request.m_sourceFile, dependency.m_sourceFilePath, + response.m_sourceFileDependencyList, + dependency.m_jobKey.c_str(), outputJobDescriptor.m_jobDependencyList); } } } @@ -196,7 +225,9 @@ namespace AZ // Register dependency on the parent material source file so we can load it and use it's data to build this variant material. // Note, we don't need a direct dependency on the material type because the parent material will depend on it. - AddPossibleJobDependencies(JobKey, request.m_sourceFile, parentMaterialPath, outputJobDescriptor.m_jobDependencyList); + AddPossibleDependencies(request.m_sourceFile, parentMaterialPath, + response.m_sourceFileDependencyList, + JobKey, outputJobDescriptor.m_jobDependencyList); } } diff --git a/Gems/Atom/RPI/Code/Source/RPI.Edit/Common/AssetUtils.cpp b/Gems/Atom/RPI/Code/Source/RPI.Edit/Common/AssetUtils.cpp index 32cffc771a..8fa0094a53 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Edit/Common/AssetUtils.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Edit/Common/AssetUtils.cpp @@ -109,31 +109,16 @@ namespace AZ AZStd::vector GetPossibleDepenencyPaths(const AZStd::string& originatingSourceFilePath, const AZStd::string& referencedSourceFilePath) { - // We potentially add the parent dependency as both a direct path and a relative path rather than use AssetUtils::ResolvePathReference - // because there is no guarantee that the Asset Processor has seen the parent file yet (which ResolvePathReference requires). - // In that case, we have to add both possible locations because we don't know where it will show up. - AZStd::vector results; - // The first dependency we add is using the referencedSourceFilePath as a relative path. This gives relative paths priority over asset-root paths. + // Use the referencedSourceFilePath as a relative path starting at originatingSourceFilePath AZStd::string combinedPath = originatingSourceFilePath; AzFramework::StringFunc::Path::StripFullName(combinedPath); AzFramework::StringFunc::Path::Join(combinedPath.c_str(), referencedSourceFilePath.c_str(), combinedPath); results.push_back(combinedPath); - // If the parent file exists at the relative path, then there is no need to report a dependency on the asset-root path. - bool assetFound = false; - AZ::Data::AssetInfo sourceInfo; - AZStd::string watchFolder; - AzToolsFramework::AssetSystemRequestBus::BroadcastResult(assetFound, &AzToolsFramework::AssetSystem::AssetSystemRequest::GetSourceInfoBySourcePath, combinedPath.c_str(), sourceInfo, watchFolder); - - if (!assetFound) - { - // The parent file wasn't found at the relative path, so we need a dependency on the asset-root path in case the file - // exists there. Note, we still keep the relative path dependency above because we don't know whether it's missing because - // it doesn't exist, or just because the AP hasn't found it yet. - results.push_back(referencedSourceFilePath); - } + // Use the referencedSourceFilePath as a standard asset path + results.push_back(referencedSourceFilePath); return results; } diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Material/Material.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Material/Material.cpp index 3302190156..3f376ccf25 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Material/Material.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Material/Material.cpp @@ -164,11 +164,6 @@ namespace AZ Data::AssetBus::Handler::BusDisconnect(); } - ShaderCollection& Material::GetShaderCollection() - { - return m_shaderCollection; - } - const ShaderCollection& Material::GetShaderCollection() const { return m_shaderCollection; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/FullscreenTrianglePass.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/FullscreenTrianglePass.cpp index 67a6fcaa5b..5c76b084b1 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/FullscreenTrianglePass.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/FullscreenTrianglePass.cpp @@ -24,6 +24,7 @@ #include #include +#include namespace AZ { @@ -181,19 +182,15 @@ namespace AZ RHI::Size targetImageSize = outputAttachment->m_descriptor.m_image.m_size; - m_viewportState = params.m_viewportState; - if (m_viewportState.IsNull()) - { - // compute viewport from target attachment - m_viewportState = RHI::Viewport(0, static_cast(targetImageSize.m_width), 0, static_cast(targetImageSize.m_height)); - } + m_viewportState.m_minX = 0.0f; + m_viewportState.m_minY = 0.0f; + m_viewportState.m_maxX = AZStd::min(static_cast(params.m_viewportState.m_maxX), targetImageSize.m_width); + m_viewportState.m_maxY = AZStd::min(static_cast(params.m_viewportState.m_maxY), targetImageSize.m_height); - m_scissorState = params.m_scissorState; - if (m_scissorState.IsNull()) - { - // compute scissor from target attachment - m_scissorState = RHI::Scissor(0, 0, targetImageSize.m_width, targetImageSize.m_height); - } + m_scissorState.m_minX = 0.0f; + m_scissorState.m_minY = 0.0f; + m_scissorState.m_maxX = AZStd::min(static_cast(params.m_scissorState.m_maxX), targetImageSize.m_width); + m_scissorState.m_maxY = AZStd::min(static_cast(params.m_scissorState.m_maxY), targetImageSize.m_height); RenderPass::FrameBeginInternal(params); } diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp index 24dfcb7097..4f62225f81 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp @@ -160,13 +160,19 @@ namespace AZ 0,0,1,0, 0,0,0,1 }; yUpWorld.StoreToRowMajorFloat12(viewToWorldMatrixRaw); + const AZ::Matrix4x4 prevViewToWorldMatrix = m_viewToWorldMatrix; m_viewToWorldMatrix = AZ::Matrix4x4::CreateFromRowMajorFloat16(viewToWorldMatrixRaw); m_worldToViewMatrix = m_viewToWorldMatrix.GetInverseFast(); m_worldToClipMatrix = m_viewToClipMatrix * m_worldToViewMatrix; - m_onWorldToViewMatrixChange.Signal(m_worldToViewMatrix); + // Only signal an update when there is a change, otherwise this might block + // user input from changing the value. + if (!prevViewToWorldMatrix.IsClose(m_viewToWorldMatrix)) + { + m_onWorldToViewMatrixChange.Signal(m_worldToViewMatrix); + } m_onWorldToClipMatrixChange.Signal(m_worldToClipMatrix); InvalidateSrg(); diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp index 620d5d1fb8..1233f3846c 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp @@ -904,7 +904,7 @@ namespace AZ::AtomBridge { // Draw circle with single radius. const float step = DegToRad(10.0f); - const float maxAngle = DegToRad(360.0f) + step; + const float maxAngle = DegToRad(360.0f); SingleColorStaticSizeLineHelper<40> lines; // hard code 40 lines until DegToRad is constexpr. AZ::Vector3 radiusV3 = AZ::Vector3(radius); @@ -1134,7 +1134,7 @@ namespace AZ::AtomBridge // This matches Cry behavior, the DrawWireSphere above may need modifying to use the same approach. // Draw 3 axis aligned circles const float step = DegToRad(10.0f); - const float maxAngle = DegToRad(360.0f) + step; + const float maxAngle = DegToRad(360.0f); SingleColorStaticSizeLineHelper<40*3> lines; // hard code to 40 lines * 3 circles until DegToRad is constexpr. // Z Axis @@ -1160,8 +1160,8 @@ namespace AZ::AtomBridge // Draw 3 axis aligned circles const float stepAngle = DegToRad(11.25f); const float startAngle = DegToRad(0.0f); - const float stopAngle = DegToRad(360.0f) + startAngle; - SingleColorDynamicSizeLineHelper lines(2+static_cast(360.0f/11.25f)); // num disk segments + 1 for azis line + 1 for spare + const float stopAngle = DegToRad(360.0f); + SingleColorDynamicSizeLineHelper lines(2 + static_cast(360.0f / 11.25f)); // num disk segments + 1 for axis line + 1 for spare const AZ::Vector3 radiusV3 = AZ::Vector3(radius); CreateArbitraryAxisArc( lines, diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h index 69d0fc6d96..1f9d514c2f 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h @@ -332,6 +332,15 @@ namespace AZ::AtomBridge p0 = p1; ++segmentIndex; } + // Complete the arc by drawing the last bit + sinCos.SetElement(circleAxis1, sinf(maxAngle)); + sinCos.SetElement(circleAxis2, cosf(maxAngle)); + p1 = position + radiusV3 * sinCos; + p1 = ToWorldSpacePosition(p1); + if (filterFunc(p0, p1, segmentIndex)) + { + lines.AddLineSegment(p0, p1); + } } template @@ -369,5 +378,13 @@ namespace AZ::AtomBridge p0 = p1; ++segmentIndex; } + // Complete the arc by drawing the last bit + AZ::SinCos(maxAngle, sinVF, cosVF); + p1 = position + radiusV3 * (cosVF * a + sinVF * b); + p1 = ToWorldSpacePosition(p1); + if (filterFunc(p0, p1, segmentIndex)) + { + lines.AddLineSegment(p0, p1); + } } } // namespace AZ::AtomBridge diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.cpp index e7eecd3c7f..df65f47ff3 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.cpp @@ -317,8 +317,11 @@ namespace AZ MaterialComponentRequestBus::EventResult(materials, entityId, &MaterialComponentRequests::GetMaterialOverrides); m_meshFeatureProcessor->ReleaseMesh(m_meshHandle); - m_meshHandle = m_meshFeatureProcessor->AcquireMesh(m_configuration.m_modelAsset, materials, - /*skinnedMeshWithMotion=*/false, /*rayTracingEnabled=*/true, RequiresCloning); + MeshHandleDescriptor meshDescriptor; + meshDescriptor.m_modelAsset = m_configuration.m_modelAsset; + meshDescriptor.m_useForwardPassIblSpecular = m_configuration.m_useForwardPassIblSpecular; + meshDescriptor.m_requiresCloneCallback = RequiresCloning; + m_meshHandle = m_meshFeatureProcessor->AcquireMesh(meshDescriptor, materials); m_meshFeatureProcessor->ConnectModelChangeEventHandler(m_meshHandle, m_changeEventHandler); const AZ::Transform& transform = m_transformInterface ? m_transformInterface->GetWorldTM() : AZ::Transform::CreateIdentity(); @@ -327,7 +330,6 @@ namespace AZ m_meshFeatureProcessor->SetSortKey(m_meshHandle, m_configuration.m_sortKey); m_meshFeatureProcessor->SetLodOverride(m_meshHandle, m_configuration.m_lodOverride); m_meshFeatureProcessor->SetExcludeFromReflectionCubeMaps(m_meshHandle, m_configuration.m_excludeFromReflectionCubeMaps); - m_meshFeatureProcessor->SetUseForwardPassIblSpecular(m_meshHandle, m_configuration.m_useForwardPassIblSpecular); // [GFX TODO] This should happen automatically. m_changeEventHandler should be passed to AcquireMesh // If the model instance or asset already exists, announce a model change to let others know it's loaded. diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp index 6eadabe44d..29dee12489 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp @@ -626,9 +626,14 @@ namespace AZ AZ_Error("ActorComponentController", meshFeatureProcessor, "Unable to find a MeshFeatureProcessorInterface on the entityId."); if (meshFeatureProcessor) { - // Last boolean parameter indicates if motion vector is enabled + MeshHandleDescriptor meshDescriptor; + meshDescriptor.m_modelAsset = m_skinnedMeshInstance->m_model->GetModelAsset(); + + // [GFX TODO][ATOM-13067] Enable raytracing on skinned meshes + meshDescriptor.m_isRayTracingEnabled = false; + m_meshHandle = AZStd::make_shared( - m_meshFeatureProcessor->AcquireMesh(m_skinnedMeshInstance->m_model->GetModelAsset(), materials, /*skinnedMeshWithMotion=*/true)); + m_meshFeatureProcessor->AcquireMesh(meshDescriptor, materials)); } // If render proxies already exist, they will be auto-freed diff --git a/Gems/Blast/Code/Source/Editor/EditorBlastMeshDataComponent.cpp b/Gems/Blast/Code/Source/Editor/EditorBlastMeshDataComponent.cpp index 4a6f41331b..dfd5e2e4ed 100644 --- a/Gems/Blast/Code/Source/Editor/EditorBlastMeshDataComponent.cpp +++ b/Gems/Blast/Code/Source/Editor/EditorBlastMeshDataComponent.cpp @@ -187,7 +187,7 @@ namespace Blast materials, GetEntityId(), &AZ::Render::MaterialComponentRequests::GetMaterialOverrides); m_meshFeatureProcessor->ReleaseMesh(m_meshHandle); - m_meshHandle = m_meshFeatureProcessor->AcquireMesh(m_meshAssets[0], materials); + m_meshHandle = m_meshFeatureProcessor->AcquireMesh(AZ::Render::MeshHandleDescriptor{ m_meshAssets[0] }, materials); m_meshFeatureProcessor->ConnectModelChangeEventHandler(m_meshHandle, m_changeEventHandler); HandleModelChange(m_meshFeatureProcessor->GetModel(m_meshHandle)); diff --git a/Gems/Blast/Code/Source/Family/ActorRenderManager.cpp b/Gems/Blast/Code/Source/Family/ActorRenderManager.cpp index 3695a9f07e..e461e6b7b5 100644 --- a/Gems/Blast/Code/Source/Family/ActorRenderManager.cpp +++ b/Gems/Blast/Code/Source/Family/ActorRenderManager.cpp @@ -47,7 +47,7 @@ namespace Blast { m_chunkActors[chunkId] = &actor; m_chunkMeshHandles[chunkId] = - m_meshFeatureProcessor->AcquireMesh(m_meshData->GetMeshAsset(chunkId), m_materialMap); + m_meshFeatureProcessor->AcquireMesh(AZ::Render::MeshHandleDescriptor{ m_meshData->GetMeshAsset(chunkId) }, m_materialMap); } } diff --git a/Gems/Blast/Code/Tests/ActorRenderManagerTest.cpp b/Gems/Blast/Code/Tests/ActorRenderManagerTest.cpp index 6db4adbab3..e7d8019117 100644 --- a/Gems/Blast/Code/Tests/ActorRenderManagerTest.cpp +++ b/Gems/Blast/Code/Tests/ActorRenderManagerTest.cpp @@ -98,7 +98,7 @@ namespace Blast // ActorRenderManager::OnActorCreated { EXPECT_CALL( - *m_mockMeshFeatureProcessor, AcquireMesh(_, testing::A(), _, _, _)) + *m_mockMeshFeatureProcessor, AcquireMesh(_, testing::A())) .Times(aznumeric_cast(m_actorFactory->m_mockActors[0]->GetChunkIndices().size())) .WillOnce(Return(testing::ByMove(AZ::Render::MeshFeatureProcessorInterface::MeshHandle()))) .WillOnce(Return(testing::ByMove(AZ::Render::MeshFeatureProcessorInterface::MeshHandle()))); diff --git a/Gems/GraphModel/Code/Source/Model/Slot.cpp b/Gems/GraphModel/Code/Source/Model/Slot.cpp index 6433129af8..dca2175df3 100644 --- a/Gems/GraphModel/Code/Source/Model/Slot.cpp +++ b/Gems/GraphModel/Code/Source/Model/Slot.cpp @@ -300,7 +300,7 @@ namespace GraphModel // Slot AZ::JsonSerializationResult::Result JsonSlotSerializer::Load( - void* outputValue, const AZ::Uuid& outputValueTypeId, const rapidjson::Value& inputValue, + void* outputValue, [[maybe_unused]] const AZ::Uuid& outputValueTypeId, const rapidjson::Value& inputValue, AZ::JsonDeserializerContext& context) { namespace JSR = AZ::JsonSerializationResult; @@ -343,12 +343,12 @@ namespace GraphModel return context.Report( result, - result.GetProcessing() != JSR::Processing::Halted ? "Succesfully loaded Slot information." + result.GetProcessing() != JSR::Processing::Halted ? "Successfully loaded Slot information." : "Failed to load Slot information."); } AZ::JsonSerializationResult::Result JsonSlotSerializer::Store( - rapidjson::Value& outputValue, const void* inputValue, [[maybe_unused]] const void* defaultValue, const AZ::Uuid& valueTypeId, + rapidjson::Value& outputValue, const void* inputValue, [[maybe_unused]] const void* defaultValue, [[maybe_unused]] const AZ::Uuid& valueTypeId, AZ::JsonSerializerContext& context) { namespace JSR = AZ::JsonSerializationResult; diff --git a/Gems/LmbrCentral/Code/CMakeLists.txt b/Gems/LmbrCentral/Code/CMakeLists.txt index 4d03d30923..588502954d 100644 --- a/Gems/LmbrCentral/Code/CMakeLists.txt +++ b/Gems/LmbrCentral/Code/CMakeLists.txt @@ -104,7 +104,7 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS) ly_add_target_files( TARGETS LmbrCentral.Editor - FILES ${QT_LRELEASE_EXECUTABLE} + FILES ${lrelease_files} ) # by default, load the above "Gem::LmbrCentral.Editor" module in dev tools diff --git a/Gems/LmbrCentral/Code/Platform/Linux/lrelease_linux.cmake b/Gems/LmbrCentral/Code/Platform/Linux/lrelease_linux.cmake index 41eaf4a47a..70fbecf851 100644 --- a/Gems/LmbrCentral/Code/Platform/Linux/lrelease_linux.cmake +++ b/Gems/LmbrCentral/Code/Platform/Linux/lrelease_linux.cmake @@ -17,3 +17,7 @@ add_custom_command(TARGET LmbrCentral.Editor POST_BUILD COMMENT "Patching lrelease..." VERBATIM ) + +set(lrelease_files + ${QT_LRELEASE_EXECUTABLE} +) diff --git a/Gems/LmbrCentral/Code/Platform/Mac/lrelease_mac.cmake b/Gems/LmbrCentral/Code/Platform/Mac/lrelease_mac.cmake index 4d5680a30d..53fcdfa02a 100644 --- a/Gems/LmbrCentral/Code/Platform/Mac/lrelease_mac.cmake +++ b/Gems/LmbrCentral/Code/Platform/Mac/lrelease_mac.cmake @@ -8,3 +8,7 @@ # 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. # + +set(lrelease_files + ${QT_LRELEASE_EXECUTABLE} +) diff --git a/Gems/LmbrCentral/Code/Platform/Windows/lrelease_windows.cmake b/Gems/LmbrCentral/Code/Platform/Windows/lrelease_windows.cmake index 4d5680a30d..dda1715d76 100644 --- a/Gems/LmbrCentral/Code/Platform/Windows/lrelease_windows.cmake +++ b/Gems/LmbrCentral/Code/Platform/Windows/lrelease_windows.cmake @@ -8,3 +8,8 @@ # 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. # + +set(lrelease_files + ${QT_LRELEASE_EXECUTABLE} + ${QT_PATH}/bin/Qt5Core.dll # this is a dependency of lrelease. Even in debug we use the release version +) diff --git a/Gems/Multiplayer/Code/Include/Multiplayer/ReplicationWindows/IReplicationWindow.h b/Gems/Multiplayer/Code/Include/Multiplayer/ReplicationWindows/IReplicationWindow.h index 5d90fc286b..8e51c30b2c 100644 --- a/Gems/Multiplayer/Code/Include/Multiplayer/ReplicationWindows/IReplicationWindow.h +++ b/Gems/Multiplayer/Code/Include/Multiplayer/ReplicationWindows/IReplicationWindow.h @@ -14,7 +14,7 @@ #include #include -#include +#include namespace Multiplayer { @@ -24,7 +24,7 @@ namespace Multiplayer NetEntityRole m_netEntityRole = NetEntityRole::InvalidRole; float m_priority = 0.0f; }; - using ReplicationSet = AZStd::unordered_map; + using ReplicationSet = AZStd::map; class IReplicationWindow { diff --git a/Gems/MultiplayerCompression/gem.json b/Gems/MultiplayerCompression/gem.json index 2dc0a2d89a..77a86b04a2 100644 --- a/Gems/MultiplayerCompression/gem.json +++ b/Gems/MultiplayerCompression/gem.json @@ -1,16 +1,10 @@ { "gem_name": "MultiplayerCompression", - "GemFormatVersion": 4, - "Uuid": "1d353c8ca3c74ed193fd6c6783ae41cc", - "Name": "MultiplayerCompression", - "DisplayName": "Multiplayer Compression", - "Version": "0.1.0", - "Summary": "The Multiplayer Compression gem provides an open source Compressor for use with the Multiplayer Gem.", - "Tags": ["GridMate","Multiplayer","Networking"], - "IconPath": "preview.png", - "Modules": [ - { - "Type": "GameModule" - } - ] + "display_name": "Multiplayer Compression", + "summary": "The Multiplayer Compression gem provides an open source Compressor for use with AzNetworking's transport layer.", + "canonical_tags": ["Multiplayer", "Networking", "Utility"], + "user_tags": ["MultiplayerCompression"], + "icon_path": "preview.png", + "type": "Code", + "provider": "Open 3D Foundation" } diff --git a/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorVegetationComponentBase.h b/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorVegetationComponentBase.h index 3ad20b8f6a..cbf41f6bf8 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorVegetationComponentBase.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorVegetationComponentBase.h @@ -17,7 +17,6 @@ #include #include #include -#include namespace Vegetation { @@ -28,7 +27,6 @@ namespace Vegetation template class EditorVegetationComponentBase : public LmbrCentral::EditorWrappedComponentBase - , private CrySystemEventBus::Handler { public: using BaseClassType = LmbrCentral::EditorWrappedComponentBase; @@ -48,11 +46,6 @@ namespace Vegetation static void Reflect(AZ::ReflectContext* context); - //////////////////////////////////////////////////////////////////////////// - // CrySystemEvents - void OnCryEditorBeginLevelExport() override; - void OnCryEditorEndLevelExport(bool /*success*/) override; - protected: using BaseClassType::m_configuration; using BaseClassType::m_component; diff --git a/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorVegetationComponentBase.inl b/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorVegetationComponentBase.inl index 3a5afd1c27..93c253f212 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorVegetationComponentBase.inl +++ b/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorVegetationComponentBase.inl @@ -12,24 +12,6 @@ namespace Vegetation { - template - void EditorVegetationComponentBase::OnCryEditorEndLevelExport(bool /*success*/) - { - // Restore the activation state of our components after the export is complete. - if (m_visible) - { - m_component.Activate(); - } - } - - template - void EditorVegetationComponentBase::OnCryEditorBeginLevelExport() - { - // We need to deactivate our game components at the start of level exports because any vegetation meshes that are loaded - // or instances that are spawned can end up in our static vegetation level data. - m_component.Deactivate(); - } - template AZ::u32 EditorVegetationComponentBase::ConfigurationChanged() { @@ -69,13 +51,11 @@ namespace Vegetation { GradientSignal::SetSamplerOwnerEntity(m_configuration, GetEntityId()); BaseClassType::Activate(); - CrySystemEventBus::Handler::BusConnect(); } template void EditorVegetationComponentBase::Deactivate() { - CrySystemEventBus::Handler::BusDisconnect(); BaseClassType::Deactivate(); } diff --git a/Gems/Vegetation_Gem_Assets/ArtSource/SplatMaps/SplatMaps.psd b/Gems/Vegetation_Gem_Assets/ArtSource/SplatMaps/SplatMaps.psd deleted file mode 100644 index 3f358860e1..0000000000 --- a/Gems/Vegetation_Gem_Assets/ArtSource/SplatMaps/SplatMaps.psd +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2a70cf9523c07263261bb2a912f656609419318e680611ccc8e2652c2f5ec0a -size 410840 diff --git a/Gems/Vegetation_Gem_Assets/ArtSource/SplatMaps/splatmap_00.bmp b/Gems/Vegetation_Gem_Assets/ArtSource/SplatMaps/splatmap_00.bmp deleted file mode 100644 index f761afd7e6..0000000000 --- a/Gems/Vegetation_Gem_Assets/ArtSource/SplatMaps/splatmap_00.bmp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69c699ebfb1f4ffe241b047499d0f52292112b38783d08eb50ccfeb97f76c91a -size 3145784 diff --git a/Gems/Vegetation_Gem_Assets/ArtSource/SplatMaps/splatmap_01.bmp b/Gems/Vegetation_Gem_Assets/ArtSource/SplatMaps/splatmap_01.bmp deleted file mode 100644 index 4aec47ff90..0000000000 --- a/Gems/Vegetation_Gem_Assets/ArtSource/SplatMaps/splatmap_01.bmp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2519313a259f6df040e17ce27cffc3c96a2c8616aeeffd3899481ab52efd41f -size 3145784 diff --git a/Gems/Vegetation_Gem_Assets/ArtSource/SplatMaps/splatmap_02.bmp b/Gems/Vegetation_Gem_Assets/ArtSource/SplatMaps/splatmap_02.bmp deleted file mode 100644 index ac26ed299f..0000000000 --- a/Gems/Vegetation_Gem_Assets/ArtSource/SplatMaps/splatmap_02.bmp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9d76c75c2b18850a091f9787ee4ac684a648d8dea0bcc8141f4e895942428fd4 -size 3145784 diff --git a/Gems/Vegetation_Gem_Assets/ArtSource/SplatMaps/splatmap_03.bmp b/Gems/Vegetation_Gem_Assets/ArtSource/SplatMaps/splatmap_03.bmp deleted file mode 100644 index 3984012834..0000000000 --- a/Gems/Vegetation_Gem_Assets/ArtSource/SplatMaps/splatmap_03.bmp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c22f26d5921218882dbe7d55deb9f4e33744a34eb02804efb44998f7299afb6 -size 3145784 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_Diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_Diff.tif deleted file mode 100644 index 66e37ba7b8..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_Diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3841e927bb9a411af5287e1f69c68ad6fbcfefc4ed4696ee58ab80f6554e4b3e -size 12602708 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_Diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_Diff.tif.exportsettings deleted file mode 100644 index d3713274e6..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_Diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_M_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_M_matGroup.mtl deleted file mode 100644 index 3bf9461012..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_M_matGroup.mtl +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_ddna.tif deleted file mode 100644 index 21c4dd4929..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c318de8b5e831429c0852043df2b496ea360f7e7a16a09728057e936b5f9d82f -size 16797014 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_ddna.tif.exportsettings deleted file mode 100644 index 0159b6ca02..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_spec.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_spec.tif deleted file mode 100644 index 8fa154bdba..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_spec.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a64b6827e7f837f35d802433419ad88b196ea99ed97215cdee4d77009584152 -size 3157332 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_spec.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_spec.tif.exportsettings deleted file mode 100644 index 25a6d5d697..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_01_spec.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=Reflectance /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_02_Diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_02_Diff.tif deleted file mode 100644 index 40842d8ca3..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_02_Diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45ab25afac85d92c63c939cea3086545975412a81d2c1d03210a9c4c0a57b8ab -size 12602708 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_02_Diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_02_Diff.tif.exportsettings deleted file mode 100644 index 44cd6187b1..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/AM_Barrel_02_Diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/am_barrel_01.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/am_barrel_01.cgf deleted file mode 100644 index 1d6987b993..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/am_barrel_01.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f582c61b53f2bde096345e6a1dbbfb70fabbe05aaa96f5f560885acbc2ecb76c -size 111276 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/am_barrel_01_m_matgroup_red.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/am_barrel_01_m_matgroup_red.mtl deleted file mode 100644 index 8cb77c2c65..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/ManMade/Props/Barrel/am_barrel_01_m_matgroup_red.mtl +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_Mat_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_Mat_matGroup.mtl deleted file mode 100644 index 57822cd8c7..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_Mat_matGroup.mtl +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_ddna.tif deleted file mode 100644 index 107cfbd6cf..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70148ec39ccbbb05bc3c5df8857fbbdc1ee455574b4a141e4d6ceb78aacd6c76 -size 16797012 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_ddna.tif.exportsettings deleted file mode 100644 index 4709125fa0..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_diff.tif deleted file mode 100644 index 9503f0c4d9..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7da1eab71d64b032264f1cb3b1b8b768496c56c90d057e42183b6dcfe9d1ada9 -size 12602706 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_diff.tif.exportsettings deleted file mode 100644 index 749595194d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_rocky_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_rocky_ddna.tif deleted file mode 100644 index 99c22bf61e..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_rocky_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26c78881443d317e708efaa2266fe6c0e2a52d04109887c408cf539e31a3aed2 -size 16797018 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_rocky_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_rocky_ddna.tif.exportsettings deleted file mode 100644 index 4709125fa0..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Boulder_01_rocky_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_01_mat_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_01_mat_matGroup.mtl deleted file mode 100644 index 68519557fd..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_01_mat_matGroup.mtl +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_Mat_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_Mat_matGroup.mtl deleted file mode 100644 index be5fe5a3db..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_Mat_matGroup.mtl +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_ddna.tif deleted file mode 100644 index c2b4e11895..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:960fcf7aa076eae6578e40bd566b0bc978f77899f87de2b3a4306568e9eb5f10 -size 67145042 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_ddna.tif.exportsettings deleted file mode 100644 index 0159b6ca02..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_diff.tif deleted file mode 100644 index b33aff3190..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb9f5e3093ee1e19dc4bae286d4e34ae2095a3e70dbd02b64343fdb7e75ff897 -size 67145042 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_diff.tif.exportsettings deleted file mode 100644 index 749595194d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_rocky_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_rocky_ddna.tif deleted file mode 100644 index aa685d4652..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_rocky_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c484e208ee7bdda60ef6ffeba1e6c523596ad9fd36cf24ac424baaf06c57cca9 -size 67145048 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_rocky_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_rocky_ddna.tif.exportsettings deleted file mode 100644 index 4709125fa0..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Cliff_02_rocky_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Moss_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Moss_ddna.tif deleted file mode 100644 index d2f1fdf89e..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Moss_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:046b2105e45016bad314e8ad4ed3800018f60ea218bf33b2637554c0efd1c0b5 -size 16797016 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Moss_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Moss_ddna.tif.exportsettings deleted file mode 100644 index 4709125fa0..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Moss_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Rocky_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Rocky_ddna.tif deleted file mode 100644 index 409679c789..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Rocky_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4285c8231bde77d1dbc9cbce60ee4a35a566f75cb96cb4279f1c1098a6fd5c3 -size 67145054 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Rocky_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Rocky_ddna.tif.exportsettings deleted file mode 100644 index 4709125fa0..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Rocky_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_ddna.tif deleted file mode 100644 index d3b49a1d00..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd21e1c93650c69e841a5a87812a6937f77d9ae44c7f28bf37567a314e27d7d6 -size 67145058 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_ddna.tif.exportsettings deleted file mode 100644 index 4709125fa0..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_diff.tif deleted file mode 100644 index d1b15a4d9a..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45630fa430865bea236013ea2c6c91966ced24d51bdf791d04a5ba71d76dae69 -size 67145058 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_diff.tif.exportsettings deleted file mode 100644 index c47c60591e..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_Underneath_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_ddna.tif deleted file mode 100644 index 06ad9f3b00..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cecb571c673a412031a64e704122ac6eef77bd66005e26b767edd8c28037e11e -size 67145048 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_ddna.tif.exportsettings deleted file mode 100644 index 612e3d6260..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,0,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_diff.tif deleted file mode 100644 index 45e1facd3c..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e0da4f69d5496bb3329b4bd4e5e32bceacf98d6e2eb6af1771812a225b241a7 -size 67145048 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_diff.tif.exportsettings deleted file mode 100644 index 749595194d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_mat_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_mat_matGroup.mtl deleted file mode 100644 index ba11d83efe..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_01_mat_matGroup.mtl +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_M_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_M_matGroup.mtl deleted file mode 100644 index 960256dcd7..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_M_matGroup.mtl +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_ddna.tif deleted file mode 100644 index e4acf21e50..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfce23f8a59c8ef97dc9d8bdeb81072fc5300bff3c11735f65b7f78652f93cd4 -size 16797016 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_ddna.tif.exportsettings deleted file mode 100644 index 0159b6ca02..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_diff.tif deleted file mode 100644 index 3af6a1f5dc..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b157eab497ef89c8f575f039b6da5b3c43a9fea06b2e6c2335ee1347357b49e3 -size 12602710 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_diff.tif.exportsettings deleted file mode 100644 index d3713274e6..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Flat_Multi_02_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_ddna.tif deleted file mode 100644 index 5d931fcc02..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f9378510d3f75fa80a5ca5884f1ad9e20852c5eb88d6e10d74238c89dbda208 -size 16797012 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_ddna.tif.exportsettings deleted file mode 100644 index f646798932..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,0,50,0,0,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_diff.tif deleted file mode 100644 index 044b91dd12..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:117d37d86b808768d74f70a522e66a76a6ffc71ceb5858e901a3f5191994d92b -size 12602706 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_diff.tif.exportsettings deleted file mode 100644 index 1fa63072ac..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,0,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_mat_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_mat_matGroup.mtl deleted file mode 100644 index 5edd2d3b75..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_01_mat_matGroup.mtl +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_ddna.tif deleted file mode 100644 index cc42e3d4c6..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:10b24991a5042c283f7af1a75360d0d9ad78384c6c4eadf99340506e253c8762 -size 16797012 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_ddna.tif.exportsettings deleted file mode 100644 index c1e54599df..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,0,0,0,0,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_diff.tif deleted file mode 100644 index d22de588d9..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6909db9fd61da354c863b1f8d6abb6f504f47b79515410b4c1337d5d5c06a69b -size 12602706 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_diff.tif.exportsettings deleted file mode 100644 index 96f3ff5a02..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,0,0,50,50,50 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_mat_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_mat_matGroup.mtl deleted file mode 100644 index b5732a2758..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rock_Square_02_mat_matGroup.mtl +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Slide_01.skin b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Slide_01.skin deleted file mode 100644 index 33529b2903..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Slide_01.skin +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94e30359c97338d4edeaeab700596993f20fa434606af4fcaa29d8ae1be7c781 -size 852132 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Slide_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Slide_matGroup.mtl deleted file mode 100644 index 72115cfcc6..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Slide_matGroup.mtl +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Slide_skel_01.chr b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Slide_skel_01.chr deleted file mode 100644 index 59f8b3eceb..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Slide_skel_01.chr +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20545079f3e0a61cc144a161999753996797a090f285d63f1c6b1ac1a050729b -size 24956 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_ddna.tif deleted file mode 100644 index 5236811ed3..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2cb13a66c6d06e7cd5f06eb05f45c817db0dc76c64afde5225213f742bc0cf40 -size 1056084 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_ddna.tif.exportsettings deleted file mode 100644 index 4709125fa0..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_diff.tif deleted file mode 100644 index 5afd79a967..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de80f21e0f6d48e3894fcf309f2564e1b74be0a65e415506034ff144b051bc74 -size 3157330 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_diff.tif.exportsettings deleted file mode 100644 index d3713274e6..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_01_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_Mat_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_Mat_matGroup.mtl deleted file mode 100644 index aabcfba40e..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_Mat_matGroup.mtl +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_ddna.tif deleted file mode 100644 index 1416b0eed5..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c2c2f43f48f2b661f69b955e7009006a6aa616a25131b4b5e9a5017ac6b18193 -size 1056084 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_ddna.tif.exportsettings deleted file mode 100644 index 4709125fa0..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_diff.tif deleted file mode 100644 index 439288cda3..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51ba30ea6a9749edf269e3d22a0eb73ebc4589f87f1d207166cb0f5ad1201a45 -size 793938 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_diff.tif.exportsettings deleted file mode 100644 index 44cd6187b1..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_matGroup.mtl deleted file mode 100644 index 1d62a9a2cd..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_02_matGroup.mtl +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_ShinyM_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_ShinyM_matGroup.mtl deleted file mode 100644 index 3df0eceb57..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_ShinyM_matGroup.mtl +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_ddna.tif deleted file mode 100644 index 3551cc7a27..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dda8085556f470dc023e20f6d26c7ea4a5a47ed486db90050e31dfe7838d18dd -size 1056058 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_ddna.tif.exportsettings deleted file mode 100644 index 4709125fa0..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_diff.tif deleted file mode 100644 index ef38d786a4..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37866b8a07a89274c76b53a545076fa0be9071b2fea21787b3c7890f8fa6d303 -size 793912 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_diff.tif.exportsettings deleted file mode 100644 index 44cd6187b1..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/AM_Rocks_Small_Shiny_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock03_detail.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock03_detail.tif deleted file mode 100644 index 634a6c9119..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock03_detail.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21cde0da4644e3153946411ea409e4632ba523b69b0fc681a3b09f523089181e -size 12602664 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock03_detail.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock03_detail.tif.exportsettings deleted file mode 100644 index 2e8334a855..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock03_detail.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /mipgentype=sigma-six /preset=Detail_MergedAlbedoNormalsSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_ddna.tif deleted file mode 100644 index aadc159c63..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d4d82f4b0f24f608d5e4dbdab6fa71709cbaa0413cc3523eaae0ec3cefcf529 -size 67145040 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_ddna.tif.exportsettings deleted file mode 100644 index 9f2f74b20f..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,0,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_diff.tif deleted file mode 100644 index d7acd7109a..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26a43da7577aba6425fcd1bebe3d85401dd2283dff41d4e824b49f263c088cea -size 67145040 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_diff.tif.exportsettings deleted file mode 100644 index 749595194d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_rocky_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_rocky_ddna.tif deleted file mode 100644 index c7a349738c..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_rocky_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b25f5576f02b4f17a6806468e724b302fa1195a3552ab4605628b6429baa1a08 -size 67145046 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_rocky_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_rocky_ddna.tif.exportsettings deleted file mode 100644 index 4709125fa0..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/Rock_Cliff_01_rocky_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_boulder_01.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_boulder_01.cgf deleted file mode 100644 index a2c688ac88..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_boulder_01.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e8113d59915a411f248fe9e560c9043817a609bb3a9fdf0521caf42cece019f -size 138724 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_boulder_01_mat_vista.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_boulder_01_mat_vista.mtl deleted file mode 100644 index 9bd3403245..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_boulder_01_mat_vista.mtl +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_boulder_01_rocky_matgroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_boulder_01_rocky_matgroup.mtl deleted file mode 100644 index e69529ca7f..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_boulder_01_rocky_matgroup.mtl +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_boulder_02.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_boulder_02.cgf deleted file mode 100644 index 0b5e3298ed..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_boulder_02.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4177903b65bcfd2f04dba4ce3f6316c273b94f064c06002bda5b8e2ad6d06a5b -size 126812 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_01.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_01.cgf deleted file mode 100644 index 9e454e84db..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_01.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:39c9a0bee9eb5d3475352c66844471b5ccf4520c110d6e595d8125e17c6e3413 -size 727616 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_01_rocky_matgroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_01_rocky_matgroup.mtl deleted file mode 100644 index 39199c75a5..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_01_rocky_matgroup.mtl +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_02.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_02.cgf deleted file mode 100644 index 3f032b49ca..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_02.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f9370dfce16a91f9862f3cb3fa0f9c14f504104951857e6479ab695b162174c -size 323064 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_02_mat_vista.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_02_mat_vista.mtl deleted file mode 100644 index a7bf11c362..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_02_mat_vista.mtl +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_02_rocky_matgroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_02_rocky_matgroup.mtl deleted file mode 100644 index 7063ab5317..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_02_rocky_matgroup.mtl +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_02a.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_02a.cgf deleted file mode 100644 index 522a4397e5..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_02a.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae5580e8463dc6f4e3e1c7fdee69b7e5178a9502ee13741ed1c412952a66c9c8 -size 175928 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_02b.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_02b.cgf deleted file mode 100644 index c0cd90311b..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_cliff_02b.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c491da1c77793c6fc132f012fab9024e8db0cd6d9abd7721f2b2c962ef597f0 -size 156592 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_ddna.tif deleted file mode 100644 index de50a8b19f..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09c780af19a75f8d385a36987455a8db20d960212a8db4adca0afc7114706d47 -size 16797010 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_ddna.tif.exportsettings deleted file mode 100644 index 4709125fa0..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_diff.tif deleted file mode 100644 index 31e1750dc6..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:caaebeea973821f7e0ed3661cefc7d91eabdceddb9c96b746ab5771b593d8a4a -size 12602704 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_diff.tif.exportsettings deleted file mode 100644 index 44cd6187b1..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_group.cgf deleted file mode 100644 index 4945be459d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e44a8e7642beb4468382a9e56b65e2db2ef77f0a5d4171c6670d3d2178f6ee7 -size 204920 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_matGroup.mtl deleted file mode 100644 index 61e788f300..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_01_matGroup.mtl +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_multi_01.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_multi_01.cgf deleted file mode 100644 index dd9b3ae8e6..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_multi_01.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa54db0536e8e85532d0f88987bab3f1d0bf3cba8898e4e38f0dcf027bfc5fe6 -size 199708 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_multi_01_rocky_matgroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_multi_01_rocky_matgroup.mtl deleted file mode 100644 index e66a2f410c..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_multi_01_rocky_matgroup.mtl +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_multi_01_underneath_matgroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_multi_01_underneath_matgroup.mtl deleted file mode 100644 index dba423d275..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_multi_01_underneath_matgroup.mtl +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_multi_02_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_multi_02_group.cgf deleted file mode 100644 index e3326f26af..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_flat_multi_02_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51102056a51edfc7153bb6ac4bfe71dbfd6041408f9e9e28d7e294e3d18f9a60 -size 500712 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_square_01.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_square_01.cgf deleted file mode 100644 index 15ba1206bb..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_square_01.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c314b95e421fb6aa5a5e9f80679854f180f6cfb260ab5b84b896b24f8236ab04 -size 60384 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_square_02.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_square_02.cgf deleted file mode 100644 index 7174d48922..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_square_02.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f31ced8670bf0f9f0f3df3f81f7cd56c08cbb9776b51da979dd08d66b3f6772b -size 46608 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_square_02_dark_mat.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_square_02_dark_mat.mtl deleted file mode 100644 index ae3d5783fe..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rock_square_02_dark_mat.mtl +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_slide_01.cdf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_slide_01.cdf deleted file mode 100644 index a8ba58301e..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_slide_01.cdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81fffde0b0ee660b1846d33e2ccef38f692d6e9baa89b639103ba9934a739318 -size 319 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_slide_debris_01_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_slide_debris_01_group.cgf deleted file mode 100644 index 44b6d6c879..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_slide_debris_01_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28d49d412896d3be92787b7e344b19c8ddd2511d619f94ba44ee8a3edacfc719 -size 6000 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_slide_skel_01.chrparams b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_slide_skel_01.chrparams deleted file mode 100644 index 6ed76ea4fb..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_slide_skel_01.chrparams +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:08adc30db6828177bb3b83e770aba4cdbb0c6b92b3e2aabd028abda473950e50 -size 1669 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_small_01.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_small_01.cgf deleted file mode 100644 index 159eea15b3..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_small_01.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56b86f161d37b0091e1491aaa4a18bf24669b2884b2a357d50c1db5050715930 -size 48141 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_small_02.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_small_02.cgf deleted file mode 100644 index fe888ae84f..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_small_02.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa07be483efe791fd6091170f6b6d1e521de79ed666dfc18e9530de9e01a760b -size 22072 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_small_02_mat_matgroup_dark.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_small_02_mat_matgroup_dark.mtl deleted file mode 100644 index 29ac1aa851..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_small_02_mat_matgroup_dark.mtl +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_small_02_matgroup_dark.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_small_02_matgroup_dark.mtl deleted file mode 100644 index 69fa83b79c..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_small_02_matgroup_dark.mtl +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_small_shiny_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_small_shiny_group.cgf deleted file mode 100644 index 4695a7d270..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Rocks/am_rocks_small_shiny_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99dabc61c73c2ae8d94cb030cca6f80738e42b680a482bda4cb0b83d701d648a -size 43900 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Bark_01_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Bark_01_diff.tif deleted file mode 100644 index b70b707ea6..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Bark_01_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff835abb5c50c8d7b6d4fc4a9da09d00dd314a484bd40cf04f6e3f20f25c08cc -size 3157298 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Bark_02_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Bark_02_diff.tif deleted file mode 100644 index fe079ec85f..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Bark_02_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d1fbc07b07671f0143dbe48df3767d7e45501ee44a7537707a55d7d98d8c7f5 -size 3157298 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Leaf_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Leaf_diff.tif deleted file mode 100644 index 2e9e364d75..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Leaf_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:374c8361b314bff08b2442c3d31a797d65aca7445b5359e05e44ed4de703aec7 -size 4205908 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Leaf_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Leaf_diff.tif.exportsettings deleted file mode 100644 index 749595194d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Leaf_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Mat.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Mat.mtl deleted file mode 100644 index dcb18e1487..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_Mat.mtl +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_leaf_sss.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_leaf_sss.tif deleted file mode 100644 index 0570389b99..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_leaf_sss.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0403336f4be0e6be37f6bf869582cf0195a4ea347b22f697ca4f848c74d628e9 -size 3157330 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_leaf_sss.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_leaf_sss.tif.exportsettings deleted file mode 100644 index 79d1c5dd92..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Aspen_leaf_sss.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Opacity /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Background_Trees_Leaf_mat.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Background_Trees_Leaf_mat.mtl deleted file mode 100644 index 1fc85c34d5..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Background_Trees_Leaf_mat.mtl +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Bush_01_mat.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Bush_01_mat.mtl deleted file mode 100644 index aec274eb85..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Bush_01_mat.mtl +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Bush_Privet_01_Frond_M_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Bush_Privet_01_Frond_M_matGroup.mtl deleted file mode 100644 index 95a300095a..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Bush_Privet_01_Frond_M_matGroup.mtl +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Bush_Privet_02_Frond_M_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Bush_Privet_02_Frond_M_matGroup.mtl deleted file mode 100644 index 64e174f053..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Bush_Privet_02_Frond_M_matGroup.mtl +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_Bark_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_Bark_diff.tif deleted file mode 100644 index 0918e3353d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_Bark_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67fe2201f7405e2f58fb8348d79823a1b46089a906417891cb4c91c8eedfb9c4 -size 3157328 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_bark_mat.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_bark_mat.mtl deleted file mode 100644 index 89291470ba..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_bark_mat.mtl +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_diff.tif deleted file mode 100644 index a8a5f6dbc4..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e290729d6662b18c2db9d3c7097516d0ef4b46a751a90314031f7f6bdc0579f7 -size 4205904 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_diff.tif.exportsettings deleted file mode 100644 index c47c60591e..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_sss.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_sss.tif deleted file mode 100644 index b0d0b9b5df..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_sss.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faa0d9b0f74fbdec8a3d37d4972b0b5e6b93df830c120a193c1a0d1020d5cd4b -size 3157324 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_sss.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_sss.tif.exportsettings deleted file mode 100644 index fa55f75e2d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Cedar_sss.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=Opacity /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Dead_Tree_bark_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Dead_Tree_bark_matGroup.mtl deleted file mode 100644 index 7e7790fc4c..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Dead_Tree_bark_matGroup.mtl +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Dead_Tree_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Dead_Tree_diff.tif deleted file mode 100644 index e786c5690d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Dead_Tree_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:da9c3eeab3586aaba473fa4dbf6d7be89ef3bb096b35017375064f1188eec287 -size 12599514 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_ddna.tif deleted file mode 100644 index f6b9aa0a05..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4d5eb2485bd53eb52c2531273cd2cce32d96fcbf6c43eb494a2d748917fdfa2e -size 4205908 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_ddna.tif.exportsettings deleted file mode 100644 index 0159b6ca02..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_diff.tif deleted file mode 100644 index fa83875776..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1461ae755b243dda7c4d46c2e08f767040b32ad4b51fa8a4863aad70e3c0102 -size 4205908 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_diff.tif.exportsettings deleted file mode 100644 index 749595194d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_mat.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_mat.mtl deleted file mode 100644 index bcb81dd998..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_mat.mtl +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_sss.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_sss.tif deleted file mode 100644 index 258c4f623e..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_sss.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70f97970ebff3d5198f2a9ec132a26bfec0a43a4fa8b600f05c1b7be7dc1f7cc -size 3157328 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_sss.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_sss.tif.exportsettings deleted file mode 100644 index 79d1c5dd92..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Doc_Plant_sss.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Opacity /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fallen_Tree_bark_mat.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fallen_Tree_bark_mat.mtl deleted file mode 100644 index c2def166ff..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fallen_Tree_bark_mat.mtl +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fallen_Tree_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fallen_Tree_diff.tif deleted file mode 100644 index 8a9560f067..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fallen_Tree_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:957907dd575fe636f3ac35ef3edce24ac7d6ae2c84fd3d9d36ec237be77ee5da -size 12599516 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_Large_01_Mat_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_Large_01_Mat_matGroup.mtl deleted file mode 100644 index ae8edf2155..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_Large_01_Mat_matGroup.mtl +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_ddna.tif deleted file mode 100644 index 3f1704533b..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d71b48456857917c3bf268ab3db9ad96408f4107faf951132545547680912e29 -size 16796984 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_diff.tif deleted file mode 100644 index fec0d96709..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7be3006de15f01c387daa1b8057fe4636a589d0389fed71df117ab7105060830 -size 16797020 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_diff.tif.exportsettings deleted file mode 100644 index 749595194d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_sss.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_sss.tif deleted file mode 100644 index 5781010ab5..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_sss.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49fd0ceef3c21651869c871b1cb7f242dce134e7efe15b0a5c51cfb07004dbdb -size 793944 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_sss.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_sss.tif.exportsettings deleted file mode 100644 index 79d1c5dd92..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Fernbush_large_01_sss.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Opacity /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_diff.tif deleted file mode 100644 index bacb61ee55..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fec174b4fe571b57c5f31a557510fb800fbd3ae9c5371f0af636494a8bf3ec2d -size 16797016 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_diff.tif.exportsettings deleted file mode 100644 index 749595194d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_sss.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_sss.tif deleted file mode 100644 index f84636f859..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_sss.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f36e52bd7bc7bd54d4df38fa1a0917acc857df0cbc1ed339f3d573b4e983667 -size 12602708 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_sss.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_sss.tif.exportsettings deleted file mode 100644 index 79d1c5dd92..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_Tuft_01_sss.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Opacity /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_tuft_01_Mat_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_tuft_01_Mat_matGroup.mtl deleted file mode 100644 index e89724b252..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_tuft_01_Mat_matGroup.mtl +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_tuft_01_matgroup_Tinted b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_tuft_01_matgroup_Tinted deleted file mode 100644 index 4b61f979e7..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_tuft_01_matgroup_Tinted +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_tuft_03_Mat_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_tuft_03_Mat_matGroup.mtl deleted file mode 100644 index 4076fc0b9d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Grass_tuft_03_Mat_matGroup.mtl +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_ddna.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_ddna.tif deleted file mode 100644 index 5a99e6e0ce..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_ddna.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b735887af2f400418d90685e2d91cd7ce04aeb47abf359b305ae2d8d3a8f17cb -size 16797008 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_ddna.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_ddna.tif.exportsettings deleted file mode 100644 index 4709125fa0..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_ddna.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=NormalsWithSmoothness /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_diff.tif deleted file mode 100644 index 715618c7a5..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72f25caca746d282dc4bf46a048cff1fa4a73276acabd74a673564d6241235fe -size 16797008 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_diff.tif.exportsettings deleted file mode 100644 index 1fa63072ac..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,0,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_sss.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_sss.tif deleted file mode 100644 index 95606cbcda..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_sss.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0af84addc0abad70eb17ce15c2c887b95ab171603afb9724b29877b1971a3aba -size 3157252 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_sss.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_sss.tif.exportsettings deleted file mode 100644 index 44cd6187b1..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_02_sss.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_Leaf_02_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_Leaf_02_matGroup.mtl deleted file mode 100644 index 3de49fea14..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_Leaf_02_matGroup.mtl +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_Leaf_mat.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_Leaf_mat.mtl deleted file mode 100644 index 9f05f8c9d8..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_Leaf_mat.mtl +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_diff.tif deleted file mode 100644 index e7e32fab86..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75cb045c8638bb5d4ecaba7dedc17f3581919e4bbf4c7b57086856d553f59115 -size 16796970 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_diff.tif.exportsettings deleted file mode 100644 index c47c60591e..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Ivy_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Lily_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Lily_diff.tif deleted file mode 100644 index bf5dd1f59d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Lily_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5360ada7af3aeca3f700f1508744097e786a4ded59e7367858188c562bbcc0b4 -size 4205866 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Bark_01.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Bark_01.tif deleted file mode 100644 index f879f3266d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Bark_01.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68a9bab41db84dedec840b0e08405b10d9d3d3a608a94c80e44cfc5af3fa4a84 -size 3157292 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Bark_01_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Bark_01_diff.tif deleted file mode 100644 index f879f3266d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Bark_01_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68a9bab41db84dedec840b0e08405b10d9d3d3a608a94c80e44cfc5af3fa4a84 -size 3157292 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_02_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_02_diff.tif deleted file mode 100644 index 28700f95fc..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_02_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8aa6453fa7a2d6fd55cc620375ded6b4c0dffbebe50de9528985debb281bc94 -size 4205874 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_03_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_03_diff.tif deleted file mode 100644 index 83fc287c0b..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_03_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a17d326bd522a19701650a96daa357526c09e7711eb6d8df479c14064576e62 -size 4205910 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_03_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_03_diff.tif.exportsettings deleted file mode 100644 index 749595194d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_03_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_ddn.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_ddn.tif deleted file mode 100644 index 727c03dc4c..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_ddn.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3578ff582703fb6bd0416afe05822ae895e9d7ac65e5d5be311adda10cc8f12a -size 4205858 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_diff.tif deleted file mode 100644 index d24828e8c2..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d90be28d9b01201cc1af7e8ede8679de6ba7faedbacbae3fd98e4cd045d90c3 -size 4205906 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_diff.tif.exportsettings deleted file mode 100644 index 749595194d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_Leaf_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_leaf_red_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_leaf_red_diff.tif deleted file mode 100644 index 5179711452..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_leaf_red_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58b7788aa98c36178659aab80471ae5a0aaf4fedc66ad20438c4d4109bf3a32c -size 4205874 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_leaf_red_sss.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_leaf_red_sss.tif deleted file mode 100644 index 8ceec9e757..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_leaf_red_sss.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:314c8c9d76b6b5ea5fc2592510ce9e00a1e8122cf93cf2be3ce18a9a647e364a -size 4205874 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_red_mat.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_red_mat.mtl deleted file mode 100644 index 558810426e..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Oak_red_mat.mtl +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_01_mat.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_01_mat.mtl deleted file mode 100644 index 195972aa99..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_01_mat.mtl +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_Bark_01.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_Bark_01.tif deleted file mode 100644 index b2cb2fb5f8..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_Bark_01.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef1a003af20ee8cbe96dab91a1fde2c94039365f980ed8ae3939cdb5cbec174b -size 3157294 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_Bark_01_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_Bark_01_diff.tif deleted file mode 100644 index b2cb2fb5f8..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_Bark_01_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef1a003af20ee8cbe96dab91a1fde2c94039365f980ed8ae3939cdb5cbec174b -size 3157294 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_Leaf_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_Leaf_diff.tif deleted file mode 100644 index b7ba7407b3..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_Leaf_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0c43b48118da423395ed124ac7b6976aa0def9686a0c5325faced6e429031d4 -size 4205872 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_leaf_02.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_leaf_02.tif deleted file mode 100644 index 17200ae2b4..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_leaf_02.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3cfe4f4b5074c0c1a745d5e0d6dc7f4dc9ae4d51977dd1b27a1da2529c005e2b -size 4205874 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_leaf_02_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_leaf_02_diff.tif deleted file mode 100644 index 17200ae2b4..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_leaf_02_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3cfe4f4b5074c0c1a745d5e0d6dc7f4dc9ae4d51977dd1b27a1da2529c005e2b -size 4205874 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_leaf_02_sss.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_leaf_02_sss.tif deleted file mode 100644 index 09100b5e1a..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_leaf_02_sss.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1416a972a159848cfb1bd7cf022afe297bb28e6b4dc053876b4ffc3a4e9912fc -size 4205874 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_leaf_sss.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_leaf_sss.tif deleted file mode 100644 index 217c6dfbc2..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Pine_leaf_sss.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:562e1b5fa8f7fb3ebbf0b5ae7dfd16d960a04df40d250403a4c45bb0f9346e5c -size 4205872 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Plains_Cotton_Tree_mat.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Plains_Cotton_Tree_mat.mtl deleted file mode 100644 index c3cf0c06f4..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Plains_Cotton_Tree_mat.mtl +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Plant_Glow_mat_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Plant_Glow_mat_matGroup.mtl deleted file mode 100644 index 288aa96b68..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_Plant_Glow_mat_matGroup.mtl +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_background_ground_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_background_ground_diff.tif deleted file mode 100644 index 4f506b3ac1..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_background_ground_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98f6e99396da3f5d08bb2294b35c646285d080703c75504da8e21d2508361cb5 -size 3157252 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_background_tree_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_background_tree_diff.tif deleted file mode 100644 index fdf5905779..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_background_tree_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:adbc1e9d5973f91de04b9168bbb339eb49a914cfa2138e2c2154255b334fc4f9 -size 4205878 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_leaf_02_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_leaf_02_diff.tif deleted file mode 100644 index 1b341395a7..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_leaf_02_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7abec56acba29dc08b9e66b8e5d407c3fd49afc5944bfb6b6beea79dcf2c74ec -size 4202716 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_leaf_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_leaf_diff.tif deleted file mode 100644 index b995dcc6ca..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_leaf_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b8374a26dba8bcd0eeb372543fb58664c3f1da1215bb04cc62f9594a90cde59 -size 4202716 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_leaf_sss.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_leaf_sss.tif deleted file mode 100644 index 2c26f3235c..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_leaf_sss.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:52a5d75eda6184e4a0b74d6c2e46062aae11efa4d37cefade06aba3d54978b5e -size 4202716 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_diff.tif deleted file mode 100644 index 10b299a6c7..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d6a7892f3f1addf37cdc2a97a324a83ae7e746b2acc08d89f0718eeb529f9e2 -size 2104670 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_diff.tif.exportsettings deleted file mode 100644 index c47c60591e..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_sss.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_sss.tif deleted file mode 100644 index 2e0efbfd52..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_sss.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f5de59ea377f32e7055f77d62618776f836acad9240d8a160259402ec2b6d3b -size 398684 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_sss.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_sss.tif.exportsettings deleted file mode 100644 index fa55f75e2d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_frond_sss.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=Opacity /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_tile_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_tile_diff.tif deleted file mode 100644 index 42aba270d4..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_tile_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d20491c079fc02006c49e41635e1e429707748f34986a268b82ebae332661be -size 3157340 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_tile_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_tile_diff.tif.exportsettings deleted file mode 100644 index d3713274e6..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_bush_privet_01_tile_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_lily_pad_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_lily_pad_matGroup.mtl deleted file mode 100644 index 77abfe59af..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_lily_pad_matGroup.mtl +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_river_weed_mat_matGroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_river_weed_mat_matGroup.mtl deleted file mode 100644 index af375fa1aa..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/AM_river_weed_mat_matGroup.mtl +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/Grass_UpNormals_01_ddn.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/Grass_UpNormals_01_ddn.tif deleted file mode 100644 index 26c2212748..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/Grass_UpNormals_01_ddn.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:165fdbf33b584093826e19f9089cfc46ead5e07d3f3dbcbbe35be670eec40079 -size 3418 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/Grass_UpNormals_01_ddn.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/Grass_UpNormals_01_ddn.tif.exportsettings deleted file mode 100644 index d1103c9959..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/Grass_UpNormals_01_ddn.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /preset=Normals /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_aspen_01_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_aspen_01_group.cgf deleted file mode 100644 index 7fe1919b3a..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_aspen_01_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76be26ad66e2b47e98e5b8fa56435b9eabce839e96a438be621c877c1ce66b00 -size 715168 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_aspen_mat_yellow.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_aspen_mat_yellow.mtl deleted file mode 100644 index 1dd48f3950..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_aspen_mat_yellow.mtl +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_background_tree.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_background_tree.cgf deleted file mode 100644 index ae53fa5280..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_background_tree.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:177e1569b23c5c98da83bd97351c62d161e5477d525e7928407b0ba2f2ca9df8 -size 15720 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bullrush_mat.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bullrush_mat.mtl deleted file mode 100644 index 267854841b..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bullrush_mat.mtl +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bulrush_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bulrush_group.cgf deleted file mode 100644 index 296a5961fb..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bulrush_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c15da281732cf3e7111d35e4de827afb844bf0343647718a27a350b9e994925 -size 39028 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bush_01_dark_mat.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bush_01_dark_mat.mtl deleted file mode 100644 index b9e0ab6ca7..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bush_01_dark_mat.mtl +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bush_01_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bush_01_group.cgf deleted file mode 100644 index da30792922..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bush_01_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15d90afc836a09d97c814154ebd2bd88a613174b2a9729b3edd50b397fe148fc -size 109112 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bush_privet_01_frond_m_matgroup_0.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bush_privet_01_frond_m_matgroup_0.mtl deleted file mode 100644 index 19e7b7977a..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bush_privet_01_frond_m_matgroup_0.mtl +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bush_privet_01_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bush_privet_01_group.cgf deleted file mode 100644 index 060ccc428f..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bush_privet_01_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5486107fb48c6cf3581be0927572f1f1a564b1923cf2bf0be88203ffafe5bfde -size 275084 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bush_privet_02_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bush_privet_02_group.cgf deleted file mode 100644 index 26408f4a35..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_bush_privet_02_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f663b5816c22cc255a7ede0f98ee28068298d3595ea7473b192e12a22503433 -size 227956 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_cedar_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_cedar_group.cgf deleted file mode 100644 index 9a95c2a68c..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_cedar_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36a1c7454a1a871265fb92e3e46ed17c622a79b0482e3966edd4cb0500ebd4b2 -size 507768 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_dead_tree.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_dead_tree.cgf deleted file mode 100644 index ff6d607cdf..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_dead_tree.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d14208210b910345427dab0cfae72c79c82c130704fe7cca4707304483bdf1a -size 156912 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_doc_plant_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_doc_plant_group.cgf deleted file mode 100644 index bb4c35084a..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_doc_plant_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae75cf18cadc276edc1f0bf5027d2c110f876f8d17c57affeee03106bf304132 -size 50334 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_fernbush_large_01_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_fernbush_large_01_group.cgf deleted file mode 100644 index 7bde8692e3..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_fernbush_large_01_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cbf83c15715d9eeea8e876fde2064be864cfdfedc641e12991c23ff5ad4457c -size 64034 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_01_plain_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_01_plain_group.cgf deleted file mode 100644 index 6e72c205a9..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_01_plain_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b24a5f3063d0493122c63dc22e50c83b57c17da957a65a8c21755d2370edb07 -size 28422 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_02_plants_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_02_plants_group.cgf deleted file mode 100644 index cf8be94fbe..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_02_plants_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2bd7ca192218eb78cb776380e1a0eac68a0645c41d4f1106547d538ce031c69d -size 21684 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_03_seeds_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_03_seeds_group.cgf deleted file mode 100644 index eef3d5bf00..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_03_seeds_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64e3ec87a7560a48a95d97773b83ab7bc6b9fb5722bb0c267b934681e06685e6 -size 27600 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_flower_pink_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_flower_pink_group.cgf deleted file mode 100644 index a2ee54e335..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_flower_pink_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b40be4432945aeb1b65bfa1a653793fc4b4f1e0650e8ebdba299a0b064ddfdda -size 6296 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_flower_purple_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_flower_purple_group.cgf deleted file mode 100644 index 69911eb454..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_flower_purple_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75ae3ada964d36d5b7f5af221764c66b051579e5fd07c4e77852fe29e9450767 -size 6864 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_flower_red_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_flower_red_group.cgf deleted file mode 100644 index ea3e523697..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_flower_red_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e17bbad3a426336c666d355dad5fed4c432a3f3737bc531db22cd3a8115b3ba0 -size 6696 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_flower_white_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_flower_white_group.cgf deleted file mode 100644 index d74ce78327..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_flower_white_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e31927aedbea03862af50a02317df057f88af1c1d9ed93cdb68eeaba29c3054 -size 12636 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_flower_yellow_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_flower_yellow_group.cgf deleted file mode 100644 index 55f765c996..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_flower_yellow_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b8a9bc8902cc3d7d146a67c5e38e9c60121337dd3f91c7ebf52c8ec605651c66 -size 12636 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_long_matgroup.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_long_matgroup.mtl deleted file mode 100644 index 0634a3835d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_long_matgroup.mtl +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_tall_01_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_tall_01_group.cgf deleted file mode 100644 index 5568cf33dc..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_tall_01_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63648c616bbe1353711c670e636b92c8e5c98f002091e1748b5e87ab62b238da -size 14332 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_tall_02_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_tall_02_group.cgf deleted file mode 100644 index f1fcb383ab..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_tall_02_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d158c6c6bc531ee658befdc0971835089eb071e59b90e7227dfa18f255f1192 -size 33480 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_tuft_03_mat_matgroup_0.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_tuft_03_mat_matgroup_0.mtl deleted file mode 100644 index 88e3a700ee..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_tuft_03_mat_matgroup_0.mtl +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_tuft_04_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_tuft_04_group.cgf deleted file mode 100644 index d220b82dcb..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_tuft_04_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0520114675473f43c13690c76f0e37228a8d05549dd151b79b0b87e18b1d503 -size 26394 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_tuft_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_tuft_group.cgf deleted file mode 100644 index bb1e5077ba..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_grass_tuft_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2ccd3405bc0bf35db977637188367c70228719f5edcb9de0bce2726d2580b40 -size 29454 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_groundcover_01_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_groundcover_01_group.cgf deleted file mode 100644 index 65c5189a59..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_groundcover_01_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:922e8ebe048774c5fb8d4d66a3666588f8d671daeeb2933bf36b45615652f78f -size 52156 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_01_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_01_group.cgf deleted file mode 100644 index 1863e633ca..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_01_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19e9ad18c00c71897c371f9723380db9401e763b16cadf5d38e7a8bc5bdd624b -size 10668 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_02_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_02_group.cgf deleted file mode 100644 index 7027ac07fb..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_02_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3dd1d6d01e4c8e30d1c6b5226867d68e2dde418166317f193195eaa937f26dc -size 14052 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_03_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_03_group.cgf deleted file mode 100644 index 6cd110ff7d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_03_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99eabd8e5060b0023b3be1e1ca5dddb86fd65c4acace6c090ac461cba3d95762 -size 7124 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_04_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_04_group.cgf deleted file mode 100644 index e8086784d4..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_04_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85458f1f2fe5d2f977fc6ab7e3199aa635e74183dcc420498cb4ad710bf24cec -size 59254 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_bush_01_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_bush_01_group.cgf deleted file mode 100644 index 68f2d73738..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_bush_01_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44ad70bd59c3dc4ec5a3a8a8369d83d5ca3241afa7650b22852b931c874a9a1d -size 42322 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_long.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_long.cgf deleted file mode 100644 index 0243dc1f0b..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_ivy_long.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b88087f80a6a3deec0594bf09c201106676478f9bb4f478ab4895e29fb092497 -size 63368 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_lily_01.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_lily_01.cgf deleted file mode 100644 index 9cae8ac670..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_lily_01.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38155d7473531e264eefb3ba8891922c81bd339532eeb5902d1e221f7042624c -size 2552 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_lily_02.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_lily_02.cgf deleted file mode 100644 index 1e010f1dcb..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_lily_02.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6053bcb55c27dfc8bd891f56aa23d547554d72f6596bc4c93597f2e897b7c68 -size 2552 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_lily_03.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_lily_03.cgf deleted file mode 100644 index 235e4db7cb..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_lily_03.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2524413667bc35ba60f3027318913d9d9c679513def8e4b6992e444e51749a10 -size 2040 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_lily_flower.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_lily_flower.cgf deleted file mode 100644 index 6d51eea7db..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_lily_flower.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:407963fd76e158b83ef9293b91888ee1f0b4d814fe7f8736237390a98e6d3415 -size 2860 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_nettle_01_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_nettle_01_group.cgf deleted file mode 100644 index 9c2da6a7bb..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_nettle_01_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df849ae3b6ae8d6ee3a1d4fdacbae436153576189afe36cafe8653ffc21ec897 -size 126432 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_oak_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_oak_group.cgf deleted file mode 100644 index ca3f14dbaa..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_oak_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27606342bb753fa98656f1da1fb891d30d62a2760355e8815b97ec5e2c5c88f0 -size 490012 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_oak_mat.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_oak_mat.mtl deleted file mode 100644 index e738a17f12..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_oak_mat.mtl +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_oak_red.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_oak_red.cgf deleted file mode 100644 index 100b8c3bc0..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_oak_red.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad428b3b85ec11a4f83af84f4966bcb31befc004c98632cfd3691af029cc36c9 -size 285852 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_pine_01_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_pine_01_group.cgf deleted file mode 100644 index b682aa80c5..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_pine_01_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b8b7d5feb4a168137f91e03e483003409b2c2745ec7df1c4d0b1ea98df1d630 -size 407972 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_pine_02_mat.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_pine_02_mat.mtl deleted file mode 100644 index a97ae48112..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_pine_02_mat.mtl +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_pine_tall_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_pine_tall_group.cgf deleted file mode 100644 index ec8b9a1a47..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_pine_tall_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13bf62d79dad530ab99f3a12731b6cab4bbd76241b1be1c8c6df62cb75f87c22 -size 239428 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plains_cotton_tree_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plains_cotton_tree_group.cgf deleted file mode 100644 index 95fa1c5db7..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plains_cotton_tree_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec3fabb6fff04e811019da6b36295dfd6d5f32c3bee564b0f4ffc5c5a3e48e4d -size 643488 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_01.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_01.cgf deleted file mode 100644 index 4e225b2b50..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_01.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7288baa62e0bbdaa709c16d0b7e59d493f1c23a081b375311020dc5be2cb2253 -size 107736 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_diff.tif deleted file mode 100644 index b05d213f38..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2caec724b491f07e4e193ef314b078c8cbe0fb797781ccc153b3e4d33702415 -size 4205876 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_diff.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_diff.tif.exportsettings deleted file mode 100644 index 749595194d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_diff.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=AlbedoWithGenericAlpha /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_e.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_e.tif deleted file mode 100644 index 7c1cb35afb..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_e.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3176cda0bbb954a9996ac0bdd9f29b220de4c050df82b24a9085a46440b4b0e9 -size 793936 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_e.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_e.tif.exportsettings deleted file mode 100644 index d3713274e6..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_e.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Albedo /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_large.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_large.cgf deleted file mode 100644 index 90316c0b13..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_large.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c76b941ac0fb36fa2dda7401de545158b70b6537120e1d11691d6f3ca77c3238 -size 74972 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_large_diff.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_large_diff.tif deleted file mode 100644 index 6169e21d6d..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_large_diff.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2105ea09aebb8499eb0544e1b37e1c78879e7d379d4e77cd1b284527f1aff79e -size 12602676 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_sss.tif b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_sss.tif deleted file mode 100644 index a328e7d6d1..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_sss.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f0249428ad3b34485c5502406683a5a6ec26a7b828172bcfe333c0ccce79911 -size 4205908 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_sss.tif.exportsettings b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_sss.tif.exportsettings deleted file mode 100644 index 79d1c5dd92..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_plant_glow_sss.tif.exportsettings +++ /dev/null @@ -1 +0,0 @@ -/autooptimizefile=0 /M=50,50,0,50,50,50 /preset=Opacity /reduce=0 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_river_weed.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_river_weed.cgf deleted file mode 100644 index 3df2d6d813..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_river_weed.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7146617f34b35f22d47fa8809148032c9e46818fdb314eeaafa22ed9f5281a1f -size 23538 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_root_01_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_root_01_group.cgf deleted file mode 100644 index a462ee98cf..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_root_01_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0fc38445339f5509148a689635b430336fba6403995b95aea515d871bf1f2c55 -size 100012 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_tree_fallen_group.cgf b/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_tree_fallen_group.cgf deleted file mode 100644 index e1538ef3ea..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Natural/Vegetation/am_tree_fallen_group.cgf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e9657338ae434a201bea21b272345bef6bd6c4704231adde9decfba6942292f -size 134100 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Test/LOD_Test.fbx b/Gems/Vegetation_Gem_Assets/Assets/Objects/Test/LOD_Test.fbx deleted file mode 100644 index 80af698dca..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Test/LOD_Test.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bb9e74140f9de19ae9fd6bd37e29719099d331dfb4c3ea64c8947fcc756eec5 -size 180435 diff --git a/Gems/Vegetation_Gem_Assets/Assets/Objects/Test/LOD_Test.mtl b/Gems/Vegetation_Gem_Assets/Assets/Objects/Test/LOD_Test.mtl deleted file mode 100644 index 69dc897362..0000000000 --- a/Gems/Vegetation_Gem_Assets/Assets/Objects/Test/LOD_Test.mtl +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/Gems/Vegetation_Gem_Assets/CMakeLists.txt b/Gems/Vegetation_Gem_Assets/CMakeLists.txt deleted file mode 100644 index a410a242c7..0000000000 --- a/Gems/Vegetation_Gem_Assets/CMakeLists.txt +++ /dev/null @@ -1,15 +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. -# - -# This will export its "SourcePaths" to the generated "cmake_dependencies..assetbuilder.setreg" -if(PAL_TRAIT_BUILD_HOST_TOOLS) - ly_create_alias(NAME Vegetation_Gem_Assets.Builders NAMESPACE Gem) -endif() diff --git a/Gems/Vegetation_Gem_Assets/gem.json b/Gems/Vegetation_Gem_Assets/gem.json deleted file mode 100644 index 696dc04557..0000000000 --- a/Gems/Vegetation_Gem_Assets/gem.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "gem_name": "Vegetation_Gem_Assets", - "GemFormatVersion": 3, - "Uuid": "14c5dc793cd0449882dfde50ec2ffadf", - "Name": "Vegetation_Gem_Assets", - "DisplayName": "Vegetation_Gem_Assets", - "Version": "0.1.0", - "LinkType": "NoCode", - "Summary": "An Asset Gem full of Vegetation Models and other assets and samples useful to testing and development of the Vegetation Gem (mostly full of assets scabbed from StarterGame)", - "Tags": ["Asset"], - "IconPath": "preview.png" -} diff --git a/Gems/Vegetation_Gem_Assets/preview.png b/Gems/Vegetation_Gem_Assets/preview.png deleted file mode 100644 index 2f1ed47754..0000000000 --- a/Gems/Vegetation_Gem_Assets/preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d6204c6730e5675791765ca194e9b1cbec282208e280507de830afc2805e5fa -size 41127 diff --git a/Gems/WhiteBox/Code/Source/Rendering/Atom/WhiteBoxAtomRenderMesh.cpp b/Gems/WhiteBox/Code/Source/Rendering/Atom/WhiteBoxAtomRenderMesh.cpp index c0dc2c63b6..52557cb2e0 100644 --- a/Gems/WhiteBox/Code/Source/Rendering/Atom/WhiteBoxAtomRenderMesh.cpp +++ b/Gems/WhiteBox/Code/Source/Rendering/Atom/WhiteBoxAtomRenderMesh.cpp @@ -178,7 +178,7 @@ namespace WhiteBox } m_meshFeatureProcessor->ReleaseMesh(m_meshHandle); - m_meshHandle = m_meshFeatureProcessor->AcquireMesh(m_modelAsset); + m_meshHandle = m_meshFeatureProcessor->AcquireMesh(AZ::Render::MeshHandleDescriptor{ m_modelAsset }); return true; } diff --git a/Registry/Platform/Windows/streamer.editor.setreg b/Registry/Platform/Windows/streamer.editor.setreg index 0f7eb3e63d..42f3fc9b7f 100644 --- a/Registry/Platform/Windows/streamer.editor.setreg +++ b/Registry/Platform/Windows/streamer.editor.setreg @@ -13,33 +13,19 @@ [ { "$type": "AZ::IO::StorageDriveConfig", - // The maximum number of file handles that the drive will cache. "MaxFileHandles": 1024 }, { "$type": "AZ::IO::WindowsStorageDriveConfig", - // The maximum number of file handles that the drive will cache. "MaxFileHandles": 1024, - // The maximum number of files to keep the meta data such as the size around for. "MaxMetaDataCache": 1024, - // Number of requests the drive keeps after its queue is full. - // Overcommitting allows for requests to be immediately available after a request completes without needing - // any scheduling, but this also doesn't allow these requests to be rescheduled or updated. "Overcommit": 8, - // Allows files to be shared. This can be needed if the file needs to be opened in multiple locations, such - // as the editor and the Asset Processor. Turning this feature on comes at a small performance cost. "EnableFileSharing": true, - // Unbuffered reads bypass the OS file cache for faster file reads. This helps speed up initial file loads - // and is best for applications that only read a file once such as the game. For applications that frequently - // re-read files such as the editor it's better to turn this feature off. "EnableUnbufferedReads": false, - // If true, only information that's explicitly requested or issues are reported. If false, status information - // such as when drives are created and destroyed is reported as well. "MinimalReporting": false }, { "$type": "AzFramework::RemoteStorageDriveConfig", - // The maximum number of file handles that the drive will cache. "MaxFileHandles": 1024 } ] @@ -48,4 +34,4 @@ } } } -} \ No newline at end of file +} diff --git a/Registry/Platform/Windows/streamer.game.debug.setreg b/Registry/Platform/Windows/streamer.game.debug.setreg new file mode 100644 index 0000000000..9165829b1b --- /dev/null +++ b/Registry/Platform/Windows/streamer.game.debug.setreg @@ -0,0 +1,74 @@ +{ + "Amazon": + { + "AzCore": + { + "Streamer": + { + "Profiles": + { + "Generic": + { + "Stack": + [ + { + "$type": "AZ::IO::WindowsStorageDriveConfig", + "MaxFileHandles": 32, + "MaxMetaDataCache": 32, + "Overcommit": 8, + "EnableFileSharing": true, + "EnableUnbufferedReads": true, + "MinimalReporting": false + }, + { + "$type": "AZ::IO::ReadSplitterConfig", + "BufferSizeMib": 6, + "SplitSize": "MaxTransfer", + "AdjustOffset": true, + "SplitAlignedRequests": false + }, + { + "$type": "AzFramework::RemoteStorageDriveConfig", + "MaxFileHandles": 1024 + }, + { + "$type": "AZ::IO::BlockCacheConfig", + "CacheSizeMib": 10, + "BlockSize": "MaxTransfer" + }, + { + "$type": "AZ::IO::DedicatedCacheConfig", + "CacheSizeMib": 2, + "BlockSize": "MemoryAlignment", + "WriteOnlyEpilog": true + }, + { + "$type": "AZ::IO::FullFileDecompressorConfig", + "MaxNumReads": 2, + "MaxNumJobs": 2 + } + ] + }, + "DevMode": + { + "Stack": + [ + { + "$type": "AZ::IO::WindowsStorageDriveConfig", + "MaxFileHandles": 1024, + "MaxMetaDataCache": 1024, + "Overcommit": 8, + "EnableFileSharing": true, + "EnableUnbufferedReads": false + }, + { + "$type": "AzFramework::RemoteStorageDriveConfig", + "MaxFileHandles": 1024 + } + ] + } + } + } + } + } +} diff --git a/Registry/Platform/Windows/streamer.game.profile.setreg b/Registry/Platform/Windows/streamer.game.profile.setreg new file mode 100644 index 0000000000..9165829b1b --- /dev/null +++ b/Registry/Platform/Windows/streamer.game.profile.setreg @@ -0,0 +1,74 @@ +{ + "Amazon": + { + "AzCore": + { + "Streamer": + { + "Profiles": + { + "Generic": + { + "Stack": + [ + { + "$type": "AZ::IO::WindowsStorageDriveConfig", + "MaxFileHandles": 32, + "MaxMetaDataCache": 32, + "Overcommit": 8, + "EnableFileSharing": true, + "EnableUnbufferedReads": true, + "MinimalReporting": false + }, + { + "$type": "AZ::IO::ReadSplitterConfig", + "BufferSizeMib": 6, + "SplitSize": "MaxTransfer", + "AdjustOffset": true, + "SplitAlignedRequests": false + }, + { + "$type": "AzFramework::RemoteStorageDriveConfig", + "MaxFileHandles": 1024 + }, + { + "$type": "AZ::IO::BlockCacheConfig", + "CacheSizeMib": 10, + "BlockSize": "MaxTransfer" + }, + { + "$type": "AZ::IO::DedicatedCacheConfig", + "CacheSizeMib": 2, + "BlockSize": "MemoryAlignment", + "WriteOnlyEpilog": true + }, + { + "$type": "AZ::IO::FullFileDecompressorConfig", + "MaxNumReads": 2, + "MaxNumJobs": 2 + } + ] + }, + "DevMode": + { + "Stack": + [ + { + "$type": "AZ::IO::WindowsStorageDriveConfig", + "MaxFileHandles": 1024, + "MaxMetaDataCache": 1024, + "Overcommit": 8, + "EnableFileSharing": true, + "EnableUnbufferedReads": false + }, + { + "$type": "AzFramework::RemoteStorageDriveConfig", + "MaxFileHandles": 1024 + } + ] + } + } + } + } + } +} diff --git a/Registry/Platform/Windows/streamer.game.setreg b/Registry/Platform/Windows/streamer.game.setreg index 7788227fb5..29f85d1727 100644 --- a/Registry/Platform/Windows/streamer.game.setreg +++ b/Registry/Platform/Windows/streamer.game.setreg @@ -27,8 +27,7 @@ // will avoid saturating the IO controller which can be needed if the drive is used by other applications. "Overcommit": 8, // Globally enable file sharing. This allows files to used outside AZ::IO::Streamer, including other - // applications while in use by AZ::IO::Streamer. File sharing can negatively impact performance and is - // recommended for development only. + // applications while in use by AZ::IO::Streamer. "EnableFileSharing": false, // Use unbuffered reads for the fastest possible read speeds by bypassing the Windows file cache. This // results in a faster read the first time a file is read, but subsequent reads will possibly be slower as @@ -63,27 +62,9 @@ "MaxNumJobs": 2 } ] - }, - "DevMode": - { - "Stack": - [ - { - "$type": "AZ::IO::WindowsStorageDriveConfig", - "MaxFileHandles": 1024, - "MaxMetaDataCache": 1024, - "Overcommit": 8, - "EnableFileSharing": true, - "EnableUnbufferedReads": false - }, - { - "$type": "AzFramework::RemoteStorageDriveConfig", - "MaxFileHandles": 1024 - } - ] } } } } } -} \ No newline at end of file +} diff --git a/Registry/Platform/Windows/streamer.test.setreg b/Registry/Platform/Windows/streamer.test.setreg index 13e4fa2d57..c9a225a0b0 100644 --- a/Registry/Platform/Windows/streamer.test.setreg +++ b/Registry/Platform/Windows/streamer.test.setreg @@ -54,4 +54,4 @@ } } } -} \ No newline at end of file +} diff --git a/Registry/streamer.editor.setreg b/Registry/streamer.editor.setreg index 33eff0e5b6..7acc3f5486 100644 --- a/Registry/streamer.editor.setreg +++ b/Registry/streamer.editor.setreg @@ -27,4 +27,4 @@ } } } -} \ No newline at end of file +} diff --git a/Registry/streamer.game.debug.setreg b/Registry/streamer.game.debug.setreg new file mode 100644 index 0000000000..be1be3c073 --- /dev/null +++ b/Registry/streamer.game.debug.setreg @@ -0,0 +1,65 @@ +{ + "Amazon": + { + "AzCore": + { + "Streamer": + { + "Profiles": + { + "Generic": + { + "Stack": + [ + { + "$type": "AZ::IO::StorageDriveConfig", + "MaxFileHandles": 32 + }, + { + "$type": "AZ::IO::ReadSplitterConfig", + "BufferSizeMib": 6, + "SplitSize": "MaxTransfer", + "AdjustOffset": true, + "SplitAlignedRequests": false + }, + { + "$type": "AzFramework::RemoteStorageDriveConfig", + "MaxFileHandles": 1024 + }, + { + "$type": "AZ::IO::BlockCacheConfig", + "CacheSizeMib": 10, + "BlockSize": "MaxTransfer" + }, + { + "$type": "AZ::IO::DedicatedCacheConfig", + "CacheSizeMib": 2, + "BlockSize": "MemoryAlignment", + "WriteOnlyEpilog": true + }, + { + "$type": "AZ::IO::FullFileDecompressorConfig", + "MaxNumReads": 2, + "MaxNumJobs": 2 + } + ] + }, + "DevMode": + { + "Stack": + [ + { + "$type": "AZ::IO::StorageDriveConfig", + "MaxFileHandles": 1024 + }, + { + "$type": "AzFramework::RemoteStorageDriveConfig", + "MaxFileHandles": 1024 + } + ] + } + } + } + } + } +} diff --git a/Registry/streamer.game.profile.setreg b/Registry/streamer.game.profile.setreg new file mode 100644 index 0000000000..be1be3c073 --- /dev/null +++ b/Registry/streamer.game.profile.setreg @@ -0,0 +1,65 @@ +{ + "Amazon": + { + "AzCore": + { + "Streamer": + { + "Profiles": + { + "Generic": + { + "Stack": + [ + { + "$type": "AZ::IO::StorageDriveConfig", + "MaxFileHandles": 32 + }, + { + "$type": "AZ::IO::ReadSplitterConfig", + "BufferSizeMib": 6, + "SplitSize": "MaxTransfer", + "AdjustOffset": true, + "SplitAlignedRequests": false + }, + { + "$type": "AzFramework::RemoteStorageDriveConfig", + "MaxFileHandles": 1024 + }, + { + "$type": "AZ::IO::BlockCacheConfig", + "CacheSizeMib": 10, + "BlockSize": "MaxTransfer" + }, + { + "$type": "AZ::IO::DedicatedCacheConfig", + "CacheSizeMib": 2, + "BlockSize": "MemoryAlignment", + "WriteOnlyEpilog": true + }, + { + "$type": "AZ::IO::FullFileDecompressorConfig", + "MaxNumReads": 2, + "MaxNumJobs": 2 + } + ] + }, + "DevMode": + { + "Stack": + [ + { + "$type": "AZ::IO::StorageDriveConfig", + "MaxFileHandles": 1024 + }, + { + "$type": "AzFramework::RemoteStorageDriveConfig", + "MaxFileHandles": 1024 + } + ] + } + } + } + } + } +} diff --git a/Registry/streamer.game.setreg b/Registry/streamer.game.setreg index 972fb80fb2..69f3189d46 100644 --- a/Registry/streamer.game.setreg +++ b/Registry/streamer.game.setreg @@ -57,23 +57,9 @@ "MaxNumJobs": 2 } ] - }, - "DevMode": - { - "Stack": - [ - { - "$type": "AZ::IO::StorageDriveConfig", - "MaxFileHandles": 1024 - }, - { - "$type": "AzFramework::RemoteStorageDriveConfig", - "MaxFileHandles": 1024 - } - ] } } } } } -} \ No newline at end of file +} diff --git a/Registry/streamer.setreg b/Registry/streamer.setreg index 79e80bbf5c..48177628c2 100644 --- a/Registry/streamer.setreg +++ b/Registry/streamer.setreg @@ -26,4 +26,4 @@ } } } -} \ No newline at end of file +} diff --git a/Registry/streamer.test.setreg b/Registry/streamer.test.setreg index 21504f659a..0adb01fca8 100644 --- a/Registry/streamer.test.setreg +++ b/Registry/streamer.test.setreg @@ -45,4 +45,4 @@ } } } -} \ No newline at end of file +} diff --git a/cmake/Packaging.cmake b/cmake/Packaging.cmake index 7e45fa6bba..a341cb5f1a 100644 --- a/cmake/Packaging.cmake +++ b/cmake/Packaging.cmake @@ -14,11 +14,29 @@ if(NOT PAL_TRAIT_BUILD_CPACK_SUPPORTED) endif() # public facing options will be used for conversion into cpack specific ones below. -set(LY_INSTALLER_DOWNLOAD_URL "" CACHE STRING "URL embedded into the installer to download additional artifacts") set(LY_INSTALLER_LICENSE_URL "" CACHE STRING "Optionally embed a link to the license instead of raw text") + +set(LY_INSTALLER_AUTO_GEN_TAG OFF CACHE BOOL +"Automatically generate a build tag based on the git repo and append it to the download/upload URLs. \ +Format: /-" +) + +set(LY_INSTALLER_DOWNLOAD_URL "" CACHE STRING +"Base URL embedded into the installer to download additional artifacts, the host target and version \ +number will automatically appended as '/'. If LY_INSTALLER_AUTO_GEN_TAG is set, the \ +full URL format will be: //" +) + set(LY_INSTALLER_UPLOAD_URL "" CACHE STRING - "URL used to automatically upload the artifacts. Can also be set via LY_INSTALLER_UPLOAD_URL environment variable. Currently only accepts S3 URLs e.g. s3:///") -set(LY_INSTALLER_AWS_PROFILE "" CACHE STRING "AWS CLI profile for uploading artifacts. Can also be set via LY_INSTALLER_AWS_PROFILE environment variable.") +"Base URL used to upload the installer artifacts after generation, the host target and version number \ +will automatically appended as '/'. If LY_INSTALLER_AUTO_GEN_TAG is set, the full URL \ +format will be: //. Can also be set via LY_INSTALLER_UPLOAD_URL environment \ +variable. Currently only accepts S3 URLs e.g. s3:///" +) + +set(LY_INSTALLER_AWS_PROFILE "" CACHE STRING +"AWS CLI profile for uploading artifacts. Can also be set via LY_INSTALLER_AWS_PROFILE environment variable." +) set(CPACK_DESIRED_CMAKE_VERSION 3.20.2) @@ -32,8 +50,7 @@ set(CPACK_PACKAGE_VENDOR "O3DE Binary Project a Series of LF Projects, LLC") set(CPACK_PACKAGE_VERSION "${LY_VERSION_STRING}") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Installation Tool") -string(TOLOWER ${PROJECT_NAME} _project_name_lower) -set(CPACK_PACKAGE_FILE_NAME "${_project_name_lower}_${LY_VERSION_STRING}_installer") +string(TOLOWER "${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}" CPACK_PACKAGE_FILE_NAME) set(DEFAULT_LICENSE_NAME "Apache-2.0") set(DEFAULT_LICENSE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt") @@ -47,6 +64,10 @@ set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_NAME}/${CPACK_PACKAGE_VERSI set(CPACK_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cmake) set(CPACK_BINARY_DIR ${CMAKE_BINARY_DIR}/_CPack) # to match other CPack out dirs +# this config file allows the dynamic setting of cpack variables at cpack-time instead of cmake configure +set(CPACK_PROJECT_CONFIG_FILE ${CPACK_SOURCE_DIR}/PackagingConfig.cmake) +set(CPACK_AUTO_GEN_TAG ${LY_INSTALLER_AUTO_GEN_TAG}) + # attempt to apply platform specific settings ly_get_absolute_pal_filename(pal_dir ${CPACK_SOURCE_DIR}/Platform/${PAL_HOST_PLATFORM_NAME}) include(${pal_dir}/Packaging_${PAL_HOST_PLATFORM_NAME_LOWERCASE}.cmake) @@ -121,8 +142,6 @@ function(strip_trailing_slash in_url out_url) endif() endfunction() -set(_versioned_target_url_tag ${LY_VERSION_STRING}/${PAL_HOST_PLATFORM_NAME}) - if(NOT LY_INSTALLER_UPLOAD_URL AND DEFINED ENV{LY_INSTALLER_UPLOAD_URL}) set(LY_INSTALLER_UPLOAD_URL $ENV{LY_INSTALLER_UPLOAD_URL}) endif() @@ -137,14 +156,10 @@ if(LY_INSTALLER_UPLOAD_URL) set(CPACK_AWS_PROFILE ${LY_INSTALLER_AWS_PROFILE}) elseif (DEFINED ENV{LY_INSTALLER_AWS_PROFILE}) set(CPACK_AWS_PROFILE $ENV{LY_INSTALLER_AWS_PROFILE}) - else() - message(FATAL_ERROR - "An AWS profile is required for installer S3 uploading. Please provide " - "one via LY_INSTALLER_AWS_PROFILE CLI argument or environment variable") endif() strip_trailing_slash(${LY_INSTALLER_UPLOAD_URL} LY_INSTALLER_UPLOAD_URL) - set(CPACK_UPLOAD_URL ${LY_INSTALLER_UPLOAD_URL}/${_versioned_target_url_tag}) + set(CPACK_UPLOAD_URL ${LY_INSTALLER_UPLOAD_URL}) endif() # IMPORTANT: required to be included AFTER setting all property overrides @@ -194,7 +209,7 @@ if(LY_INSTALLER_DOWNLOAD_URL) # this will set the following variables: CPACK_DOWNLOAD_SITE, CPACK_DOWNLOAD_ALL, and CPACK_UPLOAD_DIRECTORY (local) cpack_configure_downloads( - ${LY_INSTALLER_DOWNLOAD_URL}/${_versioned_target_url_tag} + ${LY_INSTALLER_DOWNLOAD_URL} UPLOAD_DIRECTORY ${CMAKE_BINARY_DIR}/_CPack_Uploads # to match the _CPack_Packages directory ALL ) diff --git a/cmake/PackagingConfig.cmake b/cmake/PackagingConfig.cmake new file mode 100644 index 0000000000..b340219ff8 --- /dev/null +++ b/cmake/PackagingConfig.cmake @@ -0,0 +1,52 @@ +# +# 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. +# + +set(_target_name ${CMAKE_HOST_SYSTEM_NAME}) +if(${_target_name} STREQUAL Darwin) + set(_target_name Mac) +endif() + +if(CPACK_AUTO_GEN_TAG) + set(_python_script python.sh) + if(${_target_name} STREQUAL Windows) + set(_python_script python.cmd) + endif() + + file(REAL_PATH "${CPACK_SOURCE_DIR}/.." _root_path) + file(TO_NATIVE_PATH "${_root_path}/python/${_python_script}" _python_cmd) + file(TO_NATIVE_PATH "${_root_path}/scripts/build/tools/generate_build_tag.py" _gen_tag_script) + + execute_process( + COMMAND ${_python_cmd} -s -u ${_gen_tag_script} + RESULT_VARIABLE _gen_tag_result + OUTPUT_VARIABLE _gen_tag_output + ERROR_VARIABLE _gen_tag_errors + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + + if (NOT ${_gen_tag_result} EQUAL 0) + message(FATAL_ERROR "Failed to generate build tag! Errors: ${_gen_tag_errors}") + endif() + + set(_url_tag ${_gen_tag_output}) +else() + set(_url_tag ${CPACK_PACKAGE_VERSION}) +endif() + +set(_full_tag ${_url_tag}/${_target_name}) + +if(CPACK_DOWNLOAD_SITE) + set(CPACK_DOWNLOAD_SITE ${CPACK_DOWNLOAD_SITE}/${_full_tag}) +endif() +if(CPACK_UPLOAD_URL) + set(CPACK_UPLOAD_URL ${CPACK_UPLOAD_URL}/${_full_tag}) +endif() diff --git a/cmake/Platform/Windows/Packaging/Bootstrapper.wxs b/cmake/Platform/Windows/Packaging/Bootstrapper.wxs index c7146b1b7f..cb9d86ede8 100644 --- a/cmake/Platform/Windows/Packaging/Bootstrapper.wxs +++ b/cmake/Platform/Windows/Packaging/Bootstrapper.wxs @@ -17,6 +17,10 @@ Value="[ProgramFiles64Folder]$(var.CPACK_PACKAGE_INSTALL_DIRECTORY)" bal:Overridable="yes"/> + + + + + + @@ -34,6 +40,8 @@ ThemeFile="$(var.CPACK_BOOTSTRAP_THEME_FILE).xml" LocalizationFile="$(var.CPACK_BOOTSTRAP_THEME_FILE).wxl" ShowVersion="yes" /> + + diff --git a/cmake/Platform/Windows/Packaging/BootstrapperTheme.xml.in b/cmake/Platform/Windows/Packaging/BootstrapperTheme.xml.in index f9a177b646..93984d06b8 100644 --- a/cmake/Platform/Windows/Packaging/BootstrapperTheme.xml.in +++ b/cmake/Platform/Windows/Packaging/BootstrapperTheme.xml.in @@ -76,7 +76,7 @@ - + #(loc.FailureHeader) #(loc.FailureInstallHeader) #(loc.FailureUninstallHeader) diff --git a/cmake/Platform/Windows/PackagingPostBuild.cmake b/cmake/Platform/Windows/PackagingPostBuild.cmake index 1dcbedcba7..83dff8354e 100644 --- a/cmake/Platform/Windows/PackagingPostBuild.cmake +++ b/cmake/Platform/Windows/PackagingPostBuild.cmake @@ -17,7 +17,7 @@ string(REPLACE "/" "\\" _fixed_package_install_dir ${CPACK_PACKAGE_INSTALL_DIREC set(_cpack_wix_out_dir ${CPACK_TOPLEVEL_DIRECTORY}) set(_bootstrap_out_dir "${CPACK_TOPLEVEL_DIRECTORY}/bootstrap") -set(_bootstrap_filename "${CPACK_PACKAGE_FILE_NAME}.exe") +set(_bootstrap_filename "${CPACK_PACKAGE_FILE_NAME}_installer.exe") set(_bootstrap_output_file ${_cpack_wix_out_dir}/${_bootstrap_filename}) set(_ext_flags @@ -32,6 +32,7 @@ set(_addtional_defines -dCPACK_PACKAGE_FILE_NAME=${CPACK_PACKAGE_FILE_NAME} -dCPACK_PACKAGE_INSTALL_DIRECTORY=${_fixed_package_install_dir} -dCPACK_WIX_PRODUCT_LOGO=${CPACK_WIX_PRODUCT_LOGO} + -dCPACK_RESOURCE_PATH=${CPACK_SOURCE_DIR}/Platform/Windows/Packaging ) if(CPACK_LICENSE_URL) @@ -124,15 +125,21 @@ set(_upload_command --file_regex="${_file_regex}" --bucket ${_bucket} --key_prefix ${_prefix} - --profile ${CPACK_AWS_PROFILE} ) +if(CPACK_AWS_PROFILE) + list(APPEND _upload_command --profile ${CPACK_AWS_PROFILE}) +endif() + +message(STATUS "Uploading artifacts to ${CPACK_UPLOAD_URL}") execute_process( COMMAND ${_upload_command} RESULT_VARIABLE _upload_result ERROR_VARIABLE _upload_errors ) -if (NOT ${_upload_result} EQUAL 0) +if (${_upload_result} EQUAL 0) + message(STATUS "Artifact uploading complete!") +else() message(FATAL_ERROR "An error occurred uploading artifacts. ${_upload_errors}") endif() diff --git a/cmake/Platform/Windows/Packaging_windows.cmake b/cmake/Platform/Windows/Packaging_windows.cmake index 6dc806ff56..95c00a3d0f 100644 --- a/cmake/Platform/Windows/Packaging_windows.cmake +++ b/cmake/Platform/Windows/Packaging_windows.cmake @@ -26,6 +26,12 @@ set(_cmake_package_name "cmake-${CPACK_DESIRED_CMAKE_VERSION}-windows-x86_64") set(CPACK_CMAKE_PACKAGE_FILE "${_cmake_package_name}.zip") set(CPACK_CMAKE_PACKAGE_HASH "15a49e2ab81c1822d75b1b1a92f7863f58e31f6d6aac1c4103eef2b071be3112") +# workaround for shortening the path cpack installs to by stripping the platform directory and forcing monolithic +# mode to strip out component folders. this unfortunately is the closest we can get to changing the install location +# as CPACK_PACKAGING_INSTALL_PREFIX/CPACK_SET_DESTDIR isn't supported for the WiX generator +set(CPACK_TOPLEVEL_TAG "") +set(CPACK_MONOLITHIC_INSTALL ON) + # CPack will generate the WiX product/upgrade GUIDs further down the chain if they weren't supplied # however, they are unique for each run. instead, let's do the auto generation here and add it to # the cache for run persistence and have the ability to detect if they are still being used. diff --git a/cmake/Tools/Platform/Android/android_support.py b/cmake/Tools/Platform/Android/android_support.py index 75e0cd2970..d4aff062ee 100755 --- a/cmake/Tools/Platform/Android/android_support.py +++ b/cmake/Tools/Platform/Android/android_support.py @@ -331,7 +331,7 @@ android_gradle_plugin={android_gradle_plugin_version} NATIVE_CMAKE_SECTION_ANDROID_FORMAT = """ externalNativeBuild {{ cmake {{ - buildStagingDirectory "." + buildStagingDirectory "{native_build_path}" version "{cmake_version}" path "{absolute_cmakelist_path}" }} @@ -447,8 +447,8 @@ class AndroidProjectGenerator(object): def __init__(self, engine_root, build_dir, android_sdk_path, build_tool, android_sdk_platform, android_native_api_level, android_ndk, project_path, third_party_path, cmake_version, override_cmake_path, override_gradle_path, gradle_version, gradle_plugin_version, - override_ninja_path, include_assets_in_apk, asset_mode, asset_type, signing_config, is_test_project=False, - overwrite_existing=True): + override_ninja_path, include_assets_in_apk, asset_mode, asset_type, signing_config, native_build_path, is_test_project=False, + overwrite_existing=True, unity_build_enabled=False): """ Initialize the object with all the required parameters needed to create an Android Project. The parameters should be verified before initializing this object @@ -509,6 +509,8 @@ class AndroidProjectGenerator(object): self.include_assets_in_apk = include_assets_in_apk + self.native_build_path = native_build_path + self.asset_mode = asset_mode self.asset_type = asset_type @@ -519,6 +521,8 @@ class AndroidProjectGenerator(object): self.overwrite_existing = overwrite_existing + self.unity_build_enabled = unity_build_enabled + def execute(self): """ Execute the android project creation workflow @@ -756,6 +760,9 @@ class AndroidProjectGenerator(object): template_engine_root = common.normalize_path_for_settings(self.engine_root) template_third_party_path = common.normalize_path_for_settings(self.third_party_path) template_ndk_path = common.normalize_path_for_settings(os.path.join(self.android_sdk_path, self.android_ndk.location)) + template_unity_build = 1 if self.unity_build_enabled else 0 + + native_build_path = pathlib.Path(self.native_build_path).resolve().as_posix() if self.native_build_path else '.' gradle_build_env = dict() @@ -766,7 +773,7 @@ class AndroidProjectGenerator(object): gradle_build_env['TARGET_TYPE'] = 'application' gradle_build_env['PROJECT_DEPENDENCIES'] = PROJECT_DEPENDENCIES_VALUE_FORMAT.format(dependencies='\n'.join(gradle_project_dependencies)) - gradle_build_env['NATIVE_CMAKE_SECTION_ANDROID'] = NATIVE_CMAKE_SECTION_ANDROID_FORMAT.format(cmake_version=str(self.cmake_version), absolute_cmakelist_path=absolute_cmakelist_path) + gradle_build_env['NATIVE_CMAKE_SECTION_ANDROID'] = NATIVE_CMAKE_SECTION_ANDROID_FORMAT.format(cmake_version=str(self.cmake_version), native_build_path=native_build_path, absolute_cmakelist_path=absolute_cmakelist_path) gradle_build_env['NATIVE_CMAKE_SECTION_DEFAULT_CONFIG'] = NATIVE_CMAKE_SECTION_DEFAULT_CONFIG_NDK_FORMAT_STR.format(abi=ANDROID_ARCH) gradle_build_env['OVERRIDE_JAVA_SOURCESET'] = OVERRIDE_JAVA_SOURCESET_STR.format(absolute_azandroid_path=absolute_azandroid_path) @@ -784,7 +791,8 @@ class AndroidProjectGenerator(object): f'"-S{template_engine_root}"', f'"-DCMAKE_BUILD_TYPE={native_config_lower}"', f'"-DCMAKE_TOOLCHAIN_FILE={template_engine_root}/cmake/Platform/Android/Toolchain_Android.cmake"', - f'"-DLY_3RDPARTY_PATH={template_third_party_path}"'] + f'"-DLY_3RDPARTY_PATH={template_third_party_path}"', + f'"-DLY_UNITY_BUILD={template_unity_build}"'] if not self.is_test_project: cmake_argument_list.append(f'"-DLY_PROJECTS={pathlib.PurePath(self.project_path).as_posix()}"') diff --git a/cmake/Tools/Platform/Android/generate_android_project.py b/cmake/Tools/Platform/Android/generate_android_project.py index 5a52ac385e..8e6adc0ecc 100755 --- a/cmake/Tools/Platform/Android/generate_android_project.py +++ b/cmake/Tools/Platform/Android/generate_android_project.py @@ -215,6 +215,11 @@ def main(args): default=None, required=False) + parser.add_argument('--native-build-path', + help='Custom path to place native build artifacts.', + default=None, + required=False) + # Asset Options parser.add_argument(INCLUDE_APK_ASSETS_ARGUMENT_NAME, action='store_true', @@ -258,6 +263,10 @@ def main(args): action='store_true', help='Option to overwrite existing scripts in the target build folder if they exist already.') + parser.add_argument('--enable-unity-build', + action='store_true', + help='Enable unity build') + parsed_args = parser.parse_args(args) wrap_parsed_args(parsed_args) @@ -395,7 +404,9 @@ def main(args): asset_type=parsed_args.get_argument(ASSET_TYPE_ARGUMENT_NAME), signing_config=signing_config, is_test_project=is_test_project, - overwrite_existing=parsed_args.overwrite_existing) + overwrite_existing=parsed_args.overwrite_existing, + unity_build_enabled=parsed_args.enable_unity_build, + native_build_path=parsed_args.native_build_path) generator.execute() diff --git a/engine.json b/engine.json index 8449e763a9..54dd8a841e 100644 --- a/engine.json +++ b/engine.json @@ -82,7 +82,6 @@ "Gems/Twitch", "Gems/UiBasics", "Gems/Vegetation", - "Gems/Vegetation_Gem_Assets", "Gems/VideoPlaybackFramework", "Gems/VirtualGamepad", "Gems/WhiteBox" diff --git a/scripts/build/Jenkins/Jenkinsfile b/scripts/build/Jenkins/Jenkinsfile index 693cf31727..7bb26fdf8c 100644 --- a/scripts/build/Jenkins/Jenkinsfile +++ b/scripts/build/Jenkins/Jenkinsfile @@ -256,6 +256,15 @@ def CheckoutRepo(boolean disableSubmodules = false) { env.CHANGE_ID = readFile file: 'commitid' env.CHANGE_ID = env.CHANGE_ID.trim() palRm('commitid') + + // CHANGE_DATE is used by the installer to provide some ability to sort tagged builds in addition to BRANCH_NAME and CHANGE_ID + commitDateFmt = '%%cI' + if (env.IS_UNIX) commitDateFmt = '%cI' + + palSh("git show -s --format=${commitDateFmt} ${env.CHANGE_ID} > commitdate", 'Getting commit date') + env.CHANGE_DATE = readFile file: 'commitdate' + env.CHANGE_DATE = env.CHANGE_DATE.trim() + palRm('commitdate') } def PreBuildCommonSteps(Map pipelineConfig, String repositoryName, String projectName, String pipeline, String branchName, String platform, String buildType, String workspace, boolean mount = true, boolean disableSubmodules = false) { diff --git a/scripts/build/Platform/Android/gradle_windows.cmd b/scripts/build/Platform/Android/gradle_windows.cmd index dd5285bdbf..4a91426094 100644 --- a/scripts/build/Platform/Android/gradle_windows.cmd +++ b/scripts/build/Platform/Android/gradle_windows.cmd @@ -135,11 +135,11 @@ IF "%GENERATE_SIGNED_APK%"=="true" ( ECHO Using keystore file at %CI_ANDROID_KEYSTORE_FILE_ABS% ) - ECHO [ci_build] %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --engine-root=. --build-dir=%OUTPUT_DIRECTORY% -g %GAME_PROJECT% --gradle-install-path=%GRADLE_BUILD_HOME% --ninja-install-path=%LY_NINJA_PATH% --third-party-path=%LY_3RDPARTY_PATH% --android-sdk-path=%ANDROID_HOME% %ANDROID_GRADLE_PLUGIN_OPTION% --signconfig-store-file %CI_ANDROID_KEYSTORE_FILE_ABS% --signconfig-store-password %CI_ANDROID_KEYSTORE_PASSWORD% --signconfig-key-alias %CI_ANDROID_KEYSTORE_ALIAS% --signconfig-key-password %CI_ANDROID_KEYSTORE_PASSWORD% %ADDITIONAL_GENERATE_ARGS% --overwrite-existing - CALL %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --engine-root=. --build-dir=%OUTPUT_DIRECTORY% -g %GAME_PROJECT% --gradle-install-path=%GRADLE_BUILD_HOME% --ninja-install-path=%LY_NINJA_PATH% --third-party-path=%LY_3RDPARTY_PATH% --android-sdk-path=%ANDROID_HOME% %ANDROID_GRADLE_PLUGIN_OPTION% --signconfig-store-file %CI_ANDROID_KEYSTORE_FILE_ABS% --signconfig-store-password %CI_ANDROID_KEYSTORE_PASSWORD% --signconfig-key-alias %CI_ANDROID_KEYSTORE_ALIAS% --signconfig-key-password %CI_ANDROID_KEYSTORE_PASSWORD% %ADDITIONAL_GENERATE_ARGS% --overwrite-existing + ECHO [ci_build] %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --engine-root=. --build-dir=%OUTPUT_DIRECTORY% -g %GAME_PROJECT% --gradle-install-path=%GRADLE_BUILD_HOME% --ninja-install-path=%LY_NINJA_PATH% --third-party-path=%LY_3RDPARTY_PATH% --enable-unity-build --android-sdk-path=%ANDROID_HOME% %ANDROID_GRADLE_PLUGIN_OPTION% --signconfig-store-file %CI_ANDROID_KEYSTORE_FILE_ABS% --signconfig-store-password %CI_ANDROID_KEYSTORE_PASSWORD% --signconfig-key-alias %CI_ANDROID_KEYSTORE_ALIAS% --signconfig-key-password %CI_ANDROID_KEYSTORE_PASSWORD% %ADDITIONAL_GENERATE_ARGS% --overwrite-existing + CALL %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --engine-root=. --build-dir=%OUTPUT_DIRECTORY% -g %GAME_PROJECT% --gradle-install-path=%GRADLE_BUILD_HOME% --ninja-install-path=%LY_NINJA_PATH% --third-party-path=%LY_3RDPARTY_PATH% --enable-unity-build --android-sdk-path=%ANDROID_HOME% %ANDROID_GRADLE_PLUGIN_OPTION% --signconfig-store-file %CI_ANDROID_KEYSTORE_FILE_ABS% --signconfig-store-password %CI_ANDROID_KEYSTORE_PASSWORD% --signconfig-key-alias %CI_ANDROID_KEYSTORE_ALIAS% --signconfig-key-password %CI_ANDROID_KEYSTORE_PASSWORD% %ADDITIONAL_GENERATE_ARGS% --overwrite-existing ) ELSE ( - ECHO [ci_build] %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --engine-root=. --build-dir=%OUTPUT_DIRECTORY% -g %GAME_PROJECT% %GRADLE_OVERRIDE_OPTION% --ninja-install-path=%LY_NINJA_PATH% --third-party-path=%LY_3RDPARTY_PATH% %ANDROID_GRADLE_PLUGIN_OPTION% --android-sdk-path=%ANDROID_HOME% %ADDITIONAL_GENERATE_ARGS% --overwrite-existing - CALL %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --engine-root=. --build-dir=%OUTPUT_DIRECTORY% -g %GAME_PROJECT% --gradle-install-path=%GRADLE_BUILD_HOME% --ninja-install-path=%LY_NINJA_PATH% --third-party-path=%LY_3RDPARTY_PATH% %ANDROID_GRADLE_PLUGIN_OPTION% --android-sdk-path=%ANDROID_HOME% %ADDITIONAL_GENERATE_ARGS% --overwrite-existing + ECHO [ci_build] %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --engine-root=. --build-dir=%OUTPUT_DIRECTORY% -g %GAME_PROJECT% %GRADLE_OVERRIDE_OPTION% --ninja-install-path=%LY_NINJA_PATH% --third-party-path=%LY_3RDPARTY_PATH% --enable-unity-build %ANDROID_GRADLE_PLUGIN_OPTION% --android-sdk-path=%ANDROID_HOME% %ADDITIONAL_GENERATE_ARGS% --overwrite-existing + CALL %PYTHON% cmake\Tools\Platform\Android\generate_android_project.py --engine-root=. --build-dir=%OUTPUT_DIRECTORY% -g %GAME_PROJECT% --gradle-install-path=%GRADLE_BUILD_HOME% --ninja-install-path=%LY_NINJA_PATH% --third-party-path=%LY_3RDPARTY_PATH% --enable-unity-build %ANDROID_GRADLE_PLUGIN_OPTION% --android-sdk-path=%ANDROID_HOME% %ADDITIONAL_GENERATE_ARGS% --overwrite-existing ) REM Validate the android project generation diff --git a/scripts/build/Platform/Windows/build_config.json b/scripts/build/Platform/Windows/build_config.json index 552ef2c6fd..45cea2b5d8 100644 --- a/scripts/build/Platform/Windows/build_config.json +++ b/scripts/build/Platform/Windows/build_config.json @@ -308,13 +308,15 @@ }, "windows_installer": { "TAGS": [ - "package" + "nightly-clean" ], "COMMAND": "build_installer_windows.cmd", "PARAMETERS": { "CONFIGURATION": "profile", "OUTPUT_DIRECTORY": "build\\windows_vs2019", - "CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DLY_DISABLE_TEST_MODULES=TRUE -DCPACK_WIX_ROOT=\"!WIX!\"", + "CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE -DLY_DISABLE_TEST_MODULES=TRUE -DCPACK_WIX_ROOT=\"!WIX! \"", + "EXTRA_CMAKE_OPTIONS": "-DLY_INSTALLER_AUTO_GEN_TAG=ON -DLY_INSTALLER_DOWNLOAD_URL=https://dkb1uj4hs9ikv.cloudfront.net -DLY_INSTALLER_LICENSE_URL=https://example.com", + "CPACK_BUCKET": "spectra-prism-staging-us-west-2", "CMAKE_LY_PROJECTS": "", "CMAKE_TARGET": "ALL_BUILD", "CMAKE_NATIVE_BUILD_ARGS": "/m /nologo" diff --git a/scripts/build/Platform/Windows/installer_windows.cmd b/scripts/build/Platform/Windows/installer_windows.cmd index a6ce15d59e..f7d4394dc8 100644 --- a/scripts/build/Platform/Windows/installer_windows.cmd +++ b/scripts/build/Platform/Windows/installer_windows.cmd @@ -21,7 +21,7 @@ IF NOT EXIST %OUTPUT_DIRECTORY% ( PUSHD %OUTPUT_DIRECTORY% REM Override the temporary directory used by wix to the workspace -SET "WIX_TEMP=!WORKSPACE!/temp/wix" +SET "WIX_TEMP=!WORKSPACE_TMP!/wix" IF NOT EXIST "%WIX_TEMP%" ( MKDIR "%WIX_TEMP%" ) @@ -50,9 +50,19 @@ IF ERRORLEVEL 1 ( GOTO :popd_error ) -ECHO [ci_build] "!CPACK_PATH!" -C %CONFIGURATION% -"!CPACK_PATH!" -C %CONFIGURATION% -IF NOT %ERRORLEVEL%==0 GOTO :popd_error +IF NOT "%CPACK_BUCKET%"=="" ( + SET "CPACK_OPTIONS=-D CPACK_UPLOAD_URL=s3://%CPACK_BUCKET% %CPACK_OPTIONS%" +) + +ECHO [ci_build] "!CPACK_PATH!" -C %CONFIGURATION% %CPACK_OPTIONS% +"!CPACK_PATH!" -C %CONFIGURATION% %CPACK_OPTIONS% +IF NOT %ERRORLEVEL%==0 ( + REM dump the log file generated by cpack specifically for WIX + ECHO **************************************************************** + TYPE "_CPack_Packages\\WIX\\wix.log" + ECHO **************************************************************** + GOTO :popd_error +) POPD EXIT /b 0 diff --git a/scripts/build/tools/generate_build_tag.py b/scripts/build/tools/generate_build_tag.py new file mode 100644 index 0000000000..b37e180ea6 --- /dev/null +++ b/scripts/build/tools/generate_build_tag.py @@ -0,0 +1,73 @@ +# +# 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 os +import pathlib +import shutil +import subprocess +import sys + + +def run_git_command(args, repo_root): + + process = subprocess.run(['git', *args], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + cwd=repo_root, + env=os.environ.copy(), + universal_newlines=True, + ) + + if process.returncode != 0: + print( + f'An error occurred while running a command\n' + f'Command: git {subprocess.list2cmdline(args)}\n' + f'Return Code: {process.returncode}\n' + f'Error: {process.stderr}', + file=sys.stderr + ) + exit(1) + + output = process.stdout.splitlines() + if not output: + print(f'No output received for command: git {subprocess.list2cmdline(args)}.') + output + + return output[0].strip('"') + + +if __name__ == "__main__": + ''' + Generates a build ID based on the state of the git repository. Will first attempt to use + existing environment variable (e.g. BRANCH_NAME, CHANGE_ID, CHANGE_DATE) before falling + back to running git commands directly + ''' + repo_root = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', '..')) + + branch = os.environ.get('BRANCH_NAME') + if not branch: + branch = run_git_command(['rev-parse', '--abbrev-ref', 'HEAD'], repo_root) + branch = branch.replace('/', '-') + + commit_hash = os.environ.get('CHANGE_ID') + if not commit_hash: + commit_hash = run_git_command(['rev-parse', 'HEAD'], repo_root) + commit_hash = commit_hash[0:9] + + # include the commit date to allow some sensible way of sorting + commit_date = os.environ.get('CHANGE_DATE') + if not commit_date: + commit_date = run_git_command(['show', '-s', '--format=%cI', commit_hash], repo_root) + commit_date = commit_date[0:10] + + print(f'{branch}/{commit_date}-{commit_hash}') + exit(0)