@needle-tools/materialx 1.0.4-next.90b66fb → 1.0.5-next.6aa8722

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.
@@ -3,8 +3,6 @@ import { TypeStore } from "@needle-tools/engine"
3
3
 
4
4
  // Import types
5
5
  import { MaterialXMaterial } from "../src/materialx.material.js";
6
- import { MaterialXUniformUpdate } from "../src/loader/loader.needle.js";
7
6
 
8
7
  // Register types
9
8
  TypeStore.add("MaterialXMaterial", MaterialXMaterial);
10
- TypeStore.add("MaterialXUniformUpdate", MaterialXUniformUpdate);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@needle-tools/materialx",
3
- "version": "1.0.4-next.90b66fb",
3
+ "version": "1.0.5-next.6aa8722",
4
4
  "type": "module",
5
5
  "main": "index.ts",
6
6
  "exports": {
@@ -14,6 +14,10 @@
14
14
  "require": "./codegen/register_types.js"
15
15
  }
16
16
  },
17
+ "peerDependencies": {
18
+ "@needle-tools/engine": "4.x || ^4.6.0-0",
19
+ "three": "npm:@needle-tools/three@^0.169.5"
20
+ },
17
21
  "devDependencies": {
18
22
  "@needle-tools/engine": "4.x",
19
23
  "@types/three": "0.169.0",
@@ -20,6 +20,7 @@ declare type MaterialXMaterialInitParameters = {
20
20
  }
21
21
 
22
22
  type Uniforms = Record<string, IUniform & { needsUpdate?: boolean }>;
23
+ type Precision = "highp" | "mediump" | "lowp";
23
24
 
24
25
  export class MaterialXMaterial extends ShaderMaterial {
25
26
 
@@ -56,14 +57,22 @@ export class MaterialXMaterial extends ShaderMaterial {
56
57
  vertexShader = vertexShader.replace(/\bi_normal\b/g, 'normal');
57
58
  vertexShader = vertexShader.replace(/\bi_texcoord_0\b/g, 'uv');
58
59
  vertexShader = vertexShader.replace(/\bi_texcoord_1\b/g, 'uv1');
60
+ vertexShader = vertexShader.replace(/\bi_texcoord_2\b/g, 'uv2');
61
+ vertexShader = vertexShader.replace(/\bi_texcoord_3\b/g, 'uv3');
59
62
  vertexShader = vertexShader.replace(/\bi_tangent\b/g, 'tangent');
60
63
  vertexShader = vertexShader.replace(/\bi_color_0\b/g, 'color');
61
64
 
62
65
  // Patch fragmentShader
66
+ const precision = init.context.getRenderer().capabilities.getMaxPrecision("highp") as Precision;
67
+ fragmentShader = fragmentShader.replace(/precision mediump float;/g, `precision ${precision} float;`);
68
+ fragmentShader = fragmentShader.replace(/#define M_FLOAT_EPS 1e-8/g, precision === "highp" ? `#define M_FLOAT_EPS 1e-8` : `#define M_FLOAT_EPS 1e-3`);
69
+
63
70
  fragmentShader = fragmentShader.replace(/\bi_position\b/g, 'position');
64
71
  fragmentShader = fragmentShader.replace(/\bi_normal\b/g, 'normal');
65
72
  fragmentShader = fragmentShader.replace(/\bi_texcoord_0\b/g, 'uv');
66
73
  fragmentShader = fragmentShader.replace(/\bi_texcoord_1\b/g, 'uv1');
74
+ fragmentShader = fragmentShader.replace(/\bi_texcoord_2\b/g, 'uv2');
75
+ fragmentShader = fragmentShader.replace(/\bi_texcoord_3\b/g, 'uv3');
67
76
  fragmentShader = fragmentShader.replace(/\bi_tangent\b/g, 'tangent');
68
77
  fragmentShader = fragmentShader.replace(/\bi_color_0\b/g, 'color');
69
78
 
@@ -71,13 +80,23 @@ export class MaterialXMaterial extends ShaderMaterial {
71
80
  vertexShader = vertexShader.replace(/in\s+vec3\s+position;/g, '');
72
81
  vertexShader = vertexShader.replace(/in\s+vec3\s+normal;/g, '');
73
82
  vertexShader = vertexShader.replace(/in\s+vec3\s+uv;/g, '');
83
+ var hasUv1 = vertexShader.includes('in vec3 uv1;');
74
84
  vertexShader = vertexShader.replace(/in\s+vec3\s+uv1;/g, '');
85
+ var hasUv2 = vertexShader.includes('in vec3 uv2;');
86
+ vertexShader = vertexShader.replace(/in\s+vec3\s+uv2;/g, '');
87
+ var hasUv3 = vertexShader.includes('in vec3 uv3;');
88
+ vertexShader = vertexShader.replace(/in\s+vec3\s+uv3;/g, '');
89
+ var hasTangent = vertexShader.includes('in vec4 tangent;');
75
90
  vertexShader = vertexShader.replace(/in\s+vec4\s+tangent;/g, '');
91
+ var hasColor = vertexShader.includes('in vec4 color;');
76
92
  vertexShader = vertexShader.replace(/in\s+vec4\s+color;/g, '');
77
93
 
78
94
  // Patch uv 2-component to 3-component (`texcoord_0 = uv;` needs to be replaced with `texcoord_0 = vec3(uv, 0.0);`)
79
95
  // TODO what if we actually have a 3-component UV? Not sure what three.js does then
80
96
  vertexShader = vertexShader.replace(/texcoord_0 = uv;/g, 'texcoord_0 = vec3(uv, 0.0);');
97
+ vertexShader = vertexShader.replace(/texcoord_1 = uv1;/g, 'texcoord_1 = vec3(uv1, 0.0);');
98
+ vertexShader = vertexShader.replace(/texcoord_2 = uv2;/g, 'texcoord_2 = vec3(uv2, 0.0);');
99
+ vertexShader = vertexShader.replace(/texcoord_3 = uv3;/g, 'texcoord_3 = vec3(uv3, 0.0);');
81
100
 
82
101
  // Patch units – seems MaterialX uses different units and we end up with wrong light values?
83
102
  // result.direction = light.position - position;
@@ -97,6 +116,13 @@ export class MaterialXMaterial extends ShaderMaterial {
97
116
  #include <tonemapping_fragment>
98
117
  #include <colorspace_fragment>`);
99
118
 
119
+ const defines: Record<string, string> = {};
120
+ if (hasUv1) defines['USE_UV1'] = '';
121
+ if (hasUv2) defines['USE_UV2'] = '';
122
+ if (hasUv3) defines['USE_UV3'] = '';
123
+ if (hasTangent) defines['USE_TANGENT'] = '';
124
+ if (hasColor) defines['USE_COLOR'] = '';
125
+
100
126
  const searchPath = ""; // Could be derived from the asset path if needed
101
127
  const isTransparent = init.transparent ?? false;
102
128
  super({
@@ -109,6 +135,7 @@ export class MaterialXMaterial extends ShaderMaterial {
109
135
  side: init.side ? init.side : FrontSide,
110
136
  depthTest: true,
111
137
  depthWrite: !isTransparent,
138
+ defines: defines,
112
139
  });
113
140
 
114
141
  Object.assign(this.uniforms, {
@@ -133,11 +160,12 @@ export class MaterialXMaterial extends ShaderMaterial {
133
160
 
134
161
  this._context = init.context;
135
162
 
136
- if (debug) {
163
+ // if (debug)
164
+ {
137
165
  // Get lighting and environment data from MaterialX environment
138
- console.group("[MaterialX]: ", name);
139
- console.log("Vertex shader length:", vertexShader.length, vertexShader);
140
- console.log("Fragment shader length:", fragmentShader.length, fragmentShader);
166
+ console.group("[MaterialX]: ", this.name);
167
+ console.log(`Vertex shader length: ${vertexShader.length}\n`, vertexShader);
168
+ console.log(`Fragment shader length: ${fragmentShader.length}\n`, fragmentShader);
141
169
  console.groupEnd();
142
170
  }
143
171
  }
@@ -159,10 +187,6 @@ export class MaterialXMaterial extends ShaderMaterial {
159
187
 
160
188
  const uniforms = this.uniforms as Uniforms;
161
189
 
162
- // TODO remove. Not sure why this is needed, but without it
163
- // we currently get some "swimming" where matrices are not up to date.
164
- camera.updateMatrixWorld(true);
165
-
166
190
  // Update standard transformation matrices
167
191
  if (uniforms.u_worldMatrix) {
168
192
  uniforms.u_worldMatrix.value = object.matrixWorld;
package/src/materialx.ts CHANGED
@@ -2,7 +2,7 @@ import type { MaterialX as MX } from "./materialx.types.js";
2
2
  import MaterialX from "../bin/JsMaterialXGenShader.js";
3
3
  import { debug } from "./utils.js";
4
4
  import { renderPMREMToEquirect } from "./textureHelper.js";
5
- import { Light, Object3D, PMREMGenerator, Scene, Texture, WebGLRenderer } from "three";
5
+ import { Light, Mesh, MeshBasicMaterial, Object3D, PlaneGeometry, PMREMGenerator, Scene, Texture, WebGLRenderer } from "three";
6
6
  import { registerLights, getLightData, LightData } from "./materialx.helper.js";
7
7
  import type { MaterialXMaterial } from "./materialx.material.js";
8
8
 
@@ -170,7 +170,28 @@ export class MaterialXEnvironment {
170
170
  }
171
171
  this._lastUpdateFrame = frame;
172
172
  this.updateLighting(false);
173
- this._getTextures(scene.environment);
173
+ const textures = this._getTextures(scene.environment);
174
+
175
+ if (debug && !this["_debug"]) {
176
+ this["_debug"] = true;
177
+ // Show both of them on cubes in the scene
178
+ const unlitMat = new MeshBasicMaterial();
179
+ unlitMat.side = 2;
180
+ const radianceMat = unlitMat.clone();
181
+ radianceMat.map = textures.radianceTexture;
182
+ const planeGeometry = new PlaneGeometry(1, 1, 1, 1)
183
+ const radianceCube = new Mesh(planeGeometry, radianceMat);
184
+ const irradianceMat = unlitMat.clone();
185
+ irradianceMat.map = textures.irradianceTexture;
186
+ const irradianceCube = new Mesh(planeGeometry, radianceMat);
187
+ scene.add(radianceCube);
188
+ scene.add(irradianceCube);
189
+ radianceCube.name = "MaterialXRadianceCube";
190
+ radianceCube.position.set(.6, 1, 0);
191
+ irradianceCube.name = "MaterialXIrradianceCube";
192
+ irradianceCube.position.set(-.6, 1, 0);
193
+ console.log("[MaterialX] environment initialized from Needle context", { textures, radianceCube, irradianceCube });
194
+ }
174
195
  }
175
196
 
176
197
  // Reset the environment to allow re-initialization
@@ -11,7 +11,7 @@ export namespace MaterialX {
11
11
  unbindLightShaders(context: any): void;
12
12
  };
13
13
  createDocument(): Document;
14
- readFromXmlString(doc: Document, xml: string, unknown: string): void;
14
+ readFromXmlString(doc: Document, xml: string, searchPath?: string): void;
15
15
  loadStandardLibraries(genContext: GenContext): StandardLibrary;
16
16
  isTransparentSurface(renderableElement: any, target: string): boolean;
17
17
  }
package/src/utils.ts CHANGED
@@ -2,7 +2,8 @@ import { Context, getParam } from "@needle-tools/engine";
2
2
  import { Mesh } from "three";
3
3
 
4
4
  export const debug = getParam("debugmaterialx");
5
- export const debugUpdate = getParam("debugmaterialxupdate");
5
+ export const debugUpdate = debug === "update";
6
+
6
7
 
7
8
  /**
8
9
  * =====================================