From bf5ceb4633c94e1e0045c22af859b0b0f6193704 Mon Sep 17 00:00:00 2001 From: Pierre Baillargeon Date: Mon, 26 Jul 2021 14:13:18 -0400 Subject: [PATCH 1/3] MAYA-111932 no USd prompt during crash - Detect if the Maya SDk support the new crash check function. - If present, use it to determine if Maya is crashing durin g auto-save. - If Maya is crashing, avoid asking the user and just save USD data inside the Maya recovery file. --- cmake/modules/FindMaya.cmake | 9 +++++++++ lib/mayaUsd/CMakeLists.txt | 8 ++++++++ lib/mayaUsd/nodes/layerManager.cpp | 15 ++++++++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/cmake/modules/FindMaya.cmake b/cmake/modules/FindMaya.cmake index 98b6738321..692bbd0184 100644 --- a/cmake/modules/FindMaya.cmake +++ b/cmake/modules/FindMaya.cmake @@ -361,6 +361,15 @@ if (MAYA_INCLUDE_DIRS AND EXISTS "${MAYA_INCLUDE_DIR}/maya/MSelectionContext.h") endif() endif() +set(MAYA_HAS_CRASH_DETECTION FALSE CACHE INTERNAL "isInCrashHandler") +if(MAYA_INCLUDE_DIRS AND EXISTS "${MAYA_INCLUDE_DIR}/maya/MGlobal.h") + file(STRINGS ${MAYA_INCLUDE_DIR}/maya/MGlobal.h MAYA_HAS_API REGEX "isInCrashHandler") + if(MAYA_HAS_API) + set(MAYA_HAS_CRASH_DETECTION TRUE CACHE INTERNAL "isInCrashHandler") + message(STATUS "Maya has isInCrashHandler API") + endif() +endif() + # handle the QUIETLY and REQUIRED arguments and set MAYA_FOUND to TRUE if # all listed variables are TRUE include(FindPackageHandleStandardArgs) diff --git a/lib/mayaUsd/CMakeLists.txt b/lib/mayaUsd/CMakeLists.txt index 1c6511cf50..a7772b40cd 100644 --- a/lib/mayaUsd/CMakeLists.txt +++ b/lib/mayaUsd/CMakeLists.txt @@ -78,6 +78,14 @@ if (MAYA_NEW_POINT_SNAPPING_SUPPORT) ) endif() +message(STATUS "MAYA_HAS_CRASH_DETECTION is ${MAYA_HAS_CRASH_DETECTION}") +if (MAYA_HAS_CRASH_DETECTION) + target_compile_definitions(${PROJECT_NAME} + PRIVATE + MAYA_HAS_CRASH_DETECTION=1 + ) +endif() + if (MAYA_LIGHTAPI_VERSION EQUAL 2) target_compile_definitions(${PROJECT_NAME} PRIVATE diff --git a/lib/mayaUsd/nodes/layerManager.cpp b/lib/mayaUsd/nodes/layerManager.cpp index 45e488a5dc..11af02146b 100644 --- a/lib/mayaUsd/nodes/layerManager.cpp +++ b/lib/mayaUsd/nodes/layerManager.cpp @@ -197,6 +197,15 @@ void convertAnonymousLayersRecursive( } } +bool isCrashing() +{ +#ifdef MAYA_HAS_CRASH_DETECTION + return MGlobal::isInCrashHandler(); +#else + return false; +#endif +} + constexpr auto kSaveOptionUICmd = "usdFileSaveOptions(true);"; } // namespace @@ -361,6 +370,7 @@ void LayerDatabase::prepareForWriteCheck(bool* retCode, bool isExport) int dialogResult = true; if (MGlobal::kInteractive == MGlobal::mayaState() + && !isCrashing() && LayerDatabase::instance().saveInteractionRequired()) { MGlobal::executeCommand(kSaveOptionUICmd, dialogResult); } @@ -448,7 +458,10 @@ bool LayerDatabase::saveUsd(bool isExport) auto opt = MayaUsd::utils::serializeUsdEditsLocationOption(); if (MayaUsd::utils::kIgnoreUSDEdits != opt) { - if (_batchSaveDelegate && _proxiesToSave.length() > 0) { + if (isCrashing()) { + result = kPartiallyCompleted; + opt = MayaUsd::utils::kSaveToUSDFiles; + } else if (_batchSaveDelegate && _proxiesToSave.length() > 0) { result = _batchSaveDelegate(_proxiesToSave); } From 66322a5f1e4503e7a6fb99482b2490805da336e4 Mon Sep 17 00:00:00 2001 From: Pierre Baillargeon Date: Tue, 27 Jul 2021 16:15:36 -0400 Subject: [PATCH 2/3] MAYA-111932 use correct save mode for USD. --- lib/mayaUsd/nodes/layerManager.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/mayaUsd/nodes/layerManager.cpp b/lib/mayaUsd/nodes/layerManager.cpp index 11af02146b..98c872fa82 100644 --- a/lib/mayaUsd/nodes/layerManager.cpp +++ b/lib/mayaUsd/nodes/layerManager.cpp @@ -458,9 +458,12 @@ bool LayerDatabase::saveUsd(bool isExport) auto opt = MayaUsd::utils::serializeUsdEditsLocationOption(); if (MayaUsd::utils::kIgnoreUSDEdits != opt) { + // When Maya is crashing, we don't want to save the the USD file to avoid + // overwriting them with possibly unwanted data. Instead, we will save the + // USD data inside the temporary crash recovery Maya file. if (isCrashing()) { result = kPartiallyCompleted; - opt = MayaUsd::utils::kSaveToUSDFiles; + opt = MayaUsd::utils::kSaveToMayaSceneFile; } else if (_batchSaveDelegate && _proxiesToSave.length() > 0) { result = _batchSaveDelegate(_proxiesToSave); } From f3f57d260d8ff570a7bc761ef41f45d1c5cf0648 Mon Sep 17 00:00:00 2001 From: Pierre Baillargeon Date: Wed, 28 Jul 2021 10:09:14 -0400 Subject: [PATCH 3/3] MAYA-111932 code formatting. --- lib/mayaUsd/nodes/layerManager.cpp | 3 +-- plugin/al/mayautils/AL/maya/utils/MenuBuilder.cpp | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/mayaUsd/nodes/layerManager.cpp b/lib/mayaUsd/nodes/layerManager.cpp index 98c872fa82..51228ee010 100644 --- a/lib/mayaUsd/nodes/layerManager.cpp +++ b/lib/mayaUsd/nodes/layerManager.cpp @@ -369,8 +369,7 @@ void LayerDatabase::prepareForWriteCheck(bool* retCode, bool isExport) int dialogResult = true; - if (MGlobal::kInteractive == MGlobal::mayaState() - && !isCrashing() + if (MGlobal::kInteractive == MGlobal::mayaState() && !isCrashing() && LayerDatabase::instance().saveInteractionRequired()) { MGlobal::executeCommand(kSaveOptionUICmd, dialogResult); } diff --git a/plugin/al/mayautils/AL/maya/utils/MenuBuilder.cpp b/plugin/al/mayautils/AL/maya/utils/MenuBuilder.cpp index eb7b395462..a380b85c65 100644 --- a/plugin/al/mayautils/AL/maya/utils/MenuBuilder.cpp +++ b/plugin/al/mayautils/AL/maya/utils/MenuBuilder.cpp @@ -117,8 +117,8 @@ void MenuBuilder::Menu::generate( nameWithNoSpaces[i] = '_'; } os << "if(`menu -exists " << nameWithNoSpaces << "`) return;\n"; - os << "menu -tearOff true -parent $gMainWindow -l \"" << m_name << "\" -aob 1 " << nameWithNoSpaces - << ";\n"; + os << "menu -tearOff true -parent $gMainWindow -l \"" << m_name << "\" -aob 1 " + << nameWithNoSpaces << ";\n"; kill << nameWithNoSpaces << " "; } else { os << "menuItem -subMenu true -l \"" << m_name << "\";\n";