Skip to content

Commit

Permalink
Restore session layer properly or create one when root-layer is not e…
Browse files Browse the repository at this point in the history
…ditable.
  • Loading branch information
rzulak committed Nov 18, 2020
1 parent d76c4a0 commit eca8845
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 5 deletions.
2 changes: 2 additions & 0 deletions lib/mayaUsd/base/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@
target_sources(${PROJECT_NAME}
PRIVATE
debugCodes.cpp
tokens.cpp
)

set(HEADERS
api.h
debugCodes.h
tokens.h
)

# -----------------------------------------------------------------------------
Expand Down
22 changes: 22 additions & 0 deletions lib/mayaUsd/base/tokens.cpp
Original file line number Diff line number Diff line change
@@ -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
43 changes: 43 additions & 0 deletions lib/mayaUsd/base/tokens.h
Original file line number Diff line number Diff line change
@@ -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 <pxr/base/tf/staticTokens.h>
#include <pxr/pxr.h>

#include <maya/MString.h>

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
19 changes: 16 additions & 3 deletions lib/mayaUsd/nodes/proxyShapeBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "proxyShapeBase.h"

#include <mayaUsd/base/debugCodes.h>
#include <mayaUsd/base/tokens.h>
#include <mayaUsd/listeners/proxyShapeNotice.h>
#include <mayaUsd/nodes/stageData.h>
#include <mayaUsd/utils/query.h>
Expand Down Expand Up @@ -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);
Expand Down
18 changes: 16 additions & 2 deletions lib/mayaUsd/nodes/stageNode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
//
#include "stageNode.h"

#include <mayaUsd/base/tokens.h>
#include <mayaUsd/nodes/stageData.h>
#include <mayaUsd/utils/stageCache.h>

Expand All @@ -34,6 +35,7 @@
#include <maya/MFnPluginData.h>
#include <maya/MFnStringData.h>
#include <maya/MFnTypedAttribute.h>
#include <maya/MGlobal.h>
#include <maya/MObject.h>
#include <maya/MPlug.h>
#include <maya/MPxNode.h>
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit eca8845

Please sign in to comment.