Skip to content

Commit 9b13158

Browse files
Merge pull request #136 from jstone-lucasfilm/dev_1.36
Updates for v1.36 release
2 parents 2853636 + b5c83b6 commit 9b13158

File tree

6 files changed

+123
-126
lines changed

6 files changed

+123
-126
lines changed

CHANGELOG.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
# Change Log
22

3-
## [1.36.0] - Development
3+
## [1.36.0] - 2018-07-23
44

5-
Updating the MaterialX library to the v1.36 specification.
5+
Updated the MaterialX library to the v1.36 specification.
66

77
### Added
88
- Added support for Element namespaces.
99
- Added support for NodeDef inheritance.
10+
- Added support for root-level node elements.
1011
- Added support for inheritance attributes on MaterialX\:\:Material and MaterialX\:\:Look.
1112
- Added support for include and exclude attributes on MaterialX\:\:Collection.
12-
- Added support for root-level node elements.
1313
- Added the MaterialX\:\:Token class for string substitutions.
1414
- Added the MaterialX\:\:Variant, MaterialX\:\:VariantSet, and MaterialX\:\:VariantAssign classes.
1515
- Added the MaterialX\:\:GeomPath class for geometry name comparisons.

documents/Examples/NodeGraphs.mtlx

Lines changed: 94 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,99 +1,105 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<materialx version="1.36">
33
<!-- "nodegraph1" example from Spec doc -->
4-
<image name="img1" type="color3">
5-
<parameter name="file" type="filename" value="layer1.tif"/>
6-
</image>
7-
<image name="img2" type="color3">
8-
<parameter name="file" type="filename" value="layer2.tif"/>
9-
</image>
10-
<image name="img3" type="float">
11-
<parameter name="file" type="filename" value="mask1.tif"/>
12-
</image>
13-
<mix name="n0" type="color3">
14-
<input name="fg" type="color3" nodename="img1"/>
15-
<input name="bg" type="color3" nodename="img2"/>
16-
<input name="mix" type="float" nodename="img3"/>
17-
</mix>
18-
<multiply name="n1" type="color3">
19-
<input name="in1" type="color3" nodename="n0"/>
20-
<input name="in2" type="float" value="0.22"/>
21-
</multiply>
22-
<output name="diffuse" type="color3" nodename="n1"/>
4+
<nodegraph name="NG_example1">
5+
<image name="img1" type="color3">
6+
<parameter name="file" type="filename" value="layer1.tif"/>
7+
</image>
8+
<image name="img2" type="color3">
9+
<parameter name="file" type="filename" value="layer2.tif"/>
10+
</image>
11+
<image name="img3" type="float">
12+
<parameter name="file" type="filename" value="mask1.tif"/>
13+
</image>
14+
<mix name="n0" type="color3">
15+
<input name="fg" type="color3" nodename="img1"/>
16+
<input name="bg" type="color3" nodename="img2"/>
17+
<input name="mix" type="float" nodename="img3"/>
18+
</mix>
19+
<multiply name="n1" type="color3">
20+
<input name="in1" type="color3" nodename="n0"/>
21+
<input name="in2" type="float" value="0.22"/>
22+
</multiply>
23+
<output name="diffuse" type="color3" nodename="n1"/>
24+
</nodegraph>
2325

