From 9de22d5e54de62082c88e9fd9f34cf5b3460d6cc Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Thu, 2 Sep 2021 16:39:04 -0700 Subject: [PATCH] Fix dependency errors after conversion to JSON Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Builder/ScriptCanvasBuilderWorker.cpp | 99 ++++++++++--------- .../Assets/ScriptCanvasAssetHandler.cpp | 10 +- .../Libraries/Core/ReceiveScriptEvent.cpp | 2 +- 3 files changed, 57 insertions(+), 54 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp index 7dddf93818..beeb376380 100644 --- a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp +++ b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp @@ -6,7 +6,6 @@ * */ - #include #include #include @@ -16,20 +15,19 @@ #include #include #include - -#include +#include #include +#include #include #include #include #include +#include #include #include #include #include -#include - namespace ScriptCanvasBuilder { void Worker::Activate(const AssetHandlers& handlers) @@ -82,55 +80,18 @@ namespace ScriptCanvasBuilder m_processEditorAssetDependencies.clear(); - AZStd::unordered_multimap jobDependenciesByKey; - - auto assetFilter = [this, &jobDependenciesByKey](const AZ::Data::AssetFilterInfo& filterInfo) - { - // force load these before processing - if (filterInfo.m_assetType == azrtti_typeid() - || filterInfo.m_assetType == azrtti_typeid()) - { - this->m_processEditorAssetDependencies.push_back(filterInfo); - } - - // these trigger re-processing - if (filterInfo.m_assetType == azrtti_typeid()) - { - AZ_Error("ScriptCanvas", false, "ScriptAsset Reference in a graph detected"); - } - - if (filterInfo.m_assetType == azrtti_typeid()) - { - AssetBuilderSDK::SourceFileDependency dependency; - dependency.m_sourceFileDependencyUUID = filterInfo.m_assetId.m_guid; - jobDependenciesByKey.insert({ ScriptEvents::k_builderJobKey, dependency }); - } - - if (filterInfo.m_assetType == azrtti_typeid()) - { - AssetBuilderSDK::SourceFileDependency dependency; - dependency.m_sourceFileDependencyUUID = filterInfo.m_assetId.m_guid; - jobDependenciesByKey.insert({ s_scriptCanvasProcessJobKey, dependency }); - } - - // Asset filter always returns false to prevent parsing dependencies, but makes note of the script canvas dependencies - return false; - }; - AZ::Data::Asset asset; asset.Create(AZ::Data::AssetId(AZ::Uuid::CreateRandom())); - if (m_editorAssetHandler->LoadAssetDataFromStream(asset, assetDataStream, assetFilter) != AZ::Data::AssetHandler::LoadResult::LoadComplete) + if (m_editorAssetHandler->LoadAssetDataFromStream(asset, assetDataStream, {}) != AZ::Data::AssetHandler::LoadResult::LoadComplete) { AZ_Warning(s_scriptCanvasBuilder, false, "CreateJobs for \"%s\" failed because the asset data could not be loaded from the file", fullPath.data()); return; } - // Flush asset database events to ensure no asset references are held by closures queued on Ebuses. - AZ::Data::AssetManager::Instance().DispatchEvents(); - auto* scriptCanvasEntity = asset.Get()->GetScriptCanvasEntity(); auto* sourceGraph = AZ::EntityUtils::FindFirstDerivedComponent(scriptCanvasEntity); AZ_Assert(sourceGraph, "Graph component is missing from entity."); + AZ_Assert(sourceGraph->GetGraphData(), "GraphData is missing from entity"); struct EntityIdComparer { @@ -152,7 +113,50 @@ namespace ScriptCanvasBuilder } } - m_processEditorAssetDependencies.clear(); + AZ::SerializeContext* serializeContext{}; + AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationBus::Events::GetSerializeContext); + AZ_Assert(serializeContext, "SerializeContext is required to enumerate dependent assets in the ScriptCanvas file"); + + AZStd::unordered_multimap jobDependenciesByKey; + auto assetFilter = [this, &jobDependenciesByKey] + ( void* instancePointer + , const AZ::SerializeContext::ClassData* classData + , [[maybe_unused]] const AZ::SerializeContext::ClassElement* classElement) + { + auto azTypeId = classData->m_azRtti->GetTypeId(); + + if (azTypeId == azrtti_typeid>()) + { + const auto* subgraphAsset = reinterpret_cast*>(instancePointer); + AssetBuilderSDK::SourceFileDependency dependency; + dependency.m_sourceFileDependencyUUID = subgraphAsset->GetId().m_guid; + jobDependenciesByKey.insert({s_scriptCanvasProcessJobKey, dependency}); + this->m_processEditorAssetDependencies.push_back({subgraphAsset->GetId(), azTypeId, AZ::Data::AssetLoadBehavior::PreLoad}); + } + else if (azTypeId == azrtti_typeid>()) + { + const auto* eventAsset = reinterpret_cast*>(instancePointer); + AssetBuilderSDK::SourceFileDependency dependency; + dependency.m_sourceFileDependencyUUID = eventAsset->GetId().m_guid; + jobDependenciesByKey.insert({ScriptEvents::k_builderJobKey, dependency}); + this->m_processEditorAssetDependencies.push_back({ eventAsset->GetId(), azTypeId, AZ::Data::AssetLoadBehavior::PreLoad}); + } + + // always continue, make note of the script canvas dependencies + return true; + }; + + AZ_Verify(serializeContext->EnumerateInstanceConst + ( sourceGraph->GetGraphData() + , azrtti_typeid() + , assetFilter + , {} + , AZ::SerializeContext::ENUM_ACCESS_FOR_READ + , nullptr + , nullptr), "Failed to gather dependencies from graph data"); + + // Flush asset database events to ensure no asset references are held by closures queued on Ebuses. + AZ::Data::AssetManager::Instance().DispatchEvents(); for (const AssetBuilderSDK::PlatformInfo& info : request.m_enabledPlatforms) { @@ -272,9 +276,6 @@ namespace ScriptCanvasBuilder assetDataStream->Open(AZStd::move(fileBuffer)); } - AZ::SerializeContext* context{}; - AZ::ComponentApplicationBus::BroadcastResult(context, &AZ::ComponentApplicationBus::Events::GetSerializeContext); - AZ::Data::Asset asset; asset.Create(request.m_sourceFileUUID); if (m_editorAssetHandler->LoadAssetDataFromStream(asset, assetDataStream, nullptr) != AZ::Data::AssetHandler::LoadResult::LoadComplete) @@ -375,6 +376,8 @@ namespace ScriptCanvasBuilder AZ_Error(s_scriptCanvasBuilder, false, translationOutcome.GetError().c_str()); } } + + m_processEditorAssetDependencies.clear(); } AZ_TracePrintf(s_scriptCanvasBuilder, "Finish Processing Job"); diff --git a/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetHandler.cpp b/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetHandler.cpp index 6f86b93dda..848db44236 100644 --- a/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetHandler.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetHandler.cpp @@ -124,10 +124,10 @@ namespace ScriptCanvasEditor settings.m_metadata.Create(); // attempt JSON deserialization... if (JSRU::LoadObjectFromStreamByType - ( &scriptCanvasDataTarget - , azrtti_typeid() - , byteStreamSource - , &settings).IsSuccess()) + ( &scriptCanvasDataTarget + , azrtti_typeid() + , byteStreamSource + , &settings).IsSuccess()) { if (auto graphData = scriptCanvasAssetTarget->GetScriptCanvasGraph() ? scriptCanvasAssetTarget->GetScriptCanvasGraph()->GetGraphData() @@ -156,7 +156,7 @@ namespace ScriptCanvasEditor byteStreamSource.Seek(0U, AZ::IO::GenericStream::ST_SEEK_BEGIN); // tolerate unknown classes in the editor. Let the asset processor warn about bad nodes... if (AZ::Utils::LoadObjectFromStreamInPlace - (byteStreamSource + ( byteStreamSource , scriptCanvasDataTarget , m_serializeContext , AZ::ObjectStream::FilterDescriptor(assetLoadFilterCB, AZ::ObjectStream::FILTERFLAG_IGNORE_UNKNOWN_CLASSES))) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp index b874077834..734c2a1242 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp @@ -353,7 +353,7 @@ namespace ScriptCanvas AZStd::optional ReceiveScriptEvent::GetEventIndex(AZStd::string eventName) const { - return m_handler->GetFunctionIndex(eventName.c_str());; + return m_handler ? AZStd::optional(m_handler->GetFunctionIndex(eventName.c_str())) : AZStd::nullopt; } AZStd::vector ReceiveScriptEvent::GetEventSlotIds() const