@dailies-studio/tsl-textures 3.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +142 -0
  3. package/dist/cjs/tsl-textures.cjs +4749 -0
  4. package/dist/cjs/tsl-textures.min.cjs +2 -0
  5. package/dist/tsl-textures.js +4659 -0
  6. package/dist/tsl-textures.min.js +2 -0
  7. package/package.json +36 -0
  8. package/src/brain.js +116 -0
  9. package/src/bricks.js +116 -0
  10. package/src/camouflage.js +85 -0
  11. package/src/caustics.js +75 -0
  12. package/src/cave-art.js +83 -0
  13. package/src/circle-decor.js +76 -0
  14. package/src/circles.js +83 -0
  15. package/src/clouds.js +114 -0
  16. package/src/concrete.js +95 -0
  17. package/src/cork.js +104 -0
  18. package/src/crumpled-fabric.js +81 -0
  19. package/src/dalmatian-spots.js +80 -0
  20. package/src/darth-maul.js +84 -0
  21. package/src/dyson-sphere.js +144 -0
  22. package/src/entangled.js +75 -0
  23. package/src/fordite.js +69 -0
  24. package/src/gas-giant.js +94 -0
  25. package/src/grid.js +84 -0
  26. package/src/halftone.js +252 -0
  27. package/src/isolayers.js +79 -0
  28. package/src/isolines.js +72 -0
  29. package/src/karst-rock.js +67 -0
  30. package/src/marble.js +96 -0
  31. package/src/melter.js +76 -0
  32. package/src/neon-lights.js +107 -0
  33. package/src/perlin-noise.js +66 -0
  34. package/src/photosphere.js +73 -0
  35. package/src/planet.js +168 -0
  36. package/src/polka-dots.js +106 -0
  37. package/src/processed-wood.js +80 -0
  38. package/src/protozoa.js +110 -0
  39. package/src/reticular-veins.js +72 -0
  40. package/src/roman-paving.js +58 -0
  41. package/src/rotator.js +120 -0
  42. package/src/rough-clay.js +90 -0
  43. package/src/runny-eggs.js +180 -0
  44. package/src/rust.js +144 -0
  45. package/src/satin.js +69 -0
  46. package/src/scaler.js +111 -0
  47. package/src/scepter-head.js +94 -0
  48. package/src/scream.js +72 -0
  49. package/src/stars.js +72 -0
  50. package/src/static-noise.js +73 -0
  51. package/src/supersphere.js +108 -0
  52. package/src/tiger-fur.js +77 -0
  53. package/src/translator.js +116 -0
  54. package/src/tsl-textures.js +63 -0
  55. package/src/tsl-utils.js +344 -0
  56. package/src/turbulent-smoke.js +73 -0
  57. package/src/voronoi-cells.js +99 -0
  58. package/src/water-drops.js +96 -0
  59. package/src/watermelon.js +87 -0
  60. package/src/waves.js +150 -0
  61. package/src/wood.js +99 -0
  62. package/src/zebra-lines.js +77 -0
