From 16f6157d4bcd298a4e4042da80d54641893632f2 Mon Sep 17 00:00:00 2001 From: Ivan Vlasov Date: Wed, 26 Jan 2022 11:33:07 -0500 Subject: [PATCH 1/5] Make sure to get up-to-date selection highlighting colors from Maya for VP2 delegate --- .../render/vp2RenderDelegate/basisCurves.cpp | 10 +++--- lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp | 10 +++--- .../vp2RenderDelegate/proxyRenderDelegate.cpp | 34 +++++++++++++++++-- .../vp2RenderDelegate/proxyRenderDelegate.h | 4 ++- 4 files changed, 44 insertions(+), 14 deletions(-) diff --git a/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp b/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp index 652d5d03a4..3ada1a81da 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp @@ -1207,8 +1207,8 @@ void HdVP2BasisCurves::_UpdateDrawItem( // with one color vertex buffer. if (drawItem->ContainsUsage(HdVP2DrawItem::kSelectionHighlight)) { const MColor colors[] = { drawScene.GetWireframeColor(), - drawScene.GetSelectionHighlightColor(false), - drawScene.GetSelectionHighlightColor(true) }; + drawScene.GetSelectionHighlightColor("curve"), + drawScene.GetSelectionHighlightColor() }; // Store the indices to colors. std::vector colorIndices; @@ -1264,9 +1264,9 @@ void HdVP2BasisCurves::_UpdateDrawItem( int primitiveStride = 0; const MColor& color - = (_selectionStatus != kUnselected - ? drawScene.GetSelectionHighlightColor(_selectionStatus == kFullyLead) - : drawScene.GetWireframeColor()); + = (_selectionStatus != kUnselected ? drawScene.GetSelectionHighlightColor( + _selectionStatus == kFullyLead ? nullptr : "curve") + : drawScene.GetWireframeColor()); if (desc.geomStyle == HdBasisCurvesGeomStylePatch) { if (_selectionStatus != kUnselected) { diff --git a/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp b/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp index 64bd0ca38a..e75e88a2f5 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp @@ -2106,8 +2106,8 @@ void HdVP2Mesh::_UpdateDrawItem( // Set up the source color buffers. const MColor wireframeColors[] = { drawScene.GetWireframeColor(), - drawScene.GetSelectionHighlightColor(false), - drawScene.GetSelectionHighlightColor(true) }; + drawScene.GetSelectionHighlightColor("surface"), + drawScene.GetSelectionHighlightColor() }; bool useWireframeColors = stateToCommit._instanceColorParam == kSolidColorStr; MFloatArray* shadedColors = nullptr; @@ -2208,9 +2208,9 @@ void HdVP2Mesh::_UpdateDrawItem( if ((itemDirtyBits & DirtySelectionHighlight) && drawItem->ContainsUsage(HdVP2DrawItem::kSelectionHighlight)) { const MColor& color - = (_selectionStatus != kUnselected - ? drawScene.GetSelectionHighlightColor(_selectionStatus == kFullyLead) - : drawScene.GetWireframeColor()); + = (_selectionStatus != kUnselected ? drawScene.GetSelectionHighlightColor( + _selectionStatus == kFullyLead ? nullptr : "surface") + : drawScene.GetWireframeColor()); MHWRender::MShaderInstance* shader = _delegate->Get3dSolidShader(color); if (shader != nullptr && shader != drawItemData._shader) { diff --git a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp index d3425a480c..c9a448ff63 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp @@ -47,6 +47,7 @@ #include #include +#include #include #include #include @@ -1500,12 +1501,39 @@ GfVec3f ProxyRenderDelegate::GetCurveDefaultColor() } //! \brief -const MColor& ProxyRenderDelegate::GetSelectionHighlightColor(bool lead) const +MColor ProxyRenderDelegate::GetSelectionHighlightColor(const char* className) { - static const MColor kLeadColor(0.056f, 1.0f, 0.366f, 1.0f); + // Construct the query command string. + MString queryCommand; + if (className) { + queryCommand = "int $index = `displayColor -q -active \""; + queryCommand += className; + queryCommand += "\"`; colorIndex -q $index;"; + } else { + queryCommand = "displayRGBColor -q \"lead\""; + } + + // Query and return the selection color. + { + MDoubleArray colorResult; + std::lock_guard _(_mayaCommandEngineMutex); + MGlobal::executeCommand(queryCommand, colorResult); + + if (colorResult.length() == 3) { + // Since the "lead" color is returned in displace space, + // we need to convert it to rendering space. + MColor color(colorResult[0], colorResult[1], colorResult[2]); + return className + ? color + : MColorPickerUtilities::applyViewTransform(color, MColorPickerUtilities::kInverse); + } + } + + // In case of an error, return the default color + static const MColor kLeadColor(0.351f, 5.519f, 0.408f, 1.0f); static const MColor kActiveColor(1.0f, 1.0f, 1.0f, 1.0f); - return lead ? kLeadColor : kActiveColor; + return className ? kActiveColor : kLeadColor; } bool ProxyRenderDelegate::DrawRenderTag(const TfToken& renderTag) const diff --git a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h index 9847bbc1d5..3997816f82 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h +++ b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h @@ -173,8 +173,10 @@ class ProxyRenderDelegate : public MHWRender::MPxSubSceneOverride MAYAUSD_CORE_PUBLIC GfVec3f GetCurveDefaultColor(); + // Returns the selection highlight color for a given class. + // If className is null, returns the lead highlight color. MAYAUSD_CORE_PUBLIC - const MColor& GetSelectionHighlightColor(bool lead) const; + MColor GetSelectionHighlightColor(const char* className = nullptr); MAYAUSD_CORE_PUBLIC const HdSelection::PrimSelectionState* GetLeadSelectionState(const SdfPath& path) const; From 08a95c8aab599859af7546b7c1d17f0b2dd26b88 Mon Sep 17 00:00:00 2001 From: Ivan Vlasov Date: Wed, 26 Jan 2022 16:08:23 -0500 Subject: [PATCH 2/5] - Fixing the build for Maya versions below 2023 - Applying minor improvements after the code review --- .../vp2RenderDelegate/proxyRenderDelegate.cpp | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp index c9a448ff63..3072dccd98 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp @@ -1486,7 +1486,7 @@ GfVec3f ProxyRenderDelegate::GetCurveDefaultColor() { MDoubleArray curveColorResult; { - std::lock_guard _(_mayaCommandEngineMutex); + std::lock_guard mutexGuard(_mayaCommandEngineMutex); MGlobal::executeCommand( "int $index = `displayColor -q -dormant \"curve\"`; colorIndex -q $index;", curveColorResult); @@ -1495,6 +1495,7 @@ GfVec3f ProxyRenderDelegate::GetCurveDefaultColor() if (curveColorResult.length() == 3) { return GfVec3f(curveColorResult[0], curveColorResult[1], curveColorResult[2]); } else { + TF_WARN("Failed to obtain curve default color"); // In case of an error, return the default navy-blue color return GfVec3f(0.000f, 0.016f, 0.376f); } @@ -1503,6 +1504,9 @@ GfVec3f ProxyRenderDelegate::GetCurveDefaultColor() //! \brief MColor ProxyRenderDelegate::GetSelectionHighlightColor(const char* className) { + // Query display colors from Maya Command Engine only starting from Maya 2023 because the + // function MColorPickerUtilities::applyViewTransform is supported only in that case +#if MAYA_APP_VERSION >= 2023 // Construct the query command string. MString queryCommand; if (className) { @@ -1516,7 +1520,7 @@ MColor ProxyRenderDelegate::GetSelectionHighlightColor(const char* className) // Query and return the selection color. { MDoubleArray colorResult; - std::lock_guard _(_mayaCommandEngineMutex); + std::lock_guard mutexGuard(_mayaCommandEngineMutex); MGlobal::executeCommand(queryCommand, colorResult); if (colorResult.length() == 3) { @@ -1526,14 +1530,19 @@ MColor ProxyRenderDelegate::GetSelectionHighlightColor(const char* className) return className ? color : MColorPickerUtilities::applyViewTransform(color, MColorPickerUtilities::kInverse); + } else if (className) { + TF_WARN("Failed to obtain selection highlight color for class '%s'", className); + } else { + TF_WARN("Failed to obtain selection highlight color for lead objects"); } } +#endif - // In case of an error, return the default color - static const MColor kLeadColor(0.351f, 5.519f, 0.408f, 1.0f); - static const MColor kActiveColor(1.0f, 1.0f, 1.0f, 1.0f); + // In case of any failure, return the default color + static const MColor kDefaultLeadColor(0.351f, 5.519f, 0.408f, 1.0f); + static const MColor kDefaultActiveColor(1.0f, 1.0f, 1.0f, 1.0f); - return className ? kActiveColor : kLeadColor; + return className ? kDefaultActiveColor : kDefaultLeadColor; } bool ProxyRenderDelegate::DrawRenderTag(const TfToken& renderTag) const From 33baf460b82583cc30fab64397ca0b006bc69e5e Mon Sep 17 00:00:00 2001 From: Ivan Vlasov Date: Thu, 27 Jan 2022 09:05:00 -0500 Subject: [PATCH 3/5] Fixing broken autotests: making sure the old, hardcoded selection highlight colors (for Maya 2022 and below) match the properly calculated colors in autotests --- lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp index 3072dccd98..2d7a358007 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp @@ -1539,7 +1539,7 @@ MColor ProxyRenderDelegate::GetSelectionHighlightColor(const char* className) #endif // In case of any failure, return the default color - static const MColor kDefaultLeadColor(0.351f, 5.519f, 0.408f, 1.0f); + static const MColor kDefaultLeadColor(0.056f, 1.0f, 0.366f, 1.0f); static const MColor kDefaultActiveColor(1.0f, 1.0f, 1.0f, 1.0f); return className ? kDefaultActiveColor : kDefaultLeadColor; From dede536b7724d371de73133776e5957da50dd1bc Mon Sep 17 00:00:00 2001 From: Ivan Vlasov Date: Thu, 27 Jan 2022 09:54:25 -0500 Subject: [PATCH 4/5] Using MAYA_API_VERSION instead of MAYA_APP_VERSION to fix the build of Maya 2022 --- lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp index 2d7a358007..25c25d7c4e 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp @@ -1506,7 +1506,7 @@ MColor ProxyRenderDelegate::GetSelectionHighlightColor(const char* className) { // Query display colors from Maya Command Engine only starting from Maya 2023 because the // function MColorPickerUtilities::applyViewTransform is supported only in that case -#if MAYA_APP_VERSION >= 2023 +#if MAYA_API_VERSION >= 20230000 // Construct the query command string. MString queryCommand; if (className) { From 8469047ad9217fef83704b091d0177a2e97ae765 Mon Sep 17 00:00:00 2001 From: Ivan Vlasov Date: Thu, 27 Jan 2022 14:53:15 -0500 Subject: [PATCH 5/5] - USD mesh selection color now matches Maya mesh polygon color. - Some refactoring --- .../render/vp2RenderDelegate/basisCurves.cpp | 10 +-- lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp | 11 ++-- .../vp2RenderDelegate/proxyRenderDelegate.cpp | 61 +++++++++++++------ .../vp2RenderDelegate/proxyRenderDelegate.h | 6 +- 4 files changed, 56 insertions(+), 32 deletions(-) diff --git a/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp b/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp index 3ada1a81da..e21d22fb3a 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp @@ -1206,9 +1206,10 @@ void HdVP2BasisCurves::_UpdateDrawItem( // it needs to display both wireframe color and selection highlight // with one color vertex buffer. if (drawItem->ContainsUsage(HdVP2DrawItem::kSelectionHighlight)) { - const MColor colors[] = { drawScene.GetWireframeColor(), - drawScene.GetSelectionHighlightColor("curve"), - drawScene.GetSelectionHighlightColor() }; + const MColor colors[] + = { drawScene.GetWireframeColor(), + drawScene.GetSelectionHighlightColor(HdPrimTypeTokens->basisCurves), + drawScene.GetSelectionHighlightColor() }; // Store the indices to colors. std::vector colorIndices; @@ -1265,7 +1266,8 @@ void HdVP2BasisCurves::_UpdateDrawItem( const MColor& color = (_selectionStatus != kUnselected ? drawScene.GetSelectionHighlightColor( - _selectionStatus == kFullyLead ? nullptr : "curve") + _selectionStatus == kFullyLead ? TfToken() + : HdPrimTypeTokens->basisCurves) : drawScene.GetWireframeColor()); if (desc.geomStyle == HdBasisCurvesGeomStylePatch) { diff --git a/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp b/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp index e75e88a2f5..b6e729837b 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp @@ -2105,10 +2105,11 @@ void HdVP2Mesh::_UpdateDrawItem( // render item. // Set up the source color buffers. - const MColor wireframeColors[] = { drawScene.GetWireframeColor(), - drawScene.GetSelectionHighlightColor("surface"), - drawScene.GetSelectionHighlightColor() }; - bool useWireframeColors = stateToCommit._instanceColorParam == kSolidColorStr; + const MColor wireframeColors[] + = { drawScene.GetWireframeColor(), + drawScene.GetSelectionHighlightColor(HdPrimTypeTokens->mesh), + drawScene.GetSelectionHighlightColor() }; + bool useWireframeColors = stateToCommit._instanceColorParam == kSolidColorStr; MFloatArray* shadedColors = nullptr; HdInterpolation colorInterpolation = HdInterpolationConstant; @@ -2209,7 +2210,7 @@ void HdVP2Mesh::_UpdateDrawItem( && drawItem->ContainsUsage(HdVP2DrawItem::kSelectionHighlight)) { const MColor& color = (_selectionStatus != kUnselected ? drawScene.GetSelectionHighlightColor( - _selectionStatus == kFullyLead ? nullptr : "surface") + _selectionStatus == kFullyLead ? TfToken() : HdPrimTypeTokens->mesh) : drawScene.GetWireframeColor()); MHWRender::MShaderInstance* shader = _delegate->Get3dSolidShader(color); diff --git a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp index 25c25d7c4e..2b609d4890 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp @@ -1502,19 +1502,34 @@ GfVec3f ProxyRenderDelegate::GetCurveDefaultColor() } //! \brief -MColor ProxyRenderDelegate::GetSelectionHighlightColor(const char* className) +MColor ProxyRenderDelegate::GetSelectionHighlightColor(const TfToken& className) { - // Query display colors from Maya Command Engine only starting from Maya 2023 because the - // function MColorPickerUtilities::applyViewTransform is supported only in that case -#if MAYA_API_VERSION >= 20230000 + static const MColor kDefaultLeadColor(0.056f, 1.0f, 0.366f, 1.0f); + static const MColor kDefaultActiveColor(1.0f, 1.0f, 1.0f, 1.0f); + + // Prepare to construct the query command. + bool fromPalette = true; + const char* queryName = "unsupported"; + if (className.IsEmpty()) { + fromPalette = false; + queryName = "lead"; + } else if (className == HdPrimTypeTokens->mesh) { + fromPalette = false; + queryName = "polymeshActive"; + } else if (className == HdPrimTypeTokens->basisCurves) { + queryName = "curve"; + } + // Construct the query command string. MString queryCommand; - if (className) { + if (fromPalette) { queryCommand = "int $index = `displayColor -q -active \""; - queryCommand += className; + queryCommand += queryName; queryCommand += "\"`; colorIndex -q $index;"; } else { - queryCommand = "displayRGBColor -q \"lead\""; + queryCommand = "displayRGBColor -q \""; + queryCommand += queryName; + queryCommand += "\""; } // Query and return the selection color. @@ -1524,25 +1539,31 @@ MColor ProxyRenderDelegate::GetSelectionHighlightColor(const char* className) MGlobal::executeCommand(queryCommand, colorResult); if (colorResult.length() == 3) { - // Since the "lead" color is returned in displace space, - // we need to convert it to rendering space. MColor color(colorResult[0], colorResult[1], colorResult[2]); - return className - ? color - : MColorPickerUtilities::applyViewTransform(color, MColorPickerUtilities::kInverse); - } else if (className) { - TF_WARN("Failed to obtain selection highlight color for class '%s'", className); + + if (className.IsEmpty()) { + // The 'lead' color is returned in display space, so we need to convert it to + // rendering space. However, function MColorPickerUtilities::applyViewTransform + // is supported only starting from Maya 2023, so in opposite case we just return + // the default lead color. +#if MAYA_API_VERSION >= 20230000 + return MColorPickerUtilities::applyViewTransform( + color, MColorPickerUtilities::kInverse); +#else + return kDefaultLeadColor; +#endif + } else { + return color; + } } else { - TF_WARN("Failed to obtain selection highlight color for lead objects"); + TF_WARN( + "Failed to obtain selection highlight color for '%s' objects", + className.IsEmpty() ? "lead" : className.GetString().c_str()); } } -#endif // In case of any failure, return the default color - static const MColor kDefaultLeadColor(0.056f, 1.0f, 0.366f, 1.0f); - static const MColor kDefaultActiveColor(1.0f, 1.0f, 1.0f, 1.0f); - - return className ? kDefaultActiveColor : kDefaultLeadColor; + return className.IsEmpty() ? kDefaultLeadColor : kDefaultActiveColor; } bool ProxyRenderDelegate::DrawRenderTag(const TfToken& renderTag) const diff --git a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h index 3997816f82..2cb0ff5917 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h +++ b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h @@ -173,10 +173,10 @@ class ProxyRenderDelegate : public MHWRender::MPxSubSceneOverride MAYAUSD_CORE_PUBLIC GfVec3f GetCurveDefaultColor(); - // Returns the selection highlight color for a given class. - // If className is null, returns the lead highlight color. + // Returns the selection highlight color for a given HdPrim type. + // If className is empty, returns the lead highlight color. MAYAUSD_CORE_PUBLIC - MColor GetSelectionHighlightColor(const char* className = nullptr); + MColor GetSelectionHighlightColor(const TfToken& className = TfToken()); MAYAUSD_CORE_PUBLIC const HdSelection::PrimSelectionState* GetLeadSelectionState(const SdfPath& path) const;