@dailies-studio/tsl-textures 3.0.4 → 3.0.5

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.
@@ -1,4659 +0,0 @@
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 };