2426
<!-- "nodegraph2" example from Spec doc -->
25-
<image name="img1" type="color3">
26-
<parameter name="file" type="filename" value="multilayer.tif"/>
27-
<parameter name="layer" type="string" value="diffuse1"/>
28-
</image>
29-
<image name="img2" type="color3">
30-
<parameter name="file" type="filename" value="multilayer.tif"/>
31-
<parameter name="layer" type="string" value="diffuse2"/>
32-
</image>
33-
<image name="img3" type="float">
34-
<parameter name="file" type="filename" value="multilayer.tif"/>
35-
<parameter name="layer" type="string" value="areamask"/>
36-
</image>
37-
<mix name="n3" type="color3">
38-
<input name="fg" type="color3" nodename="img1"/>
39-
<input name="bg" type="color3" nodename="img2"/>
40-
<input name="mix" type="float" nodename="img3"/>
41-
</mix>
42-
<multiply name="n4" type="color3">
43-
<input name="in1" type="color3" nodename="n3"/>
44-
<input name="in2" type="float" value="0.22"/>
45-
</multiply>
46-
<output name="diffuse" type="color3" nodename="n4"/>
27+
<nodegraph name="NG_example2">
28+
<image name="img1" type="color3">
29+
<parameter name="file" type="filename" value="multilayer.tif"/>
30+
<parameter name="layer" type="string" value="diffuse1"/>
31+
</image>
32+
<image name="img2" type="color3">
33+
<parameter name="file" type="filename" value="multilayer.tif"/>
34+
<parameter name="layer" type="string" value="diffuse2"/>
35+
</image>
36+
<image name="img3" type="float">
37+
<parameter name="file" type="filename" value="multilayer.tif"/>
38+
<parameter name="layer" type="string" value="areamask"/>
39+
</image>
40+
<mix name="n3" type="color3">
41+
<input name="fg" type="color3" nodename="img1"/>
42+
<input name="bg" type="color3" nodename="img2"/>
43+
<input name="mix" type="float" nodename="img3"/>
44+
</mix>
45+
<multiply name="n4" type="color3">
46+
<input name="in1" type="color3" nodename="n3"/>
47+
<input name="in2" type="float" value="0.22"/>
48+
</multiply>
49+
<output name="diffuse" type="color3" nodename="n4"/>
50+
</nodegraph>
4751

4852
<!-- "nodegraph3" example from Spec doc -->
4953
<!-- Note: <geominfo> elements would be needed somewhere to define <diff_albedo> etc.
5054
token values for each geometry -->
51-
<image name="img1" type="color3">
52-
<parameter name="file" type="filename" value="<diff_albedo>"/>
53-
</image>
54-
<image name="img2" type="color3">
55-
<parameter name="file" type="filename" value="<dirt_albedo>"/>
56-
</image>
57-
<image name="img3" type="float">
58-
<parameter name="file" type="filename" value="<areamask>"/>
55+
<nodegraph name="NG_example3">
56+
<image name="img1" type="color3">
57+
<parameter name="file" type="filename" value="<diff_albedo>"/>
58+
</image>
59+
<image name="img2" type="color3">
60+
<parameter name="file" type="filename" value="<dirt_albedo>"/>
61+
</image>
62+
<image name="img3" type="float">
63+
<parameter name="file" type="filename" value="<areamask>"/>
64+
</image>
65+
<image name="img4" type="float">
66+
<parameter name="file" type="filename" value="<noisemask>"/>
5967
</image>
60-
<image name="img4" type="float">
61-
<parameter name="file" type="filename" value="<noisemask>"/>
62-
</image>
63-
<constant name="n5" type="color3">
64-
<parameter name="value" type="color3" value="0.8,1.0,1.3"/>
65-
</constant>
66-
<multiply name="n6" type="color3">
67-
<input name="in1" type="color3" nodename="n5"/>
68-
<input name="in2" type="color3" nodename="img1"/>
69-
</multiply>
70-
<contrast name="n7" type="color3">
71-
<input name="in" type="color3" nodename="img2"/>
72-
<parameter name="amount" type="float" value="0.2"/>
73-
<parameter name="pivot" type="float" value="0.5"/>
74-
</contrast>
75-
<mix name="n8" type="color3">
76-
<input name="fg" type="color3" nodename="n7"/>
77-
<input name="bg" type="color3" nodename="n6"/>
78-
<input name="mix" type="float" nodename="img3"/>
79-
</mix>
80-
<texcoord name="t1" type="vector2"/>
81-
<multiply name="m1" type="vector2">
82-
<input name="in" type="vector2" nodename="t1"/>
83-
<parameter name="amount" type="float" value="0.003"/>
84-
</multiply>
85-
<noise2d name="n9" type="color3">
86-
<input name="texcoord" type="vector2" nodename="m1"/>
87-
<parameter name="amplitude" type="vector3" value="0.05,0.04,0.06"/>
88-
</noise2d>
89-
<inside name="n10" type="color3">
90-
<input name="mask" type="float" nodename="img4"/>
91-
<input name="in" type="color3" nodename="n9"/>
92-
</inside>
93-
<add name="n11" type="color3">
94-
<input name="in1" type="color3" nodename="n10"/>
95-
<input name="in2" type="color3" nodename="n8"/>
96-
</add>
97-
<output name="albedo" type="color3" nodename="n11"/>
98-
<output name="areamask" type="float" nodename="img3"/>
68+
<constant name="n5" type="color3">
69+
<parameter name="value" type="color3" value="0.8,1.0,1.3"/>
70+
</constant>
71+
<multiply name="n6" type="color3">
72+
<input name="in1" type="color3" nodename="n5"/>
73+
<input name="in2" type="color3" nodename="img1"/>
74+
</multiply>
75+
<contrast name="n7" type="color3">
76+
<input name="in" type="color3" nodename="img2"/>
77+
<parameter name="amount" type="float" value="0.2"/>
78+
<parameter name="pivot" type="float" value="0.5"/>
79+
</contrast>
80+
<mix name="n8" type="color3">
81+
<input name="fg" type="color3" nodename="n7"/>
82+
<input name="bg" type="color3" nodename="n6"/>
83+
<input name="mix" type="float" nodename="img3"/>
84+
</mix>
85+
<texcoord name="t1" type="vector2"/>
86+
<multiply name="m1" type="vector2">
87+
<input name="in" type="vector2" nodename="t1"/>
88+
<parameter name="amount" type="float" value="0.003"/>
89+
</multiply>
90+
<noise2d name="n9" type="color3">
91+
<input name="texcoord" type="vector2" nodename="m1"/>
92+
<parameter name="amplitude" type="vector3" value="0.05,0.04,0.06"/>
93+
</noise2d>
94+
<inside name="n10" type="color3">
95+
<input name="mask" type="float" nodename="img4"/>
96+
<input name="in" type="color3" nodename="n9"/>
97+
</inside>
98+
<add name="n11" type="color3">
99+
<input name="in1" type="color3" nodename="n10"/>
100+
<input name="in2" type="color3" nodename="n8"/>
101+
</add>
102+
<output name="albedo" type="color3" nodename="n11"/>
103+
<output name="areamask" type="float" nodename="img3"/>
104+
</nodegraph>
99105
</materialx>
-760 KB
Binary file not shown.
748 KB
Binary file not shown.

