MaterialX 1.38.9
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
129 void setConnectedOutput(ConstOutputPtr output);
130
132 virtual OutputPtr getConnectedOutput() const;
133
135 const string& getOutputString() const
136 {
137 return getAttribute(OUTPUT_ATTRIBUTE);
138 }
139
143
146 void setChannels(const string& channels)
147 {
148 setAttribute(CHANNELS_ATTRIBUTE, channels);
149 }
150
152 bool hasChannels() const
153 {
154 return hasAttribute(CHANNELS_ATTRIBUTE);
155 }
156
158 const string& getChannels() const
159 {
160 return getAttribute(CHANNELS_ATTRIBUTE);
161 }
162
165 static bool validChannelsCharacters(const string& channels, const string& sourceType);
166
169 static bool validChannelsString(const string& channels, const string& sourceType, const string& destinationType);
170
174
178 void setConnectedNode(ConstNodePtr node);
179
181 virtual NodePtr getConnectedNode() const;
182
186
189 bool validate(string* message = nullptr) const override;
190
192
193 public:
194 static const string NODE_NAME_ATTRIBUTE;
195 static const string NODE_GRAPH_ATTRIBUTE;
196 static const string OUTPUT_ATTRIBUTE;
197 static const string CHANNELS_ATTRIBUTE;
198
199 private:
200 static const std::unordered_map<string, CharSet> CHANNELS_CHARACTER_SET;
201 static const std::unordered_map<string, size_t> CHANNELS_PATTERN_LENGTH;
202};
203
209class MX_CORE_API Input : public PortElement
210{
211 public:
212 Input(ElementPtr parent, const string& name) :
213 PortElement(parent, CATEGORY, name)
214 {
215 }
216 virtual ~Input() { }
217
218 public:
221
223 void setDefaultGeomPropString(const string& geomprop)
224 {
225 setAttribute(DEFAULT_GEOM_PROP_ATTRIBUTE, geomprop);
226 }
227
230 {
231 return hasAttribute(DEFAULT_GEOM_PROP_ATTRIBUTE);
232 }
233
235 const string& getDefaultGeomPropString() const
236 {
237 return getAttribute(DEFAULT_GEOM_PROP_ATTRIBUTE);
238 }
239
241 GeomPropDefPtr getDefaultGeomProp() const;
242
246
248 NodePtr getConnectedNode() const override;
249
252 InputPtr getInterfaceInput() const;
253
257
260 bool validate(string* message = nullptr) const override;
261
263
264 public:
265 static const string CATEGORY;
266 static const string DEFAULT_GEOM_PROP_ATTRIBUTE;
267};
268
271class MX_CORE_API Output : public PortElement
272{
273 public:
274 Output(ElementPtr parent, const string& name) :
275 PortElement(parent, CATEGORY, name)
276 {
277 }
278 virtual ~Output() { }
279
280 public:
283
286 Edge getUpstreamEdge(size_t index = 0) const override;
287
289 size_t getUpstreamEdgeCount() const override
290 {
291 return 1;
292 }
293
295 bool hasUpstreamCycle() const;
296
300
303 bool validate(string* message = nullptr) const override;
304
306
307 public:
308 static const string CATEGORY;
309 static const string DEFAULT_INPUT_ATTRIBUTE;
310};
311
317class MX_CORE_API InterfaceElement : public TypedElement
318{
319 protected:
320 InterfaceElement(ElementPtr parent, const string& category, const string& name) :
321 TypedElement(parent, category, name),
322 _inputCount(0),
323 _outputCount(0)
324 {
325 }
326
327 public:
328 virtual ~InterfaceElement() { }
329
330 protected:
331 using NodeDefPtr = shared_ptr<NodeDef>;
332 using ConstNodeDefPtr = shared_ptr<const NodeDef>;
333
334 public:
337
339 void setNodeDefString(const string& nodeDef)
340 {
341 setAttribute(NODE_DEF_ATTRIBUTE, nodeDef);
342 }
343
345 bool hasNodeDefString() const
346 {
347 return hasAttribute(NODE_DEF_ATTRIBUTE);
348 }
349
351 const string& getNodeDefString() const
352 {
353 return getAttribute(NODE_DEF_ATTRIBUTE);
354 }
355
359
366 InputPtr addInput(const string& name = EMPTY_STRING,
367 const string& type = DEFAULT_TYPE_STRING)
368 {
369 InputPtr child = addChild<Input>(name);
370 child->setType(type);
371 return child;
372 }
373
375 InputPtr getInput(const string& name) const
376 {
377 return getChildOfType<Input>(name);
378 }
379
381 vector<InputPtr> getInputs() const
382 {
383 return getChildrenOfType<Input>();
384 }
385
387 size_t getInputCount() const
388 {
389 return _inputCount;
390 }
391
393 void removeInput(const string& name)
394 {
395 removeChildOfType<Input>(name);
396 }
397
400 InputPtr getActiveInput(const string& name) const;
401
404 vector<InputPtr> getActiveInputs() const;
405
409
416 OutputPtr addOutput(const string& name = EMPTY_STRING,
417 const string& type = DEFAULT_TYPE_STRING)
418 {
419 OutputPtr output = addChild<Output>(name);
420 output->setType(type);
421 return output;
422 }
423
425 OutputPtr getOutput(const string& name) const
426 {
427 return getChildOfType<Output>(name);
428 }
429
431 vector<OutputPtr> getOutputs() const
432 {
433 return getChildrenOfType<Output>();
434 }
435
437 size_t getOutputCount() const
438 {
439 return _outputCount;
440 }
441
443 void removeOutput(const string& name)
444 {
445 removeChildOfType<Output>(name);
446 }
447
450 OutputPtr getActiveOutput(const string& name) const;
451
454 vector<OutputPtr> getActiveOutputs() const;
455
459 void setConnectedOutput(const string& inputName, OutputPtr output);
460
463 OutputPtr getConnectedOutput(const string& inputName) const;
464
468
474 TokenPtr addToken(const string& name = EMPTY_STRING)
475 {
476 return addChild<Token>(name);
477 }
478
480 TokenPtr getToken(const string& name) const
481 {
482 return getChildOfType<Token>(name);
483 }
484
486 vector<TokenPtr> getTokens() const
487 {
488 return getChildrenOfType<Token>();
489 }
490
492 void removeToken(const string& name)
493 {
494 removeChildOfType<Token>(name);
495 }
496
499 TokenPtr getActiveToken(const string& name) const;
500
503 vector<TokenPtr> getActiveTokens() const;
504
508
510 ValueElementPtr getValueElement(const string& name) const
511 {
512 return getChildOfType<ValueElement>(name);
513 }
514
518 ValueElementPtr getActiveValueElement(const string& name) const;
519
523 vector<ValueElementPtr> getActiveValueElements() const;
524
528
531 template <class T> InputPtr setInputValue(const string& name,
532 const T& value,
533 const string& type = EMPTY_STRING);
534
543 ValuePtr getInputValue(const string& name, const string& target = EMPTY_STRING) const;
544
547 TokenPtr setTokenValue(const string& name, const string& value)
548 {
549 TokenPtr token = getToken(name);
550 if (!token)
551 token = addToken(name);
552 token->setValue<string>(value);
553 return token;
554 }
555
558 string getTokenValue(const string& name)
559 {
560 TokenPtr token = getToken(name);
561 return token ? token->getValueString() : EMPTY_STRING;
562 }
563
567
569 void setTarget(const string& target)
570 {
571 setAttribute(TARGET_ATTRIBUTE, target);
572 }
573
575 bool hasTarget() const
576 {
577 return hasAttribute(TARGET_ATTRIBUTE);
578 }
579
581 const string& getTarget() const
582 {
583 return getAttribute(TARGET_ATTRIBUTE);
584 }
585
589
591 void setVersionString(const string& version)
592 {
593 setAttribute(VERSION_ATTRIBUTE, version);
594 }
595
597 bool hasVersionString() const
598 {
599 return hasAttribute(VERSION_ATTRIBUTE);
600 }
601
603 const string& getVersionString() const
604 {
605 return getAttribute(VERSION_ATTRIBUTE);
606 }
607
609 void setVersionIntegers(int majorVersion, int minorVersion);
610
612 virtual std::pair<int, int> getVersionIntegers() const;
613
617
619 void setDefaultVersion(bool defaultVersion)
620 {
621 setTypedAttribute<bool>(DEFAULT_VERSION_ATTRIBUTE, defaultVersion);
622 }
623
625 bool getDefaultVersion() const
626 {
627 return getTypedAttribute<bool>(DEFAULT_VERSION_ATTRIBUTE);
628 }
629
633
640 virtual ConstInterfaceElementPtr getDeclaration(const string& target = EMPTY_STRING) const;
641
643 void clearContent() override;
644
651 bool hasExactInputMatch(ConstInterfaceElementPtr declaration, string* message = nullptr) const;
652
654
655 public:
656 static const string NODE_DEF_ATTRIBUTE;
657 static const string TARGET_ATTRIBUTE;
658 static const string VERSION_ATTRIBUTE;
659 static const string DEFAULT_VERSION_ATTRIBUTE;
660
661 protected:
662 void registerChildElement(ElementPtr child) override;
663 void unregisterChildElement(ElementPtr child) override;
664
665 private:
666 size_t _inputCount;
667 size_t _outputCount;
668};
669
670template <class T> InputPtr InterfaceElement::setInputValue(const string& name,
671 const T& value,
672 const string& type)
673{
674 InputPtr input = getChildOfType<Input>(name);
675 if (!input)
676 input = addInput(name);
677 input->setValue(value, type);
678 return input;
679}
680
681MATERIALX_NAMESPACE_END
682
683#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< 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< 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
virtual void clearContent()
Clear all attributes and descendants from this element.
Definition: Element.cpp:385
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.
Definition: Element.cpp:191
virtual Edge getUpstreamEdge(size_t index=0) const
Return the Edge with the given index that lies directly upstream from this element in the dataflow gr...
Definition: Element.cpp:345
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:210
const string & getDefaultGeomPropString() const
Return the defaultgeomprop string for the input.
Definition: Interface.h:235
void setDefaultGeomPropString(const string &geomprop)
Set the defaultgeomprop string for the input.
Definition: Interface.h:223
bool hasDefaultGeomPropString() const
Return true if the given input has a defaultgeomprop string.
Definition: Interface.h:229
The base class for interface elements such as Node, NodeDef, and NodeGraph.
Definition: Interface.h:318
OutputPtr addOutput(const string &name=EMPTY_STRING, const string &type=DEFAULT_TYPE_STRING)
Add an Output to this interface.
Definition: Interface.h:416
OutputPtr getOutput(const string &name) const
Return the Output, if any, with the given name.
Definition: Interface.h:425
bool hasNodeDefString() const
Return true if the given interface has a NodeDef string.
Definition: Interface.h:345
TokenPtr getToken(const string &name) const
Return the Token, if any, with the given name.
Definition: Interface.h:480
vector< InputPtr > getInputs() const
Return a vector of all Input elements.
Definition: Interface.h:381
InputPtr addInput(const string &name=EMPTY_STRING, const string &type=DEFAULT_TYPE_STRING)
Add an Input to this interface.
Definition: Interface.h:366
size_t getInputCount() const
Return the number of Input elements.
Definition: Interface.h:387
void removeInput(const string &name)
Remove the Input, if any, with the given name.
Definition: Interface.h:393
void setVersionString(const string &version)
Set the version string of this interface.
Definition: Interface.h:591
vector< TokenPtr > getTokens() const
Return a vector of all Token elements.
Definition: Interface.h:486
InputPtr getInput(const string &name) const
Return the Input, if any, with the given name.
Definition: Interface.h:375
const string & getVersionString() const
Return the version string of this interface.
Definition: Interface.h:603
ValueElementPtr getValueElement(const string &name) const
Return the ValueElement, if any, with the given name.
Definition: Interface.h:510
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:547
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:670
TokenPtr addToken(const string &name=EMPTY_STRING)
Add a Token to this interface.
Definition: Interface.h:474
void setNodeDefString(const string &nodeDef)
Set the NodeDef string for the interface.
Definition: Interface.h:339
vector< OutputPtr > getOutputs() const
Return a vector of all Output elements.
Definition: Interface.h:431
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:558
bool hasVersionString() const
Return true if this interface has a version string.
Definition: Interface.h:597
bool getDefaultVersion() const
Return the default version flag of this element.
Definition: Interface.h:625
const string & getNodeDefString() const
Return the NodeDef string for the interface.
Definition: Interface.h:351
void removeToken(const string &name)
Remove the Token, if any, with the given name.
Definition: Interface.h:492
void removeOutput(const string &name)
Remove the Output, if any, with the given name.
Definition: Interface.h:443
void setTarget(const string &target)
Set the target string of this interface.
Definition: Interface.h:569
void setDefaultVersion(bool defaultVersion)
Set the default version flag of this element.
Definition: Interface.h:619
bool hasTarget() const
Return true if the given interface has a target string.
Definition: Interface.h:575
size_t getOutputCount() const
Return the number of Output elements.
Definition: Interface.h:437
const string & getTarget() const
Return the target string of this interface.
Definition: Interface.h:581
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:272
size_t getUpstreamEdgeCount() const override
Return the number of queriable upstream edges for this element.
Definition: Interface.h:289
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
void setChannels(const string &channels)
Set the channels string of this element, defining a channel swizzle that will be applied to the upstr...
Definition: Interface.h:146
const string & getOutputString() const
Return the output string of this element.
Definition: Interface.h:135
bool hasChannels() const
Return true if this element has a channels string.
Definition: Interface.h:152
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 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 setOutputString(const string &output)
Set the output string of this element.
Definition: Interface.h:116
const string & getChannels() const
Return the channels string of this element.
Definition: Interface.h:158
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
The base class for typed elements.
Definition: Element.h:837
The base class for elements that support typed values.
Definition: Element.h:901
bool validate(string *message=nullptr) const override
Validate that the given element tree, including all descendants, is consistent with the MaterialX spe...
Definition: Element.cpp:535