UNPKG

tsl-textures

Version:

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

63 lines (33 loc) 1.63 kB
// TSL-Textures: Water Drops import { cos, cross, exp, Fn, normalLocal, positionGeometry, remap, sin, sub, tangentLocal, transformNormalToView, vec3 } from 'three/tsl'; import { noise, prepare } from './tsl-utils.js'; var surfacePos = Fn( ([ pos, normal, bump, density, seed ]) => { var k = noise( pos.add( seed ) ).add( density ).clamp( 0, 1 ); k = cos( k.mul( Math.PI ) ).add( 1 ).pow( 0.5 ).toVar(); return pos.add( k.mul( normal, bump ) ); } ); var waterDrops = Fn( ( params ) => { params = prepare( { ...waterDrops.defaults, ...params } ); var eps = 0.001; var position = positionGeometry.mul( exp( params.scale.div( 1 ).add( 1 ) ) ).toVar( ), normal = normalLocal.normalize().toVar(), tangent = tangentLocal.normalize().mul( eps ).toVar(), bitangent = cross( normal, tangent ).normalize().mul( eps ).toVar(); var density = remap( params.density, 0, 1, 1.5, 0.7 ).toVar(); var seed = vec3( sin( params.seed ).mul( 100 ), cos( params.seed.div( 2 ) ).mul( 100 ), sin( params.seed.div( 3 ) ).mul( 100 ) ).toVar(); var pos = surfacePos( position, normal, params.bump, density, seed ); var posU = surfacePos( position.add( tangent ), normal, params.bump, density, seed ); var posV = surfacePos( position.add( bitangent ), normal, params.bump, density, seed ); var dU = sub( posU, pos ), dV = sub( posV, pos ); return transformNormalToView( cross( dU, dV ).normalize() ); } ); waterDrops.defaults = { $name: 'Water Drops', $normalNode: true, scale: 1.4, density: 0.5, bump: 0.6, seed: 0, }; export { waterDrops };