diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Controller.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Controller.cpp index 44d6f2e738..09f0428901 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Controller.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Controller.cpp @@ -94,6 +94,7 @@ namespace ScriptCanvasEditor void Controller::OnScanButtonPress() { + // \todo move to another file auto isUpToDate = [this](AZ::Data::Asset asset) { AZ::Entity* scriptCanvasEntity = nullptr; diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/ModelTraits.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/ModelTraits.h index d48c15949a..d01d311ebc 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/ModelTraits.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/ModelTraits.h @@ -18,6 +18,8 @@ namespace ScriptCanvasEditor { AZStd::function)> modification; bool backupGraphBeforeModification = false; + // disabling this can be acceptable, but be careful + bool successfulDependencyUpgradeRequired = true; }; struct ScanConfiguration diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Modifier.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Modifier.cpp index d782ebd572..9841a9f60e 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Modifier.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Modifier.cpp @@ -7,6 +7,8 @@ */ #include +#include +#include namespace ModifierCpp { @@ -21,15 +23,98 @@ namespace ScriptCanvasEditor ( const ModifyConfiguration& modification , AZStd::vector&& assets , AZStd::function onComplete) + : m_config(modification) + , m_assets(assets) + , m_onComplete(onComplete) { - ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnUpgradeAllBegin); AZ::SystemTickBus::Handler::BusConnect(); } + + const AZ::Data::AssetInfo& Modifier::GetCurrentAsset() const + { + return m_state == State::GatheringDependencies + ? m_assets[m_assetIndex] + : m_assets[m_dependencyOrderedIndicies[m_assetIndex]]; + } + + void Modifier::GatherDependencies() + { + 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); + if (subgraphAsset->GetId().IsValid()) + { + // 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 }); + } + } + // 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(); + */ + } + + AZ::Data::Asset Modifier::LoadAsset() + { + AZ::Data::Asset asset = AZ::Data::AssetManager::Instance().GetAsset + (GetCurrentAsset().m_assetId + , azrtti_typeid() + , AZ::Data::AssetLoadBehavior::PreLoad); + + asset.BlockUntilLoadComplete(); + + if (asset.IsReady()) + { + return asset; + } + else + { + return {}; + } + } + void Modifier::OnSystemTick() { + switch (m_state) + { + case State::GatheringDependencies: + TickGatherDependencies(); + break; + case State::ModifyingGraphs: + TickUpdateGraph(); + break; + } } } } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Modifier.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Modifier.h index d391f51bf7..b862de82f0 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Modifier.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/Modifier.h @@ -28,12 +28,29 @@ namespace ScriptCanvasEditor , AZStd::function onComplete); private: + enum class State + { + GatheringDependencies, + ModifyingGraphs + }; + + State m_state = State::GatheringDependencies; size_t m_assetIndex = 0; AZStd::function m_onComplete; + AZStd::vector m_assets; + AZStd::vector m_dependencyOrderedIndicies; + AZStd::unordered_map> m_dependencies; + AZStd::vector m_failures; ModifyConfiguration m_config; - ModifyConfiguration m_result; + ModificationResult m_result; + void GatherDependencies(); + const AZ::Data::AssetInfo& GetCurrentAsset() const; + AZ::Data::Asset LoadAsset(); + void SortGraphsByDependencies(); void OnSystemTick() override; + void TickGatherDependencies(); + void TickUpdateGraph(); }; } }