whisper.cat/weboasis/arcade/3dcity/src3d/ImprovedNoise.js
2023-10-05 23:28:32 +11:00

65 lines
2.1 KiB
JavaScript

var ARRAY8 = (typeof Uint8Array !== 'undefined') ? Uint8Array : Array;
var Perlin = function () {
this.F2 = 0.5 * (Math.sqrt(3.0) - 1.0);
this.G2 = (3.0 - Math.sqrt(3.0)) / 6.0;
var random = Math.random;
this.p = new ARRAY8(256);
this.perm = new ARRAY8(512);
this.permMod12 = new ARRAY8(512);
for (var i = 0; i < 256; i++) {
this.p[i] = random() * 256;
}
for (i = 0; i < 512; i++) {
this.perm[i] = this.p[i & 255];
this.permMod12[i] = this.perm[i] % 12;
}
}
Perlin.prototype = {
grad3: new Float32Array([1, 1, 0, -1, 1, 0, 1, -1, 0, -1, -1, 0, 1, 0, 1, -1, 0, 1, 1, 0, -1, -1, 0, -1, 0, 1, 1, 0, -1, 1, 0, 1, -1, 0, -1, -1]),
noise: function (xin, yin) {
var permMod12 = this.permMod12, perm = this.perm, grad3 = this.grad3;
var n0=0, n1=0, n2=0;
var s = (xin + yin) * this.F2;
var i = Math.floor(xin + s);
var j = Math.floor(yin + s);
var t = (i + j) * this.G2;
var X0 = i - t;
var Y0 = j - t;
var x0 = xin - X0;
var y0 = yin - Y0;
var i1, j1;
if (x0 > y0) { i1 = 1; j1 = 0; }
else { i1 = 0; j1 = 1; }
var x1 = x0 - i1 + this.G2;
var y1 = y0 - j1 + this.G2;
var x2 = x0 - 1.0 + 2.0 * this.G2;
var y2 = y0 - 1.0 + 2.0 * this.G2;
var ii = i & 255;
var jj = j & 255;
var t0 = 0.5 - x0 * x0 - y0 * y0;
if (t0 >= 0) {
var gi0 = permMod12[ii + perm[jj]] * 3;
t0 *= t0;
n0 = t0 * t0 * (grad3[gi0] * x0 + grad3[gi0 + 1] * y0);
}
var t1 = 0.5 - x1 * x1 - y1 * y1;
if (t1 >= 0) {
var gi1 = permMod12[ii + i1 + perm[jj + j1]] * 3;
t1 *= t1;
n1 = t1 * t1 * (grad3[gi1] * x1 + grad3[gi1 + 1] * y1);
}
var t2 = 0.5 - x2 * x2 - y2 * y2;
if (t2 >= 0) {
var gi2 = permMod12[ii + 1 + perm[jj + 1]] * 3;
t2 *= t2;
n2 = t2 * t2 * (grad3[gi2] * x2 + grad3[gi2 + 1] * y2);
}
// The result is scaled to return values in the interval [-1,1].
return 70.0 * (n0 + n1 + n2);
}
}