Skip to content

Commit cdaa343

Browse files
authored
Merge branch 'AcademySoftwareFoundation:main' into editor_capture
2 parents 14b73c4 + 2febdcd commit cdaa343

145 files changed

Lines changed: 2828 additions & 1625 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/main.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -309,15 +309,15 @@ jobs:
309309
run: |
310310
git clone https://github.com/emscripten-core/emsdk --recursive
311311
cd emsdk
312-
./emsdk install 2.0.20
313-
./emsdk activate 2.0.20
312+
./emsdk install 4.0.8
313+
./emsdk activate 4.0.8
314314
source ./emsdk_env.sh
315315
echo "EMSDK=$EMSDK" >> $GITHUB_ENV
316316
317317
- name: Install Node
318318
uses: actions/setup-node@v4
319319
with:
320-
node-version: '16'
320+
node-version: '22.16.0'
321321

322322
- name: JavaScript CMake Generate
323323
run: cmake -S . -B javascript/build -DMATERIALX_BUILD_JS=ON -DMATERIALX_EMSDK_PATH=${{ env.EMSDK }}

CMakeLists.txt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ if(MSVC)
287287
add_compile_options(/WX)
288288
endif()
289289
else()
290-
add_compile_options(-Wall -Wno-missing-braces)
290+
add_compile_options(-Wall -Wunused-parameter -Wno-missing-braces)
291291
if(MATERIALX_WARNINGS_AS_ERRORS)
292292
add_compile_options(-Werror)
293293
endif()
@@ -301,7 +301,12 @@ else()
301301
add_link_options(${DYNAMIC_ANALYSIS_OPTIONS})
302302
endif()
303303
if(MATERIALX_BUILD_JS)
304-
add_compile_options(-fexceptions)
304+
if (CMAKE_BUILD_TYPE MATCHES Debug)
305+
add_compile_options(-fexceptions)
306+
else()
307+
add_compile_options(-fexceptions -Os -flto)
308+
add_link_options(-flto)
309+
endif()
305310
endif()
306311
endif()
307312
@@ -450,6 +455,10 @@ add_subdirectory(source/MaterialXFormat)
450455
# Add shader generation subdirectories
451456
add_subdirectory(source/MaterialXGenShader)
452457
if(MATERIALX_BUILD_GEN_GLSL OR MATERIALX_BUILD_GEN_OSL OR MATERIALX_BUILD_GEN_MDL OR MATERIALX_BUILD_GEN_MSL)
458+
if(MATERIALX_BUILD_GEN_GLSL OR MATERIALX_BUILD_GEN_MSL)
459+
add_subdirectory(source/MaterialXGenHw)
460+
endif()
461+
453462
if (MATERIALX_BUILD_GEN_GLSL)
454463
add_definitions(-DMATERIALX_BUILD_GEN_GLSL)
455464
add_subdirectory(source/MaterialXGenGlsl)

javascript/MaterialXTest/browser/karma.conf.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,15 @@ module.exports = function (config)
3333
'karma-mocha',
3434
'karma-mocha-reporter',
3535
],
36+
customLaunchers: {
37+
ChromeHeadlessGL: {
38+
base: 'Chrome',
39+
flags: [
40+
'--headless=new',
41+
'--enable-gpu',
42+
'--enable-webgl',
43+
],
44+
},
45+
},
3646
});
3747
};

javascript/MaterialXTest/browser/shaderGenerator.spec.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ function createStandardSurfaceMaterial(mx)
1212
shaderElement.setType('surfaceshader');
1313
shaderElement.setNodeName(ssName);
1414
expect(doc.validate()).to.be.true;
15+
// Release local wrappers
16+
shaderElement.delete();
17+
smNode.delete();
18+
ssNode.delete();
1519
return doc;
1620
}
1721

@@ -94,13 +98,32 @@ describe('Generate Shaders', function ()
9498
console.error("--- PIXEL SHADER END ---");
9599
}
96100
expect(gl.getShaderParameter(glPixelShader, gl.COMPILE_STATUS)).to.equal(true);
101+
// Cleanup GL shaders
102+
gl.deleteShader(glVertexShader);
103+
gl.deleteShader(glPixelShader);
97104
}
105+
// Cleanup shader wrapper
106+
mxShader.delete();
98107
}
99108
catch (errPtr)
100109
{
101110
console.error("-------- Failed code generation: ----------------");
102-
console.error(mx.getExceptionMessage(errPtr));
111+
if (typeof mx.getExceptionMessage === 'function')
112+
{
113+
console.error(mx.getExceptionMessage(errPtr));
114+
}
115+
else
116+
{
117+
console.error(errPtr);
118+
}
103119
}
120+
// Cleanup per-generator wrappers
121+
stdlib.delete();
122+
genContext.delete();
123+
gen.delete();
104124
}
125+
// Cleanup element and document
126+
elem.delete();
127+
doc.delete();
105128
});
106129
});

