@jaimebboyjt/three-double-texture-materials 0.0.1 → 0.1.0
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/README.md
CHANGED
|
@@ -1 +1,172 @@
|
|
|
1
|
-
|
|
1
|
+

|
|
2
|
+
|
|
3
|
+
# Three double texture materials
|
|
4
|
+
|
|
5
|
+
`Three double texture material` (I know, I know, long name right...) is a simple yet in many occasion useful npm pkg that extend your materials in `three.js`, making them possible to add a second texture ,this includes PBR textures like: `normalMap`, `aoMap`, `roughnessMap` etc.
|
|
6
|
+
|
|
7
|
+
Making them possible to easily combine them without a specialized software like `blender`, `substance designer` or `armory paint`. Keep in mind that this tool doesn't replace those softwares
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm i @jaimebboyjt/three-double-texture-materials
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
All three classes share the same blending parameters and helper methods. The blending is driven by an internal Perlin noise texture — no extra setup required.
|
|
18
|
+
|
|
19
|
+
### Common parameters
|
|
20
|
+
|
|
21
|
+
| Parameter | Type | Default | Description |
|
|
22
|
+
|---|---|---|---|
|
|
23
|
+
| `blend` | `number` | `0.5` | Blend point between the two textures (0–1). |
|
|
24
|
+
| `feather` | `number` | `0.1` | Width of the transition edge. Larger values produce a softer blend. |
|
|
25
|
+
| `noiseScale` | `number` | `1` | Tiling scale of the noise texture used for the transition. |
|
|
26
|
+
| `noiseMap` | `Texture \| null` | Perlin (built-in) | Override the default noise texture with your own. |
|
|
27
|
+
|
|
28
|
+
### Common methods
|
|
29
|
+
|
|
30
|
+
| Method | Description |
|
|
31
|
+
|---|---|
|
|
32
|
+
| `setblend(value: number)` | Update `blend` at runtime (e.g. inside an animation loop). |
|
|
33
|
+
| `setFeather(value: number)` | Update `feather` at runtime. |
|
|
34
|
+
| `setNoiseScale(value: number)` | Update `noiseScale` at runtime. |
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
### DTMeshBasicMaterial
|
|
39
|
+
|
|
40
|
+
Extends `MeshBasicMaterial`. Accepts all standard `MeshBasicMaterialParameters` plus a second color map.
|
|
41
|
+
|
|
42
|
+
| Extra parameter | Type | Description |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| `secondMap` | `Texture \| null` | Second albedo texture to blend with `map`. |
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
import * as THREE from 'three'
|
|
48
|
+
import { DTMeshBasicMaterial } from '@jaimebboyjt/three-double-texture-materials'
|
|
49
|
+
|
|
50
|
+
const loader = new THREE.TextureLoader()
|
|
51
|
+
|
|
52
|
+
const material = new DTMeshBasicMaterial({
|
|
53
|
+
map: loader.load('/textures/grass/albedo.jpg'),
|
|
54
|
+
secondMap: loader.load('/textures/rock/albedo.jpg'),
|
|
55
|
+
blend: 0.5, // blend midpoint
|
|
56
|
+
feather: 0.15, // edge softness
|
|
57
|
+
noiseScale: 2, // noise tiling
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
// Animate the transition at runtime
|
|
61
|
+
function animate() {
|
|
62
|
+
requestAnimationFrame(animate)
|
|
63
|
+
material.setBlend(Math.sin(Date.now() * 0.001) * 0.5 + 0.5)
|
|
64
|
+
renderer.render(scene, camera)
|
|
65
|
+
}
|
|
66
|
+
animate()
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
### DTMeshStandardMaterial
|
|
72
|
+
|
|
73
|
+
Extends `MeshStandardMaterial`. Accepts all standard `MeshStandardMaterialParameters` plus a full second PBR texture set.
|
|
74
|
+
|
|
75
|
+
| Extra parameter | Type | Description |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| `secondMap` | `Texture \| null` | Second albedo texture. |
|
|
78
|
+
| `secondNormalMap` | `Texture \| null` | Second normal map. |
|
|
79
|
+
| `secondRoughnessMap` | `Texture \| null` | Second roughness map. |
|
|
80
|
+
| `secondMetalnessMap` | `Texture \| null` | Second metalness map. |
|
|
81
|
+
| `secondAoMap` | `Texture \| null` | Second ambient occlusion map. |
|
|
82
|
+
| `secondDisplacementMap` | `Texture \| null` | Second displacement map. |
|
|
83
|
+
|
|
84
|
+
```js
|
|
85
|
+
import * as THREE from 'three'
|
|
86
|
+
import { DTMeshStandardMaterial } from '@jaimebboyjt/three-double-texture-materials'
|
|
87
|
+
|
|
88
|
+
const loader = new THREE.TextureLoader()
|
|
89
|
+
|
|
90
|
+
const material = new DTMeshStandardMaterial({
|
|
91
|
+
// First PBR set (standard three.js params)
|
|
92
|
+
map: loader.load('/textures/moss/albedo.jpg'),
|
|
93
|
+
normalMap: loader.load('/textures/moss/normal.jpg'),
|
|
94
|
+
roughnessMap: loader.load('/textures/moss/roughness.jpg'),
|
|
95
|
+
aoMap: loader.load('/textures/moss/ao.jpg'),
|
|
96
|
+
|
|
97
|
+
// Second PBR set
|
|
98
|
+
secondMap: loader.load('/textures/metal/albedo.jpg'),
|
|
99
|
+
secondNormalMap: loader.load('/textures/metal/normal.jpg'),
|
|
100
|
+
secondRoughnessMap: loader.load('/textures/metal/roughness.jpg'),
|
|
101
|
+
secondAoMap: loader.load('/textures/metal/ao.jpg'),
|
|
102
|
+
|
|
103
|
+
blend: 0.5,
|
|
104
|
+
feather: 0.1,
|
|
105
|
+
noiseScale: 1,
|
|
106
|
+
})
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
### DTMeshPhysicalMaterial
|
|
112
|
+
|
|
113
|
+
Extends `MeshPhysicalMaterial`. Identical second-texture API to `DTMeshStandardMaterial`, with the addition of all `MeshPhysicalMaterialParameters` (clearcoat, transmission, iridescence, etc.).
|
|
114
|
+
|
|
115
|
+
| Extra parameter | Type | Description |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| `secondMap` | `Texture \| null` | Second albedo texture. |
|
|
118
|
+
| `secondNormalMap` | `Texture \| null` | Second normal map. |
|
|
119
|
+
| `secondRoughnessMap` | `Texture \| null` | Second roughness map. |
|
|
120
|
+
| `secondMetalnessMap` | `Texture \| null` | Second metalness map. |
|
|
121
|
+
| `secondAoMap` | `Texture \| null` | Second ambient occlusion map. |
|
|
122
|
+
| `secondDisplacementMap` | `Texture \| null` | Second displacement map. |
|
|
123
|
+
|
|
124
|
+
```js
|
|
125
|
+
import * as THREE from 'three'
|
|
126
|
+
import { DTMeshPhysicalMaterial } from '@jaimebboyjt/three-double-texture-materials'
|
|
127
|
+
|
|
128
|
+
const loader = new THREE.TextureLoader()
|
|
129
|
+
|
|
130
|
+
const material = new DTMeshPhysicalMaterial({
|
|
131
|
+
// Physical-only params
|
|
132
|
+
clearcoat: 1,
|
|
133
|
+
clearcoatRoughness: 0.1,
|
|
134
|
+
|
|
135
|
+
// First PBR set
|
|
136
|
+
map: loader.load('/textures/ice/albedo.jpg'),
|
|
137
|
+
normalMap: loader.load('/textures/ice/normal.jpg'),
|
|
138
|
+
roughnessMap: loader.load('/textures/ice/roughness.jpg'),
|
|
139
|
+
|
|
140
|
+
// Second PBR set
|
|
141
|
+
secondMap: loader.load('/textures/rock/albedo.jpg'),
|
|
142
|
+
secondNormalMap: loader.load('/textures/rock/normal.jpg'),
|
|
143
|
+
secondRoughnessMap: loader.load('/textures/rock/roughness.jpg'),
|
|
144
|
+
|
|
145
|
+
blend: 0.4,
|
|
146
|
+
feather: 0.2,
|
|
147
|
+
})
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### DTMeshBasicNodeMaterial
|
|
151
|
+
|
|
152
|
+
Soon
|
|
153
|
+
|
|
154
|
+
### DTMeshStandardNodeMaterial
|
|
155
|
+
|
|
156
|
+
Soon
|
|
157
|
+
|
|
158
|
+
### DTMeshPhysicalNodeMaterial
|
|
159
|
+
|
|
160
|
+
Soon
|
|
161
|
+
|
|
162
|
+
## Contributing
|
|
163
|
+
|
|
164
|
+
We are open to contributions, please read the [contributing guide](/CONTRIBUTING.md) to get started.
|
|
165
|
+
|
|
166
|
+
## License
|
|
167
|
+
|
|
168
|
+
[MIT](/LICENSE)
|
|
169
|
+
|
|
170
|
+
## Sponsors
|
|
171
|
+
|
|
172
|
+
Be the first to support this project [here](LINK) ☺️.
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
import { MeshStandardMaterial as N, DataTexture as v, TextureLoader as
|
|
5
|
-
const D = "data:image/png;base64,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";
|
|
1
|
+
var h = Object.defineProperty;
|
|
2
|
+
var S = (l, n, a) => n in l ? h(l, n, { enumerable: !0, configurable: !0, writable: !0, value: a }) : l[n] = a;
|
|
3
|
+
var s = (l, n, a) => S(l, typeof n != "symbol" ? n + "" : n, a);
|
|
4
|
+
import { MeshStandardMaterial as N, DataTexture as v, TextureLoader as D, RepeatWrapping as A, MeshBasicMaterial as C, MeshPhysicalMaterial as x } from "three";
|
|
5
|
+
const g = "data:image/png;base64,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";
|
|
6
6
|
class E extends N {
|
|
7
|
-
constructor(
|
|
8
|
-
const { secondMap: d, secondDisplacementMap: i, secondNormalMap:
|
|
9
|
-
super(
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
if (this.secondMap = d || null, this.secondDisplacementMap = i || null, this.secondNormalMap =
|
|
7
|
+
constructor(a = {}) {
|
|
8
|
+
const { secondMap: d, secondDisplacementMap: i, secondNormalMap: f, secondRoughnessMap: m, secondMetalnessMap: M, secondAoMap: u, noiseMap: o, blend: r, feather: c, noiseScale: p, ...b } = a;
|
|
9
|
+
super(b);
|
|
10
|
+
s(this, "secondMap");
|
|
11
|
+
s(this, "secondDisplacementMap");
|
|
12
|
+
s(this, "secondNormalMap");
|
|
13
|
+
s(this, "secondRoughnessMap");
|
|
14
|
+
s(this, "secondMetalnessMap");
|
|
15
|
+
s(this, "secondAoMap");
|
|
16
|
+
s(this, "noiseMap");
|
|
17
|
+
s(this, "blend");
|
|
18
|
+
s(this, "feather");
|
|
19
|
+
s(this, "noiseScale");
|
|
20
|
+
if (this.secondMap = d || null, this.secondDisplacementMap = i || null, this.secondNormalMap = f || null, this.secondRoughnessMap = m || null, this.secondMetalnessMap = M || null, this.secondAoMap = u || null, o)
|
|
21
21
|
this.noiseMap = o;
|
|
22
22
|
else {
|
|
23
23
|
const e = new v(new Uint8Array([255, 255, 255, 255]), 1, 1);
|
|
24
|
-
e.needsUpdate = !0, this.noiseMap = e, new
|
|
25
|
-
this.noiseMap =
|
|
24
|
+
e.needsUpdate = !0, this.noiseMap = e, new D().load(g, (t) => {
|
|
25
|
+
this.noiseMap = t, t.wrapS = A, t.wrapT = A, this.userData.shader && (this.userData.shader.uniforms.noiseMap.value = t);
|
|
26
26
|
});
|
|
27
27
|
}
|
|
28
|
-
this.
|
|
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.
|
|
30
|
-
uniform float
|
|
31
|
-
uniform float
|
|
28
|
+
this.blend = r ?? 0.5, this.feather = c ?? 0.1, this.noiseScale = p ?? 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.blend = { value: this.blend }, e.uniforms.feather = { value: this.feather }, e.uniforms.noiseScale = { value: this.noiseScale }, this.userData.shader = e, e.fragmentShader = `
|
|
30
|
+
uniform float blend;
|
|
31
|
+
uniform float feather;
|
|
32
32
|
uniform float noiseScale;
|
|
33
33
|
${this.secondMap ? "uniform sampler2D secondMap;" : ""}
|
|
34
34
|
${this.secondNormalMap ? "uniform sampler2D secondNormalMap;" : ""}
|
|
@@ -43,14 +43,14 @@ class E extends N {
|
|
|
43
43
|
|
|
44
44
|
vec2 blendMasks(vec2 uv) {
|
|
45
45
|
float noiseVal = sampleNoise(uv);
|
|
46
|
-
float maskLo = smoothstep(
|
|
47
|
-
float maskHi = smoothstep(
|
|
46
|
+
float maskLo = smoothstep(blend - feather, blend, noiseVal);
|
|
47
|
+
float maskHi = smoothstep(blend, blend + feather, noiseVal);
|
|
48
48
|
float borderMask = maskLo * (1.0 - maskHi);
|
|
49
49
|
return vec2(maskHi, borderMask);
|
|
50
50
|
}
|
|
51
51
|
` + e.fragmentShader, e.vertexShader = `
|
|
52
|
-
uniform float
|
|
53
|
-
uniform float
|
|
52
|
+
uniform float blend;
|
|
53
|
+
uniform float feather;
|
|
54
54
|
uniform float noiseScale;
|
|
55
55
|
${this.secondDisplacementMap ? "uniform sampler2D secondDisplacementMap;" : ""}
|
|
56
56
|
uniform sampler2D noiseMap;
|
|
@@ -61,8 +61,8 @@ class E extends N {
|
|
|
61
61
|
|
|
62
62
|
vec2 blendMasks(vec2 uv) {
|
|
63
63
|
float noiseVal = sampleNoise(uv);
|
|
64
|
-
float maskLo = smoothstep(
|
|
65
|
-
float maskHi = smoothstep(
|
|
64
|
+
float maskLo = smoothstep(blend - feather, blend, noiseVal);
|
|
65
|
+
float maskHi = smoothstep(blend, blend + feather, noiseVal);
|
|
66
66
|
float borderMask = maskLo * (1.0 - maskHi);
|
|
67
67
|
return vec2(maskHi, borderMask);
|
|
68
68
|
}
|
|
@@ -77,7 +77,7 @@ class E extends N {
|
|
|
77
77
|
float maskHiColor = colorMasks.x;
|
|
78
78
|
float borderMaskColor = colorMasks.y;
|
|
79
79
|
vec4 blendedColor = mix(texelColor2, texelColor1, maskHiColor);
|
|
80
|
-
vec4 borderColor = mix(texelColor2, texelColor1,
|
|
80
|
+
vec4 borderColor = mix(texelColor2, texelColor1, feather);
|
|
81
81
|
vec4 finalColor = mix(blendedColor, borderColor, borderMaskColor);
|
|
82
82
|
|
|
83
83
|
diffuseColor *= finalColor;
|
|
@@ -196,37 +196,37 @@ class E extends N {
|
|
|
196
196
|
);
|
|
197
197
|
};
|
|
198
198
|
}
|
|
199
|
-
|
|
200
|
-
this.
|
|
199
|
+
setBlend(a) {
|
|
200
|
+
this.blend = a, this.userData.shader && (this.userData.shader.uniforms.blend.value = a);
|
|
201
201
|
}
|
|
202
|
-
|
|
203
|
-
this.
|
|
202
|
+
setFeather(a) {
|
|
203
|
+
this.feather = a, this.userData.shader && (this.userData.shader.uniforms.feather.value = a);
|
|
204
204
|
}
|
|
205
|
-
setNoiseScale(
|
|
206
|
-
this.noiseScale =
|
|
205
|
+
setNoiseScale(a) {
|
|
206
|
+
this.noiseScale = a, this.userData.shader && (this.userData.shader.uniforms.noiseScale.value = a);
|
|
207
207
|
}
|
|
208
208
|
}
|
|
209
209
|
class k extends C {
|
|
210
|
-
constructor(
|
|
211
|
-
const { secondMap: d, noiseMap: i,
|
|
212
|
-
super(
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
210
|
+
constructor(a = {}) {
|
|
211
|
+
const { secondMap: d, noiseMap: i, blend: f, feather: m, noiseScale: M, ...u } = a;
|
|
212
|
+
super(u);
|
|
213
|
+
s(this, "secondMap");
|
|
214
|
+
s(this, "noiseMap");
|
|
215
|
+
s(this, "blend");
|
|
216
|
+
s(this, "feather");
|
|
217
|
+
s(this, "noiseScale");
|
|
218
218
|
if (this.secondMap = d || null, i)
|
|
219
219
|
this.noiseMap = i;
|
|
220
220
|
else {
|
|
221
221
|
const o = new v(new Uint8Array([255, 255, 255, 255]), 1, 1);
|
|
222
|
-
o.needsUpdate = !0, this.noiseMap = o, new
|
|
223
|
-
this.noiseMap =
|
|
222
|
+
o.needsUpdate = !0, this.noiseMap = o, new D().load(g, (r) => {
|
|
223
|
+
this.noiseMap = r, r.wrapS = A, r.wrapT = A, this.userData.shader && (this.userData.shader.uniforms.noiseMap.value = r);
|
|
224
224
|
});
|
|
225
225
|
}
|
|
226
|
-
this.
|
|
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.
|
|
228
|
-
uniform float
|
|
229
|
-
uniform float
|
|
226
|
+
this.blend = f ?? 0.5, this.feather = m ?? 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.blend = { value: this.blend }, o.uniforms.feather = { value: this.feather }, o.uniforms.noiseScale = { value: this.noiseScale }, this.userData.shader = o, o.fragmentShader = `
|
|
228
|
+
uniform float blend;
|
|
229
|
+
uniform float feather;
|
|
230
230
|
uniform float noiseScale;
|
|
231
231
|
${this.secondMap ? "uniform sampler2D secondMap;" : ""}
|
|
232
232
|
uniform sampler2D noiseMap;
|
|
@@ -237,8 +237,8 @@ class k extends C {
|
|
|
237
237
|
|
|
238
238
|
vec2 blendMasks(vec2 uv) {
|
|
239
239
|
float noiseVal = sampleNoise(uv);
|
|
240
|
-
float maskLo = smoothstep(
|
|
241
|
-
float maskHi = smoothstep(
|
|
240
|
+
float maskLo = smoothstep(blend - feather, blend, noiseVal);
|
|
241
|
+
float maskHi = smoothstep(blend, blend + feather, noiseVal);
|
|
242
242
|
float borderMask = maskLo * (1.0 - maskHi);
|
|
243
243
|
return vec2(maskHi, borderMask);
|
|
244
244
|
}
|
|
@@ -265,42 +265,42 @@ class k extends C {
|
|
|
265
265
|
);
|
|
266
266
|
};
|
|
267
267
|
}
|
|
268
|
-
|
|
269
|
-
this.
|
|
268
|
+
setBlend(a) {
|
|
269
|
+
this.blend = a, this.userData.shader && (this.userData.shader.uniforms.blend.value = a);
|
|
270
270
|
}
|
|
271
|
-
|
|
272
|
-
this.
|
|
271
|
+
setFeather(a) {
|
|
272
|
+
this.feather = a, this.userData.shader && (this.userData.shader.uniforms.feather.value = a);
|
|
273
273
|
}
|
|
274
|
-
setNoiseScale(
|
|
275
|
-
this.noiseScale =
|
|
274
|
+
setNoiseScale(a) {
|
|
275
|
+
this.noiseScale = a, this.userData.shader && (this.userData.shader.uniforms.noiseScale.value = a);
|
|
276
276
|
}
|
|
277
277
|
}
|
|
278
|
-
class
|
|
279
|
-
constructor(
|
|
280
|
-
const { secondMap: d, secondDisplacementMap: i, secondNormalMap:
|
|
281
|
-
super(
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
if (this.secondMap = d || null, this.secondDisplacementMap = i || null, this.secondNormalMap =
|
|
278
|
+
class B extends x {
|
|
279
|
+
constructor(a = {}) {
|
|
280
|
+
const { secondMap: d, secondDisplacementMap: i, secondNormalMap: f, secondRoughnessMap: m, secondMetalnessMap: M, secondAoMap: u, noiseMap: o, blend: r, feather: c, noiseScale: p, ...b } = a;
|
|
281
|
+
super(b);
|
|
282
|
+
s(this, "secondMap");
|
|
283
|
+
s(this, "secondDisplacementMap");
|
|
284
|
+
s(this, "secondNormalMap");
|
|
285
|
+
s(this, "secondRoughnessMap");
|
|
286
|
+
s(this, "secondMetalnessMap");
|
|
287
|
+
s(this, "secondAoMap");
|
|
288
|
+
s(this, "noiseMap");
|
|
289
|
+
s(this, "blend");
|
|
290
|
+
s(this, "feather");
|
|
291
|
+
s(this, "noiseScale");
|
|
292
|
+
if (this.secondMap = d || null, this.secondDisplacementMap = i || null, this.secondNormalMap = f || null, this.secondRoughnessMap = m || null, this.secondMetalnessMap = M || null, this.secondAoMap = u || null, o)
|
|
293
293
|
this.noiseMap = o;
|
|
294
294
|
else {
|
|
295
295
|
const e = new v(new Uint8Array([255, 255, 255, 255]), 1, 1);
|
|
296
|
-
e.needsUpdate = !0, this.noiseMap = e, new
|
|
297
|
-
this.noiseMap =
|
|
296
|
+
e.needsUpdate = !0, this.noiseMap = e, new D().load(g, (t) => {
|
|
297
|
+
this.noiseMap = t, t.wrapS = A, t.wrapT = A, this.userData.shader && (this.userData.shader.uniforms.noiseMap.value = t);
|
|
298
298
|
});
|
|
299
299
|
}
|
|
300
|
-
this.
|
|
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.
|
|
302
|
-
uniform float
|
|
303
|
-
uniform float
|
|
300
|
+
this.blend = r ?? 0.5, this.feather = c ?? 0.1, this.noiseScale = p ?? 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.blend = { value: this.blend }, e.uniforms.feather = { value: this.feather }, e.uniforms.noiseScale = { value: this.noiseScale }, this.userData.shader = e, e.fragmentShader = `
|
|
302
|
+
uniform float blend;
|
|
303
|
+
uniform float feather;
|
|
304
304
|
uniform float noiseScale;
|
|
305
305
|
${this.secondMap ? "uniform sampler2D secondMap;" : ""}
|
|
306
306
|
${this.secondNormalMap ? "uniform sampler2D secondNormalMap;" : ""}
|
|
@@ -315,14 +315,14 @@ class z extends x {
|
|
|
315
315
|
|
|
316
316
|
vec2 blendMasks(vec2 uv) {
|
|
317
317
|
float noiseVal = sampleNoise(uv);
|
|
318
|
-
float maskLo = smoothstep(
|
|
319
|
-
float maskHi = smoothstep(
|
|
318
|
+
float maskLo = smoothstep(blend - feather, blend, noiseVal);
|
|
319
|
+
float maskHi = smoothstep(blend, blend + feather, noiseVal);
|
|
320
320
|
float borderMask = maskLo * (1.0 - maskHi);
|
|
321
321
|
return vec2(maskHi, borderMask);
|
|
322
322
|
}
|
|
323
323
|
` + e.fragmentShader, e.vertexShader = `
|
|
324
|
-
uniform float
|
|
325
|
-
uniform float
|
|
324
|
+
uniform float blend;
|
|
325
|
+
uniform float feather;
|
|
326
326
|
uniform float noiseScale;
|
|
327
327
|
${this.secondDisplacementMap ? "uniform sampler2D secondDisplacementMap;" : ""}
|
|
328
328
|
uniform sampler2D noiseMap;
|
|
@@ -333,8 +333,8 @@ class z extends x {
|
|
|
333
333
|
|
|
334
334
|
vec2 blendMasks(vec2 uv) {
|
|
335
335
|
float noiseVal = sampleNoise(uv);
|
|
336
|
-
float maskLo = smoothstep(
|
|
337
|
-
float maskHi = smoothstep(
|
|
336
|
+
float maskLo = smoothstep(blend - feather, blend, noiseVal);
|
|
337
|
+
float maskHi = smoothstep(blend, blend + feather, noiseVal);
|
|
338
338
|
float borderMask = maskLo * (1.0 - maskHi);
|
|
339
339
|
return vec2(maskHi, borderMask);
|
|
340
340
|
}
|
|
@@ -349,7 +349,7 @@ class z extends x {
|
|
|
349
349
|
float maskHiColor = colorMasks.x;
|
|
350
350
|
float borderMaskColor = colorMasks.y;
|
|
351
351
|
vec4 blendedColor = mix(texelColor2, texelColor1, maskHiColor);
|
|
352
|
-
vec4 borderColor = mix(texelColor2, texelColor1,
|
|
352
|
+
vec4 borderColor = mix(texelColor2, texelColor1, feather);
|
|
353
353
|
vec4 finalColor = mix(blendedColor, borderColor, borderMaskColor);
|
|
354
354
|
|
|
355
355
|
diffuseColor *= finalColor;
|
|
@@ -468,18 +468,18 @@ class z extends x {
|
|
|
468
468
|
);
|
|
469
469
|
};
|
|
470
470
|
}
|
|
471
|
-
|
|
472
|
-
this.
|
|
471
|
+
setBlend(a) {
|
|
472
|
+
this.blend = a, this.userData.shader && (this.userData.shader.uniforms.blend.value = a);
|
|
473
473
|
}
|
|
474
|
-
|
|
475
|
-
this.
|
|
474
|
+
setFeather(a) {
|
|
475
|
+
this.feather = a, this.userData.shader && (this.userData.shader.uniforms.feather.value = a);
|
|
476
476
|
}
|
|
477
|
-
setNoiseScale(
|
|
478
|
-
this.noiseScale =
|
|
477
|
+
setNoiseScale(a) {
|
|
478
|
+
this.noiseScale = a, this.userData.shader && (this.userData.shader.uniforms.noiseScale.value = a);
|
|
479
479
|
}
|
|
480
480
|
}
|
|
481
481
|
export {
|
|
482
482
|
k as DTMeshBasicMaterial,
|
|
483
|
-
|
|
483
|
+
B as DTMeshPhysicalMaterial,
|
|
484
484
|
E as DTMeshStandardMaterial
|
|
485
485
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
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
|
|
3
|
-
uniform float
|
|
1
|
+
(function(t,s){typeof exports=="object"&&typeof module<"u"?s(exports,require("three")):typeof define=="function"&&define.amd?define(["exports","three"],s):(t=typeof globalThis<"u"?globalThis:t||self,s(t["three-double-texture-materials"]={},t.THREE))})(this,function(t,s){"use strict";var N=Object.defineProperty;var x=(t,s,r)=>s in t?N(t,s,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[s]=r;var o=(t,s,r)=>x(t,typeof s!="symbol"?s+"":s,r);const r="data:image/png;base64,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";class g extends s.MeshStandardMaterial{constructor(a={}){const{secondMap:A,secondDisplacementMap:d,secondNormalMap:f,secondRoughnessMap:m,secondMetalnessMap:M,secondAoMap:u,noiseMap:n,blend:i,feather:c,noiseScale:p,...b}=a;super(b);o(this,"secondMap");o(this,"secondDisplacementMap");o(this,"secondNormalMap");o(this,"secondRoughnessMap");o(this,"secondMetalnessMap");o(this,"secondAoMap");o(this,"noiseMap");o(this,"blend");o(this,"feather");o(this,"noiseScale");if(this.secondMap=A||null,this.secondDisplacementMap=d||null,this.secondNormalMap=f||null,this.secondRoughnessMap=m||null,this.secondMetalnessMap=M||null,this.secondAoMap=u||null,n)this.noiseMap=n;else{const e=new s.DataTexture(new Uint8Array([255,255,255,255]),1,1);e.needsUpdate=!0,this.noiseMap=e,new s.TextureLoader().load(r,l=>{this.noiseMap=l,l.wrapS=s.RepeatWrapping,l.wrapT=s.RepeatWrapping,this.userData.shader&&(this.userData.shader.uniforms.noiseMap.value=l)})}this.blend=i??.5,this.feather=c??.1,this.noiseScale=p??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.blend={value:this.blend},e.uniforms.feather={value:this.feather},e.uniforms.noiseScale={value:this.noiseScale},this.userData.shader=e,e.fragmentShader=`
|
|
2
|
+
uniform float blend;
|
|
3
|
+
uniform float feather;
|
|
4
4
|
uniform float noiseScale;
|
|
5
5
|
${this.secondMap?"uniform sampler2D secondMap;":""}
|
|
6
6
|
${this.secondNormalMap?"uniform sampler2D secondNormalMap;":""}
|
|
@@ -15,14 +15,14 @@
|
|
|
15
15
|
|
|
16
16
|
vec2 blendMasks(vec2 uv) {
|
|
17
17
|
float noiseVal = sampleNoise(uv);
|
|
18
|
-
float maskLo = smoothstep(
|
|
19
|
-
float maskHi = smoothstep(
|
|
18
|
+
float maskLo = smoothstep(blend - feather, blend, noiseVal);
|
|
19
|
+
float maskHi = smoothstep(blend, blend + feather, noiseVal);
|
|
20
20
|
float borderMask = maskLo * (1.0 - maskHi);
|
|
21
21
|
return vec2(maskHi, borderMask);
|
|
22
22
|
}
|
|
23
23
|
`+e.fragmentShader,e.vertexShader=`
|
|
24
|
-
uniform float
|
|
25
|
-
uniform float
|
|
24
|
+
uniform float blend;
|
|
25
|
+
uniform float feather;
|
|
26
26
|
uniform float noiseScale;
|
|
27
27
|
${this.secondDisplacementMap?"uniform sampler2D secondDisplacementMap;":""}
|
|
28
28
|
uniform sampler2D noiseMap;
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
|
|
34
34
|
vec2 blendMasks(vec2 uv) {
|
|
35
35
|
float noiseVal = sampleNoise(uv);
|
|
36
|
-
float maskLo = smoothstep(
|
|
37
|
-
float maskHi = smoothstep(
|
|
36
|
+
float maskLo = smoothstep(blend - feather, blend, noiseVal);
|
|
37
|
+
float maskHi = smoothstep(blend, blend + feather, noiseVal);
|
|
38
38
|
float borderMask = maskLo * (1.0 - maskHi);
|
|
39
39
|
return vec2(maskHi, borderMask);
|
|
40
40
|
}
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
float maskHiColor = colorMasks.x;
|
|
48
48
|
float borderMaskColor = colorMasks.y;
|
|
49
49
|
vec4 blendedColor = mix(texelColor2, texelColor1, maskHiColor);
|
|
50
|
-
vec4 borderColor = mix(texelColor2, texelColor1,
|
|
50
|
+
vec4 borderColor = mix(texelColor2, texelColor1, feather);
|
|
51
51
|
vec4 finalColor = mix(blendedColor, borderColor, borderMaskColor);
|
|
52
52
|
|
|
53
53
|
diffuseColor *= finalColor;
|
|
@@ -147,9 +147,9 @@
|
|
|
147
147
|
#endif
|
|
148
148
|
transformed += normalize( objectNormal ) * ( disp * displacementScale + displacementBias );
|
|
149
149
|
#endif
|
|
150
|
-
`)}}
|
|
151
|
-
uniform float
|
|
152
|
-
uniform float
|
|
150
|
+
`)}}setBlend(a){this.blend=a,this.userData.shader&&(this.userData.shader.uniforms.blend.value=a)}setFeather(a){this.feather=a,this.userData.shader&&(this.userData.shader.uniforms.feather.value=a)}setNoiseScale(a){this.noiseScale=a,this.userData.shader&&(this.userData.shader.uniforms.noiseScale.value=a)}}class h extends s.MeshBasicMaterial{constructor(a={}){const{secondMap:A,noiseMap:d,blend:f,feather:m,noiseScale:M,...u}=a;super(u);o(this,"secondMap");o(this,"noiseMap");o(this,"blend");o(this,"feather");o(this,"noiseScale");if(this.secondMap=A||null,d)this.noiseMap=d;else{const n=new s.DataTexture(new Uint8Array([255,255,255,255]),1,1);n.needsUpdate=!0,this.noiseMap=n,new s.TextureLoader().load(r,i=>{this.noiseMap=i,i.wrapS=s.RepeatWrapping,i.wrapT=s.RepeatWrapping,this.userData.shader&&(this.userData.shader.uniforms.noiseMap.value=i)})}this.blend=f??.5,this.feather=m??.1,this.noiseScale=M??1,this.onBeforeCompile=n=>{n.defines=n.defines||{},this.secondMap&&(n.defines.USE_SECOND_MAP=""),n.uniforms.secondMap={value:this.secondMap},n.uniforms.noiseMap={value:this.noiseMap},n.uniforms.blend={value:this.blend},n.uniforms.feather={value:this.feather},n.uniforms.noiseScale={value:this.noiseScale},this.userData.shader=n,n.fragmentShader=`
|
|
151
|
+
uniform float blend;
|
|
152
|
+
uniform float feather;
|
|
153
153
|
uniform float noiseScale;
|
|
154
154
|
${this.secondMap?"uniform sampler2D secondMap;":""}
|
|
155
155
|
uniform sampler2D noiseMap;
|
|
@@ -160,12 +160,12 @@
|
|
|
160
160
|
|
|
161
161
|
vec2 blendMasks(vec2 uv) {
|
|
162
162
|
float noiseVal = sampleNoise(uv);
|
|
163
|
-
float maskLo = smoothstep(
|
|
164
|
-
float maskHi = smoothstep(
|
|
163
|
+
float maskLo = smoothstep(blend - feather, blend, noiseVal);
|
|
164
|
+
float maskHi = smoothstep(blend, blend + feather, noiseVal);
|
|
165
165
|
float borderMask = maskLo * (1.0 - maskHi);
|
|
166
166
|
return vec2(maskHi, borderMask);
|
|
167
167
|
}
|
|
168
|
-
`+
|
|
168
|
+
`+n.fragmentShader,n.fragmentShader=n.fragmentShader.replace("#include <map_fragment>",`
|
|
169
169
|
#ifdef USE_MAP
|
|
170
170
|
vec4 texelColor1 = texture2D( map, vMapUv );
|
|
171
171
|
#ifdef USE_SECOND_MAP
|
|
@@ -182,9 +182,9 @@
|
|
|
182
182
|
diffuseColor *= texelColor1;
|
|
183
183
|
#endif
|
|
184
184
|
#endif
|
|
185
|
-
`)}}
|
|
186
|
-
uniform float
|
|
187
|
-
uniform float
|
|
185
|
+
`)}}setBlend(a){this.blend=a,this.userData.shader&&(this.userData.shader.uniforms.blend.value=a)}setFeather(a){this.feather=a,this.userData.shader&&(this.userData.shader.uniforms.feather.value=a)}setNoiseScale(a){this.noiseScale=a,this.userData.shader&&(this.userData.shader.uniforms.noiseScale.value=a)}}class S extends s.MeshPhysicalMaterial{constructor(a={}){const{secondMap:A,secondDisplacementMap:d,secondNormalMap:f,secondRoughnessMap:m,secondMetalnessMap:M,secondAoMap:u,noiseMap:n,blend:i,feather:c,noiseScale:p,...b}=a;super(b);o(this,"secondMap");o(this,"secondDisplacementMap");o(this,"secondNormalMap");o(this,"secondRoughnessMap");o(this,"secondMetalnessMap");o(this,"secondAoMap");o(this,"noiseMap");o(this,"blend");o(this,"feather");o(this,"noiseScale");if(this.secondMap=A||null,this.secondDisplacementMap=d||null,this.secondNormalMap=f||null,this.secondRoughnessMap=m||null,this.secondMetalnessMap=M||null,this.secondAoMap=u||null,n)this.noiseMap=n;else{const e=new s.DataTexture(new Uint8Array([255,255,255,255]),1,1);e.needsUpdate=!0,this.noiseMap=e,new s.TextureLoader().load(r,l=>{this.noiseMap=l,l.wrapS=s.RepeatWrapping,l.wrapT=s.RepeatWrapping,this.userData.shader&&(this.userData.shader.uniforms.noiseMap.value=l)})}this.blend=i??.5,this.feather=c??.1,this.noiseScale=p??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.blend={value:this.blend},e.uniforms.feather={value:this.feather},e.uniforms.noiseScale={value:this.noiseScale},this.userData.shader=e,e.fragmentShader=`
|
|
186
|
+
uniform float blend;
|
|
187
|
+
uniform float feather;
|
|
188
188
|
uniform float noiseScale;
|
|
189
189
|
${this.secondMap?"uniform sampler2D secondMap;":""}
|
|
190
190
|
${this.secondNormalMap?"uniform sampler2D secondNormalMap;":""}
|
|
@@ -199,14 +199,14 @@
|
|
|
199
199
|
|
|
200
200
|
vec2 blendMasks(vec2 uv) {
|
|
201
201
|
float noiseVal = sampleNoise(uv);
|
|
202
|
-
float maskLo = smoothstep(
|
|
203
|
-
float maskHi = smoothstep(
|
|
202
|
+
float maskLo = smoothstep(blend - feather, blend, noiseVal);
|
|
203
|
+
float maskHi = smoothstep(blend, blend + feather, noiseVal);
|
|
204
204
|
float borderMask = maskLo * (1.0 - maskHi);
|
|
205
205
|
return vec2(maskHi, borderMask);
|
|
206
206
|
}
|
|
207
207
|
`+e.fragmentShader,e.vertexShader=`
|
|
208
|
-
uniform float
|
|
209
|
-
uniform float
|
|
208
|
+
uniform float blend;
|
|
209
|
+
uniform float feather;
|
|
210
210
|
uniform float noiseScale;
|
|
211
211
|
${this.secondDisplacementMap?"uniform sampler2D secondDisplacementMap;":""}
|
|
212
212
|
uniform sampler2D noiseMap;
|
|
@@ -217,8 +217,8 @@
|
|
|
217
217
|
|
|
218
218
|
vec2 blendMasks(vec2 uv) {
|
|
219
219
|
float noiseVal = sampleNoise(uv);
|
|
220
|
-
float maskLo = smoothstep(
|
|
221
|
-
float maskHi = smoothstep(
|
|
220
|
+
float maskLo = smoothstep(blend - feather, blend, noiseVal);
|
|
221
|
+
float maskHi = smoothstep(blend, blend + feather, noiseVal);
|
|
222
222
|
float borderMask = maskLo * (1.0 - maskHi);
|
|
223
223
|
return vec2(maskHi, borderMask);
|
|
224
224
|
}
|
|
@@ -231,7 +231,7 @@
|
|
|
231
231
|
float maskHiColor = colorMasks.x;
|
|
232
232
|
float borderMaskColor = colorMasks.y;
|
|
233
233
|
vec4 blendedColor = mix(texelColor2, texelColor1, maskHiColor);
|
|
234
|
-
vec4 borderColor = mix(texelColor2, texelColor1,
|
|
234
|
+
vec4 borderColor = mix(texelColor2, texelColor1, feather);
|
|
235
235
|
vec4 finalColor = mix(blendedColor, borderColor, borderMaskColor);
|
|
236
236
|
|
|
237
237
|
diffuseColor *= finalColor;
|
|
@@ -331,4 +331,4 @@
|
|
|
331
331
|
#endif
|
|
332
332
|
transformed += normalize( objectNormal ) * ( disp * displacementScale + displacementBias );
|
|
333
333
|
#endif
|
|
334
|
-
`)}}
|
|
334
|
+
`)}}setBlend(a){this.blend=a,this.userData.shader&&(this.userData.shader.uniforms.blend.value=a)}setFeather(a){this.feather=a,this.userData.shader&&(this.userData.shader.uniforms.feather.value=a)}setNoiseScale(a){this.noiseScale=a,this.userData.shader&&(this.userData.shader.uniforms.noiseScale.value=a)}}t.DTMeshBasicMaterial=h,t.DTMeshPhysicalMaterial=S,t.DTMeshStandardMaterial=g,Object.defineProperty(t,Symbol.toStringTag,{value:"Module"})});
|
package/package.json
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jaimebboyjt/three-double-texture-materials",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"private": false,
|
|
6
6
|
"description": "A Three.js library for combining textures easily",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/JaimeTorrealba/three-double-texture-material.git"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/JaimeTorrealba/three-double-texture-material/issues"
|
|
13
|
+
},
|
|
14
|
+
"homepage": "https://github.com/JaimeTorrealba/three-double-texture-material",
|
|
7
15
|
"publishConfig": {
|
|
8
16
|
"access": "public"
|
|
9
17
|
},
|