TriNoise3D.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // https://github.com/cabbibo/glsl-tri-noise-3d
  2. import { loop } from '../utils/LoopNode.js';
  3. import { float, vec3, tslFn } from '../shadernode/ShaderNode.js';
  4. const tri = tslFn( ( [ x ] ) => {
  5. return x.fract().sub( .5 ).abs();
  6. } );
  7. const tri3 = tslFn( ( [ p ] ) => {
  8. return vec3( tri( p.z.add( tri( p.y.mul( 1. ) ) ) ), tri( p.z.add( tri( p.x.mul( 1. ) ) ) ), tri( p.y.add( tri( p.x.mul( 1. ) ) ) ) );
  9. } );
  10. const triNoise3D = tslFn( ( [ p_immutable, spd, time ] ) => {
  11. const p = vec3( p_immutable ).toVar();
  12. const z = float( 1.4 ).toVar();
  13. const rz = float( 0.0 ).toVar();
  14. const bp = vec3( p ).toVar();
  15. loop( { start: float( 0.0 ), end: float( 3.0 ), type: 'float', condition: '<=' }, () => {
  16. const dg = vec3( tri3( bp.mul( 2.0 ) ) ).toVar();
  17. p.addAssign( dg.add( time.mul( float( 0.1 ).mul( spd ) ) ) );
  18. bp.mulAssign( 1.8 );
  19. z.mulAssign( 1.5 );
  20. p.mulAssign( 1.2 );
  21. const t = float( tri( p.z.add( tri( p.x.add( tri( p.y ) ) ) ) ) ).toVar();
  22. rz.addAssign( t.div( z ) );
  23. bp.addAssign( 0.14 );
  24. } );
  25. return rz;
  26. } );
  27. // layouts
  28. tri.setLayout( {
  29. name: 'tri',
  30. type: 'float',
  31. inputs: [
  32. { name: 'x', type: 'float' }
  33. ]
  34. } );
  35. tri3.setLayout( {
  36. name: 'tri3',
  37. type: 'vec3',
  38. inputs: [
  39. { name: 'p', type: 'vec3' }
  40. ]
  41. } );
  42. triNoise3D.setLayout( {
  43. name: 'triNoise3D',
  44. type: 'float',
  45. inputs: [
  46. { name: 'p', type: 'vec3' },
  47. { name: 'spd', type: 'float' },
  48. { name: 'time', type: 'float' }
  49. ]
  50. } );
  51. export { tri, tri3, triNoise3D };