From a5a42e3268dd3888327630615cf4c8f3cf82e3d8 Mon Sep 17 00:00:00 2001 From: carlitosan <82187351+carlitosan@users.noreply.github.com> Date: Tue, 30 Nov 2021 14:05:31 -0800 Subject: [PATCH 1/7] Add dialog window for messaging when SC assets fail to save Signed-off-by: carlitosan <82187351+carlitosan@users.noreply.github.com> --- .../Code/Editor/View/Windows/MainWindow.cpp | 60 ++++++++++++++++++- .../Code/Editor/View/Windows/MainWindow.h | 10 +++- 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp index e61b015aae..778ad9d5b7 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp @@ -914,6 +914,12 @@ namespace ScriptCanvasEditor void MainWindow::closeEvent(QCloseEvent* event) { + if (m_forceCloseInProgress) + { + event->accept(); + return; + } + // If we are in the middle of saving a graph. We don't want to close ourselves down and potentially retrigger the saving logic. if (m_queueCloseRequest) { @@ -1981,6 +1987,7 @@ namespace ScriptCanvasEditor EnableAssetView(memoryAsset); + ClearSaveAttempt(); UnblockCloseRequests(); } @@ -1992,6 +1999,7 @@ namespace ScriptCanvasEditor void MainWindow::SaveAsset(AZ::Data::AssetId assetId, const Callbacks::OnSave& onSave) { + MarkSaveAttempt(); PrepareAssetForSave(assetId); auto onSaveCallback = [this, onSave](bool saveSuccess, AZ::Data::AssetPtr asset, AZ::Data::AssetId previousAssetId) @@ -2020,6 +2028,7 @@ namespace ScriptCanvasEditor void MainWindow::SaveNewAsset(AZStd::string_view path, AZ::Data::AssetId inMemoryAssetId, const Callbacks::OnSave& onSave) { + MarkSaveAttempt(); PrepareAssetForSave(inMemoryAssetId); auto onSaveCallback = [this, onSave](bool saveSuccess, AZ::Data::AssetPtr asset, AZ::Data::AssetId previousAssetId) @@ -4213,6 +4222,11 @@ namespace ScriptCanvasEditor void MainWindow::OnSystemTick() { + if (m_saveAttemptInProgress) + { + EvaluateSaveAttempt(); + } + if (HasSystemTickAction(SystemTickActionFlag::RefreshPropertyGrid)) { RemoveSystemTickAction(SystemTickActionFlag::RefreshPropertyGrid); @@ -4246,13 +4260,56 @@ namespace ScriptCanvasEditor RemoveSystemTickAction(SystemTickActionFlag::CloseNextTabAction); CloseNextTab(); } + } - if (m_systemTickActions == 0) + void MainWindow::ClearSaveAttempt() + { + m_saveAttemptInProgress = false; + + if (!m_systemTickActions) { AZ::SystemTickBus::Handler::BusDisconnect(); } } + bool MainWindow::EvaluateSaveAttempt() + { + const AZ::s64 k_saveAttemptSeconds = 20; + + if (m_saveAttemptInProgress) + { + auto saveDuration = AZStd::chrono::seconds(AZStd::chrono::system_clock::now() - m_saveAttemptTime).count(); + + if (saveDuration > k_saveAttemptSeconds) + { + WarnOnFailedSaveAttempt(); + } + } + + return m_forceCloseInProgress; + } + + void MainWindow::MarkSaveAttempt() + { + m_saveAttemptInProgress = true; + m_saveAttemptTime = AZStd::chrono::system_clock::now(); + + if (!AZ::SystemTickBus::Handler::BusIsConnected()) + { + AZ::SystemTickBus::Handler::BusConnect(); + } + } + + void MainWindow::WarnOnFailedSaveAttempt() + { + m_forceCloseInProgress = true; + QMessageBox::critical(this, QString(), QObject::tr + ("The ScriptCanvas Editor has encountered an external bug which prevents it from tracking the file state.

" + "Likely the Asset Processor has crashed. ScriptCanvas files may have saved successfully, but the O3DE Engine and Asset Processor should be restarted before continuing work.")); + AZ::SystemTickBus::Handler::BusDisconnect(); + qobject_cast(parent())->close(); + } + void MainWindow::OnCommandStarted(AZ::Crc32) { PushPreventUndoStateUpdate(); @@ -4486,7 +4543,6 @@ namespace ScriptCanvasEditor { AZ::SystemTickBus::Handler::BusConnect(); } - m_systemTickActions |= action; } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h index 7672f0a199..d73da41219 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h @@ -51,7 +51,7 @@ #include #include - +//#include #include #if SCRIPTCANVAS_EDITOR @@ -798,5 +798,13 @@ namespace ScriptCanvasEditor Workspace* m_workspace; void OnSaveCallback(bool saveSuccess, AZ::Data::AssetPtr, AZ::Data::AssetId previousFileAssetId); + + bool m_saveAttemptInProgress = false; + bool m_forceCloseInProgress = false; + AZStd::chrono::system_clock::time_point m_saveAttemptTime; + void ClearSaveAttempt(); + bool EvaluateSaveAttempt(); + void MarkSaveAttempt(); + void WarnOnFailedSaveAttempt(); }; } From 850d36130efb5571a63c14255554927333af971b Mon Sep 17 00:00:00 2001 From: carlitosan <82187351+carlitosan@users.noreply.github.com> Date: Tue, 30 Nov 2021 15:02:06 -0800 Subject: [PATCH 2/7] update error window message and add AP launch request Signed-off-by: carlitosan <82187351+carlitosan@users.noreply.github.com> --- .../Code/Editor/View/Windows/MainWindow.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp index 778ad9d5b7..ee36fc4212 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp @@ -154,6 +154,7 @@ #include #include +#include namespace ScriptCanvasEditor { @@ -4305,9 +4306,14 @@ namespace ScriptCanvasEditor m_forceCloseInProgress = true; QMessageBox::critical(this, QString(), QObject::tr ("The ScriptCanvas Editor has encountered an external bug which prevents it from tracking the file state.

" - "Likely the Asset Processor has crashed. ScriptCanvas files may have saved successfully, but the O3DE Engine and Asset Processor should be restarted before continuing work.")); + "The ScriptCanvas files in the process of being saved may have saved successfully.

Closing this window will close " + "the ScriptCanvas Editor, and request a launch of the Asset Processor.
" + "Verify that the Asset Processor or is running before launching the ScriptCanvas Editor again.
" + "The status of the Asset Processor can be monitored from the O3DE Editor in the bottom-right corner of the status bar.")); + + AzFramework::AssetSystem::LaunchAssetProcessor(); AZ::SystemTickBus::Handler::BusDisconnect(); - qobject_cast(parent())->close(); + AzToolsFramework::CloseViewPane(LyViewPane::ScriptCanvas); } void MainWindow::OnCommandStarted(AZ::Crc32) From 9e725da597c5a1681d1da73f7d10d2455bed8c7c Mon Sep 17 00:00:00 2001 From: carlitosan <82187351+carlitosan@users.noreply.github.com> Date: Tue, 30 Nov 2021 15:30:42 -0800 Subject: [PATCH 3/7] removed commented out include Signed-off-by: carlitosan <82187351+carlitosan@users.noreply.github.com> --- Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h index d73da41219..8d84ece968 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h @@ -51,7 +51,6 @@ #include #include -//#include #include #if SCRIPTCANVAS_EDITOR From a359244c51f85d6d8894b3874cd15c08838388bd Mon Sep 17 00:00:00 2001 From: carlitosan <82187351+carlitosan@users.noreply.github.com> Date: Tue, 30 Nov 2021 17:18:27 -0800 Subject: [PATCH 4/7] add pane close to system tick bus Signed-off-by: carlitosan <82187351+carlitosan@users.noreply.github.com> --- .../ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp index ee36fc4212..4a20c6bc0d 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp @@ -4275,13 +4275,13 @@ namespace ScriptCanvasEditor bool MainWindow::EvaluateSaveAttempt() { - const AZ::s64 k_saveAttemptSeconds = 20; + const AZ::s64 SaveAttemptSeconds = 20; if (m_saveAttemptInProgress) { auto saveDuration = AZStd::chrono::seconds(AZStd::chrono::system_clock::now() - m_saveAttemptTime).count(); - if (saveDuration > k_saveAttemptSeconds) + if (saveDuration > SaveAttemptSeconds) { WarnOnFailedSaveAttempt(); } @@ -4313,7 +4313,10 @@ namespace ScriptCanvasEditor AzFramework::AssetSystem::LaunchAssetProcessor(); AZ::SystemTickBus::Handler::BusDisconnect(); - AzToolsFramework::CloseViewPane(LyViewPane::ScriptCanvas); + AZ::SystemTickBus::QueueFunction([]() + { + AzToolsFramework::CloseViewPane(LyViewPane::ScriptCanvas); + }); } void MainWindow::OnCommandStarted(AZ::Crc32) From b70545ad94e35203170985dc8e2d864ecfb993e6 Mon Sep 17 00:00:00 2001 From: carlitosan <82187351+carlitosan@users.noreply.github.com> Date: Thu, 2 Dec 2021 16:07:50 -0800 Subject: [PATCH 5/7] ScriptCanvas --> Script Canvas in comments Signed-off-by: carlitosan <82187351+carlitosan@users.noreply.github.com> --- Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp index 4a20c6bc0d..999afd7a9d 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp @@ -4305,10 +4305,10 @@ namespace ScriptCanvasEditor { m_forceCloseInProgress = true; QMessageBox::critical(this, QString(), QObject::tr - ("The ScriptCanvas Editor has encountered an external bug which prevents it from tracking the file state.

" - "The ScriptCanvas files in the process of being saved may have saved successfully.

Closing this window will close " - "the ScriptCanvas Editor, and request a launch of the Asset Processor.
" - "Verify that the Asset Processor or is running before launching the ScriptCanvas Editor again.
" + ("The Script Canvas Editor has encountered an external bug which prevents it from tracking the file state.

" + "The Script Canvas files in the process of being saved may have saved successfully.

Closing this window will close " + "the Script Canvas Editor, and request a launch of the Asset Processor.
" + "Verify that the Asset Processor is running before launching the Script Canvas Editor again.
" "The status of the Asset Processor can be monitored from the O3DE Editor in the bottom-right corner of the status bar.")); AzFramework::AssetSystem::LaunchAssetProcessor(); From 766de68199203ad3095a711a6e1f6b180ac0aca4 Mon Sep 17 00:00:00 2001 From: carlitosan <82187351+carlitosan@users.noreply.github.com> Date: Wed, 8 Dec 2021 22:54:21 -0800 Subject: [PATCH 6/7] small fixes for SC play in editor and warnings Signed-off-by: carlitosan <82187351+carlitosan@users.noreply.github.com> --- .../Components/EditorScriptCanvasComponent.cpp | 10 ---------- .../Components/EditorScriptCanvasComponent.h | 4 +--- Gems/ScriptCanvas/Code/Editor/SystemComponent.cpp | 13 ++++++++++++- Gems/ScriptCanvas/Code/Editor/SystemComponent.h | 10 +++++++++- .../Code/Include/ScriptCanvas/Core/Graph.cpp | 15 ++++++++++++++- 5 files changed, 36 insertions(+), 16 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp b/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp index 043e034062..a0e0868422 100644 --- a/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Components/EditorScriptCanvasComponent.cpp @@ -475,16 +475,6 @@ namespace ScriptCanvasEditor AzToolsFramework::ToolsApplicationNotificationBus::Broadcast(&AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_EntireTree_NewContent); } - void EditorScriptCanvasComponent::OnStartPlayInEditor() - { - ScriptCanvas::Execution::PerformanceStatisticsEBus::Broadcast(&ScriptCanvas::Execution::PerformanceStatisticsBus::ClearSnaphotStatistics); - } - - void EditorScriptCanvasComponent::OnStopPlayInEditor() - { - AZ::ScriptSystemRequestBus::Broadcast(&AZ::ScriptSystemRequests::GarbageCollect); - } - void EditorScriptCanvasComponent::SetAssetId(const AZ::Data::AssetId& assetId) { if (m_scriptCanvasAssetHolder.GetAssetId() != assetId) diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorScriptCanvasComponent.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorScriptCanvasComponent.h index 5dbe718eca..8fd4ce4f14 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorScriptCanvasComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorScriptCanvasComponent.h @@ -96,9 +96,7 @@ namespace ScriptCanvasEditor //===================================================================== // EditorEntityContextNotificationBus - void OnStartPlayInEditor() override; - - void OnStopPlayInEditor() override; + protected: static void Reflect(AZ::ReflectContext* context); diff --git a/Gems/ScriptCanvas/Code/Editor/SystemComponent.cpp b/Gems/ScriptCanvas/Code/Editor/SystemComponent.cpp index f901915fdb..d976e2c0b9 100644 --- a/Gems/ScriptCanvas/Code/Editor/SystemComponent.cpp +++ b/Gems/ScriptCanvas/Code/Editor/SystemComponent.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -328,10 +329,20 @@ namespace ScriptCanvasEditor } }; - openers.push_back({ "O3DE_ScriptCanvasEditor", "Open In Script Canvas Editor...", QIcon(), scriptCanvasEditorCallback }); + openers.push_back({ "O3DE_ScriptCanvasEditor", "Open In Script Canvas Editor...", QIcon(ScriptCanvasAssetDescription().GetIconPathImpl()), scriptCanvasEditorCallback }); } } + void SystemComponent::OnStartPlayInEditor() + { + ScriptCanvas::Execution::PerformanceStatisticsEBus::Broadcast(&ScriptCanvas::Execution::PerformanceStatisticsBus::ClearSnaphotStatistics); + } + + void SystemComponent::OnStopPlayInEditor() + { + AZ::ScriptSystemRequestBus::Broadcast(&AZ::ScriptSystemRequests::GarbageCollect); + } + void SystemComponent::OnUserSettingsActivated() { PopulateEditorCreatableTypes(); diff --git a/Gems/ScriptCanvas/Code/Editor/SystemComponent.h b/Gems/ScriptCanvas/Code/Editor/SystemComponent.h index 6f85b3c5a6..c2c42c5b9d 100644 --- a/Gems/ScriptCanvas/Code/Editor/SystemComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/SystemComponent.h @@ -23,6 +23,7 @@ #include #include #include +#include namespace ScriptCanvasEditor { @@ -36,6 +37,8 @@ namespace ScriptCanvasEditor , private AZ::Data::AssetBus::MultiHandler , private AzToolsFramework::AssetSeedManagerRequests::Bus::Handler , private AzToolsFramework::EditorContextMenuBus::Handler + , private AzToolsFramework::EditorEntityContextNotificationBus::Handler + { public: AZ_COMPONENT(SystemComponent, "{1DE7A120-4371-4009-82B5-8140CB1D7B31}"); @@ -97,7 +100,12 @@ namespace ScriptCanvasEditor //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// - + + protected: + void OnStartPlayInEditor() override; + + void OnStopPlayInEditor() override; + private: SystemComponent(const SystemComponent&) = delete; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Graph.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Graph.cpp index 9d848ff998..2b567aab0d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Graph.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Graph.cpp @@ -52,6 +52,7 @@ namespace GraphCpp VariablePanelSymantics, AddVersionData, RemoveFunctionGraphMarker, + FixupVersionDataTypeId, // label your version above Current }; @@ -71,11 +72,23 @@ namespace ScriptCanvas componentElementNode.AddElementWithData(context, "m_assetType", azrtti_typeid()); } - if (componentElementNode.GetVersion() < GraphCpp::GraphVersion::RemoveFunctionGraphMarker) + if (componentElementNode.GetVersion() <= GraphCpp::GraphVersion::RemoveFunctionGraphMarker) { componentElementNode.RemoveElementByName(AZ_CRC_CE("isFunctionGraph")); } + if (componentElementNode.GetVersion() < GraphCpp::GraphVersion::FixupVersionDataTypeId) + { + if (auto subElement = componentElementNode.FindSubElement(AZ_CRC_CE("versionData"))) + { + if (subElement->GetId() == azrtti_typeid()) + { + componentElementNode.RemoveElementByName(AZ_CRC_CE("versionData")); + componentElementNode.AddElementWithData(context, "versionData", VersionData()); + } + } + } + return true; } From 70875651491842cf80d46371d1d1dcae5776dd23 Mon Sep 17 00:00:00 2001 From: carlitosan <82187351+carlitosan@users.noreply.github.com> Date: Wed, 8 Dec 2021 23:23:03 -0800 Subject: [PATCH 7/7] fix interpreted statics Signed-off-by: carlitosan <82187351+carlitosan@users.noreply.github.com> --- .../Execution/Interpreted/ExecutionInterpretedAPI.cpp | 9 +++++---- .../Execution/Interpreted/ExecutionStateInterpreted.cpp | 5 ++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp index 1855b348f2..561708dea1 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp @@ -503,20 +503,21 @@ namespace ScriptCanvas void InitializeInterpretedStatics(RuntimeData& runtimeData) { - if (!runtimeData.m_areStaticsInitialized) + AZ_Error("ScriptCanvas", !runtimeData.m_areStaticsInitialized, "ScriptCanvas runtime data already initalized"); { runtimeData.m_areStaticsInitialized = true; for (auto& dependency : runtimeData.m_requiredAssets) { - InitializeInterpretedStatics(dependency.Get()->GetData()); + if (!dependency.Get()->GetData().m_areStaticsInitialized) + { + InitializeInterpretedStatics(dependency.Get()->GetData()); + } } #if defined(AZ_PROFILE_BUILD) || defined(AZ_DEBUG_BUILD) Execution::InitializeFromLuaStackFunctions(const_cast(runtimeData.m_debugMap)); #endif - AZ_WarningOnce("ScriptCanvas", !runtimeData.m_areStaticsInitialized, "ScriptCanvas runtime data already initalized"); - if (runtimeData.RequiresStaticInitialization()) { AZ::ScriptLoadResult result{}; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpreted.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpreted.cpp index 3ae52846cd..3b963317ec 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpreted.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionStateInterpreted.cpp @@ -49,7 +49,10 @@ namespace ScriptCanvas , config.asset.GetId().ToString().data()); #endif - Execution::InitializeInterpretedStatics(runtimeAsset->GetData()); + if (!runtimeAsset->GetData().m_areStaticsInitialized) + { + Execution::InitializeInterpretedStatics(runtimeAsset->GetData()); + } } void ExecutionStateInterpreted::ClearLuaRegistryIndex()