UNPKG

tsl-textures

Version:

A collection of Three.js Shading Language (TSL) textures

102 lines (57 loc) 2.61 kB
// 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 };