python/MaterialXTest/main.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
'Looks.mtlx',
3636
'MaterialBasic.mtlx',
3737
'MultiOutput.mtlx',
38+
'NodeGraphs.mtlx',
3839
'PaintMaterials.mtlx',
3940
'PostShaderComposite.mtlx',
4041
'PreShaderComposite.mtlx',
@@ -493,17 +494,11 @@ def test_ReadXml(self):
493494
doc2.importLibrary(lib)
494495
self.assertTrue(doc2.validate()[0])
495496

496-
# Verify that all referenced nodes are declared and implemented.
497-
for elem in doc2.traverseTree():
498-
if elem.isA(mx.Node):
499-
self.assertTrue(elem.getNodeDef())
500-
self.assertTrue(elem.getImplementation())
501-
502497
# Read the same document twice with duplicate elements skipped.
503498
doc = mx.createDocument()
504499
readOptions = mx.XmlReadOptions()
505500
readOptions.skipDuplicateElements = True
506-
filename = 'PaintMaterials.mtlx'
501+
filename = 'PostShaderComposite.mtlx'
507502
mx.readFromXmlFile(doc, filename, _searchPath, readOptions)
508503
mx.readFromXmlFile(doc, filename, _searchPath, readOptions)
509504
self.assertTrue(doc.validate()[0])

source/MaterialXTest/XmlIo.cpp

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ TEST_CASE("Load content", "[xmlio]")
2323
"Looks.mtlx",
2424
"MaterialBasic.mtlx",
2525
"MultiOutput.mtlx",
26+
"NodeGraphs.mtlx",
2627
"PaintMaterials.mtlx",
2728
"PostShaderComposite.mtlx",
2829
"PreShaderComposite.mtlx",
@@ -107,6 +108,17 @@ TEST_CASE("Load content", "[xmlio]")
107108
}
108109
REQUIRE(doc->validate());
109110

