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-109380 - Create a common parent class for HdVP2BasisCurves, HdVP2Mesh and future VP2 shapes #2086

Merged
merged 14 commits into from
Feb 10, 2022
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
283 changes: 26 additions & 257 deletions lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -457,20 +457,9 @@ void HdVP2BasisCurves::Sync(
HdDirtyBits* dirtyBits,
TfToken const& reprToken)
{
// We don't update the repr if it is hidden by the render tags (purpose)
// of the ProxyRenderDelegate. In additional, we need to hide any already
// existing render items because they should not be drawn.
auto* const param = static_cast<HdVP2RenderParam*>(_delegate->GetRenderParam());
ProxyRenderDelegate& drawScene = param->GetDrawScene();
HdRenderIndex& renderIndex = delegate->GetRenderIndex();
if (!drawScene.DrawRenderTag(renderIndex.GetRenderTag(GetId()))) {
_HideAllDrawItems(reprToken);
*dirtyBits &= ~(
HdChangeTracker::DirtyRenderTag
#ifdef ENABLE_RENDERTAG_VISIBILITY_WORKAROUND
| HdChangeTracker::DirtyVisibility
#endif
);
const SdfPath& id = GetId();
HdRenderIndex& renderIndex = delegate->GetRenderIndex();
if (!_SyncCommon(dirtyBits, id, _GetRepr(reprToken), renderIndex)) {
return;
}

Expand All @@ -480,39 +469,8 @@ void HdVP2BasisCurves::Sync(
_rprimId.asChar(),
"HdVP2BasisCurves::Sync");

const SdfPath& id = GetId();

// Update the selection status if it changed.
if (*dirtyBits & DirtySelectionHighlight) {
_selectionStatus = drawScene.GetSelectionStatus(id);
} else {
TF_VERIFY(_selectionStatus == drawScene.GetSelectionStatus(id));
}

if (*dirtyBits & HdChangeTracker::DirtyMaterialId) {
const SdfPath materialId = delegate->GetMaterialId(id);

#ifdef HDVP2_MATERIAL_CONSOLIDATION_UPDATE_WORKAROUND
const SdfPath& origMaterialId = GetMaterialId();
if (materialId != origMaterialId) {
if (!origMaterialId.IsEmpty()) {
HdVP2Material* material = static_cast<HdVP2Material*>(
renderIndex.GetSprim(HdPrimTypeTokens->material, origMaterialId));
if (material) {
material->UnsubscribeFromMaterialUpdates(id);
}
}

if (!materialId.IsEmpty()) {
HdVP2Material* material = static_cast<HdVP2Material*>(
renderIndex.GetSprim(HdPrimTypeTokens->material, materialId));
if (material) {
material->SubscribeForMaterialUpdates(id);
}
}
}
#endif

const SdfPath materialId = _GetUpdatedMaterialId(this, delegate);
#if HD_API_VERSION < 37
_SetMaterialId(renderIndex.GetChangeTracker(), materialId);
#else
Expand Down Expand Up @@ -583,40 +541,7 @@ void HdVP2BasisCurves::Sync(
}
}

if (HdChangeTracker::IsExtentDirty(*dirtyBits, id)) {
_sharedData.bounds.SetRange(delegate->GetExtent(id));
}

if (HdChangeTracker::IsTransformDirty(*dirtyBits, id)) {
_sharedData.bounds.SetMatrix(delegate->GetTransform(id));
}

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 PXR_VERSION > 2111
// Hydra now manages and caches render tags under the hood and is clearing
// the dirty bit prior to calling sync. Unconditionally set the render tag
// in the shared data structure based on current Hydra data
_curvesSharedData._renderTag = GetRenderTag();
#else
if (*dirtyBits
& (HdChangeTracker::DirtyRenderTag
#ifdef ENABLE_RENDERTAG_VISIBILITY_WORKAROUND
| HdChangeTracker::DirtyVisibility
#endif
)) {
_curvesSharedData._renderTag = delegate->GetRenderTag(id);
}
#endif
_SyncSharedData(_sharedData, delegate, dirtyBits, reprToken, id, _reprs);

*dirtyBits = HdChangeTracker::Clean;

Expand Down Expand Up @@ -1381,23 +1306,9 @@ void HdVP2BasisCurves::_InitRepr(TfToken const& reprToken, HdDirtyBits* dirtyBit
if (ARCH_UNLIKELY(!subSceneContainer))
return;

if (_reprs.empty()) {
_FirstInitRepr(dirtyBits, GetId());
}

_ReprVector::iterator it
= std::find_if(_reprs.begin(), _reprs.end(), _ReprComparator(reprToken));
if (it != _reprs.end()) {
_SetDirtyRepr(it->second);
HdReprSharedPtr repr = _AddNewRepr(reprToken, _reprs, dirtyBits, GetId());
if (!repr)
return;
}

// add new repr
_reprs.emplace_back(reprToken, std::make_shared<HdRepr>());
HdReprSharedPtr repr = _reprs.back().second;

// set dirty bit to say we need to sync a new repr
*dirtyBits |= HdChangeTracker::NewRepr;

_BasisCurvesReprConfig::DescArray descs = _GetReprDesc(reprToken);

Expand Down Expand Up @@ -1429,23 +1340,35 @@ void HdVP2BasisCurves::_InitRepr(TfToken const& reprToken, HdDirtyBits* dirtyBit
case HdBasisCurvesGeomStyleWire:
// The item is used for wireframe display and selection highlight.
if (reprToken == HdReprTokens->wire) {
renderItem = _CreateWireRenderItem(renderItemName);
renderItem = _CreateWireframeRenderItem(
renderItemName,
kOpaqueGray,
MSelectionMask::kSelectNurbsCurves,
MHWRender::MFrameContext::kExcludeNurbsCurves);
drawItem->AddUsage(HdVP2DrawItem::kSelectionHighlight);
#ifdef HAS_DEFAULT_MATERIAL_SUPPORT_API
renderItem->setDefaultMaterialHandling(MRenderItem::SkipWhenDefaultMaterialActive);
#endif
}
// The item is used for bbox display and selection highlight.
else if (reprToken == HdVP2ReprTokens->bbox) {
renderItem = _CreateBBoxRenderItem(renderItemName);
renderItem = _CreateBoundingBoxRenderItem(
renderItemName,
kOpaqueGray,
MSelectionMask::kSelectNurbsCurves,
MHWRender::MFrameContext::kExcludeNurbsCurves);
drawItem->AddUsage(HdVP2DrawItem::kSelectionHighlight);
#ifdef HAS_DEFAULT_MATERIAL_SUPPORT_API
renderItem->setDefaultMaterialHandling(MRenderItem::SkipWhenDefaultMaterialActive);
#endif
}
#ifdef HAS_DEFAULT_MATERIAL_SUPPORT_API
else if (reprToken == HdVP2ReprTokens->defaultMaterial) {
renderItem = _CreateWireRenderItem(renderItemName);
renderItem = _CreateWireframeRenderItem(
renderItemName,
kOpaqueGray,
MSelectionMask::kSelectNurbsCurves,
MHWRender::MFrameContext::kExcludeNurbsCurves);
renderItem->setDrawMode(MHWRender::MGeometry::kAll);
drawItem->AddUsage(HdVP2DrawItem::kSelectionHighlight);
renderItem->setDefaultMaterialHandling(
Expand All @@ -1455,7 +1378,10 @@ void HdVP2BasisCurves::_InitRepr(TfToken const& reprToken, HdDirtyBits* dirtyBit
break;
#ifndef MAYA_NEW_POINT_SNAPPING_SUPPORT
case HdBasisCurvesGeomStylePoints:
renderItem = _CreatePointsRenderItem(renderItemName);
renderItem = _CreatePointsRenderItem(
renderItemName,
MSelectionMask::kSelectNurbsCurves,
MHWRender::MFrameContext::kExcludeNurbsCurves);
break;
#endif
default: TF_WARN("Unsupported geomStyle"); break;
Expand All @@ -1477,39 +1403,6 @@ 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 Expand Up @@ -1556,35 +1449,6 @@ HdDirtyBits HdVP2BasisCurves::GetInitialDirtyBitsMask() const
return bits;
}

void HdVP2BasisCurves::_HideAllDrawItems(const TfToken& reprToken)
{
HdReprSharedPtr const& curRepr = _GetRepr(reprToken);
if (!curRepr) {
return;
}

_BasisCurvesReprConfig::DescArray reprDescs = _GetReprDesc(reprToken);

// For each relevant draw item, update dirty buffer sources.
int drawItemIndex = 0;
for (size_t descIdx = 0; descIdx < reprDescs.size(); ++descIdx) {
const HdBasisCurvesReprDesc& desc = reprDescs[descIdx];
if (desc.geomStyle == HdBasisCurvesGeomStyleInvalid) {
continue;
}

auto* drawItem = static_cast<HdVP2DrawItem*>(curRepr->GetDrawItem(drawItemIndex++));
if (!drawItem)
continue;

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

/*! \brief Update _primvarSourceMap, our local cache of raw primvar data.

This function pulls data from the scene delegate, but defers processing.
Expand Down Expand Up @@ -1641,68 +1505,6 @@ void HdVP2BasisCurves::_UpdatePrimvarSources(
}
}

/*! \brief Create render item for wireframe repr.
*/
MHWRender::MRenderItem* HdVP2BasisCurves::_CreateWireRenderItem(const MString& name) const
{
MHWRender::MRenderItem* const renderItem = MHWRender::MRenderItem::Create(
name, MHWRender::MRenderItem::DecorationItem, MHWRender::MGeometry::kLines);

renderItem->setDrawMode(MHWRender::MGeometry::kWireframe);
renderItem->depthPriority(MHWRender::MRenderItem::sDormantWireDepthPriority);
renderItem->castsShadows(false);
renderItem->receivesShadows(false);
renderItem->setShader(_delegate->Get3dSolidShader(kOpaqueGray));
#ifdef MAYA_MRENDERITEM_UFE_IDENTIFIER_SUPPORT
auto* const param = static_cast<HdVP2RenderParam*>(_delegate->GetRenderParam());
ProxyRenderDelegate& drawScene = param->GetDrawScene();
drawScene.setUfeIdentifiers(*renderItem, _PrimSegmentString);
#endif

#ifdef MAYA_NEW_POINT_SNAPPING_SUPPORT
MSelectionMask selectionMask(MSelectionMask::kSelectNurbsCurves);
selectionMask.addMask(MSelectionMask::kSelectPointsForGravity);
renderItem->setSelectionMask(selectionMask);
#else
renderItem->setSelectionMask(MSelectionMask::kSelectNurbsCurves);
#endif

#if MAYA_API_VERSION >= 20220000
renderItem->setObjectTypeExclusionFlag(MHWRender::MFrameContext::kExcludeNurbsCurves);
#endif

_SetWantConsolidation(*renderItem, true);

return renderItem;
}

/*! \brief Create render item for bbox repr.
*/
MHWRender::MRenderItem* HdVP2BasisCurves::_CreateBBoxRenderItem(const MString& name) const
{
MHWRender::MRenderItem* const renderItem = MHWRender::MRenderItem::Create(
name, MHWRender::MRenderItem::DecorationItem, MHWRender::MGeometry::kLines);

renderItem->setDrawMode(MHWRender::MGeometry::kBoundingBox);
renderItem->castsShadows(false);
renderItem->receivesShadows(false);
renderItem->setShader(_delegate->Get3dSolidShader(kOpaqueGray));
renderItem->setSelectionMask(MSelectionMask::kSelectNurbsCurves);
#ifdef MAYA_MRENDERITEM_UFE_IDENTIFIER_SUPPORT
auto* const param = static_cast<HdVP2RenderParam*>(_delegate->GetRenderParam());
ProxyRenderDelegate& drawScene = param->GetDrawScene();
drawScene.setUfeIdentifiers(*renderItem, _PrimSegmentString);
#endif

#if MAYA_API_VERSION >= 20220000
renderItem->setObjectTypeExclusionFlag(MHWRender::MFrameContext::kExcludeNurbsCurves);
#endif

_SetWantConsolidation(*renderItem, true);

return renderItem;
}

/*! \brief Create render item for smoothHull repr.
*/
MHWRender::MRenderItem* HdVP2BasisCurves::_CreatePatchRenderItem(const MString& name) const
Expand Down Expand Up @@ -1738,37 +1540,4 @@ MHWRender::MRenderItem* HdVP2BasisCurves::_CreatePatchRenderItem(const MString&
return renderItem;
}

#ifndef MAYA_NEW_POINT_SNAPPING_SUPPORT
/*! \brief Create render item for points repr.
*/
MHWRender::MRenderItem* HdVP2BasisCurves::_CreatePointsRenderItem(const MString& name) const
{
MHWRender::MRenderItem* const renderItem = MHWRender::MRenderItem::Create(
name, MHWRender::MRenderItem::DecorationItem, MHWRender::MGeometry::kPoints);

renderItem->setDrawMode(MHWRender::MGeometry::kSelectionOnly);
renderItem->depthPriority(MHWRender::MRenderItem::sDormantPointDepthPriority);
renderItem->castsShadows(false);
renderItem->receivesShadows(false);
renderItem->setShader(_delegate->Get3dFatPointShader());
#ifdef MAYA_MRENDERITEM_UFE_IDENTIFIER_SUPPORT
auto* const param = static_cast<HdVP2RenderParam*>(_delegate->GetRenderParam());
ProxyRenderDelegate& drawScene = param->GetDrawScene();
drawScene.setUfeIdentifiers(*renderItem, _PrimSegmentString);
#endif

MSelectionMask selectionMask(MSelectionMask::kSelectPointsForGravity);
selectionMask.addMask(MSelectionMask::kSelectNurbsCurves);
renderItem->setSelectionMask(selectionMask);

#if MAYA_API_VERSION >= 20220000
renderItem->setObjectTypeExclusionFlag(MHWRender::MFrameContext::kExcludeNurbsCurves);
#endif

_SetWantConsolidation(*renderItem, true);

return renderItem;
}
#endif

PXR_NAMESPACE_CLOSE_SCOPE
11 changes: 2 additions & 9 deletions lib/mayaUsd/render/vp2RenderDelegate/basisCurves.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,29 +131,22 @@ class HdVP2BasisCurves final

void _InitRepr(TfToken const& reprToken, HdDirtyBits* dirtyBits) override;

TfToken& _RenderTag() override { return _curvesSharedData._renderTag; }

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

void _UpdateDrawItem(
HdSceneDelegate* sceneDelegate,
HdVP2DrawItem* drawItem,
HdBasisCurvesReprDesc const& desc);

void _HideAllDrawItems(const TfToken& reprToken);

void _UpdatePrimvarSources(
HdSceneDelegate* sceneDelegate,
HdDirtyBits dirtyBits,
TfTokenVector const& requiredPrimvars);

MHWRender::MRenderItem* _CreatePatchRenderItem(const MString& name) const;
MHWRender::MRenderItem* _CreateWireRenderItem(const MString& name) const;
MHWRender::MRenderItem* _CreateBBoxRenderItem(const MString& name) const;

#ifndef MAYA_NEW_POINT_SNAPPING_SUPPORT
MHWRender::MRenderItem* _CreatePointsRenderItem(const MString& name) const;
#endif

enum DirtyBits : HdDirtyBits
{
Expand Down
Loading