MaterialX 1.39.5
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
150 InterfaceElementPtr getImplementation(const string& target = EMPTY_STRING, bool resolveNodeGraph = true) const;
151
155
158
162
165 bool validate(string* message = nullptr) const override;
166
170
174 bool isVersionCompatible(const string& version) const;
175
178 ConstInterfaceElementPtr getDeclaration(const string& target = EMPTY_STRING) const override;
179
181
182 public:
183 static const string CATEGORY;
184 static const string NODE_ATTRIBUTE;
185 static const string NODE_GROUP_ATTRIBUTE;
186
187 static const string TEXTURE_NODE_GROUP;
188 static const string PROCEDURAL_NODE_GROUP;
189 static const string GEOMETRIC_NODE_GROUP;
190 static const string ADJUSTMENT_NODE_GROUP;
191 static const string CONDITIONAL_NODE_GROUP;
192 static const string CHANNEL_NODE_GROUP;
193 static const string ORGANIZATION_NODE_GROUP;
194 static const string TRANSLATION_NODE_GROUP;
195};
196
203class MX_CORE_API Implementation : public InterfaceElement
204{
205 public:
206 Implementation(ElementPtr parent, const string& name) :
207 InterfaceElement(parent, CATEGORY, name)
208 {
209 }
210 virtual ~Implementation() { }
211
214
216 void setFile(const string& file)
217 {
218 setAttribute(FILE_ATTRIBUTE, file);
219 }
220
222 bool hasFile() const
223 {
224 return hasAttribute(FILE_ATTRIBUTE);
225 }
226
228 const string& getFile() const
229 {
230 return getAttribute(FILE_ATTRIBUTE);
231 }
232
236
238 void setFunction(const string& function)
239 {
240 setAttribute(FUNCTION_ATTRIBUTE, function);
241 }
242
244 bool hasFunction() const
245 {
246 return hasAttribute(FUNCTION_ATTRIBUTE);
247 }
248
250 const string& getFunction() const
251 {
252 return getAttribute(FUNCTION_ATTRIBUTE);
253 }
254
258
260 void setNodeGraph(const string& nodegraph)
261 {
262 setAttribute(NODE_GRAPH_ATTRIBUTE, nodegraph);
263 }
264
266 bool hasNodeGraph() const
267 {
268 return hasAttribute(NODE_GRAPH_ATTRIBUTE);
269 }
270
272 const string& getNodeGraph() const
273 {
274 return getAttribute(PortElement::NODE_GRAPH_ATTRIBUTE);
275 }
276
280
282 void setNodeDef(ConstNodeDefPtr nodeDef);
283
285 NodeDefPtr getNodeDef() const;
286
290
293 bool validate(string* message = nullptr) const override;
294
298
301 ConstInterfaceElementPtr getDeclaration(const string& target = EMPTY_STRING) const override;
302
304
305 public:
306 static const string CATEGORY;
307 static const string FILE_ATTRIBUTE;
308 static const string FUNCTION_ATTRIBUTE;
309 static const string NODE_GRAPH_ATTRIBUTE;
310};
311
314class MX_CORE_API TypeDef : public Element
315{
316 public:
317 TypeDef(ElementPtr parent, const string& name) :
318 Element(parent, CATEGORY, name)
319 {
320 }
321 virtual ~TypeDef() { }
322
325
327 void setSemantic(const string& semantic)
328 {
329 setAttribute(SEMANTIC_ATTRIBUTE, semantic);
330 }
331
333 bool hasSemantic() const
334 {
335 return hasAttribute(SEMANTIC_ATTRIBUTE);
336 }
337
339 const string& getSemantic() const
340 {
341 return getAttribute(SEMANTIC_ATTRIBUTE);
342 }
343
347
349 void setContext(const string& context)
350 {
351 setAttribute(CONTEXT_ATTRIBUTE, context);
352 }
353
355 bool hasContext() const
356 {
357 return hasAttribute(CONTEXT_ATTRIBUTE);
358 }
359
361 const string& getContext() const
362 {
363 return getAttribute(CONTEXT_ATTRIBUTE);
364 }
365
369
375 MemberPtr addMember(const string& name = EMPTY_STRING)
376 {
377 return addChild<Member>(name);
378 }
379
381 MemberPtr getMember(const string& name) const
382 {
383 return getChildOfType<Member>(name);
384 }
385
387 vector<MemberPtr> getMembers() const
388 {
390 }
391
393 void removeMember(const string& name)
394 {
396 }
397
399
400 public:
401 static const string CATEGORY;
402 static const string SEMANTIC_ATTRIBUTE;
403 static const string CONTEXT_ATTRIBUTE;
404};
405
408class MX_CORE_API TargetDef : public TypedElement
409{
410 public:
411 TargetDef(ElementPtr parent, const string& name) :
412 TypedElement(parent, CATEGORY, name)
413 {
414 }
415 virtual ~TargetDef() { }
416
422
423 public:
424 static const string CATEGORY;
425};
426
429class MX_CORE_API Member : public ValueElement
430{
431 public:
432 Member(ElementPtr parent, const string& name) :
433 ValueElement(parent, CATEGORY, name)
434 {
435 }
436 virtual ~Member() { }
437
438 public:
439 static const string CATEGORY;
440};
441
444class MX_CORE_API Unit : public Element
445{
446 public:
447 Unit(ElementPtr parent, const string& name) :
448 Element(parent, CATEGORY, name)
449 {
450 }
451 virtual ~Unit() { }
452
453 public:
454 static const string CATEGORY;
455};
456
459class MX_CORE_API UnitDef : public Element
460{
461 public:
462 UnitDef(ElementPtr parent, const string& name) :
463 Element(parent, CATEGORY, name)
464 {
465 }
466 virtual ~UnitDef() { }
467
470
472 void setUnitType(const string& type)
473 {
474 setAttribute(UNITTYPE_ATTRIBUTE, type);
475 }
476
478 bool hasUnitType() const
479 {
480 return hasAttribute(UNITTYPE_ATTRIBUTE);
481 }
482
484 const string& getUnitType() const
485 {
486 return getAttribute(UNITTYPE_ATTRIBUTE);
487 }
488
492
497 UnitPtr addUnit(const string& name)
498 {
499 if (name.empty())
500 {
501 throw Exception("A unit definition name cannot be empty");
502 }
503 return addChild<Unit>(name);
504 }
505
507 UnitPtr getUnit(const string& name) const
508 {
509 return getChildOfType<Unit>(name);
510 }
511
513 vector<UnitPtr> getUnits() const
514 {
516 }
517
519 void removeUnit(const string& name)
520 {
522 }
523
525
526 public:
527 static const string CATEGORY;
528 static const string UNITTYPE_ATTRIBUTE;
529};
530
533class MX_CORE_API UnitTypeDef : public Element
534{
535 public:
536 UnitTypeDef(ElementPtr parent, const string& name) :
537 Element(parent, CATEGORY, name)
538 {
539 }
540 virtual ~UnitTypeDef() { }
541
543 vector<UnitDefPtr> getUnitDefs() const;
544
545 public:
546 static const string CATEGORY;
547};
548
551class MX_CORE_API AttributeDef : public TypedElement
552{
553 public:
554 AttributeDef(ElementPtr parent, const string& name) :
555 TypedElement(parent, CATEGORY, name)
556 {
557 }
558 virtual ~AttributeDef() { }
559
562
564 void setAttrName(const string& name)
565 {
566 setAttribute(ATTRNAME_ATTRIBUTE, name);
567 }
568
570 bool hasAttrName() const
571 {
572 return hasAttribute(ATTRNAME_ATTRIBUTE);
573 }
574
576 const string& getAttrName() const
577 {
578 return getAttribute(ATTRNAME_ATTRIBUTE);
579 }
580
584
586 void setValueString(const string& value)
587 {
588 setAttribute(VALUE_ATTRIBUTE, value);
589 }
590
592 bool hasValueString() const
593 {
594 return hasAttribute(VALUE_ATTRIBUTE);
595 }
596
598 const string& getValueString() const
599 {
600 return getAttribute(VALUE_ATTRIBUTE);
601 }
602
606
608 template <class T> void setValue(const T& value, const string& type = EMPTY_STRING)
609 {
610 setType(!type.empty() ? type : getTypeString<T>());
612 }
613
615 void setValue(const char* value, const string& type = EMPTY_STRING)
616 {
617 setValue(value ? string(value) : EMPTY_STRING, type);
618 }
619
621 bool hasValue() const
622 {
623 return hasAttribute(VALUE_ATTRIBUTE);
624 }
625
632
636
638 void setElements(const string& elements)
639 {
640 setAttribute(ELEMENTS_ATTRIBUTE, elements);
641 }
642
644 bool hasElements() const
645 {
646 return hasAttribute(ELEMENTS_ATTRIBUTE);
647 }
648
650 const string& getElements() const
651 {
652 return getAttribute(ELEMENTS_ATTRIBUTE);
653 }
654
658
660 void setExportable(bool value)
661 {
662 setTypedAttribute<bool>(EXPORTABLE_ATTRIBUTE, value);
663 }
664
667 bool getExportable() const
668 {
669 return getTypedAttribute<bool>(EXPORTABLE_ATTRIBUTE);
670 }
671
673
674 public:
675 static const string CATEGORY;
676 static const string ATTRNAME_ATTRIBUTE;
677 static const string VALUE_ATTRIBUTE;
678 static const string ELEMENTS_ATTRIBUTE;
679 static const string EXPORTABLE_ATTRIBUTE;
680};
681
682MATERIALX_NAMESPACE_END
683
684#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:61
std::unordered_map< string, string > StringMap
An unordered map with strings as both keys and values.
Definition Library.h:63
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:552
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:564
const string & getValueString() const
Get the value string of a element.
Definition Definition.h:598
const string & getAttrName() const
Return the element's attrname string.
Definition Definition.h:576
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:615
bool getExportable() const
Return the exportable boolean for the element.
Definition Definition.h:667
bool hasElements() const
Return true if the element has an elements string.
Definition Definition.h:644
void setExportable(bool value)
Set the exportable boolean for the element.
Definition Definition.h:660
void setValueString(const string &value)
Set the value string of an element.
Definition Definition.h:586
bool hasAttrName() const
Return true if this element has an attrname string.
Definition Definition.h:570
void setValue(const T &value, const string &type=EMPTY_STRING)
Set the typed value of an element.
Definition Definition.h:608
void setElements(const string &elements)
Set the element's elements string.
Definition Definition.h:638
const string & getElements() const
Return the element's elements string.
Definition Definition.h:650
bool hasValueString() const
Return true if the given element has a value string.
Definition Definition.h:592
bool hasValue() const
Return true if the element possesses a typed value.
Definition Definition.h:621
const string & getAttribute(const string &attrib) const
Return the value string of the given attribute.
Definition Element.h:491
shared_ptr< T > addChild(const string &name=EMPTY_STRING)
Add a child element of the given subclass and name.
Definition Element.h:1401
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:506
T getTypedAttribute(const string &attrib) const
Return the value of an implicitly typed attribute.
Definition Element.h:514
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:484
void removeChildOfType(const string &name)
Remove the child element, if any, with the given name and subclass.
Definition Element.h:470
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:204
const string & getNodeGraph() const
Return the nodegraph string for the Implementation.
Definition Definition.h:272
bool hasFile() const
Return true if the given Implementation has a file string.
Definition Definition.h:222
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:244
const string & getFunction() const
Return the function string for the Implementation.
Definition Definition.h:250
void setFunction(const string &function)
Set the function string for the Implementation.
Definition Definition.h:238
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:266
void setNodeGraph(const string &nodegraph)
Set the nodegraph string for the Implementation.
Definition Definition.h:260
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:228
void setFile(const string &file)
Set the file string for the Implementation.
Definition Definition.h:216
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:430
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...
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
InterfaceElementPtr getImplementation(const string &target=EMPTY_STRING, bool resolveNodeGraph=true) const
Return the first implementation for this nodedef, optionally filtered by the given target name.
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:409
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:315
MemberPtr getMember(const string &name) const
Return the Member, if any, with the given name.
Definition Definition.h:381
MemberPtr addMember(const string &name=EMPTY_STRING)
Add a Member to the TypeDef.
Definition Definition.h:375
bool hasSemantic() const
Return true if the given TypeDef has a semantic string.
Definition Definition.h:333
vector< MemberPtr > getMembers() const
Return a vector of all Member elements in the TypeDef.
Definition Definition.h:387
bool hasContext() const
Return true if the given TypeDef has a context string.
Definition Definition.h:355
void setContext(const string &context)
Set the context string of the TypeDef.
Definition Definition.h:349
void setSemantic(const string &semantic)
Set the semantic string of the TypeDef.
Definition Definition.h:327
void removeMember(const string &name)
Remove the Member, if any, with the given name.
Definition Definition.h:393
const string & getContext() const
Return the context string of the TypeDef.
Definition Definition.h:361
const string & getSemantic() const
Return the semantic string of the TypeDef.
Definition Definition.h:339
void setType(const string &type)
Set the element's type string.
Definition Element.h:884
A unit definition element within a Document.
Definition Definition.h:460
void removeUnit(const string &name)
Remove the Unit, if any, with the given name.
Definition Definition.h:519
void setUnitType(const string &type)
Set the element's unittype string.
Definition Definition.h:472
UnitPtr getUnit(const string &name) const
Return the Unit, if any, with the given name.
Definition Definition.h:507
bool hasUnitType() const
Return true if the given element has a unittype string.
Definition Definition.h:478
UnitPtr addUnit(const string &name)
Add a Unit to the UnitDef.
Definition Definition.h:497
vector< UnitPtr > getUnits() const
Return a vector of all Unit elements in the UnitDef.
Definition Definition.h:513
const string & getUnitType() const
Return the element's type string.
Definition Definition.h:484
A unit declaration within a UnitDef.
Definition Definition.h:445
A unit type definition element within a Document.
Definition Definition.h:534
vector< UnitDefPtr > getUnitDefs() const
Find all UnitDefs for the UnitTypeDef.