@@ -0,0 +1,4659 @@
1
+ // TSL Textures v3.0.4
2
+
3
+ import { Fn, vec3, sub, transformNormalToView, cross, remap, pow, mul, log2, min, max, float, add, If, select, sin, cos, rotate, smoothstep, mx_fractal_noise_float, mix, mx_noise_float, time, positionGeometry, or, acos, clamp, exp, normalLocal, tangentLocal, int, Loop, oneMinus, abs, equirectUV, screenSize, exp2, div, round, remapClamp, screenUV, sqrt, mat2, mod, distance, radians, matcapUV, mx_worley_noise_float, sign, tan, floor, screenCoordinate, reciprocal, vec2, mx_worley_noise_vec2, mx_fractal_noise_vec3, mx_worley_noise_vec3, vertexColor, Discard, Switch, positionView } from 'three/tsl';
4
+ export { mx_fractal_noise_float as fractal, mx_fractal_noise_vec3 as fractal3, mx_noise_float as noise, mx_noise_vec3 as noise3, mx_worley_noise_float as voronoi, mx_worley_noise_vec2 as voronoi2, mx_worley_noise_vec3 as voronoi3 } from 'three/tsl';
5
+ import { Color, Vector3, Vector2 } from 'three';
6
+
7
+ // simple vector noise, vec3->float[-1,1]
8
+ const vnoise = Fn( ([ v ])=>{
9
+
10
+ return v.dot( vec3( 12.9898, 78.233, -97.5123 ) ).sin().mul( 43758.5453 ).fract().mul( 2 ).sub( 1 );
11
+
12
+ } ).setLayout( {
13
+ name: 'vnoise',
14
+ type: 'float',
15
+ inputs: [
16
+ { name: 'v', type: 'vec3' },
17
+ ]
18
+ } );
19
+
20
+
21
+
22
+ // approximate normal vector given point and two neighbout points
23
+ const approximateNormal = Fn( ([ pos, posU, posV ])=>{
24
+
25
+ var dU = sub( posU, pos ),
26
+ dV = sub( posV, pos );
27
+
28
+ return transformNormalToView( cross( dU, dV ).normalize() );
29
+
30
+ } ).setLayout( {
31
+ name: 'approximateNormal',
32
+ type: 'vec3',
33
+ inputs: [
34
+ { name: 'pos', type: 'vec3' },
35
+ { name: 'posU', type: 'vec3' },
36
+ { name: 'posV', type: 'vec3' },
37
+ ]
38
+ } );
39
+
40
+
41
+
42
+
43
+ // exponential version of remap
44
+ const remapExp = Fn( ([ x, fromMin, fromMax, toMin, toMax ]) => {
45
+
46
+ x = remap( x, fromMin, fromMax, 0, 1 );
47
+ x = pow( 2, mul( x, log2( toMax.div( toMin ) ) ).add( log2( toMin ) ) );
48
+ return x;
49
+
50
+ } ).setLayout( {
51
+ name: 'remapExp',
52
+ type: 'float',
53
+ inputs: [
54
+ { name: 'x', type: 'float' },
55
+ { name: 'fromMin', type: 'float' },
56
+ { name: 'fromMax', type: 'float' },
57
+ { name: 'toMin', type: 'float' },
58
+ { name: 'toMax', type: 'float' },
59
+ ]
60
+ } );
61
+
62
+
63
+
64
+ // show notification that
65
+ var banner = null;
66
+ var bannerCounter = 10;
67
+ async function showFallbackWarning( ) {
68
+
69
+ if ( navigator.gpu != undefined ) {
70
+
71
+ var adapter = await navigator.gpu.requestAdapter();
72
+ if ( adapter ) return;
73
+
74
+ }
75
+
76
+ var html = `
77
+ <div style="font-size:1.25em; font-weight:bold;">PLEASE, WAIT</div>
78
+ <div style="font-size:0.85em; font-weight:100;" >NO WEBGPU &mdash; TRYING WEBGL2</div>
79
+ <div id="counter"></div>
80
+ `;
81
+
82
+ banner = document.createElement( 'div' );
83
+ banner.innerHTML = html;
84
+
85
+ banner.style.left = 'calc(50% - 8em)';
86
+ banner.style.width = '16em';
87
+
88
+ banner.style.fontFamily = 'Bahnschrifts, Arial';
89
+ banner.style.position = 'absolute';
90
+ banner.style.bottom = '20px';
91
+ banner.style.padding = '12px 6px';
92
+ banner.style.border = '1px solid white';
93
+ banner.style.borderRadius = '4px';
94
+ banner.style.background = 'rgba(0,0,0,0.5)';
95
+ banner.style.color = 'white';
96
+ banner.style.textAlign = 'center';
97
+ banner.style.opacity = '0.8';
98
+ banner.style.outline = 'none';
99
+ banner.style.zIndex = '999';
100
+
101
+ document.body.appendChild( banner );
102
+
103
+ }
104
+
105
+
106
+
107
+ function hideFallbackWarning( ) {
108
+
109
+ if ( banner ) {
110
+
111
+ if ( bannerCounter>0 )
112
+ bannerCounter--;
113
+ else {
114
+
115
+ banner.style.display = 'none';
116
+ banner = null;
117
+
118
+ }
119
+
120
+ }
121
+
122
+ }
123
+
124
+
125
+
126
+ // helper function - convert hsl to rgb, ported to TSL from:
127
+ // https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_RGB_alternative
128
+
129
+ const hslHelper = Fn( ([ h, s, l, n ])=>{
130
+
131
+ var k = n.add( h.mul( 12 ) ).mod( 12 );
132
+ var a = s.mul( min( l, sub( 1, l ) ) );
133
+ return l.sub( a.mul( max( -1, min( min( k.sub( 3 ), sub( 9, k ) ), 1 ) ) ) );
134
+
135
+ } ).setLayout( {
136
+ name: 'hslHelper',
137
+ type: 'float',
138
+ inputs: [
139
+ { name: 'h', type: 'float' },
140
+ { name: 's', type: 'float' },
141
+ { name: 'l', type: 'float' },
142
+ { name: 'n', type: 'float' },
143
+ ]
144
+ } );
145
+
146
+
147
+
148
+ // convert from hsl to rgb
149
+ const hsl = Fn( ([ col ]) => {
150
+
151
+ var h = col.x.fract().add( 1 ).fract();
152
+ var s = col.y.clamp( 0, 1 );
153
+ var l = col.z.clamp( 0, 1 );
154
+
155
+ var r = hslHelper( h, s, l, 0 );
156
+ var g = hslHelper( h, s, l, 8 );
157
+ var b = hslHelper( h, s, l, 4 );
158
+
159
+ return vec3( r, g, b );
160
+
161
+ } ).setLayout( {
162
+ name: 'hsl',
163
+ type: 'vec3',
164
+ inputs: [
165
+ { name: 'col', type: 'vec3' },
166
+ ]
167
+ } );
168
+
169
+
170
+
171
+ // convert from rgb to hsl
172
+ const toHsl = Fn( ([ rgb ]) => {
173
+
174
+ var R = float( rgb.x ).toVar(),
175
+ G = float( rgb.y ).toVar(),
176
+ B = float( rgb.z ).toVar();
177
+
178
+ var mx = max( R, max( G, B ) ).toVar();
179
+ var mn = min( R, min( G, B ) ).toVar();
180
+
181
+ var H = float( 0 ).toVar(),
182
+ S = float( 0 ).toVar(),
183
+ L = add( mx, mn ).div( 2 );
184
+
185
+ If( mn.notEqual( mx ), ()=>{
186
+
187
+ const delta = sub( mx, mn ).toVar();
188
+
189
+ S.assign( select( L.lessThanEqual( 0.5 ), delta.div( add( mn, mx ) ), delta.div( sub( 2, add( mn, mx ) ) ) ) );
190
+ If( mx.equal( R ), ()=>{
191
+
192
+ H.assign( sub( G, B ).div( delta ).add( select( G.lessThanEqual( B ), 6, 0 ) ) );
193
+
194
+ } )
195
+ .ElseIf( mx.equal( G ), ()=>{
196
+
197
+ H.assign( sub( B, R ).div( delta ).add( 2 ) );
198
+
199
+ } )
200
+ .Else( ()=>{
201
+
202
+ H.assign( sub( R, G ).div( delta ).add( 4 ) );
203
+
204
+ } );
205
+ H.divAssign( 6 );
206
+
207
+ } );
208
+ return vec3( H, S, L );
209
+
210
+ } );
211
+
212
+ toHsl.setLayout( {
213
+ name: 'toHsl',
214
+ type: 'vec3',
215
+ inputs: [
216
+ { name: 'rgb', type: 'vec3' },
217
+ ]
218
+ } );
219
+
220
+
221
+
222
+ const spherical = Fn( ([ phi, theta ]) => {
223
+
224
+ return vec3(
225
+ sin( theta ).mul( sin( phi ) ),
226
+ cos( phi ),
227
+ cos( theta ).mul( sin( phi ) )
228
+ );
229
+
230
+ } ).setLayout( {
231
+ name: 'spherical',
232
+ type: 'vec3',
233
+ inputs: [
234
+ { name: 'phi', type: 'float' },
235
+ { name: 'theta', type: 'float' },
236
+ ]
237
+ } );
238
+
239
+
240
+
241
+ const rotatePivot = Fn( ([ vector, pivot, angle ])=>{
242
+
243
+ return rotate( vector.sub( pivot ), angle ).add( pivot );
244
+
245
+ } ).setLayout( {
246
+ name: 'rotatePivot',
247
+ type: 'vec3',
248
+ inputs: [
249
+ { name: 'vector', type: 'vec3' },
250
+ { name: 'pivot', type: 'vec3' },
251
+ { name: 'angle', type: 'vec3' },
252
+ ]
253
+ } );
254
+
255
+
256
+
257
+ const selectPlanar = Fn( ([ pos, selAngles, selCenter, selWidth ])=>{
258
+
259
+ // select zone in a plane through point selCenter,
260
+ // rotated according to selAngles and selWidth thick
261
+ // result is [0,1] inside plane, 0 below plane, 1 above plane
262
+
263
+ // C is projected on segment AB
264
+ // result is [0,1] inside AB, 0 before A, 1 after B
265
+
266
+ /* non-optimized version
267
+ var s = spherical(selAngles.x,selAngles.y).mul(selWidth).toVar(),
268
+ c = pos,
269
+ a = selCenter.sub(s.div(2)),
270
+ b = selCenter.add(s.div(2));
271
+
272
+ var ca = a.sub(c),
273
+ ab = b.sub(a).toVar();
274
+
275
+ var caab = ca.dot(s),
276
+ abab = ab.dot(ab);
277
+
278
+ var k = caab.div(abab).negate();
279
+ */
280
+
281
+ var s = spherical( selAngles.x, selAngles.y ).mul( selWidth ).toVar();
282
+
283
+ var k = selCenter.sub( s.div( 2 ) ).sub( pos ).dot( s ).div( s.dot( s ) ).negate();
284
+
285
+ return smoothstep( 0, 1, k );
286
+
287
+ } ).setLayout( {
288
+ name: 'selectPlanar',
289
+ type: 'float',
290
+ inputs: [
291
+ { name: 'pos', type: 'vec3' },
292
+ { name: 'selAngles', type: 'vec2' },
293
+ { name: 'selCenter', type: 'vec3' },
294
+ { name: 'selWidth', type: 'float' },
295
+ ]
296
+ } );
297
+
298
+ var defaults$P = {
299
+ $name: 'Brain',
300
+
301
+ position: positionGeometry,
302
+ scale: 2,
303
+
304
+ smooth: 0.5,
305
+ wave: 0.5,
306
+ speed: 2.5,
307
+ time: time,
308
+
309
+ color: new Color( 0xFFD0D0 ),
310
+ background: new Color( 0x500000 ),
311
+
312
+ seed: 0,
313
+ };
314
+
315
+
316
+
317
+ var brainRaw = Fn( ([ position, scale, xsmooth, /*wave, speed, time,*/ color, background, seed ])=>{
318
+
319
+ var pos = position.mul( scale.div( 3 ).exp( ) ).add( seed ).toVar( 'pos' );
320
+
321
+ var octaves = xsmooth.oneMinus().mul( 2 ).exp( ).toVar( 'octaves' );
322
+
323
+ var n = mx_fractal_noise_float( pos.mul( 5 ), octaves ).add( 1 ).div( 2 ).clamp( 0, 1 ).pow( 2 );
324
+
325
+ return mix( color, background, n );
326
+
327
+ } ).setLayout( {
328
+ name: 'brainRaw',
329
+ type: 'vec3',
330
+ inputs: [
331
+ { name: 'position', type: 'vec3' },
332
+ { name: 'scale', type: 'float' },
333
+ { name: 'xsmooth', type: 'float' },
334
+ /*{ name: 'wave', type: 'float' },*/
335
+ /*{ name: 'speed', type: 'float' },*/
336
+ /*{ name: 'time', type: 'float' },*/
337
+ { name: 'color', type: 'vec3' },
338
+ { name: 'background', type: 'vec3' },
339
+ { name: 'seed', type: 'float' },
340
+ ] }
341
+ );
342
+
343
+
344
+ var brainNormalRaw = Fn( ([ position, scale, xsmooth, wave, speed, time, /*color, background,*/ seed ])=>{
345
+
346
+ var pos = position.mul( scale.div( 3 ).exp( ) ).add( seed ).toVar( 'pos' );
347
+
348
+ var octaves = xsmooth.oneMinus().mul( 2 ).exp( ).toVar( 'octaves' );
349
+
350
+ const EPS = 0.01;
351
+
352
+ var n = mx_fractal_noise_float( pos.mul( 5 ), octaves ).toVar( 'n' ),
353
+ dx = mx_fractal_noise_float( pos.add( vec3( EPS, 0, 0 ) ).mul( 5 ), octaves ).sub( n ).div( EPS ).toVar( 'dx' ),
354
+ dy = mx_fractal_noise_float( pos.add( vec3( 0, EPS, 0 ) ).mul( 5 ), octaves ).sub( n ).div( EPS ).toVar( 'dy' );
355
+
356
+ var dTime = mx_noise_float( pos.mul( wave, 5 ) ).add( 1 ).div( 2 ).mul( 6.28 ).toVar( 'dTime' );
357
+
358
+ return vec3( dx, dy, time.mul( speed ).add( dTime ).sin().add( n, 1 ) ).normalize();
359
+
360
+ } ).setLayout( {
361
+ name: 'brainNormalRaw',
362
+ type: 'vec3',
363
+ inputs: [
364
+ { name: 'position', type: 'vec3' },
365
+ { name: 'scale', type: 'float' },
366
+ { name: 'xsmooth', type: 'float' },
367
+ { name: 'wave', type: 'float' },
368
+ { name: 'speed', type: 'float' },
369
+ { name: 'time', type: 'float' },
370
+ /*{ name: 'color', type: 'vec3' },*/
371
+ /*{ name: 'background', type: 'vec3' },*/
372
+ { name: 'seed', type: 'float' },
373
+ ] }
374
+ );
375
+
376
+
377
+
378
+ function brain( params={} ) {
379
+
380
+ var { position, scale, smooth, /*wave, speed, time,*/ color, background, seed } = { ...defaults$P, ...params };
381
+
382
+ return brainRaw( position, scale, smooth, /*wave, speed, time,*/ color, background, seed );
383
+
384
+ }
385
+
386
+
387
+
388
+ brain.normal = function ( params={} ) {
389
+
390
+ var { position, scale, smooth, wave, speed, time, /*color, background,*/ seed } = { ...defaults$P, ...params };
391
+
392
+ return brainNormalRaw( position, scale, smooth, wave, speed, time, /*color, background,*/ seed );
393
+
394
+ };
395
+
396
+
397
+
398
+ brain.defaults = defaults$P;
399
+
400
+ var defaults$O = {
401
+ $name: 'Camouflage',
402
+
403
+ position: positionGeometry,
404
+ scale: 2,
405
+
406
+ colorA: new Color( 0xc2bea8 ),
407
+ colorB: new Color( 0x9c895e ),
408
+ colorC: new Color( 0x92a375 ),
409
+ colorD: new Color( 0x717561 ),
410
+
411
+ seed: 0,
412
+ };
413
+
414
+
415
+
416
+ var camouflageRaw = Fn( ([ position, scale, colorA, colorB, colorC, colorD, seed ])=>{
417
+
418
+ var pos = position.mul( scale.exp( ) ).add( seed ).toVar( 'pos' );
419
+
420
+ var color = colorD.toVar( 'color' );
421
+
422
+ If( mx_noise_float( pos ).greaterThanEqual( 0.3 ), () => {
423
+
424
+ color.assign( colorA );
425
+
426
+ }
427
+ )
428
+ .ElseIf( mx_noise_float( pos.yzx ).greaterThanEqual( 0.2 ), () => {
429
+
430
+ color.assign( colorB );
431
+
432
+ }
433
+ )
434
+ .ElseIf( mx_noise_float( pos.zxy ).greaterThanEqual( 0.1 ), () => {
435
+
436
+ color.assign( colorC );
437
+
438
+ }
439
+ );
440
+
441
+ return color;
442
+
443
+ } ).setLayout( {
444
+ name: 'camouflageRaw',
445
+ type: 'vec3',
446
+ inputs: [
447
+ { name: 'position', type: 'vec3' },
448
+ { name: 'scale', type: 'float' },
449
+ { name: 'colorA', type: 'vec3' },
450
+ { name: 'colorB', type: 'vec3' },
451
+ { name: 'colorC', type: 'vec3' },
452
+ { name: 'colorD', type: 'vec3' },
453
+ { name: 'seed', type: 'float' },
454
+ ] }
455
+ );
456
+
457
+
458
+
459
+ function camouflage( params={} ) {
460
+
461
+ var { position, scale, colorA, colorB, colorC, colorD, seed } = { ...defaults$O, ...params };
462
+
463
+ return camouflageRaw( position, scale, colorA, colorB, colorC, colorD, seed );
464
+
465
+ }
466
+
467
+
468
+
469
+ camouflage.defaults = defaults$O;
470
+
471
+ var defaults$N = {
472
+ $name: 'Cave art',
473
+
474
+ position: positionGeometry,
475
+ scale: 2,
476
+
477
+ thinness: 2,
478
+ noise: 0.3,
479
+
480
+ color: new Color( 0xD34545 ),
481
+ background: new Color( 0xFFF8F0 ),
482
+
483
+ seed: 0,
484
+ };
485
+
486
+
487
+
488
+ var caveArtRaw = Fn( ([ position, scale, thinness, xnoise, color, background, seed ]) => {
489
+
490
+ var pos = position.mul( scale.exp( ) ).add( seed ).toVar( 'pos' );
491
+
492
+ thinness = float( 3 ).sub( thinness ).exp( );
493
+
494
+ var k1 = mx_noise_float( pos, 4 ).sin().toVar( 'k1' ),
495
+ k2 = mx_noise_float( pos.mul( 1.5 ), 4 ).cos().toVar( 'k2' ),
496
+ k = thinness.sub( k1.add( k2 ).abs( ).pow2( ).mul( 20 ) ).toVar( 'k' );
497
+
498
+ If( or( k1.greaterThan( k2 ), k.lessThan( 0 ) ), ()=>{
499
+
500
+ k.assign( 0 );
501
+
502
+ } );
503
+
504
+ If( k.lessThanEqual( 0 ), ()=>{
505
+
506
+ k.assign( xnoise.mul( mx_noise_float( pos.mul( 30 ) ).pow2( ) ) );
507
+
508
+ } );
509
+
510
+ return mix( background, color, k );
511
+
512
+ } ).setLayout( {
513
+ name: 'caveArtRaw',
514
+ type: 'vec3',
515
+ inputs: [
516
+ { name: 'position', type: 'vec3' },
517
+ { name: 'scale', type: 'float' },
518
+ { name: 'thinness', type: 'float' },
519
+ { name: 'xnoise', type: 'float' },
520
+ { name: 'color', type: 'vec3' },
521
+ { name: 'background', type: 'vec3' },
522
+ { name: 'seed', type: 'float' },
523
+ ] }
524
+ );
525
+
526
+
527
+
528
+ function caveArt( params={} ) {
529
+
530
+ var { position, scale, thinness, noise, color, background, seed } = { ...defaults$N, ...params };
531
+
532
+ return caveArtRaw( position, scale, thinness, noise, color, background, seed );
533
+
534
+ }
535
+
536
+
537
+
538
+ caveArt.defaults = defaults$N;
539
+
540
+ var defaults$M = {
541
+ $name: 'Circles',
542
+
543
+ position: positionGeometry,
544
+
545
+ scale: 2,
546
+ variety: 1,
547
+
548
+ color: new Color( 0xF0E0D0 ),
549
+
550
+ seed: 0,
551
+ };
552
+
553
+
554
+
555
+ var circlesRaw = Fn( ([ position, scale, variety, color, seed ]) => {
556
+
557
+ var pos = position.toVar();
558
+
559
+ var angle = acos( clamp( pos.y, -1, 1 ) ).mul( 20 );
560
+
561
+ var x = angle.div( 3000 ).mul( exp( scale.sub( 1 ) ) );
562
+
563
+ var k = seed.sin().mul( 100 ).toVar();
564
+
565
+ for ( var n=0; n<=10; n++ ) {
566
+
567
+ k.addAssign( sin( x.mul( 2**n ).sub( Math.PI*n/2 ) ).mul( -n*( n+1 )/2 ) );
568
+
569
+ }
570
+
571
+ k.assign( k.div( 200 ).clamp( -2, 2 ) );
572
+
573
+ var HSL = toHsl( color );
574
+
575
+ var hue = HSL.x.add( k.mul( variety ) ).mod( 1 ).mul( 10 );
576
+
577
+ var huei = hue.floor();
578
+ var huef = hue.sub( huei );
579
+ huef = select( huef.lessThan( 0.5 ), huef.pow( 1.5 ), huef.pow( 1/1.5 ) );
580
+
581
+ return hsl( vec3( huei.add( huef ).div( 10 ), HSL.yz ) );
582
+
583
+ } ).setLayout( {
584
+ name: 'circlesRaw',
585
+ type: 'vec3',
586
+ inputs: [
587
+ { name: 'position', type: 'vec3' },
588
+ { name: 'scale', type: 'float' },
589
+ { name: 'variety', type: 'float' },
590
+ { name: 'color', type: 'vec3' },
591
+ { name: 'seed', type: 'float' },
592
+ ] }
593
+ );
594
+
595
+
596
+
597
+ function circles( params={} ) {
598
+
599
+ var { position, scale, variety, color, seed } = { ...defaults$M, ...params };
600
+
601
+ return circlesRaw( position, scale, variety, color, seed );
602
+
603
+ }
604
+
605
+
606
+
607
+ circles.defaults = defaults$M;
608
+
609
+ var defaults$L = {
610
+ $name: 'Clouds',
611
+
612
+ position: positionGeometry,
613
+ scale: 2,
614
+ density: 0.5,
615
+ opacity: 1,
616
+
617
+ color: new Color( 0xFFFFFF ),
618
+ subcolor: new Color( 0xA0A0B0 ),
619
+
620
+ seed: 0,
621
+ };
622
+
623
+
624
+
625
+ var cloud_core = Fn( ([ position, scale, density, seed ]) => {
626
+
627
+ const pos = position.mul( exp( scale.div( 1.5 ).sub( 0.5 ) ) ).add( seed ).toVar( 'pos' );
628
+
629
+ return mx_fractal_noise_float( pos, 4 ).add( density.remap( 0, 1, -0.5, 1.5 ) );
630
+
631
+ } ).setLayout( {
632
+ name: 'cloud_core',
633
+ type: 'float',
634
+ inputs: [
635
+ { name: 'position', type: 'vec3' },
636
+ { name: 'scale', type: 'float' },
637
+ { name: 'density', type: 'float' },
638
+ { name: 'seed', type: 'float' },
639
+ ] }
640
+ );
641
+
642
+
643
+
644
+ var cloudsRaw = Fn( ([ position, scale, density, /*opacity,*/color, subcolor, seed ]) => {
645
+
646
+ var k = cloud_core( position, scale, density, seed );
647
+ return mix( subcolor, color, k.clamp( 0, 1 ) );
648
+
649
+
650
+ } ).setLayout( {
651
+ name: 'cloudsRaw',
652
+ type: 'vec3',
653
+ inputs: [
654
+ { name: 'position', type: 'vec3' },
655
+ { name: 'scale', type: 'float' },
656
+ { name: 'density', type: 'float' },
657
+ /*{ name: 'opacity', type: 'float' },*/
658
+ { name: 'color', type: 'vec3' },
659
+ { name: 'subcolor', type: 'vec3' },
660
+ { name: 'seed', type: 'float' },
661
+ ] }
662
+ );
663
+
664
+
665
+
666
+ var cloudsOpacityRaw = Fn( ([ position, scale, density, opacity, /*color,subcolor,*/seed ]) => {
667
+
668
+ var k = cloud_core( position, scale, density, seed );
669
+ return clamp( 0, 1, mul( k, 2 ).pow( 1.5 ).sub( 1 ).mul( opacity ) );
670
+
671
+ } ).setLayout( {
672
+ name: 'cloudsOpacityRaw',
673
+ type: 'float',
674
+ inputs: [
675
+ { name: 'position', type: 'vec3' },
676
+ { name: 'scale', type: 'float' },
677
+ { name: 'density', type: 'float' },
678
+ { name: 'opacity', type: 'float' },
679
+ /*{ name: 'color', type: 'vec3' },*/
680
+ /*{ name: 'subcolor', type: 'vec3' },*/
681
+ { name: 'seed', type: 'float' },
682
+ ] }
683
+ );
684
+
685
+
686
+
687
+ function clouds( params={} ) {
688
+
689
+ var { position, scale, density, /*opacity,*/color, subcolor, seed } = { ...defaults$L, ...params };
690
+
691
+ return cloudsRaw( position, scale, density, /*opacity,*/color, subcolor, seed );
692
+
693
+ }
694
+
695
+
696
+
697
+ clouds.opacity = function ( params={} ) {
698
+
699
+ var { position, scale, density, opacity, /*color,subcolor,*/seed } = { ...defaults$L, ...params };
700
+
701
+ return cloudsOpacityRaw( position, scale, density, opacity, /*color,subcolor,*/seed );
702
+
703
+ };
704
+
705
+
706
+
707
+ clouds.defaults = defaults$L;
708
+
709
+ var defaults$K = {
710
+ $name: 'Concrete',
711
+ $normalNode: true,
712
+
713
+ position: positionGeometry,
714
+
715
+ scale: 2,
716
+ density: 0.5,
717
+ bump: 0.5,
718
+
719
+ seed: 0,
720
+ };
721
+
722
+
723
+
724
+ var surfacePos$7 = Fn( ([ position, normal, density ]) => {
725
+
726
+ var k = mx_noise_float( position, 0.5, 0.5 ).abs().pow( density );
727
+
728
+ return position.add( normal.mul( k ) );
729
+
730
+ } ).setLayout( {
731
+ name: 'surfacePos',
732
+ type: 'vec3',
733
+ inputs: [
734
+ { name: 'position', type: 'vec3' },
735
+ { name: 'normal', type: 'vec3' },
736
+ { name: 'density', type: 'float' },
737
+ ] }
738
+ );
739
+
740
+
741
+
742
+ var concreteRaw = Fn( ([ position, normal, tangent, scale, density, bump, seed ]) => {
743
+
744
+ const EPS = 0.001;
745
+
746
+ var seed3d = vec3( 1, 2, 3 ).mul( seed ).sin().mul( 100 ).toVar( 'seed3d' );
747
+
748
+ var xposition = position.mul( exp( scale.div( 2 ).add( 2 ) ) ).add( seed3d ).toVar( 'xposition' ),
749
+ xnormal = normal.normalize().toVar( 'xnormal' ),
750
+ xtangent = tangent.normalize().mul( EPS ).toVar( 'xtangent' ),
751
+ xbitangent = cross( xnormal, xtangent ).normalize().mul( EPS ).toVar( 'xbitangent' );
752
+
753
+ var xdensity = remap( density, 0, 1, 10, 0.5 ).toVar( 'xdensity' );
754
+
755
+ xnormal.mulAssign( bump );
756
+
757
+ var pos = surfacePos$7( xposition, xnormal, xdensity ).toVar( 'pos' ),
758
+ posU = surfacePos$7( xposition.add( xtangent ), xnormal, xdensity ).toVar( 'posU' ),
759
+ posV = surfacePos$7( xposition.add( xbitangent ), xnormal, xdensity ).toVar( 'posV' );
760
+
761
+ return approximateNormal( pos, posU, posV );
762
+
763
+ } ).setLayout( {
764
+ name: 'concreteRaw',
765
+ type: 'vec3',
766
+ inputs: [
767
+ { name: 'position', type: 'vec3' },
768
+ { name: 'normal', type: 'vec3' },
769
+ { name: 'tangent', type: 'vec3' },
770
+ { name: 'scale', type: 'float' },
771
+ { name: 'density', type: 'float' },
772
+ { name: 'bump', type: 'float' },
773
+ { name: 'seed', type: 'float' },
774
+ ] }
775
+ );
776
+
777
+
778
+
779
+ function concrete( params={} ) {
780
+
781
+ var { position, scale, density, bump, seed } = { ...defaults$K, ...params };
782
+
783
+ return concreteRaw( position, normalLocal, tangentLocal, scale, density, bump, seed );
784
+
785
+ }
786
+
787
+
788
+
789
+ concrete.defaults = defaults$K;
790
+
791
+ var defaults$J = {
792
+ $name: 'Cork',
793
+
794
+ position: positionGeometry,
795
+ scale: 1,
796
+ straight: 1,
797
+ noise: 0.3,
798
+
799
+ color: new Color( 0xfff0c0 ),
800
+ background: new Color( 0xd08060 ),
801
+
802
+ seed: 0,
803
+ };
804
+
805
+
806
+
807
+ var corkRaw = Fn( ([ position, scale, straight, xnoise, color, background, seed ])=>{
808
+
809
+ var pos = position.mul( exp( scale.div( 1.5 ).add( 1 ) ) ).add( seed ).toVar( 'pos' );
810
+
811
+ var midCell = pos.round().toConst( 'midCell' );
812
+
813
+ var minCell = midCell.toVar( 'minCell' ),
814
+ minDist = float( 1 ).toVar( 'minDist' );
815
+
816
+ var cell = vec3().toVar( 'cell' ),
817
+ dist = float().toVar( 'dist' );
818
+
819
+ var strtaightness = straight.exp().reciprocal().toVar( 'strtaightness' );
820
+
821
+ var i=int( 0 ).toVar( 'i' ),
822
+ j=int( 0 ).toVar( 'j' ),
823
+ k=int( 0 ).toVar( 'k' );
824
+
825
+ // Loop uses hard-coded i, j, k as indices
826
+ Loop( 3, 3, 3, () => {
827
+
828
+ cell.assign( midCell.add( vec3( i, j, k ).sub( 1 ) ) );
829
+ var cellCenter = cell.add( vnoise( cell ) );
830
+ dist.assign( pos.distance( cellCenter ) );
831
+
832
+ dist.addAssign( mx_noise_float( pos.add( cell ), strtaightness ) );
833
+
834
+ If( dist.lessThan( minDist ), ()=>{
835
+
836
+ minDist.assign( dist );
837
+ minCell.assign( cell );
838
+
839
+ } );
840
+
841
+ } );
842
+
843
+ var n = mx_noise_float( minCell.mul( Math.PI ), 0.5, 0.5 ).toVar( 'n' );
844
+
845
+ var r = mx_noise_float( pos.mul( 12 ) ).toVar( 'r' );
846
+ r.mulAssign( r, r );
847
+ r.addAssign( mx_noise_float( pos.mul( 40 ), 1/3 ) );
848
+
849
+ var result = mix( color, background, n.add( r.mul( xnoise ) ) );
850
+
851
+ return result;
852
+
853
+ } ).setLayout( {
854
+ name: 'camouflageRaw',
855
+ type: 'vec3',
856
+ inputs: [
857
+ { name: 'position', type: 'vec3' },
858
+ { name: 'scale', type: 'float' },
859
+ { name: 'straight', type: 'float' },
860
+ { name: 'xnoise', type: 'float' },
861
+ { name: 'color', type: 'vec3' },
862
+ { name: 'background', type: 'vec3' },
863
+ { name: 'seed', type: 'float' },
864
+ ] }
865
+ );
866
+
867
+
868
+
869
+ function cork( params={} ) {
870
+
871
+ var { position, scale, straight, noise, color, background, seed } = { ...defaults$J, ...params };
872
+
873
+ return corkRaw( position, scale, straight, noise, color, background, seed );
874
+
875
+ }
876
+
877
+
878
+
879
+ cork.defaults = defaults$J;
880
+
881
+ var defaults$I = {
882
+ $name: 'Dalmatian spots',
883
+ $width: 260,
884
+
885
+ position: positionGeometry,
886
+
887
+ scale: 2,
888
+ density: 0.6,
889
+
890
+ color: new Color( 0xFFFFFF ),
891
+ background: new Color( 0x000000 ),
892
+
893
+ seed: 0,
894
+ };
895
+
896
+
897
+
898
+ var dalmatianSpotsRaw = Fn( ([ position, scale, density, color, background, seed ])=>{
899
+
900
+ var pos = position.mul( scale.exp( ) ).add( seed ).sub( 1000 ).toVar( 'pos' );
901
+
902
+ var k = float( 1 ).toVar( 'k' );
903
+
904
+ var d = float( 1.5 ).sub( density ).mul( 2 ).toVar( 'd' );
905
+ var count = density.mul( 5 ).add( 5 ).toVar( 'count' );
906
+
907
+ Loop( count, ()=> {
908
+
909
+ k.mulAssign( mx_noise_float( pos ).abs().pow( d ).mul( 100 ).sub( 50 ).clamp( 0, 1 ).oneMinus() );
910
+ pos.assign( pos.mul( 1.01 ) );
911
+ k.mulAssign( mx_noise_float( pos.yzx ).abs().pow( d ).mul( 100 ).sub( 50 ).clamp( 0, 1 ).oneMinus() );
912
+ pos.assign( pos.mul( 1.01 ) );
913
+ k.mulAssign( mx_noise_float( pos.zxy ).abs().pow( d ).mul( 100 ).sub( 50 ).clamp( 0, 1 ).oneMinus() );
914
+ pos.assign( pos.mul( 1.01 ) );
915
+
916
+ } );
917
+
918
+ return mix( background, color, k.clamp( 0, 1 ) );
919
+
920
+ } ).setLayout( {
921
+ name: 'dalmatianSpotsRaw',
922
+ type: 'vec3',
923
+ inputs: [
924
+ { name: 'position', type: 'vec3' },
925
+ { name: 'scale', type: 'float' },
926
+ { name: 'density', type: 'float' },
927
+ { name: 'color', type: 'vec3' },
928
+ { name: 'background', type: 'vec3' },
929
+ { name: 'seed', type: 'float' },
930
+ ] }
931
+ );
932
+
933
+
934
+
935
+ function dalmatianSpots( params={} ) {
936
+
937
+ var { position, scale, density, color, background, seed } = { ...defaults$I, ...params };
938
+
939
+ return dalmatianSpotsRaw( position, scale, density, color, background, seed );
940
+
941
+ }
942
+
943
+
944
+
945
+ dalmatianSpots.defaults = defaults$I;
946
+
947
+ var defaults$H = {
948
+ $name: 'Darth Maul',
949
+
950
+ position: positionGeometry,
951
+ scale: 2,
952
+ shift: new Vector3( 0, 0, 0 ),
953
+ complexity: 0,
954
+
955
+ angle: 60,
956
+ distance: 1.9,
957
+
958
+ color: new Color( 0xF04040 ),
959
+ background: new Color( 0x000000 ),
960
+ balance: 0,
961
+
962
+ seed: 0,
963
+ };
964
+
965
+
966
+
967
+ var darthMaulRaw = Fn( ([ position, scale, shift, complexity, angle, distance, color, background, balance, seed ]) => {
968
+
969
+ var xposition = position.add( shift ).mul( exp( scale.div( 1.5 ).sub( 1 ) ) ).sub( shift ).mul( vec3( 1, 1/2, 1/2 ) ).toVar( );
970
+
971
+ var s = select( position.y.mul( angle.radians().cos() ).add( position.z.mul( angle.radians().sin() ) ).greaterThan( distance ), 1, 0 );
972
+
973
+ // implement symmetry
974
+ xposition.x.assign( xposition.x.add( shift.x ).abs() );
975
+ xposition.y.addAssign( seed );
976
+ xposition.z.mulAssign( shift.z );
977
+
978
+ var n = mx_noise_float( xposition ).toVar();
979
+
980
+ var k = n.sin().mul( n.mul( complexity.mul( 2 ).add( 1 ).exp() ).sin() ).remap( 0, 0.2, 1, -1 ).greaterThan( balance ).select( 0, 1 );
981
+
982
+ var c = select( xposition.x.greaterThan( mx_noise_float( xposition.mul( 2.3 ) ).abs().mul( 0.5 ).add( 0.02 ) ), 1, 0 );
983
+
984
+ return mix( background, color, k.mul( s ).mul( c ).clamp( 0, 1 ) );
985
+
986
+ } ).setLayout( {
987
+ name: 'darthMaulRaw',
988
+ type: 'vec3',
989
+ inputs: [
990
+ { name: 'position', type: 'vec3' },
991
+ { name: 'scale', type: 'float' },
992
+ { name: 'shift', type: 'vec3' },
993
+ { name: 'complexity', type: 'float' },
994
+ { name: 'angle', type: 'float' },
995
+ { name: 'distance', type: 'float' },
996
+ { name: 'color', type: 'vec3' },
997
+ { name: 'background', type: 'vec3' },
998
+ { name: 'balance', type: 'float' },
999
+ { name: 'seed', type: 'float' },
1000
+ ] }
1001
+ );
1002
+
1003
+
1004
+
1005
+ function darthMaul( params={} ) {
1006
+
1007
+ var { position, scale, shift, complexity, angle, distance, color, background, balance, seed } = { ...defaults$H, ...params };
1008
+
1009
+ return darthMaulRaw( position, scale, shift, complexity, angle, distance, color, background, balance, seed );
1010
+
1011
+ }
1012
+
1013
+
1014
+
1015
+ darthMaul.defaults = defaults$H;
1016
+
1017
+ var defaults$G = {
1018
+ $name: 'Dyson sphere',
1019
+
1020
+ position: positionGeometry,
1021
+ scale: 2,
1022
+ complexity: 2,
1023
+
1024
+ variation: 0,
1025
+
1026
+ color: new Color( 0xc0d0ff ),
1027
+ background: new Color( 0 ),
1028
+
1029
+ seed: 0,
1030
+ };
1031
+
1032
+
1033
+
1034
+ var noisea = Fn( ([ pos ])=>{
1035
+
1036
+ var p = pos.mul( 5**0.5 ).fract().toVar();
1037
+ p.addAssign( p.dot( p.add( vec3( 31.4159, 27.1828, 14.142 ) ) ) );
1038
+ return p.z.mul( p.x.add( p.y ) ).fract().mul( 2 ).sub( 1 );
1039
+
1040
+ } ).setLayout( {
1041
+ name: 'noisea',
1042
+ type: 'float',
1043
+ inputs: [
1044
+ { name: 'pos', type: 'vec3' },
1045
+ ] }
1046
+ );
1047
+
1048
+
1049
+
1050
+ var smoother = Fn( ([ x ])=>{
1051
+
1052
+ var t = x.oneMinus().clamp( 0, 1 ).toVar();
1053
+ return t.mul( t ).mul( float( 3 ).sub( t.mul( 2 ) ) );
1054
+
1055
+ } ).setLayout( {
1056
+ name: 'smoother',
1057
+ type: 'float',
1058
+ inputs: [
1059
+ { name: 'x', type: 'float' },
1060
+ ] }
1061
+ );
1062
+
1063
+
1064
+
1065
+ var noiseg = Fn( ([ pos ])=>{
1066
+
1067
+ var minx = pos.x.floor().toVar();
1068
+ var maxx = minx.add( 1 ).toVar();
1069
+
1070
+ var miny = pos.y.floor().toVar();
1071
+ var maxy = miny.add( 1 ).toVar();
1072
+
1073
+ var minz = pos.z.floor().toVar();
1074
+ var maxz = minz.add( 1 ).toVar();
1075
+
1076
+ var dx = smoother( pos.x.fract() ).toVar();
1077
+ var dy = smoother( pos.y.fract() ).toVar();
1078
+ var dz = smoother( pos.z.fract() ).toVar();
1079
+
1080
+ var mx = smoother( dx.oneMinus() ).toVar();
1081
+ var my = smoother( dy.oneMinus() ).toVar();
1082
+ var mz = smoother( dz.oneMinus() ).toVar();
1083
+
1084
+ var n000 = noisea( vec3( minx, miny, minz ) ).mul( mx ).mul( my ).mul( mz ).toVar();
1085
+ var n001 = noisea( vec3( minx, miny, maxz ) ).mul( mx ).mul( my ).mul( dz ).toVar();
1086
+ var n010 = noisea( vec3( minx, maxy, minz ) ).mul( mx ).mul( dy ).mul( mz ).toVar();
1087
+ var n011 = noisea( vec3( minx, maxy, maxz ) ).mul( mx ).mul( dy ).mul( dz ).toVar();
1088
+ var n100 = noisea( vec3( maxx, miny, minz ) ).mul( dx ).mul( my ).mul( mz ).toVar();
1089
+ var n101 = noisea( vec3( maxx, miny, maxz ) ).mul( dx ).mul( my ).mul( dz ).toVar();
1090
+ var n110 = noisea( vec3( maxx, maxy, minz ) ).mul( dx ).mul( dy ).mul( mz ).toVar();
1091
+ var n111 = noisea( vec3( maxx, maxy, maxz ) ).mul( dx ).mul( dy ).mul( dz ).toVar();
1092
+
1093
+ return n000.add( n001 ).add( n010 ).add( n011 ).add( n100 ).add( n101 ).add( n110 ).add( n111 );
1094
+
1095
+ } ).setLayout( {
1096
+ name: 'noiseg',
1097
+ type: 'float',
1098
+ inputs: [
1099
+ { name: 'pos', type: 'vec3' },
1100
+ ] }
1101
+ );
1102
+
1103
+
1104
+
1105
+ var dysonSphereRaw = Fn( ([ position, scale, complexity, color, background, seed ])=>{
1106
+
1107
+ var pos = position.mul( exp( scale.div( 2 ).add( 0.5 ) ) ).add( seed ).toVar( );
1108
+
1109
+ var res = vec3().toVar();
1110
+ var factor = float( 1 ).toVar();
1111
+
1112
+ Loop( complexity.add( 4 ), ()=>{
1113
+
1114
+ res.addAssign( noiseg( pos.mul( factor ) ) );
1115
+ factor.addAssign( factor );
1116
+
1117
+ } );
1118
+
1119
+ return mix( background, color, res.x.add( 1 ).div( 5 ) );
1120
+
1121
+ } ).setLayout( {
1122
+ name: 'dysonSphereRaw',
1123
+ type: 'vec3',
1124
+ inputs: [
1125
+ { name: 'position', type: 'vec3' },
1126
+ { name: 'scale', type: 'float' },
1127
+ { name: 'complexity', type: 'float' },
1128
+ { name: 'color', type: 'vec3' },
1129
+ { name: 'background', type: 'vec3' },
1130
+ { name: 'seed', type: 'float' },
1131
+ ] }
1132
+ );
1133
+
1134
+
1135
+
1136
+ function dysonSphere( params={} ) {
1137
+
1138
+ var { position, scale, complexity, color, background, seed } = { ...defaults$G, ...params };
1139
+
1140
+ return dysonSphereRaw( position, scale, complexity, color, background, seed );
1141
+
1142
+ }
1143
+
1144
+
1145
+
1146
+ dysonSphere.defaults = defaults$G;
1147
+
1148
+ var defaults$F = {
1149
+ $name: 'Entangled',
1150
+
1151
+ position: positionGeometry,
1152
+ scale: 2,
1153
+ density: 10,
1154
+
1155
+ color: new Color( 0x002040 ),
1156
+ background: new Color( 0xFFFFFF ),
1157
+
1158
+ seed: 0,
1159
+ };
1160
+
1161
+
1162
+
1163
+ var entangledRaw = Fn( ([ position, scale, density, color, background, seed ]) => {
1164
+
1165
+ var xscale = exp( scale.div( 2 ) ).toVar( );
1166
+ var pos = position.add( seed ).toVar( );
1167
+ var k = float( -1e4 ).toVar( );
1168
+ var k1 = float( 0 ).toVar( );
1169
+
1170
+ Loop( density, ()=> {
1171
+
1172
+ k1.assign( sin( mx_noise_float( mul( pos, xscale ) ).mul( 3*Math.PI ) ) );
1173
+ k.assign( max( k, k1 ) );
1174
+ xscale.mulAssign( 1.2 );
1175
+
1176
+ } );
1177
+
1178
+ k.assign( oneMinus( pow( abs( k ), 5 ) ).mul( 6 ) );
1179
+
1180
+ return mix( color, background, k );
1181
+
1182
+ } ).setLayout( {
1183
+ name: 'entangled',
1184
+ type: 'vec3',
1185
+ inputs: [
1186
+ { name: 'position', type: 'vec3' },
1187
+ { name: 'scale', type: 'float' },
1188
+ { name: 'density', type: 'int' },
1189
+ { name: 'color', type: 'vec3' },
1190
+ { name: 'background', type: 'vec3' },
1191
+ { name: 'seed', type: 'float' },
1192
+ ] }
1193
+ );
1194
+
1195
+
1196
+
1197
+ function entangled( params={} ) {
1198
+
1199
+ var { position, scale, density, color, background, seed } = { ...defaults$F, ...params };
1200
+
1201
+ return entangledRaw( position, scale, density, color, background, seed );
1202
+
1203
+ }
1204
+
1205
+
1206
+
1207
+ entangled.defaults = defaults$F;
1208
+
1209
+ var defaults$E = {
1210
+ $name: 'Fordite',
1211
+
1212
+ position: positionGeometry,
1213
+ scale: 2,
1214
+ color: new Color( 0, 0, 0 ),
1215
+
1216
+ seed: 0,
1217
+ };
1218
+
1219
+
1220
+
1221
+ var forditeRaw = Fn( ([ position, scale, color, seed ]) => {
1222
+
1223
+ var pos = position.mul( exp( scale ) ).add( seed ).toVar( );
1224
+
1225
+ var k = mx_noise_float(
1226
+ vec3(
1227
+ mx_noise_float( pos, 1 ),
1228
+ mx_noise_float( pos, 2 ),
1229
+ mx_noise_float( pos, 3 ),
1230
+ )
1231
+ ).toVar( );
1232
+
1233
+ return hsl( vec3(
1234
+ k,
1235
+ 1,
1236
+ sin( mul( k, Math.PI, 4 ) ).mul( 0.5 ).add( 0.5 )
1237
+ ) ).add( color );
1238
+
1239
+ } ).setLayout( {
1240
+ name: 'forditeRaw',
1241
+ type: 'vec3',
1242
+ inputs: [
1243
+ { name: 'position', type: 'vec3' },
1244
+ { name: 'scale', type: 'float' },
1245
+ { name: 'color', type: 'vec3' },
1246
+ { name: 'seed', type: 'float' },
1247
+ ] }
1248
+ );
1249
+
1250
+
1251
+
1252
+ function fordite( params={} ) {
1253
+
1254
+ var { position, scale, color, seed } = { ...defaults$E, ...params };
1255
+
1256
+ return forditeRaw( position, scale, color, seed );
1257
+
1258
+ }
1259
+
1260
+
1261
+
1262
+ fordite.defaults = defaults$E;
1263
+
1264
+ var defaults$D = {
1265
+ $name: 'Gas giant',
1266
+
1267
+ position: positionGeometry,
1268
+ scale: 2,
1269
+ turbulence: 0.3,
1270
+ blur: 0.6,
1271
+
1272
+ colorA: new Color( 0xFFF8F0 ),
1273
+ colorB: new Color( 0xF0E8B0 ),
1274
+ colorC: new Color( 0xAFA0D0 ),
1275
+
1276
+ seed: 0,
1277
+ };
1278
+
1279
+
1280
+
1281
+ var gasGiantRaw = Fn( ([ position, scale, turbulence, blur, colorA, colorB, colorC, seed ])=>{
1282
+
1283
+ var xscale = scale.div( 2 ).add( 1 ).toVar();
1284
+ var pos = position.mul( exp( xscale ) ).add( seed ).toVar( );
1285
+
1286
+ // turbulence strength
1287
+ var xturbulence = turbulence.mul(
1288
+ mx_noise_float( vec3( 0, pos.y.mul( 0.5 ), 0 ).add( 1 ) ).add(
1289
+ mx_noise_float( vec3( 0, pos.y.mul( 1 ), 0 ).add( 1 ) ).mul( 0.5 ),
1290
+ mx_noise_float( vec3( 1, pos.y.mul( 2 ), 1 ).add( 1 ) ).mul( 0.25 )
1291
+ )
1292
+ ).mul( 5 ).abs().toVar();
1293
+
1294
+ var spot = mx_noise_float( pos.div( 4 ) ).add( 1 ).div( 2 ).pow( 10 ).mul( 10 ).smoothstep( 0, 1 );
1295
+
1296
+ // apply turbulence
1297
+ pos.addAssign( vec3( mx_noise_float( pos ), mx_noise_float( pos.yxz ), mx_noise_float( pos.yzx ) ).mul( xturbulence.mul( spot.mul( 2 ).exp() ) ) );
1298
+
1299
+
1300
+ var xblur = blur.pow( 0.2 ).oneMinus().mul( xturbulence.add( 1 ) ).toVar();
1301
+
1302
+ var k = mx_noise_float( pos.mul( vec3( 0, xscale, 0 ) ) );
1303
+ k = k.add( mx_noise_float( pos.mul( vec3( 1, 15, 1 ) ) ).mul( xblur ) );
1304
+ k = k.add( -0.5 ).smoothstep( -1, 1 ).oneMinus();
1305
+
1306
+ var n = mx_noise_float( vec3( 0, pos.y.mul( 0.75 ), 0 ) ).add( 1 );
1307
+
1308
+ var HSL = toHsl( mix( colorB, colorA, n ) );
1309
+ var color = hsl( vec3( HSL.x.add( mx_noise_float( pos.mul( vec3( 0, xscale, 0 ) ) ).div( 4 ) ), HSL.yz ) ).toVar();
1310
+
1311
+ color.assign( mix( color, colorC, xturbulence.mul( 0.3 ) ) );
1312
+
1313
+ return color.mul( k );
1314
+
1315
+ } ).setLayout( {
1316
+ name: 'gasGiantRaw',
1317
+ type: 'vec3',
1318
+ inputs: [
1319
+ { name: 'position', type: 'vec3' },
1320
+ { name: 'scale', type: 'float' },
1321
+ { name: 'turbulence', type: 'float' },
1322
+ { name: 'blur', type: 'float' },
1323
+ { name: 'colorA', type: 'vec3' },
1324
+ { name: 'colorB', type: 'vec3' },
1325
+ { name: 'colorC', type: 'vec3' },
1326
+ { name: 'seed', type: 'float' },
1327
+ ] }
1328
+ );
1329
+
1330
+
1331
+
1332
+ function gasGiant( params={} ) {
1333
+
1334
+ var { position, scale, turbulence, blur, colorA, colorB, colorC, seed } = { ...defaults$D, ...params };
1335
+
1336
+ return gasGiantRaw( position, scale, turbulence, blur, colorA, colorB, colorC, seed );
1337
+
1338
+ }
1339
+
1340
+
1341
+
1342
+ gasGiant.defaults = defaults$D;
1343
+
1344
+ var defaults$C = {
1345
+ $name: 'Grid',
1346
+ $replaceExportUVS: screenUV,
1347
+ $replaceExportASP: screenSize.x.div( screenSize.y ).log2(),
1348
+
1349
+ uvs: equirectUV( positionGeometry.normalize() ),
1350
+
1351
+ countU: 32,
1352
+ countV: 16,
1353
+
1354
+ aspect: 1,
1355
+ thinness: 0.8,
1356
+ equirectangular: true,
1357
+
1358
+ color: new Color( 0x000000 ),
1359
+ background: new Color( 0xFFFFFF ),
1360
+
1361
+ };
1362
+
1363
+
1364
+
1365
+ var gridRaw = Fn( ([ uvs, countU, countV, aspect, thinness, equirectangular, color, background ]) => {
1366
+
1367
+ var xaspect = max( exp2( aspect ), 1 );
1368
+
1369
+ var a = mul( uvs.x, xaspect, Math.PI ).toVar(),
1370
+ b = mul( uvs.y, Math.PI ).toVar();
1371
+
1372
+ var uTo = div( round( mul( uvs.x, countU ) ), countU ),
1373
+ vTo = div( round( mul( uvs.y, countV ) ), countV ),
1374
+ aTo = mul( uTo, xaspect, Math.PI ),
1375
+ bTo = mul( vTo, Math.PI );
1376
+
1377
+ var angleU = abs( sub( a, aTo ) ).mul( mix( 1, sin( b ), equirectangular ) ),
1378
+ angleV = abs( sub( b, bTo ) ),
1379
+ angle = min( angleU, angleV );
1380
+
1381
+ 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 );
1382
+ var k = oneMinus( smoothstep( sub( treshold, 0.002 ), add( treshold, 0.002 ), angle ) );
1383
+
1384
+ return mix( background, color, k );
1385
+
1386
+ } ).setLayout( {
1387
+ name: 'gridRaw',
1388
+ type: 'vec3',
1389
+ inputs: [
1390
+ { name: 'uvs', type: 'vec2' },
1391
+ { name: 'countU', type: 'float' },
1392
+ { name: 'countV', type: 'float' },
1393
+ { name: 'aspect', type: 'float' },
1394
+ { name: 'thinness', type: 'float' },
1395
+ { name: 'equirectangular', type: 'int' },
1396
+ { name: 'color', type: 'vec3' },
1397
+ { name: 'background', type: 'vec3' },
1398
+ ] }
1399
+ );
1400
+
1401
+
1402
+
1403
+ function grid( params={} ) {
1404
+
1405
+ var { uvs, countU, countV, aspect, thinness, equirectangular, color, background } = { ...defaults$C, ...params };
1406
+
1407
+ return gridRaw( uvs, countU, countV, aspect, thinness, equirectangular, color, background );
1408
+
1409
+ }
1410
+
1411
+
1412
+
1413
+ grid.defaults = defaults$C;
1414
+
1415
+ var defaults$B = {
1416
+ $name: 'Isolines',
1417
+
1418
+ position: positionGeometry,
1419
+ scale: 2,
1420
+ density: 40,
1421
+ blur: 0.3,
1422
+ thinness: 0.6,
1423
+
1424
+ color: new Color( 0xFFFFFF ),
1425
+ background: new Color( 0x000000 ),
1426
+
1427
+ seed: 0,
1428
+ };
1429
+
1430
+
1431
+
1432
+ var isolinesRaw = Fn( ([ position, scale, density, blur, thinness, color, background, seed ])=>{
1433
+
1434
+ var pos = position.mul( exp( scale ) ).add( seed ).toVar( );
1435
+
1436
+ var k = mx_noise_float( pos, density );
1437
+
1438
+ k = oneMinus( sin( k ) ).div( 2 );
1439
+
1440
+ k = smoothstep( sub( thinness, blur ), add( thinness, blur ), k );
1441
+
1442
+ return mix( color, background, k );
1443
+
1444
+ } ).setLayout( {
1445
+ name: 'isolinesRaw',
1446
+ type: 'vec3',
1447
+ inputs: [
1448
+ { name: 'position', type: 'vec3' },
1449
+ { name: 'scale', type: 'float' },
1450
+ { name: 'density', type: 'float' },
1451
+ { name: 'blur', type: 'float' },
1452
+ { name: 'thinness', type: 'float' },
1453
+ { name: 'color', type: 'vec3' },
1454
+ { name: 'background', type: 'vec3' },
1455
+ { name: 'seed', type: 'float' },
1456
+ ] }
1457
+ );
1458
+
1459
+
1460
+
1461
+ function isolines( params={} ) {
1462
+
1463
+ var { position, scale, density, blur, thinness, color, background, seed } = { ...defaults$B, ...params };
1464
+
1465
+ return isolinesRaw( position, scale, density, blur, thinness, color, background, seed );
1466
+
1467
+ }
1468
+
1469
+
1470
+
1471
+ isolines.defaults = defaults$B;
1472
+
1473
+ var defaults$A = {
1474
+ $name: 'Karst rock',
1475
+
1476
+ position: positionGeometry,
1477
+ scale: 2,
1478
+
1479
+ color: new Color( 0xFFF4F0 ),
1480
+ background: new Color( 0xD0D0D0 ),
1481
+
1482
+ seed: 0,
1483
+ };
1484
+
1485
+
1486
+
1487
+ var karstRockRaw = Fn( ([ position, scale, color, background, seed ])=>{
1488
+
1489
+ var pos = position.mul( exp( scale ) ).add( seed.sin().mul( 5 ) ).toVar( );
1490
+
1491
+ var pos2 = pos.add( mx_noise_float( pos.mul( 2 ) ) ).toVar();
1492
+
1493
+ var k = mx_noise_float( pos2 ).div( mx_noise_float( pos2.mul( 1.01 ) ) ).clamp( 0, 2 ).toVar();
1494
+
1495
+ k.addAssign( mx_noise_float( pos.mul( 100 ) ).div( 3 ) );
1496
+ k.addAssign( mx_noise_float( pos.mul( 2 ) ).div( 2 ) );
1497
+
1498
+ return mix( background, color, k ).mul( k.pow( 0.1 ) );
1499
+
1500
+ } ).setLayout( {
1501
+ name: 'karstRockRaw',
1502
+ type: 'vec3',
1503
+ inputs: [
1504
+ { name: 'position', type: 'vec3' },
1505
+ { name: 'scale', type: 'float' },
1506
+ { name: 'color', type: 'vec3' },
1507
+ { name: 'background', type: 'vec3' },
1508
+ { name: 'seed', type: 'float' },
1509
+ ] }
1510
+ );
1511
+
1512
+
1513
+
1514
+ function karstRock( params={} ) {
1515
+
1516
+ var { position, scale, color, background, seed } = { ...defaults$A, ...params };
1517
+
1518
+ return karstRockRaw( position, scale, color, background, seed );
1519
+
1520
+ }
1521
+
1522
+
1523
+
1524
+ karstRock.defaults = defaults$A;
1525
+
1526
+ var defaults$z = {
1527
+ $name: 'Marble',
1528
+
1529
+ position: positionGeometry,
1530
+ scale: 1.2,
1531
+ thinness: 5,
1532
+ noise: 0.3,
1533
+
1534
+ color: new Color( 0x4545D3 ),
1535
+ background: new Color( 0xF0F8FF ),
1536
+
1537
+ seed: 0,
1538
+ };
1539
+
1540
+
1541
+
1542
+ var marbleRaw = Fn( ([ position, scale, thinness, xnoise, color, background, seed ]) => {
1543
+
1544
+ var pos = position.mul( exp( scale ) ).add( seed ).toVar( );
1545
+
1546
+ var k = add(
1547
+ mx_noise_float( pos ),
1548
+ mx_noise_float( pos.mul( 2 ) ).mul( 0.5 ),
1549
+ mx_noise_float( pos.mul( 6 ) ).mul( 0.1 )
1550
+ );
1551
+
1552
+ var k = oneMinus( k.abs().pow( 2.5 ) ).toVar();
1553
+
1554
+ var maxSmooth = oneMinus( pow( 0.5, thinness.add( 7 ) ) ).toVar(),
1555
+ minSmooth = oneMinus( pow( 0.5, thinness.add( 7 ).mul( 0.5 ) ) ).toVar();
1556
+
1557
+ If( k.greaterThan( maxSmooth ), ()=>{
1558
+
1559
+ k.assign( 1 );
1560
+
1561
+ } )
1562
+ .ElseIf( k.lessThan( minSmooth ), ()=>{
1563
+
1564
+ k.assign( 0 );
1565
+
1566
+ } )
1567
+ .Else( ()=> {
1568
+
1569
+ var a = k.sub( minSmooth );
1570
+ var b = maxSmooth.sub( minSmooth );
1571
+ k.assign( pow( div( a, b ), 5 ).mul( 0.75 ) );
1572
+ k.assign( k.mul( add( 0.5, mx_noise_float( pos.mul( 2 ) ).mul( 1.5 ) ) ) );
1573
+
1574
+ } );
1575
+
1576
+ k.assign( k.add( mul( xnoise, mx_noise_float( pos.mul( 150 ) ).abs().pow3() ) ) );
1577
+
1578
+ return mix( background, color, k );
1579
+
1580
+ } ).setLayout( {
1581
+ name: 'marbleRaw',
1582
+ type: 'vec3',
1583
+ inputs: [
1584
+ { name: 'position', type: 'vec3' },
1585
+ { name: 'scale', type: 'float' },
1586
+ { name: 'thinness', type: 'float' },
1587
+ { name: 'xnoise', type: 'float' },
1588
+ { name: 'color', type: 'vec3' },
1589
+ { name: 'background', type: 'vec3' },
1590
+ { name: 'seed', type: 'float' },
1591
+ ] }
1592
+ );
1593
+
1594
+
1595
+
1596
+ function marble( params={} ) {
1597
+
1598
+ var { position, scale, thinness, noise, color, background, seed } = { ...defaults$z, ...params };
1599
+
1600
+ return marbleRaw( position, scale, thinness, noise, color, background, seed );
1601
+
1602
+ }
1603
+
1604
+
1605
+
1606
+ marble.defaults = defaults$z;
1607
+
1608
+ var defaults$y = {
1609
+ $name: 'Neon Lights',
1610
+
1611
+ position: positionGeometry,
1612
+
1613
+ scale: 2,
1614
+ thinness: 0.8,
1615
+ mode: 0, // 0=additive, 1=subtractive
1616
+
1617
+ colorA: new Color( 0xFF0000 ),
1618
+ colorB: new Color( 0x00FF00 ),
1619
+ colorC: new Color( 0x0000FF ),
1620
+ background: new Color( 0x000000 ),
1621
+
1622
+ seed: 0,
1623
+ };
1624
+
1625
+
1626
+
1627
+ var neonLightsRaw = Fn( ([ position, scale, thinness, mode, colorA, colorB, colorC, background, seed ]) => {
1628
+
1629
+ var pos = position;
1630
+
1631
+ var xscale = exp( scale.remap( 0, 4, -2, 2 ) ).toVar();
1632
+ var xthinness = exp( thinness.remap( 0, 1, 1.5, 0 ) ).toVar();
1633
+
1634
+ var color = background.toVar();
1635
+ var neon = vec3( 0 ).toVar();
1636
+
1637
+ var x = mx_noise_float( pos.xyz ).toVar();
1638
+ var y = mx_noise_float( pos.yzx ).toVar();
1639
+ var z = mx_noise_float( pos.zxy ).toVar();
1640
+
1641
+ var k = mx_noise_float( vec3( x, y, z ).mul( xscale ).add( seed ) ).toVar();
1642
+ k.assign( oneMinus( sqrt( abs( k ) ) ).pow( 3 ) );
1643
+
1644
+ neon.assign( colorA );
1645
+ var HSL = toHsl( neon );
1646
+ neon.assign( hsl( vec3( HSL.xy, HSL.z.mul( k ) ) ) );
1647
+
1648
+ color.addAssign( select( mode.equal( 0 ), neon, neon.negate() ).mul( xthinness ) );
1649
+
1650
+ k.assign( mx_noise_float( vec3( y, z, x ).mul( xscale ).sub( seed ) ) );
1651
+ k.assign( oneMinus( sqrt( abs( k ) ) ).pow( 3 ) );
1652
+
1653
+ neon.assign( colorB );
1654
+ var HSL = toHsl( neon );
1655
+ neon.assign( hsl( vec3( HSL.xy, HSL.z.mul( k ) ) ) );
1656
+
1657
+ color.addAssign( select( mode.equal( 0 ), neon, neon.negate() ).mul( xthinness ) );
1658
+
1659
+
1660
+ k.assign( mx_noise_float( vec3( z, x, y.negate() ).mul( xscale ).add( seed ) ) );
1661
+ k.assign( oneMinus( sqrt( abs( k ) ) ).pow( 3 ) );
1662
+
1663
+ neon.assign( colorC );
1664
+ var HSL = toHsl( neon );
1665
+ neon.assign( hsl( vec3( HSL.xy, HSL.z.mul( k ) ) ) );
1666
+
1667
+ color.addAssign( select( mode.equal( 0 ), neon, neon.negate() ).mul( xthinness ) );
1668
+
1669
+ return color;
1670
+
1671
+ } ).setLayout( {
1672
+ name: 'neonLightsRaw',
1673
+ type: 'vec3',
1674
+ inputs: [
1675
+ { name: 'position', type: 'vec3' },
1676
+ { name: 'scale', type: 'float' },
1677
+ { name: 'thinness', type: 'float' },
1678
+ { name: 'node', type: 'float' },
1679
+ { name: 'colorA', type: 'vec3' },
1680
+ { name: 'colorB', type: 'vec3' },
1681
+ { name: 'colorC', type: 'vec3' },
1682
+ { name: 'background', type: 'vec3' },
1683
+ { name: 'seed', type: 'float' },
1684
+ ] }
1685
+ );
1686
+
1687
+
1688
+
1689
+ function neonLights( params={} ) {
1690
+
1691
+ var { position, scale, thinness, mode, colorA, colorB, colorC, background, seed } = { ...defaults$y, ...params };
1692
+
1693
+ return neonLightsRaw( position, scale, thinness, mode, colorA, colorB, colorC, background, seed );
1694
+
1695
+ }
1696
+
1697
+
1698
+
1699
+ neonLights.defaults = defaults$y;
1700
+
1701
+ var defaults$x = {
1702
+ $name: 'Perlin noise',
1703
+
1704
+ position: positionGeometry,
1705
+ scale: 2,
1706
+ balance: 0,
1707
+ contrast: 0,
1708
+
1709
+ color: new Color( 0xFFFFFF ),
1710
+ background: new Color( 0x000000 ),
1711
+
1712
+ seed: 0,
1713
+ };
1714
+
1715
+
1716
+
1717
+ var perlinNoiseRaw = Fn( ([ position, scale, balance, contrast, color, background, seed ]) => {
1718
+
1719
+ var pos = position.mul( exp( scale ) ).add( seed );
1720
+
1721
+ var k = mx_noise_float( pos ).mul( 0.5, exp( contrast ) ).add( 0.5, balance ).min( 1 );
1722
+
1723
+ return mix( background, color, k );
1724
+
1725
+ } ).setLayout( {
1726
+ name: 'perlinNoiseRaw',
1727
+ type: 'vec3',
1728
+ inputs: [
1729
+ { name: 'position', type: 'vec3' },
1730
+ { name: 'scale', type: 'float' },
1731
+ { name: 'balance', type: 'float' },
1732
+ { name: 'contrast', type: 'float' },
1733
+ { name: 'color', type: 'vec3' },
1734
+ { name: 'background', type: 'vec3' },
1735
+ { name: 'seed', type: 'float' },
1736
+ ] }
1737
+ );
1738
+
1739
+
1740
+
1741
+ function perlinNoise( params={} ) {
1742
+
1743
+ var { position, scale, balance, contrast, color, background, seed } = { ...defaults$x, ...params };
1744
+
1745
+ return perlinNoiseRaw( position, scale, balance, contrast, color, background, seed );
1746
+
1747
+ }
1748
+
1749
+
1750
+
1751
+ perlinNoise.defaults = defaults$x;
1752
+
1753
+ var defaults$w = {
1754
+ $name: 'Photosphere',
1755
+
1756
+ position: positionGeometry,
1757
+ scale: 2,
1758
+
1759
+ color: new Color( 0xFFFF00 ),
1760
+ background: new Color( 0xFF0000 ),
1761
+
1762
+ seed: 0,
1763
+ };
1764
+
1765
+
1766
+
1767
+ var photosphereRaw = Fn( ([ position, scale, color, background, seed ]) => {
1768
+
1769
+ var xscale = exp( scale.add( 1 ) ).toVar( );
1770
+ var pos = position.toVar( );
1771
+
1772
+ var vec = vec3( pos ).toVar();
1773
+
1774
+ Loop( 6, () => {
1775
+
1776
+ vec.assign( rotate( vec, pos.mul( xscale ) ) );
1777
+ xscale.mulAssign( seed.mul( xscale ).sin().mul( 0.05 ).add( 1.1 ) );
1778
+
1779
+ } );
1780
+
1781
+
1782
+ var k = mx_noise_float( vec ).add( 1 ).div( 2 );
1783
+
1784
+ return mix( background, color, k );
1785
+
1786
+ } ).setLayout( {
1787
+ name: 'photosphereRaw',
1788
+ type: 'vec3',
1789
+ inputs: [
1790
+ { name: 'position', type: 'vec3' },
1791
+ { name: 'scale', type: 'float' },
1792
+ { name: 'color', type: 'vec3' },
1793
+ { name: 'background', type: 'vec3' },
1794
+ { name: 'seed', type: 'float' },
1795
+ ] }
1796
+ );
1797
+
1798
+
1799
+
1800
+ function photosphere( params={} ) {
1801
+
1802
+ var { position, scale, color, background, seed } = { ...defaults$w, ...params };
1803
+
1804
+ return photosphereRaw( position, scale, color, background, seed );
1805
+
1806
+ }
1807
+
1808
+
1809
+
1810
+ photosphere.defaults = defaults$w;
1811
+
1812
+ var defaults$v = {
1813
+ $name: 'Planet',
1814
+
1815
+ position: positionGeometry,
1816
+ scale: 2,
1817
+
1818
+ iterations: 5,
1819
+
1820
+ levelSea: 0.3,
1821
+ levelMountain: 0.7,
1822
+
1823
+ balanceWater: 0.3,
1824
+ balanceSand: 0.2,
1825
+ balanceSnow: 0.8,
1826
+
1827
+ colorDeep: new Color( 0x123a59 ).convertLinearToSRGB(), // SteelBlue
1828
+ colorShallow: new Color( 0x87CEEB ).convertLinearToSRGB(), // SkyBlue
1829
+ colorBeach: new Color( 0xFFFACD ).convertLinearToSRGB(), // LemonChiffon
1830
+ colorGrass: new Color( 0x3CB371 ).convertLinearToSRGB(), // MediumSeaGreen
1831
+ colorForest: new Color( 0x003000 ).convertLinearToSRGB(), // Dark green
1832
+ colorSnow: new Color( 0xF0FFFF ).convertLinearToSRGB(), // Azure
1833
+
1834
+ seed: 0,
1835
+ };
1836
+
1837
+
1838
+
1839
+ var planetRaw = Fn( ([ position, scale, iterations, levelSea, levelMountain, balanceWater, balanceSand, balanceSnow, colorDeep, colorShallow, colorBeach, colorGrass, colorForest, colorSnow, seed ])=>{
1840
+
1841
+ var k = float( 0 ).toVar(),
1842
+ sum = float( 0 ).toVar(),
1843
+ xscale = exp( scale.sub( 2 ) ).toVar(),
1844
+ xpower = float( 2 ).toVar();
1845
+
1846
+ Loop( iterations.add( 10 ), ()=>{
1847
+
1848
+ k.addAssign( mul( xpower, mx_noise_float( position.mul( xscale ).add( seed ) ) ) );
1849
+ sum.addAssign( xpower );
1850
+ xscale.mulAssign( 1.5 );
1851
+ xpower.mulAssign( 0.8 );
1852
+
1853
+ } );
1854
+
1855
+ k.assign( mul( k, k, 0.5 ).div( sum ) );
1856
+
1857
+ var levelSea = levelSea.pow( 2 ).toVar();
1858
+ var levelMountain = levelMountain.pow( 2 ).toVar();
1859
+ var levelSand = mix( levelSea, levelMountain, balanceSand ).toVar();
1860
+ var levelCoast = mix( levelSea, levelSand, 0.4 ).toVar();
1861
+ var levelGrass = mix( levelSea, levelSand, 0.6 ).toVar();
1862
+
1863
+ var color = vec3().toVar();
1864
+
1865
+ // process water
1866
+ If( k.lessThan( levelSea ), ()=>{
1867
+
1868
+ // deep-shallow
1869
+ color.assign( mix(
1870
+ colorDeep,
1871
+ colorShallow,
1872
+ remap( k, 0, levelSea, 0, 1 ).pow( exp( balanceWater.mul( -8 ).add( 4 ) ) )
1873
+ ) );
1874
+
1875
+ } )
1876
+ .ElseIf( k.lessThan( levelCoast ), ()=>{
1877
+
1878
+ // shallow-sand
1879
+ color.assign( mix(
1880
+ colorShallow,
1881
+ colorBeach,
1882
+ remap( k, levelSea, levelCoast )
1883
+ ) );
1884
+
1885
+ } )
1886
+ .ElseIf( k.lessThan( levelGrass ), ()=>{
1887
+
1888
+ // sand
1889
+ color.assign( colorBeach );
1890
+
1891
+ } )
1892
+ .ElseIf( k.lessThan( levelSand ), ()=>{
1893
+
1894
+ // shallow-sand-grass
1895
+ color.assign( mix(
1896
+ colorBeach,
1897
+ colorGrass,
1898
+ remap( k, levelGrass, levelSand )
1899
+ ) );
1900
+
1901
+ } )
1902
+ .ElseIf( k.lessThan( levelMountain ), ()=>{
1903
+
1904
+ // grass-forest
1905
+ color.assign( mix(
1906
+ colorGrass,
1907
+ colorForest,
1908
+ remap( k, levelSand, levelMountain ).pow( 0.75 )
1909
+ ) );
1910
+
1911
+ } )
1912
+ .Else( ()=>{
1913
+
1914
+ // forest-snow
1915
+ var levelSnow = mix( 1, levelMountain, balanceSnow );
1916
+ color.assign( mix(
1917
+ colorForest,
1918
+ colorSnow,
1919
+ smoothstep( mix( levelSnow, levelMountain, balanceSnow.pow( 0.5 ) ), levelSnow, k )
1920
+ ) );
1921
+
1922
+ } );
1923
+
1924
+ return color;
1925
+
1926
+ } ).setLayout( {
1927
+ name: 'planetRaw',
1928
+ type: 'vec3',
1929
+ inputs: [
1930
+ { name: 'position', type: 'vec3' },
1931
+ { name: 'scale', type: 'float' },
1932
+
1933
+ { name: 'iterations', type: 'int' },
1934
+ { name: 'levelSea', type: 'float' },
1935
+ { name: 'levelMountain', type: 'float' },
1936
+ { name: 'balanceWater', type: 'float' },
1937
+ { name: 'balanceSand', type: 'float' },
1938
+ { name: 'balanceSnow', type: 'float' },
1939
+
1940
+ { name: 'colorDeep', type: 'vec3' },
1941
+ { name: 'colorShallow', type: 'vec3' },
1942
+ { name: 'colorBeach', type: 'vec3' },
1943
+ { name: 'colorGrass', type: 'vec3' },
1944
+ { name: 'colorForest', type: 'vec3' },
1945
+ { name: 'colorSnow', type: 'vec3' },
1946
+
1947
+ { name: 'seed', type: 'float' },
1948
+ ] }
1949
+ );
1950
+
1951
+
1952
+
1953
+ function planet( params={} ) {
1954
+
1955
+ var { position, scale, iterations, levelSea, levelMountain, balanceWater, balanceSand, balanceSnow, colorDeep, colorShallow, colorBeach, colorGrass, colorForest, colorSnow, seed } = { ...defaults$v, ...params };
1956
+
1957
+ return planetRaw( position, scale, iterations, levelSea, levelMountain, balanceWater, balanceSand, balanceSnow, colorDeep, colorShallow, colorBeach, colorGrass, colorForest, colorSnow, seed );
1958
+
1959
+ }
1960
+
1961
+
1962
+
1963
+ planet.defaults = defaults$v;
1964
+
1965
+ var defaults$u = {
1966
+ $name: 'Polka dots',
1967
+
1968
+ position: positionGeometry,
1969
+ count: 2,
1970
+ size: 0.5,
1971
+ blur: 0.25,
1972
+
1973
+ color: new Color( 0x000000 ),
1974
+ background: new Color( 0xFFFFFF ),
1975
+
1976
+ flat: 0,
1977
+ };
1978
+
1979
+
1980
+
1981
+ var goldenRatio = ( 1+5**0.5 )/2;
1982
+
1983
+
1984
+
1985
+ var polkaDotsRaw = Fn( ([ position, count, size, blur, color, background, xflat ]) => {
1986
+
1987
+ var dist = float( 1 ).toVar();
1988
+
1989
+ If( xflat.equal( 1 ), ()=>{
1990
+
1991
+ var cnt = count.pow( 2 ).sub( 0.5 ).toVar();
1992
+ var pos = position.xy.mul( cnt ).mul( mat2( 1, 1, -1, 1 ) );
1993
+ var posTo = pos.round().toVar();
1994
+
1995
+ dist.assign( pos.distance( posTo ).div( cnt ) );
1996
+
1997
+ } ).Else( ()=>{
1998
+
1999
+ var cnt = pow( 10, count ).toVar();
2000
+ var vec = position.normalize().toVar();
2001
+
2002
+ var besti = oneMinus( vec.y ).mul( cnt ).sub( 1 ).div( 2 );
2003
+
2004
+ var span = max( 10, cnt.pow( 0.5 ) );
2005
+
2006
+ var mini = besti.sub( span ).floor().clamp( 0, cnt );
2007
+ var maxi = besti.add( span ).floor().clamp( 0, cnt );
2008
+
2009
+ dist.assign( 1 ).toVar();
2010
+
2011
+ Loop( maxi.sub( mini ), ( { i } )=> {
2012
+
2013
+ var j = add( i, mini );
2014
+ var theta = mod( mul( 2*Math.PI/goldenRatio, j ), 2*Math.PI );
2015
+ var phi = acos( oneMinus( float( j ).mul( 2 ).add( 1 ).div( cnt ) ) );
2016
+ var pnt = spherical( phi, theta );//.normalize();
2017
+ dist.assign( min( dist, distance( vec, pnt ) ) );
2018
+
2019
+ } ); // Loop
2020
+
2021
+ } ); // Else
2022
+
2023
+ var xsize = exp( size.mul( 5 ).sub( 5 ) ).toVar();
2024
+ var xblur = blur.pow( 4 ).toVar();
2025
+ var k = smoothstep( xsize.sub( xblur ), xsize.add( xblur ), dist );
2026
+
2027
+ return mix( color, background, k );
2028
+
2029
+ } ).setLayout( {
2030
+ name: 'polkaDotsRaw',
2031
+ type: 'vec3',
2032
+ inputs: [
2033
+ { name: 'position', type: 'vec3' },
2034
+ { name: 'count', type: 'float' },
2035
+ { name: 'size', type: 'float' },
2036
+ { name: 'blur', type: 'float' },
2037
+ { name: 'color', type: 'vec3' },
2038
+ { name: 'background', type: 'vec3' },
2039
+ { name: 'xflat', type: 'int' },
2040
+ ] }
2041
+ );
2042
+
2043
+
2044
+
2045
+ function polkaDots( params={} ) {
2046
+
2047
+ var { position, count, size, blur, color, background, flat } = { ...defaults$u, ...params };
2048
+
2049
+ return polkaDotsRaw( position, count, size, blur, color, background, flat );
2050
+
2051
+ }
2052
+
2053
+
2054
+
2055
+ polkaDots.defaults = defaults$u;
2056
+
2057
+ var defaults$t = {
2058
+ $name: 'Processed wood',
2059
+ $width: 260,
2060
+
2061
+ position: positionGeometry,
2062
+ scale: 2,
2063
+ lengths: 4,
2064
+ strength: 0.3,
2065
+ angle: 0,
2066
+
2067
+ color: new Color( 0x702020 ),
2068
+ background: new Color( 0xF0D0A0 ),
2069
+
2070
+ seed: 0,
2071
+ };
2072
+
2073
+
2074
+
2075
+ var processedWoodRaw = Fn( ([ position, scale, lengths, strength, angle, color, background, seed ])=>{
2076
+
2077
+ var angle = radians( angle ).toVar();
2078
+ var posLocal = vec3(
2079
+ sub( position.x.mul( cos( angle ) ), position.y.mul( sin( angle ) ) ),
2080
+ add( position.x.mul( sin( angle ) ), position.y.mul( cos( angle ) ) ),
2081
+ position.z,
2082
+ ).toVar();
2083
+
2084
+ var xscale = scale.div( 2 ).add( 1 ).toVar();
2085
+ var pos = posLocal.mul( exp( scale ) ).add( seed ).toVar( );
2086
+
2087
+ var len = lengths.add( 5 ).reciprocal().toVar();
2088
+ var k = mx_noise_float( pos.mul( xscale, vec3( 1, len, len ) ) );
2089
+ k = k.mul( mx_noise_float( pos.mul( vec3( 25, 1, 1 ) ) ).add( -1 ).mul( 0.2 ) );
2090
+ k = k.add( strength.sub( 0.5 ) ).smoothstep( -0.3, 0.3 ).oneMinus();
2091
+
2092
+ return mix( color, background, k );
2093
+
2094
+ } ).setLayout( {
2095
+ name: 'processedWoodRaw',
2096
+ type: 'vec3',
2097
+ inputs: [
2098
+ { name: 'position', type: 'vec3' },
2099
+ { name: 'scale', type: 'float' },
2100
+ { name: 'lengths', type: 'float' },
2101
+ { name: 'strength', type: 'float' },
2102
+ { name: 'angle', type: 'float' },
2103
+ { name: 'color', type: 'vec3' },
2104
+ { name: 'background', type: 'vec3' },
2105
+ { name: 'seed', type: 'float' },
2106
+ ] }
2107
+ );
2108
+
2109
+
2110
+
2111
+ function processedWood( params={} ) {
2112
+
2113
+ var { position, scale, lengths, strength, angle, color, background, seed } = { ...defaults$t, ...params };
2114
+
2115
+ return processedWoodRaw( position, scale, lengths, strength, angle, color, background, seed );
2116
+
2117
+ }
2118
+
2119
+
2120
+
2121
+ processedWood.defaults = defaults$t;
2122
+
2123
+ var defaults$s = {
2124
+ $name: 'Protozoa',
2125
+
2126
+ position: positionGeometry,
2127
+ matcap: matcapUV,
2128
+ scale: 1.5,
2129
+ fat: 0.7,
2130
+ amount: 0.4,
2131
+
2132
+ color: new Color( 0xA0A0A0 ),
2133
+ subcolor: new Color( 0xE0E8FF ),
2134
+ background: new Color( 0xF0F8FF ),
2135
+
2136
+ seed: 0,
2137
+ };
2138
+
2139
+
2140
+
2141
+ var pnoise = Fn( ([ pos, fat ])=>{
2142
+
2143
+ return mx_noise_float( pos ).mul( fat ).clamp( -3.14, 3.14 ).cos().add( 1 ).div( 2 );
2144
+
2145
+ } ).setLayout( {
2146
+ name: 'pnoise',
2147
+ type: 'float',
2148
+ inputs: [
2149
+ { name: 'pos', type: 'vec3' },
2150
+ { name: 'fat', type: 'float' },
2151
+ ] }
2152
+ );
2153
+
2154
+
2155
+
2156
+ var protozoaRaw = Fn( ([ position, matcap, scale, fat, amount, color, subcolor, background, seed ])=>{
2157
+
2158
+ var pos = position.mul( exp( scale.sub( 1 ) ) ).add( seed ).toVar( );
2159
+
2160
+ var xmatcap = vec3( matcap, matcap.length() ).toVar();
2161
+
2162
+ var rings1 = float( 0 ).toVar();
2163
+ var rings2 = float( 0 ).toVar();
2164
+
2165
+ var n1 = float( 0 ).toVar();
2166
+ var n2 = float( 0 ).toVar();
2167
+
2168
+ var fat = fat.add( 0.2 ).oneMinus().mul( 60 ).add( 30 ).toVar();
2169
+ var xscale = float( 2 ).toVar();
2170
+
2171
+ var dPos = amount.div( 2 ).add( 0.5 ).exp().toVar();
2172
+
2173
+ Loop( 10, ()=>{
2174
+
2175
+ rings1.assign( pnoise( pos.xyz.add( xmatcap ), fat ) );
2176
+ rings2.assign( pnoise( pos.yzx.add( xmatcap ), fat ) );
2177
+
2178
+ n1.addAssign( rings1.mul( rings2 ).mul( xscale ) );
2179
+ n2.addAssign( rings1.max( rings2 ).mul( xscale ) );
2180
+
2181
+ pos.assign( mix( pos.mul( dPos ), 0, 0.4 ) );
2182
+
2183
+ xscale.mulAssign( 0.9 );
2184
+
2185
+ } );
2186
+
2187
+ return mix( background, mix( color, subcolor, n2.mul( 0.1 ) ), n1 );
2188
+
2189
+ } ).setLayout( {
2190
+ name: 'protozoaRaw',
2191
+ type: 'vec3',
2192
+ inputs: [
2193
+ { name: 'position', type: 'vec3' },
2194
+ { name: 'matcap', type: 'vec2' },
2195
+ { name: 'scale', type: 'float' },
2196
+ { name: 'fat', type: 'float' },
2197
+ { name: 'amount', type: 'float' },
2198
+ { name: 'color', type: 'vec3' },
2199
+ { name: 'subcolor', type: 'vec3' },
2200
+ { name: 'background', type: 'vec3' },
2201
+ { name: 'seed', type: 'float' },
2202
+ ] }
2203
+ );
2204
+
2205
+
2206
+
2207
+ function protozoa( params={} ) {
2208
+
2209
+ var { position, matcap, scale, fat, amount, color, subcolor, background, seed } = { ...defaults$s, ...params };
2210
+
2211
+ return protozoaRaw( position, matcap, scale, fat, amount, color, subcolor, background, seed );
2212
+
2213
+ }
2214
+
2215
+
2216
+
2217
+ protozoa.defaults = defaults$s;
2218
+
2219
+ var defaults$r = {
2220
+ $name: 'Rotator',
2221
+ $positionNode: true,
2222
+ $selectorPlanar: true,
2223
+
2224
+ angles: new Vector3( -0.2, 0.7, 0 ),
2225
+ center: new Vector3( 0, 0, 0 ),
2226
+
2227
+ selectorCenter: new Vector3( 0, 0, 0 ),
2228
+ selectorAngles: new Vector2( 0, 0 ),
2229
+ selectorWidth: 2,
2230
+
2231
+ };
2232
+
2233
+
2234
+
2235
+ var surfacePos$6 = Fn( ([ pos, angles, center, selectorAngles, selectorCenter, selectorWidth ])=>{
2236
+
2237
+ var zone = selectPlanar( pos, selectorAngles, selectorCenter, selectorWidth );
2238
+
2239
+ return rotatePivot( pos, center, angles.mul( zone ) );
2240
+
2241
+ } ).setLayout( {
2242
+ name: 'surfacePos',
2243
+ type: 'vec3',
2244
+ inputs: [
2245
+ { name: 'pos', type: 'vec3' },
2246
+ { name: 'angles', type: 'vec3' },
2247
+ { name: 'center', type: 'vec3' },
2248
+ { name: 'selectorAngles', type: 'vec2' },
2249
+ { name: 'selectorCenter', type: 'vec3' },
2250
+ { name: 'selectorWidth', type: 'float' },
2251
+ ]
2252
+ } );
2253
+
2254
+
2255
+
2256
+ var rotatorRaw = Fn( ([ angles, center, selectorAngles, selectorCenter, selectorWidth ])=>{
2257
+
2258
+ return surfacePos$6( positionGeometry, angles, center, selectorAngles, selectorCenter, selectorWidth );
2259
+
2260
+ } ).setLayout( {
2261
+ name: 'rotatorRaw',
2262
+ type: 'vec3',
2263
+ inputs: [
2264
+ { name: 'angles', type: 'vec3' },
2265
+ { name: 'center', type: 'vec3' },
2266
+ { name: 'selectorAngles', type: 'vec2' },
2267
+ { name: 'selectorCenter', type: 'vec3' },
2268
+ { name: 'selectorWidth', type: 'float' },
2269
+ ]
2270
+ } );
2271
+
2272
+
2273
+
2274
+ var rotatorNormalRaw = Fn( ([ angles, center, selectorAngles, selectorCenter, selectorWidth ]) => {
2275
+
2276
+ const EPS = 0.01;
2277
+
2278
+ var position = positionGeometry,
2279
+ normal = normalLocal.normalize().toVar(),
2280
+ tangent = tangentLocal.normalize().mul( EPS ).toVar(),
2281
+ bitangent = cross( normal, tangent ).normalize().mul( EPS ).toVar();
2282
+
2283
+ var pos = surfacePos$6( position, angles, center, selectorAngles, selectorCenter, selectorWidth );
2284
+ var posU = surfacePos$6( position.add( tangent ), angles, center, selectorAngles, selectorCenter, selectorWidth );
2285
+ var posV = surfacePos$6( position.add( bitangent ), angles, center, selectorAngles, selectorCenter, selectorWidth );
2286
+
2287
+ return approximateNormal( pos, posU, posV );
2288
+
2289
+ } ).setLayout( {
2290
+ name: 'rotatorNormalRaw',
2291
+ type: 'vec3',
2292
+ inputs: [
2293
+ { name: 'angles', type: 'vec3' },
2294
+ { name: 'center', type: 'vec3' },
2295
+ { name: 'selectorAngles', type: 'vec2' },
2296
+ { name: 'selectorCenter', type: 'vec3' },
2297
+ { name: 'selectorWidth', type: 'float' },
2298
+ ]
2299
+ } );
2300
+
2301
+
2302
+
2303
+ function rotator( params={} ) {
2304
+
2305
+ var { angles, center, selectorAngles, selectorCenter, selectorWidth } = { ...defaults$r, ...params };
2306
+
2307
+ return rotatorRaw( angles, center, selectorAngles, selectorCenter, selectorWidth );
2308
+
2309
+ }
2310
+
2311
+
2312
+
2313
+ rotator.normal = function ( params={} ) {
2314
+
2315
+ var { angles, center, selectorAngles, selectorCenter, selectorWidth } = { ...defaults$r, ...params };
2316
+
2317
+ return rotatorNormalRaw( angles, center, selectorAngles, selectorCenter, selectorWidth );
2318
+
2319
+ };
2320
+
2321
+
2322
+
2323
+ rotator.defaults = defaults$r;
2324
+
2325
+ var defaults$q = {
2326
+ $name: 'Rough clay',
2327
+ $normalNode: true,
2328
+
2329
+ position: positionGeometry,
2330
+ scale: 2,
2331
+ bump: 0.5,
2332
+ curvature: 0.2,
2333
+
2334
+ seed: 0,
2335
+ };
2336
+
2337
+
2338
+
2339
+ var surfacePos$5 = Fn( ([ pos, normal, curvature ]) => {
2340
+
2341
+ var k1 = mx_worley_noise_float( pos.add( mx_noise_float( pos ).mul( curvature ) ) ).add( 0.8 ).pow( 5 ).toVar();
2342
+ k1.addAssign( k1.pow( 0.5 ) );
2343
+ return pos.add( normal.mul( k1 ) );
2344
+
2345
+ } ).setLayout( {
2346
+ name: 'surfacePos',
2347
+ type: 'vec3',
2348
+ inputs: [
2349
+ { name: 'position', type: 'vec3' },
2350
+ { name: 'normal', type: 'vec3' },
2351
+ { name: 'curvature', type: 'float' },
2352
+ ] }
2353
+ );
2354
+
2355
+
2356
+
2357
+ var roughClayRaw = Fn( ([ position, normal, tangent, scale, bump, curvature, seed ]) => {
2358
+
2359
+ const EPS = 0.001;
2360
+
2361
+ var xposition = position.mul( exp( scale.div( 2 ) ) ).add( seed.sin().mul( 10 ) ).toVar( ),
2362
+ xnormal = normal.normalize().toVar(),
2363
+ xtangent = tangent.normalize().mul( EPS ).toVar(),
2364
+ xbitangent = cross( xnormal, xtangent ).normalize().mul( EPS ).toVar();
2365
+
2366
+ xnormal.mulAssign( bump, 1/50 );
2367
+
2368
+ var pos = surfacePos$5( xposition, xnormal, curvature );
2369
+ var posU = surfacePos$5( xposition.add( xtangent ), xnormal, curvature );
2370
+ var posV = surfacePos$5( xposition.add( xbitangent ), xnormal, curvature );
2371
+
2372
+ return approximateNormal( pos, posU, posV );
2373
+
2374
+ } ).setLayout( {
2375
+ name: 'concreteRaw',
2376
+ type: 'vec3',
2377
+ inputs: [
2378
+ { name: 'position', type: 'vec3' },
2379
+ { name: 'normal', type: 'vec3' },
2380
+ { name: 'tangent', type: 'vec3' },
2381
+ { name: 'scale', type: 'float' },
2382
+ { name: 'bump', type: 'float' },
2383
+ { name: 'curvature', type: 'float' },
2384
+ { name: 'seed', type: 'float' },
2385
+ ] }
2386
+ );
2387
+
2388
+
2389
+
2390
+ function roughClay( params={} ) {
2391
+
2392
+ var { position, scale, bump, curvature, seed } = { ...defaults$q, ...params };
2393
+
2394
+ return roughClayRaw( position, normalLocal, tangentLocal, scale, bump, curvature, seed );
2395
+
2396
+ }
2397
+
2398
+
2399
+
2400
+ roughClay.defaults = defaults$q;
2401
+
2402
+ var defaults$p = {
2403
+ $name: 'Runny eggs',
2404
+
2405
+ position: positionGeometry,
2406
+ scale: 1,
2407
+
2408
+ sizeYolk: 0.2,
2409
+ sizeWhite: 0.7,
2410
+
2411
+ colorYolk: new Color( 'orange' ),
2412
+ colorWhite: new Color( 'white' ),
2413
+ colorBackground: new Color( 'lightgray' ),
2414
+
2415
+ seed: 0,
2416
+ };
2417
+
2418
+
2419
+
2420
+ var surfacePos$4 = Fn( ([ pos, normal, sizeYolk, sizeWhite ]) => {
2421
+
2422
+ var n = mx_worley_noise_float( pos ).toVar();
2423
+ var whites = n.add( sizeWhite ).pow( 8 ).oneMinus();
2424
+ var yolks = n.add( sizeYolk ).pow( 18 ).oneMinus().clamp( 0, 1 );
2425
+
2426
+ var k = mix( 0, mix( 0, 1, yolks ), whites );
2427
+
2428
+ return pos.add( normal.mul( k ) );
2429
+
2430
+ } ).setLayout( {
2431
+ name: 'surfacePos',
2432
+ type: 'vec3',
2433
+ inputs: [
2434
+ { name: 'pos', type: 'vec3' },
2435
+ { name: 'normal', type: 'vec3' },
2436
+ { name: 'sizeYolk', type: 'float' },
2437
+ { name: 'sizeWhite', type: 'float' },
2438
+ ] }
2439
+ );
2440
+
2441
+
2442
+
2443
+ var runnyEggsRaw = Fn( ([ position, scale, sizeYolk, sizeWhite, colorYolk, colorWhite, colorBackground, seed ]) => {
2444
+
2445
+ var pos = position.mul( exp( scale ) ).add( seed.sin().mul( 10 ) ).toVar( );
2446
+
2447
+ var n = mx_worley_noise_float( pos ).toVar();
2448
+ var whites = n.add( sizeWhite.oneMinus() ).pow( 8 ).oneMinus().clamp( -0.5, 1 );
2449
+ var yolks = n.add( sizeYolk.oneMinus() ).pow( 18 ).oneMinus().clamp( 0, 1 ).pow( 0.4 ).clamp( 0, 1 );
2450
+
2451
+ return mix( colorBackground, mix( colorWhite, colorYolk, yolks ), whites );
2452
+
2453
+ } ).setLayout( {
2454
+ name: 'runnyEggsRaw',
2455
+ type: 'vec3',
2456
+ inputs: [
2457
+ { name: 'pos', type: 'vec3' },
2458
+ { name: 'normal', type: 'vec3' },
2459
+ { name: 'sizeYolk', type: 'float' },
2460
+ { name: 'sizeWhite', type: 'float' },
2461
+ { name: 'colorYolk', type: 'vec3' },
2462
+ { name: 'colorWhite', type: 'vec3' },
2463
+ { name: 'colorBackground', type: 'vec3' },
2464
+ { name: 'seed', type: 'float' },
2465
+ ] }
2466
+ );
2467
+
2468
+
2469
+
2470
+ var runnyEggsNormalRaw = Fn( ([ position, normal, tangent, scale, sizeYolk, sizeWhite, /*colorYolk, colorWhite, colorBackground,*/ seed ]) => {
2471
+
2472
+ const EPS = 0.001;
2473
+ const BUMP = 0.05;
2474
+
2475
+ var xposition = position.mul( exp( scale ) ).add( seed.sin().mul( 10 ) ).toVar( ),
2476
+ xnormal = normal.normalize().toVar(),
2477
+ xtangent = tangent.normalize().mul( EPS ).toVar(),
2478
+ bitangent = cross( xnormal, xtangent ).normalize().mul( EPS ).toVar();
2479
+
2480
+ var xSizeYolk = sizeYolk.oneMinus();
2481
+ var xSizeWhite = sizeWhite.oneMinus();
2482
+
2483
+ xnormal.mulAssign( BUMP );
2484
+
2485
+ var pos = surfacePos$4( xposition, xnormal, xSizeYolk, xSizeWhite );
2486
+ var posU = surfacePos$4( xposition.add( xtangent ), xnormal, xSizeYolk, xSizeWhite );
2487
+ var posV = surfacePos$4( xposition.add( bitangent ), xnormal, xSizeYolk, xSizeWhite );
2488
+
2489
+ return approximateNormal( pos, posU, posV );
2490
+
2491
+ } ).setLayout( {
2492
+ name: 'runnyEggsNormalRaw',
2493
+ type: 'vec3',
2494
+ inputs: [
2495
+ { name: 'position', type: 'vec3' },
2496
+ { name: 'normal', type: 'vec3' },
2497
+ { name: 'tangent', type: 'vec3' },
2498
+ { name: 'scale', type: 'float' },
2499
+ { name: 'sizeYolk', type: 'float' },
2500
+ { name: 'sizeWhite', type: 'float' },
2501
+ /*{ name: 'colorYolk', type: 'vec3' },*/
2502
+ /*{ name: 'colorWhite', type: 'vec3' },*/
2503
+ /*{ name: 'colorBackground', type: 'vec3' },*/
2504
+ { name: 'seed', type: 'float' },
2505
+ ] }
2506
+ );
2507
+
2508
+
2509
+
2510
+ var runnyEggsRoughnessRaw = Fn( ([ position, scale, sizeYolk, /*sizeWhite, colorYolk, colorWhite, colorBackground,*/ seed ]) => {
2511
+
2512
+ var pos = position.mul( exp( scale ) ).add( seed.sin().mul( 10 ) ).toVar( );
2513
+
2514
+ var n = mx_worley_noise_float( pos ).toVar();
2515
+ var yolks = n.add( sizeYolk.oneMinus() ).pow( 18 ).clamp( 0, 1 );
2516
+
2517
+ return yolks;
2518
+
2519
+ } ).setLayout( {
2520
+ name: 'runnyEggsRoughnessRaw',
2521
+ type: 'float',
2522
+ inputs: [
2523
+ { name: 'position', type: 'vec3' },
2524
+ { name: 'scale', type: 'float' },
2525
+ { name: 'sizeYolk', type: 'float' },
2526
+ /*{ name: 'sizeWhite', type: 'float' },*/
2527
+ /*{ name: 'colorYolk', type: 'vec3' },*/
2528
+ /*{ name: 'colorWhite', type: 'vec3' },*/
2529
+ /*{ name: 'colorBackground', type: 'vec3' },*/
2530
+ { name: 'seed', type: 'float' },
2531
+ ] }
2532
+ );
2533
+
2534
+
2535
+
2536
+ function runnyEggs( params={} ) {
2537
+
2538
+ var { position, scale, sizeYolk, sizeWhite, colorYolk, colorWhite, colorBackground, seed } = { ...defaults$p, ...params };
2539
+
2540
+ return runnyEggsRaw( position, scale, sizeYolk, sizeWhite, colorYolk, colorWhite, colorBackground, seed );
2541
+
2542
+ }
2543
+
2544
+
2545
+
2546
+ runnyEggs.normal = function ( params={} ) {
2547
+
2548
+ var { position, scale, sizeYolk, sizeWhite, /*colorYolk, colorWhite, colorBackground,*/ seed } = { ...defaults$p, ...params };
2549
+
2550
+ return runnyEggsNormalRaw( position, normalLocal, tangentLocal, scale, sizeYolk, sizeWhite, /*colorYolk, colorWhite, colorBackground,*/ seed );
2551
+
2552
+ };
2553
+
2554
+
2555
+
2556
+ runnyEggs.roughness = function ( params={} ) {
2557
+
2558
+ var { position, scale, sizeYolk, /*sizeWhite, colorYolk, colorWhite, colorBackground,*/ seed } = { ...defaults$p, ...params };
2559
+
2560
+ return runnyEggsRoughnessRaw( position, scale, sizeYolk, /*sizeWhite, colorYolk, colorWhite, colorBackground,*/ seed );
2561
+
2562
+ };
2563
+
2564
+
2565
+
2566
+ runnyEggs.defaults = defaults$p;
2567
+
2568
+ var defaults$o = {
2569
+ $name: 'rust',
2570
+
2571
+ position: positionGeometry,
2572
+ scale: 2,
2573
+ iterations: 8,
2574
+ amount: -0.3,
2575
+ opacity: 0.5,
2576
+ noise: 0.5,
2577
+ noiseScale: 0.5,
2578
+
2579
+ color: new Color( 0xC08000 ),
2580
+ background: new Color( 0x000020 ),
2581
+
2582
+ seed: 0,
2583
+ };
2584
+
2585
+
2586
+
2587
+ var _rust = Fn( ([ position, scale, iterations, amount, seed ])=>{
2588
+
2589
+ var pos = position.mul( exp( scale.div( 4 ).add( -1 ) ) ).add( seed ).toVar( );
2590
+
2591
+ var xamount = amount.mul( mx_noise_float( pos.mul( amount.div( 2 ).add( 4 ) ) ).add( 4 ) ).toVar();
2592
+
2593
+ var k = mx_noise_float( pos ).toVar();
2594
+
2595
+ Loop( iterations, ()=>{
2596
+
2597
+ pos.mulAssign( 2 );
2598
+ k.addAssign( mx_noise_float( pos ) );
2599
+
2600
+ } );
2601
+
2602
+ k.subAssign( mx_noise_float( pos.mul( 2 ) ).abs() );
2603
+
2604
+ k.assign( k.sub( xamount ).clamp( 0, 15 ) );
2605
+
2606
+ return k;
2607
+
2608
+ } ).setLayout( {
2609
+ name: '_rust',
2610
+ type: 'float',
2611
+ inputs: [
2612
+ { name: 'position', type: 'vec3' },
2613
+ { name: 'scale', type: 'float' },
2614
+ { name: 'iterations', type: 'int' },
2615
+ { name: 'amount', type: 'float' },
2616
+ { name: 'seed', type: 'float' },
2617
+ ] }
2618
+ );
2619
+
2620
+
2621
+ var rustRaw = Fn( ([ position, scale, iterations, amount, /*opacity,*/xnoise, noiseScale, color, background, seed ])=>{
2622
+
2623
+ var k = _rust( position, scale, iterations, amount, seed ).mul( 1.25 ).pow( 0.5 );
2624
+
2625
+ var pos = position.mul( exp( scale.add( noiseScale.mul( 3 ), 2 ) ) );
2626
+
2627
+ k.addAssign( xnoise.mul( mx_noise_float( pos ).abs().add( 0.1 ).pow( 2 ) ) );
2628
+
2629
+ return mix( color, background, k );
2630
+
2631
+ } ).setLayout( {
2632
+ name: 'rustRaw',
2633
+ type: 'vec3',
2634
+ inputs: [
2635
+ { name: 'position', type: 'vec3' },
2636
+ { name: 'scale', type: 'float' },
2637
+ { name: 'iterations', type: 'int' },
2638
+ { name: 'amount', type: 'float' },
2639
+ /*{ name: 'opacity', type: 'float' },*/
2640
+ { name: 'xnoise', type: 'float' },
2641
+ { name: 'noiseScale', type: 'float' },
2642
+ { name: 'color', type: 'vec3' },
2643
+ { name: 'background', type: 'vec3' },
2644
+ { name: 'seed', type: 'float' },
2645
+ ] }
2646
+ );
2647
+
2648
+
2649
+
2650
+
2651
+ var rustOpacityRaw = Fn( ([ position, scale, iterations, amount, opacity, /*xnoise, noiseScale, color, background,*/ seed ])=>{
2652
+
2653
+ var k = _rust( position, scale, iterations, amount, seed ).mul( opacity.add( 0.2 ) );
2654
+
2655
+ return k.oneMinus();
2656
+
2657
+ } ).setLayout( {
2658
+ name: 'rustOpacityRaw',
2659
+ type: 'float',
2660
+ inputs: [
2661
+ { name: 'position', type: 'vec3' },
2662
+ { name: 'scale', type: 'float' },
2663
+ { name: 'iterations', type: 'int' },
2664
+ { name: 'amount', type: 'float' },
2665
+ { name: 'opacity', type: 'float' },
2666
+ /*{ name: 'xnoise', type: 'float' },*/
2667
+ /*{ name: 'noiseScale', type: 'float' },*/
2668
+ /*{ name: 'color', type: 'vec3' },*/
2669
+ /*{ name: 'background', type: 'vec3' },*/
2670
+ { name: 'seed', type: 'float' },
2671
+ ] }
2672
+ );
2673
+
2674
+
2675
+
2676
+ function rust( params={} ) {
2677
+
2678
+ var { position, scale, iterations, amount, /*opacity,*/ noise, noiseScale, color, background, seed } = { ...defaults$o, ...params };
2679
+
2680
+ return rustRaw( position, scale, iterations, amount, /*opacity,*/noise, noiseScale, color, background, seed );
2681
+
2682
+ }
2683
+
2684
+
2685
+
2686
+ rust.opacity = function ( params={} ) {
2687
+
2688
+ var { position, scale, iterations, amount, opacity, /*xnoise, noiseScale, color, background,*/ seed } = { ...defaults$o, ...params };
2689
+
2690
+ return rustOpacityRaw( position, scale, iterations, amount, opacity, /*xnoise, noiseScale, color, background,*/ seed );
2691
+
2692
+ };
2693
+
2694
+
2695
+
2696
+ rust.defaults = defaults$o;
2697
+
2698
+ var defaults$n = {
2699
+ $name: 'Satin',
2700
+
2701
+ position: positionGeometry,
2702
+ scale: 2,
2703
+
2704
+ color: new Color( 0x7080FF ),
2705
+ background: new Color( 0x000050 ),
2706
+
2707
+ seed: 0,
2708
+ };
2709
+
2710
+
2711
+
2712
+ var satinRaw = Fn( ([ position, scale, color, background, seed ]) => {
2713
+
2714
+ var pos = position.toVar( 'pos' ),
2715
+ scale = scale.div( 3 ).exp( ).toVar( 'xscale' );
2716
+
2717
+ var k = mx_noise_float(
2718
+ vec3(
2719
+ mx_noise_float( vec3( pos.x.mul( 2 ), pos.y, pos.z ).mul( scale ) ),
2720
+ mx_noise_float( vec3( pos.x, pos.y.mul( 2 ), pos.z ).mul( scale ) ),
2721
+ mx_noise_float( vec3( pos.x, pos.y, pos.z.mul( 2 ) ).mul( scale ) ),
2722
+ ).mul( scale ).add( seed )
2723
+ ).abs().pow( 3 ).mul( 20 ).toVar( 'k' );
2724
+
2725
+ return mix( background, color, k );
2726
+
2727
+ } ).setLayout( {
2728
+ name: 'satinRaw',
2729
+ type: 'vec3',
2730
+ inputs: [
2731
+ { name: 'position', type: 'vec3' },
2732
+ { name: 'scale', type: 'float' },
2733
+ { name: 'color', type: 'vec3' },
2734
+ { name: 'background', type: 'vec3' },
2735
+ { name: 'seed', type: 'float' },
2736
+ ] }
2737
+ );
2738
+
2739
+
2740
+
2741
+ function satin( params={} ) {
2742
+
2743
+ var { position, scale, color, background, seed } = { ...defaults$n, ...params };
2744
+
2745
+ return satinRaw( position, scale, color, background, seed );
2746
+
2747
+ }
2748
+
2749
+
2750
+
2751
+ satin.defaults = defaults$n;
2752
+
2753
+ var defaults$m = {
2754
+ $name: 'Scaler',
2755
+ $positionNode: true,
2756
+ $selectorPlanar: true,
2757
+
2758
+ scales: new Vector3( 0.01, 0.9, 1.7 ),
2759
+ center: new Vector3( 0, 0, 0 ),
2760
+
2761
+ selectorCenter: new Vector3( 0, 0, 0 ),
2762
+ selectorAngles: new Vector2( 0, 0 ),
2763
+ selectorWidth: 2,
2764
+
2765
+ };
2766
+
2767
+
2768
+
2769
+ var surfacePos$3 = Fn( ([ pos, scales, center, selectorAngles, selectorCenter, selectorWidth ])=>{
2770
+
2771
+ var zone = selectPlanar( pos, selectorAngles, selectorCenter, selectorWidth );
2772
+
2773
+ var S = mix( vec3( 1, 1, 1 ), scales, zone );
2774
+
2775
+ return pos.sub( center ).mul( S ).add( center );
2776
+
2777
+ } );
2778
+
2779
+
2780
+
2781
+ var scalerRaw = Fn( ([ scales, center, selectorAngles, selectorCenter, selectorWidth ])=>{
2782
+
2783
+ return surfacePos$3( positionGeometry, scales, center, selectorAngles, selectorCenter, selectorWidth );
2784
+
2785
+ } ).setLayout( {
2786
+ name: 'scalerRaw',
2787
+ type: 'vec3',
2788
+ inputs: [
2789
+ { name: 'scales', type: 'vec3' },
2790
+ { name: 'center', type: 'vec3' },
2791
+ { name: 'selectorAngles', type: 'vec2' },
2792
+ { name: 'selectorCenter', type: 'vec3' },
2793
+ { name: 'selectorWidth', type: 'float' },
2794
+ ]
2795
+ } );
2796
+
2797
+
2798
+
2799
+ var scalerNormalRaw = Fn( ([ scales, center, selectorAngles, selectorCenter, selectorWidth ]) => {
2800
+
2801
+ var EPS = 0.01;
2802
+
2803
+ var position = positionGeometry,
2804
+ normal = normalLocal.normalize().toVar(),
2805
+ tangent = tangentLocal.normalize().mul( EPS ).toVar(),
2806
+ bitangent = cross( normal, tangent ).normalize().mul( EPS ).toVar();
2807
+
2808
+ var pos = surfacePos$3( position, scales, center, selectorAngles, selectorCenter, selectorWidth );
2809
+ var posU = surfacePos$3( position.add( tangent ), scales, center, selectorAngles, selectorCenter, selectorWidth );
2810
+ var posV = surfacePos$3( position.add( bitangent ), scales, center, selectorAngles, selectorCenter, selectorWidth );
2811
+
2812
+ return approximateNormal( pos, posU, posV );
2813
+
2814
+ } ).setLayout( {
2815
+ name: 'scalerNormalRaw',
2816
+ type: 'vec3',
2817
+ inputs: [
2818
+ { name: 'scales', type: 'vec3' },
2819
+ { name: 'center', type: 'vec3' },
2820
+ { name: 'selectorAngles', type: 'vec2' },
2821
+ { name: 'selectorCenter', type: 'vec3' },
2822
+ { name: 'selectorWidth', type: 'float' },
2823
+ ]
2824
+ } );
2825
+
2826
+
2827
+
2828
+ function scaler( params={} ) {
2829
+
2830
+ var { scales, center, selectorAngles, selectorCenter, selectorWidth } = { ...defaults$m, ...params };
2831
+
2832
+ return scalerRaw( scales, center, selectorAngles, selectorCenter, selectorWidth );
2833
+
2834
+ }
2835
+
2836
+
2837
+
2838
+ scaler.normal = function ( params={} ) {
2839
+
2840
+ var { scales, center, selectorAngles, selectorCenter, selectorWidth } = { ...defaults$m, ...params };
2841
+
2842
+ return scalerNormalRaw( scales, center, selectorAngles, selectorCenter, selectorWidth );
2843
+
2844
+ };
2845
+
2846
+
2847
+
2848
+ scaler.defaults = defaults$m;
2849
+
2850
+ var defaults$l = {
2851
+ $name: 'Scepter head',
2852
+
2853
+ position: positionGeometry,
2854
+
2855
+ xFactor: 10,
2856
+ yFactor: 22,
2857
+ zFactor: 10,
2858
+
2859
+ colorRim: new Color( 0xFFFFFF ),
2860
+ colorA: new Color( 0x70E0FF ),
2861
+ colorB: new Color( 0x3000FF ),
2862
+ };
2863
+
2864
+
2865
+
2866
+ var scepterHeadRaw = Fn( ([ position, xFactor, yFactor, zFactor, colorRim, colorA, colorB ]) => {
2867
+
2868
+ var pos = position.toVar( 'pos' );
2869
+
2870
+ var fx = pos.x.mul( remapExp( xFactor, 0, 100, 1.35, 30 ) ).toVar( 'fx' ),
2871
+ fy = pos.y.mul( remapExp( yFactor, 0, 100, 1.35, 30 ) ).toVar( 'fy' ),
2872
+ fz = pos.z.mul( remapExp( zFactor, 0, 100, 1.35, 30 ) ).toVar( 'fz' );
2873
+
2874
+ var cosX = cos( fx ),
2875
+ cosY = cos( fy ),
2876
+ cosZ = cos( fz );
2877
+
2878
+ var k = mx_noise_float( vec3( pos.x.div( cosX ), pos.y.div( cosY ), pos.z.div( cosZ ) ) );
2879
+
2880
+ k = sign( k ).mul( abs( k ).pow( 0.75 ) );
2881
+
2882
+ var dx = abs( mul( fx, tan( fx ) ).add( 1 ).div( cosX ) ),
2883
+ dy = abs( mul( fy, tan( fy ) ).add( 1 ).div( cosY ) ),
2884
+ dz = abs( mul( fz, tan( fz ) ).add( 1 ).div( cosZ ) );
2885
+
2886
+ var HSL = vec3().toVar();
2887
+
2888
+ var indexX = ( abs( floor( ( fx.mul( 2/Math.PI ).add( 1 ) ).div( 2 ) ) ) ),
2889
+ indexY = ( abs( floor( ( fy.mul( 2/Math.PI ).add( 1 ) ).div( 2 ) ) ) ),
2890
+ indexZ = ( abs( floor( ( fz.mul( 2/Math.PI ).add( 1 ) ).div( 2 ) ) ) );
2891
+
2892
+ var index = mod( ( add( indexX, indexY, indexZ ) ), 2 );
2893
+
2894
+ HSL.assign( toHsl( mix( colorA, colorB, index ) ) );
2895
+ var color1 = hsl( vec3( HSL.xy, HSL.z.mul( k ) ) ).toVar( 'color1' );
2896
+
2897
+ HSL.assign( toHsl( colorRim ) );
2898
+ var color2 = hsl( vec3( HSL.xy, mul( 2, k, HSL.z ) ) ).toVar( 'color2' );
2899
+
2900
+ return mix( color1, color2, remapClamp( max( dx, max( dy, dz ) ), 55-10, 55+10 ) );
2901
+
2902
+ } ).setLayout( {
2903
+ name: 'scepterHeadRaw',
2904
+ type: 'vec3',
2905
+ inputs: [
2906
+ { name: 'position', type: 'vec3' },
2907
+ { name: 'xFactor', type: 'float' },
2908
+ { name: 'yFactor', type: 'float' },
2909
+ { name: 'zFactor', type: 'float' },
2910
+ { name: 'colorRim', type: 'vec3' },
2911
+ { name: 'colorA', type: 'vec3' },
2912
+ { name: 'colorB', type: 'vec3' },
2913
+ ] }
2914
+ );
2915
+
2916
+
2917
+
2918
+ function scepterHead( params={} ) {
2919
+
2920
+ var { position, xFactor, yFactor, zFactor, colorRim, colorA, colorB } = { ...defaults$l, ...params };
2921
+
2922
+ return scepterHeadRaw( position, xFactor, yFactor, zFactor, colorRim, colorA, colorB );
2923
+
2924
+ }
2925
+
2926
+
2927
+
2928
+ scepterHead.defaults = defaults$l;
2929
+
2930
+ var defaults$k = {
2931
+ $name: 'Scream',
2932
+
2933
+ position: positionGeometry,
2934
+ scale: 2,
2935
+ variety: 1,
2936
+
2937
+ color: new Color( 0xF0F060 ),
2938
+ background: new Color( 0xD09090 ),
2939
+
2940
+ seed: 0,
2941
+ };
2942
+
2943
+
2944
+
2945
+ var screamRaw = Fn( ([ position, scale, variety, color, background, seed ]) => {
2946
+
2947
+ var pos = position.mul( exp( scale ) ).add( seed ).toVar( 'pos' );
2948
+
2949
+ var k = mx_noise_float( add( sin( pos.xyz ), cos( pos.yzx ) ) );
2950
+
2951
+ pos.assign( position.mul( exp( scale ).mul( k ) ).add( seed ) );
2952
+
2953
+ var k = mx_noise_float( add( sin( pos.xyz ), cos( pos.yzx ) ).mul( 2 ) );
2954
+
2955
+ var col = mix( background, color, k ).toVar( 'col' );
2956
+
2957
+ var HSL = toHsl( col ).toVar( 'HSL' );
2958
+
2959
+ return hsl( vec3( add( HSL.x, variety.mul( sin( k.mul( Math.PI ) ) ).mul( 0.5 ) ), HSL.yz ) );
2960
+
2961
+ } ).setLayout( {
2962
+ name: 'satinRaw',
2963
+ type: 'vec3',
2964
+ inputs: [
2965
+ { name: 'position', type: 'vec3' },
2966
+ { name: 'scale', type: 'float' },
2967
+ { name: 'variety', type: 'float' },
2968
+ { name: 'color', type: 'vec3' },
2969
+ { name: 'background', type: 'vec3' },
2970
+ { name: 'seed', type: 'float' },
2971
+ ] }
2972
+ );
2973
+
2974
+
2975
+
2976
+ function scream( params={} ) {
2977
+
2978
+ var { position, scale, variety, color, background, seed } = { ...defaults$k, ...params };
2979
+
2980
+ return screamRaw( position, scale, variety, color, background, seed );
2981
+
2982
+ }
2983
+
2984
+
2985
+
2986
+ scream.defaults = defaults$k;
2987
+
2988
+ var defaults$j = {
2989
+ $name: 'Stars',
2990
+
2991
+ position: positionGeometry,
2992
+ scale: 2,
2993
+ density: 2,
2994
+ variation: 0,
2995
+
2996
+ color: new Color( 0xfff5f0 ),
2997
+ background: new Color( 0x000060 ),
2998
+
2999
+ seed: 0,
3000
+ };
3001
+
3002
+
3003
+
3004
+ var starsRaw = Fn( ([ position, scale, density, variation, color, background, seed ]) => {
3005
+
3006
+ var pos = position.mul( exp( scale.div( 2 ).add( 3 ) ) ).add( seed ).toVar( );
3007
+
3008
+ var k = abs( mx_noise_float( pos ) ).pow( 10 ).mul( 10 );
3009
+
3010
+ k = k.mul( exp( density.sub( 2 ) ) );
3011
+
3012
+ var dS = select( k.greaterThan( 0.1 ), variation.mul( mx_noise_float( pos ) ), 0 );
3013
+
3014
+ var col = toHsl( mix( background, color, k ) );
3015
+
3016
+ return hsl( vec3( add( col.x, dS ), col.yz ) );
3017
+
3018
+ } ).setLayout( {
3019
+ name: 'starsRaw',
3020
+ type: 'vec3',
3021
+ inputs: [
3022
+ { name: 'position', type: 'vec3' },
3023
+ { name: 'scale', type: 'float' },
3024
+ { name: 'density', type: 'float' },
3025
+ { name: 'variation', type: 'float' },
3026
+ { name: 'color', type: 'vec3' },
3027
+ { name: 'background', type: 'vec3' },
3028
+ { name: 'seed', type: 'float' },
3029
+ ] }
3030
+ );
3031
+
3032
+
3033
+
3034
+ function stars( params={} ) {
3035
+
3036
+ var { position, scale, density, variation, color, background, seed } = { ...defaults$j, ...params };
3037
+
3038
+ return starsRaw( position, scale, density, variation, color, background, seed );
3039
+
3040
+ }
3041
+
3042
+
3043
+
3044
+ stars.defaults = defaults$j;
3045
+
3046
+ var defaults$i = {
3047
+ $name: 'Static noise',
3048
+
3049
+ position: screenCoordinate,
3050
+ time: time,
3051
+
3052
+ scale: 2,
3053
+ balance: 0,
3054
+ contrast: 0,
3055
+
3056
+ delay: 0,
3057
+
3058
+ seed: 0,
3059
+ };
3060
+
3061
+
3062
+
3063
+ var staticNoiseRaw = Fn( ([ position, time, scale, balance, contrast, delay, seed ]) => {
3064
+
3065
+ var pos = position.div( exp( scale ) ).add( seed );
3066
+
3067
+ var speed = delay.sub( 1 ).mul( 5 ).exp(),
3068
+ t = time.div( speed ).round().mul( speed );
3069
+
3070
+ var offset = vnoise( t.sin() ).mul( 1000 );
3071
+
3072
+ var k = mx_noise_float( pos.add( offset ) ).min( 1 );
3073
+
3074
+ k = k.mul( 0.5, exp( contrast ) ).add( 0.5, balance );
3075
+
3076
+ return vec3( k );
3077
+
3078
+ } ).setLayout( {
3079
+ name: 'staticNoiseRaw',
3080
+ type: 'vec3',
3081
+ inputs: [
3082
+ { name: 'position', type: 'vec2' },
3083
+ { name: 'time', type: 'float' },
3084
+ { name: 'scale', type: 'float' },
3085
+ { name: 'balance', type: 'float' },
3086
+ { name: 'contrast', type: 'float' },
3087
+ { name: 'delay', type: 'float' },
3088
+ { name: 'seed', type: 'float' },
3089
+ ] }
3090
+ );
3091
+
3092
+
3093
+
3094
+ function staticNoise( params={} ) {
3095
+
3096
+ var { position, time, scale, balance, contrast, delay, seed } = { ...defaults$i, ...params };
3097
+
3098
+ return staticNoiseRaw( position, time, scale, balance, contrast, delay, seed );
3099
+
3100
+ }
3101
+
3102
+
3103
+
3104
+ staticNoise.defaults = defaults$i;
3105
+
3106
+ var defaults$h = {
3107
+ $name: 'Supersphere',
3108
+ $positionNode: true,
3109
+
3110
+ exponent: 3,
3111
+
3112
+ };
3113
+
3114
+
3115
+
3116
+ var surfacePos$2 = Fn( ([ pos, exponent ])=>{
3117
+
3118
+ var xexponent = float( 2 ).pow( exponent );
3119
+ var equPos = pos.div( pos.length() ).toVar();
3120
+ var equPos2 = equPos.abs().pow( xexponent ).toVar();
3121
+
3122
+ var p = equPos2.x
3123
+ .add( equPos2.y )
3124
+ .add( equPos2.z )
3125
+ .pow( xexponent.reciprocal( ) );
3126
+
3127
+ return equPos.div( p );
3128
+
3129
+ } ).setLayout( {
3130
+ name: 'surfacePos',
3131
+ type: 'vec3',
3132
+ inputs: [
3133
+ { name: 'pos', type: 'vec3' },
3134
+ { name: 'exponent', type: 'float' },
3135
+ ]
3136
+ } );
3137
+
3138
+
3139
+
3140
+ var supersphereRaw = Fn( ([ exponent ])=>{
3141
+
3142
+ return surfacePos$2( positionGeometry, exponent );
3143
+
3144
+ } ).setLayout( {
3145
+ name: 'supersphereRaw',
3146
+ type: 'vec3',
3147
+ inputs: [
3148
+ { name: 'exponent', type: 'float' },
3149
+ ]
3150
+ } );
3151
+
3152
+
3153
+
3154
+ var supersphereNormalRaw = Fn( ([ exponent ]) => {
3155
+
3156
+ const EPS = 0.01;
3157
+
3158
+ var position = positionGeometry,
3159
+ normal = normalLocal.normalize().toVar(),
3160
+ tangent = tangentLocal.normalize().mul( EPS ).toVar(),
3161
+ bitangent = cross( normal, tangent ).normalize().mul( EPS ).toVar();
3162
+
3163
+ var pos = surfacePos$2( position, exponent );
3164
+ var posU = surfacePos$2( position.add( tangent ), exponent );
3165
+ var posV = surfacePos$2( position.add( bitangent ), exponent );
3166
+
3167
+ return approximateNormal( pos, posU, posV );
3168
+
3169
+ } ).setLayout( {
3170
+ name: 'supersphereRaw',
3171
+ type: 'vec3',
3172
+ inputs: [
3173
+ { name: 'exponent', type: 'float' },
3174
+ ]
3175
+ } );
3176
+
3177
+
3178
+
3179
+ function supersphere( params={} ) {
3180
+
3181
+ var { exponent } = { ...defaults$h, ...params };
3182
+
3183
+ return supersphereRaw( exponent );
3184
+
3185
+ }
3186
+
3187
+
3188
+
3189
+ supersphere.normal = function ( params={} ) {
3190
+
3191
+ var { exponent } = { ...defaults$h, ...params };
3192
+
3193
+ return supersphereNormalRaw( exponent );
3194
+
3195
+ };
3196
+
3197
+
3198
+
3199
+ supersphere.defaults = defaults$h;
3200
+
3201
+ var defaults$g = {
3202
+ $name: 'Tiger fur',
3203
+
3204
+ position: positionGeometry,
3205
+ scale: 2,
3206
+ lengths: 4,
3207
+ blur: 0.3,
3208
+ strength: 0.3,
3209
+ hairs: 0.5,
3210
+
3211
+ color: new Color( 0xFFAA00 ),
3212
+ bottomColor: new Color( 0xFFFFEE ),
3213
+
3214
+ seed: 0,
3215
+ };
3216
+
3217
+
3218
+
3219
+ var tigerFurRaw = Fn( ([ position, scale, lengths, blur, strength, hairs, color, bottomColor, seed ])=>{
3220
+
3221
+ var xscale = scale.div( 2 ).add( 1 ).toVar();
3222
+ var pos = position.mul( exp( xscale ) ).add( seed ).toVar( );
3223
+
3224
+ var len = lengths.add( 5 ).reciprocal().toVar();
3225
+ var hairs = hairs.mul( 0.3 ).toVar();
3226
+ var k = mx_noise_float( pos.mul( xscale, vec3( 1, len, len ) ) );
3227
+ k = k.add( mx_noise_float( pos.mul( vec3( 25, 1, 1 ) ) ).add( 1 ).mul( hairs ) );
3228
+ k = k.add( strength.sub( 0.5 ) ).smoothstep( blur.negate(), blur ).oneMinus();
3229
+
3230
+ var n = position.y.add( hairs.sub( 0.5 ) ).smoothstep( -1, 0.5 );
3231
+
3232
+ return mix( bottomColor, color, n ).mul( k );
3233
+
3234
+ } ).setLayout( {
3235
+ name: 'tigerFurRaw',
3236
+ type: 'vec3',
3237
+ inputs: [
3238
+ { name: 'position', type: 'vec3' },
3239
+ { name: 'scale', type: 'float' },
3240
+ { name: 'lengths', type: 'float' },
3241
+ { name: 'blur', type: 'float' },
3242
+ { name: 'strength', type: 'float' },
3243
+ { name: 'hairs', type: 'float' },
3244
+ { name: 'color', type: 'vec3' },
3245
+ { name: 'bottomColor', type: 'vec3' },
3246
+ { name: 'seed', type: 'float' },
3247
+ ] }
3248
+ );
3249
+
3250
+
3251
+
3252
+ function tigerFur( params={} ) {
3253
+
3254
+ var { position, scale, lengths, blur, strength, hairs, color, bottomColor, seed } = { ...defaults$g, ...params };
3255
+
3256
+ return tigerFurRaw( position, scale, lengths, blur, strength, hairs, color, bottomColor, seed );
3257
+
3258
+ }
3259
+
3260
+
3261
+
3262
+ tigerFur.defaults = defaults$g;
3263
+
3264
+ var defaults$f = {
3265
+ $name: 'Translator',
3266
+ $positionNode: true,
3267
+ $selectorPlanar: true,
3268
+
3269
+ distance: new Vector3( -0.5, 0, 0.2 ),
3270
+
3271
+ selectorCenter: new Vector3( 0, 0, 0 ),
3272
+ selectorAngles: new Vector2( 0, 0 ),
3273
+ selectorWidth: 0.7,
3274
+
3275
+ };
3276
+
3277
+
3278
+
3279
+ var surfacePos$1 = Fn( ([ pos, distance, selectorAngles, selectorCenter, selectorWidth ])=>{
3280
+
3281
+ var zone = selectPlanar( pos, selectorAngles, selectorCenter, selectorWidth );
3282
+
3283
+ return pos.add( distance.mul( zone ) );
3284
+
3285
+ } ).setLayout( {
3286
+ name: 'surfacePos',
3287
+ type: 'vec3',
3288
+ inputs: [
3289
+ { name: 'pos', type: 'vec3' },
3290
+ { name: 'distance', type: 'vec3' },
3291
+ { name: 'selectorAngles', type: 'vec2' },
3292
+ { name: 'selectorCenter', type: 'vec3' },
3293
+ { name: 'selectorWidth', type: 'float' },
3294
+ ]
3295
+ } );
3296
+
3297
+
3298
+
3299
+ var translatorRaw = Fn( ([ distance, selectorAngles, selectorCenter, selectorWidth ])=>{
3300
+
3301
+ return surfacePos$1( positionGeometry, distance, selectorAngles, selectorCenter, selectorWidth );
3302
+
3303
+ } ).setLayout( {
3304
+ name: 'translatorRaw',
3305
+ type: 'vec3',
3306
+ inputs: [
3307
+ { name: 'distance', type: 'vec3' },
3308
+ { name: 'selectorAngles', type: 'vec2' },
3309
+ { name: 'selectorCenter', type: 'vec3' },
3310
+ { name: 'selectorWidth', type: 'float' },
3311
+ ]
3312
+ } );
3313
+
3314
+
3315
+
3316
+ var translatorNormalRaw = Fn( ([ distance, selectorAngles, selectorCenter, selectorWidth ])=>{
3317
+
3318
+ var EPS = 0.01;
3319
+
3320
+ var position = positionGeometry,
3321
+ normal = normalLocal.normalize().toVar(),
3322
+ tangent = tangentLocal.normalize().mul( EPS ).toVar(),
3323
+ bitangent = cross( normal, tangent ).normalize().mul( EPS ).toVar();
3324
+
3325
+ var pos = surfacePos$1( position, distance, selectorAngles, selectorCenter, selectorWidth );
3326
+ var posU = surfacePos$1( position.add( tangent ), distance, selectorAngles, selectorCenter, selectorWidth );
3327
+ var posV = surfacePos$1( position.add( bitangent ), distance, selectorAngles, selectorCenter, selectorWidth );
3328
+
3329
+ return approximateNormal( pos, posU, posV );
3330
+
3331
+ } ).setLayout( {
3332
+ name: 'translatorNormalRaw',
3333
+ type: 'vec3',
3334
+ inputs: [
3335
+ { name: 'distance', type: 'vec3' },
3336
+ { name: 'selectorAngles', type: 'vec2' },
3337
+ { name: 'selectorCenter', type: 'vec3' },
3338
+ { name: 'selectorWidth', type: 'float' },
3339
+ ]
3340
+ } );
3341
+
3342
+
3343
+
3344
+ function translator( params={} ) {
3345
+
3346
+ var { distance, selectorAngles, selectorCenter, selectorWidth } = { ...defaults$f, ...params };
3347
+
3348
+ return translatorRaw( distance, selectorAngles, selectorCenter, selectorWidth );
3349
+
3350
+ }
3351
+
3352
+
3353
+
3354
+ translator.normal = function ( params={} ) {
3355
+
3356
+ var { distance, selectorAngles, selectorCenter, selectorWidth } = { ...defaults$f, ...params };
3357
+
3358
+ return translatorNormalRaw( distance, selectorAngles, selectorCenter, selectorWidth );
3359
+
3360
+ };
3361
+
3362
+
3363
+
3364
+ translator.defaults = defaults$f;
3365
+
3366
+ var defaults$e = {
3367
+ $name: 'Voronoi cells',
3368
+
3369
+ position: positionGeometry,
3370
+ scale: 2,
3371
+ variation: 0,
3372
+ facet: 0,
3373
+
3374
+ color: new Color( 0 ),
3375
+ background: new Color( 0xc0d0ff ),
3376
+
3377
+ seed: 0,
3378
+ };
3379
+
3380
+
3381
+
3382
+ var voronoiCellsRaw = Fn( ([ position, scale, variation, facet, color, background, seed ])=>{
3383
+
3384
+ var pos = position.mul( exp( scale.div( 2 ).add( 0.5 ) ) ).add( seed ).toVar( );
3385
+
3386
+ var midCell = pos.round().toVar();
3387
+
3388
+ var minCell = midCell.toVar();
3389
+ var minDist = float( 1 ).toVar();
3390
+
3391
+ var cell = vec3().toVar();
3392
+ var dist = float().toVar();
3393
+
3394
+ var i=int( 0 ).toVar( 'i' ),
3395
+ j=int( 0 ).toVar( 'j' ),
3396
+ k=int( 0 ).toVar( 'k' );
3397
+
3398
+ // Loop uses hard-coded i, j, k as indices
3399
+ Loop( 3, 3, 3, () => {
3400
+
3401
+ cell.assign( midCell.add( vec3( i, j, k ).sub( 1 ) ) );
3402
+ //var cellCenter = cell.add( noise( cell.mul( Math.PI ) ) ); // too slow on WebGL2
3403
+ var cellCenter = cell.add( vnoise( cell.mul( Math.PI*2 ) ).div( 2 ) );
3404
+ dist.assign( pos.distance( cellCenter ) );
3405
+
3406
+ If( dist.lessThan( minDist ), ()=>{
3407
+
3408
+ minDist.assign( dist );
3409
+ minCell.assign( cell );
3410
+
3411
+ } );
3412
+
3413
+ } );
3414
+
3415
+ var n = mx_noise_float( minCell.mul( Math.PI ) ).toVar();
3416
+ var m = mix( minDist, n.add( 1 ).div( 2 ), facet );
3417
+
3418
+ var color = mix( color, background, m ).toVar();
3419
+ var randomColor = vec3( n.mul( 16.8 ), n.mul( 31.4159 ), n.mul( 27.1828 ) ).sin().add( 1 ).div( 2 );
3420
+
3421
+ return mix( color, mix( color, randomColor, variation ), variation );
3422
+
3423
+ } ).setLayout( {
3424
+ name: 'voronoiCellsRaw',
3425
+ type: 'vec3',
3426
+ inputs: [
3427
+ { name: 'position', type: 'vec3' },
3428
+ { name: 'scale', type: 'float' },
3429
+ { name: 'variation', type: 'float' },
3430
+ { name: 'facet', type: 'float' },
3431
+ { name: 'color', type: 'vec3' },
3432
+ { name: 'background', type: 'vec3' },
3433
+ { name: 'seed', type: 'float' },
3434
+ ] }
3435
+ );
3436
+
3437
+
3438
+
3439
+ function voronoiCells( params={} ) {
3440
+
3441
+ var { position, scale, variation, facet, color, background, seed } = { ...defaults$e, ...params };
3442
+
3443
+ return voronoiCellsRaw( position, scale, variation, facet, color, background, seed );
3444
+
3445
+ }
3446
+
3447
+
3448
+
3449
+ voronoiCells.defaults = defaults$e;
3450
+
3451
+ var defaults$d = {
3452
+ $name: 'Water Drops',
3453
+ $normalNode: true,
3454
+
3455
+ position: positionGeometry,
3456
+
3457
+ scale: 1.4,
3458
+ density: 0.5,
3459
+ bump: 0.6,
3460
+
3461
+ seed: 0,
3462
+ };
3463
+
3464
+
3465
+
3466
+ var surfacePos = Fn( ([ pos, normal, density ]) => {
3467
+
3468
+ var k = mx_noise_float( pos, 1, density ).clamp( 0, 1 );
3469
+ k = cos( k.mul( Math.PI ) ).add( 1 ).pow( 0.5 ).toVar();
3470
+
3471
+ return pos.add( normal.mul( k ) );
3472
+
3473
+ } ).setLayout( {
3474
+ name: 'surfacePos',
3475
+ type: 'vec3',
3476
+ inputs: [
3477
+ { name: 'position', type: 'vec3' },
3478
+ { name: 'normal', type: 'vec3' },
3479
+ { name: 'density', type: 'float' },
3480
+ ] }
3481
+ );
3482
+
3483
+
3484
+
3485
+ var waterDropsRaw = Fn( ([ position, normal, tangent, scale, density, bump, seed ]) => {
3486
+
3487
+ var EPS = 0.001;
3488
+
3489
+ var seed3d = vec3( 1, 2, 3 ).mul( seed ).sin().mul( 100 ).toVar( );
3490
+
3491
+ var xposition = position.mul( exp( scale.div( 1 ).add( 1 ) ) ).add( seed3d ).toVar( ),
3492
+ xnormal = normal.normalize().toVar(),
3493
+ xtangent = tangent.normalize().mul( EPS ).toVar(),
3494
+ xbitangent = cross( xnormal, xtangent ).normalize().mul( EPS ).toVar();
3495
+
3496
+ var xdensity = remap( density, 0, 1, 1.5, 0.7 ).toVar();
3497
+
3498
+ xnormal.mulAssign( bump );
3499
+
3500
+ var pos = surfacePos( xposition, xnormal, xdensity ),
3501
+ posU = surfacePos( xposition.add( xtangent ), xnormal, xdensity ),
3502
+ posV = surfacePos( xposition.add( xbitangent ), xnormal, xdensity );
3503
+
3504
+ return approximateNormal( pos, posU, posV );
3505
+
3506
+ } ).setLayout( {
3507
+ name: 'waterDropsRaw',
3508
+ type: 'vec3',
3509
+ inputs: [
3510
+ { name: 'position', type: 'vec3' },
3511
+ { name: 'normal', type: 'vec3' },
3512
+ { name: 'tangent', type: 'vec3' },
3513
+ { name: 'scale', type: 'float' },
3514
+ { name: 'density', type: 'float' },
3515
+ { name: 'bump', type: 'float' },
3516
+ { name: 'seed', type: 'float' },
3517
+ ] }
3518
+ );
3519
+
3520
+
3521
+
3522
+ function waterDrops( params={} ) {
3523
+
3524
+ var { position, scale, density, bump, seed } = { ...defaults$d, ...params };
3525
+
3526
+ return waterDropsRaw( position, normalLocal, tangentLocal, scale, density, bump, seed );
3527
+
3528
+ }
3529
+
3530
+
3531
+
3532
+ waterDrops.defaults = defaults$d;
3533
+
3534
+ var defaults$c = {
3535
+ $name: 'Watermelon',
3536
+ $replaceExportUVS: screenUV,
3537
+
3538
+ position: positionGeometry,
3539
+ uvs: equirectUV( positionGeometry.normalize() ),
3540
+
3541
+ scale: 2,
3542
+ stripes: 12,
3543
+ variation: 0.5,
3544
+ noise: 0.25,
3545
+
3546
+ color: new Color( 'yellowgreen' ),
3547
+ background: new Color( 'darkgreen' ),
3548
+
3549
+ seed: 0,
3550
+ };
3551
+
3552
+
3553
+
3554
+ var watermelonRaw = Fn( ([ position, uvs, scale, stripes, variation, xnoise, color, background, seed ])=>{
3555
+
3556
+ var pos = position.mul( exp( scale.div( 4 ).add( 2 ) ) ).add( seed ).toVar( );
3557
+
3558
+ var a = uvs.x.mul( stripes, 2*Math.PI ).add( mx_noise_float( pos.mul( vec3( 1, 0.3, 1 ) ) ).mul( 2 ) );
3559
+
3560
+ 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 ) )
3561
+ .add( variation.mul( 2, mx_noise_float( pos.mul( 1.5 ) ).div( 2 ) ) )
3562
+ .add( variation.mul( 2, mx_noise_float( pos.mul( 4 ) ).div( 6 ) ) )
3563
+ .toVar();
3564
+
3565
+ k.assign(
3566
+ k.mix( k.round(), 0.75 )
3567
+ .add( mx_noise_float( pos.mul( 2 ) ).mul( xnoise, 0.5 ) )
3568
+ .add( mx_noise_float( pos.mul( 3 ) ).mul( xnoise, 1 ) )
3569
+ .add( mx_noise_float( pos.mul( 15 ) ).mul( xnoise, 0.2 ) )
3570
+ .clamp( 0, 1 )
3571
+ );
3572
+
3573
+ var color = mix( background, color, k ).toVar();
3574
+
3575
+ return color;
3576
+
3577
+ } ).setLayout( {
3578
+ name: 'watermelonRaw',
3579
+ type: 'vec3',
3580
+ inputs: [
3581
+ { name: 'position', type: 'vec3' },
3582
+ { name: 'uvs', type: 'vec2' },
3583
+ { name: 'scale', type: 'float' },
3584
+ { name: 'stripes', type: 'int' },
3585
+ { name: 'variation', type: 'float' },
3586
+ { name: 'xnoise', type: 'float' },
3587
+ { name: 'color', type: 'vec3' },
3588
+ { name: 'background', type: 'vec3' },
3589
+ { name: 'seed', type: 'float' },
3590
+ ] }
3591
+ );
3592
+
3593
+
3594
+
3595
+ function watermelon( params={} ) {
3596
+
3597
+ var { position, uvs, scale, stripes, variation, noise, color, background, seed } = { ...defaults$c, ...params };
3598
+
3599
+ return watermelonRaw( position, uvs, scale, stripes, variation, noise, color, background, seed );
3600
+
3601
+ }
3602
+
3603
+
3604
+
3605
+ watermelon.defaults = defaults$c;
3606
+
3607
+ var defaults$b = {
3608
+ $name: 'Waves',
3609
+
3610
+ position: positionGeometry,
3611
+ scale: 2,
3612
+ speed: 0,
3613
+ time: time,
3614
+ level: -0.4,
3615
+ rough: 10,
3616
+ height: 0.5,
3617
+
3618
+ foamSize: 0.2,
3619
+ foamEdge: 0.5,
3620
+
3621
+ color: new Color( 0xFFFFFF ),
3622
+ background: new Color( 0x2060FF ),
3623
+
3624
+ seed: 0,
3625
+ };
3626
+
3627
+
3628
+
3629
+ var waves_core = Fn( ([ position, scale, speed, time, level, rough, height, foamSize, /*foamEdge,*/ seed ]) => {
3630
+
3631
+ const xscale = exp( scale.sub( 1 ) ).toVar();
3632
+ const pos = position.mul( xscale ).add( seed ).toVar( 'pos' );
3633
+ const xtime = time.mul( speed.exp() );
3634
+
3635
+ var posXZ = vec3( pos.x, 0, pos.z ).div( 3 );
3636
+
3637
+ const xfoamSize = foamSize.mul( mx_fractal_noise_float( pos, rough.div( 2 ) ).div( 2 ).add( 1 ).div( 2 ) );
3638
+
3639
+ var xheight = height.div( xscale, 0.8 ).toVar();
3640
+
3641
+ var wave = position.y.sub( level )
3642
+ .add( mx_fractal_noise_float( posXZ, 1 ).mul( 2*3.14 ).add( xtime ).sin().div( 2 ).mul( xheight ) )
3643
+ .sub( mx_fractal_noise_float( pos, rough ).mul( 2*3.14 ).add( xtime.mul( 2 ) ).sin().sub( 1 ).div( 5 ).mul( xheight ) )
3644
+ .smoothstep( float( 0.5 ).sub( xfoamSize ), float( 0.5 ).add( xfoamSize ) )
3645
+ .toVar();
3646
+
3647
+ return wave;
3648
+
3649
+ } ).setLayout( {
3650
+ name: 'waves_core',
3651
+ type: 'float',
3652
+ inputs: [
3653
+ { name: 'position', type: 'vec3' },
3654
+ { name: 'scale', type: 'float' },
3655
+ { name: 'speed', type: 'float' },
3656
+ { name: 'time', type: 'float' },
3657
+ { name: 'level', type: 'float' },
3658
+ { name: 'rough', type: 'float' },
3659
+ { name: 'height', type: 'float' },
3660
+ { name: 'foamSize', type: 'float' },
3661
+ /*{ name: 'foamEdge', type: 'float' },*/
3662
+ { name: 'seed', type: 'float' },
3663
+ ] }
3664
+ );
3665
+
3666
+
3667
+
3668
+ var wavesRaw = Fn( ([ position, scale, speed, time, level, rough, height, foamSize, /*foamEdge,*/ color, background, seed ]) => {
3669
+
3670
+ var k = waves_core( position, scale, speed, time, level, rough, height, foamSize, /*foamEdge,*/ seed );
3671
+ return mix( background, color, k.clamp( 0, 1 ) );
3672
+
3673
+
3674
+ } ).setLayout( {
3675
+ name: 'wavesRaw',
3676
+ type: 'vec3',
3677
+ inputs: [
3678
+ { name: 'position', type: 'vec3' },
3679
+ { name: 'scale', type: 'float' },
3680
+ { name: 'speed', type: 'float' },
3681
+ { name: 'time', type: 'float' },
3682
+ { name: 'level', type: 'float' },
3683
+ { name: 'rough', type: 'float' },
3684
+ { name: 'height', type: 'float' },
3685
+ { name: 'foamSize', type: 'float' },
3686
+ /*{ name: 'foamEdge', type: 'float' },*/
3687
+ { name: 'color', type: 'vec3' },
3688
+ { name: 'background', type: 'vec3' },
3689
+ { name: 'seed', type: 'float' },
3690
+ ] }
3691
+ );
3692
+
3693
+
3694
+
3695
+ var wavesOpacityRaw = Fn( ([ position, scale, speed, time, level, rough, height, foamSize, foamEdge, /*color,background,*/ seed ]) => {
3696
+
3697
+ var k = waves_core( position, scale, speed, time, level, rough, height, foamSize, /*foamEdge,*/ seed ).oneMinus();
3698
+
3699
+ return k.smoothstep( 0, foamEdge.oneMinus().div( 10 ) );
3700
+
3701
+ } ).setLayout( {
3702
+ name: 'wavesOpacityRaw',
3703
+ type: 'float',
3704
+ inputs: [
3705
+ { name: 'position', type: 'vec3' },
3706
+ { name: 'scale', type: 'float' },
3707
+ { name: 'speed', type: 'float' },
3708
+ { name: 'time', type: 'float' },
3709
+ { name: 'level', type: 'float' },
3710
+ { name: 'rough', type: 'float' },
3711
+ { name: 'height', type: 'float' },
3712
+ { name: 'foamSize', type: 'float' },
3713
+ { name: 'foamEdge', type: 'float' },
3714
+ /*{ name: 'color', type: 'vec3' },*/
3715
+ /*{ name: 'subcolor', type: 'vec3' },*/
3716
+ { name: 'seed', type: 'float' },
3717
+ ] }
3718
+ );
3719
+
3720
+
3721
+
3722
+ function waves( params={} ) {
3723
+
3724
+ var { position, scale, speed, time, level, rough, height, foamSize, /*foamEdge,*/ color, background, seed } = { ...defaults$b, ...params };
3725
+
3726
+ return wavesRaw( position, scale, speed, time, level, rough, height, foamSize, /*foamEdge,*/ color, background, seed );
3727
+
3728
+ }
3729
+
3730
+
3731
+
3732
+ waves.opacity = function ( params={} ) {
3733
+
3734
+ var { position, scale, speed, time, level, rough, height, foamSize, foamEdge, /*color,background,*/seed } = { ...defaults$b, ...params };
3735
+
3736
+ return wavesOpacityRaw( position, scale, speed, time, level, rough, height, foamSize, foamEdge, /*color,background,*/seed );
3737
+
3738
+ };
3739
+
3740
+
3741
+
3742
+ waves.defaults = defaults$b;
3743
+
3744
+ var defaults$a = {
3745
+ $name: 'Wood',
3746
+
3747
+ position: positionGeometry,
3748
+ scale: 2.5,
3749
+
3750
+ rings: 4.5,
3751
+ lengths: 1,
3752
+ angle: 0,
3753
+
3754
+ fibers: 0.3,
3755
+ fibersDensity: 10,
3756
+
3757
+ color: new Color( 0.8, 0.4, 0 ),
3758
+ background: new Color( 0.4, 0.1, 0 ),
3759
+
3760
+ seed: 0,
3761
+ };
3762
+
3763
+
3764
+
3765
+ var woodRaw = Fn( ([ position, scale, rings, lengths, angle, fibers, fibersDensity, color, background, seed ]) => {
3766
+
3767
+ var angle = radians( angle ).toVar();
3768
+ var posLocal = vec3(
3769
+ sub( position.x.mul( cos( angle ) ), position.y.mul( sin( angle ) ) ),
3770
+ add( position.x.mul( sin( angle ) ), position.y.mul( cos( angle ) ) ),
3771
+ position.z,
3772
+ ).toVar();
3773
+
3774
+
3775
+ // main pattern with rings
3776
+ var pos = posLocal.mul( exp( scale.sub( 3 ) ).mul( vec3( reciprocal( lengths ), 4, reciprocal( lengths ) ) ) ).add( seed ).toVar( );
3777
+ var k = mx_noise_float( pos ).add( 1 ).mul( 10 ).mul( rings );
3778
+ k = k.add( k.cos() ).cos().add( 1 ).div( 2 );
3779
+
3780
+ var kk = float( 0 ).toVar(),
3781
+ sum = float( 0 ).toVar(),
3782
+ scale = exp( scale.sub( 2 ) ).mul( vec3( 1, fibersDensity, 1 ) ).toVar(),
3783
+ power = float( 2 ).toVar();
3784
+
3785
+ Loop( 10, ()=>{
3786
+
3787
+ kk.addAssign( mul( power, mx_noise_float( posLocal.mul( scale ).add( seed ) ) ) );
3788
+ sum.addAssign( power );
3789
+ scale.mulAssign( 1.8 );
3790
+ power.mulAssign( 0.6 );
3791
+
3792
+ } );
3793
+
3794
+ kk.assign( mul( kk, 5 ).div( sum ).mul( 10 ).sin().add( 1 ).div( 2 ) );
3795
+
3796
+ return mix( color, background, mix( k, kk, fibers ) );
3797
+
3798
+ } ).setLayout( {
3799
+ name: 'woodRaw',
3800
+ type: 'vec3',
3801
+ inputs: [
3802
+ { name: 'position', type: 'vec3' },
3803
+ { name: 'scale', type: 'float' },
3804
+ { name: 'rings', type: 'float' },
3805
+ { name: 'lengths', type: 'float' },
3806
+ { name: 'angle', type: 'float' },
3807
+ { name: 'fibers', type: 'float' },
3808
+ { name: 'fibersDensity', type: 'float' },
3809
+ { name: 'color', type: 'vec3' },
3810
+ { name: 'background', type: 'vec3' },
3811
+ { name: 'seed', type: 'float' },
3812
+ ] }
3813
+ );
3814
+
3815
+
3816
+
3817
+ function wood( params={} ) {
3818
+
3819
+ var { position, scale, rings, lengths, angle, fibers, fibersDensity, color, background, seed } = { ...defaults$a, ...params };
3820
+
3821
+ return woodRaw( position, scale, rings, lengths, angle, fibers, fibersDensity, color, background, seed );
3822
+
3823
+ }
3824
+
3825
+
3826
+
3827
+ wood.defaults = defaults$a;
3828
+
3829
+ var defaults$9 = {
3830
+ $name: 'Zebra lines',
3831
+
3832
+ position: positionGeometry,
3833
+ scale: 2,
3834
+ thinness: 0.5,
3835
+ phi: 0,
3836
+ theta: 0,
3837
+
3838
+ color: new Color( 0x0 ),
3839
+ background: new Color( 0xFFFFFF ),
3840
+
3841
+ flat: 0,
3842
+ // no seed for zebra lines
3843
+ };
3844
+
3845
+
3846
+
3847
+ var zebraLinesRaw = Fn( ([ position, scale, thinness, phi, theta, color, background, xflat ]) => {
3848
+
3849
+ var pos = select( xflat, position, position.normalize() ).toVar( );
3850
+
3851
+ var dir = select( xflat, vec2( cos( phi ), sin( phi ) ), spherical( phi, theta ) ).toVar();
3852
+
3853
+ var angle = select( xflat, clamp( dir.dot( pos ), -2, 2 ), acos( clamp( dir.dot( pos ), -1, 1 ) ) ).toVar();
3854
+
3855
+ var scale = exp( scale.add( 1 ) ).toVar();
3856
+
3857
+ var k = sin( angle.mul( scale ) ).sub( thinness.sub( 0.5 ).mul( 2 ) );
3858
+
3859
+ k = clamp( k.mul( 1000 ).div( scale ), -1, 1 ).mul( 0.5 ).add( 0.5 );
3860
+
3861
+ return mix( background, color, k );
3862
+
3863
+ } ).setLayout( {
3864
+ name: 'zebraLinesRaw',
3865
+ type: 'vec3',
3866
+ inputs: [
3867
+ { name: 'position', type: 'vec3' },
3868
+ { name: 'scale', type: 'float' },
3869
+ { name: 'thinness', type: 'float' },
3870
+ { name: 'phi', type: 'float' },
3871
+ { name: 'theta', type: 'float' },
3872
+ { name: 'color', type: 'vec3' },
3873
+ { name: 'background', type: 'vec3' },
3874
+ { name: 'xflat', type: 'int' },
3875
+ ] }
3876
+ );
3877
+
3878
+
3879
+
3880
+ function zebraLines( params={} ) {
3881
+
3882
+ var { position, scale, thinness, phi, theta, color, background, flat } = { ...defaults$9, ...params };
3883
+
3884
+ return zebraLinesRaw( position, scale, thinness, phi, theta, color, background, flat );
3885
+
3886
+ }
3887
+
3888
+
3889
+
3890
+ zebraLines.defaults = defaults$9;
3891
+
3892
+ var defaults$8 = {
3893
+ $name: 'Circle decor',
3894
+
3895
+ position: positionGeometry,
3896
+ scale: 2,
3897
+ grains: 0.2,
3898
+
3899
+ complexity: 1,
3900
+ blur: 0.2,
3901
+
3902
+ color: new Color( 0x0 ),
3903
+ background: new Color( 0xFFFFFF ),
3904
+
3905
+ seed: 0,
3906
+ };
3907
+
3908
+
3909
+
3910
+ var circleDecorRaw = Fn( ([ position, scale, grains, complexity, blur, color, background, seed ])=>{
3911
+
3912
+ var pos = position.mul( exp( scale.div( 4 ) ) ).add( seed ).toVar( 'pos' );
3913
+ var subpos = pos.mul( 2 ).toVar( 'subpos' );
3914
+
3915
+ var k1 = mx_worley_noise_float( pos );
3916
+ var k2 = mx_worley_noise_float( subpos );
3917
+ var k3 = mx_worley_noise_float( pos.mul( grains.mul( 4 ).add( 2 ) ) ).mul( 2 );
3918
+
3919
+ var compScale = mx_noise_float( pos ).div( 2 ).add( 1 );
3920
+
3921
+ var k = k1.min( k2, k3 ).clamp( 0, 1 ).mul( complexity.add( 2 ).exp(), compScale, Math.PI ).sin().smoothstep( blur.negate(), blur );
3922
+
3923
+ return mix( color, background, k.oneMinus() );
3924
+
3925
+ } ).setLayout( {
3926
+ name: 'camouflageRaw',
3927
+ type: 'vec3',
3928
+ inputs: [
3929
+ { name: 'position', type: 'vec3' },
3930
+ { name: 'scale', type: 'float' },
3931
+ { name: 'grains', type: 'float' },
3932
+ { name: 'complexity', type: 'float' },
3933
+ { name: 'blur', type: 'float' },
3934
+ { name: 'color', type: 'vec3' },
3935
+ { name: 'background', type: 'vec3' },
3936
+ { name: 'seed', type: 'float' },
3937
+ ] }
3938
+ );
3939
+
3940
+
3941
+
3942
+ function circleDecor( params={} ) {
3943
+
3944
+ var { position, scale, grains, complexity, blur, color, background, seed } = { ...defaults$8, ...params };
3945
+
3946
+ return circleDecorRaw( position, scale, grains, complexity, blur, color, background, seed );
3947
+
3948
+ }
3949
+
3950
+
3951
+
3952
+ circleDecor.defaults = defaults$8;
3953
+
3954
+ var defaults$7 = {
3955
+ $name: 'Reticular veins',
3956
+
3957
+ position: positionGeometry,
3958
+ scale: 2,
3959
+ reticulation: 5,
3960
+ strength: 0.2,
3961
+ organelles: 0.2,
3962
+
3963
+ color: new Color( 0xFFFFF0 ),
3964
+ background: new Color( 0x208020 ),
3965
+
3966
+ seed: 0,
3967
+ };
3968
+
3969
+
3970
+
3971
+ var reticularVeinsRaw = Fn( ([ position, scale, reticulation, strength, organelles, color, background, seed ])=>{
3972
+
3973
+ var pos = position.mul( exp( scale.div( 2 ).add( 0.5 ) ) ).add( seed ).toVar( );
3974
+
3975
+ var k1 = mx_worley_noise_float( pos );
3976
+ var k2 = mx_worley_noise_float( pos.add( 100 ).mul( reticulation ) ).mul( strength );
3977
+ var dots = mx_noise_float( pos.mul( 100 ) ).mul( strength, organelles );
3978
+
3979
+ var k = k1.add( k2 ).add( dots );
3980
+
3981
+ return mix( background, color, k );
3982
+
3983
+ } ).setLayout( {
3984
+ name: 'reticularVeinsRaw',
3985
+ type: 'vec3',
3986
+ inputs: [
3987
+ { name: 'position', type: 'vec3' },
3988
+ { name: 'scale', type: 'float' },
3989
+ { name: 'reticulation', type: 'float' },
3990
+ { name: 'strength', type: 'float' },
3991
+ { name: 'organelles', type: 'float' },
3992
+ { name: 'color', type: 'vec3' },
3993
+ { name: 'background', type: 'vec3' },
3994
+ { name: 'seed', type: 'float' },
3995
+ ] }
3996
+ );
3997
+
3998
+
3999
+
4000
+ function reticularVeins( params={} ) {
4001
+
4002
+ var { position, scale, reticulation, strength, organelles, color, background, seed } = { ...defaults$7, ...params };
4003
+
4004
+ return reticularVeinsRaw( position, scale, reticulation, strength, organelles, color, background, seed );
4005
+
4006
+ }
4007
+
4008
+
4009
+
4010
+ reticularVeins.defaults = defaults$7;
4011
+
4012
+ var defaults$6 = {
4013
+ $name: 'Roman paving',
4014
+
4015
+ position: positionGeometry,
4016
+ scale: 2,
4017
+ depth: 0.5,
4018
+
4019
+ seed: 0,
4020
+ };
4021
+
4022
+
4023
+
4024
+ var romanPavingRaw = Fn( ([ position, scale, depth, seed ])=>{
4025
+
4026
+ var pos = position.mul( exp( scale ) ).add( seed ).toVar( );
4027
+
4028
+ var k = mx_worley_noise_vec2( pos ).toVar();
4029
+
4030
+ return k.y.sub( k.x ).pow( depth.mul( 3 ).sub( 3 ).exp() ).smoothstep( 0, 1 );
4031
+
4032
+ } ).setLayout( {
4033
+ name: 'romanPavingRaw',
4034
+ type: 'vec3',
4035
+ inputs: [
4036
+ { name: 'position', type: 'vec3' },
4037
+ { name: 'scale', type: 'float' },
4038
+ { name: 'depth', type: 'float' },
4039
+ { name: 'seed', type: 'float' },
4040
+ ] }
4041
+ );
4042
+
4043
+
4044
+
4045
+ function romanPaving( params={} ) {
4046
+
4047
+ var { position, scale, depth, seed } = { ...defaults$6, ...params };
4048
+
4049
+ return romanPavingRaw( position, scale, depth, seed );
4050
+
4051
+ }
4052
+
4053
+
4054
+
4055
+ romanPaving.defaults = defaults$6;
4056
+
4057
+ var defaults$5 = {
4058
+ $name: 'Crumpled fabric',
4059
+ $width: 260,
4060
+
4061
+ position: positionGeometry,
4062
+ scale: 2,
4063
+ pinch: 0.5,
4064
+
4065
+ color: new Color( 0xB0F0FF ),
4066
+ subcolor: new Color( 0x4040F0 ),
4067
+ background: new Color( 0x003000 ),
4068
+
4069
+ seed: 0,
4070
+ };
4071
+
4072
+
4073
+
4074
+ var crumpledFabricRaw = Fn( ([ position, scale, pinch, color, subcolor, background, seed ])=>{
4075
+
4076
+ var pos = position.mul( exp( scale.sub( 0.5 ) ) ).add( seed ).toVar( );
4077
+
4078
+ Loop( 4, ()=>{
4079
+
4080
+ var x = mx_noise_float( pos.xyz );
4081
+ var y = mx_noise_float( pos.yzx );
4082
+ var z = mx_noise_float( pos.zxy );
4083
+
4084
+ pos.addAssign( vec3( x, y, z ).mul( pinch ) );
4085
+
4086
+ } );
4087
+
4088
+ var k = mx_noise_float( pos ).add( 1 ).div( 2 ).clamp( 0, 1 );
4089
+
4090
+ var color1 = color.mul( k.mul( 2 ).sub( 1 ).abs().oneMinus() );
4091
+ var color2 = subcolor.mul( k ).pow( 2 );
4092
+ var color3 = background.mul( k.oneMinus().pow( 2 ) );
4093
+
4094
+ return color1.add( color2 ).add( color3 );
4095
+
4096
+ } ).setLayout( {
4097
+ name: 'crumpledFabricRaw',
4098
+ type: 'vec3',
4099
+ inputs: [
4100
+ { name: 'position', type: 'vec3' },
4101
+ { name: 'scale', type: 'float' },
4102
+ { name: 'pinch', type: 'float' },
4103
+ { name: 'color', type: 'vec3' },
4104
+ { name: 'subcolor', type: 'vec3' },
4105
+ { name: 'background', type: 'vec3' },
4106
+ { name: 'seed', type: 'float' },
4107
+ ] }
4108
+ );
4109
+
4110
+
4111
+
4112
+ function crumpledFabric( params={} ) {
4113
+
4114
+ var { position, scale, pinch, color, subcolor, background, seed } = { ...defaults$5, ...params };
4115
+
4116
+ return crumpledFabricRaw( position, scale, pinch, color, subcolor, background, seed );
4117
+
4118
+ }
4119
+
4120
+
4121
+
4122
+ crumpledFabric.defaults = defaults$5;
4123
+
4124
+ var defaults$4 = {
4125
+ $name: 'Isolayers',
4126
+
4127
+ position: positionGeometry,
4128
+ scale: 2,
4129
+ layers: 10,
4130
+ edge: 0.5,
4131
+ darkness: 0,
4132
+
4133
+ color: new Color( 0xFFFFF0 ),
4134
+ background: new Color( 0xFF4040 ),
4135
+
4136
+ seed: 0,
4137
+ };
4138
+
4139
+
4140
+
4141
+ var isolayersRaw = Fn( ([ position, scale, layers, edge, darkness, color, background, seed ])=>{
4142
+
4143
+ var pos = position.mul( exp( scale.sub( 1 ) ) ).add( seed ).toVar( );
4144
+
4145
+ var depth = edge.remap( 0, 1, 40, 10 );
4146
+
4147
+ var k = mx_noise_float( pos, 1.2, 1 ).div( 2 );
4148
+
4149
+ var i = k.mul( layers ).round().div( layers ).clamp( 0, 1 );
4150
+ var f = k.sub( float( 0.5+0.03 ).div( layers ) )
4151
+ .mul( layers ).fract()
4152
+ .mul( float( 2 ).pow( depth.reciprocal() ) )
4153
+ .pow( depth ).sub( 1 ).abs().oneMinus();
4154
+
4155
+ var hslColor = mix( toHsl( background ), toHsl( color ), i ).toVar();
4156
+ hslColor.z.mulAssign( mix( 1, i.mul( 1.5 ), darkness ).clamp( 0, 1 ) );
4157
+
4158
+ return hsl( hslColor ).sub( f );
4159
+
4160
+ } ).setLayout( {
4161
+ name: 'isolayersRaw',
4162
+ type: 'vec3',
4163
+ inputs: [
4164
+ { name: 'position', type: 'vec3' },
4165
+ { name: 'scale', type: 'float' },
4166
+ { name: 'layers', type: 'int' },
4167
+ { name: 'edge', type: 'float' },
4168
+ { name: 'darkness', type: 'float' },
4169
+ { name: 'color', type: 'vec3' },
4170
+ { name: 'background', type: 'vec3' },
4171
+ { name: 'seed', type: 'float' },
4172
+ ] }
4173
+ );
4174
+
4175
+
4176
+
4177
+ function isolayers( params={} ) {
4178
+
4179
+ var { position, scale, layers, edge, darkness, color, background, seed } = { ...defaults$4, ...params };
4180
+
4181
+ return isolayersRaw( position, scale, layers, edge, darkness, color, background, seed );
4182
+
4183
+ }
4184
+
4185
+
4186
+
4187
+ isolayers.defaults = defaults$4;
4188
+
4189
+ var defaults$3 = {
4190
+ $name: 'Turbulent smoke',
4191
+ $width: 260,
4192
+
4193
+ position: positionGeometry,
4194
+ scale: 2,
4195
+ speed: 0,
4196
+ details: 5,
4197
+ time: time,
4198
+
4199
+ seed: 0,
4200
+ };
4201
+
4202
+
4203
+
4204
+ var turbulentSmokeRaw = Fn( ([ position, scale, speed, details, time, seed ])=>{
4205
+
4206
+ var pos = position.mul( exp( scale.sub( 1 ) ) ).add( seed ).toVar( );
4207
+
4208
+ var t = time.mul( speed.sub( 1 ).exp() );
4209
+
4210
+ var q = pos.add( vec3(
4211
+ mx_fractal_noise_float( pos.add( vec3( 1, t.sin(), -1 ) ) ),
4212
+ mx_fractal_noise_float( pos.add( vec3( t.add( 2*Math.PI/3 ).sin(), 1, -1 ) ) ),
4213
+ mx_fractal_noise_float( pos.add( vec3( 1, -1, t.add( 4*Math.PI/3 ).sin() ) ) ),
4214
+ ) );
4215
+
4216
+ var p = mx_fractal_noise_vec3( q, details );
4217
+
4218
+ var k = mx_worley_noise_float( pos.add( p.div( 2 ) ) ).pow( 4 ).mul( 4 ).oneMinus();
4219
+
4220
+ return k;
4221
+
4222
+ } ).setLayout( {
4223
+ name: 'turbulentSmokeRaw',
4224
+ type: 'vec3',
4225
+ inputs: [
4226
+ { name: 'position', type: 'vec3' },
4227
+ { name: 'scale', type: 'float' },
4228
+ { name: 'speed', type: 'float' },
4229
+ { name: 'details', type: 'int' },
4230
+ { name: 'time', type: 'float' },
4231
+ { name: 'seed', type: 'float' },
4232
+ ] }
4233
+ );
4234
+
4235
+
4236
+
4237
+ function turbulentSmoke( params={} ) {
4238
+
4239
+ var { position, scale, speed, details, time, seed } = { ...defaults$3, ...params };
4240
+
4241
+ return turbulentSmokeRaw( position, scale, speed, details, time, seed );
4242
+
4243
+ }
4244
+
4245
+
4246
+
4247
+ turbulentSmoke.defaults = defaults$3;
4248
+
4249
+ var defaults$2 = {
4250
+ $name: 'Caustics',
4251
+
4252
+ position: positionGeometry,
4253
+ scale: 2,
4254
+ speed: 0,
4255
+ time: time,
4256
+
4257
+ color: new Color( 0x50A8C0 ),
4258
+
4259
+ seed: 0,
4260
+ };
4261
+
4262
+
4263
+
4264
+ var causticsRaw = Fn( ([ position, scale, speed, time, color, seed ])=>{
4265
+
4266
+ var pos = position.mul( exp( scale.sub( 1 ) ) ).add( seed ).toVar( );
4267
+
4268
+ var t = time.mul( speed.sub( 1 ).exp() )
4269
+ .add( vec3( 0, 2*Math.PI/3, 4*Math.PI/3 ) )
4270
+ .sin();
4271
+
4272
+ var p = mx_worley_noise_vec3(
4273
+ pos.add( vec3(
4274
+ mx_worley_noise_float( pos.add( t.xyz ) ),
4275
+ mx_worley_noise_float( pos.add( t.yzx ) ),
4276
+ mx_worley_noise_float( pos.add( t.zxy ) ),
4277
+ ) ) );
4278
+
4279
+ var k = p.length().div( Math.sqrt( 3 ) );
4280
+
4281
+ return k.add( color.sub( 0.5 ).mul( 2 ) );
4282
+
4283
+ } ).setLayout( {
4284
+ name: 'causticsRaw',
4285
+ type: 'vec3',
4286
+ inputs: [
4287
+ { name: 'position', type: 'vec3' },
4288
+ { name: 'scale', type: 'float' },
4289
+ { name: 'speed', type: 'float' },
4290
+ { name: 'time', type: 'float' },
4291
+ { name: 'color', type: 'vec3' },
4292
+ { name: 'seed', type: 'float' },
4293
+ ] }
4294
+ );
4295
+
4296
+
4297
+
4298
+ function caustics( params={} ) {
4299
+
4300
+ var { position, scale, speed, time, color, seed } = { ...defaults$2, ...params };
4301
+
4302
+ return causticsRaw( position, scale, speed, time, color, seed );
4303
+
4304
+ }
4305
+
4306
+
4307
+
4308
+ caustics.defaults = defaults$2;
4309
+
4310
+ var defaults$1 = {
4311
+ $name: 'Bricks',
4312
+
4313
+ position: positionGeometry,
4314
+ scale: 2,
4315
+
4316
+ brickSize: new Vector3( 2, 1, 2 ),
4317
+ brickShift: 2,
4318
+
4319
+ jointSize: 0.05,
4320
+ jointSpan: 0.5,
4321
+ jointJitter: 0.5,
4322
+ jointBlur: 0.03,
4323
+
4324
+ noiseSize: 0.5,
4325
+ noiseStrength: 0.2,
4326
+
4327
+ colorShade: 0.5,
4328
+
4329
+ color: new Color( 0xFF4000 ),
4330
+ additional: new Color( 0xD0A030 ),
4331
+ background: new Color( 0xAAAAAA ),
4332
+
4333
+
4334
+ seed: 0,
4335
+ };
4336
+
4337
+
4338
+
4339
+ var bricksRaw = Fn( ([ position, scale, brickSize, brickShift, jointSize, jointSpan, jointJitter, jointBlur, noiseSize, noiseStrength, colorShade, color, additional, background, seed ])=>{
4340
+
4341
+ var pos = position.mul( exp( scale ) ).add( seed ).toVar( );
4342
+
4343
+ var size = brickSize;
4344
+
4345
+ var floor = pos.div( size ).floor().div( brickShift );
4346
+
4347
+ var offset = vec3( floor.y, 0, floor.y ).toVar();
4348
+
4349
+ var p = pos.div( size ).fract().add( offset ).fract().toVar();
4350
+
4351
+ var n = mx_fractal_noise_vec3( pos.mul( remapExp( jointSpan, 0, 1, 20, 0.2 ) ) ).div( remapExp( jointJitter, 0, 1, 500, 1 ) ).toVar();
4352
+
4353
+ var border = mul(
4354
+ p.mul( size ).add( n.z ).smoothstep( size.y.sub( jointSize, jointBlur ), size.y.sub( jointSize ) ).y.oneMinus(),
4355
+ p.mul( size ).add( n.y ).smoothstep( jointSize, jointSize.add( jointBlur ) ).y,
4356
+
4357
+ p.mul( size ).add( n.y ).smoothstep( size.x.sub( jointSize, jointBlur ), size.x.sub( jointSize ) ).x.oneMinus(),
4358
+ p.mul( size ).add( n.x ).smoothstep( jointSize, jointSize.add( jointBlur ) ).x,
4359
+
4360
+ p.mul( size ).add( n.x ).smoothstep( size.z.sub( jointSize, jointBlur ), size.z.sub( jointSize ) ).z.oneMinus(),
4361
+ p.mul( size ).add( n.z ).smoothstep( jointSize, jointSize.add( jointBlur ) ).z,
4362
+ ).clamp( 0, 1 );
4363
+
4364
+ var shade = mix( float( 1 ), mx_noise_float( mx_noise_float( pos.xyz.div( size ).add( offset ).floor().zxy.mul( 100 ).add( Math.PI ) ).mul( 10 ) ).add( 2 ).div( 2 ).pow( 4 ).clamp( 0, 1 ), colorShade );
4365
+
4366
+ var ns = mx_noise_float( pos.mul( remapExp( noiseSize, 0, 1, 5, 250 ) ) ).mul( noiseStrength ).add( 1 );
4367
+
4368
+ var brickNoise = mx_noise_float( mx_noise_float( pos.xyz.div( size ).add( offset ).floor().zxy.mul( 200 ).add( Math.PI ) ).mul( 10 ) ).add( 1 ).div( 1 );
4369
+ var brickColor = mix( color, additional, brickNoise.pow( 2 ) );
4370
+
4371
+ return mix( background, shade.mul( brickColor, border ), border ).mul( ns );
4372
+
4373
+ } ).setLayout( {
4374
+ name: 'bricksRaw',
4375
+ type: 'vec3',
4376
+ inputs: [
4377
+ { name: 'position', type: 'vec3' },
4378
+ { name: 'scale', type: 'float' },
4379
+
4380
+ { name: 'brickSize', type: 'vec3' },
4381
+ { name: 'brickShift', type: 'float' },
4382
+ { name: 'jointSize', type: 'float' },
4383
+ { name: 'jointSpan', type: 'float' },
4384
+ { name: 'jointJitter', type: 'float' },
4385
+ { name: 'jointBlur', type: 'float' },
4386
+ { name: 'noiseSize', type: 'float' },
4387
+ { name: 'noiseStrength', type: 'float' },
4388
+ { name: 'colorShade', type: 'float' },
4389
+
4390
+ { name: 'color', type: 'vec3' },
4391
+ { name: 'additional', type: 'vec3' },
4392
+ { name: 'background', type: 'vec3' },
4393
+
4394
+ { name: 'seed', type: 'float' },
4395
+ ] }
4396
+ );
4397
+
4398
+
4399
+
4400
+ function bricks( params={} ) {
4401
+
4402
+ var { position, scale, brickSize, brickShift, jointSize, jointSpan, jointJitter, jointBlur, noiseSize, noiseStrength, colorShade, color, additional, background, seed } = { ...defaults$1, ...params };
4403
+
4404
+ return bricksRaw( position, scale, brickSize, brickShift, jointSize, jointSpan, jointJitter, jointBlur, noiseSize, noiseStrength, colorShade, color, additional, background, seed );
4405
+
4406
+ }
4407
+
4408
+
4409
+
4410
+ bricks.defaults = defaults$1;
4411
+
4412
+ var defaults = {
4413
+ $name: 'Halftone',
4414
+
4415
+ position: screenCoordinate,
4416
+ scale: 2,
4417
+ radius: 0.5,
4418
+ pattern: 1,
4419
+
4420
+ attenuation: 0,
4421
+ near: 6,
4422
+ far: 14,
4423
+
4424
+ color: vertexColor(),
4425
+
4426
+ positionView: positionView,
4427
+
4428
+ };
4429
+
4430
+
4431
+
4432
+ // square grid of circles
4433
+ var halftoneGridRaw = Fn( ([ position, scale, radius, attenuation, far, near, color, positionView ]) => {
4434
+
4435
+ var xscale = float( 5 ).sub( scale ).exp().toVar(),
4436
+ pos = position.toVar(),
4437
+ xradius = radius.div( Math.sqrt( 2 ) ).toVar();
4438
+
4439
+ var center = pos.div( xscale ).round().mul( xscale );
4440
+
4441
+
4442
+ If( attenuation.notEqual( 0 ), ()=>{
4443
+
4444
+ xradius.mulAssign( positionView.z.mul( -1 ).smoothstep( far, near ).pow( 1/2 ) );
4445
+
4446
+ } );
4447
+
4448
+ If( pos.distance( center ).greaterThan( xscale.mul( xradius ) ), ()=>Discard() );
4449
+
4450
+ return color;
4451
+
4452
+ } ).setLayout( {
4453
+ name: 'halftoneGridRaw',
4454
+ type: 'vec3',
4455
+ inputs: [
4456
+ { name: 'position', type: 'vec3' },
4457
+ { name: 'scale', type: 'float' },
4458
+ { name: 'radius', type: 'float' },
4459
+ { name: 'attenuation', type: 'int' },
4460
+ { name: 'far', type: 'float' },
4461
+ { name: 'near', type: 'float' },
4462
+ { name: 'color', type: 'vec3' },
4463
+ { name: 'positionView', type: 'vec3' },
4464
+ ] }
4465
+ );
4466
+
4467
+
4468
+
4469
+ // diagonal geid of circles
4470
+ var halftoneDiagRaw = Fn( ([ position, scale, radius, attenuation, far, near, color, positionView ]) => {
4471
+
4472
+ var xscale = float( 5 ).sub( scale ).exp().toVar(),
4473
+ pos = position.toVar(),
4474
+ xradius = radius.div( Math.sqrt( 2 ) ).toVar();
4475
+
4476
+ var shift = pos.y.div( xscale ).round().mod( 2 );
4477
+
4478
+ var centerA = pos.div( xscale ).round().mulAssign( xscale ).toVar();
4479
+
4480
+ If( shift.equal( 0 ), ()=>{
4481
+
4482
+ centerA.x.addAssign( xscale.mul( 0.5 ) );
4483
+
4484
+ } );
4485
+ var centerB = vec2( centerA.x.sub( xscale ), centerA.y ).toVar();
4486
+
4487
+
4488
+ If( attenuation.notEqual( 0 ), ()=>{
4489
+
4490
+ xradius.mulAssign( positionView.z.mul( -1 ).smoothstep( far, near ).pow( 1/2 ) );
4491
+
4492
+ } );
4493
+
4494
+ If( min( pos.distance( centerA ), pos.distance( centerB ) ).greaterThan( xscale.mul( xradius ) ), ()=>Discard() );
4495
+
4496
+ return color;
4497
+
4498
+ } ).setLayout( {
4499
+ name: 'halftoneDiagRaw',
4500
+ type: 'vec3',
4501
+ inputs: [
4502
+ { name: 'position', type: 'vec3' },
4503
+ { name: 'scale', type: 'float' },
4504
+ { name: 'radius', type: 'float' },
4505
+ { name: 'attenuation', type: 'int' },
4506
+ { name: 'far', type: 'float' },
4507
+ { name: 'near', type: 'float' },
4508
+ { name: 'color', type: 'vec3' },
4509
+ { name: 'positionView', type: 'vec3' },
4510
+ ] }
4511
+ );
4512
+
4513
+
4514
+
4515
+ // trigonetric pattern
4516
+ var halftoneTrigRaw = Fn( ([ position, scale, radius, pattern, attenuation, far, near, color, positionView ]) => {
4517
+
4518
+ var pos = position.mul( scale.sub( 3.5 ).exp() ).sin().add( 1 ).div( 2 ).toVar(),
4519
+ x = pos.x,
4520
+ y = pos.y,
4521
+ xradius = radius.div( Math.sqrt( 2 ) ).toVar();
4522
+
4523
+ var dist = float( 0 );
4524
+
4525
+ Switch( pattern )
4526
+ .Case( 2, ()=>{
4527
+
4528
+ dist.assign( x.add( y ).div( 2 ) );
4529
+
4530
+ } )
4531
+ .Case( 3, ()=>{
4532
+
4533
+ dist.assign( x.sub( y ).abs().oneMinus() );
4534
+
4535
+ } )
4536
+ .Case( 10, ()=>{
4537
+
4538
+ dist.assign( x.sub( y ).abs() );
4539
+
4540
+ } )
4541
+ .Case( 4, ()=>{
4542
+
4543
+ dist.assign( x.mul( y ).oneMinus() );
4544
+
4545
+ } )
4546
+ .Case( 9, ()=>{
4547
+
4548
+ dist.assign( x.mul( y ) );
4549
+
4550
+ } )
4551
+ .Case( 5, ()=>{
4552
+
4553
+ dist.assign( x.max( y ) );
4554
+
4555
+ } )
4556
+ .Case( 6, ()=>{
4557
+
4558
+ dist.assign( x.min( y ) );
4559
+
4560
+ } )
4561
+ .Case( 7, ()=>{
4562
+
4563
+ dist.assign( x );
4564
+
4565
+ } )
4566
+ .Case( 8, ()=>{
4567
+
4568
+ dist.assign( y );
4569
+
4570
+ } );
4571
+
4572
+ If( attenuation.notEqual( 0 ), ()=>{
4573
+
4574
+ xradius.mulAssign( positionView.z.mul( -1 ).smoothstep( far, near ).pow( 1/2 ) );
4575
+
4576
+ } );
4577
+
4578
+ If( dist.greaterThan( xradius ), ()=>Discard() );
4579
+
4580
+ return color;
4581
+
4582
+ } ).setLayout( {
4583
+ name: 'halftoneTrigRaw',
4584
+ type: 'vec3',
4585
+ inputs: [
4586
+ { name: 'position', type: 'vec3' },
4587
+ { name: 'scale', type: 'float' },
4588
+ { name: 'radius', type: 'float' },
4589
+ { name: 'pattern', type: 'int' },
4590
+ { name: 'attenuation', type: 'int' },
4591
+ { name: 'far', type: 'float' },
4592
+ { name: 'near', type: 'float' },
4593
+ { name: 'color', type: 'vec3' },
4594
+ { name: 'positionView', type: 'vec3' },
4595
+ ] }
4596
+ );
4597
+
4598
+
4599
+
4600
+ var halftoneRaw = Fn( ([ position, scale, radius, pattern, attenuation, far, near, color, positionView ]) => {
4601
+
4602
+ var result = vec3( 0 ).toVar();
4603
+
4604
+ Switch( pattern )
4605
+ .Case( 0, ()=>{
4606
+
4607
+ result.assign( halftoneGridRaw( position, scale, radius, attenuation, far, near, color, positionView ) );
4608
+
4609
+ } )
4610
+ .Case( 1, ()=>{
4611
+
4612
+ result.assign( halftoneDiagRaw( position, scale, radius, attenuation, far, near, color, positionView ) );
4613
+
4614
+ } )
4615
+ .Default( ()=>{
4616
+
4617
+ result.assign( halftoneTrigRaw( position, scale, radius, pattern, attenuation, far, near, color, positionView ) );
4618
+
4619
+ } );
4620
+
4621
+ return result;
4622
+
4623
+ } ).setLayout( {
4624
+ name: 'halftoneRaw',
4625
+ type: 'vec3',
4626
+ inputs: [
4627
+ { name: 'position', type: 'vec3' },
4628
+ { name: 'scale', type: 'float' },
4629
+ { name: 'radius', type: 'float' },
4630
+ { name: 'pattern', type: 'int' },
4631
+ { name: 'attenuation', type: 'int' },
4632
+ { name: 'far', type: 'float' },
4633
+ { name: 'near', type: 'float' },
4634
+ { name: 'color', type: 'vec3' },
4635
+ { name: 'positionView', type: 'vec3' },
4636
+ ] }
4637
+ );
4638
+
4639
+
4640
+ function halftone( params={} ) {
4641
+
4642
+ var { position, scale, radius, pattern, attenuation, far, near, color, positionView } = { ...defaults, ...params };
4643
+
4644
+ return halftoneRaw( position, scale, radius, pattern, attenuation, far, near, color, positionView );
4645
+
4646
+ }
4647
+
4648
+
4649
+
4650
+ halftone.defaults = defaults;
4651
+
4652
+ if ( typeof window !== 'undefined' ) {
4653
+
4654
+ window.__TSL_TEXTURES__ = 3.0;
4655
+
4656
+ }
4657
+ //export { aaa } from './aaa.js';
4658
+
4659
+ export { approximateNormal, brain, bricks, camouflage, caustics, caveArt, circleDecor, circles, clouds, concrete, cork, crumpledFabric, dalmatianSpots, darthMaul, dysonSphere, entangled, fordite, gasGiant, grid, halftone, hideFallbackWarning, hsl, isolayers, isolines, karstRock, marble, neonLights, perlinNoise, photosphere, planet, polkaDots, processedWood, protozoa, remapExp, reticularVeins, romanPaving, rotatePivot, rotator, roughClay, runnyEggs, rust, satin, scaler, scepterHead, scream, selectPlanar, showFallbackWarning, spherical, stars, staticNoise, supersphere, tigerFur, toHsl, translator, turbulentSmoke, vnoise, voronoiCells, waterDrops, watermelon, waves, wood, zebraLines };