UNPKG

tsl-textures

Version:

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

82 lines (44 loc) 1.75 kB
// TSL-Textures: Voronoi Cells import { Color } from 'three'; import { exp, float, Fn, If, Loop, mix, positionGeometry, vec3 } from 'three/tsl'; import { noise, prepare } from './tsl-utils.js'; var cellCenter = Fn( ([ cell ])=>{ return cell.add( noise( cell.mul( Math.PI ) ) ); } ); var voronoiCells = Fn( ( params )=>{ params = prepare( { ...voronoiCells.defaults, ...params } ); var pos = positionGeometry.mul( exp( params.scale.div( 2 ).add( 0.5 ) ) ).add( params.seed ).toVar( ); var midCell = pos.round().toVar(); var minCell = midCell.toVar(); var minDist = float( 1 ).toVar(); var cell = vec3().toVar(); var dist = float().toVar(); var i = float( 0 ).toVar(); Loop( 27, () => { var ix = i.mod( 3 ).sub( 1 ); var iy = i.div( 3 ).floor().mod( 3 ).sub( 1 ); var iz = i.div( 9 ).floor().sub( 1 ); cell.assign( midCell.add( vec3( ix, iy, iz ) ) ); dist.assign( pos.distance( cellCenter( cell ) ).add( noise( pos ).div( 5 ) ) ); If( dist.lessThan( minDist ), ()=>{ minDist.assign( dist ); minCell.assign( cell ); } ); i.addAssign( 1 ); } ); var n = noise( minCell.mul( Math.PI ) ).toVar(); var k = mix( minDist, n.add( 1 ).div( 2 ), params.facet ); var color = mix( params.color, params.background, k ).toVar(); var randomColor = vec3( n.mul( 16.8 ), n.mul( 31.4159 ), n.mul( 27.1828 ) ).sin().add( 1 ).div( 2 ); return mix( color, mix( color, randomColor, params.variation ), params.variation ); } ); voronoiCells.defaults = { $name: 'Voronoi cells', scale: 2, variation: 0, facet: 0, color: new Color( 0 ), background: new Color( 0xc0d0ff ), seed: 0, }; export { voronoiCells };