forked from autodesk-forks/MaterialX
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDefinition.cpp
150 lines (130 loc) · 4.19 KB
/
Definition.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
//
// TM & (c) 2017 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd.
// All rights reserved. See LICENSE.txt for license.
//
#include <MaterialXCore/Definition.h>
#include <MaterialXCore/Document.h>
namespace MaterialX
{
const string COLOR_SEMANTIC = "color";
const string SHADER_SEMANTIC = "shader";
const string TEXTURE_NODE_GROUP = "texture";
const string PROCEDURAL_NODE_GROUP = "procedural";
const string GEOMETRIC_NODE_GROUP = "geometric";
const string ADJUSTMENT_NODE_GROUP = "adjustment";
const string CONDITIONAL_NODE_GROUP = "conditional";
const string NodeDef::NODE_ATTRIBUTE = "node";
const string NodeDef::NODE_GROUP_ATTRIBUTE = "nodegroup";
const string TypeDef::SEMANTIC_ATTRIBUTE = "semantic";
const string TypeDef::CONTEXT_ATTRIBUTE = "context";
const string Implementation::FILE_ATTRIBUTE = "file";
const string Implementation::FUNCTION_ATTRIBUTE = "function";
const string Implementation::LANGUAGE_ATTRIBUTE = "language";
//
// NodeDef methods
//
InterfaceElementPtr NodeDef::getImplementation(const string& target, const string& language) const
{
vector<InterfaceElementPtr> interfaces = getDocument()->getMatchingImplementations(getQualifiedName(getName()));
vector<InterfaceElementPtr> secondary = getDocument()->getMatchingImplementations(getName());
interfaces.insert(interfaces.end(), secondary.begin(), secondary.end());
// Search for the first implementation which matches a given language string.
// If no language is specified then return the first implementation found.
bool matchLanguage = !language.empty();
for (InterfaceElementPtr interface : interfaces)
{
ImplementationPtr implement = interface->asA<Implementation>();
if (!implement||
!targetStringsMatch(interface->getTarget(), target) ||
!isVersionCompatible(interface))
{
continue;
}
if (!matchLanguage ||
implement->getLanguage() == language)
{
return interface;
}
}
// Search for a node graph match if no implementation match was found.
// There is no language check as node graphs are considered to be language independent.
for (InterfaceElementPtr interface : interfaces)
{
if (interface->isA<Implementation>() ||
!targetStringsMatch(interface->getTarget(), target) ||
!isVersionCompatible(interface))
{
continue;
}
return interface;
}
return InterfaceElementPtr();
}
vector<ShaderRefPtr> NodeDef::getInstantiatingShaderRefs() const
{
vector<ShaderRefPtr> shaderRefs;
for (MaterialPtr mat : getDocument()->getMaterials())
{
for (ShaderRefPtr shaderRef : mat->getShaderRefs())
{
if (shaderRef->getNodeDef()->hasInheritedBase(getSelf()))
{
shaderRefs.push_back(shaderRef);
}
}
}
return shaderRefs;
}
bool NodeDef::validate(string* message) const
{
bool res = true;
validateRequire(hasType(), res, message, "Missing type");
if (isMultiOutputType())
{
validateRequire(getOutputCount() >= 2, res, message, "Multioutput nodedefs must have two or more output ports");
}
else
{
validateRequire(getOutputCount() == 0, res, message, "Only multioutput nodedefs support output ports");
}
return InterfaceElement::validate(message) && res;
}
bool NodeDef::isVersionCompatible(ConstElementPtr elem) const
{
if (getVersionIntegers() == elem->getVersionIntegers())
{
return true;
}
if (getDefaultVersion() && !elem->hasVersionString())
{
return true;
}
return false;
}
ConstNodeDefPtr NodeDef::getDeclaration(const string&) const
{
return getSelf()->asA<NodeDef>();
}
//
// Implementation methods
//
void Implementation::setNodeDef(ConstNodeDefPtr nodeDef)
{
if (nodeDef)
{
setNodeDefString(nodeDef->getName());
}
else
{
removeAttribute(NODE_DEF_ATTRIBUTE);
}
}
NodeDefPtr Implementation::getNodeDef() const
{
return resolveRootNameReference<NodeDef>(getNodeDefString());
}
ConstNodeDefPtr Implementation::getDeclaration(const string&) const
{
return getNodeDef();
}
} // namespace MaterialX