tsl-textures
Version:
A collection of Three.js Shading Language (TSL) textures
102 lines (57 loc) • 2.61 kB
JavaScript
// TSL-Textures: Dyson sphere
import { Color } from 'three';
import { exp, float, Fn, Loop, mix, positionGeometry, vec3 } from 'three/tsl';
import { prepare } from './tsl-utils.js';
var noisea = Fn( ([ pos ])=>{
var p = pos.mul( 5**0.5 ).fract().toVar();
p.addAssign( p.dot( p.add( vec3( 31.4159, 27.1828, 14.142 ) ) ) );
return p.z.mul( p.x.add( p.y ) ).fract().mul( 2 ).sub( 1 );
} );
var smooth = Fn( ([ x ])=>{
var t = x.oneMinus().clamp( 0, 1 ).toVar();
return t.mul( t ).mul( float( 3 ).sub( t.mul( 2 ) ) );
} );
var noiseg = Fn( ([ pos ])=>{
var minx = pos.x.floor().toVar();
var maxx = minx.add( 1 ).toVar();
var miny = pos.y.floor().toVar();
var maxy = miny.add( 1 ).toVar();
var minz = pos.z.floor().toVar();
var maxz = minz.add( 1 ).toVar();
var dx = smooth( pos.x.fract() ).toVar();
var dy = smooth( pos.y.fract() ).toVar();
var dz = smooth( pos.z.fract() ).toVar();
var mx = smooth( dx.oneMinus() ).toVar();
var my = smooth( dy.oneMinus() ).toVar();
var mz = smooth( dz.oneMinus() ).toVar();
var n000 = noisea( vec3( minx, miny, minz ) ).mul( mx ).mul( my ).mul( mz ).toVar();
var n001 = noisea( vec3( minx, miny, maxz ) ).mul( mx ).mul( my ).mul( dz ).toVar();
var n010 = noisea( vec3( minx, maxy, minz ) ).mul( mx ).mul( dy ).mul( mz ).toVar();
var n011 = noisea( vec3( minx, maxy, maxz ) ).mul( mx ).mul( dy ).mul( dz ).toVar();
var n100 = noisea( vec3( maxx, miny, minz ) ).mul( dx ).mul( my ).mul( mz ).toVar();
var n101 = noisea( vec3( maxx, miny, maxz ) ).mul( dx ).mul( my ).mul( dz ).toVar();
var n110 = noisea( vec3( maxx, maxy, minz ) ).mul( dx ).mul( dy ).mul( mz ).toVar();
var n111 = noisea( vec3( maxx, maxy, maxz ) ).mul( dx ).mul( dy ).mul( dz ).toVar();
return n000.add( n001 ).add( n010 ).add( n011 ).add( n100 ).add( n101 ).add( n110 ).add( n111 );
} );
var dysonSphere = Fn( ( params )=>{
params = prepare( { ...dysonSphere.defaults, ...params } );
var pos = positionGeometry.mul( exp( params.scale.div( 2 ).add( 0.5 ) ) ).add( params.seed ).toVar( );
var res = vec3().toVar();
var factor = float( 1 ).toVar();
Loop( params.complexity.add( 4 ), ()=>{
res.addAssign( noiseg( pos.mul( factor ) ) );
factor.addAssign( factor );
} );
return mix( params.background, params.color, res.x.add( 1 ).div( 5 ) );
} );
dysonSphere.defaults = {
$name: 'Dyson sphere',
scale: 2,
complexity: 2,
variation: 0,
color: new Color( 0xc0d0ff ),
background: new Color( 0 ),
seed: 0,
};
export { dysonSphere };