Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MAYA-111760 Invisibile prims don't get notifications on _PropagateDirtyBits or #1432

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -665,6 +665,13 @@ void HdVP2BasisCurves::Sync(

if (HdChangeTracker::IsVisibilityDirty(*dirtyBits, id)) {
_sharedData.visible = delegate->GetVisible(id);

// Invisible rprims don't get calls to Sync or _PropagateDirtyBits while
// they are invisible. This means that when a prim goes from visible to
// invisible that we must update every repr, because if we switch reprs while
// invisible we'll get no chance to update!
if (!_sharedData.visible)
_MakeOtherReprRenderItemsInvisible(delegate, reprToken);
}

if (*dirtyBits
Expand Down Expand Up @@ -1681,6 +1688,39 @@ void HdVP2BasisCurves::_InitRepr(TfToken const& reprToken, HdDirtyBits* dirtyBit
}
}

/*! \brief Hide all of the repr objects for this Rprim except the named repr.
Repr objects are created to support specific reprName tokens, and contain a list of
HdVP2DrawItems and corresponding RenderItems.
*/
void HdVP2BasisCurves::_MakeOtherReprRenderItemsInvisible(
HdSceneDelegate* sceneDelegate,
const TfToken& reprToken)
{
for (const std::pair<TfToken, HdReprSharedPtr>& pair : _reprs) {
if (pair.first != reprToken) {
// For each relevant draw item, update dirty buffer sources.
const HdReprSharedPtr& repr = pair.second;
const auto& items = repr->GetDrawItems();

#if HD_API_VERSION < 35
for (HdDrawItem* item : items) {
if (HdVP2DrawItem* drawItem = static_cast<HdVP2DrawItem*>(item)) {
#else
for (const HdRepr::DrawItemUniquePtr& item : items) {
if (HdVP2DrawItem* const drawItem = static_cast<HdVP2DrawItem*>(item.get())) {
#endif
for (auto& renderItemData : drawItem->GetRenderItems()) {
_delegate->GetVP2ResourceRegistry().EnqueueCommit([&renderItemData]() {
renderItemData._enabled = false;
renderItemData._renderItem->enable(false);
});
}
}
}
}
}
}

/*! \brief Update the named repr object for this Rprim.

Repr objects are created to support specific reprName tokens, and contain a list of
Expand Down
1 change: 1 addition & 0 deletions lib/mayaUsd/render/vp2RenderDelegate/basisCurves.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ class HdVP2BasisCurves final : public HdBasisCurves

private:
void _UpdateRepr(HdSceneDelegate* sceneDelegate, TfToken const& reprToken);
void _MakeOtherReprRenderItemsInvisible(HdSceneDelegate*, const TfToken&);

void _CommitMVertexBuffer(MHWRender::MVertexBuffer* const, void*) const;

Expand Down
42 changes: 42 additions & 0 deletions lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1042,6 +1042,13 @@ void HdVP2Mesh::Sync(

if (HdChangeTracker::IsVisibilityDirty(*dirtyBits, id)) {
_sharedData.visible = delegate->GetVisible(id);

// Invisible rprims don't get calls to Sync or _PropagateDirtyBits while
// they are invisible. This means that when a prim goes from visible to
// invisible that we must update every repr, because if we switch reprs while
// invisible we'll get no chance to update!
if (!_sharedData.visible)
_MakeOtherReprRenderItemsInvisible(delegate, reprToken);
}

if (*dirtyBits
Expand Down Expand Up @@ -1474,6 +1481,41 @@ void HdVP2Mesh::_CreateSmoothHullRenderItems(HdVP2DrawItem& drawItem)
TF_VERIFY(numFacesWithoutRenderItem == 0);
}

/*! \brief Hide all of the repr objects for this Rprim except the named repr.

Repr objects are created to support specific reprName tokens, and contain a list of
HdVP2DrawItems and corresponding RenderItems.
*/
void HdVP2Mesh::_MakeOtherReprRenderItemsInvisible(
HdSceneDelegate* sceneDelegate,
const TfToken& reprToken)
{
for (const std::pair<TfToken, HdReprSharedPtr>& pair : _reprs) {
if (pair.first != reprToken) {
// For each relevant draw item, update dirty buffer sources.
_MeshReprConfig::DescArray reprDescs = _GetReprDesc(pair.first);
int drawItemIndex = 0;
for (size_t descIdx = 0; descIdx < reprDescs.size(); ++descIdx, drawItemIndex++) {
const HdMeshReprDesc& desc = reprDescs[descIdx];
if (desc.geomStyle == HdMeshGeomStyleInvalid) {
continue;
}
auto* drawItem
= static_cast<HdVP2DrawItem*>(pair.second->GetDrawItem(drawItemIndex));
if (!drawItem)
continue;

for (auto& renderItemData : drawItem->GetRenderItems()) {
_delegate->GetVP2ResourceRegistry().EnqueueCommit([&renderItemData]() {
renderItemData._enabled = false;
renderItemData._renderItem->enable(false);
});
}
}
}
}
}

/*! \brief Update the named repr object for this Rprim.

Repr objects are created to support specific reprName tokens, and contain a list of
Expand Down
1 change: 1 addition & 0 deletions lib/mayaUsd/render/vp2RenderDelegate/mesh.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ class HdVP2Mesh final : public HdMesh
void _InitRepr(const TfToken&, HdDirtyBits*) override;

void _UpdateRepr(HdSceneDelegate*, const TfToken&);
void _MakeOtherReprRenderItemsInvisible(HdSceneDelegate*, const TfToken&);

void _CommitMVertexBuffer(MHWRender::MVertexBuffer* const, void*) const;

Expand Down