111+
// Flatten subgraph references.
112+
for (mx::NodeGraphPtr nodeGraph : doc->getNodeGraphs())
113+
{
114+
if (!firstExample && nodeGraph->getActiveSourceUri() != doc->getSourceUri())
115+
{
116+
continue;
117+
}
118+
nodeGraph->flattenSubgraphs();
119+
REQUIRE(nodeGraph->validate());
120+
}
121+
110122
// Verify that all referenced types and nodes are declared, and that
111123
// referenced node declarations are implemented.
112124
bool referencesValid = true;
@@ -143,17 +155,6 @@ TEST_CASE("Load content", "[xmlio]")
143155
}
144156
REQUIRE(referencesValid);
145157

146-
// Flatten subgraph references.
147-
for (mx::NodeGraphPtr nodeGraph : doc->getNodeGraphs())
148-
{
149-
if (!firstExample && nodeGraph->getActiveSourceUri() != doc->getSourceUri())
150-
{
151-
continue;
152-
}
153-
nodeGraph->flattenSubgraphs();
154-
}
155-
REQUIRE(doc->validate());
156-
157158
firstExample = false;
158159
}
159160

@@ -167,30 +168,25 @@ TEST_CASE("Load content", "[xmlio]")
167168
REQUIRE(doc->validate());
168169

169170
// Read document without XIncludes.
170-
mx::DocumentPtr doc2 = mx::createDocument();
171-
mx::XmlReadOptions readOptions2;
172-
readOptions2.readXIncludes = false;
173-
mx::readFromXmlFile(doc2, filename, searchPath, &readOptions2);
174-
REQUIRE(*doc2 != *doc);
175-
176-
// Serialize to XML and reconstruct.
177-
std::string xmlString = mx::writeToXmlString(doc2);
178-
mx::DocumentPtr doc3 = mx::createDocument();
179-
mx::readFromXmlString(doc3, xmlString, &readOptions2);
180-
REQUIRE(*doc3 == *doc2);
171+
mx::DocumentPtr flatDoc = mx::createDocument();
172+
readOptions = mx::XmlReadOptions();
173+
readOptions.readXIncludes = false;
174+
mx::readFromXmlFile(flatDoc, filename, searchPath, &readOptions);
175+
REQUIRE(*flatDoc != *doc);
181176

182177
// Serialize to XML with a custom predicate that skips images.
183178
auto skipImages = [](mx::ElementPtr elem)
184179
{
185180
return !elem->isA<mx::Node>("image");
186181
};
187-
xmlString = mx::writeToXmlString(doc, false, skipImages);
182+
std::string xmlString = mx::writeToXmlString(doc, false, skipImages);
188183

189184
// Reconstruct and verify that the document contains no images.
190-
mx::DocumentPtr doc4 = mx::createDocument();
191-
mx::readFromXmlString(doc4, xmlString);
185+
mx::DocumentPtr writtenDoc = mx::createDocument();
186+
mx::readFromXmlString(writtenDoc, xmlString);
187+
REQUIRE(*writtenDoc != *doc);
192188
unsigned imageElementCount = 0;
193-
for (mx::ElementPtr elem : doc4->traverseTree())
189+
for (mx::ElementPtr elem : writtenDoc->traverseTree())
194190
{
195191
if (elem->isA<mx::Node>("image"))
196192
{
@@ -200,6 +196,6 @@ TEST_CASE("Load content", "[xmlio]")
200196
REQUIRE(imageElementCount == 0);
201197

202198
// Read a non-existent document.
203-
mx::DocumentPtr doc5 = mx::createDocument();
204-
REQUIRE_THROWS_AS(mx::readFromXmlFile(doc5, "NonExistent.mtlx"), mx::ExceptionFileMissing&);
199+
mx::DocumentPtr nonExistentDoc = mx::createDocument();
200+
REQUIRE_THROWS_AS(mx::readFromXmlFile(nonExistentDoc, "NonExistent.mtlx"), mx::ExceptionFileMissing&);
205201
}

0 commit comments

Comments
 (0)