Change SerializeContextTools into a ToolsApplication so that it can correctly read in slice data
This commit is contained in:
@@ -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,27 @@ 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 (size_t specializationCount = m_commandLine.GetNumSwitchValues("specializations"); specializationCount > 0)
|
||||
{
|
||||
projectSpecializations.Append("editor");
|
||||
for (size_t specializationIndex = 0; specializationIndex < specializationCount; ++specializationIndex)
|
||||
{
|
||||
projectSpecializations.Append(m_commandLine.GetSwitchValue("specializations", specializationIndex));
|
||||
}
|
||||
}
|
||||
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 +102,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
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/Component/ComponentApplication.h>
|
||||
#include <AzToolsFramework/Application/ToolsApplication.h>
|
||||
#include <AzCore/IO/Path/Path.h>
|
||||
|
||||
namespace AZ
|
||||
@@ -20,13 +20,14 @@ namespace AZ
|
||||
namespace SerializeContextTools
|
||||
{
|
||||
class Application final
|
||||
: public AZ::ComponentApplication
|
||||
: public AzToolsFramework::ToolsApplication
|
||||
{
|
||||
public:
|
||||
Application(int argc, char** argv);
|
||||
~Application() override = default;
|
||||
|
||||
const char* GetConfigFilePath() const;
|
||||
AZ::ComponentTypeList GetRequiredSystemComponents() const override;
|
||||
|
||||
protected:
|
||||
void SetSettingsRegistrySpecializations(AZ::SettingsRegistryInterface::Specializations& specializations) override;
|
||||
|
||||
@@ -29,4 +29,6 @@ ly_add_target(
|
||||
BUILD_DEPENDENCIES
|
||||
PRIVATE
|
||||
AZ::AzCore
|
||||
AZ::AzFramework
|
||||
AZ::AzToolsFramework
|
||||
)
|
||||
|
||||
@@ -236,7 +236,6 @@ namespace AZ::SerializeContextTools
|
||||
AZ::IO::MemoryStream stream(data.data(), fileLength);
|
||||
|
||||
ObjectStream::FilterDescriptor filter;
|
||||
filter.m_flags = ObjectStream::FILTERFLAG_IGNORE_UNKNOWN_CLASSES;
|
||||
// Never load dependencies. That's another file that would need to be processed
|
||||
// separately from this one.
|
||||
filter.m_assetCB = AZ::Data::AssetFilterNoAssetLoading;
|
||||
|
||||
@@ -23,6 +23,8 @@ void PrintHelp()
|
||||
AZ_Printf("Help", "Serialize Context Tool\n");
|
||||
AZ_Printf("Help", " <action> [-config] <action arguments>*\n");
|
||||
AZ_Printf("Help", " [opt] -config=<path>: optional path to application's config file. Default is 'config/editor.xml'.\n");
|
||||
AZ_Printf("Help", " [opt] -specializations=<prefix>: <comma or semicolon>-separated list of optional Registry project\n");
|
||||
AZ_Printf("Help", " specializations, such as 'editor' or 'game' or 'editor;test'. Default is none. \n");
|
||||
AZ_Printf("Help", "\n");
|
||||
AZ_Printf("Help", " 'help': Print this help\n");
|
||||
AZ_Printf("Help", " example: 'help'\n");
|
||||
@@ -81,11 +83,7 @@ int main(int argc, char** argv)
|
||||
bool result = false;
|
||||
Application application(argc, argv);
|
||||
AZ::ComponentApplication::StartupParameters startupParameters;
|
||||
startupParameters.m_loadDynamicModules = false;
|
||||
application.Create({}, startupParameters);
|
||||
// Load the DynamicModules after the Application starts to prevent Gem System Components
|
||||
// from activating
|
||||
application.LoadDynamicModules();
|
||||
application.Start({}, startupParameters);
|
||||
|
||||
const AZ::CommandLine* commandLine = application.GetAzCommandLine();
|
||||
if (commandLine->GetNumMiscValues() < 1)
|
||||
|
||||
Reference in New Issue
Block a user