@jaimebboyjt/three-double-texture-materials 0.0.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025-present, (jaimebboyjt) Jaime Torrealba and contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # Three extended texture material
@@ -0,0 +1,485 @@
1
+ var S = Object.defineProperty;
2
+ var h = (t, r, s) => r in t ? S(t, r, { enumerable: !0, configurable: !0, writable: !0, value: s }) : t[r] = s;
3
+ var a = (t, r, s) => h(t, typeof r != "symbol" ? r + "" : r, s);
4
+ import { MeshStandardMaterial as N, DataTexture as v, TextureLoader as b, RepeatWrapping as A, MeshBasicMaterial as C, MeshPhysicalMaterial as x } from "three";
5
+ const D = "data:image/png;base64,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";
6
+ class E extends N {
7
+ constructor(s = {}) {
8
+ const { secondMap: d, secondDisplacementMap: i, secondNormalMap: m, secondRoughnessMap: f, secondMetalnessMap: M, secondAoMap: p, noiseMap: o, progress: l, mergedSize: u, noiseScale: c, ...g } = s;
9
+ super(g);
10
+ a(this, "secondMap");
11
+ a(this, "secondDisplacementMap");
12
+ a(this, "secondNormalMap");
13
+ a(this, "secondRoughnessMap");
14
+ a(this, "secondMetalnessMap");
15
+ a(this, "secondAoMap");
16
+ a(this, "noiseMap");
17
+ a(this, "progress");
18
+ a(this, "mergedSize");
19
+ a(this, "noiseScale");
20
+ if (this.secondMap = d || null, this.secondDisplacementMap = i || null, this.secondNormalMap = m || null, this.secondRoughnessMap = f || null, this.secondMetalnessMap = M || null, this.secondAoMap = p || null, o)
21
+ this.noiseMap = o;
22
+ else {
23
+ const e = new v(new Uint8Array([255, 255, 255, 255]), 1, 1);
24
+ e.needsUpdate = !0, this.noiseMap = e, new b().load(D, (n) => {
25
+ this.noiseMap = n, n.wrapS = A, n.wrapT = A, this.userData.shader && (this.userData.shader.uniforms.noiseMap.value = n);
26
+ });
27
+ }
28
+ this.progress = l ?? 0.5, this.mergedSize = u ?? 0.1, this.noiseScale = c ?? 1, this.onBeforeCompile = (e) => {
29
+ e.defines = e.defines || {}, this.secondMap && (e.defines.USE_SECOND_MAP = ""), this.secondDisplacementMap && (e.defines.USE_SECOND_DISPLACEMENTMAP = ""), this.secondNormalMap && (e.defines.USE_SECOND_NORMALMAP = ""), this.secondRoughnessMap && (e.defines.USE_SECOND_ROUGHNESSMAP = ""), this.secondMetalnessMap && (e.defines.USE_SECOND_METALNESSMAP = ""), this.secondAoMap && (e.defines.USE_SECOND_AOMAP = ""), e.uniforms.secondMap = { value: this.secondMap }, e.uniforms.secondDisplacementMap = { value: this.secondDisplacementMap }, e.uniforms.secondNormalMap = { value: this.secondNormalMap }, e.uniforms.secondRoughnessMap = { value: this.secondRoughnessMap }, e.uniforms.secondMetalnessMap = { value: this.secondMetalnessMap }, e.uniforms.secondAoMap = { value: this.secondAoMap }, e.uniforms.noiseMap = { value: this.noiseMap }, e.uniforms.progress = { value: this.progress }, e.uniforms.mergedSize = { value: this.mergedSize }, e.uniforms.noiseScale = { value: this.noiseScale }, this.userData.shader = e, e.fragmentShader = `
30
+ uniform float progress;
31
+ uniform float mergedSize;
32
+ uniform float noiseScale;
33
+ ${this.secondMap ? "uniform sampler2D secondMap;" : ""}
34
+ ${this.secondNormalMap ? "uniform sampler2D secondNormalMap;" : ""}
35
+ ${this.secondRoughnessMap ? "uniform sampler2D secondRoughnessMap;" : ""}
36
+ ${this.secondMetalnessMap ? "uniform sampler2D secondMetalnessMap;" : ""}
37
+ ${this.secondAoMap ? "uniform sampler2D secondAoMap;" : ""}
38
+ uniform sampler2D noiseMap;
39
+
40
+ float sampleNoise(vec2 uv) {
41
+ return texture2D(noiseMap, uv * noiseScale).r;
42
+ }
43
+
44
+ vec2 blendMasks(vec2 uv) {
45
+ float noiseVal = sampleNoise(uv);
46
+ float maskLo = smoothstep(progress - mergedSize, progress, noiseVal);
47
+ float maskHi = smoothstep(progress, progress + mergedSize, noiseVal);
48
+ float borderMask = maskLo * (1.0 - maskHi);
49
+ return vec2(maskHi, borderMask);
50
+ }
51
+ ` + e.fragmentShader, e.vertexShader = `
52
+ uniform float progress;
53
+ uniform float mergedSize;
54
+ uniform float noiseScale;
55
+ ${this.secondDisplacementMap ? "uniform sampler2D secondDisplacementMap;" : ""}
56
+ uniform sampler2D noiseMap;
57
+
58
+ float sampleNoise(vec2 uv) {
59
+ return texture2D(noiseMap, uv * noiseScale).r;
60
+ }
61
+
62
+ vec2 blendMasks(vec2 uv) {
63
+ float noiseVal = sampleNoise(uv);
64
+ float maskLo = smoothstep(progress - mergedSize, progress, noiseVal);
65
+ float maskHi = smoothstep(progress, progress + mergedSize, noiseVal);
66
+ float borderMask = maskLo * (1.0 - maskHi);
67
+ return vec2(maskHi, borderMask);
68
+ }
69
+ ` + e.vertexShader, e.fragmentShader = e.fragmentShader.replace(
70
+ "#include <map_fragment>",
71
+ `
72
+ #ifdef USE_MAP
73
+ vec4 texelColor1 = texture2D( map, vMapUv );
74
+ #ifdef USE_SECOND_MAP
75
+ vec4 texelColor2 = texture2D( secondMap, vMapUv );
76
+ vec2 colorMasks = blendMasks(vMapUv);
77
+ float maskHiColor = colorMasks.x;
78
+ float borderMaskColor = colorMasks.y;
79
+ vec4 blendedColor = mix(texelColor2, texelColor1, maskHiColor);
80
+ vec4 borderColor = mix(texelColor2, texelColor1, mergedSize);
81
+ vec4 finalColor = mix(blendedColor, borderColor, borderMaskColor);
82
+
83
+ diffuseColor *= finalColor;
84
+ #else
85
+ diffuseColor *= texelColor1;
86
+ #endif
87
+ #endif
88
+ `
89
+ ), e.fragmentShader = e.fragmentShader.replace(
90
+ "#include <roughnessmap_fragment>",
91
+ `
92
+ float roughnessFactor = roughness;
93
+ #ifdef USE_ROUGHNESSMAP
94
+ float rough1 = texture2D( roughnessMap, vRoughnessMapUv ).g;
95
+ #ifdef USE_SECOND_ROUGHNESSMAP
96
+ float rough2 = texture2D( secondRoughnessMap, vRoughnessMapUv ).g;
97
+ vec2 roughMasks = blendMasks(vMapUv);
98
+ float maskHiRough = roughMasks.x;
99
+ float borderMaskRough = roughMasks.y;
100
+ float blendedRough = mix( rough2, rough1, maskHiRough );
101
+ float borderValueRough = mix( rough1, rough2, 0.5 );
102
+ roughnessFactor *= mix( blendedRough, borderValueRough, borderMaskRough );
103
+ #else
104
+ roughnessFactor *= rough1;
105
+ #endif
106
+ #endif
107
+ `
108
+ ), e.fragmentShader = e.fragmentShader.replace(
109
+ "#include <metalnessmap_fragment>",
110
+ `
111
+ float metalnessFactor = metalness;
112
+ #ifdef USE_METALNESSMAP
113
+ float metal1 = texture2D( metalnessMap, vMetalnessMapUv ).b;
114
+ #ifdef USE_SECOND_METALNESSMAP
115
+ float metal2 = texture2D( secondMetalnessMap, vMetalnessMapUv ).b;
116
+ vec2 metalMasks = blendMasks(vMapUv);
117
+ float maskHiMetal = metalMasks.x;
118
+ float borderMaskMetal = metalMasks.y;
119
+ float blendedMetal = mix( metal2, metal1, maskHiMetal );
120
+ float borderValueMetal = mix( metal1, metal2, 0.5 );
121
+ metalnessFactor *= mix( blendedMetal, borderValueMetal, borderMaskMetal );
122
+ #else
123
+ metalnessFactor *= metal1;
124
+ #endif
125
+ #endif
126
+ `
127
+ ), e.fragmentShader = e.fragmentShader.replace(
128
+ "#include <normal_fragment_maps>",
129
+ `
130
+ #ifdef USE_NORMALMAP_TANGENTSPACE
131
+ vec3 n1 = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;
132
+ #ifdef USE_SECOND_NORMALMAP
133
+ vec3 n2 = texture2D( secondNormalMap, vNormalMapUv ).xyz * 2.0 - 1.0;
134
+ float maskHiNormal = blendMasks(vMapUv).x;
135
+ vec3 blendedNormal = normalize( mix( n2, n1, maskHiNormal ) );
136
+ #else
137
+ vec3 blendedNormal = n1;
138
+ #endif
139
+ blendedNormal.xy *= normalScale;
140
+ normal = normalize( tbn * blendedNormal );
141
+ #endif
142
+ `
143
+ ), e.fragmentShader = e.fragmentShader.replace(
144
+ "#include <aomap_fragment>",
145
+ `
146
+ #ifdef USE_AOMAP
147
+ float ao1 = texture2D( aoMap, vAoMapUv ).r;
148
+ #ifdef USE_SECOND_AOMAP
149
+ float ao2 = texture2D( secondAoMap, vAoMapUv ).r;
150
+ vec2 aoMasks = blendMasks(vMapUv);
151
+ float maskHiAo = aoMasks.x;
152
+ float borderMaskAo = aoMasks.y;
153
+ float blendedAo = mix( ao2, ao1, maskHiAo );
154
+ float borderValueAo = mix( ao1, ao2, 0.5 );
155
+ float aoValue = mix( blendedAo, borderValueAo, borderMaskAo );
156
+ #else
157
+ float aoValue = ao1;
158
+ #endif
159
+
160
+ float ambientOcclusion = ( aoValue - 1.0 ) * aoMapIntensity + 1.0;
161
+ reflectedLight.indirectDiffuse *= ambientOcclusion;
162
+
163
+ #if defined( USE_CLEARCOAT )
164
+ clearcoatSpecularIndirect *= ambientOcclusion;
165
+ #endif
166
+
167
+ #if defined( USE_SHEEN )
168
+ sheenSpecularIndirect *= ambientOcclusion;
169
+ #endif
170
+
171
+ #if defined( USE_ENVMAP ) && defined( STANDARD )
172
+ float dotNV = saturate( dot( geometryNormal, geometryViewDir ) );
173
+ reflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );
174
+ #endif
175
+ #endif
176
+ `
177
+ ), e.vertexShader = e.vertexShader.replace(
178
+ "#include <displacementmap_vertex>",
179
+ `
180
+ #ifdef USE_DISPLACEMENTMAP
181
+ float disp1 = texture2D( displacementMap, vDisplacementMapUv ).x;
182
+ #ifdef USE_SECOND_DISPLACEMENTMAP
183
+ float disp2 = texture2D( secondDisplacementMap, vDisplacementMapUv ).x;
184
+ vec2 dispMasks = blendMasks(vMapUv);
185
+ float maskHiDisp = dispMasks.x;
186
+ float borderMaskDisp = dispMasks.y;
187
+ float blendedDisp = mix( disp2, disp1, maskHiDisp );
188
+ float borderValueDisp = mix( disp1, disp2, 0.5 );
189
+ float disp = mix( blendedDisp, borderValueDisp, borderMaskDisp );
190
+ #else
191
+ float disp = disp1;
192
+ #endif
193
+ transformed += normalize( objectNormal ) * ( disp * displacementScale + displacementBias );
194
+ #endif
195
+ `
196
+ );
197
+ };
198
+ }
199
+ setMerge(s) {
200
+ this.progress = s, this.userData.shader && (this.userData.shader.uniforms.progress.value = s);
201
+ }
202
+ setMergedSize(s) {
203
+ this.mergedSize = s, this.userData.shader && (this.userData.shader.uniforms.mergedSize.value = s);
204
+ }
205
+ setNoiseScale(s) {
206
+ this.noiseScale = s, this.userData.shader && (this.userData.shader.uniforms.noiseScale.value = s);
207
+ }
208
+ }
209
+ class k extends C {
210
+ constructor(s = {}) {
211
+ const { secondMap: d, noiseMap: i, progress: m, mergedSize: f, noiseScale: M, ...p } = s;
212
+ super(p);
213
+ a(this, "secondMap");
214
+ a(this, "noiseMap");
215
+ a(this, "progress");
216
+ a(this, "mergedSize");
217
+ a(this, "noiseScale");
218
+ if (this.secondMap = d || null, i)
219
+ this.noiseMap = i;
220
+ else {
221
+ const o = new v(new Uint8Array([255, 255, 255, 255]), 1, 1);
222
+ o.needsUpdate = !0, this.noiseMap = o, new b().load(D, (l) => {
223
+ this.noiseMap = l, l.wrapS = A, l.wrapT = A, this.userData.shader && (this.userData.shader.uniforms.noiseMap.value = l);
224
+ });
225
+ }
226
+ this.progress = m ?? 0.5, this.mergedSize = f ?? 0.1, this.noiseScale = M ?? 1, this.onBeforeCompile = (o) => {
227
+ o.defines = o.defines || {}, this.secondMap && (o.defines.USE_SECOND_MAP = ""), o.uniforms.secondMap = { value: this.secondMap }, o.uniforms.noiseMap = { value: this.noiseMap }, o.uniforms.progress = { value: this.progress }, o.uniforms.mergedSize = { value: this.mergedSize }, o.uniforms.noiseScale = { value: this.noiseScale }, this.userData.shader = o, o.fragmentShader = `
228
+ uniform float progress;
229
+ uniform float mergedSize;
230
+ uniform float noiseScale;
231
+ ${this.secondMap ? "uniform sampler2D secondMap;" : ""}
232
+ uniform sampler2D noiseMap;
233
+
234
+ float sampleNoise(vec2 uv) {
235
+ return texture2D(noiseMap, uv * noiseScale).r;
236
+ }
237
+
238
+ vec2 blendMasks(vec2 uv) {
239
+ float noiseVal = sampleNoise(uv);
240
+ float maskLo = smoothstep(progress - mergedSize, progress, noiseVal);
241
+ float maskHi = smoothstep(progress, progress + mergedSize, noiseVal);
242
+ float borderMask = maskLo * (1.0 - maskHi);
243
+ return vec2(maskHi, borderMask);
244
+ }
245
+ ` + o.fragmentShader, o.fragmentShader = o.fragmentShader.replace(
246
+ "#include <map_fragment>",
247
+ `
248
+ #ifdef USE_MAP
249
+ vec4 texelColor1 = texture2D( map, vMapUv );
250
+ #ifdef USE_SECOND_MAP
251
+ vec4 texelColor2 = texture2D( secondMap, vMapUv );
252
+ vec2 colorMasks = blendMasks(vMapUv);
253
+ float maskHiColor = colorMasks.x;
254
+ float borderMaskColor = colorMasks.y;
255
+ vec4 blendedColor = mix(texelColor2, texelColor1, maskHiColor);
256
+ vec4 borderColor = mix(texelColor2, texelColor1, 0.5);
257
+ vec4 finalColor = mix(blendedColor, borderColor, borderMaskColor);
258
+
259
+ diffuseColor *= finalColor;
260
+ #else
261
+ diffuseColor *= texelColor1;
262
+ #endif
263
+ #endif
264
+ `
265
+ );
266
+ };
267
+ }
268
+ setMerge(s) {
269
+ this.progress = s, this.userData.shader && (this.userData.shader.uniforms.progress.value = s);
270
+ }
271
+ setMergedSize(s) {
272
+ this.mergedSize = s, this.userData.shader && (this.userData.shader.uniforms.mergedSize.value = s);
273
+ }
274
+ setNoiseScale(s) {
275
+ this.noiseScale = s, this.userData.shader && (this.userData.shader.uniforms.noiseScale.value = s);
276
+ }
277
+ }
278
+ class z extends x {
279
+ constructor(s = {}) {
280
+ const { secondMap: d, secondDisplacementMap: i, secondNormalMap: m, secondRoughnessMap: f, secondMetalnessMap: M, secondAoMap: p, noiseMap: o, progress: l, mergedSize: u, noiseScale: c, ...g } = s;
281
+ super(g);
282
+ a(this, "secondMap");
283
+ a(this, "secondDisplacementMap");
284
+ a(this, "secondNormalMap");
285
+ a(this, "secondRoughnessMap");
286
+ a(this, "secondMetalnessMap");
287
+ a(this, "secondAoMap");
288
+ a(this, "noiseMap");
289
+ a(this, "progress");
290
+ a(this, "mergedSize");
291
+ a(this, "noiseScale");
292
+ if (this.secondMap = d || null, this.secondDisplacementMap = i || null, this.secondNormalMap = m || null, this.secondRoughnessMap = f || null, this.secondMetalnessMap = M || null, this.secondAoMap = p || null, o)
293
+ this.noiseMap = o;
294
+ else {
295
+ const e = new v(new Uint8Array([255, 255, 255, 255]), 1, 1);
296
+ e.needsUpdate = !0, this.noiseMap = e, new b().load(D, (n) => {
297
+ this.noiseMap = n, n.wrapS = A, n.wrapT = A, this.userData.shader && (this.userData.shader.uniforms.noiseMap.value = n);
298
+ });
299
+ }
300
+ this.progress = l ?? 0.5, this.mergedSize = u ?? 0.1, this.noiseScale = c ?? 1, this.onBeforeCompile = (e) => {
301
+ e.defines = e.defines || {}, this.secondMap && (e.defines.USE_SECOND_MAP = ""), this.secondDisplacementMap && (e.defines.USE_SECOND_DISPLACEMENTMAP = ""), this.secondNormalMap && (e.defines.USE_SECOND_NORMALMAP = ""), this.secondRoughnessMap && (e.defines.USE_SECOND_ROUGHNESSMAP = ""), this.secondMetalnessMap && (e.defines.USE_SECOND_METALNESSMAP = ""), this.secondAoMap && (e.defines.USE_SECOND_AOMAP = ""), e.uniforms.secondMap = { value: this.secondMap }, e.uniforms.secondDisplacementMap = { value: this.secondDisplacementMap }, e.uniforms.secondNormalMap = { value: this.secondNormalMap }, e.uniforms.secondRoughnessMap = { value: this.secondRoughnessMap }, e.uniforms.secondMetalnessMap = { value: this.secondMetalnessMap }, e.uniforms.secondAoMap = { value: this.secondAoMap }, e.uniforms.noiseMap = { value: this.noiseMap }, e.uniforms.progress = { value: this.progress }, e.uniforms.mergedSize = { value: this.mergedSize }, e.uniforms.noiseScale = { value: this.noiseScale }, this.userData.shader = e, e.fragmentShader = `
302
+ uniform float progress;
303
+ uniform float mergedSize;
304
+ uniform float noiseScale;
305
+ ${this.secondMap ? "uniform sampler2D secondMap;" : ""}
306
+ ${this.secondNormalMap ? "uniform sampler2D secondNormalMap;" : ""}
307
+ ${this.secondRoughnessMap ? "uniform sampler2D secondRoughnessMap;" : ""}
308
+ ${this.secondMetalnessMap ? "uniform sampler2D secondMetalnessMap;" : ""}
309
+ ${this.secondAoMap ? "uniform sampler2D secondAoMap;" : ""}
310
+ uniform sampler2D noiseMap;
311
+
312
+ float sampleNoise(vec2 uv) {
313
+ return texture2D(noiseMap, uv * noiseScale).r;
314
+ }
315
+
316
+ vec2 blendMasks(vec2 uv) {
317
+ float noiseVal = sampleNoise(uv);
318
+ float maskLo = smoothstep(progress - mergedSize, progress, noiseVal);
319
+ float maskHi = smoothstep(progress, progress + mergedSize, noiseVal);
320
+ float borderMask = maskLo * (1.0 - maskHi);
321
+ return vec2(maskHi, borderMask);
322
+ }
323
+ ` + e.fragmentShader, e.vertexShader = `
324
+ uniform float progress;
325
+ uniform float mergedSize;
326
+ uniform float noiseScale;
327
+ ${this.secondDisplacementMap ? "uniform sampler2D secondDisplacementMap;" : ""}
328
+ uniform sampler2D noiseMap;
329
+
330
+ float sampleNoise(vec2 uv) {
331
+ return texture2D(noiseMap, uv * noiseScale).r;
332
+ }
333
+
334
+ vec2 blendMasks(vec2 uv) {
335
+ float noiseVal = sampleNoise(uv);
336
+ float maskLo = smoothstep(progress - mergedSize, progress, noiseVal);
337
+ float maskHi = smoothstep(progress, progress + mergedSize, noiseVal);
338
+ float borderMask = maskLo * (1.0 - maskHi);
339
+ return vec2(maskHi, borderMask);
340
+ }
341
+ ` + e.vertexShader, e.fragmentShader = e.fragmentShader.replace(
342
+ "#include <map_fragment>",
343
+ `
344
+ #ifdef USE_MAP
345
+ vec4 texelColor1 = texture2D( map, vMapUv );
346
+ #ifdef USE_SECOND_MAP
347
+ vec4 texelColor2 = texture2D( secondMap, vMapUv );
348
+ vec2 colorMasks = blendMasks(vMapUv);
349
+ float maskHiColor = colorMasks.x;
350
+ float borderMaskColor = colorMasks.y;
351
+ vec4 blendedColor = mix(texelColor2, texelColor1, maskHiColor);
352
+ vec4 borderColor = mix(texelColor2, texelColor1, mergedSize);
353
+ vec4 finalColor = mix(blendedColor, borderColor, borderMaskColor);
354
+
355
+ diffuseColor *= finalColor;
356
+ #else
357
+ diffuseColor *= texelColor1;
358
+ #endif
359
+ #endif
360
+ `
361
+ ), e.fragmentShader = e.fragmentShader.replace(
362
+ "#include <roughnessmap_fragment>",
363
+ `
364
+ float roughnessFactor = roughness;
365
+ #ifdef USE_ROUGHNESSMAP
366
+ float rough1 = texture2D( roughnessMap, vRoughnessMapUv ).g;
367
+ #ifdef USE_SECOND_ROUGHNESSMAP
368
+ float rough2 = texture2D( secondRoughnessMap, vRoughnessMapUv ).g;
369
+ vec2 roughMasks = blendMasks(vMapUv);
370
+ float maskHiRough = roughMasks.x;
371
+ float borderMaskRough = roughMasks.y;
372
+ float blendedRough = mix( rough2, rough1, maskHiRough );
373
+ float borderValueRough = mix( rough1, rough2, 0.5 );
374
+ roughnessFactor *= mix( blendedRough, borderValueRough, borderMaskRough );
375
+ #else
376
+ roughnessFactor *= rough1;
377
+ #endif
378
+ #endif
379
+ `
380
+ ), e.fragmentShader = e.fragmentShader.replace(
381
+ "#include <metalnessmap_fragment>",
382
+ `
383
+ float metalnessFactor = metalness;
384
+ #ifdef USE_METALNESSMAP
385
+ float metal1 = texture2D( metalnessMap, vMetalnessMapUv ).b;
386
+ #ifdef USE_SECOND_METALNESSMAP
387
+ float metal2 = texture2D( secondMetalnessMap, vMetalnessMapUv ).b;
388
+ vec2 metalMasks = blendMasks(vMapUv);
389
+ float maskHiMetal = metalMasks.x;
390
+ float borderMaskMetal = metalMasks.y;
391
+ float blendedMetal = mix( metal2, metal1, maskHiMetal );
392
+ float borderValueMetal = mix( metal1, metal2, 0.5 );
393
+ metalnessFactor *= mix( blendedMetal, borderValueMetal, borderMaskMetal );
394
+ #else
395
+ metalnessFactor *= metal1;
396
+ #endif
397
+ #endif
398
+ `
399
+ ), e.fragmentShader = e.fragmentShader.replace(
400
+ "#include <normal_fragment_maps>",
401
+ `
402
+ #ifdef USE_NORMALMAP_TANGENTSPACE
403
+ vec3 n1 = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;
404
+ #ifdef USE_SECOND_NORMALMAP
405
+ vec3 n2 = texture2D( secondNormalMap, vNormalMapUv ).xyz * 2.0 - 1.0;
406
+ float maskHiNormal = blendMasks(vMapUv).x;
407
+ vec3 blendedNormal = normalize( mix( n2, n1, maskHiNormal ) );
408
+ #else
409
+ vec3 blendedNormal = n1;
410
+ #endif
411
+ blendedNormal.xy *= normalScale;
412
+ normal = normalize( tbn * blendedNormal );
413
+ #endif
414
+ `
415
+ ), e.fragmentShader = e.fragmentShader.replace(
416
+ "#include <aomap_fragment>",
417
+ `
418
+ #ifdef USE_AOMAP
419
+ float ao1 = texture2D( aoMap, vAoMapUv ).r;
420
+ #ifdef USE_SECOND_AOMAP
421
+ float ao2 = texture2D( secondAoMap, vAoMapUv ).r;
422
+ vec2 aoMasks = blendMasks(vMapUv);
423
+ float maskHiAo = aoMasks.x;
424
+ float borderMaskAo = aoMasks.y;
425
+ float blendedAo = mix( ao2, ao1, maskHiAo );
426
+ float borderValueAo = mix( ao1, ao2, 0.5 );
427
+ float aoValue = mix( blendedAo, borderValueAo, borderMaskAo );
428
+ #else
429
+ float aoValue = ao1;
430
+ #endif
431
+
432
+ float ambientOcclusion = ( aoValue - 1.0 ) * aoMapIntensity + 1.0;
433
+ reflectedLight.indirectDiffuse *= ambientOcclusion;
434
+
435
+ #if defined( USE_CLEARCOAT )
436
+ clearcoatSpecularIndirect *= ambientOcclusion;
437
+ #endif
438
+
439
+ #if defined( USE_SHEEN )
440
+ sheenSpecularIndirect *= ambientOcclusion;
441
+ #endif
442
+
443
+ #if defined( USE_ENVMAP ) && defined( STANDARD )
444
+ float dotNV = saturate( dot( geometryNormal, geometryViewDir ) );
445
+ reflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );
446
+ #endif
447
+ #endif
448
+ `
449
+ ), e.vertexShader = e.vertexShader.replace(
450
+ "#include <displacementmap_vertex>",
451
+ `
452
+ #ifdef USE_DISPLACEMENTMAP
453
+ float disp1 = texture2D( displacementMap, vDisplacementMapUv ).x;
454
+ #ifdef USE_SECOND_DISPLACEMENTMAP
455
+ float disp2 = texture2D( secondDisplacementMap, vDisplacementMapUv ).x;
456
+ vec2 dispMasks = blendMasks(vMapUv);
457
+ float maskHiDisp = dispMasks.x;
458
+ float borderMaskDisp = dispMasks.y;
459
+ float blendedDisp = mix( disp2, disp1, maskHiDisp );
460
+ float borderValueDisp = mix( disp1, disp2, 0.5 );
461
+ float disp = mix( blendedDisp, borderValueDisp, borderMaskDisp );
462
+ #else
463
+ float disp = disp1;
464
+ #endif
465
+ transformed += normalize( objectNormal ) * ( disp * displacementScale + displacementBias );
466
+ #endif
467
+ `
468
+ );
469
+ };
470
+ }
471
+ setMerge(s) {
472
+ this.progress = s, this.userData.shader && (this.userData.shader.uniforms.progress.value = s);
473
+ }
474
+ setMergedSize(s) {
475
+ this.mergedSize = s, this.userData.shader && (this.userData.shader.uniforms.mergedSize.value = s);
476
+ }
477
+ setNoiseScale(s) {
478
+ this.noiseScale = s, this.userData.shader && (this.userData.shader.uniforms.noiseScale.value = s);
479
+ }
480
+ }
481
+ export {
482
+ k as DTMeshBasicMaterial,
483
+ z as DTMeshPhysicalMaterial,
484
+ E as DTMeshStandardMaterial
485
+ };
@@ -0,0 +1,334 @@
1
+ (function(n,a){typeof exports=="object"&&typeof module<"u"?a(exports,require("three")):typeof define=="function"&&define.amd?define(["exports","three"],a):(n=typeof globalThis<"u"?globalThis:n||self,a(n["three-double-texture-materials"]={},n.THREE))})(this,function(n,a){"use strict";var N=Object.defineProperty;var x=(n,a,i)=>a in n?N(n,a,{enumerable:!0,configurable:!0,writable:!0,value:i}):n[a]=i;var o=(n,a,i)=>x(n,typeof a!="symbol"?a+"":a,i);const i="data:image/png;base64,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";class b extends a.MeshStandardMaterial{constructor(s={}){const{secondMap:d,secondDisplacementMap:A,secondNormalMap:m,secondRoughnessMap:f,secondMetalnessMap:M,secondAoMap:p,noiseMap:r,progress:l,mergedSize:u,noiseScale:c,...g}=s;super(g);o(this,"secondMap");o(this,"secondDisplacementMap");o(this,"secondNormalMap");o(this,"secondRoughnessMap");o(this,"secondMetalnessMap");o(this,"secondAoMap");o(this,"noiseMap");o(this,"progress");o(this,"mergedSize");o(this,"noiseScale");if(this.secondMap=d||null,this.secondDisplacementMap=A||null,this.secondNormalMap=m||null,this.secondRoughnessMap=f||null,this.secondMetalnessMap=M||null,this.secondAoMap=p||null,r)this.noiseMap=r;else{const e=new a.DataTexture(new Uint8Array([255,255,255,255]),1,1);e.needsUpdate=!0,this.noiseMap=e,new a.TextureLoader().load(i,t=>{this.noiseMap=t,t.wrapS=a.RepeatWrapping,t.wrapT=a.RepeatWrapping,this.userData.shader&&(this.userData.shader.uniforms.noiseMap.value=t)})}this.progress=l??.5,this.mergedSize=u??.1,this.noiseScale=c??1,this.onBeforeCompile=e=>{e.defines=e.defines||{},this.secondMap&&(e.defines.USE_SECOND_MAP=""),this.secondDisplacementMap&&(e.defines.USE_SECOND_DISPLACEMENTMAP=""),this.secondNormalMap&&(e.defines.USE_SECOND_NORMALMAP=""),this.secondRoughnessMap&&(e.defines.USE_SECOND_ROUGHNESSMAP=""),this.secondMetalnessMap&&(e.defines.USE_SECOND_METALNESSMAP=""),this.secondAoMap&&(e.defines.USE_SECOND_AOMAP=""),e.uniforms.secondMap={value:this.secondMap},e.uniforms.secondDisplacementMap={value:this.secondDisplacementMap},e.uniforms.secondNormalMap={value:this.secondNormalMap},e.uniforms.secondRoughnessMap={value:this.secondRoughnessMap},e.uniforms.secondMetalnessMap={value:this.secondMetalnessMap},e.uniforms.secondAoMap={value:this.secondAoMap},e.uniforms.noiseMap={value:this.noiseMap},e.uniforms.progress={value:this.progress},e.uniforms.mergedSize={value:this.mergedSize},e.uniforms.noiseScale={value:this.noiseScale},this.userData.shader=e,e.fragmentShader=`
2
+ uniform float progress;
3
+ uniform float mergedSize;
4
+ uniform float noiseScale;
5
+ ${this.secondMap?"uniform sampler2D secondMap;":""}
6
+ ${this.secondNormalMap?"uniform sampler2D secondNormalMap;":""}
7
+ ${this.secondRoughnessMap?"uniform sampler2D secondRoughnessMap;":""}
8
+ ${this.secondMetalnessMap?"uniform sampler2D secondMetalnessMap;":""}
9
+ ${this.secondAoMap?"uniform sampler2D secondAoMap;":""}
10
+ uniform sampler2D noiseMap;
11
+
12
+ float sampleNoise(vec2 uv) {
13
+ return texture2D(noiseMap, uv * noiseScale).r;
14
+ }
15
+
16
+ vec2 blendMasks(vec2 uv) {
17
+ float noiseVal = sampleNoise(uv);
18
+ float maskLo = smoothstep(progress - mergedSize, progress, noiseVal);
19
+ float maskHi = smoothstep(progress, progress + mergedSize, noiseVal);
20
+ float borderMask = maskLo * (1.0 - maskHi);
21
+ return vec2(maskHi, borderMask);
22
+ }
23
+ `+e.fragmentShader,e.vertexShader=`
24
+ uniform float progress;
25
+ uniform float mergedSize;
26
+ uniform float noiseScale;
27
+ ${this.secondDisplacementMap?"uniform sampler2D secondDisplacementMap;":""}
28
+ uniform sampler2D noiseMap;
29
+
30
+ float sampleNoise(vec2 uv) {
31
+ return texture2D(noiseMap, uv * noiseScale).r;
32
+ }
33
+
34
+ vec2 blendMasks(vec2 uv) {
35
+ float noiseVal = sampleNoise(uv);
36
+ float maskLo = smoothstep(progress - mergedSize, progress, noiseVal);
37
+ float maskHi = smoothstep(progress, progress + mergedSize, noiseVal);
38
+ float borderMask = maskLo * (1.0 - maskHi);
39
+ return vec2(maskHi, borderMask);
40
+ }
41
+ `+e.vertexShader,e.fragmentShader=e.fragmentShader.replace("#include <map_fragment>",`
42
+ #ifdef USE_MAP
43
+ vec4 texelColor1 = texture2D( map, vMapUv );
44
+ #ifdef USE_SECOND_MAP
45
+ vec4 texelColor2 = texture2D( secondMap, vMapUv );
46
+ vec2 colorMasks = blendMasks(vMapUv);
47
+ float maskHiColor = colorMasks.x;
48
+ float borderMaskColor = colorMasks.y;
49
+ vec4 blendedColor = mix(texelColor2, texelColor1, maskHiColor);
50
+ vec4 borderColor = mix(texelColor2, texelColor1, mergedSize);
51
+ vec4 finalColor = mix(blendedColor, borderColor, borderMaskColor);
52
+
53
+ diffuseColor *= finalColor;
54
+ #else
55
+ diffuseColor *= texelColor1;
56
+ #endif
57
+ #endif
58
+ `),e.fragmentShader=e.fragmentShader.replace("#include <roughnessmap_fragment>",`
59
+ float roughnessFactor = roughness;
60
+ #ifdef USE_ROUGHNESSMAP
61
+ float rough1 = texture2D( roughnessMap, vRoughnessMapUv ).g;
62
+ #ifdef USE_SECOND_ROUGHNESSMAP
63
+ float rough2 = texture2D( secondRoughnessMap, vRoughnessMapUv ).g;
64
+ vec2 roughMasks = blendMasks(vMapUv);
65
+ float maskHiRough = roughMasks.x;
66
+ float borderMaskRough = roughMasks.y;
67
+ float blendedRough = mix( rough2, rough1, maskHiRough );
68
+ float borderValueRough = mix( rough1, rough2, 0.5 );
69
+ roughnessFactor *= mix( blendedRough, borderValueRough, borderMaskRough );
70
+ #else
71
+ roughnessFactor *= rough1;
72
+ #endif
73
+ #endif
74
+ `),e.fragmentShader=e.fragmentShader.replace("#include <metalnessmap_fragment>",`
75
+ float metalnessFactor = metalness;
76
+ #ifdef USE_METALNESSMAP
77
+ float metal1 = texture2D( metalnessMap, vMetalnessMapUv ).b;
78
+ #ifdef USE_SECOND_METALNESSMAP
79
+ float metal2 = texture2D( secondMetalnessMap, vMetalnessMapUv ).b;
80
+ vec2 metalMasks = blendMasks(vMapUv);
81
+ float maskHiMetal = metalMasks.x;
82
+ float borderMaskMetal = metalMasks.y;
83
+ float blendedMetal = mix( metal2, metal1, maskHiMetal );
84
+ float borderValueMetal = mix( metal1, metal2, 0.5 );
85
+ metalnessFactor *= mix( blendedMetal, borderValueMetal, borderMaskMetal );
86
+ #else
87
+ metalnessFactor *= metal1;
88
+ #endif
89
+ #endif
90
+ `),e.fragmentShader=e.fragmentShader.replace("#include <normal_fragment_maps>",`
91
+ #ifdef USE_NORMALMAP_TANGENTSPACE
92
+ vec3 n1 = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;
93
+ #ifdef USE_SECOND_NORMALMAP
94
+ vec3 n2 = texture2D( secondNormalMap, vNormalMapUv ).xyz * 2.0 - 1.0;
95
+ float maskHiNormal = blendMasks(vMapUv).x;
96
+ vec3 blendedNormal = normalize( mix( n2, n1, maskHiNormal ) );
97
+ #else
98
+ vec3 blendedNormal = n1;
99
+ #endif
100
+ blendedNormal.xy *= normalScale;
101
+ normal = normalize( tbn * blendedNormal );
102
+ #endif
103
+ `),e.fragmentShader=e.fragmentShader.replace("#include <aomap_fragment>",`
104
+ #ifdef USE_AOMAP
105
+ float ao1 = texture2D( aoMap, vAoMapUv ).r;
106
+ #ifdef USE_SECOND_AOMAP
107
+ float ao2 = texture2D( secondAoMap, vAoMapUv ).r;
108
+ vec2 aoMasks = blendMasks(vMapUv);
109
+ float maskHiAo = aoMasks.x;
110
+ float borderMaskAo = aoMasks.y;
111
+ float blendedAo = mix( ao2, ao1, maskHiAo );
112
+ float borderValueAo = mix( ao1, ao2, 0.5 );
113
+ float aoValue = mix( blendedAo, borderValueAo, borderMaskAo );
114
+ #else
115
+ float aoValue = ao1;
116
+ #endif
117
+
118
+ float ambientOcclusion = ( aoValue - 1.0 ) * aoMapIntensity + 1.0;
119
+ reflectedLight.indirectDiffuse *= ambientOcclusion;
120
+
121
+ #if defined( USE_CLEARCOAT )
122
+ clearcoatSpecularIndirect *= ambientOcclusion;
123
+ #endif
124
+
125
+ #if defined( USE_SHEEN )
126
+ sheenSpecularIndirect *= ambientOcclusion;
127
+ #endif
128
+
129
+ #if defined( USE_ENVMAP ) && defined( STANDARD )
130
+ float dotNV = saturate( dot( geometryNormal, geometryViewDir ) );
131
+ reflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );
132
+ #endif
133
+ #endif
134
+ `),e.vertexShader=e.vertexShader.replace("#include <displacementmap_vertex>",`
135
+ #ifdef USE_DISPLACEMENTMAP
136
+ float disp1 = texture2D( displacementMap, vDisplacementMapUv ).x;
137
+ #ifdef USE_SECOND_DISPLACEMENTMAP
138
+ float disp2 = texture2D( secondDisplacementMap, vDisplacementMapUv ).x;
139
+ vec2 dispMasks = blendMasks(vMapUv);
140
+ float maskHiDisp = dispMasks.x;
141
+ float borderMaskDisp = dispMasks.y;
142
+ float blendedDisp = mix( disp2, disp1, maskHiDisp );
143
+ float borderValueDisp = mix( disp1, disp2, 0.5 );
144
+ float disp = mix( blendedDisp, borderValueDisp, borderMaskDisp );
145
+ #else
146
+ float disp = disp1;
147
+ #endif
148
+ transformed += normalize( objectNormal ) * ( disp * displacementScale + displacementBias );
149
+ #endif
150
+ `)}}setMerge(s){this.progress=s,this.userData.shader&&(this.userData.shader.uniforms.progress.value=s)}setMergedSize(s){this.mergedSize=s,this.userData.shader&&(this.userData.shader.uniforms.mergedSize.value=s)}setNoiseScale(s){this.noiseScale=s,this.userData.shader&&(this.userData.shader.uniforms.noiseScale.value=s)}}class S extends a.MeshBasicMaterial{constructor(s={}){const{secondMap:d,noiseMap:A,progress:m,mergedSize:f,noiseScale:M,...p}=s;super(p);o(this,"secondMap");o(this,"noiseMap");o(this,"progress");o(this,"mergedSize");o(this,"noiseScale");if(this.secondMap=d||null,A)this.noiseMap=A;else{const r=new a.DataTexture(new Uint8Array([255,255,255,255]),1,1);r.needsUpdate=!0,this.noiseMap=r,new a.TextureLoader().load(i,l=>{this.noiseMap=l,l.wrapS=a.RepeatWrapping,l.wrapT=a.RepeatWrapping,this.userData.shader&&(this.userData.shader.uniforms.noiseMap.value=l)})}this.progress=m??.5,this.mergedSize=f??.1,this.noiseScale=M??1,this.onBeforeCompile=r=>{r.defines=r.defines||{},this.secondMap&&(r.defines.USE_SECOND_MAP=""),r.uniforms.secondMap={value:this.secondMap},r.uniforms.noiseMap={value:this.noiseMap},r.uniforms.progress={value:this.progress},r.uniforms.mergedSize={value:this.mergedSize},r.uniforms.noiseScale={value:this.noiseScale},this.userData.shader=r,r.fragmentShader=`
151
+ uniform float progress;
152
+ uniform float mergedSize;
153
+ uniform float noiseScale;
154
+ ${this.secondMap?"uniform sampler2D secondMap;":""}
155
+ uniform sampler2D noiseMap;
156
+
157
+ float sampleNoise(vec2 uv) {
158
+ return texture2D(noiseMap, uv * noiseScale).r;
159
+ }
160
+
161
+ vec2 blendMasks(vec2 uv) {
162
+ float noiseVal = sampleNoise(uv);
163
+ float maskLo = smoothstep(progress - mergedSize, progress, noiseVal);
164
+ float maskHi = smoothstep(progress, progress + mergedSize, noiseVal);
165
+ float borderMask = maskLo * (1.0 - maskHi);
166
+ return vec2(maskHi, borderMask);
167
+ }
168
+ `+r.fragmentShader,r.fragmentShader=r.fragmentShader.replace("#include <map_fragment>",`
169
+ #ifdef USE_MAP
170
+ vec4 texelColor1 = texture2D( map, vMapUv );
171
+ #ifdef USE_SECOND_MAP
172
+ vec4 texelColor2 = texture2D( secondMap, vMapUv );
173
+ vec2 colorMasks = blendMasks(vMapUv);
174
+ float maskHiColor = colorMasks.x;
175
+ float borderMaskColor = colorMasks.y;
176
+ vec4 blendedColor = mix(texelColor2, texelColor1, maskHiColor);
177
+ vec4 borderColor = mix(texelColor2, texelColor1, 0.5);
178
+ vec4 finalColor = mix(blendedColor, borderColor, borderMaskColor);
179
+
180
+ diffuseColor *= finalColor;
181
+ #else
182
+ diffuseColor *= texelColor1;
183
+ #endif
184
+ #endif
185
+ `)}}setMerge(s){this.progress=s,this.userData.shader&&(this.userData.shader.uniforms.progress.value=s)}setMergedSize(s){this.mergedSize=s,this.userData.shader&&(this.userData.shader.uniforms.mergedSize.value=s)}setNoiseScale(s){this.noiseScale=s,this.userData.shader&&(this.userData.shader.uniforms.noiseScale.value=s)}}class h extends a.MeshPhysicalMaterial{constructor(s={}){const{secondMap:d,secondDisplacementMap:A,secondNormalMap:m,secondRoughnessMap:f,secondMetalnessMap:M,secondAoMap:p,noiseMap:r,progress:l,mergedSize:u,noiseScale:c,...g}=s;super(g);o(this,"secondMap");o(this,"secondDisplacementMap");o(this,"secondNormalMap");o(this,"secondRoughnessMap");o(this,"secondMetalnessMap");o(this,"secondAoMap");o(this,"noiseMap");o(this,"progress");o(this,"mergedSize");o(this,"noiseScale");if(this.secondMap=d||null,this.secondDisplacementMap=A||null,this.secondNormalMap=m||null,this.secondRoughnessMap=f||null,this.secondMetalnessMap=M||null,this.secondAoMap=p||null,r)this.noiseMap=r;else{const e=new a.DataTexture(new Uint8Array([255,255,255,255]),1,1);e.needsUpdate=!0,this.noiseMap=e,new a.TextureLoader().load(i,t=>{this.noiseMap=t,t.wrapS=a.RepeatWrapping,t.wrapT=a.RepeatWrapping,this.userData.shader&&(this.userData.shader.uniforms.noiseMap.value=t)})}this.progress=l??.5,this.mergedSize=u??.1,this.noiseScale=c??1,this.onBeforeCompile=e=>{e.defines=e.defines||{},this.secondMap&&(e.defines.USE_SECOND_MAP=""),this.secondDisplacementMap&&(e.defines.USE_SECOND_DISPLACEMENTMAP=""),this.secondNormalMap&&(e.defines.USE_SECOND_NORMALMAP=""),this.secondRoughnessMap&&(e.defines.USE_SECOND_ROUGHNESSMAP=""),this.secondMetalnessMap&&(e.defines.USE_SECOND_METALNESSMAP=""),this.secondAoMap&&(e.defines.USE_SECOND_AOMAP=""),e.uniforms.secondMap={value:this.secondMap},e.uniforms.secondDisplacementMap={value:this.secondDisplacementMap},e.uniforms.secondNormalMap={value:this.secondNormalMap},e.uniforms.secondRoughnessMap={value:this.secondRoughnessMap},e.uniforms.secondMetalnessMap={value:this.secondMetalnessMap},e.uniforms.secondAoMap={value:this.secondAoMap},e.uniforms.noiseMap={value:this.noiseMap},e.uniforms.progress={value:this.progress},e.uniforms.mergedSize={value:this.mergedSize},e.uniforms.noiseScale={value:this.noiseScale},this.userData.shader=e,e.fragmentShader=`
186
+ uniform float progress;
187
+ uniform float mergedSize;
188
+ uniform float noiseScale;
189
+ ${this.secondMap?"uniform sampler2D secondMap;":""}
190
+ ${this.secondNormalMap?"uniform sampler2D secondNormalMap;":""}
191
+ ${this.secondRoughnessMap?"uniform sampler2D secondRoughnessMap;":""}
192
+ ${this.secondMetalnessMap?"uniform sampler2D secondMetalnessMap;":""}
193
+ ${this.secondAoMap?"uniform sampler2D secondAoMap;":""}
194
+ uniform sampler2D noiseMap;
195
+
196
+ float sampleNoise(vec2 uv) {
197
+ return texture2D(noiseMap, uv * noiseScale).r;
198
+ }
199
+
200
+ vec2 blendMasks(vec2 uv) {
201
+ float noiseVal = sampleNoise(uv);
202
+ float maskLo = smoothstep(progress - mergedSize, progress, noiseVal);
203
+ float maskHi = smoothstep(progress, progress + mergedSize, noiseVal);
204
+ float borderMask = maskLo * (1.0 - maskHi);
205
+ return vec2(maskHi, borderMask);
206
+ }
207
+ `+e.fragmentShader,e.vertexShader=`
208
+ uniform float progress;
209
+ uniform float mergedSize;
210
+ uniform float noiseScale;
211
+ ${this.secondDisplacementMap?"uniform sampler2D secondDisplacementMap;":""}
212
+ uniform sampler2D noiseMap;
213
+
214
+ float sampleNoise(vec2 uv) {
215
+ return texture2D(noiseMap, uv * noiseScale).r;
216
+ }
217
+
218
+ vec2 blendMasks(vec2 uv) {
219
+ float noiseVal = sampleNoise(uv);
220
+ float maskLo = smoothstep(progress - mergedSize, progress, noiseVal);
221
+ float maskHi = smoothstep(progress, progress + mergedSize, noiseVal);
222
+ float borderMask = maskLo * (1.0 - maskHi);
223
+ return vec2(maskHi, borderMask);
224
+ }
225
+ `+e.vertexShader,e.fragmentShader=e.fragmentShader.replace("#include <map_fragment>",`
226
+ #ifdef USE_MAP
227
+ vec4 texelColor1 = texture2D( map, vMapUv );
228
+ #ifdef USE_SECOND_MAP
229
+ vec4 texelColor2 = texture2D( secondMap, vMapUv );
230
+ vec2 colorMasks = blendMasks(vMapUv);
231
+ float maskHiColor = colorMasks.x;
232
+ float borderMaskColor = colorMasks.y;
233
+ vec4 blendedColor = mix(texelColor2, texelColor1, maskHiColor);
234
+ vec4 borderColor = mix(texelColor2, texelColor1, mergedSize);
235
+ vec4 finalColor = mix(blendedColor, borderColor, borderMaskColor);
236
+
237
+ diffuseColor *= finalColor;
238
+ #else
239
+ diffuseColor *= texelColor1;
240
+ #endif
241
+ #endif
242
+ `),e.fragmentShader=e.fragmentShader.replace("#include <roughnessmap_fragment>",`
243
+ float roughnessFactor = roughness;
244
+ #ifdef USE_ROUGHNESSMAP
245
+ float rough1 = texture2D( roughnessMap, vRoughnessMapUv ).g;
246
+ #ifdef USE_SECOND_ROUGHNESSMAP
247
+ float rough2 = texture2D( secondRoughnessMap, vRoughnessMapUv ).g;
248
+ vec2 roughMasks = blendMasks(vMapUv);
249
+ float maskHiRough = roughMasks.x;
250
+ float borderMaskRough = roughMasks.y;
251
+ float blendedRough = mix( rough2, rough1, maskHiRough );
252
+ float borderValueRough = mix( rough1, rough2, 0.5 );
253
+ roughnessFactor *= mix( blendedRough, borderValueRough, borderMaskRough );
254
+ #else
255
+ roughnessFactor *= rough1;
256
+ #endif
257
+ #endif
258
+ `),e.fragmentShader=e.fragmentShader.replace("#include <metalnessmap_fragment>",`
259
+ float metalnessFactor = metalness;
260
+ #ifdef USE_METALNESSMAP
261
+ float metal1 = texture2D( metalnessMap, vMetalnessMapUv ).b;
262
+ #ifdef USE_SECOND_METALNESSMAP
263
+ float metal2 = texture2D( secondMetalnessMap, vMetalnessMapUv ).b;
264
+ vec2 metalMasks = blendMasks(vMapUv);
265
+ float maskHiMetal = metalMasks.x;
266
+ float borderMaskMetal = metalMasks.y;
267
+ float blendedMetal = mix( metal2, metal1, maskHiMetal );
268
+ float borderValueMetal = mix( metal1, metal2, 0.5 );
269
+ metalnessFactor *= mix( blendedMetal, borderValueMetal, borderMaskMetal );
270
+ #else
271
+ metalnessFactor *= metal1;
272
+ #endif
273
+ #endif
274
+ `),e.fragmentShader=e.fragmentShader.replace("#include <normal_fragment_maps>",`
275
+ #ifdef USE_NORMALMAP_TANGENTSPACE
276
+ vec3 n1 = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;
277
+ #ifdef USE_SECOND_NORMALMAP
278
+ vec3 n2 = texture2D( secondNormalMap, vNormalMapUv ).xyz * 2.0 - 1.0;
279
+ float maskHiNormal = blendMasks(vMapUv).x;
280
+ vec3 blendedNormal = normalize( mix( n2, n1, maskHiNormal ) );
281
+ #else
282
+ vec3 blendedNormal = n1;
283
+ #endif
284
+ blendedNormal.xy *= normalScale;
285
+ normal = normalize( tbn * blendedNormal );
286
+ #endif
287
+ `),e.fragmentShader=e.fragmentShader.replace("#include <aomap_fragment>",`
288
+ #ifdef USE_AOMAP
289
+ float ao1 = texture2D( aoMap, vAoMapUv ).r;
290
+ #ifdef USE_SECOND_AOMAP
291
+ float ao2 = texture2D( secondAoMap, vAoMapUv ).r;
292
+ vec2 aoMasks = blendMasks(vMapUv);
293
+ float maskHiAo = aoMasks.x;
294
+ float borderMaskAo = aoMasks.y;
295
+ float blendedAo = mix( ao2, ao1, maskHiAo );
296
+ float borderValueAo = mix( ao1, ao2, 0.5 );
297
+ float aoValue = mix( blendedAo, borderValueAo, borderMaskAo );
298
+ #else
299
+ float aoValue = ao1;
300
+ #endif
301
+
302
+ float ambientOcclusion = ( aoValue - 1.0 ) * aoMapIntensity + 1.0;
303
+ reflectedLight.indirectDiffuse *= ambientOcclusion;
304
+
305
+ #if defined( USE_CLEARCOAT )
306
+ clearcoatSpecularIndirect *= ambientOcclusion;
307
+ #endif
308
+
309
+ #if defined( USE_SHEEN )
310
+ sheenSpecularIndirect *= ambientOcclusion;
311
+ #endif
312
+
313
+ #if defined( USE_ENVMAP ) && defined( STANDARD )
314
+ float dotNV = saturate( dot( geometryNormal, geometryViewDir ) );
315
+ reflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );
316
+ #endif
317
+ #endif
318
+ `),e.vertexShader=e.vertexShader.replace("#include <displacementmap_vertex>",`
319
+ #ifdef USE_DISPLACEMENTMAP
320
+ float disp1 = texture2D( displacementMap, vDisplacementMapUv ).x;
321
+ #ifdef USE_SECOND_DISPLACEMENTMAP
322
+ float disp2 = texture2D( secondDisplacementMap, vDisplacementMapUv ).x;
323
+ vec2 dispMasks = blendMasks(vMapUv);
324
+ float maskHiDisp = dispMasks.x;
325
+ float borderMaskDisp = dispMasks.y;
326
+ float blendedDisp = mix( disp2, disp1, maskHiDisp );
327
+ float borderValueDisp = mix( disp1, disp2, 0.5 );
328
+ float disp = mix( blendedDisp, borderValueDisp, borderMaskDisp );
329
+ #else
330
+ float disp = disp1;
331
+ #endif
332
+ transformed += normalize( objectNormal ) * ( disp * displacementScale + displacementBias );
333
+ #endif
334
+ `)}}setMerge(s){this.progress=s,this.userData.shader&&(this.userData.shader.uniforms.progress.value=s)}setMergedSize(s){this.mergedSize=s,this.userData.shader&&(this.userData.shader.uniforms.mergedSize.value=s)}setNoiseScale(s){this.noiseScale=s,this.userData.shader&&(this.userData.shader.uniforms.noiseScale.value=s)}}n.DTMeshBasicMaterial=S,n.DTMeshPhysicalMaterial=h,n.DTMeshStandardMaterial=b,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})});
package/dist/vite.svg ADDED
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@jaimebboyjt/three-double-texture-materials",
3
+ "version": "0.0.1",
4
+ "license": "MIT",
5
+ "private": false,
6
+ "description": "A Three.js library for combining textures easily",
7
+ "publishConfig": {
8
+ "access": "public"
9
+ },
10
+ "type": "module",
11
+ "keywords": [
12
+ "3d",
13
+ "threejs",
14
+ "three"
15
+ ],
16
+ "maintainers": [
17
+ "Jaime Torrealba (https://github.com/JaimeTorrealba)"
18
+ ],
19
+ "scripts": {
20
+ "dev": "cd ./playground && vite",
21
+ "build": "tsc && vite build",
22
+ "preview": "vite preview"
23
+ },
24
+ "main": "./dist/three-double-texture-materials.js",
25
+ "module": "./dist/three-double-texture-materials.js",
26
+ "exports": {
27
+ ".": {
28
+ "import": "./dist/three-double-texture-materials.js"
29
+ }
30
+ },
31
+ "files": [
32
+ "dist"
33
+ ],
34
+ "peerDependencies": {
35
+ "three": ">=0.181.0"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^22.15.24",
39
+ "@types/three": "^0.181.0",
40
+ "rollup-plugin-visualizer": "^6.0.1",
41
+ "typescript": "~5.7.2",
42
+ "vite": "^6.2.0"
43
+ },
44
+ "dependencies": {
45
+ "tweakpane": "^4.0.5"
46
+ }
47
+ }