noise3d
Version:
72 lines (60 loc) • 1.73 kB
JavaScript
var fade = function(x) {
return x * x * x * (x * (x * 6 - 15) + 10);
};
var grad = function(hash, x, y, z) {
var h = hash & 15;
var u = h < 8 ? x : y;
var v = h < 4 ? y : h == 12 || h == 14 ? x : z;
return ((h&1) ? -u : u) + ((h&2) ? -v : v);
};
var perlin = function(params) {
if (typeof params != "object")
throw new TypeError("params is not an object");
if (typeof params.interpolation != "function")
throw new TypeError("params.interpolation is not a function");
if (!Array.isArray(params.permutation))
throw new TypeError("params.permutation is not an array");
if (params.permutation.length != 256)
throw new Error("params.permutation must have 256 items");
var irp = params.interpolation;
var p = params.permutation.slice(0);
for (var i = 0; i < 256; i++)
p[256+i] = p[i];
return function(x, y, z) {
var fx = Math.floor(x);
var fy = Math.floor(y);
var fz = Math.floor(z);
var X = fx & 255;
var Y = fy & 255;
var Z = fz & 255;
x -= fx;
y -= fy;
z -= fz;
var u = fade(x);
var v = fade(y);
var w = fade(z);
var A = p[X] + Y;
var AA = p[A] + Z;
var AB = p[A+1] + Z;
var B = p[X+1] + Y;
var BA = p[B] + Z;
var BB = p[B+1] + Z;
return irp(
irp( irp( grad(p[AA ], x , y , z ),
grad(p[BA ], x-1, y , z ),
u),
irp( grad(p[AB ], x , y-1, z ),
grad(p[BB ], x-1, y-1, z ),
u),
v),
irp( irp( grad(p[AA+1], x , y , z-1 ),
grad(p[BA+1], x-1, y , z-1 ),
u),
irp( grad(p[AB+1], x , y-1, z-1 ),
grad(p[BB+1], x-1, y-1, z-1 ),
u),
v),
w);
};
};
module.exports = perlin;