tsl-textures 2.5.1 → 3.0.1

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 (59) hide show
  1. package/dist/cjs/tsl-textures.js +2449 -1426
  2. package/dist/cjs/tsl-textures.min.js +2 -2
  3. package/dist/tsl-textures.js +2435 -1421
  4. package/dist/tsl-textures.min.js +2 -2
  5. package/package.json +1 -1
  6. package/src/brain.js +72 -21
  7. package/src/bricks.js +56 -23
  8. package/src/camouflage.js +39 -20
  9. package/src/caustics.js +39 -14
  10. package/src/cave-art.js +39 -13
  11. package/src/circle-decor.js +39 -13
  12. package/src/circles.js +36 -16
  13. package/src/clouds.js +69 -28
  14. package/src/concrete.js +57 -23
  15. package/src/cork.js +54 -35
  16. package/src/crumpled-fabric.js +39 -14
  17. package/src/dalmatian-spots.js +37 -12
  18. package/src/darth-maul.js +43 -15
  19. package/src/dyson-sphere.js +61 -18
  20. package/src/entangled.js +36 -12
  21. package/src/fordite.js +36 -12
  22. package/src/gas-giant.js +42 -16
  23. package/src/grid.js +45 -17
  24. package/src/isolayers.js +41 -15
  25. package/src/isolines.js +36 -10
  26. package/src/karst-rock.js +31 -8
  27. package/src/marble.js +36 -11
  28. package/src/melter.js +0 -1
  29. package/src/neon-lights.js +51 -23
  30. package/src/perlin-noise.js +66 -0
  31. package/src/photosphere.js +34 -11
  32. package/src/planet.js +66 -30
  33. package/src/polka-dots.js +42 -17
  34. package/src/processed-wood.js +42 -16
  35. package/src/protozoa.js +51 -16
  36. package/src/reticular-veins.js +37 -11
  37. package/src/roman-paving.js +30 -8
  38. package/src/rotator.js +71 -27
  39. package/src/rough-clay.js +50 -22
  40. package/src/runny-eggs.js +120 -44
  41. package/src/rust.js +81 -19
  42. package/src/satin.js +27 -20
  43. package/src/scaler.js +61 -26
  44. package/src/scepter-head.js +46 -20
  45. package/src/scream.js +29 -19
  46. package/src/stars.js +36 -11
  47. package/src/static-noise.js +36 -9
  48. package/src/supersphere.js +63 -26
  49. package/src/tiger-fur.js +41 -14
  50. package/src/translator.js +67 -24
  51. package/src/tsl-textures.js +2 -1
  52. package/src/tsl-utils.js +172 -623
  53. package/src/turbulent-smoke.js +38 -13
  54. package/src/voronoi-cells.js +44 -26
  55. package/src/water-drops.js +55 -22
  56. package/src/watermelon.js +43 -18
  57. package/src/wood.js +48 -15
  58. package/src/zebra-lines.js +38 -12
  59. package/src/simplex-noise.js +0 -41
