diff --git a/cmake/modules/FindMaya.cmake b/cmake/modules/FindMaya.cmake index 9991b01654..0edcb20033 100644 --- a/cmake/modules/FindMaya.cmake +++ b/cmake/modules/FindMaya.cmake @@ -371,6 +371,15 @@ if (MAYA_INCLUDE_DIRS AND EXISTS "${MAYA_INCLUDE_DIR}/maya/MFrameContext.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..51228ee010 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 @@ -360,7 +369,7 @@ void LayerDatabase::prepareForWriteCheck(bool* retCode, bool isExport) int dialogResult = true; - if (MGlobal::kInteractive == MGlobal::mayaState() + if (MGlobal::kInteractive == MGlobal::mayaState() && !isCrashing() && LayerDatabase::instance().saveInteractionRequired()) { MGlobal::executeCommand(kSaveOptionUICmd, dialogResult); } @@ -448,7 +457,13 @@ bool LayerDatabase::saveUsd(bool isExport) auto opt = MayaUsd::utils::serializeUsdEditsLocationOption(); if (MayaUsd::utils::kIgnoreUSDEdits != opt) { - if (_batchSaveDelegate && _proxiesToSave.length() > 0) { + // 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::kSaveToMayaSceneFile; + } else if (_batchSaveDelegate && _proxiesToSave.length() > 0) { result = _batchSaveDelegate(_proxiesToSave); } 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";