Skip to content

Commit

Permalink
Merge pull request #785 from Autodesk/t-al-sa/BIFROST-4592/proxy-node…
Browse files Browse the repository at this point in the history
…-cache-id

Adding Cache Id to the Base Proxy Node
  • Loading branch information
Krystian Ligenza authored Oct 2, 2020
2 parents 2135906 + ffdc388 commit 299cda1
Show file tree
Hide file tree
Showing 6 changed files with 388 additions and 74 deletions.
227 changes: 162 additions & 65 deletions lib/mayaUsd/nodes/proxyShapeBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include <maya/MFnNumericAttribute.h>
#include <maya/MFnPluginData.h>
#include <maya/MFnReference.h>
#include <maya/MFnStringData.h>
#include <maya/MFnTypedAttribute.h>
#include <maya/MFnUnitAttribute.h>
#include <maya/MGlobal.h>
Expand Down Expand Up @@ -123,12 +124,14 @@ MObject MayaUsdProxyShapeBase::timeAttr;
MObject MayaUsdProxyShapeBase::complexityAttr;
MObject MayaUsdProxyShapeBase::inStageDataAttr;
MObject MayaUsdProxyShapeBase::inStageDataCachedAttr;
MObject MayaUsdProxyShapeBase::stageCacheIdAttr;
MObject MayaUsdProxyShapeBase::drawRenderPurposeAttr;
MObject MayaUsdProxyShapeBase::drawProxyPurposeAttr;
MObject MayaUsdProxyShapeBase::drawGuidePurposeAttr;
// Output attributes
MObject MayaUsdProxyShapeBase::outTimeAttr;
MObject MayaUsdProxyShapeBase::outStageDataAttr;
MObject MayaUsdProxyShapeBase::outStageCacheIdAttr;

/* static */
void*
Expand Down Expand Up @@ -254,6 +257,23 @@ MayaUsdProxyShapeBase::initialize()
retValue = addAttribute(inStageDataCachedAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);

stageCacheIdAttr = numericAttrFn.create(
"stageCacheId",
"stcid",
MFnNumericData::kInt,
-1,
&retValue);
CHECK_MSTATUS_AND_RETURN_IT(retValue);
numericAttrFn.setDisconnectBehavior(MFnNumericAttribute::kReset); // on disconnect, reset to default
numericAttrFn.setStorable(false);
numericAttrFn.setCached(true);
numericAttrFn.setConnectable(true);
numericAttrFn.setReadable(true);
numericAttrFn.setInternal(true);
numericAttrFn.setAffectsAppearance(true);
retValue = addAttribute(stageCacheIdAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);

drawRenderPurposeAttr = numericAttrFn.create(
"drawRenderPurpose",
"drp",
Expand Down Expand Up @@ -322,6 +342,19 @@ MayaUsdProxyShapeBase::initialize()
retValue = addAttribute(outStageDataAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);

outStageCacheIdAttr = numericAttrFn.create(
"outStageCacheId",
"ostcid",
MFnNumericData::kInt,
-1,
&retValue);
CHECK_MSTATUS_AND_RETURN_IT(retValue);
typedAttrFn.setStorable(false);
typedAttrFn.setWritable(false);
retValue = addAttribute(outStageCacheIdAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);


//
// add attribute dependencies
//
Expand All @@ -332,24 +365,41 @@ MayaUsdProxyShapeBase::initialize()
CHECK_MSTATUS_AND_RETURN_IT(retValue);
retValue = attributeAffects(filePathAttr, outStageDataAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);
retValue = attributeAffects(filePathAttr, outStageCacheIdAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);

retValue = attributeAffects(primPathAttr, inStageDataCachedAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);
retValue = attributeAffects(primPathAttr, outStageDataAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);
retValue = attributeAffects(primPathAttr, outStageCacheIdAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);

retValue = attributeAffects(loadPayloadsAttr, inStageDataCachedAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);
retValue = attributeAffects(loadPayloadsAttr, outStageDataAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);
retValue = attributeAffects(loadPayloadsAttr, outStageCacheIdAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);

retValue = attributeAffects(inStageDataAttr, inStageDataCachedAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);
retValue = attributeAffects(inStageDataAttr, outStageDataAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);
retValue = attributeAffects(inStageDataAttr, outStageCacheIdAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);

retValue = attributeAffects(stageCacheIdAttr, outStageDataAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);
retValue = attributeAffects(stageCacheIdAttr, inStageDataCachedAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);
retValue = attributeAffects(stageCacheIdAttr, outStageCacheIdAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);

retValue = attributeAffects(inStageDataCachedAttr, outStageDataAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);
retValue = attributeAffects(inStageDataCachedAttr, outStageCacheIdAttr);
CHECK_MSTATUS_AND_RETURN_IT(retValue);

return retValue;
}
Expand Down Expand Up @@ -443,6 +493,9 @@ MayaUsdProxyShapeBase::compute(const MPlug& plug, MDataBlock& dataBlock)
else if (plug == outStageDataAttr) {
return computeOutStageData(dataBlock);
}
else if (plug == outStageCacheIdAttr) {
return computeOutStageCacheId(dataBlock);
}

