From 3e24e501fc7e3cd191f468e2a6a7d66a2a73ca67 Mon Sep 17 00:00:00 2001 From: Ivan Vlasov Date: Mon, 19 Sep 2022 14:02:31 -0400 Subject: [PATCH 1/3] - properly handle display layer's attribute "enable" - fixing an issue with bound box dimensions when a display layer is switched to bound box mode in multi-viewport - fixing an issue with visibility when a display layer is switched into invisible state while in multi-viewport - fixing an issue with enabling all required material primvars from both networks: full and untextured --- .../render/vp2RenderDelegate/basisCurves.cpp | 14 +++--- .../vp2RenderDelegate/mayaPrimCommon.cpp | 45 ++++++++++++++----- .../render/vp2RenderDelegate/mayaPrimCommon.h | 4 +- lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp | 13 +++--- .../render/vp2RenderDelegate/points.cpp | 19 +++----- 5 files changed, 55 insertions(+), 40 deletions(-) diff --git a/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp b/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp index d716a3b962..f6850d096a 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp @@ -447,14 +447,10 @@ void HdVP2BasisCurves::Sync( const SdfPath& id = GetId(); if (HdChangeTracker::IsPrimvarDirty(*dirtyBits, id, HdTokens->normals) || HdChangeTracker::IsPrimvarDirty(*dirtyBits, id, HdTokens->primvar)) { - const HdVP2Material* material = static_cast( - renderIndex.GetSprim(HdPrimTypeTokens->material, GetMaterialId())); - - TfToken materialNetworkToken = _GetMaterialNetworkToken(reprToken); - const TfTokenVector& requiredPrimvars - = (material && material->GetSurfaceShader(materialNetworkToken)) - ? material->GetRequiredPrimvars(materialNetworkToken) - : sFallbackShaderPrimvars; + TfTokenVector requiredPrimvars; + if (!_GetMaterialPrimvars(renderIndex, GetMaterialId(), requiredPrimvars)) { + requiredPrimvars = sFallbackShaderPrimvars; + } _UpdatePrimvarSources(delegate, *dirtyBits, requiredPrimvars); } @@ -906,7 +902,7 @@ void HdVP2BasisCurves::_UpdateDrawItem( const GfRange3d& range = _sharedData.bounds.GetRange(); _UpdateTransform(stateToCommit, _sharedData, itemDirtyBits, isBoundingBoxItem); - MMatrix& worldMatrix = drawItemData._worldMatrix; + const MMatrix& worldMatrix = drawItemData._worldMatrix; // If the prim is instanced, create one new instance per transform. // The current instancer invalidation tracking makes it hard for diff --git a/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp b/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp index 72af145bae..1184d77365 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp @@ -177,21 +177,20 @@ void MayaUsdRPrim::_UpdateTransform( } // Local-to-world transformation - MMatrix& worldMatrix = drawItemData._worldMatrix; - sharedData.bounds.GetMatrix().Get(worldMatrix.matrix); - // The bounding box draw item uses a globally-shared unit wire cube as the // geometry and transfers scale and offset of the bounds to world matrix. if (isBoundingBoxItem) { if ((itemDirtyBits & (HdChangeTracker::DirtyExtent | HdChangeTracker::DirtyTransform)) && !range.IsEmpty()) { + sharedData.bounds.GetMatrix().Get(drawItemData._worldMatrix.matrix); + const GfVec3d midpoint = range.GetMidpoint(); const GfVec3d size = range.GetSize(); MPoint midp(midpoint[0], midpoint[1], midpoint[2]); - midp *= worldMatrix; + midp *= drawItemData._worldMatrix; - auto& m = worldMatrix.matrix; + auto& m = drawItemData._worldMatrix.matrix; m[0][0] *= size[0]; m[0][1] *= size[0]; m[0][2] *= size[0]; @@ -212,6 +211,7 @@ void MayaUsdRPrim::_UpdateTransform( stateToCommit._worldMatrix = &drawItemData._worldMatrix; } } else if (itemDirtyBits & HdChangeTracker::DirtyTransform) { + sharedData.bounds.GetMatrix().Get(drawItemData._worldMatrix.matrix); stateToCommit._worldMatrix = &drawItemData._worldMatrix; } } @@ -724,6 +724,10 @@ void MayaUsdRPrim::_SyncDisplayLayerModes(const HdRprim& for (unsigned int i = 0; i < ancestorDisplayLayers.length(); i++) { MFnDependencyNode displayLayerNodeFn(ancestorDisplayLayers[i]); MPlug layerEnabled = displayLayerNodeFn.findPlug("enabled"); + if (!layerEnabled.asBool()) { + continue; + } + MPlug layerVisible = displayLayerNodeFn.findPlug("visibility"); MPlug layerHidesOnPlayback = displayLayerNodeFn.findPlug("hideOnPlayback"); MPlug layerDisplayType = displayLayerNodeFn.findPlug("displayType"); @@ -731,7 +735,7 @@ void MayaUsdRPrim::_SyncDisplayLayerModes(const HdRprim& MPlug shading = displayLayerNodeFn.findPlug("shading"); MPlug texturing = displayLayerNodeFn.findPlug("texturing"); - _displayLayerModes._visibility &= layerEnabled.asBool() ? layerVisible.asBool() : true; + _displayLayerModes._visibility &= layerVisible.asBool(); _displayLayerModes._hideOnPlayback |= layerHidesOnPlayback.asBool(); _displayLayerModes._texturing = texturing.asBool(); if (levelOfDetail.asShort() != 0) { @@ -767,13 +771,13 @@ void MayaUsdRPrim::_SyncSharedData( } if (HdChangeTracker::IsVisibilityDirty(*dirtyBits, id)) { - bool usdVisibility = delegate->GetVisible(id); + sharedData.visible = delegate->GetVisible(id) && _displayLayerModes._visibility; // 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 (!usdVisibility) + if (!sharedData.visible) _MakeOtherReprRenderItemsInvisible(reprToken, reprs); // Update "hide on playback" status @@ -788,8 +792,6 @@ void MayaUsdRPrim::_SyncSharedData( _ForEachRenderItem(reprs, setHideOnPlayback); #endif } - - sharedData.visible = usdVisibility && _displayLayerModes._visibility; } #if PXR_VERSION > 2111 @@ -914,4 +916,27 @@ SdfPath MayaUsdRPrim::_GetUpdatedMaterialId(HdRprim* rprim, HdSceneDelegate* del return materialId; } +bool MayaUsdRPrim::_GetMaterialPrimvars(HdRenderIndex& renderIndex, const SdfPath& materialId, TfTokenVector& primvars) +{ + const HdVP2Material* material = static_cast(renderIndex.GetSprim(HdPrimTypeTokens->material, materialId)); + if (!material || !material->GetSurfaceShader(TfToken())) { + return false; + } + + // Get basic primvars + primvars = material->GetRequiredPrimvars(TfToken()); + + // Get extra primvars + if (material->GetSurfaceShader(HdReprTokens->smoothHull)) { + const auto& extraPrimvars = material->GetRequiredPrimvars(HdReprTokens->smoothHull); + for (const auto& extraPrimvar: extraPrimvars) { + if (std::find(primvars.begin(), primvars.end(), extraPrimvar) == primvars.end()) { + primvars.push_back(extraPrimvar); + } + } + } + + return true; +} + PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.h b/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.h index 9c0984e4c5..81c19be040 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.h +++ b/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.h @@ -83,7 +83,7 @@ struct MayaUsdCommitState PrimvarBufferDataMap _primvarBufferDataMap; //! If valid, world matrix to set on the render item - MMatrix* _worldMatrix { nullptr }; + const MMatrix* _worldMatrix { nullptr }; //! If valid, bounding box to set on the render item MBoundingBox* _boundingBox { nullptr }; @@ -271,6 +271,8 @@ class MayaUsdRPrim //! Helper utility function to adapt Maya API changes. static void _SetWantConsolidation(MHWRender::MRenderItem& renderItem, bool state); + static bool _GetMaterialPrimvars(HdRenderIndex&, const SdfPath&, TfTokenVector&); + void _InitRenderItemCommon(MHWRender::MRenderItem* renderItem) const; HdVP2DrawItem::RenderItemData& _AddRenderItem( diff --git a/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp b/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp index 0a8541ee75..0aaadecce9 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp @@ -882,13 +882,10 @@ void HdVP2Mesh::Sync( || HdChangeTracker::IsPrimvarDirty(*dirtyBits, id, HdTokens->primvar) || instancerDirty) { auto addRequiredPrimvars = [&](const SdfPath& materialId) { - const HdVP2Material* material = static_cast( - renderIndex.GetSprim(HdPrimTypeTokens->material, materialId)); - TfToken materialNetworkToken = _GetMaterialNetworkToken(reprToken); - const TfTokenVector& requiredPrimvars - = material && material->GetSurfaceShader(materialNetworkToken) - ? material->GetRequiredPrimvars(materialNetworkToken) - : sFallbackShaderPrimvars; + TfTokenVector requiredPrimvars; + if (!_GetMaterialPrimvars(renderIndex, materialId, requiredPrimvars)) { + requiredPrimvars = sFallbackShaderPrimvars; + } for (const auto& requiredPrimvar : requiredPrimvars) { if (!_PrimvarIsRequired(requiredPrimvar)) { @@ -1697,7 +1694,7 @@ void HdVP2Mesh::_UpdateDrawItem( const GfRange3d& range = _sharedData.bounds.GetRange(); _UpdateTransform(stateToCommit, _sharedData, itemDirtyBits, isBBoxItem); - MMatrix& worldMatrix = drawItemData._worldMatrix; + const MMatrix& worldMatrix = drawItemData._worldMatrix; // If the mesh is instanced, create one new instance per transform. // The current instancer invalidation tracking makes it hard for diff --git a/lib/mayaUsd/render/vp2RenderDelegate/points.cpp b/lib/mayaUsd/render/vp2RenderDelegate/points.cpp index 538b69353f..4c941fab0e 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/points.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/points.cpp @@ -143,19 +143,14 @@ void HdVP2Points::Sync( if (HdChangeTracker::IsPrimvarDirty(*dirtyBits, id, HdTokens->normals) || HdChangeTracker::IsPrimvarDirty(*dirtyBits, id, HdTokens->widths) || HdChangeTracker::IsPrimvarDirty(*dirtyBits, id, HdTokens->primvar)) { - const HdVP2Material* material = static_cast( - renderIndex.GetSprim(HdPrimTypeTokens->material, GetMaterialId())); - - TfTokenVector materialPrimvars; - const TfTokenVector* requiredPrimvars = &sFallbackShaderPrimvars; - TfToken materialNetworkToken = _GetMaterialNetworkToken(reprToken); - if (material && material->GetSurfaceShader(materialNetworkToken)) { - materialPrimvars = material->GetRequiredPrimvars(materialNetworkToken); - materialPrimvars.push_back(HdTokens->widths); - requiredPrimvars = &materialPrimvars; + TfTokenVector requiredPrimvars; + if (!_GetMaterialPrimvars(renderIndex, GetMaterialId(), requiredPrimvars)) { + requiredPrimvars = sFallbackShaderPrimvars; + } else { + requiredPrimvars.push_back(HdTokens->widths); } - _UpdatePrimvarSources(delegate, *dirtyBits, *requiredPrimvars); + _UpdatePrimvarSources(delegate, *dirtyBits, requiredPrimvars); } if (*dirtyBits & HdChangeTracker::DirtyDisplayStyle) { @@ -589,7 +584,7 @@ void HdVP2Points::_UpdateDrawItem( const GfRange3d& range = _sharedData.bounds.GetRange(); _UpdateTransform(stateToCommit, _sharedData, itemDirtyBits, isBoundingBoxItem); - MMatrix& worldMatrix = drawItemData._worldMatrix; + const MMatrix& worldMatrix = drawItemData._worldMatrix; // If the prim is instanced, create one new instance per transform. // The current instancer invalidation tracking makes it hard for From 9b3028448cd1d51225158b5058f1061ed7432855 Mon Sep 17 00:00:00 2001 From: Ivan Vlasov Date: Mon, 19 Sep 2022 14:38:51 -0400 Subject: [PATCH 2/3] clang-format --- .../vp2RenderDelegate/mayaPrimCommon.cpp | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp b/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp index 1184d77365..8fdb9d95f2 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/mayaPrimCommon.cpp @@ -728,12 +728,12 @@ void MayaUsdRPrim::_SyncDisplayLayerModes(const HdRprim& continue; } - MPlug layerVisible = displayLayerNodeFn.findPlug("visibility"); - MPlug layerHidesOnPlayback = displayLayerNodeFn.findPlug("hideOnPlayback"); - MPlug layerDisplayType = displayLayerNodeFn.findPlug("displayType"); - MPlug levelOfDetail = displayLayerNodeFn.findPlug("levelOfDetail"); - MPlug shading = displayLayerNodeFn.findPlug("shading"); - MPlug texturing = displayLayerNodeFn.findPlug("texturing"); + MPlug layerVisible = displayLayerNodeFn.findPlug("visibility"); + MPlug layerHidesOnPlayback = displayLayerNodeFn.findPlug("hideOnPlayback"); + MPlug layerDisplayType = displayLayerNodeFn.findPlug("displayType"); + MPlug levelOfDetail = displayLayerNodeFn.findPlug("levelOfDetail"); + MPlug shading = displayLayerNodeFn.findPlug("shading"); + MPlug texturing = displayLayerNodeFn.findPlug("texturing"); _displayLayerModes._visibility &= layerVisible.asBool(); _displayLayerModes._hideOnPlayback |= layerHidesOnPlayback.asBool(); @@ -916,22 +916,26 @@ SdfPath MayaUsdRPrim::_GetUpdatedMaterialId(HdRprim* rprim, HdSceneDelegate* del return materialId; } -bool MayaUsdRPrim::_GetMaterialPrimvars(HdRenderIndex& renderIndex, const SdfPath& materialId, TfTokenVector& primvars) +bool MayaUsdRPrim::_GetMaterialPrimvars( + HdRenderIndex& renderIndex, + const SdfPath& materialId, + TfTokenVector& primvars) { - const HdVP2Material* material = static_cast(renderIndex.GetSprim(HdPrimTypeTokens->material, materialId)); + const HdVP2Material* material = static_cast( + renderIndex.GetSprim(HdPrimTypeTokens->material, materialId)); if (!material || !material->GetSurfaceShader(TfToken())) { return false; } // Get basic primvars primvars = material->GetRequiredPrimvars(TfToken()); - + // Get extra primvars if (material->GetSurfaceShader(HdReprTokens->smoothHull)) { const auto& extraPrimvars = material->GetRequiredPrimvars(HdReprTokens->smoothHull); - for (const auto& extraPrimvar: extraPrimvars) { + for (const auto& extraPrimvar : extraPrimvars) { if (std::find(primvars.begin(), primvars.end(), extraPrimvar) == primvars.end()) { - primvars.push_back(extraPrimvar); + primvars.push_back(extraPrimvar); } } } From 02c5371fa06c141ce38899f0e44b51612d666d63 Mon Sep 17 00:00:00 2001 From: Ivan Vlasov Date: Mon, 19 Sep 2022 14:41:04 -0400 Subject: [PATCH 3/3] Fixing the build --- lib/mayaUsd/ufe/UsdAttributes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mayaUsd/ufe/UsdAttributes.cpp b/lib/mayaUsd/ufe/UsdAttributes.cpp index dfb8291203..12f69a9444 100644 --- a/lib/mayaUsd/ufe/UsdAttributes.cpp +++ b/lib/mayaUsd/ufe/UsdAttributes.cpp @@ -61,7 +61,7 @@ _GetSdrPropertyAndType(const Ufe::SceneItem::Ptr& item, const std::string& tokNa { auto shaderNode = UsdShaderNodeDefHandler::usdDefinition(item); if (shaderNode) { - auto baseNameAndType = PXR_NS::UsdShadeUtils::GetBaseNameAndType(TfToken(tokName)); + auto baseNameAndType = PXR_NS::UsdShadeUtils::GetBaseNameAndType(PXR_NS::TfToken(tokName)); switch (baseNameAndType.second) { case PXR_NS::UsdShadeAttributeType::Invalid: return { nullptr, baseNameAndType.second }; case PXR_NS::UsdShadeAttributeType::Input: