@@ -154,11 +154,9 @@ void HnMesh::ProcessDrawItems(HandleDrawItemFuncType&& HandleDrawItem,
154154 }
155155}
156156
157- void HnMesh::UpdateReprMaterials (pxr::HdSceneDelegate* SceneDelegate ,
158- pxr::HdRenderParam* RenderParam)
157+ void HnMesh::UpdateReprMaterials (const pxr::HdRenderIndex& RenderIndex ,
158+ pxr::HdRenderParam* RenderParam)
159159{
160- const pxr::HdRenderIndex& RenderIndex = SceneDelegate->GetRenderIndex ();
161-
162160 ProcessDrawItems (
163161 [&](HnDrawItem& DrawItem) {
164162 SetDrawItemMaterial (RenderIndex, DrawItem, GetMaterialId ());
@@ -212,23 +210,19 @@ void HnMesh::Sync(pxr::HdSceneDelegate* Delegate,
212210 UpdateMaterials = true ;
213211 *DirtyBits &= ~pxr::HdChangeTracker::DirtyMaterialId;
214212 }
213+
215214 if ((*DirtyBits & pxr::HdChangeTracker::DirtyDisplayStyle) != 0 )
216215 {
217216 UpdateMaterials = true ;
218217 *DirtyBits &= ~pxr::HdChangeTracker::DirtyDisplayStyle;
219218 }
220219
221- const bool IsNewRepr = (*DirtyBits & pxr::HdChangeTracker::NewRepr) != 0 ;
222- // UpdateRepr() clears the NewRepr bit
223220 const bool ReprUpdated = UpdateRepr (*Delegate, RenderParam, *DirtyBits, ReprToken);
224- if (IsNewRepr && ReprUpdated)
225- {
226- UpdateMaterials = true ;
227- }
228221
222+ // Update materials after the repr is updated, so that the draw items are created
229223 if (UpdateMaterials)
230224 {
231- UpdateReprMaterials (Delegate, RenderParam);
225+ UpdateReprMaterials (Delegate-> GetRenderIndex () , RenderParam);
232226 }
233227
234228 const bool DirtyDoubleSided = (*DirtyBits & pxr::HdChangeTracker::DirtyDoubleSided) != 0 ;
@@ -273,16 +267,16 @@ pxr::HdDirtyBits HnMesh::_PropagateDirtyBits(pxr::HdDirtyBits bits) const
273267 return bits;
274268}
275269
276- void HnMesh::AddGeometrySubsetDrawItems (const pxr::HdMeshReprDesc& ReprDesc, pxr::HdRepr& Repr)
270+ void HnMesh::AddGeometrySubsetDrawItems (const pxr::HdRenderIndex& RenderIndex, const pxr:: HdMeshReprDesc& ReprDesc, pxr::HdRepr& Repr)
277271{
278272 if (ReprDesc.geomStyle == pxr::HdMeshGeomStyleInvalid ||
279273 ReprDesc.geomStyle == pxr::HdMeshGeomStylePoints)
280274 return ;
281275
282- const size_t NumGeomSubsets = m_Topology.Subsets .size ();
283- for (size_t i = 0 ; i < NumGeomSubsets; ++i)
276+ for (const Topology::Subset& Subset : m_Topology.Subsets )
284277 {
285- pxr::HdRepr::DrawItemUniquePtr Item = std::make_unique<HnDrawItem>(_sharedData, *this );
278+ std::unique_ptr<HnDrawItem> Item = std::make_unique<HnDrawItem>(_sharedData, *this );
279+ SetDrawItemMaterial (RenderIndex, *Item, Subset.MaterialId );
286280 Repr.AddGeomSubsetDrawItem (std::move (Item));
287281 }
288282}
@@ -308,11 +302,7 @@ void HnMesh::_InitRepr(const pxr::TfToken& ReprToken, pxr::HdDirtyBits* DirtyBit
308302 Repr.AddDrawItem (std::make_unique<HnDrawItem>(_sharedData, *this ));
309303 }
310304
311- // Note that geometry susbset items may change later.
312- for (const pxr::HdMeshReprDesc& Desc : ReprDescs)
313- {
314- AddGeometrySubsetDrawItems (Desc, Repr);
315- }
305+ // Geometry susbset items will be added after the topology is updated.
316306}
317307
318308void HnMesh::Invalidate ()
@@ -635,7 +625,7 @@ void HnMesh::UpdateDrawItemsForGeometrySubsets(pxr::HdSceneDelegate& SceneDelega
635625 Repr->ClearGeomSubsetDrawItems ();
636626 for (const pxr::HdMeshReprDesc& Desc : Descs)
637627 {
638- AddGeometrySubsetDrawItems (Desc, *Repr);
628+ AddGeometrySubsetDrawItems (SceneDelegate. GetRenderIndex (), Desc, *Repr);
639629 }
640630 }
641631}
0 commit comments