tsl-textures 0.1.1 → 0.3.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 +2 -1
- package/src/camouflage.js +64 -0
- package/src/cave-art.js +54 -0
- package/src/entangled.js +49 -0
- package/src/fordite.js +6 -10
- package/src/isolines.js +43 -0
- package/src/marble.js +68 -0
- package/src/stars.js +44 -0
- package/src/tsl-utils.js +70 -3
- package/src/zebra-lines.js +48 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tsl-textures",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "A collection of Three.js Shading Language (TSL) textures ",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"repository": {
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"tsl",
|
|
16
16
|
"three.js"
|
|
17
17
|
],
|
|
18
|
+
"homepage": "https://boytchev.github.io/tsl-textures/",
|
|
18
19
|
"author": "Pavel Boytchev",
|
|
19
20
|
"files": [
|
|
20
21
|
"LICENSE",
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Camouflage
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from 'three';
|
|
7
|
+
import { exp, If, positionLocal, round, tslFn, vec3 } from 'three/nodes';
|
|
8
|
+
import { noise } from 'tsl-textures/tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var camouflage = tslFn( ( params )=>{
|
|
13
|
+
|
|
14
|
+
var pos = positionLocal.mul( exp( params.scale ) ).add( params.seed ).toVar( );
|
|
15
|
+
|
|
16
|
+
var color = vec3( 0, 0, 0 ).toVar( );
|
|
17
|
+
|
|
18
|
+
If( round( noise( pos ).add( 0.2 ) ).greaterThanEqual( 1 ), () => {
|
|
19
|
+
|
|
20
|
+
color.assign( params.colorA );
|
|
21
|
+
|
|
22
|
+
}
|
|
23
|
+
)
|
|
24
|
+
.elseif( round( noise( pos.yzx ).add( 0.3 ) ).greaterThanEqual( 1 ), () => {
|
|
25
|
+
|
|
26
|
+
color.assign( params.colorB );
|
|
27
|
+
|
|
28
|
+
}
|
|
29
|
+
)
|
|
30
|
+
.elseif( round( noise( pos.zxy ).add( 0.4 ) ).greaterThanEqual( 1 ), () => {
|
|
31
|
+
|
|
32
|
+
color.assign( params.colorC );
|
|
33
|
+
|
|
34
|
+
}
|
|
35
|
+
)
|
|
36
|
+
.else( () => {
|
|
37
|
+
|
|
38
|
+
color.assign( params.colorD );
|
|
39
|
+
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
return color;
|
|
44
|
+
|
|
45
|
+
} );
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
camouflage.defaults = {
|
|
50
|
+
$name: 'Camouflage',
|
|
51
|
+
|
|
52
|
+
scale: 2,
|
|
53
|
+
|
|
54
|
+
colorA: new Color( 0xc2bea8 ),
|
|
55
|
+
colorB: new Color( 0x9c895e ),
|
|
56
|
+
colorC: new Color( 0x92a375 ),
|
|
57
|
+
colorD: new Color( 0x717561 ),
|
|
58
|
+
|
|
59
|
+
seed: 0,
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
export { camouflage };
|
package/src/cave-art.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Cave Art
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { abs, add, exp, float, If, mix, or, positionLocal, pow2, sub, tslFn } from 'three/nodes';
|
|
8
|
+
import { noise } from 'tsl-textures/tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
var caveArt = tslFn( ( params ) => {
|
|
12
|
+
|
|
13
|
+
var pos = positionLocal.mul( exp( params.scale ) ).add( params.seed ).toVar( );
|
|
14
|
+
|
|
15
|
+
var k1 = noise( pos ).mul( 4 ).sin().toVar();
|
|
16
|
+
var k2 = noise( pos.mul( 1.5 ) ).mul( 4 ).cos().toVar();
|
|
17
|
+
|
|
18
|
+
var thinness = exp( sub( float( 3 ), params.thinness ) );
|
|
19
|
+
var k = sub( thinness, pow2( abs( add( k1, k2 ) ) ).mul( 20 ) ).toVar();
|
|
20
|
+
|
|
21
|
+
If( or( k1.greaterThan( k2 ), k.lessThan( 0 ) ), ()=>{
|
|
22
|
+
|
|
23
|
+
k.assign( 0 );
|
|
24
|
+
|
|
25
|
+
} );
|
|
26
|
+
|
|
27
|
+
If( k.lessThanEqual( 0 ), ()=>{
|
|
28
|
+
|
|
29
|
+
k.assign( params.noise.mul( pow2( noise( pos.mul( 30 ) ) ) ) );
|
|
30
|
+
|
|
31
|
+
} );
|
|
32
|
+
|
|
33
|
+
return mix( params.background, params.color, k );
|
|
34
|
+
|
|
35
|
+
} );
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
caveArt.defaults = {
|
|
40
|
+
$name: 'Cave art',
|
|
41
|
+
|
|
42
|
+
scale: 2,
|
|
43
|
+
thinness: 2,
|
|
44
|
+
noise: 0.3,
|
|
45
|
+
|
|
46
|
+
color: new Color( 0xD34545 ),
|
|
47
|
+
background: new Color( 0xFFF8F0 ),
|
|
48
|
+
|
|
49
|
+
seed: 0,
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
export { caveArt };
|
package/src/entangled.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Entangled
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { abs, exp, float, floor, loop, max, mix, mul, oneMinus, positionLocal, pow, sin, tslFn } from 'three/nodes';
|
|
8
|
+
import { noise } from 'tsl-textures/tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var entangled = tslFn( ( params ) => {
|
|
13
|
+
|
|
14
|
+
var scale = exp( params.scale.div( 2 ) ).toVar( );
|
|
15
|
+
var pos = positionLocal.add( params.seed ).toVar( );
|
|
16
|
+
var k = float( -10000 ).toVar( );
|
|
17
|
+
var k1 = float( 0 ).toVar( );
|
|
18
|
+
|
|
19
|
+
loop( floor( float( params.density ) ), ()=> {
|
|
20
|
+
|
|
21
|
+
k1.assign( sin( noise( mul( pos, scale ) ).mul( 3*Math.PI ) ) );
|
|
22
|
+
k.assign( max( k, k1 ) );
|
|
23
|
+
scale.mulAssign( 1.2 );
|
|
24
|
+
|
|
25
|
+
} );
|
|
26
|
+
|
|
27
|
+
k.assign( oneMinus( pow( abs( k ), 5 ) ).mul( 6 ) );
|
|
28
|
+
|
|
29
|
+
return mix( params.color, params.background, k );
|
|
30
|
+
|
|
31
|
+
} );
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
entangled.defaults = {
|
|
36
|
+
$name: 'Entangled',
|
|
37
|
+
|
|
38
|
+
scale: 2,
|
|
39
|
+
density: 10,
|
|
40
|
+
|
|
41
|
+
color: new Color( 0x002040 ),
|
|
42
|
+
background: new Color( 0xFFFFFF ),
|
|
43
|
+
|
|
44
|
+
seed: 0,
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
export { entangled };
|
package/src/fordite.js
CHANGED
|
@@ -1,21 +1,17 @@
|
|
|
1
1
|
|
|
2
|
-
//
|
|
3
|
-
// Fordite Pattern
|
|
4
|
-
//
|
|
2
|
+
// TSL-Textures: Fordite
|
|
5
3
|
|
|
6
4
|
|
|
7
5
|
|
|
8
6
|
import { Color } from 'three';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
import { exp, mul, positionLocal, sin, tslFn, vec3 } from 'three/nodes';
|
|
8
|
+
import { hsl, noise } from 'tsl-textures/tsl-utils.js';
|
|
13
9
|
|
|
14
10
|
|
|
15
11
|
|
|
16
12
|
var fordite = tslFn( ( params ) => {
|
|
17
13
|
|
|
18
|
-
var pos = positionLocal.mul( exp( params.scale ) ).add( params.seed );
|
|
14
|
+
var pos = positionLocal.mul( exp( params.scale ) ).add( params.seed ).toVar( );
|
|
19
15
|
|
|
20
16
|
var k = noise(
|
|
21
17
|
vec3(
|
|
@@ -23,7 +19,7 @@ var fordite = tslFn( ( params ) => {
|
|
|
23
19
|
noise( pos ).mul( 2 ),
|
|
24
20
|
noise( pos ).mul( 3 ),
|
|
25
21
|
)
|
|
26
|
-
);
|
|
22
|
+
).toVar( );
|
|
27
23
|
|
|
28
24
|
return hsl(
|
|
29
25
|
k,
|
|
@@ -36,7 +32,7 @@ var fordite = tslFn( ( params ) => {
|
|
|
36
32
|
|
|
37
33
|
|
|
38
34
|
fordite.defaults = {
|
|
39
|
-
$name: '
|
|
35
|
+
$name: 'Fordite',
|
|
40
36
|
scale: 2,
|
|
41
37
|
color: new Color( 0, 0, 0 ),
|
|
42
38
|
seed: 0,
|
package/src/isolines.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Isolines
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { add, exp, mix, oneMinus, positionLocal, sin, smoothstep, sub, tslFn } from 'three/nodes';
|
|
8
|
+
import { noise } from 'tsl-textures/tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var isolines = tslFn( ( params )=>{
|
|
13
|
+
|
|
14
|
+
var pos = positionLocal.mul( exp( params.scale ) ).add( params.seed ).toVar( );
|
|
15
|
+
|
|
16
|
+
var k = noise( pos ).mul( params.density );
|
|
17
|
+
|
|
18
|
+
k = oneMinus( sin( k ) ).div( 2 );
|
|
19
|
+
|
|
20
|
+
k = smoothstep( sub( params.thinness, params.blur ), add( params.thinness, params.blur ), k );
|
|
21
|
+
|
|
22
|
+
return mix( params.color, params.background, k );
|
|
23
|
+
|
|
24
|
+
} );
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
isolines.defaults = {
|
|
28
|
+
$name: 'Isolines',
|
|
29
|
+
|
|
30
|
+
scale: 2,
|
|
31
|
+
density: 40,
|
|
32
|
+
blur: 0.3,
|
|
33
|
+
thinness: 0.6,
|
|
34
|
+
|
|
35
|
+
color: new Color( 0xFFFFFF ),
|
|
36
|
+
background: new Color( 0x000000 ),
|
|
37
|
+
|
|
38
|
+
seed: 0,
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
export { isolines };
|
package/src/marble.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Marble
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { add, div, exp, If, mix, mul, oneMinus, positionLocal, pow, tslFn } from 'three/nodes';
|
|
8
|
+
import { noise } from 'tsl-textures/tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
var marble = tslFn( ( params ) => {
|
|
12
|
+
|
|
13
|
+
var pos = positionLocal.mul( exp( params.scale ) ).add( params.seed ).toVar( );
|
|
14
|
+
|
|
15
|
+
var k = add(
|
|
16
|
+
noise( pos ),
|
|
17
|
+
noise( pos.mul( 2 ) ).mul( 0.5 ),
|
|
18
|
+
noise( pos.mul( 6 ) ).mul( 0.1 )
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
var k = oneMinus( k.abs().pow( 2.5 ) );
|
|
22
|
+
|
|
23
|
+
var maxSmooth = oneMinus( pow( 0.5, params.thinness.add( 7 ) ) ).toVar(),
|
|
24
|
+
minSmooth = oneMinus( pow( 0.5, params.thinness.add( 7 ).mul( 0.5 ) ) ).toVar();
|
|
25
|
+
|
|
26
|
+
If( k.greaterThan( maxSmooth ), ()=>{
|
|
27
|
+
|
|
28
|
+
k.assign( 1 );
|
|
29
|
+
|
|
30
|
+
} )
|
|
31
|
+
.elseif( k.lessThan( minSmooth ), ()=>{
|
|
32
|
+
|
|
33
|
+
k.assign( 0 );
|
|
34
|
+
|
|
35
|
+
} )
|
|
36
|
+
.else( ()=> {
|
|
37
|
+
|
|
38
|
+
var a = k.sub( minSmooth );
|
|
39
|
+
var b = maxSmooth.sub( minSmooth );
|
|
40
|
+
k.assign( pow( div( a, b ), 5 ).mul( 0.75 ) );
|
|
41
|
+
k.assign( k.mul( add( 0.5, noise( pos.mul( 2 ) ).mul( 1.5 ) ) ) );
|
|
42
|
+
|
|
43
|
+
} );
|
|
44
|
+
|
|
45
|
+
k.assign( k.add( mul( params.noise, noise( pos.mul( 150 ) ).abs().pow3() ) ) );
|
|
46
|
+
|
|
47
|
+
return mix( params.background, params.color, k );
|
|
48
|
+
|
|
49
|
+
} );
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
marble.defaults = {
|
|
54
|
+
$name: 'Marble',
|
|
55
|
+
|
|
56
|
+
scale: 1.2,
|
|
57
|
+
thinness: 5,
|
|
58
|
+
noise: 0.3,
|
|
59
|
+
|
|
60
|
+
color: new Color( 0x4545D3 ),
|
|
61
|
+
background: new Color( 0xF0F8FF ),
|
|
62
|
+
|
|
63
|
+
seed: 0,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
export { marble };
|
package/src/stars.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Stars
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { abs, add, cond, exp, mix, positionLocal, tslFn } from 'three/nodes';
|
|
8
|
+
import { hsl, noise, toHsl } from 'tsl-textures/tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var stars = tslFn( ( params ) => {
|
|
13
|
+
|
|
14
|
+
var pos = positionLocal.mul( exp( params.scale.div( 2 ).add( 3 ) ) ).add( params.seed ).toVar( );
|
|
15
|
+
|
|
16
|
+
var k = abs( noise( pos ) ).pow( 10 ).mul( 10 );
|
|
17
|
+
|
|
18
|
+
k = k.mul( exp( params.density.sub( 2 ) ) );
|
|
19
|
+
|
|
20
|
+
var dS = cond( k.greaterThan( 0.1 ), params.variation.mul( noise( pos ) ), 0 );
|
|
21
|
+
|
|
22
|
+
var col = toHsl( mix( params.background, params.color, k ) );
|
|
23
|
+
|
|
24
|
+
return hsl( add( col.x, dS ), col.y, col.z );
|
|
25
|
+
|
|
26
|
+
} );
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
stars.defaults = {
|
|
31
|
+
$name: 'Stars',
|
|
32
|
+
|
|
33
|
+
scale: 2,
|
|
34
|
+
density: 2,
|
|
35
|
+
variation: 0,
|
|
36
|
+
|
|
37
|
+
color: new Color( 0xfff5f0 ),
|
|
38
|
+
background: new Color( 0x000060 ),
|
|
39
|
+
|
|
40
|
+
seed: 0,
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
export { stars };
|
package/src/tsl-utils.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { MathUtils } from 'three';
|
|
6
|
-
import {
|
|
6
|
+
import { add, cond, cos, float, If, max, min, sin, sub, tslFn, uniform, vec3 } from 'three/nodes';
|
|
7
7
|
import { mx_perlin_noise_float as noise } from 'three/addons/nodes/materialx/lib/mx_noise.js';
|
|
8
8
|
|
|
9
9
|
|
|
@@ -53,7 +53,7 @@ hslHelper.setLayout( {
|
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
// convert from hsl to rgb
|
|
57
57
|
const hsl = tslFn( ([ h, s, l ]) => {
|
|
58
58
|
|
|
59
59
|
h = h.fract().add( 1 ).fract();
|
|
@@ -79,6 +79,50 @@ hsl.setLayout( {
|
|
|
79
79
|
} );
|
|
80
80
|
|
|
81
81
|
|
|
82
|
+
// convert from rgb to hsl
|
|
83
|
+
const toHsl = tslFn( ([ rgb ]) => {
|
|
84
|
+
|
|
85
|
+
var R = float( rgb.x ).toVar(),
|
|
86
|
+
G = float( rgb.y ).toVar(),
|
|
87
|
+
B = float( rgb.z ).toVar();
|
|
88
|
+
|
|
89
|
+
var mx = max( R, max( G, B ) ).toVar();
|
|
90
|
+
var mn = min( R, min( G, B ) ).toVar();
|
|
91
|
+
|
|
92
|
+
var H = float( 0 ).toVar(),
|
|
93
|
+
S = float( 0 ).toVar(),
|
|
94
|
+
L = add( mx, mn ).div( 2 );
|
|
95
|
+
|
|
96
|
+
If( mn.notEqual( mx ), ()=>{
|
|
97
|
+
|
|
98
|
+
const delta = sub( mx, mn ).toVar();
|
|
99
|
+
|
|
100
|
+
S.assign( cond( L.lessThanEqual( 0.5 ), delta.div( add( mn, mx ) ), delta.div( sub( 2, add( mn, mx ) ) ) ) );
|
|
101
|
+
If( mx.equal( R ), ()=>{
|
|
102
|
+
|
|
103
|
+
H.assign( sub( G, B ).div( delta ).add( cond( G.lessThanEqual( B ), 6, 0 ) ) );
|
|
104
|
+
|
|
105
|
+
} )
|
|
106
|
+
.elseif( mx.equal( G ), ()=>{
|
|
107
|
+
|
|
108
|
+
H.assign( sub( B, R ).div( delta ).add( 2 ) );
|
|
109
|
+
|
|
110
|
+
} )
|
|
111
|
+
.else( ()=>{
|
|
112
|
+
|
|
113
|
+
H.assign( sub( R, G ).div( delta ).add( 4 ) );
|
|
114
|
+
|
|
115
|
+
} );
|
|
116
|
+
H.divAssign( 6 );
|
|
117
|
+
|
|
118
|
+
} );
|
|
119
|
+
return vec3( H, S, L );
|
|
120
|
+
|
|
121
|
+
} );
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
82
126
|
|
|
83
127
|
// make all elements dynamic (i.e. uniform)
|
|
84
128
|
function dynamic( params ) {
|
|
@@ -98,11 +142,34 @@ function dynamic( params ) {
|
|
|
98
142
|
|
|
99
143
|
|
|
100
144
|
|
|
145
|
+
// convert phi-theta angles to position on unit sphere
|
|
146
|
+
const spherical = tslFn( ([ phi, theta ]) => {
|
|
147
|
+
|
|
148
|
+
return vec3(
|
|
149
|
+
sin( theta ).mul( sin( phi ) ),
|
|
150
|
+
cos( phi ),
|
|
151
|
+
cos( theta ).mul( sin( phi ) )
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
} );
|
|
155
|
+
|
|
156
|
+
spherical.setLayout( {
|
|
157
|
+
name: 'spherical',
|
|
158
|
+
type: 'vec3',
|
|
159
|
+
inputs: [
|
|
160
|
+
{ name: 'phi', type: 'float' },
|
|
161
|
+
{ name: 'theta', type: 'float' },
|
|
162
|
+
]
|
|
163
|
+
} );
|
|
164
|
+
|
|
165
|
+
|
|
101
166
|
export
|
|
102
167
|
{
|
|
103
168
|
map,
|
|
104
169
|
mapExp,
|
|
105
170
|
noise,
|
|
106
171
|
hsl,
|
|
107
|
-
|
|
172
|
+
toHsl,
|
|
173
|
+
dynamic,
|
|
174
|
+
spherical
|
|
108
175
|
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Zebra Lines
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { acos, clamp, exp, mix, positionLocal, sin, tslFn } from 'three/nodes';
|
|
8
|
+
import { spherical } from 'tsl-textures/tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var zebraLines = tslFn( ( params ) => {
|
|
13
|
+
|
|
14
|
+
var pos = positionLocal.normalize().toVar( );
|
|
15
|
+
|
|
16
|
+
var dir = spherical( params.phi, params.theta ).toVar();
|
|
17
|
+
|
|
18
|
+
var angle = acos( clamp( dir.dot( pos ), -1, 1 ) );
|
|
19
|
+
|
|
20
|
+
var scale = exp( params.scale.add( 1 ) ).toVar();
|
|
21
|
+
|
|
22
|
+
var k = sin( angle.mul( scale ) ).sub( params.thinness.sub( 0.5 ).mul( 2 ) );
|
|
23
|
+
|
|
24
|
+
k = clamp( k.mul( 1000 ).div( scale ), -1, 1 ).mul( 0.5 ).add( 0.5 );
|
|
25
|
+
|
|
26
|
+
return mix( params.background, params.color, k );
|
|
27
|
+
|
|
28
|
+
} );
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
zebraLines.defaults = {
|
|
33
|
+
$name: 'Zebra lines',
|
|
34
|
+
|
|
35
|
+
scale: 2,
|
|
36
|
+
thinness: 0.5,
|
|
37
|
+
phi: 0,
|
|
38
|
+
theta: 0,
|
|
39
|
+
|
|
40
|
+
color: new Color( 0x0 ),
|
|
41
|
+
background: new Color( 0xFFFFFF ),
|
|
42
|
+
|
|
43
|
+
// no seed for zebra lines
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
export { zebraLines };
|