MaterialX 1.39.1
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 {
386 return getChildrenOfType<Member>();
387 }
388
390 void removeMember(const string& name)
391 {
392 removeChildOfType<Member>(name);
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 TypedElement
427{
428 public:
429 Member(ElementPtr parent, const string& name) :
430 TypedElement(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 {
512 return getChildrenOfType<Unit>();
513 }
514
516 void removeUnit(const string& name)
517 {
518 removeChildOfType<Unit>(name);
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>());
608 setValueString(toValueString(value));
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 {
630 if (!hasValue())
631 return ValuePtr();
632 return Value::createValueFromStrings(getValueString(), getType());
633 }
634
638
640 void setElements(const string& elements)
641 {
642 setAttribute(ELEMENTS_ATTRIBUTE, elements);
643 }
644
646 bool hasElements() const
647 {
648 return hasAttribute(ELEMENTS_ATTRIBUTE);
649 }
650
652 const string& getElements() const
653 {
654 return getAttribute(ELEMENTS_ATTRIBUTE);
655 }
656
660
662 void setExportable(bool value)
663 {
664 setTypedAttribute<bool>(EXPORTABLE_ATTRIBUTE, value);
665 }
666
669 bool getExportable() const
670 {
671 return getTypedAttribute<bool>(EXPORTABLE_ATTRIBUTE);
672 }
673
675
676 public:
677 static const string CATEGORY;
678 static const string ATTRNAME_ATTRIBUTE;
679 static const string VALUE_ATTRIBUTE;
680 static const string ELEMENTS_ATTRIBUTE;
681 static const string EXPORTABLE_ATTRIBUTE;
682};
683
684MATERIALX_NAMESPACE_END
685
686#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:55
std::unordered_map< string, string > StringMap
An unordered map with strings as both keys and values.
Definition: Library.h:57
shared_ptr< Value > ValuePtr
A shared pointer to a Value.
Definition: Value.h:29
MX_CORE_API string toValueString(const T &data)
Convert the given data value to a value string.
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...
Definition: Definition.h:628
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:669
bool hasElements() const
Return true if the element has an elements string.
Definition: Definition.h:646
void setExportable(bool value)
Set the exportable boolean for the element.
Definition: Definition.h:662
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:640
const string & getElements() const
Return the element's elements string.
Definition: Definition.h:652
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
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 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.
The base class for interface elements such as Node, NodeDef, and NodeGraph.
Definition: Interface.h:312
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
The base class for typed elements.
Definition: Element.h:854
virtual const string & getType() const
Return the element's type string.
Definition: Element.h:884
void setType(const string &type)
Set the element's type string.
Definition: Element.h:872
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.
static ValuePtr createValueFromStrings(const string &value, const string &type)
Create a new value instance from value and type strings.