@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,96 @@
1
+ 
2
+ // TSL-Textures: Water Drops
3
+
4
+
5
+
6
+ import { cos, 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: 'Water Drops',
13
+ $normalNode: true,
14
+
15
+ position: positionGeometry,
16
+
17
+ scale: 1.4,
18
+ density: 0.5,
19
+ bump: 0.6,
20
+
21
+ seed: 0,
22
+ };
23
+
24
+
25
+
26
+ var surfacePos = Fn( ([ pos, normal, density ]) => {
27
+
28
+ var k = noise( pos, 1, density ).clamp( 0, 1 );
29
+ k = cos( k.mul( Math.PI ) ).add( 1 ).pow( 0.5 ).toVar();
30
+
31
+ return pos.add( normal.mul( k ) );
32
+
33
+ } ).setLayout( {
34
+ name: 'surfacePos',
35
+ type: 'vec3',
36
+ inputs: [
37
+ { name: 'position', type: 'vec3' },
38
+ { name: 'normal', type: 'vec3' },
39
+ { name: 'density', type: 'float' },
40
+ ] }
41
+ );
42
+
43
+
44
+
45
+ var waterDropsRaw = Fn( ([ position, normal, tangent, scale, density, bump, seed ]) => {
46
+
47
+ var EPS = 0.001;
48
+
49
+ var seed3d = vec3( 1, 2, 3 ).mul( seed ).sin().mul( 100 ).toVar( );
50
+
51
+ var xposition = position.mul( exp( scale.div( 1 ).add( 1 ) ) ).add( seed3d ).toVar( ),
52
+ xnormal = normal.normalize().toVar(),
53
+ xtangent = tangent.normalize().mul( EPS ).toVar(),
54
+ xbitangent = cross( xnormal, xtangent ).normalize().mul( EPS ).toVar();
55
+
56
+ var xdensity = remap( density, 0, 1, 1.5, 0.7 ).toVar();
57
+
58
+ xnormal.mulAssign( bump );
59
+
60
+ var pos = surfacePos( xposition, xnormal, xdensity ),
61
+ posU = surfacePos( xposition.add( xtangent ), xnormal, xdensity ),
62
+ posV = surfacePos( xposition.add( xbitangent ), xnormal, xdensity );
63
+
64
+ return approximateNormal( pos, posU, posV );
65
+
66
+ } ).setLayout( {
67
+ name: 'waterDropsRaw',
68
+ type: 'vec3',
69
+ inputs: [
70
+ { name: 'position', type: 'vec3' },
71
+ { name: 'normal', type: 'vec3' },
72
+ { name: 'tangent', type: 'vec3' },
73
+ { name: 'scale', type: 'float' },
74
+ { name: 'density', type: 'float' },
75
+ { name: 'bump', type: 'float' },
76
+ { name: 'seed', type: 'float' },
77
+ ] }
78
+ );
79
+
80
+
81
+
82
+ function waterDrops( params={} ) {
83
+
84
+ var { position, scale, density, bump, seed } = { ...defaults, ...params };
85
+
86
+ return waterDropsRaw( position, normalLocal, tangentLocal, scale, density, bump, seed );
87
+
88
+ }
89
+
90
+
91
+
92
+ waterDrops.defaults = defaults;
93
+
94
+
95
+
96
+ export { waterDrops };
@@ -0,0 +1,87 @@
1
+ 
2
+ // TSL-Textures: Watermelon
3
+
4
+
5
+
6
+ import { Color } from 'three';
7
+ import { equirectUV, exp, Fn, mix, positionGeometry, screenUV, vec3 } from 'three/tsl';
8
+ import { noise } from './tsl-utils.js';
9
+
10
+
11
+
12
+ var defaults = {
13
+ $name: 'Watermelon',
14
+ $replaceExportUVS: screenUV,
15
+
16
+ position: positionGeometry,
17
+ uvs: equirectUV( positionGeometry.normalize() ),
18
+
19
+ scale: 2,
20
+ stripes: 12,
21
+ variation: 0.5,
22
+ noise: 0.25,
23
+
24
+ color: new Color( 'yellowgreen' ),
25
+ background: new Color( 'darkgreen' ),
26
+
27
+ seed: 0,
28
+ };
29
+
30
+
31
+
32
+ var watermelonRaw = Fn( ([ position, uvs, scale, stripes, variation, xnoise, color, background, seed ])=>{
33
+
34
+ var pos = position.mul( exp( scale.div( 4 ).add( 2 ) ) ).add( seed ).toVar( );
35
+
36
+ var a = uvs.x.mul( stripes, 2*Math.PI ).add( noise( pos.mul( vec3( 1, 0.3, 1 ) ) ).mul( 2 ) );
37
+
38
+ var k = a.sin().add( 0.5 ).div( 2 ).mul( uvs.y.remap( 0, 1, -Math.PI, Math.PI ).cos().add( 1.2 ).clamp( 0, 1 ) )
39
+ .add( variation.mul( 2, noise( pos.mul( 1.5 ) ).div( 2 ) ) )
40
+ .add( variation.mul( 2, noise( pos.mul( 4 ) ).div( 6 ) ) )
41
+ .toVar();
42
+
43
+ k.assign(
44
+ k.mix( k.round(), 0.75 )
45
+ .add( noise( pos.mul( 2 ) ).mul( xnoise, 0.5 ) )
46
+ .add( noise( pos.mul( 3 ) ).mul( xnoise, 1 ) )
47
+ .add( noise( pos.mul( 15 ) ).mul( xnoise, 0.2 ) )
48
+ .clamp( 0, 1 )
49
+ );
50
+
51
+ var color = mix( background, color, k ).toVar();
52
+
53
+ return color;
54
+
55
+ } ).setLayout( {
56
+ name: 'watermelonRaw',
57
+ type: 'vec3',
58
+ inputs: [
59
+ { name: 'position', type: 'vec3' },
60
+ { name: 'uvs', type: 'vec2' },
61
+ { name: 'scale', type: 'float' },
62
+ { name: 'stripes', type: 'int' },
63
+ { name: 'variation', type: 'float' },
64
+ { name: 'xnoise', type: 'float' },
65
+ { name: 'color', type: 'vec3' },
66
+ { name: 'background', type: 'vec3' },
67
+ { name: 'seed', type: 'float' },
68
+ ] }
69
+ );
70
+
71
+
72
+
73
+ function watermelon( params={} ) {
74
+
75
+ var { position, uvs, scale, stripes, variation, noise, color, background, seed } = { ...defaults, ...params };
76
+
77
+ return watermelonRaw( position, uvs, scale, stripes, variation, noise, color, background, seed );
78
+
79
+ }
80
+
81
+
82
+
83
+ watermelon.defaults = defaults;
84
+
85
+
86
+
87
+ export { watermelon };
package/src/waves.js ADDED
@@ -0,0 +1,150 @@
1
+ 
2
+ // TSL-Textures: Waves
3
+
4
+
5
+
6
+ import { Color } from "three";
7
+ import { exp, float, Fn, mix, positionGeometry, time, vec3 } from 'three/tsl';
8
+ import { fractal } from './tsl-utils.js';
9
+
10
+
11
+ var defaults = {
12
+ $name: 'Waves',
13
+
14
+ position: positionGeometry,
15
+ scale: 2,
16
+ speed: 0,
17
+ time: time,
18
+ level: -0.4,
19
+ rough: 10,
20
+ height: 0.5,
21
+
22
+ foamSize: 0.2,
23
+ foamEdge: 0.5,
24
+
25
+ color: new Color( 0xFFFFFF ),
26
+ background: new Color( 0x2060FF ),
27
+
28
+ seed: 0,
29
+ };
30
+
31
+
32
+
33
+ var waves_core = Fn( ([ position, scale, speed, time, level, rough, height, foamSize, /*foamEdge,*/ seed ]) => {
34
+
35
+ const xscale = exp( scale.sub( 1 ) ).toVar();
36
+ const pos = position.mul( xscale ).add( seed ).toVar( 'pos' );
37
+ const xtime = time.mul( speed.exp() );
38
+
39
+ var posXZ = vec3( pos.x, 0, pos.z ).div( 3 );
40
+
41
+ const xfoamSize = foamSize.mul( fractal( pos, rough.div( 2 ) ).div( 2 ).add( 1 ).div( 2 ) );
42
+
43
+ var xheight = height.div( xscale, 0.8 ).toVar();
44
+
45
+ var wave = position.y.sub( level )
46
+ .add( fractal( posXZ, 1 ).mul( 2*3.14 ).add( xtime ).sin().div( 2 ).mul( xheight ) )
47
+ .sub( fractal( pos, rough ).mul( 2*3.14 ).add( xtime.mul( 2 ) ).sin().sub( 1 ).div( 5 ).mul( xheight ) )
48
+ .smoothstep( float( 0.5 ).sub( xfoamSize ), float( 0.5 ).add( xfoamSize ) )
49
+ .toVar();
50
+
51
+ return wave;
52
+
53
+ } ).setLayout( {
54
+ name: 'waves_core',
55
+ type: 'float',
56
+ inputs: [
57
+ { name: 'position', type: 'vec3' },
58
+ { name: 'scale', type: 'float' },
59
+ { name: 'speed', type: 'float' },
60
+ { name: 'time', type: 'float' },
61
+ { name: 'level', type: 'float' },
62
+ { name: 'rough', type: 'float' },
63
+ { name: 'height', type: 'float' },
64
+ { name: 'foamSize', type: 'float' },
65
+ /*{ name: 'foamEdge', type: 'float' },*/
66
+ { name: 'seed', type: 'float' },
67
+ ] }
68
+ );
69
+
70
+
71
+
72
+ var wavesRaw = Fn( ([ position, scale, speed, time, level, rough, height, foamSize, /*foamEdge,*/ color, background, seed ]) => {
73
+
74
+ var k = waves_core( position, scale, speed, time, level, rough, height, foamSize, /*foamEdge,*/ seed );
75
+ return mix( background, color, k.clamp( 0, 1 ) );
76
+
77
+
78
+ } ).setLayout( {
79
+ name: 'wavesRaw',
80
+ type: 'vec3',
81
+ inputs: [
82
+ { name: 'position', type: 'vec3' },
83
+ { name: 'scale', type: 'float' },
84
+ { name: 'speed', type: 'float' },
85
+ { name: 'time', type: 'float' },
86
+ { name: 'level', type: 'float' },
87
+ { name: 'rough', type: 'float' },
88
+ { name: 'height', type: 'float' },
89
+ { name: 'foamSize', type: 'float' },
90
+ /*{ name: 'foamEdge', type: 'float' },*/
91
+ { name: 'color', type: 'vec3' },
92
+ { name: 'background', type: 'vec3' },
93
+ { name: 'seed', type: 'float' },
94
+ ] }
95
+ );
96
+
97
+
98
+
99
+ var wavesOpacityRaw = Fn( ([ position, scale, speed, time, level, rough, height, foamSize, foamEdge, /*color,background,*/ seed ]) => {
100
+
101
+ var k = waves_core( position, scale, speed, time, level, rough, height, foamSize, /*foamEdge,*/ seed ).oneMinus();
102
+
103
+ return k.smoothstep( 0, foamEdge.oneMinus().div( 10 ) );
104
+
105
+ } ).setLayout( {
106
+ name: 'wavesOpacityRaw',
107
+ type: 'float',
108
+ inputs: [
109
+ { name: 'position', type: 'vec3' },
110
+ { name: 'scale', type: 'float' },
111
+ { name: 'speed', type: 'float' },
112
+ { name: 'time', type: 'float' },
113
+ { name: 'level', type: 'float' },
114
+ { name: 'rough', type: 'float' },
115
+ { name: 'height', type: 'float' },
116
+ { name: 'foamSize', type: 'float' },
117
+ { name: 'foamEdge', type: 'float' },
118
+ /*{ name: 'color', type: 'vec3' },*/
119
+ /*{ name: 'subcolor', type: 'vec3' },*/
120
+ { name: 'seed', type: 'float' },
121
+ ] }
122
+ );
123
+
124
+
125
+
126
+ function waves( params={} ) {
127
+
128
+ var { position, scale, speed, time, level, rough, height, foamSize, /*foamEdge,*/ color, background, seed } = { ...defaults, ...params };
129
+
130
+ return wavesRaw( position, scale, speed, time, level, rough, height, foamSize, /*foamEdge,*/ color, background, seed );
131
+
132
+ }
133
+
134
+
135
+
136
+ waves.opacity = function ( params={} ) {
137
+
138
+ var { position, scale, speed, time, level, rough, height, foamSize, foamEdge, /*color,background,*/seed } = { ...defaults, ...params };
139
+
140
+ return wavesOpacityRaw( position, scale, speed, time, level, rough, height, foamSize, foamEdge, /*color,background,*/seed );
141
+
142
+ };
143
+
144
+
145
+
146
+ waves.defaults = defaults;
147
+
148
+
149
+
150
+ export { waves };
package/src/wood.js ADDED
@@ -0,0 +1,99 @@
1
+ 
2
+ // TSL-Textures: Wood
3
+
4
+
5
+
6
+ import { Color } from 'three';
7
+ import { add, cos, exp, float, Fn, Loop, mix, mul, positionGeometry, radians, reciprocal, sin, sub, vec3 } from 'three/tsl';
8
+ import { noise } from './tsl-utils.js';
9
+
10
+
11
+
12
+ var defaults = {
13
+ $name: 'Wood',
14
+
15
+ position: positionGeometry,
16
+ scale: 2.5,
17
+
18
+ rings: 4.5,
19
+ lengths: 1,
20
+ angle: 0,
21
+
22
+ fibers: 0.3,
23
+ fibersDensity: 10,
24
+
25
+ color: new Color( 0.8, 0.4, 0 ),
26
+ background: new Color( 0.4, 0.1, 0 ),
27
+
28
+ seed: 0,
29
+ };
30
+
31
+
32
+
33
+ var woodRaw = Fn( ([ position, scale, rings, lengths, angle, fibers, fibersDensity, color, background, seed ]) => {
34
+
35
+ var angle = radians( angle ).toVar();
36
+ var posLocal = vec3(
37
+ sub( position.x.mul( cos( angle ) ), position.y.mul( sin( angle ) ) ),
38
+ add( position.x.mul( sin( angle ) ), position.y.mul( cos( angle ) ) ),
39
+ position.z,
40
+ ).toVar();
41
+
42
+
43
+ // main pattern with rings
44
+ var pos = posLocal.mul( exp( scale.sub( 3 ) ).mul( vec3( reciprocal( lengths ), 4, reciprocal( lengths ) ) ) ).add( seed ).toVar( );
45
+ var k = noise( pos ).add( 1 ).mul( 10 ).mul( rings );
46
+ k = k.add( k.cos() ).cos().add( 1 ).div( 2 );
47
+
48
+ var kk = float( 0 ).toVar(),
49
+ sum = float( 0 ).toVar(),
50
+ scale = exp( scale.sub( 2 ) ).mul( vec3( 1, fibersDensity, 1 ) ).toVar(),
51
+ power = float( 2 ).toVar();
52
+
53
+ Loop( 10, ()=>{
54
+
55
+ kk.addAssign( mul( power, noise( posLocal.mul( scale ).add( seed ) ) ) );
56
+ sum.addAssign( power );
57
+ scale.mulAssign( 1.8 );
58
+ power.mulAssign( 0.6 );
59
+
60
+ } );
61
+
62
+ kk.assign( mul( kk, 5 ).div( sum ).mul( 10 ).sin().add( 1 ).div( 2 ) );
63
+
64
+ return mix( color, background, mix( k, kk, fibers ) );
65
+
66
+ } ).setLayout( {
67
+ name: 'woodRaw',
68
+ type: 'vec3',
69
+ inputs: [
70
+ { name: 'position', type: 'vec3' },
71
+ { name: 'scale', type: 'float' },
72
+ { name: 'rings', type: 'float' },
73
+ { name: 'lengths', type: 'float' },
74
+ { name: 'angle', type: 'float' },
75
+ { name: 'fibers', type: 'float' },
76
+ { name: 'fibersDensity', type: 'float' },
77
+ { name: 'color', type: 'vec3' },
78
+ { name: 'background', type: 'vec3' },
79
+ { name: 'seed', type: 'float' },
80
+ ] }
81
+ );
82
+
83
+
84
+
85
+ function wood( params={} ) {
86
+
87
+ var { position, scale, rings, lengths, angle, fibers, fibersDensity, color, background, seed } = { ...defaults, ...params };
88
+
89
+ return woodRaw( position, scale, rings, lengths, angle, fibers, fibersDensity, color, background, seed );
90
+
91
+ }
92
+
93
+
94
+
95
+ wood.defaults = defaults;
96
+
97
+
98
+
99
+ export { wood };
@@ -0,0 +1,77 @@
1
+ 
2
+ // TSL-Textures: Zebra Lines
3
+
4
+
5
+
6
+ import { Color } from "three";
7
+ import { acos, clamp, cos, exp, Fn, mix, positionGeometry, select, sin, vec2 } from 'three/tsl';
8
+ import { spherical } from './tsl-utils.js';
9
+
10
+
11
+
12
+ var defaults = {
13
+ $name: 'Zebra lines',
14
+
15
+ position: positionGeometry,
16
+ scale: 2,
17
+ thinness: 0.5,
18
+ phi: 0,
19
+ theta: 0,
20
+
21
+ color: new Color( 0x0 ),
22
+ background: new Color( 0xFFFFFF ),
23
+
24
+ flat: 0,
25
+ // no seed for zebra lines
26
+ };
27
+
28
+
29
+
30
+ var zebraLinesRaw = Fn( ([ position, scale, thinness, phi, theta, color, background, xflat ]) => {
31
+
32
+ var pos = select( xflat, position, position.normalize() ).toVar( );
33
+
34
+ var dir = select( xflat, vec2( cos( phi ), sin( phi ) ), spherical( phi, theta ) ).toVar();
35
+
36
+ var angle = select( xflat, clamp( dir.dot( pos ), -2, 2 ), acos( clamp( dir.dot( pos ), -1, 1 ) ) ).toVar();
37
+
38
+ var scale = exp( scale.add( 1 ) ).toVar();
39
+
40
+ var k = sin( angle.mul( scale ) ).sub( thinness.sub( 0.5 ).mul( 2 ) );
41
+
42
+ k = clamp( k.mul( 1000 ).div( scale ), -1, 1 ).mul( 0.5 ).add( 0.5 );
43
+
44
+ return mix( background, color, k );
45
+
46
+ } ).setLayout( {
47
+ name: 'zebraLinesRaw',
48
+ type: 'vec3',
49
+ inputs: [
50
+ { name: 'position', type: 'vec3' },
51
+ { name: 'scale', type: 'float' },
52
+ { name: 'thinness', type: 'float' },
53
+ { name: 'phi', type: 'float' },
54
+ { name: 'theta', type: 'float' },
55
+ { name: 'color', type: 'vec3' },
56
+ { name: 'background', type: 'vec3' },
57
+ { name: 'xflat', type: 'int' },
58
+ ] }
59
+ );
60
+
61
+
62
+
63
+ function zebraLines( params={} ) {
64
+
65
+ var { position, scale, thinness, phi, theta, color, background, flat } = { ...defaults, ...params };
66
+
67
+ return zebraLinesRaw( position, scale, thinness, phi, theta, color, background, flat );
68
+
69
+ }
70
+
71
+
72
+
73
+ zebraLines.defaults = defaults;
74
+
75
+
76
+
77
+ export { zebraLines };