| 100 | } |
| 101 | |
| 102 | void HnMaterial::Sync(pxr::HdSceneDelegate* SceneDelegate, |
| 103 | pxr::HdRenderParam* RenderParam, |
| 104 | pxr::HdDirtyBits* DirtyBits) |
| 105 | { |
| 106 | if (*DirtyBits == pxr::HdMaterial::Clean) |
| 107 | return; |
| 108 | |
| 109 | HnRenderDelegate* RenderDelegate = static_cast<HnRenderDelegate*>(SceneDelegate->GetRenderIndex().GetRenderDelegate()); |
| 110 | HnTextureRegistry& TexRegistry = RenderDelegate->GetTextureRegistry(); |
| 111 | const USD_Renderer& UsdRenderer = *RenderDelegate->GetUSDRenderer(); |
| 112 | |
| 113 | // A mapping from the texture name to the texture coordinate set index (e.g. "diffuseColor" -> 0) |
| 114 | TexNameToCoordSetMapType TexNameToCoordSetMap; |
| 115 | |
| 116 | pxr::VtValue vtMat = SceneDelegate->GetMaterialResource(GetId()); |
| 117 | if (vtMat.IsHolding<pxr::HdMaterialNetworkMap>()) |
| 118 | { |
| 119 | const pxr::HdMaterialNetworkMap& hdNetworkMap = vtMat.UncheckedGet<pxr::HdMaterialNetworkMap>(); |
| 120 | if (!hdNetworkMap.terminals.empty() && !hdNetworkMap.map.empty()) |
| 121 | { |
| 122 | try |
| 123 | { |
| 124 | m_Network = HnMaterialNetwork{GetId(), hdNetworkMap}; // May throw |
| 125 | |
| 126 | TexNameToCoordSetMap = AllocateTextures(TexRegistry); |
| 127 | ProcessMaterialNetwork(); |
| 128 | } |
| 129 | catch (const std::runtime_error& err) |
| 130 | { |
| 131 | LOG_ERROR_MESSAGE("Failed to create material network for material ", GetId(), ": ", err.what()); |
| 132 | m_Network = {}; |
| 133 | } |
| 134 | catch (...) |
| 135 | { |
| 136 | LOG_ERROR_MESSAGE("Failed to create material network for material ", GetId(), ": unknown error"); |
| 137 | m_Network = {}; |
| 138 | } |
| 139 | } |
| 140 | } |
| 141 | |
| 142 | // It is important to initialize texture attributes with default values even if there is no material network. |
| 143 | InitTextureAttribs(TexRegistry, UsdRenderer, TexNameToCoordSetMap); |
| 144 | |
| 145 | if (RenderParam) |
| 146 | { |
| 147 | static_cast<HnRenderParam*>(RenderParam)->MakeAttribDirty(HnRenderParam::GlobalAttrib::Material); |
| 148 | } |
| 149 | |
| 150 | *DirtyBits = HdMaterial::Clean; |
| 151 | } |
| 152 | |
| 153 | static bool ReadFallbackValue(const HnMaterialNetwork& Network, const pxr::TfToken& Name, float3& Value) |
| 154 | { |
nothing calls this directly
no test coverage detected