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
@@ -3,8 +3,8 @@
3
3
 
4
4
 
5
5
 
6
- import { exp, mx_fractal_noise_float, mx_fractal_noise_vec3, mx_worley_noise_float, positionGeometry, time, vec3 } from 'three/tsl';
7
- import { prepare, TSLFn } from './tsl-utils.js';
6
+ import { exp, Fn, positionGeometry, time, vec3 } from 'three/tsl';
7
+ import { fractal, fractal3, voronoi } from './tsl-utils.js';
8
8
 
9
9
 
10
10
 
@@ -12,36 +12,61 @@ var defaults = {
12
12
  $name: 'Turbulent smoke',
13
13
  $width: 260,
14
14
 
15
+ position: positionGeometry,
15
16
  scale: 2,
16
17
  speed: 0,
17
18
  details: 5,
19
+ time: time,
18
20
 
19
21
  seed: 0,
20
22
  };
21
23
 
22
24
 
23
25
 
24
- var turbulentSmoke = TSLFn( ( params )=>{
26
+ var turbulentSmokeRaw = Fn( ([ position, scale, speed, details, time, seed ])=>{
25
27
 
26
- params = prepare( params, defaults );
28
+ var pos = position.mul( exp( scale.sub( 1 ) ) ).add( seed ).toVar( );
27
29
 
28
- var pos = positionGeometry.mul( exp( params.scale.sub( 1 ) ) ).add( params.seed ).toVar( );
29
-
30
- var t = time.mul( params.speed.sub( 1 ).exp() );
30
+ var t = time.mul( speed.sub( 1 ).exp() );
31
31
 
32
32
  var q = pos.add( vec3(
33
- mx_fractal_noise_float( pos.add( vec3( 1, t.sin(), -1 ) ) ),
34
- mx_fractal_noise_float( pos.add( vec3( t.add( 2*Math.PI/3 ).sin(), 1, -1 ) ) ),
35
- mx_fractal_noise_float( pos.add( vec3( 1, -1, t.add( 4*Math.PI/3 ).sin() ) ) ),
33
+ fractal( pos.add( vec3( 1, t.sin(), -1 ) ) ),
34
+ fractal( pos.add( vec3( t.add( 2*Math.PI/3 ).sin(), 1, -1 ) ) ),
35
+ fractal( pos.add( vec3( 1, -1, t.add( 4*Math.PI/3 ).sin() ) ) ),
36
36
  ) );
37
37
 
38
- var p = mx_fractal_noise_vec3( q, params.details );
38
+ var p = fractal3( q, details );
39
39
 
40
- var k = mx_worley_noise_float( pos.add( p.div( 2 ) ) ).pow( 4 ).mul( 4 ).oneMinus();
40
+ var k = voronoi( pos.add( p.div( 2 ) ) ).pow( 4 ).mul( 4 ).oneMinus();
41
41
 
42
42
  return k;
43
43
 
44
- }, defaults );
44
+ } ).setLayout( {
45
+ name: 'turbulentSmokeRaw',
46
+ type: 'vec3',
47
+ inputs: [
48
+ { name: 'position', type: 'vec3' },
49
+ { name: 'scale', type: 'float' },
50
+ { name: 'speed', type: 'float' },
51
+ { name: 'details', type: 'int' },
52
+ { name: 'time', type: 'float' },
53
+ { name: 'seed', type: 'float' },
54
+ ] }
55
+ );
56
+
57
+
58
+
59
+ function turbulentSmoke( params={} ) {
60
+
61
+ var { position, scale, speed, details, time, seed } = { ...defaults, ...params };
62
+
63
+ return turbulentSmokeRaw( position, scale, speed, details, time, seed );
64
+
65
+ }
66
+
67
+
68
+
69
+ turbulentSmoke.defaults = defaults;
45
70
 
46
71
 
47
72
 
@@ -4,14 +4,15 @@
4
4
 
