UNPKG

tsl-textures

Version:

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

104 lines (57 loc) 2.83 kB
// TSL-Textures: Runny eggs import { Color } from 'three'; import { cross, exp, Fn, mix, mx_worley_noise_float, normalLocal, positionGeometry, sub, tangentLocal, transformNormalToView } from 'three/tsl'; import { prepare } from './tsl-utils.js'; var runnyEggs = Fn( ( params ) => { params = prepare( { ...runnyEggs.defaults, ...params } ); var pos = positionGeometry.mul( exp( params.scale.div( 1 ) ) ).add( params.seed.sin().mul( 10 ) ).toVar( ); var sizeYolk = params.sizeYolk.oneMinus(); var sizeWhite = params.sizeWhite.oneMinus(); var n = mx_worley_noise_float( pos ).toVar(); var whites = n.add( sizeWhite ).pow( 8 ).oneMinus().clamp( -0.5, 1 ); var yolks = n.add( sizeYolk ).pow( 18 ).oneMinus().clamp( 0, 1 ).pow( 0.4 ).clamp( 0, 1 ); return mix( params.colorBackground, mix( params.colorWhite, params.colorYolk, yolks ), whites ); } ); var surfacePos = Fn( ([ pos, normal, bump, sizeYolk, sizeWhite ]) => { var n = mx_worley_noise_float( pos ).toVar(); var whites = n.add( sizeWhite ).pow( 8 ).oneMinus(); var yolks = n.add( sizeYolk ).pow( 18 ).oneMinus().clamp( 0, 1 ); var k = mix( 0, mix( 0, 1, yolks ), whites ); return pos.add( normal.mul( k ).mul( bump ) ); } ); runnyEggs.normal = Fn( ( params ) => { params = prepare( { ...runnyEggs.defaults, ...params } ); var eps = 0.001; var bump = 0.05; var position = positionGeometry.mul( exp( params.scale.div( 1 ) ) ).add( params.seed.sin().mul( 10 ) ).toVar( ), normal = normalLocal.normalize().toVar(), tangent = tangentLocal.normalize().mul( eps ).toVar(), bitangent = cross( normal, tangent ).normalize().mul( eps ).toVar(); var sizeYolk = params.sizeYolk.oneMinus(); var sizeWhite = params.sizeWhite.oneMinus(); var pos = surfacePos( position, normal, bump, sizeYolk, sizeWhite ); var posU = surfacePos( position.add( tangent ), normal, bump, sizeYolk, sizeWhite ); var posV = surfacePos( position.add( bitangent ), normal, bump, sizeYolk, sizeWhite ); var dU = sub( posU, pos ), dV = sub( posV, pos ); return transformNormalToView( cross( dU, dV ).normalize() ); } ); runnyEggs.roughness = Fn( ( params ) => { params = prepare( { ...runnyEggs.defaults, ...params } ); var pos = positionGeometry.mul( exp( params.scale.div( 1 ) ) ).add( params.seed.sin().mul( 10 ) ).toVar( ); var sizeYolk = params.sizeYolk.oneMinus(); var n = mx_worley_noise_float( pos ).toVar(); var yolks = n.add( sizeYolk ).pow( 18 ).clamp( 0, 1 ); return yolks; } ); runnyEggs.defaults = { $name: 'Runny eggs', scale: 1, sizeYolk: 0.2, sizeWhite: 0.7, colorYolk: new Color( 'orange' ), colorWhite: new Color( 'white' ), colorBackground: new Color( 'lightgray' ), seed: 0, }; export { runnyEggs };