MaterialX 1.38.10
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 bool validate(string* message = nullptr) const override;
156
160
164 bool isVersionCompatible(const string& version) const;
165
168 ConstInterfaceElementPtr getDeclaration(const string& target = EMPTY_STRING) const override;
169
171
172 public:
173 static const string CATEGORY;
174 static const string NODE_ATTRIBUTE;
175 static const string NODE_GROUP_ATTRIBUTE;
176
177 static const string TEXTURE_NODE_GROUP;
178 static const string PROCEDURAL_NODE_GROUP;
179 static const string GEOMETRIC_NODE_GROUP;
180 static const string ADJUSTMENT_NODE_GROUP;
181 static const string CONDITIONAL_NODE_GROUP;
182 static const string ORGANIZATION_NODE_GROUP;
183 static const string TRANSLATION_NODE_GROUP;
184};
185
192class MX_CORE_API Implementation : public InterfaceElement
193{
194 public:
195 Implementation(ElementPtr parent, const string& name) :
196 InterfaceElement(parent, CATEGORY, name)
197 {
198 }
199 virtual ~Implementation() { }
200
203
205 void setFile(const string& file)
206 {
207 setAttribute(FILE_ATTRIBUTE, file);
208 }
209
211 bool hasFile() const
212 {
213 return hasAttribute(FILE_ATTRIBUTE);
214 }
215
217 const string& getFile() const
218 {
219 return getAttribute(FILE_ATTRIBUTE);
220 }
221
225
227 void setFunction(const string& function)
228 {
229 setAttribute(FUNCTION_ATTRIBUTE, function);
230 }
231
233 bool hasFunction() const
234 {
235 return hasAttribute(FUNCTION_ATTRIBUTE);
236 }
237
239 const string& getFunction() const
240 {
241 return getAttribute(FUNCTION_ATTRIBUTE);
242 }
243
247
249 void setNodeGraph(const string& nodegraph)
250 {
251 setAttribute(NODE_GRAPH_ATTRIBUTE, nodegraph);
252 }
253
255 bool hasNodeGraph() const
256 {
257 return hasAttribute(NODE_GRAPH_ATTRIBUTE);
258 }
259
261 const string& getNodeGraph() const
262 {
263 return getAttribute(PortElement::NODE_GRAPH_ATTRIBUTE);
264 }
265
269
271 void setNodeDef(ConstNodeDefPtr nodeDef);
272
274 NodeDefPtr getNodeDef() const;
275
279
282 bool validate(string* message = nullptr) const override;
283
287
290 ConstInterfaceElementPtr getDeclaration(const string& target = EMPTY_STRING) const override;
291
293
294 public:
295 static const string CATEGORY;
296 static const string FILE_ATTRIBUTE;
297 static const string FUNCTION_ATTRIBUTE;
298 static const string NODE_GRAPH_ATTRIBUTE;
299};
300
303class MX_CORE_API TypeDef : public Element
304{
305 public:
306 TypeDef(ElementPtr parent, const string& name) :
307 Element(parent, CATEGORY, name)
308 {
309 }
310 virtual ~TypeDef() { }
311
314
316 void setSemantic(const string& semantic)
317 {
318 setAttribute(SEMANTIC_ATTRIBUTE, semantic);
319 }
320
322 bool hasSemantic() const
323 {
324 return hasAttribute(SEMANTIC_ATTRIBUTE);
325 }
326
328 const string& getSemantic() const
329 {
330 return getAttribute(SEMANTIC_ATTRIBUTE);
331 }
332
336
338 void setContext(const string& context)
339 {
340 setAttribute(CONTEXT_ATTRIBUTE, context);
341 }
342
344 bool hasContext() const
345 {
346 return hasAttribute(CONTEXT_ATTRIBUTE);
347 }
348
350 const string& getContext() const
351 {
352 return getAttribute(CONTEXT_ATTRIBUTE);
353 }
354
358
364 MemberPtr addMember(const string& name = EMPTY_STRING)
365 {
366 return addChild<Member>(name);
367 }
368
370 MemberPtr getMember(const string& name) const
371 {
372 return getChildOfType<Member>(name);
373 }
374
376 vector<MemberPtr> getMembers() const
377 {
378 return getChildrenOfType<Member>();
379 }
380
382 void removeMember(const string& name)
383 {
384 removeChildOfType<Member>(name);
385 }
386
388
389 public:
390 static const string CATEGORY;
391 static const string SEMANTIC_ATTRIBUTE;
392 static const string CONTEXT_ATTRIBUTE;
393};
394
397class MX_CORE_API TargetDef : public TypedElement
398{
399 public:
400 TargetDef(ElementPtr parent, const string& name) :
401 TypedElement(parent, CATEGORY, name)
402 {
403 }
404 virtual ~TargetDef() { }
405
410 StringVec getMatchingTargets() const;
411
412 public:
413 static const string CATEGORY;
414};
415
418class MX_CORE_API Member : public TypedElement
419{
420 public:
421 Member(ElementPtr parent, const string& name) :
422 TypedElement(parent, CATEGORY, name)
423 {
424 }
425 virtual ~Member() { }
426
427 public:
428 static const string CATEGORY;
429};
430
433class MX_CORE_API Unit : public Element
434{
435 public:
436 Unit(ElementPtr parent, const string& name) :
437 Element(parent, CATEGORY, name)
438 {
439 }
440 virtual ~Unit() { }
441
442 public:
443 static const string CATEGORY;
444};
445
448class MX_CORE_API UnitDef : public Element
449{
450 public:
451 UnitDef(ElementPtr parent, const string& name) :
452 Element(parent, CATEGORY, name)
453 {
454 }
455 virtual ~UnitDef() { }
456
459
461 void setUnitType(const string& type)
462 {
463 setAttribute(UNITTYPE_ATTRIBUTE, type);
464 }
465
467 bool hasUnitType() const
468 {
469 return hasAttribute(UNITTYPE_ATTRIBUTE);
470 }
471
473 const string& getUnitType() const
474 {
475 return getAttribute(UNITTYPE_ATTRIBUTE);
476 }
477
481
486 UnitPtr addUnit(const string& name)
487 {
488 if (name.empty())
489 {
490 throw Exception("A unit definition name cannot be empty");
491 }
492 return addChild<Unit>(name);
493 }
494
496 UnitPtr getUnit(const string& name) const
497 {
498 return getChildOfType<Unit>(name);
499 }
500
502 vector<UnitPtr> getUnits() const
503 {
504 return getChildrenOfType<Unit>();
505 }
506
508 void removeUnit(const string& name)
509 {
510 removeChildOfType<Unit>(name);
511 }
512
514
515 public:
516 static const string CATEGORY;
517 static const string UNITTYPE_ATTRIBUTE;
518};
519
522class MX_CORE_API UnitTypeDef : public Element
523{
524 public:
525 UnitTypeDef(ElementPtr parent, const string& name) :
526 Element(parent, CATEGORY, name)
527 {
528 }
529 virtual ~UnitTypeDef() { }
530
532 vector<UnitDefPtr> getUnitDefs() const;
533
534 public:
535 static const string CATEGORY;
536};
537
540class MX_CORE_API AttributeDef : public TypedElement
541{
542 public:
543 AttributeDef(ElementPtr parent, const string& name) :
544 TypedElement(parent, CATEGORY, name)
545 {
546 }
547 virtual ~AttributeDef() { }
548
551
553 void setAttrName(const string& name)
554 {
555 setAttribute(ATTRNAME_ATTRIBUTE, name);
556 }
557
559 bool hasAttrName() const
560 {
561 return hasAttribute(ATTRNAME_ATTRIBUTE);
562 }
563
565 const string& getAttrName() const
566 {
567 return getAttribute(ATTRNAME_ATTRIBUTE);
568 }
569
573
575 void setValueString(const string& value)
576 {
577 setAttribute(VALUE_ATTRIBUTE, value);
578 }
579
581 bool hasValueString() const
582 {
583 return hasAttribute(VALUE_ATTRIBUTE);
584 }
585
587 const string& getValueString() const
588 {
589 return getAttribute(VALUE_ATTRIBUTE);
590 }
591
595
597 template <class T> void setValue(const T& value, const string& type = EMPTY_STRING)
598 {
599 setType(!type.empty() ? type : getTypeString<T>());
600 setValueString(toValueString(value));
601 }
602
604 void setValue(const char* value, const string& type = EMPTY_STRING)
605 {
606 setValue(value ? string(value) : EMPTY_STRING, type);
607 }
608
610 bool hasValue() const
611 {
612 return hasAttribute(VALUE_ATTRIBUTE);
613 }
614
621 {
622 if (!hasValue())
623 return ValuePtr();
624 return Value::createValueFromStrings(getValueString(), getType());
625 }
626
630
632 void setElements(const string& elements)
633 {
634 setAttribute(ELEMENTS_ATTRIBUTE, elements);
635 }
636
638 bool hasElements() const
639 {
640 return hasAttribute(ELEMENTS_ATTRIBUTE);
641 }
642
644 const string& getElements() const
645 {
646 return getAttribute(ELEMENTS_ATTRIBUTE);
647 }
648
652
654 void setExportable(bool value)
655 {
656 setTypedAttribute<bool>(EXPORTABLE_ATTRIBUTE, value);
657 }
658
661 bool getExportable() const
662 {
663 return getTypedAttribute<bool>(EXPORTABLE_ATTRIBUTE);
664 }
665
667
668 public:
669 static const string CATEGORY;
670 static const string ATTRNAME_ATTRIBUTE;
671 static const string VALUE_ATTRIBUTE;
672 static const string ELEMENTS_ATTRIBUTE;
673 static const string EXPORTABLE_ATTRIBUTE;
674};
675
676MATERIALX_NAMESPACE_END
677
678#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:57
shared_ptr< Value > ValuePtr
A shared pointer to a Value.
Definition: Value.h:29
An attribute definition element within a Document.
Definition: Definition.h:541
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:620
void setAttrName(const string &name)
Set the element's attrname string.
Definition: Definition.h:553
const string & getValueString() const
Get the value string of a element.
Definition: Definition.h:587
const string & getAttrName() const
Return the element's attrname string.
Definition: Definition.h:565
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:604
bool getExportable() const
Return the exportable boolean for the element.
Definition: Definition.h:661
bool hasElements() const
Return true if the element has an elements string.
Definition: Definition.h:638
void setExportable(bool value)
Set the exportable boolean for the element.
Definition: Definition.h:654
void setValueString(const string &value)
Set the value string of an element.
Definition: Definition.h:575
bool hasAttrName() const
Return true if this element has an attrname string.
Definition: Definition.h:559
void setValue(const T &value, const string &type=EMPTY_STRING)
Set the typed value of an element.
Definition: Definition.h:597
void setElements(const string &elements)
Set the element's elements string.
Definition: Definition.h:632
const string & getElements() const
Return the element's elements string.
Definition: Definition.h:644
bool hasValueString() const
Return true if the given element has a value string.
Definition: Definition.h:581
bool hasValue() const
Return true if the element possesses a typed value.
Definition: Definition.h:610
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.
Definition: Element.cpp:191
bool hasAttribute(const string &attrib) const
Return true if the given attribute is present.
Definition: Element.h:497
virtual bool validate(string *message=nullptr) const
Validate that the given element tree, including all descendants, is consistent with the MaterialX spe...
Definition: Element.cpp:396
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:193
const string & getNodeGraph() const
Return the nodegraph string for the Implementation.
Definition: Definition.h:261
bool hasFile() const
Return true if the given Implementation has a file string.
Definition: Definition.h:211
bool hasFunction() const
Return true if the given Implementation has a function string.
Definition: Definition.h:233
const string & getFunction() const
Return the function string for the Implementation.
Definition: Definition.h:239
void setFunction(const string &function)
Set the function string for the Implementation.
Definition: Definition.h:227
bool hasNodeGraph() const
Return true if the given Implementation has a nodegraph string.
Definition: Definition.h:255
void setNodeGraph(const string &nodegraph)
Set the nodegraph string for the Implementation.
Definition: Definition.h:249
const string & getFile() const
Return the file string for the Implementation.
Definition: Definition.h:217
void setFile(const string &file)
Set the file string for the Implementation.
Definition: Definition.h:205
The base class for interface elements such as Node, NodeDef, and NodeGraph.
Definition: Interface.h:318
virtual ConstInterfaceElementPtr getDeclaration(const string &target=EMPTY_STRING) const
Return the first declaration of this interface, optionally filtered by the given target name.
Definition: Interface.cpp:609
A member element within a TypeDef.
Definition: Definition.h:419
A node definition element within a Document.
Definition: Definition.h:82
void setNodeString(const string &node)
Set the node string of the NodeDef.
Definition: Definition.h:94
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
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:398
A type definition element within a Document.
Definition: Definition.h:304
MemberPtr getMember(const string &name) const
Return the Member, if any, with the given name.
Definition: Definition.h:370
MemberPtr addMember(const string &name=EMPTY_STRING)
Add a Member to the TypeDef.
Definition: Definition.h:364
bool hasSemantic() const
Return true if the given TypeDef has a semantic string.
Definition: Definition.h:322
vector< MemberPtr > getMembers() const
Return a vector of all Member elements in the TypeDef.
Definition: Definition.h:376
bool hasContext() const
Return true if the given TypeDef has a context string.
Definition: Definition.h:344
void setContext(const string &context)
Set the context string of the TypeDef.
Definition: Definition.h:338
void setSemantic(const string &semantic)
Set the semantic string of the TypeDef.
Definition: Definition.h:316
void removeMember(const string &name)
Remove the Member, if any, with the given name.
Definition: Definition.h:382
const string & getContext() const
Return the context string of the TypeDef.
Definition: Definition.h:350
const string & getSemantic() const
Return the semantic string of the TypeDef.
Definition: Definition.h:328
The base class for typed elements.
Definition: Element.h:837
virtual const string & getType() const
Return the element's type string.
Definition: Element.h:867
void setType(const string &type)
Set the element's type string.
Definition: Element.h:855
A unit definition element within a Document.
Definition: Definition.h:449
void removeUnit(const string &name)
Remove the Unit, if any, with the given name.
Definition: Definition.h:508
void setUnitType(const string &type)
Set the element's unittype string.
Definition: Definition.h:461
UnitPtr getUnit(const string &name) const
Return the Unit, if any, with the given name.
Definition: Definition.h:496
bool hasUnitType() const
Return true if the given element has a unittype string.
Definition: Definition.h:467
UnitPtr addUnit(const string &name)
Add a Unit to the UnitDef.
Definition: Definition.h:486
vector< UnitPtr > getUnits() const
Return a vector of all Unit elements in the UnitDef.
Definition: Definition.h:502
const string & getUnitType() const
Return the element's type string.
Definition: Definition.h:473
A unit declaration within a UnitDef.
Definition: Definition.h:434
A unit type definition element within a Document.
Definition: Definition.h:523
static ValuePtr createValueFromStrings(const string &value, const string &type)
Create a new value instance from value and type strings.
Definition: Value.cpp:216