Skaruts

ImprovedNoise.gd

Jun 4th, 2018
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.85 KB | None | 0 0
  1. extends Node
  2.  
  3. #############################################################
  4. # Improved Noise by Ken Perlin
  5. # Ported from: https://mrl.nyu.edu/~perlin/noise/
  6. #------------------------------------------------------------
  7.  
  8. var p = []
  9. var permutation = [ 151,160,137,91,90,15,
  10.     131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
  11.     190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
  12.     88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
  13.     77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
  14.     102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
  15.     135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
  16.     5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
  17.     223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
  18.     129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
  19.     251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
  20.     49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
  21.     138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]
  22.  
  23. func _init():
  24.     for i in range(512):
  25.         p.append(0)
  26.  
  27.     for i in range(256):
  28.         p[i] = permutation[i]
  29.         p[256+i] = p[i]
  30.  
  31. func noise(x, y, z): # float params
  32.     # FIND UNIT CUBE THAT CONTAINS POINT.
  33.     var X = int(floor(x)) & 255
  34.     var Y = int(floor(y)) & 255
  35.     var Z = int(floor(z)) & 255
  36.  
  37.     # FIND RELATIVE X,Y,Z OF POINT IN CUBE.
  38.     x -= floor(x)
  39.     y -= floor(y)
  40.     z -= floor(z)
  41.  
  42.     # COMPUTE FADE CURVES FOR EACH OF X,Y,Z.
  43.     var u = fade(x)
  44.     var v = fade(y)
  45.     var w = fade(z)
  46.  
  47.     # HASH COORDINATES OF THE 8 CUBE CORNERS
  48.     var A  = p[X  ] + Y
  49.     var AA = p[A  ] + Z
  50.     var AB = p[A+1] + Z
  51.     var B  = p[X+1] + Y
  52.     var BA = p[B  ] + Z
  53.     var BB = p[B+1] + Z
  54.  
  55.     # AND ADD BLENDED RESULTS FROM 8 CORNERS OF CUBE
  56.     return lerp_(w, lerp_(v, lerp_(u, grad( p[AA  ], x  , y  , z   ),
  57.                                       grad( p[BA  ], x-1, y  , z   )),
  58.                              lerp_(u, grad( p[AB  ], x  , y-1, z   ),
  59.                                       grad( p[BB  ], x-1, y-1, z   ))),
  60.                     lerp_(v, lerp_(u, grad( p[AA+1], x  , y  , z-1 ),
  61.                                       grad( p[BA+1], x-1, y  , z-1 )),
  62.                              lerp_(u, grad( p[AB+1], x  , y-1, z-1 ),
  63.                                       grad( p[BB+1], x-1, y-1, z-1 ))))
  64.  
  65. func fade(t): # float
  66.     return t * t * t * (t * (t * 6 - 15) + 10)
  67.  
  68. func lerp_(t, a, b):
  69.     # Ken Perlin used t (weight) as the first parameter to better organize
  70.     # the blending statement above, I suppose, so a swap is needed here
  71.     # return a + t * (b - a)
  72.     return lerp(a, b, t)
  73.  
  74. func grad(hash_, x, y, z): # int, floats
  75.     # CONVERT LO 4 BITS OF HASH CODE INTO 12 GRADIENT DIRECTIONS.
  76.     var h = hash_ & 15
  77.     var u = x if h < 8 else y
  78.     var v = y if h < 4 else x if h == 12 or h == 14 else z
  79.  
  80.     return (u if (h & 1) == 0 else -u) + (v if (h & 2) == 0 else -v)
Advertisement
Add Comment
Please, Sign In to add comment