Skip to content

Commit 6d7d1be

Browse files
HnMesh: improved handling of geometry subset items
1 parent 935b165 commit 6d7d1be

File tree

2 files changed

+15
-24
lines changed

2 files changed

+15
-24
lines changed

Hydrogent/interface/HnMesh.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,8 @@ class HnMesh final : public pxr::HdMesh
141141
// is used.
142142
virtual void _InitRepr(const pxr::TfToken& reprToken, pxr::HdDirtyBits* dirtyBits) override final;
143143

144-
void UpdateReprMaterials(pxr::HdSceneDelegate* SceneDelegate,
145-
pxr::HdRenderParam* RenderParam);
144+
void UpdateReprMaterials(const pxr::HdRenderIndex& RenderIndex,
145+
pxr::HdRenderParam* RenderParam);
146146

147147
private:
148148
HnMesh(const pxr::TfToken& typeId,
@@ -237,7 +237,8 @@ class HnMesh final : public pxr::HdMesh
237237
const pxr::TfToken& ReprToken,
238238
HdMeshTopologyWrapper& MeshTopology);
239239

240-
void AddGeometrySubsetDrawItems(const pxr::HdMeshReprDesc& ReprDesc,
240+
void AddGeometrySubsetDrawItems(const pxr::HdRenderIndex& RenderIndex,
241+
const pxr::HdMeshReprDesc& ReprDesc,
241242
pxr::HdRepr& Repr);
242243
void UpdateDrawItemsForGeometrySubsets(pxr::HdSceneDelegate& SceneDelegate,
243244
pxr::HdRenderParam* RenderParam);

Hydrogent/src/HnMesh.cpp

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

318308
void 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

Comments
 (0)