diff --git a/assets/index.html b/assets/index.html index f4f2f67..103e4cb 100644 --- a/assets/index.html +++ b/assets/index.html @@ -41,12 +41,53 @@ } function getHeight(x, y) { - var h = 0; - h += Math.sin(x * 0.03) * 3; - h += Math.cos(y * 0.03) * 3; - h += Math.sin(x * 0.05 + y * 0.03) * 1.5; - h += Math.cos(y * 0.05 - x * 0.03) * 1; - return Math.round(h); + var n = perlin2D(x * 0.02, y * 0.02, 4); + return Math.round(n * 5); + } + + function fade(t) { + return t * t * t * (t * (t * 6 - 15) + 10); + } + + function lerp(a, b, t) { + return a + t * (b - a); + } + + function grad2D(hash, x, y) { + var h = hash & 3; + var u = h < 2 ? x : y; + var v = h < 2 ? y : x; + return ((h & 1) ? -u : u) + ((h & 2) ? -2 * v : 2 * v); + } + + var perm = []; + for (var i = 0; i < 256; i++) perm[i] = Math.floor(Math.random() * 256); + for (var i = 0; i < 256; i++) perm[i + 256] = perm[i]; + + function perlin2D(x, y, octaves) { + var total = 0; + var frequency = 1; + var amplitude = 1; + var maxValue = 0; + for (var i = 0; i < octaves; i++) { + var xi = Math.floor(x * frequency) & 255; + var yi = Math.floor(y * frequency) & 255; + var xf = x * frequency - Math.floor(x * frequency); + var yf = y * frequency - Math.floor(y * frequency); + var u = fade(xf); + var v = fade(yf); + var aa = perm[perm[xi] + yi]; + var ab = perm[perm[xi] + yi + 1]; + var ba = perm[perm[xi + 1] + yi]; + var bb = perm[perm[xi + 1] + yi + 1]; + var x1 = lerp(grad2D(aa, xf, yf), grad2D(ba, xf - 1, yf), u); + var x2 = lerp(grad2D(ab, xf, yf - 1), grad2D(bb, xf - 1, yf - 1), u); + total += lerp(x1, x2, v) * amplitude; + maxValue += amplitude; + amplitude *= 0.5; + frequency *= 2; + } + return total / maxValue; } function isWater(h) {