@needle-tools/materialx 1.3.1 → 1.3.3-next.dae2798
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3 -0
- package/package.json +2 -2
- package/src/loader/loader.three.js +21 -11
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,9 @@ All notable changes to this package will be documented in this file.
|
|
|
4
4
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
|
5
5
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [1.3.2] - 2025-08-12
|
|
8
|
+
- Fix: Error when MaterialX extension is not present
|
|
9
|
+
|
|
7
10
|
## [1.3.0] - 2025-08-12
|
|
8
11
|
- Change: Refactor extension to use a documents array instead of a single document, backwards compatibility is maintained
|
|
9
12
|
|
package/package.json
CHANGED
|
@@ -36,6 +36,9 @@ export class MaterialXLoader {
|
|
|
36
36
|
*/
|
|
37
37
|
get materialX_root_data() {
|
|
38
38
|
const ext = this.parser.json.extensions?.[this.name];
|
|
39
|
+
if (!ext) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
39
42
|
let result = null;
|
|
40
43
|
if ("documents" in ext && Array.isArray(ext.documents))
|
|
41
44
|
result = ext.documents;
|
|
@@ -196,22 +199,22 @@ async function load(mtlx) {
|
|
|
196
199
|
|
|
197
200
|
/**
|
|
198
201
|
* @param {string} mtlx
|
|
199
|
-
* @param {string}
|
|
202
|
+
* @param {string | number} materialNodeNameOrIndex
|
|
200
203
|
* @param {import('../materialx.helper.js').Callbacks} loaders
|
|
201
204
|
* @param {MaterialXLoaderOptions} [options]
|
|
202
205
|
* @param {import('../materialx.js').MaterialXContext} [context]
|
|
203
206
|
* @returns {Promise<Material>}
|
|
204
207
|
*/
|
|
205
|
-
export async function createMaterialXMaterial(mtlx,
|
|
208
|
+
export async function createMaterialXMaterial(mtlx, materialNodeNameOrIndex, loaders, options, context) {
|
|
206
209
|
try {
|
|
207
|
-
if (debug) console.log(`Creating MaterialX material: ${
|
|
210
|
+
if (debug) console.log(`Creating MaterialX material: ${materialNodeNameOrIndex}`);
|
|
208
211
|
|
|
209
212
|
const doc = await load(mtlx);
|
|
210
213
|
|
|
211
214
|
if (!state.materialXModule || !state.materialXGenerator || !state.materialXGenContext) {
|
|
212
215
|
console.warn("[MaterialX] WASM module not ready, returning fallback material");
|
|
213
216
|
const fallbackMaterial = new MeshStandardMaterial();
|
|
214
|
-
fallbackMaterial.name = `MaterialX_Fallback_${
|
|
217
|
+
fallbackMaterial.name = `MaterialX_Fallback_${materialNodeNameOrIndex}`;
|
|
215
218
|
return fallbackMaterial;
|
|
216
219
|
}
|
|
217
220
|
|
|
@@ -233,8 +236,8 @@ export async function createMaterialXMaterial(mtlx, materialNodeName, loaders, o
|
|
|
233
236
|
if (debug) console.log(`[MaterialX] Scan material[${i}]: ${name}`);
|
|
234
237
|
|
|
235
238
|
// Find the matching material
|
|
236
|
-
if (materialNodes.length === 1 || name ==
|
|
237
|
-
|
|
239
|
+
if (materialNodes.length === 1 || name == materialNodeNameOrIndex || i === materialNodeNameOrIndex) {
|
|
240
|
+
materialNodeNameOrIndex = name;
|
|
238
241
|
renderableElement = materialNode;
|
|
239
242
|
foundRenderable = true;
|
|
240
243
|
if (debug) console.log(`[MaterialX] Use material node: '${name}'`);
|
|
@@ -291,10 +294,17 @@ export async function createMaterialXMaterial(mtlx, materialNodeName, loaders, o
|
|
|
291
294
|
*/
|
|
292
295
|
|
|
293
296
|
if (!renderableElement) {
|
|
294
|
-
console.warn(`[MaterialX] No renderable element found in MaterialX document (${
|
|
297
|
+
console.warn(`[MaterialX] No renderable element found in MaterialX document (${materialNodeNameOrIndex}) → Please provide a name or index. Options: ${materialNodes.map(n => n.getNamePath()).join(", ")}`);
|
|
298
|
+
const fallbackMaterial = new MeshStandardMaterial();
|
|
299
|
+
fallbackMaterial.color.set(0xff00ff);
|
|
300
|
+
fallbackMaterial.name = `MaterialX_NoRenderable_${materialNodeNameOrIndex}`;
|
|
301
|
+
return fallbackMaterial;
|
|
302
|
+
}
|
|
303
|
+
else if(typeof materialNodeNameOrIndex === "number") {
|
|
304
|
+
console.warn(`[MaterialX] Material node not found by index (${materialNodeNameOrIndex}), using first renderable element: ${renderableElement.getNamePath()}`);
|
|
295
305
|
const fallbackMaterial = new MeshStandardMaterial();
|
|
296
306
|
fallbackMaterial.color.set(0xff00ff);
|
|
297
|
-
fallbackMaterial.name = `
|
|
307
|
+
fallbackMaterial.name = `MaterialX_NodeNotFound_${materialNodeNameOrIndex}`;
|
|
298
308
|
return fallbackMaterial;
|
|
299
309
|
}
|
|
300
310
|
|
|
@@ -311,7 +321,7 @@ export async function createMaterialXMaterial(mtlx, materialNodeName, loaders, o
|
|
|
311
321
|
const shader = state.materialXGenerator.generate(elementName, renderableElement, state.materialXGenContext);
|
|
312
322
|
|
|
313
323
|
const shaderMaterial = new MaterialXMaterial({
|
|
314
|
-
name:
|
|
324
|
+
name: materialNodeNameOrIndex,
|
|
315
325
|
shaderName: null, //shaderInfo?.originalName || shaderInfo?.name || null,
|
|
316
326
|
shader,
|
|
317
327
|
context: context || {},
|
|
@@ -328,11 +338,11 @@ export async function createMaterialXMaterial(mtlx, materialNodeName, loaders, o
|
|
|
328
338
|
|
|
329
339
|
} catch (error) {
|
|
330
340
|
// This is a wasm error (an int) that we need to resolve
|
|
331
|
-
console.error(`[MaterialX] Error creating MaterialX material (${
|
|
341
|
+
console.error(`[MaterialX] Error creating MaterialX material (${materialNodeNameOrIndex}):`, error);
|
|
332
342
|
// Return a fallback material with stored MaterialX data
|
|
333
343
|
const fallbackMaterial = new MeshStandardMaterial();
|
|
334
344
|
fallbackMaterial.color.set(0xff00ff);
|
|
335
|
-
fallbackMaterial.name = `MaterialX_Error_${
|
|
345
|
+
fallbackMaterial.name = `MaterialX_Error_${materialNodeNameOrIndex}`;
|
|
336
346
|
return fallbackMaterial;
|
|
337
347
|
}
|
|
338
348
|
}
|