javascript/MaterialXTest/codeExamples.spec.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,12 @@ describe('Code Examples', () =>
7676

7777
// // Validate the value of roughness in the context of this material.
7878
// expect(roughness.getBoundValue(material).getValueString()).to.equal('0.5');
79+
// Cleanup wrappers
80+
nodeDefs.forEach(nd => nd.delete());
81+
output.delete();
82+
image.delete();
83+
nodeGraph.delete();
84+
doc.delete();
7985
});
8086

8187
it('Traversing a Document Tree', async () =>
@@ -101,6 +107,7 @@ describe('Code Examples', () =>
101107
}
102108
}
103109
expect(imageCount).to.greaterThan(0);
110+
doc.delete();
104111
});
105112

106113
it('Building a MaterialX Document', async () =>
@@ -133,5 +140,6 @@ describe('Code Examples', () =>
133140

134141
// expect(materialCount).to.equal(0);
135142
// expect(shaderInputCount).to.equal(0);
143+
doc.delete();
136144
});
137145
});

javascript/MaterialXTest/customBindings.spec.js

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,20 @@ describe('Custom Bindings', () =>
3030

3131
// Omitting non-optional parameter should throw
3232
expect(() => { nodeGraph.addNode(); }).to.throw;
33+
34+
// Cleanup
35+
node.delete();
36+
nodeGraph2.delete();
37+
nodeGraph.delete();
38+
doc.delete();
3339
});
3440

3541
it('Vector <-> Array conversion', () =>
3642
{
3743
// Functions that return vectors in C++ should return an array in JS
3844
const doc = mx.createDocument();
3945
const nodeGraph = doc.addNodeGraph();
40-
doc.addNodeGraph();
46+
const nodeGraphB = doc.addNodeGraph();
4147
const nodeGraphs = doc.getNodeGraphs();
4248
expect(nodeGraphs).to.be.an.instanceof(Array);
4349
expect(nodeGraphs.length).to.equal(2);
@@ -68,6 +74,16 @@ describe('Custom Bindings', () =>
6874
expect(nodes[0].getName()).to.equal('node1'); // Name auto-constructed from category
6975
expect(nodes[1].getName()).to.equal('node2'); // Name auto-constructed from category
7076
expect(nodes[2].getName()).to.equal('anotherNode'); // Name set explicitly at creation time
77+
78+
// Cleanup created wrappers
79+
nodes.forEach(n => n.delete());
80+
backdrop.delete();
81+
node3.delete();
82+
node2.delete();
83+
node1.delete();
84+
nodeGraphB.delete();
85+
nodeGraph.delete();
86+
doc.delete();
7187
});
7288

7389
it('C++ exception handling', () =>
@@ -81,17 +97,20 @@ describe('Custom Bindings', () =>
8197
expect(nodeGraph1.hasInheritanceCycle()).to.not.throw;
8298
expect(nodeGraph1.hasInheritanceCycle()).to.be.true;
8399

84-
// Exceptions that are not caught in C++ should throw with an exception pointer
100+
// Exceptions that are not caught in C++ should throw
85101
nodeGraph1.addNode('node', 'node1');
86102
expect(() => { nodeGraph1.addNode('node', 'node1'); }).to.throw;
87103
try
88104
{
89105
nodeGraph1.addNode('node', 'node1');
90-
} catch (errPtr)
106+
} catch (err)
91107
{
92-
expect(errPtr).to.be.a('number');
93-
expect(mx.getExceptionMessage(errPtr)).to.be.a('string');
108+
expect(mx.getExceptionMessage(err)).to.be.a('string');
94109
}
110+
// Cleanup
111+
nodeGraph2.delete();
112+
nodeGraph1.delete();
113+
doc.delete();
95114
});
96115

