MaterialX 1.39.0
Loading...
Searching...
No Matches
Node.h
Go to the documentation of this file.
1//
2// Copyright Contributors to the MaterialX Project
3// SPDX-License-Identifier: Apache-2.0
4//
5
6#ifndef MATERIALX_NODE_H
7#define MATERIALX_NODE_H
8
11
13
15
16MATERIALX_NAMESPACE_BEGIN
17
18class Node;
19class GraphElement;
20class NodeGraph;
21class Backdrop;
22
24using NodePtr = shared_ptr<Node>;
26using ConstNodePtr = shared_ptr<const Node>;
27
29using GraphElementPtr = shared_ptr<GraphElement>;
31using ConstGraphElementPtr = shared_ptr<const GraphElement>;
32
34using NodeGraphPtr = shared_ptr<NodeGraph>;
36using ConstNodeGraphPtr = shared_ptr<const NodeGraph>;
37
39using BackdropPtr = shared_ptr<Backdrop>;
41using ConstBackdropPtr = shared_ptr<const Backdrop>;
42
43// Predicate to test a node against some criteria whether
44// that criteria has passed
45using NodePredicate = std::function<bool(NodePtr node)>;
46
52class MX_CORE_API Node : public InterfaceElement
53{
54 public:
55 Node(ElementPtr parent, const string& name) :
56 InterfaceElement(parent, CATEGORY, name)
57 {
58 }
59 virtual ~Node() { }
60
63
67 void setConnectedNode(const string& inputName, ConstNodePtr node);
68
71 NodePtr getConnectedNode(const string& inputName) const;
72
75 void setConnectedNodeName(const string& inputName, const string& nodeName);
76
79 string getConnectedNodeName(const string& inputName) const;
80
84 void setConnectedOutput(const string& inputName, OutputPtr output);
85
88 OutputPtr getConnectedOutput(const string& inputName) const;
89
93
103 NodeDefPtr getNodeDef(const string& target = EMPTY_STRING,
104 bool allowRoughMatch = false) const;
105
109
117 InterfaceElementPtr getImplementation(const string& target = EMPTY_STRING) const
118 {
119 NodeDefPtr nodeDef = getNodeDef(target);
120 return nodeDef ? nodeDef->getImplementation(target) : InterfaceElementPtr();
121 }
122
126
129 Edge getUpstreamEdge(size_t index = 0) const override;
130
132 size_t getUpstreamEdgeCount() const override
133 {
134 return getInputCount();
135 }
136
143
146 vector<PortElementPtr> getDownstreamPorts() const;
147
151
154 ConstInterfaceElementPtr getDeclaration(const string& target = EMPTY_STRING) const override
155 {
156 return getNodeDef(target);
157 }
158
161 InputPtr addInputFromNodeDef(const string& inputName);
162
165
169
172 bool validate(string* message = nullptr) const override;
173
175
176 public:
177 static const string CATEGORY;
178};
179
182class MX_CORE_API GraphElement : public InterfaceElement
183{
184 protected:
185 GraphElement(ElementPtr parent, const string& category, const string& name) :
186 InterfaceElement(parent, category, name)
187 {
188 }
189
190 public:
191 virtual ~GraphElement() { }
192
195
203 NodePtr addNode(const string& category,
204 const string& name = EMPTY_STRING,
205 const string& type = DEFAULT_TYPE_STRING)
206 {
207 NodePtr node = addChild<Node>(name);
208 node->setCategory(category);
209 node->setType(type);
210 return node;
211 }
212
214 NodePtr addNodeInstance(ConstNodeDefPtr nodeDef, const string& name = EMPTY_STRING)
215 {
216 NodePtr node = addNode(nodeDef->getNodeString(), name, nodeDef->getType());
217 node->setNodeDefString(nodeDef->getName());
218 return node;
219 }
220
222 NodePtr getNode(const string& name) const
223 {
224 return getChildOfType<Node>(name);
225 }
226
229 vector<NodePtr> getNodes(const string& category = EMPTY_STRING) const
230 {
231 return getChildrenOfType<Node>(category);
232 }
233
235 vector<NodePtr> getNodesOfType(const string& nodeType) const
236 {
237 vector<NodePtr> nodes;
238 for (auto node : getNodes())
239 {
240 if (node->getType() == nodeType)
241 {
242 nodes.push_back(node);
243 }
244 }
245 return nodes;
246 }
247
249 void removeNode(const string& name)
250 {
251 removeChildOfType<Node>(name);
252 }
253
257
260 NodePtr addMaterialNode(const string& name = EMPTY_STRING, ConstNodePtr shaderNode = nullptr);
261
263 vector<NodePtr> getMaterialNodes() const
264 {
265 return getNodesOfType(MATERIAL_TYPE_STRING);
266 }
267
271
273 BackdropPtr addBackdrop(const string& name = EMPTY_STRING)
274 {
275 return addChild<Backdrop>(name);
276 }
277
279 BackdropPtr getBackdrop(const string& name) const
280 {
281 return getChildOfType<Backdrop>(name);
282 }
283
285 vector<BackdropPtr> getBackdrops() const
286 {
287 return getChildrenOfType<Backdrop>();
288 }
289
291 void removeBackdrop(const string& name)
292 {
293 removeChildOfType<Backdrop>(name);
294 }
295
299
307 void flattenSubgraphs(const string& target = EMPTY_STRING, NodePredicate filter = nullptr);
308
311 vector<ElementPtr> topologicalSort() const;
312
315 NodePtr addGeomNode(ConstGeomPropDefPtr geomPropDef, const string& namePrefix);
316
323 string asStringDot() const;
324
326};
327
330class MX_CORE_API NodeGraph : public GraphElement
331{
332 public:
333 NodeGraph(ElementPtr parent, const string& name) :
334 GraphElement(parent, CATEGORY, name)
335 {
336 }
337 virtual ~NodeGraph() { }
338
341
343 vector<OutputPtr> getMaterialOutputs() const;
344
348
350 void setNodeDef(ConstNodeDefPtr nodeDef);
351
353 NodeDefPtr getNodeDef() const;
354
359
363
366 vector<PortElementPtr> getDownstreamPorts() const;
367
371
374 ConstInterfaceElementPtr getDeclaration(const string& target = EMPTY_STRING) const override;
375
380 InputPtr addInterfaceName(const string& inputPath, const string& interfaceName);
381
384 void removeInterfaceName(const string& inputPath);
385
389 void modifyInterfaceName(const string& inputPath, const string& interfaceName);
390
394
397 bool validate(string* message = nullptr) const override;
398
400
401 public:
402 static const string CATEGORY;
403};
404
407class MX_CORE_API Backdrop : public Element
408{
409 public:
410 Backdrop(ElementPtr parent, const string& name) :
411 Element(parent, CATEGORY, name)
412 {
413 }
414 virtual ~Backdrop() { }
415
418
420 void setContainsString(const string& contains)
421 {
422 setAttribute(CONTAINS_ATTRIBUTE, contains);
423 }
424
426 bool hasContainsString() const
427 {
428 return hasAttribute(CONTAINS_ATTRIBUTE);
429 }
430
432 string getContainsString() const
433 {
434 return getAttribute(CONTAINS_ATTRIBUTE);
435 }
436
440
442 void setWidth(float width)
443 {
444 setTypedAttribute<float>(WIDTH_ATTRIBUTE, width);
445 }
446
448 bool hasWidth() const
449 {
450 return hasAttribute(WIDTH_ATTRIBUTE);
451 }
452
454 float getWidth() const
455 {
456 return getTypedAttribute<float>(WIDTH_ATTRIBUTE);
457 }
458
462
464 void setHeight(float height)
465 {
466 setTypedAttribute<float>(HEIGHT_ATTRIBUTE, height);
467 }
468
470 bool hasHeight() const
471 {
472 return hasAttribute(HEIGHT_ATTRIBUTE);
473 }
474
476 float getHeight() const
477 {
478 return getTypedAttribute<float>(HEIGHT_ATTRIBUTE);
479 }
480
484
486 void setContainsElements(const vector<ConstTypedElementPtr>& nodes);
487
489 vector<TypedElementPtr> getContainsElements() const;
490
494
497 bool validate(string* message = nullptr) const override;
498
500
501 public:
502 static const string CATEGORY;
503 static const string CONTAINS_ATTRIBUTE;
504 static const string WIDTH_ATTRIBUTE;
505 static const string HEIGHT_ATTRIBUTE;
506};
507
508MATERIALX_NAMESPACE_END
509
510#endif
Definition element subclasses.
shared_ptr< Element > ElementPtr
A shared pointer to an Element.
Definition: Element.h:31
shared_ptr< const GeomPropDef > ConstGeomPropDefPtr
A shared pointer to a const GeomPropDef.
Definition: Geom.h:50
shared_ptr< InterfaceElement > InterfaceElementPtr
A shared pointer to an InterfaceElement.
Definition: Interface.h:41
shared_ptr< const InterfaceElement > ConstInterfaceElementPtr
A shared pointer to a const InterfaceElement.
Definition: Interface.h:43
shared_ptr< Input > InputPtr
A shared pointer to an Input.
Definition: Interface.h:31
shared_ptr< Output > OutputPtr
A shared pointer to an Output.
Definition: Interface.h:36
Import and export declarations for the Core library.
shared_ptr< const NodeGraph > ConstNodeGraphPtr
A shared pointer to a const NodeGraph.
Definition: Node.h:36
shared_ptr< NodeGraph > NodeGraphPtr
A shared pointer to a NodeGraph.
Definition: Node.h:34
shared_ptr< Backdrop > BackdropPtr
A shared pointer to a Backdrop.
Definition: Node.h:39
shared_ptr< GraphElement > GraphElementPtr
A shared pointer to a GraphElement.
Definition: Node.h:29
shared_ptr< const Backdrop > ConstBackdropPtr
A shared pointer to a const Backdrop.
Definition: Node.h:41
shared_ptr< const Node > ConstNodePtr
A shared pointer to a const Node.
Definition: Node.h:26
shared_ptr< Node > NodePtr
A shared pointer to a Node.
Definition: Node.h:24
shared_ptr< const GraphElement > ConstGraphElementPtr
A shared pointer to a const GraphElement.
Definition: Node.h:31
A layout element used to contain, group and document nodes within a graph.
Definition: Node.h:408
void setContainsString(const string &contains)
Set the contains string for this backdrop.
Definition: Node.h:420
void setHeight(float height)
Set the height attribute of the backdrop.
Definition: Node.h:464
void setWidth(float width)
Set the width attribute of the backdrop.
Definition: Node.h:442
bool validate(string *message=nullptr) const override
Validate that the given element tree, including all descendants, is consistent with the MaterialX spe...
bool hasHeight() const
Return true if this backdrop has a height attribute.
Definition: Node.h:470
float getWidth() const
Return the width attribute of the backdrop.
Definition: Node.h:454
string getContainsString() const
Return the contains string for this backdrop.
Definition: Node.h:432
vector< TypedElementPtr > getContainsElements() const
Return the vector of elements that this backdrop contains.
float getHeight() const
Return the height attribute of the backdrop.
Definition: Node.h:476
void setContainsElements(const vector< ConstTypedElementPtr > &nodes)
Set the vector of elements that this backdrop contains.
bool hasContainsString() const
Return true if this backdrop has a contains string.
Definition: Node.h:426
bool hasWidth() const
Return true if this backdrop has a width attribute.
Definition: Node.h:448
An edge between two connected Elements, returned during graph traversal.
Definition: Traversal.h:30
The base class for MaterialX elements.
Definition: Element.h:80
const string & getAttribute(const string &attrib) const
Return the value string of the given attribute.
Definition: Element.h:504
void setAttribute(const string &attrib, const string &value)
Set the value string of the given attribute.
bool hasAttribute(const string &attrib) const
Return true if the given attribute is present.
Definition: Element.h:497
The base class for graph elements such as NodeGraph and Document.
Definition: Node.h:183
vector< NodePtr > getNodes(const string &category=EMPTY_STRING) const
Return a vector of all Nodes in the graph, optionally filtered by the given category string.
Definition: Node.h:229
vector< BackdropPtr > getBackdrops() const
Return a vector of all Backdrop elements in the graph.
Definition: Node.h:285
BackdropPtr addBackdrop(const string &name=EMPTY_STRING)
Add a Backdrop to the graph.
Definition: Node.h:273
void flattenSubgraphs(const string &target=EMPTY_STRING, NodePredicate filter=nullptr)
Flatten all subgraphs at the root scope of this graph element, recursively replacing each graph-defin...
NodePtr addNodeInstance(ConstNodeDefPtr nodeDef, const string &name=EMPTY_STRING)
Add a Node that is an instance of the given NodeDef.
Definition: Node.h:214
string asStringDot() const
Convert this graph to a string in the DOT language syntax.
NodePtr addMaterialNode(const string &name=EMPTY_STRING, ConstNodePtr shaderNode=nullptr)
Add a material node to the graph, optionally connecting it to the given shader node.
vector< NodePtr > getMaterialNodes() const
Return a vector of all material nodes.
Definition: Node.h:263
vector< ElementPtr > topologicalSort() const
Return a vector of all children (nodes and outputs) sorted in topological order.
NodePtr addGeomNode(ConstGeomPropDefPtr geomPropDef, const string &namePrefix)
If not yet present, add a geometry node to this graph matching the given property definition and name...
NodePtr addNode(const string &category, const string &name=EMPTY_STRING, const string &type=DEFAULT_TYPE_STRING)
Add a Node to the graph.
Definition: Node.h:203
NodePtr getNode(const string &name) const
Return the Node, if any, with the given name.
Definition: Node.h:222
BackdropPtr getBackdrop(const string &name) const
Return the Backdrop, if any, with the given name.
Definition: Node.h:279
void removeNode(const string &name)
Remove the Node, if any, with the given name.
Definition: Node.h:249
void removeBackdrop(const string &name)
Remove the Backdrop, if any, with the given name.
Definition: Node.h:291
vector< NodePtr > getNodesOfType(const string &nodeType) const
Return a vector of nodes in the graph which have a given type.
Definition: Node.h:235
The base class for interface elements such as Node, NodeDef, and NodeGraph.
Definition: Interface.h:286
size_t getInputCount() const
Return the number of Input elements.
Definition: Interface.h:355
A node graph element within a Document.
Definition: Node.h:331
vector< PortElementPtr > getDownstreamPorts() const
Return a vector of all downstream ports that connect to this graph, ordered by the names of the port ...
void removeInterfaceName(const string &inputPath)
Remove an interface name from an existing NodeDef associated with this NodeGraph.
InputPtr addInterfaceName(const string &inputPath, const string &interfaceName)
Add an interface name to an existing NodeDef associated with this NodeGraph.
bool validate(string *message=nullptr) const override
Validate that the given element tree, including all descendants, is consistent with the MaterialX spe...
vector< OutputPtr > getMaterialOutputs() const
Return all material-type outputs of the nodegraph.
void modifyInterfaceName(const string &inputPath, const string &interfaceName)
Modify the interface name on an existing NodeDef associated with this NodeGraph.
InterfaceElementPtr getImplementation() const
Return the first implementation for this node graph.
NodeDefPtr getNodeDef() const
Return the NodeDef element referenced by this NodeGraph.
void setNodeDef(ConstNodeDefPtr nodeDef)
Set the NodeDef element referenced by this NodeGraph.
ConstInterfaceElementPtr getDeclaration(const string &target=EMPTY_STRING) const override
Return the first declaration of this interface, optionally filtered by the given target name.
A node element within a NodeGraph or Document.
Definition: Node.h:53
vector< PortElementPtr > getDownstreamPorts() const
Return a vector of all downstream ports that connect to this node, ordered by the names of the port e...
Edge getUpstreamEdge(size_t index=0) const override
Return the Edge with the given index that lies directly upstream from this element in the dataflow gr...
void setConnectedNodeName(const string &inputName, const string &nodeName)
Set the name of the Node connected to the given input, creating a child element for the input if need...
OutputPtr getNodeDefOutput(ElementPtr connectingElement)
Given a connecting element (Input or Output) return the NodeDef output corresponding to the output th...
bool validate(string *message=nullptr) const override
Validate that the given element tree, including all descendants, is consistent with the MaterialX spe...
InterfaceElementPtr getImplementation(const string &target=EMPTY_STRING) const
Return the first implementation for this node, optionally filtered by the given target and language n...
Definition: Node.h:117
size_t getUpstreamEdgeCount() const override
Return the number of queriable upstream edges for this element.
Definition: Node.h:132
NodePtr getConnectedNode(const string &inputName) const
Return the Node connected to the given input.
OutputPtr getConnectedOutput(const string &inputName) const
Return the output connected to the given input.
void addInputsFromNodeDef()
Add inputs based on the corresponding associated node definition.
NodeDefPtr getNodeDef(const string &target=EMPTY_STRING, bool allowRoughMatch=false) const
Return the first NodeDef that declares this node, optionally filtered by the given target name.
string getConnectedNodeName(const string &inputName) const
Return the name of the Node connected to the given input.
void setConnectedNode(const string &inputName, ConstNodePtr node)
Set the node to which the given input is connected, creating a child input if needed.
void setConnectedOutput(const string &inputName, OutputPtr output)
Set the output to which the given input is connected, creating a child input if needed.
InputPtr addInputFromNodeDef(const string &inputName)
Add an input based on the corresponding input for the associated node definition.
ConstInterfaceElementPtr getDeclaration(const string &target=EMPTY_STRING) const override
Return the first declaration of this interface, optionally filtered by the given target name.
Definition: Node.h:154