tsl-textures 0.3.0 → 0.4.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/package.json +1 -1
- package/src/clouds.js +61 -0
- package/src/photosphere.js +48 -0
- package/src/satin.js +47 -0
- package/src/simplex-noise.js +39 -0
- package/src/tsl-utils.js +49 -26
package/package.json
CHANGED
package/src/clouds.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Clouds
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { clamp, exp, min, mix, mul, positionLocal, tslFn, vec4 } from 'three/nodes';
|
|
8
|
+
import { noise } from 'tsl-textures/tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var _clouds = tslFn( ( params ) => {
|
|
13
|
+
|
|
14
|
+
var pos = positionLocal.toVar(),
|
|
15
|
+
scale = exp( params.scale.div( 1.5 ).sub( 0.5 ) ).toVar(),
|
|
16
|
+
density = params.density.remap( 0, 1, -0.15, 0.15 ).toVar();
|
|
17
|
+
|
|
18
|
+
var k = noise( pos.mul( scale ).add( params.seed ) ).add( params.density ).toVar( );
|
|
19
|
+
k.addAssign( mul( 0.80, noise( pos.mul( scale, 2 ).add( params.seed ) ) ).add( density ) );
|
|
20
|
+
k.addAssign( mul( 0.10, noise( pos.mul( scale, 6 ).add( params.seed ) ) ).add( density ) );
|
|
21
|
+
k.addAssign( mul( 0.07, noise( pos.mul( scale, 8 ).add( params.seed ) ), params.opacity ).add( density ) );
|
|
22
|
+
|
|
23
|
+
var a = clamp( 0, 1, mul( k, 2 ).pow( 1.5 ).sub( 1 ).mul( params.opacity ) ).toVar();
|
|
24
|
+
|
|
25
|
+
return vec4( mix( params.subcolor, params.color, min( 1, k ) ), a );
|
|
26
|
+
|
|
27
|
+
} );
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
var clouds = tslFn( ( params ) => {
|
|
31
|
+
|
|
32
|
+
return _clouds( params ).rgb;
|
|
33
|
+
|
|
34
|
+
} );
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
clouds.opacity = tslFn( ( params ) => {
|
|
39
|
+
|
|
40
|
+
return _clouds( params ).a;
|
|
41
|
+
|
|
42
|
+
} );
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
clouds.defaults = {
|
|
47
|
+
$name: 'Clouds',
|
|
48
|
+
|
|
49
|
+
scale: 2,
|
|
50
|
+
density: 0.5,
|
|
51
|
+
opacity: 1,
|
|
52
|
+
|
|
53
|
+
color: new Color( 0xFFFFFF ),
|
|
54
|
+
subcolor: new Color( 0xA0A0B0 ),
|
|
55
|
+
|
|
56
|
+
seed: 0,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
export { clouds };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Photosphere
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { exp, loop, mix, positionLocal, tslFn, vec3 } from 'three/nodes';
|
|
8
|
+
import { applyEuler, noise } from 'tsl-textures/tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var photosphere = tslFn( ( params ) => {
|
|
13
|
+
|
|
14
|
+
var scale = exp( params.scale.add( 1 ) ).toVar( );
|
|
15
|
+
var pos = positionLocal.toVar( );
|
|
16
|
+
|
|
17
|
+
var vec = vec3( pos ).toVar();
|
|
18
|
+
|
|
19
|
+
loop( 6, () => {
|
|
20
|
+
|
|
21
|
+
vec.assign( applyEuler( vec, pos.mul( scale ) ) );
|
|
22
|
+
scale.mulAssign( params.seed.mul( scale ).sin().mul( 0.05 ).add( 1.1 ) );
|
|
23
|
+
|
|
24
|
+
} );
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
var k = noise( vec ).add( 1 ).div( 2 );
|
|
28
|
+
|
|
29
|
+
return mix( params.background, params.color, k );
|
|
30
|
+
|
|
31
|
+
} );
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
photosphere.defaults = {
|
|
36
|
+
$name: 'Photosphere',
|
|
37
|
+
|
|
38
|
+
scale: 2,
|
|
39
|
+
|
|
40
|
+
color: new Color( 0xFFFF00 ),
|
|
41
|
+
background: new Color( 0xFF0000 ),
|
|
42
|
+
|
|
43
|
+
seed: 0,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
export { photosphere };
|
package/src/satin.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Satin
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { abs, exp, mix, positionLocal, pow, tslFn, vec3 } from 'three/nodes';
|
|
8
|
+
import { noise } from 'tsl-textures/tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var satin = tslFn( ( params ) => {
|
|
13
|
+
|
|
14
|
+
var pos = positionLocal.toVar( );
|
|
15
|
+
|
|
16
|
+
var scale = exp( params.scale.div( 3 ) ).toVar();
|
|
17
|
+
|
|
18
|
+
var k = noise(
|
|
19
|
+
vec3(
|
|
20
|
+
noise( vec3( pos.x.mul( 2 ), pos.y, pos.z ).mul( scale ) ),
|
|
21
|
+
noise( vec3( pos.x, pos.y.mul( 2 ), pos.z ).mul( scale ) ),
|
|
22
|
+
noise( vec3( pos.x, pos.y, pos.z.mul( 2 ) ).mul( scale ) ),
|
|
23
|
+
).mul( scale ).add( params.seed )
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
k = pow( abs( k ), 3 ).mul( 20 );
|
|
27
|
+
|
|
28
|
+
return mix( params.background, params.color, k );
|
|
29
|
+
|
|
30
|
+
} );
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
satin.defaults = {
|
|
35
|
+
$name: 'Satin',
|
|
36
|
+
|
|
37
|
+
scale: 2,
|
|
38
|
+
|
|
39
|
+
color: new Color( 0x7080FF ),
|
|
40
|
+
background: new Color( 0x000050 ),
|
|
41
|
+
|
|
42
|
+
seed: 0,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
export { satin };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Noise Pattern
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { clamp, exp, mix, positionLocal, tslFn } from 'three/nodes';
|
|
8
|
+
import { noise } from 'tsl-textures/tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var simplexNoise = tslFn( ( params ) => {
|
|
13
|
+
|
|
14
|
+
var pos = positionLocal.mul( exp( params.scale ) ).add( params.seed );
|
|
15
|
+
|
|
16
|
+
var k = clamp( 0, 1, noise( pos ).mul( 0.5, exp( params.contrast ) ).add( 0.5, params.balance ) );
|
|
17
|
+
|
|
18
|
+
return mix( params.background, params.color, k );
|
|
19
|
+
|
|
20
|
+
} );
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
simplexNoise.defaults = {
|
|
25
|
+
$name: 'Simplex noise',
|
|
26
|
+
|
|
27
|
+
scale: 2,
|
|
28
|
+
balance: 0,
|
|
29
|
+
contrast: 0,
|
|
30
|
+
|
|
31
|
+
color: new Color( 0xFFFFFF ),
|
|
32
|
+
background: new Color( 0x000000 ),
|
|
33
|
+
|
|
34
|
+
seed: 0,
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
export { simplexNoise };
|
package/src/tsl-utils.js
CHANGED
|
@@ -1,32 +1,15 @@
|
|
|
1
1
|
|
|
2
2
|
// Equirectangular Texture Generator - TSL Utility Functions
|
|
3
3
|
//
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
function map( x, toMin=0, toMax=1, fromMin=0, fromMax=100 ) {
|
|
12
|
-
|
|
13
|
-
x = MathUtils.mapLinear( x, fromMin, fromMax, toMin, toMax );
|
|
14
|
-
|
|
15
|
-
return x;
|
|
16
|
-
|
|
17
|
-
}
|
|
4
|
+
// hsl( h, s, l ):vec3 - convert from hsl to rgb
|
|
5
|
+
// toHsl( rgb:vec3 ):vec3 - convert from rgb to hsl
|
|
6
|
+
// spherical( phi, theta ):vec3 - from angles to point on unit sphere
|
|
7
|
+
// applyEuler( vec:vec3, eu:vec3 ):vec3 - apply Euler rotation to a vector
|
|
18
8
|
|
|
19
9
|
|
|
20
10
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
x = map( x, 0, 1, fromMin, fromMax );
|
|
24
|
-
x = 2**( x * Math.log2( toMax/toMin ) + Math.log2( toMin ) );
|
|
25
|
-
|
|
26
|
-
return x;
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
|
|
11
|
+
import { add, cond, cos, cross, float, If, max, min, mul, sin, sub, tslFn, uniform, vec3, vec4 } from 'three/nodes';
|
|
12
|
+
import { mx_perlin_noise_float as noise } from 'three/addons/nodes/materialx/lib/mx_noise.js';
|
|
30
13
|
|
|
31
14
|
|
|
32
15
|
// helper function - convert hsl to rgb, ported to TSL from:
|
|
@@ -163,13 +146,53 @@ spherical.setLayout( {
|
|
|
163
146
|
} );
|
|
164
147
|
|
|
165
148
|
|
|
149
|
+
|
|
150
|
+
// apply Euler rotation to a vector
|
|
151
|
+
const applyEuler = tslFn( ([ vec, eu ]) => {
|
|
152
|
+
|
|
153
|
+
var quat = quaternionFromEuler( eu );
|
|
154
|
+
return applyQuaternion( vec, quat );
|
|
155
|
+
|
|
156
|
+
} );
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
// convert Euler XYZ angles to quaternion
|
|
160
|
+
const quaternionFromEuler = tslFn( ([ eu ]) => {
|
|
161
|
+
|
|
162
|
+
var c1 = cos( eu.x.div( 2 ) );
|
|
163
|
+
var c2 = cos( eu.y.div( 2 ) );
|
|
164
|
+
var c3 = cos( eu.z.div( 2 ) );
|
|
165
|
+
|
|
166
|
+
var s1 = sin( eu.x.div( 2 ) );
|
|
167
|
+
var s2 = sin( eu.y.div( 2 ) );
|
|
168
|
+
var s3 = sin( eu.z.div( 2 ) );
|
|
169
|
+
|
|
170
|
+
return vec4(
|
|
171
|
+
add( mul( s1, c2, c3 ), mul( c1, s2, s3 ) ),
|
|
172
|
+
sub( mul( c1, s2, c3 ), mul( s1, c2, s3 ) ),
|
|
173
|
+
add( mul( c1, c2, s3 ), mul( s1, s2, c3 ) ),
|
|
174
|
+
sub( mul( c1, c2, c3 ), mul( s1, s2, s3 ) ),
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
} );
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
// apply quaternion rotation to a vector
|
|
181
|
+
const applyQuaternion = tslFn( ([ vec, quat ]) => {
|
|
182
|
+
|
|
183
|
+
var t = cross( quat, vec ).mul( 2 ).toVar( );
|
|
184
|
+
|
|
185
|
+
return add( vec, t.mul( quat.w ), cross( quat.xyz, t ) );
|
|
186
|
+
|
|
187
|
+
} );
|
|
188
|
+
|
|
189
|
+
|
|
166
190
|
export
|
|
167
191
|
{
|
|
168
|
-
map,
|
|
169
|
-
mapExp,
|
|
170
192
|
noise,
|
|
171
193
|
hsl,
|
|
172
194
|
toHsl,
|
|
173
195
|
dynamic,
|
|
174
|
-
spherical
|
|
196
|
+
spherical,
|
|
197
|
+
applyEuler
|
|
175
198
|
};
|