tsl-textures 0.3.0 → 0.4.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.4.0",
4
4
  "description": "A collection of Three.js Shading Language (TSL) textures ",
5
5
  "main": "index.js",
6
6
  "repository": {
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 };
@@ -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,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
-
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
- }
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
18
8
 
19
9
 
20
10
 
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
-
28
- }
29
-
11
+ import { add, cond, cos, cross, float, If, max, min, mul, 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,53 @@ 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
+
166
190
  export
167
191
  {
168
- map,
169
- mapExp,
170
192
  noise,
171
193
  hsl,
172
194
  toHsl,
173
195
  dynamic,
174
- spherical
196
+ spherical,
197
+ applyEuler
175
198
  };