Advertisement
PifyZ

OSimplexNoise

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