tsl-textures 0.3.0 → 0.5.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tsl-textures",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "A collection of Three.js Shading Language (TSL) textures ",
5
5
  "main": "index.js",
6
6
  "repository": {
@@ -0,0 +1,37 @@
1
+ 
2
+ // TSL-Textures: Concrete
3
+
4
+
5
+
6
+ //import { Color } from "three";
7
+ import { abs, /*add, div,*/ exp, /*If, MeshLambertNodeMaterial, mix,*/ mul, /*oneMinus,*/ positionLocal, pow, remap, tslFn } from 'three/nodes';
8
+ import { /*hsl,*/ noise } from 'tsl-textures/tsl-utils.js';
9
+
10
+
11
+
12
+ var concrete = tslFn( ( params ) => {
13
+
14
+ var pos = positionLocal.mul( exp( params.scale ) ).add( params.seed ).toVar( );
15
+
16
+ var k = noise( pos );
17
+
18
+ //return hsl( 0, 0, mul(params.bump,pow(abs(k.div(2).add(0.5)),remap(params.density,0,1,10,0.5))) );
19
+ return mul( params.bump, pow( abs( k.div( 2 ).add( 0.5 ) ), remap( params.density, 0, 1, 10, 0.5 ) ) );
20
+
21
+ } );
22
+
23
+
24
+
25
+ concrete.defaults = {
26
+ $name: 'Concrete',
27
+
28
+ scale: 2,
29
+ density: 1,
30
+ bump: 1,
31
+
32
+ seed: 0,
33
+ };
34
+
35
+
36
+
37
+ export { concrete };
package/src/clouds.js ADDED
@@ -0,0 +1,61 @@
1
+ 
2
+ // TSL-Textures: Clouds
3
+
4
+
5
+
6
+ import { Color } from "three";
7
+ import { clamp, exp, min, mix, mul, positionLocal, tslFn, vec4 } from 'three/nodes';
8
+ import { noise } from 'tsl-textures/tsl-utils.js';
9
+
10
+
11
+
12
+ var _clouds = tslFn( ( params ) => {
13
+
14
+ var pos = positionLocal.toVar(),
15
+ scale = exp( params.scale.div( 1.5 ).sub( 0.5 ) ).toVar(),
16
+ density = params.density.remap( 0, 1, -0.15, 0.15 ).toVar();
17
+
18
+ var k = noise( pos.mul( scale ).add( params.seed ) ).add( params.density ).toVar( );
19
+ k.addAssign( mul( 0.80, noise( pos.mul( scale, 2 ).add( params.seed ) ) ).add( density ) );
20
+ k.addAssign( mul( 0.10, noise( pos.mul( scale, 6 ).add( params.seed ) ) ).add( density ) );
21
+ k.addAssign( mul( 0.07, noise( pos.mul( scale, 8 ).add( params.seed ) ), params.opacity ).add( density ) );
22
+
23
+ var a = clamp( 0, 1, mul( k, 2 ).pow( 1.5 ).sub( 1 ).mul( params.opacity ) ).toVar();
24
+
25
+ return vec4( mix( params.subcolor, params.color, min( 1, k ) ), a );
26
+
27
+ } );
28
+
29
+
30
+ var clouds = tslFn( ( params ) => {
31
+
32
+ return _clouds( params ).rgb;
33
+
34
+ } );
35
+
36
+
37
+
38
+ clouds.opacity = tslFn( ( params ) => {
39
+
40
+ return _clouds( params ).a;
41
+
42
+ } );
43
+
44
+
45
+
46
+ clouds.defaults = {
47
+ $name: 'Clouds',
48
+
49
+ scale: 2,
50
+ density: 0.5,
51
+ opacity: 1,
52
+
53
+ color: new Color( 0xFFFFFF ),
54
+ subcolor: new Color( 0xA0A0B0 ),
55
+
56
+ seed: 0,
57
+ };
58
+
59
+
60
+
61
+ export { clouds };
package/src/grid.js ADDED
@@ -0,0 +1,49 @@
1
+ 
2
+ // TSL-Textures: Grid
3
+
4
+
5
+
6
+ import { Color } from "three";
7
+ import { abs, add, div, equirectUV, min, mix, mul, oneMinus, positionLocal, pow, remapClamp, round, sin, smoothstep, sub, tslFn } from 'three/nodes';
8
+
9
+
10
+
11
+ var grid = tslFn( ( params ) => {
12
+
13
+ var uv = equirectUV( positionLocal.normalize() ).toVar(),
14
+ a = mul( uv.x, 2*Math.PI ),
15
+ b = mul( uv.y, Math.PI ).toVar();
16
+
17
+ var uTo = div( round( mul( uv.x, params.countU ) ), params.countU ),
18
+ vTo = div( round( mul( uv.y, params.countV ) ), params.countV ),
19
+ aTo = mul( uTo, 2*Math.PI ),
20
+ bTo = mul( vTo, Math.PI );
21
+
22
+ var angleU = abs( sub( a, aTo ) ).mul( sin( b ) ),
23
+ angleV = abs( sub( b, bTo ) ),
24
+ angle = min( angleU, angleV );
25
+
26
+ var treshold = mul( min( div( 2*Math.PI, params.countU ), div( Math.PI, params.countV ) ), remapClamp( pow( params.thinness, 0.5 ), 0, 1, 0.9, 0.04 ), 0.5 );
27
+ var k = oneMinus( smoothstep( sub( treshold, 0.002 ), add( treshold, 0.002 ), angle ) );
28
+
29
+ return mix( params.background, params.color, k );
30
+
31
+ } );
32
+
33
+
34
+
35
+ grid.defaults = {
36
+ $name: 'Grid',
37
+
38
+ countU: 32,
39
+ countV: 16,
40
+
41
+ thinness: 0.8,
42
+
43
+ color: new Color( 0x000000 ),
44
+ background: new Color( 0xFFFFFF ),
45
+ };
46
+
47
+
48
+
49
+ export { grid };
package/src/marble.js CHANGED
@@ -8,6 +8,7 @@ import { add, div, exp, If, mix, mul, oneMinus, positionLocal, pow, tslFn } from
8
8
  import { noise } from 'tsl-textures/tsl-utils.js';
9
9
 
10
10
 
11
+
11
12
  var marble = tslFn( ( params ) => {
12
13
 
13
14
  var pos = positionLocal.mul( exp( params.scale ) ).add( params.seed ).toVar( );
@@ -0,0 +1,77 @@
1
+ 
2
+ // TSL-Textures: Neon Lights
3
+
4
+
5
+
6
+ import { Color } from "three";
7
+ import { abs, cond, exp, oneMinus, positionLocal, sqrt, tslFn, vec3 } from 'three/nodes';
8
+ import { hsl, noise, toHsl } from 'tsl-textures/tsl-utils.js';
9
+
10
+
11
+
12
+ var neonLights = tslFn( ( params ) => {
13
+
14
+ var pos = positionLocal;//.mul( exp( params.scale ) ).add( params.seed ).toVar( );
15
+
16
+ var scale = exp( params.scale.remap( 0, 4, 2, -2 ) ).toVar();
17
+ var thinness = exp( params.thinness.remap( 0, 1, 1.5, 0 ) ).toVar();
18
+
19
+ var color = params.background.toVar();
20
+ var neon = vec3( 0 ).toVar();
21
+
22
+ var x = noise( pos.xyz ).toVar();
23
+ var y = noise( pos.yzx ).toVar();
24
+ var z = noise( pos.zxy ).toVar();
25
+
26
+ var k = noise( vec3( x, y, z ).mul( scale ).add( params.seed ) ).toVar();
27
+ k.assign( oneMinus( sqrt( abs( k ) ) ).pow( 3 ) );
28
+
29
+ neon.assign( params.colorA );
30
+ var HSL = toHsl( neon );
31
+ neon.assign( hsl( HSL.x, HSL.y, HSL.z.mul( k ) ) );
32
+
33
+ color.addAssign( cond( params.mode.equal( 0 ), neon, neon.negate() ).mul( thinness ) );
34
+
35
+ k.assign( noise( vec3( y, z, x ).mul( scale ).sub( params.seed ) ) );
36
+ k.assign( oneMinus( sqrt( abs( k ) ) ).pow( 3 ) );
37
+
38
+ neon.assign( params.colorB );
39
+ var HSL = toHsl( neon );
40
+ neon.assign( hsl( HSL.x, HSL.y, HSL.z.mul( k ) ) );
41
+
42
+ color.addAssign( cond( params.mode.equal( 0 ), neon, neon.negate() ).mul( thinness ) );
43
+
44
+
45
+ k.assign( noise( vec3( z, x, y.negate() ).mul( scale ).add( params.seed ) ) );
46
+ k.assign( oneMinus( sqrt( abs( k ) ) ).pow( 3 ) );
47
+
48
+ neon.assign( params.colorC );
49
+ var HSL = toHsl( neon );
50
+ neon.assign( hsl( HSL.x, HSL.y, HSL.z.mul( k ) ) );
51
+
52
+ color.addAssign( cond( params.mode.equal( 0 ), neon, neon.negate() ).mul( thinness ) );
53
+
54
+ return color;
55
+
56
+ } );
57
+
58
+
59
+
60
+ neonLights.defaults = {
61
+ $name: 'Neon Lights',
62
+
63
+ scale: 1.5,
64
+ thinness: 0.8,
65
+ mode: 0, // 0=additive, 1=subtractive
66
+
67
+ colorA: new Color( 0xFF0000 ),
68
+ colorB: new Color( 0x00FF00 ),
69
+ colorC: new Color( 0x0000FF ),
70
+ background: new Color( 0x000000 ),
71
+
72
+ seed: 0,
73
+ };
74
+
75
+
76
+
77
+ export { neonLights };
@@ -0,0 +1,48 @@
1
+ 
2
+ // TSL-Textures: Photosphere
3
+
4
+
5
+
6
+ import { Color } from "three";
7
+ import { exp, loop, mix, positionLocal, tslFn, vec3 } from 'three/nodes';
8
+ import { applyEuler, noise } from 'tsl-textures/tsl-utils.js';
9
+
10
+
11
+
12
+ var photosphere = tslFn( ( params ) => {
13
+
14
+ var scale = exp( params.scale.add( 1 ) ).toVar( );
15
+ var pos = positionLocal.toVar( );
16
+
17
+ var vec = vec3( pos ).toVar();
18
+
19
+ loop( 6, () => {
20
+
21
+ vec.assign( applyEuler( vec, pos.mul( scale ) ) );
22
+ scale.mulAssign( params.seed.mul( scale ).sin().mul( 0.05 ).add( 1.1 ) );
23
+
24
+ } );
25
+
26
+
27
+ var k = noise( vec ).add( 1 ).div( 2 );
28
+
29
+ return mix( params.background, params.color, k );
30
+
31
+ } );
32
+
33
+
34
+
35
+ photosphere.defaults = {
36
+ $name: 'Photosphere',
37
+
38
+ scale: 2,
39
+
40
+ color: new Color( 0xFFFF00 ),
41
+ background: new Color( 0xFF0000 ),
42
+
43
+ seed: 0,
44
+ };
45
+
46
+
47
+
48
+ export { photosphere };
package/src/satin.js ADDED
@@ -0,0 +1,47 @@
1
+ 
2
+ // TSL-Textures: Satin
3
+
4
+
5
+
6
+ import { Color } from "three";
7
+ import { abs, exp, mix, positionLocal, pow, tslFn, vec3 } from 'three/nodes';
8
+ import { noise } from 'tsl-textures/tsl-utils.js';
9
+
10
+
11
+
12
+ var satin = tslFn( ( params ) => {
13
+
14
+ var pos = positionLocal.toVar( );
15
+
16
+ var scale = exp( params.scale.div( 3 ) ).toVar();
17
+
18
+ var k = noise(
19
+ vec3(
20
+ noise( vec3( pos.x.mul( 2 ), pos.y, pos.z ).mul( scale ) ),
21
+ noise( vec3( pos.x, pos.y.mul( 2 ), pos.z ).mul( scale ) ),
22
+ noise( vec3( pos.x, pos.y, pos.z.mul( 2 ) ).mul( scale ) ),
23
+ ).mul( scale ).add( params.seed )
24
+ );
25
+
26
+ k = pow( abs( k ), 3 ).mul( 20 );
27
+
28
+ return mix( params.background, params.color, k );
29
+
30
+ } );
31
+
32
+
33
+
34
+ satin.defaults = {
35
+ $name: 'Satin',
36
+
37
+ scale: 2,
38
+
39
+ color: new Color( 0x7080FF ),
40
+ background: new Color( 0x000050 ),
41
+
42
+ seed: 0,
43
+ };
44
+
45
+
46
+
47
+ export { satin };
@@ -0,0 +1,66 @@
1
+ 
2
+ // TSL-Textures: Scepter Head
3
+
4
+
5
+
6
+ import { Color } from "three";
7
+ import { abs, add, cos, floor, max, mix, mul, positionLocal, remapClamp, sign, tan, tslFn, vec3 } from 'three/nodes';
8
+ import { hsl, mod, noise, remapExp, toHsl } from 'tsl-textures/tsl-utils.js';
9
+
10
+
11
+
12
+ var scepterHead = tslFn( ( params ) => {
13
+
14
+ var pos = positionLocal;
15
+
16
+ var fx = pos.x.mul( remapExp( params.xFactor, 0, 100, 1.35, 30 ) ).toVar( ),
17
+ fy = pos.y.mul( remapExp( params.yFactor, 0, 100, 1.35, 30 ) ).toVar( ),
18
+ fz = pos.z.mul( remapExp( params.zFactor, 0, 100, 1.35, 30 ) ).toVar( );
19
+
20
+ var cosX = cos( fx ).toVar(),
21
+ cosY = cos( fy ).toVar(),
22
+ cosZ = cos( fz ).toVar();
23
+
24
+ var k = noise( vec3( pos.x.div( cosX ), pos.y.div( cosY ), pos.z.div( cosZ ) ) );
25
+
26
+ k = sign( k ).mul( abs( k ).pow( 0.75 ) );
27
+
28
+ var dx = abs( mul( fx, tan( fx ) ).add( 1 ).div( cos( fx ) ) ),
29
+ dy = abs( mul( fy, tan( fy ) ).add( 1 ).div( cos( fy ) ) ),
30
+ dz = abs( mul( fz, tan( fz ) ).add( 1 ).div( cos( fz ) ) );
31
+
32
+ var HSL = vec3().toVar();
33
+
34
+ var indexX = ( abs( floor( ( fx.mul( 2/Math.PI ).add( 1 ) ).div( 2 ) ) ) ),
35
+ indexY = ( abs( floor( ( fy.mul( 2/Math.PI ).add( 1 ) ).div( 2 ) ) ) ),
36
+ indexZ = ( abs( floor( ( fz.mul( 2/Math.PI ).add( 1 ) ).div( 2 ) ) ) );
37
+
38
+ var index = mod( ( add( indexX, indexY, indexZ ) ), 2 );
39
+
40
+ HSL.assign( toHsl( mix( params.colorA, params.colorB, index ) ) );
41
+ var color1 = hsl( HSL.x, HSL.y, HSL.z.mul( k ) ).toVar();
42
+
43
+ HSL.assign( toHsl( params.colorRim ) );
44
+ var color2 = hsl( HSL.x, HSL.y, mul( 2, k, HSL.z ) ).toVar();
45
+
46
+ return mix( color1, color2, remapClamp( max( dx, max( dy, dz ) ), 55-10, 55+10 ) );
47
+
48
+ } );
49
+
50
+
51
+
52
+ scepterHead.defaults = {
53
+ $name: 'Scepter head',
54
+
55
+ xFactor: 10,
56
+ yFactor: 22,
57
+ zFactor: 10,
58
+
59
+ colorRim: new Color( 0xFFFFFF ),
60
+ colorA: new Color( 0x70E0FF ),
61
+ colorB: new Color( 0x3000FF ),
62
+ };
63
+
64
+
65
+
66
+ export { scepterHead };
package/src/scream.js ADDED
@@ -0,0 +1,46 @@
1
+ 
2
+ // TSL-Textures: Scream
3
+
4
+
5
+
6
+ import { Color } from "three";
7
+ import { add, cos, exp, mix, positionLocal, sin, tslFn } from 'three/nodes';
8
+ import { hsl, noise, toHsl } from 'tsl-textures/tsl-utils.js';
9
+
10
+
11
+
12
+ var scream = tslFn( ( params ) => {
13
+
14
+ var pos = positionLocal.mul( exp( params.scale ) ).add( params.seed ).toVar( );
15
+
16
+ var k = noise( add( sin( pos.xyz ), cos( pos.yzx ) ) );
17
+
18
+ pos.assign( positionLocal.mul( exp( params.scale ).mul( k ) ).add( params.seed ) );
19
+
20
+ var k = noise( add( sin( pos.xyz ), cos( pos.yzx ) ).mul( 2 ) );
21
+
22
+ var col = mix( params.background, params.color, k ).toVar();
23
+
24
+ var HSL = toHsl( col ).toVar();
25
+
26
+ return hsl( add( HSL.x, params.variety.mul( sin( k.mul( Math.PI ) ) ).mul( 0.5 ) ), HSL.y, HSL.z );
27
+
28
+ } );
29
+
30
+
31
+
32
+ scream.defaults = {
33
+ $name: 'Scream',
34
+
35
+ scale: 2,
36
+ variety: 1,
37
+
38
+ color: new Color( 0xF0F060 ),
39
+ background: new Color( 0xD09090 ),
40
+
41
+ seed: 0,
42
+ };
43
+
44
+
45
+
46
+ export { scream };
@@ -0,0 +1,39 @@
1
+ 
2
+ // TSL-Textures: Noise Pattern
3
+
4
+
5
+
6
+ import { Color } from "three";
7
+ import { clamp, exp, mix, positionLocal, tslFn } from 'three/nodes';
8
+ import { noise } from 'tsl-textures/tsl-utils.js';
9
+
10
+
11
+
12
+ var simplexNoise = tslFn( ( params ) => {
13
+
14
+ var pos = positionLocal.mul( exp( params.scale ) ).add( params.seed );
15
+
16
+ var k = clamp( 0, 1, noise( pos ).mul( 0.5, exp( params.contrast ) ).add( 0.5, params.balance ) );
17
+
18
+ return mix( params.background, params.color, k );
19
+
20
+ } );
21
+
22
+
23
+
24
+ simplexNoise.defaults = {
25
+ $name: 'Simplex noise',
26
+
27
+ scale: 2,
28
+ balance: 0,
29
+ contrast: 0,
30
+
31
+ color: new Color( 0xFFFFFF ),
32
+ background: new Color( 0x000000 ),
33
+
34
+ seed: 0,
35
+ };
36
+
37
+
38
+
39
+ export { simplexNoise };
package/src/tsl-utils.js CHANGED
@@ -1,32 +1,15 @@
1
1
  
2
2
  // Equirectangular Texture Generator - TSL Utility Functions
3
3
  //
4
+ // hsl( h, s, l ):vec3 - convert from hsl to rgb
5
+ // toHsl( rgb:vec3 ):vec3 - convert from rgb to hsl
6
+ // spherical( phi, theta ):vec3 - from angles to point on unit sphere
7
+ // applyEuler( vec:vec3, eu:vec3 ):vec3 - apply Euler rotation to a vector
4
8
 
5
- import { MathUtils } from 'three';
6
- import { add, cond, cos, float, If, max, min, sin, sub, tslFn, uniform, vec3 } from 'three/nodes';
7
- import { mx_perlin_noise_float as noise } from 'three/addons/nodes/materialx/lib/mx_noise.js';
8
-
9
-
10
-
11
- function map( x, toMin=0, toMax=1, fromMin=0, fromMax=100 ) {
12
-
13
- x = MathUtils.mapLinear( x, fromMin, fromMax, toMin, toMax );
14
-
15
- return x;
16
-
17
- }
18
-
19
-
20
-
21
- function mapExp( x, toMin, toMax, fromMin=0, fromMax=100 ) {
22
-
23
- x = map( x, 0, 1, fromMin, fromMax );
24
- x = 2**( x * Math.log2( toMax/toMin ) + Math.log2( toMin ) );
25
-
26
- return x;
27
9
 
28
- }
29
10
 
11
+ import { add, cond, cos, cross, div, float, floor, If, log2, max, min, mul, pow, remap, sin, sub, tslFn, uniform, vec3, vec4 } from 'three/nodes';
12
+ import { mx_perlin_noise_float as noise } from 'three/addons/nodes/materialx/lib/mx_noise.js';
30
13
 
31
14
 
32
15
  // helper function - convert hsl to rgb, ported to TSL from:
@@ -163,13 +146,84 @@ spherical.setLayout( {
163
146
  } );
164
147
 
165
148
 
149
+
150
+ // apply Euler rotation to a vector
151
+ const applyEuler = tslFn( ([ vec, eu ]) => {
152
+
153
+ var quat = quaternionFromEuler( eu );
154
+ return applyQuaternion( vec, quat );
155
+
156
+ } );
157
+
158
+
159
+ // convert Euler XYZ angles to quaternion
160
+ const quaternionFromEuler = tslFn( ([ eu ]) => {
161
+
162
+ var c1 = cos( eu.x.div( 2 ) );
163
+ var c2 = cos( eu.y.div( 2 ) );
164
+ var c3 = cos( eu.z.div( 2 ) );
165
+
166
+ var s1 = sin( eu.x.div( 2 ) );
167
+ var s2 = sin( eu.y.div( 2 ) );
168
+ var s3 = sin( eu.z.div( 2 ) );
169
+
170
+ return vec4(
171
+ add( mul( s1, c2, c3 ), mul( c1, s2, s3 ) ),
172
+ sub( mul( c1, s2, c3 ), mul( s1, c2, s3 ) ),
173
+ add( mul( c1, c2, s3 ), mul( s1, s2, c3 ) ),
174
+ sub( mul( c1, c2, c3 ), mul( s1, s2, s3 ) ),
175
+ );
176
+
177
+ } );
178
+
179
+
180
+ // apply quaternion rotation to a vector
181
+ const applyQuaternion = tslFn( ([ vec, quat ]) => {
182
+
183
+ var t = cross( quat, vec ).mul( 2 ).toVar( );
184
+
185
+ return add( vec, t.mul( quat.w ), cross( quat.xyz, t ) );
186
+
187
+ } );
188
+
189
+
190
+ // calculate modulo (missing in TSL?)
191
+ const mod = tslFn( ([ x, y ]) => {
192
+
193
+ return sub( x, floor( div( x, y ) ).mul( y ) );
194
+
195
+ } );
196
+
197
+
198
+
199
+ // exponential version of remap
200
+ const remapExp = tslFn( ([ x, fromMin, fromMax, toMin, toMax ]) => {
201
+
202
+ x = remap( x, fromMin, fromMax, 0, 1 );
203
+ x = pow( 2, mul( x, log2( toMax.div( toMin ) ) ).add( log2( toMin ) ) );
204
+ return x;
205
+ /*
206
+
207
+ function mapExp( x, toMin, toMax, fromMin=0, fromMax=100 ) {
208
+
209
+ x = map( x, 0, 1, fromMin, fromMax );
210
+ x = 2**( x * Math.log2( toMax/toMin ) + Math.log2( toMin ) );
211
+
212
+ return x;
213
+
214
+ }
215
+ */
216
+
217
+ } );
218
+
166
219
  export
167
220
  {
168
- map,
169
- mapExp,
170
221
  noise,
171
222
  hsl,
172
223
  toHsl,
173
224
  dynamic,
174
- spherical
225
+ spherical,
226
+ applyEuler,
227
+ mod,
228
+ remapExp
175
229
  };