From 3a350da3cc3d427eb4e9a6a90916a32352084f2f Mon Sep 17 00:00:00 2001 From: Ben Burlingham Date: Sun, 3 Sep 2017 07:47:24 -0700 Subject: [PATCH] Added check to prevent particle starting in hazard. --- js/animation1a.js | 2 +- js/animation1b.js | 2 +- js/animation2a.js | 6 +-- js/bundle.js | 8 ++-- js/particle.js | 104 ++++++++++++++++++++++++++++++++-------------- 5 files changed, 81 insertions(+), 41 deletions(-) diff --git a/js/animation1a.js b/js/animation1a.js index e67b5bb..76ca5e5 100644 --- a/js/animation1a.js +++ b/js/animation1a.js @@ -81,7 +81,7 @@ Animation1a.prototype.updateAnimating = function(isAnimating) { } Animation1a.prototype.updateCount = function(count) { - while (this.particles.length >= count) { + while (this.particles.length > count) { delete this.particles.pop().remove(); } diff --git a/js/animation1b.js b/js/animation1b.js index 9c86e10..eea2798 100644 --- a/js/animation1b.js +++ b/js/animation1b.js @@ -52,7 +52,7 @@ Animation1b.prototype.updateAnimating = function(isAnimating) { } Animation1b.prototype.updateCount = function(count) { - while (this.particles.length >= count) { + while (this.particles.length > count) { delete this.particles.pop().remove(); } diff --git a/js/animation2a.js b/js/animation2a.js index 33faf3f..ce33ab2 100644 --- a/js/animation2a.js +++ b/js/animation2a.js @@ -9,7 +9,7 @@ function Animation2a() { count: 1, maxCount: 10, randomize: true, - showMovementCircle: true, + showMovementCircle: false, showVisionGrid: true, speed: 4 }; @@ -35,8 +35,8 @@ function Animation2a() { // TODO perf - cache trig or perform operations // TODO only randomize movement on 1a - // TODO ANIM2a Vision grid touches trig transform // TODO ANIM2a randomize hazards + // TODO can the vision grid be relative to the particle // TODO ANIM2 particle evade // TODO ANIM2b Scale vision grid to 1000 particles @@ -68,7 +68,7 @@ Animation2a.prototype.updateAnimating = function(isAnimating) { } Animation2a.prototype.updateCount = function(count) { - while (this.particles.length >= count) { + while (this.particles.length > count) { delete this.particles.pop().remove(); } diff --git a/js/bundle.js b/js/bundle.js index 9716655..06847e5 100644 --- a/js/bundle.js +++ b/js/bundle.js @@ -472,7 +472,7 @@ eval("\nvar isArray_1 = __webpack_require__(/*! ../util/isArray */ 11);\nfunctio /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 14);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _enums = __webpack_require__(/*! ./enums */ 16);\n\nvar _store = __webpack_require__(/*! ./store */ 22);\n\nvar _store2 = _interopRequireDefault(_store);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar random = {\n bool: function bool(weight) {\n return Math.random() < (weight || 0.5);\n },\n color: function color() {\n return 'rgb(' + Math.floor(Math.random() * 255) + ', ' + Math.floor(Math.random() * 255) + ', ' + Math.floor(Math.random() * 255) + ')';\n },\n num: function num(min, max) {\n return min + Math.round(Math.random() * max);\n }\n};\n\n// ===== Constructor =====\n\nfunction Particle(parent, bounds, config, globalGrid) {\n this.config = Object.assign({\n bounds: bounds,\n color: random.color(),\n gridSize: 5,\n randomize: false,\n showMovementCircle: false,\n showVisionGrid: false,\n speed: 4,\n visionRadius: 50\n }, config);\n\n this.grids = {\n global: globalGrid || {},\n vision: createVisionGrid(this.config)\n };\n\n this.arc = {\n centerX: random.num(0, bounds.width),\n centerY: random.num(0, bounds.height),\n clockwise: random.bool(),\n endX: 0,\n endY: 0,\n length: random.num(_enums.RAD.t90, _enums.RAD.t360),\n radius: random.num(100, 200),\n theta: random.num(_enums.RAD.t90, _enums.RAD.t360)\n };\n\n this.nodes = {\n body: createBodyNode(this.config),\n circle: undefined,\n container: createContainerNode(this.config),\n parent: parent,\n visionGrid: undefined\n };\n\n this.nodes.container.appendChild(this.nodes.body);\n parent.appendChild(this.nodes.container);\n\n this.updateConfig(this.config);\n this.nextFrame();\n};\n\n// ===== PROTOTYPE =====\n\nParticle.prototype.remove = function () {\n this.nodes.parent.removeChild(this.nodes.container);\n return this;\n};\n\nParticle.prototype.nextFrame = function () {\n this.arc = updateArc(this.arc, this.config);\n this.grids.vision = updateVisionGrid(this.arc, this.config, this.grids);\n\n repaintContainer(this.nodes.container, this.arc);\n repaintBody(this.nodes.body, this.arc);\n repaintCircle(this.nodes.circle, this.arc);\n repaintVisionGrid(this.nodes.visionGrid, this.arc, this.grids);\n};\n\nParticle.prototype.updateConfig = function (config) {\n Object.assign(this.config, config);\n\n var _config = this.config,\n showMovementCircle = _config.showMovementCircle,\n showVisionGrid = _config.showVisionGrid;\n\n\n if (showMovementCircle === true && this.nodes.circle === undefined) {\n this.nodes.circle = createCircleNode(config);\n this.nodes.container.appendChild(this.nodes.circle);\n }\n\n if (showMovementCircle === false && this.nodes.circle !== undefined) {\n this.nodes.container.removeChild(this.nodes.circle);\n delete this.nodes.circle;\n }\n\n if (showVisionGrid === true && this.nodes.visionGrid === undefined) {\n this.nodes.visionGrid = createVisionGridNodes(this.config, this.grids, this.nodes);\n }\n\n if (showVisionGrid === false && this.nodes.visionGrid !== undefined) {\n delete this.nodex.visionGrid;\n }\n};\n\n// ===== CREATION =====\n\nfunction createBodyNode(config) {\n var node = document.createElement('div');\n node.className = 'particle-body';\n node.style.backgroundColor = config.color;\n return node;\n}\n\nfunction createCircleNode(config) {\n if (config.showMovementCircle === false) {\n return undefined;\n }\n\n var node = document.createElement('div');\n node.className = 'particle-movement-circle';\n node.style.borderColor = config.color;\n return node;\n}\n\nfunction createContainerNode(config) {\n var node = document.createElement('div');\n node.className = 'particle-container';\n return node;\n}\n\nfunction createVisionGrid(config) {\n if (config.showVisionGrid === false) {\n return [];\n }\n\n var side = config.gridSize,\n radius = config.visionRadius;\n\n var r0 = radius;\n var r1 = radius - side;\n\n var points = [];\n\n for (var x = -radius; x <= radius; x += side) {\n for (var y = -radius; y <= radius; y += side) {\n // Omit lower half\n if (y < 0) {\n continue;\n }\n\n // Include vision band\n var r = Math.pow(Math.pow(x, 2) + Math.pow(y, 2), 0.5);\n if (r > r0 || r < r1) {\n continue;\n }\n\n var alpha = Math.atan(y / x);\n if (x < 0) {\n alpha = _enums.RAD.t180 + alpha; // TODO +=\n }\n\n points.push({ x: x, y: y, r: r, alpha: alpha, touch: false });\n }\n }\n\n return points;\n}\n\nfunction createVisionGridNodes(config, grids, nodes) {\n if (config.showVisionGrid === false) {\n return undefined;\n }\n\n return grids.vision.reduce(function (acc, _ref) {\n var x = _ref.x,\n y = _ref.y;\n\n var div = document.createElement('div');\n div.className = 'particle-vision-dot';\n div.style.backgroundColor = config.color;\n nodes.parent.appendChild(div);\n\n acc.push(div);\n\n return acc;\n }, []);\n}\n\n// ===== CALCULATIONS =====\n\nfunction updateArc(arc, _ref2) {\n var bounds = _ref2.bounds,\n randomize = _ref2.randomize,\n speed = _ref2.speed;\n\n // Randomly change radius and rotation direction.\n if (arc.length <= 0) {\n arc.length = random.num(_enums.RAD.t90, _enums.RAD.t360);\n\n if (randomize === true) {\n arc = moveArc(arc, random.num(100, 200));\n\n if (random.bool(0.8)) {\n arc.clockwise = !arc.clockwise;\n arc = changeDirection(arc);\n }\n }\n }\n\n // Ensure constant velocity and theta between 0 and 2π.\n var delta = speed / arc.radius;\n arc.length -= delta;\n\n arc.theta += arc.clockwise ? -delta : +delta;\n arc.theta = arc.theta > 0 ? arc.theta % _enums.RAD.t360 : _enums.RAD.t360 + arc.theta;\n\n arc.endX = arc.centerX + arc.radius * Math.cos(arc.theta);\n arc.endY = arc.centerY - arc.radius * Math.sin(arc.theta);\n\n // Overflow.\n if (arc.endX < 0) {\n arc.endX += bounds.width;\n arc.centerX += bounds.width;\n } else if (arc.endX > bounds.width) {\n arc.endX -= bounds.width;\n arc.centerX -= bounds.width;\n }\n\n if (arc.endY < 0) {\n arc.endY += bounds.height;\n arc.centerY += bounds.height;\n } else if (arc.endY > bounds.height) {\n arc.endY -= bounds.height;\n arc.centerY -= bounds.height;\n }\n\n return arc;\n}\n\nfunction updateVisionGrid(arc, config, grids) {\n var global = grids.global,\n vision = grids.vision;\n\n\n return vision.reduce(function (acc, point) {\n var rad = arc.clockwise ? arc.theta + point.alpha + _enums.RAD.t180 : arc.theta + point.alpha;\n\n var x = point.r * Math.cos(rad);\n var y = point.r * Math.sin(rad);\n\n point.x = arc.endX + x;\n point.y = arc.endY - y;\n\n var gridX = point.x - point.x % 5;\n var gridY = point.y - point.y % 5;\n\n point.touch = global[gridX] !== undefined && global[gridX][gridY] !== undefined;\n\n return acc.concat(point);\n }, []);\n}\n\nfunction moveArc(arc, newRadius) {\n var r0 = arc.radius;\n var r1 = newRadius;\n\n // Moves arc center to new radius while keeping theta constant.\n arc.centerX -= (r1 - r0) * Math.cos(arc.theta);\n arc.centerY += (r1 - r0) * Math.sin(arc.theta);\n arc.radius = r1;\n\n return arc;\n}\n\nfunction changeDirection(arc) {\n arc.theta = (arc.theta + _enums.RAD.t180) % _enums.RAD.t360;\n arc.centerX -= 2 * arc.radius * Math.cos(arc.theta);\n arc.centerY += 2 * arc.radius * Math.sin(arc.theta);\n\n return arc;\n}\n\n// ===== RENDERING =====\nfunction repaintContainer(node, arc) {\n node.style.left = arc.endX + 'px';\n node.style.top = arc.endY + 'px';\n}\n\nfunction repaintBody(node, arc) {\n var rad = arc.clockwise ? _enums.RAD.t180 - arc.theta : _enums.RAD.t360 - arc.theta;\n\n node.style.transform = 'rotate(' + (rad + _enums.RAD.t45) + 'rad)';\n}\n\nfunction repaintCircle(node, arc) {\n if (node === undefined) {\n return;\n }\n\n node.style.width = 2 * arc.radius + 'px';\n node.style.height = 2 * arc.radius + 'px';\n\n node.style.left = '-' + (arc.radius + arc.radius * Math.cos(arc.theta)) + 'px';\n node.style.top = '-' + (arc.radius - arc.radius * Math.sin(arc.theta)) + 'px';\n\n node.style.borderRadius = arc.radius + 'px';\n}\n\nfunction repaintVisionGrid(nodes, arc, grids) {\n if (nodes === undefined) {\n return;\n }\n\n grids.vision.forEach(function (_ref3, i) {\n var x = _ref3.x,\n y = _ref3.y,\n touch = _ref3.touch;\n\n nodes[i].style.left = x + 'px';\n nodes[i].style.top = y + 'px';\n\n nodes[i].style.border = touch ? '2px solid red' : '0';\n });\n}\n\nexports.default = Particle;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvcGFydGljbGUuanM/M2JkZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUkFEIH0gZnJvbSAnLi9lbnVtcyc7XG5pbXBvcnQgU3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5cbmNvbnN0IHJhbmRvbSA9IHtcbiAgICBib29sOiAod2VpZ2h0KSA9PiBNYXRoLnJhbmRvbSgpIDwgKHdlaWdodCB8fCAwLjUpLFxuICAgIGNvbG9yOiAoKSA9PiBgcmdiKCR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU1KX0sICR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU1KX0sICR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU1KX0pYCxcbiAgICBudW06IChtaW4sIG1heCkgPT4gbWluICsgTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogbWF4KSxcbn1cblxuLy8gPT09PT0gQ29uc3RydWN0b3IgPT09PT1cblxuZnVuY3Rpb24gUGFydGljbGUocGFyZW50LCBib3VuZHMsIGNvbmZpZywgZ2xvYmFsR3JpZCkge1xuICAgIHRoaXMuY29uZmlnID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGJvdW5kcyxcbiAgICAgICAgY29sb3I6IHJhbmRvbS5jb2xvcigpLFxuICAgICAgICBncmlkU2l6ZTogNSxcbiAgICAgICAgcmFuZG9taXplOiBmYWxzZSxcbiAgICAgICAgc2hvd01vdmVtZW50Q2lyY2xlOiBmYWxzZSxcbiAgICAgICAgc2hvd1Zpc2lvbkdyaWQ6IGZhbHNlLFxuICAgICAgICBzcGVlZDogNCxcbiAgICAgICAgdmlzaW9uUmFkaXVzOiA1MFxuICAgIH0sIGNvbmZpZyk7XG5cbiAgICB0aGlzLmdyaWRzID0ge1xuICAgICAgICBnbG9iYWw6IGdsb2JhbEdyaWQgfHwge30sXG4gICAgICAgIHZpc2lvbjogY3JlYXRlVmlzaW9uR3JpZCh0aGlzLmNvbmZpZylcbiAgICB9O1xuXG4gICAgdGhpcy5hcmMgPSB7XG4gICAgICAgIGNlbnRlclg6IHJhbmRvbS5udW0oMCwgYm91bmRzLndpZHRoKSxcbiAgICAgICAgY2VudGVyWTogcmFuZG9tLm51bSgwLCBib3VuZHMuaGVpZ2h0KSxcbiAgICAgICAgY2xvY2t3aXNlOiByYW5kb20uYm9vbCgpLFxuICAgICAgICBlbmRYOiAwLFxuICAgICAgICBlbmRZOiAwLFxuICAgICAgICBsZW5ndGg6IHJhbmRvbS5udW0oUkFELnQ5MCwgUkFELnQzNjApLFxuICAgICAgICByYWRpdXM6IHJhbmRvbS5udW0oMTAwLCAyMDApLFxuICAgICAgICB0aGV0YTogcmFuZG9tLm51bShSQUQudDkwLCBSQUQudDM2MCksXG4gICAgfTtcblxuICAgIHRoaXMubm9kZXMgPSB7XG4gICAgICAgIGJvZHk6IGNyZWF0ZUJvZHlOb2RlKHRoaXMuY29uZmlnKSxcbiAgICAgICAgY2lyY2xlOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbnRhaW5lcjogY3JlYXRlQ29udGFpbmVyTm9kZSh0aGlzLmNvbmZpZyksXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgdmlzaW9uR3JpZDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICB0aGlzLm5vZGVzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm5vZGVzLmJvZHkpO1xuICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLm5vZGVzLmNvbnRhaW5lcik7XG5cbiAgICB0aGlzLnVwZGF0ZUNvbmZpZyh0aGlzLmNvbmZpZyk7XG4gICAgdGhpcy5uZXh0RnJhbWUoKTtcbn07XG5cbi8vID09PT09IFBST1RPVFlQRSA9PT09PVxuXG5QYXJ0aWNsZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5ub2Rlcy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy5ub2Rlcy5jb250YWluZXIpO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5QYXJ0aWNsZS5wcm90b3R5cGUubmV4dEZyYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5hcmMgPSB1cGRhdGVBcmModGhpcy5hcmMsIHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLmdyaWRzLnZpc2lvbiA9IHVwZGF0ZVZpc2lvbkdyaWQodGhpcy5hcmMsIHRoaXMuY29uZmlnLCB0aGlzLmdyaWRzKTtcblxuICAgIHJlcGFpbnRDb250YWluZXIodGhpcy5ub2Rlcy5jb250YWluZXIsIHRoaXMuYXJjKTtcbiAgICByZXBhaW50Qm9keSh0aGlzLm5vZGVzLmJvZHksIHRoaXMuYXJjKTtcbiAgICByZXBhaW50Q2lyY2xlKHRoaXMubm9kZXMuY2lyY2xlLCB0aGlzLmFyYyk7XG4gICAgcmVwYWludFZpc2lvbkdyaWQodGhpcy5ub2Rlcy52aXNpb25HcmlkLCB0aGlzLmFyYywgdGhpcy5ncmlkcyk7XG59XG5cblBhcnRpY2xlLnByb3RvdHlwZS51cGRhdGVDb25maWcgPSBmdW5jdGlvbihjb25maWcpIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuY29uZmlnLCBjb25maWcpO1xuXG4gICAgY29uc3QgeyBzaG93TW92ZW1lbnRDaXJjbGUsIHNob3dWaXNpb25HcmlkIH0gPSB0aGlzLmNvbmZpZztcblxuICAgIGlmIChzaG93TW92ZW1lbnRDaXJjbGUgPT09IHRydWUgJiYgdGhpcy5ub2Rlcy5jaXJjbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm5vZGVzLmNpcmNsZSA9IGNyZWF0ZUNpcmNsZU5vZGUoY29uZmlnKTtcbiAgICAgICAgdGhpcy5ub2Rlcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5ub2Rlcy5jaXJjbGUpO1xuICAgIH1cblxuICAgIGlmIChzaG93TW92ZW1lbnRDaXJjbGUgPT09IGZhbHNlICYmIHRoaXMubm9kZXMuY2lyY2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5ub2Rlcy5jb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5ub2Rlcy5jaXJjbGUpO1xuICAgICAgICBkZWxldGUgdGhpcy5ub2Rlcy5jaXJjbGU7XG4gICAgfVxuXG4gICAgaWYgKHNob3dWaXNpb25HcmlkID09PSB0cnVlICYmIHRoaXMubm9kZXMudmlzaW9uR3JpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubm9kZXMudmlzaW9uR3JpZCA9IGNyZWF0ZVZpc2lvbkdyaWROb2Rlcyh0aGlzLmNvbmZpZywgdGhpcy5ncmlkcywgdGhpcy5ub2Rlcyk7XG4gICAgfVxuXG4gICAgaWYgKHNob3dWaXNpb25HcmlkID09PSBmYWxzZSAmJiB0aGlzLm5vZGVzLnZpc2lvbkdyaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGUgdGhpcy5ub2RleC52aXNpb25HcmlkO1xuICAgIH1cbn1cblxuLy8gPT09PT0gQ1JFQVRJT04gPT09PT1cblxuZnVuY3Rpb24gY3JlYXRlQm9keU5vZGUoY29uZmlnKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIG5vZGUuY2xhc3NOYW1lID0gJ3BhcnRpY2xlLWJvZHknO1xuICAgIG5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29uZmlnLmNvbG9yO1xuICAgIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDaXJjbGVOb2RlKGNvbmZpZykge1xuICAgIGlmIChjb25maWcuc2hvd01vdmVtZW50Q2lyY2xlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBub2RlLmNsYXNzTmFtZSA9ICdwYXJ0aWNsZS1tb3ZlbWVudC1jaXJjbGUnO1xuICAgIG5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSBjb25maWcuY29sb3I7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRhaW5lck5vZGUoY29uZmlnKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIG5vZGUuY2xhc3NOYW1lID0gJ3BhcnRpY2xlLWNvbnRhaW5lcic7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZpc2lvbkdyaWQoY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZy5zaG93VmlzaW9uR3JpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZ3JpZFNpemU6IHNpZGUsIHZpc2lvblJhZGl1czogcmFkaXVzIH0gPSBjb25maWc7XG4gICAgY29uc3QgcjAgPSByYWRpdXM7XG4gICAgY29uc3QgcjEgPSByYWRpdXMgLSBzaWRlO1xuXG4gICAgY29uc3QgcG9pbnRzID0gW107XG5cbiAgICBmb3IgKGxldCB4ID0gLXJhZGl1czsgeCA8PSByYWRpdXM7IHggKz0gc2lkZSkge1xuICAgICAgICBmb3IgKGxldCB5ID0gLXJhZGl1czsgeSA8PSByYWRpdXM7IHkgKz0gc2lkZSkge1xuICAgICAgICAgICAgLy8gT21pdCBsb3dlciBoYWxmXG4gICAgICAgICAgICBpZiAoeSA8IDApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5jbHVkZSB2aXNpb24gYmFuZFxuICAgICAgICAgICAgY29uc3QgciA9IE1hdGgucG93KE1hdGgucG93KHgsIDIpICsgTWF0aC5wb3coeSwgMiksIDAuNSk7XG4gICAgICAgICAgICBpZiAociA+IHIwIHx8IHIgPCByMSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgYWxwaGEgPSBNYXRoLmF0YW4oeSAvIHgpO1xuICAgICAgICAgICAgaWYgKHggPCAwKSB7XG4gICAgICAgICAgICAgICAgYWxwaGEgPSBSQUQudDE4MCArIGFscGhhOyAvLyBUT0RPICs9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBvaW50cy5wdXNoKHsgeCwgeSwgciwgYWxwaGEsIHRvdWNoOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwb2ludHM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZpc2lvbkdyaWROb2Rlcyhjb25maWcsIGdyaWRzLCBub2Rlcykge1xuICAgIGlmIChjb25maWcuc2hvd1Zpc2lvbkdyaWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyaWRzLnZpc2lvbi5yZWR1Y2UoKGFjYywgeyB4LCB5IH0pID0+IHtcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRpdi5jbGFzc05hbWUgPSAncGFydGljbGUtdmlzaW9uLWRvdCc7XG4gICAgICAgIGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb25maWcuY29sb3I7XG4gICAgICAgIG5vZGVzLnBhcmVudC5hcHBlbmRDaGlsZChkaXYpO1xuXG4gICAgICAgIGFjYy5wdXNoKGRpdik7XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG59XG5cbi8vID09PT09IENBTENVTEFUSU9OUyA9PT09PVxuXG5mdW5jdGlvbiB1cGRhdGVBcmMoYXJjLCB7IGJvdW5kcywgcmFuZG9taXplLCBzcGVlZCB9KSB7XG4gICAgLy8gUmFuZG9tbHkgY2hhbmdlIHJhZGl1cyBhbmQgcm90YXRpb24gZGlyZWN0aW9uLlxuICAgIGlmIChhcmMubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgYXJjLmxlbmd0aCA9IHJhbmRvbS5udW0oUkFELnQ5MCwgUkFELnQzNjApO1xuXG4gICAgICAgIGlmIChyYW5kb21pemUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGFyYyA9IG1vdmVBcmMoYXJjLCByYW5kb20ubnVtKDEwMCwgMjAwKSk7XG5cbiAgICAgICAgICAgIGlmIChyYW5kb20uYm9vbCgwLjgpKSB7XG4gICAgICAgICAgICAgICAgYXJjLmNsb2Nrd2lzZSA9ICFhcmMuY2xvY2t3aXNlO1xuICAgICAgICAgICAgICAgIGFyYyA9IGNoYW5nZURpcmVjdGlvbihhcmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGNvbnN0YW50IHZlbG9jaXR5IGFuZCB0aGV0YSBiZXR3ZWVuIDAgYW5kIDLPgC5cbiAgICBjb25zdCBkZWx0YSA9IHNwZWVkIC8gYXJjLnJhZGl1cztcbiAgICBhcmMubGVuZ3RoIC09IGRlbHRhO1xuXG4gICAgYXJjLnRoZXRhICs9IChhcmMuY2xvY2t3aXNlID8gLWRlbHRhIDogK2RlbHRhKTtcbiAgICBhcmMudGhldGEgPSAoYXJjLnRoZXRhID4gMCA/IGFyYy50aGV0YSAlIFJBRC50MzYwIDogUkFELnQzNjAgKyBhcmMudGhldGEpO1xuXG4gICAgYXJjLmVuZFggPSBhcmMuY2VudGVyWCArIGFyYy5yYWRpdXMgKiBNYXRoLmNvcyhhcmMudGhldGEpO1xuICAgIGFyYy5lbmRZID0gYXJjLmNlbnRlclkgLSBhcmMucmFkaXVzICogTWF0aC5zaW4oYXJjLnRoZXRhKTtcblxuICAgIC8vIE92ZXJmbG93LlxuICAgIGlmIChhcmMuZW5kWCA8IDApIHtcbiAgICAgICAgYXJjLmVuZFggKz0gYm91bmRzLndpZHRoO1xuICAgICAgICBhcmMuY2VudGVyWCArPSBib3VuZHMud2lkdGhcbiAgICB9IGVsc2UgaWYgKGFyYy5lbmRYID4gYm91bmRzLndpZHRoKSB7XG4gICAgICAgIGFyYy5lbmRYIC09IGJvdW5kcy53aWR0aDtcbiAgICAgICAgYXJjLmNlbnRlclggLT0gYm91bmRzLndpZHRoXG4gICAgfVxuXG4gICAgaWYgKGFyYy5lbmRZIDwgMCkge1xuICAgICAgICBhcmMuZW5kWSArPSBib3VuZHMuaGVpZ2h0O1xuICAgICAgICBhcmMuY2VudGVyWSArPSBib3VuZHMuaGVpZ2h0XG4gICAgfSBlbHNlIGlmIChhcmMuZW5kWSA+IGJvdW5kcy5oZWlnaHQpIHtcbiAgICAgICAgYXJjLmVuZFkgLT0gYm91bmRzLmhlaWdodDtcbiAgICAgICAgYXJjLmNlbnRlclkgLT0gYm91bmRzLmhlaWdodFxuICAgIH1cblxuICAgIHJldHVybiBhcmM7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVZpc2lvbkdyaWQoYXJjLCBjb25maWcsIGdyaWRzKSB7XG4gICAgY29uc3QgeyBnbG9iYWwsIHZpc2lvbiB9ID0gZ3JpZHM7XG5cbiAgICByZXR1cm4gdmlzaW9uLnJlZHVjZSgoYWNjLCBwb2ludCkgPT4ge1xuICAgICAgICBjb25zdCByYWQgPSBhcmMuY2xvY2t3aXNlXG4gICAgICAgICAgICA/IGFyYy50aGV0YSArIHBvaW50LmFscGhhICsgUkFELnQxODBcbiAgICAgICAgICAgIDogYXJjLnRoZXRhICsgcG9pbnQuYWxwaGE7XG5cbiAgICAgICAgY29uc3QgeCA9IHBvaW50LnIgKiBNYXRoLmNvcyhyYWQpO1xuICAgICAgICBjb25zdCB5ID0gcG9pbnQuciAqIE1hdGguc2luKHJhZCk7XG5cbiAgICAgICAgcG9pbnQueCA9IGFyYy5lbmRYICsgeDtcbiAgICAgICAgcG9pbnQueSA9IGFyYy5lbmRZIC0geTtcblxuICAgICAgICBjb25zdCBncmlkWCA9IHBvaW50LnggLSBwb2ludC54ICUgNTtcbiAgICAgICAgY29uc3QgZ3JpZFkgPSBwb2ludC55IC0gcG9pbnQueSAlIDU7XG5cbiAgICAgICAgcG9pbnQudG91Y2ggPSAoZ2xvYmFsW2dyaWRYXSAhPT0gdW5kZWZpbmVkICYmIGdsb2JhbFtncmlkWF1bZ3JpZFldICE9PSB1bmRlZmluZWQpO1xuXG4gICAgICAgIHJldHVybiBhY2MuY29uY2F0KHBvaW50KTtcbiAgICB9LCBbXSk7XG59XG5cbmZ1bmN0aW9uIG1vdmVBcmMoYXJjLCBuZXdSYWRpdXMpIHtcbiAgICBjb25zdCByMCA9IGFyYy5yYWRpdXM7XG4gICAgY29uc3QgcjEgPSBuZXdSYWRpdXM7XG5cbiAgICAvLyBNb3ZlcyBhcmMgY2VudGVyIHRvIG5ldyByYWRpdXMgd2hpbGUga2VlcGluZyB0aGV0YSBjb25zdGFudC5cbiAgICBhcmMuY2VudGVyWCAtPSAocjEgLSByMCkgKiBNYXRoLmNvcyhhcmMudGhldGEpO1xuICAgIGFyYy5jZW50ZXJZICs9IChyMSAtIHIwKSAqIE1hdGguc2luKGFyYy50aGV0YSk7XG4gICAgYXJjLnJhZGl1cyA9IHIxO1xuXG4gICAgcmV0dXJuIGFyYztcbn1cblxuZnVuY3Rpb24gY2hhbmdlRGlyZWN0aW9uKGFyYykge1xuICAgIGFyYy50aGV0YSA9IChhcmMudGhldGEgKyBSQUQudDE4MCkgJSBSQUQudDM2MDtcbiAgICBhcmMuY2VudGVyWCAtPSAoMiAqIGFyYy5yYWRpdXMpICogTWF0aC5jb3MoYXJjLnRoZXRhKTtcbiAgICBhcmMuY2VudGVyWSArPSAoMiAqIGFyYy5yYWRpdXMpICogTWF0aC5zaW4oYXJjLnRoZXRhKTtcblxuICAgIHJldHVybiBhcmM7XG59XG5cbi8vID09PT09IFJFTkRFUklORyA9PT09PVxuZnVuY3Rpb24gcmVwYWludENvbnRhaW5lcihub2RlLCBhcmMpIHtcbiAgICBub2RlLnN0eWxlLmxlZnQgPSBgJHthcmMuZW5kWH1weGA7XG4gICAgbm9kZS5zdHlsZS50b3AgPSBgJHthcmMuZW5kWX1weGA7XG59XG5cbmZ1bmN0aW9uIHJlcGFpbnRCb2R5KG5vZGUsIGFyYykge1xuICAgIGNvbnN0IHJhZCA9IGFyYy5jbG9ja3dpc2VcbiAgICAgICAgPyBSQUQudDE4MCAtIGFyYy50aGV0YVxuICAgICAgICA6IFJBRC50MzYwIC0gYXJjLnRoZXRhO1xuXG4gICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSBgcm90YXRlKCR7cmFkICsgUkFELnQ0NX1yYWQpYDtcbn1cblxuZnVuY3Rpb24gcmVwYWludENpcmNsZShub2RlLCBhcmMpIHtcbiAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnN0eWxlLndpZHRoID0gYCR7MiAqIGFyYy5yYWRpdXN9cHhgO1xuICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gYCR7MiAqIGFyYy5yYWRpdXN9cHhgO1xuXG4gICAgbm9kZS5zdHlsZS5sZWZ0ID0gYC0ke2FyYy5yYWRpdXMgKyBhcmMucmFkaXVzICogTWF0aC5jb3MoYXJjLnRoZXRhKX1weGA7XG4gICAgbm9kZS5zdHlsZS50b3AgPSBgLSR7YXJjLnJhZGl1cyAtIGFyYy5yYWRpdXMgKiBNYXRoLnNpbihhcmMudGhldGEpfXB4YDtcblxuICAgIG5vZGUuc3R5bGUuYm9yZGVyUmFkaXVzID0gYCR7YXJjLnJhZGl1c31weGA7XG59XG5cbmZ1bmN0aW9uIHJlcGFpbnRWaXNpb25HcmlkKG5vZGVzLCBhcmMsIGdyaWRzKSB7XG4gICAgaWYgKG5vZGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGdyaWRzLnZpc2lvbi5mb3JFYWNoKCh7IHgsIHksIHRvdWNoIH0sIGkpID0+IHtcbiAgICAgICAgbm9kZXNbaV0uc3R5bGUubGVmdCA9IGAke3h9cHhgO1xuICAgICAgICBub2Rlc1tpXS5zdHlsZS50b3AgPSBgJHt5fXB4YDtcblxuICAgICAgICBub2Rlc1tpXS5zdHlsZS5ib3JkZXIgPSAodG91Y2ggPyAnMnB4IHNvbGlkIHJlZCcgOiAnMCcpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBQYXJ0aWNsZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBqcy9wYXJ0aWNsZS5qcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTtBQUFBO0FBQ0E7Ozs7O0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFIQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFDQTtBQVVBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ=="); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 14);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _enums = __webpack_require__(/*! ./enums */ 16);\n\nvar _store = __webpack_require__(/*! ./store */ 22);\n\nvar _store2 = _interopRequireDefault(_store);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar random = {\n bool: function bool(weight) {\n return Math.random() < (weight || 0.5);\n },\n color: function color() {\n return 'rgb(' + Math.floor(Math.random() * 255) + ', ' + Math.floor(Math.random() * 255) + ', ' + Math.floor(Math.random() * 255) + ')';\n },\n num: function num(min, max) {\n return min + Math.round(Math.random() * max);\n }\n};\n\n// ===== Constructor =====\n\nfunction Particle(parent, bounds, config, globalGrid) {\n this.config = Object.assign({\n bounds: bounds,\n color: random.color(),\n gridSize: 5,\n randomize: false,\n showMovementCircle: false,\n showVisionGrid: false,\n speed: 4,\n visionRadius: 50\n }, config);\n\n this.grids = {\n global: globalGrid || {},\n vision: createVisionGrid(this.config)\n };\n\n this.arc = createArc(bounds, globalGrid, this.config); // TODO no need to pass config after testing\n\n this.nodes = {\n body: createBodyNode(this.config),\n circle: undefined,\n container: createContainerNode(this.config),\n parent: parent,\n visionGrid: undefined\n };\n\n this.nodes.container.appendChild(this.nodes.body);\n parent.appendChild(this.nodes.container);\n\n this.updateConfig(this.config);\n this.nextFrame();\n};\n\n// ===== PROTOTYPE =====\n\nParticle.prototype.remove = function () {\n var _this = this;\n\n this.nodes.parent.removeChild(this.nodes.container);\n\n this.nodes.visionGrid.forEach(function (node) {\n return _this.nodes.parent.removeChild(node);\n });\n\n return this;\n};\n\nParticle.prototype.nextFrame = function () {\n this.arc = updateArc(this.arc, this.config);\n this.grids.vision = updateVisionGrid(this.arc, this.config, this.grids);\n\n this.arc = evade(this.arc, this.grids.vision);\n\n repaintContainer(this.nodes.container, this.arc);\n repaintBody(this.nodes.body, this.arc);\n repaintCircle(this.nodes.circle, this.arc);\n repaintVisionGrid(this.nodes.visionGrid, this.arc, this.grids);\n};\n\nParticle.prototype.updateConfig = function (config) {\n Object.assign(this.config, config);\n\n var _config = this.config,\n showMovementCircle = _config.showMovementCircle,\n showVisionGrid = _config.showVisionGrid;\n\n\n if (showMovementCircle === true && this.nodes.circle === undefined) {\n this.nodes.circle = createCircleNode(config);\n this.nodes.container.appendChild(this.nodes.circle);\n }\n\n if (showMovementCircle === false && this.nodes.circle !== undefined) {\n this.nodes.container.removeChild(this.nodes.circle);\n delete this.nodes.circle;\n }\n\n if (showVisionGrid === true && this.nodes.visionGrid === undefined) {\n this.nodes.visionGrid = createVisionGridNodes(this.config, this.grids, this.nodes);\n }\n\n if (showVisionGrid === false && this.nodes.visionGrid !== undefined) {\n delete this.nodex.visionGrid;\n }\n};\n\n// ===== CREATION =====\n\nfunction createArc(bounds, globalGrid, config) {\n var arc = {\n centerX: random.num(0, bounds.width),\n centerY: random.num(0, bounds.height),\n clockwise: random.bool(),\n endX: 0,\n endY: 0,\n length: random.num(_enums.RAD.t90, _enums.RAD.t360),\n radius: random.num(100, 200),\n theta: random.num(_enums.RAD.t90, _enums.RAD.t360)\n };\n\n arc.endX = arc.centerX + arc.radius * Math.cos(arc.theta);\n arc.endY = arc.centerY - arc.radius * Math.sin(arc.theta);\n\n arc = overflowArc(arc, bounds);\n\n var x = arc.endX - arc.endX % 5;\n var y = arc.endY - arc.endY % 5;\n\n // If starting in a hazard, recurse.\n if (globalGrid[x] !== undefined && globalGrid[x][y] !== undefined) {\n arc = createArc(bounds, globalGrid, config);\n }\n\n return arc;\n}\n\nfunction createBodyNode(config) {\n var node = document.createElement('div');\n node.className = 'particle-body';\n node.style.backgroundColor = config.color;\n return node;\n}\n\nfunction createCircleNode(config) {\n if (config.showMovementCircle === false) {\n return undefined;\n }\n\n var node = document.createElement('div');\n node.className = 'particle-movement-circle';\n node.style.borderColor = config.color;\n return node;\n}\n\nfunction createContainerNode(config) {\n var node = document.createElement('div');\n node.className = 'particle-container';\n return node;\n}\n\nfunction createVisionGrid(config) {\n var side = config.gridSize,\n radius = config.visionRadius;\n\n var r0 = radius;\n var r1 = radius - side;\n\n var points = [];\n\n for (var x = -radius; x <= radius; x += side) {\n for (var y = -radius; y <= radius; y += side) {\n // Omit large slices of unused circle\n if (x > y || x < -y) {\n continue;\n }\n\n // Include vision band\n var r = Math.pow(Math.pow(x, 2) + Math.pow(y, 2), 0.5);\n if (r > r0 || r < r1) {\n continue;\n }\n\n var alpha = Math.atan(y / x);\n if (x < 0) {\n alpha += _enums.RAD.t180;\n }\n\n points.push({ x: x, y: y, r: r, alpha: alpha, touch: false });\n }\n }\n\n return points;\n}\n\nfunction createVisionGridNodes(config, grids, nodes) {\n if (config.showVisionGrid === false) {\n return undefined;\n }\n\n return grids.vision.reduce(function (acc, _ref) {\n var x = _ref.x,\n y = _ref.y;\n\n var div = document.createElement('div');\n div.className = 'particle-vision-dot';\n div.style.backgroundColor = config.color;\n nodes.parent.appendChild(div);\n\n acc.push(div);\n\n return acc;\n }, []);\n}\n\n// ===== CALCULATIONS =====\n\nfunction updateArc(arc, _ref2) {\n var bounds = _ref2.bounds,\n randomize = _ref2.randomize,\n speed = _ref2.speed;\n\n // Randomly change radius and rotation direction.\n if (arc.length <= 0) {\n arc.length = random.num(_enums.RAD.t90, _enums.RAD.t360);\n\n if (randomize === true) {\n arc = moveArc(arc, random.num(100, 200));\n\n if (random.bool(0.8)) {\n arc.clockwise = !arc.clockwise;\n arc = changeDirection(arc);\n }\n }\n }\n\n // Ensure constant velocity and theta between 0 and 2π.\n var delta = speed / arc.radius;\n arc.length -= delta;\n\n arc.theta += arc.clockwise ? -delta : +delta;\n arc.theta = arc.theta > 0 ? arc.theta % _enums.RAD.t360 : _enums.RAD.t360 + arc.theta;\n\n arc.endX = arc.centerX + arc.radius * Math.cos(arc.theta);\n arc.endY = arc.centerY - arc.radius * Math.sin(arc.theta);\n\n // Overflow.\n arc = overflowArc(arc, bounds);\n\n return arc;\n}\n\nfunction updateVisionGrid(arc, config, grids) {\n var global = grids.global,\n vision = grids.vision;\n\n\n return vision.reduce(function (acc, point) {\n var rad = arc.clockwise ? arc.theta + point.alpha + _enums.RAD.t180 : arc.theta + point.alpha;\n\n var x = point.r * Math.cos(rad);\n var y = point.r * Math.sin(rad);\n\n point.x = arc.endX + x;\n point.y = arc.endY - y;\n\n var gridX = point.x - point.x % 5;\n var gridY = point.y - point.y % 5;\n\n point.touch = global[gridX] !== undefined && global[gridX][gridY] !== undefined;\n\n return acc.concat(point);\n }, []);\n}\n\nfunction overflowArc(arc, bounds) {\n if (arc.endX < 0) {\n arc.endX += bounds.width;\n arc.centerX += bounds.width;\n } else if (arc.endX > bounds.width) {\n arc.endX -= bounds.width;\n arc.centerX -= bounds.width;\n }\n\n if (arc.endY < 0) {\n arc.endY += bounds.height;\n arc.centerY += bounds.height;\n } else if (arc.endY > bounds.height) {\n arc.endY -= bounds.height;\n arc.centerY -= bounds.height;\n }\n\n return arc;\n}\n\nfunction moveArc(arc, newRadius) {\n var r0 = arc.radius;\n var r1 = newRadius;\n\n // Moves arc center to new radius while keeping theta constant.\n arc.centerX -= (r1 - r0) * Math.cos(arc.theta);\n arc.centerY += (r1 - r0) * Math.sin(arc.theta);\n arc.radius = r1;\n\n return arc;\n}\n\nfunction changeDirection(arc) {\n arc.theta = (arc.theta + _enums.RAD.t180) % _enums.RAD.t360;\n arc.centerX -= 2 * arc.radius * Math.cos(arc.theta);\n arc.centerY += 2 * arc.radius * Math.sin(arc.theta);\n\n return arc;\n}\n\n// ===== ACTIONS =====\nfunction evade(arc, visionGrid) {\n var danger = visionGrid.reduce(function (acc, v) {\n return acc || v.touch;\n }, false);\n\n if (danger === false) {\n return arc;\n }\n\n var evasionArc = moveArc(arc, 20);\n evasionArc.length = 1;\n\n return evasionArc;\n}\n\n// ===== RENDERING =====\nfunction repaintContainer(node, arc) {\n node.style.left = arc.endX + 'px';\n node.style.top = arc.endY + 'px';\n}\n\nfunction repaintBody(node, arc) {\n var rad = arc.clockwise ? _enums.RAD.t180 - arc.theta : _enums.RAD.t360 - arc.theta;\n\n node.style.transform = 'rotate(' + (rad + _enums.RAD.t45) + 'rad)';\n}\n\nfunction repaintCircle(node, arc) {\n if (node === undefined) {\n return;\n }\n\n node.style.width = 2 * arc.radius + 'px';\n node.style.height = 2 * arc.radius + 'px';\n\n node.style.left = '-' + (arc.radius + arc.radius * Math.cos(arc.theta)) + 'px';\n node.style.top = '-' + (arc.radius - arc.radius * Math.sin(arc.theta)) + 'px';\n\n node.style.borderRadius = arc.radius + 'px';\n}\n\nfunction repaintVisionGrid(nodes, arc, grids) {\n if (nodes === undefined) {\n return;\n }\n\n grids.vision.forEach(function (_ref3, i) {\n var x = _ref3.x,\n y = _ref3.y,\n touch = _ref3.touch;\n\n nodes[i].style.left = x + 'px';\n nodes[i].style.top = y + 'px';\n\n nodes[i].style.border = touch ? '2px solid red' : '0';\n });\n}\n\nexports.default = Particle;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvcGFydGljbGUuanM/M2JkZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUkFEIH0gZnJvbSAnLi9lbnVtcyc7XG5pbXBvcnQgU3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5cbmNvbnN0IHJhbmRvbSA9IHtcbiAgICBib29sOiAod2VpZ2h0KSA9PiBNYXRoLnJhbmRvbSgpIDwgKHdlaWdodCB8fCAwLjUpLFxuICAgIGNvbG9yOiAoKSA9PiBgcmdiKCR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU1KX0sICR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU1KX0sICR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU1KX0pYCxcbiAgICBudW06IChtaW4sIG1heCkgPT4gbWluICsgTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogbWF4KSxcbn1cblxuLy8gPT09PT0gQ29uc3RydWN0b3IgPT09PT1cblxuZnVuY3Rpb24gUGFydGljbGUocGFyZW50LCBib3VuZHMsIGNvbmZpZywgZ2xvYmFsR3JpZCkge1xuICAgIHRoaXMuY29uZmlnID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGJvdW5kcyxcbiAgICAgICAgY29sb3I6IHJhbmRvbS5jb2xvcigpLFxuICAgICAgICBncmlkU2l6ZTogNSxcbiAgICAgICAgcmFuZG9taXplOiBmYWxzZSxcbiAgICAgICAgc2hvd01vdmVtZW50Q2lyY2xlOiBmYWxzZSxcbiAgICAgICAgc2hvd1Zpc2lvbkdyaWQ6IGZhbHNlLFxuICAgICAgICBzcGVlZDogNCxcbiAgICAgICAgdmlzaW9uUmFkaXVzOiA1MFxuICAgIH0sIGNvbmZpZyk7XG5cbiAgICB0aGlzLmdyaWRzID0ge1xuICAgICAgICBnbG9iYWw6IGdsb2JhbEdyaWQgfHwge30sXG4gICAgICAgIHZpc2lvbjogY3JlYXRlVmlzaW9uR3JpZCh0aGlzLmNvbmZpZylcbiAgICB9O1xuXG4gICAgdGhpcy5hcmMgPSBjcmVhdGVBcmMoYm91bmRzLCBnbG9iYWxHcmlkLCB0aGlzLmNvbmZpZyk7IC8vIFRPRE8gbm8gbmVlZCB0byBwYXNzIGNvbmZpZyBhZnRlciB0ZXN0aW5nXG5cbiAgICB0aGlzLm5vZGVzID0ge1xuICAgICAgICBib2R5OiBjcmVhdGVCb2R5Tm9kZSh0aGlzLmNvbmZpZyksXG4gICAgICAgIGNpcmNsZTogdW5kZWZpbmVkLFxuICAgICAgICBjb250YWluZXI6IGNyZWF0ZUNvbnRhaW5lck5vZGUodGhpcy5jb25maWcpLFxuICAgICAgICBwYXJlbnQsXG4gICAgICAgIHZpc2lvbkdyaWQ6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgdGhpcy5ub2Rlcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5ub2Rlcy5ib2R5KTtcbiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5ub2Rlcy5jb250YWluZXIpO1xuXG4gICAgdGhpcy51cGRhdGVDb25maWcodGhpcy5jb25maWcpO1xuICAgIHRoaXMubmV4dEZyYW1lKCk7XG59O1xuXG4vLyA9PT09PSBQUk9UT1RZUEUgPT09PT1cblxuUGFydGljbGUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMubm9kZXMucGFyZW50LnJlbW92ZUNoaWxkKHRoaXMubm9kZXMuY29udGFpbmVyKTtcblxuICAgIHRoaXMubm9kZXMudmlzaW9uR3JpZC5mb3JFYWNoKG5vZGUgPT4gdGhpcy5ub2Rlcy5wYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSkpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblBhcnRpY2xlLnByb3RvdHlwZS5uZXh0RnJhbWUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmFyYyA9IHVwZGF0ZUFyYyh0aGlzLmFyYywgdGhpcy5jb25maWcpO1xuICAgIHRoaXMuZ3JpZHMudmlzaW9uID0gdXBkYXRlVmlzaW9uR3JpZCh0aGlzLmFyYywgdGhpcy5jb25maWcsIHRoaXMuZ3JpZHMpO1xuXG4gICAgdGhpcy5hcmMgPSBldmFkZSh0aGlzLmFyYywgdGhpcy5ncmlkcy52aXNpb24pO1xuXG4gICAgcmVwYWludENvbnRhaW5lcih0aGlzLm5vZGVzLmNvbnRhaW5lciwgdGhpcy5hcmMpO1xuICAgIHJlcGFpbnRCb2R5KHRoaXMubm9kZXMuYm9keSwgdGhpcy5hcmMpO1xuICAgIHJlcGFpbnRDaXJjbGUodGhpcy5ub2Rlcy5jaXJjbGUsIHRoaXMuYXJjKTtcbiAgICByZXBhaW50VmlzaW9uR3JpZCh0aGlzLm5vZGVzLnZpc2lvbkdyaWQsIHRoaXMuYXJjLCB0aGlzLmdyaWRzKTtcbn1cblxuUGFydGljbGUucHJvdG90eXBlLnVwZGF0ZUNvbmZpZyA9IGZ1bmN0aW9uKGNvbmZpZykge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jb25maWcsIGNvbmZpZyk7XG5cbiAgICBjb25zdCB7IHNob3dNb3ZlbWVudENpcmNsZSwgc2hvd1Zpc2lvbkdyaWQgfSA9IHRoaXMuY29uZmlnO1xuXG4gICAgaWYgKHNob3dNb3ZlbWVudENpcmNsZSA9PT0gdHJ1ZSAmJiB0aGlzLm5vZGVzLmNpcmNsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubm9kZXMuY2lyY2xlID0gY3JlYXRlQ2lyY2xlTm9kZShjb25maWcpO1xuICAgICAgICB0aGlzLm5vZGVzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm5vZGVzLmNpcmNsZSk7XG4gICAgfVxuXG4gICAgaWYgKHNob3dNb3ZlbWVudENpcmNsZSA9PT0gZmFsc2UgJiYgdGhpcy5ub2Rlcy5jaXJjbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm5vZGVzLmNvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLm5vZGVzLmNpcmNsZSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm5vZGVzLmNpcmNsZTtcbiAgICB9XG5cbiAgICBpZiAoc2hvd1Zpc2lvbkdyaWQgPT09IHRydWUgJiYgdGhpcy5ub2Rlcy52aXNpb25HcmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5ub2Rlcy52aXNpb25HcmlkID0gY3JlYXRlVmlzaW9uR3JpZE5vZGVzKHRoaXMuY29uZmlnLCB0aGlzLmdyaWRzLCB0aGlzLm5vZGVzKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvd1Zpc2lvbkdyaWQgPT09IGZhbHNlICYmIHRoaXMubm9kZXMudmlzaW9uR3JpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm5vZGV4LnZpc2lvbkdyaWQ7XG4gICAgfVxufVxuXG4vLyA9PT09PSBDUkVBVElPTiA9PT09PVxuXG5mdW5jdGlvbiBjcmVhdGVBcmMoYm91bmRzLCBnbG9iYWxHcmlkLCBjb25maWcpIHtcbiAgICBsZXQgYXJjID0ge1xuICAgICAgICBjZW50ZXJYOiByYW5kb20ubnVtKDAsIGJvdW5kcy53aWR0aCksXG4gICAgICAgIGNlbnRlclk6IHJhbmRvbS5udW0oMCwgYm91bmRzLmhlaWdodCksXG4gICAgICAgIGNsb2Nrd2lzZTogcmFuZG9tLmJvb2woKSxcbiAgICAgICAgZW5kWDogMCxcbiAgICAgICAgZW5kWTogMCxcbiAgICAgICAgbGVuZ3RoOiByYW5kb20ubnVtKFJBRC50OTAsIFJBRC50MzYwKSxcbiAgICAgICAgcmFkaXVzOiByYW5kb20ubnVtKDEwMCwgMjAwKSxcbiAgICAgICAgdGhldGE6IHJhbmRvbS5udW0oUkFELnQ5MCwgUkFELnQzNjApLFxuICAgIH07XG5cbiAgICBhcmMuZW5kWCA9IGFyYy5jZW50ZXJYICsgYXJjLnJhZGl1cyAqIE1hdGguY29zKGFyYy50aGV0YSk7XG4gICAgYXJjLmVuZFkgPSBhcmMuY2VudGVyWSAtIGFyYy5yYWRpdXMgKiBNYXRoLnNpbihhcmMudGhldGEpO1xuXG4gICAgYXJjID0gb3ZlcmZsb3dBcmMoYXJjLCBib3VuZHMpO1xuXG4gICAgY29uc3QgeCA9IGFyYy5lbmRYIC0gYXJjLmVuZFggJSA1O1xuICAgIGNvbnN0IHkgPSBhcmMuZW5kWSAtIGFyYy5lbmRZICUgNTtcblxuICAgIC8vIElmIHN0YXJ0aW5nIGluIGEgaGF6YXJkLCByZWN1cnNlLlxuICAgIGlmIChnbG9iYWxHcmlkW3hdICE9PSB1bmRlZmluZWQgJiYgZ2xvYmFsR3JpZFt4XVt5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFyYyA9IGNyZWF0ZUFyYyhib3VuZHMsIGdsb2JhbEdyaWQsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyYztcbn1cblxuZnVuY3Rpb24gY3JlYXRlQm9keU5vZGUoY29uZmlnKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIG5vZGUuY2xhc3NOYW1lID0gJ3BhcnRpY2xlLWJvZHknO1xuICAgIG5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29uZmlnLmNvbG9yO1xuICAgIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDaXJjbGVOb2RlKGNvbmZpZykge1xuICAgIGlmIChjb25maWcuc2hvd01vdmVtZW50Q2lyY2xlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBub2RlLmNsYXNzTmFtZSA9ICdwYXJ0aWNsZS1tb3ZlbWVudC1jaXJjbGUnO1xuICAgIG5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSBjb25maWcuY29sb3I7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRhaW5lck5vZGUoY29uZmlnKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIG5vZGUuY2xhc3NOYW1lID0gJ3BhcnRpY2xlLWNvbnRhaW5lcic7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZpc2lvbkdyaWQoY29uZmlnKSB7XG4gICAgY29uc3QgeyBncmlkU2l6ZTogc2lkZSwgdmlzaW9uUmFkaXVzOiByYWRpdXMgfSA9IGNvbmZpZztcbiAgICBjb25zdCByMCA9IHJhZGl1cztcbiAgICBjb25zdCByMSA9IHJhZGl1cyAtIHNpZGU7XG5cbiAgICBjb25zdCBwb2ludHMgPSBbXTtcblxuICAgIGZvciAobGV0IHggPSAtcmFkaXVzOyB4IDw9IHJhZGl1czsgeCArPSBzaWRlKSB7XG4gICAgICAgIGZvciAobGV0IHkgPSAtcmFkaXVzOyB5IDw9IHJhZGl1czsgeSArPSBzaWRlKSB7XG4gICAgICAgICAgICAvLyBPbWl0IGxhcmdlIHNsaWNlcyBvZiB1bnVzZWQgY2lyY2xlXG4gICAgICAgICAgICBpZiAoeCA+IHkgfHwgeCA8IC15KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluY2x1ZGUgdmlzaW9uIGJhbmRcbiAgICAgICAgICAgIGNvbnN0IHIgPSBNYXRoLnBvdyhNYXRoLnBvdyh4LCAyKSArIE1hdGgucG93KHksIDIpLCAwLjUpO1xuICAgICAgICAgICAgaWYgKHIgPiByMCB8fCByIDwgcjEpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGFscGhhID0gTWF0aC5hdGFuKHkgLyB4KTtcbiAgICAgICAgICAgIGlmICh4IDwgMCkge1xuICAgICAgICAgICAgICAgIGFscGhhICs9IFJBRC50MTgwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwb2ludHMucHVzaCh7IHgsIHksIHIsIGFscGhhLCB0b3VjaDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcG9pbnRzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVWaXNpb25HcmlkTm9kZXMoY29uZmlnLCBncmlkcywgbm9kZXMpIHtcbiAgICBpZiAoY29uZmlnLnNob3dWaXNpb25HcmlkID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBncmlkcy52aXNpb24ucmVkdWNlKChhY2MsIHsgeCwgeSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gJ3BhcnRpY2xlLXZpc2lvbi1kb3QnO1xuICAgICAgICBkaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29uZmlnLmNvbG9yO1xuICAgICAgICBub2Rlcy5wYXJlbnQuYXBwZW5kQ2hpbGQoZGl2KTtcblxuICAgICAgICBhY2MucHVzaChkaXYpO1xuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10pO1xufVxuXG4vLyA9PT09PSBDQUxDVUxBVElPTlMgPT09PT1cblxuZnVuY3Rpb24gdXBkYXRlQXJjKGFyYywgeyBib3VuZHMsIHJhbmRvbWl6ZSwgc3BlZWQgfSkge1xuICAgIC8vIFJhbmRvbWx5IGNoYW5nZSByYWRpdXMgYW5kIHJvdGF0aW9uIGRpcmVjdGlvbi5cbiAgICBpZiAoYXJjLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgIGFyYy5sZW5ndGggPSByYW5kb20ubnVtKFJBRC50OTAsIFJBRC50MzYwKTtcblxuICAgICAgICBpZiAocmFuZG9taXplID09PSB0cnVlKSB7XG4gICAgICAgICAgICBhcmMgPSBtb3ZlQXJjKGFyYywgcmFuZG9tLm51bSgxMDAsIDIwMCkpO1xuXG4gICAgICAgICAgICBpZiAocmFuZG9tLmJvb2woMC44KSkge1xuICAgICAgICAgICAgICAgIGFyYy5jbG9ja3dpc2UgPSAhYXJjLmNsb2Nrd2lzZTtcbiAgICAgICAgICAgICAgICBhcmMgPSBjaGFuZ2VEaXJlY3Rpb24oYXJjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVuc3VyZSBjb25zdGFudCB2ZWxvY2l0eSBhbmQgdGhldGEgYmV0d2VlbiAwIGFuZCAyz4AuXG4gICAgY29uc3QgZGVsdGEgPSBzcGVlZCAvIGFyYy5yYWRpdXM7XG4gICAgYXJjLmxlbmd0aCAtPSBkZWx0YTtcblxuICAgIGFyYy50aGV0YSArPSAoYXJjLmNsb2Nrd2lzZSA/IC1kZWx0YSA6ICtkZWx0YSk7XG4gICAgYXJjLnRoZXRhID0gKGFyYy50aGV0YSA+IDAgPyBhcmMudGhldGEgJSBSQUQudDM2MCA6IFJBRC50MzYwICsgYXJjLnRoZXRhKTtcblxuICAgIGFyYy5lbmRYID0gYXJjLmNlbnRlclggKyBhcmMucmFkaXVzICogTWF0aC5jb3MoYXJjLnRoZXRhKTtcbiAgICBhcmMuZW5kWSA9IGFyYy5jZW50ZXJZIC0gYXJjLnJhZGl1cyAqIE1hdGguc2luKGFyYy50aGV0YSk7XG5cbiAgICAvLyBPdmVyZmxvdy5cbiAgICBhcmMgPSBvdmVyZmxvd0FyYyhhcmMsIGJvdW5kcyk7XG5cbiAgICByZXR1cm4gYXJjO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVWaXNpb25HcmlkKGFyYywgY29uZmlnLCBncmlkcykge1xuICAgIGNvbnN0IHsgZ2xvYmFsLCB2aXNpb24gfSA9IGdyaWRzO1xuXG4gICAgcmV0dXJuIHZpc2lvbi5yZWR1Y2UoKGFjYywgcG9pbnQpID0+IHtcbiAgICAgICAgY29uc3QgcmFkID0gYXJjLmNsb2Nrd2lzZVxuICAgICAgICAgICAgPyBhcmMudGhldGEgKyBwb2ludC5hbHBoYSArIFJBRC50MTgwXG4gICAgICAgICAgICA6IGFyYy50aGV0YSArIHBvaW50LmFscGhhO1xuXG4gICAgICAgIGNvbnN0IHggPSBwb2ludC5yICogTWF0aC5jb3MocmFkKTtcbiAgICAgICAgY29uc3QgeSA9IHBvaW50LnIgKiBNYXRoLnNpbihyYWQpO1xuXG4gICAgICAgIHBvaW50LnggPSBhcmMuZW5kWCArIHg7XG4gICAgICAgIHBvaW50LnkgPSBhcmMuZW5kWSAtIHk7XG5cbiAgICAgICAgY29uc3QgZ3JpZFggPSBwb2ludC54IC0gcG9pbnQueCAlIDU7XG4gICAgICAgIGNvbnN0IGdyaWRZID0gcG9pbnQueSAtIHBvaW50LnkgJSA1O1xuXG4gICAgICAgIHBvaW50LnRvdWNoID0gKGdsb2JhbFtncmlkWF0gIT09IHVuZGVmaW5lZCAmJiBnbG9iYWxbZ3JpZFhdW2dyaWRZXSAhPT0gdW5kZWZpbmVkKTtcblxuICAgICAgICByZXR1cm4gYWNjLmNvbmNhdChwb2ludCk7XG4gICAgfSwgW10pO1xufVxuXG5mdW5jdGlvbiBvdmVyZmxvd0FyYyhhcmMsIGJvdW5kcykge1xuICAgIGlmIChhcmMuZW5kWCA8IDApIHtcbiAgICAgICAgYXJjLmVuZFggKz0gYm91bmRzLndpZHRoO1xuICAgICAgICBhcmMuY2VudGVyWCArPSBib3VuZHMud2lkdGhcbiAgICB9IGVsc2UgaWYgKGFyYy5lbmRYID4gYm91bmRzLndpZHRoKSB7XG4gICAgICAgIGFyYy5lbmRYIC09IGJvdW5kcy53aWR0aDtcbiAgICAgICAgYXJjLmNlbnRlclggLT0gYm91bmRzLndpZHRoXG4gICAgfVxuXG4gICAgaWYgKGFyYy5lbmRZIDwgMCkge1xuICAgICAgICBhcmMuZW5kWSArPSBib3VuZHMuaGVpZ2h0O1xuICAgICAgICBhcmMuY2VudGVyWSArPSBib3VuZHMuaGVpZ2h0XG4gICAgfSBlbHNlIGlmIChhcmMuZW5kWSA+IGJvdW5kcy5oZWlnaHQpIHtcbiAgICAgICAgYXJjLmVuZFkgLT0gYm91bmRzLmhlaWdodDtcbiAgICAgICAgYXJjLmNlbnRlclkgLT0gYm91bmRzLmhlaWdodFxuICAgIH1cblxuICAgIHJldHVybiBhcmM7XG59XG5cbmZ1bmN0aW9uIG1vdmVBcmMoYXJjLCBuZXdSYWRpdXMpIHtcbiAgICBjb25zdCByMCA9IGFyYy5yYWRpdXM7XG4gICAgY29uc3QgcjEgPSBuZXdSYWRpdXM7XG5cbiAgICAvLyBNb3ZlcyBhcmMgY2VudGVyIHRvIG5ldyByYWRpdXMgd2hpbGUga2VlcGluZyB0aGV0YSBjb25zdGFudC5cbiAgICBhcmMuY2VudGVyWCAtPSAocjEgLSByMCkgKiBNYXRoLmNvcyhhcmMudGhldGEpO1xuICAgIGFyYy5jZW50ZXJZICs9IChyMSAtIHIwKSAqIE1hdGguc2luKGFyYy50aGV0YSk7XG4gICAgYXJjLnJhZGl1cyA9IHIxO1xuXG4gICAgcmV0dXJuIGFyYztcbn1cblxuZnVuY3Rpb24gY2hhbmdlRGlyZWN0aW9uKGFyYykge1xuICAgIGFyYy50aGV0YSA9IChhcmMudGhldGEgKyBSQUQudDE4MCkgJSBSQUQudDM2MDtcbiAgICBhcmMuY2VudGVyWCAtPSAoMiAqIGFyYy5yYWRpdXMpICogTWF0aC5jb3MoYXJjLnRoZXRhKTtcbiAgICBhcmMuY2VudGVyWSArPSAoMiAqIGFyYy5yYWRpdXMpICogTWF0aC5zaW4oYXJjLnRoZXRhKTtcblxuICAgIHJldHVybiBhcmM7XG59XG5cbi8vID09PT09IEFDVElPTlMgPT09PT1cbmZ1bmN0aW9uIGV2YWRlKGFyYywgdmlzaW9uR3JpZCkge1xuICAgIGNvbnN0IGRhbmdlciA9IHZpc2lvbkdyaWQucmVkdWNlKChhY2MsIHYpID0+IGFjYyB8fCB2LnRvdWNoLCBmYWxzZSk7XG5cbiAgICBpZiAoZGFuZ2VyID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gYXJjO1xuICAgIH1cblxuICAgIGNvbnN0IGV2YXNpb25BcmMgPSBtb3ZlQXJjKGFyYywgMjApO1xuICAgIGV2YXNpb25BcmMubGVuZ3RoID0gMTtcblxuICAgIHJldHVybiBldmFzaW9uQXJjO1xufVxuXG4vLyA9PT09PSBSRU5ERVJJTkcgPT09PT1cbmZ1bmN0aW9uIHJlcGFpbnRDb250YWluZXIobm9kZSwgYXJjKSB7XG4gICAgbm9kZS5zdHlsZS5sZWZ0ID0gYCR7YXJjLmVuZFh9cHhgO1xuICAgIG5vZGUuc3R5bGUudG9wID0gYCR7YXJjLmVuZFl9cHhgO1xufVxuXG5mdW5jdGlvbiByZXBhaW50Qm9keShub2RlLCBhcmMpIHtcbiAgICBjb25zdCByYWQgPSBhcmMuY2xvY2t3aXNlXG4gICAgICAgID8gUkFELnQxODAgLSBhcmMudGhldGFcbiAgICAgICAgOiBSQUQudDM2MCAtIGFyYy50aGV0YTtcblxuICAgIG5vZGUuc3R5bGUudHJhbnNmb3JtID0gYHJvdGF0ZSgke3JhZCArIFJBRC50NDV9cmFkKWA7XG59XG5cbmZ1bmN0aW9uIHJlcGFpbnRDaXJjbGUobm9kZSwgYXJjKSB7XG4gICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zdHlsZS53aWR0aCA9IGAkezIgKiBhcmMucmFkaXVzfXB4YDtcbiAgICBub2RlLnN0eWxlLmhlaWdodCA9IGAkezIgKiBhcmMucmFkaXVzfXB4YDtcblxuICAgIG5vZGUuc3R5bGUubGVmdCA9IGAtJHthcmMucmFkaXVzICsgYXJjLnJhZGl1cyAqIE1hdGguY29zKGFyYy50aGV0YSl9cHhgO1xuICAgIG5vZGUuc3R5bGUudG9wID0gYC0ke2FyYy5yYWRpdXMgLSBhcmMucmFkaXVzICogTWF0aC5zaW4oYXJjLnRoZXRhKX1weGA7XG5cbiAgICBub2RlLnN0eWxlLmJvcmRlclJhZGl1cyA9IGAke2FyYy5yYWRpdXN9cHhgO1xufVxuXG5mdW5jdGlvbiByZXBhaW50VmlzaW9uR3JpZChub2RlcywgYXJjLCBncmlkcykge1xuICAgIGlmIChub2RlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBncmlkcy52aXNpb24uZm9yRWFjaCgoeyB4LCB5LCB0b3VjaCB9LCBpKSA9PiB7XG4gICAgICAgIG5vZGVzW2ldLnN0eWxlLmxlZnQgPSBgJHt4fXB4YDtcbiAgICAgICAgbm9kZXNbaV0uc3R5bGUudG9wID0gYCR7eX1weGA7XG5cbiAgICAgICAgbm9kZXNbaV0uc3R5bGUuYm9yZGVyID0gKHRvdWNoID8gJzJweCBzb2xpZCByZWQnIDogJzAnKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUGFydGljbGU7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8ganMvcGFydGljbGUuanMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7QUFBQTtBQUNBOzs7OztBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBSEE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBQ0E7QUFVQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ=="); /***/ }), /* 34 */ @@ -950,7 +950,7 @@ eval("var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\tr /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 14);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _particle = __webpack_require__(/*! ./particle */ 33);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _store = __webpack_require__(/*! ./store */ 22);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _controls = __webpack_require__(/*! ./controls */ 21);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _enums = __webpack_require__(/*! ./enums */ 16);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation1a() {\n this.options = {\n count: 1,\n maxCount: 25,\n randomize: true,\n showMovementCircle: true,\n speed: 4\n };\n\n this.container = document.getElementById('animation1a');\n this.bounds = this.container.getBoundingClientRect();\n\n this.movementCircleCtrl = createMovementCircleControl();\n\n this.particles = [];\n\n var controls = new _controls2.default(document.getElementById('controls1a'), this.options, [this.movementCircleCtrl]);\n\n var circle$ = _rxjs2.default.Observable.fromEvent(this.movementCircleCtrl, 'change').map(function (evt) {\n return { key: _enums.CONTROLS.MOVEMENT_CIRCLE, value: evt.target.checked };\n });\n\n var eventStack$ = controls.mount().merge(circle$);\n\n eventStack$.subscribe(this.subscriber.bind(this));\n\n this.updateCount(this.options.count);\n this.updateMovementCircle(this.options.showMovementCircle);\n};\n\nfunction createMovementCircleControl() {\n var label = document.createElement('label');\n label.className = 'controls-checkbox';\n\n var text = document.createElement('span');\n text.innerHTML = 'Show movement circle';\n text.className = 'controls-checkbox-text';\n\n var checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'controls-checkbox-input';\n\n label.appendChild(checkbox);\n label.appendChild(text);\n\n return label;\n}\n\nAnimation1a.prototype.subscriber = function (_ref) {\n var key = _ref.key,\n value = _ref.value;\n\n switch (key) {\n case _enums.CONTROLS.ANIMATING:\n this.updateAnimating(value);break;\n case _enums.CONTROLS.COUNT:\n this.updateCount(value);break;\n case _enums.CONTROLS.MOVEMENT_CIRCLE:\n this.updateMovementCircle(value);break;\n case _enums.CONTROLS.RANDOMIZE:\n this.updateRandomize(value);break;\n case _enums.CONTROLS.SPEED:\n this.updateSpeed(value);break;\n }\n};\n\nAnimation1a.prototype.nextFrame = function () {\n this.particles.forEach(function (p) {\n return p.nextFrame();\n });\n};\n\nAnimation1a.prototype.updateAnimating = function (isAnimating) {\n var _this = this;\n\n this.options.animating = isAnimating;\n\n if (isAnimating) {\n var fps$ = _rxjs2.default.Observable.interval(1000 / 32).takeWhile(function (_) {\n return _this.options.animating;\n });\n\n fps$.subscribe(this.nextFrame.bind(this));\n }\n};\n\nAnimation1a.prototype.updateCount = function (count) {\n while (this.particles.length >= count) {\n delete this.particles.pop().remove();\n }\n\n while (this.particles.length < count) {\n var p = new _particle2.default(this.container, this.bounds, this.options);\n this.particles.push(p);\n }\n};\n\nAnimation1a.prototype.updateMovementCircle = function (value) {\n this.options.showMovementCircle = value;\n this.movementCircleCtrl.querySelector('[type=checkbox]').checked = value;\n this.particles.forEach(function (p) {\n return p.updateConfig({ showMovementCircle: value });\n });\n};\n\nAnimation1a.prototype.updateRandomize = function (value) {\n this.options.randomize = value;\n this.particles.forEach(function (p) {\n return p.updateConfig({ randomize: value });\n });\n};\n\nAnimation1a.prototype.updateSpeed = function (value) {\n this.options.speed = value;\n this.particles.forEach(function (p) {\n return p.updateConfig({ speed: value });\n });\n};\n\nexports.default = Animation1a;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYW5pbWF0aW9uMWEuanM/M2NmMSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gJy4vcGFydGljbGUnO1xuaW1wb3J0IFN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IENvbnRyb2xzIGZyb20gJy4vY29udHJvbHMnO1xuaW1wb3J0IHsgQ09OVFJPTFMgfSBmcm9tICcuL2VudW1zJztcblxuZnVuY3Rpb24gQW5pbWF0aW9uMWEoKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgbWF4Q291bnQ6IDI1LFxuICAgICAgICByYW5kb21pemU6IHRydWUsXG4gICAgICAgIHNob3dNb3ZlbWVudENpcmNsZTogdHJ1ZSxcbiAgICAgICAgc3BlZWQ6IDRcbiAgICB9O1xuXG4gICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYW5pbWF0aW9uMWEnKTtcbiAgICB0aGlzLmJvdW5kcyA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgdGhpcy5tb3ZlbWVudENpcmNsZUN0cmwgPSBjcmVhdGVNb3ZlbWVudENpcmNsZUNvbnRyb2woKTtcblxuICAgIHRoaXMucGFydGljbGVzID0gW107XG5cbiAgICBjb25zdCBjb250cm9scyA9IG5ldyBDb250cm9scyhcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRyb2xzMWEnKSxcbiAgICAgICAgdGhpcy5vcHRpb25zLFxuICAgICAgICBbdGhpcy5tb3ZlbWVudENpcmNsZUN0cmxdXG4gICAgKTtcblxuICAgIGNvbnN0IGNpcmNsZSQgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudCh0aGlzLm1vdmVtZW50Q2lyY2xlQ3RybCwgJ2NoYW5nZScpXG4gICAgICAgIC5tYXAoZXZ0ID0+ICh7IGtleTogQ09OVFJPTFMuTU9WRU1FTlRfQ0lSQ0xFLCB2YWx1ZTogZXZ0LnRhcmdldC5jaGVja2VkIH0pKTtcblxuICAgIGNvbnN0IGV2ZW50U3RhY2skID0gY29udHJvbHMubW91bnQoKS5tZXJnZShjaXJjbGUkKTtcblxuICAgIGV2ZW50U3RhY2skLnN1YnNjcmliZSh0aGlzLnN1YnNjcmliZXIuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLnVwZGF0ZUNvdW50KHRoaXMub3B0aW9ucy5jb3VudCk7XG4gICAgdGhpcy51cGRhdGVNb3ZlbWVudENpcmNsZSh0aGlzLm9wdGlvbnMuc2hvd01vdmVtZW50Q2lyY2xlKTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZU1vdmVtZW50Q2lyY2xlQ29udHJvbCgpIHtcbiAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgbGFiZWwuY2xhc3NOYW1lID0gJ2NvbnRyb2xzLWNoZWNrYm94JztcblxuICAgIGNvbnN0IHRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgdGV4dC5pbm5lckhUTUwgPSAnU2hvdyBtb3ZlbWVudCBjaXJjbGUnO1xuICAgIHRleHQuY2xhc3NOYW1lID0gJ2NvbnRyb2xzLWNoZWNrYm94LXRleHQnO1xuXG4gICAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGNoZWNrYm94LnR5cGUgPSAnY2hlY2tib3gnO1xuICAgIGNoZWNrYm94LmNsYXNzTmFtZSA9ICdjb250cm9scy1jaGVja2JveC1pbnB1dCc7XG5cbiAgICBsYWJlbC5hcHBlbmRDaGlsZChjaGVja2JveCk7XG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQodGV4dCk7XG5cbiAgICByZXR1cm4gbGFiZWw7XG59XG5cbkFuaW1hdGlvbjFhLnByb3RvdHlwZS5zdWJzY3JpYmVyID0gZnVuY3Rpb24oeyBrZXksIHZhbHVlIH0pIHtcbiAgICBzd2l0Y2goa2V5KSB7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuQU5JTUFUSU5HOiB0aGlzLnVwZGF0ZUFuaW1hdGluZyh2YWx1ZSk7IGJyZWFrO1xuICAgICAgICBjYXNlIENPTlRST0xTLkNPVU5UOiB0aGlzLnVwZGF0ZUNvdW50KHZhbHVlKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuTU9WRU1FTlRfQ0lSQ0xFOiB0aGlzLnVwZGF0ZU1vdmVtZW50Q2lyY2xlKHZhbHVlKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuUkFORE9NSVpFOiB0aGlzLnVwZGF0ZVJhbmRvbWl6ZSh2YWx1ZSk7IGJyZWFrO1xuICAgICAgICBjYXNlIENPTlRST0xTLlNQRUVEOiB0aGlzLnVwZGF0ZVNwZWVkKHZhbHVlKTsgYnJlYWs7XG4gICAgfVxufVxuXG5BbmltYXRpb24xYS5wcm90b3R5cGUubmV4dEZyYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAubmV4dEZyYW1lKCkpO1xufVxuXG5BbmltYXRpb24xYS5wcm90b3R5cGUudXBkYXRlQW5pbWF0aW5nID0gZnVuY3Rpb24oaXNBbmltYXRpbmcpIHtcbiAgICB0aGlzLm9wdGlvbnMuYW5pbWF0aW5nID0gaXNBbmltYXRpbmc7XG5cbiAgICBpZiAoaXNBbmltYXRpbmcpIHtcbiAgICAgICAgY29uc3QgZnBzJCA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCAvIDMyKVxuICAgICAgICAgICAgLnRha2VXaGlsZShfID0+IHRoaXMub3B0aW9ucy5hbmltYXRpbmcpO1xuXG4gICAgICAgIGZwcyQuc3Vic2NyaWJlKHRoaXMubmV4dEZyYW1lLmJpbmQodGhpcykpO1xuICAgIH1cbn1cblxuQW5pbWF0aW9uMWEucHJvdG90eXBlLnVwZGF0ZUNvdW50ID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoID49IGNvdW50KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnBhcnRpY2xlcy5wb3AoKS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoIDwgY291bnQpIHtcbiAgICAgICAgY29uc3QgcCA9IG5ldyBQYXJ0aWNsZSh0aGlzLmNvbnRhaW5lciwgdGhpcy5ib3VuZHMsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHRoaXMucGFydGljbGVzLnB1c2gocCk7XG4gICAgfVxufVxuXG5BbmltYXRpb24xYS5wcm90b3R5cGUudXBkYXRlTW92ZW1lbnRDaXJjbGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHRoaXMub3B0aW9ucy5zaG93TW92ZW1lbnRDaXJjbGUgPSB2YWx1ZTtcbiAgICB0aGlzLm1vdmVtZW50Q2lyY2xlQ3RybC5xdWVyeVNlbGVjdG9yKCdbdHlwZT1jaGVja2JveF0nKS5jaGVja2VkID0gdmFsdWU7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAudXBkYXRlQ29uZmlnKHsgc2hvd01vdmVtZW50Q2lyY2xlOiB2YWx1ZSB9KSk7XG59XG5cbkFuaW1hdGlvbjFhLnByb3RvdHlwZS51cGRhdGVSYW5kb21pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHRoaXMub3B0aW9ucy5yYW5kb21pemUgPSB2YWx1ZTtcbiAgICB0aGlzLnBhcnRpY2xlcy5mb3JFYWNoKHAgPT4gcC51cGRhdGVDb25maWcoeyByYW5kb21pemU6IHZhbHVlIH0pKTtcbn1cblxuQW5pbWF0aW9uMWEucHJvdG90eXBlLnVwZGF0ZVNwZWVkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB0aGlzLm9wdGlvbnMuc3BlZWQgPSB2YWx1ZTtcbiAgICB0aGlzLnBhcnRpY2xlcy5mb3JFYWNoKHAgPT4gcC51cGRhdGVDb25maWcoeyBzcGVlZDogdmFsdWUgfSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBbmltYXRpb24xYTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBqcy9hbmltYXRpb24xYS5qcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 14);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _particle = __webpack_require__(/*! ./particle */ 33);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _store = __webpack_require__(/*! ./store */ 22);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _controls = __webpack_require__(/*! ./controls */ 21);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _enums = __webpack_require__(/*! ./enums */ 16);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation1a() {\n this.options = {\n count: 1,\n maxCount: 25,\n randomize: true,\n showMovementCircle: true,\n speed: 4\n };\n\n this.container = document.getElementById('animation1a');\n this.bounds = this.container.getBoundingClientRect();\n\n this.movementCircleCtrl = createMovementCircleControl();\n\n this.particles = [];\n\n var controls = new _controls2.default(document.getElementById('controls1a'), this.options, [this.movementCircleCtrl]);\n\n var circle$ = _rxjs2.default.Observable.fromEvent(this.movementCircleCtrl, 'change').map(function (evt) {\n return { key: _enums.CONTROLS.MOVEMENT_CIRCLE, value: evt.target.checked };\n });\n\n var eventStack$ = controls.mount().merge(circle$);\n\n eventStack$.subscribe(this.subscriber.bind(this));\n\n this.updateCount(this.options.count);\n this.updateMovementCircle(this.options.showMovementCircle);\n};\n\nfunction createMovementCircleControl() {\n var label = document.createElement('label');\n label.className = 'controls-checkbox';\n\n var text = document.createElement('span');\n text.innerHTML = 'Show movement circle';\n text.className = 'controls-checkbox-text';\n\n var checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'controls-checkbox-input';\n\n label.appendChild(checkbox);\n label.appendChild(text);\n\n return label;\n}\n\nAnimation1a.prototype.subscriber = function (_ref) {\n var key = _ref.key,\n value = _ref.value;\n\n switch (key) {\n case _enums.CONTROLS.ANIMATING:\n this.updateAnimating(value);break;\n case _enums.CONTROLS.COUNT:\n this.updateCount(value);break;\n case _enums.CONTROLS.MOVEMENT_CIRCLE:\n this.updateMovementCircle(value);break;\n case _enums.CONTROLS.RANDOMIZE:\n this.updateRandomize(value);break;\n case _enums.CONTROLS.SPEED:\n this.updateSpeed(value);break;\n }\n};\n\nAnimation1a.prototype.nextFrame = function () {\n this.particles.forEach(function (p) {\n return p.nextFrame();\n });\n};\n\nAnimation1a.prototype.updateAnimating = function (isAnimating) {\n var _this = this;\n\n this.options.animating = isAnimating;\n\n if (isAnimating) {\n var fps$ = _rxjs2.default.Observable.interval(1000 / 32).takeWhile(function (_) {\n return _this.options.animating;\n });\n\n fps$.subscribe(this.nextFrame.bind(this));\n }\n};\n\nAnimation1a.prototype.updateCount = function (count) {\n while (this.particles.length > count) {\n delete this.particles.pop().remove();\n }\n\n while (this.particles.length < count) {\n var p = new _particle2.default(this.container, this.bounds, this.options);\n this.particles.push(p);\n }\n};\n\nAnimation1a.prototype.updateMovementCircle = function (value) {\n this.options.showMovementCircle = value;\n this.movementCircleCtrl.querySelector('[type=checkbox]').checked = value;\n this.particles.forEach(function (p) {\n return p.updateConfig({ showMovementCircle: value });\n });\n};\n\nAnimation1a.prototype.updateRandomize = function (value) {\n this.options.randomize = value;\n this.particles.forEach(function (p) {\n return p.updateConfig({ randomize: value });\n });\n};\n\nAnimation1a.prototype.updateSpeed = function (value) {\n this.options.speed = value;\n this.particles.forEach(function (p) {\n return p.updateConfig({ speed: value });\n });\n};\n\nexports.default = Animation1a;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYW5pbWF0aW9uMWEuanM/M2NmMSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gJy4vcGFydGljbGUnO1xuaW1wb3J0IFN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IENvbnRyb2xzIGZyb20gJy4vY29udHJvbHMnO1xuaW1wb3J0IHsgQ09OVFJPTFMgfSBmcm9tICcuL2VudW1zJztcblxuZnVuY3Rpb24gQW5pbWF0aW9uMWEoKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgbWF4Q291bnQ6IDI1LFxuICAgICAgICByYW5kb21pemU6IHRydWUsXG4gICAgICAgIHNob3dNb3ZlbWVudENpcmNsZTogdHJ1ZSxcbiAgICAgICAgc3BlZWQ6IDRcbiAgICB9O1xuXG4gICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYW5pbWF0aW9uMWEnKTtcbiAgICB0aGlzLmJvdW5kcyA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgdGhpcy5tb3ZlbWVudENpcmNsZUN0cmwgPSBjcmVhdGVNb3ZlbWVudENpcmNsZUNvbnRyb2woKTtcblxuICAgIHRoaXMucGFydGljbGVzID0gW107XG5cbiAgICBjb25zdCBjb250cm9scyA9IG5ldyBDb250cm9scyhcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRyb2xzMWEnKSxcbiAgICAgICAgdGhpcy5vcHRpb25zLFxuICAgICAgICBbdGhpcy5tb3ZlbWVudENpcmNsZUN0cmxdXG4gICAgKTtcblxuICAgIGNvbnN0IGNpcmNsZSQgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudCh0aGlzLm1vdmVtZW50Q2lyY2xlQ3RybCwgJ2NoYW5nZScpXG4gICAgICAgIC5tYXAoZXZ0ID0+ICh7IGtleTogQ09OVFJPTFMuTU9WRU1FTlRfQ0lSQ0xFLCB2YWx1ZTogZXZ0LnRhcmdldC5jaGVja2VkIH0pKTtcblxuICAgIGNvbnN0IGV2ZW50U3RhY2skID0gY29udHJvbHMubW91bnQoKS5tZXJnZShjaXJjbGUkKTtcblxuICAgIGV2ZW50U3RhY2skLnN1YnNjcmliZSh0aGlzLnN1YnNjcmliZXIuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLnVwZGF0ZUNvdW50KHRoaXMub3B0aW9ucy5jb3VudCk7XG4gICAgdGhpcy51cGRhdGVNb3ZlbWVudENpcmNsZSh0aGlzLm9wdGlvbnMuc2hvd01vdmVtZW50Q2lyY2xlKTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZU1vdmVtZW50Q2lyY2xlQ29udHJvbCgpIHtcbiAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgbGFiZWwuY2xhc3NOYW1lID0gJ2NvbnRyb2xzLWNoZWNrYm94JztcblxuICAgIGNvbnN0IHRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgdGV4dC5pbm5lckhUTUwgPSAnU2hvdyBtb3ZlbWVudCBjaXJjbGUnO1xuICAgIHRleHQuY2xhc3NOYW1lID0gJ2NvbnRyb2xzLWNoZWNrYm94LXRleHQnO1xuXG4gICAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGNoZWNrYm94LnR5cGUgPSAnY2hlY2tib3gnO1xuICAgIGNoZWNrYm94LmNsYXNzTmFtZSA9ICdjb250cm9scy1jaGVja2JveC1pbnB1dCc7XG5cbiAgICBsYWJlbC5hcHBlbmRDaGlsZChjaGVja2JveCk7XG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQodGV4dCk7XG5cbiAgICByZXR1cm4gbGFiZWw7XG59XG5cbkFuaW1hdGlvbjFhLnByb3RvdHlwZS5zdWJzY3JpYmVyID0gZnVuY3Rpb24oeyBrZXksIHZhbHVlIH0pIHtcbiAgICBzd2l0Y2goa2V5KSB7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuQU5JTUFUSU5HOiB0aGlzLnVwZGF0ZUFuaW1hdGluZyh2YWx1ZSk7IGJyZWFrO1xuICAgICAgICBjYXNlIENPTlRST0xTLkNPVU5UOiB0aGlzLnVwZGF0ZUNvdW50KHZhbHVlKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuTU9WRU1FTlRfQ0lSQ0xFOiB0aGlzLnVwZGF0ZU1vdmVtZW50Q2lyY2xlKHZhbHVlKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuUkFORE9NSVpFOiB0aGlzLnVwZGF0ZVJhbmRvbWl6ZSh2YWx1ZSk7IGJyZWFrO1xuICAgICAgICBjYXNlIENPTlRST0xTLlNQRUVEOiB0aGlzLnVwZGF0ZVNwZWVkKHZhbHVlKTsgYnJlYWs7XG4gICAgfVxufVxuXG5BbmltYXRpb24xYS5wcm90b3R5cGUubmV4dEZyYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAubmV4dEZyYW1lKCkpO1xufVxuXG5BbmltYXRpb24xYS5wcm90b3R5cGUudXBkYXRlQW5pbWF0aW5nID0gZnVuY3Rpb24oaXNBbmltYXRpbmcpIHtcbiAgICB0aGlzLm9wdGlvbnMuYW5pbWF0aW5nID0gaXNBbmltYXRpbmc7XG5cbiAgICBpZiAoaXNBbmltYXRpbmcpIHtcbiAgICAgICAgY29uc3QgZnBzJCA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCAvIDMyKVxuICAgICAgICAgICAgLnRha2VXaGlsZShfID0+IHRoaXMub3B0aW9ucy5hbmltYXRpbmcpO1xuXG4gICAgICAgIGZwcyQuc3Vic2NyaWJlKHRoaXMubmV4dEZyYW1lLmJpbmQodGhpcykpO1xuICAgIH1cbn1cblxuQW5pbWF0aW9uMWEucHJvdG90eXBlLnVwZGF0ZUNvdW50ID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoID4gY291bnQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMucGFydGljbGVzLnBvcCgpLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHdoaWxlICh0aGlzLnBhcnRpY2xlcy5sZW5ndGggPCBjb3VudCkge1xuICAgICAgICBjb25zdCBwID0gbmV3IFBhcnRpY2xlKHRoaXMuY29udGFpbmVyLCB0aGlzLmJvdW5kcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5wYXJ0aWNsZXMucHVzaChwKTtcbiAgICB9XG59XG5cbkFuaW1hdGlvbjFhLnByb3RvdHlwZS51cGRhdGVNb3ZlbWVudENpcmNsZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy5vcHRpb25zLnNob3dNb3ZlbWVudENpcmNsZSA9IHZhbHVlO1xuICAgIHRoaXMubW92ZW1lbnRDaXJjbGVDdHJsLnF1ZXJ5U2VsZWN0b3IoJ1t0eXBlPWNoZWNrYm94XScpLmNoZWNrZWQgPSB2YWx1ZTtcbiAgICB0aGlzLnBhcnRpY2xlcy5mb3JFYWNoKHAgPT4gcC51cGRhdGVDb25maWcoeyBzaG93TW92ZW1lbnRDaXJjbGU6IHZhbHVlIH0pKTtcbn1cblxuQW5pbWF0aW9uMWEucHJvdG90eXBlLnVwZGF0ZVJhbmRvbWl6ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy5vcHRpb25zLnJhbmRvbWl6ZSA9IHZhbHVlO1xuICAgIHRoaXMucGFydGljbGVzLmZvckVhY2gocCA9PiBwLnVwZGF0ZUNvbmZpZyh7IHJhbmRvbWl6ZTogdmFsdWUgfSkpO1xufVxuXG5BbmltYXRpb24xYS5wcm90b3R5cGUudXBkYXRlU3BlZWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHRoaXMub3B0aW9ucy5zcGVlZCA9IHZhbHVlO1xuICAgIHRoaXMucGFydGljbGVzLmZvckVhY2gocCA9PiBwLnVwZGF0ZUNvbmZpZyh7IHNwZWVkOiB2YWx1ZSB9KSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFuaW1hdGlvbjFhO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGpzL2FuaW1hdGlvbjFhLmpzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); /***/ }), /* 74 */ @@ -962,7 +962,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n}); /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 14);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _particle = __webpack_require__(/*! ./particle */ 33);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _store = __webpack_require__(/*! ./store */ 22);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _controls = __webpack_require__(/*! ./controls */ 21);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _enums = __webpack_require__(/*! ./enums */ 16);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation1b() {\n this.options = {\n count: 1,\n maxCount: 1000,\n randomize: false,\n speed: 8\n };\n\n this.container = document.getElementById('animation1b');\n this.bounds = this.container.getBoundingClientRect();\n\n this.particles = [];\n\n var controls = new _controls2.default(document.getElementById('controls1b'), this.options);\n\n controls.mount().subscribe(this.subscriber.bind(this));\n\n this.updateCount(this.options.count);\n};\n\nAnimation1b.prototype.subscriber = function (_ref) {\n var key = _ref.key,\n value = _ref.value;\n\n switch (key) {\n case _enums.CONTROLS.ANIMATING:\n this.updateAnimating(value);break;\n case _enums.CONTROLS.COUNT:\n this.updateCount(value);break;\n case _enums.CONTROLS.RANDOMIZE:\n this.updateRandomize(value);break;\n case _enums.CONTROLS.SPEED:\n this.updateSpeed(value);break;\n }\n};\n\nAnimation1b.prototype.nextFrame = function () {\n this.particles.forEach(function (p) {\n return p.nextFrame();\n });\n};\n\nAnimation1b.prototype.updateAnimating = function (isAnimating) {\n var _this = this;\n\n this.options.animating = isAnimating;\n\n if (isAnimating) {\n var fps$ = _rxjs2.default.Observable.interval(1000 / 32).takeWhile(function (_) {\n return _this.options.animating;\n });\n\n fps$.subscribe(this.nextFrame.bind(this));\n }\n};\n\nAnimation1b.prototype.updateCount = function (count) {\n while (this.particles.length >= count) {\n delete this.particles.pop().remove();\n }\n\n while (this.particles.length < count) {\n var p = new _particle2.default(this.container, this.bounds, this.options);\n this.particles.push(p);\n }\n};\n\nAnimation1b.prototype.updateRandomize = function (value) {\n this.options.randomize = value;\n this.particles.forEach(function (p) {\n return p.updateConfig({ randomize: value });\n });\n};\n\nAnimation1b.prototype.updateSpeed = function (value) {\n this.options.speed = value;\n this.particles.forEach(function (p) {\n return p.updateConfig({ speed: value });\n });\n};\n\nexports.default = Animation1b;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYW5pbWF0aW9uMWIuanM/ZDJkMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gJy4vcGFydGljbGUnO1xuaW1wb3J0IFN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IENvbnRyb2xzIGZyb20gJy4vY29udHJvbHMnO1xuaW1wb3J0IHsgQ09OVFJPTFMgfSBmcm9tICcuL2VudW1zJztcblxuZnVuY3Rpb24gQW5pbWF0aW9uMWIoKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgbWF4Q291bnQ6IDEwMDAsXG4gICAgICAgIHJhbmRvbWl6ZTogZmFsc2UsXG4gICAgICAgIHNwZWVkOiA4XG4gICAgfTtcblxuICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FuaW1hdGlvbjFiJyk7XG4gICAgdGhpcy5ib3VuZHMgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHRoaXMucGFydGljbGVzID0gW107XG5cbiAgICBjb25zdCBjb250cm9scyA9IG5ldyBDb250cm9scyhcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRyb2xzMWInKSxcbiAgICAgICAgdGhpcy5vcHRpb25zXG4gICAgKTtcblxuICAgIGNvbnRyb2xzLm1vdW50KCkuc3Vic2NyaWJlKHRoaXMuc3Vic2NyaWJlci5iaW5kKHRoaXMpKTtcblxuICAgIHRoaXMudXBkYXRlQ291bnQodGhpcy5vcHRpb25zLmNvdW50KTtcbn07XG5cbkFuaW1hdGlvbjFiLnByb3RvdHlwZS5zdWJzY3JpYmVyID0gZnVuY3Rpb24oeyBrZXksIHZhbHVlIH0pIHtcbiAgICBzd2l0Y2goa2V5KSB7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuQU5JTUFUSU5HOiB0aGlzLnVwZGF0ZUFuaW1hdGluZyh2YWx1ZSk7IGJyZWFrO1xuICAgICAgICBjYXNlIENPTlRST0xTLkNPVU5UOiB0aGlzLnVwZGF0ZUNvdW50KHZhbHVlKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuUkFORE9NSVpFOiB0aGlzLnVwZGF0ZVJhbmRvbWl6ZSh2YWx1ZSk7IGJyZWFrO1xuICAgICAgICBjYXNlIENPTlRST0xTLlNQRUVEOiB0aGlzLnVwZGF0ZVNwZWVkKHZhbHVlKTsgYnJlYWs7XG4gICAgfVxufVxuXG5BbmltYXRpb24xYi5wcm90b3R5cGUubmV4dEZyYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAubmV4dEZyYW1lKCkpO1xufVxuXG5BbmltYXRpb24xYi5wcm90b3R5cGUudXBkYXRlQW5pbWF0aW5nID0gZnVuY3Rpb24oaXNBbmltYXRpbmcpIHtcbiAgICB0aGlzLm9wdGlvbnMuYW5pbWF0aW5nID0gaXNBbmltYXRpbmc7XG5cbiAgICBpZiAoaXNBbmltYXRpbmcpIHtcbiAgICAgICAgY29uc3QgZnBzJCA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCAvIDMyKVxuICAgICAgICAgICAgLnRha2VXaGlsZShfID0+IHRoaXMub3B0aW9ucy5hbmltYXRpbmcpO1xuXG4gICAgICAgIGZwcyQuc3Vic2NyaWJlKHRoaXMubmV4dEZyYW1lLmJpbmQodGhpcykpO1xuICAgIH1cbn1cblxuQW5pbWF0aW9uMWIucHJvdG90eXBlLnVwZGF0ZUNvdW50ID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoID49IGNvdW50KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnBhcnRpY2xlcy5wb3AoKS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoIDwgY291bnQpIHtcbiAgICAgICAgY29uc3QgcCA9IG5ldyBQYXJ0aWNsZSh0aGlzLmNvbnRhaW5lciwgdGhpcy5ib3VuZHMsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHRoaXMucGFydGljbGVzLnB1c2gocCk7XG4gICAgfVxufVxuXG5BbmltYXRpb24xYi5wcm90b3R5cGUudXBkYXRlUmFuZG9taXplID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB0aGlzLm9wdGlvbnMucmFuZG9taXplID0gdmFsdWU7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAudXBkYXRlQ29uZmlnKHsgcmFuZG9taXplOiB2YWx1ZSB9KSk7XG59XG5cbkFuaW1hdGlvbjFiLnByb3RvdHlwZS51cGRhdGVTcGVlZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy5vcHRpb25zLnNwZWVkID0gdmFsdWU7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAudXBkYXRlQ29uZmlnKHsgc3BlZWQ6IHZhbHVlIH0pKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQW5pbWF0aW9uMWI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8ganMvYW5pbWF0aW9uMWIuanMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 14);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _particle = __webpack_require__(/*! ./particle */ 33);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _store = __webpack_require__(/*! ./store */ 22);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _controls = __webpack_require__(/*! ./controls */ 21);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _enums = __webpack_require__(/*! ./enums */ 16);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation1b() {\n this.options = {\n count: 1,\n maxCount: 1000,\n randomize: false,\n speed: 8\n };\n\n this.container = document.getElementById('animation1b');\n this.bounds = this.container.getBoundingClientRect();\n\n this.particles = [];\n\n var controls = new _controls2.default(document.getElementById('controls1b'), this.options);\n\n controls.mount().subscribe(this.subscriber.bind(this));\n\n this.updateCount(this.options.count);\n};\n\nAnimation1b.prototype.subscriber = function (_ref) {\n var key = _ref.key,\n value = _ref.value;\n\n switch (key) {\n case _enums.CONTROLS.ANIMATING:\n this.updateAnimating(value);break;\n case _enums.CONTROLS.COUNT:\n this.updateCount(value);break;\n case _enums.CONTROLS.RANDOMIZE:\n this.updateRandomize(value);break;\n case _enums.CONTROLS.SPEED:\n this.updateSpeed(value);break;\n }\n};\n\nAnimation1b.prototype.nextFrame = function () {\n this.particles.forEach(function (p) {\n return p.nextFrame();\n });\n};\n\nAnimation1b.prototype.updateAnimating = function (isAnimating) {\n var _this = this;\n\n this.options.animating = isAnimating;\n\n if (isAnimating) {\n var fps$ = _rxjs2.default.Observable.interval(1000 / 32).takeWhile(function (_) {\n return _this.options.animating;\n });\n\n fps$.subscribe(this.nextFrame.bind(this));\n }\n};\n\nAnimation1b.prototype.updateCount = function (count) {\n while (this.particles.length > count) {\n delete this.particles.pop().remove();\n }\n\n while (this.particles.length < count) {\n var p = new _particle2.default(this.container, this.bounds, this.options);\n this.particles.push(p);\n }\n};\n\nAnimation1b.prototype.updateRandomize = function (value) {\n this.options.randomize = value;\n this.particles.forEach(function (p) {\n return p.updateConfig({ randomize: value });\n });\n};\n\nAnimation1b.prototype.updateSpeed = function (value) {\n this.options.speed = value;\n this.particles.forEach(function (p) {\n return p.updateConfig({ speed: value });\n });\n};\n\nexports.default = Animation1b;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYW5pbWF0aW9uMWIuanM/ZDJkMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gJy4vcGFydGljbGUnO1xuaW1wb3J0IFN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IENvbnRyb2xzIGZyb20gJy4vY29udHJvbHMnO1xuaW1wb3J0IHsgQ09OVFJPTFMgfSBmcm9tICcuL2VudW1zJztcblxuZnVuY3Rpb24gQW5pbWF0aW9uMWIoKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgbWF4Q291bnQ6IDEwMDAsXG4gICAgICAgIHJhbmRvbWl6ZTogZmFsc2UsXG4gICAgICAgIHNwZWVkOiA4XG4gICAgfTtcblxuICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FuaW1hdGlvbjFiJyk7XG4gICAgdGhpcy5ib3VuZHMgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHRoaXMucGFydGljbGVzID0gW107XG5cbiAgICBjb25zdCBjb250cm9scyA9IG5ldyBDb250cm9scyhcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRyb2xzMWInKSxcbiAgICAgICAgdGhpcy5vcHRpb25zXG4gICAgKTtcblxuICAgIGNvbnRyb2xzLm1vdW50KCkuc3Vic2NyaWJlKHRoaXMuc3Vic2NyaWJlci5iaW5kKHRoaXMpKTtcblxuICAgIHRoaXMudXBkYXRlQ291bnQodGhpcy5vcHRpb25zLmNvdW50KTtcbn07XG5cbkFuaW1hdGlvbjFiLnByb3RvdHlwZS5zdWJzY3JpYmVyID0gZnVuY3Rpb24oeyBrZXksIHZhbHVlIH0pIHtcbiAgICBzd2l0Y2goa2V5KSB7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuQU5JTUFUSU5HOiB0aGlzLnVwZGF0ZUFuaW1hdGluZyh2YWx1ZSk7IGJyZWFrO1xuICAgICAgICBjYXNlIENPTlRST0xTLkNPVU5UOiB0aGlzLnVwZGF0ZUNvdW50KHZhbHVlKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuUkFORE9NSVpFOiB0aGlzLnVwZGF0ZVJhbmRvbWl6ZSh2YWx1ZSk7IGJyZWFrO1xuICAgICAgICBjYXNlIENPTlRST0xTLlNQRUVEOiB0aGlzLnVwZGF0ZVNwZWVkKHZhbHVlKTsgYnJlYWs7XG4gICAgfVxufVxuXG5BbmltYXRpb24xYi5wcm90b3R5cGUubmV4dEZyYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAubmV4dEZyYW1lKCkpO1xufVxuXG5BbmltYXRpb24xYi5wcm90b3R5cGUudXBkYXRlQW5pbWF0aW5nID0gZnVuY3Rpb24oaXNBbmltYXRpbmcpIHtcbiAgICB0aGlzLm9wdGlvbnMuYW5pbWF0aW5nID0gaXNBbmltYXRpbmc7XG5cbiAgICBpZiAoaXNBbmltYXRpbmcpIHtcbiAgICAgICAgY29uc3QgZnBzJCA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCAvIDMyKVxuICAgICAgICAgICAgLnRha2VXaGlsZShfID0+IHRoaXMub3B0aW9ucy5hbmltYXRpbmcpO1xuXG4gICAgICAgIGZwcyQuc3Vic2NyaWJlKHRoaXMubmV4dEZyYW1lLmJpbmQodGhpcykpO1xuICAgIH1cbn1cblxuQW5pbWF0aW9uMWIucHJvdG90eXBlLnVwZGF0ZUNvdW50ID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoID4gY291bnQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMucGFydGljbGVzLnBvcCgpLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHdoaWxlICh0aGlzLnBhcnRpY2xlcy5sZW5ndGggPCBjb3VudCkge1xuICAgICAgICBjb25zdCBwID0gbmV3IFBhcnRpY2xlKHRoaXMuY29udGFpbmVyLCB0aGlzLmJvdW5kcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5wYXJ0aWNsZXMucHVzaChwKTtcbiAgICB9XG59XG5cbkFuaW1hdGlvbjFiLnByb3RvdHlwZS51cGRhdGVSYW5kb21pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHRoaXMub3B0aW9ucy5yYW5kb21pemUgPSB2YWx1ZTtcbiAgICB0aGlzLnBhcnRpY2xlcy5mb3JFYWNoKHAgPT4gcC51cGRhdGVDb25maWcoeyByYW5kb21pemU6IHZhbHVlIH0pKTtcbn1cblxuQW5pbWF0aW9uMWIucHJvdG90eXBlLnVwZGF0ZVNwZWVkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB0aGlzLm9wdGlvbnMuc3BlZWQgPSB2YWx1ZTtcbiAgICB0aGlzLnBhcnRpY2xlcy5mb3JFYWNoKHAgPT4gcC51cGRhdGVDb25maWcoeyBzcGVlZDogdmFsdWUgfSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBbmltYXRpb24xYjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBqcy9hbmltYXRpb24xYi5qcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); /***/ }), /* 75 */ @@ -974,7 +974,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n}); /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 14);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _particle = __webpack_require__(/*! ./particle */ 33);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _store = __webpack_require__(/*! ./store */ 22);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _controls = __webpack_require__(/*! ./controls */ 21);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _enums = __webpack_require__(/*! ./enums */ 16);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation2a() {\n this.options = {\n count: 1,\n maxCount: 10,\n randomize: true,\n showMovementCircle: true,\n showVisionGrid: true,\n speed: 4\n };\n\n this.container = document.getElementById('animation2a');\n this.bounds = this.container.getBoundingClientRect();\n\n this.particles = [];\n this.globalGrid = createGlobalGrid(this.container, this.bounds);\n\n var controls = new _controls2.default(document.getElementById('controls2a'), this.options);\n\n controls.mount().subscribe(this.subscriber.bind(this));\n\n this.updateAnimating(this.options.animating);\n this.updateCount(this.options.count);\n\n // TODO X dimension modified by core UI, maybe recalc grid in animation start?\n // TODO remove bottom padding from Disqus\n // TODO perf - cache trig or perform operations\n // TODO only randomize movement on 1a\n\n // TODO ANIM2a Vision grid touches trig transform\n // TODO ANIM2a randomize hazards\n // TODO ANIM2 particle evade\n // TODO ANIM2b Scale vision grid to 1000 particles\n\n // TODO ANIM3 flocking\n};\n\nAnimation2a.prototype.subscriber = function (_ref) {\n var key = _ref.key,\n value = _ref.value;\n\n switch (key) {\n case _enums.CONTROLS.ANIMATING:\n this.updateAnimating(value);break;\n case _enums.CONTROLS.COUNT:\n this.updateCount(value);break;\n case _enums.CONTROLS.RANDOMIZE:\n this.updateRandomize(value);break;\n case _enums.CONTROLS.SPEED:\n this.updateSpeed(value);break;\n }\n};\n\nAnimation2a.prototype.nextFrame = function () {\n this.particles.forEach(function (p) {\n return p.nextFrame();\n });\n};\n\nAnimation2a.prototype.updateAnimating = function (isAnimating) {\n var _this = this;\n\n this.options.animating = isAnimating;\n\n if (isAnimating) {\n var fps$ = _rxjs2.default.Observable.interval(1000 / 32).takeWhile(function (_) {\n return _this.options.animating;\n });\n\n fps$.subscribe(this.nextFrame.bind(this));\n }\n};\n\nAnimation2a.prototype.updateCount = function (count) {\n while (this.particles.length >= count) {\n delete this.particles.pop().remove();\n }\n\n while (this.particles.length < count) {\n var p = new _particle2.default(this.container, this.bounds, this.options, this.globalGrid);\n this.particles.push(p);\n }\n};\n\nAnimation2a.prototype.updateRandomize = function (value) {\n this.options.randomize = value;\n this.particles.forEach(function (p) {\n return p.updateConfig({ randomize: value });\n });\n};\n\nAnimation2a.prototype.updateSpeed = function (value) {\n this.options.speed = value;\n this.particles.forEach(function (p) {\n return p.updateConfig({ speed: value });\n });\n};\n\nfunction createGlobalGrid(container, bounds) {\n var grid = {};\n var gridSize = 5;\n\n var hazards = [{ x: 100, y: 100, w: 200, h: 200 }, { x: 600, y: 200, w: 200, h: 200 }];\n\n return hazards.reduce(function (acc, _ref2) {\n var x = _ref2.x,\n y = _ref2.y,\n w = _ref2.w,\n h = _ref2.h;\n\n var div = document.createElement('div');\n div.className = 'hazard';\n div.style.left = x + 'px';\n div.style.top = y + 'px';\n div.style.height = h + 'px';\n div.style.width = w + 'px';\n container.appendChild(div);\n\n for (var i = x; i <= x + w; i += gridSize) {\n for (var j = y; j <= y + h; j += gridSize) {\n if (acc[i] === undefined) {\n acc[i] = {};\n }\n\n if (acc[i][j] !== undefined) {\n continue;\n }\n\n var dot = document.createElement('dot');\n dot.className = 'hazard-dot';\n dot.style.left = i - x + 'px';\n dot.style.top = j - y + 'px';\n div.appendChild(dot);\n\n acc[i][j] = true;\n }\n }\n\n return acc;\n }, {});\n}\n\nexports.default = Animation2a;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYW5pbWF0aW9uMmEuanM/YzJmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gJy4vcGFydGljbGUnO1xuaW1wb3J0IFN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IENvbnRyb2xzIGZyb20gJy4vY29udHJvbHMnO1xuaW1wb3J0IHsgQ09OVFJPTFMgfSBmcm9tICcuL2VudW1zJztcblxuZnVuY3Rpb24gQW5pbWF0aW9uMmEoKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgbWF4Q291bnQ6IDEwLFxuICAgICAgICByYW5kb21pemU6IHRydWUsXG4gICAgICAgIHNob3dNb3ZlbWVudENpcmNsZTogdHJ1ZSxcbiAgICAgICAgc2hvd1Zpc2lvbkdyaWQ6IHRydWUsXG4gICAgICAgIHNwZWVkOiA0XG4gICAgfTtcblxuICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FuaW1hdGlvbjJhJyk7XG4gICAgdGhpcy5ib3VuZHMgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHRoaXMucGFydGljbGVzID0gW107XG4gICAgdGhpcy5nbG9iYWxHcmlkID0gY3JlYXRlR2xvYmFsR3JpZCh0aGlzLmNvbnRhaW5lciwgdGhpcy5ib3VuZHMpO1xuXG4gICAgY29uc3QgY29udHJvbHMgPSBuZXcgQ29udHJvbHMoXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250cm9sczJhJyksXG4gICAgICAgIHRoaXMub3B0aW9uc1xuICAgICk7XG5cbiAgICBjb250cm9scy5tb3VudCgpLnN1YnNjcmliZSh0aGlzLnN1YnNjcmliZXIuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLnVwZGF0ZUFuaW1hdGluZyh0aGlzLm9wdGlvbnMuYW5pbWF0aW5nKTtcbiAgICB0aGlzLnVwZGF0ZUNvdW50KHRoaXMub3B0aW9ucy5jb3VudCk7XG5cbiAgICAvLyBUT0RPIFggZGltZW5zaW9uIG1vZGlmaWVkIGJ5IGNvcmUgVUksIG1heWJlIHJlY2FsYyBncmlkIGluIGFuaW1hdGlvbiBzdGFydD9cbiAgICAvLyBUT0RPIHJlbW92ZSBib3R0b20gcGFkZGluZyBmcm9tIERpc3F1c1xuICAgIC8vIFRPRE8gcGVyZiAtIGNhY2hlIHRyaWcgb3IgcGVyZm9ybSBvcGVyYXRpb25zXG4gICAgLy8gVE9ETyBvbmx5IHJhbmRvbWl6ZSBtb3ZlbWVudCBvbiAxYVxuXG4gICAgLy8gVE9ETyBBTklNMmEgVmlzaW9uIGdyaWQgdG91Y2hlcyB0cmlnIHRyYW5zZm9ybVxuICAgIC8vIFRPRE8gQU5JTTJhIHJhbmRvbWl6ZSBoYXphcmRzXG4gICAgLy8gVE9ETyBBTklNMiBwYXJ0aWNsZSBldmFkZVxuICAgIC8vIFRPRE8gQU5JTTJiIFNjYWxlIHZpc2lvbiBncmlkIHRvIDEwMDAgcGFydGljbGVzXG5cbiAgICAvLyBUT0RPIEFOSU0zIGZsb2NraW5nXG59O1xuXG5BbmltYXRpb24yYS5wcm90b3R5cGUuc3Vic2NyaWJlciA9IGZ1bmN0aW9uKHsga2V5LCB2YWx1ZSB9KSB7XG4gICAgc3dpdGNoKGtleSkge1xuICAgICAgICBjYXNlIENPTlRST0xTLkFOSU1BVElORzogdGhpcy51cGRhdGVBbmltYXRpbmcodmFsdWUpOyBicmVhaztcbiAgICAgICAgY2FzZSBDT05UUk9MUy5DT1VOVDogdGhpcy51cGRhdGVDb3VudCh2YWx1ZSk7IGJyZWFrO1xuICAgICAgICBjYXNlIENPTlRST0xTLlJBTkRPTUlaRTogdGhpcy51cGRhdGVSYW5kb21pemUodmFsdWUpOyBicmVhaztcbiAgICAgICAgY2FzZSBDT05UUk9MUy5TUEVFRDogdGhpcy51cGRhdGVTcGVlZCh2YWx1ZSk7IGJyZWFrO1xuICAgIH1cbn1cblxuQW5pbWF0aW9uMmEucHJvdG90eXBlLm5leHRGcmFtZSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucGFydGljbGVzLmZvckVhY2gocCA9PiBwLm5leHRGcmFtZSgpKTtcbn1cblxuQW5pbWF0aW9uMmEucHJvdG90eXBlLnVwZGF0ZUFuaW1hdGluZyA9IGZ1bmN0aW9uKGlzQW5pbWF0aW5nKSB7XG4gICAgdGhpcy5vcHRpb25zLmFuaW1hdGluZyA9IGlzQW5pbWF0aW5nO1xuXG4gICAgaWYgKGlzQW5pbWF0aW5nKSB7XG4gICAgICAgIGNvbnN0IGZwcyQgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDAgLyAzMilcbiAgICAgICAgICAgIC50YWtlV2hpbGUoXyA9PiB0aGlzLm9wdGlvbnMuYW5pbWF0aW5nKTtcblxuICAgICAgICBmcHMkLnN1YnNjcmliZSh0aGlzLm5leHRGcmFtZS5iaW5kKHRoaXMpKTtcbiAgICB9XG59XG5cbkFuaW1hdGlvbjJhLnByb3RvdHlwZS51cGRhdGVDb3VudCA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgd2hpbGUgKHRoaXMucGFydGljbGVzLmxlbmd0aCA+PSBjb3VudCkge1xuICAgICAgICBkZWxldGUgdGhpcy5wYXJ0aWNsZXMucG9wKCkucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRoaXMucGFydGljbGVzLmxlbmd0aCA8IGNvdW50KSB7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgUGFydGljbGUodGhpcy5jb250YWluZXIsIHRoaXMuYm91bmRzLCB0aGlzLm9wdGlvbnMsIHRoaXMuZ2xvYmFsR3JpZCk7XG4gICAgICAgIHRoaXMucGFydGljbGVzLnB1c2gocCk7XG4gICAgfVxufVxuXG5BbmltYXRpb24yYS5wcm90b3R5cGUudXBkYXRlUmFuZG9taXplID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB0aGlzLm9wdGlvbnMucmFuZG9taXplID0gdmFsdWU7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAudXBkYXRlQ29uZmlnKHsgcmFuZG9taXplOiB2YWx1ZSB9KSk7XG59XG5cbkFuaW1hdGlvbjJhLnByb3RvdHlwZS51cGRhdGVTcGVlZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy5vcHRpb25zLnNwZWVkID0gdmFsdWU7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAudXBkYXRlQ29uZmlnKHsgc3BlZWQ6IHZhbHVlIH0pKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlR2xvYmFsR3JpZChjb250YWluZXIsIGJvdW5kcykge1xuICAgIGNvbnN0IGdyaWQgPSB7fTtcbiAgICBjb25zdCBncmlkU2l6ZSA9IDU7XG5cbiAgICBjb25zdCBoYXphcmRzID0gW1xuICAgICAgICB7IHg6IDEwMCwgeTogMTAwLCB3OiAyMDAsIGg6IDIwMCB9LFxuICAgICAgICB7IHg6IDYwMCwgeTogMjAwLCB3OiAyMDAsIGg6IDIwMCB9LFxuICAgIF07XG5cbiAgICByZXR1cm4gaGF6YXJkcy5yZWR1Y2UoKGFjYywgeyB4LCB5LCB3LCBoIH0pID0+IHtcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRpdi5jbGFzc05hbWUgPSAnaGF6YXJkJztcbiAgICAgICAgZGl2LnN0eWxlLmxlZnQgPSBgJHt4fXB4YDtcbiAgICAgICAgZGl2LnN0eWxlLnRvcCA9IGAke3l9cHhgO1xuICAgICAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gYCR7aH1weGA7XG4gICAgICAgIGRpdi5zdHlsZS53aWR0aCA9IGAke3d9cHhgO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZGl2KTtcblxuICAgICAgICBmb3IgKGxldCBpID0geDsgaSA8PSAoeCArIHcpOyBpICs9IGdyaWRTaXplKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0geTsgaiA8PSAoeSArIGgpOyBqICs9IGdyaWRTaXplKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFjY1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY1tpXSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChhY2NbaV1bal0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkb3QnKTtcbiAgICAgICAgICAgICAgICBkb3QuY2xhc3NOYW1lID0gJ2hhemFyZC1kb3QnO1xuICAgICAgICAgICAgICAgIGRvdC5zdHlsZS5sZWZ0ID0gYCR7aSAtIHh9cHhgO1xuICAgICAgICAgICAgICAgIGRvdC5zdHlsZS50b3AgPSBgJHtqIC0geX1weGA7XG4gICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRvdCk7XG5cbiAgICAgICAgICAgICAgICBhY2NbaV1bal0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQW5pbWF0aW9uMmE7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8ganMvYW5pbWF0aW9uMmEuanMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 14);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _particle = __webpack_require__(/*! ./particle */ 33);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _store = __webpack_require__(/*! ./store */ 22);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _controls = __webpack_require__(/*! ./controls */ 21);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _enums = __webpack_require__(/*! ./enums */ 16);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation2a() {\n this.options = {\n count: 1,\n maxCount: 10,\n randomize: true,\n showMovementCircle: false,\n showVisionGrid: true,\n speed: 4\n };\n\n this.container = document.getElementById('animation2a');\n this.bounds = this.container.getBoundingClientRect();\n\n this.particles = [];\n this.globalGrid = createGlobalGrid(this.container, this.bounds);\n\n var controls = new _controls2.default(document.getElementById('controls2a'), this.options);\n\n controls.mount().subscribe(this.subscriber.bind(this));\n\n this.updateAnimating(this.options.animating);\n this.updateCount(this.options.count);\n\n // TODO X dimension modified by core UI, maybe recalc grid in animation start?\n // TODO remove bottom padding from Disqus\n // TODO perf - cache trig or perform operations\n // TODO only randomize movement on 1a\n\n // TODO ANIM2a randomize hazards\n // TODO can the vision grid be relative to the particle\n // TODO ANIM2 particle evade\n // TODO ANIM2b Scale vision grid to 1000 particles\n\n // TODO ANIM3 flocking\n};\n\nAnimation2a.prototype.subscriber = function (_ref) {\n var key = _ref.key,\n value = _ref.value;\n\n switch (key) {\n case _enums.CONTROLS.ANIMATING:\n this.updateAnimating(value);break;\n case _enums.CONTROLS.COUNT:\n this.updateCount(value);break;\n case _enums.CONTROLS.RANDOMIZE:\n this.updateRandomize(value);break;\n case _enums.CONTROLS.SPEED:\n this.updateSpeed(value);break;\n }\n};\n\nAnimation2a.prototype.nextFrame = function () {\n this.particles.forEach(function (p) {\n return p.nextFrame();\n });\n};\n\nAnimation2a.prototype.updateAnimating = function (isAnimating) {\n var _this = this;\n\n this.options.animating = isAnimating;\n\n if (isAnimating) {\n var fps$ = _rxjs2.default.Observable.interval(1000 / 32).takeWhile(function (_) {\n return _this.options.animating;\n });\n\n fps$.subscribe(this.nextFrame.bind(this));\n }\n};\n\nAnimation2a.prototype.updateCount = function (count) {\n while (this.particles.length > count) {\n delete this.particles.pop().remove();\n }\n\n while (this.particles.length < count) {\n var p = new _particle2.default(this.container, this.bounds, this.options, this.globalGrid);\n this.particles.push(p);\n }\n};\n\nAnimation2a.prototype.updateRandomize = function (value) {\n this.options.randomize = value;\n this.particles.forEach(function (p) {\n return p.updateConfig({ randomize: value });\n });\n};\n\nAnimation2a.prototype.updateSpeed = function (value) {\n this.options.speed = value;\n this.particles.forEach(function (p) {\n return p.updateConfig({ speed: value });\n });\n};\n\nfunction createGlobalGrid(container, bounds) {\n var grid = {};\n var gridSize = 5;\n\n var hazards = [{ x: 100, y: 100, w: 200, h: 200 }, { x: 600, y: 200, w: 200, h: 200 }];\n\n return hazards.reduce(function (acc, _ref2) {\n var x = _ref2.x,\n y = _ref2.y,\n w = _ref2.w,\n h = _ref2.h;\n\n var div = document.createElement('div');\n div.className = 'hazard';\n div.style.left = x + 'px';\n div.style.top = y + 'px';\n div.style.height = h + 'px';\n div.style.width = w + 'px';\n container.appendChild(div);\n\n for (var i = x; i <= x + w; i += gridSize) {\n for (var j = y; j <= y + h; j += gridSize) {\n if (acc[i] === undefined) {\n acc[i] = {};\n }\n\n if (acc[i][j] !== undefined) {\n continue;\n }\n\n var dot = document.createElement('dot');\n dot.className = 'hazard-dot';\n dot.style.left = i - x + 'px';\n dot.style.top = j - y + 'px';\n div.appendChild(dot);\n\n acc[i][j] = true;\n }\n }\n\n return acc;\n }, {});\n}\n\nexports.default = Animation2a;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYW5pbWF0aW9uMmEuanM/YzJmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gJy4vcGFydGljbGUnO1xuaW1wb3J0IFN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IENvbnRyb2xzIGZyb20gJy4vY29udHJvbHMnO1xuaW1wb3J0IHsgQ09OVFJPTFMgfSBmcm9tICcuL2VudW1zJztcblxuZnVuY3Rpb24gQW5pbWF0aW9uMmEoKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgbWF4Q291bnQ6IDEwLFxuICAgICAgICByYW5kb21pemU6IHRydWUsXG4gICAgICAgIHNob3dNb3ZlbWVudENpcmNsZTogZmFsc2UsXG4gICAgICAgIHNob3dWaXNpb25HcmlkOiB0cnVlLFxuICAgICAgICBzcGVlZDogNFxuICAgIH07XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbmltYXRpb24yYScpO1xuICAgIHRoaXMuYm91bmRzID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICB0aGlzLnBhcnRpY2xlcyA9IFtdO1xuICAgIHRoaXMuZ2xvYmFsR3JpZCA9IGNyZWF0ZUdsb2JhbEdyaWQodGhpcy5jb250YWluZXIsIHRoaXMuYm91bmRzKTtcblxuICAgIGNvbnN0IGNvbnRyb2xzID0gbmV3IENvbnRyb2xzKFxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udHJvbHMyYScpLFxuICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICApO1xuXG4gICAgY29udHJvbHMubW91bnQoKS5zdWJzY3JpYmUodGhpcy5zdWJzY3JpYmVyLmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy51cGRhdGVBbmltYXRpbmcodGhpcy5vcHRpb25zLmFuaW1hdGluZyk7XG4gICAgdGhpcy51cGRhdGVDb3VudCh0aGlzLm9wdGlvbnMuY291bnQpO1xuXG4gICAgLy8gVE9ETyBYIGRpbWVuc2lvbiBtb2RpZmllZCBieSBjb3JlIFVJLCBtYXliZSByZWNhbGMgZ3JpZCBpbiBhbmltYXRpb24gc3RhcnQ/XG4gICAgLy8gVE9ETyByZW1vdmUgYm90dG9tIHBhZGRpbmcgZnJvbSBEaXNxdXNcbiAgICAvLyBUT0RPIHBlcmYgLSBjYWNoZSB0cmlnIG9yIHBlcmZvcm0gb3BlcmF0aW9uc1xuICAgIC8vIFRPRE8gb25seSByYW5kb21pemUgbW92ZW1lbnQgb24gMWFcblxuICAgIC8vIFRPRE8gQU5JTTJhIHJhbmRvbWl6ZSBoYXphcmRzXG4gICAgLy8gVE9ETyBjYW4gdGhlIHZpc2lvbiBncmlkIGJlIHJlbGF0aXZlIHRvIHRoZSBwYXJ0aWNsZVxuICAgIC8vIFRPRE8gQU5JTTIgcGFydGljbGUgZXZhZGVcbiAgICAvLyBUT0RPIEFOSU0yYiBTY2FsZSB2aXNpb24gZ3JpZCB0byAxMDAwIHBhcnRpY2xlc1xuXG4gICAgLy8gVE9ETyBBTklNMyBmbG9ja2luZ1xufTtcblxuQW5pbWF0aW9uMmEucHJvdG90eXBlLnN1YnNjcmliZXIgPSBmdW5jdGlvbih7IGtleSwgdmFsdWUgfSkge1xuICAgIHN3aXRjaChrZXkpIHtcbiAgICAgICAgY2FzZSBDT05UUk9MUy5BTklNQVRJTkc6IHRoaXMudXBkYXRlQW5pbWF0aW5nKHZhbHVlKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuQ09VTlQ6IHRoaXMudXBkYXRlQ291bnQodmFsdWUpOyBicmVhaztcbiAgICAgICAgY2FzZSBDT05UUk9MUy5SQU5ET01JWkU6IHRoaXMudXBkYXRlUmFuZG9taXplKHZhbHVlKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuU1BFRUQ6IHRoaXMudXBkYXRlU3BlZWQodmFsdWUpOyBicmVhaztcbiAgICB9XG59XG5cbkFuaW1hdGlvbjJhLnByb3RvdHlwZS5uZXh0RnJhbWUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnBhcnRpY2xlcy5mb3JFYWNoKHAgPT4gcC5uZXh0RnJhbWUoKSk7XG59XG5cbkFuaW1hdGlvbjJhLnByb3RvdHlwZS51cGRhdGVBbmltYXRpbmcgPSBmdW5jdGlvbihpc0FuaW1hdGluZykge1xuICAgIHRoaXMub3B0aW9ucy5hbmltYXRpbmcgPSBpc0FuaW1hdGluZztcblxuICAgIGlmIChpc0FuaW1hdGluZykge1xuICAgICAgICBjb25zdCBmcHMkID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwIC8gMzIpXG4gICAgICAgICAgICAudGFrZVdoaWxlKF8gPT4gdGhpcy5vcHRpb25zLmFuaW1hdGluZyk7XG5cbiAgICAgICAgZnBzJC5zdWJzY3JpYmUodGhpcy5uZXh0RnJhbWUuYmluZCh0aGlzKSk7XG4gICAgfVxufVxuXG5BbmltYXRpb24yYS5wcm90b3R5cGUudXBkYXRlQ291bnQgPSBmdW5jdGlvbihjb3VudCkge1xuICAgIHdoaWxlICh0aGlzLnBhcnRpY2xlcy5sZW5ndGggPiBjb3VudCkge1xuICAgICAgICBkZWxldGUgdGhpcy5wYXJ0aWNsZXMucG9wKCkucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRoaXMucGFydGljbGVzLmxlbmd0aCA8IGNvdW50KSB7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgUGFydGljbGUodGhpcy5jb250YWluZXIsIHRoaXMuYm91bmRzLCB0aGlzLm9wdGlvbnMsIHRoaXMuZ2xvYmFsR3JpZCk7XG4gICAgICAgIHRoaXMucGFydGljbGVzLnB1c2gocCk7XG4gICAgfVxufVxuXG5BbmltYXRpb24yYS5wcm90b3R5cGUudXBkYXRlUmFuZG9taXplID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB0aGlzLm9wdGlvbnMucmFuZG9taXplID0gdmFsdWU7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAudXBkYXRlQ29uZmlnKHsgcmFuZG9taXplOiB2YWx1ZSB9KSk7XG59XG5cbkFuaW1hdGlvbjJhLnByb3RvdHlwZS51cGRhdGVTcGVlZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy5vcHRpb25zLnNwZWVkID0gdmFsdWU7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAudXBkYXRlQ29uZmlnKHsgc3BlZWQ6IHZhbHVlIH0pKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlR2xvYmFsR3JpZChjb250YWluZXIsIGJvdW5kcykge1xuICAgIGNvbnN0IGdyaWQgPSB7fTtcbiAgICBjb25zdCBncmlkU2l6ZSA9IDU7XG5cbiAgICBjb25zdCBoYXphcmRzID0gW1xuICAgICAgICB7IHg6IDEwMCwgeTogMTAwLCB3OiAyMDAsIGg6IDIwMCB9LFxuICAgICAgICB7IHg6IDYwMCwgeTogMjAwLCB3OiAyMDAsIGg6IDIwMCB9LFxuICAgIF07XG5cbiAgICByZXR1cm4gaGF6YXJkcy5yZWR1Y2UoKGFjYywgeyB4LCB5LCB3LCBoIH0pID0+IHtcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRpdi5jbGFzc05hbWUgPSAnaGF6YXJkJztcbiAgICAgICAgZGl2LnN0eWxlLmxlZnQgPSBgJHt4fXB4YDtcbiAgICAgICAgZGl2LnN0eWxlLnRvcCA9IGAke3l9cHhgO1xuICAgICAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gYCR7aH1weGA7XG4gICAgICAgIGRpdi5zdHlsZS53aWR0aCA9IGAke3d9cHhgO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZGl2KTtcblxuICAgICAgICBmb3IgKGxldCBpID0geDsgaSA8PSAoeCArIHcpOyBpICs9IGdyaWRTaXplKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0geTsgaiA8PSAoeSArIGgpOyBqICs9IGdyaWRTaXplKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFjY1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY1tpXSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChhY2NbaV1bal0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkb3QnKTtcbiAgICAgICAgICAgICAgICBkb3QuY2xhc3NOYW1lID0gJ2hhemFyZC1kb3QnO1xuICAgICAgICAgICAgICAgIGRvdC5zdHlsZS5sZWZ0ID0gYCR7aSAtIHh9cHhgO1xuICAgICAgICAgICAgICAgIGRvdC5zdHlsZS50b3AgPSBgJHtqIC0geX1weGA7XG4gICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRvdCk7XG5cbiAgICAgICAgICAgICAgICBhY2NbaV1bal0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQW5pbWF0aW9uMmE7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8ganMvYW5pbWF0aW9uMmEuanMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9"); /***/ }), /* 76 */ diff --git a/js/particle.js b/js/particle.js index 2897da5..42b4564 100644 --- a/js/particle.js +++ b/js/particle.js @@ -27,16 +27,7 @@ function Particle(parent, bounds, config, globalGrid) { vision: createVisionGrid(this.config) }; - this.arc = { - centerX: random.num(0, bounds.width), - centerY: random.num(0, bounds.height), - clockwise: random.bool(), - endX: 0, - endY: 0, - length: random.num(RAD.t90, RAD.t360), - radius: random.num(100, 200), - theta: random.num(RAD.t90, RAD.t360), - }; + this.arc = createArc(bounds, globalGrid, this.config); // TODO no need to pass config after testing this.nodes = { body: createBodyNode(this.config), @@ -57,6 +48,9 @@ function Particle(parent, bounds, config, globalGrid) { Particle.prototype.remove = function() { this.nodes.parent.removeChild(this.nodes.container); + + this.nodes.visionGrid.forEach(node => this.nodes.parent.removeChild(node)); + return this; } @@ -64,6 +58,8 @@ Particle.prototype.nextFrame = function() { this.arc = updateArc(this.arc, this.config); this.grids.vision = updateVisionGrid(this.arc, this.config, this.grids); + this.arc = evade(this.arc, this.grids.vision); + repaintContainer(this.nodes.container, this.arc); repaintBody(this.nodes.body, this.arc); repaintCircle(this.nodes.circle, this.arc); @@ -96,6 +92,34 @@ Particle.prototype.updateConfig = function(config) { // ===== CREATION ===== +function createArc(bounds, globalGrid, config) { + let arc = { + centerX: random.num(0, bounds.width), + centerY: random.num(0, bounds.height), + clockwise: random.bool(), + endX: 0, + endY: 0, + length: random.num(RAD.t90, RAD.t360), + radius: random.num(100, 200), + theta: random.num(RAD.t90, RAD.t360), + }; + + arc.endX = arc.centerX + arc.radius * Math.cos(arc.theta); + arc.endY = arc.centerY - arc.radius * Math.sin(arc.theta); + + arc = overflowArc(arc, bounds); + + const x = arc.endX - arc.endX % 5; + const y = arc.endY - arc.endY % 5; + + // If starting in a hazard, recurse. + if (globalGrid[x] !== undefined && globalGrid[x][y] !== undefined) { + arc = createArc(bounds, globalGrid, config); + } + + return arc; +} + function createBodyNode(config) { const node = document.createElement('div'); node.className = 'particle-body'; @@ -121,10 +145,6 @@ function createContainerNode(config) { } function createVisionGrid(config) { - if (config.showVisionGrid === false) { - return []; - } - const { gridSize: side, visionRadius: radius } = config; const r0 = radius; const r1 = radius - side; @@ -133,8 +153,8 @@ function createVisionGrid(config) { for (let x = -radius; x <= radius; x += side) { for (let y = -radius; y <= radius; y += side) { - // Omit lower half - if (y < 0) { + // Omit large slices of unused circle + if (x > y || x < -y) { continue; } @@ -146,7 +166,7 @@ function createVisionGrid(config) { let alpha = Math.atan(y / x); if (x < 0) { - alpha = RAD.t180 + alpha; // TODO += + alpha += RAD.t180; } points.push({ x, y, r, alpha, touch: false }); @@ -201,21 +221,7 @@ function updateArc(arc, { bounds, randomize, speed }) { arc.endY = arc.centerY - arc.radius * Math.sin(arc.theta); // Overflow. - if (arc.endX < 0) { - arc.endX += bounds.width; - arc.centerX += bounds.width - } else if (arc.endX > bounds.width) { - arc.endX -= bounds.width; - arc.centerX -= bounds.width - } - - if (arc.endY < 0) { - arc.endY += bounds.height; - arc.centerY += bounds.height - } else if (arc.endY > bounds.height) { - arc.endY -= bounds.height; - arc.centerY -= bounds.height - } + arc = overflowArc(arc, bounds); return arc; } @@ -243,6 +249,26 @@ function updateVisionGrid(arc, config, grids) { }, []); } +function overflowArc(arc, bounds) { + if (arc.endX < 0) { + arc.endX += bounds.width; + arc.centerX += bounds.width + } else if (arc.endX > bounds.width) { + arc.endX -= bounds.width; + arc.centerX -= bounds.width + } + + if (arc.endY < 0) { + arc.endY += bounds.height; + arc.centerY += bounds.height + } else if (arc.endY > bounds.height) { + arc.endY -= bounds.height; + arc.centerY -= bounds.height + } + + return arc; +} + function moveArc(arc, newRadius) { const r0 = arc.radius; const r1 = newRadius; @@ -263,6 +289,20 @@ function changeDirection(arc) { return arc; } +// ===== ACTIONS ===== +function evade(arc, visionGrid) { + const danger = visionGrid.reduce((acc, v) => acc || v.touch, false); + + if (danger === false) { + return arc; + } + + const evasionArc = moveArc(arc, 20); + evasionArc.length = 1; + + return evasionArc; +} + // ===== RENDERING ===== function repaintContainer(node, arc) { node.style.left = `${arc.endX}px`;