Skip to content

Commit 600c31a

Browse files
author
Krystian Ligenza
authored
Merge pull request #1292 from Autodesk/chenh/MAYA-110596/switch-to-vertex-selection-level-for-point-snapping
MAYA-110596 MAYA-110576 faster point snapping
2 parents 2ba8eab + 8965318 commit 600c31a

6 files changed

Lines changed: 104 additions & 6 deletions

File tree

lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -709,7 +709,7 @@ void HdVP2BasisCurves::_UpdateDrawItem(
709709
HdVP2DrawItem* drawItem,
710710
HdBasisCurvesReprDesc const& desc)
711711
{
712-
const MHWRender::MRenderItem* renderItem = drawItem->GetRenderItem();
712+
MHWRender::MRenderItem* renderItem = drawItem->GetRenderItem();
713713
if (ARCH_UNLIKELY(!renderItem)) {
714714
return;
715715
}
@@ -745,7 +745,13 @@ void HdVP2BasisCurves::_UpdateDrawItem(
745745
// doesn't need to extract index data from topology. Points use non-indexed
746746
// draw.
747747
const bool isBoundingBoxItem = (drawMode == MHWRender::MGeometry::kBoundingBox);
748+
749+
#ifdef MAYA_NEW_POINT_SNAPPING_SUPPORT
750+
constexpr bool isPointSnappingItem = false;
751+
#else
748752
const bool isPointSnappingItem = (renderItem->primitive() == MHWRender::MGeometry::kPoints);
753+
#endif
754+
749755
const bool requiresIndexUpdate = !isBoundingBoxItem && !isPointSnappingItem;
750756

751757
// Prepare index buffer.
@@ -1298,6 +1304,20 @@ void HdVP2BasisCurves::_UpdateDrawItem(
12981304
| HdChangeTracker::DirtyPrimvar | HdChangeTracker::DirtyTopology
12991305
| DirtySelectionHighlight));
13001306

1307+
#ifdef MAYA_NEW_POINT_SNAPPING_SUPPORT
1308+
if ((itemDirtyBits & DirtySelectionHighlight) && !isBoundingBoxItem) {
1309+
MSelectionMask selectionMask(MSelectionMask::kSelectNurbsCurves);
1310+
1311+
// Only unselected Rprims can be used for point snapping.
1312+
if (_selectionStatus == kUnselected) {
1313+
selectionMask.addMask(MSelectionMask::kSelectPointsForGravity);
1314+
}
1315+
1316+
// The function is thread-safe, thus called in place to keep simple.
1317+
renderItem->setSelectionMask(selectionMask);
1318+
}
1319+
#endif
1320+
13011321
// Reset dirty bits because we've prepared commit state for this draw item.
13021322
drawItem->ResetDirtyBits();
13031323

@@ -1637,9 +1657,11 @@ void HdVP2BasisCurves::_InitRepr(TfToken const& reprToken, HdDirtyBits* dirtyBit
16371657
drawItem->AddUsage(HdVP2DrawItem::kSelectionHighlight);
16381658
}
16391659
break;
1660+
#ifndef MAYA_NEW_POINT_SNAPPING_SUPPORT
16401661
case HdBasisCurvesGeomStylePoints:
16411662
renderItem = _CreatePointsRenderItem(renderItemName);
16421663
break;
1664+
#endif
16431665
default: TF_WARN("Unsupported geomStyle"); break;
16441666
}
16451667

