@dailies-studio/tsl-textures 3.0.4
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 +21 -0
- package/README.md +142 -0
- package/dist/cjs/tsl-textures.cjs +4749 -0
- package/dist/cjs/tsl-textures.min.cjs +2 -0
- package/dist/tsl-textures.js +4659 -0
- package/dist/tsl-textures.min.js +2 -0
- package/package.json +36 -0
- package/src/brain.js +116 -0
- package/src/bricks.js +116 -0
- package/src/camouflage.js +85 -0
- package/src/caustics.js +75 -0
- package/src/cave-art.js +83 -0
- package/src/circle-decor.js +76 -0
- package/src/circles.js +83 -0
- package/src/clouds.js +114 -0
- package/src/concrete.js +95 -0
- package/src/cork.js +104 -0
- package/src/crumpled-fabric.js +81 -0
- package/src/dalmatian-spots.js +80 -0
- package/src/darth-maul.js +84 -0
- package/src/dyson-sphere.js +144 -0
- package/src/entangled.js +75 -0
- package/src/fordite.js +69 -0
- package/src/gas-giant.js +94 -0
- package/src/grid.js +84 -0
- package/src/halftone.js +252 -0
- package/src/isolayers.js +79 -0
- package/src/isolines.js +72 -0
- package/src/karst-rock.js +67 -0
- package/src/marble.js +96 -0
- package/src/melter.js +76 -0
- package/src/neon-lights.js +107 -0
- package/src/perlin-noise.js +66 -0
- package/src/photosphere.js +73 -0
- package/src/planet.js +168 -0
- package/src/polka-dots.js +106 -0
- package/src/processed-wood.js +80 -0
- package/src/protozoa.js +110 -0
- package/src/reticular-veins.js +72 -0
- package/src/roman-paving.js +58 -0
- package/src/rotator.js +120 -0
- package/src/rough-clay.js +90 -0
- package/src/runny-eggs.js +180 -0
- package/src/rust.js +144 -0
- package/src/satin.js +69 -0
- package/src/scaler.js +111 -0
- package/src/scepter-head.js +94 -0
- package/src/scream.js +72 -0
- package/src/stars.js +72 -0
- package/src/static-noise.js +73 -0
- package/src/supersphere.js +108 -0
- package/src/tiger-fur.js +77 -0
- package/src/translator.js +116 -0
- package/src/tsl-textures.js +63 -0
- package/src/tsl-utils.js +344 -0
- package/src/turbulent-smoke.js +73 -0
- package/src/voronoi-cells.js +99 -0
- package/src/water-drops.js +96 -0
- package/src/watermelon.js +87 -0
- package/src/waves.js +150 -0
- package/src/wood.js +99 -0
- package/src/zebra-lines.js +77 -0
package/src/cave-art.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Cave Art
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { float, Fn, If, mix, or, positionGeometry } from 'three/tsl';
|
|
8
|
+
import { noise } from './tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var defaults = {
|
|
13
|
+
$name: 'Cave art',
|
|
14
|
+
|
|
15
|
+
position: positionGeometry,
|
|
16
|
+
scale: 2,
|
|
17
|
+
|
|
18
|
+
thinness: 2,
|
|
19
|
+
noise: 0.3,
|
|
20
|
+
|
|
21
|
+
color: new Color( 0xD34545 ),
|
|
22
|
+
background: new Color( 0xFFF8F0 ),
|
|
23
|
+
|
|
24
|
+
seed: 0,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
var caveArtRaw = Fn( ([ position, scale, thinness, xnoise, color, background, seed ]) => {
|
|
30
|
+
|
|
31
|
+
var pos = position.mul( scale.exp( ) ).add( seed ).toVar( 'pos' );
|
|
32
|
+
|
|
33
|
+
thinness = float( 3 ).sub( thinness ).exp( );
|
|
34
|
+
|
|
35
|
+
var k1 = noise( pos, 4 ).sin().toVar( 'k1' ),
|
|
36
|
+
k2 = noise( pos.mul( 1.5 ), 4 ).cos().toVar( 'k2' ),
|
|
37
|
+
k = thinness.sub( k1.add( k2 ).abs( ).pow2( ).mul( 20 ) ).toVar( 'k' );
|
|
38
|
+
|
|
39
|
+
If( or( k1.greaterThan( k2 ), k.lessThan( 0 ) ), ()=>{
|
|
40
|
+
|
|
41
|
+
k.assign( 0 );
|
|
42
|
+
|
|
43
|
+
} );
|
|
44
|
+
|
|
45
|
+
If( k.lessThanEqual( 0 ), ()=>{
|
|
46
|
+
|
|
47
|
+
k.assign( xnoise.mul( noise( pos.mul( 30 ) ).pow2( ) ) );
|
|
48
|
+
|
|
49
|
+
} );
|
|
50
|
+
|
|
51
|
+
return mix( background, color, k );
|
|
52
|
+
|
|
53
|
+
} ).setLayout( {
|
|
54
|
+
name: 'caveArtRaw',
|
|
55
|
+
type: 'vec3',
|
|
56
|
+
inputs: [
|
|
57
|
+
{ name: 'position', type: 'vec3' },
|
|
58
|
+
{ name: 'scale', type: 'float' },
|
|
59
|
+
{ name: 'thinness', type: 'float' },
|
|
60
|
+
{ name: 'xnoise', type: 'float' },
|
|
61
|
+
{ name: 'color', type: 'vec3' },
|
|
62
|
+
{ name: 'background', type: 'vec3' },
|
|
63
|
+
{ name: 'seed', type: 'float' },
|
|
64
|
+
] }
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
function caveArt( params={} ) {
|
|
70
|
+
|
|
71
|
+
var { position, scale, thinness, noise, color, background, seed } = { ...defaults, ...params };
|
|
72
|
+
|
|
73
|
+
return caveArtRaw( position, scale, thinness, noise, color, background, seed );
|
|
74
|
+
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
caveArt.defaults = defaults;
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
export { caveArt };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Circle decor
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from 'three';
|
|
7
|
+
import { exp, Fn, mix, positionGeometry } from 'three/tsl';
|
|
8
|
+
import { noise, voronoi } from './tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var defaults = {
|
|
13
|
+
$name: 'Circle decor',
|
|
14
|
+
|
|
15
|
+
position: positionGeometry,
|
|
16
|
+
scale: 2,
|
|
17
|
+
grains: 0.2,
|
|
18
|
+
|
|
19
|
+
complexity: 1,
|
|
20
|
+
blur: 0.2,
|
|
21
|
+
|
|
22
|
+
color: new Color( 0x0 ),
|
|
23
|
+
background: new Color( 0xFFFFFF ),
|
|
24
|
+
|
|
25
|
+
seed: 0,
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
var circleDecorRaw = Fn( ([ position, scale, grains, complexity, blur, color, background, seed ])=>{
|
|
31
|
+
|
|
32
|
+
var pos = position.mul( exp( scale.div( 4 ) ) ).add( seed ).toVar( 'pos' );
|
|
33
|
+
var subpos = pos.mul( 2 ).toVar( 'subpos' );
|
|
34
|
+
|
|
35
|
+
var k1 = voronoi( pos );
|
|
36
|
+
var k2 = voronoi( subpos );
|
|
37
|
+
var k3 = voronoi( pos.mul( grains.mul( 4 ).add( 2 ) ) ).mul( 2 );
|
|
38
|
+
|
|
39
|
+
var compScale = noise( pos ).div( 2 ).add( 1 );
|
|
40
|
+
|
|
41
|
+
var k = k1.min( k2, k3 ).clamp( 0, 1 ).mul( complexity.add( 2 ).exp(), compScale, Math.PI ).sin().smoothstep( blur.negate(), blur );
|
|
42
|
+
|
|
43
|
+
return mix( color, background, k.oneMinus() );
|
|
44
|
+
|
|
45
|
+
} ).setLayout( {
|
|
46
|
+
name: 'camouflageRaw',
|
|
47
|
+
type: 'vec3',
|
|
48
|
+
inputs: [
|
|
49
|
+
{ name: 'position', type: 'vec3' },
|
|
50
|
+
{ name: 'scale', type: 'float' },
|
|
51
|
+
{ name: 'grains', type: 'float' },
|
|
52
|
+
{ name: 'complexity', type: 'float' },
|
|
53
|
+
{ name: 'blur', type: 'float' },
|
|
54
|
+
{ name: 'color', type: 'vec3' },
|
|
55
|
+
{ name: 'background', type: 'vec3' },
|
|
56
|
+
{ name: 'seed', type: 'float' },
|
|
57
|
+
] }
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
function circleDecor( params={} ) {
|
|
63
|
+
|
|
64
|
+
var { position, scale, grains, complexity, blur, color, background, seed } = { ...defaults, ...params };
|
|
65
|
+
|
|
66
|
+
return circleDecorRaw( position, scale, grains, complexity, blur, color, background, seed );
|
|
67
|
+
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
circleDecor.defaults = defaults;
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
export { circleDecor };
|
package/src/circles.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Circles
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { acos, clamp, exp, Fn, positionGeometry, select, sin, vec3 } from 'three/tsl';
|
|
8
|
+
import { hsl, toHsl } from './tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var defaults = {
|
|
13
|
+
$name: 'Circles',
|
|
14
|
+
|
|
15
|
+
position: positionGeometry,
|
|
16
|
+
|
|
17
|
+
scale: 2,
|
|
18
|
+
variety: 1,
|
|
19
|
+
|
|
20
|
+
color: new Color( 0xF0E0D0 ),
|
|
21
|
+
|
|
22
|
+
seed: 0,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
var circlesRaw = Fn( ([ position, scale, variety, color, seed ]) => {
|
|
28
|
+
|
|
29
|
+
var pos = position.toVar();
|
|
30
|
+
|
|
31
|
+
var angle = acos( clamp( pos.y, -1, 1 ) ).mul( 20 );
|
|
32
|
+
|
|
33
|
+
var x = angle.div( 3000 ).mul( exp( scale.sub( 1 ) ) );
|
|
34
|
+
|
|
35
|
+
var k = seed.sin().mul( 100 ).toVar();
|
|
36
|
+
|
|
37
|
+
for ( var n=0; n<=10; n++ ) {
|
|
38
|
+
|
|
39
|
+
k.addAssign( sin( x.mul( 2**n ).sub( Math.PI*n/2 ) ).mul( -n*( n+1 )/2 ) );
|
|
40
|
+
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
k.assign( k.div( 200 ).clamp( -2, 2 ) );
|
|
44
|
+
|
|
45
|
+
var HSL = toHsl( color );
|
|
46
|
+
|
|
47
|
+
var hue = HSL.x.add( k.mul( variety ) ).mod( 1 ).mul( 10 );
|
|
48
|
+
|
|
49
|
+
var huei = hue.floor();
|
|
50
|
+
var huef = hue.sub( huei );
|
|
51
|
+
huef = select( huef.lessThan( 0.5 ), huef.pow( 1.5 ), huef.pow( 1/1.5 ) );
|
|
52
|
+
|
|
53
|
+
return hsl( vec3( huei.add( huef ).div( 10 ), HSL.yz ) );
|
|
54
|
+
|
|
55
|
+
} ).setLayout( {
|
|
56
|
+
name: 'circlesRaw',
|
|
57
|
+
type: 'vec3',
|
|
58
|
+
inputs: [
|
|
59
|
+
{ name: 'position', type: 'vec3' },
|
|
60
|
+
{ name: 'scale', type: 'float' },
|
|
61
|
+
{ name: 'variety', type: 'float' },
|
|
62
|
+
{ name: 'color', type: 'vec3' },
|
|
63
|
+
{ name: 'seed', type: 'float' },
|
|
64
|
+
] }
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
function circles( params={} ) {
|
|
70
|
+
|
|
71
|
+
var { position, scale, variety, color, seed } = { ...defaults, ...params };
|
|
72
|
+
|
|
73
|
+
return circlesRaw( position, scale, variety, color, seed );
|
|
74
|
+
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
circles.defaults = defaults;
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
export { circles };
|
package/src/clouds.js
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Clouds
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { clamp, exp, Fn, mix, mul, positionGeometry } from 'three/tsl';
|
|
8
|
+
import { fractal } from './tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var defaults = {
|
|
13
|
+
$name: 'Clouds',
|
|
14
|
+
|
|
15
|
+
position: positionGeometry,
|
|
16
|
+
scale: 2,
|
|
17
|
+
density: 0.5,
|
|
18
|
+
opacity: 1,
|
|
19
|
+
|
|
20
|
+
color: new Color( 0xFFFFFF ),
|
|
21
|
+
subcolor: new Color( 0xA0A0B0 ),
|
|
22
|
+
|
|
23
|
+
seed: 0,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
var cloud_core = Fn( ([ position, scale, density, seed ]) => {
|
|
29
|
+
|
|
30
|
+
const pos = position.mul( exp( scale.div( 1.5 ).sub( 0.5 ) ) ).add( seed ).toVar( 'pos' );
|
|
31
|
+
|
|
32
|
+
return fractal( pos, 4 ).add( density.remap( 0, 1, -0.5, 1.5 ) );
|
|
33
|
+
|
|
34
|
+
} ).setLayout( {
|
|
35
|
+
name: 'cloud_core',
|
|
36
|
+
type: 'float',
|
|
37
|
+
inputs: [
|
|
38
|
+
{ name: 'position', type: 'vec3' },
|
|
39
|
+
{ name: 'scale', type: 'float' },
|
|
40
|
+
{ name: 'density', type: 'float' },
|
|
41
|
+
{ name: 'seed', type: 'float' },
|
|
42
|
+
] }
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
var cloudsRaw = Fn( ([ position, scale, density, /*opacity,*/color, subcolor, seed ]) => {
|
|
48
|
+
|
|
49
|
+
var k = cloud_core( position, scale, density, seed );
|
|
50
|
+
return mix( subcolor, color, k.clamp( 0, 1 ) );
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
} ).setLayout( {
|
|
54
|
+
name: 'cloudsRaw',
|
|
55
|
+
type: 'vec3',
|
|
56
|
+
inputs: [
|
|
57
|
+
{ name: 'position', type: 'vec3' },
|
|
58
|
+
{ name: 'scale', type: 'float' },
|
|
59
|
+
{ name: 'density', type: 'float' },
|
|
60
|
+
/*{ name: 'opacity', type: 'float' },*/
|
|
61
|
+
{ name: 'color', type: 'vec3' },
|
|
62
|
+
{ name: 'subcolor', type: 'vec3' },
|
|
63
|
+
{ name: 'seed', type: 'float' },
|
|
64
|
+
] }
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
var cloudsOpacityRaw = Fn( ([ position, scale, density, opacity, /*color,subcolor,*/seed ]) => {
|
|
70
|
+
|
|
71
|
+
var k = cloud_core( position, scale, density, seed );
|
|
72
|
+
return clamp( 0, 1, mul( k, 2 ).pow( 1.5 ).sub( 1 ).mul( opacity ) );
|
|
73
|
+
|
|
74
|
+
} ).setLayout( {
|
|
75
|
+
name: 'cloudsOpacityRaw',
|
|
76
|
+
type: 'float',
|
|
77
|
+
inputs: [
|
|
78
|
+
{ name: 'position', type: 'vec3' },
|
|
79
|
+
{ name: 'scale', type: 'float' },
|
|
80
|
+
{ name: 'density', type: 'float' },
|
|
81
|
+
{ name: 'opacity', type: 'float' },
|
|
82
|
+
/*{ name: 'color', type: 'vec3' },*/
|
|
83
|
+
/*{ name: 'subcolor', type: 'vec3' },*/
|
|
84
|
+
{ name: 'seed', type: 'float' },
|
|
85
|
+
] }
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
function clouds( params={} ) {
|
|
91
|
+
|
|
92
|
+
var { position, scale, density, /*opacity,*/color, subcolor, seed } = { ...defaults, ...params };
|
|
93
|
+
|
|
94
|
+
return cloudsRaw( position, scale, density, /*opacity,*/color, subcolor, seed );
|
|
95
|
+
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
clouds.opacity = function ( params={} ) {
|
|
101
|
+
|
|
102
|
+
var { position, scale, density, opacity, /*color,subcolor,*/seed } = { ...defaults, ...params };
|
|
103
|
+
|
|
104
|
+
return cloudsOpacityRaw( position, scale, density, opacity, /*color,subcolor,*/seed );
|
|
105
|
+
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
clouds.defaults = defaults;
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
export { clouds };
|
package/src/concrete.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Concrete
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { cross, exp, Fn, normalLocal, positionGeometry, remap, tangentLocal, vec3 } from 'three/tsl';
|
|
7
|
+
import { approximateNormal, noise } from './tsl-utils.js';
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
var defaults = {
|
|
12
|
+
$name: 'Concrete',
|
|
13
|
+
$normalNode: true,
|
|
14
|
+
|
|
15
|
+
position: positionGeometry,
|
|
16
|
+
|
|
17
|
+
scale: 2,
|
|
18
|
+
density: 0.5,
|
|
19
|
+
bump: 0.5,
|
|
20
|
+
|
|
21
|
+
seed: 0,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
var surfacePos = Fn( ([ position, normal, density ]) => {
|
|
27
|
+
|
|
28
|
+
var k = noise( position, 0.5, 0.5 ).abs().pow( density );
|
|
29
|
+
|
|
30
|
+
return position.add( normal.mul( k ) );
|
|
31
|
+
|
|
32
|
+
} ).setLayout( {
|
|
33
|
+
name: 'surfacePos',
|
|
34
|
+
type: 'vec3',
|
|
35
|
+
inputs: [
|
|
36
|
+
{ name: 'position', type: 'vec3' },
|
|
37
|
+
{ name: 'normal', type: 'vec3' },
|
|
38
|
+
{ name: 'density', type: 'float' },
|
|
39
|
+
] }
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
var concreteRaw = Fn( ([ position, normal, tangent, scale, density, bump, seed ]) => {
|
|
45
|
+
|
|
46
|
+
const EPS = 0.001;
|
|
47
|
+
|
|
48
|
+
var seed3d = vec3( 1, 2, 3 ).mul( seed ).sin().mul( 100 ).toVar( 'seed3d' );
|
|
49
|
+
|
|
50
|
+
var xposition = position.mul( exp( scale.div( 2 ).add( 2 ) ) ).add( seed3d ).toVar( 'xposition' ),
|
|
51
|
+
xnormal = normal.normalize().toVar( 'xnormal' ),
|
|
52
|
+
xtangent = tangent.normalize().mul( EPS ).toVar( 'xtangent' ),
|
|
53
|
+
xbitangent = cross( xnormal, xtangent ).normalize().mul( EPS ).toVar( 'xbitangent' );
|
|
54
|
+
|
|
55
|
+
var xdensity = remap( density, 0, 1, 10, 0.5 ).toVar( 'xdensity' );
|
|
56
|
+
|
|
57
|
+
xnormal.mulAssign( bump );
|
|
58
|
+
|
|
59
|
+
var pos = surfacePos( xposition, xnormal, xdensity ).toVar( 'pos' ),
|
|
60
|
+
posU = surfacePos( xposition.add( xtangent ), xnormal, xdensity ).toVar( 'posU' ),
|
|
61
|
+
posV = surfacePos( xposition.add( xbitangent ), xnormal, xdensity ).toVar( 'posV' );
|
|
62
|
+
|
|
63
|
+
return approximateNormal( pos, posU, posV );
|
|
64
|
+
|
|
65
|
+
} ).setLayout( {
|
|
66
|
+
name: 'concreteRaw',
|
|
67
|
+
type: 'vec3',
|
|
68
|
+
inputs: [
|
|
69
|
+
{ name: 'position', type: 'vec3' },
|
|
70
|
+
{ name: 'normal', type: 'vec3' },
|
|
71
|
+
{ name: 'tangent', type: 'vec3' },
|
|
72
|
+
{ name: 'scale', type: 'float' },
|
|
73
|
+
{ name: 'density', type: 'float' },
|
|
74
|
+
{ name: 'bump', type: 'float' },
|
|
75
|
+
{ name: 'seed', type: 'float' },
|
|
76
|
+
] }
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
function concrete( params={} ) {
|
|
82
|
+
|
|
83
|
+
var { position, scale, density, bump, seed } = { ...defaults, ...params };
|
|
84
|
+
|
|
85
|
+
return concreteRaw( position, normalLocal, tangentLocal, scale, density, bump, seed );
|
|
86
|
+
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
concrete.defaults = defaults;
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
export { concrete };
|
package/src/cork.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Cork
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from 'three';
|
|
7
|
+
import { exp, float, Fn, If, int, Loop, mix, positionGeometry, vec3 } from 'three/tsl';
|
|
8
|
+
import { noise, vnoise } from './tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var defaults = {
|
|
13
|
+
$name: 'Cork',
|
|
14
|
+
|
|
15
|
+
position: positionGeometry,
|
|
16
|
+
scale: 1,
|
|
17
|
+
straight: 1,
|
|
18
|
+
noise: 0.3,
|
|
19
|
+
|
|
20
|
+
color: new Color( 0xfff0c0 ),
|
|
21
|
+
background: new Color( 0xd08060 ),
|
|
22
|
+
|
|
23
|
+
seed: 0,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
var corkRaw = Fn( ([ position, scale, straight, xnoise, color, background, seed ])=>{
|
|
29
|
+
|
|
30
|
+
var pos = position.mul( exp( scale.div( 1.5 ).add( 1 ) ) ).add( seed ).toVar( 'pos' );
|
|
31
|
+
|
|
32
|
+
var midCell = pos.round().toConst( 'midCell' );
|
|
33
|
+
|
|
34
|
+
var minCell = midCell.toVar( 'minCell' ),
|
|
35
|
+
minDist = float( 1 ).toVar( 'minDist' );
|
|
36
|
+
|
|
37
|
+
var cell = vec3().toVar( 'cell' ),
|
|
38
|
+
dist = float().toVar( 'dist' );
|
|
39
|
+
|
|
40
|
+
var strtaightness = straight.exp().reciprocal().toVar( 'strtaightness' );
|
|
41
|
+
|
|
42
|
+
var i=int( 0 ).toVar( 'i' ),
|
|
43
|
+
j=int( 0 ).toVar( 'j' ),
|
|
44
|
+
k=int( 0 ).toVar( 'k' );
|
|
45
|
+
|
|
46
|
+
// Loop uses hard-coded i, j, k as indices
|
|
47
|
+
Loop( 3, 3, 3, () => {
|
|
48
|
+
|
|
49
|
+
cell.assign( midCell.add( vec3( i, j, k ).sub( 1 ) ) );
|
|
50
|
+
var cellCenter = cell.add( vnoise( cell ) );
|
|
51
|
+
dist.assign( pos.distance( cellCenter ) );
|
|
52
|
+
|
|
53
|
+
dist.addAssign( noise( pos.add( cell ), strtaightness ) );
|
|
54
|
+
|
|
55
|
+
If( dist.lessThan( minDist ), ()=>{
|
|
56
|
+
|
|
57
|
+
minDist.assign( dist );
|
|
58
|
+
minCell.assign( cell );
|
|
59
|
+
|
|
60
|
+
} );
|
|
61
|
+
|
|
62
|
+
} );
|
|
63
|
+
|
|
64
|
+
var n = noise( minCell.mul( Math.PI ), 0.5, 0.5 ).toVar( 'n' );
|
|
65
|
+
|
|
66
|
+
var r = noise( pos.mul( 12 ) ).toVar( 'r' );
|
|
67
|
+
r.mulAssign( r, r );
|
|
68
|
+
r.addAssign( noise( pos.mul( 40 ), 1/3 ) );
|
|
69
|
+
|
|
70
|
+
var result = mix( color, background, n.add( r.mul( xnoise ) ) );
|
|
71
|
+
|
|
72
|
+
return result;
|
|
73
|
+
|
|
74
|
+
} ).setLayout( {
|
|
75
|
+
name: 'camouflageRaw',
|
|
76
|
+
type: 'vec3',
|
|
77
|
+
inputs: [
|
|
78
|
+
{ name: 'position', type: 'vec3' },
|
|
79
|
+
{ name: 'scale', type: 'float' },
|
|
80
|
+
{ name: 'straight', type: 'float' },
|
|
81
|
+
{ name: 'xnoise', type: 'float' },
|
|
82
|
+
{ name: 'color', type: 'vec3' },
|
|
83
|
+
{ name: 'background', type: 'vec3' },
|
|
84
|
+
{ name: 'seed', type: 'float' },
|
|
85
|
+
] }
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
function cork( params={} ) {
|
|
91
|
+
|
|
92
|
+
var { position, scale, straight, noise, color, background, seed } = { ...defaults, ...params };
|
|
93
|
+
|
|
94
|
+
return corkRaw( position, scale, straight, noise, color, background, seed );
|
|
95
|
+
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
cork.defaults = defaults;
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
export { cork };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Crumpled fabric
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from 'three';
|
|
7
|
+
import { exp, Fn, Loop, positionGeometry, vec3 } from 'three/tsl';
|
|
8
|
+
import { noise } from './tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var defaults = {
|
|
13
|
+
$name: 'Crumpled fabric',
|
|
14
|
+
$width: 260,
|
|
15
|
+
|
|
16
|
+
position: positionGeometry,
|
|
17
|
+
scale: 2,
|
|
18
|
+
pinch: 0.5,
|
|
19
|
+
|
|
20
|
+
color: new Color( 0xB0F0FF ),
|
|
21
|
+
subcolor: new Color( 0x4040F0 ),
|
|
22
|
+
background: new Color( 0x003000 ),
|
|
23
|
+
|
|
24
|
+
seed: 0,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
var crumpledFabricRaw = Fn( ([ position, scale, pinch, color, subcolor, background, seed ])=>{
|
|
30
|
+
|
|
31
|
+
var pos = position.mul( exp( scale.sub( 0.5 ) ) ).add( seed ).toVar( );
|
|
32
|
+
|
|
33
|
+
Loop( 4, ()=>{
|
|
34
|
+
|
|
35
|
+
var x = noise( pos.xyz );
|
|
36
|
+
var y = noise( pos.yzx );
|
|
37
|
+
var z = noise( pos.zxy );
|
|
38
|
+
|
|
39
|
+
pos.addAssign( vec3( x, y, z ).mul( pinch ) );
|
|
40
|
+
|
|
41
|
+
} );
|
|
42
|
+
|
|
43
|
+
var k = noise( pos ).add( 1 ).div( 2 ).clamp( 0, 1 );
|
|
44
|
+
|
|
45
|
+
var color1 = color.mul( k.mul( 2 ).sub( 1 ).abs().oneMinus() );
|
|
46
|
+
var color2 = subcolor.mul( k ).pow( 2 );
|
|
47
|
+
var color3 = background.mul( k.oneMinus().pow( 2 ) );
|
|
48
|
+
|
|
49
|
+
return color1.add( color2 ).add( color3 );
|
|
50
|
+
|
|
51
|
+
} ).setLayout( {
|
|
52
|
+
name: 'crumpledFabricRaw',
|
|
53
|
+
type: 'vec3',
|
|
54
|
+
inputs: [
|
|
55
|
+
{ name: 'position', type: 'vec3' },
|
|
56
|
+
{ name: 'scale', type: 'float' },
|
|
57
|
+
{ name: 'pinch', type: 'float' },
|
|
58
|
+
{ name: 'color', type: 'vec3' },
|
|
59
|
+
{ name: 'subcolor', type: 'vec3' },
|
|
60
|
+
{ name: 'background', type: 'vec3' },
|
|
61
|
+
{ name: 'seed', type: 'float' },
|
|
62
|
+
] }
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
function crumpledFabric( params={} ) {
|
|
68
|
+
|
|
69
|
+
var { position, scale, pinch, color, subcolor, background, seed } = { ...defaults, ...params };
|
|
70
|
+
|
|
71
|
+
return crumpledFabricRaw( position, scale, pinch, color, subcolor, background, seed );
|
|
72
|
+
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
crumpledFabric.defaults = defaults;
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
export { crumpledFabric };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
|
|
2
|
+
// TSL-Textures: Dalmatian spots
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import { Color } from "three";
|
|
7
|
+
import { float, Fn, Loop, mix, positionGeometry } from 'three/tsl';
|
|
8
|
+
import { noise } from './tsl-utils.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var defaults = {
|
|
13
|
+
$name: 'Dalmatian spots',
|
|
14
|
+
$width: 260,
|
|
15
|
+
|
|
16
|
+
position: positionGeometry,
|
|
17
|
+
|
|
18
|
+
scale: 2,
|
|
19
|
+
density: 0.6,
|
|
20
|
+
|
|
21
|
+
color: new Color( 0xFFFFFF ),
|
|
22
|
+
background: new Color( 0x000000 ),
|
|
23
|
+
|
|
24
|
+
seed: 0,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
var dalmatianSpotsRaw = Fn( ([ position, scale, density, color, background, seed ])=>{
|
|
30
|
+
|
|
31
|
+
var pos = position.mul( scale.exp( ) ).add( seed ).sub( 1000 ).toVar( 'pos' );
|
|
32
|
+
|
|
33
|
+
var k = float( 1 ).toVar( 'k' );
|
|
34
|
+
|
|
35
|
+
var d = float( 1.5 ).sub( density ).mul( 2 ).toVar( 'd' );
|
|
36
|
+
var count = density.mul( 5 ).add( 5 ).toVar( 'count' );
|
|
37
|
+
|
|
38
|
+
Loop( count, ()=> {
|
|
39
|
+
|
|
40
|
+
k.mulAssign( noise( pos ).abs().pow( d ).mul( 100 ).sub( 50 ).clamp( 0, 1 ).oneMinus() );
|
|
41
|
+
pos.assign( pos.mul( 1.01 ) );
|
|
42
|
+
k.mulAssign( noise( pos.yzx ).abs().pow( d ).mul( 100 ).sub( 50 ).clamp( 0, 1 ).oneMinus() );
|
|
43
|
+
pos.assign( pos.mul( 1.01 ) );
|
|
44
|
+
k.mulAssign( noise( pos.zxy ).abs().pow( d ).mul( 100 ).sub( 50 ).clamp( 0, 1 ).oneMinus() );
|
|
45
|
+
pos.assign( pos.mul( 1.01 ) );
|
|
46
|
+
|
|
47
|
+
} );
|
|
48
|
+
|
|
49
|
+
return mix( background, color, k.clamp( 0, 1 ) );
|
|
50
|
+
|
|
51
|
+
} ).setLayout( {
|
|
52
|
+
name: 'dalmatianSpotsRaw',
|
|
53
|
+
type: 'vec3',
|
|
54
|
+
inputs: [
|
|
55
|
+
{ name: 'position', type: 'vec3' },
|
|
56
|
+
{ name: 'scale', type: 'float' },
|
|
57
|
+
{ name: 'density', type: 'float' },
|
|
58
|
+
{ name: 'color', type: 'vec3' },
|
|
59
|
+
{ name: 'background', type: 'vec3' },
|
|
60
|
+
{ name: 'seed', type: 'float' },
|
|
61
|
+
] }
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
function dalmatianSpots( params={} ) {
|
|
67
|
+
|
|
68
|
+
var { position, scale, density, color, background, seed } = { ...defaults, ...params };
|
|
69
|
+
|
|
70
|
+
return dalmatianSpotsRaw( position, scale, density, color, background, seed );
|
|
71
|
+
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
dalmatianSpots.defaults = defaults;
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
export { dalmatianSpots };
|