From bc3182aaafd489c20dc66905dce498ec13783d4e Mon Sep 17 00:00:00 2001 From: Pierre Tremblay Date: Wed, 17 Nov 2021 14:55:10 -0500 Subject: [PATCH 1/4] canEditAsMaya core functionality. --- lib/mayaUsd/fileio/primUpdater.cpp | 14 ++++++- lib/mayaUsd/fileio/primUpdater.h | 13 +++++-- lib/mayaUsd/fileio/primUpdaterManager.cpp | 39 ++++++++++++++----- lib/mayaUsd/fileio/primUpdaterManager.h | 8 +++- lib/mayaUsd/fileio/primUpdaterRegistry.cpp | 6 +-- lib/mayaUsd/fileio/primUpdaterRegistry.h | 6 +-- lib/mayaUsd/python/wrapPrimUpdaterManager.cpp | 22 ++++++----- lib/usd/translators/mayaReferenceUpdater.cpp | 6 +++ lib/usd/translators/mayaReferenceUpdater.h | 5 +++ test/lib/mayaUsd/fileio/testEditAsMaya.py | 26 +++++++++++++ 10 files changed, 115 insertions(+), 30 deletions(-) diff --git a/lib/mayaUsd/fileio/primUpdater.cpp b/lib/mayaUsd/fileio/primUpdater.cpp index 5251f14568..c49052f8ed 100644 --- a/lib/mayaUsd/fileio/primUpdater.cpp +++ b/lib/mayaUsd/fileio/primUpdater.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -65,7 +66,18 @@ UsdMayaPrimUpdater::UsdMayaPrimUpdater(const MFnDependencyNode& depNodeFn, const { } -bool UsdMayaPrimUpdater::pull(const UsdMayaPrimUpdaterContext& context) { return true; } +bool UsdMayaPrimUpdater::canEditAsMaya() const +{ + // To be editable as Maya data we must ensure that there is an importer (to + // Maya). As of 17-Nov-2021 it is not possible to determine how the + // prim will round-trip back through export, so we do not check for + // exporter (to USD) capability. + auto prim = MayaUsd::ufe::ufePathToPrim(_path); + TF_AXIOM(prim); + return (UsdMayaPrimReaderRegistry::Find(prim.GetTypeName()) != nullptr); +} + +bool UsdMayaPrimUpdater::editAsMaya(const UsdMayaPrimUpdaterContext& context) { return true; } bool UsdMayaPrimUpdater::discardEdits(const UsdMayaPrimUpdaterContext& context) { diff --git a/lib/mayaUsd/fileio/primUpdater.h b/lib/mayaUsd/fileio/primUpdater.h index e8f9da3a7b..9b09f03eef 100644 --- a/lib/mayaUsd/fileio/primUpdater.h +++ b/lib/mayaUsd/fileio/primUpdater.h @@ -66,10 +66,16 @@ class UsdMayaPrimUpdater SdfLayerRefPtr dstLayer, const SdfPath& dstSdfPath); + /// Query to determine if the prim corresponding to this updater can be + /// edited as Maya. The default implementation in this class checks + /// whether there is an importer for the prim. + MAYAUSD_CORE_PUBLIC + virtual bool canEditAsMaya() const; + /// Customize the pulled prim after pull import. Default implementation in /// this class is a no-op. MAYAUSD_CORE_PUBLIC - virtual bool pull(const UsdMayaPrimUpdaterContext& context); + virtual bool editAsMaya(const UsdMayaPrimUpdaterContext& context); /// Discard edits done in Maya. Implementation in this class removes the /// Maya node. @@ -98,10 +104,11 @@ class UsdMayaPrimUpdater private: /// The MObject for the Maya node being updated, valid for both DAG and DG - /// node prim updaters. + /// node prim updaters. Can be a null object if the updater was created + /// only for canEditAsMaya() query purposes. const MObject _mayaObject; - /// The proxy shape and destination sdf path if provided + /// The proxy shape and destination Sdf path if provided. const Ufe::Path _path; }; diff --git a/lib/mayaUsd/fileio/primUpdaterManager.cpp b/lib/mayaUsd/fileio/primUpdaterManager.cpp index 9ed88d8ef4..c6cf6e37e3 100644 --- a/lib/mayaUsd/fileio/primUpdaterManager.cpp +++ b/lib/mayaUsd/fileio/primUpdaterManager.cpp @@ -50,6 +50,8 @@ #include #include +using UpdaterFactoryFn = UsdMayaPrimUpdaterRegistry::UpdaterFactoryFn; + // Allow for use of MObjectHandle with std::unordered_map. namespace std { template <> struct hash @@ -292,11 +294,14 @@ PullImportPaths pullImport( } } - // Execute the command + // Execute the command, which can succeed but import nothing. bool success = readJob.Read(&addedDagPaths); + if (!success || addedDagPaths.size() == 0) { + return PullImportPaths({}, {}); + } const bool isCopy = context.GetArgs()._copyOperation; - if (success && !isCopy) { + if (!isCopy) { // Quick workaround to reuse some POC code - to rewrite later auto ufeChild = MayaUsd::ufe::dagPathToUfe(addedDagPaths[0]); @@ -373,7 +378,7 @@ bool pullCustomize(const PullImportPaths& importedPaths, const UsdMayaPrimUpdate // customization step. This is a frequent difficulty for operations on // multiple data, especially since we can't roll back the result of // the execution of previous updaters. Revisit this. PPT, 15-Sep-2021. - if (!updater->pull(context)) { + if (!updater->editAsMaya(context)) { return false; } } @@ -485,8 +490,6 @@ UsdMayaPrimUpdaterSharedPtr createUpdater( const SdfPath& primSpecPath, const UsdMayaPrimUpdaterContext& context) { - using UpdaterFactoryFn = UsdMayaPrimUpdaterRegistry::UpdaterFactoryFn; - // Get the primSpec from the src layer. auto primSpec = srcLayer->GetPrimAtPath(primSpecPath); if (!TF_VERIFY(primSpec)) { @@ -541,7 +544,6 @@ bool pushCustomize( // Traverse the layer, creating a prim updater for each primSpec // along the way, and call PushCopySpec on the prim. - using UpdaterFactoryFn = UsdMayaPrimUpdaterRegistry::UpdaterFactoryFn; auto pushCopySpecsFn = [&context, srcStage, srcLayer, dstLayer, dstRootParentPath](const SdfPath& srcPath) { // We can be called with a primSpec path that is not a prim path @@ -676,7 +678,7 @@ PrimUpdaterManager::~PrimUpdaterManager() _cbIds.clear(); } -bool PrimUpdaterManager::push(const MFnDependencyNode& depNodeFn, const Ufe::Path& pulledPath) +bool PrimUpdaterManager::mergeToUsd(const MFnDependencyNode& depNodeFn, const Ufe::Path& pulledPath) { MayaUsdProxyShapeBase* proxyShape = MayaUsd::ufe::getProxyShape(pulledPath); if (!proxyShape) { @@ -748,7 +750,7 @@ bool PrimUpdaterManager::push(const MFnDependencyNode& depNodeFn, const Ufe::Pat return true; } -bool PrimUpdaterManager::pull(const Ufe::Path& path) +bool PrimUpdaterManager::editAsMaya(const Ufe::Path& path) { MayaUsdProxyShapeBase* proxyShape = MayaUsd::ufe::getProxyShape(path); if (!proxyShape) { @@ -785,6 +787,9 @@ bool PrimUpdaterManager::pull(const Ufe::Path& path) // 1) Perform the import PullImportPaths importedPaths = pullImport(path, pulledPrim, context); + if (importedPaths.first.empty()) { + return false; + } // 2) Iterate over all imported Dag paths. if (!pullCustomize(importedPaths, context)) { @@ -804,6 +809,22 @@ bool PrimUpdaterManager::pull(const Ufe::Path& path) return true; } +bool PrimUpdaterManager::canEditAsMaya(const Ufe::Path& path) const +{ + // Create a prim updater for the path, and ask it if the prim can be edited + // as Maya. + auto prim = MayaUsd::ufe::ufePathToPrim(path); + if (!prim) { + return false; + } + auto typeName = prim.GetTypeName(); + auto regItem = UsdMayaPrimUpdaterRegistry::FindOrFallback(typeName); + auto factory = std::get(regItem); + // No Maya Dag path for the prim updater, so pass in a null MObject. + auto updater = factory(MFnDependencyNode(MObject()), path); + return updater ? updater->canEditAsMaya() : false; +} + bool PrimUpdaterManager::discardEdits(const Ufe::Path& pulledPath) { MayaUsdProxyShapeBase* proxyShape = MayaUsd::ufe::getProxyShape(pulledPath); @@ -962,7 +983,7 @@ void PrimUpdaterManager::onProxyContentChanged( = MayaUsd::ufe::usdPathToUfePathSegment(prim.GetPath()); const Ufe::Path path = proxyNotice.GetProxyShape().ufePath() + pathSegment; - pull(path); + editAsMaya(path); } } } diff --git a/lib/mayaUsd/fileio/primUpdaterManager.h b/lib/mayaUsd/fileio/primUpdaterManager.h index 0b635345e4..a210841ee0 100644 --- a/lib/mayaUsd/fileio/primUpdaterManager.h +++ b/lib/mayaUsd/fileio/primUpdaterManager.h @@ -41,10 +41,14 @@ class PrimUpdaterManager : public PXR_NS::TfWeakBase ~PrimUpdaterManager(); MAYAUSD_CORE_PUBLIC - bool push(const MFnDependencyNode& depNodeFn, const Ufe::Path& pulledPath); + bool mergeToUsd(const MFnDependencyNode& depNodeFn, const Ufe::Path& pulledPath); MAYAUSD_CORE_PUBLIC - bool pull(const Ufe::Path& path); + bool editAsMaya(const Ufe::Path& path); + + // Can the prim at the argument path be edited as Maya. + MAYAUSD_CORE_PUBLIC + bool canEditAsMaya(const Ufe::Path& path) const; MAYAUSD_CORE_PUBLIC bool discardEdits(const Ufe::Path& path); diff --git a/lib/mayaUsd/fileio/primUpdaterRegistry.cpp b/lib/mayaUsd/fileio/primUpdaterRegistry.cpp index 2d119ca3ee..fe6b2fa2ff 100644 --- a/lib/mayaUsd/fileio/primUpdaterRegistry.cpp +++ b/lib/mayaUsd/fileio/primUpdaterRegistry.cpp @@ -63,7 +63,7 @@ void UsdMayaPrimUpdaterRegistry::Register( TfToken tfTypeName(tfType.GetTypeName()); TF_DEBUG(PXRUSDMAYA_REGISTRY) - .Msg("Registering UsdMayaPrimWriter for TfType type %s.\n", tfTypeName.GetText()); + .Msg("Registering UsdMayaPrimUpdater for TfType type %s.\n", tfTypeName.GetText()); auto insertStatus = _regTfType.insert(std::make_pair(tfTypeName, std::make_tuple(sup, fn))); if (insertStatus.second) { @@ -86,8 +86,8 @@ UsdMayaPrimUpdaterRegistry::FindOrFallback(const TfToken& usdTypeName) { TfRegistryManager::GetInstance().SubscribeTo(); - // unfortunately, usdTypeName is diff from the tfTypeName which we use to - // register. do the conversion here. + // Unfortunately, usdTypeName is diff from the tfTypeName which we use to + // register. Do the conversion here. TfType tfType = PlugRegistry::FindDerivedTypeByName(usdTypeName); std::string typeNameStr = tfType.GetTypeName(); TfToken typeName(typeNameStr); diff --git a/lib/mayaUsd/fileio/primUpdaterRegistry.h b/lib/mayaUsd/fileio/primUpdaterRegistry.h index 8d144dc9ca..26d6ccc37c 100644 --- a/lib/mayaUsd/fileio/primUpdaterRegistry.h +++ b/lib/mayaUsd/fileio/primUpdaterRegistry.h @@ -91,12 +91,12 @@ struct UsdMayaPrimUpdaterRegistry UsdMayaPrimUpdater::Supports sup, UpdaterFactoryFn fn); - /// \brief Register \p fn as a reader provider for \p T. + /// \brief Register \p fn as an updater provider for \p T. /// - /// Example for registering a reader factory in your custom plugin, assuming + /// Example for registering an updater factory in your custom plugin, assuming /// that MyType is registered with the TfType system: /// \code{.cpp} - /// class MyReader : public UsdMayaPrimUpdater { + /// class MyUpdater : public UsdMayaPrimUpdater { /// static UsdMayaPrimReaderSharedPtr Create( /// const UsdMayaPrimReaderArgs&); /// }; diff --git a/lib/mayaUsd/python/wrapPrimUpdaterManager.cpp b/lib/mayaUsd/python/wrapPrimUpdaterManager.cpp index 613345e783..66078721b2 100644 --- a/lib/mayaUsd/python/wrapPrimUpdaterManager.cpp +++ b/lib/mayaUsd/python/wrapPrimUpdaterManager.cpp @@ -34,7 +34,7 @@ using namespace boost; PXR_NAMESPACE_USING_DIRECTIVE namespace { -bool push(const std::string& nodeName) +bool mergeToUsd(const std::string& nodeName) { MObject obj; MStatus status = UsdMayaUtil::GetMObjectByName(nodeName, obj); @@ -54,14 +54,20 @@ bool push(const std::string& nodeName) if (!PrimUpdaterManager::readPullInformation(dagPath, path)) return false; - return PrimUpdaterManager::getInstance().push(dagNode, path); + return PrimUpdaterManager::getInstance().mergeToUsd(dagNode, path); } -bool pull(const std::string& ufePathString) +bool editAsMaya(const std::string& ufePathString) { Ufe::Path path = Ufe::PathString::path(ufePathString); - return PrimUpdaterManager::getInstance().pull(path); + return PrimUpdaterManager::getInstance().editAsMaya(path); +} + +bool canEditAsMaya(const std::string& ufePathString) +{ + return PrimUpdaterManager::getInstance().canEditAsMaya( + Ufe::PathString::path(ufePathString)); } bool discardEdits(const std::string& nodeName) @@ -92,11 +98,9 @@ void wrapPrimUpdaterManager() { using This = PrimUpdaterManager; class_("PrimUpdaterManager", no_init) - .def("push", push) - .def("pull", pull) - .def("pullClear", discardEdits) - .def("mergeToUsd", push) - .def("editAsMaya", pull) + .def("mergeToUsd", mergeToUsd) + .def("editAsMaya", editAsMaya) + .def("canEditAsMaya", canEditAsMaya) .def("discardEdits", discardEdits) .def("copy", copyBetween); } diff --git a/lib/usd/translators/mayaReferenceUpdater.cpp b/lib/usd/translators/mayaReferenceUpdater.cpp index 8bed5d6284..dc8d1dc263 100644 --- a/lib/usd/translators/mayaReferenceUpdater.cpp +++ b/lib/usd/translators/mayaReferenceUpdater.cpp @@ -60,6 +60,12 @@ PxrUsdTranslators_MayaReferenceUpdater::PxrUsdTranslators_MayaReferenceUpdater( { } +/* virtual */ +bool PxrUsdTranslators_MayaReferenceUpdater::canEditAsMaya() const +{ + return true; +} + /* virtual */ bool PxrUsdTranslators_MayaReferenceUpdater::pushCopySpecs( UsdStageRefPtr srcStage, diff --git a/lib/usd/translators/mayaReferenceUpdater.h b/lib/usd/translators/mayaReferenceUpdater.h index 000f56331f..5df099834d 100644 --- a/lib/usd/translators/mayaReferenceUpdater.h +++ b/lib/usd/translators/mayaReferenceUpdater.h @@ -37,6 +37,11 @@ class PxrUsdTranslators_MayaReferenceUpdater : public UsdMayaPrimUpdater MAYAUSD_CORE_PUBLIC bool discardEdits(const UsdMayaPrimUpdaterContext& context) override; + /// Query to determine if the prim corresponding to this updater can be + /// edited as Maya. The implementation in this class returns true. + MAYAUSD_CORE_PUBLIC + bool canEditAsMaya() const override; + protected: MAYAUSD_CORE_PUBLIC bool pushCopySpecs( diff --git a/test/lib/mayaUsd/fileio/testEditAsMaya.py b/test/lib/mayaUsd/fileio/testEditAsMaya.py index df1366fc27..ce0d2402f3 100644 --- a/test/lib/mayaUsd/fileio/testEditAsMaya.py +++ b/test/lib/mayaUsd/fileio/testEditAsMaya.py @@ -69,6 +69,7 @@ def testTransformEditAsMaya(self): _, _, _, _, _) = createSimpleXformScene() # Edit aPrim as Maya data. + self.assertTrue(mayaUsd.lib.PrimUpdaterManager.canEditAsMaya(aUsdUfePathStr)) self.assertTrue(mayaUsd.lib.PrimUpdaterManager.editAsMaya(aUsdUfePathStr)) # Test the path mapping services. @@ -109,5 +110,30 @@ def testTransformEditAsMaya(self): assertVectorAlmostEqual(self, mayaValues, usdValues) + @unittest.skipIf(os.getenv('UFE_PREVIEW_VERSION_NUM', '0000') < '3006', 'Test only available in UFE preview version 0.3.6 and greater') + def testIllegalEditAsMaya(self): + '''Trying to edit as Maya on object that doesn't support it.''' + + import mayaUsd_createStageWithNewLayer + + proxyShapePathStr = mayaUsd_createStageWithNewLayer.createStageWithNewLayer() + stage = mayaUsd.lib.GetPrim(proxyShapePathStr).GetStage() + blendShape = stage.DefinePrim('/BlendShape1', 'BlendShape') + scope = stage.DefinePrim('/Scope1', 'Scope') + + blendShapePathStr = proxyShapePathStr + ',/BlendShape1' + scopePathStr = proxyShapePathStr + ',/Scope1' + + # Blend shape cannot be edited as Maya: it has no importer. + self.assertFalse(mayaUsd.lib.PrimUpdaterManager.canEditAsMaya(blendShapePathStr)) + self.assertFalse(mayaUsd.lib.PrimUpdaterManager.editAsMaya(blendShapePathStr)) + + # Scope cannot be edited as Maya: it has no exporter. + # Unfortunately, as of 17-Nov-2021, we cannot determine how a prim will + # round-trip, so we cannot use the information that scope has no + # exporter. + # self.assertFalse(mayaUsd.lib.PrimUpdaterManager.canEditAsMaya(scopePathStr)) + # self.assertFalse(mayaUsd.lib.PrimUpdaterManager.editAsMaya(scopePathStr)) + if __name__ == '__main__': unittest.main(verbosity=2) From b786f1c84359fb063ebab58ca43506373924d8b0 Mon Sep 17 00:00:00 2001 From: Pierre Tremblay Date: Wed, 17 Nov 2021 20:32:02 -0500 Subject: [PATCH 2/4] Deploy canEditAsMaya to UI. --- lib/mayaUsd/ufe/UsdContextOps.cpp | 5 ++++- plugin/adsk/scripts/USDMenuProc.mel | 18 ++++++++++++++++-- plugin/adsk/scripts/mayaUsdMenu.mel | 2 +- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/lib/mayaUsd/ufe/UsdContextOps.cpp b/lib/mayaUsd/ufe/UsdContextOps.cpp index 4c64b7c6f9..b886a8ed0e 100644 --- a/lib/mayaUsd/ufe/UsdContextOps.cpp +++ b/lib/mayaUsd/ufe/UsdContextOps.cpp @@ -17,6 +17,7 @@ #include "private/UfeNotifGuard.h" +#include #include #include #include @@ -573,7 +574,9 @@ Ufe::ContextOps::Items UsdContextOps::getItems(const Ufe::ContextOps::ItemPath& // Top-level items (do not add for gateway type node): if (!fIsAGatewayType) { - items.emplace_back(kEditAsMayaItem, kEditAsMayaLabel, kEditAsMayaImage); + if (PrimUpdaterManager::getInstance().canEditAsMaya(path())) { + items.emplace_back(kEditAsMayaItem, kEditAsMayaLabel, kEditAsMayaImage); + } items.emplace_back(kDuplicateAsMayaItem, kDuplicateAsMayaLabel); items.emplace_back(Ufe::ContextItem::kSeparator); diff --git a/plugin/adsk/scripts/USDMenuProc.mel b/plugin/adsk/scripts/USDMenuProc.mel index 735e26a154..d04e2290bb 100644 --- a/plugin/adsk/scripts/USDMenuProc.mel +++ b/plugin/adsk/scripts/USDMenuProc.mel @@ -13,6 +13,18 @@ // limitations under the License. // +proc int canEditAsMaya(string $obj) +{ + if (size($obj) == 0) { + string $nonMayaObjs[] = `python("import maya.internal.ufeSupport.utils as ufeUtils; ufeUtils.getNonMayaSelectedItems()")`; + $obj = $nonMayaObjs[0]; + } + if (size($obj) != 0) { + return `python("from mayaUsd.lib import PrimUpdaterManager; PrimUpdaterManager.canEditAsMaya('" + $obj + "')")`; + } + return 0; +} + global proc mayaUsdMenu_pullToDG(string $obj) { if (size($obj) == 0) { @@ -20,7 +32,7 @@ global proc mayaUsdMenu_pullToDG(string $obj) $obj = $nonMayaObjs[0]; } if (size($obj) != 0) { - python("from mayaUsd.lib import PrimUpdaterManager; import ufe; PrimUpdaterManager.pull('" + $obj + "');"); + python("from mayaUsd.lib import PrimUpdaterManager; import ufe; PrimUpdaterManager.editAsMaya('" + $obj + "');"); } } @@ -44,7 +56,9 @@ global proc USDMenuProc(string $parent, string $obj) setParent -menu $parent; setParent -menu ..; - menuItem -label "Edit As Maya Data" -image "edit_as_Maya.png" -command ("mayaUsdMenu_pullToDG \"" + $obj + "\""); + if (canEditAsMaya($obj)) { + menuItem -label "Edit As Maya Data" -image "edit_as_Maya.png" -command ("mayaUsdMenu_pullToDG \"" + $obj + "\""); + } menuItem -label "Duplicate As Maya Data" -command ("mayaUsdMenu_copyToDG \"" + $obj + "\""); } } diff --git a/plugin/adsk/scripts/mayaUsdMenu.mel b/plugin/adsk/scripts/mayaUsdMenu.mel index 0155e5ad35..910af677fc 100644 --- a/plugin/adsk/scripts/mayaUsdMenu.mel +++ b/plugin/adsk/scripts/mayaUsdMenu.mel @@ -589,7 +589,7 @@ global proc mayaUsdMenu_pushBackToUSD(string $obj) } } if (size($obj)) { - python("from mayaUsd.lib import PrimUpdaterManager; PrimUpdaterManager.push('" + $obj + "');"); + python("from mayaUsd.lib import PrimUpdaterManager; PrimUpdaterManager.mergeToUsd('" + $obj + "');"); } } From cd0148845c0d42ed97f6b12173b1c6df3f0df17d Mon Sep 17 00:00:00 2001 From: Pierre Tremblay Date: Wed, 17 Nov 2021 20:34:58 -0500 Subject: [PATCH 3/4] clang-format --- lib/mayaUsd/fileio/primUpdater.cpp | 2 +- lib/mayaUsd/python/wrapPrimUpdaterManager.cpp | 3 +-- lib/usd/translators/mayaReferenceUpdater.cpp | 5 +---- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/mayaUsd/fileio/primUpdater.cpp b/lib/mayaUsd/fileio/primUpdater.cpp index c49052f8ed..07632d0c1b 100644 --- a/lib/mayaUsd/fileio/primUpdater.cpp +++ b/lib/mayaUsd/fileio/primUpdater.cpp @@ -19,8 +19,8 @@ #include #include #include -#include #include +#include #include #include #include diff --git a/lib/mayaUsd/python/wrapPrimUpdaterManager.cpp b/lib/mayaUsd/python/wrapPrimUpdaterManager.cpp index 66078721b2..75b98e2932 100644 --- a/lib/mayaUsd/python/wrapPrimUpdaterManager.cpp +++ b/lib/mayaUsd/python/wrapPrimUpdaterManager.cpp @@ -66,8 +66,7 @@ bool editAsMaya(const std::string& ufePathString) bool canEditAsMaya(const std::string& ufePathString) { - return PrimUpdaterManager::getInstance().canEditAsMaya( - Ufe::PathString::path(ufePathString)); + return PrimUpdaterManager::getInstance().canEditAsMaya(Ufe::PathString::path(ufePathString)); } bool discardEdits(const std::string& nodeName) diff --git a/lib/usd/translators/mayaReferenceUpdater.cpp b/lib/usd/translators/mayaReferenceUpdater.cpp index dc8d1dc263..3bb6e0e3d8 100644 --- a/lib/usd/translators/mayaReferenceUpdater.cpp +++ b/lib/usd/translators/mayaReferenceUpdater.cpp @@ -61,10 +61,7 @@ PxrUsdTranslators_MayaReferenceUpdater::PxrUsdTranslators_MayaReferenceUpdater( } /* virtual */ -bool PxrUsdTranslators_MayaReferenceUpdater::canEditAsMaya() const -{ - return true; -} +bool PxrUsdTranslators_MayaReferenceUpdater::canEditAsMaya() const { return true; } /* virtual */ bool PxrUsdTranslators_MayaReferenceUpdater::pushCopySpecs( From 8441e8c22f3edf3d097bb4760fd10e701c452e51 Mon Sep 17 00:00:00 2001 From: Pierre Tremblay Date: Thu, 18 Nov 2021 12:03:18 -0500 Subject: [PATCH 4/4] Pre-2023 support. --- lib/mayaUsd/ufe/UsdContextOps.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/mayaUsd/ufe/UsdContextOps.cpp b/lib/mayaUsd/ufe/UsdContextOps.cpp index b886a8ed0e..10d53c9e2a 100644 --- a/lib/mayaUsd/ufe/UsdContextOps.cpp +++ b/lib/mayaUsd/ufe/UsdContextOps.cpp @@ -17,7 +17,9 @@ #include "private/UfeNotifGuard.h" +#ifdef UFE_V3_FEATURES_AVAILABLE #include +#endif #include #include #include @@ -574,9 +576,13 @@ Ufe::ContextOps::Items UsdContextOps::getItems(const Ufe::ContextOps::ItemPath& // Top-level items (do not add for gateway type node): if (!fIsAGatewayType) { +#ifdef UFE_V3_FEATURES_AVAILABLE if (PrimUpdaterManager::getInstance().canEditAsMaya(path())) { +#endif items.emplace_back(kEditAsMayaItem, kEditAsMayaLabel, kEditAsMayaImage); +#ifdef UFE_V3_FEATURES_AVAILABLE } +#endif items.emplace_back(kDuplicateAsMayaItem, kDuplicateAsMayaLabel); items.emplace_back(Ufe::ContextItem::kSeparator);