@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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@needle-tools/materialx",
3
- "version": "1.3.1",
3
+ "version": "1.3.3-next.dae2798",
4
4
  "type": "module",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -56,4 +56,4 @@
56
56
  "mtlx",
57
57
  "rendering"
58
58
  ]
59
- }
59
+ }
@@ -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} materialNodeName
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, materialNodeName, loaders, options, context) {
208
+ export async function createMaterialXMaterial(mtlx, materialNodeNameOrIndex, loaders, options, context) {
206
209
  try {
207
- if (debug) console.log(`Creating MaterialX material: ${materialNodeName}`);
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_${materialNodeName}`;
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 == materialNodeName) {
237
- materialNodeName = name;
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 (${materialNodeName})`);
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 = `MaterialX_NoRenderable_${materialNodeName}`;
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: materialNodeName,
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 (${materialNodeName}):`, error);
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_${materialNodeName}`;
345
+ fallbackMaterial.name = `MaterialX_Error_${materialNodeNameOrIndex}`;
336
346
  return fallbackMaterial;
337
347
  }
338
348
  }