Fix missing asset handler error on EditorSCComponent load from pre SourceHandle files

Signed-off-by: carlitosan <82187351+carlitosan@users.noreply.github.com>
This commit is contained in:
carlitosan
2021-12-09 18:58:47 -08:00
parent 3f128c5baa
commit 21e7d1db67
3 changed files with 65 additions and 14 deletions
@@ -30,7 +30,6 @@
#include <ScriptCanvas/Components/EditorGraph.h>
#include <ScriptCanvas/Components/EditorGraphVariableManagerComponent.h>
#include <ScriptCanvas/Components/EditorScriptCanvasComponent.h>
#include <ScriptCanvas/Components/EditorScriptCanvasComponentSerializer.h>
#include <ScriptCanvas/Components/EditorUtils.h>
#include <ScriptCanvas/Core/Node.h>
#include <ScriptCanvas/PerformanceStatisticsBus.h>
@@ -317,6 +316,7 @@ namespace ScriptCanvasEditor
void EditorScriptCanvasComponent::BuildGameEntityData()
{
using namespace ScriptCanvasBuilder;
CompleteDescriptionInPlace(m_sourceHandle);
m_runtimeDataIsValid = false;
@@ -9,15 +9,16 @@
#pragma once
#include <AzFramework/Asset/AssetCatalogBus.h>
#include <AzToolsFramework/API/EditorAssetSystemAPI.h>
#include <AzToolsFramework/Entity/EditorEntityContextBus.h>
#include <AzToolsFramework/ToolsComponents/EditorComponentBase.h>
#include <Builder/ScriptCanvasBuilder.h>
#include <Editor/Assets/ScriptCanvasAssetHolder.h>
#include <ScriptCanvas/Assets/ScriptCanvasAssetHandler.h>
#include <ScriptCanvas/Bus/EditorScriptCanvasBus.h>
#include <ScriptCanvas/Components/EditorScriptCanvasComponentSerializer.h>
#include <ScriptCanvas/Execution/RuntimeComponent.h>
#include <ScriptCanvas/Variable/VariableBus.h>
#include <AzToolsFramework/API/EditorAssetSystemAPI.h>
namespace ScriptCanvasEditor
{
@@ -39,11 +40,12 @@ namespace ScriptCanvasEditor
, private EditorScriptCanvasComponentLoggingBus::Handler
, private EditorScriptCanvasComponentRequestBus::Handler
, private AzToolsFramework::EditorEntityContextNotificationBus::Handler
{
public:
AZ_COMPONENT(EditorScriptCanvasComponent, "{C28E2D29-0746-451D-A639-7F113ECF5D72}", AzToolsFramework::Components::EditorComponentBase);
friend class AZ::EditorScriptCanvasComponentSerializer;
EditorScriptCanvasComponent();
EditorScriptCanvasComponent(const SourceHandle& sourceHandle);
~EditorScriptCanvasComponent() override;
@@ -27,23 +27,72 @@ namespace AZ
, "EditorScriptCanvasComponentSerializer Load against output typeID that was not EditorScriptCanvasComponent");
AZ_Assert(outputValue, "EditorScriptCanvasComponentSerializer Load against null output");
// load as parent class
auto outputComponent = reinterpret_cast<ScriptCanvasEditor::EditorScriptCanvasComponent*>(outputValue);
JsonSerializationResult::ResultCode result = BaseJsonSerializer::Load(outputValue, outputValueTypeId, inputValue, context);
JsonSerializationResult::ResultCode result = BaseJsonSerializer::Load(outputValue
, azrtti_typeid<AzToolsFramework::Components::EditorComponentBase>(), inputValue, context);
// load child data one by one...
result.Combine(BaseJsonSerializer::Load(outputValue, outputValueTypeId, inputValue, context));
if (result.GetProcessing() != JSR::Processing::Halted)
{
auto assetHolderMember = inputValue.FindMember("m_assetHolder");
if (assetHolderMember != inputValue.MemberEnd())
{
ScriptCanvasEditor::ScriptCanvasAssetHolder assetHolder;
result.Combine
( ContinueLoading(&assetHolder
, azrtti_typeid<ScriptCanvasEditor::ScriptCanvasAssetHolder>(), assetHolderMember->value, context));
result.Combine(ContinueLoadingFromJsonObjectField
( &outputComponent->m_name
, azrtti_typeid(outputComponent->m_name)
, inputValue
, "m_name"
, context));
if (result.GetProcessing() != JSR::Processing::Halted)
result.Combine(ContinueLoadingFromJsonObjectField
( &outputComponent->m_runtimeDataIsValid
, azrtti_typeid(outputComponent->m_runtimeDataIsValid)
, inputValue
, "runtimeDataIsValid"
, context));
result.Combine(ContinueLoadingFromJsonObjectField
( &outputComponent->m_variableOverrides
, azrtti_typeid(outputComponent->m_variableOverrides)
, inputValue
, "runtimeDataOverrides"
, context));
auto assetHolderMember = inputValue.FindMember("m_assetHolder");
if (assetHolderMember == inputValue.MemberEnd())
{
// file was saved with SourceHandle data
result.Combine(ContinueLoadingFromJsonObjectField
( &outputComponent->m_sourceHandle
, azrtti_typeid(outputComponent->m_sourceHandle)
, inputValue
, "sourceHandle"
, context));
}
else
{
// manually load the old asset info data
const rapidjson::Value& assetHolderValue = assetHolderMember->value;
if (auto assetMember = assetHolderValue.FindMember("m_asset"); assetMember != assetHolderValue.MemberEnd())
{
outputComponent->InitializeSource
( ScriptCanvasEditor::SourceHandle(nullptr, assetHolder.GetAssetId().m_guid, assetHolder.GetAssetHint()));
const rapidjson::Value& assetValue = assetMember->value;
AZ::Data::AssetId assetId{};
if (auto assetIdMember = assetValue.FindMember("assetId"); assetIdMember != assetValue.MemberEnd())
{
result.Combine(ContinueLoading(&assetId, azrtti_typeid(assetId), assetIdMember->value, context));
}
AZStd::string path{};
if (auto pathMember = assetValue.FindMember("assetHint"); pathMember != assetValue.MemberEnd())
{
result.Combine(ContinueLoading(&path, azrtti_typeid(path), pathMember->value, context));
}
if (result.GetProcessing() != JSR::Processing::Halted)
{
outputComponent->InitializeSource(ScriptCanvasEditor::SourceHandle(nullptr, assetId.m_guid, path));
}
}
}
}