Advertisement
PifyZ

OSimplexNoise

Feb 18th, 2016
358
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.19 KB | None | 0 0
  1. @import {
  2.     const Int8Array dynamic
  3.     const Int16Array dynamic
  4.     const BigNumber dynamic
  5. }
  6.  
  7. namespace OSimplexNoise {
  8.     const STRETCH_CONSTANT_2D = -0.211324865405187118 # (1/sqrt(2+1)-1)/2
  9.     const SQUISH_CONSTANT_2D  = 0.366025403784438647 # (sqrt(2+1)-1)/2
  10.     const NORM_CONSTANT_2D    = 47
  11. }
  12.  
  13. class OSimplexNoise {
  14.     var seed int
  15.     var randArray Int16Array
  16.  
  17.     def new {
  18.         seed = 0
  19.         randArray = Int16Array.new()
  20.     }
  21.  
  22.     def getSeed int {
  23.         return seed
  24.     }
  25.  
  26.     def setSeed(seed int) {
  27.         var source List<int>
  28.         source = []
  29.         source.resize(256, 0)
  30.  
  31.         self.seed = seed
  32.  
  33.         for i in 0 .. 256 {
  34.             source[i] = i
  35.         }
  36.  
  37.         var aaa = BigNumber.new("6364136223846793005").toNumber()
  38.         var bbb = BigNumber.new("1442695040888963407").toNumber()
  39.  
  40.         seed *= aaa + bbb
  41.         seed *= aaa + bbb
  42.         seed *= aaa + bbb
  43.  
  44.         var i = 255
  45.         while true {
  46.             var r int
  47.  
  48.             seed *= aaa + bbb
  49.             r = (seed + 31) % (i + 1)
  50.  
  51.             if r < 0 {
  52.                 r += (i + 1)
  53.             }
  54.  
  55.             randArray[i] = source[i]
  56.             source[r] = source[i]
  57.  
  58.             if i == 0 {
  59.                 break
  60.             }
  61.  
  62.             i--
  63.         }
  64.     }
  65.  
  66.     def extrapolate2D (xsb int, ysb int, dx double, dy double) double {
  67.         const gradients = Int8Array.new([
  68.              5,  2,  2,  5,
  69.             -5,  2, -2,  5,
  70.              5, -2,  2, -5,
  71.             -5, -2, -2, -5
  72.         ])
  73.  
  74.         var idx = randArray[(randArray[xsb & 0xFF] + ysb) & 0xFF] & 0x0E
  75.  
  76.         return gradients[idx] * dx + gradients[idx + 1] * dy
  77.     }
  78.  
  79.     def contrib2D(xsb double, ysb double, dx0 double, dy0 double, cx int, cy int, inVal double) double {
  80.         var dx1 = dx0 - cx - SQUISH_CONSTANT_2D
  81.         var dy1 = dy0 - cy - SQUISH_CONSTANT_2D
  82.         var attn = 2.0 - dx1 * dx1 - dy1 * dy1
  83.  
  84.         if attn > 0 {
  85.             attn *= attn
  86.             inVal += attn * attn * extrapolate2D((xsb + cx) as int, (ysb + cy) as int, dx1, dy1)
  87.         }
  88.  
  89.         return inVal
  90.     }
  91.  
  92.     def noise2D(x double, y double) double {
  93.         x = +x
  94.         y = +y
  95.  
  96.         var stretchOffset = (x + y) * STRETCH_CONSTANT_2D
  97.         var xs = x + stretchOffset
  98.         var ys = y + stretchOffset
  99.  
  100.         var xsb = Math.floor(xs) as int
  101.         var ysb = Math.floor(ys) as int
  102.  
  103.         var squishOffset = (xsb + ysb) * SQUISH_CONSTANT_2D
  104.         var xb = xsb + squishOffset
  105.         var yb = ysb + squishOffset
  106.  
  107.         var xins = xs - xsb
  108.         var yins = ys - ysb
  109.  
  110.         var inSum = xins + yins
  111.  
  112.         var dx0 = x - xb
  113.         var dy0 = y - yb
  114.  
  115.         var dxExt double
  116.         var dyExt double
  117.  
  118.         var xsvExt int
  119.         var ysvExt int
  120.  
  121.         var value = 0.0
  122.  
  123.         var dx1 = dx0 - 1 * SQUISH_CONSTANT_2D
  124.         var dy1 = dy0 - 0 - SQUISH_CONSTANT_2D
  125.  
  126.         var attn1 = 2 - dx1 * dx1 - dy1 * dy1
  127.  
  128.         if attn1 > 0 {
  129.             attn1 *= attn1
  130.             value += attn1 * attn1 * extrapolate2D(xsb + 1, ysb + 0, dx1, dy1)
  131.         }
  132.  
  133.         var dx2 = dx0 - 0 * SQUISH_CONSTANT_2D
  134.         var dy2 = dy0 - 1 - SQUISH_CONSTANT_2D
  135.  
  136.         var attn2 = 2 - dx2 * dx2 - dy2 * dy2
  137.  
  138.         if attn2 > 0 {
  139.             attn2 *= attn2
  140.             value += attn2 * attn2 * extrapolate2D(xsb + 0, ysb + 1, dx2, dy2)
  141.         }
  142.  
  143.         if inSum <= 1 {
  144.             var zins = 1 - inSum
  145.  
  146.             if zins > xins || zins > yins {
  147.                 if xins > yins {
  148.                     xsvExt = xsb + 1
  149.                     ysvExt = ysb - 1
  150.                     dxExt = dx0 - 1
  151.                     dyExt = dy0 + 1
  152.                 } else {
  153.                     xsvExt = xsb - 1
  154.                     ysvExt = ysb + 1
  155.                     dxExt = dx0 + 1
  156.                     dyExt = dy0 - 1
  157.                 }
  158.             } else {
  159.                 xsvExt = xsb + 1
  160.                 ysvExt = ysb + 1
  161.                 dxExt = dx0 - 1 - 2 * SQUISH_CONSTANT_2D
  162.                 dyExt = dy0 - 1 - 2 * SQUISH_CONSTANT_2D
  163.             }
  164.         } else {
  165.             var zins = 2 - inSum
  166.  
  167.             if zins < xins || zins < yins {
  168.                 if xins > yins {
  169.                     xsvExt = xsb + 2
  170.                     ysvExt = ysb + 0
  171.                     dxExt = dx0 - 2 - 2 * SQUISH_CONSTANT_2D
  172.                     dyExt = dy0 + 0 - 2 * SQUISH_CONSTANT_2D
  173.                 } else {
  174.                     xsvExt = xsb + 0
  175.                     ysvExt = ysb + 2
  176.                     dxExt = dx0 + 0 - 2 * SQUISH_CONSTANT_2D
  177.                     dyExt = dy0 - 2 - 2 * SQUISH_CONSTANT_2D
  178.                 }
  179.             } else {
  180.                 dxExt = dx0
  181.                 dyExt = dy0
  182.                 xsvExt = xsb
  183.                 ysvExt = ysb
  184.             }
  185.  
  186.             xsb += 1
  187.             ysb += 1
  188.             dx0 -= 1 - 2 * SQUISH_CONSTANT_2D
  189.             dy0 -= 1 - 2 * SQUISH_CONSTANT_2D
  190.         }
  191.  
  192.         var attn0 = 2 - dx0 * dx0 - dy0 * dy0
  193.  
  194.         if attn0 > 0 {
  195.             attn0 *= attn0
  196.             value += attn0 * attn0 * extrapolate2D(xsb, ysb, dx0, dy0)
  197.         }
  198.  
  199.         var attnExt = 2 - dxExt * dxExt - dyExt * dyExt
  200.  
  201.         if attnExt > 0 {
  202.             attnExt *= attnExt
  203.             value += attnExt * attnExt * extrapolate2D(xsvExt, ysvExt, dxExt, dyExt)
  204.         }
  205.  
  206.         return value / NORM_CONSTANT_2D
  207.     }
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement