MaterialX 1.39.1
Loading...
Searching...
No Matches
Interface.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_INTERFACE_H
7#define MATERIALX_INTERFACE_H
8
11
13
14#include <MaterialXCore/Geom.h>
15
16MATERIALX_NAMESPACE_BEGIN
17
18class PortElement;
19class Input;
20class Output;
22class Node;
23class NodeDef;
24
26using PortElementPtr = shared_ptr<PortElement>;
28using ConstPortElementPtr = shared_ptr<const PortElement>;
29
31using InputPtr = shared_ptr<Input>;
33using ConstInputPtr = shared_ptr<const Input>;
34
36using OutputPtr = shared_ptr<Output>;
38using ConstOutputPtr = shared_ptr<const Output>;
39
41using InterfaceElementPtr = shared_ptr<InterfaceElement>;
43using ConstInterfaceElementPtr = shared_ptr<const InterfaceElement>;
44
45using CharSet = std::set<char>;
46
51class MX_CORE_API PortElement : public ValueElement
52{
53 protected:
54 PortElement(ElementPtr parent, const string& category, const string& name) :
55 ValueElement(parent, category, name)
56 {
57 }
58
59 public:
60 virtual ~PortElement() { }
61
62 protected:
63 using NodePtr = shared_ptr<Node>;
64 using ConstNodePtr = shared_ptr<const Node>;
65
66 public:
69
72 void setNodeName(const string& node)
73 {
74 setAttribute(NODE_NAME_ATTRIBUTE, node);
75 }
76
78 bool hasNodeName() const
79 {
80 return hasAttribute(NODE_NAME_ATTRIBUTE);
81 }
82
84 const string& getNodeName() const
85 {
86 return getAttribute(NODE_NAME_ATTRIBUTE);
87 }
88
92
94 void setNodeGraphString(const string& node)
95 {
96 setAttribute(NODE_GRAPH_ATTRIBUTE, node);
97 }
98
101 {
102 return hasAttribute(NODE_GRAPH_ATTRIBUTE);
103 }
104
106 const string& getNodeGraphString() const
107 {
108 return getAttribute(NODE_GRAPH_ATTRIBUTE);
109 }
110
114
116 void setOutputString(const string& output)
117 {
118 setAttribute(OUTPUT_ATTRIBUTE, output);
119 }
120
122 bool hasOutputString() const
123 {
124 return hasAttribute(OUTPUT_ATTRIBUTE);
125 }
126
130
133
135 const string& getOutputString() const
136 {
137 return getAttribute(OUTPUT_ATTRIBUTE);
138 }
139
143
147 void setConnectedNode(ConstNodePtr node);
148
150 virtual NodePtr getConnectedNode() const;
151
155
158 bool validate(string* message = nullptr) const override;
159
161
162 public:
163 static const string NODE_NAME_ATTRIBUTE;
164 static const string NODE_GRAPH_ATTRIBUTE;
165 static const string OUTPUT_ATTRIBUTE;
166};
167
173class MX_CORE_API Input : public PortElement
174{
175 public:
176 Input(ElementPtr parent, const string& name) :
177 PortElement(parent, CATEGORY, name)
178 {
179 }
180 virtual ~Input() { }
181
182 public:
185
187 void setDefaultGeomPropString(const string& geomprop)
188 {
189 setAttribute(DEFAULT_GEOM_PROP_ATTRIBUTE, geomprop);
190 }
191
194 {
195 return hasAttribute(DEFAULT_GEOM_PROP_ATTRIBUTE);
196 }
197
199 const string& getDefaultGeomPropString() const
200 {
201 return getAttribute(DEFAULT_GEOM_PROP_ATTRIBUTE);
202 }
203
206
210
212 NodePtr getConnectedNode() const override;
213
216 void setConnectedInterfaceName(const string& interfaceName);
217
221
225
227 bool hasHint() const
228 {
229 return hasAttribute(HINT_ATTRIBUTE);
230 }
231
233 const string& getHint() const
234 {
235 return getAttribute(HINT_ATTRIBUTE);
236 }
237
238 // Set the code generation hint
239 void setHint(const string& hint)
240 {
241 setAttribute(HINT_ATTRIBUTE, hint);
242 }
243
247
250 bool validate(string* message = nullptr) const override;
251
253
254 public:
255 static const string CATEGORY;
256 static const string DEFAULT_GEOM_PROP_ATTRIBUTE;
257 static const string HINT_ATTRIBUTE;
258 static const string TRANSPARENCY_HINT;
259 static const string OPACITY_HINT;
260 static const string ANISOTROPY_HINT;
261};
262
265class MX_CORE_API Output : public PortElement
266{
267 public:
268 Output(ElementPtr parent, const string& name) :
269 PortElement(parent, CATEGORY, name)
270 {
271 }
272 virtual ~Output() { }
273
274 public:
277
280 Edge getUpstreamEdge(size_t index = 0) const override;
281
283 size_t getUpstreamEdgeCount() const override
284 {
285 return 1;
286 }
287
289 bool hasUpstreamCycle() const;
290
294
297 bool validate(string* message = nullptr) const override;
298
300
301 public:
302 static const string CATEGORY;
303 static const string DEFAULT_INPUT_ATTRIBUTE;
304};
305
311class MX_CORE_API InterfaceElement : public TypedElement
312{
313 protected:
314 InterfaceElement(ElementPtr parent, const string& category, const string& name) :
315 TypedElement(parent, category, name),
316 _inputCount(0),
317 _outputCount(0)
318 {
319 }
320
321 public:
322 virtual ~InterfaceElement() { }
323
324 protected:
325 using NodeDefPtr = shared_ptr<NodeDef>;
326 using ConstNodeDefPtr = shared_ptr<const NodeDef>;
327
328 public:
331
333 void setNodeDefString(const string& nodeDef)
334 {
335 setAttribute(NODE_DEF_ATTRIBUTE, nodeDef);
336 }
337
339 bool hasNodeDefString() const
340 {
341 return hasAttribute(NODE_DEF_ATTRIBUTE);
342 }
343
345 const string& getNodeDefString() const
346 {
347 return getAttribute(NODE_DEF_ATTRIBUTE);
348 }
349
353
360 InputPtr addInput(const string& name = EMPTY_STRING,
361 const string& type = DEFAULT_TYPE_STRING)
362 {
363 InputPtr child = addChild<Input>(name);
364 child->setType(type);
365 return child;
366 }
367
369 InputPtr getInput(const string& name) const
370 {
371 return getChildOfType<Input>(name);
372 }
373
375 vector<InputPtr> getInputs() const
376 {
377 return getChildrenOfType<Input>();
378 }
379
381 size_t getInputCount() const
382 {
383 return _inputCount;
384 }
385
387 void removeInput(const string& name)
388 {
389 removeChildOfType<Input>(name);
390 }
391
394 InputPtr getActiveInput(const string& name) const;
395
398 vector<InputPtr> getActiveInputs() const;
399
403
410 OutputPtr addOutput(const string& name = EMPTY_STRING,
411 const string& type = DEFAULT_TYPE_STRING)
412 {
413 OutputPtr output = addChild<Output>(name);
414 output->setType(type);
415 return output;
416 }
417
419 OutputPtr getOutput(const string& name) const
420 {
421 return getChildOfType<Output>(name);
422 }
423
425 vector<OutputPtr> getOutputs() const
426 {
427 return getChildrenOfType<Output>();
428 }
429
431 size_t getOutputCount() const
432 {
433 return _outputCount;
434 }
435
437 void removeOutput(const string& name)
438 {
439 removeChildOfType<Output>(name);
440 }
441
444 OutputPtr getActiveOutput(const string& name) const;
445
448 vector<OutputPtr> getActiveOutputs() const;
449
453 void setConnectedOutput(const string& inputName, OutputPtr output);
454
457 OutputPtr getConnectedOutput(const string& inputName) const;
458
462
468 TokenPtr addToken(const string& name = EMPTY_STRING)
469 {
470 return addChild<Token>(name);
471 }
472
474 TokenPtr getToken(const string& name) const
475 {
476 return getChildOfType<Token>(name);
477 }
478
480 vector<TokenPtr> getTokens() const
481 {
482 return getChildrenOfType<Token>();
483 }
484
486 void removeToken(const string& name)
487 {
488 removeChildOfType<Token>(name);
489 }
490
493 TokenPtr getActiveToken(const string& name) const;
494
497 vector<TokenPtr> getActiveTokens() const;
498
502
504 ValueElementPtr getValueElement(const string& name) const
505 {
506 return getChildOfType<ValueElement>(name);
507 }
508
512 ValueElementPtr getActiveValueElement(const string& name) const;
513
517 vector<ValueElementPtr> getActiveValueElements() const;
518
522
525 template <class T> InputPtr setInputValue(const string& name,
526 const T& value,
527 const string& type = EMPTY_STRING);
528
537 ValuePtr getInputValue(const string& name, const string& target = EMPTY_STRING) const;
538
541 TokenPtr setTokenValue(const string& name, const string& value)
542 {
543 TokenPtr token = getToken(name);
544 if (!token)
545 token = addToken(name);
546 token->setValue<string>(value);
547 return token;
548 }
549
552 string getTokenValue(const string& name)
553 {
554 TokenPtr token = getToken(name);
555 return token ? token->getValueString() : EMPTY_STRING;
556 }
557
561
563 void setTarget(const string& target)
564 {
565 setAttribute(TARGET_ATTRIBUTE, target);
566 }
567
569 bool hasTarget() const
570 {
571 return hasAttribute(TARGET_ATTRIBUTE);
572 }
573
575 const string& getTarget() const
576 {
577 return getAttribute(TARGET_ATTRIBUTE);
578 }
579
583
585 void setVersionString(const string& version)
586 {
587 setAttribute(VERSION_ATTRIBUTE, version);
588 }
589
591 bool hasVersionString() const
592 {
593 return hasAttribute(VERSION_ATTRIBUTE);
594 }
595
597 const string& getVersionString() const
598 {
599 return getAttribute(VERSION_ATTRIBUTE);
600 }
601
603 void setVersionIntegers(int majorVersion, int minorVersion);
604
606 virtual std::pair<int, int> getVersionIntegers() const;
607
611
613 void setDefaultVersion(bool defaultVersion)
614 {
615 setTypedAttribute<bool>(DEFAULT_VERSION_ATTRIBUTE, defaultVersion);
616 }
617
619 bool getDefaultVersion() const
620 {
621 return getTypedAttribute<bool>(DEFAULT_VERSION_ATTRIBUTE);
622 }
623
627
634 virtual ConstInterfaceElementPtr getDeclaration(const string& target = EMPTY_STRING) const;
635
637 void clearContent() override;
638
645 bool hasExactInputMatch(ConstInterfaceElementPtr declaration, string* message = nullptr) const;
646
648
649 public:
650 static const string NODE_DEF_ATTRIBUTE;
651 static const string TARGET_ATTRIBUTE;
652 static const string VERSION_ATTRIBUTE;
653 static const string DEFAULT_VERSION_ATTRIBUTE;
654
655 protected:
656 void registerChildElement(ElementPtr child) override;
657 void unregisterChildElement(ElementPtr child) override;
658
659 private:
660 size_t _inputCount;
661 size_t _outputCount;
662};
663
664template <class T> InputPtr InterfaceElement::setInputValue(const string& name,
665 const T& value,
666 const string& type)
667{
668 InputPtr input = getChildOfType<Input>(name);
669 if (!input)
670 input = addInput(name);
671 input->setValue(value, type);
672 return input;
673}
674
675MATERIALX_NAMESPACE_END
676
677#endif
shared_ptr< Token > TokenPtr
A shared pointer to a Token.
Definition: Element.h:46
shared_ptr< Element > ElementPtr
A shared pointer to an Element.
Definition: Element.h:31
shared_ptr< ValueElement > ValueElementPtr
A shared pointer to a ValueElement.
Definition: Element.h:41
Geometric element subclasses.
shared_ptr< GeomPropDef > GeomPropDefPtr
A shared pointer to a GeomPropDef.
Definition: Geom.h:48
shared_ptr< const PortElement > ConstPortElementPtr
A shared pointer to a const PortElement.
Definition: Interface.h:28
shared_ptr< const Output > ConstOutputPtr
A shared pointer to a const Output.
Definition: Interface.h:38
shared_ptr< InterfaceElement > InterfaceElementPtr
A shared pointer to an InterfaceElement.
Definition: Interface.h:41
shared_ptr< PortElement > PortElementPtr
A shared pointer to a PortElement.
Definition: Interface.h:26
shared_ptr< const InterfaceElement > ConstInterfaceElementPtr
A shared pointer to a const InterfaceElement.
Definition: Interface.h:43
shared_ptr< const Input > ConstInputPtr
A shared pointer to a const Input.
Definition: Interface.h:33
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< Value > ValuePtr
A shared pointer to a Value.
Definition: Value.h:29
An edge between two connected Elements, returned during graph traversal.
Definition: Traversal.h:30
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
An input element within a Node or NodeDef.
Definition: Interface.h:174
GeomPropDefPtr getDefaultGeomProp() const
Return the GeomPropDef element to use, if defined for this input.
const string & getDefaultGeomPropString() const
Return the defaultgeomprop string for the input.
Definition: Interface.h:199
bool validate(string *message=nullptr) const override
Validate that the given element tree, including all descendants, is consistent with the MaterialX spe...
void setDefaultGeomPropString(const string &geomprop)
Set the defaultgeomprop string for the input.
Definition: Interface.h:187
InputPtr getInterfaceInput() const
Return the input on the parent graph corresponding to the interface name for this input.
bool hasDefaultGeomPropString() const
Return true if the given input has a defaultgeomprop string.
Definition: Interface.h:193
NodePtr getConnectedNode() const override
Return the node, if any, to which this input is connected.
bool hasHint() const
Return true if the input has a hint.
Definition: Interface.h:227
void setConnectedInterfaceName(const string &interfaceName)
Connects this input to a corresponding interface with the given name.
const string & getHint() const
Return the code generation hint.
Definition: Interface.h:233
The base class for interface elements such as Node, NodeDef, and NodeGraph.
Definition: Interface.h:312
OutputPtr addOutput(const string &name=EMPTY_STRING, const string &type=DEFAULT_TYPE_STRING)
Add an Output to this interface.
Definition: Interface.h:410
ValuePtr getInputValue(const string &name, const string &target=EMPTY_STRING) const
Return the typed value of an input by its name, taking both the calling element and its declaration i...
OutputPtr getOutput(const string &name) const
Return the Output, if any, with the given name.
Definition: Interface.h:419
bool hasNodeDefString() const
Return true if the given interface has a NodeDef string.
Definition: Interface.h:339
TokenPtr getToken(const string &name) const
Return the Token, if any, with the given name.
Definition: Interface.h:474
vector< InputPtr > getInputs() const
Return a vector of all Input elements.
Definition: Interface.h:375
InputPtr addInput(const string &name=EMPTY_STRING, const string &type=DEFAULT_TYPE_STRING)
Add an Input to this interface.
Definition: Interface.h:360
size_t getInputCount() const
Return the number of Input elements.
Definition: Interface.h:381
void removeInput(const string &name)
Remove the Input, if any, with the given name.
Definition: Interface.h:387
void setVersionString(const string &version)
Set the version string of this interface.
Definition: Interface.h:585
virtual std::pair< int, int > getVersionIntegers() const
Return the major and minor versions as an integer pair.
vector< TokenPtr > getTokens() const
Return a vector of all Token elements.
Definition: Interface.h:480
vector< ValueElementPtr > getActiveValueElements() const
Return a vector of all value elements that belong to this interface, taking inheritance into account.
InputPtr getInput(const string &name) const
Return the Input, if any, with the given name.
Definition: Interface.h:369
const string & getVersionString() const
Return the version string of this interface.
Definition: Interface.h:597
vector< OutputPtr > getActiveOutputs() const
Return a vector of all Output elements that belong to this interface, taking inheritance into account...
void setVersionIntegers(int majorVersion, int minorVersion)
Set the major and minor versions as an integer pair.
ValueElementPtr getValueElement(const string &name) const
Return the ValueElement, if any, with the given name.
Definition: Interface.h:504
void clearContent() override
Clear all attributes and descendants from this element.
TokenPtr getActiveToken(const string &name) const
Return the first Token with the given name that belongs to this interface, taking interface inheritan...
OutputPtr getConnectedOutput(const string &inputName) const
Return the output connected to the given input.
TokenPtr setTokenValue(const string &name, const string &value)
Set the string value of a Token by its name, creating a child element to hold the Token if needed.
Definition: Interface.h:541
OutputPtr getActiveOutput(const string &name) const
Return the first Output with the given name that belongs to this interface, taking interface inherita...
InputPtr setInputValue(const string &name, const T &value, const string &type=EMPTY_STRING)
Set the typed value of an input by its name, creating a child element to hold the input if needed.
Definition: Interface.h:664
TokenPtr addToken(const string &name=EMPTY_STRING)
Add a Token to this interface.
Definition: Interface.h:468
void setNodeDefString(const string &nodeDef)
Set the NodeDef string for the interface.
Definition: Interface.h:333
ValueElementPtr getActiveValueElement(const string &name) const
Return the first value element with the given name that belongs to this interface,...
vector< InputPtr > getActiveInputs() const
Return a vector of all Input elements that belong to this interface, taking inheritance into account.
bool hasExactInputMatch(ConstInterfaceElementPtr declaration, string *message=nullptr) const
Return true if this instance has an exact input match with the given declaration, where each input of...
vector< OutputPtr > getOutputs() const
Return a vector of all Output elements.
Definition: Interface.h:425
string getTokenValue(const string &name)
Return the string value of a Token by its name, or an empty string if the given Token is not present.
Definition: Interface.h:552
virtual ConstInterfaceElementPtr getDeclaration(const string &target=EMPTY_STRING) const
Return the first declaration of this interface, optionally filtered by the given target name.
void setConnectedOutput(const string &inputName, OutputPtr output)
Set the output to which the given input is connected, creating a child input if needed.
bool hasVersionString() const
Return true if this interface has a version string.
Definition: Interface.h:591
bool getDefaultVersion() const
Return the default version flag of this element.
Definition: Interface.h:619
const string & getNodeDefString() const
Return the NodeDef string for the interface.
Definition: Interface.h:345
void removeToken(const string &name)
Remove the Token, if any, with the given name.
Definition: Interface.h:486
void removeOutput(const string &name)
Remove the Output, if any, with the given name.
Definition: Interface.h:437
void setTarget(const string &target)
Set the target string of this interface.
Definition: Interface.h:563
InputPtr getActiveInput(const string &name) const
Return the first Input with the given name that belongs to this interface, taking interface inheritan...
void setDefaultVersion(bool defaultVersion)
Set the default version flag of this element.
Definition: Interface.h:613
bool hasTarget() const
Return true if the given interface has a target string.
Definition: Interface.h:569
size_t getOutputCount() const
Return the number of Output elements.
Definition: Interface.h:431
const string & getTarget() const
Return the target string of this interface.
Definition: Interface.h:575
vector< TokenPtr > getActiveTokens() const
Return a vector of all Token elements that belong to this interface, taking inheritance into account.
A node definition element within a Document.
Definition: Definition.h:82
A node element within a NodeGraph or Document.
Definition: Node.h:53
A spatially-varying output element within a NodeGraph or NodeDef.
Definition: Interface.h:266
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...
bool validate(string *message=nullptr) const override
Validate that the given element tree, including all descendants, is consistent with the MaterialX spe...
size_t getUpstreamEdgeCount() const override
Return the number of queriable upstream edges for this element.
Definition: Interface.h:283
bool hasUpstreamCycle() const
Return true if a cycle exists in any upstream path from this element.
The base class for port elements such as Input and Output.
Definition: Interface.h:52
bool hasOutputString() const
Return true if this element has an output string.
Definition: Interface.h:122
const string & getNodeGraphString() const
Return the node graph string of this element.
Definition: Interface.h:106
const string & getOutputString() const
Return the output string of this element.
Definition: Interface.h:135
virtual NodePtr getConnectedNode() const
Return the node, if any, to which this element is connected.
bool validate(string *message=nullptr) const override
Validate that the given element tree, including all descendants, is consistent with the MaterialX spe...
void setNodeGraphString(const string &node)
Set the node graph string of this element.
Definition: Interface.h:94
bool hasNodeGraphString() const
Return true if this element has a node graph string.
Definition: Interface.h:100
void setConnectedOutput(ConstOutputPtr output)
Set the output to which this input is connected.
void setNodeName(const string &node)
Set the node name string of this element, creating a connection to the Node with the given name withi...
Definition: Interface.h:72
void setConnectedNode(ConstNodePtr node)
Set the node to which this element is connected.
void setOutputString(const string &output)
Set the output string of this element.
Definition: Interface.h:116
const string & getNodeName() const
Return the node name string of this element.
Definition: Interface.h:84
bool hasNodeName() const
Return true if this element has a node name string.
Definition: Interface.h:78
OutputPtr getConnectedOutput() const
Return the output, if any, to which this input is connected.
The base class for typed elements.
Definition: Element.h:854
The base class for elements that support typed values.
Definition: Element.h:918