tsl-textures 2.5.1 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/tsl-textures.js +2449 -1426
- package/dist/cjs/tsl-textures.min.js +2 -2
- package/dist/tsl-textures.js +2435 -1421
- package/dist/tsl-textures.min.js +2 -2
- package/package.json +1 -1
- package/src/brain.js +72 -21
- package/src/bricks.js +56 -23
- package/src/camouflage.js +39 -20
- package/src/caustics.js +39 -14
- package/src/cave-art.js +39 -13
- package/src/circle-decor.js +39 -13
- package/src/circles.js +36 -16
- package/src/clouds.js +69 -28
- package/src/concrete.js +57 -23
- package/src/cork.js +54 -35
- package/src/crumpled-fabric.js +39 -14
- package/src/dalmatian-spots.js +37 -12
- package/src/darth-maul.js +43 -15
- package/src/dyson-sphere.js +61 -18
- package/src/entangled.js +36 -12
- package/src/fordite.js +36 -12
- package/src/gas-giant.js +42 -16
- package/src/grid.js +45 -17
- package/src/isolayers.js +41 -15
- package/src/isolines.js +36 -10
- package/src/karst-rock.js +31 -8
- package/src/marble.js +36 -11
- package/src/melter.js +0 -1
- package/src/neon-lights.js +51 -23
- package/src/perlin-noise.js +66 -0
- package/src/photosphere.js +34 -11
- package/src/planet.js +66 -30
- package/src/polka-dots.js +42 -17
- package/src/processed-wood.js +42 -16
- package/src/protozoa.js +51 -16
- package/src/reticular-veins.js +37 -11
- package/src/roman-paving.js +30 -8
- package/src/rotator.js +71 -27
- package/src/rough-clay.js +50 -22
- package/src/runny-eggs.js +120 -44
- package/src/rust.js +81 -19
- package/src/satin.js +27 -20
- package/src/scaler.js +61 -26
- package/src/scepter-head.js +46 -20
- package/src/scream.js +29 -19
- package/src/stars.js +36 -11
- package/src/static-noise.js +36 -9
- package/src/supersphere.js +63 -26
- package/src/tiger-fur.js +41 -14
- package/src/translator.js +67 -24
- package/src/tsl-textures.js +2 -1
- package/src/tsl-utils.js +172 -623
- package/src/turbulent-smoke.js +38 -13
- package/src/voronoi-cells.js +44 -26
- package/src/water-drops.js +55 -22
- package/src/watermelon.js +43 -18
- package/src/wood.js +48 -15
- package/src/zebra-lines.js +38 -12
- package/src/simplex-noise.js +0 -41
package/src/caustics.js
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
|
|
2
|
-
// TSL-Textures:
|
|
2
|
+
// TSL-Textures: Caustics
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
import { Color } from 'three';
|
|
7
|
-
import { exp,
|
|
8
|
-
import {
|
|
7
|
+
import { exp, Fn, positionGeometry, time, vec3 } from 'three/tsl';
|
|
8
|
+
import { voronoi, voronoi3 } from './tsl-utils.js';
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
var defaults = {
|
|
13
13
|
$name: 'Caustics',
|
|
14
14
|
|
|
15
|
+
position: positionGeometry,
|
|
15
16
|
scale: 2,
|
|
16
17
|
speed: 0,
|
|
18
|
+
time: time,
|
|
17
19
|
|
|
18
20
|
color: new Color( 0x50A8C0 ),
|
|
19
21
|
|
|
@@ -22,28 +24,51 @@ var defaults = {
|
|
|
22
24
|
|
|
23
25
|
|
|
24
26
|
|
|
25
|
-
var
|
|
27
|
+
var causticsRaw = Fn( ([ position, scale, speed, time, color, seed ])=>{
|
|
26
28
|
|
|
27
|
-
|
|
29
|
+
var pos = position.mul( exp( scale.sub( 1 ) ) ).add( seed ).toVar( );
|
|
28
30
|
|
|
29
|
-
var
|
|
30
|
-
|
|
31
|
-
var t = time.mul( params.speed.sub( 1 ).exp() )
|
|
31
|
+
var t = time.mul( speed.sub( 1 ).exp() )
|
|
32
32
|
.add( vec3( 0, 2*Math.PI/3, 4*Math.PI/3 ) )
|
|
33
33
|
.sin();
|
|
34
34
|
|
|
35
|
-
var p =
|
|
35
|
+
var p = voronoi3(
|
|
36
36
|
pos.add( vec3(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
voronoi( pos.add( t.xyz ) ),
|
|
38
|
+
voronoi( pos.add( t.yzx ) ),
|
|
39
|
+
voronoi( pos.add( t.zxy ) ),
|
|
40
40
|
) ) );
|
|
41
41
|
|
|
42
42
|
var k = p.length().div( Math.sqrt( 3 ) );
|
|
43
43
|
|
|
44
|
-
return k.add(
|
|
44
|
+
return k.add( color.sub( 0.5 ).mul( 2 ) );
|
|
45
|
+
|
|
46
|
+
} ).setLayout( {
|
|
47
|
+
name: 'causticsRaw',
|
|
48
|
+
type: 'vec3',
|
|
49
|
+
inputs: [
|
|
50
|
+
{ name: 'position', type: 'vec3' },
|
|
51
|
+
{ name: 'scale', type: 'float' },
|
|
52
|
+
{ name: 'speed', type: 'float' },
|
|
53
|
+
{ name: 'time', type: 'float' },
|
|
54
|
+
{ name: 'color', type: 'vec3' },
|
|
55
|
+
{ name: 'seed', type: 'float' },
|
|
56
|
+
] }
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
function caustics( params={} ) {
|
|
62
|
+
|
|
63
|
+
var { position, scale, speed, time, color, seed } = { ...defaults, ...params };
|
|
64
|
+
|
|
65
|
+
return causticsRaw( position, scale, speed, time, color, seed );
|
|
66
|
+
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
|
|
45
70
|
|
|
46
|
-
|
|
71
|
+
caustics.defaults = defaults;
|
|
47
72
|
|
|
48
73
|
|
|
49
74
|
|
package/src/cave-art.js
CHANGED
|
@@ -4,15 +4,17 @@
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
import { Color } from "three";
|
|
7
|
-
import {
|
|
8
|
-
import { noise
|
|
7
|
+
import { float, Fn, If, mix, or, positionGeometry } from 'three/tsl';
|
|
8
|
+
import { noise } from './tsl-utils.js';
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
var defaults = {
|
|
13
13
|
$name: 'Cave art',
|
|
14
14
|
|
|
15
|
+
position: positionGeometry,
|
|
15
16
|
scale: 2,
|
|
17
|
+
|
|
16
18
|
thinness: 2,
|
|
17
19
|
noise: 0.3,
|
|
18
20
|
|
|
@@ -24,17 +26,15 @@ var defaults = {
|
|
|
24
26
|
|
|
25
27
|
|
|
26
28
|
|
|
27
|
-
var
|
|
28
|
-
|
|
29
|
-
params = prepare( params, defaults );
|
|
29
|
+
var caveArtRaw = Fn( ([ position, scale, thinness, xnoise, color, background, seed ]) => {
|
|
30
30
|
|
|
31
|
-
var pos =
|
|
31
|
+
var pos = position.mul( scale.exp( ) ).add( seed ).toVar( 'pos' );
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
var k2 = noise( pos.mul( 1.5 ), 4 ).cos().toVar();
|
|
33
|
+
thinness = float( 3 ).sub( thinness ).exp( );
|
|
35
34
|
|
|
36
|
-
var
|
|
37
|
-
|
|
35
|
+
var k1 = noise( pos, 4 ).sin().toVar( 'k1' ),
|
|
36
|
+
k2 = noise( pos.mul( 1.5 ), 4 ).cos().toVar( 'k2' ),
|
|
37
|
+
k = thinness.sub( k1.add( k2 ).abs( ).pow2( ).mul( 20 ) ).toVar( 'k' );
|
|
38
38
|
|
|
39
39
|
If( or( k1.greaterThan( k2 ), k.lessThan( 0 ) ), ()=>{
|
|
40
40
|
|
|
@@ -44,13 +44,39 @@ var caveArt = TSLFn( ( params ) => {
|
|
|
44
44
|
|
|
45
45
|
If( k.lessThanEqual( 0 ), ()=>{
|
|
46
46
|
|
|
47
|
-
k.assign(
|
|
47
|
+
k.assign( xnoise.mul( noise( pos.mul( 30 ) ).pow2( ) ) );
|
|
48
48
|
|
|
49
49
|
} );
|
|
50
50
|
|
|
51
|
-
return mix(
|
|
51
|
+
return mix( background, color, k );
|
|
52
|
+
|
|
53
|
+
} ).setLayout( {
|
|
54
|
+
name: 'caveArtRaw',
|
|
55
|
+
type: 'vec3',
|
|
56
|
+
inputs: [
|
|
57
|
+
{ name: 'position', type: 'vec3' },
|
|
58
|
+
{ name: 'scale', type: 'float' },
|
|
59
|
+
{ name: 'thinness', type: 'float' },
|
|
60
|
+
{ name: 'xnoise', type: 'float' },
|
|
61
|
+
{ name: 'color', type: 'vec3' },
|
|
62
|
+
{ name: 'background', type: 'vec3' },
|
|
63
|
+
{ name: 'seed', type: 'float' },
|
|
64
|
+
] }
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
function caveArt( params={} ) {
|
|
70
|
+
|
|
71
|
+
var { position, scale, thinness, noise, color, background, seed } = { ...defaults, ...params };
|
|
72
|
+
|
|
73
|
+
return caveArtRaw( position, scale, thinness, noise, color, background, seed );
|
|
74
|
+
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
52
78
|
|
|
53
|
-
|
|
79
|
+
caveArt.defaults = defaults;
|
|
54
80
|
|
|
55
81
|
|
|
56
82
|
|
package/src/circle-decor.js
CHANGED
|
@@ -4,14 +4,15 @@
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
import { Color } from 'three';
|
|
7
|
-
import { exp,
|
|
8
|
-
import { noise,
|
|
7
|
+
import { exp, Fn, mix, positionGeometry } from 'three/tsl';
|
|
8
|
+
import { noise, voronoi } from './tsl-utils.js';
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
var defaults = {
|
|
13
13
|
$name: 'Circle decor',
|
|
14
14
|
|
|
15
|
+
position: positionGeometry,
|
|
15
16
|
scale: 2,
|
|
16
17
|
grains: 0.2,
|
|
17
18
|
|
|
@@ -26,24 +27,49 @@ var defaults = {
|
|
|
26
27
|
|
|
27
28
|
|
|
28
29
|
|
|
29
|
-
var
|
|
30
|
+
var circleDecorRaw = Fn( ([ position, scale, grains, complexity, blur, color, background, seed ])=>{
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
var pos = position.mul( exp( scale.div( 4 ) ) ).add( seed ).toVar( 'pos' );
|
|
33
|
+
var subpos = pos.mul( 2 ).toVar( 'subpos' );
|
|
32
34
|
|
|
33
|
-
var
|
|
34
|
-
var
|
|
35
|
-
|
|
36
|
-
var k1 = mx_worley_noise_float( pos );
|
|
37
|
-
var k2 = mx_worley_noise_float( subpos );
|
|
38
|
-
var k3 = mx_worley_noise_float( pos.mul( params.grains.mul( 4 ).add( 2 ) ) ).mul( 2 );
|
|
35
|
+
var k1 = voronoi( pos );
|
|
36
|
+
var k2 = voronoi( subpos );
|
|
37
|
+
var k3 = voronoi( pos.mul( grains.mul( 4 ).add( 2 ) ) ).mul( 2 );
|
|
39
38
|
|
|
40
39
|
var compScale = noise( pos ).div( 2 ).add( 1 );
|
|
41
40
|
|
|
42
|
-
var k = k1.min( k2, k3 ).clamp( 0, 1 ).mul(
|
|
41
|
+
var k = k1.min( k2, k3 ).clamp( 0, 1 ).mul( complexity.add( 2 ).exp(), compScale, Math.PI ).sin().smoothstep( blur.negate(), blur );
|
|
42
|
+
|
|
43
|
+
return mix( color, background, k.oneMinus() );
|
|
44
|
+
|
|
45
|
+
} ).setLayout( {
|
|
46
|
+
name: 'camouflageRaw',
|
|
47
|
+
type: 'vec3',
|
|
48
|
+
inputs: [
|
|
49
|
+
{ name: 'position', type: 'vec3' },
|
|
50
|
+
{ name: 'scale', type: 'float' },
|
|
51
|
+
{ name: 'grains', type: 'float' },
|
|
52
|
+
{ name: 'complexity', type: 'float' },
|
|
53
|
+
{ name: 'blur', type: 'float' },
|
|
54
|
+
{ name: 'color', type: 'vec3' },
|
|
55
|
+
{ name: 'background', type: 'vec3' },
|
|
56
|
+
{ name: 'seed', type: 'float' },
|
|
57
|
+
] }
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
function circleDecor( params={} ) {
|
|
63
|
+
|
|
64
|
+
var { position, scale, grains, complexity, blur, color, background, seed } = { ...defaults, ...params };
|
|
65
|
+
|
|
66
|
+
return circleDecorRaw( position, scale, grains, complexity, blur, color, background, seed );
|
|
67
|
+
|
|
68
|
+
}
|
|
69
|
+
|
|
43
70
|
|
|
44
|
-
return mix( params.color, params.background, k.oneMinus() );
|
|
45
71
|
|
|
46
|
-
|
|
72
|
+
circleDecor.defaults = defaults;
|
|
47
73
|
|
|
48
74
|
|
|
49
75
|
|
package/src/circles.js
CHANGED
|
@@ -4,39 +4,35 @@
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
import { Color } from "three";
|
|
7
|
-
import { acos, clamp, exp,
|
|
8
|
-
import { hsl,
|
|
7
|
+
import { acos, clamp, exp, Fn, positionGeometry, select, sin, vec3 } from 'three/tsl';
|
|
8
|
+
import { hsl, toHsl } from './tsl-utils.js';
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
var defaults = {
|
|
13
13
|
$name: 'Circles',
|
|
14
14
|
|
|
15
|
+
position: positionGeometry,
|
|
16
|
+
|
|
15
17
|
scale: 2,
|
|
16
18
|
variety: 1,
|
|
17
19
|
|
|
18
20
|
color: new Color( 0xF0E0D0 ),
|
|
19
21
|
|
|
20
|
-
flat: 0,
|
|
21
|
-
|
|
22
22
|
seed: 0,
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
var
|
|
27
|
+
var circlesRaw = Fn( ([ position, scale, variety, color, seed ]) => {
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
var pos = select( params.flat, positionGeometry, positionGeometry.normalize() );
|
|
29
|
+
var pos = position.toVar();
|
|
32
30
|
|
|
33
31
|
var angle = acos( clamp( pos.y, -1, 1 ) ).mul( 20 );
|
|
34
32
|
|
|
35
|
-
var
|
|
36
|
-
|
|
37
|
-
var x = angle.div( 3000 ).mul( scale );
|
|
33
|
+
var x = angle.div( 3000 ).mul( exp( scale.sub( 1 ) ) );
|
|
38
34
|
|
|
39
|
-
var k =
|
|
35
|
+
var k = seed.sin().mul( 100 ).toVar();
|
|
40
36
|
|
|
41
37
|
for ( var n=0; n<=10; n++ ) {
|
|
42
38
|
|
|
@@ -46,17 +42,41 @@ var circles = TSLFn( ( params ) => {
|
|
|
46
42
|
|
|
47
43
|
k.assign( k.div( 200 ).clamp( -2, 2 ) );
|
|
48
44
|
|
|
49
|
-
var HSL = toHsl(
|
|
45
|
+
var HSL = toHsl( color );
|
|
50
46
|
|
|
51
|
-
var hue = HSL.x.add( k.mul(
|
|
47
|
+
var hue = HSL.x.add( k.mul( variety ) ).mod( 1 ).mul( 10 );
|
|
52
48
|
|
|
53
49
|
var huei = hue.floor();
|
|
54
50
|
var huef = hue.sub( huei );
|
|
55
51
|
huef = select( huef.lessThan( 0.5 ), huef.pow( 1.5 ), huef.pow( 1/1.5 ) );
|
|
56
52
|
|
|
57
|
-
return hsl( huei.add( huef ).div( 10 ), HSL.
|
|
53
|
+
return hsl( vec3( huei.add( huef ).div( 10 ), HSL.yz ) );
|
|
54
|
+
|
|
55
|
+
} ).setLayout( {
|
|
56
|
+
name: 'circlesRaw',
|
|
57
|
+
type: 'vec3',
|
|
58
|
+
inputs: [
|
|
59
|
+
{ name: 'position', type: 'vec3' },
|
|
60
|
+
{ name: 'scale', type: 'float' },
|
|
61
|
+
{ name: 'variety', type: 'float' },
|
|
62
|
+
{ name: 'color', type: 'vec3' },
|
|
63
|
+
{ name: 'seed', type: 'float' },
|
|
64
|
+
] }
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
function circles( params={} ) {
|
|
70
|
+
|
|
71
|
+
var { position, scale, variety, color, seed } = { ...defaults, ...params };
|
|
72
|
+
|
|
73
|
+
return circlesRaw( position, scale, variety, color, seed );
|
|
74
|
+
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
58
78
|
|
|
59
|
-
|
|
79
|
+
circles.defaults = defaults;
|
|
60
80
|
|
|
61
81
|
|
|
62
82
|
|
package/src/clouds.js
CHANGED
|
@@ -4,14 +4,15 @@
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
import { Color } from "three";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { clamp, exp, Fn, mix, mul, positionGeometry } from 'three/tsl';
|
|
8
|
+
import { fractal } from './tsl-utils.js';
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
var defaults = {
|
|
13
13
|
$name: 'Clouds',
|
|
14
14
|
|
|
15
|
+
position: positionGeometry,
|
|
15
16
|
scale: 2,
|
|
16
17
|
density: 0.5,
|
|
17
18
|
opacity: 1,
|
|
@@ -24,49 +25,89 @@ var defaults = {
|
|
|
24
25
|
|
|
25
26
|
|
|
26
27
|
|
|
27
|
-
var
|
|
28
|
+
var cloud_core = Fn( ([ position, scale, density, seed ]) => {
|
|
28
29
|
|
|
29
|
-
const pos =
|
|
30
|
-
const scale = exp( params.scale.div( 1.5 ).sub( 0.5 ) );
|
|
30
|
+
const pos = position.mul( exp( scale.div( 1.5 ).sub( 0.5 ) ) ).add( seed ).toVar( 'pos' );
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
const k = add(
|
|
34
|
-
noised( pos, scale, 1, params.seed ),
|
|
35
|
-
noised( pos, scale, 2, params.seed ).mul( 0.80 ),
|
|
36
|
-
noised( pos, scale, 6, params.seed ).mul( 0.10 ),
|
|
37
|
-
noised( pos, scale, 8, params.seed ).mul( 0.07, params.opacity ),
|
|
38
|
-
params.density.remap( 0, 1, -0.5, 1.5 )
|
|
39
|
-
);
|
|
32
|
+
return fractal( pos, 4 ).add( density.remap( 0, 1, -0.5, 1.5 ) );
|
|
40
33
|
|
|
41
|
-
|
|
42
|
-
|
|
34
|
+
} ).setLayout( {
|
|
35
|
+
name: 'cloud_core',
|
|
36
|
+
type: 'float',
|
|
37
|
+
inputs: [
|
|
38
|
+
{ name: 'position', type: 'vec3' },
|
|
39
|
+
{ name: 'scale', type: 'float' },
|
|
40
|
+
{ name: 'density', type: 'float' },
|
|
41
|
+
{ name: 'seed', type: 'float' },
|
|
42
|
+
] }
|
|
43
|
+
);
|
|
43
44
|
|
|
44
|
-
// final color+opacity
|
|
45
|
-
return vec4( mix( params.subcolor, params.color, k.clamp( 0, 1 ) ), a );
|
|
46
45
|
|
|
47
|
-
} );
|
|
48
46
|
|
|
47
|
+
var cloudsRaw = Fn( ([ position, scale, density, /*opacity,*/color, subcolor, seed ]) => {
|
|
49
48
|
|
|
49
|
+
var k = cloud_core( position, scale, density, seed );
|
|
50
|
+
return mix( subcolor, color, k.clamp( 0, 1 ) );
|
|
50
51
|
|
|
51
|
-
var clouds = TSLFn( ( params ) => {
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
} ).setLayout( {
|
|
54
|
+
name: 'cloudsRaw',
|
|
55
|
+
type: 'vec3',
|
|
56
|
+
inputs: [
|
|
57
|
+
{ name: 'position', type: 'vec3' },
|
|
58
|
+
{ name: 'scale', type: 'float' },
|
|
59
|
+
{ name: 'density', type: 'float' },
|
|
60
|
+
/*{ name: 'opacity', type: 'float' },*/
|
|
61
|
+
{ name: 'color', type: 'vec3' },
|
|
62
|
+
{ name: 'subcolor', type: 'vec3' },
|
|
63
|
+
{ name: 'seed', type: 'float' },
|
|
64
|
+
] }
|
|
65
|
+
);
|
|
55
66
|
|
|
56
|
-
return _clouds( params ).rgb;
|
|
57
67
|
|
|
58
|
-
}, defaults );
|
|
59
68
|
|
|
69
|
+
var cloudsOpacityRaw = Fn( ([ position, scale, density, opacity, /*color,subcolor,*/seed ]) => {
|
|
60
70
|
|
|
71
|
+
var k = cloud_core( position, scale, density, seed );
|
|
72
|
+
return clamp( 0, 1, mul( k, 2 ).pow( 1.5 ).sub( 1 ).mul( opacity ) );
|
|
61
73
|
|
|
62
|
-
|
|
74
|
+
} ).setLayout( {
|
|
75
|
+
name: 'cloudsOpacityRaw',
|
|
76
|
+
type: 'float',
|
|
77
|
+
inputs: [
|
|
78
|
+
{ name: 'position', type: 'vec3' },
|
|
79
|
+
{ name: 'scale', type: 'float' },
|
|
80
|
+
{ name: 'density', type: 'float' },
|
|
81
|
+
{ name: 'opacity', type: 'float' },
|
|
82
|
+
/*{ name: 'color', type: 'vec3' },*/
|
|
83
|
+
/*{ name: 'subcolor', type: 'vec3' },*/
|
|
84
|
+
{ name: 'seed', type: 'float' },
|
|
85
|
+
] }
|
|
86
|
+
);
|
|
63
87
|
|
|
64
|
-
// prepare parameters
|
|
65
|
-
params = prepare( params, defaults );
|
|
66
88
|
|
|
67
|
-
return _clouds( params ).a;
|
|
68
89
|
|
|
69
|
-
}
|
|
90
|
+
function clouds( params={} ) {
|
|
91
|
+
|
|
92
|
+
var { position, scale, density, /*opacity,*/color, subcolor, seed } = { ...defaults, ...params };
|
|
93
|
+
|
|
94
|
+
return cloudsRaw( position, scale, density, /*opacity,*/color, subcolor, seed );
|
|
95
|
+
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
clouds.opacity = function ( params={} ) {
|
|
101
|
+
|
|
102
|
+
var { position, scale, density, opacity, /*color,subcolor,*/seed } = { ...defaults, ...params };
|
|
103
|
+
|
|
104
|
+
return cloudsOpacityRaw( position, scale, density, opacity, /*color,subcolor,*/seed );
|
|
105
|
+
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
clouds.defaults = defaults;
|
|
70
111
|
|
|
71
112
|
|
|
72
113
|
|
package/src/concrete.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { cross, exp, Fn, normalLocal, positionGeometry, remap, tangentLocal, vec3 } from 'three/tsl';
|
|
7
|
+
import { approximateNormal, noise } from './tsl-utils.js';
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
@@ -12,6 +12,8 @@ var defaults = {
|
|
|
12
12
|
$name: 'Concrete',
|
|
13
13
|
$normalNode: true,
|
|
14
14
|
|
|
15
|
+
position: positionGeometry,
|
|
16
|
+
|
|
15
17
|
scale: 2,
|
|
16
18
|
density: 0.5,
|
|
17
19
|
bump: 0.5,
|
|
@@ -21,40 +23,72 @@ var defaults = {
|
|
|
21
23
|
|
|
22
24
|
|
|
23
25
|
|
|
24
|
-
var surfacePos = Fn( ([
|
|
26
|
+
var surfacePos = Fn( ([ position, normal, density ]) => {
|
|
27
|
+
|
|
28
|
+
var k = noise( position, 0.5, 0.5 ).abs().pow( density );
|
|
29
|
+
|
|
30
|
+
return position.add( normal.mul( k ) );
|
|
31
|
+
|
|
32
|
+
} ).setLayout( {
|
|
33
|
+
name: 'surfacePos',
|
|
34
|
+
type: 'vec3',
|
|
35
|
+
inputs: [
|
|
36
|
+
{ name: 'position', type: 'vec3' },
|
|
37
|
+
{ name: 'normal', type: 'vec3' },
|
|
38
|
+
{ name: 'density', type: 'float' },
|
|
39
|
+
] }
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
var concreteRaw = Fn( ([ position, normal, tangent, scale, density, bump, seed ]) => {
|
|
45
|
+
|
|
46
|
+
const EPS = 0.001;
|
|
47
|
+
|
|
48
|
+
var seed3d = vec3( 1, 2, 3 ).mul( seed ).sin().mul( 100 ).toVar( 'seed3d' );
|
|
49
|
+
|
|
50
|
+
var xposition = position.mul( exp( scale.div( 2 ).add( 2 ) ) ).add( seed3d ).toVar( 'xposition' ),
|
|
51
|
+
xnormal = normal.normalize().toVar( 'xnormal' ),
|
|
52
|
+
xtangent = tangent.normalize().mul( EPS ).toVar( 'xtangent' ),
|
|
53
|
+
xbitangent = cross( xnormal, xtangent ).normalize().mul( EPS ).toVar( 'xbitangent' );
|
|
54
|
+
|
|
55
|
+
var xdensity = remap( density, 0, 1, 10, 0.5 ).toVar( 'xdensity' );
|
|
25
56
|
|
|
26
|
-
|
|
27
|
-
k = bump.mul( pow( abs( k ), density ) );
|
|
57
|
+
xnormal.mulAssign( bump );
|
|
28
58
|
|
|
29
|
-
|
|
59
|
+
var pos = surfacePos( xposition, xnormal, xdensity ).toVar( 'pos' ),
|
|
60
|
+
posU = surfacePos( xposition.add( xtangent ), xnormal, xdensity ).toVar( 'posU' ),
|
|
61
|
+
posV = surfacePos( xposition.add( xbitangent ), xnormal, xdensity ).toVar( 'posV' );
|
|
30
62
|
|
|
31
|
-
|
|
63
|
+
return approximateNormal( pos, posU, posV );
|
|
32
64
|
|
|
65
|
+
} ).setLayout( {
|
|
66
|
+
name: 'concreteRaw',
|
|
67
|
+
type: 'vec3',
|
|
68
|
+
inputs: [
|
|
69
|
+
{ name: 'position', type: 'vec3' },
|
|
70
|
+
{ name: 'normal', type: 'vec3' },
|
|
71
|
+
{ name: 'tangent', type: 'vec3' },
|
|
72
|
+
{ name: 'scale', type: 'float' },
|
|
73
|
+
{ name: 'density', type: 'float' },
|
|
74
|
+
{ name: 'bump', type: 'float' },
|
|
75
|
+
{ name: 'seed', type: 'float' },
|
|
76
|
+
] }
|
|
77
|
+
);
|
|
33
78
|
|
|
34
|
-
var concrete = TSLFn( ( params ) => {
|
|
35
79
|
|
|
36
|
-
params = prepare( params, defaults );
|
|
37
80
|
|
|
38
|
-
|
|
81
|
+
function concrete( params={} ) {
|
|
39
82
|
|
|
40
|
-
var position
|
|
41
|
-
normal = normalLocal.normalize().toVar(),
|
|
42
|
-
tangent = tangentLocal.normalize().mul( eps ).toVar(),
|
|
43
|
-
bitangent = cross( normal, tangent ).normalize().mul( eps ).toVar();
|
|
83
|
+
var { position, scale, density, bump, seed } = { ...defaults, ...params };
|
|
44
84
|
|
|
45
|
-
|
|
46
|
-
var seed = vec3( sin( params.seed ).mul( 100 ), cos( params.seed.div( 2 ) ).mul( 100 ), sin( params.seed.div( 3 ) ).mul( 100 ) ).toVar();
|
|
85
|
+
return concreteRaw( position, normalLocal, tangentLocal, scale, density, bump, seed );
|
|
47
86
|
|
|
48
|
-
|
|
49
|
-
var posU = surfacePos( position.add( tangent ), normal, params.bump, density, seed );
|
|
50
|
-
var posV = surfacePos( position.add( bitangent ), normal, params.bump, density, seed );
|
|
87
|
+
}
|
|
51
88
|
|
|
52
|
-
var dU = sub( posU, pos ),
|
|
53
|
-
dV = sub( posV, pos );
|
|
54
89
|
|
|
55
|
-
return transformNormalToView( cross( dU, dV ).normalize() );
|
|
56
90
|
|
|
57
|
-
|
|
91
|
+
concrete.defaults = defaults;
|
|
58
92
|
|
|
59
93
|
|
|
60
94
|
|