tsl-textures 0.2.0 → 0.3.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.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "A collection of Three.js Shading Language (TSL) textures ",
5
5
  "main": "index.js",
6
6
  "repository": {
package/src/camouflage.js CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
 
6
6
  import { Color } from 'three';
7
- import { tslFn, If, round, vec3, exp, positionLocal } from 'three/nodes';
7
+ import { exp, If, positionLocal, round, tslFn, vec3 } from 'three/nodes';
8
8
  import { noise } from 'tsl-textures/tsl-utils.js';
9
9
 
10
10
 
@@ -0,0 +1,54 @@
1
+ 
2
+ // TSL-Textures: Cave Art
3
+
4
+
5
+
6
+ import { Color } from "three";
7
+ import { abs, add, exp, float, If, mix, or, positionLocal, pow2, sub, tslFn } from 'three/nodes';
8
+ import { noise } from 'tsl-textures/tsl-utils.js';
9
+
10
+
11
+ var caveArt = tslFn( ( params ) => {
12
+
13
+ var pos = positionLocal.mul( exp( params.scale ) ).add( params.seed ).toVar( );
14
+
15
+ var k1 = noise( pos ).mul( 4 ).sin().toVar();
16
+ var k2 = noise( pos.mul( 1.5 ) ).mul( 4 ).cos().toVar();
17
+
18
+ var thinness = exp( sub( float( 3 ), params.thinness ) );
19
+ var k = sub( thinness, pow2( abs( add( k1, k2 ) ) ).mul( 20 ) ).toVar();
20
+
21
+ If( or( k1.greaterThan( k2 ), k.lessThan( 0 ) ), ()=>{
22
+
23
+ k.assign( 0 );
24
+
25
+ } );
26
+
27
+ If( k.lessThanEqual( 0 ), ()=>{
28
+
29
+ k.assign( params.noise.mul( pow2( noise( pos.mul( 30 ) ) ) ) );
30
+
31
+ } );
32
+
33
+ return mix( params.background, params.color, k );
34
+
35
+ } );
36
+
37
+
38
+
39
+ caveArt.defaults = {
40
+ $name: 'Cave art',
41
+
42
+ scale: 2,
43
+ thinness: 2,
44
+ noise: 0.3,
45
+
46
+ color: new Color( 0xD34545 ),
47
+ background: new Color( 0xFFF8F0 ),
48
+
49
+ seed: 0,
50
+ };
51
+
52
+
53
+
54
+ export { caveArt };
@@ -0,0 +1,49 @@
1
+ 
2
+ // TSL-Textures: Entangled
3
+
4
+
5
+
6
+ import { Color } from "three";
7
+ import { abs, exp, float, floor, loop, max, mix, mul, oneMinus, positionLocal, pow, sin, tslFn } from 'three/nodes';
8
+ import { noise } from 'tsl-textures/tsl-utils.js';
9
+
10
+
11
+
12
+ var entangled = tslFn( ( params ) => {
13
+
14
+ var scale = exp( params.scale.div( 2 ) ).toVar( );
15
+ var pos = positionLocal.add( params.seed ).toVar( );
16
+ var k = float( -10000 ).toVar( );
17
+ var k1 = float( 0 ).toVar( );
18
+
19
+ loop( floor( float( params.density ) ), ()=> {
20
+
21
+ k1.assign( sin( noise( mul( pos, scale ) ).mul( 3*Math.PI ) ) );
22
+ k.assign( max( k, k1 ) );
23
+ scale.mulAssign( 1.2 );
24
+
25
+ } );
26
+
27
+ k.assign( oneMinus( pow( abs( k ), 5 ) ).mul( 6 ) );
28
+
29
+ return mix( params.color, params.background, k );
30
+
31
+ } );
32
+
33
+
34
+
35
+ entangled.defaults = {
36
+ $name: 'Entangled',
37
+
38
+ scale: 2,
39
+ density: 10,
40
+
41
+ color: new Color( 0x002040 ),
42
+ background: new Color( 0xFFFFFF ),
43
+
44
+ seed: 0,
45
+ };
46
+
47
+
48
+
49
+ export { entangled };
package/src/fordite.js CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
 
6
6
  import { Color } from 'three';
7
- import { tslFn, vec3, sin, mul, exp, positionLocal } from 'three/nodes';
8
- import { noise, hsl } from 'tsl-textures/tsl-utils.js';
7
+ import { exp, mul, positionLocal, sin, tslFn, vec3 } from 'three/nodes';
8
+ import { hsl, noise } from 'tsl-textures/tsl-utils.js';
9
9
 
10
10
 
11
11
 
package/src/isolines.js CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
 
6
6
  import { Color } from "three";
7
- import { tslFn, oneMinus, sub, smoothstep, sin, add, mix, exp, positionLocal } from 'three/nodes';
7
+ import { add, exp, mix, oneMinus, positionLocal, sin, smoothstep, sub, tslFn } from 'three/nodes';
8
8
  import { noise } from 'tsl-textures/tsl-utils.js';
9
9
 
10
10
 
package/src/marble.js CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
 
6
6
  import { Color } from "three";
7
- import { tslFn, add, oneMinus, If, div, pow, mix, mul, exp, positionLocal } from 'three/nodes';
7
+ import { add, div, exp, If, mix, mul, oneMinus, positionLocal, pow, tslFn } from 'three/nodes';
8
8
  import { noise } from 'tsl-textures/tsl-utils.js';
9
9
 
10
10
 
package/src/stars.js ADDED
@@ -0,0 +1,44 @@
1
+ 
2
+ // TSL-Textures: Stars
3
+
4
+
5
+
6
+ import { Color } from "three";
7
+ import { abs, add, cond, exp, mix, positionLocal, tslFn } from 'three/nodes';
8
+ import { hsl, noise, toHsl } from 'tsl-textures/tsl-utils.js';
9
+
10
+
11
+
12
+ var stars = tslFn( ( params ) => {
13
+
14
+ var pos = positionLocal.mul( exp( params.scale.div( 2 ).add( 3 ) ) ).add( params.seed ).toVar( );
15
+
16
+ var k = abs( noise( pos ) ).pow( 10 ).mul( 10 );
17
+
18
+ k = k.mul( exp( params.density.sub( 2 ) ) );
19
+
20
+ var dS = cond( k.greaterThan( 0.1 ), params.variation.mul( noise( pos ) ), 0 );
21
+
22
+ var col = toHsl( mix( params.background, params.color, k ) );
23
+
24
+ return hsl( add( col.x, dS ), col.y, col.z );
25
+
26
+ } );
27
+
28
+
29
+
30
+ stars.defaults = {
31
+ $name: 'Stars',
32
+
33
+ scale: 2,
34
+ density: 2,
35
+ variation: 0,
36
+
37
+ color: new Color( 0xfff5f0 ),
38
+ background: new Color( 0x000060 ),
39
+
40
+ seed: 0,
41
+ };
42
+
43
+
44
+ export { stars };
package/src/tsl-utils.js CHANGED
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { MathUtils } from 'three';
6
- import { tslFn, sub, vec3, min, max, uniform } from 'three/nodes';
6
+ import { add, cond, cos, float, If, max, min, sin, sub, tslFn, uniform, vec3 } from 'three/nodes';
7
7
  import { mx_perlin_noise_float as noise } from 'three/addons/nodes/materialx/lib/mx_noise.js';
8
8
 
9
9
 
@@ -53,7 +53,7 @@ hslHelper.setLayout( {
53
53
 
54
54
 
55
55
 
56
-
56
+ // convert from hsl to rgb
57
57
  const hsl = tslFn( ([ h, s, l ]) => {
58
58
 
59
59
  h = h.fract().add( 1 ).fract();
@@ -79,6 +79,50 @@ hsl.setLayout( {
79
79
  } );
80
80
 
81
81
 
82
+ // convert from rgb to hsl
83
+ const toHsl = tslFn( ([ rgb ]) => {
84
+
85
+ var R = float( rgb.x ).toVar(),
86
+ G = float( rgb.y ).toVar(),
87
+ B = float( rgb.z ).toVar();
88
+
89
+ var mx = max( R, max( G, B ) ).toVar();
90
+ var mn = min( R, min( G, B ) ).toVar();
91
+
92
+ var H = float( 0 ).toVar(),
93
+ S = float( 0 ).toVar(),
94
+ L = add( mx, mn ).div( 2 );
95
+
96
+ If( mn.notEqual( mx ), ()=>{
97
+
98
+ const delta = sub( mx, mn ).toVar();
99
+
100
+ S.assign( cond( L.lessThanEqual( 0.5 ), delta.div( add( mn, mx ) ), delta.div( sub( 2, add( mn, mx ) ) ) ) );
101
+ If( mx.equal( R ), ()=>{
102
+
103
+ H.assign( sub( G, B ).div( delta ).add( cond( G.lessThanEqual( B ), 6, 0 ) ) );
104
+
105
+ } )
106
+ .elseif( mx.equal( G ), ()=>{
107
+
108
+ H.assign( sub( B, R ).div( delta ).add( 2 ) );
109
+
110
+ } )
111
+ .else( ()=>{
112
+
113
+ H.assign( sub( R, G ).div( delta ).add( 4 ) );
114
+
115
+ } );
116
+ H.divAssign( 6 );
117
+
118
+ } );
119
+ return vec3( H, S, L );
120
+
121
+ } );
122
+
123
+
124
+
125
+
82
126
 
83
127
  // make all elements dynamic (i.e. uniform)
84
128
  function dynamic( params ) {
@@ -98,11 +142,34 @@ function dynamic( params ) {
98
142
 
99
143
 
100
144
 
145
+ // convert phi-theta angles to position on unit sphere
146
+ const spherical = tslFn( ([ phi, theta ]) => {
147
+
148
+ return vec3(
149
+ sin( theta ).mul( sin( phi ) ),
150
+ cos( phi ),
151
+ cos( theta ).mul( sin( phi ) )
152
+ );
153
+
154
+ } );
155
+
156
+ spherical.setLayout( {
157
+ name: 'spherical',
158
+ type: 'vec3',
159
+ inputs: [
160
+ { name: 'phi', type: 'float' },
161
+ { name: 'theta', type: 'float' },
162
+ ]
163
+ } );
164
+
165
+
101
166
  export
102
167
  {
103
168
  map,
104
169
  mapExp,
105
170
  noise,
106
171
  hsl,
107
- dynamic
172
+ toHsl,
173
+ dynamic,
174
+ spherical
108
175
  };
@@ -0,0 +1,48 @@
1
+ 
2
+ // TSL-Textures: Zebra Lines
3
+
4
+
5
+
6
+ import { Color } from "three";
7
+ import { acos, clamp, exp, mix, positionLocal, sin, tslFn } from 'three/nodes';
8
+ import { spherical } from 'tsl-textures/tsl-utils.js';
9
+
10
+
11
+
12
+ var zebraLines = tslFn( ( params ) => {
13
+
14
+ var pos = positionLocal.normalize().toVar( );
15
+
16
+ var dir = spherical( params.phi, params.theta ).toVar();
17
+
18
+ var angle = acos( clamp( dir.dot( pos ), -1, 1 ) );
19
+
20
+ var scale = exp( params.scale.add( 1 ) ).toVar();
21
+
22
+ var k = sin( angle.mul( scale ) ).sub( params.thinness.sub( 0.5 ).mul( 2 ) );
23
+
24
+ k = clamp( k.mul( 1000 ).div( scale ), -1, 1 ).mul( 0.5 ).add( 0.5 );
25
+
26
+ return mix( params.background, params.color, k );
27
+
28
+ } );
29
+
30
+
31
+
32
+ zebraLines.defaults = {
33
+ $name: 'Zebra lines',
34
+
35
+ scale: 2,
36
+ thinness: 0.5,
37
+ phi: 0,
38
+ theta: 0,
39
+
40
+ color: new Color( 0x0 ),
41
+ background: new Color( 0xFFFFFF ),
42
+
43
+ // no seed for zebra lines
44
+ };
45
+
46
+
47
+
48
+ export { zebraLines };