@@ -0,0 +1,66 @@
1
+ 
2
+ // TSL-Textures: Perlin Noise
3
+
4
+
5
+
6
+ import { Color } from "three";
7
+ import { clamp, exp, Fn, mix, positionGeometry } from 'three/tsl';
8
+ import { noise } from './tsl-utils.js';
9
+
10
+
11
+
12
+ var defaults = {
13
+ $name: 'Perlin noise',
14
+
15
+ position: positionGeometry,
16
+ scale: 2,
17
+ balance: 0,
18
+ contrast: 0,
19
+
20
+ color: new Color( 0xFFFFFF ),
21
+ background: new Color( 0x000000 ),
22
+
23
+ seed: 0,
24
+ };
25
+
26
+
27
+
28
+ var perlinNoiseRaw = Fn( ([ position, scale, balance, contrast, color, background, seed ]) => {
29
+
30
+ var pos = position.mul( exp( scale ) ).add( seed );
31
+
32
+ var k = clamp( 0, 1, noise( pos ).mul( 0.5, exp( contrast ) ).add( 0.5, balance ) );
33
+
34
+ return mix( background, color, k );
35
+
36
+ } ).setLayout( {
37
+ name: 'perlinNoiseRaw',
38
+ type: 'vec3',
39
+ inputs: [
40
+ { name: 'position', type: 'vec3' },
41
+ { name: 'scale', type: 'float' },
42
+ { name: 'balance', type: 'float' },
43
+ { name: 'contrast', type: 'float' },
44
+ { name: 'color', type: 'vec3' },
45
+ { name: 'background', type: 'vec3' },
46
+ { name: 'seed', type: 'float' },
47
+ ] }
48
+ );
49
+
50
+
51
+
52
+ function perlinNoise( params={} ) {
53
+
54
+ var { position, scale, balance, contrast, color, background, seed } = { ...defaults, ...params };
55
+
56
+ return perlinNoiseRaw( position, scale, balance, contrast, color, background, seed );
57
+
58
+ }
59
+
60
+
61
+
62
+ perlinNoise.defaults = defaults;
63
+
64
+
65
+
66
+ export { perlinNoise };
@@ -4,14 +4,15 @@
4
4
 
5
5
 
6
6
  import { Color } from "three";
7
- import { exp, Loop, mix, positionGeometry, vec3 } from 'three/tsl';
8
- import { applyEuler, noise, prepare, TSLFn } from './tsl-utils.js';
7
+ import { exp, Fn, Loop, mix, positionGeometry, rotate, vec3 } from 'three/tsl';
8
+ import { noise } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Photosphere',
14
14
 
15
+ position: positionGeometry,
15
16
  scale: 2,
16
17
 
17
18
  color: new Color( 0xFFFF00 ),
