diff --git a/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp b/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp index 03326da0ed..7019fbd5d9 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp @@ -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, diff --git a/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp b/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp index 97b9d2d22c..43cdef921b 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp @@ -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) { diff --git a/lib/mayaUsd/render/vp2RenderDelegate/points.cpp b/lib/mayaUsd/render/vp2RenderDelegate/points.cpp index 4b50cc132e..239912e130 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/points.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/points.cpp @@ -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, diff --git a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp index 355b7ae364..716d65c721 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp @@ -1343,6 +1343,37 @@ SdfPath ProxyRenderDelegate::GetScenePrimPath(const SdfPath& rprimId, int instan return usdPath; } +static std::vector fillInstanceIds(unsigned int instanceCount) +{ + std::vector 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 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, @@ -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 diff --git a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h index 8f5ee9cdb9..e900d84058 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h +++ b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h @@ -159,6 +159,9 @@ class ProxyRenderDelegate SdfPath GetScenePrimPath(const SdfPath& rprimId, int instanceIndex) const; #endif + SdfPathVector GetScenePrimPaths(const SdfPath& rprimId, std::vector instanceIndexes) const; + SdfPathVector GetScenePrimPaths(const SdfPath& rprimId, unsigned int instanceCount) const; + MAYAUSD_CORE_PUBLIC void SelectionChanged();