97116
it('getReferencedSourceUris', async () =>
@@ -104,6 +123,7 @@ describe('Custom Bindings', () =>
104123
expect(sourceUris.length).to.equal(3);
105124
expect(sourceUris[0]).to.be.a('string');
106125
expect(sourceUris.includes('standard_surface_brass_tiled.mtlx')).to.be.true;
126+
doc.delete();
107127
});
108128

109129
it('Should invoke correct instance of \'validate\'', () =>
@@ -133,6 +153,11 @@ describe('Custom Bindings', () =>
133153
expect(token.validate()).to.be.false;
134154
expect(token.validate(message)).to.be.false;
135155
expect(message.message).to.include('Unit type definition does not exist in document')
156+
157+
// Cleanup
158+
token.delete();
159+
node.delete();
160+
doc.delete();
136161
});
137162

138163
it('StringResolver name substitution getters', () =>
@@ -164,6 +189,7 @@ describe('Custom Bindings', () =>
164189
expect(gnSubs).to.be.instanceof(Object);
165190
expect(Object.keys(gnSubs).length).to.equal(2);
166191
expect(gnSubs).to.deep.equal(gnTestData);
192+
resolver.delete();
167193
});
168194

169195
it('getShaderNodes', async () =>
@@ -184,6 +210,11 @@ describe('Custom Bindings', () =>
184210
shaderNodes = mx.getShaderNodes(matNode, mx.DISPLACEMENT_SHADER_TYPE_STRING);
185211
expect(shaderNodes).to.be.instanceof(Array);
186212
expect(shaderNodes.length).to.equal(0);
213+
214+
// Cleanup wrappers
215+
shaderNodes.forEach(s => s.delete());
216+
matNodes.forEach(n => n.delete());
217+
doc.delete();
187218
});
188219

189220
it('createValidName', () =>
@@ -211,6 +242,7 @@ describe('Custom Bindings', () =>
211242
expect(docVersion).to.be.instanceof(Array);
212243
expect(docVersion.length).to.equal(2);
213244
expect(docVersion).to.deep.equal(versionStringArr);
245+
doc.delete();
214246

215247
// InterfaceElement.getVersionIntegers (via NodeDef)
216248
// TODO: This function can currently not be called, since we have a linker issue that messes up this function.

javascript/MaterialXTest/document.spec.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,5 +162,27 @@ describe('Document', () =>
162162
output2.setConnectedNode(null);
163163
expect(output1.getConnectedNode()).to.equal(null);
164164
expect(output2.getConnectedNode()).to.equal(null);
165+
// Cleanup created wrappers
166+
propertySetAssign.delete();
167+
propertySet.delete();
168+
propertyAssign.delete();
169+
variantSet.delete();
170+
collection.delete();
171+
matAssign2.delete();
172+
matAssign1.delete();
173+
look.delete();
174+
instanceRoughness.delete();
175+
shaderNode.delete();
176+
materialNode.delete();
177+
simpleSrf.delete();
178+
output2.delete();
179+
output1.delete();
180+
custom.delete();
181+
color.delete();
182+
image.delete();
183+
constant.delete();
184+
nodeDef.delete();
185+
nodeGraph.delete();
186+
doc.delete();
165187
});
166188
});

javascript/MaterialXTest/element.spec.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ describe('Element', () =>
3131
};
3232
});
3333

34+
after(() =>
35+
{
36+
// Cleanup typed helper objects and document
37+
Object.values(valueTypes).forEach(v => v.delete());
38+
doc.delete();
39+
});
40+
3441
describe('value setters', () =>
3542
{
3643
const checkValue = (types, assertionCallback) =>
@@ -42,6 +49,7 @@ describe('Element', () =>
4249
elem[setFn](types[typeName]);
4350
assertionCallback(elem.getValue().getData(), typeName);
4451
});
52+
elem.delete();
4553
};
4654

4755
it('should work with expected type', () =>
@@ -80,6 +88,7 @@ describe('Element', () =>
8088
elem[setFn](typeName, types[typeName]);
8189
assertionCallback(elem[getFn](typeName), types[typeName]);
8290
});
91+
elem.delete();
8392
};
8493

8594
it('should work with expected custom type', () =>
@@ -162,6 +171,7 @@ describe('Element', () =>
162171
expect(doc[specializedFn]()).to.be.an.instanceof(specialElemType[typeName]);
163172
expect(doc.addChildOfCategory(factoryName)).to.be.an.instanceof(specialElemType[typeName]);
164173
});
174+
// No doc.delete() here; cleaned up in after()
165175
});
166176
});
167177

0 commit comments

Comments
 (0)