Skip to content

Commit

Permalink
Merge pull request #3607 from Autodesk/bailp/EMSUSD-708/instanceable-…
Browse files Browse the repository at this point in the history
…perf

EMSUSD-708 fix performance of instanceable prims
  • Loading branch information
samuelliu-adsk authored Feb 15, 2024
2 parents 4c2eddc + e61812f commit 1521daa
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 7 deletions.
4 changes: 2 additions & 2 deletions lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -910,12 +910,12 @@ void HdVP2BasisCurves::_UpdateDrawItem(
if (0 == instanceCount) {
instancerWithNoInstances = true;
} else {
const SdfPathVector usdPaths = drawScene.GetScenePrimPaths(id, instanceCount);
stateToCommit._instanceTransforms->setLength(instanceCount);
for (unsigned int i = 0; i < instanceCount; ++i) {
transforms[i].Get(instanceMatrix.matrix);
(*stateToCommit._instanceTransforms)[i] = worldMatrix * instanceMatrix;
stateToCommit._ufeIdentifiers.append(
drawScene.GetScenePrimPath(GetId(), i).GetString().c_str());
stateToCommit._ufeIdentifiers.append(usdPaths[i].GetString().c_str());
}

// If the item is used for both regular draw and selection highlight,
Expand Down
7 changes: 5 additions & 2 deletions lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -808,9 +808,12 @@ void MayaUsdRPrim::_SyncDisplayLayerModesInstanced(SdfPath const& id, unsigned i
_requiredModFlagsBitset.reset();
if (_useInstancedDisplayLayerModes) {
_displayLayerModesInstanced.resize(instanceCount);

const SdfPathVector usdPaths = drawScene.GetScenePrimPaths(id, instanceCount);

for (unsigned int usdInstanceId = 0; usdInstanceId < instanceCount; usdInstanceId++) {
auto usdPath = drawScene.GetScenePrimPath(id, usdInstanceId);
auto& displayLayerModes = _displayLayerModesInstanced[usdInstanceId];
auto& displayLayerModes = _displayLayerModesInstanced[usdInstanceId];
const SdfPath& usdPath = usdPaths[usdInstanceId];
_PopulateDisplayLayerModes(usdPath, displayLayerModes, drawScene);

if (displayLayerModes._reprOverride == kBBox) {
Expand Down
4 changes: 2 additions & 2 deletions lib/mayaUsd/render/vp2RenderDelegate/points.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -607,12 +607,12 @@ void HdVP2Points::_UpdateDrawItem(
if (0 == instanceCount) {
instancerWithNoInstances = true;
} else {
const SdfPathVector usdPaths = drawScene.GetScenePrimPaths(id, instanceCount);
stateToCommit._instanceTransforms->setLength(instanceCount);
for (unsigned int i = 0; i < instanceCount; ++i) {
transforms[i].Get(instanceMatrix.matrix);
(*stateToCommit._instanceTransforms)[i] = worldMatrix * instanceMatrix;
stateToCommit._ufeIdentifiers.append(
drawScene.GetScenePrimPath(GetId(), i).GetString().c_str());
stateToCommit._ufeIdentifiers.append(usdPaths[i].GetString().c_str());
}

// If the item is used for both regular draw and selection highlight,
Expand Down
33 changes: 32 additions & 1 deletion lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1343,6 +1343,37 @@ SdfPath ProxyRenderDelegate::GetScenePrimPath(const SdfPath& rprimId, int instan
return usdPath;
}

static std::vector<int> fillInstanceIds(unsigned int instanceCount)
{
std::vector<int> usdInstanceIds;
usdInstanceIds.reserve(instanceCount);
for (unsigned int usdInstanceId = 0; usdInstanceId < instanceCount; usdInstanceId++)
usdInstanceIds.emplace_back(usdInstanceId);
return usdInstanceIds;
}

SdfPathVector
ProxyRenderDelegate::GetScenePrimPaths(const SdfPath& rprimId, unsigned int instanceCount) const
{
return GetScenePrimPaths(rprimId, fillInstanceIds(instanceCount));
}

SdfPathVector ProxyRenderDelegate::GetScenePrimPaths(
const SdfPath& rprimId,
std::vector<int> instanceIndexes) const
{
#if defined(USD_IMAGING_API_VERSION) && USD_IMAGING_API_VERSION >= 17
return _sceneDelegate->GetScenePrimPaths(rprimId, instanceIndexes);
#else
SdfPathVector usdPaths;
usdPaths.reserve(instanceIndexes.size());
for (int instanceIndex : instanceIndexes) {
usdPaths.emplace_back(GetScenePrimPath(rprimId, instanceIndex));
}
return usdPaths;
#endif
}

//! \brief Selection for both instanced and non-instanced cases.
bool ProxyRenderDelegate::getInstancedSelectionPath(
const MHWRender::MRenderItem& renderItem,
Expand Down Expand Up @@ -1395,7 +1426,7 @@ bool ProxyRenderDelegate::getInstancedSelectionPath(
topLevelInstanceIndex = instancerContext.front().second;
}
#else
SdfPath usdPath = GetScenePrimPath(rprimId, instanceIndex);
SdfPath usdPath = GetScenePrimPath(rprimId, instanceIndex);
#endif

// If update for selection is enabled, we can query the Maya selection list
Expand Down
3 changes: 3 additions & 0 deletions lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,9 @@ class ProxyRenderDelegate
SdfPath GetScenePrimPath(const SdfPath& rprimId, int instanceIndex) const;
#endif

SdfPathVector GetScenePrimPaths(const SdfPath& rprimId, std::vector<int> instanceIndexes) const;
SdfPathVector GetScenePrimPaths(const SdfPath& rprimId, unsigned int instanceCount) const;

MAYAUSD_CORE_PUBLIC
void SelectionChanged();

Expand Down

0 comments on commit 1521daa

Please sign in to comment.