@@ -22,28 +23,50 @@ var defaults = {
22
23
 
23
24
 
24
25
 
25
- var photosphere = TSLFn( ( params ) => {
26
+ var photosphereRaw = Fn( ([ position, scale, color, background, seed ]) => {
26
27
 
27
- params = prepare( params, defaults );
28
-
29
- var scale = exp( params.scale.add( 1 ) ).toVar( );
30
- var pos = positionGeometry.toVar( );
28
+ var xscale = exp( scale.add( 1 ) ).toVar( );
29
+ var pos = position.toVar( );
31
30
 
32
31
  var vec = vec3( pos ).toVar();
33
32
 
34
33
  Loop( 6, () => {
35
34
 
36
- vec.assign( applyEuler( vec, pos.mul( scale ) ) );
37
- scale.mulAssign( params.seed.mul( scale ).sin().mul( 0.05 ).add( 1.1 ) );
35
+ vec.assign( rotate( vec, pos.mul( xscale ) ) );
36
+ xscale.mulAssign( seed.mul( xscale ).sin().mul( 0.05 ).add( 1.1 ) );
38
37
 
39
38
  } );
40
39
 
41
40
 
42
41
  var k = noise( vec ).add( 1 ).div( 2 );
43
42
 
44
- return mix( params.background, params.color, k );
43
+ return mix( background, color, k );
44
+
45
+ } ).setLayout( {
46
+ name: 'photosphereRaw',
47
+ type: 'vec3',
48
+ inputs: [
49
+ { name: 'position', type: 'vec3' },
50
+ { name: 'scale', type: 'float' },
51
+ { name: 'color', type: 'vec3' },
52
+ { name: 'background', type: 'vec3' },
53
+ { name: 'seed', type: 'float' },
54
+ ] }
55
+ );
56
+
57
+
58
+
59
+ function photosphere( params={} ) {
60
+
61
+ var { position, scale, color, background, seed } = { ...defaults, ...params };
62
+
63
+ return photosphereRaw( position, scale, color, background, seed );
64
+
65
+ }
66
+
67
+
45
68
 
46
- }, defaults );
69
+ photosphere.defaults = defaults;
47
70
 
48
71
 
49
72
 
package/src/planet.js CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
 
6
6
  import { Color } from 'three';
7
- import { exp, float, If, Loop, mix, mul, positionGeometry, remap, smoothstep, vec3 } from 'three/tsl';
8
- import { noise, prepare, TSLFn } from './tsl-utils.js';
7
+ import { exp, float, Fn, If, Loop, mix, mul, positionGeometry, remap, smoothstep, vec3 } from 'three/tsl';
8
+ import { noise } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
@@ -13,6 +13,7 @@ import { noise, prepare, TSLFn } from './tsl-utils.js';
13
13
  var defaults = {
14
14
  $name: 'Planet',
15
15
 
16
+ position: positionGeometry,
16
17
  scale: 2,
17
18
 
18
19
  iterations: 5,
@@ -36,29 +37,27 @@ var defaults = {
36
37
 
37
38
 
38
39
 
39
- var planet = TSLFn( ( params )=>{
40
-
41
- params = prepare( params, defaults );
40
+ var planetRaw = Fn( ([ position, scale, iterations, levelSea, levelMountain, balanceWater, balanceSand, balanceSnow, colorDeep, colorShallow, colorBeach, colorGrass, colorForest, colorSnow, seed ])=>{
42
41
 
43
42
  var k = float( 0 ).toVar(),
44
43
  sum = float( 0 ).toVar(),
45
- scale = exp( params.scale.sub( 2 ) ).toVar(),
46
- power = float( 2 ).toVar();
44
+ xscale = exp( scale.sub( 2 ) ).toVar(),
45
+ xpower = float( 2 ).toVar();
47
46
 
48
- Loop( params.iterations.add( 10 ), ()=>{
47
+ Loop( iterations.add( 10 ), ()=>{
49
48
 
50
- k.addAssign( mul( power, noise( positionGeometry.mul( scale ).add( params.seed ) ) ) );
51
- sum.addAssign( power );
52
- scale.mulAssign( 1.5 );
53
- power.mulAssign( 0.8 );
49
+ k.addAssign( mul( xpower, noise( position.mul( xscale ).add( seed ) ) ) );
50
+ sum.addAssign( xpower );
51
+ xscale.mulAssign( 1.5 );
52
+ xpower.mulAssign( 0.8 );
54
53
 
55
54
  } );
56
55
 
57
56
  k.assign( mul( k, k, 0.5 ).div( sum ) );
58
57
 
59
- var levelSea = params.levelSea.pow( 2 ).toVar();
60
- var levelMountain = params.levelMountain.pow( 2 ).toVar();
61
- var levelSand = mix( levelSea, levelMountain, params.balanceSand ).toVar();
58
+ var levelSea = levelSea.pow( 2 ).toVar();
59
+ var levelMountain = levelMountain.pow( 2 ).toVar();
60
+ var levelSand = mix( levelSea, levelMountain, balanceSand ).toVar();
62
61
  var levelCoast = mix( levelSea, levelSand, 0.4 ).toVar();
63
62
  var levelGrass = mix( levelSea, levelSand, 0.6 ).toVar();
64
63
 
@@ -69,9 +68,9 @@ var planet = TSLFn( ( params )=>{
69
68
 
70
69
  // deep-shallow
71
70
  color.assign( mix(
72
- params.colorDeep,
73
- params.colorShallow,
74
- remap( k, 0, levelSea, 0, 1 ).pow( exp( params.balanceWater.mul( -8 ).add( 4 ) ) )
71
+ colorDeep,
72
+ colorShallow,
73
+ remap( k, 0, levelSea, 0, 1 ).pow( exp( balanceWater.mul( -8 ).add( 4 ) ) )
75
74
  ) );
76
75
 
77
76
  } )
@@ -79,8 +78,8 @@ var planet = TSLFn( ( params )=>{
79
78
 
80
79
  // shallow-sand
81
80
  color.assign( mix(
82
- params.colorShallow,
83
- params.colorBeach,
81
+ colorShallow,
82
+ colorBeach,
84
83
  remap( k, levelSea, levelCoast )
85
84
  ) );
86
85
 
@@ -88,15 +87,15 @@ var planet = TSLFn( ( params )=>{
88
87
  .ElseIf( k.lessThan( levelGrass ), ()=>{
89
88
 
90
89
  // sand
91
- color.assign( params.colorBeach );
90
+ color.assign( colorBeach );
92
91
 
93
92
  } )
94
93
  .ElseIf( k.lessThan( levelSand ), ()=>{
95
94
 
96
95
  // shallow-sand-grass
97
96
  color.assign( mix(
98
- params.colorBeach,
99
- params.colorGrass,
97
+ colorBeach,
98
+ colorGrass,
100
99
  remap( k, levelGrass, levelSand )
101
100
  ) );
102
101
 
@@ -105,8 +104,8 @@ var planet = TSLFn( ( params )=>{
105
104
 
106
105
  // grass-forest
107
106
  color.assign( mix(
108
- params.colorGrass,
109
- params.colorForest,
107
+ colorGrass,
108
+ colorForest,
110
109
  remap( k, levelSand, levelMountain ).pow( 0.75 )
111
110
  ) );
112
111
 
@@ -114,18 +113,55 @@ var planet = TSLFn( ( params )=>{
114
113
  .Else( ()=>{
115
114
 
116
115
  // forest-snow
117
- var levelSnow = mix( 1, levelMountain, params.balanceSnow );
116
+ var levelSnow = mix( 1, levelMountain, balanceSnow );
118
117
  color.assign( mix(
119
- params.colorForest,
120
- params.colorSnow,
121
- smoothstep( mix( levelSnow, levelMountain, params.balanceSnow.pow( 0.5 ) ), levelSnow, k )
118
+ colorForest,
119
+ colorSnow,
120
+ smoothstep( mix( levelSnow, levelMountain, balanceSnow.pow( 0.5 ) ), levelSnow, k )
122
121
  ) );
123
122
 
124
123
  } );
125
124
 
126
125
  return color;
127
126
 
128
- }, defaults );
127
+ } ).setLayout( {
128
+ name: 'planetRaw',
129
+ type: 'vec3',
130
+ inputs: [
131
+ { name: 'position', type: 'vec3' },
132
+ { name: 'scale', type: 'float' },
133
+
134
+ { name: 'iterations', type: 'int' },
135
+ { name: 'levelSea', type: 'float' },
136
+ { name: 'levelMountain', type: 'float' },
137
+ { name: 'balanceWater', type: 'float' },
138
+ { name: 'balanceSand', type: 'float' },
139
+ { name: 'balanceSnow', type: 'float' },
140
+
141
+ { name: 'colorDeep', type: 'vec3' },
142
+ { name: 'colorShallow', type: 'vec3' },
143
+ { name: 'colorBeach', type: 'vec3' },
144
+ { name: 'colorGrass', type: 'vec3' },
145
+ { name: 'colorForest', type: 'vec3' },
146
+ { name: 'colorSnow', type: 'vec3' },
147
+
148
+ { name: 'seed', type: 'float' },
149
+ ] }
150
+ );
151
+
152
+
153
+
154
+ function planet( params={} ) {
155
+
156
+ var { position, scale, iterations, levelSea, levelMountain, balanceWater, balanceSand, balanceSnow, colorDeep, colorShallow, colorBeach, colorGrass, colorForest, colorSnow, seed } = { ...defaults, ...params };
157
+
158
+ return planetRaw( position, scale, iterations, levelSea, levelMountain, balanceWater, balanceSand, balanceSnow, colorDeep, colorShallow, colorBeach, colorGrass, colorForest, colorSnow, seed );
159
+
160
+ }
161
+
162
+
163
+
164
+ planet.defaults = defaults;
129
165
 
130
166
 
131
167
 
package/src/polka-dots.js CHANGED
@@ -4,14 +4,15 @@
4
4
 
5
5
 
6
6
  import { Color } from "three";
7
- import { acos, add, distance, exp, float, If, Loop, mat2, max, min, mix, mod, mul, oneMinus, positionGeometry, pow, smoothstep, } from 'three/tsl';
8
- import { prepare, spherical, TSLFn } from './tsl-utils.js';
7
+ import { acos, add, distance, exp, float, Fn, If, Loop, mat2, max, min, mix, mod, mul, oneMinus, positionGeometry, pow, smoothstep, } from 'three/tsl';
8
+ import { spherical } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Polka dots',
14
14
 
15
+ position: positionGeometry,
15
16
  count: 2,
16
17
  size: 0.5,
17
18
  blur: 0.25,
@@ -28,24 +29,22 @@ var goldenRatio = ( 1+5**0.5 )/2;
28
29
 
29
30
 
30
31
 
31
- var polkaDots = TSLFn( ( params ) => {
32
-
33
- params = prepare( params, defaults );
32
+ var polkaDotsRaw = Fn( ([ position, count, size, blur, color, background, xflat ]) => {
34
33
 
35
34
  var dist = float( 1 ).toVar();
36
35
 
37
- If( params.flat.equal( 1 ), ()=>{
36
+ If( xflat.equal( 1 ), ()=>{
38
37
 
39
- var cnt = params.count.pow( 2 ).sub( 0.5 ).toVar();
40
- var pos = positionGeometry.xy.mul( cnt ).mul( mat2( 1, 1, -1, 1 ) );
38
+ var cnt = count.pow( 2 ).sub( 0.5 ).toVar();
39
+ var pos = position.xy.mul( cnt ).mul( mat2( 1, 1, -1, 1 ) );
41
40
  var posTo = pos.round().toVar();
42
41
 
43
42
  dist.assign( pos.distance( posTo ).div( cnt ) );
44
43
 
45
- } ).Else( ()=>{
44
+ } ).Else( ()=>{
46
45
 
47
- var cnt = pow( 10, params.count ).toVar();
48
- var vec = positionGeometry.normalize().toVar();
46
+ var cnt = pow( 10, count ).toVar();
47
+ var vec = position.normalize().toVar();
49
48
 
50
49
  var besti = oneMinus( vec.y ).mul( cnt ).sub( 1 ).div( 2 );
51
50
 
@@ -65,16 +64,42 @@ var polkaDots = TSLFn( ( params ) => {
65
64
  dist.assign( min( dist, distance( vec, pnt ) ) );
66
65
 
67
66
  } ); // Loop
68
-
67
+
69
68
  } ); // Else
70
69
 
71
- var size = exp( params.size.mul( 5 ).sub( 5 ) ).toVar();
72
- var blur = params.blur.pow( 4 ).toVar();
73
- var k = smoothstep( size.sub( blur ), size.add( blur ), dist );
70
+ var xsize = exp( size.mul( 5 ).sub( 5 ) ).toVar();
71
+ var xblur = blur.pow( 4 ).toVar();
72
+ var k = smoothstep( xsize.sub( xblur ), xsize.add( xblur ), dist );
73
+
74
+ return mix( color, background, k );
75
+
76
+ } ).setLayout( {
77
+ name: 'polkaDotsRaw',
78
+ type: 'vec3',
79
+ inputs: [
80
+ { name: 'position', type: 'vec3' },
81
+ { name: 'count', type: 'float' },
82
+ { name: 'size', type: 'float' },
83
+ { name: 'blur', type: 'float' },
84
+ { name: 'color', type: 'vec3' },
85
+ { name: 'background', type: 'vec3' },
86
+ { name: 'xflat', type: 'int' },
87
+ ] }
88
+ );
89
+
90
+
91
+
92
+ function polkaDots( params={} ) {
93
+
94
+ var { position, count, size, blur, color, background, flat } = { ...defaults, ...params };
95
+
96
+ return polkaDotsRaw( position, count, size, blur, color, background, flat );
97
+
98
+ }
99
+
74
100
 
75
- return mix( params.color, params.background, k );
76
101
 
77
- }, defaults );
102
+ polkaDots.defaults = defaults;
78
103
 
79
104
 
80
105
 
@@ -4,8 +4,8 @@
4
4
 
5
5
 
6
6
  import { Color } from "three";
7
- import { add, cos, exp, mix, positionGeometry, radians, sin, sub, vec3 } from 'three/tsl';
8
- import { noise, prepare, TSLFn } from './tsl-utils.js';
7
+ import { add, cos, exp, Fn, mix, positionGeometry, radians, sin, sub, vec3 } from 'three/tsl';
8
+ import { noise } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
@@ -13,6 +13,7 @@ var defaults = {
13
13
  $name: 'Processed wood',
14
14
  $width: 260,
15
15
 
16
+ position: positionGeometry,
16
17
  scale: 2,
17
18
  lengths: 4,
18
19
  strength: 0.3,
@@ -26,28 +27,53 @@ var defaults = {
26
27
 
27
28
 
28
29
 
29
- var processedWood = TSLFn( ( params )=>{
30
+ var processedWoodRaw = Fn( ([ position, scale, lengths, strength, angle, color, background, seed ])=>{
30
31
 
31
- params = prepare( params, defaults );
32
-
33
- var angle = radians( params.angle ).toVar();
32
+ var angle = radians( angle ).toVar();
34
33
  var posLocal = vec3(
35
- sub( positionGeometry.x.mul( cos( angle ) ), positionGeometry.y.mul( sin( angle ) ) ),
36
- add( positionGeometry.x.mul( sin( angle ) ), positionGeometry.y.mul( cos( angle ) ) ),
37
- positionGeometry.z,
34
+ sub( position.x.mul( cos( angle ) ), position.y.mul( sin( angle ) ) ),
35
+ add( position.x.mul( sin( angle ) ), position.y.mul( cos( angle ) ) ),
36
+ position.z,
38
37
  ).toVar();
39
38
 
40
- var scale = params.scale.div( 2 ).add( 1 ).toVar();
41
- var pos = posLocal.mul( exp( scale ) ).add( params.seed ).toVar( );
39
+ var xscale = scale.div( 2 ).add( 1 ).toVar();
40
+ var pos = posLocal.mul( exp( scale ) ).add( seed ).toVar( );
42
41
 
43
- var len = params.lengths.add( 5 ).reciprocal().toVar();
44
- var k = noise( pos.mul( scale, vec3( 1, len, len ) ) );
42
+ var len = lengths.add( 5 ).reciprocal().toVar();
43
+ var k = noise( pos.mul( xscale, vec3( 1, len, len ) ) );
45
44
  k = k.mul( noise( pos.mul( vec3( 25, 1, 1 ) ) ).add( -1 ).mul( 0.2 ) );
46
- k = k.add( params.strength.sub( 0.5 ) ).smoothstep( -0.3, 0.3 ).oneMinus();
45
+ k = k.add( strength.sub( 0.5 ) ).smoothstep( -0.3, 0.3 ).oneMinus();
46
+
47
+ return mix( color, background, k );
48
+
49
+ } ).setLayout( {
50
+ name: 'processedWoodRaw',
51
+ type: 'vec3',
52
+ inputs: [
53
+ { name: 'position', type: 'vec3' },
54
+ { name: 'scale', type: 'float' },
55
+ { name: 'lengths', type: 'float' },
56
+ { name: 'strength', type: 'float' },
57
+ { name: 'angle', type: 'float' },
58
+ { name: 'color', type: 'vec3' },
59
+ { name: 'background', type: 'vec3' },
60
+ { name: 'seed', type: 'float' },
61
+ ] }
62
+ );
63
+
64
+
65
+
66
+ function processedWood( params={} ) {
67
+
68
+ var { position, scale, lengths, strength, angle, color, background, seed } = { ...defaults, ...params };
69
+
70
+ return processedWoodRaw( position, scale, lengths, strength, angle, color, background, seed );
71
+
72
+ }
73
+
47
74
 
48
- return mix( params.color, params.background, k );
49
75
 
50
- }, defaults );
76
+ processedWood.defaults = defaults;
51
77
 
52
78
 
53
79
 
package/src/protozoa.js CHANGED
@@ -5,13 +5,15 @@
5
5
 
6
6
  import { Color } from "three";
7
7
  import { exp, float, Fn, Loop, matcapUV, mix, positionGeometry, vec3 } from 'three/tsl';
8
- import { noise, prepare, TSLFn } from './tsl-utils.js';
8
+ import { noise } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Protozoa',
14
14
 
15
+ position: positionGeometry,
16
+ matcap: matcapUV,
15
17
  scale: 1.5,
16
18
  fat: 0.7,
17
19
  amount: 0.4,
@@ -29,17 +31,22 @@ var pnoise = Fn( ([ pos, fat ])=>{
29
31
 
30
32
  return noise( pos ).mul( fat ).clamp( -3.14, 3.14 ).cos().add( 1 ).div( 2 );
31
33
 
32
- } );
34
+ } ).setLayout( {
35
+ name: 'pnoise',
36
+ type: 'float',
37
+ inputs: [
38
+ { name: 'pos', type: 'vec3' },
39
+ { name: 'fat', type: 'float' },
40
+ ] }
41
+ );
33
42
 
34
43
 
35
44
 
36
- var protozoa = TSLFn( ( params )=>{
45
+ var protozoaRaw = Fn( ([ position, matcap, scale, fat, amount, color, subcolor, background, seed ])=>{
37
46
 
38
- params = prepare( params, defaults );
47
+ var pos = position.mul( exp( scale.sub( 1 ) ) ).add( seed ).toVar( );
39
48
 
40
- var pos = positionGeometry.mul( exp( params.scale.sub( 1 ) ) ).add( params.seed ).toVar( );
41
-
42
- var matcap = vec3( matcapUV, matcapUV.length() ).toVar();
49
+ var xmatcap = vec3( matcap, matcap.length() ).toVar();
43
50
 
44
51
  var rings1 = float( 0 ).toVar();
45
52
  var rings2 = float( 0 ).toVar();
@@ -47,18 +54,18 @@ var protozoa = TSLFn( ( params )=>{
47
54
  var n1 = float( 0 ).toVar();
48
55
  var n2 = float( 0 ).toVar();
49
56
 
50
- var fat = params.fat.add( 0.2 ).oneMinus().mul( 60 ).add( 30 ).toVar();
51
- var scale = float( 2 ).toVar();
57
+ var fat = fat.add( 0.2 ).oneMinus().mul( 60 ).add( 30 ).toVar();
58
+ var xscale = float( 2 ).toVar();
52
59
 
53
- var dPos = params.amount.div( 2 ).add( 0.5 ).exp().toVar();
60
+ var dPos = amount.div( 2 ).add( 0.5 ).exp().toVar();
54
61
 
55
62
  Loop( 10, ()=>{
56
63
 
57
- rings1.assign( pnoise( pos.xyz.add( matcap ), fat ) );
58
- rings2.assign( pnoise( pos.yzx.add( matcap ), fat ) );
64
+ rings1.assign( pnoise( pos.xyz.add( xmatcap ), fat ) );
65
+ rings2.assign( pnoise( pos.yzx.add( xmatcap ), fat ) );
59
66
 
60
- n1.addAssign( rings1.mul( rings2 ).mul( scale ) );
61
- n2.addAssign( rings1.max( rings2 ).mul( scale ) );
67
+ n1.addAssign( rings1.mul( rings2 ).mul( xscale ) );
68
+ n2.addAssign( rings1.max( rings2 ).mul( xscale ) );
62
69
 
63
70
  pos.assign( mix( pos.mul( dPos ), 0, 0.4 ) );
64
71
 
@@ -66,9 +73,37 @@ var protozoa = TSLFn( ( params )=>{
66
73
 
67
74
  } );
68
75
 
69
- return mix( params.background, mix( params.color, params.subcolor, n2.mul( 0.1 ) ), n1 );
76
+ return mix( background, mix( color, subcolor, n2.mul( 0.1 ) ), n1 );
77
+
78
+ } ).setLayout( {
79
+ name: 'protozoaRaw',
80
+ type: 'vec3',
81
+ inputs: [
82
+ { name: 'position', type: 'vec3' },
83
+ { name: 'matcap', type: 'vec2' },
84
+ { name: 'scale', type: 'float' },
85
+ { name: 'fat', type: 'float' },
86
+ { name: 'amount', type: 'float' },
87
+ { name: 'color', type: 'vec3' },
88
+ { name: 'subcolor', type: 'vec3' },
89
+ { name: 'background', type: 'vec3' },
90
+ { name: 'seed', type: 'float' },
91
+ ] }
92
+ );
93
+
94
+
95
+
96
+ function protozoa( params={} ) {
97
+
98
+ var { position, matcap, scale, fat, amount, color, subcolor, background, seed } = { ...defaults, ...params };
99
+
100
+ return protozoaRaw( position, matcap, scale, fat, amount, color, subcolor, background, seed );
101
+
102
+ }
103
+
104
+
70
105
 
71
- }, defaults );
106
+ protozoa.defaults = defaults;
72
107
 
73
108
 
74
109
 
@@ -4,14 +4,15 @@
4
4
 
5
5
 
6
6
  import { Color } from 'three';
7
- import { exp, mix, mx_worley_noise_float, positionGeometry } from 'three/tsl';
8
- import { noise, prepare, TSLFn } from './tsl-utils.js';
7
+ import { exp, Fn, mix, positionGeometry } from 'three/tsl';
8
+ import { noise, voronoi } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Reticular veins',
14
14
 
15
+ position: positionGeometry,
15
16
  scale: 2,
16
17
  reticulation: 5,
17
18
  strength: 0.2,
@@ -25,21 +26,46 @@ var defaults = {
25
26
 
26
27
 
27
28
 
28
- var reticularVeins = TSLFn( ( params )=>{
29
+ var reticularVeinsRaw = Fn( ([ position, scale, reticulation, strength, organelles, color, background, seed ])=>{
29
30
 
30
- params = prepare( params, defaults );
31
+ var pos = position.mul( exp( scale.div( 2 ).add( 0.5 ) ) ).add( seed ).toVar( );
31
32
 
32
- var pos = positionGeometry.mul( exp( params.scale.div( 2 ).add( 0.5 ) ) ).add( params.seed ).toVar( );
33
-
34
- var k1 = mx_worley_noise_float( pos.mul( 1 ) );
35
- var k2 = mx_worley_noise_float( pos.add( 100 ).mul( params.reticulation ) ).mul( params.strength );
36
- var dots = noise( pos.mul( 100 ) ).mul( params.strength, params.organelles );
33
+ var k1 = voronoi( pos );
34
+ var k2 = voronoi( pos.add( 100 ).mul( reticulation ) ).mul( strength );
35
+ var dots = noise( pos.mul( 100 ) ).mul( strength, organelles );
37
36
 
38
37
  var k = k1.add( k2 ).add( dots );
39
38
 
40
- return mix( params.background, params.color, k );
39
+ return mix( background, color, k );
40
+
41
+ } ).setLayout( {
42
+ name: 'reticularVeinsRaw',
43
+ type: 'vec3',
44
+ inputs: [
45
+ { name: 'position', type: 'vec3' },
46
+ { name: 'scale', type: 'float' },
47
+ { name: 'reticulation', type: 'float' },
48
+ { name: 'strength', type: 'float' },
49
+ { name: 'organelles', type: 'float' },
50
+ { name: 'color', type: 'vec3' },
51
+ { name: 'background', type: 'vec3' },
52
+ { name: 'seed', type: 'float' },
53
+ ] }
54
+ );
55
+
56
+
57
+
58
+ function reticularVeins( params={} ) {
59
+
60
+ var { position, scale, reticulation, strength, organelles, color, background, seed } = { ...defaults, ...params };
61
+
62
+ return reticularVeinsRaw( position, scale, reticulation, strength, organelles, color, background, seed );
63
+
64
+ }
65
+
66
+
41
67
 
42
- }, defaults );
68
+ reticularVeins.defaults = defaults;
43
69
 
44
70
 
45
71