@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.
Files changed (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +142 -0
  3. package/dist/cjs/tsl-textures.cjs +4749 -0
  4. package/dist/cjs/tsl-textures.min.cjs +2 -0
  5. package/dist/tsl-textures.js +4659 -0
  6. package/dist/tsl-textures.min.js +2 -0
  7. package/package.json +36 -0
  8. package/src/brain.js +116 -0
  9. package/src/bricks.js +116 -0
  10. package/src/camouflage.js +85 -0
  11. package/src/caustics.js +75 -0
  12. package/src/cave-art.js +83 -0
  13. package/src/circle-decor.js +76 -0
  14. package/src/circles.js +83 -0
  15. package/src/clouds.js +114 -0
  16. package/src/concrete.js +95 -0
  17. package/src/cork.js +104 -0
  18. package/src/crumpled-fabric.js +81 -0
  19. package/src/dalmatian-spots.js +80 -0
  20. package/src/darth-maul.js +84 -0
  21. package/src/dyson-sphere.js +144 -0
  22. package/src/entangled.js +75 -0
  23. package/src/fordite.js +69 -0
  24. package/src/gas-giant.js +94 -0
  25. package/src/grid.js +84 -0
  26. package/src/halftone.js +252 -0
  27. package/src/isolayers.js +79 -0
  28. package/src/isolines.js +72 -0
  29. package/src/karst-rock.js +67 -0
  30. package/src/marble.js +96 -0
  31. package/src/melter.js +76 -0
  32. package/src/neon-lights.js +107 -0
  33. package/src/perlin-noise.js +66 -0
  34. package/src/photosphere.js +73 -0
  35. package/src/planet.js +168 -0
  36. package/src/polka-dots.js +106 -0
  37. package/src/processed-wood.js +80 -0
  38. package/src/protozoa.js +110 -0
  39. package/src/reticular-veins.js +72 -0
  40. package/src/roman-paving.js +58 -0
  41. package/src/rotator.js +120 -0
  42. package/src/rough-clay.js +90 -0
  43. package/src/runny-eggs.js +180 -0
  44. package/src/rust.js +144 -0
  45. package/src/satin.js +69 -0
  46. package/src/scaler.js +111 -0
  47. package/src/scepter-head.js +94 -0
  48. package/src/scream.js +72 -0
  49. package/src/stars.js +72 -0
  50. package/src/static-noise.js +73 -0
  51. package/src/supersphere.js +108 -0
  52. package/src/tiger-fur.js +77 -0
  53. package/src/translator.js +116 -0
  54. package/src/tsl-textures.js +63 -0
  55. package/src/tsl-utils.js +344 -0
  56. package/src/turbulent-smoke.js +73 -0
  57. package/src/voronoi-cells.js +99 -0
  58. package/src/water-drops.js +96 -0
  59. package/src/watermelon.js +87 -0
  60. package/src/waves.js +150 -0
  61. package/src/wood.js +99 -0
  62. package/src/zebra-lines.js +77 -0
@@ -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 };
@@ -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 };