'use strict'; var objectSpread2 = require('./objectSpread2-32cd2c34.cjs.dev.js'); var classCallCheck = require('./classCallCheck-eaf0efc7.cjs.dev.js'); var misc_dist_maathMisc = require('./misc-fce4d494.cjs.dev.js'); function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /* * A speed-improved perlin and simplex noise algorithms for 2D. * * Based on example code by Stefan Gustavson (stegu@itn.liu.se). * Optimisations by Peter Eastman (peastman@drizzle.stanford.edu). * Better rank ordering method by Stefan Gustavson in 2012. * Converted to Javascript by Joseph Gentle. * * Version 2012-03-09 * * This code was placed in the public domain by its original author, * Stefan Gustavson. You may use it as you see fit, but * attribution is appreciated. * */ var Grad = function Grad(x, y, z) { var _this = this; classCallCheck._classCallCheck(this, Grad); objectSpread2._defineProperty(this, "dot2", function (x, y) { return _this.x * x + _this.y * y; }); objectSpread2._defineProperty(this, "dot3", function (x, y, z) { return _this.x * x + _this.y * y + _this.z * z; }); this.x = x; this.y = y; this.z = z; }; var grad3 = [new Grad(1, 1, 0), new Grad(-1, 1, 0), new Grad(1, -1, 0), new Grad(-1, -1, 0), new Grad(1, 0, 1), new Grad(-1, 0, 1), new Grad(1, 0, -1), new Grad(-1, 0, -1), new Grad(0, 1, 1), new Grad(0, -1, 1), new Grad(0, 1, -1), new Grad(0, -1, -1)]; var p = [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]; // To remove the need for index wrapping, double the permutation table length var perm = new Array(512); var gradP = new Array(512); // This isn't a very good seeding function, but it works ok. It supports 2^16 // different seed values. Write something better if you need more seeds. var seed = function seed(_seed) { if (_seed > 0 && _seed < 1) { // Scale the seed out _seed *= 65536; } _seed = Math.floor(_seed); if (_seed < 256) { _seed |= _seed << 8; } for (var i = 0; i < 256; i++) { var v; if (i & 1) { v = p[i] ^ _seed & 255; } else { v = p[i] ^ _seed >> 8 & 255; } perm[i] = perm[i + 256] = v; gradP[i] = gradP[i + 256] = grad3[v % 12]; } }; seed(0); /* for(var i=0; i<256; i++) { perm[i] = perm[i + 256] = p[i]; gradP[i] = gradP[i + 256] = grad3[perm[i] % 12]; }*/ // Skewing and unskewing factors for 2, 3, and 4 dimensions var F2 = 0.5 * (Math.sqrt(3) - 1); var G2 = (3 - Math.sqrt(3)) / 6; var F3 = 1 / 3; var G3 = 1 / 6; // 2D simplex noise var simplex2 = function simplex2(xin, yin) { var n0, n1, n2; // Noise contributions from the three corners // Skew the input space to determine which simplex cell we're in var s = (xin + yin) * F2; // Hairy factor for 2D var i = Math.floor(xin + s); var j = Math.floor(yin + s); var t = (i + j) * G2; var x0 = xin - i + t; // The x,y distances from the cell origin, unskewed. var y0 = yin - j + t; // For the 2D case, the simplex shape is an equilateral triangle. // Determine which simplex we are in. var i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords if (x0 > y0) { // lower triangle, XY order: (0,0)->(1,0)->(1,1) i1 = 1; j1 = 0; } else { // upper triangle, YX order: (0,0)->(0,1)->(1,1) i1 = 0; j1 = 1; } // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where // c = (3-sqrt(3))/6 var x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords var y1 = y0 - j1 + G2; var x2 = x0 - 1 + 2 * G2; // Offsets for last corner in (x,y) unskewed coords var y2 = y0 - 1 + 2 * G2; // Work out the hashed gradient indices of the three simplex corners i &= 255; j &= 255; var gi0 = gradP[i + perm[j]]; var gi1 = gradP[i + i1 + perm[j + j1]]; var gi2 = gradP[i + 1 + perm[j + 1]]; // Calculate the contribution from the three corners var t0 = 0.5 - x0 * x0 - y0 * y0; if (t0 < 0) { n0 = 0; } else { t0 *= t0; n0 = t0 * t0 * gi0.dot2(x0, y0); // (x,y) of grad3 used for 2D gradient } var t1 = 0.5 - x1 * x1 - y1 * y1; if (t1 < 0) { n1 = 0; } else { t1 *= t1; n1 = t1 * t1 * gi1.dot2(x1, y1); } var t2 = 0.5 - x2 * x2 - y2 * y2; if (t2 < 0) { n2 = 0; } else { t2 *= t2; n2 = t2 * t2 * gi2.dot2(x2, y2); } // Add contributions from each corner to get the final noise value. // The result is scaled to return values in the interval [-1,1]. return 70 * (n0 + n1 + n2); }; // 3D simplex noise var simplex3 = function simplex3(xin, yin, zin) { var n0, n1, n2, n3; // Noise contributions from the four corners // Skew the input space to determine which simplex cell we're in var s = (xin + yin + zin) * F3; // Hairy factor for 2D var i = Math.floor(xin + s); var j = Math.floor(yin + s); var k = Math.floor(zin + s); var t = (i + j + k) * G3; var x0 = xin - i + t; // The x,y distances from the cell origin, unskewed. var y0 = yin - j + t; var z0 = zin - k + t; // For the 3D case, the simplex shape is a slightly irregular tetrahedron. // Determine which simplex we are in. var i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords var i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords 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; } } // A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z), // a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and // a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where // c = 1/6. var x1 = x0 - i1 + G3; // Offsets for second corner var y1 = y0 - j1 + G3; var z1 = z0 - k1 + G3; var x2 = x0 - i2 + 2 * G3; // Offsets for third corner var y2 = y0 - j2 + 2 * G3; var z2 = z0 - k2 + 2 * G3; var x3 = x0 - 1 + 3 * G3; // Offsets for fourth corner var y3 = y0 - 1 + 3 * G3; var z3 = z0 - 1 + 3 * G3; // Work out the hashed gradient indices of the four simplex corners i &= 255; j &= 255; k &= 255; var gi0 = gradP[i + perm[j + perm[k]]]; var gi1 = gradP[i + i1 + perm[j + j1 + perm[k + k1]]]; var gi2 = gradP[i + i2 + perm[j + j2 + perm[k + k2]]]; var gi3 = gradP[i + 1 + perm[j + 1 + perm[k + 1]]]; // Calculate the contribution from the four corners var t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0; if (t0 < 0) { n0 = 0; } else { t0 *= t0; n0 = t0 * t0 * gi0.dot3(x0, y0, z0); // (x,y) of grad3 used for 2D gradient } var t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1; if (t1 < 0) { n1 = 0; } else { t1 *= t1; n1 = t1 * t1 * gi1.dot3(x1, y1, z1); } var t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2; if (t2 < 0) { n2 = 0; } else { t2 *= t2; n2 = t2 * t2 * gi2.dot3(x2, y2, z2); } var t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3; if (t3 < 0) { n3 = 0; } else { t3 *= t3; n3 = t3 * t3 * gi3.dot3(x3, y3, z3); } // Add contributions from each corner to get the final noise value. // The result is scaled to return values in the interval [-1,1]. return 32 * (n0 + n1 + n2 + n3); }; // ##### Perlin noise stuff // 2D Perlin Noise var perlin2 = function perlin2(x, y) { // Find unit grid cell containing point var X = Math.floor(x), Y = Math.floor(y); // Get relative xy coordinates of point within that cell x = x - X; y = y - Y; // Wrap the integer cells at 255 (smaller integer period can be introduced here) X = X & 255; Y = Y & 255; // Calculate noise contributions from each of the four corners var n00 = gradP[X + perm[Y]].dot2(x, y); var n01 = gradP[X + perm[Y + 1]].dot2(x, y - 1); var n10 = gradP[X + 1 + perm[Y]].dot2(x - 1, y); var n11 = gradP[X + 1 + perm[Y + 1]].dot2(x - 1, y - 1); // Compute the fade curve value for x var u = misc_dist_maathMisc.fade(x); // Interpolate the four results return misc_dist_maathMisc.lerp(misc_dist_maathMisc.lerp(n00, n10, u), misc_dist_maathMisc.lerp(n01, n11, u), misc_dist_maathMisc.fade(y)); }; // 3D Perlin Noise var perlin3 = function perlin3(x, y, z) { // Find unit grid cell containing point var X = Math.floor(x), Y = Math.floor(y), Z = Math.floor(z); // Get relative xyz coordinates of point within that cell x = x - X; y = y - Y; z = z - Z; // Wrap the integer cells at 255 (smaller integer period can be introduced here) X = X & 255; Y = Y & 255; Z = Z & 255; // Calculate noise contributions from each of the eight corners var n000 = gradP[X + perm[Y + perm[Z]]].dot3(x, y, z); var n001 = gradP[X + perm[Y + perm[Z + 1]]].dot3(x, y, z - 1); var n010 = gradP[X + perm[Y + 1 + perm[Z]]].dot3(x, y - 1, z); var n011 = gradP[X + perm[Y + 1 + perm[Z + 1]]].dot3(x, y - 1, z - 1); var n100 = gradP[X + 1 + perm[Y + perm[Z]]].dot3(x - 1, y, z); var n101 = gradP[X + 1 + perm[Y + perm[Z + 1]]].dot3(x - 1, y, z - 1); var n110 = gradP[X + 1 + perm[Y + 1 + perm[Z]]].dot3(x - 1, y - 1, z); var n111 = gradP[X + 1 + perm[Y + 1 + perm[Z + 1]]].dot3(x - 1, y - 1, z - 1); // Compute the fade curve value for x, y, z var u = misc_dist_maathMisc.fade(x); var v = misc_dist_maathMisc.fade(y); var w = misc_dist_maathMisc.fade(z); // Interpolate return misc_dist_maathMisc.lerp(misc_dist_maathMisc.lerp(misc_dist_maathMisc.lerp(n000, n100, u), misc_dist_maathMisc.lerp(n001, n101, u), w), misc_dist_maathMisc.lerp(misc_dist_maathMisc.lerp(n010, n110, u), misc_dist_maathMisc.lerp(n011, n111, u), w), v); }; var noise = /*#__PURE__*/Object.freeze({ __proto__: null, seed: seed, simplex2: simplex2, simplex3: simplex3, perlin2: perlin2, perlin3: perlin3 }); var TAU = Math.PI * 2; var FlashGen = /*#__PURE__*/function () { function FlashGen(props) { classCallCheck._classCallCheck(this, FlashGen); objectSpread2._defineProperty(this, "nextBurstTime", 0); objectSpread2._defineProperty(this, "nextFlashEndTime", 0); objectSpread2._defineProperty(this, "flashesDone", 0); objectSpread2._defineProperty(this, "isFlashing", false); objectSpread2._defineProperty(this, "currentCount", 0); objectSpread2._defineProperty(this, "flashIntensity", 0); objectSpread2._defineProperty(this, "isDecaying", false); objectSpread2._defineProperty(this, "autoBurst", true); objectSpread2._defineProperty(this, "decaySpeed", 40); objectSpread2._defineProperty(this, "minInterval", 5000); objectSpread2._defineProperty(this, "maxInterval", 10000); objectSpread2._defineProperty(this, "minDuration", 50); objectSpread2._defineProperty(this, "maxDuration", 300); objectSpread2._defineProperty(this, "count", 5); Object.assign(this, props); } _createClass(FlashGen, [{ key: "scheduleNextBurst", value: function scheduleNextBurst(currentTime) { var burstInterval = Math.random() * (this.maxInterval - this.minInterval) + this.minInterval; this.nextBurstTime = currentTime + burstInterval / 1000; this.flashesDone = 0; this.isFlashing = false; } }, { key: "burst", value: function burst() { this.nextBurstTime = 0; this.flashesDone = 0; this.isFlashing = false; } }, { key: "update", value: function update(currentTime, delta) { if (currentTime > this.nextBurstTime && this.currentCount === 0) { this.currentCount = Math.floor(Math.random() * this.count) + 1; } if (this.flashesDone < this.currentCount && currentTime > this.nextBurstTime) { if (!this.isFlashing) { this.isFlashing = true; this.flashIntensity = 1; var flashDuration = Math.random() * (this.maxDuration - this.minDuration) + this.minDuration; this.nextFlashEndTime = currentTime + flashDuration / 1000; } else if (this.isFlashing && currentTime > this.nextFlashEndTime) { this.isFlashing = false; this.isDecaying = true; this.flashesDone++; if (this.flashesDone >= this.currentCount) { this.currentCount = 0; if (this.autoBurst) this.scheduleNextBurst(currentTime); } } } if (this.isDecaying) { this.flashIntensity -= delta * this.decaySpeed; this.flashIntensity = Math.max(0, Math.min(1, this.flashIntensity)); if (this.flashIntensity <= 0) { this.isDecaying = false; this.flashIntensity = 0; } } return this.flashIntensity; } }]); return FlashGen; }(); // Credits @kchapelier https://github.com/kchapelier/wavefunctioncollapse/blob/master/example/lcg.js#L22-L30 function normalizeSeed(seed) { if (typeof seed === "number") { seed = Math.abs(seed); } else if (typeof seed === "string") { var string = seed; seed = 0; for (var i = 0; i < string.length; i++) { seed = (seed + (i + 1) * (string.charCodeAt(i) % 96)) % 2147483647; } } if (seed === 0) { seed = 311; } return seed; } function lcgRandom(seed) { var state = normalizeSeed(seed); return function () { var result = state * 48271 % 2147483647; state = result; return result / 2147483647; }; } var Generator = function Generator(_seed) { var _this = this; classCallCheck._classCallCheck(this, Generator); objectSpread2._defineProperty(this, "seed", 0); objectSpread2._defineProperty(this, "init", function (seed) { _this.seed = seed; _this.value = lcgRandom(seed); }); objectSpread2._defineProperty(this, "value", lcgRandom(this.seed)); this.init(_seed); }; var defaultGen = new Generator(Math.random()); /*** * [3D] Sphere */ var defaultSphere = { radius: 1, center: [0, 0, 0] }; // random on surface of sphere // - https://twitter.com/fermatslibrary/status/1430932503578226688 // - https://mathworld.wolfram.com/SpherePointPicking.html function onSphere(buffer, sphere) { var rng = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultGen; var _defaultSphere$sphere = objectSpread2._objectSpread2(objectSpread2._objectSpread2({}, defaultSphere), sphere), radius = _defaultSphere$sphere.radius, center = _defaultSphere$sphere.center; for (var i = 0; i < buffer.length; i += 3) { var u = rng.value(); var v = rng.value(); var theta = Math.acos(2 * v - 1); var phi = TAU * u; buffer[i] = Math.sin(theta) * Math.cos(phi) * radius + center[0]; buffer[i + 1] = Math.sin(theta) * Math.sin(phi) * radius + center[1]; buffer[i + 2] = Math.cos(theta) * radius + center[2]; } return buffer; } // from "Another Method" https://datagenetics.com/blog/january32020/index.html function inSphere(buffer, sphere) { var rng = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultGen; var _defaultSphere$sphere2 = objectSpread2._objectSpread2(objectSpread2._objectSpread2({}, defaultSphere), sphere), radius = _defaultSphere$sphere2.radius, center = _defaultSphere$sphere2.center; for (var i = 0; i < buffer.length; i += 3) { var u = Math.pow(rng.value(), 1 / 3); var x = rng.value() * 2 - 1; var y = rng.value() * 2 - 1; var z = rng.value() * 2 - 1; var mag = Math.sqrt(x * x + y * y + z * z); x = u * x / mag; y = u * y / mag; z = u * z / mag; buffer[i] = x * radius + center[0]; buffer[i + 1] = y * radius + center[1]; buffer[i + 2] = z * radius + center[2]; } return buffer; } /*** * [2D] Circle */ var defaultCircle = { radius: 1, center: [0, 0] }; // random circle https://stackoverflow.com/a/50746409 function inCircle(buffer, circle) { var rng = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultGen; var _defaultCircle$circle = objectSpread2._objectSpread2(objectSpread2._objectSpread2({}, defaultCircle), circle), radius = _defaultCircle$circle.radius, center = _defaultCircle$circle.center; for (var i = 0; i < buffer.length; i += 2) { var r = radius * Math.sqrt(rng.value()); var theta = rng.value() * TAU; buffer[i] = Math.sin(theta) * r + center[0]; buffer[i + 1] = Math.cos(theta) * r + center[1]; } return buffer; } function onCircle(buffer, circle) { var rng = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultGen; var _defaultCircle$circle2 = objectSpread2._objectSpread2(objectSpread2._objectSpread2({}, defaultCircle), circle), radius = _defaultCircle$circle2.radius, center = _defaultCircle$circle2.center; for (var i = 0; i < buffer.length; i += 2) { var theta = rng.value() * TAU; buffer[i] = Math.sin(theta) * radius + center[0]; buffer[i + 1] = Math.cos(theta) * radius + center[1]; } return buffer; } /** * [2D] Plane */ var defaultRect = { sides: 1, center: [0, 0] }; function inRect(buffer, rect) { var rng = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultGen; var _defaultRect$rect = objectSpread2._objectSpread2(objectSpread2._objectSpread2({}, defaultRect), rect), sides = _defaultRect$rect.sides, center = _defaultRect$rect.center; var sideX = typeof sides === "number" ? sides : sides[0]; var sideY = typeof sides === "number" ? sides : sides[1]; for (var i = 0; i < buffer.length; i += 2) { buffer[i] = (rng.value() - 0.5) * sideX + center[0]; buffer[i + 1] = (rng.value() - 0.5) * sideY + center[1]; } return buffer; } function onRect(buffer, rect) { return buffer; } /*** * [3D] Box */ function inBox(buffer, box) { var rng = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultGen; var _defaultBox$box = objectSpread2._objectSpread2(objectSpread2._objectSpread2({}, defaultBox), box), sides = _defaultBox$box.sides, center = _defaultBox$box.center; var sideX = typeof sides === "number" ? sides : sides[0]; var sideY = typeof sides === "number" ? sides : sides[1]; var sideZ = typeof sides === "number" ? sides : sides[2]; for (var i = 0; i < buffer.length; i += 3) { buffer[i] = (rng.value() - 0.5) * sideX + center[0]; buffer[i + 1] = (rng.value() - 0.5) * sideY + center[1]; buffer[i + 2] = (rng.value() - 0.5) * sideZ + center[2]; } return buffer; } var defaultBox = { sides: 1, center: [0, 0, 0] }; function onBox(buffer, box) { var rng = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultGen; var _defaultBox$box2 = objectSpread2._objectSpread2(objectSpread2._objectSpread2({}, defaultBox), box), sides = _defaultBox$box2.sides, center = _defaultBox$box2.center; var sideX = typeof sides === "number" ? sides : sides[0]; var sideY = typeof sides === "number" ? sides : sides[1]; var sideZ = typeof sides === "number" ? sides : sides[2]; for (var i = 0; i < buffer.length; i += 3) { buffer[i] = (rng.value() - 0.5) * sideX + center[0]; buffer[i + 1] = (rng.value() - 0.5) * sideY + center[1]; buffer[i + 2] = (rng.value() - 0.5) * sideZ + center[2]; } return buffer; } var index = /*#__PURE__*/Object.freeze({ __proto__: null, FlashGen: FlashGen, Generator: Generator, onSphere: onSphere, inSphere: inSphere, inCircle: inCircle, onCircle: onCircle, inRect: inRect, onRect: onRect, inBox: inBox, onBox: onBox, noise: noise }); exports.FlashGen = FlashGen; exports.Generator = Generator; exports.inBox = inBox; exports.inCircle = inCircle; exports.inRect = inRect; exports.inSphere = inSphere; exports.index = index; exports.noise = noise; exports.onBox = onBox; exports.onCircle = onCircle; exports.onRect = onRect; exports.onSphere = onSphere;