@@ -1802,7 +1824,14 @@ MHWRender::MRenderItem* HdVP2BasisCurves::_CreateWireRenderItem(const MString& n
18021824
renderItem->castsShadows(false);
18031825
renderItem->receivesShadows(false);
18041826
renderItem->setShader(_delegate->Get3dSolidShader(kOpaqueGray));
1827+
1828+
#ifdef MAYA_NEW_POINT_SNAPPING_SUPPORT
1829+
MSelectionMask selectionMask(MSelectionMask::kSelectNurbsCurves);
1830+
selectionMask.addMask(MSelectionMask::kSelectPointsForGravity);
1831+
renderItem->setSelectionMask(selectionMask);
1832+
#else
18051833
renderItem->setSelectionMask(MSelectionMask::kSelectNurbsCurves);
1834+
#endif
18061835

18071836
#if MAYA_API_VERSION >= 20220000
18081837
renderItem->setObjectTypeExclusionFlag(MHWRender::MFrameContext::kExcludeNurbsCurves);
@@ -1847,7 +1876,14 @@ MHWRender::MRenderItem* HdVP2BasisCurves::_CreatePatchRenderItem(const MString&
18471876
renderItem->castsShadows(false);
18481877
renderItem->receivesShadows(false);
18491878
renderItem->setShader(_delegate->Get3dSolidShader(kOpaqueGray));
1879+
1880+
#ifdef MAYA_NEW_POINT_SNAPPING_SUPPORT
1881+
MSelectionMask selectionMask(MSelectionMask::kSelectNurbsCurves);
1882+
selectionMask.addMask(MSelectionMask::kSelectPointsForGravity);
1883+
renderItem->setSelectionMask(selectionMask);
1884+
#else
18501885
renderItem->setSelectionMask(MSelectionMask::kSelectNurbsCurves);
1886+
#endif
18511887

18521888
#if MAYA_API_VERSION >= 20220000
18531889
renderItem->setObjectTypeExclusionFlag(MHWRender::MFrameContext::kExcludeNurbsCurves);
@@ -1858,6 +1894,7 @@ MHWRender::MRenderItem* HdVP2BasisCurves::_CreatePatchRenderItem(const MString&
18581894
return renderItem;
18591895
}
18601896

1897+
#ifndef MAYA_NEW_POINT_SNAPPING_SUPPORT
18611898
/*! \brief Create render item for points repr.
18621899
*/
18631900
MHWRender::MRenderItem* HdVP2BasisCurves::_CreatePointsRenderItem(const MString& name) const
@@ -1883,5 +1920,6 @@ MHWRender::MRenderItem* HdVP2BasisCurves::_CreatePointsRenderItem(const MString&
18831920

18841921
return renderItem;
18851922
}
1923+
#endif
18861924

18871925
PXR_NAMESPACE_CLOSE_SCOPE

lib/mayaUsd/render/vp2RenderDelegate/basisCurves.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,10 @@ class HdVP2BasisCurves final : public HdBasisCurves
147147
MHWRender::MRenderItem* _CreatePatchRenderItem(const MString& name) const;
148148
MHWRender::MRenderItem* _CreateWireRenderItem(const MString& name) const;
149149
MHWRender::MRenderItem* _CreateBBoxRenderItem(const MString& name) const;
150+
151+
#ifndef MAYA_NEW_POINT_SNAPPING_SUPPORT
150152
MHWRender::MRenderItem* _CreatePointsRenderItem(const MString& name) const;
153+
#endif
151154

152155
enum DirtyBits : HdDirtyBits
153156
{

lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,7 +1300,9 @@ void HdVP2Mesh::_InitRepr(const TfToken& reprToken, HdDirtyBits* dirtyBits)
13001300
drawItem->AddUsage(HdVP2DrawItem::kSelectionHighlight);
13011301
}
13021302
break;
1303+
#ifndef MAYA_NEW_POINT_SNAPPING_SUPPORT
13031304
case HdMeshGeomStylePoints: renderItem = _CreatePointsRenderItem(renderItemName); break;
1305+
#endif
13041306
default: TF_WARN("Unsupported geomStyle"); break;
13051307
}
13061308

@@ -1509,7 +1511,13 @@ void HdVP2Mesh::_UpdateDrawItem(
15091511
// doesn't need to extract index data from topology. Points use non-indexed
15101512
// draw.
15111513
const bool isBBoxItem = (renderItem->drawMode() == MHWRender::MGeometry::kBoundingBox);
1514+
1515+
#ifdef MAYA_NEW_POINT_SNAPPING_SUPPORT
1516+
constexpr bool isPointSnappingItem = false;
1517+
#else
15121518
const bool isPointSnappingItem = (renderItem->primitive() == MHWRender::MGeometry::kPoints);
1519+
#endif
1520+
15131521
#ifdef HDVP2_ENABLE_GPU_OSD
15141522
const bool isLineItem = (renderItem->primitive() == MHWRender::MGeometry::kLines);
15151523
// when we do OSD we don't bother creating indexing until after we have a smooth mesh
@@ -1865,6 +1873,21 @@ void HdVP2Mesh::_UpdateDrawItem(
18651873
& (HdChangeTracker::DirtyPoints | HdChangeTracker::DirtyNormals
18661874
| HdChangeTracker::DirtyPrimvar | HdChangeTracker::DirtyTopology));
18671875

1876+
#ifdef MAYA_NEW_POINT_SNAPPING_SUPPORT
1877+
if (!isBBoxItem && !isDedicatedSelectionHighlightItem
1878+
&& (itemDirtyBits & DirtySelectionHighlight)) {
1879+
MSelectionMask selectionMask(MSelectionMask::kSelectMeshes);
1880+
1881+
// Only unselected Rprims can be used for point snapping.
1882+
if (_selectionStatus == kUnselected) {
1883+
selectionMask.addMask(MSelectionMask::kSelectPointsForGravity);
1884+
}
1885+
1886+
// The function is thread-safe, thus called in place to keep simple.
1887+
renderItem->setSelectionMask(selectionMask);
1888+
}
1889+
#endif
1890+
18681891
// Capture buffers we need
18691892
MHWRender::MIndexBuffer* indexBuffer = drawItemData._indexBuffer.get();
18701893
PrimvarInfoMap* primvarInfo = &_meshSharedData->_primvarInfo;
@@ -2244,6 +2267,7 @@ void HdVP2Mesh::_UpdatePrimvarSources(
22442267
}
22452268
}
22462269

2270+
#ifndef MAYA_NEW_POINT_SNAPPING_SUPPORT
22472271
/*! \brief Create render item for points repr.
22482272
*/
22492273
MHWRender::MRenderItem* HdVP2Mesh::_CreatePointsRenderItem(const MString& name) const
@@ -2269,6 +2293,7 @@ MHWRender::MRenderItem* HdVP2Mesh::_CreatePointsRenderItem(const MString& name)
22692293

22702294
return renderItem;
22712295
}
2296+
#endif
22722297

