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
package/src/gas-giant.js CHANGED
@@ -4,14 +4,15 @@
4
4
 
5
5
 
6
6
  import { Color } from "three";
7
- import { exp, mix, positionGeometry, vec3 } from 'three/tsl';
8
- import { hsl, noise, prepare, toHsl, TSLFn } from './tsl-utils.js';
7
+ import { exp, Fn, mix, positionGeometry, vec3 } from 'three/tsl';
8
+ import { hsl, noise, toHsl } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Gas giant',
14
14
 
15
+ position: positionGeometry,
15
16
  scale: 2,
16
17
  turbulence: 0.3,
17
18
  blur: 0.6,
@@ -25,15 +26,13 @@ var defaults = {
25
26
 
26
27
 
27
28
 
28
- var gasGiant = TSLFn( ( params )=>{
29
+ var gasGiantRaw = Fn( ([ position, scale, turbulence, blur, colorA, colorB, colorC, seed ])=>{
29
30
 
30
- params = prepare( params, defaults );
31
-
32
- var scale = params.scale.div( 2 ).add( 1 ).toVar();
33
- var pos = positionGeometry.mul( exp( scale ) ).add( params.seed ).toVar( );
31
+ var xscale = scale.div( 2 ).add( 1 ).toVar();
32
+ var pos = position.mul( exp( xscale ) ).add( seed ).toVar( );
34
33
 
35
34
  // turbulence strength
36
- var turbulence = params.turbulence.mul(
35
+ var xturbulence = turbulence.mul(
37
36
  noise( vec3( 0, pos.y.mul( 0.5 ), 0 ).add( 1 ) ).add(
38
37
  noise( vec3( 0, pos.y.mul( 1 ), 0 ).add( 1 ) ).mul( 0.5 ),
39
38
  noise( vec3( 1, pos.y.mul( 2 ), 1 ).add( 1 ) ).mul( 0.25 )
@@ -43,25 +42,52 @@ var gasGiant = TSLFn( ( params )=>{
43
42
  var spot = noise( pos.div( 4 ) ).add( 1 ).div( 2 ).pow( 10 ).mul( 10 ).smoothstep( 0, 1 );
44
43
 
45
44
  // apply turbulence
46
- pos.addAssign( vec3( noise( pos ), noise( pos.yxz ), noise( pos.yzx ) ).mul( turbulence.mul( spot.mul( 2 ).exp() ) ) );
45
+ pos.addAssign( vec3( noise( pos ), noise( pos.yxz ), noise( pos.yzx ) ).mul( xturbulence.mul( spot.mul( 2 ).exp() ) ) );
47
46
 
48
47
 
49
- var blur = params.blur.pow( 0.2 ).oneMinus().mul( turbulence.add( 1 ) ).toVar();
48
+ var xblur = blur.pow( 0.2 ).oneMinus().mul( xturbulence.add( 1 ) ).toVar();
50
49
 
51
- var k = noise( pos.mul( vec3( 0, scale, 0 ) ) );
52
- k = k.add( noise( pos.mul( vec3( 1, 15, 1 ) ) ).mul( blur ) );
50
+ var k = noise( pos.mul( vec3( 0, xscale, 0 ) ) );
51
+ k = k.add( noise( pos.mul( vec3( 1, 15, 1 ) ) ).mul( xblur ) );
53
52
  k = k.add( -0.5 ).smoothstep( -1, 1 ).oneMinus();
54
53
 
55
54
  var n = noise( vec3( 0, pos.y.mul( 0.75 ), 0 ) ).add( 1 );
56
55
 
57
- var HSL = toHsl( mix( params.colorB, params.colorA, n ) );
58
- var color = hsl( HSL.x.add( noise( pos.mul( vec3( 0, scale, 0 ) ) ).div( 4 ) ), HSL.y, HSL.z ).toVar();
56
+ var HSL = toHsl( mix( colorB, colorA, n ) );
57
+ var color = hsl( vec3( HSL.x.add( noise( pos.mul( vec3( 0, xscale, 0 ) ) ).div( 4 ) ), HSL.yz ) ).toVar();
59
58
 
60
- color.assign( mix( color, params.colorC, turbulence.mul( 0.3 ) ) );
59
+ color.assign( mix( color, colorC, xturbulence.mul( 0.3 ) ) );
61
60
 
62
61
  return color.mul( k );
63
62
 
64
- }, defaults );
63
+ } ).setLayout( {
64
+ name: 'gasGiantRaw',
65
+ type: 'vec3',
66
+ inputs: [
67
+ { name: 'position', type: 'vec3' },
68
+ { name: 'scale', type: 'float' },
69
+ { name: 'turbulence', type: 'float' },
70
+ { name: 'blur', type: 'float' },
71
+ { name: 'colorA', type: 'vec3' },
72
+ { name: 'colorB', type: 'vec3' },
73
+ { name: 'colorC', type: 'vec3' },
74
+ { name: 'seed', type: 'float' },
75
+ ] }
76
+ );
77
+
78
+
79
+
80
+ function gasGiant( params={} ) {
81
+
82
+ var { position, scale, turbulence, blur, colorA, colorB, colorC, seed } = { ...defaults, ...params };
83
+
84
+ return gasGiantRaw( position, scale, turbulence, blur, colorA, colorB, colorC, seed );
85
+
86
+ }
87
+
88
+
89
+
90
+ gasGiant.defaults = defaults;
65
91
 
66
92
 
67
93
 
package/src/grid.js CHANGED
@@ -4,52 +4,80 @@
4
4
 
5
5
 
6
6
  import { Color } from "three";
7
- import { abs, add, div, equirectUV, min, mix, mul, oneMinus, positionGeometry, pow, remapClamp, round, screenSize, screenUV, select, sin, smoothstep, sub } from 'three/tsl';
8
- import { prepare, TSLFn } from './tsl-utils.js';
7
+ import { abs, add, div, equirectUV, exp2, Fn, max, min, mix, mul, oneMinus, positionGeometry, pow, remapClamp, round, screenSize, screenUV, sin, smoothstep, sub } from 'three/tsl';
9
8
 
10
9
 
11
10
 
12
11
  var defaults = {
13
12
  $name: 'Grid',
13
+ $replaceExportUVS: screenUV,
14
+ $replaceExportASP: screenSize.x.div( screenSize.y ).log2(),
15
+
16
+ uvs: equirectUV( positionGeometry.normalize() ),
14
17
 
15
18
  countU: 32,
16
19
  countV: 16,
17
20
 
21
+ aspect: 1,
18
22
  thinness: 0.8,
23
+ equirectangular: true,
19
24
 
20
25
  color: new Color( 0x000000 ),
21
26
  background: new Color( 0xFFFFFF ),
22
27
 
23
- flat: 0,
24
28
  };
25
29
 
26
30
 
27
31
 
28
- var grid = TSLFn( ( params ) => {
29
-
30
- params = prepare( params, defaults );
32
+ var gridRaw = Fn( ([ uvs, countU, countV, aspect, thinness, equirectangular, color, background ]) => {
31
33
 
32
- var aspect = select( params.flat, screenSize.x.div( screenSize.y ), 2 );
34
+ var xaspect = max( exp2( aspect ), 1 );
33
35
 
34
- var uv = select( params.flat, screenUV, equirectUV( positionGeometry.normalize() ) ).toVar(),
35
- a = mul( uv.x, aspect, Math.PI ),
36
- b = mul( uv.y, Math.PI ).toVar();
36
+ var a = mul( uvs.x, xaspect, Math.PI ).toVar(),
37
+ b = mul( uvs.y, Math.PI ).toVar();
37
38
 
38
- var uTo = div( round( mul( uv.x, params.countU ) ), params.countU ),
39
- vTo = div( round( mul( uv.y, params.countV ) ), params.countV ),
40
- aTo = mul( uTo, aspect, Math.PI ),
39
+ var uTo = div( round( mul( uvs.x, countU ) ), countU ),
40
+ vTo = div( round( mul( uvs.y, countV ) ), countV ),
41
+ aTo = mul( uTo, xaspect, Math.PI ),
41
42
  bTo = mul( vTo, Math.PI );
42
43
 
43
- var angleU = abs( sub( a, aTo ) ).mul( select( params.flat, 1, sin( b ) ) ),
44
+ var angleU = abs( sub( a, aTo ) ).mul( mix( 1, sin( b ), equirectangular ) ),
44
45
  angleV = abs( sub( b, bTo ) ),
45
46
  angle = min( angleU, angleV );
46
47
 
47
- var treshold = mul( min( div( aspect.mul( Math.PI ), params.countU ), div( Math.PI, params.countV ) ), remapClamp( pow( params.thinness, 0.5 ), 0, 1, 0.9, 0.04 ), 0.5 );
48
+ var treshold = mul( min( div( xaspect.mul( Math.PI ), countU ), div( Math.PI, countV ) ), remapClamp( pow( thinness, 0.5 ), 0, 1, 0.9, 0.04 ), 0.5 );
48
49
  var k = oneMinus( smoothstep( sub( treshold, 0.002 ), add( treshold, 0.002 ), angle ) );
49
50
 
50
- return mix( params.background, params.color, k );
51
+ return mix( background, color, k );
52
+
53
+ } ).setLayout( {
54
+ name: 'gridRaw',
55
+ type: 'vec3',
56
+ inputs: [
57
+ { name: 'uvs', type: 'vec2' },
58
+ { name: 'countU', type: 'float' },
59
+ { name: 'countV', type: 'float' },
60
+ { name: 'aspect', type: 'float' },
61
+ { name: 'thinness', type: 'float' },
62
+ { name: 'equirectangular', type: 'int' },
63
+ { name: 'color', type: 'vec3' },
64
+ { name: 'background', type: 'vec3' },
65
+ ] }
66
+ );
67
+
68
+
69
+
70
+ function grid( params={} ) {
71
+
72
+ var { uvs, countU, countV, aspect, thinness, equirectangular, color, background } = { ...defaults, ...params };
73
+
74
+ return gridRaw( uvs, countU, countV, aspect, thinness, equirectangular, color, background );
75
+
76
+ }
77
+
78
+
51
79
 
52
- }, defaults );
80
+ grid.defaults = defaults;
53
81
 
54
82
 
55
83
 
package/src/isolayers.js CHANGED
@@ -4,14 +4,15 @@
4
4
 
5
5
 
6
6
  import { Color } from 'three';
7
- import { exp, float, mix, positionGeometry } from 'three/tsl';
8
- import { hsl, noise, prepare, toHsl, TSLFn } from './tsl-utils.js';
7
+ import { exp, float, Fn, mix, positionGeometry } from 'three/tsl';
8
+ import { hsl, noise, toHsl } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Isolayers',
14
14
 
15
+ position: positionGeometry,
15
16
  scale: 2,
16
17
  layers: 10,
17
18
  edge: 0.5,
@@ -25,28 +26,53 @@ var defaults = {
25
26
 
26
27
 
27
28
 
28
- var isolayers = TSLFn( ( params )=>{
29
+ var isolayersRaw = Fn( ([ position, scale, layers, edge, darkness, color, background, seed ])=>{
29
30
 
30
- params = prepare( params, defaults );
31
+ var pos = position.mul( exp( scale.sub( 1 ) ) ).add( seed ).toVar( );
31
32
 
32
- var pos = positionGeometry.mul( exp( params.scale.sub( 1 ) ) ).add( params.seed ).toVar( );
33
+ var depth = edge.remap( 0, 1, 40, 10 );
33
34
 
34
- var depth = params.edge.remap( 0, 1, 40, 10 );
35
+ var k = noise( pos, 1.2, 1 ).div( 2 );
35
36
 
36
- var k = noise( pos ).mul( 1.2 ).add( 1 ).div( 2 );
37
-
38
- var i = k.mul( params.layers ).round().div( params.layers ).clamp( 0, 1 );
39
- var f = k.sub( float( 0.5+0.03 ).div( params.layers ) )
40
- .mul( params.layers ).fract()
37
+ var i = k.mul( layers ).round().div( layers ).clamp( 0, 1 );
38
+ var f = k.sub( float( 0.5+0.03 ).div( layers ) )
39
+ .mul( layers ).fract()
41
40
  .mul( float( 2 ).pow( depth.reciprocal() ) )
42
41
  .pow( depth ).sub( 1 ).abs().oneMinus();
43
42
 
44
- var hslColor = mix( toHsl( params.background ), toHsl( params.color ), i ).toVar();
45
- hslColor.z.mulAssign( mix( 1, i.mul( 1.5 ), params.darkness ).clamp( 0, 1 ) );
43
+ var hslColor = mix( toHsl( background ), toHsl( color ), i ).toVar();
44
+ hslColor.z.mulAssign( mix( 1, i.mul( 1.5 ), darkness ).clamp( 0, 1 ) );
45
+
46
+ return hsl( hslColor ).sub( f );
47
+
48
+ } ).setLayout( {
49
+ name: 'isolayersRaw',
50
+ type: 'vec3',
51
+ inputs: [
52
+ { name: 'position', type: 'vec3' },
53
+ { name: 'scale', type: 'float' },
54
+ { name: 'layers', type: 'int' },
55
+ { name: 'edge', type: 'float' },
56
+ { name: 'darkness', type: 'float' },
57
+ { name: 'color', type: 'vec3' },
58
+ { name: 'background', type: 'vec3' },
59
+ { name: 'seed', type: 'float' },
60
+ ] }
61
+ );
62
+
63
+
64
+
65
+ function isolayers( params={} ) {
66
+
67
+ var { position, scale, layers, edge, darkness, color, background, seed } = { ...defaults, ...params };
68
+
69
+ return isolayersRaw( position, scale, layers, edge, darkness, color, background, seed );
70
+
71
+ }
72
+
46
73
 
47
- return hsl( hslColor.x, hslColor.y, hslColor.z ).sub( f );
48
74
 
49
- }, defaults );
75
+ isolayers.defaults = defaults;
50
76
 
51
77
 
52
78
 
package/src/isolines.js CHANGED
@@ -4,14 +4,15 @@
4
4
 
5
5
 
6
6
  import { Color } from "three";
7
- import { add, exp, mix, oneMinus, positionGeometry, sin, smoothstep, sub } from 'three/tsl';
8
- import { noise, prepare, TSLFn } from './tsl-utils.js';
7
+ import { add, exp, Fn, mix, oneMinus, positionGeometry, sin, smoothstep, sub } from 'three/tsl';
8
+ import { noise } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Isolines',
14
14
 
15
+ position: positionGeometry,
15
16
  scale: 2,
16
17
  density: 40,
17
18
  blur: 0.3,
@@ -25,21 +26,46 @@ var defaults = {
25
26
 
26
27
 
27
28
 
28
- var isolines = TSLFn( ( params )=>{
29
+ var isolinesRaw = Fn( ([ position, scale, density, blur, thinness, color, background, seed ])=>{
29
30
 
30
- params = prepare( params, defaults );
31
+ var pos = position.mul( exp( scale ) ).add( seed ).toVar( );
31
32
 
32
- var pos = positionGeometry.mul( exp( params.scale ) ).add( params.seed ).toVar( );
33
-
34
- var k = noise( pos ).mul( params.density );
33
+ var k = noise( pos, density );
35
34
 
36
35
  k = oneMinus( sin( k ) ).div( 2 );
37
36
 
38
- k = smoothstep( sub( params.thinness, params.blur ), add( params.thinness, params.blur ), k );
37
+ k = smoothstep( sub( thinness, blur ), add( thinness, blur ), k );
38
+
39
+ return mix( color, background, k );
40
+
41
+ } ).setLayout( {
42
+ name: 'isolinesRaw',
43
+ type: 'vec3',
44
+ inputs: [
45
+ { name: 'position', type: 'vec3' },
46
+ { name: 'scale', type: 'float' },
47
+ { name: 'density', type: 'float' },
48
+ { name: 'blur', type: 'float' },
49
+ { name: 'thinness', type: 'float' },
50
+ { name: 'color', type: 'vec3' },
51
+ { name: 'background', type: 'vec3' },
52
+ { name: 'seed', type: 'float' },
53
+ ] }
54
+ );
55
+
56
+
57
+
58
+ function isolines( params={} ) {
59
+
60
+ var { position, scale, density, blur, thinness, color, background, seed } = { ...defaults, ...params };
61
+
62
+ return isolinesRaw( position, scale, density, blur, thinness, color, background, seed );
63
+
64
+ }
65
+
39
66
 
40
- return mix( params.color, params.background, k );
41
67
 
42
- }, defaults );
68
+ isolines.defaults = defaults;
43
69
 
44
70
 
45
71
 
package/src/karst-rock.js CHANGED
@@ -4,14 +4,15 @@
4
4
 
5
5
 
6
6
  import { Color } from "three";
7
- import { exp, mix, 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 } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Karst rock',
14
14
 
15
+ position: positionGeometry,
15
16
  scale: 2,
16
17
 
17
18
  color: new Color( 0xFFF4F0 ),
@@ -22,11 +23,9 @@ var defaults = {
22
23
 
23
24
 
24
25
 
25
- var karstRock = TSLFn( ( params )=>{
26
+ var karstRockRaw = Fn( ([ position, scale, color, background, seed ])=>{
26
27
 
27
- params = prepare( params, defaults );
28
-
29
- var pos = positionGeometry.mul( exp( params.scale ) ).add( params.seed.sin().mul( 5 ) ).toVar( );
28
+ var pos = position.mul( exp( scale ) ).add( seed.sin().mul( 5 ) ).toVar( );
30
29
 
31
30
  var pos2 = pos.add( noise( pos.mul( 2 ) ) ).toVar();
32
31
 
@@ -35,9 +34,33 @@ var karstRock = TSLFn( ( params )=>{
35
34
  k.addAssign( noise( pos.mul( 100 ) ).div( 3 ) );
36
35
  k.addAssign( noise( pos.mul( 2 ) ).div( 2 ) );
37
36
 
38
- return mix( params.background, params.color, k ).mul( k.pow( 0.1 ) );
37
+ return mix( background, color, k ).mul( k.pow( 0.1 ) );
38
+
39
+ } ).setLayout( {
40
+ name: 'karstRockRaw',
41
+ type: 'vec3',
42
+ inputs: [
43
+ { name: 'position', type: 'vec3' },
44
+ { name: 'scale', type: 'float' },
45
+ { name: 'color', type: 'vec3' },
46
+ { name: 'background', type: 'vec3' },
47
+ { name: 'seed', type: 'float' },
48
+ ] }
49
+ );
50
+
51
+
52
+
53
+ function karstRock( params={} ) {
54
+
55
+ var { position, scale, color, background, seed } = { ...defaults, ...params };
56
+
57
+ return karstRockRaw( position, scale, color, background, seed );
58
+
59
+ }
60
+
61
+
39
62
 
40
- }, defaults );
63
+ karstRock.defaults = defaults;
41
64
 
42
65
 
43
66
 
package/src/marble.js CHANGED
@@ -4,14 +4,15 @@
4
4
 
5
5
 
6
6
  import { Color } from "three";
7
- import { add, div, exp, If, mix, mul, oneMinus, positionGeometry, pow } from 'three/tsl';
8
- import { noise, prepare, TSLFn } from './tsl-utils.js';
7
+ import { add, div, exp, Fn, If, mix, mul, oneMinus, positionGeometry, pow } from 'three/tsl';
8
+ import { noise } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Marble',
14
14
 
15
+ position: positionGeometry,
15
16
  scale: 1.2,
16
17
  thinness: 5,
17
18
  noise: 0.3,
@@ -24,11 +25,9 @@ var defaults = {
24
25
 
25
26
 
26
27
 
27
- var marble = TSLFn( ( params ) => {
28
+ var marbleRaw = Fn( ([ position, scale, thinness, xnoise, color, background, seed ]) => {
28
29
 
29
- params = prepare( params, defaults );
30
-
31
- var pos = positionGeometry.mul( exp( params.scale ) ).add( params.seed ).toVar( );
30
+ var pos = position.mul( exp( scale ) ).add( seed ).toVar( );
32
31
 
33
32
  var k = add(
34
33
  noise( pos ),
@@ -38,8 +37,8 @@ var marble = TSLFn( ( params ) => {
38
37
 
39
38
  var k = oneMinus( k.abs().pow( 2.5 ) ).toVar();
40
39
 
41
- var maxSmooth = oneMinus( pow( 0.5, params.thinness.add( 7 ) ) ).toVar(),
42
- minSmooth = oneMinus( pow( 0.5, params.thinness.add( 7 ).mul( 0.5 ) ) ).toVar();
40
+ var maxSmooth = oneMinus( pow( 0.5, thinness.add( 7 ) ) ).toVar(),
41
+ minSmooth = oneMinus( pow( 0.5, thinness.add( 7 ).mul( 0.5 ) ) ).toVar();
43
42
 
44
43
  If( k.greaterThan( maxSmooth ), ()=>{
45
44
 
@@ -60,11 +59,37 @@ var marble = TSLFn( ( params ) => {
60
59
 
61
60
  } );
62
61
 
63
- k.assign( k.add( mul( params.noise, noise( pos.mul( 150 ) ).abs().pow3() ) ) );
62
+ k.assign( k.add( mul( xnoise, noise( pos.mul( 150 ) ).abs().pow3() ) ) );
63
+
64
+ return mix( background, color, k );
65
+
66
+ } ).setLayout( {
67
+ name: 'marbleRaw',
68
+ type: 'vec3',
69
+ inputs: [
70
+ { name: 'position', type: 'vec3' },
71
+ { name: 'scale', type: 'float' },
72
+ { name: 'thinness', type: 'float' },
73
+ { name: 'xnoise', type: 'float' },
74
+ { name: 'color', type: 'vec3' },
75
+ { name: 'background', type: 'vec3' },
76
+ { name: 'seed', type: 'float' },
77
+ ] }
78
+ );
79
+
80
+
81
+
82
+ function marble( params={} ) {
83
+
84
+ var { position, scale, thinness, noise, color, background, seed } = { ...defaults, ...params };
85
+
86
+ return marbleRaw( position, scale, thinness, noise, color, background, seed );
87
+
88
+ }
89
+
64
90
 
65
- return mix( params.background, params.color, k );
66
91
 
67
- }, defaults );
92
+ marble.defaults = defaults;
68
93
 
69
94
 
70
95
 
package/src/melter.js CHANGED
@@ -11,7 +11,6 @@ import { matTrans, noise, prepare } from './tsl-utils.js';
11
11
 
12
12
  var surfacePos = Fn( ([ pos, params ])=>{
13
13
 
14
- //var zone = selectPlanar( pos, params.selectorAngles, params.selectorCenter, params.selectorWidth );
15
14
  var zone = float( 1 ).toVar();
16
15
  var n = noise( pos.mul( 2 ) ).add( 1 ).div( 2 ); // noise factor
17
16
  var k = params.distance.normalize().dot( normalLocal.normalize() ).max( 0 ).pow( 10 );
@@ -4,15 +4,17 @@
4
4
 
5
5
 
6
6
  import { Color } from "three";
7
- import { abs, exp, oneMinus, positionGeometry, select, sqrt, vec3 } from 'three/tsl';
8
- import { hsl, noise, prepare, toHsl, TSLFn } from './tsl-utils.js';
7
+ import { abs, exp, Fn, oneMinus, positionGeometry, select, sqrt, vec3 } from 'three/tsl';
8
+ import { hsl, noise, toHsl } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Neon Lights',
14
14
 
15
- scale: 1.5,
15
+ position: positionGeometry,
16
+
17
+ scale: 2,
16
18
  thinness: 0.8,
17
19
  mode: 0, // 0=additive, 1=subtractive
18
20
 
@@ -26,53 +28,79 @@ var defaults = {
26
28
 
27
29
 
28
30
 
29
- var neonLights = TSLFn( ( params ) => {
30
-
31
- params = prepare( params, defaults );
31
+ var neonLightsRaw = Fn( ([ position, scale, thinness, mode, colorA, colorB, colorC, background, seed ]) => {
32
32
 
33
- var pos = positionGeometry;//.mul( exp( params.scale ) ).add( params.seed ).toVar( );
33
+ var pos = position;
34
34
 
35
- var scale = exp( params.scale.remap( 0, 4, 2, -2 ) ).toVar();
36
- var thinness = exp( params.thinness.remap( 0, 1, 1.5, 0 ) ).toVar();
35
+ var xscale = exp( scale.remap( 0, 4, -2, 2 ) ).toVar();
36
+ var xthinness = exp( thinness.remap( 0, 1, 1.5, 0 ) ).toVar();
37
37
 
38
- var color = params.background.toVar();
38
+ var color = background.toVar();
39
39
  var neon = vec3( 0 ).toVar();
40
40
 
41
41
  var x = noise( pos.xyz ).toVar();
42
42
  var y = noise( pos.yzx ).toVar();
43
43
  var z = noise( pos.zxy ).toVar();
44
44
 
45
- var k = noise( vec3( x, y, z ).mul( scale ).add( params.seed ) ).toVar();
45
+ var k = noise( vec3( x, y, z ).mul( xscale ).add( seed ) ).toVar();
46
46
  k.assign( oneMinus( sqrt( abs( k ) ) ).pow( 3 ) );
47
47
 
48
- neon.assign( params.colorA );
48
+ neon.assign( colorA );
49
49
  var HSL = toHsl( neon );
50
- neon.assign( hsl( HSL.x, HSL.y, HSL.z.mul( k ) ) );
50
+ neon.assign( hsl( vec3( HSL.xy, HSL.z.mul( k ) ) ) );
51
51
 
52
- color.addAssign( select( params.mode.equal( 0 ), neon, neon.negate() ).mul( thinness ) );
52
+ color.addAssign( select( mode.equal( 0 ), neon, neon.negate() ).mul( xthinness ) );
53
53
 
54
- k.assign( noise( vec3( y, z, x ).mul( scale ).sub( params.seed ) ) );
54
+ k.assign( noise( vec3( y, z, x ).mul( xscale ).sub( seed ) ) );
55
55
  k.assign( oneMinus( sqrt( abs( k ) ) ).pow( 3 ) );
56
56
 
57
- neon.assign( params.colorB );
57
+ neon.assign( colorB );
58
58
  var HSL = toHsl( neon );
59
- neon.assign( hsl( HSL.x, HSL.y, HSL.z.mul( k ) ) );
59
+ neon.assign( hsl( vec3( HSL.xy, HSL.z.mul( k ) ) ) );
60
60
 
61
- color.addAssign( select( params.mode.equal( 0 ), neon, neon.negate() ).mul( thinness ) );
61
+ color.addAssign( select( mode.equal( 0 ), neon, neon.negate() ).mul( xthinness ) );
62
62
 
63
63
 
64
- k.assign( noise( vec3( z, x, y.negate() ).mul( scale ).add( params.seed ) ) );
64
+ k.assign( noise( vec3( z, x, y.negate() ).mul( xscale ).add( seed ) ) );
65
65
  k.assign( oneMinus( sqrt( abs( k ) ) ).pow( 3 ) );
66
66
 
67
- neon.assign( params.colorC );
67
+ neon.assign( colorC );
68
68
  var HSL = toHsl( neon );
69
- neon.assign( hsl( HSL.x, HSL.y, HSL.z.mul( k ) ) );
69
+ neon.assign( hsl( vec3( HSL.xy, HSL.z.mul( k ) ) ) );
70
70
 
71
- color.addAssign( select( params.mode.equal( 0 ), neon, neon.negate() ).mul( thinness ) );
71
+ color.addAssign( select( mode.equal( 0 ), neon, neon.negate() ).mul( xthinness ) );
72
72
 
73
73
  return color;
74
74
 
75
- }, defaults );
75
+ } ).setLayout( {
76
+ name: 'neonLightsRaw',
77
+ type: 'vec3',
78
+ inputs: [
79
+ { name: 'position', type: 'vec3' },
80
+ { name: 'scale', type: 'float' },
81
+ { name: 'thinness', type: 'float' },
82
+ { name: 'node', type: 'float' },
83
+ { name: 'colorA', type: 'vec3' },
84
+ { name: 'colorB', type: 'vec3' },
85
+ { name: 'colorC', type: 'vec3' },
86
+ { name: 'background', type: 'vec3' },
87
+ { name: 'seed', type: 'float' },
88
+ ] }
89
+ );
90
+
91
+
92
+
93
+ function neonLights( params={} ) {
94
+
95
+ var { position, scale, thinness, mode, colorA, colorB, colorC, background, seed } = { ...defaults, ...params };
96
+
97
+ return neonLightsRaw( position, scale, thinness, mode, colorA, colorB, colorC, background, seed );
98
+
99
+ }
100
+
101
+
102
+
103
+ neonLights.defaults = defaults;
76
104
 
77
105
 
78
106