@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.
- package/codegen/register_types.ts +0 -2
- package/package.json +5 -1
- package/src/materialx.material.ts +32 -8
- package/src/materialx.ts +23 -2
- package/src/materialx.types.d.ts +1 -1
- package/src/utils.ts +2 -1
|
@@ -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.
|
|
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(
|
|
140
|
-
console.log(
|
|
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
|
package/src/materialx.types.d.ts
CHANGED
|
@@ -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,
|
|
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 =
|
|
5
|
+
export const debugUpdate = debug === "update";
|
|
6
|
+
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* =====================================
|