topical media & game development

talk show tell print

sample-collect-hush-js-waterfall-files-noise.js / js



  var sinLUT = new Array();
  var cosLUT = new Array();
  var SINCOS_PRECISION = 0.5;
  var DEG_TO_RAD = Math.PI/180.0;
  var SINCOS_LENGTH = Math.round(360 / SINCOS_PRECISION);
  
  for (var i = 0; i < SINCOS_LENGTH; i++) {
      sinLUT[i] = Math.sin(i * DEG_TO_RAD * SINCOS_PRECISION);
      cosLUT[i] = Math.cos(i * DEG_TO_RAD * SINCOS_PRECISION);
  }
  
  var perlin;
  
  var PERLIN_YWRAPB                = 4;        
  var PERLIN_YWRAP                = 1<<PERLIN_YWRAPB;
  var PERLIN_ZWRAPB                = 8;
  var PERLIN_ZWRAP                = 1<<PERLIN_ZWRAPB;
  var PERLIN_SIZE                        = 4095;
  var perlin_octaves                = 4;
  var perlin_amp_falloff        = 0.5;
  
  function noise(x, y, z) {
      if (z == null) z = 0;
      
      if (perlin == null) {
              perlin = new Array(); //float[PERLIN_SIZE + 1];
              for (var i = 0; i < PERLIN_SIZE + 1; i++) {
                      perlin[i] = Math.random();
              }
  
              perlin_cosTable = cosLUT;
              perlin_TWOPI = perlin_PI = SINCOS_LENGTH;
              perlin_PI >>= 1;
      }
  
      if (x<0) x=-x;
      if (y<0) y=-y;
      if (z<0) z=-z;
  
      var xi= x, yi=y, zi=z;
      var xf = x-xi;
      var yf = y-yi;
      var zf = z-zi;
      var rxf, ryf;
  
      var r = 0;
      var ampl = 0.5;
  
      var n1,n2,n3;
  
      for (var i=0; i<perlin_octaves; i++) {
              var of=xi+(yi<<PERLIN_YWRAPB)+(zi<<PERLIN_ZWRAPB);
  
              rxf=noise_fsc(xf);
              ryf=noise_fsc(yf);
  
              n1  = perlin[of&PERLIN_SIZE];
              n1 += rxf*(perlin[(of+1)&PERLIN_SIZE]-n1);
              n2  = perlin[(of+PERLIN_YWRAP)&PERLIN_SIZE];
              n2 += rxf*(perlin[(of+PERLIN_YWRAP+1)&PERLIN_SIZE]-n2);
              n1 += ryf*(n2-n1);
  
                   of += PERLIN_ZWRAP;
              n2  = perlin[of&PERLIN_SIZE];
              n2 += rxf*(perlin[(of+1)&PERLIN_SIZE]-n2);
              n3  = perlin[(of+PERLIN_YWRAP)&PERLIN_SIZE];
              n3 += rxf*(perlin[(of+PERLIN_YWRAP+1)&PERLIN_SIZE]-n3);
              n2 += ryf*(n3-n2);
  
              n1 += noise_fsc(zf)*(n2-n1);
  
              r += n1*ampl;
              ampl *= perlin_amp_falloff;
              xi<<=1; xf*=2;
              yi<<=1; yf*=2;
              zi<<=1; zf*=2;
  
              if (xf>=1.0) { xi++; xf--; }
              if (yf>=1.0) { yi++; yf--; }
              if (zf>=1.0) { zi++; zf--; }
      }
      return r;
  }
  
  function noise_fsc(i) {
      return 0.5*(1.0-perlin_cosTable[Math.round(i*perlin_PI)\%perlin_TWOPI]);
  }


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.