From 5486079029fc10ba64da0ae6ca3629ac269ee879 Mon Sep 17 00:00:00 2001 From: Pierre Baillargeon Date: Fri, 25 Jul 2025 16:12:30 -0400 Subject: [PATCH] Fix point instancer crash Apply a fix similar to other palces in the same file. Not 100% it is entirely right, as my knowledge of the VP2 render delegate and instancer is not high. --- .../vp2RenderDelegate/mayaPrimCommon.cpp | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp b/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp index 2b2d2d90e3..7d43a83e24 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp @@ -776,15 +776,32 @@ void MayaUsdRPrim::_SyncDisplayLayerModes(SdfPath const& id, bool instancedPrim) _displayLayerModesFrame = drawScene.GetFrameCounter(); // Obtain scene prim path - HdInstancerContext instancerContext; - int instanceIndex = instancedPrim ? 0 : UsdImagingDelegate::ALL_INSTANCES; - auto usdPath = drawScene.GetScenePrimPath(id, instanceIndex, &instancerContext); - - // Native instances use per-instance _displayLayerModes - if (instancedPrim && instancerContext.empty()) { - _useInstancedDisplayLayerModes = true; - _displayLayerModes = DisplayLayerModes(); - return; + SdfPath usdPath; + + if (instancedPrim) { + auto delegate = drawScene.GetUsdImagingDelegate(); + auto instancerId = delegate->GetInstancerId(id); + + VtIntArray indices = delegate->GetInstanceIndices(instancerId, id); + const int instanceIndex = indices.empty() ? 0 : indices[0]; + + // The additional condition below is to prevent a crash in USD function GetScenePrimPath + bool instanced = !instancerId.IsEmpty(); + instanced = (instanced && !indices.empty()); + + HdInstancerContext instancerContext; + usdPath = instanced ? drawScene.GetScenePrimPath(id, instanceIndex, &instancerContext) + : SdfPath(); + + // Native instances use per-instance _displayLayerModes + if (instancerContext.empty()) { + _useInstancedDisplayLayerModes = true; + _displayLayerModes = DisplayLayerModes(); + return; + } + } else { + const int instanceIndex = UsdImagingDelegate::ALL_INSTANCES; + usdPath = drawScene.GetScenePrimPath(id, instanceIndex, nullptr); } // Otherwise, populate display layer modes