Change SerializeContextTools into a ToolsApplication so that it can correctly read in slice data:

- Uses ToolsApplication instead of ComponentApplication so that built-in Editor components are recognized and read in correctly
- Starts up all the DynamicModules immediately so that the System Components are activated, which registers asset handlers and allows asset references to serialize in correctly
- Adds a -specialization command-line flag to specify which project specialization to use (editor, game, etc)
- Removes the filter to ignore unknown classes since they should all now be "known"
- Adds a few gem autoload flags and a null thumbnail service so that Qt and Python systems can be skipped, as they aren't needed for the data conversions and would bring additional overhead and complications
This commit is contained in:
mbalfour
2021-05-11 16:13:04 -05:00
parent 21dfcfed74
commit b5e87d3601
6 changed files with 59 additions and 14 deletions
@@ -16,12 +16,23 @@
#include <AzCore/StringFunc/StringFunc.h>
#include <AzCore/Utils/Utils.h>
#include <AzToolsFramework/Thumbnails/ThumbnailerNullComponent.h>
namespace AZ
{
// SerializeContextTools is a full ToolsApplication that will load a project's Gem DLLs and initialize the system components.
// This level of initialization is required to get all the serialization contexts and asset handlers registered, so that when
// data transformations take place, none of the data is dropped due to not being recognized.
// However, as a simplification, anything requiring Python or Qt is skipped during initialization:
// - The gem_autoload.serializecontexttools.setreg file disables autoload for QtForPython, EditorPythonBindings, and PythonAssetBuilder
// - The system component initialization below uses ThumbnailerNullComponent so that other components relying on a ThumbnailService
// can still be started up, but the thumbnail service itself won't do anything. The real ThumbnailerComponent uses Qt, which is why
// it isn't used.
namespace SerializeContextTools
{
Application::Application(int argc, char** argv)
: AZ::ComponentApplication(argc, argv)
: AzToolsFramework::ToolsApplication(&argc, &argv)
{
AZ::IO::FixedMaxPath projectPath = AZ::Utils::GetProjectPath();
if (projectPath.empty())
@@ -51,14 +62,25 @@ namespace AZ
else
{
AZ::SettingsRegistryInterface::Specializations projectSpecializations{ projectName };
AZ::IO::PathView configFilenameStem = m_configFilePath.Stem();
if (AZ::StringFunc::Equal(configFilenameStem.Native(), "Editor"))
// If a project specialization has been passed in via the command line, use it.
if (m_commandLine.HasSwitch("specialization"))
{
projectSpecializations.Append("editor");
AZStd::string specialization = m_commandLine.GetSwitchValue("specialization", 0);
projectSpecializations.Append(specialization);
}
else if (AZ::StringFunc::Equal(configFilenameStem.Native(), "Game"))
// Otherwise, if a config file was passed in, auto-set the specialization based on the config file name.
else
{
projectSpecializations.Append(projectName + "_GameLauncher");
AZ::IO::PathView configFilenameStem = m_configFilePath.Stem();
if (AZ::StringFunc::Equal(configFilenameStem.Native(), "Editor"))
{
projectSpecializations.Append("editor");
}
else if (AZ::StringFunc::Equal(configFilenameStem.Native(), "Game"))
{
projectSpecializations.Append(projectName + "_GameLauncher");
}
}
// Used the project specializations to merge the build dependencies *.setreg files
@@ -78,5 +100,14 @@ namespace AZ
AZ::ComponentApplication::SetSettingsRegistrySpecializations(specializations);
specializations.Append("serializecontexttools");
}
AZ::ComponentTypeList Application::GetRequiredSystemComponents() const
{
// Use all of the default system components, but also add in the ThumbnailerNullComponent so that components requiring
// a ThumbnailService can still be started up.
AZ::ComponentTypeList components = AzToolsFramework::ToolsApplication::GetRequiredSystemComponents();
components.emplace_back(azrtti_typeid<AzToolsFramework::Thumbnailer::ThumbnailerNullComponent>());
return components;
}
} // namespace SerializeContextTools
} // namespace AZ