diff --git a/lib/mayaUsd/render/mayaToHydra/renderOverride.cpp b/lib/mayaUsd/render/mayaToHydra/renderOverride.cpp index 2053d88638..c56d85b618 100644 --- a/lib/mayaUsd/render/mayaToHydra/renderOverride.cpp +++ b/lib/mayaUsd/render/mayaToHydra/renderOverride.cpp @@ -601,7 +601,7 @@ MStatus MtohRenderOverride::Render(const MHWRender::MDrawContext& drawContext, c auto sceneDelegate = std::dynamic_pointer_cast(it); if (sceneDelegate) { - sceneDelegate->HandleCompleteViewportScene(scene); + sceneDelegate->HandleCompleteViewportScene(scene, static_cast(drawContext.getDisplayStyle())); sceneDelegate->ScheduleRenderTasks(tasks); } } diff --git a/lib/usd/hdMaya/adapters/directionalLightAdapter.cpp b/lib/usd/hdMaya/adapters/directionalLightAdapter.cpp index c2cab3eaaa..4375652fc5 100644 --- a/lib/usd/hdMaya/adapters/directionalLightAdapter.cpp +++ b/lib/usd/hdMaya/adapters/directionalLightAdapter.cpp @@ -59,7 +59,7 @@ class HdMayaDirectionalLightAdapter : public HdMayaLightAdapter { TF_DEBUG(HDMAYA_ADAPTER_GET) .Msg( - "Called HdMayaSpotLightAdapter::Get(%s) - %s\n", + "Called HdMayaDirectionalLightAdapter::Get(%s) - %s\n", key.GetText(), GetDagPath().partialPathName().asChar()); diff --git a/lib/usd/hdMaya/adapters/renderItemAdapter.cpp b/lib/usd/hdMaya/adapters/renderItemAdapter.cpp index a39ef0a7ed..495f499a26 100644 --- a/lib/usd/hdMaya/adapters/renderItemAdapter.cpp +++ b/lib/usd/hdMaya/adapters/renderItemAdapter.cpp @@ -355,7 +355,9 @@ void HdMayaRenderItemAdapter::_RemoveRprim() GetDelegate()->RemoveRprim(GetID()); } -void HdMayaRenderItemAdapter::UpdateFromDelta(MRenderItem& ri, unsigned int flags) + + +void HdMayaRenderItemAdapter::UpdateFromDelta(const UpdateFromDeltaData& data) { if (_primitive != MHWRender::MGeometry::Primitive::kTriangles && _primitive != MHWRender::MGeometry::Primitive::kLines) { @@ -363,15 +365,25 @@ void HdMayaRenderItemAdapter::UpdateFromDelta(MRenderItem& ri, unsigned int flag } //const bool isNew = flags & MViewportScene::MVS_new; //not used yet - const bool visible = flags & MViewportScene::MVS_visible; + const bool visible = data._flags & MViewportScene::MVS_visible; + const bool matrixChanged = data._flags & MViewportScene::MVS_changedMatrix; + const bool geomChanged = data._flags & MViewportScene::MVS_changedGeometry; + const bool topoChanged = data._flags & MViewportScene::MVS_changedTopo; + const bool visibChanged = data._flags & MViewportScene::MVS_changedVisibility; + const bool effectChanged = data._flags & MViewportScene::MVS_changedEffect; + + const bool isLinePrimitive = (MHWRender::MGeometry::Primitive::kLines == _primitive); - const bool matrixChanged = flags & MViewportScene::MVS_changedMatrix; - const bool geomChanged = flags & MViewportScene::MVS_changedGeometry; - const bool topoChanged = flags & MViewportScene::MVS_changedTopo; - const bool visibChanged = flags & MViewportScene::MVS_changedVisibility; - const bool effectChanged = flags & MViewportScene::MVS_changedEffect; + _wireframeColor = data._wireframeColor; + _displayStatus = data._displayStatus; - HdDirtyBits dirtyBits = 0; + //At some point, we will have to handle the dormant color if the user customized the wireframe color of an object + //as we use the same color for all dormant objects + if (isLinePrimitive){ + GetDelegate()->UpdateDisplayStatusMaterial(_displayStatus, _wireframeColor); + } + + HdDirtyBits dirtyBits = 0; if (visibChanged) { @@ -394,7 +406,7 @@ void HdMayaRenderItemAdapter::UpdateFromDelta(MRenderItem& ri, unsigned int flag MGeometry* geom = nullptr; if (geomChanged | topoChanged) { - geom = ri.geometry(); + geom = data._ri.geometry(); } VtIntArray vertexIndices; VtIntArray vertexCounts; diff --git a/lib/usd/hdMaya/adapters/renderItemAdapter.h b/lib/usd/hdMaya/adapters/renderItemAdapter.h index ef9f29880f..416fbf142d 100644 --- a/lib/usd/hdMaya/adapters/renderItemAdapter.h +++ b/lib/usd/hdMaya/adapters/renderItemAdapter.h @@ -29,6 +29,7 @@ #include #include +#include #include #include @@ -192,6 +193,12 @@ class HdMayaRenderItemAdapter : public HdMayaAdapter HDMAYA_API void SetVisible(bool val) { _visible = val; } + HDMAYA_API + const MColor& GetWireframeColor() const { return _wireframeColor; } + + HDMAYA_API + MHWRender::DisplayStatus GetDisplayStatus() const { return _displayStatus; } + // TODO: move transform to common base class with HdMayaDagAdapter HDMAYA_API GfMatrix4d GetTransform() { return _transform[0]; } @@ -211,8 +218,23 @@ class HdMayaRenderItemAdapter : public HdMayaAdapter HDMAYA_API void UpdateTopology(MRenderItem& ri); + //Class used to pass data to the UpdateFromDelta method, so we can extend the parameters in the future if needed. + class UpdateFromDeltaData + { + public: + UpdateFromDeltaData(MRenderItem& ri, unsigned int flags, const MColor& wireframeColor, MHWRender::DisplayStatus displayStatus) : + _ri(ri), _flags(flags), _wireframeColor(wireframeColor), _displayStatus(displayStatus) + { + } + + MRenderItem& _ri; + unsigned int _flags; + const MColor& _wireframeColor; + MHWRender::DisplayStatus _displayStatus; + }; + HDMAYA_API - void UpdateFromDelta(MRenderItem& ri, unsigned int flags); + void UpdateFromDelta(const UpdateFromDeltaData& data); HDMAYA_API virtual std::shared_ptr GetTopology(); @@ -252,7 +274,8 @@ class HdMayaRenderItemAdapter : public HdMayaAdapter GfMatrix4d _transform[2]; // TODO: move transform to common base class with HdMayaDagAdapter int _fastId = 0; bool _visible = false; - + MColor _wireframeColor = {1.f,1.f,1.f,1.f}; + MHWRender::DisplayStatus _displayStatus = MHWRender::DisplayStatus::kNoStatus; }; PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/usd/hdMaya/delegates/delegateCtx.cpp b/lib/usd/hdMaya/delegates/delegateCtx.cpp index a2bd01eebd..869c2afded 100644 --- a/lib/usd/hdMaya/delegates/delegateCtx.cpp +++ b/lib/usd/hdMaya/delegates/delegateCtx.cpp @@ -59,16 +59,13 @@ SdfPath _GetRenderItemPrimPath(const SdfPath& base, const MRenderItem& ri) if (ri.InternalObjectId() == 0) return {}; const auto mayaPath = UsdMayaUtil::RenderItemToUsdPath(ri, false, false); if (mayaPath.IsEmpty()) return {}; - - const auto* chr = mayaPath.GetText(); - if (chr == nullptr) { - return {}; - }; - std::string s(chr + 1); - if (s.empty()) { - return {}; - } - return base.AppendPath(SdfPath(s)); + + const std::string theString = std::string(mayaPath.GetText()); + if (theString.size() < 2){ + return {};//Error + } + + return base.AppendPath(mayaPath); } SdfPath _GetRenderItemShaderPrimPath(const SdfPath& base, const MRenderItem& ri) diff --git a/lib/usd/hdMaya/delegates/delegateCtx.h b/lib/usd/hdMaya/delegates/delegateCtx.h index a7267a0282..373f992340 100644 --- a/lib/usd/hdMaya/delegates/delegateCtx.h +++ b/lib/usd/hdMaya/delegates/delegateCtx.h @@ -24,6 +24,7 @@ #include #include +#include PXR_NAMESPACE_OPEN_SCOPE @@ -59,6 +60,8 @@ class HdMayaDelegateCtx virtual void RecreateAdapter(const SdfPath& id, const MObject& obj) { } virtual void RecreateAdapterOnIdle(const SdfPath& id, const MObject& obj) { } virtual void RebuildAdapterOnIdle(const SdfPath& id, uint32_t flags) { } + virtual void UpdateDisplayStatusMaterial(MHWRender::DisplayStatus displayStatus, const MColor& wireframecolor) {} + /// \brief Notifies the scene delegate when a material tag changes. /// /// \param id Id of the Material that changed its tag. diff --git a/lib/usd/hdMaya/delegates/sceneDelegate.cpp b/lib/usd/hdMaya/delegates/sceneDelegate.cpp index 8d4ff26e4e..49e15a2735 100644 --- a/lib/usd/hdMaya/delegates/sceneDelegate.cpp +++ b/lib/usd/hdMaya/delegates/sceneDelegate.cpp @@ -193,6 +193,16 @@ TF_DEFINE_PRIVATE_TOKENS( (HdMayaSceneDelegate) ((FallbackMaterial, "__fallback_material__")) + ((ActiveDisplayStatusMaterial, "__active_selection_material__")) + ((LiveDisplayStatusMaterial, "__live_selection_material__")) + ((DormantDisplayStatusMaterial, "__dormant_selection_material__")) + ((HiliteDisplayStatusMaterial, "__hilite_selection_material__")) + ((TemplateDisplayStatusMaterial, "__template_selection_material__")) + ((ActiveTemplateDisplayStatusMaterial, "__activetemplate_selection_material__")) + ((ActiveComponentDisplayStatusMaterial, "__activecomponent_selection_material__")) + ((LeadDisplayStatusMaterial, "__lead_selection_material__")) + ((ActiveAffectedDisplayStatusMaterial, "__activeaffected_selection_material__")) + (diffuseColor) (HdMayaMeshPoints) ); // clang-format on @@ -216,6 +226,9 @@ HdMayaSceneDelegate::HdMayaSceneDelegate(const InitData& initData) : HdMayaDelegateCtx(initData) , _fallbackMaterial(initData.delegateID.AppendChild(_tokens->FallbackMaterial)) { + //TfDebug::Enable(HDMAYA_DELEGATE_GET_MATERIAL_ID); + + CreateDisplayStatusMaterials(); } HdMayaSceneDelegate::~HdMayaSceneDelegate() @@ -238,6 +251,64 @@ HdMayaSceneDelegate::~HdMayaSceneDelegate() #endif } +void HdMayaSceneDelegate::CreateDisplayStatusMaterials() +{ + //Init Display status materials + _displayStatusMaterials.insert( {MHWRender::DisplayStatus::kActive, DisplayStatusMaterialData(SdfPath::AbsoluteRootPath().AppendChild(_tokens->ActiveDisplayStatusMaterial), HdMaterialNetworkMap())} ); + _displayStatusMaterials.insert( {MHWRender::DisplayStatus::kLive, DisplayStatusMaterialData(SdfPath::AbsoluteRootPath().AppendChild(_tokens->LiveDisplayStatusMaterial), HdMaterialNetworkMap())} ); + _displayStatusMaterials.insert( {MHWRender::DisplayStatus::kDormant, DisplayStatusMaterialData(SdfPath::AbsoluteRootPath().AppendChild(_tokens->DormantDisplayStatusMaterial), HdMaterialNetworkMap())} );//Used when viewport needs wireframe primitives + _displayStatusMaterials.insert( {MHWRender::DisplayStatus::kHilite, DisplayStatusMaterialData(SdfPath::AbsoluteRootPath().AppendChild(_tokens->HiliteDisplayStatusMaterial), HdMaterialNetworkMap())} ); + _displayStatusMaterials.insert( {MHWRender::DisplayStatus::kTemplate, DisplayStatusMaterialData(SdfPath::AbsoluteRootPath().AppendChild(_tokens->TemplateDisplayStatusMaterial), HdMaterialNetworkMap())} ); + _displayStatusMaterials.insert( {MHWRender::DisplayStatus::kActiveTemplate, DisplayStatusMaterialData(SdfPath::AbsoluteRootPath().AppendChild(_tokens->ActiveTemplateDisplayStatusMaterial), HdMaterialNetworkMap())} ); + _displayStatusMaterials.insert( {MHWRender::DisplayStatus::kActiveComponent,DisplayStatusMaterialData(SdfPath::AbsoluteRootPath().AppendChild(_tokens->ActiveComponentDisplayStatusMaterial), HdMaterialNetworkMap())} ); + _displayStatusMaterials.insert( {MHWRender::DisplayStatus::kLead, DisplayStatusMaterialData(SdfPath::AbsoluteRootPath().AppendChild(_tokens->LeadDisplayStatusMaterial), HdMaterialNetworkMap())} ); + _displayStatusMaterials.insert( {MHWRender::DisplayStatus::kActiveAffected, DisplayStatusMaterialData(SdfPath::AbsoluteRootPath().AppendChild(_tokens->ActiveAffectedDisplayStatusMaterial), HdMaterialNetworkMap())} ); + + //Apply a default white color which will be replaced by an actual color value coming from a renderitem which has the related display status. + static const VtValue whiteColor = VtValue(GfVec4f(1.f,1.f,1.f,1.f)); + + //Init the HdMaterialNetworkMap from each of the display status materials + for (auto& displayStatusMat : _displayStatusMaterials){ + HdMaterialNetwork network; + HdMaterialNode node; + node.identifier = UsdImagingTokens->UsdPreviewSurface; + node.path = displayStatusMat.second._materialPath; + node.parameters.insert({_tokens->diffuseColor, whiteColor}); + network.nodes.push_back(std::move(node)); + displayStatusMat.second._materialNetworkMap.map.insert({HdMaterialTerminalTokens->surface, std::move(network)}); + displayStatusMat.second._materialNetworkMap.terminals.push_back(node.path); + } +} + +void HdMayaSceneDelegate::AddDisplayStatusMaterialsToHydra(HdRenderIndex& renderIndex) +{ + for (auto& displayStatusMat : _displayStatusMaterials){ + renderIndex.InsertSprim(HdPrimTypeTokens->material, this, displayStatusMat.second._materialPath); + } +} + +void HdMayaSceneDelegate::UpdateDisplayStatusMaterial(MHWRender::DisplayStatus displayStatus, const MColor& wireframecolor) +{ + auto it = _displayStatusMaterials.find(displayStatus); + if (it != _displayStatusMaterials.end()){ + UpdateDisplayStatusMaterialColor(it->second._materialPath, it->second._materialNetworkMap, GfVec4f (wireframecolor[0], wireframecolor[1], wireframecolor[2], wireframecolor[3])); + } +} + +void HdMayaSceneDelegate::UpdateDisplayStatusMaterialColor(const SdfPath& materialPath, HdMaterialNetworkMap& material, const GfVec4f& selCol) +{ + material.map.clear(); + HdMaterialNetwork network; + HdMaterialNode node; + node.identifier = UsdImagingTokens->UsdPreviewSurface; + node.path = materialPath; + node.parameters.insert({_tokens->diffuseColor, VtValue(selCol)}); + network.nodes.push_back(std::move(node)); + material.map.insert({HdMaterialTerminalTokens->surface, std::move(network)}); + + GetChangeTracker().MarkSprimDirty(materialPath, HdMaterial::DirtyParams); +} + void HdMayaSceneDelegate::_AddRenderItem(const HdMayaRenderItemAdapterPtr& ria) { _renderItemsAdaptersFast.insert({ ria->GetFastID(), ria }); @@ -252,7 +323,7 @@ void HdMayaSceneDelegate::_RemoveRenderItem( } //void HdMayaSceneDelegate::_TransformNodeDirty(MObject& node, MPlug& plug, void* clientData) -void HdMayaSceneDelegate::HandleCompleteViewportScene(const MViewportScene& scene) +void HdMayaSceneDelegate::HandleCompleteViewportScene(const MViewportScene& scene, MFrameContext::DisplayStyle displayStyle) { #if 1 // First loop to get rid of removed items @@ -273,22 +344,22 @@ void HdMayaSceneDelegate::HandleCompleteViewportScene(const MViewportScene& scen // This loop could, in theory, be parallelized. Unclear how large the gains would be, but maybe // nothing to lose unless there is some internal contention in USD. for (size_t i = 0; i < scene.mCount; i++) { - auto flags = scene.mFlags[i]; - if (_handleCompleteViewportSceneHasNotBeenCalledYet) - { - //Rebuild everything when we have created the scene delegate whatever the MViewportScene flags are - // this is used to handle the case when switching back and forth from VP2 to Hydra. - // Since there are no actual changes in the scene when doing so, the flags are all 0 but we have - // to re-create all hydra data for these render items so we hardcode the flags value. - flags = MViewportScene::MVS_ALL | MViewportScene::MVS_visible; + auto flags = scene.mFlags[i]; + const auto& ri = *scene.mItems[i]; + + MColor wireframeColor; + MHWRender::DisplayStatus displayStatus = MHWRender::kNoStatus; + + MDagPath dagPath = ri.sourceDagPath(); + if (dagPath.isValid()){ + wireframeColor = MGeometryUtilities::wireframeColor(dagPath);//This is a color managed VP2 color, it will need to be unmanaged at some point + displayStatus = MGeometryUtilities::displayStatus(dagPath); } - else - { - if (flags == 0) - continue; + + if (flags == 0){ + continue; } - - const auto& ri = *scene.mItems[i]; + int fastId = scene.mItems[i]->InternalObjectId(); HdMayaRenderItemAdapterPtr ria = nullptr; if (!_GetRenderItem(fastId, ria)) @@ -316,7 +387,8 @@ void HdMayaSceneDelegate::HandleCompleteViewportScene(const MViewportScene& scen // if (flags & (MViewPortScene::MVS_geometry | MViewPortScene::MVS_topo) { // notify transform changed also in UpdateGeometry, so always call if anything changed // TODO: refactor to separate notifications from geometry - ria->UpdateFromDelta(*scene.mItems[i], flags); + const HdMayaRenderItemAdapter::UpdateFromDeltaData data(*scene.mItems[i], flags, wireframeColor, displayStatus); + ria->UpdateFromDelta(data); //} if (flags & MViewportScene::MVS_changedMatrix) { ria->UpdateTransform(*scene.mItems[i]); @@ -359,7 +431,6 @@ void HdMayaSceneDelegate::HandleCompleteViewportScene(const MViewportScene& scen } } #endif - _handleCompleteViewportSceneHasNotBeenCalledYet = false; } void HdMayaSceneDelegate::Populate() @@ -399,9 +470,10 @@ void HdMayaSceneDelegate::Populate() - // Adding fallback materials sprim to the render index. + // Adding materials sprim to the render index. if (renderIndex.IsSprimTypeSupported(HdPrimTypeTokens->material)) { renderIndex.InsertSprim(HdPrimTypeTokens->material, this, _fallbackMaterial); + AddDisplayStatusMaterialsToHydra(renderIndex); } @@ -1416,17 +1488,16 @@ SdfPath HdMayaSceneDelegate::GetPathForInstanceIndex( bool HdMayaSceneDelegate::GetVisible(const SdfPath& id) { -#ifdef HDMAYA_SCENE_RENDER_DATASERVER - TF_DEBUG(HDMAYA_DELEGATE_GET_VISIBLE) + TF_DEBUG(HDMAYA_DELEGATE_GET_VISIBLE) .Msg("HdMayaSceneDelegate::GetVisible(%s)\n", id.GetText()); + +#ifdef HDMAYA_SCENE_RENDER_DATASERVER return _GetValue( id, [](HdMayaRenderItemAdapter* a) -> bool { return a->GetVisible(); }, _renderItemsAdapters ); #else - TF_DEBUG(HDMAYA_DELEGATE_GET_VISIBLE) - .Msg("HdMayaSceneDelegate::GetVisible(%s)\n", id.GetText()); return _GetValue( id, [](HdMayaDagAdapter* a) -> bool { return a->GetVisible(); }, @@ -1478,6 +1549,9 @@ HdDisplayStyle HdMayaSceneDelegate::GetDisplayStyle(const SdfPath& id) SdfPath HdMayaSceneDelegate::GetMaterialId(const SdfPath& id) { + TF_DEBUG(HDMAYA_DELEGATE_GET_MATERIAL_ID) + .Msg("HdMayaSceneDelegate::GetMaterialId(%s)\n", id.GetText()); + #ifdef HDMAYA_SCENE_RENDER_DATASERVER if (!_enableMaterials) return {}; @@ -1487,6 +1561,16 @@ SdfPath HdMayaSceneDelegate::GetMaterialId(const SdfPath& id) } auto& renderItemAdapter = *result; + + //Check if this render item is a wireframe primitive + if (MHWRender::MGeometry::Primitive::kLines == renderItemAdapter->GetPrimitive()){ + const MHWRender::DisplayStatus displayStatus = renderItemAdapter->GetDisplayStatus(); + auto it = _displayStatusMaterials.find(displayStatus); + if (it != _displayStatusMaterials.end()){ + return it->second._materialPath; + } + } + auto& shaderData = renderItemAdapter->GetShaderData(); if (renderItemAdapter->GetShaderData().ShapeUIShader) // Do not return material for shape UI, @@ -1511,8 +1595,6 @@ SdfPath HdMayaSceneDelegate::GetMaterialId(const SdfPath& id) //return _CreateMaterial(materialId, material) ? materialId : _fallbackMaterial; return {}; #else - TF_DEBUG(HDMAYA_DELEGATE_GET_MATERIAL_ID) - .Msg("HdMayaSceneDelegate::GetMaterialId(%s)\n", id.GetText()); if (!_enableMaterials) return {}; auto shapeAdapter = TfMapLookupPtr(_shapeAdapters, id); @@ -1534,14 +1616,23 @@ SdfPath HdMayaSceneDelegate::GetMaterialId(const SdfPath& id) VtValue HdMayaSceneDelegate::GetMaterialResource(const SdfPath& id) { -#ifdef HDMAYA_SCENE_RENDER_DATASERVER - // TODO this is the same as !HDMAYA_SCENE_RENDER_DATASERVER - if ( - id == _fallbackMaterial - ) + TF_DEBUG(HDMAYA_DELEGATE_GET_MATERIAL_RESOURCE) + .Msg("HdMayaSceneDelegate::GetMaterialResource(%s)\n", id.GetText()); + + if (id == _fallbackMaterial) { return HdMayaMaterialAdapter::GetPreviewMaterialResource(id); } + + //Find if this material path is inside our display status map + auto itResult = std::find_if(cbegin(_displayStatusMaterials), cend(_displayStatusMaterials), + [&id](const DisplayStatusMaterialMap_Type& data){ return data.second._materialPath == id; }); + if (itResult != _displayStatusMaterials.end()){ + return VtValue(itResult->second._materialNetworkMap); + } + +#ifdef HDMAYA_SCENE_RENDER_DATASERVER + // TODO this is the same as !HDMAYA_SCENE_RENDER_DATASERVER auto ret = _GetValue( id, [](HdMayaMaterialAdapter* a) -> VtValue { return a->GetMaterialResource(); }, @@ -1549,14 +1640,6 @@ VtValue HdMayaSceneDelegate::GetMaterialResource(const SdfPath& id) return ret.IsEmpty() ? HdMayaMaterialAdapter::GetPreviewMaterialResource(id) : ret; #else - TF_DEBUG(HDMAYA_DELEGATE_GET_MATERIAL_RESOURCE) - .Msg("HdMayaSceneDelegate::GetMaterialResource(%s)\n", id.GetText()); - if ( - id == _fallbackMaterial - ) - { - return HdMayaMaterialAdapter::GetPreviewMaterialResource(id); - } auto ret = _GetValue( id, [](HdMayaMaterialAdapter* a) -> VtValue { return a->GetMaterialResource(); }, diff --git a/lib/usd/hdMaya/delegates/sceneDelegate.h b/lib/usd/hdMaya/delegates/sceneDelegate.h index 8bddf41c16..d4fdd4bdcd 100644 --- a/lib/usd/hdMaya/delegates/sceneDelegate.h +++ b/lib/usd/hdMaya/delegates/sceneDelegate.h @@ -29,6 +29,7 @@ #include #include +#include #include #include @@ -80,6 +81,9 @@ class HdMayaSceneDelegate : public HdMayaDelegateCtx HDMAYA_API void RebuildAdapterOnIdle(const SdfPath& id, uint32_t flags) override; + HDMAYA_API + void UpdateDisplayStatusMaterial(MHWRender::DisplayStatus displayStatus, const MColor& wireframecolor) override; + /// \brief Notifies the scene delegate when a material tag changes. /// /// This function is only affects the render index when its using HdSt. @@ -128,7 +132,7 @@ class HdMayaSceneDelegate : public HdMayaDelegateCtx // TODO: change management HDMAYA_API - void HandleCompleteViewportScene(const MViewportScene& scene); + void HandleCompleteViewportScene(const MViewportScene& scene, MFrameContext::DisplayStyle ds); #if MAYA_API_VERSION >= 20210000 @@ -278,6 +282,10 @@ class HdMayaSceneDelegate : public HdMayaDelegateCtx HdMayaShaderInstanceData& sd, MObject& shadingEngineNode); + void UpdateDisplayStatusMaterialColor(const SdfPath& materialPath, HdMaterialNetworkMap& material, const GfVec4f& selCol); + void CreateDisplayStatusMaterials(); + void AddDisplayStatusMaterialsToHydra(HdRenderIndex& renderIndex); + bool _CreateMaterial(const SdfPath& id, const MObject& obj); /// \brief Unordered Map storing the shape adapters. AdapterMap _shapeAdapters; @@ -300,13 +308,19 @@ class HdMayaSceneDelegate : public HdMayaDelegateCtx std::vector _materialTagsChanged; SdfPath _fallbackMaterial; - - //GfVec3f _pointColor = + + struct DisplayStatusMaterialData + { + DisplayStatusMaterialData(const SdfPath& materialPath,const HdMaterialNetworkMap& materialNetworkMap) :_materialPath(materialPath), _materialNetworkMap(materialNetworkMap) + {}; + SdfPath _materialPath; + HdMaterialNetworkMap _materialNetworkMap; + }; + typedef std::unordered_map DisplayStatusMaterialMap; + typedef std::unordered_map::value_type DisplayStatusMaterialMap_Type;//For using std::find_if + DisplayStatusMaterialMap _displayStatusMaterials; bool _enableMaterials = false; - //This is used when we switch back and forth from VP2 to Hydra, since the MViewportScene mFlags were all 0 as no actual change was happening in the scene, - //but we needed to re-create the hydra data for these render items. - bool _handleCompleteViewportSceneHasNotBeenCalledYet = true; }; typedef std::shared_ptr MayaSceneDelegateSharedPtr;