Advertisement
Oysi

Ported Simplex Noise (2D & 3D)

May 30th, 2014
382
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.71 KB | None | 0 0
  1.  
  2. -- Script ported by Oysi
  3.  
  4. -- http://webstaff.itn.liu.se/~stegu/simplexnoise/SimplexNoise.java
  5.  
  6. local grad3 = {
  7.     { 1, 1, 0}, {-1, 1, 0}, { 1,-1, 0}, {-1,-1, 0};
  8.     { 1, 0, 1}, {-1, 0, 1}, { 1, 0,-1}, {-1, 0,-1};
  9.     { 0, 1, 1}, { 0,-1, 1}, { 0, 1,-1}, { 0,-1,-1};
  10. }
  11.  
  12. local p = {
  13.     151,160,137, 91, 90, 15,131, 13,201, 95, 96, 53,194,233,  7,225,
  14.     140, 36,103, 30, 69,142,  8, 99, 37,240, 21, 10, 23,190,  6,148,
  15.     247,120,234, 75,  0, 26,197, 62, 94,252,219,203,117, 35, 11, 32,
  16.      57,177, 33, 88,237,149, 56, 87,174, 20,125,136,171,168, 68,175,
  17.      74,165, 71,134,139, 48, 27,166, 77,146,158,231, 83,111,229,122,
  18.      60,211,133,230,220,105, 92, 41, 55, 46,245, 40,244,102,143, 54,
  19.      65, 25, 63,161,  1,216, 80, 73,209, 76,132,187,208, 89, 18,169,
  20.     200,196,135,130,116,188,159, 86,164,100,109,198,173,186,  3, 64,
  21.      52,217,226,250,124,123,  5,202, 38,147,118,126,255, 82, 85,212,
  22.     207,206, 59,227, 47, 16, 58, 17,182,189, 28, 42,223,183,170,213,
  23.     119,248,152,  2, 44,154,163, 70,221,153,101,155,167, 43,172,  9,
  24.     129, 22, 39,253, 19, 98,108,110, 79,113,224,232,178,185,112,104,
  25.     218,246, 97,228,251, 34,242,193,238,210,144, 12,191,179,162,241,
  26.      81, 51,145,235,249, 14,239,107, 49,192,214, 31,181,199,106,157,
  27.     184, 84,204,176,115,121, 50, 45,127,  4,150,254,138,236,205, 93,
  28.     222,114, 67, 29, 24, 72,243,141,128,195, 78, 66,215, 61,156,180,
  29. }
  30.  
  31. local perm = {}
  32. local permMod12 = {}
  33.  
  34. for i = 1, 512 do
  35.     perm[i] = p[(i - 1)%256 + 1]
  36.     permMod12[i] = perm[i] % 12
  37. end
  38.  
  39. local F2 = 0.5*(math.sqrt(3) - 1)
  40. local G2 = (3 - math.sqrt(3))/6
  41. local F3 = 1/3
  42. local G3 = 1/6
  43.  
  44. local function dot2(g, x, y) return g[1]*x + g[2]*y end
  45. local function dot3(g, x, y, z) return g[1]*x + g[2]*y + g[3]*z end
  46.  
  47. function _G.noise2D(xin, yin)
  48.     local n0, n1, n2
  49.  
  50.     local s = (xin + yin)*F2
  51.  
  52.     local i = math.floor(xin + s)
  53.     local j = math.floor(yin + s)
  54.  
  55.     local t = (i + j)*G2
  56.  
  57.     local X0 = i - t
  58.     local Y0 = j - t
  59.  
  60.     local x0 = xin - X0
  61.     local y0 = yin - Y0
  62.  
  63.     local i1, j1
  64.     if x0 > y0 then
  65.         i1 = 1
  66.         j1 = 0
  67.     else
  68.         i1 = 0
  69.         j1 = 1
  70.     end
  71.  
  72.     local x1 = x0 - i1 + G2
  73.     local y1 = y0 - j1 + G2
  74.  
  75.     local x2 = x0 - 1 + 2*G2
  76.     local y2 = y0 - 1 + 2*G2
  77.  
  78.     local ii = i % 256
  79.     local jj = j % 256
  80.  
  81.     local gi0 = permMod12[ii + perm[jj + 1] + 1]
  82.     local gi1 = permMod12[ii + i1 + perm[jj + j1 + 1] + 1]
  83.     local gi2 = permMod12[ii + 1 + perm[jj + 1 + 1] + 1]
  84.  
  85.     local t0 = 0.5 - x0*x0 - y0*y0
  86.     if t0 < 0 then
  87.         n0 = 0
  88.     else
  89.         t0 = t0 * t0
  90.         n0 = t0 * t0 * dot2(grad3[gi0 + 1], x0, y0)
  91.     end
  92.  
  93.     local t1 = 0.5 - x1*x1 - y1*y1
  94.     if t1 < 0 then
  95.         n1 = 0
  96.     else
  97.         t1 = t1 * t1
  98.         n1 = t1 * t1 * dot2(grad3[gi1 + 1], x1, y1)
  99.     end
  100.  
  101.     local t2 = 0.5 - x2*x2 - y2*y2
  102.     if t2 < 0 then
  103.         n2 = 0
  104.     else
  105.         t2 = t2 * t2
  106.         n2 = t2 * t2 * dot2(grad3[gi2 + 1], x2, y2)
  107.     end
  108.  
  109.     return 70 * (n0 + n1 + n2)
  110. end
  111.  
  112. function _G.noise3D(xin, yin, zin)
  113.     local n0, n1, n2, n3
  114.  
  115.     local s = (xin + yin + zin)*F3
  116.  
  117.     local i = math.floor(xin + s)
  118.     local j = math.floor(yin + s)
  119.     local k = math.floor(zin + s)
  120.  
  121.     local t = (i + j + k)*G3
  122.  
  123.     local X0 = i - t
  124.     local Y0 = j - t
  125.     local Z0 = k - t
  126.  
  127.     local x0 = xin - X0
  128.     local y0 = yin - Y0
  129.     local z0 = zin - Z0
  130.  
  131.     local i1, j1, k1
  132.     local i2, j2, k2
  133.  
  134.     if x0 >= y0 then
  135.         if y0 >= z0 then
  136.             i1=1 j1=0 k1=0 i2=1 j2=1 k2=0
  137.         elseif x0 >= z0 then
  138.             i1=1 j1=0 k1=0 i2=1 j2=0 k2=1
  139.         else
  140.             i1=0 j1=0 k1=1 i2=1 j2=0 k2=1
  141.         end
  142.     else
  143.         if y0 < z0 then
  144.             i1=0 j1=0 k1=1 i2=0 j2=1 k2=1
  145.         elseif x0 < z0 then
  146.             i1=0 j1=1 k1=0 i2=0 j2=1 k2=1
  147.         else
  148.             i1=0 j1=1 k1=0 i2=1 j2=1 k2=0
  149.         end
  150.     end
  151.  
  152.     local x1 = x0 - i1 + G3
  153.     local y1 = y0 - j1 + G3
  154.     local z1 = z0 - k1 + G3
  155.  
  156.     local x2 = x0 - i2 + 2*G3
  157.     local y2 = y0 - j2 + 2*G3
  158.     local z2 = z0 - k2 + 2*G3
  159.  
  160.     local x3 = x0 - 1 + 3*G3
  161.     local y3 = y0 - 1 + 3*G3
  162.     local z3 = z0 - 1 + 3*G3
  163.  
  164.     local ii = i % 256
  165.     local jj = j % 256
  166.     local kk = k % 256
  167.  
  168.     local gi0 = permMod12[ii + perm[jj + perm[kk + 1] + 1] + 1]
  169.     local gi1 = permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1 + 1] + 1] + 1]
  170.     local gi2 = permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2 + 1] + 1] + 1]
  171.     local gi3 = permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1 + 1] + 1] + 1]
  172.  
  173.     local t0 = 0.6 - x0*x0 - y0*y0 - z0*z0
  174.     if t0 < 0 then
  175.         n0 = 0
  176.     else
  177.         t0 = t0 * t0
  178.         n0 = t0 * t0 * dot3(grad3[gi0 + 1], x0, y0, z0)
  179.     end
  180.  
  181.     local t1 = 0.6 - x1*x1 - y1*y1 - z1*z1
  182.     if t1 < 0 then
  183.         n1 = 0
  184.     else
  185.         t1 = t1 * t1
  186.         n1 = t1 * t1 * dot3(grad3[gi1 + 1], x1, y1, z1)
  187.     end
  188.  
  189.     local t2 = 0.6 - x2*x2 - y2*y2 - z2*z2
  190.     if t2 < 0 then
  191.         n2 = 0
  192.     else
  193.         t2 = t2 * t2
  194.         n2 = t2 * t2 * dot3(grad3[gi2 + 1], x2, y2, z2)
  195.     end
  196.  
  197.     local t3 = 0.6 - x3*x3 - y3*y3 - z3*z3
  198.     if t3 < 0 then
  199.         n3 = 0
  200.     else
  201.         t3 = t3 * t3
  202.         n3 = t3 * t3 * dot3(grad3[gi3 + 1], x3, y3, z3)
  203.     end
  204.  
  205.     return 32.5*(n0 + n1 + n2 + n3)
  206. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement