Merge pull request #3964 from aws-lumberyard-dev/carlitosan/development
Upgrades and stability fixes for version explorer
This commit is contained in:
@@ -303,6 +303,55 @@ namespace AZ
|
||||
return AZ::Success();
|
||||
}
|
||||
|
||||
AZ::Outcome<void, AZStd::string> LoadObjectFromStringByType(void* objectToLoad, const Uuid& classId, AZStd::string_view stream,
|
||||
const JsonDeserializerSettings* settings)
|
||||
{
|
||||
JsonDeserializerSettings loadSettings;
|
||||
AZStd::string deserializeErrors;
|
||||
auto prepare = PrepareDeserializerSettings(settings, loadSettings, deserializeErrors);
|
||||
if (!prepare.IsSuccess())
|
||||
{
|
||||
return AZ::Failure(prepare.GetError());
|
||||
}
|
||||
|
||||
auto parseResult = ReadJsonString(stream);
|
||||
if (!parseResult.IsSuccess())
|
||||
{
|
||||
return AZ::Failure(parseResult.GetError());
|
||||
}
|
||||
|
||||
const rapidjson::Document& jsonDocument = parseResult.GetValue();
|
||||
|
||||
auto validateResult = ValidateJsonClassHeader(jsonDocument);
|
||||
if (!validateResult.IsSuccess())
|
||||
{
|
||||
return AZ::Failure(validateResult.GetError());
|
||||
}
|
||||
|
||||
const char* className = jsonDocument.FindMember(ClassNameTag)->value.GetString();
|
||||
|
||||
// validate class name
|
||||
auto classData = loadSettings.m_serializeContext->FindClassData(classId);
|
||||
if (!classData)
|
||||
{
|
||||
return AZ::Failure(AZStd::string::format("Try to load class from Id %s", classId.ToString<AZStd::string>().c_str()));
|
||||
}
|
||||
|
||||
if (azstricmp(classData->m_name, className) != 0)
|
||||
{
|
||||
return AZ::Failure(AZStd::string::format("Try to load class %s from class %s data", classData->m_name, className));
|
||||
}
|
||||
|
||||
JsonSerializationResult::ResultCode result = JsonSerialization::Load(objectToLoad, classId, jsonDocument.FindMember(ClassDataTag)->value, loadSettings);
|
||||
|
||||
if (!WasLoadSuccess(result.GetOutcome()) || !deserializeErrors.empty())
|
||||
{
|
||||
return AZ::Failure(deserializeErrors);
|
||||
}
|
||||
|
||||
return AZ::Success();
|
||||
}
|
||||
|
||||
AZ::Outcome<void, AZStd::string> LoadObjectFromStreamByType(void* objectToLoad, const Uuid& classId, IO::GenericStream& stream,
|
||||
const JsonDeserializerSettings* settings)
|
||||
{
|
||||
|
||||
@@ -79,6 +79,9 @@ namespace AZ
|
||||
AZ::Outcome<rapidjson::Document, AZStd::string> ReadJsonStream(IO::GenericStream& stream);
|
||||
|
||||
//! Load object with known class type
|
||||
AZ::Outcome<void, AZStd::string> LoadObjectFromStringByType(void* objectToLoad, const Uuid& objectType, AZStd::string_view source,
|
||||
const JsonDeserializerSettings* settings = nullptr);
|
||||
|
||||
AZ::Outcome<void, AZStd::string> LoadObjectFromStreamByType(void* objectToLoad, const Uuid& objectType, IO::GenericStream& stream,
|
||||
const JsonDeserializerSettings* settings = nullptr);
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <Asset/AssetDescription.h>
|
||||
#include <AssetBuilderSDK/SerializationDependencies.h>
|
||||
#include <AzCore/Asset/AssetManager.h>
|
||||
@@ -16,20 +15,19 @@
|
||||
#include <AzCore/Serialization/SerializeContext.h>
|
||||
#include <AzFramework/Script/ScriptComponent.h>
|
||||
#include <AzFramework/StringFunc/StringFunc.h>
|
||||
|
||||
#include <ScriptCanvas/Asset/SubgraphInterfaceAssetHandler.h>
|
||||
#include <Builder/ScriptCanvasBuilderWorker.h>
|
||||
#include <ScriptCanvas/Asset/RuntimeAssetHandler.h>
|
||||
#include <ScriptCanvas/Asset/SubgraphInterfaceAssetHandler.h>
|
||||
#include <ScriptCanvas/Assets/ScriptCanvasAssetHandler.h>
|
||||
#include <ScriptCanvas/Components/EditorGraph.h>
|
||||
#include <ScriptCanvas/Components/EditorGraphVariableManagerComponent.h>
|
||||
#include <ScriptCanvas/Core/Connection.h>
|
||||
#include <ScriptCanvas/Core/GraphData.h>
|
||||
#include <ScriptCanvas/Core/Node.h>
|
||||
#include <ScriptCanvas/Grammar/AbstractCodeModel.h>
|
||||
#include <ScriptCanvas/Results/ErrorText.h>
|
||||
#include <ScriptCanvas/Utils/BehaviorContextUtils.h>
|
||||
|
||||
#include <Builder/ScriptCanvasBuilderWorker.h>
|
||||
|
||||
namespace ScriptCanvasBuilder
|
||||
{
|
||||
void Worker::Activate(const AssetHandlers& handlers)
|
||||
@@ -82,55 +80,18 @@ namespace ScriptCanvasBuilder
|
||||
|
||||
m_processEditorAssetDependencies.clear();
|
||||
|
||||
AZStd::unordered_multimap<AZStd::string, AssetBuilderSDK::SourceFileDependency> jobDependenciesByKey;
|
||||
|
||||
auto assetFilter = [this, &jobDependenciesByKey](const AZ::Data::AssetFilterInfo& filterInfo)
|
||||
{
|
||||
// force load these before processing
|
||||
if (filterInfo.m_assetType == azrtti_typeid<ScriptCanvas::SubgraphInterfaceAsset>()
|
||||
|| filterInfo.m_assetType == azrtti_typeid<ScriptEvents::ScriptEventsAsset>())
|
||||
{
|
||||
this->m_processEditorAssetDependencies.push_back(filterInfo);
|
||||
}
|
||||
|
||||
// these trigger re-processing
|
||||
if (filterInfo.m_assetType == azrtti_typeid<ScriptCanvasEditor::ScriptCanvasAsset>())
|
||||
{
|
||||
AZ_Error("ScriptCanvas", false, "ScriptAsset Reference in a graph detected");
|
||||
}
|
||||
|
||||
if (filterInfo.m_assetType == azrtti_typeid<ScriptEvents::ScriptEventsAsset>())
|
||||
{
|
||||
AssetBuilderSDK::SourceFileDependency dependency;
|
||||
dependency.m_sourceFileDependencyUUID = filterInfo.m_assetId.m_guid;
|
||||
jobDependenciesByKey.insert({ ScriptEvents::k_builderJobKey, dependency });
|
||||
}
|
||||
|
||||
if (filterInfo.m_assetType == azrtti_typeid<ScriptCanvas::SubgraphInterfaceAsset>())
|
||||
{
|
||||
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<ScriptCanvasEditor::ScriptCanvasAsset> 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<ScriptCanvasEditor::Graph>(scriptCanvasEntity);
|
||||
AZ_Assert(sourceGraph, "Graph component is missing from entity.");
|
||||
AZ_Assert(sourceGraph->GetGraphData(), "GraphData is missing from entity");
|
||||
|
||||
struct EntityIdComparer
|
||||
{
|
||||
@@ -152,7 +113,58 @@ 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<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 });
|
||||
}
|
||||
}
|
||||
else if (azTypeId == azrtti_typeid<AZ::Data::Asset<ScriptEvents::ScriptEventsAsset>>())
|
||||
{
|
||||
const auto* eventAsset = reinterpret_cast<AZ::Data::Asset<const ScriptEvents::ScriptEventsAsset>*>(instancePointer);
|
||||
if (eventAsset->GetId().IsValid())
|
||||
{
|
||||
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<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();
|
||||
|
||||
for (const AssetBuilderSDK::PlatformInfo& info : request.m_enabledPlatforms)
|
||||
{
|
||||
@@ -222,7 +234,7 @@ namespace ScriptCanvasBuilder
|
||||
bool pathFound = false;
|
||||
AZStd::string relativePath;
|
||||
AzToolsFramework::AssetSystemRequestBus::BroadcastResult
|
||||
(pathFound
|
||||
( pathFound
|
||||
, &AzToolsFramework::AssetSystem::AssetSystemRequest::GetRelativeProductPathFromFullSourceOrProductPath
|
||||
, request.m_fullPath.c_str(), relativePath);
|
||||
|
||||
@@ -272,9 +284,6 @@ namespace ScriptCanvasBuilder
|
||||
assetDataStream->Open(AZStd::move(fileBuffer));
|
||||
}
|
||||
|
||||
AZ::SerializeContext* context{};
|
||||
AZ::ComponentApplicationBus::BroadcastResult(context, &AZ::ComponentApplicationBus::Events::GetSerializeContext);
|
||||
|
||||
AZ::Data::Asset<ScriptCanvasEditor::ScriptCanvasAsset> asset;
|
||||
asset.Create(request.m_sourceFileUUID);
|
||||
if (m_editorAssetHandler->LoadAssetDataFromStream(asset, assetDataStream, nullptr) != AZ::Data::AssetHandler::LoadResult::LoadComplete)
|
||||
@@ -305,13 +314,6 @@ namespace ScriptCanvasBuilder
|
||||
}
|
||||
else
|
||||
{
|
||||
// force load all dependencies into memory
|
||||
for (auto& dependency : m_processEditorAssetDependencies)
|
||||
{
|
||||
auto depAsset = AZ::Data::AssetManager::Instance().GetAsset(dependency.m_assetId, dependency.m_assetType, AZ::Data::AssetLoadBehavior::PreLoad);
|
||||
depAsset.BlockUntilLoadComplete();
|
||||
}
|
||||
|
||||
AZ::Entity* buildEntity = asset.Get()->GetScriptCanvasEntity();
|
||||
|
||||
ProcessTranslationJobInput input;
|
||||
@@ -375,6 +377,8 @@ namespace ScriptCanvasBuilder
|
||||
AZ_Error(s_scriptCanvasBuilder, false, translationOutcome.GetError().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
m_processEditorAssetDependencies.clear();
|
||||
}
|
||||
|
||||
AZ_TracePrintf(s_scriptCanvasBuilder, "Finish Processing Job");
|
||||
|
||||
@@ -93,6 +93,49 @@ namespace ScriptCanvasEditor
|
||||
}
|
||||
}
|
||||
|
||||
AZ::Outcome<void, AZStd::string> LoadScriptCanvasDataFromJson
|
||||
( ScriptCanvas::ScriptCanvasData& dataTarget
|
||||
, AZStd::string_view source
|
||||
, AZ::SerializeContext& serializeContext)
|
||||
{
|
||||
namespace JSRU = AZ::JsonSerializationUtils;
|
||||
using namespace ScriptCanvas;
|
||||
|
||||
AZ::JsonDeserializerSettings settings;
|
||||
settings.m_serializeContext = &serializeContext;
|
||||
settings.m_metadata.Create<SerializationListeners>();
|
||||
|
||||
auto loadResult = JSRU::LoadObjectFromStringByType
|
||||
( &dataTarget
|
||||
, azrtti_typeid<ScriptCanvasData>()
|
||||
, source
|
||||
, &settings);
|
||||
|
||||
if (!loadResult.IsSuccess())
|
||||
{
|
||||
return loadResult;
|
||||
}
|
||||
|
||||
if (auto graphData = dataTarget.ModGraph())
|
||||
{
|
||||
auto listeners = settings.m_metadata.Find<SerializationListeners>();
|
||||
AZ_Assert(listeners, "Failed to find SerializationListeners");
|
||||
|
||||
ScriptCanvasAssetHandlerCpp::CollectNodes(graphData->GetGraphData()->m_nodes, *listeners);
|
||||
|
||||
for (auto listener : *listeners)
|
||||
{
|
||||
listener->OnDeserialize();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return AZ::Failure(AZStd::string("Failed to find graph data after loading source"));
|
||||
}
|
||||
|
||||
return AZ::Success();
|
||||
}
|
||||
|
||||
AZ::Data::AssetHandler::LoadResult ScriptCanvasAssetHandler::LoadAssetData
|
||||
( const AZ::Data::Asset<AZ::Data::AssetData>& assetTarget
|
||||
, AZStd::shared_ptr<AZ::Data::AssetDataStream> streamSource
|
||||
@@ -110,8 +153,9 @@ namespace ScriptCanvasEditor
|
||||
{
|
||||
streamSource->Seek(0U, AZ::IO::GenericStream::ST_SEEK_BEGIN);
|
||||
auto& scriptCanvasDataTarget = scriptCanvasAssetTarget->GetScriptCanvasData();
|
||||
AZStd::vector<AZ::u8> byteBuffer;
|
||||
AZStd::vector<char> byteBuffer;
|
||||
byteBuffer.resize_no_construct(streamSource->GetLength());
|
||||
// this duplicate stream is to allow for trying again if the JSON read fails
|
||||
AZ::IO::ByteContainerStream<decltype(byteBuffer)> byteStreamSource(&byteBuffer);
|
||||
const size_t bytesRead = streamSource->Read(byteBuffer.size(), byteBuffer.data());
|
||||
scriptCanvasDataTarget.m_scriptCanvasEntity.reset(nullptr);
|
||||
@@ -123,47 +167,45 @@ namespace ScriptCanvasEditor
|
||||
settings.m_serializeContext = m_serializeContext;
|
||||
settings.m_metadata.Create<SerializationListeners>();
|
||||
// attempt JSON deserialization...
|
||||
if (JSRU::LoadObjectFromStreamByType
|
||||
( &scriptCanvasDataTarget
|
||||
, azrtti_typeid<ScriptCanvasData>()
|
||||
, byteStreamSource
|
||||
, &settings).IsSuccess())
|
||||
auto jsonResult = LoadScriptCanvasDataFromJson
|
||||
( scriptCanvasDataTarget
|
||||
, AZStd::string_view{ byteBuffer.begin(), byteBuffer.size() }
|
||||
, *m_serializeContext);
|
||||
|
||||
if (jsonResult.IsSuccess())
|
||||
{
|
||||
if (auto graphData = scriptCanvasAssetTarget->GetScriptCanvasGraph()
|
||||
? scriptCanvasAssetTarget->GetScriptCanvasGraph()->GetGraphData()
|
||||
: nullptr)
|
||||
{
|
||||
auto listeners = settings.m_metadata.Find<SerializationListeners>();
|
||||
AZ_Assert(listeners, "Failed to create SerializationListeners");
|
||||
|
||||
ScriptCanvasAssetHandlerCpp::CollectNodes(graphData->m_nodes, *listeners);
|
||||
|
||||
for (auto listener : *listeners)
|
||||
{
|
||||
listener->OnDeserialize();
|
||||
}
|
||||
|
||||
return AZ::Data::AssetHandler::LoadResult::LoadComplete;
|
||||
}
|
||||
else
|
||||
{
|
||||
AZ_Warning("ScriptCanvas", false, "ScriptCanvasAssetHandler::LoadAssetData failed to load graph data from JOSON");
|
||||
}
|
||||
return AZ::Data::AssetHandler::LoadResult::LoadComplete;
|
||||
}
|
||||
#if defined(OBJECT_STREAM_EDITOR_ASSET_LOADING_SUPPORT_ENABLED)////
|
||||
else
|
||||
{// ...if there is a failure, check if it is saved in the old format
|
||||
{
|
||||
// ...if there is a failure, check if it is saved in the old format
|
||||
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)))
|
||||
{
|
||||
AZ_Warning
|
||||
( "ScriptCanvas"
|
||||
, false
|
||||
, "ScriptCanvasAssetHandler::LoadAssetData failed to load graph data from JSON, %s, consider converting to JSON"
|
||||
" by opening it and saving it, or running the graph update tool from the editor0"
|
||||
, jsonResult.GetError().c_str());
|
||||
return AZ::Data::AssetHandler::LoadResult::LoadComplete;
|
||||
}
|
||||
}
|
||||
#else
|
||||
else
|
||||
{
|
||||
AZ_Warning
|
||||
( "ScriptCanvas"
|
||||
, false
|
||||
, "ScriptCanvasAssetHandler::LoadAssetData failed to load graph data from JSON %s"
|
||||
, jsonResult.GetError().c_str()");
|
||||
}
|
||||
#endif//defined(OBJECT_STREAM_EDITOR_ASSET_LOADING_SUPPORT_ENABLED)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3467,11 +3467,12 @@ namespace ScriptCanvasEditor
|
||||
m_focusHelper.SetActiveGraph(GetGraphCanvasGraphId());
|
||||
}
|
||||
|
||||
bool Graph::UpgradeGraph(const AZ::Data::Asset<AZ::Data::AssetData>& asset)
|
||||
bool Graph::UpgradeGraph(const AZ::Data::Asset<AZ::Data::AssetData>& asset, UpgradeRequest request, bool isVerbose)
|
||||
{
|
||||
m_upgradeSM.SetAsset(asset);
|
||||
m_upgradeSM.SetVerbose(isVerbose);
|
||||
|
||||
if (!GetVersion().IsLatest())
|
||||
if (request == UpgradeRequest::Forced || !GetVersion().IsLatest())
|
||||
{
|
||||
m_upgradeSM.Run(Start::StateID());
|
||||
return true;
|
||||
|
||||
@@ -79,7 +79,7 @@ namespace ScriptCanvasEditor
|
||||
{
|
||||
if (node->GetComponents().empty())
|
||||
{
|
||||
AZ_TracePrintf("Script Canvas", "Removing node due to missing components: %s\nVerify that all gems that this script relies on are enabled\n", node->GetName().c_str());
|
||||
AZ_TracePrintf(ScriptCanvas::k_VersionExplorerWindow.data(), "Removing node due to missing components: %s\nVerify that all gems that this script relies on are enabled\n", node->GetName().c_str());
|
||||
|
||||
nodesToRemove.push_back(node);
|
||||
}
|
||||
@@ -193,7 +193,7 @@ namespace ScriptCanvasEditor
|
||||
}
|
||||
else
|
||||
{
|
||||
AZ_Warning("ScriptCanvas", false, "Could not find ScriptCanvas Node with id %llu", static_cast<AZ::u64>(scriptCanvasSourceEndpoint.GetNodeId()));
|
||||
AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "Could not find ScriptCanvas Node with id %llu", static_cast<AZ::u64>(scriptCanvasSourceEndpoint.GetNodeId()));
|
||||
}
|
||||
|
||||
AZ::EntityId graphCanvasSourceSlotId;
|
||||
@@ -213,7 +213,7 @@ namespace ScriptCanvasEditor
|
||||
|
||||
if (!graphCanvasSourceSlotId.IsValid())
|
||||
{
|
||||
AZ_Warning("ScriptCanvas", sm->m_deletedNodes.count(scriptCanvasSourceEndpoint.GetNodeId()) > 0, "Could not create connection(%s) for Node(%s).", connectionId.ToString().c_str(), scriptCanvasSourceEndpoint.GetNodeId().ToString().c_str());
|
||||
AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), sm->m_deletedNodes.count(scriptCanvasSourceEndpoint.GetNodeId()) > 0, "Could not create connection(%s) for Node(%s).", connectionId.ToString().c_str(), scriptCanvasSourceEndpoint.GetNodeId().ToString().c_str());
|
||||
graph->DisconnectById(connectionId);
|
||||
continue;
|
||||
}
|
||||
@@ -229,7 +229,7 @@ namespace ScriptCanvasEditor
|
||||
}
|
||||
else
|
||||
{
|
||||
AZ_Warning("ScriptCanvas", false, "Could not find ScriptCanvas Node with id %llu", static_cast<AZ::u64>(scriptCanvasSourceEndpoint.GetNodeId()));
|
||||
AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "Could not find ScriptCanvas Node with id %llu", static_cast<AZ::u64>(scriptCanvasSourceEndpoint.GetNodeId()));
|
||||
}
|
||||
|
||||
SlotMappingRequestBus::EventResult(graphCanvasTargetEndpoint.m_slotId, graphCanvasTargetEndpoint.GetNodeId(), &SlotMappingRequests::MapToGraphCanvasId, scriptCanvasTargetEndpoint.GetSlotId());
|
||||
@@ -245,7 +245,7 @@ namespace ScriptCanvasEditor
|
||||
|
||||
if (!graphCanvasTargetEndpoint.IsValid())
|
||||
{
|
||||
AZ_Warning("ScriptCanvas", sm->m_deletedNodes.count(scriptCanvasTargetEndpoint.GetNodeId()) > 0, "Could not create connection(%s) for Node(%s).", connectionId.ToString().c_str(), scriptCanvasTargetEndpoint.GetNodeId().ToString().c_str());
|
||||
AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), sm->m_deletedNodes.count(scriptCanvasTargetEndpoint.GetNodeId()) > 0, "Could not create connection(%s) for Node(%s).", connectionId.ToString().c_str(), scriptCanvasTargetEndpoint.GetNodeId().ToString().c_str());
|
||||
graph->DisconnectById(connectionId);
|
||||
continue;
|
||||
}
|
||||
@@ -422,7 +422,7 @@ namespace ScriptCanvasEditor
|
||||
if (!sm->m_updateReport.IsEmpty())
|
||||
{
|
||||
// currently, it is expected that there are no deleted old slots, those need manual correction
|
||||
AZ_Error("ScriptCanvas", sm->m_updateReport.m_deletedOldSlots.empty(), "Graph upgrade path: If old slots are deleted, manual upgrading is required");
|
||||
AZ_Error(ScriptCanvas::k_VersionExplorerWindow.data(), sm->m_updateReport.m_deletedOldSlots.empty(), "Graph upgrade path: If old slots are deleted, manual upgrading is required");
|
||||
UpdateConnectionStatus(*graph, sm->m_updateReport);
|
||||
}
|
||||
}
|
||||
@@ -511,17 +511,19 @@ namespace ScriptCanvasEditor
|
||||
bool saveRawTranslationOuputToFile = ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile;
|
||||
ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = false;
|
||||
|
||||
|
||||
// save parsing status before after, just because it didn't parse after doesn't mean it didn't before
|
||||
graph->Parse(validationResults);
|
||||
|
||||
ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = saveRawTranslationOuputToFile;
|
||||
|
||||
if (validationResults.HasResults())
|
||||
if (validationResults.HasErrors())
|
||||
{
|
||||
AZ::Interface<IUpgradeRequests>::Get()->GraphNeedsManualUpgrade(sm->m_asset.GetId());
|
||||
|
||||
for (auto& err : validationResults.GetEvents())
|
||||
{
|
||||
// Register this graph as needing manual updates
|
||||
AZ::Interface<IUpgradeRequests>::Get()->GraphNeedsManualUpgrade(sm->m_asset.GetId());
|
||||
|
||||
Log("%s: %s\n", err->GetIdentifier().c_str(), err->GetDescription().data());
|
||||
}
|
||||
}
|
||||
@@ -678,6 +680,7 @@ namespace ScriptCanvasEditor
|
||||
if (m_asset != asset)
|
||||
{
|
||||
m_asset = asset;
|
||||
SetDebugPrefix(asset.GetHint());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -690,6 +693,10 @@ namespace ScriptCanvasEditor
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// State Machine Internals
|
||||
bool StateMachine::GetVerbose() const
|
||||
{
|
||||
return m_isVerbose;
|
||||
}
|
||||
|
||||
void StateMachine::OnSystemTick()
|
||||
{
|
||||
@@ -743,7 +750,22 @@ namespace ScriptCanvasEditor
|
||||
|
||||
AZ::SystemTickBus::Handler::BusConnect();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void StateMachine::SetVerbose(bool isVerbose)
|
||||
{
|
||||
m_isVerbose = isVerbose;
|
||||
}
|
||||
|
||||
const AZStd::string& StateMachine::GetDebugPrefix() const
|
||||
{
|
||||
return m_debugPrefix;
|
||||
}
|
||||
|
||||
void StateMachine::SetDebugPrefix(AZStd::string_view prefix)
|
||||
{
|
||||
m_debugPrefix = prefix;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
+6
-1
@@ -20,6 +20,11 @@ namespace AZ
|
||||
|
||||
namespace ScriptCanvasEditor
|
||||
{
|
||||
AZ::Outcome<void, AZStd::string> LoadScriptCanvasDataFromJson
|
||||
( ScriptCanvas::ScriptCanvasData& dataTarget
|
||||
, AZStd::string_view source
|
||||
, AZ::SerializeContext& serializeContext);
|
||||
|
||||
/**
|
||||
* Manages editor Script Canvas graph assets.
|
||||
*/
|
||||
@@ -49,7 +54,7 @@ namespace ScriptCanvasEditor
|
||||
// Called by the asset database to perform actual asset save. Returns true if successful otherwise false (default - as we don't require support save).
|
||||
bool SaveAssetData(const AZ::Data::Asset<AZ::Data::AssetData>& asset, AZ::IO::GenericStream* stream) override;
|
||||
bool SaveAssetData(const ScriptCanvasAsset* assetData, AZ::IO::GenericStream* stream);
|
||||
bool SaveAssetData(const ScriptCanvasAsset* assetData, AZ::IO::GenericStream* stream , AZ::DataStream::StreamType streamType);
|
||||
bool SaveAssetData(const ScriptCanvasAsset* assetData, AZ::IO::GenericStream* stream, AZ::DataStream::StreamType streamType);
|
||||
|
||||
// Called by the asset database when an asset should be deleted.
|
||||
void DestroyAsset(AZ::Data::AssetPtr ptr) override;
|
||||
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <ScriptCanvas/Assets/ScriptCanvasBaseAssetData.h>
|
||||
#include <ScriptCanvas/Components/EditorGraph.h>
|
||||
|
||||
namespace ScriptCanvas
|
||||
{
|
||||
Graph* ScriptCanvasData::ModGraph()
|
||||
{
|
||||
return AZ::EntityUtils::FindFirstDerivedComponent<ScriptCanvas::Graph>(m_scriptCanvasEntity.get());
|
||||
}
|
||||
|
||||
const Graph* ScriptCanvasData::GetGraph() const
|
||||
{
|
||||
return AZ::EntityUtils::FindFirstDerivedComponent<ScriptCanvas::Graph>(m_scriptCanvasEntity.get());
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,10 @@ namespace ScriptCanvas
|
||||
|
||||
AZ::Entity* GetScriptCanvasEntity() const { return m_scriptCanvasEntity.get(); }
|
||||
|
||||
Graph* ModGraph();
|
||||
|
||||
const Graph* GetGraph() const;
|
||||
|
||||
AZStd::unique_ptr<AZ::Entity> m_scriptCanvasEntity;
|
||||
private:
|
||||
ScriptCanvasData(const ScriptCanvasData&) = delete;
|
||||
|
||||
@@ -223,9 +223,9 @@ namespace ScriptCanvasEditor
|
||||
using AssetList = AZStd::list<AZ::Data::AssetInfo>;
|
||||
virtual AssetList& GetAssetsToUpgrade() = 0;
|
||||
|
||||
virtual void ClearGraphsThatNeedUpgrade() = 0;
|
||||
virtual void GraphNeedsManualUpgrade(const AZ::Data::AssetId&) = 0;
|
||||
virtual AZStd::vector<AZ::Data::AssetId>& GetGraphsThatNeedManualUpgrade() = 0;
|
||||
|
||||
virtual const AZStd::vector<AZ::Data::AssetId>& GetGraphsThatNeedManualUpgrade() const = 0;
|
||||
virtual bool IsUpgrading() = 0;
|
||||
virtual void SetIsUpgrading(bool isUpgrading) = 0;
|
||||
};
|
||||
|
||||
@@ -230,7 +230,12 @@ namespace ScriptCanvasEditor
|
||||
|
||||
/////
|
||||
EditorGraphUpgradeMachine m_upgradeSM;
|
||||
bool UpgradeGraph(const AZ::Data::Asset<AZ::Data::AssetData>& asset);
|
||||
enum UpgradeRequest
|
||||
{
|
||||
IfOutOfDate,
|
||||
Forced
|
||||
};
|
||||
bool UpgradeGraph(const AZ::Data::Asset<AZ::Data::AssetData>& asset, UpgradeRequest request, bool isVerbose = true);
|
||||
void ConnectGraphCanvasBuses();
|
||||
void DisconnectGraphCanvasBuses();
|
||||
///////
|
||||
|
||||
@@ -131,8 +131,20 @@ namespace ScriptCanvasEditor
|
||||
|
||||
void OnSystemTick() override;
|
||||
|
||||
bool GetVerbose() const;
|
||||
|
||||
void SetVerbose(bool isVerbose);
|
||||
|
||||
const AZStd::string& GetDebugPrefix() const;
|
||||
|
||||
void SetDebugPrefix(AZStd::string_view);
|
||||
|
||||
AZStd::shared_ptr<IState> m_currentState = nullptr;
|
||||
AZStd::vector<AZStd::shared_ptr<IState>> m_states;
|
||||
|
||||
private:
|
||||
bool m_isVerbose = true;
|
||||
AZStd::string m_debugPrefix;
|
||||
};
|
||||
|
||||
//! This state machine will collect and share a variety of data from the EditorGraph
|
||||
@@ -342,19 +354,22 @@ namespace ScriptCanvasEditor
|
||||
int EvaluateTransition() override;
|
||||
};
|
||||
|
||||
|
||||
template <typename Traits>
|
||||
void ScriptCanvasEditor::State<Traits>::Log(const char* format, ...)
|
||||
{
|
||||
if (m_verbose)
|
||||
{
|
||||
char sBuffer[1024];
|
||||
char sBuffer[2048];
|
||||
va_list ArgList;
|
||||
va_start(ArgList, format);
|
||||
azvsnprintf(sBuffer, sizeof(sBuffer), format, ArgList);
|
||||
sBuffer[sizeof(sBuffer) - 1] = '\0';
|
||||
va_end(ArgList);
|
||||
|
||||
AZ_TracePrintf("Script Canvas", "%s\n", sBuffer);
|
||||
AZ_TracePrintf(ScriptCanvas::k_VersionExplorerWindow.data()
|
||||
, "%s-%s\n"
|
||||
, m_stateMachine->GetDebugPrefix().c_str()
|
||||
, sBuffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
@@ -109,6 +110,11 @@ namespace ScriptCanvasEditor
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// IUpgradeRequests...
|
||||
void ClearGraphsThatNeedUpgrade()
|
||||
{
|
||||
m_assetsThatNeedManualUpgrade.clear();
|
||||
}
|
||||
|
||||
IUpgradeRequests::AssetList& GetAssetsToUpgrade() override
|
||||
{
|
||||
return m_assetsToConvert;
|
||||
@@ -122,7 +128,7 @@ namespace ScriptCanvasEditor
|
||||
}
|
||||
}
|
||||
|
||||
AZStd::vector<AZ::Data::AssetId>& GetGraphsThatNeedManualUpgrade() override
|
||||
const AZStd::vector<AZ::Data::AssetId>& GetGraphsThatNeedManualUpgrade() const override
|
||||
{
|
||||
return m_assetsThatNeedManualUpgrade;
|
||||
}
|
||||
|
||||
@@ -92,7 +92,7 @@ namespace ScriptCanvasEditor
|
||||
|
||||
void UpgradeTool::closeEvent(QCloseEvent* event)
|
||||
{
|
||||
m_keepEditorAlive.reset();
|
||||
// m_keepEditorAlive.reset();
|
||||
|
||||
DisconnectBuses();
|
||||
|
||||
@@ -110,7 +110,7 @@ namespace ScriptCanvasEditor
|
||||
{
|
||||
setWindowFlag(Qt::WindowCloseButtonHint, false);
|
||||
|
||||
m_keepEditorAlive = AZStd::make_unique<EditorKeepAlive>();
|
||||
// m_keepEditorAlive = AZStd::make_unique<EditorKeepAlive>();
|
||||
|
||||
UpdateSettings();
|
||||
|
||||
@@ -581,74 +581,6 @@ namespace ScriptCanvasEditor
|
||||
accept();
|
||||
}
|
||||
|
||||
template <typename AssetType>
|
||||
AZ::Entity* UpgradeGraph(AZ::Data::Asset<AZ::Data::AssetData>& asset, UpgradeTool* upgradeTool)
|
||||
{
|
||||
AssetType* scriptCanvasAsset = asset.GetAs<AssetType>();
|
||||
AZ_Assert(scriptCanvasAsset, "Unable to get the asset of type: %s", azrtti_typeid<AssetType>().template ToString<AZStd::string>().c_str());
|
||||
|
||||
if (!scriptCanvasAsset)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
AZ::Entity* scriptCanvasEntity = scriptCanvasAsset->GetScriptCanvasEntity();
|
||||
AZ_Assert(scriptCanvasEntity, "The Script Canvas asset must have a valid entity");
|
||||
if (!scriptCanvasEntity)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto graphComponent = scriptCanvasEntity->FindComponent<ScriptCanvasEditor::Graph>();
|
||||
AZ_Assert(graphComponent, "The Script Canvas entity must have a Graph component");
|
||||
|
||||
bool isLatest = graphComponent->GetVersion().IsLatest();
|
||||
if (isLatest)
|
||||
{
|
||||
++upgradeTool->SkippedGraphCount();
|
||||
|
||||
// No need to upgrade
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
AZ::Entity* queryEntity = nullptr;
|
||||
AZ::ComponentApplicationBus::BroadcastResult(queryEntity, &AZ::ComponentApplicationRequests::FindEntity, scriptCanvasEntity->GetId());
|
||||
if (queryEntity)
|
||||
{
|
||||
if (queryEntity->GetState() == AZ::Entity::State::Active)
|
||||
{
|
||||
queryEntity->Deactivate();
|
||||
}
|
||||
|
||||
scriptCanvasEntity = queryEntity;
|
||||
}
|
||||
|
||||
if (scriptCanvasEntity->GetState() == AZ::Entity::State::Constructed)
|
||||
{
|
||||
scriptCanvasEntity->Init();
|
||||
}
|
||||
|
||||
if (scriptCanvasEntity->GetState() == AZ::Entity::State::Init)
|
||||
{
|
||||
scriptCanvasEntity->Activate();
|
||||
}
|
||||
|
||||
if (graphComponent)
|
||||
{
|
||||
if (!graphComponent->UpgradeGraph(asset))
|
||||
{
|
||||
++upgradeTool->SkippedGraphCount();
|
||||
}
|
||||
else
|
||||
{
|
||||
++upgradeTool->UpgradedGraphCount();
|
||||
}
|
||||
}
|
||||
|
||||
return scriptCanvasEntity;
|
||||
}
|
||||
|
||||
void UpgradeTool::SaveLog()
|
||||
{
|
||||
AZStd::string outputFileName = AZStd::string::format("@devroot@/ScriptCanvasUpgradeReport.html");
|
||||
@@ -688,29 +620,9 @@ namespace ScriptCanvasEditor
|
||||
outputFile.Close();
|
||||
}
|
||||
|
||||
AZ::Entity* UpgradeTool::AssetUpgradeJob(AZ::Data::Asset<AZ::Data::AssetData>& asset)
|
||||
AZ::Entity* UpgradeTool::AssetUpgradeJob(AZ::Data::Asset<AZ::Data::AssetData>&)
|
||||
{
|
||||
using namespace ScriptCanvasEditor;
|
||||
|
||||
AZ_Assert(asset.IsReady(), "The asset must be ready by now");
|
||||
|
||||
AZStd::lock_guard<AZStd::recursive_mutex> myLocker(m_mutex);
|
||||
|
||||
AZ::Entity* scriptCanvasEntity = nullptr;
|
||||
if (asset.GetType() == azrtti_typeid<ScriptCanvasAsset>())
|
||||
{
|
||||
scriptCanvasEntity = UpgradeGraph<ScriptCanvasAsset>(asset, this);
|
||||
}
|
||||
|
||||
if (!scriptCanvasEntity)
|
||||
{
|
||||
// This may happen if the graph failed or did not need to upgrade
|
||||
AZ_TracePrintf("Script Canvas", "%s .. up to date!\n", asset.GetHint().c_str());
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// The rest will happen when we get notified that the graph is done.
|
||||
return scriptCanvasEntity;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void UpgradeTool::RetryMove(AZ::Data::Asset<AZ::Data::AssetData>& asset, const AZStd::string& source, const AZStd::string& target)
|
||||
@@ -780,28 +692,6 @@ namespace ScriptCanvasEditor
|
||||
return false;
|
||||
}
|
||||
|
||||
ScriptCanvasEditor::EditorKeepAlive::EditorKeepAlive()
|
||||
{
|
||||
ISystem* system = nullptr;
|
||||
CrySystemRequestBus::BroadcastResult(system, &CrySystemRequestBus::Events::GetCrySystem);
|
||||
|
||||
m_edKeepEditorActive = system->GetIConsole()->GetCVar("ed_KeepEditorActive");
|
||||
|
||||
if (m_edKeepEditorActive)
|
||||
{
|
||||
m_keepEditorActive = m_edKeepEditorActive->GetIVal();
|
||||
m_edKeepEditorActive->Set(1);
|
||||
}
|
||||
}
|
||||
|
||||
ScriptCanvasEditor::EditorKeepAlive::~EditorKeepAlive()
|
||||
{
|
||||
if (m_edKeepEditorActive)
|
||||
{
|
||||
m_edKeepEditorActive->Set(m_keepEditorActive);
|
||||
}
|
||||
}
|
||||
|
||||
#include <Editor/View/Windows/Tools/UpgradeTool/moc_UpgradeTool.cpp>
|
||||
|
||||
}
|
||||
|
||||
@@ -38,18 +38,7 @@ namespace Ui
|
||||
|
||||
namespace ScriptCanvasEditor
|
||||
{
|
||||
//! Scoped utility to set and restore the "ed_KeepEditorActive" CVar in order to allow
|
||||
//! the upgrade tool to work even if the editor is not in the foreground
|
||||
class EditorKeepAlive
|
||||
{
|
||||
public:
|
||||
EditorKeepAlive();
|
||||
~EditorKeepAlive();
|
||||
|
||||
private:
|
||||
int m_keepEditorActive;
|
||||
ICVar* m_edKeepEditorActive;
|
||||
};
|
||||
class KeepEditorAlive;
|
||||
|
||||
//! A tool that collects and upgrades all Script Canvas graphs in the asset catalog
|
||||
class UpgradeTool
|
||||
@@ -140,7 +129,7 @@ namespace ScriptCanvasEditor
|
||||
AZStd::unique_ptr<Ui::UpgradeTool> m_ui;
|
||||
AZStd::recursive_mutex m_mutex;
|
||||
|
||||
AZStd::unique_ptr<EditorKeepAlive> m_keepEditorAlive;
|
||||
// AZStd::unique_ptr<EditorKeepAlive> m_keepEditorAlive;
|
||||
|
||||
AZStd::vector<AZStd::string> m_logs;
|
||||
|
||||
|
||||
+408
-332
File diff suppressed because it is too large
Load Diff
@@ -20,11 +20,11 @@ AZ_POP_DISABLE_WARNING
|
||||
#include <AzQtComponents/Components/StyledDialog.h>
|
||||
|
||||
#include <ScriptCanvas/Bus/EditorScriptCanvasBus.h>
|
||||
#include <ScriptCanvas/Core/Core.h>
|
||||
|
||||
#include <ISystem.h>
|
||||
#include <IConsole.h>
|
||||
#include <AzCore/Debug/TraceMessageBus.h>
|
||||
#include "UpgradeTool.h"
|
||||
#endif
|
||||
|
||||
class QPushButton;
|
||||
@@ -41,6 +41,19 @@ namespace AzQtComponents
|
||||
|
||||
namespace ScriptCanvasEditor
|
||||
{
|
||||
//! Scoped utility to set and restore the "ed_KeepEditorActive" CVar in order to allow
|
||||
//! the upgrade tool to work even if the editor is not in the foreground
|
||||
class EditorKeepAlive
|
||||
{
|
||||
public:
|
||||
EditorKeepAlive();
|
||||
~EditorKeepAlive();
|
||||
|
||||
private:
|
||||
int m_keepEditorActive;
|
||||
ICVar* m_edKeepEditorActive;
|
||||
};
|
||||
|
||||
//! A tool that collects and upgrades all Script Canvas graphs in the asset catalog
|
||||
class VersionExplorer
|
||||
: public AzQtComponents::StyledDialog
|
||||
@@ -71,14 +84,10 @@ namespace ScriptCanvasEditor
|
||||
Inactive,
|
||||
Backup,
|
||||
Scan,
|
||||
Upgrade
|
||||
Upgrade,
|
||||
};
|
||||
ProcessState m_state = ProcessState::Inactive;
|
||||
|
||||
bool DoBackup();
|
||||
void BackupAsset(const AZ::Data::AssetInfo& assetInfo);
|
||||
void BackupComplete();
|
||||
|
||||
void DoScan();
|
||||
void ScanComplete(const AZ::Data::Asset<AZ::Data::AssetData>&);
|
||||
|
||||
@@ -97,24 +106,21 @@ namespace ScriptCanvasEditor
|
||||
bool OnPreWarning(const char* /*window*/, const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* /*message*/) override;
|
||||
//
|
||||
|
||||
void CaptureLogFromTraceBus(const char* window, const char* message);
|
||||
bool CaptureLogFromTraceBus(const char* window, const char* message);
|
||||
|
||||
enum class OperationResult
|
||||
{
|
||||
Success,
|
||||
SkipBackup,
|
||||
BackupSuccess,
|
||||
BackupFail,
|
||||
BackupFail_CreateFolder,
|
||||
BackupFail_FileNotFound
|
||||
Failure,
|
||||
};
|
||||
|
||||
void GraphUpgradeComplete(const AZ::Data::Asset<AZ::Data::AssetData>&, OperationResult result = OperationResult::Success);
|
||||
void GraphUpgradeComplete(const AZ::Data::Asset<AZ::Data::AssetData>, OperationResult result, AZStd::string_view message);
|
||||
|
||||
bool IsUpgrading() const;
|
||||
|
||||
bool m_inProgress = false;
|
||||
size_t m_currentAssetIndex = 0;
|
||||
// scan fields
|
||||
size_t m_currentAssetRowIndex = 0;
|
||||
size_t m_inspectedAssets = 0;
|
||||
size_t m_failedAssets = 0;
|
||||
size_t m_discoveredAssets = 0;
|
||||
@@ -129,7 +135,16 @@ namespace ScriptCanvasEditor
|
||||
|
||||
AZStd::unique_ptr<Ui::VersionExplorer> m_ui;
|
||||
|
||||
AZStd::unique_ptr<ScriptCanvas::Grammar::SettingsCache> m_settingsCache;
|
||||
|
||||
// upgrade fields
|
||||
AZStd::recursive_mutex m_mutex;
|
||||
bool m_upgradeComplete = false;
|
||||
AZ::Data::Asset<AZ::Data::AssetData> m_upgradeAsset;
|
||||
int m_upgradeAssetIndex = 0;
|
||||
OperationResult m_upgradeResult;
|
||||
AZStd::string m_upgradeMessage;
|
||||
AZStd::string m_tmpFileName;
|
||||
|
||||
AZStd::unique_ptr<EditorKeepAlive> m_keepEditorAlive;
|
||||
|
||||
@@ -146,18 +161,19 @@ namespace ScriptCanvasEditor
|
||||
void FinalizeUpgrade();
|
||||
void FinalizeScan();
|
||||
|
||||
OperationResult BackupGraph(const AZ::Data::Asset<AZ::Data::AssetData>&);
|
||||
void BackupComplete();
|
||||
AZStd::string BackupGraph(const AZ::Data::Asset<AZ::Data::AssetData>&);
|
||||
void UpgradeGraph(const AZ::Data::Asset<AZ::Data::AssetData>&);
|
||||
|
||||
void RetryMove(const AZ::Data::Asset<AZ::Data::AssetData>& asset, const AZStd::string& source, const AZStd::string& target);
|
||||
|
||||
void GraphUpgradeCompleteUIUpdate(const AZ::Data::Asset<AZ::Data::AssetData>& asset, OperationResult result = OperationResult::Success);
|
||||
void GraphUpgradeCompleteUIUpdate(const AZ::Data::Asset<AZ::Data::AssetData> asset, OperationResult result, AZStd::string_view message);
|
||||
void OnGraphUpgradeComplete(AZ::Data::Asset<AZ::Data::AssetData>&, bool skipped = false) override;
|
||||
|
||||
void OnSourceFileReleased(AZ::Data::Asset<AZ::Data::AssetData> asset);
|
||||
|
||||
void closeEvent(QCloseEvent* event) override;
|
||||
|
||||
bool m_overwriteAll = false;
|
||||
void PerformMove(AZ::Data::Asset<AZ::Data::AssetData>& asset, const AZStd::string& source, const AZStd::string& target);
|
||||
void PerformMove(AZ::Data::Asset<AZ::Data::AssetData> asset, AZStd::string source, AZStd::string target, size_t remainingAttempts);
|
||||
|
||||
void Log(const char* format, ...);
|
||||
};
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>747</width>
|
||||
<height>687</height>
|
||||
<width>1363</width>
|
||||
<height>770</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
@@ -261,10 +261,10 @@
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="verticalScrollBarPolicy">
|
||||
<enum>Qt::ScrollBarAlwaysOn</enum>
|
||||
</property>
|
||||
<property name="readOnly">
|
||||
<property name="verticalScrollBarPolicy">
|
||||
<enum>Qt::ScrollBarAlwaysOn</enum>
|
||||
</property>
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
@@ -273,6 +273,16 @@
|
||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="5" column="0">
|
||||
<widget class="QCheckBox" name="makeBackupCheckbox">
|
||||
<property name="text">
|
||||
<string>Backup before upgrade</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="2">
|
||||
<widget class="QPushButton" name="scanButton">
|
||||
<property name="sizePolicy">
|
||||
@@ -311,36 +321,16 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="QCheckBox" name="onlyShowOutdated">
|
||||
<item row="5" column="7">
|
||||
<widget class="QCheckBox" name="verbose">
|
||||
<property name="text">
|
||||
<string>Only show outdated graphs</string>
|
||||
<string>Verbose</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="6">
|
||||
<widget class="QCheckBox" name="forceUpgrade">
|
||||
<property name="text">
|
||||
<string>Force Upgrade</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="7">
|
||||
<widget class="QCheckBox" name="verbose">
|
||||
<property name="text">
|
||||
<string>Verbose</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="4">
|
||||
<widget class="QPushButton" name="closeButton">
|
||||
<property name="sizePolicy">
|
||||
@@ -354,16 +344,36 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QCheckBox" name="makeBackupCheckbox">
|
||||
<item row="5" column="1">
|
||||
<widget class="QCheckBox" name="onlyShowOutdated">
|
||||
<property name="text">
|
||||
<string>Backup before upgrade</string>
|
||||
<string>Only show outdated graphs</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="6">
|
||||
<widget class="QCheckBox" name="forceUpgrade">
|
||||
<property name="text">
|
||||
<string>Force Upgrade</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="8">
|
||||
<widget class="QCheckBox" name="updateReportingOnly">
|
||||
<property name="text">
|
||||
<string>Update Reporting Only</string>
|
||||
</property>
|
||||
<property name="tristate">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
|
||||
@@ -135,8 +135,19 @@ namespace ScriptCanvas
|
||||
if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
|
||||
{
|
||||
serializeContext->Class<VersionData>()
|
||||
->Version(2, [](AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement)
|
||||
{
|
||||
if (classElement.GetVersion() < 2)
|
||||
{
|
||||
FileVersion fileVersion = ScriptCanvas::FileVersion::Initial;
|
||||
classElement.AddElementWithData(context, "_fileVersion", fileVersion);
|
||||
}
|
||||
|
||||
return true;
|
||||
})
|
||||
->Field("_grammarVersion", &VersionData::grammarVersion)
|
||||
->Field("_runtimeVersion", &VersionData::runtimeVersion)
|
||||
->Field("_fileVersion", &VersionData::fileVersion)
|
||||
;
|
||||
}
|
||||
}
|
||||
@@ -152,6 +163,7 @@ namespace ScriptCanvas
|
||||
{
|
||||
grammarVersion = GrammarVersion::Current;
|
||||
runtimeVersion = RuntimeVersion::Current;
|
||||
fileVersion = FileVersion::Current;
|
||||
}
|
||||
|
||||
void ReflectEventTypeOnDemand(const AZ::TypeId& typeId, AZStd::string_view name, AZ::IRttiHelper* rttiHelper)
|
||||
|
||||
@@ -57,6 +57,8 @@ namespace ScriptCanvas
|
||||
constexpr const char* k_OnVariableWriteEventName = "OnVariableValueChanged";
|
||||
constexpr const char* k_OnVariableWriteEbusName = "VariableNotification";
|
||||
|
||||
constexpr const AZStd::string_view k_VersionExplorerWindow = "VersionExplorerWindow";
|
||||
|
||||
class Node;
|
||||
class Edge;
|
||||
|
||||
@@ -69,6 +71,13 @@ namespace ScriptCanvas
|
||||
using NodePtrList = AZStd::vector<Node*>;
|
||||
using NodePtrConstList = AZStd::vector<const Node*>;
|
||||
|
||||
enum class PropertyStatus : AZ::u8
|
||||
{
|
||||
Getter,
|
||||
None,
|
||||
Setter,
|
||||
};
|
||||
|
||||
enum class GrammarVersion : int
|
||||
{
|
||||
Initial = -1,
|
||||
@@ -87,11 +96,13 @@ namespace ScriptCanvas
|
||||
Current,
|
||||
};
|
||||
|
||||
enum class PropertyStatus : AZ::u8
|
||||
enum class FileVersion : int
|
||||
{
|
||||
Getter,
|
||||
None,
|
||||
Setter,
|
||||
Initial = -1,
|
||||
JSON = 0,
|
||||
|
||||
// add new entries above
|
||||
Current,
|
||||
};
|
||||
|
||||
struct VersionData
|
||||
@@ -104,10 +115,13 @@ namespace ScriptCanvas
|
||||
|
||||
GrammarVersion grammarVersion = GrammarVersion::Initial;
|
||||
RuntimeVersion runtimeVersion = RuntimeVersion::Initial;
|
||||
FileVersion fileVersion = FileVersion::Initial;
|
||||
|
||||
bool operator == (const VersionData& rhs) const
|
||||
{
|
||||
return grammarVersion == rhs.grammarVersion && runtimeVersion == rhs.runtimeVersion;
|
||||
return grammarVersion == rhs.grammarVersion
|
||||
&& runtimeVersion == rhs.runtimeVersion
|
||||
&& fileVersion == rhs.fileVersion;
|
||||
}
|
||||
|
||||
bool IsLatest() const
|
||||
|
||||
@@ -17,5 +17,23 @@ namespace ScriptCanvas
|
||||
AZ_CVAR(bool, g_printAbstractCodeModelAtPrefabTime, false, {}, AZ::ConsoleFunctorFlags::Null, "Print out the Abstract Code Model at the end of parsing (at prefab time) for debug purposes.");
|
||||
AZ_CVAR(bool, g_saveRawTranslationOuputToFile, true, {}, AZ::ConsoleFunctorFlags::Null, "Save out the raw result of translation for debug purposes.");
|
||||
AZ_CVAR(bool, g_saveRawTranslationOuputToFileAtPrefabTime, false, {}, AZ::ConsoleFunctorFlags::Null, "Save out the raw result of translation (at prefab time) for debug purposes.");
|
||||
|
||||
SettingsCache::SettingsCache()
|
||||
{
|
||||
m_disableParseOnGraphValidation = g_disableParseOnGraphValidation;
|
||||
m_printAbstractCodeModel = g_printAbstractCodeModel;
|
||||
m_printAbstractCodeModelAtPrefabTime = g_printAbstractCodeModelAtPrefabTime;
|
||||
m_saveRawTranslationOuputToFile = g_saveRawTranslationOuputToFile;
|
||||
m_saveRawTranslationOuputToFileAtPrefabTime = g_saveRawTranslationOuputToFileAtPrefabTime;
|
||||
}
|
||||
|
||||
SettingsCache::~SettingsCache()
|
||||
{
|
||||
g_disableParseOnGraphValidation = m_disableParseOnGraphValidation;
|
||||
g_printAbstractCodeModel = m_printAbstractCodeModel;
|
||||
g_printAbstractCodeModelAtPrefabTime = m_printAbstractCodeModelAtPrefabTime;
|
||||
g_saveRawTranslationOuputToFile = m_saveRawTranslationOuputToFile;
|
||||
g_saveRawTranslationOuputToFileAtPrefabTime = m_saveRawTranslationOuputToFileAtPrefabTime;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -248,6 +248,22 @@ namespace ScriptCanvas
|
||||
AZ_CVAR_EXTERNED(bool, g_saveRawTranslationOuputToFile);
|
||||
AZ_CVAR_EXTERNED(bool, g_saveRawTranslationOuputToFileAtPrefabTime);
|
||||
|
||||
class SettingsCache
|
||||
{
|
||||
public:
|
||||
AZ_CLASS_ALLOCATOR(SettingsCache, AZ::SystemAllocator, 0);
|
||||
|
||||
SettingsCache();
|
||||
~SettingsCache();
|
||||
|
||||
private:
|
||||
bool m_disableParseOnGraphValidation;
|
||||
bool m_printAbstractCodeModel;
|
||||
bool m_printAbstractCodeModelAtPrefabTime;
|
||||
bool m_saveRawTranslationOuputToFile;
|
||||
bool m_saveRawTranslationOuputToFileAtPrefabTime;
|
||||
};
|
||||
|
||||
struct DependencyInfo
|
||||
{
|
||||
AZ::Data::AssetId assetId;
|
||||
|
||||
@@ -681,6 +681,13 @@ namespace ScriptCanvas
|
||||
outType = eventType;
|
||||
return true;
|
||||
}
|
||||
|
||||
AZ_Warning("Script Canvas"
|
||||
, !m_warnOnMissingFunction
|
||||
, "Could not find event: %s, in bus: %s, anywhere in BehaviorContext"
|
||||
, methodName.c_str()
|
||||
, m_className.c_str());
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -693,6 +700,12 @@ namespace ScriptCanvas
|
||||
outType = EventType::Count;
|
||||
return true;
|
||||
}
|
||||
|
||||
AZ_Warning("Script Canvas"
|
||||
, !m_warnOnMissingFunction
|
||||
, "Could not find free method: %s anywhere in BehaviorContext"
|
||||
, methodName.c_str());
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -709,15 +722,27 @@ namespace ScriptCanvas
|
||||
outType = EventType::Count;
|
||||
return true;
|
||||
}
|
||||
|
||||
AZ_Warning("Script Canvas"
|
||||
, !m_warnOnMissingFunction
|
||||
, "Could not find method or property: %s in class %s: , anywhere in BehaviorContext"
|
||||
, methodName.c_str()
|
||||
, m_className.c_str());
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
AZ_Warning("Script Canvas", !m_warnOnMissingFunction, "unsupported method type in method");
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
AZ_Warning("Script Canvas"
|
||||
, !m_warnOnMissingFunction
|
||||
, "Could not find overloaded method: %s, class or event name: %s, anywhere in BehaviorContext"
|
||||
, methodName.c_str()
|
||||
, m_className.c_str());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -353,7 +353,7 @@ namespace ScriptCanvas
|
||||
|
||||
AZStd::optional<size_t> ReceiveScriptEvent::GetEventIndex(AZStd::string eventName) const
|
||||
{
|
||||
return m_handler->GetFunctionIndex(eventName.c_str());;
|
||||
return m_handler ? AZStd::optional<size_t>(m_handler->GetFunctionIndex(eventName.c_str())) : AZStd::nullopt;
|
||||
}
|
||||
|
||||
AZStd::vector<SlotId> ReceiveScriptEvent::GetEventSlotIds() const
|
||||
@@ -556,29 +556,6 @@ namespace ScriptCanvas
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ReceiveScriptEvent::SetupHandler()
|
||||
{
|
||||
if (!m_handler)
|
||||
{
|
||||
if (!m_asset.IsReady() && m_scriptEventAssetId.IsValid())
|
||||
{
|
||||
m_asset = AZ::Data::AssetManager::Instance().GetAsset<ScriptEvents::ScriptEventsAsset>(m_scriptEventAssetId, AZ::Data::AssetLoadBehavior::PreLoad);
|
||||
m_asset.BlockUntilLoadComplete();
|
||||
CreateHandler(m_asset);
|
||||
CreateEbus();
|
||||
}
|
||||
|
||||
if (!m_handler)
|
||||
{
|
||||
AZStd::string error = AZStd::string::format("Script Event receiver node was not initialized (%s)!", m_definition.GetName().c_str());
|
||||
SCRIPTCANVAS_REPORT_ERROR((*this), error.c_str());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ReceiveScriptEvent::IsOutOfDate(const VersionData& graphVersion) const
|
||||
{
|
||||
AZ_UNUSED(graphVersion);
|
||||
|
||||
@@ -88,7 +88,6 @@ namespace ScriptCanvas
|
||||
private:
|
||||
|
||||
bool CreateEbus();
|
||||
bool SetupHandler();
|
||||
|
||||
AZ::BehaviorEBusHandler* m_handler = nullptr;
|
||||
AZ::BehaviorEBus* m_ebus = nullptr;
|
||||
|
||||
@@ -125,7 +125,7 @@ namespace AZ
|
||||
{
|
||||
listeners->push_back(outputDatum);
|
||||
}
|
||||
|
||||
|
||||
return context.Report(result, result.GetProcessing() != JSR::Processing::Halted
|
||||
? "DatumSerializer Load finished loading Datum"
|
||||
: "DatumSerializer Load failed to load Datum");
|
||||
@@ -145,13 +145,13 @@ namespace AZ
|
||||
|
||||
auto inputScriptDataPtr = reinterpret_cast<const Datum*>(inputValue);
|
||||
auto defaultScriptDataPtr = reinterpret_cast<const Datum*>(defaultValue);
|
||||
|
||||
|
||||
if (defaultScriptDataPtr)
|
||||
{
|
||||
if (*inputScriptDataPtr == *defaultScriptDataPtr)
|
||||
{
|
||||
return context.Report
|
||||
( JSR::Tasks::WriteValue, JSR::Outcomes::DefaultsUsed, "DatumSerializer Store used defaults for Datum");
|
||||
(JSR::Tasks::WriteValue, JSR::Outcomes::DefaultsUsed, "DatumSerializer Store used defaults for Datum");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,8 @@ set(FILES
|
||||
Editor/Assets/ScriptCanvasAssetHelpers.h
|
||||
Editor/Assets/ScriptCanvasAssetHelpers.cpp
|
||||
Editor/Assets/ScriptCanvasAssetTrackerDefinitions.h
|
||||
Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.h
|
||||
Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.cpp
|
||||
Editor/Include/ScriptCanvas/Assets/ScriptCanvasAsset.h
|
||||
Editor/Assets/ScriptCanvasAsset.cpp
|
||||
Editor/Include/ScriptCanvas/Assets/ScriptCanvasAssetBus.h
|
||||
|
||||
-1396
File diff suppressed because it is too large
Load Diff
-1331
File diff suppressed because it is too large
Load Diff
@@ -77,6 +77,7 @@ ly_add_target(
|
||||
|
||||
# By default, the above module is used only in tools:
|
||||
ly_create_alias(NAME ScriptCanvasTesting.Tools NAMESPACE Gem TARGETS Gem::ScriptCanvasTesting.Editor)
|
||||
ly_create_alias(NAME ScriptCanvasTesting.Builders NAMESPACE Gem TARGETS Gem::ScriptCanvasTesting.Editor)
|
||||
|
||||
################################################################################
|
||||
# Tests
|
||||
|
||||
@@ -367,11 +367,6 @@ TEST_F(ScriptCanvasTestFixture, InterpretedMultipleOutDataFlowParseError)
|
||||
ExpectParseError("LY_SC_UnitTest_MultipleOutDataFlowParseError");
|
||||
}
|
||||
|
||||
TEST_F(ScriptCanvasTestFixture, InterpretedSimultaneousDataInputError)
|
||||
{
|
||||
ExpectParseError("LY_SC_UnitTest_SimultaneousDataInputError");
|
||||
}
|
||||
|
||||
TEST_F(ScriptCanvasTestFixture, InterpretedAnyAsTailNoOp)
|
||||
{
|
||||
RunUnitTestGraph("LY_SC_UnitTest_AnyAsTailNoOp");
|
||||
|
||||
Reference in New Issue
Block a user