Skip to content

Commit

Permalink
EMSUSD-708 fix performance of instanceable prims
Browse files Browse the repository at this point in the history
Call the Usdimaging function to retrieve all instance prim path at once instead
of one-by-one, which optimizes many internal details.

- Use the same faster code in a few other similar places.
- Add a convenience function to retrieve all the prim paths when the instance ID are consecutives.
- Use it in a few places.
  • Loading branch information
pierrebai-adsk committed Feb 12, 2024
1 parent d68d172 commit e61812f
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 e61812f

Please sign in to comment.