return MS::kUnknownParameter;
}
Expand Down Expand Up @@ -517,80 +570,89 @@ MayaUsdProxyShapeBase::computeInStageDataCached(MDataBlock& dataBlock)
return MS::kSuccess;
}
else {
//
// Calculate from USD filepath and primPath and variantKey
//

// Get input attr values
const MString file = dataBlock.inputValue(filePathAttr, &retValue).asString();
// Check if we have a Stage from the Cache Id
const auto cacheIdNum = dataBlock.inputValue(stageCacheIdAttr, &retValue).asInt();
CHECK_MSTATUS_AND_RETURN_IT(retValue);
UsdStageRefPtr usdStage;
const auto cacheId = UsdStageCache::Id::FromLongInt(cacheIdNum);
const auto stageCached = cacheId.IsValid() && UsdUtilsStageCache::Get().Contains(cacheId);
if (stageCached) {
usdStage = UsdUtilsStageCache::Get().Find(cacheId);
}
else {
//
// Calculate from USD filepath and primPath and variantKey
//

//
// let the usd stage cache deal with caching the usd stage data
//
std::string fileString = TfStringTrimRight(file.asChar());

TF_DEBUG(USDMAYA_PROXYSHAPEBASE).Msg("ProxyShapeBase::reloadStage original USD file path is %s\n", fileString.c_str());
// Get input attr values
const MString file = dataBlock.inputValue(filePathAttr, &retValue).asString();
CHECK_MSTATUS_AND_RETURN_IT(retValue);

boost::filesystem::path filestringPath(fileString);
if(filestringPath.is_absolute())
{
fileString = UsdMayaUtilFileSystem::resolvePath(fileString);
TF_DEBUG(USDMAYA_PROXYSHAPEBASE).Msg("ProxyShapeBase::reloadStage resolved the USD file path to %s\n", fileString.c_str());
}
else
{
fileString = UsdMayaUtilFileSystem::resolveRelativePathWithinMayaContext(thisMObject(), fileString);
TF_DEBUG(USDMAYA_PROXYSHAPEBASE).Msg("ProxyShapeBase::reloadStage resolved the relative USD file path to %s\n", fileString.c_str());
}
//
// let the usd stage cache deal with caching the usd stage data
//
std::string fileString = TfStringTrimRight(file.asChar());

// Fall back on providing the path "as is" to USD
if (fileString.empty())
{
fileString.assign(file.asChar(), file.length());
}
TF_DEBUG(USDMAYA_PROXYSHAPEBASE).Msg("ProxyShapeBase::reloadStage original USD file path is %s\n", fileString.c_str());

TF_DEBUG(USDMAYA_PROXYSHAPEBASE).Msg("ProxyShapeBase::loadStage called for the usd file: %s\n", fileString.c_str());
boost::filesystem::path filestringPath(fileString);
if(filestringPath.is_absolute())
{
fileString = UsdMayaUtilFileSystem::resolvePath(fileString);
TF_DEBUG(USDMAYA_PROXYSHAPEBASE).Msg("ProxyShapeBase::reloadStage resolved the USD file path to %s\n", fileString.c_str());
}
else
{
fileString = UsdMayaUtilFileSystem::resolveRelativePathWithinMayaContext(thisMObject(), fileString);
TF_DEBUG(USDMAYA_PROXYSHAPEBASE).Msg("ProxyShapeBase::reloadStage resolved the relative USD file path to %s\n", fileString.c_str());
}

// == Load the Stage
UsdStageRefPtr usdStage;
SdfPath primPath;
auto loadSet = UsdStage::InitialLoadSet::LoadAll;
// Fall back on providing the path "as is" to USD
if (fileString.empty())
{
fileString.assign(file.asChar(), file.length());
}

MDataHandle loadPayloadsHandle = dataBlock.inputValue(loadPayloadsAttr, &retValue);
CHECK_MSTATUS_AND_RETURN_IT(retValue);
if (!loadPayloadsHandle.asBool()) {
loadSet = UsdStage::InitialLoadSet::LoadNone;
}
TF_DEBUG(USDMAYA_PROXYSHAPEBASE).Msg("ProxyShapeBase::loadStage called for the usd file: %s\n", fileString.c_str());

{
// When opening or creating stages we must have an active UsdStageCache.
// The stage cache is the only one who holds a strong reference to the
// UsdStage. See https://github.com/Autodesk/maya-usd/issues/528 for
// more information.
UsdStageCacheContext ctx(UsdMayaStageCache::Get(loadSet == UsdStage::InitialLoadSet::LoadAll));

if (SdfLayerRefPtr rootLayer = SdfLayer::FindOrOpen(fileString)) {
SdfLayerRefPtr sessionLayer = computeSessionLayer(dataBlock);
if (sessionLayer) {
usdStage = UsdStage::Open(rootLayer,
sessionLayer,
ArGetResolver().GetCurrentContext(),
loadSet);
} else {
usdStage = UsdStage::Open(rootLayer,
ArGetResolver().GetCurrentContext(),
loadSet);
}
// == Load the Stage
auto loadSet = UsdStage::InitialLoadSet::LoadAll;

usdStage->SetEditTarget(usdStage->GetRootLayer());
}
else {
// Create a new stage in memory with an anonymous root layer.
usdStage = UsdStage::CreateInMemory(kAnonymousLayerName, loadSet);
MDataHandle loadPayloadsHandle = dataBlock.inputValue(loadPayloadsAttr, &retValue);
CHECK_MSTATUS_AND_RETURN_IT(retValue);
if (!loadPayloadsHandle.asBool()) {
loadSet = UsdStage::InitialLoadSet::LoadNone;
}
}

{
// When opening or creating stages we must have an active UsdStageCache.
// The stage cache is the only one who holds a strong reference to the
// UsdStage. See https://github.com/Autodesk/maya-usd/issues/528 for
// more information.
UsdStageCacheContext ctx(UsdMayaStageCache::Get(loadSet == UsdStage::InitialLoadSet::LoadAll));

if (SdfLayerRefPtr rootLayer = SdfLayer::FindOrOpen(fileString)) {
SdfLayerRefPtr sessionLayer = computeSessionLayer(dataBlock);
if (sessionLayer) {
usdStage = UsdStage::Open(rootLayer,
sessionLayer,
ArGetResolver().GetCurrentContext(),
loadSet);
} else {
usdStage = UsdStage::Open(rootLayer,
ArGetResolver().GetCurrentContext(),
loadSet);
}

usdStage->SetEditTarget(usdStage->GetRootLayer());
}
else {
// Create a new stage in memory with an anonymous root layer.
usdStage = UsdStage::CreateInMemory(kAnonymousLayerName, loadSet);
}
}
}
SdfPath primPath;
if (usdStage) {
primPath = usdStage->GetPseudoRoot().GetPath();
}
Expand Down Expand Up @@ -748,6 +810,39 @@ MayaUsdProxyShapeBase::computeOutputTime(MDataBlock& dataBlock)
return retValue;
}

MStatus
MayaUsdProxyShapeBase::computeOutStageCacheId(MDataBlock& dataBlock)
{
MStatus retValue = MS::kSuccess;

MDataHandle inDataCachedHandle = dataBlock.inputValue(inStageDataCachedAttr, &retValue);
CHECK_MSTATUS_AND_RETURN_IT(retValue);

UsdStageRefPtr usdStage;

MayaUsdStageData* inData = dynamic_cast<MayaUsdStageData*>(inDataCachedHandle.asPluginData());
if (inData) {
usdStage = inData->stage;
}

if (!usdStage) {
return MS::kFailure;
}

int cacheId = -1;
auto id = UsdUtilsStageCache::Get().Insert(usdStage);
if (id)
cacheId = id.ToLongInt();

MDataHandle outCacheIdHandle = dataBlock.outputValue(outStageCacheIdAttr, &retValue);
CHECK_MSTATUS_AND_RETURN_IT(retValue);

outCacheIdHandle.set(cacheId);
outCacheIdHandle.setClean();

return MS::kSuccess;
}

/* virtual */
bool
MayaUsdProxyShapeBase::isBounded() const
Expand Down Expand Up @@ -883,7 +978,8 @@ MayaUsdProxyShapeBase::preEvaluation(const MDGContext& context, const MEvaluatio
evaluationNode.dirtyPlugExists(filePathAttr) ||
evaluationNode.dirtyPlugExists(primPathAttr) ||
evaluationNode.dirtyPlugExists(loadPayloadsAttr) ||
evaluationNode.dirtyPlugExists(inStageDataAttr)) {
evaluationNode.dirtyPlugExists(inStageDataAttr) ||
evaluationNode.dirtyPlugExists(stageCacheIdAttr)) {
_IncreaseUsdStageVersion();
MayaUsdProxyStageInvalidateNotice(*this).Send();
}
Expand Down Expand Up @@ -931,7 +1027,8 @@ MayaUsdProxyShapeBase::setDependentsDirty(const MPlug& plug, MPlugArray& plugArr
plug == filePathAttr ||
plug == primPathAttr ||
plug == loadPayloadsAttr ||
plug == inStageDataAttr) {
plug == inStageDataAttr ||
plug == stageCacheIdAttr) {
_IncreaseUsdStageVersion();
MayaUsdProxyStageInvalidateNotice(*this).Send();
}
Expand Down
5 changes: 5 additions & 0 deletions lib/mayaUsd/nodes/proxyShapeBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ class MayaUsdProxyShapeBase : public MPxSurfaceShape,
MAYAUSD_CORE_PUBLIC
static MObject inStageDataCachedAttr;
MAYAUSD_CORE_PUBLIC
static MObject stageCacheIdAttr;
MAYAUSD_CORE_PUBLIC
static MObject drawRenderPurposeAttr;
MAYAUSD_CORE_PUBLIC
static MObject drawProxyPurposeAttr;
Expand All @@ -115,6 +117,8 @@ class MayaUsdProxyShapeBase : public MPxSurfaceShape,
static MObject outTimeAttr;
MAYAUSD_CORE_PUBLIC
static MObject outStageDataAttr;
MAYAUSD_CORE_PUBLIC
static MObject outStageCacheIdAttr;

/// Delegate function for computing the closest point and surface normal
/// on the proxy shape to a given ray.
Expand Down Expand Up @@ -315,6 +319,7 @@ class MayaUsdProxyShapeBase : public MPxSurfaceShape,
MStatus computeOutputTime(MDataBlock& dataBlock);
MStatus computeInStageDataCached(MDataBlock& dataBlock);
MStatus computeOutStageData(MDataBlock& dataBlock);
MStatus computeOutStageCacheId(MDataBlock& dataBlock);

SdfPathVector _GetExcludePrimPaths(MDataBlock dataBlock) const;
int _GetComplexity(MDataBlock dataBlock) const;
Expand Down
Loading

0 comments on commit 299cda1

Please sign in to comment.