22732298
/*! \brief Create render item for wireframe repr.
22742299
*/
@@ -2282,7 +2307,14 @@ MHWRender::MRenderItem* HdVP2Mesh::_CreateWireframeRenderItem(const MString& nam
22822307
renderItem->castsShadows(false);
22832308
renderItem->receivesShadows(false);
22842309
renderItem->setShader(_delegate->Get3dSolidShader(kOpaqueBlue));
2310+
2311+
#ifdef MAYA_NEW_POINT_SNAPPING_SUPPORT
2312+
MSelectionMask selectionMask(MSelectionMask::kSelectMeshes);
2313+
selectionMask.addMask(MSelectionMask::kSelectPointsForGravity);
2314+
renderItem->setSelectionMask(selectionMask);
2315+
#else
22852316
renderItem->setSelectionMask(MSelectionMask::kSelectMeshes);
2317+
#endif
22862318

22872319
#if MAYA_API_VERSION >= 20220000
22882320
renderItem->setObjectTypeExclusionFlag(MHWRender::MFrameContext::kExcludeMeshes);
@@ -2329,7 +2361,14 @@ MHWRender::MRenderItem* HdVP2Mesh::_CreateSmoothHullRenderItem(const MString& na
23292361
renderItem->castsShadows(true);
23302362
renderItem->receivesShadows(true);
23312363
renderItem->setShader(_delegate->GetFallbackShader(kOpaqueGray));
2364+
2365+
#ifdef MAYA_NEW_POINT_SNAPPING_SUPPORT
2366+
MSelectionMask selectionMask(MSelectionMask::kSelectMeshes);
2367+
selectionMask.addMask(MSelectionMask::kSelectPointsForGravity);
2368+
renderItem->setSelectionMask(selectionMask);
2369+
#else
23322370
renderItem->setSelectionMask(MSelectionMask::kSelectMeshes);
2371+
#endif
23332372

23342373
#if MAYA_API_VERSION >= 20220000
23352374
renderItem->setObjectTypeExclusionFlag(MHWRender::MFrameContext::kExcludeMeshes);

lib/mayaUsd/render/vp2RenderDelegate/mesh.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,12 @@ class HdVP2Mesh final : public HdMesh
157157
MHWRender::MRenderItem* _CreateSelectionHighlightRenderItem(const MString& name) const;
158158
MHWRender::MRenderItem* _CreateSmoothHullRenderItem(const MString& name) const;
159159
MHWRender::MRenderItem* _CreateWireframeRenderItem(const MString& name) const;
160-
MHWRender::MRenderItem* _CreatePointsRenderItem(const MString& name) const;
161160
MHWRender::MRenderItem* _CreateBoundingBoxRenderItem(const MString& name) const;
162161

162+
#ifndef MAYA_NEW_POINT_SNAPPING_SUPPORT
163+
MHWRender::MRenderItem* _CreatePointsRenderItem(const MString& name) const;
164+
#endif
165+
163166
static void _InitGPUCompute();
164167

165168
//! Custom dirty bits used by this mesh

lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -701,9 +701,12 @@ void ProxyRenderDelegate::_Execute(const MHWRender::MFrameContext& frameContext)
701701
#endif // defined(MAYA_ENABLE_UPDATE_FOR_SELECTION)
702702

703703
if (inSelectionPass) {
704+
// The new Maya point snapping support doesn't require point snapping items any more.
705+
#if !defined(MAYA_NEW_POINT_SNAPPING_SUPPORT)
704706
if (inPointSnapping && !reprSelector.Contains(HdReprTokens->points)) {
705707
reprSelector = reprSelector.CompositeOver(kPointsReprSelector);
706708
}
709+
#endif
707710
} else {
708711
if (_selectionChanged) {
709712
_UpdateSelectionStates();
@@ -777,13 +780,20 @@ void ProxyRenderDelegate::update(MSubSceneContainer& container, const MFrameCont
777780
param->EndUpdate();
778781
}
779782

780-
//! \brief Switch to component-level selection for point snapping.
783+
//! \brief Update selection granularity for point snapping.
781784
void ProxyRenderDelegate::updateSelectionGranularity(
782785
const MDagPath& path,
783786
MHWRender::MSelectionContext& selectionContext)
784787
{
788+
// The component level is coarse-grain, causing Maya to produce undesired face/edge selection
789+
// hits, as well as vertex selection hits that are required for point snapping. Switch to the
790+
// new vertex selection level if available in order to produce vertex selection hits only.
785791
if (pointSnappingActive()) {
792+
#if MAYA_API_VERSION >= 20220100
793+
selectionContext.setSelectionLevel(MHWRender::MSelectionContext::kVertex);
794+
#else
786795
selectionContext.setSelectionLevel(MHWRender::MSelectionContext::kComponent);
796+
#endif
787797
}
788798
}
789799

@@ -872,9 +882,7 @@ bool ProxyRenderDelegate::getInstancedSelectionPath(
872882
#if defined(MAYA_ENABLE_UPDATE_FOR_SELECTION)
873883
const TfToken& selectionKind = _selectionKind;
874884
const UsdPointInstancesPickMode& pointInstancesPickMode = _pointInstancesPickMode;
875-
#ifndef UFE_V2_FEATURES_AVAILABLE
876-
const MGlobal::ListAdjustment& listAdjustment = _globalListAdjustment;
877-
#endif
885+
const MGlobal::ListAdjustment& listAdjustment = _globalListAdjustment;
878886
#else
879887
const TfToken selectionKind = GetSelectionKind();
880888
const UsdPointInstancesPickMode pointInstancesPickMode = GetPointInstancesPickMode();
@@ -953,6 +961,8 @@ bool ProxyRenderDelegate::getInstancedSelectionPath(
953961
}
954962

955963
#ifdef UFE_V2_FEATURES_AVAILABLE
964+
TF_UNUSED(listAdjustment);
965+
956966
auto ufeSel = Ufe::NamedSelection::get("MayaSelectTool");
957967
ufeSel->append(si);
958968
#else

lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@
4040
#include <ufe/observer.h>
4141
#endif
4242

43+
// The new Maya point snapping support doesn't require point snapping items any more.
44+
#if MAYA_API_VERSION >= 20230000
45+
#define MAYA_NEW_POINT_SNAPPING_SUPPORT
46+
#endif
47+
4348
// Conditional compilation due to Maya API gap.
4449
#if MAYA_API_VERSION >= 20200000
4550
#define MAYA_ENABLE_UPDATE_FOR_SELECTION

0 commit comments

Comments
 (0)