Guest User

Speed test perlin noise

a guest
Aug 29th, 2014
253
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2. $start = microtime(true);
  3. $generator = new Perlin();
  4. for($i=0; $i<100000; $i++){
  5.     $generator->noise($i,$i,$i,$size=32);
  6. }
  7. $end = microtime(true);
  8. echo $end-$start;
  9.  
  10. class Perlin {
  11.     var $p, $permutation, $seed;
  12.     var $_default_size = 64;
  13.    
  14.     function __construct($seed=NULL) {
  15.         $this->p = array();
  16.         $this->permutation = array( 151,160,137,91,90,15,
  17.         131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
  18.         190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
  19.         88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
  20.         77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
  21.         102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
  22.         135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
  23.         5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
  24.         223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
  25.         129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
  26.         251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
  27.         49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
  28.         138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180
  29.         );
  30.        
  31.         for ($i=0; $i < 256 ; $i++) {
  32.             $this->p[256+$i] = $this->p[$i] = $this->permutation[$i];
  33.         }
  34.  
  35.         if ($seed === NULL) $this->seed = time();
  36.         else $this->seed = $seed;
  37.     }
  38.    
  39.     function noise($x,$y,$z,$size=NULL) {  
  40.         if ($size == NULL) $size = $this->_default_size;
  41.         $value = 0.0; $initialSize = $size;
  42.         while($size >= 1) {
  43.             $value += $this->smoothNoise($x / $size, $y / $size, $z / $size) * $size;
  44.             $size /= 2.0;
  45.         }
  46.         return $value / $initialSize;
  47.    
  48.     }
  49.     function smoothNoise($x, $y, $z) {
  50.         $x+=$this->seed; $y+=$this->seed; $z+=$this->seed;
  51.        
  52.         $orig_x = $x;
  53.         $orig_y = $y;
  54.         $orig_z = $z;
  55.        
  56.         $X1 = (int)floor($x) & 255;
  57.         $Y1 = (int)floor($y) & 255;
  58.         $Z1 = (int)floor($z) & 255;
  59.         $x -= floor($x);
  60.         $y -= floor($y);
  61.         $z -= floor($z);
  62.         $u = $this->fade($x);
  63.         $v = $this->fade($y);
  64.         $w = $this->fade($z);
  65.        
  66.         $A  = $this->p[$X1]+$Y1;
  67.         $AA = $this->p[$A]+$Z1;
  68.         $AB = $this->p[$A+1]+$Z1;
  69.         $B  = $this->p[$X1+1]+$Y1;
  70.         $BA = $this->p[$B]+$Z1;
  71.         $BB = $this->p[$B+1]+$Z1;
  72.        
  73.         $result = $this->lerp($w, $this->lerp($v, $this->lerp($u, $this->grad($this->p[$AA  ], $x  , $y  , $z   ),
  74.                                                                   $this->grad($this->p[$BA  ], $x-1, $y  , $z   )),
  75.                                                   $this->lerp($u, $this->grad($this->p[$AB  ], $x  , $y-1, $z   ),
  76.                                                                   $this->grad($this->p[$BB  ], $x-1, $y-1, $z   ))),
  77.                                   $this->lerp($v, $this->lerp($u, $this->grad($this->p[$AA+1], $x  , $y  , $z-1 ),
  78.                                                                   $this->grad($this->p[$BA+1], $x-1, $y  , $z-1 )),
  79.                                                   $this->lerp($u, $this->grad($this->p[$AB+1], $x  , $y-1, $z-1 ),
  80.                                                                   $this->grad($this->p[$BB+1], $x-1, $y-1, $z-1 ))));
  81.        
  82.         return $result;
  83.     }
  84.    
  85.     function fade($t) {
  86.         return $t * $t * $t * ( ( $t * ( ($t * 6) - 15) ) + 10);
  87.     }
  88.    
  89.     function lerp($t, $a, $b) {
  90.         return $a + $t * ($b - $a);
  91.     }
  92.    
  93.     function grad($hash, $x, $y, $z) {
  94.         $h = $hash & 15;                  
  95.         $u = $h<8 ? $x : $y;
  96.         $v = $h<4 ? $y : ($h==12||$h==14 ? $x : $z);
  97.        
  98.         return (($h&1) == 0 ? $u : -$u) + (($h&2) == 0 ? $v : -$v);
  99.     }
  100. }
RAW Paste Data