Skip to content

Instantly share code, notes, and snippets.

@acceptable-security
Created June 1, 2013 02:36
Show Gist options
  • Save acceptable-security/5689099 to your computer and use it in GitHub Desktop.
Save acceptable-security/5689099 to your computer and use it in GitHub Desktop.
function generatePerm()
{
var list = [151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,
103,30,69,142,8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,
26,197,62,94,252,219,203,117,35,11,32,57,177,33,88,237,149,56,
87,174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166,
77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,
46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,
187,208,89,18,169,200,196,135,130,116,188,159,86,164,100,109,
198,173,186,3,64,52,217,226,250,124,123,5,202,38,147,118,126,
255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,223,183,
170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,
9,129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,
218,246,97,228,251,34,242,193,238,210,144,12,191,179,162,241,
81,51,145,235,249,14,239,107,49,192,214,31,181,199,106,157,184,
84,204,176,115,121,50,45,127,4,150,254,138,236,205,93,222,114,
67,29,24,72,243,141,128,195,78,66,215,61,156,180];
var end = new Array();
for(var i=0;i<256;i++)
{
end[i] = list[i];
end[256 + i] = list[i];
}
return end;
}
function lerp(t, a, b)
{
return a + t * (b - a);
}
function fade(t)
{
return t* t * t * (t * (t * 6 - 15) + 10);
}
function grad(hash, x, y, z)
{
var h = hash & 15;
if(h < 8)
{
var u = x;
}
else
{
var u = y;
}
if(h < 4)
{
var v = h;
}
else
{
if(h == 12 || h == 14)
{
var v = x;
}
else
{
var v = z;
}
}
if(h & 1 == 0)
{
var abc = u;
}
else
{
var abc = -u;
}
if(h & 2 == 0)
{
abc = abc + v;
}
else
{
abc = abc + -v;
}
return abc;
}
function snoise(x, y, z, p)
{
var floopX = Math.round(x) & 255;
var floopY = Math.round(y) & 255;
var floopZ = Math.round(z) & 255;
x -= Math.round(x);
y -= Math.round(y);
z -= Math.round(z);
var u = fade(x);
var v = fade(y);
var w = fade(z);
var a = p[floopX] + floopY;
var aa = p[a]
var a = p[floopX] + floopY;
var aa = p[a] + floopZ;
var ab = p[a + 1] + floopZ;
var b = p[floopX + 1] + floopY;
var ba = p[b] + floopZ;
var bb = p[b + 1] + floopZ;
var pAA = p[aa];
var pAB = p[ab];
var pBA = p[ba];
var pBB = p[bb];
var pAA1 = p[aa + 1];
var pAB1 = p[ab + 1];
var pBA1 = p[ba + 1];
var pBB1 = p[bb + 1];
var gradAA = grad(pAA,x,y,z);
var gradBA = grad(pBA, x-1,y,z);
var gradAB = grad(pAB,x,y-1,z);
var gradBB = grad(pBB,x-1,y-1,z);
var gradAA1 = grad(pAA1,x,y,z-1);
var gradBA1 = grad(pBA1,x-1,y,z-1);
var gradAB1 = grad(pAB1,x,y-1,z-1);
var gradBB1 = grad(pBB1,x-1,y-1,z-1);
return lerp(w,
lerp(v, lerp(u, gradAA, gradBA), lerp(u, gradAB, gradBB)),
lerp(v, lerp(u, gradAA1, gradBA1), lerp(u,gradAB1,gradBB1))
);
}
function terrainGenerate(max,min,size)
{
var seed = 0.123571823;
var quality = 256;
var delta = quality + seed;
var results = new Array();
for(var x=0;x<size;x++)
{
for(var y=0;y<size;y++)
{
var noise = snoise(((x) / seed) / delta, ((y) / seed) / delta, 0, generatePerm());
noise = (noise + 1) / 2 * (max - min) + min;
results.push((x,y,Math.round(noise),"grass"));
for(var z=0;z<16;z++)
if(z < Math.round(noise))
results.push((x,y,z,"dirt"));
}
}
return results;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment