HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
dataSourceMaterialNetworkInterface.h
Go to the documentation of this file.
1 //
2 // Copyright 2021 Pixar
3 //
4 // Licensed under the terms set forth in the LICENSE.txt file available at
5 // https://openusd.org/license.
6 //
7 #ifndef HD_DATA_SOURCE_MATERIAL_NETWORK_INTERFACE_H
8 #define HD_DATA_SOURCE_MATERIAL_NETWORK_INTERFACE_H
9 
10 #include "pxr/usd/sdf/path.h"
16 #include <unordered_map>
17 #include <unordered_set>
18 
20 
21 /// \class HdDataSourceMaterialNetworkInterface
22 ///
23 /// Implements HdMaterialNetworkInterface for reading from and overriding
24 /// values within data sources. Overrides are managed internally via an
25 /// HdContainerDataSourceEditor. Calling Finish returns the resulting
26 /// container data resource representing an individual material network. If
27 /// nothing is overriden, the input data source is returned.
30 {
31 public:
32 
34  const SdfPath &materialPrimPath,
35  const HdContainerDataSourceHandle &networkContainer,
36  const HdContainerDataSourceHandle &primContainer)
37  : _materialPrimPath(materialPrimPath)
38  , _networkSchema(networkContainer)
39  , _networkEditor(networkContainer)
40  , _primContainer(primContainer)
41  , _nodesSchema(nullptr)
42  , _lastAccessedNodeSchema(nullptr)
43  , _lastAccessedNodeParametersSchema(nullptr)
44  , _lastAccessedNodeConnectionsSchema(nullptr)
45  {}
46 
47  HD_API
48  SdfPath GetMaterialPrimPath() const override {
49  return _materialPrimPath;
50  }
51 
52  HD_API
53  TfTokenVector GetMaterialConfigKeys() const override;
54  HD_API
55  VtValue GetMaterialConfigValue(const TfToken& key) const override;
56 
57  HD_API
58  std::string GetModelAssetName() const override;
59 
60  HD_API
61  TfTokenVector GetNodeNames() const override;
62 
63  HD_API
64  TfToken GetNodeType(const TfToken &nodeName) const override;
65 
66  HD_API
67  TfTokenVector GetNodeTypeInfoKeys(const TfToken& nodeName) const override;
68  HD_API
70  const TfToken& nodeName, const TfToken& value) const override;
71 
72  HD_API
74  const TfToken &nodeName) const override;
75 
76  HD_API
78  const TfToken &nodeName,
79  const TfToken &paramName) const override;
80 
81  HD_API
83  const TfToken &nodeName,
84  const TfToken &paramName) const override;
85 
86  HD_API
88  const TfToken &nodeName) const override;
89 
90  HD_API
92  const TfToken &nodeName,
93  const TfToken &inputName) const override;
94 
95  HD_API
96  void DeleteNode(const TfToken &nodeName) override;
97 
98  /// Set the nodeType for the shader node with the given \p nodeName.
99  /// If \p nodeType is empty then the nodeType attribute will be removed
100  /// from the node's dataSource.
101  HD_API
102  void SetNodeType(
103  const TfToken &nodeName,
104  const TfToken &nodeType) override;
105 
106  HD_API
108  const TfToken &nodeName,
109  const TfToken &key,
110  const VtValue &value) override;
111 
112  HD_API
114  const TfToken &nodeName,
115  const TfToken &paramName,
116  const VtValue &value) override;
117 
118  HD_API
120  const TfToken &nodeName,
121  const TfToken &paramName,
122  const NodeParamData &paramData) override;
123 
124  HD_API
125  void DeleteNodeParameter(
126  const TfToken &nodeName,
127  const TfToken &paramName) override;
128 
129  HD_API
131  const TfToken &nodeName,
132  const TfToken &inputName,
133  const InputConnectionVector &connections) override;
134 
135  HD_API
137  const TfToken &nodeName,
138  const TfToken &inputName) override;
139 
140  HD_API
141  TfTokenVector GetTerminalNames() const override;
142 
143  HD_API
145  const TfToken &terminalName) const override;
146 
147  HD_API
148  void DeleteTerminal(
149  const TfToken &terminalName) override;
150 
151  HD_API
153  const TfToken &terminalName,
154  const InputConnection &connection) override;
155 
156  HD_API
157  HdContainerDataSourceHandle Finish();
158 
159 private:
160 
161  /// Return the nodeTypeInfo dataSource, if it exists, for the specified
162  /// \p nodeName. Does NOT take into account any overrides of the nodeType
163  /// data that may have been authored by SetNodeTypeInfoValue().
164  HdContainerDataSourceHandle _GetOriginalNodeTypeInfo(
165  const TfToken& nodeName) const;
166 
167  /// Return the nodeTypeInfo dataSource for the supplied \p nodeName,
168  /// taking into account any overrides that may have been authored.
169  HdContainerDataSourceHandle _GetNodeTypeInfo(
170  const TfToken& nodeName) const;
171 
172  using _OverrideMap =
173  std::unordered_map<HdDataSourceLocator, HdDataSourceBaseHandle,
174  TfHash>;
175 
176  using _HdContainerDataSourceEditorSharedPtr =
177  std::shared_ptr<class HdContainerDataSourceEditor>;
178 
179  using _NodeTypeInfoMap =
180  std::unordered_map<TfToken, _HdContainerDataSourceEditorSharedPtr,
182 
183  using _TokenSet = std::unordered_set<TfToken, TfHash>;
184 
185  void _SetOverride(
186  const HdDataSourceLocator &loc,
187  const HdDataSourceBaseHandle &ds);
188 
189  SdfPath _materialPrimPath;
190  mutable HdMaterialNetworkSchema _networkSchema;
191  HdContainerDataSourceEditor _networkEditor;
192  _NodeTypeInfoMap _nodeTypeInfoOverrides;
193  HdContainerDataSourceHandle _primContainer;
194  _OverrideMap _existingOverrides;
195  _TokenSet _overriddenNodes;
196  _TokenSet _deletedNodes;
197  bool _terminalsOverridden = false;
198 
199  // cache some common child containers to avoid repeated access
200  HdMaterialNodeSchema _ResetIfNecessaryAndGetNode(
201  const TfToken &nodeName) const;
202  HdMaterialNodeParameterContainerSchema _GetNodeParameters(
203  const TfToken &nodeName) const;
204  HdMaterialConnectionVectorContainerSchema _GetNodeConnections(
205  const TfToken &nodeName) const;
206 
207  mutable HdMaterialNodeContainerSchema _nodesSchema;
208 
209 
210  mutable TfToken _lastAccessedNodeName;
211 
212 
213  mutable HdMaterialNodeSchema _lastAccessedNodeSchema;
214  mutable HdMaterialNodeParameterContainerSchema _lastAccessedNodeParametersSchema;
215  mutable HdMaterialConnectionVectorContainerSchema _lastAccessedNodeConnectionsSchema;
216 };
217 
219 
220 #endif // HD_DATA_SOURCE_MATERIAL_NETWORK_INTERFACE_H
HdDataSourceMaterialNetworkInterface(const SdfPath &materialPrimPath, const HdContainerDataSourceHandle &networkContainer, const HdContainerDataSourceHandle &primContainer)
HD_API void DeleteNode(const TfToken &nodeName) override
HD_API void SetNodeParameterData(const TfToken &nodeName, const TfToken &paramName, const NodeParamData &paramData) override
HD_API VtValue GetNodeParameterValue(const TfToken &nodeName, const TfToken &paramName) const override
HD_API void DeleteNodeInputConnection(const TfToken &nodeName, const TfToken &inputName) override
GLsizei const GLfloat * value
Definition: glcorearb.h:824
HD_API TfTokenVector GetNodeNames() const override
HD_API HdMaterialNetworkInterface::NodeParamData GetNodeParameterData(const TfToken &nodeName, const TfToken &paramName) const override
HD_API TfToken GetNodeType(const TfToken &nodeName) const override
HD_API void SetNodeType(const TfToken &nodeName, const TfToken &nodeType) override
#define HD_API
Definition: api.h:23
HD_API VtValue GetMaterialConfigValue(const TfToken &key) const override
Functor to use for hash maps from tokens to other things.
Definition: token.h:149
HD_API TfTokenVector GetNodeTypeInfoKeys(const TfToken &nodeName) const override
HD_API HdContainerDataSourceHandle Finish()
HD_API TfTokenVector GetMaterialConfigKeys() const override
HD_API void SetNodeTypeInfoValue(const TfToken &nodeName, const TfToken &key, const VtValue &value) override
Definition: hash.h:472
Definition: token.h:70
HD_API void DeleteNodeParameter(const TfToken &nodeName, const TfToken &paramName) override
HD_API void SetNodeParameterValue(const TfToken &nodeName, const TfToken &paramName, const VtValue &value) override
HD_API VtValue GetNodeTypeInfoValue(const TfToken &nodeName, const TfToken &value) const override
std::vector< TfToken > TfTokenVector
Convenience types.
Definition: token.h:440
Definition: path.h:273
HD_API void DeleteTerminal(const TfToken &terminalName) override
HD_API TfTokenVector GetNodeInputConnectionNames(const TfToken &nodeName) const override
HD_API InputConnectionResult GetTerminalConnection(const TfToken &terminalName) const override
HD_API TfTokenVector GetTerminalNames() const override
TfSmallVector< InputConnection, 4 > InputConnectionVector
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
Definition: path.h:1425
HD_API void SetNodeInputConnection(const TfToken &nodeName, const TfToken &inputName, const InputConnectionVector &connections) override
HD_API InputConnectionVector GetNodeInputConnection(const TfToken &nodeName, const TfToken &inputName) const override
#define PXR_NAMESPACE_CLOSE_SCOPE
Definition: pxr.h:74
HD_API TfTokenVector GetAuthoredNodeParameterNames(const TfToken &nodeName) const override
HD_API std::string GetModelAssetName() const override
HD_API void SetTerminalConnection(const TfToken &terminalName, const InputConnection &connection) override
std::pair< bool, InputConnection > InputConnectionResult
Definition: value.h:146