UNPKG

three-stdlib

Version:

stand-alone library of threejs examples

442 lines (441 loc) 11.9 kB
"use strict"; var __defProp = Object.defineProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField = (obj, key, value) => { __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); return value; }; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); class SimplexNoise { /** * You can pass in a random number generator object if you like. * It is assumed to have a random() method. */ constructor(r = Math) { __publicField(this, "grad3", [ [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] ]); __publicField(this, "grad4", [ [0, 1, 1, 1], [0, 1, 1, -1], [0, 1, -1, 1], [0, 1, -1, -1], [0, -1, 1, 1], [0, -1, 1, -1], [0, -1, -1, 1], [0, -1, -1, -1], [1, 0, 1, 1], [1, 0, 1, -1], [1, 0, -1, 1], [1, 0, -1, -1], [-1, 0, 1, 1], [-1, 0, 1, -1], [-1, 0, -1, 1], [-1, 0, -1, -1], [1, 1, 0, 1], [1, 1, 0, -1], [1, -1, 0, 1], [1, -1, 0, -1], [-1, 1, 0, 1], [-1, 1, 0, -1], [-1, -1, 0, 1], [-1, -1, 0, -1], [1, 1, 1, 0], [1, 1, -1, 0], [1, -1, 1, 0], [1, -1, -1, 0], [-1, 1, 1, 0], [-1, 1, -1, 0], [-1, -1, 1, 0], [-1, -1, -1, 0] ]); __publicField(this, "p", []); // To remove the need for index wrapping, double the permutation table length __publicField(this, "perm", []); // A lookup table to traverse the simplex around a given point in 4D. // Details can be found where this table is used, in the 4D noise method. __publicField(this, "simplex", [ [0, 1, 2, 3], [0, 1, 3, 2], [0, 0, 0, 0], [0, 2, 3, 1], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [1, 2, 3, 0], [0, 2, 1, 3], [0, 0, 0, 0], [0, 3, 1, 2], [0, 3, 2, 1], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [1, 3, 2, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [1, 2, 0, 3], [0, 0, 0, 0], [1, 3, 0, 2], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [2, 3, 0, 1], [2, 3, 1, 0], [1, 0, 2, 3], [1, 0, 3, 2], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [2, 0, 3, 1], [0, 0, 0, 0], [2, 1, 3, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [2, 0, 1, 3], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [3, 0, 1, 2], [3, 0, 2, 1], [0, 0, 0, 0], [3, 1, 2, 0], [2, 1, 0, 3], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [3, 1, 0, 2], [0, 0, 0, 0], [3, 2, 0, 1], [3, 2, 1, 0] ]); __publicField(this, "dot", (g, x, y) => { return g[0] * x + g[1] * y; }); __publicField(this, "dot3", (g, x, y, z) => { return g[0] * x + g[1] * y + g[2] * z; }); __publicField(this, "dot4", (g, x, y, z, w) => { return g[0] * x + g[1] * y + g[2] * z + g[3] * w; }); __publicField(this, "noise", (xin, yin) => { let n0; let n1; let n2; const F2 = 0.5 * (Math.sqrt(3) - 1); const s = (xin + yin) * F2; const i = Math.floor(xin + s); const j = Math.floor(yin + s); const G2 = (3 - Math.sqrt(3)) / 6; const t = (i + j) * G2; const X0 = i - t; const Y0 = j - t; const x0 = xin - X0; const y0 = yin - Y0; let i1 = 0; let j1 = 1; if (x0 > y0) { i1 = 1; j1 = 0; } const x1 = x0 - i1 + G2; const y1 = y0 - j1 + G2; const x2 = x0 - 1 + 2 * G2; const y2 = y0 - 1 + 2 * G2; const ii = i & 255; const jj = j & 255; const gi0 = this.perm[ii + this.perm[jj]] % 12; const gi1 = this.perm[ii + i1 + this.perm[jj + j1]] % 12; const gi2 = this.perm[ii + 1 + this.perm[jj + 1]] % 12; let t0 = 0.5 - x0 * x0 - y0 * y0; if (t0 < 0) { n0 = 0; } else { t0 *= t0; n0 = t0 * t0 * this.dot(this.grad3[gi0], x0, y0); } let t1 = 0.5 - x1 * x1 - y1 * y1; if (t1 < 0) { n1 = 0; } else { t1 *= t1; n1 = t1 * t1 * this.dot(this.grad3[gi1], x1, y1); } let t2 = 0.5 - x2 * x2 - y2 * y2; if (t2 < 0) { n2 = 0; } else { t2 *= t2; n2 = t2 * t2 * this.dot(this.grad3[gi2], x2, y2); } return 70 * (n0 + n1 + n2); }); // 3D simplex noise __publicField(this, "noise3d", (xin, yin, zin) => { let n0; let n1; let n2; let n3; const F3 = 1 / 3; const s = (xin + yin + zin) * F3; const i = Math.floor(xin + s); const j = Math.floor(yin + s); const k = Math.floor(zin + s); const G3 = 1 / 6; const t = (i + j + k) * G3; const X0 = i - t; const Y0 = j - t; const Z0 = k - t; const x0 = xin - X0; const y0 = yin - Y0; const z0 = zin - Z0; let i1; let j1; let k1; let i2; let j2; let k2; if (x0 >= y0) { if (y0 >= z0) { i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 1; k2 = 0; } else if (x0 >= z0) { i1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 0; k2 = 1; } else { i1 = 0; j1 = 0; k1 = 1; i2 = 1; j2 = 0; k2 = 1; } } else { if (y0 < z0) { i1 = 0; j1 = 0; k1 = 1; i2 = 0; j2 = 1; k2 = 1; } else if (x0 < z0) { i1 = 0; j1 = 1; k1 = 0; i2 = 0; j2 = 1; k2 = 1; } else { i1 = 0; j1 = 1; k1 = 0; i2 = 1; j2 = 1; k2 = 0; } } const x1 = x0 - i1 + G3; const y1 = y0 - j1 + G3; const z1 = z0 - k1 + G3; const x2 = x0 - i2 + 2 * G3; const y2 = y0 - j2 + 2 * G3; const z2 = z0 - k2 + 2 * G3; const x3 = x0 - 1 + 3 * G3; const y3 = y0 - 1 + 3 * G3; const z3 = z0 - 1 + 3 * G3; const ii = i & 255; const jj = j & 255; const kk = k & 255; const gi0 = this.perm[ii + this.perm[jj + this.perm[kk]]] % 12; const gi1 = this.perm[ii + i1 + this.perm[jj + j1 + this.perm[kk + k1]]] % 12; const gi2 = this.perm[ii + i2 + this.perm[jj + j2 + this.perm[kk + k2]]] % 12; const gi3 = this.perm[ii + 1 + this.perm[jj + 1 + this.perm[kk + 1]]] % 12; let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0; if (t0 < 0) { n0 = 0; } else { t0 *= t0; n0 = t0 * t0 * this.dot3(this.grad3[gi0], x0, y0, z0); } let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1; if (t1 < 0) { n1 = 0; } else { t1 *= t1; n1 = t1 * t1 * this.dot3(this.grad3[gi1], x1, y1, z1); } let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2; if (t2 < 0) { n2 = 0; } else { t2 *= t2; n2 = t2 * t2 * this.dot3(this.grad3[gi2], x2, y2, z2); } let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3; if (t3 < 0) { n3 = 0; } else { t3 *= t3; n3 = t3 * t3 * this.dot3(this.grad3[gi3], x3, y3, z3); } return 32 * (n0 + n1 + n2 + n3); }); // 4D simplex noise __publicField(this, "noise4d", (x, y, z, w) => { const grad4 = this.grad4; const simplex = this.simplex; const perm = this.perm; const F4 = (Math.sqrt(5) - 1) / 4; const G4 = (5 - Math.sqrt(5)) / 20; let n0; let n1; let n2; let n3; let n4; const s = (x + y + z + w) * F4; const i = Math.floor(x + s); const j = Math.floor(y + s); const k = Math.floor(z + s); const l = Math.floor(w + s); const t = (i + j + k + l) * G4; const X0 = i - t; const Y0 = j - t; const Z0 = k - t; const W0 = l - t; const x0 = x - X0; const y0 = y - Y0; const z0 = z - Z0; const w0 = w - W0; const c1 = x0 > y0 ? 32 : 0; const c2 = x0 > z0 ? 16 : 0; const c3 = y0 > z0 ? 8 : 0; const c4 = x0 > w0 ? 4 : 0; const c5 = y0 > w0 ? 2 : 0; const c6 = z0 > w0 ? 1 : 0; const c = c1 + c2 + c3 + c4 + c5 + c6; let i1; let j1; let k1; let l1; let i2; let j2; let k2; let l2; let i3; let j3; let k3; let l3; i1 = simplex[c][0] >= 3 ? 1 : 0; j1 = simplex[c][1] >= 3 ? 1 : 0; k1 = simplex[c][2] >= 3 ? 1 : 0; l1 = simplex[c][3] >= 3 ? 1 : 0; i2 = simplex[c][0] >= 2 ? 1 : 0; j2 = simplex[c][1] >= 2 ? 1 : 0; k2 = simplex[c][2] >= 2 ? 1 : 0; l2 = simplex[c][3] >= 2 ? 1 : 0; i3 = simplex[c][0] >= 1 ? 1 : 0; j3 = simplex[c][1] >= 1 ? 1 : 0; k3 = simplex[c][2] >= 1 ? 1 : 0; l3 = simplex[c][3] >= 1 ? 1 : 0; const x1 = x0 - i1 + G4; const y1 = y0 - j1 + G4; const z1 = z0 - k1 + G4; const w1 = w0 - l1 + G4; const x2 = x0 - i2 + 2 * G4; const y2 = y0 - j2 + 2 * G4; const z2 = z0 - k2 + 2 * G4; const w2 = w0 - l2 + 2 * G4; const x3 = x0 - i3 + 3 * G4; const y3 = y0 - j3 + 3 * G4; const z3 = z0 - k3 + 3 * G4; const w3 = w0 - l3 + 3 * G4; const x4 = x0 - 1 + 4 * G4; const y4 = y0 - 1 + 4 * G4; const z4 = z0 - 1 + 4 * G4; const w4 = w0 - 1 + 4 * G4; const ii = i & 255; const jj = j & 255; const kk = k & 255; const ll = l & 255; const gi0 = perm[ii + perm[jj + perm[kk + perm[ll]]]] % 32; const gi1 = perm[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]] % 32; const gi2 = perm[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]] % 32; const gi3 = perm[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]] % 32; const gi4 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] % 32; let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0; if (t0 < 0) { n0 = 0; } else { t0 *= t0; n0 = t0 * t0 * this.dot4(grad4[gi0], x0, y0, z0, w0); } let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1; if (t1 < 0) { n1 = 0; } else { t1 *= t1; n1 = t1 * t1 * this.dot4(grad4[gi1], x1, y1, z1, w1); } let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2; if (t2 < 0) { n2 = 0; } else { t2 *= t2; n2 = t2 * t2 * this.dot4(grad4[gi2], x2, y2, z2, w2); } let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3; if (t3 < 0) { n3 = 0; } else { t3 *= t3; n3 = t3 * t3 * this.dot4(grad4[gi3], x3, y3, z3, w3); } let t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4; if (t4 < 0) { n4 = 0; } else { t4 *= t4; n4 = t4 * t4 * this.dot4(grad4[gi4], x4, y4, z4, w4); } return 27 * (n0 + n1 + n2 + n3 + n4); }); for (let i = 0; i < 256; i++) { this.p[i] = Math.floor(r.random() * 256); } for (let i = 0; i < 512; i++) { this.perm[i] = this.p[i & 255]; } } } exports.SimplexNoise = SimplexNoise; //# sourceMappingURL=SimplexNoise.cjs.map