MaterialX 1.39.2
Loading...
Searching...
No Matches
Definition.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_DEFINITION_H
7#define MATERIALX_DEFINITION_H
8
11
13
15
16MATERIALX_NAMESPACE_BEGIN
17
18extern MX_CORE_API const string COLOR_SEMANTIC;
19extern MX_CORE_API const string SHADER_SEMANTIC;
20
21class NodeDef;
22class Implementation;
23class TypeDef;
24class TargetDef;
25class Member;
26class Unit;
27class UnitDef;
28class UnitTypeDef;
29class AttributeDef;
30
32using NodeDefPtr = shared_ptr<NodeDef>;
34using ConstNodeDefPtr = shared_ptr<const NodeDef>;
35
37using ImplementationPtr = shared_ptr<Implementation>;
39using ConstImplementationPtr = shared_ptr<const Implementation>;
40
42using TypeDefPtr = shared_ptr<TypeDef>;
44using ConstTypeDefPtr = shared_ptr<const TypeDef>;
45
47using TargetDefPtr = shared_ptr<TargetDef>;
49using ConstTargetDefPtr = shared_ptr<const TargetDef>;
50
52using MemberPtr = shared_ptr<Member>;
54using ConstMemberPtr = shared_ptr<const Member>;
55
57using UnitPtr = shared_ptr<Unit>;
59using ConstUnitPtr = shared_ptr<const Unit>;
60
62using UnitDefPtr = shared_ptr<UnitDef>;
64using ConstUnitDefPtr = shared_ptr<const UnitDef>;
65
67using UnitTypeDefPtr = shared_ptr<UnitTypeDef>;
69using ConstUnitTypeDefPtr = shared_ptr<const UnitTypeDef>;
70
72using AttributeDefPtr = shared_ptr<AttributeDef>;
74using AttributeDefDefPtr = shared_ptr<const AttributeDef>;
75
81class MX_CORE_API NodeDef : public InterfaceElement
82{
83 public:
84 NodeDef(ElementPtr parent, const string& name) :
85 InterfaceElement(parent, CATEGORY, name)
86 {
87 }
88 virtual ~NodeDef() { }
89
92
94 void setNodeString(const string& node)
95 {
96 setAttribute(NODE_ATTRIBUTE, node);
97 }
98
100 bool hasNodeString() const
101 {
102 return hasAttribute(NODE_ATTRIBUTE);
103 }
104
106 const string& getNodeString() const
107 {
108 return getAttribute(NODE_ATTRIBUTE);
109 }
110
112 const string& getType() const override;
113
117
119 void setNodeGroup(const string& category)
120 {
121 setAttribute(NODE_GROUP_ATTRIBUTE, category);
122 }
123
125 bool hasNodeGroup() const
126 {
127 return hasAttribute(NODE_GROUP_ATTRIBUTE);
128 }
129
131 const string& getNodeGroup() const
132 {
133 return getAttribute(NODE_GROUP_ATTRIBUTE);
134 }
135
139
147 InterfaceElementPtr getImplementation(const string& target = EMPTY_STRING) const;
148
152
155
159
162 bool validate(string* message = nullptr) const override;
163
167
171 bool isVersionCompatible(const string& version) const;
172
175 ConstInterfaceElementPtr getDeclaration(const string& target = EMPTY_STRING) const override;
176
178
179 public:
180 static const string CATEGORY;
181 static const string NODE_ATTRIBUTE;
182 static const string NODE_GROUP_ATTRIBUTE;
183
184 static const string TEXTURE_NODE_GROUP;
185 static const string PROCEDURAL_NODE_GROUP;
186 static const string GEOMETRIC_NODE_GROUP;
187 static const string ADJUSTMENT_NODE_GROUP;
188 static const string CONDITIONAL_NODE_GROUP;
189 static const string CHANNEL_NODE_GROUP;
190 static const string ORGANIZATION_NODE_GROUP;
191 static const string TRANSLATION_NODE_GROUP;
192};
193
200class MX_CORE_API Implementation : public InterfaceElement
201{
202 public:
203 Implementation(ElementPtr parent, const string& name) :
204 InterfaceElement(parent, CATEGORY, name)
205 {
206 }
207 virtual ~Implementation() { }
208
211
213 void setFile(const string& file)
214 {
215 setAttribute(FILE_ATTRIBUTE, file);
216 }
217
219 bool hasFile() const
220 {
221 return hasAttribute(FILE_ATTRIBUTE);
222 }
223
225 const string& getFile() const
226 {
227 return getAttribute(FILE_ATTRIBUTE);
228 }
229
233
235 void setFunction(const string& function)
236 {
237 setAttribute(FUNCTION_ATTRIBUTE, function);
238 }
239
241 bool hasFunction() const
242 {
243 return hasAttribute(FUNCTION_ATTRIBUTE);
244 }
245
247 const string& getFunction() const
248 {
249 return getAttribute(FUNCTION_ATTRIBUTE);
250 }
251
255
257 void setNodeGraph(const string& nodegraph)
258 {
259 setAttribute(NODE_GRAPH_ATTRIBUTE, nodegraph);
260 }
261
263 bool hasNodeGraph() const
264 {
265 return hasAttribute(NODE_GRAPH_ATTRIBUTE);
266 }
267
269 const string& getNodeGraph() const
270 {
271 return getAttribute(PortElement::NODE_GRAPH_ATTRIBUTE);
272 }
273
277
279 void setNodeDef(ConstNodeDefPtr nodeDef);
280
282 NodeDefPtr getNodeDef() const;
283
287
290 bool validate(string* message = nullptr) const override;
291
295
298 ConstInterfaceElementPtr getDeclaration(const string& target = EMPTY_STRING) const override;
299
301
302 public:
303 static const string CATEGORY;
304 static const string FILE_ATTRIBUTE;
305 static const string FUNCTION_ATTRIBUTE;
306 static const string NODE_GRAPH_ATTRIBUTE;
307};
308
311class MX_CORE_API TypeDef : public Element
312{
313 public:
314 TypeDef(ElementPtr parent, const string& name) :
315 Element(parent, CATEGORY, name)
316 {
317 }
318 virtual ~TypeDef() { }
319
322
324 void setSemantic(const string& semantic)
325 {
326 setAttribute(SEMANTIC_ATTRIBUTE, semantic);
327 }
328
330 bool hasSemantic() const
331 {
332 return hasAttribute(SEMANTIC_ATTRIBUTE);
333 }
334
336 const string& getSemantic() const
337 {
338 return getAttribute(SEMANTIC_ATTRIBUTE);
339 }
340
344
346 void setContext(const string& context)
347 {
348 setAttribute(CONTEXT_ATTRIBUTE, context);
349 }
350
352 bool hasContext() const
353 {
354 return hasAttribute(CONTEXT_ATTRIBUTE);
355 }
356
358 const string& getContext() const
359 {
360 return getAttribute(CONTEXT_ATTRIBUTE);
361 }
362
366
372 MemberPtr addMember(const string& name = EMPTY_STRING)
373 {
374 return addChild<Member>(name);
375 }
376
378 MemberPtr getMember(const string& name) const
379 {
380 return getChildOfType<Member>(name);
381 }
382
384 vector<MemberPtr> getMembers() const
385 {
387 }
388
390 void removeMember(const string& name)
391 {
393 }
394
396
397 public:
398 static const string CATEGORY;
399 static const string SEMANTIC_ATTRIBUTE;
400 static const string CONTEXT_ATTRIBUTE;
401};
402
405class MX_CORE_API TargetDef : public TypedElement
406{
407 public:
408 TargetDef(ElementPtr parent, const string& name) :
409 TypedElement(parent, CATEGORY, name)
410 {
411 }
412 virtual ~TargetDef() { }
413
419
420 public:
421 static const string CATEGORY;
422};
423
426class MX_CORE_API Member : public ValueElement
427{
428 public:
429 Member(ElementPtr parent, const string& name) :
430 ValueElement(parent, CATEGORY, name)
431 {
432 }
433 virtual ~Member() { }
434
435 public:
436 static const string CATEGORY;
437};
438
441class MX_CORE_API Unit : public Element
442{
443 public:
444 Unit(ElementPtr parent, const string& name) :
445 Element(parent, CATEGORY, name)
446 {
447 }
448 virtual ~Unit() { }
449
450 public:
451 static const string CATEGORY;
452};
453
456class MX_CORE_API UnitDef : public Element
457{
458 public:
459 UnitDef(ElementPtr parent, const string& name) :
460 Element(parent, CATEGORY, name)
461 {
462 }
463 virtual ~UnitDef() { }
464
467
469 void setUnitType(const string& type)
470 {
471 setAttribute(UNITTYPE_ATTRIBUTE, type);
472 }
473
475 bool hasUnitType() const
476 {
477 return hasAttribute(UNITTYPE_ATTRIBUTE);
478 }
479
481 const string& getUnitType() const
482 {
483 return getAttribute(UNITTYPE_ATTRIBUTE);
484 }
485
489
494 UnitPtr addUnit(const string& name)
495 {
496 if (name.empty())
497 {
498 throw Exception("A unit definition name cannot be empty");
499 }
500 return addChild<Unit>(name);
501 }
502
504 UnitPtr getUnit(const string& name) const
505 {
506 return getChildOfType<Unit>(name);
507 }
508
510 vector<UnitPtr> getUnits() const
511 {
513 }
514
516 void removeUnit(const string& name)
517 {
519 }
520
522
523 public:
524 static const string CATEGORY;
525 static const string UNITTYPE_ATTRIBUTE;
526};
527
530class MX_CORE_API UnitTypeDef : public Element
531{
532 public:
533 UnitTypeDef(ElementPtr parent, const string& name) :
534 Element(parent, CATEGORY, name)
535 {
536 }
537 virtual ~UnitTypeDef() { }
538
540 vector<UnitDefPtr> getUnitDefs() const;
541
542 public:
543 static const string CATEGORY;
544};
545
548class MX_CORE_API AttributeDef : public TypedElement
549{
550 public:
551 AttributeDef(ElementPtr parent, const string& name) :
552 TypedElement(parent, CATEGORY, name)
553 {
554 }
555 virtual ~AttributeDef() { }
556
559
561 void setAttrName(const string& name)
562 {
563 setAttribute(ATTRNAME_ATTRIBUTE, name);
564 }
565
567 bool hasAttrName() const
568 {
569 return hasAttribute(ATTRNAME_ATTRIBUTE);
570 }
571
573 const string& getAttrName() const
574 {
575 return getAttribute(ATTRNAME_ATTRIBUTE);
576 }
577
581
583 void setValueString(const string& value)
584 {
585 setAttribute(VALUE_ATTRIBUTE, value);
586 }
587
589 bool hasValueString() const
590 {
591 return hasAttribute(VALUE_ATTRIBUTE);
592 }
593
595 const string& getValueString() const
596 {
597 return getAttribute(VALUE_ATTRIBUTE);
598 }
599
603
605 template <class T> void setValue(const T& value, const string& type = EMPTY_STRING)
606 {
607 setType(!type.empty() ? type : getTypeString<T>());
609 }
610
612 void setValue(const char* value, const string& type = EMPTY_STRING)
613 {
614 setValue(value ? string(value) : EMPTY_STRING, type);
615 }
616
618 bool hasValue() const
619 {
620 return hasAttribute(VALUE_ATTRIBUTE);
621 }
622
629
633
635 void setElements(const string& elements)
636 {
637 setAttribute(ELEMENTS_ATTRIBUTE, elements);
638 }
639
641 bool hasElements() const
642 {
643 return hasAttribute(ELEMENTS_ATTRIBUTE);
644 }
645
647 const string& getElements() const
648 {
649 return getAttribute(ELEMENTS_ATTRIBUTE);
650 }
651
655
657 void setExportable(bool value)
658 {
659 setTypedAttribute<bool>(EXPORTABLE_ATTRIBUTE, value);
660 }
661
664 bool getExportable() const
665 {
666 return getTypedAttribute<bool>(EXPORTABLE_ATTRIBUTE);
667 }
668
670
671 public:
672 static const string CATEGORY;
673 static const string ATTRNAME_ATTRIBUTE;
674 static const string VALUE_ATTRIBUTE;
675 static const string ELEMENTS_ATTRIBUTE;
676 static const string EXPORTABLE_ATTRIBUTE;
677};
678
679MATERIALX_NAMESPACE_END
680
681#endif
shared_ptr< TargetDef > TargetDefPtr
A shared pointer to a TargetDef.
Definition Definition.h:47
shared_ptr< const UnitTypeDef > ConstUnitTypeDefPtr
A shared pointer to a const UnitTypeDef.
Definition Definition.h:69
shared_ptr< UnitDef > UnitDefPtr
A shared pointer to a UnitDef.
Definition Definition.h:62
shared_ptr< Unit > UnitPtr
A shared pointer to a Unit.
Definition Definition.h:57
shared_ptr< const UnitDef > ConstUnitDefPtr
A shared pointer to a const UnitDef.
Definition Definition.h:64
shared_ptr< Implementation > ImplementationPtr
A shared pointer to an Implementation.
Definition Definition.h:37
shared_ptr< const Member > ConstMemberPtr
A shared pointer to a const Member.
Definition Definition.h:54
shared_ptr< const Unit > ConstUnitPtr
A shared pointer to a const Unit.
Definition Definition.h:59
shared_ptr< TypeDef > TypeDefPtr
A shared pointer to a TypeDef.
Definition Definition.h:42
shared_ptr< const TargetDef > ConstTargetDefPtr
A shared pointer to a const TargetDef.
Definition Definition.h:49
shared_ptr< const Implementation > ConstImplementationPtr
A shared pointer to a const Implementation.
Definition Definition.h:39
shared_ptr< AttributeDef > AttributeDefPtr
A shared pointer to an AttributeDef.
Definition Definition.h:72
shared_ptr< const NodeDef > ConstNodeDefPtr
A shared pointer to a const NodeDef.
Definition Definition.h:34
shared_ptr< const TypeDef > ConstTypeDefPtr
A shared pointer to a const TypeDef.
Definition Definition.h:44
shared_ptr< const AttributeDef > AttributeDefDefPtr
A shared pointer to a const AttributeDef.
Definition Definition.h:74
shared_ptr< Member > MemberPtr
A shared pointer to a Member.
Definition Definition.h:52
shared_ptr< NodeDef > NodeDefPtr
A shared pointer to a NodeDef.
Definition Definition.h:32
shared_ptr< UnitTypeDef > UnitTypeDefPtr
A shared pointer to a UnitTypeDef.
Definition Definition.h:67
shared_ptr< Element > ElementPtr
A shared pointer to an Element.
Definition Element.h:31
Interface element subclasses.
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
Import and export declarations for the Core library.
vector< string > StringVec
A vector of strings.
Definition Library.h:60
std::unordered_map< string, string > StringMap
An unordered map with strings as both keys and values.
Definition Library.h:62
shared_ptr< Value > ValuePtr
A shared pointer to a Value.
Definition Value.h:30
MX_CORE_API string toValueString(const T &data)
Convert the given data value to a value string.
MX_CORE_API const string & getTypeString()
Return the type string associated with the given data type.
An attribute definition element within a Document.
Definition Definition.h:549
ValuePtr getValue() const
Return the typed value of an element as a generic value object, which may be queried to access its da...
void setAttrName(const string &name)
Set the element's attrname string.
Definition Definition.h:561
const string & getValueString() const
Get the value string of a element.
Definition Definition.h:595
const string & getAttrName() const
Return the element's attrname string.
Definition Definition.h:573
void setValue(const char *value, const string &type=EMPTY_STRING)
Set the typed value of an element from a C-style string.
Definition Definition.h:612
bool getExportable() const
Return the exportable boolean for the element.
Definition Definition.h:664
bool hasElements() const
Return true if the element has an elements string.
Definition Definition.h:641
void setExportable(bool value)
Set the exportable boolean for the element.
Definition Definition.h:657
void setValueString(const string &value)
Set the value string of an element.
Definition Definition.h:583
bool hasAttrName() const
Return true if this element has an attrname string.
Definition Definition.h:567
void setValue(const T &value, const string &type=EMPTY_STRING)
Set the typed value of an element.
Definition Definition.h:605
void setElements(const string &elements)
Set the element's elements string.
Definition Definition.h:635
const string & getElements() const
Return the element's elements string.
Definition Definition.h:647
bool hasValueString() const
Return true if the given element has a value string.
Definition Definition.h:589
bool hasValue() const
Return true if the element possesses a typed value.
Definition Definition.h:618
const string & getAttribute(const string &attrib) const
Return the value string of the given attribute.
Definition Element.h:489
shared_ptr< T > addChild(const string &name=EMPTY_STRING)
Add a child element of the given subclass and name.
Definition Element.h:1399
void setAttribute(const string &attrib, const string &value)
Set the value string of the given attribute.
void setTypedAttribute(const string &attrib, const T &data)
Set the value of an implicitly typed attribute.
Definition Element.h:504
T getTypedAttribute(const string &attrib) const
Return the value of an implicitly typed attribute.
Definition Element.h:512
shared_ptr< T > getChildOfType(const string &name) const
Return the child element, if any, with the given name and subclass.
bool hasAttribute(const string &attrib) const
Return true if the given attribute is present.
Definition Element.h:482
void removeChildOfType(const string &name)
Remove the child element, if any, with the given name and subclass.
Definition Element.h:468
vector< shared_ptr< T > > getChildrenOfType(const string &category=EMPTY_STRING) const
Return a vector of all child elements that are instances of the given subclass, optionally filtered b...
The base class for exceptions that are propagated from the MaterialX library to the client applicatio...
Definition Exception.h:22
An implementation element within a Document.
Definition Definition.h:201
const string & getNodeGraph() const
Return the nodegraph string for the Implementation.
Definition Definition.h:269
bool hasFile() const
Return true if the given Implementation has a file string.
Definition Definition.h:219
bool validate(string *message=nullptr) const override
Validate that the given element tree, including all descendants, is consistent with the MaterialX spe...
bool hasFunction() const
Return true if the given Implementation has a function string.
Definition Definition.h:241
const string & getFunction() const
Return the function string for the Implementation.
Definition Definition.h:247
void setFunction(const string &function)
Set the function string for the Implementation.
Definition Definition.h:235
NodeDefPtr getNodeDef() const
Return the NodeDef element referenced by the Implementation.
bool hasNodeGraph() const
Return true if the given Implementation has a nodegraph string.
Definition Definition.h:263
void setNodeGraph(const string &nodegraph)
Set the nodegraph string for the Implementation.
Definition Definition.h:257
void setNodeDef(ConstNodeDefPtr nodeDef)
Set the NodeDef element referenced by the Implementation.
const string & getFile() const
Return the file string for the Implementation.
Definition Definition.h:225
void setFile(const string &file)
Set the file string for the Implementation.
Definition Definition.h:213
ConstInterfaceElementPtr getDeclaration(const string &target=EMPTY_STRING) const override
Return the first declaration of this interface, optionally filtered by the given target name.
A member element within a TypeDef.
Definition Definition.h:427
A node definition element within a Document.
Definition Definition.h:82
bool isVersionCompatible(const string &version) const
Return true if the given version string is compatible with this NodeDef.
void setNodeString(const string &node)
Set the node string of the NodeDef.
Definition Definition.h:94
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 nodedef, optionally filtered by the given target name.
StringMap getInputHints() const
Return list of input hint pairs of the form { input_name, hint_string }.
const string & getType() const override
Return the element's output type.
const string & getNodeGroup() const
Return the node group of the NodeDef.
Definition Definition.h:131
bool hasNodeGroup() const
Return true if the given NodeDef has a node group.
Definition Definition.h:125
const string & getNodeString() const
Return the node string of the NodeDef.
Definition Definition.h:106
bool hasNodeString() const
Return true if the given NodeDef has a node string.
Definition Definition.h:100
ConstInterfaceElementPtr getDeclaration(const string &target=EMPTY_STRING) const override
Return the first declaration of this interface, optionally filtered by the given target name.
void setNodeGroup(const string &category)
Set the node group of the NodeDef.
Definition Definition.h:119
A definition of an implementation target.
Definition Definition.h:406
StringVec getMatchingTargets() const
Return a vector of target names that is matching this targetdef either by itself of by its inheritanc...
A type definition element within a Document.
Definition Definition.h:312
MemberPtr getMember(const string &name) const
Return the Member, if any, with the given name.
Definition Definition.h:378
MemberPtr addMember(const string &name=EMPTY_STRING)
Add a Member to the TypeDef.
Definition Definition.h:372
bool hasSemantic() const
Return true if the given TypeDef has a semantic string.
Definition Definition.h:330
vector< MemberPtr > getMembers() const
Return a vector of all Member elements in the TypeDef.
Definition Definition.h:384
bool hasContext() const
Return true if the given TypeDef has a context string.
Definition Definition.h:352
void setContext(const string &context)
Set the context string of the TypeDef.
Definition Definition.h:346
void setSemantic(const string &semantic)
Set the semantic string of the TypeDef.
Definition Definition.h:324
void removeMember(const string &name)
Remove the Member, if any, with the given name.
Definition Definition.h:390
const string & getContext() const
Return the context string of the TypeDef.
Definition Definition.h:358
const string & getSemantic() const
Return the semantic string of the TypeDef.
Definition Definition.h:336
void setType(const string &type)
Set the element's type string.
Definition Element.h:882
A unit definition element within a Document.
Definition Definition.h:457
void removeUnit(const string &name)
Remove the Unit, if any, with the given name.
Definition Definition.h:516
void setUnitType(const string &type)
Set the element's unittype string.
Definition Definition.h:469
UnitPtr getUnit(const string &name) const
Return the Unit, if any, with the given name.
Definition Definition.h:504
bool hasUnitType() const
Return true if the given element has a unittype string.
Definition Definition.h:475
UnitPtr addUnit(const string &name)
Add a Unit to the UnitDef.
Definition Definition.h:494
vector< UnitPtr > getUnits() const
Return a vector of all Unit elements in the UnitDef.
Definition Definition.h:510
const string & getUnitType() const
Return the element's type string.
Definition Definition.h:481
A unit declaration within a UnitDef.
Definition Definition.h:442
A unit type definition element within a Document.
Definition Definition.h:531
vector< UnitDefPtr > getUnitDefs() const
Find all UnitDefs for the UnitTypeDef.