tsl-textures 0.3.0 → 0.5.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/--concrete.js +37 -0
- package/src/clouds.js +61 -0
- package/src/grid.js +49 -0
- package/src/marble.js +1 -0
- package/src/neon-lights.js +77 -0
- package/src/photosphere.js +48 -0
- package/src/satin.js +47 -0
- package/src/scepter-head.js +66 -0
- package/src/scream.js +46 -0
- package/src/simplex-noise.js +39 -0
- package/src/tsl-utils.js +80 -26
package/package.json
CHANGED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Concrete
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
//import { Color } from "three";
|
|
7
|
+
import { abs, /*add, div,*/ exp, /*If, MeshLambertNodeMaterial, mix,*/ mul, /*oneMinus,*/ positionLocal, pow, remap, tslFn } from 'three/nodes';
|
|
8
|
+
import { /*hsl,*/ noise } from 'tsl-textures/tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var concrete = tslFn( ( params ) => {
|
|
13
|
+
|
|
14
|
+
var pos = positionLocal.mul( exp( params.scale ) ).add( params.seed ).toVar( );
|
|
15
|
+
|
|
16
|
+
var k = noise( pos );
|
|
17
|
+
|
|
18
|
+
//return hsl( 0, 0, mul(params.bump,pow(abs(k.div(2).add(0.5)),remap(params.density,0,1,10,0.5))) );
|
|
19
|
+
return mul( params.bump, pow( abs( k.div( 2 ).add( 0.5 ) ), remap( params.density, 0, 1, 10, 0.5 ) ) );
|
|
20
|
+
|
|
21
|
+
} );
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
concrete.defaults = {
|
|
26
|
+
$name: 'Concrete',
|
|
27
|
+
|
|
28
|
+
scale: 2,
|
|
29
|
+
density: 1,
|
|
30
|
+
bump: 1,
|
|
31
|
+
|
|
32
|
+
seed: 0,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
export { concrete };
|
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 };
|
package/src/grid.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Grid
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { abs, add, div, equirectUV, min, mix, mul, oneMinus, positionLocal, pow, remapClamp, round, sin, smoothstep, sub, tslFn } from 'three/nodes';
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
var grid = tslFn( ( params ) => {
|
|
12
|
+
|
|
13
|
+
var uv = equirectUV( positionLocal.normalize() ).toVar(),
|
|
14
|
+
a = mul( uv.x, 2*Math.PI ),
|
|
15
|
+
b = mul( uv.y, Math.PI ).toVar();
|
|
16
|
+
|
|
17
|
+
var uTo = div( round( mul( uv.x, params.countU ) ), params.countU ),
|
|
18
|
+
vTo = div( round( mul( uv.y, params.countV ) ), params.countV ),
|
|
19
|
+
aTo = mul( uTo, 2*Math.PI ),
|
|
20
|
+
bTo = mul( vTo, Math.PI );
|
|
21
|
+
|
|
22
|
+
var angleU = abs( sub( a, aTo ) ).mul( sin( b ) ),
|
|
23
|
+
angleV = abs( sub( b, bTo ) ),
|
|
24
|
+
angle = min( angleU, angleV );
|
|
25
|
+
|
|
26
|
+
var treshold = mul( min( div( 2*Math.PI, params.countU ), div( Math.PI, params.countV ) ), remapClamp( pow( params.thinness, 0.5 ), 0, 1, 0.9, 0.04 ), 0.5 );
|
|
27
|
+
var k = oneMinus( smoothstep( sub( treshold, 0.002 ), add( treshold, 0.002 ), angle ) );
|
|
28
|
+
|
|
29
|
+
return mix( params.background, params.color, k );
|
|
30
|
+
|
|
31
|
+
} );
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
grid.defaults = {
|
|
36
|
+
$name: 'Grid',
|
|
37
|
+
|
|
38
|
+
countU: 32,
|
|
39
|
+
countV: 16,
|
|
40
|
+
|
|
41
|
+
thinness: 0.8,
|
|
42
|
+
|
|
43
|
+
color: new Color( 0x000000 ),
|
|
44
|
+
background: new Color( 0xFFFFFF ),
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
export { grid };
|
package/src/marble.js
CHANGED
|
@@ -8,6 +8,7 @@ import { add, div, exp, If, mix, mul, oneMinus, positionLocal, pow, tslFn } from
|
|
|
8
8
|
import { noise } from 'tsl-textures/tsl-utils.js';
|
|
9
9
|
|
|
10
10
|
|
|
11
|
+
|
|
11
12
|
var marble = tslFn( ( params ) => {
|
|
12
13
|
|
|
13
14
|
var pos = positionLocal.mul( exp( params.scale ) ).add( params.seed ).toVar( );
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Neon Lights
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { abs, cond, exp, oneMinus, positionLocal, sqrt, tslFn, vec3 } from 'three/nodes';
|
|
8
|
+
import { hsl, noise, toHsl } from 'tsl-textures/tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var neonLights = tslFn( ( params ) => {
|
|
13
|
+
|
|
14
|
+
var pos = positionLocal;//.mul( exp( params.scale ) ).add( params.seed ).toVar( );
|
|
15
|
+
|
|
16
|
+
var scale = exp( params.scale.remap( 0, 4, 2, -2 ) ).toVar();
|
|
17
|
+
var thinness = exp( params.thinness.remap( 0, 1, 1.5, 0 ) ).toVar();
|
|
18
|
+
|
|
19
|
+
var color = params.background.toVar();
|
|
20
|
+
var neon = vec3( 0 ).toVar();
|
|
21
|
+
|
|
22
|
+
var x = noise( pos.xyz ).toVar();
|
|
23
|
+
var y = noise( pos.yzx ).toVar();
|
|
24
|
+
var z = noise( pos.zxy ).toVar();
|
|
25
|
+
|
|
26
|
+
var k = noise( vec3( x, y, z ).mul( scale ).add( params.seed ) ).toVar();
|
|
27
|
+
k.assign( oneMinus( sqrt( abs( k ) ) ).pow( 3 ) );
|
|
28
|
+
|
|
29
|
+
neon.assign( params.colorA );
|
|
30
|
+
var HSL = toHsl( neon );
|
|
31
|
+
neon.assign( hsl( HSL.x, HSL.y, HSL.z.mul( k ) ) );
|
|
32
|
+
|
|
33
|
+
color.addAssign( cond( params.mode.equal( 0 ), neon, neon.negate() ).mul( thinness ) );
|
|
34
|
+
|
|
35
|
+
k.assign( noise( vec3( y, z, x ).mul( scale ).sub( params.seed ) ) );
|
|
36
|
+
k.assign( oneMinus( sqrt( abs( k ) ) ).pow( 3 ) );
|
|
37
|
+
|
|
38
|
+
neon.assign( params.colorB );
|
|
39
|
+
var HSL = toHsl( neon );
|
|
40
|
+
neon.assign( hsl( HSL.x, HSL.y, HSL.z.mul( k ) ) );
|
|
41
|
+
|
|
42
|
+
color.addAssign( cond( params.mode.equal( 0 ), neon, neon.negate() ).mul( thinness ) );
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
k.assign( noise( vec3( z, x, y.negate() ).mul( scale ).add( params.seed ) ) );
|
|
46
|
+
k.assign( oneMinus( sqrt( abs( k ) ) ).pow( 3 ) );
|
|
47
|
+
|
|
48
|
+
neon.assign( params.colorC );
|
|
49
|
+
var HSL = toHsl( neon );
|
|
50
|
+
neon.assign( hsl( HSL.x, HSL.y, HSL.z.mul( k ) ) );
|
|
51
|
+
|
|
52
|
+
color.addAssign( cond( params.mode.equal( 0 ), neon, neon.negate() ).mul( thinness ) );
|
|
53
|
+
|
|
54
|
+
return color;
|
|
55
|
+
|
|
56
|
+
} );
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
neonLights.defaults = {
|
|
61
|
+
$name: 'Neon Lights',
|
|
62
|
+
|
|
63
|
+
scale: 1.5,
|
|
64
|
+
thinness: 0.8,
|
|
65
|
+
mode: 0, // 0=additive, 1=subtractive
|
|
66
|
+
|
|
67
|
+
colorA: new Color( 0xFF0000 ),
|
|
68
|
+
colorB: new Color( 0x00FF00 ),
|
|
69
|
+
colorC: new Color( 0x0000FF ),
|
|
70
|
+
background: new Color( 0x000000 ),
|
|
71
|
+
|
|
72
|
+
seed: 0,
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
export { neonLights };
|
|
@@ -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,66 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Scepter Head
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { abs, add, cos, floor, max, mix, mul, positionLocal, remapClamp, sign, tan, tslFn, vec3 } from 'three/nodes';
|
|
8
|
+
import { hsl, mod, noise, remapExp, toHsl } from 'tsl-textures/tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var scepterHead = tslFn( ( params ) => {
|
|
13
|
+
|
|
14
|
+
var pos = positionLocal;
|
|
15
|
+
|
|
16
|
+
var fx = pos.x.mul( remapExp( params.xFactor, 0, 100, 1.35, 30 ) ).toVar( ),
|
|
17
|
+
fy = pos.y.mul( remapExp( params.yFactor, 0, 100, 1.35, 30 ) ).toVar( ),
|
|
18
|
+
fz = pos.z.mul( remapExp( params.zFactor, 0, 100, 1.35, 30 ) ).toVar( );
|
|
19
|
+
|
|
20
|
+
var cosX = cos( fx ).toVar(),
|
|
21
|
+
cosY = cos( fy ).toVar(),
|
|
22
|
+
cosZ = cos( fz ).toVar();
|
|
23
|
+
|
|
24
|
+
var k = noise( vec3( pos.x.div( cosX ), pos.y.div( cosY ), pos.z.div( cosZ ) ) );
|
|
25
|
+
|
|
26
|
+
k = sign( k ).mul( abs( k ).pow( 0.75 ) );
|
|
27
|
+
|
|
28
|
+
var dx = abs( mul( fx, tan( fx ) ).add( 1 ).div( cos( fx ) ) ),
|
|
29
|
+
dy = abs( mul( fy, tan( fy ) ).add( 1 ).div( cos( fy ) ) ),
|
|
30
|
+
dz = abs( mul( fz, tan( fz ) ).add( 1 ).div( cos( fz ) ) );
|
|
31
|
+
|
|
32
|
+
var HSL = vec3().toVar();
|
|
33
|
+
|
|
34
|
+
var indexX = ( abs( floor( ( fx.mul( 2/Math.PI ).add( 1 ) ).div( 2 ) ) ) ),
|
|
35
|
+
indexY = ( abs( floor( ( fy.mul( 2/Math.PI ).add( 1 ) ).div( 2 ) ) ) ),
|
|
36
|
+
indexZ = ( abs( floor( ( fz.mul( 2/Math.PI ).add( 1 ) ).div( 2 ) ) ) );
|
|
37
|
+
|
|
38
|
+
var index = mod( ( add( indexX, indexY, indexZ ) ), 2 );
|
|
39
|
+
|
|
40
|
+
HSL.assign( toHsl( mix( params.colorA, params.colorB, index ) ) );
|
|
41
|
+
var color1 = hsl( HSL.x, HSL.y, HSL.z.mul( k ) ).toVar();
|
|
42
|
+
|
|
43
|
+
HSL.assign( toHsl( params.colorRim ) );
|
|
44
|
+
var color2 = hsl( HSL.x, HSL.y, mul( 2, k, HSL.z ) ).toVar();
|
|
45
|
+
|
|
46
|
+
return mix( color1, color2, remapClamp( max( dx, max( dy, dz ) ), 55-10, 55+10 ) );
|
|
47
|
+
|
|
48
|
+
} );
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
scepterHead.defaults = {
|
|
53
|
+
$name: 'Scepter head',
|
|
54
|
+
|
|
55
|
+
xFactor: 10,
|
|
56
|
+
yFactor: 22,
|
|
57
|
+
zFactor: 10,
|
|
58
|
+
|
|
59
|
+
colorRim: new Color( 0xFFFFFF ),
|
|
60
|
+
colorA: new Color( 0x70E0FF ),
|
|
61
|
+
colorB: new Color( 0x3000FF ),
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
export { scepterHead };
|
package/src/scream.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Scream
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { add, cos, exp, mix, positionLocal, sin, tslFn } from 'three/nodes';
|
|
8
|
+
import { hsl, noise, toHsl } from 'tsl-textures/tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var scream = tslFn( ( params ) => {
|
|
13
|
+
|
|
14
|
+
var pos = positionLocal.mul( exp( params.scale ) ).add( params.seed ).toVar( );
|
|
15
|
+
|
|
16
|
+
var k = noise( add( sin( pos.xyz ), cos( pos.yzx ) ) );
|
|
17
|
+
|
|
18
|
+
pos.assign( positionLocal.mul( exp( params.scale ).mul( k ) ).add( params.seed ) );
|
|
19
|
+
|
|
20
|
+
var k = noise( add( sin( pos.xyz ), cos( pos.yzx ) ).mul( 2 ) );
|
|
21
|
+
|
|
22
|
+
var col = mix( params.background, params.color, k ).toVar();
|
|
23
|
+
|
|
24
|
+
var HSL = toHsl( col ).toVar();
|
|
25
|
+
|
|
26
|
+
return hsl( add( HSL.x, params.variety.mul( sin( k.mul( Math.PI ) ) ).mul( 0.5 ) ), HSL.y, HSL.z );
|
|
27
|
+
|
|
28
|
+
} );
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
scream.defaults = {
|
|
33
|
+
$name: 'Scream',
|
|
34
|
+
|
|
35
|
+
scale: 2,
|
|
36
|
+
variety: 1,
|
|
37
|
+
|
|
38
|
+
color: new Color( 0xF0F060 ),
|
|
39
|
+
background: new Color( 0xD09090 ),
|
|
40
|
+
|
|
41
|
+
seed: 0,
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
export { scream };
|
|
@@ -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
|
+
// 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
|
|
4
8
|
|
|
5
|
-
import { MathUtils } from 'three';
|
|
6
|
-
import { add, cond, cos, float, If, max, min, sin, sub, tslFn, uniform, vec3 } from 'three/nodes';
|
|
7
|
-
import { mx_perlin_noise_float as noise } from 'three/addons/nodes/materialx/lib/mx_noise.js';
|
|
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
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
function mapExp( x, toMin, toMax, fromMin=0, fromMax=100 ) {
|
|
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
9
|
|
|
28
|
-
}
|
|
29
10
|
|
|
11
|
+
import { add, cond, cos, cross, div, float, floor, If, log2, max, min, mul, pow, remap, 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,84 @@ 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
|
+
|
|
190
|
+
// calculate modulo (missing in TSL?)
|
|
191
|
+
const mod = tslFn( ([ x, y ]) => {
|
|
192
|
+
|
|
193
|
+
return sub( x, floor( div( x, y ) ).mul( y ) );
|
|
194
|
+
|
|
195
|
+
} );
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
// exponential version of remap
|
|
200
|
+
const remapExp = tslFn( ([ x, fromMin, fromMax, toMin, toMax ]) => {
|
|
201
|
+
|
|
202
|
+
x = remap( x, fromMin, fromMax, 0, 1 );
|
|
203
|
+
x = pow( 2, mul( x, log2( toMax.div( toMin ) ) ).add( log2( toMin ) ) );
|
|
204
|
+
return x;
|
|
205
|
+
/*
|
|
206
|
+
|
|
207
|
+
function mapExp( x, toMin, toMax, fromMin=0, fromMax=100 ) {
|
|
208
|
+
|
|
209
|
+
x = map( x, 0, 1, fromMin, fromMax );
|
|
210
|
+
x = 2**( x * Math.log2( toMax/toMin ) + Math.log2( toMin ) );
|
|
211
|
+
|
|
212
|
+
return x;
|
|
213
|
+
|
|
214
|
+
}
|
|
215
|
+
*/
|
|
216
|
+
|
|
217
|
+
} );
|
|
218
|
+
|
|
166
219
|
export
|
|
167
220
|
{
|
|
168
|
-
map,
|
|
169
|
-
mapExp,
|
|
170
221
|
noise,
|
|
171
222
|
hsl,
|
|
172
223
|
toHsl,
|
|
173
224
|
dynamic,
|
|
174
|
-
spherical
|
|
225
|
+
spherical,
|
|
226
|
+
applyEuler,
|
|
227
|
+
mod,
|
|
228
|
+
remapExp
|
|
175
229
|
};
|