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/caustics.js CHANGED
@@ -1,19 +1,21 @@
1
1
  
2
- // TSL-Textures: Voronoi Cells
2
+ // TSL-Textures: Caustics
3
3
 
4
4
 
5
5
 
6
6
  import { Color } from 'three';
7
- import { exp, mx_worley_noise_float, mx_worley_noise_vec3, positionGeometry, time, vec3 } from 'three/tsl';
8
- import { prepare, TSLFn } from './tsl-utils.js';
7
+ import { exp, Fn, positionGeometry, time, vec3 } from 'three/tsl';
8
+ import { voronoi, voronoi3 } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Caustics',
14
14
 
15
+ position: positionGeometry,
15
16
  scale: 2,
16
17
  speed: 0,
18
+ time: time,
17
19
 
18
20
  color: new Color( 0x50A8C0 ),
19
21
 
@@ -22,28 +24,51 @@ var defaults = {
22
24
 
23
25
 
24
26
 
25
- var caustics = TSLFn( ( params )=>{
27
+ var causticsRaw = Fn( ([ position, scale, speed, time, color, seed ])=>{
26
28
 
27
- params = prepare( params, defaults );
29
+ var pos = position.mul( exp( scale.sub( 1 ) ) ).add( seed ).toVar( );
28
30
 
29
- var pos = positionGeometry.mul( exp( params.scale.sub( 1 ) ) ).add( params.seed ).toVar( );
30
-
31
- var t = time.mul( params.speed.sub( 1 ).exp() )
31
+ var t = time.mul( speed.sub( 1 ).exp() )
32
32
  .add( vec3( 0, 2*Math.PI/3, 4*Math.PI/3 ) )
33
33
  .sin();
34
34
 
35
- var p = mx_worley_noise_vec3(
35
+ var p = voronoi3(
36
36
  pos.add( vec3(
37
- mx_worley_noise_float( pos.add( t.xyz ) ),
38
- mx_worley_noise_float( pos.add( t.yzx ) ),
39
- mx_worley_noise_float( pos.add( t.zxy ) ),
37
+ voronoi( pos.add( t.xyz ) ),
38
+ voronoi( pos.add( t.yzx ) ),
39
+ voronoi( pos.add( t.zxy ) ),
40
40
  ) ) );
41
41
 
42
42
  var k = p.length().div( Math.sqrt( 3 ) );
43
43
 
44
- return k.add( params.color.sub( 0.5 ).mul( 2 ) );
44
+ return k.add( color.sub( 0.5 ).mul( 2 ) );
45
+
46
+ } ).setLayout( {
47
+ name: 'causticsRaw',
48
+ type: 'vec3',
49
+ inputs: [
50
+ { name: 'position', type: 'vec3' },
51
+ { name: 'scale', type: 'float' },
52
+ { name: 'speed', type: 'float' },
53
+ { name: 'time', type: 'float' },
54
+ { name: 'color', type: 'vec3' },
55
+ { name: 'seed', type: 'float' },
56
+ ] }
57
+ );
58
+
59
+
60
+
61
+ function caustics( params={} ) {
62
+
63
+ var { position, scale, speed, time, color, seed } = { ...defaults, ...params };
64
+
65
+ return causticsRaw( position, scale, speed, time, color, seed );
66
+
67
+ }
68
+
69
+
45
70
 
46
- }, defaults );
71
+ caustics.defaults = defaults;
47
72
 
48
73
 
49
74
 
package/src/cave-art.js CHANGED
@@ -4,15 +4,17 @@
4
4
 
5
5
 
6
6
  import { Color } from "three";
7
- import { abs, add, exp, float, If, mix, or, positionGeometry, pow2, sub } from 'three/tsl';
8
- import { noise, prepare, TSLFn } from './tsl-utils.js';
7
+ import { float, Fn, If, mix, or, positionGeometry } from 'three/tsl';
8
+ import { noise } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Cave art',
14
14
 
15
+ position: positionGeometry,
15
16
  scale: 2,
17
+
16
18
  thinness: 2,
17
19
  noise: 0.3,
18
20
 
@@ -24,17 +26,15 @@ var defaults = {
24
26
 
25
27
 
26
28
 
27
- var caveArt = TSLFn( ( params ) => {
28
-
29
- params = prepare( params, defaults );
29
+ var caveArtRaw = Fn( ([ position, scale, thinness, xnoise, color, background, seed ]) => {
30
30
 
31
- var pos = positionGeometry.mul( exp( params.scale ) ).add( params.seed ).toVar( );
31
+ var pos = position.mul( scale.exp( ) ).add( seed ).toVar( 'pos' );
32
32
 
33
- var k1 = noise( pos, 4 ).sin().toVar();
34
- var k2 = noise( pos.mul( 1.5 ), 4 ).cos().toVar();
33
+ thinness = float( 3 ).sub( thinness ).exp( );
35
34
 
36
- var thinness = exp( sub( float( 3 ), params.thinness ) );
37
- var k = sub( thinness, pow2( abs( add( k1, k2 ) ) ).mul( 20 ) ).toVar();
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
38
 
39
39
  If( or( k1.greaterThan( k2 ), k.lessThan( 0 ) ), ()=>{
40
40
 
@@ -44,13 +44,39 @@ var caveArt = TSLFn( ( params ) => {
44
44
 
45
45
  If( k.lessThanEqual( 0 ), ()=>{
46
46
 
47
- k.assign( params.noise.mul( pow2( noise( pos.mul( 30 ) ) ) ) );
47
+ k.assign( xnoise.mul( noise( pos.mul( 30 ) ).pow2( ) ) );
48
48
 
49
49
  } );
50
50
 
51
- return mix( params.background, params.color, k );
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
+
52
78
 
53
- }, defaults );
79
+ caveArt.defaults = defaults;
54
80
 
55
81
 
56
82
 
@@ -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: 'Circle decor',
14
14
 
15
+ position: positionGeometry,
15
16
  scale: 2,
16
17
  grains: 0.2,
17
18
 
@@ -26,24 +27,49 @@ var defaults = {
26
27
 
27
28
 
28
29
 
29
- var circleDecor = TSLFn( ( params )=>{
30
+ var circleDecorRaw = Fn( ([ position, scale, grains, complexity, blur, color, background, seed ])=>{
30
31
 
31
- params = prepare( params, defaults );
32
+ var pos = position.mul( exp( scale.div( 4 ) ) ).add( seed ).toVar( 'pos' );
33
+ var subpos = pos.mul( 2 ).toVar( 'subpos' );
32
34
 
33
- var pos = positionGeometry.mul( exp( params.scale.div( 4 ) ) ).add( params.seed ).toVar( );
34
- var subpos = pos.mul( 2 ).toVar( );
35
-
36
- var k1 = mx_worley_noise_float( pos );
37
- var k2 = mx_worley_noise_float( subpos );
38
- var k3 = mx_worley_noise_float( pos.mul( params.grains.mul( 4 ).add( 2 ) ) ).mul( 2 );
35
+ var k1 = voronoi( pos );
36
+ var k2 = voronoi( subpos );
37
+ var k3 = voronoi( pos.mul( grains.mul( 4 ).add( 2 ) ) ).mul( 2 );
39
38
 
40
39
  var compScale = noise( pos ).div( 2 ).add( 1 );
41
40
 
42
- var k = k1.min( k2, k3 ).clamp( 0, 1 ).mul( params.complexity.add( 2 ).exp(), compScale, Math.PI ).sin().smoothstep( params.blur.negate(), params.blur );
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
+
43
70
 
44
- return mix( params.color, params.background, k.oneMinus() );
45
71
 
46
- }, defaults );
72
+ circleDecor.defaults = defaults;
47
73
 
48
74
 
49
75
 
package/src/circles.js CHANGED
@@ -4,39 +4,35 @@
4
4
 
5
5
 
6
6
  import { Color } from "three";
7
- import { acos, clamp, exp, float, positionGeometry, select, sin } from 'three/tsl';
8
- import { hsl, prepare, toHsl, TSLFn } from './tsl-utils.js';
7
+ import { acos, clamp, exp, Fn, positionGeometry, select, sin, vec3 } from 'three/tsl';
8
+ import { hsl, toHsl } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Circles',
14
14
 
15
+ position: positionGeometry,
16
+
15
17
  scale: 2,
16
18
  variety: 1,
17
19
 
18
20
  color: new Color( 0xF0E0D0 ),
19
21
 
20
- flat: 0,
21
-
22
22
  seed: 0,
23
23
  };
24
24
 
25
25
 
26
26
 
27
- var circles = TSLFn( ( params ) => {
27
+ var circlesRaw = Fn( ([ position, scale, variety, color, seed ]) => {
28
28
 
29
- params = prepare( params, defaults );
30
-
31
- var pos = select( params.flat, positionGeometry, positionGeometry.normalize() );
29
+ var pos = position.toVar();
32
30
 
33
31
  var angle = acos( clamp( pos.y, -1, 1 ) ).mul( 20 );
34
32
 
35
- var scale = exp( params.scale.sub( 1 ) );
36
-
37
- var x = angle.div( 3000 ).mul( scale );
33
+ var x = angle.div( 3000 ).mul( exp( scale.sub( 1 ) ) );
38
34
 
39
- var k = float( params.seed.sin().mul( 100 ) ).toVar();
35
+ var k = seed.sin().mul( 100 ).toVar();
40
36
 
41
37
  for ( var n=0; n<=10; n++ ) {
42
38
 
@@ -46,17 +42,41 @@ var circles = TSLFn( ( params ) => {
46
42
 
47
43
  k.assign( k.div( 200 ).clamp( -2, 2 ) );
48
44
 
49
- var HSL = toHsl( params.color );
45
+ var HSL = toHsl( color );
50
46
 
51
- var hue = HSL.x.add( k.mul( params.variety ) ).mod( 1 ).mul( 10 );
47
+ var hue = HSL.x.add( k.mul( variety ) ).mod( 1 ).mul( 10 );
52
48
 
53
49
  var huei = hue.floor();
54
50
  var huef = hue.sub( huei );
55
51
  huef = select( huef.lessThan( 0.5 ), huef.pow( 1.5 ), huef.pow( 1/1.5 ) );
56
52
 
57
- return hsl( huei.add( huef ).div( 10 ), HSL.y, HSL.z );
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
+
58
78
 
59
- }, defaults );
79
+ circles.defaults = defaults;
60
80
 
61
81
 
62
82
 
package/src/clouds.js CHANGED
@@ -4,14 +4,15 @@
4
4
 
5
5
 
6
6
  import { Color } from "three";
7
- import { add, clamp, exp, Fn, mix, mul, positionGeometry, vec4 } from 'three/tsl';
8
- import { noised, prepare, TSLFn } from './tsl-utils.js';
7
+ import { clamp, exp, Fn, mix, mul, positionGeometry } from 'three/tsl';
8
+ import { fractal } from './tsl-utils.js';
9
9
 
10
10
 
11
11
 
12
12
  var defaults = {
13
13
  $name: 'Clouds',
14
14
 
15
+ position: positionGeometry,
15
16
  scale: 2,
16
17
  density: 0.5,
17
18
  opacity: 1,
@@ -24,49 +25,89 @@ var defaults = {
24
25
 
25
26
 
26
27
 
27
- var _clouds = Fn( ( params ) => {
28
+ var cloud_core = Fn( ([ position, scale, density, seed ]) => {
28
29
 
29
- const pos = positionGeometry;
30
- const scale = exp( params.scale.div( 1.5 ).sub( 0.5 ) );
30
+ const pos = position.mul( exp( scale.div( 1.5 ).sub( 0.5 ) ) ).add( seed ).toVar( 'pos' );
31
31
 
32
- // color blending
33
- const k = add(
34
- noised( pos, scale, 1, params.seed ),
35
- noised( pos, scale, 2, params.seed ).mul( 0.80 ),
36
- noised( pos, scale, 6, params.seed ).mul( 0.10 ),
37
- noised( pos, scale, 8, params.seed ).mul( 0.07, params.opacity ),
38
- params.density.remap( 0, 1, -0.5, 1.5 )
39
- );
32
+ return fractal( pos, 4 ).add( density.remap( 0, 1, -0.5, 1.5 ) );
40
33
 
41
- // opacity
42
- const a = clamp( 0, 1, mul( k, 2 ).pow( 1.5 ).sub( 1 ).mul( params.opacity ) );
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
+ );
43
44
 
44
- // final color+opacity
45
- return vec4( mix( params.subcolor, params.color, k.clamp( 0, 1 ) ), a );
46
45
 
47
- } );
48
46
 
47
+ var cloudsRaw = Fn( ([ position, scale, density, /*opacity,*/color, subcolor, seed ]) => {
49
48
 
49
+ var k = cloud_core( position, scale, density, seed );
50
+ return mix( subcolor, color, k.clamp( 0, 1 ) );
50
51
 
51
- var clouds = TSLFn( ( params ) => {
52
52
 
53
- // prepare parameters
54
- params = prepare( params, defaults );
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
+ );
55
66
 
56
- return _clouds( params ).rgb;
57
67
 
58
- }, defaults );
59
68
 
69
+ var cloudsOpacityRaw = Fn( ([ position, scale, density, opacity, /*color,subcolor,*/seed ]) => {
60
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 ) );
61
73
 
62
- clouds.opacity = TSLFn( ( params ) => {
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
+ );
63
87
 
64
- // prepare parameters
65
- params = prepare( params, defaults );
66
88
 
67
- return _clouds( params ).a;
68
89
 
69
- }, defaults );
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;
70
111
 
71
112
 
72
113
 
package/src/concrete.js CHANGED
@@ -3,8 +3,8 @@
3
3
 
4
4
 
5
5
 
6
- import { abs, cos, cross, exp, Fn, normalLocal, positionGeometry, pow, remap, sin, sub, tangentLocal, transformNormalToView, vec3 } from 'three/tsl';
7
- import { noise, prepare, TSLFn } from './tsl-utils.js';
6
+ import { 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: 'Concrete',
13
13
  $normalNode: true,
14
14
 
15
+ position: positionGeometry,
16
+
15
17
  scale: 2,
16
18
  density: 0.5,
17
19
  bump: 0.5,
@@ -21,40 +23,72 @@ var defaults = {
21
23
 
22
24
 
23
25
 
24
- var surfacePos = Fn( ([ pos, normal, bump, density, seed ]) => {
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' );
25
56
 
26
- var k = noise( pos.add( seed ) ).mul( 0.5 ).add( 0.5 );
27
- k = bump.mul( pow( abs( k ), density ) );
57
+ xnormal.mulAssign( bump );
28
58
 
29
- return pos.add( k.mul( normal ) );
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' );
30
62
 
31
- } );
63
+ return approximateNormal( pos, posU, posV );
32
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
+ );
33
78
 
34
- var concrete = TSLFn( ( params ) => {
35
79
 
36
- params = prepare( params, defaults );
37
80
 
38
- var eps = 0.001;
81
+ function concrete( params={} ) {
39
82
 
40
- var position = positionGeometry.mul( exp( params.scale.div( 2 ).add( 2 ) ) ).toVar( ),
41
- normal = normalLocal.normalize().toVar(),
42
- tangent = tangentLocal.normalize().mul( eps ).toVar(),
43
- bitangent = cross( normal, tangent ).normalize().mul( eps ).toVar();
83
+ var { position, scale, density, bump, seed } = { ...defaults, ...params };
44
84
 
45
- var density = remap( params.density, 0, 1, 10, 0.5 ).toVar();
46
- var seed = vec3( sin( params.seed ).mul( 100 ), cos( params.seed.div( 2 ) ).mul( 100 ), sin( params.seed.div( 3 ) ).mul( 100 ) ).toVar();
85
+ return concreteRaw( position, normalLocal, tangentLocal, scale, density, bump, seed );
47
86
 
48
- var pos = surfacePos( position, normal, params.bump, density, seed );
49
- var posU = surfacePos( position.add( tangent ), normal, params.bump, density, seed );
50
- var posV = surfacePos( position.add( bitangent ), normal, params.bump, density, seed );
87
+ }
51
88
 
52
- var dU = sub( posU, pos ),
53
- dV = sub( posV, pos );
54
89
 
55
- return transformNormalToView( cross( dU, dV ).normalize() );
56
90
 
57
- }, defaults );
91
+ concrete.defaults = defaults;
58
92
 
59
93
 
60
94