diff --git a/Code/Tools/AssetProcessor/native/InternalBuilders/SettingsRegistryBuilder.cpp b/Code/Tools/AssetProcessor/native/InternalBuilders/SettingsRegistryBuilder.cpp index f574206637..f808850ad7 100644 --- a/Code/Tools/AssetProcessor/native/InternalBuilders/SettingsRegistryBuilder.cpp +++ b/Code/Tools/AssetProcessor/native/InternalBuilders/SettingsRegistryBuilder.cpp @@ -263,9 +263,15 @@ namespace AssetProcessor return; } + using FixedValueString = AZ::SettingsRegistryInterface::FixedValueString; + // Placeholder Key used by the local Settings Registry for storing all Gems SourcePaths + // array entries. + constexpr auto PlaceholderGemKey = FixedValueString(AZ::SettingsRegistryMergeUtils::OrganizationRootKey) + + "/Gems/__SettingsRegistryBuilderPlaceholder"; + AZ::SettingsRegistryImpl registry; - // Seed the local settings registry using the AssetProcessor settings registry + // Seed the local settings registry using the AssetProcessor Settings Registry if (auto settingsRegistry = AZ::Interface::Get(); settingsRegistry != nullptr) { AZStd::array settingsToCopy{ @@ -279,18 +285,55 @@ namespace AssetProcessor for (const auto& settingsKey : settingsToCopy) { - AZ::SettingsRegistryInterface::FixedValueString settingsValue; + FixedValueString settingsValue; [[maybe_unused]] bool settingsCopied = settingsRegistry->Get(settingsValue, settingsKey) && registry.Set(settingsKey, settingsValue); AZ_Warning("Settings Registry Builder", settingsCopied, "Unable to copy setting %s from AssetProcessor settings registry" " to local settings registry", settingsKey.c_str()); } + + // The purpose of this section is to copy the Gem's SourcePaths from the Global Settings Registry + // the local SettingsRegistry. The reason this is needed is so that the call to + // `MergeSettingsToRegistry_GemRegistries` below is able to locate each gem's "/Registry" folder + // that will be merged into the bootstrap.game...setreg file + // This is used by the GameLauncher applications to read from a single merged .setreg file + // containing the settings needed to run a game/simulation without have access to the source code base registry + AZStd::vector gemInfos; + size_t pathIndex{}; + if (AzFramework::GetGemsInfo(gemInfos, *settingsRegistry)) + { + AZStd::vector sourcePaths; + for (const AzFramework::GemInfo& gemInfo : gemInfos) + { + for (const AZ::IO::Path& absoluteSourcePath : gemInfo.m_absoluteSourcePaths) + { + if (auto foundIt = AZStd::find(sourcePaths.begin(), sourcePaths.end(), absoluteSourcePath); + foundIt == sourcePaths.end()) + { + sourcePaths.emplace_back(absoluteSourcePath); + } + } + } + + for (const AZ::IO::Path& sourcePath : sourcePaths) + { + // Use JSON Pointer to append elements to the SourcePaths array + registry.Set(FixedValueString::format("%s/SourcePaths/%zu", PlaceholderGemKey.c_str(), pathIndex++), + sourcePath.Native()); + } + } } AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_EngineRegistry(registry, platform, specialization, &scratchBuffer); + // This function iterates over each path for each the "/Amazon/Gems//SourcePaths" key and attempts + // to merge the "Registry" directory in each path. AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_GemRegistries(registry, platform, specialization, &scratchBuffer); AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_ProjectRegistry(registry, platform, specialization, &scratchBuffer); + // The Placeholder Key is removed now that each gem's "/Registry" directory have been merged to + // the local Settings Registry instance via `MergeSettingsToRegistry_GemRegistries` + registry.Remove(PlaceholderGemKey); + // Merge the Project User and User home settings registry only in non-release builds constexpr bool executeRegDumpCommands = false; AZ::CommandLine* commandLine{};