5
5
 
6
6
  import { Color } from 'three';
7
- import { exp, float, Fn, If, Loop, mix, positionGeometry, vec3 } from 'three/tsl';
8
- import { noise, prepare, TSLFn } from './tsl-utils.js';
7
+ import { exp, float, Fn, If, int, Loop, mix, positionGeometry, vec3 } from 'three/tsl';
8
+ import { noise, vnoise } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Voronoi cells',
14
14
 
15
+ position: positionGeometry,
15
16
  scale: 2,
16
17
  variation: 0,
17
18
  facet: 0,
@@ -24,18 +25,9 @@ var defaults = {
24
25
 
25
26
 
26
27
 
27
- var cellCenter = Fn( ([ cell ])=>{
28
+ var voronoiCellsRaw = Fn( ([ position, scale, variation, facet, color, background, seed ])=>{
28
29
 
29
- return cell.add( noise( cell.mul( Math.PI ) ) );
30
-
31
- } );
32
-
33
-
34
- var voronoiCells = TSLFn( ( params )=>{
35
-
36
- params = prepare( params, defaults );
37
-
38
- var pos = positionGeometry.mul( exp( params.scale.div( 2 ).add( 0.5 ) ) ).add( params.seed ).toVar( );
30
+ var pos = position.mul( exp( scale.div( 2 ).add( 0.5 ) ) ).add( seed ).toVar( );
39
31
 
40
32
  var midCell = pos.round().toVar();
41
33
 
@@ -45,15 +37,17 @@ var voronoiCells = TSLFn( ( params )=>{
45
37
  var cell = vec3().toVar();
46
38
  var dist = float().toVar();
47
39
 
48
- var i = float( 0 ).toVar();
40
+ var i=int( 0 ).toVar( 'i' ),
41
+ j=int( 0 ).toVar( 'j' ),
42
+ k=int( 0 ).toVar( 'k' );
49
43
 
50
- Loop( 27, () => {
44
+ // Loop uses hard-coded i, j, k as indices
45
+ Loop( 3, 3, 3, () => {
51
46
 
52
- var ix = i.mod( 3 ).sub( 1 );
53
- var iy = i.div( 3 ).floor().mod( 3 ).sub( 1 );
54
- var iz = i.div( 9 ).floor().sub( 1 );
55
- cell.assign( midCell.add( vec3( ix, iy, iz ) ) );
56
- dist.assign( pos.distance( cellCenter( cell ) ).add( noise( pos ).div( 5 ) ) );
47
+ cell.assign( midCell.add( vec3( i, j, k ).sub( 1 ) ) );
48
+ //var cellCenter = cell.add( noise( cell.mul( Math.PI ) ) ); // too slow on WebGL2
49
+ var cellCenter = cell.add( vnoise( cell.mul( Math.PI*2 ) ).div( 2 ) );
50
+ dist.assign( pos.distance( cellCenter ) );
57
51
 
58
52
  If( dist.lessThan( minDist ), ()=>{
59
53
 
@@ -61,20 +55,44 @@ var voronoiCells = TSLFn( ( params )=>{
61
55
  minCell.assign( cell );
62
56
 
63
57
  } );
64
- i.addAssign( 1 );
65
58
 
66
59
  } );
67
60
 
68
-
69
61
  var n = noise( minCell.mul( Math.PI ) ).toVar();
70
- var k = mix( minDist, n.add( 1 ).div( 2 ), params.facet );
62
+ var m = mix( minDist, n.add( 1 ).div( 2 ), facet );
71
63
 
72
- var color = mix( params.color, params.background, k ).toVar();
64
+ var color = mix( color, background, m ).toVar();
73
65
  var randomColor = vec3( n.mul( 16.8 ), n.mul( 31.4159 ), n.mul( 27.1828 ) ).sin().add( 1 ).div( 2 );
74
66
 
75
- return mix( color, mix( color, randomColor, params.variation ), params.variation );
67
+ return mix( color, mix( color, randomColor, variation ), variation );
68
+
69
+ } ).setLayout( {
70
+ name: 'voronoiCellsRaw',
71
+ type: 'vec3',
72
+ inputs: [
73
+ { name: 'position', type: 'vec3' },
74
+ { name: 'scale', type: 'float' },
75
+ { name: 'variation', type: 'float' },
76
+ { name: 'facet', type: 'float' },
77
+ { name: 'color', type: 'vec3' },
78
+ { name: 'background', type: 'vec3' },
79
+ { name: 'seed', type: 'float' },
80
+ ] }
81
+ );
82
+
83
+
84
+
85
+ function voronoiCells( params={} ) {
86
+
87
+ var { position, scale, variation, facet, color, background, seed } = { ...defaults, ...params };
88
+
89
+ return voronoiCellsRaw( position, scale, variation, facet, color, background, seed );
90
+
91
+ }
92
+
93
+
76
94
 
77
- }, defaults );
95
+ voronoiCells.defaults = defaults;
78
96
 
79
97
 
80
98
 
@@ -3,8 +3,8 @@
3
3
 
4
4
 
5
5
 
6
- import { cos, cross, exp, Fn, normalLocal, positionGeometry, remap, sin, sub, tangentLocal, transformNormalToView, vec3 } from 'three/tsl';
7
- import { noise, prepare, TSLFn } from './tsl-utils.js';
6
+ import { cos, cross, exp, Fn, normalLocal, positionGeometry, remap, tangentLocal, vec3 } from 'three/tsl';
7
+ import { approximateNormal, noise } from './tsl-utils.js';
8
8
 
9
9
 
10
10
 
@@ -12,6 +12,8 @@ var defaults = {
12
12
  $name: 'Water Drops',
13
13
  $normalNode: true,
14
14
 
15
+ position: positionGeometry,
16
+
15
17
  scale: 1.4,
16
18
  density: 0.5,
17
19
  bump: 0.6,
@@ -21,42 +23,73 @@ var defaults = {
21
23
 
22
24
 
23
25
 
24
- var surfacePos = Fn( ([ pos, normal, bump, density, seed ]) => {
26
+ var surfacePos = Fn( ([ pos, normal, density ]) => {
25
27
 
26
- var k = noise( pos.add( seed ) ).add( density ).clamp( 0, 1 );
28
+ var k = noise( pos, 1, density ).clamp( 0, 1 );
27
29
  k = cos( k.mul( Math.PI ) ).add( 1 ).pow( 0.5 ).toVar();
28
30
 
29
- return pos.add( k.mul( normal, bump ) );
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();
30
57
 
31
- } );
58
+ xnormal.mulAssign( bump );
32
59
 
60
+ var pos = surfacePos( xposition, xnormal, xdensity ),
61
+ posU = surfacePos( xposition.add( xtangent ), xnormal, xdensity ),
62
+ posV = surfacePos( xposition.add( xbitangent ), xnormal, xdensity );
33
63
 
64
+ return approximateNormal( pos, posU, posV );
34
65
 
35
- var waterDrops = TSLFn( ( params ) => {
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
+ );
36
79
 
37
- params = prepare( params, defaults );
38
80
 
39
- var eps = 0.001;
40
81
 
41
- var position = positionGeometry.mul( exp( params.scale.div( 1 ).add( 1 ) ) ).toVar( ),
42
- normal = normalLocal.normalize().toVar(),
43
- tangent = tangentLocal.normalize().mul( eps ).toVar(),
44
- bitangent = cross( normal, tangent ).normalize().mul( eps ).toVar();
82
+ function waterDrops( params={} ) {
45
83
 
46
- var density = remap( params.density, 0, 1, 1.5, 0.7 ).toVar();
47
- var seed = vec3( sin( params.seed ).mul( 100 ), cos( params.seed.div( 2 ) ).mul( 100 ), sin( params.seed.div( 3 ) ).mul( 100 ) ).toVar();
84
+ var { position, scale, density, bump, seed } = { ...defaults, ...params };
48
85
 
49
- var pos = surfacePos( position, normal, params.bump, density, seed );
86
+ return waterDropsRaw( position, normalLocal, tangentLocal, scale, density, bump, seed );
50
87
 
51
- var posU = surfacePos( position.add( tangent ), normal, params.bump, density, seed );
52
- var posV = surfacePos( position.add( bitangent ), normal, params.bump, density, seed );
88
+ }
53
89
 
54
- var dU = sub( posU, pos ),
55
- dV = sub( posV, pos );
56
90
 
57
- return transformNormalToView( cross( dU, dV ).normalize() );
58
91
 
59
- }, defaults );
92
+ waterDrops.defaults = defaults;
60
93
 
61
94
 
62
95
 
package/src/watermelon.js CHANGED
@@ -4,13 +4,17 @@
4
4
 
5
5
 
6
6
  import { Color } from 'three';
7
- import { equirectUV, exp, mix, positionGeometry, screenUV, select, vec3 } from 'three/tsl';
8
- import { noise, prepare, TSLFn } from './tsl-utils.js';
7
+ import { equirectUV, exp, Fn, mix, positionGeometry, screenUV, vec3 } from 'three/tsl';
8
+ import { noise } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Watermelon',
14
+ $replaceExportUVS: screenUV,
15
+
16
+ position: positionGeometry,
17
+ uvs: equirectUV( positionGeometry.normalize() ),
14
18
 
15
19
  scale: 2,
16
20
  stripes: 12,
@@ -20,42 +24,63 @@ var defaults = {
20
24
  color: new Color( 'yellowgreen' ),
21
25
  background: new Color( 'darkgreen' ),
22
26
 
23
- flat: 0,
24
-
25
27
  seed: 0,
26
28
  };
27
29
 
28
30
 
29
31
 
30
- var watermelon = TSLFn( ( params )=>{
31
-
32
- params = prepare( params, defaults );
33
-
34
- var variation = select( params.flat, params.variation.mul( 0.85 ).add( 0.15 ), params.variation );
32
+ var watermelonRaw = Fn( ([ position, uvs, scale, stripes, variation, xnoise, color, background, seed ])=>{
35
33
 
36
- var pos = positionGeometry.mul( exp( params.scale.div( 4 ).add( 2 ) ) ).add( params.seed ).toVar( );
34
+ var pos = position.mul( exp( scale.div( 4 ).add( 2 ) ) ).add( seed ).toVar( );
37
35
 
38
- var uv = select( params.flat, screenUV, equirectUV( positionGeometry.normalize() ) ).toVar(),
39
- a = uv.x.mul( params.stripes.round(), select( params.flat, Math.PI, 2*Math.PI ) ).add( noise( pos.mul( vec3( 1, 0.3, 1 ) ) ).mul( 2 ) );
36
+ var a = uvs.x.mul( stripes, 2*Math.PI ).add( noise( pos.mul( vec3( 1, 0.3, 1 ) ) ).mul( 2 ) );
40
37
 
41
- var k = a.sin().add( 0.5 ).div( 2 ).mul( uv.y.remap( 0, 1, -Math.PI, Math.PI ).cos().add( 1.2 ).clamp( 0, 1 ) )
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 ) )
42
39
  .add( variation.mul( 2, noise( pos.mul( 1.5 ) ).div( 2 ) ) )
43
40
  .add( variation.mul( 2, noise( pos.mul( 4 ) ).div( 6 ) ) )
44
41
  .toVar();
45
42
 
46
43
  k.assign(
47
44
  k.mix( k.round(), 0.75 )
48
- .add( noise( pos.mul( 2 ) ).mul( params.noise, 0.5 ) )
49
- .add( noise( pos.mul( 3 ) ).mul( params.noise, 1 ) )
50
- .add( noise( pos.mul( 15 ) ).mul( params.noise, 0.2 ) )
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 ) )
51
48
  .clamp( 0, 1 )
52
49
  );
53
50
 
54
- var color = mix( params.background, params.color, k ).toVar();
51
+ var color = mix( background, color, k ).toVar();
55
52
 
56
53
  return color;
57
54
 
58
- }, defaults );
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;
59
84
 
60
85
 
61
86
 
package/src/wood.js CHANGED
@@ -4,51 +4,55 @@
4
4
 
5
5
 
6
6
  import { Color } from 'three';
7
- import { add, cos, exp, float, Loop, mix, mul, positionGeometry, radians, reciprocal, sin, sub, vec3 } from 'three/tsl';
8
- import { noise, prepare, TSLFn } from './tsl-utils.js';
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
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Wood',
14
+
15
+ position: positionGeometry,
14
16
  scale: 2.5,
17
+
15
18
  rings: 4.5,
16
19
  lengths: 1,
17
20
  angle: 0,
21
+
18
22
  fibers: 0.3,
19
23
  fibersDensity: 10,
24
+
20
25
  color: new Color( 0.8, 0.4, 0 ),
21
26
  background: new Color( 0.4, 0.1, 0 ),
27
+
22
28
  seed: 0,
23
29
  };
24
30
 
25
31
 
26
32
 
27
- var wood = TSLFn( ( params ) => {
28
-
29
- params = prepare( params, defaults );
33
+ var woodRaw = Fn( ([ position, scale, rings, lengths, angle, fibers, fibersDensity, color, background, seed ]) => {
30
34
 
31
- var angle = radians( params.angle ).toVar();
35
+ var angle = radians( angle ).toVar();
32
36
  var posLocal = vec3(
33
- sub( positionGeometry.x.mul( cos( angle ) ), positionGeometry.y.mul( sin( angle ) ) ),
34
- add( positionGeometry.x.mul( sin( angle ) ), positionGeometry.y.mul( cos( angle ) ) ),
35
- positionGeometry.z,
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,
36
40
  ).toVar();
37
41
 
38
42
 
39
43
  // main pattern with rings
40
- var pos = posLocal.mul( exp( params.scale.sub( 3 ) ).mul( vec3( reciprocal( params.lengths ), 4, reciprocal( params.lengths ) ) ) ).add( params.seed ).toVar( );
41
- var k = noise( pos ).add( 1 ).mul( 10 ).mul( params.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 );
42
46
  k = k.add( k.cos() ).cos().add( 1 ).div( 2 );
43
47
 
44
48
  var kk = float( 0 ).toVar(),
45
49
  sum = float( 0 ).toVar(),
46
- scale = exp( params.scale.sub( 2 ) ).mul( vec3( 1, params.fibersDensity, 1 ) ).toVar(),
50
+ scale = exp( scale.sub( 2 ) ).mul( vec3( 1, fibersDensity, 1 ) ).toVar(),
47
51
  power = float( 2 ).toVar();
48
52
 
49
53
  Loop( 10, ()=>{
50
54
 
51
- kk.addAssign( mul( power, noise( posLocal.mul( scale ).add( params.seed ) ) ) );
55
+ kk.addAssign( mul( power, noise( posLocal.mul( scale ).add( seed ) ) ) );
52
56
  sum.addAssign( power );
53
57
  scale.mulAssign( 1.8 );
54
58
  power.mulAssign( 0.6 );
@@ -57,9 +61,38 @@ var wood = TSLFn( ( params ) => {
57
61
 
58
62
  kk.assign( mul( kk, 5 ).div( sum ).mul( 10 ).sin().add( 1 ).div( 2 ) );
59
63
 
60
- return mix( params.color, params.background, mix( k, kk, params.fibers ) );
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
+
61
94
 
62
- }, defaults );
95
+ wood.defaults = defaults;
63
96
 
64
97
 
65
98
 
@@ -4,14 +4,15 @@
4
4
 
5
5
 
6
6
  import { Color } from "three";
7
- import { acos, clamp, cos, exp, mix, positionGeometry, select, sin, vec2 } from 'three/tsl';
8
- import { prepare, spherical, TSLFn } from './tsl-utils.js';
7
+ import { acos, clamp, cos, exp, Fn, mix, positionGeometry, select, sin, vec2 } from 'three/tsl';
8
+ import { spherical } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Zebra lines',
14
14
 
15
+ position: positionGeometry,
15
16
  scale: 2,
16
17
  thinness: 0.5,
17
18
  phi: 0,
@@ -26,25 +27,50 @@ var defaults = {
26
27
 
27
28
 
28
29
 
29
- var zebraLines = TSLFn( ( params ) => {
30
+ var zebraLinesRaw = Fn( ([ position, scale, thinness, phi, theta, color, background, xflat ]) => {
30
31
 
31
- params = prepare( params, defaults );
32
+ var pos = select( xflat, position, position.normalize() ).toVar( );
32
33
 
33
- var pos = select( params.flat, positionGeometry, positionGeometry.normalize() ).toVar( );
34
+ var dir = select( xflat, vec2( cos( phi ), sin( phi ) ), spherical( phi, theta ) ).toVar();
34
35
 
35
- var dir = select( params.flat, vec2( cos( params.phi ), sin( params.phi ) ), spherical( params.phi, params.theta ) ).toVar();
36
+ var angle = select( xflat, clamp( dir.dot( pos ), -2, 2 ), acos( clamp( dir.dot( pos ), -1, 1 ) ) ).toVar();
36
37
 
37
- var angle = select( params.flat, clamp( dir.dot( pos ), -2, 2 ), acos( clamp( dir.dot( pos ), -1, 1 ) ) ).toVar();
38
+ var scale = exp( scale.add( 1 ) ).toVar();
38
39
 
39
- var scale = exp( params.scale.add( 1 ) ).toVar();
40
-
41
- var k = sin( angle.mul( scale ) ).sub( params.thinness.sub( 0.5 ).mul( 2 ) );
40
+ var k = sin( angle.mul( scale ) ).sub( thinness.sub( 0.5 ).mul( 2 ) );
42
41
 
43
42
  k = clamp( k.mul( 1000 ).div( scale ), -1, 1 ).mul( 0.5 ).add( 0.5 );
44
43
 
45
- return mix( params.background, params.color, k );
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
+
46
72
 
47
- }, defaults );
73
+ zebraLines.defaults = defaults;
48
74
 
49
75
 
50
76
 
@@ -1,41 +0,0 @@
1
- 
2
- // TSL-Textures: Noise Pattern
3
-
4
-
5
-
6
- import { Color } from "three";
7
- import { clamp, exp, mix, positionGeometry } from 'three/tsl';
8
- import { noise, prepare, TSLFn } from './tsl-utils.js';
9
-
10
-
11
-
12
- var defaults = {
13
- $name: 'Simplex noise',
14
-
15
- scale: 2,
16
- balance: 0,
17
- contrast: 0,
18
-
19
- color: new Color( 0xFFFFFF ),
20
- background: new Color( 0x000000 ),
21
-
22
- seed: 0,
23
- };
24
-
25
-
26
-
27
- var simplexNoise = TSLFn( ( params ) => {
28
-
29
- params = prepare( params, defaults );
30
-
31
- var pos = positionGeometry.mul( exp( params.scale ) ).add( params.seed );
32
-
33
- var k = clamp( 0, 1, noise( pos ).mul( 0.5, exp( params.contrast ) ).add( 0.5, params.balance ) );
34
-
35
- return mix( params.background, params.color, k );
36
-
37
- }, defaults );
38
-
39
-
40
-
41
- export { simplexNoise };