dependency sort WIP

Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com>
This commit is contained in:
chcurran
2021-09-14 08:41:11 -07:00
parent cb12d31821
commit f55737af11
4 changed files with 107 additions and 2 deletions
@@ -94,6 +94,7 @@ namespace ScriptCanvasEditor
void Controller::OnScanButtonPress()
{
// \todo move to another file
auto isUpToDate = [this](AZ::Data::Asset<AZ::Data::AssetData> asset)
{
AZ::Entity* scriptCanvasEntity = nullptr;
@@ -18,6 +18,8 @@ namespace ScriptCanvasEditor
{
AZStd::function<void(AZ::Data::Asset<AZ::Data::AssetData>)> modification;
bool backupGraphBeforeModification = false;
// disabling this can be acceptable, but be careful
bool successfulDependencyUpgradeRequired = true;
};
struct ScanConfiguration
@@ -7,6 +7,8 @@
*/
#include <Editor/View/Windows/Tools/UpgradeTool/Modifier.h>
#include <ScriptCanvas/Asset/RuntimeAsset.h>
#include <ScriptCanvas/Assets/ScriptCanvasAsset.h>
namespace ModifierCpp
{
@@ -21,15 +23,98 @@ namespace ScriptCanvasEditor
( const ModifyConfiguration& modification
, AZStd::vector<AZ::Data::AssetInfo>&& assets
, AZStd::function<void()> 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<AZStd::string, AssetBuilderSDK::SourceFileDependency> 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<AZ::Data::Asset<ScriptCanvas::SubgraphInterfaceAsset>>())
{
const auto* subgraphAsset = reinterpret_cast<AZ::Data::Asset<const ScriptCanvas::SubgraphInterfaceAsset>*>(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<ScriptCanvas::GraphData>()
, 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<AZ::Data::AssetData> Modifier::LoadAsset()
{
AZ::Data::Asset<AZ::Data::AssetData> asset = AZ::Data::AssetManager::Instance().GetAsset
(GetCurrentAsset().m_assetId
, azrtti_typeid<ScriptCanvasAsset>()
, 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;
}
}
}
}
@@ -28,12 +28,29 @@ namespace ScriptCanvasEditor
, AZStd::function<void()> onComplete);
private:
enum class State
{
GatheringDependencies,
ModifyingGraphs
};
State m_state = State::GatheringDependencies;
size_t m_assetIndex = 0;
AZStd::function<void()> m_onComplete;
AZStd::vector<AZ::Data::AssetInfo> m_assets;
AZStd::vector<size_t> m_dependencyOrderedIndicies;
AZStd::unordered_map<size_t, AZStd::unordered_set<size_t>> m_dependencies;
AZStd::vector<size_t> m_failures;
ModifyConfiguration m_config;
ModifyConfiguration m_result;
ModificationResult m_result;
void GatherDependencies();
const AZ::Data::AssetInfo& GetCurrentAsset() const;
AZ::Data::Asset<AZ::Data::AssetData> LoadAsset();
void SortGraphsByDependencies();
void OnSystemTick() override;
void TickGatherDependencies();
void TickUpdateGraph();
};
}
}