From eca88451a66014fc71cd6892fc720c5c1458d60b Mon Sep 17 00:00:00 2001 From: rzulak Date: Thu, 5 Nov 2020 17:46:14 -0800 Subject: [PATCH] Restore session layer properly or create one when root-layer is not editable. --- lib/mayaUsd/base/CMakeLists.txt | 2 ++ lib/mayaUsd/base/tokens.cpp | 22 ++++++++++++++ lib/mayaUsd/base/tokens.h | 43 ++++++++++++++++++++++++++++ lib/mayaUsd/nodes/proxyShapeBase.cpp | 19 ++++++++++-- lib/mayaUsd/nodes/stageNode.cpp | 18 ++++++++++-- 5 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 lib/mayaUsd/base/tokens.cpp create mode 100644 lib/mayaUsd/base/tokens.h diff --git a/lib/mayaUsd/base/CMakeLists.txt b/lib/mayaUsd/base/CMakeLists.txt index 83a1ced480..3fece64fb3 100644 --- a/lib/mayaUsd/base/CMakeLists.txt +++ b/lib/mayaUsd/base/CMakeLists.txt @@ -4,11 +4,13 @@ target_sources(${PROJECT_NAME} PRIVATE debugCodes.cpp + tokens.cpp ) set(HEADERS api.h debugCodes.h + tokens.h ) # ----------------------------------------------------------------------------- diff --git a/lib/mayaUsd/base/tokens.cpp b/lib/mayaUsd/base/tokens.cpp new file mode 100644 index 0000000000..9188d071b5 --- /dev/null +++ b/lib/mayaUsd/base/tokens.cpp @@ -0,0 +1,22 @@ +// +// Copyright 2020 Autodesk +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "tokens.h" + +PXR_NAMESPACE_OPEN_SCOPE + +TF_DEFINE_PUBLIC_TOKENS(MayaUsdOptionVars, MAYA_USD_OPTIONVAR_TOKENS); + +PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/mayaUsd/base/tokens.h b/lib/mayaUsd/base/tokens.h new file mode 100644 index 0000000000..2235f1b794 --- /dev/null +++ b/lib/mayaUsd/base/tokens.h @@ -0,0 +1,43 @@ +// +// Copyright 2020 Autodesk +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#pragma once + +#include "api.h" + +#include +#include + +#include + +PXR_NAMESPACE_OPEN_SCOPE + +// Tokens that are used as optionVars in MayaUSD +// +#define MAYA_USD_OPTIONVAR_TOKENS \ + /* Always target a session layer on a mayaUsdProxy*/ \ + (mayaUsd_ProxyTargetsSessionLayerOnOpen) + +TF_DECLARE_PUBLIC_TOKENS(MayaUsdOptionVars, MAYAUSD_CORE_PUBLIC, MAYA_USD_OPTIONVAR_TOKENS); + +// Convenience to convert a TfToken to MString +// +static inline MString toMString(const TfToken& token) +{ + return MString(token.data(), token.size()); +} + +PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/mayaUsd/nodes/proxyShapeBase.cpp b/lib/mayaUsd/nodes/proxyShapeBase.cpp index 68ff65d681..efe5e1a0fb 100644 --- a/lib/mayaUsd/nodes/proxyShapeBase.cpp +++ b/lib/mayaUsd/nodes/proxyShapeBase.cpp @@ -16,6 +16,7 @@ #include "proxyShapeBase.h" #include +#include #include #include #include @@ -541,15 +542,27 @@ MStatus MayaUsdProxyShapeBase::computeInStageDataCached(MDataBlock& dataBlock) if (SdfLayerRefPtr rootLayer = SdfLayer::FindOrOpen(fileString)) { SdfLayerRefPtr sessionLayer = computeSessionLayer(dataBlock); - if (sessionLayer) { + + bool targetSession + = MGlobal::optionVarIntValue( + toMString(MayaUsdOptionVars->mayaUsd_ProxyTargetsSessionLayerOnOpen)) + == 1; + targetSession = targetSession || !rootLayer->PermissionToEdit(); + + if (sessionLayer || targetSession) { + if (!sessionLayer) + sessionLayer = SdfLayer::CreateAnonymous(); usdStage = UsdStage::Open( rootLayer, sessionLayer, ArGetResolver().GetCurrentContext(), loadSet); } else { usdStage = UsdStage::Open( rootLayer, ArGetResolver().GetCurrentContext(), loadSet); } - - usdStage->SetEditTarget(usdStage->GetRootLayer()); + if (sessionLayer && targetSession) { + usdStage->SetEditTarget(sessionLayer); + } else { + usdStage->SetEditTarget(usdStage->GetRootLayer()); + } } else { // Create a new stage in memory with an anonymous root layer. usdStage = UsdStage::CreateInMemory(kAnonymousLayerName, loadSet); diff --git a/lib/mayaUsd/nodes/stageNode.cpp b/lib/mayaUsd/nodes/stageNode.cpp index 86bcf2bb1e..db6c264f04 100644 --- a/lib/mayaUsd/nodes/stageNode.cpp +++ b/lib/mayaUsd/nodes/stageNode.cpp @@ -15,6 +15,7 @@ // #include "stageNode.h" +#include #include #include @@ -34,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -107,9 +109,21 @@ MStatus UsdMayaStageNode::compute(const MPlug& plug, MDataBlock& dataBlock) if (SdfLayerRefPtr rootLayer = SdfLayer::FindOrOpen(usdFile)) { const bool loadAll = true; UsdStageCacheContext ctx(UsdMayaStageCache::Get(loadAll)); - usdStage = UsdStage::Open(rootLayer, ArGetResolver().GetCurrentContext()); - usdStage->SetEditTarget(usdStage->GetRootLayer()); + bool targetSession = MGlobal::optionVarIntValue(toMString( + MayaUsdOptionVars->mayaUsd_ProxyTargetsSessionLayerOnOpen)) + == 1; + targetSession = targetSession || !rootLayer->PermissionToEdit(); + + if (targetSession) { + SdfLayerRefPtr sessionLayer = SdfLayer::CreateAnonymous(); + usdStage + = UsdStage::Open(rootLayer, sessionLayer, ArGetResolver().GetCurrentContext()); + usdStage->SetEditTarget(sessionLayer); + } else { + usdStage = UsdStage::Open(rootLayer, ArGetResolver().GetCurrentContext()); + usdStage->SetEditTarget(usdStage->GetRootLayer()); + } } SdfPath primPath;