diff --git a/js/animation.js b/js/animation.js new file mode 100644 index 0000000..1539985 --- /dev/null +++ b/js/animation.js @@ -0,0 +1,77 @@ +import Rx, { Observable } from 'rxjs'; +import Grid from './grid'; +import Particle from './particle'; +import Controls from './controls'; +import { CONTROLS, ENTITIES } from './enums'; + +function Animation() { + + // TODO remove bottom padding from Disqus + // TODO fix "hangup" small radius evade bug + // TODO don't load simulation until requested + // TODO sort out particle nextframe + + // TODO ANIM1ab free movement + + // TODO ANIM3a streamline updateLeader + // TODO ANIM3b separation + // TODO ANIM3c alignment +}; + +Animation.prototype.destroy = function() { + +} + +Animation.prototype.subscriber = function({ key, value }) { + switch(key) { + case CONTROLS.ANIMATING: this.updateAnimating(value); break; + case CONTROLS.COUNT: this.updateCount(value); break; + case CONTROLS.SPEED: this.updateSpeed(value); break; + } +} + +Animation.prototype.nextFrame = function() { + this.particles.forEach(p => { + const prevX = p.arc.endX; + const prevY = p.arc.endY; + + p.nextFrame(); + + this.grid.deletePoint({ x: prevX, y: prevY, type: ENTITIES.PARTICLE }); + this.grid.setPoint({ x: p.arc.endX, y: p.arc.endY, type: ENTITIES.PARTICLE }, p); + }); +} + +Animation.prototype.updateAnimating = function(isAnimating) { + this.options.animating = isAnimating; + + if (isAnimating) { + const fps$ = Rx.Observable.interval(1000 / 32) + .takeWhile(_ => this.options.animating); + + fps$.subscribe(this.nextFrame.bind(this)); + } +} + +Animation.prototype.updateCount = function(count) { + const bounds = this.container.getBoundingClientRect(); + + while (this.particles.length > count) { + const p = this.particles.pop(); + this.grid.deletePoint({ x: p.arc.endX, y: p.arc.endY, type: ENTITIES.PARTICLE }); + p.remove(); + } + + while (this.particles.length < count) { + const p = new Particle(this.container, bounds, this.options, this.grid); + this.grid.setPoint({ x: p.arc.endX, y: p.arc.endY, type: ENTITIES.PARTICLE }, p); + this.particles.push(p); + } +} + +Animation.prototype.updateSpeed = function(value) { + this.options.speed = value; + this.particles.forEach(p => p.updateConfig({ speed: value })); +} + +export default Animation; diff --git a/js/animation3a.js b/js/animation3a.js index cbe1b53..d7038f7 100644 --- a/js/animation3a.js +++ b/js/animation3a.js @@ -6,7 +6,6 @@ import { CONTROLS, ENTITIES } from './enums'; function Animation3a() { this.options = { - cohesion: true, count: 400, maxCount: 1000, showVisionGrid: false, @@ -24,19 +23,7 @@ function Animation3a() { controls.mount().subscribe(this.subscriber.bind(this)); - this.updateAnimating(this.options.animating); this.updateCount(this.options.count); - - // TODO remove bottom padding from Disqus - // TODO fix "hangup" small radius evade bug - // TODO don't load simulation until requested - // TODO sort out particle nextframe - - // TODO ANIM1ab free movement - - // TODO ANIM3a streamline updateLeader - // TODO ANIM3b separation - // TODO ANIM3c alignment }; Animation3a.prototype.subscriber = function({ key, value }) { diff --git a/js/arc.js b/js/arc.js index dd739a3..a400427 100644 --- a/js/arc.js +++ b/js/arc.js @@ -10,6 +10,8 @@ const Arc = { endX: 0, endY: 0, length: Random.num(RAD.t90, RAD.t360), + prevEndX: 0, + prevEndY: 0, radius: Random.num(100, 200), theta: Random.num(RAD.t90, RAD.t360) }; @@ -41,6 +43,9 @@ const Arc = { arc.cosTheta = Math.cos(arc.theta); arc.sinTheta = Math.sin(arc.theta); + arc.prevEndX = arc.endX; + arc.prevEndY = arc.endY; + arc.endX = arc.centerX + arc.radius * arc.cosTheta; arc.endY = arc.centerY - arc.radius * arc.sinTheta; @@ -122,6 +127,23 @@ const Arc = { return arc; }, + goto: function (arc, x, y, speed) { + const prevD = Math.pow(Math.pow(x - arc.prevEndX, 2) + Math.pow(y - arc.prevEndY, 2), 0.5); + const currD = Math.pow(Math.pow(x - arc.endX, 2) + Math.pow(y - arc.endY, 2), 0.5); + const ratio = (prevD - currD) / speed; + + if (currD < 10) { + throw new Error(`Arc end of (${arc.endX},${arc.endY}) is within 50px of (${x},${y})`); + } else if (ratio < 0.8) { + // arc = (ratio < 0 ? Arc.reverse(arc) : arc); + arc = Arc.changeRadius(arc, 20); + } else { + arc = Arc.changeRadius(arc, 400); + } + + return arc; + }, + evade: function(arc) { arc = Arc.changeRadius(arc, 20); arc.length = 1; diff --git a/js/bundle.js b/js/bundle.js index a1b4b97..f66be99 100644 --- a/js/bundle.js +++ b/js/bundle.js @@ -293,7 +293,7 @@ eval("\nvar ConnectableObservable_1 = __webpack_require__(/*! ../observable/Conn /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 13);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _enums = __webpack_require__(/*! ./enums */ 15);\n\nvar _arc = __webpack_require__(/*! ./arc */ 360);\n\nvar _arc2 = _interopRequireDefault(_arc);\n\nvar _random = __webpack_require__(/*! ./random */ 361);\n\nvar _random2 = _interopRequireDefault(_random);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// ===== Constructor =====\n\nfunction Particle(parent, bounds, config, globalGrid) {\n this.config = Object.assign({}, {\n behavior: _enums.BEHAVIOR.FREE,\n bounds: bounds,\n color: _random2.default.color(),\n gridSize: 5,\n randomize: true,\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.id = _random2.default.id(6);\n\n this.nodes = {\n body: createBodyNode(this.config),\n circle: undefined,\n container: createContainerNode(this.config, this.id),\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.leader = null;\n this.isLeader = false;\n\n this.arc = _arc2.default.create(bounds, this.grids.global);\n this.updateConfig(this.config);\n this.nextFrame(globalGrid);\n};\n\n// ===== PROTOTYPE =====\n\nParticle.prototype.remove = function () {\n this.nodes.parent.removeChild(this.nodes.container);\n delete this.nodes;\n return this;\n};\n\nParticle.prototype.nextFrame = function () {\n this.arc = _arc2.default.step(this.arc, this.config.bounds, this.config.speed);\n\n if (this.leader !== null) {\n this.arc = _arc2.default.follow(this.arc, this.leader.arc);\n } else if (this.arc.length <= 0 && this.config.randomize) {\n this.arc = _arc2.default.randomize(this.arc);\n }\n\n this.grids.vision = updateVisionGrid(this.arc, this.config, this.grids);\n\n var _look = look(this.arc, this.grids),\n hazards = _look.hazards,\n particles = _look.particles;\n\n if (hazards.length > 0) {\n this.arc = _arc2.default.evade(this.arc);\n }\n\n this.updateLeader(particles);\n\n repaintContainer(this.nodes.container, this.arc);\n repaintBody(this.nodes.body, this.arc, this.isLeader);\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\nParticle.prototype.updateLeader = function (particles) {\n var _this = this;\n\n if (this.config.behavior !== _enums.BEHAVIOR.COHESION) {\n return;\n }\n\n if (this.leader === null && particles.length > 0) {\n // Head-to-head: particles see eachother but shouldn't both lead.\n var candidates = particles.filter(function (v) {\n return v.leader ? v.leader.id !== _this.id : true;\n });\n\n var leader = candidates.find(function (v) {\n return v.isLeader;\n }) || candidates[0];\n\n if (leader !== undefined) {\n leader.isLeader = true;\n this.leader = leader;\n }\n }\n\n if (this.leader === null) {\n return;\n }\n\n if (this.leader.nodes === undefined) {\n this.leader = null;\n return;\n }\n\n if (this.leader.leader !== null) {\n this.leader = this.leader.leader;\n }\n\n if (this.isLeader) {\n this.isLeader = false;\n }\n\n // Beware of circular leadership, where a leader sees its tail.\n if (this.leader.id === this.id) {\n this.leader = null;\n }\n};\n\nfunction look(arc, grids) {\n var global = grids.global,\n vision = grids.vision;\n\n\n return vision.reduce(function (acc, point) {\n var x = arc.endX + point.x;\n var y = arc.endY + point.y;\n var p = global.getPoint({ x: x, y: y, type: _enums.ENTITIES.PARTICLE });\n\n if (p) {\n acc.particles.push(p);\n }\n\n if (global.getPoint({ x: x, y: y, type: _enums.ENTITIES.HAZARD })) {\n acc.hazards.push({ x: x, y: y });\n }\n\n return acc;\n }, { hazards: [], particles: [] });\n}\n\n// ===== DOM 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, id) {\n var node = document.createElement('div');\n node.className = 'particle-container';\n node.id = id;\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 = 45;\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.container.appendChild(div);\n\n acc.push(div);\n\n return acc;\n }, []);\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 ? point.alpha - arc.theta : point.alpha - arc.theta + _enums.RAD.t180;\n\n point.x = point.r * Math.cos(rad);\n point.y = point.r * Math.sin(rad);\n\n return acc.concat(point);\n }, []);\n}\n\n// ===== DOM 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, isLeader) {\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 isLeader ? node.style.outline = '1px solid red' : node.style.outline = '';\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 * arc.cosTheta) + 'px';\n node.style.top = '-' + (arc.radius - arc.radius * arc.sinTheta) + '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 (_ref2, i) {\n var x = _ref2.x,\n y = _ref2.y,\n touch = _ref2.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvcGFydGljbGUuanM/M2JkZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQkVIQVZJT1IsIEVOVElUSUVTLCBSQUQgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCBBcmMgZnJvbSAnLi9hcmMnO1xuaW1wb3J0IFJhbmRvbSBmcm9tICcuL3JhbmRvbSc7XG5cbi8vID09PT09IENvbnN0cnVjdG9yID09PT09XG5cbmZ1bmN0aW9uIFBhcnRpY2xlKHBhcmVudCwgYm91bmRzLCBjb25maWcsIGdsb2JhbEdyaWQpIHtcbiAgICB0aGlzLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIHtcbiAgICAgICAgYmVoYXZpb3I6IEJFSEFWSU9SLkZSRUUsXG4gICAgICAgIGJvdW5kcyxcbiAgICAgICAgY29sb3I6IFJhbmRvbS5jb2xvcigpLFxuICAgICAgICBncmlkU2l6ZTogNSxcbiAgICAgICAgcmFuZG9taXplOiB0cnVlLFxuICAgICAgICBzaG93TW92ZW1lbnRDaXJjbGU6IGZhbHNlLFxuICAgICAgICBzaG93VmlzaW9uR3JpZDogZmFsc2UsXG4gICAgICAgIHNwZWVkOiA0LFxuICAgICAgICB2aXNpb25SYWRpdXM6IDUwXG4gICAgfSwgY29uZmlnKTtcblxuICAgIHRoaXMuZ3JpZHMgPSB7XG4gICAgICAgIGdsb2JhbDogZ2xvYmFsR3JpZCB8fCB7fSxcbiAgICAgICAgdmlzaW9uOiBjcmVhdGVWaXNpb25HcmlkKHRoaXMuY29uZmlnKVxuICAgIH07XG5cbiAgICB0aGlzLmlkID0gUmFuZG9tLmlkKDYpO1xuXG4gICAgdGhpcy5ub2RlcyA9IHtcbiAgICAgICAgYm9keTogY3JlYXRlQm9keU5vZGUodGhpcy5jb25maWcpLFxuICAgICAgICBjaXJjbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGFpbmVyOiBjcmVhdGVDb250YWluZXJOb2RlKHRoaXMuY29uZmlnLCB0aGlzLmlkKSxcbiAgICAgICAgcGFyZW50LFxuICAgICAgICB2aXNpb25HcmlkOiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIHRoaXMubm9kZXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMubm9kZXMuYm9keSk7XG4gICAgcGFyZW50LmFwcGVuZENoaWxkKHRoaXMubm9kZXMuY29udGFpbmVyKTtcblxuICAgIHRoaXMubGVhZGVyID0gbnVsbDtcbiAgICB0aGlzLmlzTGVhZGVyID0gZmFsc2U7XG5cbiAgICB0aGlzLmFyYyA9IEFyYy5jcmVhdGUoYm91bmRzLCB0aGlzLmdyaWRzLmdsb2JhbCk7XG4gICAgdGhpcy51cGRhdGVDb25maWcodGhpcy5jb25maWcpO1xuICAgIHRoaXMubmV4dEZyYW1lKGdsb2JhbEdyaWQpO1xufTtcblxuLy8gPT09PT0gUFJPVE9UWVBFID09PT09XG5cblBhcnRpY2xlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLm5vZGVzLnBhcmVudC5yZW1vdmVDaGlsZCh0aGlzLm5vZGVzLmNvbnRhaW5lcik7XG4gICAgZGVsZXRlIHRoaXMubm9kZXM7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblBhcnRpY2xlLnByb3RvdHlwZS5uZXh0RnJhbWUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmFyYyA9IEFyYy5zdGVwKHRoaXMuYXJjLCB0aGlzLmNvbmZpZy5ib3VuZHMsIHRoaXMuY29uZmlnLnNwZWVkKTtcblxuICAgIGlmICh0aGlzLmxlYWRlciAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmFyYyA9IEFyYy5mb2xsb3codGhpcy5hcmMsIHRoaXMubGVhZGVyLmFyYyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFyYy5sZW5ndGggPD0gMCAmJiB0aGlzLmNvbmZpZy5yYW5kb21pemUpIHtcbiAgICAgICAgdGhpcy5hcmMgPSBBcmMucmFuZG9taXplKHRoaXMuYXJjKTtcbiAgICB9XG5cbiAgICB0aGlzLmdyaWRzLnZpc2lvbiA9IHVwZGF0ZVZpc2lvbkdyaWQodGhpcy5hcmMsIHRoaXMuY29uZmlnLCB0aGlzLmdyaWRzKTtcbiAgICBjb25zdCB7IGhhemFyZHMsIHBhcnRpY2xlcyB9ID0gbG9vayh0aGlzLmFyYywgdGhpcy5ncmlkcyk7XG5cbiAgICBpZiAoaGF6YXJkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuYXJjID0gQXJjLmV2YWRlKHRoaXMuYXJjKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUxlYWRlcihwYXJ0aWNsZXMpO1xuXG4gICAgcmVwYWludENvbnRhaW5lcih0aGlzLm5vZGVzLmNvbnRhaW5lciwgdGhpcy5hcmMpO1xuICAgIHJlcGFpbnRCb2R5KHRoaXMubm9kZXMuYm9keSwgdGhpcy5hcmMsIHRoaXMuaXNMZWFkZXIpO1xuICAgIHJlcGFpbnRDaXJjbGUodGhpcy5ub2Rlcy5jaXJjbGUsIHRoaXMuYXJjKTtcbiAgICByZXBhaW50VmlzaW9uR3JpZCh0aGlzLm5vZGVzLnZpc2lvbkdyaWQsIHRoaXMuYXJjLCB0aGlzLmdyaWRzKTtcbn1cblxuUGFydGljbGUucHJvdG90eXBlLnVwZGF0ZUNvbmZpZyA9IGZ1bmN0aW9uKGNvbmZpZykge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jb25maWcsIGNvbmZpZyk7XG5cbiAgICBjb25zdCB7IHNob3dNb3ZlbWVudENpcmNsZSwgc2hvd1Zpc2lvbkdyaWQgfSA9IHRoaXMuY29uZmlnO1xuXG4gICAgaWYgKHNob3dNb3ZlbWVudENpcmNsZSA9PT0gdHJ1ZSAmJiB0aGlzLm5vZGVzLmNpcmNsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubm9kZXMuY2lyY2xlID0gY3JlYXRlQ2lyY2xlTm9kZShjb25maWcpO1xuICAgICAgICB0aGlzLm5vZGVzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm5vZGVzLmNpcmNsZSk7XG4gICAgfVxuXG4gICAgaWYgKHNob3dNb3ZlbWVudENpcmNsZSA9PT0gZmFsc2UgJiYgdGhpcy5ub2Rlcy5jaXJjbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm5vZGVzLmNvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLm5vZGVzLmNpcmNsZSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm5vZGVzLmNpcmNsZTtcbiAgICB9XG5cbiAgICBpZiAoc2hvd1Zpc2lvbkdyaWQgPT09IHRydWUgJiYgdGhpcy5ub2Rlcy52aXNpb25HcmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5ub2Rlcy52aXNpb25HcmlkID0gY3JlYXRlVmlzaW9uR3JpZE5vZGVzKHRoaXMuY29uZmlnLCB0aGlzLmdyaWRzLCB0aGlzLm5vZGVzKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvd1Zpc2lvbkdyaWQgPT09IGZhbHNlICYmIHRoaXMubm9kZXMudmlzaW9uR3JpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm5vZGV4LnZpc2lvbkdyaWQ7XG4gICAgfVxufVxuXG5QYXJ0aWNsZS5wcm90b3R5cGUudXBkYXRlTGVhZGVyID0gZnVuY3Rpb24ocGFydGljbGVzKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmJlaGF2aW9yICE9PSBCRUhBVklPUi5DT0hFU0lPTikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGVhZGVyID09PSBudWxsICYmIHBhcnRpY2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIEhlYWQtdG8taGVhZDogcGFydGljbGVzIHNlZSBlYWNob3RoZXIgYnV0IHNob3VsZG4ndCBib3RoIGxlYWQuXG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBwYXJ0aWNsZXNcbiAgICAgICAgICAgIC5maWx0ZXIodiA9PiB2LmxlYWRlciA/ICh2LmxlYWRlci5pZCAhPT0gdGhpcy5pZCkgOiB0cnVlKTtcblxuICAgICAgICBjb25zdCBsZWFkZXIgPSBjYW5kaWRhdGVzLmZpbmQodiA9PiB2LmlzTGVhZGVyKSB8fCBjYW5kaWRhdGVzWzBdO1xuXG4gICAgICAgIGlmIChsZWFkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGVhZGVyLmlzTGVhZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubGVhZGVyID0gbGVhZGVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGVhZGVyID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZWFkZXIubm9kZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxlYWRlciA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZWFkZXIubGVhZGVyICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMubGVhZGVyID0gdGhpcy5sZWFkZXIubGVhZGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzTGVhZGVyKSB7XG4gICAgICAgIHRoaXMuaXNMZWFkZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBCZXdhcmUgb2YgY2lyY3VsYXIgbGVhZGVyc2hpcCwgd2hlcmUgYSBsZWFkZXIgc2VlcyBpdHMgdGFpbC5cbiAgICBpZiAodGhpcy5sZWFkZXIuaWQgPT09IHRoaXMuaWQpIHtcbiAgICAgICAgdGhpcy5sZWFkZXIgPSBudWxsO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbG9vayhhcmMsIGdyaWRzKSB7XG4gICAgY29uc3QgeyBnbG9iYWwsIHZpc2lvbiB9ID0gZ3JpZHM7XG5cbiAgICByZXR1cm4gdmlzaW9uLnJlZHVjZSgoYWNjLCBwb2ludCkgPT4ge1xuICAgICAgICBjb25zdCB4ID0gYXJjLmVuZFggKyBwb2ludC54O1xuICAgICAgICBjb25zdCB5ID0gYXJjLmVuZFkgKyBwb2ludC55O1xuICAgICAgICBjb25zdCBwID0gZ2xvYmFsLmdldFBvaW50KHsgeCwgeSwgdHlwZTogRU5USVRJRVMuUEFSVElDTEUgfSk7XG5cbiAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgIGFjYy5wYXJ0aWNsZXMucHVzaChwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnbG9iYWwuZ2V0UG9pbnQoeyB4LCB5LCB0eXBlOiBFTlRJVElFUy5IQVpBUkQgfSkpIHtcbiAgICAgICAgICAgIGFjYy5oYXphcmRzLnB1c2goeyB4LCB5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7IGhhemFyZHM6IFtdLCBwYXJ0aWNsZXM6IFtdIH0pO1xufVxuXG4vLyA9PT09PSBET00gQ1JFQVRJT04gPT09PT1cblxuZnVuY3Rpb24gY3JlYXRlQm9keU5vZGUoY29uZmlnKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIG5vZGUuY2xhc3NOYW1lID0gJ3BhcnRpY2xlLWJvZHknO1xuICAgIG5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29uZmlnLmNvbG9yO1xuICAgIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDaXJjbGVOb2RlKGNvbmZpZykge1xuICAgIGlmIChjb25maWcuc2hvd01vdmVtZW50Q2lyY2xlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBub2RlLmNsYXNzTmFtZSA9ICdwYXJ0aWNsZS1tb3ZlbWVudC1jaXJjbGUnO1xuICAgIG5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSBjb25maWcuY29sb3I7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRhaW5lck5vZGUoY29uZmlnLCBpZCkge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBub2RlLmNsYXNzTmFtZSA9ICdwYXJ0aWNsZS1jb250YWluZXInO1xuICAgIG5vZGUuaWQgPSBpZDtcbiAgICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVmlzaW9uR3JpZChjb25maWcpIHtcbiAgICBjb25zdCB7IGdyaWRTaXplOiBzaWRlLCB2aXNpb25SYWRpdXM6IHJhZGl1cyB9ID0gY29uZmlnO1xuICAgIGNvbnN0IHIwID0gcmFkaXVzO1xuICAgIGNvbnN0IHIxID0gNDU7XG5cbiAgICBjb25zdCBwb2ludHMgPSBbXTtcblxuICAgIGZvciAobGV0IHggPSAtcmFkaXVzOyB4IDw9IHJhZGl1czsgeCArPSBzaWRlKSB7XG4gICAgICAgIGZvciAobGV0IHkgPSAtcmFkaXVzOyB5IDw9IHJhZGl1czsgeSArPSBzaWRlKSB7XG4gICAgICAgICAgICAvLyBPbWl0IGxhcmdlIHNsaWNlcyBvZiB1bnVzZWQgY2lyY2xlXG4gICAgICAgICAgICBpZiAoeCA+IHkgfHwgeCA8IC15KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluY2x1ZGUgdmlzaW9uIGJhbmRcbiAgICAgICAgICAgIGNvbnN0IHIgPSBNYXRoLnBvdyhNYXRoLnBvdyh4LCAyKSArIE1hdGgucG93KHksIDIpLCAwLjUpO1xuICAgICAgICAgICAgaWYgKHIgPiByMCB8fCByIDwgcjEpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGFscGhhID0gTWF0aC5hdGFuKHkgLyB4KTtcbiAgICAgICAgICAgIGlmICh4IDwgMCkge1xuICAgICAgICAgICAgICAgIGFscGhhICs9IFJBRC50MTgwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwb2ludHMucHVzaCh7IHgsIHksIHIsIGFscGhhLCB0b3VjaDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcG9pbnRzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVWaXNpb25HcmlkTm9kZXMoY29uZmlnLCBncmlkcywgbm9kZXMpIHtcbiAgICBpZiAoY29uZmlnLnNob3dWaXNpb25HcmlkID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBncmlkcy52aXNpb24ucmVkdWNlKChhY2MsIHsgeCwgeSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gJ3BhcnRpY2xlLXZpc2lvbi1kb3QnO1xuICAgICAgICBkaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29uZmlnLmNvbG9yO1xuICAgICAgICBub2Rlcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoZGl2KTtcblxuICAgICAgICBhY2MucHVzaChkaXYpO1xuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10pO1xufVxuXG5cbmZ1bmN0aW9uIHVwZGF0ZVZpc2lvbkdyaWQoYXJjLCBjb25maWcsIGdyaWRzKSB7XG4gICAgY29uc3QgeyBnbG9iYWwsIHZpc2lvbiB9ID0gZ3JpZHM7XG5cbiAgICByZXR1cm4gdmlzaW9uLnJlZHVjZSgoYWNjLCBwb2ludCkgPT4ge1xuICAgICAgICBjb25zdCByYWQgPSBhcmMuY2xvY2t3aXNlXG4gICAgICAgICAgICA/IHBvaW50LmFscGhhIC0gYXJjLnRoZXRhXG4gICAgICAgICAgICA6IHBvaW50LmFscGhhIC0gYXJjLnRoZXRhICsgUkFELnQxODA7XG5cbiAgICAgICAgcG9pbnQueCA9IHBvaW50LnIgKiBNYXRoLmNvcyhyYWQpO1xuICAgICAgICBwb2ludC55ID0gcG9pbnQuciAqIE1hdGguc2luKHJhZCk7XG5cbiAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQocG9pbnQpO1xuICAgIH0sIFtdKTtcbn1cblxuLy8gPT09PT0gRE9NIFJFTkRFUklORyA9PT09PVxuZnVuY3Rpb24gcmVwYWludENvbnRhaW5lcihub2RlLCBhcmMpIHtcbiAgICBub2RlLnN0eWxlLmxlZnQgPSBgJHthcmMuZW5kWH1weGA7XG4gICAgbm9kZS5zdHlsZS50b3AgPSBgJHthcmMuZW5kWX1weGA7XG59XG5cbmZ1bmN0aW9uIHJlcGFpbnRCb2R5KG5vZGUsIGFyYywgaXNMZWFkZXIpIHtcbiAgICBjb25zdCByYWQgPSBhcmMuY2xvY2t3aXNlXG4gICAgICAgID8gUkFELnQxODAgLSBhcmMudGhldGFcbiAgICAgICAgOiBSQUQudDM2MCAtIGFyYy50aGV0YTtcblxuICAgIG5vZGUuc3R5bGUudHJhbnNmb3JtID0gYHJvdGF0ZSgke3JhZCArIFJBRC50NDV9cmFkKWA7XG5cbiAgICBpc0xlYWRlciA/IG5vZGUuc3R5bGUub3V0bGluZSA9ICcxcHggc29saWQgcmVkJyA6IG5vZGUuc3R5bGUub3V0bGluZSA9ICcnO1xufVxuXG5mdW5jdGlvbiByZXBhaW50Q2lyY2xlKG5vZGUsIGFyYykge1xuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc3R5bGUud2lkdGggPSBgJHsyICogYXJjLnJhZGl1c31weGA7XG4gICAgbm9kZS5zdHlsZS5oZWlnaHQgPSBgJHsyICogYXJjLnJhZGl1c31weGA7XG5cbiAgICBub2RlLnN0eWxlLmxlZnQgPSBgLSR7YXJjLnJhZGl1cyArIGFyYy5yYWRpdXMgKiBhcmMuY29zVGhldGF9cHhgO1xuICAgIG5vZGUuc3R5bGUudG9wID0gYC0ke2FyYy5yYWRpdXMgLSBhcmMucmFkaXVzICogYXJjLnNpblRoZXRhfXB4YDtcblxuICAgIG5vZGUuc3R5bGUuYm9yZGVyUmFkaXVzID0gYCR7YXJjLnJhZGl1c31weGA7XG59XG5cbmZ1bmN0aW9uIHJlcGFpbnRWaXNpb25HcmlkKG5vZGVzLCBhcmMsIGdyaWRzKSB7XG4gICAgaWYgKG5vZGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGdyaWRzLnZpc2lvbi5mb3JFYWNoKCh7IHgsIHksIHRvdWNoIH0sIGkpID0+IHtcbiAgICAgICAgbm9kZXNbaV0uc3R5bGUubGVmdCA9IGAke3h9cHhgO1xuICAgICAgICBub2Rlc1tpXS5zdHlsZS50b3AgPSBgJHt5fXB4YDtcblxuICAgICAgICBub2Rlc1tpXS5zdHlsZS5ib3JkZXIgPSAodG91Y2ggPyAnMnB4IHNvbGlkIHJlZCcgOiAnMCcpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBQYXJ0aWNsZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBqcy9wYXJ0aWNsZS5qcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTtBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFUQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkE7QUFBQTtBQUFBO0FBQ0E7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 13);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _enums = __webpack_require__(/*! ./enums */ 15);\n\nvar _arc = __webpack_require__(/*! ./arc */ 360);\n\nvar _arc2 = _interopRequireDefault(_arc);\n\nvar _random = __webpack_require__(/*! ./random */ 361);\n\nvar _random2 = _interopRequireDefault(_random);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// ===== Constructor =====\n\nfunction Particle(parent, bounds, config, globalGrid) {\n this.config = Object.assign({}, {\n behavior: _enums.BEHAVIOR.COHESION,\n bounds: bounds,\n color: _random2.default.color(),\n gridSize: 5,\n randomize: true,\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.id = _random2.default.id(6);\n\n this.nodes = {\n body: createBodyNode(this.config),\n circle: undefined,\n container: createContainerNode(this.config, this.id),\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.leader = null;\n this.isLeader = false;\n\n this.arc = _arc2.default.create(bounds, this.grids.global);\n console.error('starting', this.arc);\n this.updateConfig(this.config);\n this.nextFrame(globalGrid);\n\n var point = document.createElement('div');\n point.style.height = '10px';\n point.style.width = '10px';\n point.style.background = 'red';\n point.style.position = 'absolute';\n point.style.left = '200px';\n point.style.top = '200px';\n this.nodes.parent.appendChild(point);\n};\n\n// ===== PROTOTYPE =====\n\nParticle.prototype.remove = function () {\n this.nodes.parent.removeChild(this.nodes.container);\n delete this.nodes;\n return this;\n};\n\nParticle.prototype.nextFrame = function () {\n this.arc = _arc2.default.goto(this.arc, 200, 200, this.config.speed);\n\n this.arc = _arc2.default.step(this.arc, this.config.bounds, this.config.speed);\n\n // if (this.leader !== null) {\n // this.arc = Arc.follow(this.arc, this.leader.arc);\n // } else if (this.arc.length <= 0 && this.config.randomize) {\n // this.arc = Arc.randomize(this.arc);\n // }\n //\n // this.grids.vision = updateVisionGrid(this.arc, this.config, this.grids);\n // const { hazards, particles } = look(this.arc, this.grids);\n //\n // if (hazards.length > 0) {\n // this.arc = Arc.evade(this.arc);\n // }\n //\n // this.updateLeader(particles);\n\n repaintContainer(this.nodes.container, this.arc);\n repaintBody(this.nodes.body, this.arc, this.isLeader);\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\nParticle.prototype.updateLeader = function (particles) {\n var _this = this;\n\n if (this.config.behavior !== _enums.BEHAVIOR.COHESION) {\n return;\n }\n\n if (this.leader === null && particles.length > 0) {\n // Head-to-head: particles see eachother but shouldn't both lead.\n var candidates = particles.filter(function (v) {\n return v.leader ? v.leader.id !== _this.id : true;\n });\n\n var leader = candidates.find(function (v) {\n return v.isLeader;\n }) || candidates[0];\n\n if (leader !== undefined) {\n leader.isLeader = true;\n this.leader = leader;\n }\n }\n\n if (this.leader === null) {\n return;\n }\n\n if (this.leader.nodes === undefined) {\n this.leader = null;\n return;\n }\n\n if (this.leader.leader !== null) {\n this.leader = this.leader.leader;\n }\n\n if (this.isLeader) {\n this.isLeader = false;\n }\n\n // Beware of circular leadership, where a leader sees its tail.\n if (this.leader.id === this.id) {\n this.leader = null;\n }\n};\n\nfunction look(arc, grids) {\n var global = grids.global,\n vision = grids.vision;\n\n\n return vision.reduce(function (acc, point) {\n var x = arc.endX + point.x;\n var y = arc.endY + point.y;\n var p = global.getPoint({ x: x, y: y, type: _enums.ENTITIES.PARTICLE });\n\n if (p) {\n acc.particles.push(p);\n }\n\n if (global.getPoint({ x: x, y: y, type: _enums.ENTITIES.HAZARD })) {\n acc.hazards.push({ x: x, y: y });\n }\n\n return acc;\n }, { hazards: [], particles: [] });\n}\n\n// ===== DOM 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, id) {\n var node = document.createElement('div');\n node.className = 'particle-container';\n node.id = id;\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 = 45;\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.container.appendChild(div);\n\n acc.push(div);\n\n return acc;\n }, []);\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 ? point.alpha - arc.theta : point.alpha - arc.theta + _enums.RAD.t180;\n\n point.x = point.r * Math.cos(rad);\n point.y = point.r * Math.sin(rad);\n\n return acc.concat(point);\n }, []);\n}\n\n// ===== DOM 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, isLeader) {\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 isLeader ? node.style.outline = '1px solid red' : node.style.outline = '';\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 * arc.cosTheta) + 'px';\n node.style.top = '-' + (arc.radius - arc.radius * arc.sinTheta) + '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 (_ref2, i) {\n var x = _ref2.x,\n y = _ref2.y,\n touch = _ref2.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvcGFydGljbGUuanM/M2JkZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQkVIQVZJT1IsIEVOVElUSUVTLCBSQUQgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCBBcmMgZnJvbSAnLi9hcmMnO1xuaW1wb3J0IFJhbmRvbSBmcm9tICcuL3JhbmRvbSc7XG5cbi8vID09PT09IENvbnN0cnVjdG9yID09PT09XG5cbmZ1bmN0aW9uIFBhcnRpY2xlKHBhcmVudCwgYm91bmRzLCBjb25maWcsIGdsb2JhbEdyaWQpIHtcbiAgICB0aGlzLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIHtcbiAgICAgICAgYmVoYXZpb3I6IEJFSEFWSU9SLkNPSEVTSU9OLFxuICAgICAgICBib3VuZHMsXG4gICAgICAgIGNvbG9yOiBSYW5kb20uY29sb3IoKSxcbiAgICAgICAgZ3JpZFNpemU6IDUsXG4gICAgICAgIHJhbmRvbWl6ZTogdHJ1ZSxcbiAgICAgICAgc2hvd01vdmVtZW50Q2lyY2xlOiBmYWxzZSxcbiAgICAgICAgc2hvd1Zpc2lvbkdyaWQ6IGZhbHNlLFxuICAgICAgICBzcGVlZDogNCxcbiAgICAgICAgdmlzaW9uUmFkaXVzOiA1MFxuICAgIH0sIGNvbmZpZyk7XG5cbiAgICB0aGlzLmdyaWRzID0ge1xuICAgICAgICBnbG9iYWw6IGdsb2JhbEdyaWQgfHwge30sXG4gICAgICAgIHZpc2lvbjogY3JlYXRlVmlzaW9uR3JpZCh0aGlzLmNvbmZpZylcbiAgICB9O1xuXG4gICAgdGhpcy5pZCA9IFJhbmRvbS5pZCg2KTtcblxuICAgIHRoaXMubm9kZXMgPSB7XG4gICAgICAgIGJvZHk6IGNyZWF0ZUJvZHlOb2RlKHRoaXMuY29uZmlnKSxcbiAgICAgICAgY2lyY2xlOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbnRhaW5lcjogY3JlYXRlQ29udGFpbmVyTm9kZSh0aGlzLmNvbmZpZywgdGhpcy5pZCksXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgdmlzaW9uR3JpZDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICB0aGlzLm5vZGVzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm5vZGVzLmJvZHkpO1xuICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLm5vZGVzLmNvbnRhaW5lcik7XG5cbiAgICB0aGlzLmxlYWRlciA9IG51bGw7XG4gICAgdGhpcy5pc0xlYWRlciA9IGZhbHNlO1xuXG4gICAgdGhpcy5hcmMgPSBBcmMuY3JlYXRlKGJvdW5kcywgdGhpcy5ncmlkcy5nbG9iYWwpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ3N0YXJ0aW5nJywgdGhpcy5hcmMpXG4gICAgdGhpcy51cGRhdGVDb25maWcodGhpcy5jb25maWcpO1xuICAgIHRoaXMubmV4dEZyYW1lKGdsb2JhbEdyaWQpO1xuXG5cbiAgICBjb25zdCBwb2ludCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHBvaW50LnN0eWxlLmhlaWdodCA9ICcxMHB4J1xuICAgIHBvaW50LnN0eWxlLndpZHRoID0gJzEwcHgnXG4gICAgcG9pbnQuc3R5bGUuYmFja2dyb3VuZCA9ICdyZWQnXG4gICAgcG9pbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgcG9pbnQuc3R5bGUubGVmdCA9ICcyMDBweCdcbiAgICBwb2ludC5zdHlsZS50b3AgPSAnMjAwcHgnXG4gICAgdGhpcy5ub2Rlcy5wYXJlbnQuYXBwZW5kQ2hpbGQocG9pbnQpO1xufTtcblxuLy8gPT09PT0gUFJPVE9UWVBFID09PT09XG5cblBhcnRpY2xlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLm5vZGVzLnBhcmVudC5yZW1vdmVDaGlsZCh0aGlzLm5vZGVzLmNvbnRhaW5lcik7XG4gICAgZGVsZXRlIHRoaXMubm9kZXM7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblBhcnRpY2xlLnByb3RvdHlwZS5uZXh0RnJhbWUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmFyYyA9IEFyYy5nb3RvKHRoaXMuYXJjLCAyMDAsIDIwMCwgdGhpcy5jb25maWcuc3BlZWQpXG5cbiAgICB0aGlzLmFyYyA9IEFyYy5zdGVwKHRoaXMuYXJjLCB0aGlzLmNvbmZpZy5ib3VuZHMsIHRoaXMuY29uZmlnLnNwZWVkKTtcblxuICAgIC8vIGlmICh0aGlzLmxlYWRlciAhPT0gbnVsbCkge1xuICAgIC8vICAgICB0aGlzLmFyYyA9IEFyYy5mb2xsb3codGhpcy5hcmMsIHRoaXMubGVhZGVyLmFyYyk7XG4gICAgLy8gfSBlbHNlIGlmICh0aGlzLmFyYy5sZW5ndGggPD0gMCAmJiB0aGlzLmNvbmZpZy5yYW5kb21pemUpIHtcbiAgICAvLyAgICAgdGhpcy5hcmMgPSBBcmMucmFuZG9taXplKHRoaXMuYXJjKTtcbiAgICAvLyB9XG4gICAgLy9cbiAgICAvLyB0aGlzLmdyaWRzLnZpc2lvbiA9IHVwZGF0ZVZpc2lvbkdyaWQodGhpcy5hcmMsIHRoaXMuY29uZmlnLCB0aGlzLmdyaWRzKTtcbiAgICAvLyBjb25zdCB7IGhhemFyZHMsIHBhcnRpY2xlcyB9ID0gbG9vayh0aGlzLmFyYywgdGhpcy5ncmlkcyk7XG4gICAgLy9cbiAgICAvLyBpZiAoaGF6YXJkcy5sZW5ndGggPiAwKSB7XG4gICAgLy8gICAgIHRoaXMuYXJjID0gQXJjLmV2YWRlKHRoaXMuYXJjKTtcbiAgICAvLyB9XG4gICAgLy9cbiAgICAvLyB0aGlzLnVwZGF0ZUxlYWRlcihwYXJ0aWNsZXMpO1xuXG4gICAgcmVwYWludENvbnRhaW5lcih0aGlzLm5vZGVzLmNvbnRhaW5lciwgdGhpcy5hcmMpO1xuICAgIHJlcGFpbnRCb2R5KHRoaXMubm9kZXMuYm9keSwgdGhpcy5hcmMsIHRoaXMuaXNMZWFkZXIpO1xuICAgIHJlcGFpbnRDaXJjbGUodGhpcy5ub2Rlcy5jaXJjbGUsIHRoaXMuYXJjKTtcbiAgICByZXBhaW50VmlzaW9uR3JpZCh0aGlzLm5vZGVzLnZpc2lvbkdyaWQsIHRoaXMuYXJjLCB0aGlzLmdyaWRzKTtcbn1cblxuUGFydGljbGUucHJvdG90eXBlLnVwZGF0ZUNvbmZpZyA9IGZ1bmN0aW9uKGNvbmZpZykge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jb25maWcsIGNvbmZpZyk7XG5cbiAgICBjb25zdCB7IHNob3dNb3ZlbWVudENpcmNsZSwgc2hvd1Zpc2lvbkdyaWQgfSA9IHRoaXMuY29uZmlnO1xuXG4gICAgaWYgKHNob3dNb3ZlbWVudENpcmNsZSA9PT0gdHJ1ZSAmJiB0aGlzLm5vZGVzLmNpcmNsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubm9kZXMuY2lyY2xlID0gY3JlYXRlQ2lyY2xlTm9kZShjb25maWcpO1xuICAgICAgICB0aGlzLm5vZGVzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm5vZGVzLmNpcmNsZSk7XG4gICAgfVxuXG4gICAgaWYgKHNob3dNb3ZlbWVudENpcmNsZSA9PT0gZmFsc2UgJiYgdGhpcy5ub2Rlcy5jaXJjbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm5vZGVzLmNvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLm5vZGVzLmNpcmNsZSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm5vZGVzLmNpcmNsZTtcbiAgICB9XG5cbiAgICBpZiAoc2hvd1Zpc2lvbkdyaWQgPT09IHRydWUgJiYgdGhpcy5ub2Rlcy52aXNpb25HcmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5ub2Rlcy52aXNpb25HcmlkID0gY3JlYXRlVmlzaW9uR3JpZE5vZGVzKHRoaXMuY29uZmlnLCB0aGlzLmdyaWRzLCB0aGlzLm5vZGVzKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvd1Zpc2lvbkdyaWQgPT09IGZhbHNlICYmIHRoaXMubm9kZXMudmlzaW9uR3JpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm5vZGV4LnZpc2lvbkdyaWQ7XG4gICAgfVxufVxuXG5QYXJ0aWNsZS5wcm90b3R5cGUudXBkYXRlTGVhZGVyID0gZnVuY3Rpb24ocGFydGljbGVzKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmJlaGF2aW9yICE9PSBCRUhBVklPUi5DT0hFU0lPTikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGVhZGVyID09PSBudWxsICYmIHBhcnRpY2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIEhlYWQtdG8taGVhZDogcGFydGljbGVzIHNlZSBlYWNob3RoZXIgYnV0IHNob3VsZG4ndCBib3RoIGxlYWQuXG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBwYXJ0aWNsZXNcbiAgICAgICAgICAgIC5maWx0ZXIodiA9PiB2LmxlYWRlciA/ICh2LmxlYWRlci5pZCAhPT0gdGhpcy5pZCkgOiB0cnVlKTtcblxuICAgICAgICBjb25zdCBsZWFkZXIgPSBjYW5kaWRhdGVzLmZpbmQodiA9PiB2LmlzTGVhZGVyKSB8fCBjYW5kaWRhdGVzWzBdO1xuXG4gICAgICAgIGlmIChsZWFkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGVhZGVyLmlzTGVhZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubGVhZGVyID0gbGVhZGVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGVhZGVyID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZWFkZXIubm9kZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxlYWRlciA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZWFkZXIubGVhZGVyICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMubGVhZGVyID0gdGhpcy5sZWFkZXIubGVhZGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzTGVhZGVyKSB7XG4gICAgICAgIHRoaXMuaXNMZWFkZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBCZXdhcmUgb2YgY2lyY3VsYXIgbGVhZGVyc2hpcCwgd2hlcmUgYSBsZWFkZXIgc2VlcyBpdHMgdGFpbC5cbiAgICBpZiAodGhpcy5sZWFkZXIuaWQgPT09IHRoaXMuaWQpIHtcbiAgICAgICAgdGhpcy5sZWFkZXIgPSBudWxsO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbG9vayhhcmMsIGdyaWRzKSB7XG4gICAgY29uc3QgeyBnbG9iYWwsIHZpc2lvbiB9ID0gZ3JpZHM7XG5cbiAgICByZXR1cm4gdmlzaW9uLnJlZHVjZSgoYWNjLCBwb2ludCkgPT4ge1xuICAgICAgICBjb25zdCB4ID0gYXJjLmVuZFggKyBwb2ludC54O1xuICAgICAgICBjb25zdCB5ID0gYXJjLmVuZFkgKyBwb2ludC55O1xuICAgICAgICBjb25zdCBwID0gZ2xvYmFsLmdldFBvaW50KHsgeCwgeSwgdHlwZTogRU5USVRJRVMuUEFSVElDTEUgfSk7XG5cbiAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgIGFjYy5wYXJ0aWNsZXMucHVzaChwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnbG9iYWwuZ2V0UG9pbnQoeyB4LCB5LCB0eXBlOiBFTlRJVElFUy5IQVpBUkQgfSkpIHtcbiAgICAgICAgICAgIGFjYy5oYXphcmRzLnB1c2goeyB4LCB5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7IGhhemFyZHM6IFtdLCBwYXJ0aWNsZXM6IFtdIH0pO1xufVxuXG4vLyA9PT09PSBET00gQ1JFQVRJT04gPT09PT1cblxuZnVuY3Rpb24gY3JlYXRlQm9keU5vZGUoY29uZmlnKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIG5vZGUuY2xhc3NOYW1lID0gJ3BhcnRpY2xlLWJvZHknO1xuICAgIG5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29uZmlnLmNvbG9yO1xuICAgIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDaXJjbGVOb2RlKGNvbmZpZykge1xuICAgIGlmIChjb25maWcuc2hvd01vdmVtZW50Q2lyY2xlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBub2RlLmNsYXNzTmFtZSA9ICdwYXJ0aWNsZS1tb3ZlbWVudC1jaXJjbGUnO1xuICAgIG5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSBjb25maWcuY29sb3I7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRhaW5lck5vZGUoY29uZmlnLCBpZCkge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBub2RlLmNsYXNzTmFtZSA9ICdwYXJ0aWNsZS1jb250YWluZXInO1xuICAgIG5vZGUuaWQgPSBpZDtcbiAgICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVmlzaW9uR3JpZChjb25maWcpIHtcbiAgICBjb25zdCB7IGdyaWRTaXplOiBzaWRlLCB2aXNpb25SYWRpdXM6IHJhZGl1cyB9ID0gY29uZmlnO1xuICAgIGNvbnN0IHIwID0gcmFkaXVzO1xuICAgIGNvbnN0IHIxID0gNDU7XG5cbiAgICBjb25zdCBwb2ludHMgPSBbXTtcblxuICAgIGZvciAobGV0IHggPSAtcmFkaXVzOyB4IDw9IHJhZGl1czsgeCArPSBzaWRlKSB7XG4gICAgICAgIGZvciAobGV0IHkgPSAtcmFkaXVzOyB5IDw9IHJhZGl1czsgeSArPSBzaWRlKSB7XG4gICAgICAgICAgICAvLyBPbWl0IGxhcmdlIHNsaWNlcyBvZiB1bnVzZWQgY2lyY2xlXG4gICAgICAgICAgICBpZiAoeCA+IHkgfHwgeCA8IC15KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluY2x1ZGUgdmlzaW9uIGJhbmRcbiAgICAgICAgICAgIGNvbnN0IHIgPSBNYXRoLnBvdyhNYXRoLnBvdyh4LCAyKSArIE1hdGgucG93KHksIDIpLCAwLjUpO1xuICAgICAgICAgICAgaWYgKHIgPiByMCB8fCByIDwgcjEpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGFscGhhID0gTWF0aC5hdGFuKHkgLyB4KTtcbiAgICAgICAgICAgIGlmICh4IDwgMCkge1xuICAgICAgICAgICAgICAgIGFscGhhICs9IFJBRC50MTgwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwb2ludHMucHVzaCh7IHgsIHksIHIsIGFscGhhLCB0b3VjaDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcG9pbnRzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVWaXNpb25HcmlkTm9kZXMoY29uZmlnLCBncmlkcywgbm9kZXMpIHtcbiAgICBpZiAoY29uZmlnLnNob3dWaXNpb25HcmlkID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBncmlkcy52aXNpb24ucmVkdWNlKChhY2MsIHsgeCwgeSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gJ3BhcnRpY2xlLXZpc2lvbi1kb3QnO1xuICAgICAgICBkaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29uZmlnLmNvbG9yO1xuICAgICAgICBub2Rlcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoZGl2KTtcblxuICAgICAgICBhY2MucHVzaChkaXYpO1xuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10pO1xufVxuXG5cbmZ1bmN0aW9uIHVwZGF0ZVZpc2lvbkdyaWQoYXJjLCBjb25maWcsIGdyaWRzKSB7XG4gICAgY29uc3QgeyBnbG9iYWwsIHZpc2lvbiB9ID0gZ3JpZHM7XG5cbiAgICByZXR1cm4gdmlzaW9uLnJlZHVjZSgoYWNjLCBwb2ludCkgPT4ge1xuICAgICAgICBjb25zdCByYWQgPSBhcmMuY2xvY2t3aXNlXG4gICAgICAgICAgICA/IHBvaW50LmFscGhhIC0gYXJjLnRoZXRhXG4gICAgICAgICAgICA6IHBvaW50LmFscGhhIC0gYXJjLnRoZXRhICsgUkFELnQxODA7XG5cbiAgICAgICAgcG9pbnQueCA9IHBvaW50LnIgKiBNYXRoLmNvcyhyYWQpO1xuICAgICAgICBwb2ludC55ID0gcG9pbnQuciAqIE1hdGguc2luKHJhZCk7XG5cbiAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQocG9pbnQpO1xuICAgIH0sIFtdKTtcbn1cblxuLy8gPT09PT0gRE9NIFJFTkRFUklORyA9PT09PVxuZnVuY3Rpb24gcmVwYWludENvbnRhaW5lcihub2RlLCBhcmMpIHtcbiAgICBub2RlLnN0eWxlLmxlZnQgPSBgJHthcmMuZW5kWH1weGA7XG4gICAgbm9kZS5zdHlsZS50b3AgPSBgJHthcmMuZW5kWX1weGA7XG59XG5cbmZ1bmN0aW9uIHJlcGFpbnRCb2R5KG5vZGUsIGFyYywgaXNMZWFkZXIpIHtcbiAgICBjb25zdCByYWQgPSBhcmMuY2xvY2t3aXNlXG4gICAgICAgID8gUkFELnQxODAgLSBhcmMudGhldGFcbiAgICAgICAgOiBSQUQudDM2MCAtIGFyYy50aGV0YTtcblxuICAgIG5vZGUuc3R5bGUudHJhbnNmb3JtID0gYHJvdGF0ZSgke3JhZCArIFJBRC50NDV9cmFkKWA7XG5cbiAgICBpc0xlYWRlciA/IG5vZGUuc3R5bGUub3V0bGluZSA9ICcxcHggc29saWQgcmVkJyA6IG5vZGUuc3R5bGUub3V0bGluZSA9ICcnO1xufVxuXG5mdW5jdGlvbiByZXBhaW50Q2lyY2xlKG5vZGUsIGFyYykge1xuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc3R5bGUud2lkdGggPSBgJHsyICogYXJjLnJhZGl1c31weGA7XG4gICAgbm9kZS5zdHlsZS5oZWlnaHQgPSBgJHsyICogYXJjLnJhZGl1c31weGA7XG5cbiAgICBub2RlLnN0eWxlLmxlZnQgPSBgLSR7YXJjLnJhZGl1cyArIGFyYy5yYWRpdXMgKiBhcmMuY29zVGhldGF9cHhgO1xuICAgIG5vZGUuc3R5bGUudG9wID0gYC0ke2FyYy5yYWRpdXMgLSBhcmMucmFkaXVzICogYXJjLnNpblRoZXRhfXB4YDtcblxuICAgIG5vZGUuc3R5bGUuYm9yZGVyUmFkaXVzID0gYCR7YXJjLnJhZGl1c31weGA7XG59XG5cbmZ1bmN0aW9uIHJlcGFpbnRWaXNpb25HcmlkKG5vZGVzLCBhcmMsIGdyaWRzKSB7XG4gICAgaWYgKG5vZGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGdyaWRzLnZpc2lvbi5mb3JFYWNoKCh7IHgsIHksIHRvdWNoIH0sIGkpID0+IHtcbiAgICAgICAgbm9kZXNbaV0uc3R5bGUubGVmdCA9IGAke3h9cHhgO1xuICAgICAgICBub2Rlc1tpXS5zdHlsZS50b3AgPSBgJHt5fXB4YDtcblxuICAgICAgICBub2Rlc1tpXS5zdHlsZS5ib3JkZXIgPSAodG91Y2ggPyAnMnB4IHNvbGlkIHJlZCcgOiAnMCcpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBQYXJ0aWNsZTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBqcy9wYXJ0aWNsZS5qcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTtBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFUQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); /***/ }), /* 20 */ @@ -930,8 +930,30 @@ eval("var apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\n eval("var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzPzM2OTgiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGc7XHJcblxyXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxyXG5nID0gKGZ1bmN0aW9uKCkge1xyXG5cdHJldHVybiB0aGlzO1xyXG59KSgpO1xyXG5cclxudHJ5IHtcclxuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcclxuXHRnID0gZyB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCkgfHwgKDEsZXZhbCkoXCJ0aGlzXCIpO1xyXG59IGNhdGNoKGUpIHtcclxuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxyXG5cdGlmKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpXHJcblx0XHRnID0gd2luZG93O1xyXG59XHJcblxyXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXHJcbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXHJcbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZztcclxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzXG4vLyBtb2R1bGUgaWQgPSA3MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0="); /***/ }), -/* 73 */, -/* 74 */, +/* 73 */ +/* unknown exports provided */ +/* all exports used */ +/*!***************************!*\ + !*** ./js/animation1a.js ***! + \***************************/ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 13);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _grid = __webpack_require__(/*! ./grid */ 359);\n\nvar _grid2 = _interopRequireDefault(_grid);\n\nvar _particle = __webpack_require__(/*! ./particle */ 19);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _controls = __webpack_require__(/*! ./controls */ 16);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _enums = __webpack_require__(/*! ./enums */ 15);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation1a() {\n this.options = {\n count: 1,\n maxCount: 10,\n randomize: true,\n showMovementCircle: true,\n speed: 4\n };\n\n this.container = document.getElementById('animation1a');\n this.particles = [];\n this.grid = new _grid2.default();\n\n this.movementCircleCtrl = createMovementCircleControl();\n this.randomizeCtrl = createRandomizeControl();\n\n var controls = new _controls2.default(document.getElementById('controls1a'), this.options, [this.movementCircleCtrl, this.randomizeCtrl]);\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 randomize$ = _rxjs2.default.Observable.fromEvent(this.randomizeCtrl, 'change').map(function (evt) {\n return { key: _enums.CONTROLS.RANDOMIZE, value: evt.target.checked };\n });\n\n var eventStack$ = controls.mount().merge(circle$, randomize$);\n\n eventStack$.subscribe(this.subscriber.bind(this));\n\n this.updateCount(this.options.count);\n this.updateMovementCircle(this.options.showMovementCircle);\n this.updateRandomize(this.options.randomize);\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\nfunction createRandomizeControl(value) {\n var label = document.createElement('label');\n label.className = 'controls-checkbox';\n\n var text = document.createElement('span');\n text.innerHTML = 'Randomize movement';\n text.className = 'controls-checkbox-text';\n\n var checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'controls-checkbox-input';\n checkbox.checked = value;\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 var bounds = this.container.getBoundingClientRect();\n\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, bounds, this.options, this.grid);\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.randomizeCtrl.querySelector('[type=checkbox]').checked = 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/M2NmMSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IEdyaWQgZnJvbSAnLi9ncmlkJztcbmltcG9ydCBQYXJ0aWNsZSBmcm9tICcuL3BhcnRpY2xlJztcbmltcG9ydCBDb250cm9scyBmcm9tICcuL2NvbnRyb2xzJztcbmltcG9ydCB7IENPTlRST0xTIH0gZnJvbSAnLi9lbnVtcyc7XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbjFhKCkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgY291bnQ6IDEsXG4gICAgICAgIG1heENvdW50OiAxMCxcbiAgICAgICAgcmFuZG9taXplOiB0cnVlLFxuICAgICAgICBzaG93TW92ZW1lbnRDaXJjbGU6IHRydWUsXG4gICAgICAgIHNwZWVkOiA0XG4gICAgfTtcblxuICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FuaW1hdGlvbjFhJyk7XG4gICAgdGhpcy5wYXJ0aWNsZXMgPSBbXTtcbiAgICB0aGlzLmdyaWQgPSBuZXcgR3JpZCgpO1xuXG4gICAgdGhpcy5tb3ZlbWVudENpcmNsZUN0cmwgPSBjcmVhdGVNb3ZlbWVudENpcmNsZUNvbnRyb2woKTtcbiAgICB0aGlzLnJhbmRvbWl6ZUN0cmwgPSBjcmVhdGVSYW5kb21pemVDb250cm9sKCk7XG5cbiAgICBjb25zdCBjb250cm9scyA9IG5ldyBDb250cm9scyhcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRyb2xzMWEnKSxcbiAgICAgICAgdGhpcy5vcHRpb25zLFxuICAgICAgICBbdGhpcy5tb3ZlbWVudENpcmNsZUN0cmwsIHRoaXMucmFuZG9taXplQ3RybF1cbiAgICApO1xuXG4gICAgY29uc3QgY2lyY2xlJCA9IFJ4Lk9ic2VydmFibGUuZnJvbUV2ZW50KHRoaXMubW92ZW1lbnRDaXJjbGVDdHJsLCAnY2hhbmdlJylcbiAgICAgICAgLm1hcChldnQgPT4gKHsga2V5OiBDT05UUk9MUy5NT1ZFTUVOVF9DSVJDTEUsIHZhbHVlOiBldnQudGFyZ2V0LmNoZWNrZWQgfSkpO1xuXG4gICAgY29uc3QgcmFuZG9taXplJCA9IFJ4Lk9ic2VydmFibGUuZnJvbUV2ZW50KHRoaXMucmFuZG9taXplQ3RybCwgJ2NoYW5nZScpXG4gICAgICAgIC5tYXAoZXZ0ID0+ICh7IGtleTogQ09OVFJPTFMuUkFORE9NSVpFLCB2YWx1ZTogZXZ0LnRhcmdldC5jaGVja2VkIH0pKTtcblxuICAgIGNvbnN0IGV2ZW50U3RhY2skID0gY29udHJvbHMubW91bnQoKS5tZXJnZShjaXJjbGUkLCByYW5kb21pemUkKTtcblxuICAgIGV2ZW50U3RhY2skLnN1YnNjcmliZSh0aGlzLnN1YnNjcmliZXIuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLnVwZGF0ZUNvdW50KHRoaXMub3B0aW9ucy5jb3VudCk7XG4gICAgdGhpcy51cGRhdGVNb3ZlbWVudENpcmNsZSh0aGlzLm9wdGlvbnMuc2hvd01vdmVtZW50Q2lyY2xlKTtcbiAgICB0aGlzLnVwZGF0ZVJhbmRvbWl6ZSh0aGlzLm9wdGlvbnMucmFuZG9taXplKTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZU1vdmVtZW50Q2lyY2xlQ29udHJvbCgpIHtcbiAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgbGFiZWwuY2xhc3NOYW1lID0gJ2NvbnRyb2xzLWNoZWNrYm94JztcblxuICAgIGNvbnN0IHRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgdGV4dC5pbm5lckhUTUwgPSAnU2hvdyBtb3ZlbWVudCBjaXJjbGUnO1xuICAgIHRleHQuY2xhc3NOYW1lID0gJ2NvbnRyb2xzLWNoZWNrYm94LXRleHQnO1xuXG4gICAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGNoZWNrYm94LnR5cGUgPSAnY2hlY2tib3gnO1xuICAgIGNoZWNrYm94LmNsYXNzTmFtZSA9ICdjb250cm9scy1jaGVja2JveC1pbnB1dCc7XG5cbiAgICBsYWJlbC5hcHBlbmRDaGlsZChjaGVja2JveCk7XG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQodGV4dCk7XG5cbiAgICByZXR1cm4gbGFiZWw7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJhbmRvbWl6ZUNvbnRyb2wodmFsdWUpIHtcbiAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgbGFiZWwuY2xhc3NOYW1lID0gJ2NvbnRyb2xzLWNoZWNrYm94JztcblxuICAgIGNvbnN0IHRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgdGV4dC5pbm5lckhUTUwgPSAnUmFuZG9taXplIG1vdmVtZW50JztcbiAgICB0ZXh0LmNsYXNzTmFtZSA9ICdjb250cm9scy1jaGVja2JveC10ZXh0JztcblxuICAgIGNvbnN0IGNoZWNrYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBjaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICBjaGVja2JveC5jbGFzc05hbWUgPSAnY29udHJvbHMtY2hlY2tib3gtaW5wdXQnO1xuICAgIGNoZWNrYm94LmNoZWNrZWQgPSB2YWx1ZTtcblxuICAgIGxhYmVsLmFwcGVuZENoaWxkKGNoZWNrYm94KTtcbiAgICBsYWJlbC5hcHBlbmRDaGlsZCh0ZXh0KTtcblxuICAgIHJldHVybiBsYWJlbDtcbn1cblxuQW5pbWF0aW9uMWEucHJvdG90eXBlLnN1YnNjcmliZXIgPSBmdW5jdGlvbih7IGtleSwgdmFsdWUgfSkge1xuICAgIHN3aXRjaChrZXkpIHtcbiAgICAgICAgY2FzZSBDT05UUk9MUy5BTklNQVRJTkc6IHRoaXMudXBkYXRlQW5pbWF0aW5nKHZhbHVlKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuQ09VTlQ6IHRoaXMudXBkYXRlQ291bnQodmFsdWUpOyBicmVhaztcbiAgICAgICAgY2FzZSBDT05UUk9MUy5NT1ZFTUVOVF9DSVJDTEU6IHRoaXMudXBkYXRlTW92ZW1lbnRDaXJjbGUodmFsdWUpOyBicmVhaztcbiAgICAgICAgY2FzZSBDT05UUk9MUy5SQU5ET01JWkU6IHRoaXMudXBkYXRlUmFuZG9taXplKHZhbHVlKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuU1BFRUQ6IHRoaXMudXBkYXRlU3BlZWQodmFsdWUpOyBicmVhaztcbiAgICB9XG59XG5cbkFuaW1hdGlvbjFhLnByb3RvdHlwZS5uZXh0RnJhbWUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnBhcnRpY2xlcy5mb3JFYWNoKHAgPT4gcC5uZXh0RnJhbWUoKSk7XG59XG5cbkFuaW1hdGlvbjFhLnByb3RvdHlwZS51cGRhdGVBbmltYXRpbmcgPSBmdW5jdGlvbihpc0FuaW1hdGluZykge1xuICAgIHRoaXMub3B0aW9ucy5hbmltYXRpbmcgPSBpc0FuaW1hdGluZztcblxuICAgIGlmIChpc0FuaW1hdGluZykge1xuICAgICAgICBjb25zdCBmcHMkID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwIC8gMzIpXG4gICAgICAgICAgICAudGFrZVdoaWxlKF8gPT4gdGhpcy5vcHRpb25zLmFuaW1hdGluZyk7XG5cbiAgICAgICAgZnBzJC5zdWJzY3JpYmUodGhpcy5uZXh0RnJhbWUuYmluZCh0aGlzKSk7XG4gICAgfVxufVxuXG5BbmltYXRpb24xYS5wcm90b3R5cGUudXBkYXRlQ291bnQgPSBmdW5jdGlvbihjb3VudCkge1xuICAgIGNvbnN0IGJvdW5kcyA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgd2hpbGUgKHRoaXMucGFydGljbGVzLmxlbmd0aCA+IGNvdW50KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnBhcnRpY2xlcy5wb3AoKS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoIDwgY291bnQpIHtcbiAgICAgICAgY29uc3QgcCA9IG5ldyBQYXJ0aWNsZSh0aGlzLmNvbnRhaW5lciwgYm91bmRzLCB0aGlzLm9wdGlvbnMsIHRoaXMuZ3JpZCk7XG4gICAgICAgIHRoaXMucGFydGljbGVzLnB1c2gocCk7XG4gICAgfVxufVxuXG5BbmltYXRpb24xYS5wcm90b3R5cGUudXBkYXRlTW92ZW1lbnRDaXJjbGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHRoaXMub3B0aW9ucy5zaG93TW92ZW1lbnRDaXJjbGUgPSB2YWx1ZTtcbiAgICB0aGlzLm1vdmVtZW50Q2lyY2xlQ3RybC5xdWVyeVNlbGVjdG9yKCdbdHlwZT1jaGVja2JveF0nKS5jaGVja2VkID0gdmFsdWU7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAudXBkYXRlQ29uZmlnKHsgc2hvd01vdmVtZW50Q2lyY2xlOiB2YWx1ZSB9KSk7XG59XG5cbkFuaW1hdGlvbjFhLnByb3RvdHlwZS51cGRhdGVSYW5kb21pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHRoaXMub3B0aW9ucy5yYW5kb21pemUgPSB2YWx1ZTtcbiAgICB0aGlzLnJhbmRvbWl6ZUN0cmwucXVlcnlTZWxlY3RvcignW3R5cGU9Y2hlY2tib3hdJykuY2hlY2tlZCA9IHZhbHVlO1xuICAgIHRoaXMucGFydGljbGVzLmZvckVhY2gocCA9PiBwLnVwZGF0ZUNvbmZpZyh7IHJhbmRvbWl6ZTogdmFsdWUgfSkpO1xufVxuXG5BbmltYXRpb24xYS5wcm90b3R5cGUudXBkYXRlU3BlZWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHRoaXMub3B0aW9ucy5zcGVlZCA9IHZhbHVlO1xuICAgIHRoaXMucGFydGljbGVzLmZvckVhY2gocCA9PiBwLnVwZGF0ZUNvbmZpZyh7IHNwZWVkOiB2YWx1ZSB9KSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFuaW1hdGlvbjFhO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGpzL2FuaW1hdGlvbjFhLmpzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); + +/***/ }), +/* 74 */ +/* unknown exports provided */ +/* all exports used */ +/*!***************************!*\ + !*** ./js/animation1b.js ***! + \***************************/ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 13);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _grid = __webpack_require__(/*! ./grid */ 359);\n\nvar _grid2 = _interopRequireDefault(_grid);\n\nvar _particle = __webpack_require__(/*! ./particle */ 19);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _controls = __webpack_require__(/*! ./controls */ 16);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _enums = __webpack_require__(/*! ./enums */ 15);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation1b() {\n this.options = {\n count: 1,\n maxCount: 1000,\n speed: 8\n };\n\n this.container = document.getElementById('animation1b');\n this.particles = [];\n this.grid = new _grid2.default();\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.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 var bounds = this.container.getBoundingClientRect();\n\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, bounds, this.options, this.grid);\n this.particles.push(p);\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/ZDJkMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IEdyaWQgZnJvbSAnLi9ncmlkJztcbmltcG9ydCBQYXJ0aWNsZSBmcm9tICcuL3BhcnRpY2xlJztcbmltcG9ydCBDb250cm9scyBmcm9tICcuL2NvbnRyb2xzJztcbmltcG9ydCB7IENPTlRST0xTIH0gZnJvbSAnLi9lbnVtcyc7XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbjFiKCkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgY291bnQ6IDEsXG4gICAgICAgIG1heENvdW50OiAxMDAwLFxuICAgICAgICBzcGVlZDogOFxuICAgIH07XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbmltYXRpb24xYicpO1xuICAgIHRoaXMucGFydGljbGVzID0gW107XG4gICAgdGhpcy5ncmlkID0gbmV3IEdyaWQoKTtcblxuICAgIGNvbnN0IGNvbnRyb2xzID0gbmV3IENvbnRyb2xzKFxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udHJvbHMxYicpLFxuICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICApO1xuXG4gICAgY29udHJvbHMubW91bnQoKS5zdWJzY3JpYmUodGhpcy5zdWJzY3JpYmVyLmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy51cGRhdGVDb3VudCh0aGlzLm9wdGlvbnMuY291bnQpO1xufTtcblxuQW5pbWF0aW9uMWIucHJvdG90eXBlLnN1YnNjcmliZXIgPSBmdW5jdGlvbih7IGtleSwgdmFsdWUgfSkge1xuICAgIHN3aXRjaChrZXkpIHtcbiAgICAgICAgY2FzZSBDT05UUk9MUy5BTklNQVRJTkc6IHRoaXMudXBkYXRlQW5pbWF0aW5nKHZhbHVlKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuQ09VTlQ6IHRoaXMudXBkYXRlQ291bnQodmFsdWUpOyBicmVhaztcbiAgICAgICAgY2FzZSBDT05UUk9MUy5TUEVFRDogdGhpcy51cGRhdGVTcGVlZCh2YWx1ZSk7IGJyZWFrO1xuICAgIH1cbn1cblxuQW5pbWF0aW9uMWIucHJvdG90eXBlLm5leHRGcmFtZSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucGFydGljbGVzLmZvckVhY2gocCA9PiBwLm5leHRGcmFtZSgpKTtcbn1cblxuQW5pbWF0aW9uMWIucHJvdG90eXBlLnVwZGF0ZUFuaW1hdGluZyA9IGZ1bmN0aW9uKGlzQW5pbWF0aW5nKSB7XG4gICAgdGhpcy5vcHRpb25zLmFuaW1hdGluZyA9IGlzQW5pbWF0aW5nO1xuXG4gICAgaWYgKGlzQW5pbWF0aW5nKSB7XG4gICAgICAgIGNvbnN0IGZwcyQgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDAgLyAzMilcbiAgICAgICAgICAgIC50YWtlV2hpbGUoXyA9PiB0aGlzLm9wdGlvbnMuYW5pbWF0aW5nKTtcblxuICAgICAgICBmcHMkLnN1YnNjcmliZSh0aGlzLm5leHRGcmFtZS5iaW5kKHRoaXMpKTtcbiAgICB9XG59XG5cbkFuaW1hdGlvbjFiLnByb3RvdHlwZS51cGRhdGVDb3VudCA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoID4gY291bnQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMucGFydGljbGVzLnBvcCgpLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHdoaWxlICh0aGlzLnBhcnRpY2xlcy5sZW5ndGggPCBjb3VudCkge1xuICAgICAgICBjb25zdCBwID0gbmV3IFBhcnRpY2xlKHRoaXMuY29udGFpbmVyLCBib3VuZHMsIHRoaXMub3B0aW9ucywgdGhpcy5ncmlkKTtcbiAgICAgICAgdGhpcy5wYXJ0aWNsZXMucHVzaChwKTtcbiAgICB9XG59XG5cbkFuaW1hdGlvbjFiLnByb3RvdHlwZS51cGRhdGVTcGVlZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy5vcHRpb25zLnNwZWVkID0gdmFsdWU7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAudXBkYXRlQ29uZmlnKHsgc3BlZWQ6IHZhbHVlIH0pKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQW5pbWF0aW9uMWI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8ganMvYW5pbWF0aW9uMWIuanMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9"); + +/***/ }), /* 75 */ /* unknown exports provided */ /* all exports used */ @@ -941,7 +963,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 */ 13);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _particle = __webpack_require__(/*! ./particle */ 19);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _grid = __webpack_require__(/*! ./grid */ 359);\n\nvar _grid2 = _interopRequireDefault(_grid);\n\nvar _controls = __webpack_require__(/*! ./controls */ 16);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _random = __webpack_require__(/*! ./random */ 361);\n\nvar _random2 = _interopRequireDefault(_random);\n\nvar _enums = __webpack_require__(/*! ./enums */ 15);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation2a() {\n this.options = {\n count: 3,\n maxCount: 10,\n showVisionGrid: true,\n speed: 4\n };\n\n this.container = document.getElementById('animation2a');\n this.particles = [];\n this.grid = this.createGlobalGrid();\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\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.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 var bounds = this.container.getBoundingClientRect();\n\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, bounds, this.options, this.grid);\n this.particles.push(p);\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\nAnimation2a.prototype.createGlobalGrid = function () {\n var bounds = this.container.getBoundingClientRect();\n var grid = new _grid2.default();\n\n for (var i = 0; i < 2; i++) {\n var w = _random2.default.num(50, 200);\n var h = _random2.default.num(50, 200);\n\n grid.setArea({\n x: _random2.default.num(0, bounds.width - w),\n y: _random2.default.num(0, bounds.height - h),\n w: w,\n h: h,\n type: _enums.ENTITIES.HAZARD\n }, this.container);\n }\n\n return grid;\n};\n\nexports.default = Animation2a;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYW5pbWF0aW9uMmEuanM/YzJmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gJy4vcGFydGljbGUnO1xuaW1wb3J0IEdyaWQgZnJvbSAnLi9ncmlkJztcbmltcG9ydCBDb250cm9scyBmcm9tICcuL2NvbnRyb2xzJztcbmltcG9ydCBSYW5kb20gZnJvbSAnLi9yYW5kb20nO1xuaW1wb3J0IHsgQ09OVFJPTFMsIEVOVElUSUVTIH0gZnJvbSAnLi9lbnVtcyc7XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbjJhKCkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgY291bnQ6IDMsXG4gICAgICAgIG1heENvdW50OiAxMCxcbiAgICAgICAgc2hvd1Zpc2lvbkdyaWQ6IHRydWUsXG4gICAgICAgIHNwZWVkOiA0XG4gICAgfTtcblxuICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FuaW1hdGlvbjJhJyk7XG4gICAgdGhpcy5wYXJ0aWNsZXMgPSBbXTtcbiAgICB0aGlzLmdyaWQgPSB0aGlzLmNyZWF0ZUdsb2JhbEdyaWQoKTtcblxuICAgIGNvbnN0IGNvbnRyb2xzID0gbmV3IENvbnRyb2xzKFxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udHJvbHMyYScpLFxuICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICApO1xuXG4gICAgY29udHJvbHMubW91bnQoKS5zdWJzY3JpYmUodGhpcy5zdWJzY3JpYmVyLmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy51cGRhdGVBbmltYXRpbmcodGhpcy5vcHRpb25zLmFuaW1hdGluZyk7XG4gICAgdGhpcy51cGRhdGVDb3VudCh0aGlzLm9wdGlvbnMuY291bnQpO1xufTtcblxuQW5pbWF0aW9uMmEucHJvdG90eXBlLnN1YnNjcmliZXIgPSBmdW5jdGlvbih7IGtleSwgdmFsdWUgfSkge1xuICAgIHN3aXRjaChrZXkpIHtcbiAgICAgICAgY2FzZSBDT05UUk9MUy5BTklNQVRJTkc6IHRoaXMudXBkYXRlQW5pbWF0aW5nKHZhbHVlKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuQ09VTlQ6IHRoaXMudXBkYXRlQ291bnQodmFsdWUpOyBicmVhaztcbiAgICAgICAgY2FzZSBDT05UUk9MUy5TUEVFRDogdGhpcy51cGRhdGVTcGVlZCh2YWx1ZSk7IGJyZWFrO1xuICAgIH1cbn1cblxuQW5pbWF0aW9uMmEucHJvdG90eXBlLm5leHRGcmFtZSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucGFydGljbGVzLmZvckVhY2gocCA9PiBwLm5leHRGcmFtZSgpKTtcbn1cblxuQW5pbWF0aW9uMmEucHJvdG90eXBlLnVwZGF0ZUFuaW1hdGluZyA9IGZ1bmN0aW9uKGlzQW5pbWF0aW5nKSB7XG4gICAgdGhpcy5vcHRpb25zLmFuaW1hdGluZyA9IGlzQW5pbWF0aW5nO1xuXG4gICAgaWYgKGlzQW5pbWF0aW5nKSB7XG4gICAgICAgIGNvbnN0IGZwcyQgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDAgLyAzMilcbiAgICAgICAgICAgIC50YWtlV2hpbGUoXyA9PiB0aGlzLm9wdGlvbnMuYW5pbWF0aW5nKTtcblxuICAgICAgICBmcHMkLnN1YnNjcmliZSh0aGlzLm5leHRGcmFtZS5iaW5kKHRoaXMpKTtcbiAgICB9XG59XG5cbkFuaW1hdGlvbjJhLnByb3RvdHlwZS51cGRhdGVDb3VudCA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoID4gY291bnQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMucGFydGljbGVzLnBvcCgpLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHdoaWxlICh0aGlzLnBhcnRpY2xlcy5sZW5ndGggPCBjb3VudCkge1xuICAgICAgICBjb25zdCBwID0gbmV3IFBhcnRpY2xlKHRoaXMuY29udGFpbmVyLCBib3VuZHMsIHRoaXMub3B0aW9ucywgdGhpcy5ncmlkKTtcbiAgICAgICAgdGhpcy5wYXJ0aWNsZXMucHVzaChwKTtcbiAgICB9XG59XG5cbkFuaW1hdGlvbjJhLnByb3RvdHlwZS51cGRhdGVTcGVlZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy5vcHRpb25zLnNwZWVkID0gdmFsdWU7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAudXBkYXRlQ29uZmlnKHsgc3BlZWQ6IHZhbHVlIH0pKTtcbn1cblxuQW5pbWF0aW9uMmEucHJvdG90eXBlLmNyZWF0ZUdsb2JhbEdyaWQgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBncmlkID0gbmV3IEdyaWQoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHcgPSBSYW5kb20ubnVtKDUwLCAyMDApO1xuICAgICAgICBjb25zdCBoID0gUmFuZG9tLm51bSg1MCwgMjAwKTtcblxuICAgICAgICBncmlkLnNldEFyZWEoe1xuICAgICAgICAgICAgeDogUmFuZG9tLm51bSgwLCBib3VuZHMud2lkdGggLSB3KSxcbiAgICAgICAgICAgIHk6IFJhbmRvbS5udW0oMCwgYm91bmRzLmhlaWdodCAtIGgpLFxuICAgICAgICAgICAgdyxcbiAgICAgICAgICAgIGgsXG4gICAgICAgICAgICB0eXBlOiBFTlRJVElFUy5IQVpBUkRcbiAgICAgICAgfSwgdGhpcy5jb250YWluZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBncmlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBbmltYXRpb24yYTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBqcy9hbmltYXRpb24yYS5qcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ=="); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 13);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _particle = __webpack_require__(/*! ./particle */ 19);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _grid = __webpack_require__(/*! ./grid */ 359);\n\nvar _grid2 = _interopRequireDefault(_grid);\n\nvar _controls = __webpack_require__(/*! ./controls */ 16);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _random = __webpack_require__(/*! ./random */ 361);\n\nvar _random2 = _interopRequireDefault(_random);\n\nvar _enums = __webpack_require__(/*! ./enums */ 15);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation2a() {\n this.options = {\n count: 3,\n maxCount: 10,\n showVisionGrid: true,\n speed: 4\n };\n\n this.container = document.getElementById('animation2a');\n this.particles = [];\n this.grid = this.createGlobalGrid();\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\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.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 var bounds = this.container.getBoundingClientRect();\n\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, bounds, this.options, this.grid);\n this.particles.push(p);\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\nAnimation2a.prototype.createGlobalGrid = function () {\n var bounds = this.container.getBoundingClientRect();\n var grid = new _grid2.default();\n\n var n = _random2.default.num(1, 3);\n for (var i = 0; i < n; i++) {\n var w = _random2.default.num(50, 200);\n var h = _random2.default.num(50, 200);\n\n grid.setArea({\n x: _random2.default.num(0, bounds.width - w),\n y: _random2.default.num(0, bounds.height - h),\n w: w,\n h: h,\n type: _enums.ENTITIES.HAZARD\n }, this.container);\n }\n\n return grid;\n};\n\nexports.default = Animation2a;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYW5pbWF0aW9uMmEuanM/YzJmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gJy4vcGFydGljbGUnO1xuaW1wb3J0IEdyaWQgZnJvbSAnLi9ncmlkJztcbmltcG9ydCBDb250cm9scyBmcm9tICcuL2NvbnRyb2xzJztcbmltcG9ydCBSYW5kb20gZnJvbSAnLi9yYW5kb20nO1xuaW1wb3J0IHsgQ09OVFJPTFMsIEVOVElUSUVTIH0gZnJvbSAnLi9lbnVtcyc7XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbjJhKCkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgY291bnQ6IDMsXG4gICAgICAgIG1heENvdW50OiAxMCxcbiAgICAgICAgc2hvd1Zpc2lvbkdyaWQ6IHRydWUsXG4gICAgICAgIHNwZWVkOiA0XG4gICAgfTtcblxuICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FuaW1hdGlvbjJhJyk7XG4gICAgdGhpcy5wYXJ0aWNsZXMgPSBbXTtcbiAgICB0aGlzLmdyaWQgPSB0aGlzLmNyZWF0ZUdsb2JhbEdyaWQoKTtcblxuICAgIGNvbnN0IGNvbnRyb2xzID0gbmV3IENvbnRyb2xzKFxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udHJvbHMyYScpLFxuICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICApO1xuXG4gICAgY29udHJvbHMubW91bnQoKS5zdWJzY3JpYmUodGhpcy5zdWJzY3JpYmVyLmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy51cGRhdGVBbmltYXRpbmcodGhpcy5vcHRpb25zLmFuaW1hdGluZyk7XG4gICAgdGhpcy51cGRhdGVDb3VudCh0aGlzLm9wdGlvbnMuY291bnQpO1xufTtcblxuQW5pbWF0aW9uMmEucHJvdG90eXBlLnN1YnNjcmliZXIgPSBmdW5jdGlvbih7IGtleSwgdmFsdWUgfSkge1xuICAgIHN3aXRjaChrZXkpIHtcbiAgICAgICAgY2FzZSBDT05UUk9MUy5BTklNQVRJTkc6IHRoaXMudXBkYXRlQW5pbWF0aW5nKHZhbHVlKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuQ09VTlQ6IHRoaXMudXBkYXRlQ291bnQodmFsdWUpOyBicmVhaztcbiAgICAgICAgY2FzZSBDT05UUk9MUy5TUEVFRDogdGhpcy51cGRhdGVTcGVlZCh2YWx1ZSk7IGJyZWFrO1xuICAgIH1cbn1cblxuQW5pbWF0aW9uMmEucHJvdG90eXBlLm5leHRGcmFtZSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucGFydGljbGVzLmZvckVhY2gocCA9PiBwLm5leHRGcmFtZSgpKTtcbn1cblxuQW5pbWF0aW9uMmEucHJvdG90eXBlLnVwZGF0ZUFuaW1hdGluZyA9IGZ1bmN0aW9uKGlzQW5pbWF0aW5nKSB7XG4gICAgdGhpcy5vcHRpb25zLmFuaW1hdGluZyA9IGlzQW5pbWF0aW5nO1xuXG4gICAgaWYgKGlzQW5pbWF0aW5nKSB7XG4gICAgICAgIGNvbnN0IGZwcyQgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDAgLyAzMilcbiAgICAgICAgICAgIC50YWtlV2hpbGUoXyA9PiB0aGlzLm9wdGlvbnMuYW5pbWF0aW5nKTtcblxuICAgICAgICBmcHMkLnN1YnNjcmliZSh0aGlzLm5leHRGcmFtZS5iaW5kKHRoaXMpKTtcbiAgICB9XG59XG5cbkFuaW1hdGlvbjJhLnByb3RvdHlwZS51cGRhdGVDb3VudCA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoID4gY291bnQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMucGFydGljbGVzLnBvcCgpLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHdoaWxlICh0aGlzLnBhcnRpY2xlcy5sZW5ndGggPCBjb3VudCkge1xuICAgICAgICBjb25zdCBwID0gbmV3IFBhcnRpY2xlKHRoaXMuY29udGFpbmVyLCBib3VuZHMsIHRoaXMub3B0aW9ucywgdGhpcy5ncmlkKTtcbiAgICAgICAgdGhpcy5wYXJ0aWNsZXMucHVzaChwKTtcbiAgICB9XG59XG5cbkFuaW1hdGlvbjJhLnByb3RvdHlwZS51cGRhdGVTcGVlZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy5vcHRpb25zLnNwZWVkID0gdmFsdWU7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAudXBkYXRlQ29uZmlnKHsgc3BlZWQ6IHZhbHVlIH0pKTtcbn1cblxuQW5pbWF0aW9uMmEucHJvdG90eXBlLmNyZWF0ZUdsb2JhbEdyaWQgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBncmlkID0gbmV3IEdyaWQoKTtcblxuICAgIGNvbnN0IG4gPSBSYW5kb20ubnVtKDEsIDMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHcgPSBSYW5kb20ubnVtKDUwLCAyMDApO1xuICAgICAgICBjb25zdCBoID0gUmFuZG9tLm51bSg1MCwgMjAwKTtcblxuICAgICAgICBncmlkLnNldEFyZWEoe1xuICAgICAgICAgICAgeDogUmFuZG9tLm51bSgwLCBib3VuZHMud2lkdGggLSB3KSxcbiAgICAgICAgICAgIHk6IFJhbmRvbS5udW0oMCwgYm91bmRzLmhlaWdodCAtIGgpLFxuICAgICAgICAgICAgdyxcbiAgICAgICAgICAgIGgsXG4gICAgICAgICAgICB0eXBlOiBFTlRJVElFUy5IQVpBUkRcbiAgICAgICAgfSwgdGhpcy5jb250YWluZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBncmlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBbmltYXRpb24yYTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBqcy9hbmltYXRpb24yYS5qcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9"); /***/ }), /* 76 */ @@ -953,10 +975,21 @@ 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 */ 13);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _particle = __webpack_require__(/*! ./particle */ 19);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _grid = __webpack_require__(/*! ./grid */ 359);\n\nvar _grid2 = _interopRequireDefault(_grid);\n\nvar _controls = __webpack_require__(/*! ./controls */ 16);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _random = __webpack_require__(/*! ./random */ 361);\n\nvar _random2 = _interopRequireDefault(_random);\n\nvar _enums = __webpack_require__(/*! ./enums */ 15);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation2b() {\n this.options = {\n count: 1,\n maxCount: 1000,\n speed: 4\n };\n\n this.container = document.getElementById('animation2b');\n this.particles = [];\n this.grid = createGlobalGrid(this.container, this.bounds);\n\n var controls = new _controls2.default(document.getElementById('controls2b'), 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\nAnimation2b.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.SPEED:\n this.updateSpeed(value);break;\n }\n};\n\nAnimation2b.prototype.nextFrame = function () {\n this.particles.forEach(function (p) {\n return p.nextFrame();\n });\n};\n\nAnimation2b.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\nAnimation2b.prototype.updateCount = function (count) {\n var bounds = this.container.getBoundingClientRect();\n\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, bounds, this.options, this.grid);\n this.particles.push(p);\n }\n};\n\nAnimation2b.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 = new _grid2.default();\n\n for (var i = 0; i < 2; i++) {\n var w = _random2.default.num(50, 200);\n var h = _random2.default.num(50, 200);\n\n grid.setArea({\n x: _random2.default.num(0, bounds.width - w),\n y: _random2.default.num(0, bounds.height - h),\n w: w,\n h: h,\n type: _enums.ENTITIES.HAZARD\n }, this.container);\n }\n\n return grid;\n}\n\nexports.default = Animation2b;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYW5pbWF0aW9uMmIuanM/NWYyMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gJy4vcGFydGljbGUnO1xuaW1wb3J0IEdyaWQgZnJvbSAnLi9ncmlkJztcbmltcG9ydCBDb250cm9scyBmcm9tICcuL2NvbnRyb2xzJztcbmltcG9ydCBSYW5kb20gZnJvbSAnLi9yYW5kb20nO1xuaW1wb3J0IHsgQ09OVFJPTFMsIEVOVElUSUVTIH0gZnJvbSAnLi9lbnVtcyc7XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbjJiKCkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgY291bnQ6IDEsXG4gICAgICAgIG1heENvdW50OiAxMDAwLFxuICAgICAgICBzcGVlZDogNFxuICAgIH07XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbmltYXRpb24yYicpO1xuICAgIHRoaXMucGFydGljbGVzID0gW107XG4gICAgdGhpcy5ncmlkID0gY3JlYXRlR2xvYmFsR3JpZCh0aGlzLmNvbnRhaW5lciwgdGhpcy5ib3VuZHMpO1xuXG4gICAgY29uc3QgY29udHJvbHMgPSBuZXcgQ29udHJvbHMoXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250cm9sczJiJyksXG4gICAgICAgIHRoaXMub3B0aW9uc1xuICAgICk7XG5cbiAgICBjb250cm9scy5tb3VudCgpLnN1YnNjcmliZSh0aGlzLnN1YnNjcmliZXIuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLnVwZGF0ZUFuaW1hdGluZyh0aGlzLm9wdGlvbnMuYW5pbWF0aW5nKTtcbiAgICB0aGlzLnVwZGF0ZUNvdW50KHRoaXMub3B0aW9ucy5jb3VudCk7XG59O1xuXG5BbmltYXRpb24yYi5wcm90b3R5cGUuc3Vic2NyaWJlciA9IGZ1bmN0aW9uKHsga2V5LCB2YWx1ZSB9KSB7XG4gICAgc3dpdGNoKGtleSkge1xuICAgICAgICBjYXNlIENPTlRST0xTLkFOSU1BVElORzogdGhpcy51cGRhdGVBbmltYXRpbmcodmFsdWUpOyBicmVhaztcbiAgICAgICAgY2FzZSBDT05UUk9MUy5DT1VOVDogdGhpcy51cGRhdGVDb3VudCh2YWx1ZSk7IGJyZWFrO1xuICAgICAgICBjYXNlIENPTlRST0xTLlNQRUVEOiB0aGlzLnVwZGF0ZVNwZWVkKHZhbHVlKTsgYnJlYWs7XG4gICAgfVxufVxuXG5BbmltYXRpb24yYi5wcm90b3R5cGUubmV4dEZyYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAubmV4dEZyYW1lKCkpO1xufVxuXG5BbmltYXRpb24yYi5wcm90b3R5cGUudXBkYXRlQW5pbWF0aW5nID0gZnVuY3Rpb24oaXNBbmltYXRpbmcpIHtcbiAgICB0aGlzLm9wdGlvbnMuYW5pbWF0aW5nID0gaXNBbmltYXRpbmc7XG5cbiAgICBpZiAoaXNBbmltYXRpbmcpIHtcbiAgICAgICAgY29uc3QgZnBzJCA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCAvIDMyKVxuICAgICAgICAgICAgLnRha2VXaGlsZShfID0+IHRoaXMub3B0aW9ucy5hbmltYXRpbmcpO1xuXG4gICAgICAgIGZwcyQuc3Vic2NyaWJlKHRoaXMubmV4dEZyYW1lLmJpbmQodGhpcykpO1xuICAgIH1cbn1cblxuQW5pbWF0aW9uMmIucHJvdG90eXBlLnVwZGF0ZUNvdW50ID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHdoaWxlICh0aGlzLnBhcnRpY2xlcy5sZW5ndGggPiBjb3VudCkge1xuICAgICAgICBkZWxldGUgdGhpcy5wYXJ0aWNsZXMucG9wKCkucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRoaXMucGFydGljbGVzLmxlbmd0aCA8IGNvdW50KSB7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgUGFydGljbGUodGhpcy5jb250YWluZXIsIGJvdW5kcywgdGhpcy5vcHRpb25zLCB0aGlzLmdyaWQpO1xuICAgICAgICB0aGlzLnBhcnRpY2xlcy5wdXNoKHApO1xuICAgIH1cbn1cblxuQW5pbWF0aW9uMmIucHJvdG90eXBlLnVwZGF0ZVNwZWVkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB0aGlzLm9wdGlvbnMuc3BlZWQgPSB2YWx1ZTtcbiAgICB0aGlzLnBhcnRpY2xlcy5mb3JFYWNoKHAgPT4gcC51cGRhdGVDb25maWcoeyBzcGVlZDogdmFsdWUgfSkpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVHbG9iYWxHcmlkKGNvbnRhaW5lciwgYm91bmRzKSB7XG4gICAgY29uc3QgZ3JpZCA9IG5ldyBHcmlkKCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkrKykge1xuICAgICAgICBjb25zdCB3ID0gUmFuZG9tLm51bSg1MCwgMjAwKTtcbiAgICAgICAgY29uc3QgaCA9IFJhbmRvbS5udW0oNTAsIDIwMCk7XG5cbiAgICAgICAgZ3JpZC5zZXRBcmVhKHtcbiAgICAgICAgICAgIHg6IFJhbmRvbS5udW0oMCwgYm91bmRzLndpZHRoIC0gdyksXG4gICAgICAgICAgICB5OiBSYW5kb20ubnVtKDAsIGJvdW5kcy5oZWlnaHQgLSBoKSxcbiAgICAgICAgICAgIHcsXG4gICAgICAgICAgICBoLFxuICAgICAgICAgICAgdHlwZTogRU5USVRJRVMuSEFaQVJEXG4gICAgICAgIH0sIHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQW5pbWF0aW9uMmI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8ganMvYW5pbWF0aW9uMmIuanMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ=="); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 13);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _particle = __webpack_require__(/*! ./particle */ 19);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _grid = __webpack_require__(/*! ./grid */ 359);\n\nvar _grid2 = _interopRequireDefault(_grid);\n\nvar _controls = __webpack_require__(/*! ./controls */ 16);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _random = __webpack_require__(/*! ./random */ 361);\n\nvar _random2 = _interopRequireDefault(_random);\n\nvar _enums = __webpack_require__(/*! ./enums */ 15);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation2b() {\n this.options = {\n count: 1,\n maxCount: 1000,\n speed: 4\n };\n\n this.container = document.getElementById('animation2b');\n this.particles = [];\n this.grid = this.createGlobalGrid(this.container, this.bounds);\n\n var controls = new _controls2.default(document.getElementById('controls2b'), 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\nAnimation2b.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.SPEED:\n this.updateSpeed(value);break;\n }\n};\n\nAnimation2b.prototype.nextFrame = function () {\n this.particles.forEach(function (p) {\n return p.nextFrame();\n });\n};\n\nAnimation2b.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\nAnimation2b.prototype.updateCount = function (count) {\n var bounds = this.container.getBoundingClientRect();\n\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, bounds, this.options, this.grid);\n this.particles.push(p);\n }\n};\n\nAnimation2b.prototype.updateSpeed = function (value) {\n this.options.speed = value;\n this.particles.forEach(function (p) {\n return p.updateConfig({ speed: value });\n });\n};\n\nAnimation2b.prototype.createGlobalGrid = function () {\n var bounds = this.container.getBoundingClientRect();\n var grid = new _grid2.default();\n\n var n = _random2.default.num(1, 3);\n for (var i = 0; i < n; i++) {\n var w = _random2.default.num(50, 200);\n var h = _random2.default.num(50, 200);\n\n grid.setArea({\n x: _random2.default.num(0, bounds.width - w),\n y: _random2.default.num(0, bounds.height - h),\n w: w,\n h: h,\n type: _enums.ENTITIES.HAZARD\n }, this.container);\n }\n\n return grid;\n};\n\nexports.default = Animation2b;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYW5pbWF0aW9uMmIuanM/NWYyMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gJy4vcGFydGljbGUnO1xuaW1wb3J0IEdyaWQgZnJvbSAnLi9ncmlkJztcbmltcG9ydCBDb250cm9scyBmcm9tICcuL2NvbnRyb2xzJztcbmltcG9ydCBSYW5kb20gZnJvbSAnLi9yYW5kb20nO1xuaW1wb3J0IHsgQ09OVFJPTFMsIEVOVElUSUVTIH0gZnJvbSAnLi9lbnVtcyc7XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbjJiKCkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgY291bnQ6IDEsXG4gICAgICAgIG1heENvdW50OiAxMDAwLFxuICAgICAgICBzcGVlZDogNFxuICAgIH07XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbmltYXRpb24yYicpO1xuICAgIHRoaXMucGFydGljbGVzID0gW107XG4gICAgdGhpcy5ncmlkID0gdGhpcy5jcmVhdGVHbG9iYWxHcmlkKHRoaXMuY29udGFpbmVyLCB0aGlzLmJvdW5kcyk7XG5cbiAgICBjb25zdCBjb250cm9scyA9IG5ldyBDb250cm9scyhcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRyb2xzMmInKSxcbiAgICAgICAgdGhpcy5vcHRpb25zXG4gICAgKTtcblxuICAgIGNvbnRyb2xzLm1vdW50KCkuc3Vic2NyaWJlKHRoaXMuc3Vic2NyaWJlci5iaW5kKHRoaXMpKTtcblxuICAgIHRoaXMudXBkYXRlQW5pbWF0aW5nKHRoaXMub3B0aW9ucy5hbmltYXRpbmcpO1xuICAgIHRoaXMudXBkYXRlQ291bnQodGhpcy5vcHRpb25zLmNvdW50KTtcbn07XG5cbkFuaW1hdGlvbjJiLnByb3RvdHlwZS5zdWJzY3JpYmVyID0gZnVuY3Rpb24oeyBrZXksIHZhbHVlIH0pIHtcbiAgICBzd2l0Y2goa2V5KSB7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuQU5JTUFUSU5HOiB0aGlzLnVwZGF0ZUFuaW1hdGluZyh2YWx1ZSk7IGJyZWFrO1xuICAgICAgICBjYXNlIENPTlRST0xTLkNPVU5UOiB0aGlzLnVwZGF0ZUNvdW50KHZhbHVlKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuU1BFRUQ6IHRoaXMudXBkYXRlU3BlZWQodmFsdWUpOyBicmVhaztcbiAgICB9XG59XG5cbkFuaW1hdGlvbjJiLnByb3RvdHlwZS5uZXh0RnJhbWUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnBhcnRpY2xlcy5mb3JFYWNoKHAgPT4gcC5uZXh0RnJhbWUoKSk7XG59XG5cbkFuaW1hdGlvbjJiLnByb3RvdHlwZS51cGRhdGVBbmltYXRpbmcgPSBmdW5jdGlvbihpc0FuaW1hdGluZykge1xuICAgIHRoaXMub3B0aW9ucy5hbmltYXRpbmcgPSBpc0FuaW1hdGluZztcblxuICAgIGlmIChpc0FuaW1hdGluZykge1xuICAgICAgICBjb25zdCBmcHMkID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwIC8gMzIpXG4gICAgICAgICAgICAudGFrZVdoaWxlKF8gPT4gdGhpcy5vcHRpb25zLmFuaW1hdGluZyk7XG5cbiAgICAgICAgZnBzJC5zdWJzY3JpYmUodGhpcy5uZXh0RnJhbWUuYmluZCh0aGlzKSk7XG4gICAgfVxufVxuXG5BbmltYXRpb24yYi5wcm90b3R5cGUudXBkYXRlQ291bnQgPSBmdW5jdGlvbihjb3VudCkge1xuICAgIGNvbnN0IGJvdW5kcyA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgd2hpbGUgKHRoaXMucGFydGljbGVzLmxlbmd0aCA+IGNvdW50KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnBhcnRpY2xlcy5wb3AoKS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoIDwgY291bnQpIHtcbiAgICAgICAgY29uc3QgcCA9IG5ldyBQYXJ0aWNsZSh0aGlzLmNvbnRhaW5lciwgYm91bmRzLCB0aGlzLm9wdGlvbnMsIHRoaXMuZ3JpZCk7XG4gICAgICAgIHRoaXMucGFydGljbGVzLnB1c2gocCk7XG4gICAgfVxufVxuXG5BbmltYXRpb24yYi5wcm90b3R5cGUudXBkYXRlU3BlZWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHRoaXMub3B0aW9ucy5zcGVlZCA9IHZhbHVlO1xuICAgIHRoaXMucGFydGljbGVzLmZvckVhY2gocCA9PiBwLnVwZGF0ZUNvbmZpZyh7IHNwZWVkOiB2YWx1ZSB9KSk7XG59XG5cbkFuaW1hdGlvbjJiLnByb3RvdHlwZS5jcmVhdGVHbG9iYWxHcmlkID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZ3JpZCA9IG5ldyBHcmlkKCk7XG5cbiAgICBjb25zdCBuID0gUmFuZG9tLm51bSgxLCAzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCB3ID0gUmFuZG9tLm51bSg1MCwgMjAwKTtcbiAgICAgICAgY29uc3QgaCA9IFJhbmRvbS5udW0oNTAsIDIwMCk7XG5cbiAgICAgICAgZ3JpZC5zZXRBcmVhKHtcbiAgICAgICAgICAgIHg6IFJhbmRvbS5udW0oMCwgYm91bmRzLndpZHRoIC0gdyksXG4gICAgICAgICAgICB5OiBSYW5kb20ubnVtKDAsIGJvdW5kcy5oZWlnaHQgLSBoKSxcbiAgICAgICAgICAgIHcsXG4gICAgICAgICAgICBoLFxuICAgICAgICAgICAgdHlwZTogRU5USVRJRVMuSEFaQVJEXG4gICAgICAgIH0sIHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQW5pbWF0aW9uMmI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8ganMvYW5pbWF0aW9uMmIuanMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); + +/***/ }), +/* 77 */ +/* unknown exports provided */ +/* all exports used */ +/*!***************************!*\ + !*** ./js/animation3a.js ***! + \***************************/ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 13);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _grid = __webpack_require__(/*! ./grid */ 359);\n\nvar _grid2 = _interopRequireDefault(_grid);\n\nvar _particle = __webpack_require__(/*! ./particle */ 19);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _controls = __webpack_require__(/*! ./controls */ 16);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _enums = __webpack_require__(/*! ./enums */ 15);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation3a() {\n this.options = {\n count: 400,\n maxCount: 1000,\n showVisionGrid: false,\n speed: 4\n };\n\n this.container = document.getElementById('animation3a');\n this.particles = [];\n this.grid = new _grid2.default();\n\n var controls = new _controls2.default(document.getElementById('controls3a'), this.options);\n\n controls.mount().subscribe(this.subscriber.bind(this));\n\n this.updateCount(this.options.count);\n};\n\nAnimation3a.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.SPEED:\n this.updateSpeed(value);break;\n }\n};\n\nAnimation3a.prototype.nextFrame = function () {\n var _this = this;\n\n this.particles.forEach(function (p) {\n var prevX = p.arc.endX;\n var prevY = p.arc.endY;\n\n p.nextFrame();\n\n _this.grid.deletePoint({ x: prevX, y: prevY, type: _enums.ENTITIES.PARTICLE });\n _this.grid.setPoint({ x: p.arc.endX, y: p.arc.endY, type: _enums.ENTITIES.PARTICLE }, p);\n });\n};\n\nAnimation3a.prototype.updateAnimating = function (isAnimating) {\n var _this2 = this;\n\n this.options.animating = isAnimating;\n\n if (isAnimating) {\n var fps$ = _rxjs2.default.Observable.interval(1000 / 32).takeWhile(function (_) {\n return _this2.options.animating;\n });\n\n fps$.subscribe(this.nextFrame.bind(this));\n }\n};\n\nAnimation3a.prototype.updateCount = function (count) {\n var bounds = this.container.getBoundingClientRect();\n\n while (this.particles.length > count) {\n var p = this.particles.pop();\n this.grid.deletePoint({ x: p.arc.endX, y: p.arc.endY, type: _enums.ENTITIES.PARTICLE });\n p.remove();\n }\n\n while (this.particles.length < count) {\n var _p = new _particle2.default(this.container, bounds, this.options, this.grid);\n this.grid.setPoint({ x: _p.arc.endX, y: _p.arc.endY, type: _enums.ENTITIES.PARTICLE }, _p);\n this.particles.push(_p);\n }\n};\n\nAnimation3a.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 = Animation3a;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYW5pbWF0aW9uM2EuanM/YzA5NyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IEdyaWQgZnJvbSAnLi9ncmlkJztcbmltcG9ydCBQYXJ0aWNsZSBmcm9tICcuL3BhcnRpY2xlJztcbmltcG9ydCBDb250cm9scyBmcm9tICcuL2NvbnRyb2xzJztcbmltcG9ydCB7IENPTlRST0xTLCBFTlRJVElFUyB9IGZyb20gJy4vZW51bXMnO1xuXG5mdW5jdGlvbiBBbmltYXRpb24zYSgpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgIGNvdW50OiA0MDAsXG4gICAgICAgIG1heENvdW50OiAxMDAwLFxuICAgICAgICBzaG93VmlzaW9uR3JpZDogZmFsc2UsXG4gICAgICAgIHNwZWVkOiA0XG4gICAgfTtcblxuICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FuaW1hdGlvbjNhJyk7XG4gICAgdGhpcy5wYXJ0aWNsZXMgPSBbXTtcbiAgICB0aGlzLmdyaWQgPSBuZXcgR3JpZCgpO1xuXG4gICAgY29uc3QgY29udHJvbHMgPSBuZXcgQ29udHJvbHMoXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250cm9sczNhJyksXG4gICAgICAgIHRoaXMub3B0aW9uc1xuICAgICk7XG5cbiAgICBjb250cm9scy5tb3VudCgpLnN1YnNjcmliZSh0aGlzLnN1YnNjcmliZXIuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLnVwZGF0ZUNvdW50KHRoaXMub3B0aW9ucy5jb3VudCk7XG59O1xuXG5BbmltYXRpb24zYS5wcm90b3R5cGUuc3Vic2NyaWJlciA9IGZ1bmN0aW9uKHsga2V5LCB2YWx1ZSB9KSB7XG4gICAgc3dpdGNoKGtleSkge1xuICAgICAgICBjYXNlIENPTlRST0xTLkFOSU1BVElORzogdGhpcy51cGRhdGVBbmltYXRpbmcodmFsdWUpOyBicmVhaztcbiAgICAgICAgY2FzZSBDT05UUk9MUy5DT1VOVDogdGhpcy51cGRhdGVDb3VudCh2YWx1ZSk7IGJyZWFrO1xuICAgICAgICBjYXNlIENPTlRST0xTLlNQRUVEOiB0aGlzLnVwZGF0ZVNwZWVkKHZhbHVlKTsgYnJlYWs7XG4gICAgfVxufVxuXG5BbmltYXRpb24zYS5wcm90b3R5cGUubmV4dEZyYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHtcbiAgICAgICAgY29uc3QgcHJldlggPSBwLmFyYy5lbmRYO1xuICAgICAgICBjb25zdCBwcmV2WSA9IHAuYXJjLmVuZFk7XG5cbiAgICAgICAgcC5uZXh0RnJhbWUoKTtcblxuICAgICAgICB0aGlzLmdyaWQuZGVsZXRlUG9pbnQoeyB4OiBwcmV2WCwgeTogcHJldlksIHR5cGU6IEVOVElUSUVTLlBBUlRJQ0xFIH0pO1xuICAgICAgICB0aGlzLmdyaWQuc2V0UG9pbnQoeyB4OiBwLmFyYy5lbmRYLCB5OiBwLmFyYy5lbmRZLCB0eXBlOiBFTlRJVElFUy5QQVJUSUNMRSB9LCBwKTtcbiAgICB9KTtcbn1cblxuQW5pbWF0aW9uM2EucHJvdG90eXBlLnVwZGF0ZUFuaW1hdGluZyA9IGZ1bmN0aW9uKGlzQW5pbWF0aW5nKSB7XG4gICAgdGhpcy5vcHRpb25zLmFuaW1hdGluZyA9IGlzQW5pbWF0aW5nO1xuXG4gICAgaWYgKGlzQW5pbWF0aW5nKSB7XG4gICAgICAgIGNvbnN0IGZwcyQgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDAgLyAzMilcbiAgICAgICAgICAgIC50YWtlV2hpbGUoXyA9PiB0aGlzLm9wdGlvbnMuYW5pbWF0aW5nKTtcblxuICAgICAgICBmcHMkLnN1YnNjcmliZSh0aGlzLm5leHRGcmFtZS5iaW5kKHRoaXMpKTtcbiAgICB9XG59XG5cbkFuaW1hdGlvbjNhLnByb3RvdHlwZS51cGRhdGVDb3VudCA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoID4gY291bnQpIHtcbiAgICAgICAgY29uc3QgcCA9IHRoaXMucGFydGljbGVzLnBvcCgpO1xuICAgICAgICB0aGlzLmdyaWQuZGVsZXRlUG9pbnQoeyB4OiBwLmFyYy5lbmRYLCB5OiBwLmFyYy5lbmRZLCB0eXBlOiBFTlRJVElFUy5QQVJUSUNMRSB9KTtcbiAgICAgICAgcC5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoIDwgY291bnQpIHtcbiAgICAgICAgY29uc3QgcCA9IG5ldyBQYXJ0aWNsZSh0aGlzLmNvbnRhaW5lciwgYm91bmRzLCB0aGlzLm9wdGlvbnMsIHRoaXMuZ3JpZCk7XG4gICAgICAgIHRoaXMuZ3JpZC5zZXRQb2ludCh7IHg6IHAuYXJjLmVuZFgsIHk6IHAuYXJjLmVuZFksIHR5cGU6IEVOVElUSUVTLlBBUlRJQ0xFIH0sIHApO1xuICAgICAgICB0aGlzLnBhcnRpY2xlcy5wdXNoKHApO1xuICAgIH1cbn1cblxuQW5pbWF0aW9uM2EucHJvdG90eXBlLnVwZGF0ZVNwZWVkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB0aGlzLm9wdGlvbnMuc3BlZWQgPSB2YWx1ZTtcbiAgICB0aGlzLnBhcnRpY2xlcy5mb3JFYWNoKHAgPT4gcC51cGRhdGVDb25maWcoeyBzcGVlZDogdmFsdWUgfSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBbmltYXRpb24zYTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBqcy9hbmltYXRpb24zYS5qcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); /***/ }), -/* 77 */, /* 78 */ /* unknown exports provided */ /* all exports used */ @@ -1010,7 +1043,7 @@ eval("// removed by extract-text-webpack-plugin//# sourceMappingURL=data:applica /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 13);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _controls = __webpack_require__(/*! ./controls */ 16);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _animation2a = __webpack_require__(/*! ./animation2a */ 75);\n\nvar _animation2a2 = _interopRequireDefault(_animation2a);\n\nvar _animation2b = __webpack_require__(/*! ./animation2b */ 76);\n\nvar _animation2b2 = _interopRequireDefault(_animation2b);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// import Animation3a from './animation3a';\n\n// import Animation1a from './animation1a';\n// import Animation1b from './animation1b';\n__webpack_require__(/*! ../css/reset.scss */ 81);\n__webpack_require__(/*! ../css/index.scss */ 79);\n__webpack_require__(/*! ../css/particle.scss */ 80);\n__webpack_require__(/*! ../css/controls.scss */ 78);\n\nwindow.addEventListener('load', function () {\n // new Animation1a();\n // new Animation1b();\n new _animation2a2.default();\n new _animation2b2.default();\n // new Animation3a();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvaW5kZXguanM/NDJmNiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IENvbnRyb2xzIGZyb20gJy4vY29udHJvbHMnO1xuLy8gaW1wb3J0IEFuaW1hdGlvbjFhIGZyb20gJy4vYW5pbWF0aW9uMWEnO1xuLy8gaW1wb3J0IEFuaW1hdGlvbjFiIGZyb20gJy4vYW5pbWF0aW9uMWInO1xuaW1wb3J0IEFuaW1hdGlvbjJhIGZyb20gJy4vYW5pbWF0aW9uMmEnO1xuaW1wb3J0IEFuaW1hdGlvbjJiIGZyb20gJy4vYW5pbWF0aW9uMmInO1xuLy8gaW1wb3J0IEFuaW1hdGlvbjNhIGZyb20gJy4vYW5pbWF0aW9uM2EnO1xuXG5yZXF1aXJlKCcuLi9jc3MvcmVzZXQuc2NzcycpO1xucmVxdWlyZSgnLi4vY3NzL2luZGV4LnNjc3MnKTtcbnJlcXVpcmUoJy4uL2Nzcy9wYXJ0aWNsZS5zY3NzJyk7XG5yZXF1aXJlKCcuLi9jc3MvY29udHJvbHMuc2NzcycpO1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAvLyBuZXcgQW5pbWF0aW9uMWEoKTtcbiAgICAvLyBuZXcgQW5pbWF0aW9uMWIoKTtcbiAgICBuZXcgQW5pbWF0aW9uMmEoKTtcbiAgICBuZXcgQW5pbWF0aW9uMmIoKTtcbiAgICAvLyBuZXcgQW5pbWF0aW9uM2EoKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGpzL2luZGV4LmpzIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7OztBQUFBO0FBQ0E7Ozs7O0FBQUE7QUFDQTtBQUxBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); +eval("\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 13);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _controls = __webpack_require__(/*! ./controls */ 16);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _animation1a = __webpack_require__(/*! ./animation1a */ 73);\n\nvar _animation1a2 = _interopRequireDefault(_animation1a);\n\nvar _animation1b = __webpack_require__(/*! ./animation1b */ 74);\n\nvar _animation1b2 = _interopRequireDefault(_animation1b);\n\nvar _animation2a = __webpack_require__(/*! ./animation2a */ 75);\n\nvar _animation2a2 = _interopRequireDefault(_animation2a);\n\nvar _animation2b = __webpack_require__(/*! ./animation2b */ 76);\n\nvar _animation2b2 = _interopRequireDefault(_animation2b);\n\nvar _animation3a = __webpack_require__(/*! ./animation3a */ 77);\n\nvar _animation3a2 = _interopRequireDefault(_animation3a);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n__webpack_require__(/*! ../css/reset.scss */ 81);\n__webpack_require__(/*! ../css/index.scss */ 79);\n__webpack_require__(/*! ../css/particle.scss */ 80);\n__webpack_require__(/*! ../css/controls.scss */ 78);\n\nwindow.addEventListener('load', function () {\n new _animation1a2.default();\n // new Animation1b();\n // new Animation2a();\n // new Animation2b();\n // new Animation3a();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvaW5kZXguanM/NDJmNiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IENvbnRyb2xzIGZyb20gJy4vY29udHJvbHMnO1xuaW1wb3J0IEFuaW1hdGlvbjFhIGZyb20gJy4vYW5pbWF0aW9uMWEnO1xuaW1wb3J0IEFuaW1hdGlvbjFiIGZyb20gJy4vYW5pbWF0aW9uMWInO1xuaW1wb3J0IEFuaW1hdGlvbjJhIGZyb20gJy4vYW5pbWF0aW9uMmEnO1xuaW1wb3J0IEFuaW1hdGlvbjJiIGZyb20gJy4vYW5pbWF0aW9uMmInO1xuaW1wb3J0IEFuaW1hdGlvbjNhIGZyb20gJy4vYW5pbWF0aW9uM2EnO1xuXG5yZXF1aXJlKCcuLi9jc3MvcmVzZXQuc2NzcycpO1xucmVxdWlyZSgnLi4vY3NzL2luZGV4LnNjc3MnKTtcbnJlcXVpcmUoJy4uL2Nzcy9wYXJ0aWNsZS5zY3NzJyk7XG5yZXF1aXJlKCcuLi9jc3MvY29udHJvbHMuc2NzcycpO1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICBuZXcgQW5pbWF0aW9uMWEoKTtcbiAgICAvLyBuZXcgQW5pbWF0aW9uMWIoKTtcbiAgICAvLyBuZXcgQW5pbWF0aW9uMmEoKTtcbiAgICAvLyBuZXcgQW5pbWF0aW9uMmIoKTtcbiAgICAvLyBuZXcgQW5pbWF0aW9uM2EoKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGpzL2luZGV4LmpzIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7OztBQUFBO0FBQ0E7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9"); /***/ }), /* 83 */ @@ -4344,7 +4377,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 _enums = __webpack_require__(/*! ./enums */ 15);\n\nvar _random = __webpack_require__(/*! ./random */ 361);\n\nvar _random2 = _interopRequireDefault(_random);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Arc = {\n create: function create(bounds, grid) {\n var arc = {\n centerX: _random2.default.num(0, bounds.width),\n centerY: _random2.default.num(0, bounds.height),\n clockwise: _random2.default.bool(),\n endX: 0,\n endY: 0,\n length: _random2.default.num(_enums.RAD.t90, _enums.RAD.t360),\n radius: _random2.default.num(100, 200),\n theta: _random2.default.num(_enums.RAD.t90, _enums.RAD.t360)\n };\n\n arc.cosTheta = Math.cos(arc.theta);\n arc.sinTheta = Math.sin(arc.theta);\n\n arc.endX = arc.centerX + arc.radius * arc.cosTheta;\n arc.endY = arc.centerY - arc.radius * arc.sinTheta;\n\n arc = Arc.overflow(arc, bounds);\n\n // If starting in a hazard, recurse.\n if (grid.getPoint({ x: arc.endX, y: arc.endY, type: _enums.ENTITIES.HAZARD })) {\n arc = Arc.create(bounds, grid);\n }\n\n return arc;\n },\n\n step: function step(arc, bounds, speed) {\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.cosTheta = Math.cos(arc.theta);\n arc.sinTheta = Math.sin(arc.theta);\n\n arc.endX = arc.centerX + arc.radius * arc.cosTheta;\n arc.endY = arc.centerY - arc.radius * arc.sinTheta;\n\n // Overflow.\n arc = Arc.overflow(arc, bounds);\n\n return arc;\n },\n\n randomize: function randomize(arc) {\n arc.length = _random2.default.num(_enums.RAD.t90, _enums.RAD.t360);\n\n arc = Arc.changeRadius(arc, _random2.default.num(100, 200));\n\n if (_random2.default.bool(0.8)) {\n arc = Arc.reverse(arc);\n }\n\n return arc;\n },\n\n overflow: function overflow(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\n changeRadius: function changeRadius(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) * arc.cosTheta;\n arc.centerY += (r1 - r0) * arc.sinTheta;\n arc.radius = r1;\n\n return arc;\n },\n\n reverse: function reverse(arc) {\n arc.clockwise = !arc.clockwise;\n\n arc.theta = (arc.theta + _enums.RAD.t180) % _enums.RAD.t360;\n\n arc.cosTheta = Math.cos(arc.theta);\n arc.sinTheta = Math.sin(arc.theta);\n\n arc.centerX -= 2 * arc.radius * arc.cosTheta;\n arc.centerY += 2 * arc.radius * arc.sinTheta;\n\n return arc;\n },\n\n follow: function follow(arc, arcToFollow) {\n if (arc.clockwise !== arcToFollow.clockwise) {\n arc = Arc.reverse(arc);\n }\n\n if (Math.abs(arc.theta - arcToFollow.theta) > 0.2) {\n arc = Arc.changeRadius(arc, 50);\n } else {\n arc = Arc.changeRadius(arc, arcToFollow.radius);\n }\n\n return arc;\n },\n\n evade: function evade(arc) {\n arc = Arc.changeRadius(arc, 20);\n arc.length = 1;\n\n return arc;\n }\n};\n\nexports.default = Arc;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL2pzL2FyYy5qcz85YjVmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVOVElUSUVTLCBSQUQgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCBSYW5kb20gZnJvbSAnLi9yYW5kb20nO1xuXG5jb25zdCBBcmMgPSB7XG4gICAgY3JlYXRlOiBmdW5jdGlvbihib3VuZHMsIGdyaWQpIHtcbiAgICAgICAgbGV0IGFyYyA9IHtcbiAgICAgICAgICAgIGNlbnRlclg6IFJhbmRvbS5udW0oMCwgYm91bmRzLndpZHRoKSxcbiAgICAgICAgICAgIGNlbnRlclk6IFJhbmRvbS5udW0oMCwgYm91bmRzLmhlaWdodCksXG4gICAgICAgICAgICBjbG9ja3dpc2U6IFJhbmRvbS5ib29sKCksXG4gICAgICAgICAgICBlbmRYOiAwLFxuICAgICAgICAgICAgZW5kWTogMCxcbiAgICAgICAgICAgIGxlbmd0aDogUmFuZG9tLm51bShSQUQudDkwLCBSQUQudDM2MCksXG4gICAgICAgICAgICByYWRpdXM6IFJhbmRvbS5udW0oMTAwLCAyMDApLFxuICAgICAgICAgICAgdGhldGE6IFJhbmRvbS5udW0oUkFELnQ5MCwgUkFELnQzNjApXG4gICAgICAgIH07XG5cbiAgICAgICAgYXJjLmNvc1RoZXRhID0gTWF0aC5jb3MoYXJjLnRoZXRhKTtcbiAgICAgICAgYXJjLnNpblRoZXRhID0gTWF0aC5zaW4oYXJjLnRoZXRhKTtcblxuICAgICAgICBhcmMuZW5kWCA9IGFyYy5jZW50ZXJYICsgYXJjLnJhZGl1cyAqIGFyYy5jb3NUaGV0YTtcbiAgICAgICAgYXJjLmVuZFkgPSBhcmMuY2VudGVyWSAtIGFyYy5yYWRpdXMgKiBhcmMuc2luVGhldGE7XG5cbiAgICAgICAgYXJjID0gQXJjLm92ZXJmbG93KGFyYywgYm91bmRzKTtcblxuICAgICAgICAvLyBJZiBzdGFydGluZyBpbiBhIGhhemFyZCwgcmVjdXJzZS5cbiAgICAgICAgaWYgKGdyaWQuZ2V0UG9pbnQoeyB4OiBhcmMuZW5kWCwgeTogYXJjLmVuZFksIHR5cGU6IEVOVElUSUVTLkhBWkFSRCB9KSkge1xuICAgICAgICAgICAgYXJjID0gQXJjLmNyZWF0ZShib3VuZHMsIGdyaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFyYztcbiAgICB9LFxuXG4gICAgc3RlcDogZnVuY3Rpb24oYXJjLCBib3VuZHMsIHNwZWVkKSB7XG4gICAgICAgIC8vIEVuc3VyZSBjb25zdGFudCB2ZWxvY2l0eSBhbmQgdGhldGEgYmV0d2VlbiAwIGFuZCAyz4AuXG4gICAgICAgIGNvbnN0IGRlbHRhID0gc3BlZWQgLyBhcmMucmFkaXVzO1xuICAgICAgICBhcmMubGVuZ3RoIC09IGRlbHRhO1xuXG4gICAgICAgIGFyYy50aGV0YSArPSAoYXJjLmNsb2Nrd2lzZSA/IC1kZWx0YSA6ICtkZWx0YSk7XG4gICAgICAgIGFyYy50aGV0YSA9IChhcmMudGhldGEgPiAwID8gYXJjLnRoZXRhICUgUkFELnQzNjAgOiBSQUQudDM2MCArIGFyYy50aGV0YSk7XG5cbiAgICAgICAgYXJjLmNvc1RoZXRhID0gTWF0aC5jb3MoYXJjLnRoZXRhKTtcbiAgICAgICAgYXJjLnNpblRoZXRhID0gTWF0aC5zaW4oYXJjLnRoZXRhKTtcblxuICAgICAgICBhcmMuZW5kWCA9IGFyYy5jZW50ZXJYICsgYXJjLnJhZGl1cyAqIGFyYy5jb3NUaGV0YTtcbiAgICAgICAgYXJjLmVuZFkgPSBhcmMuY2VudGVyWSAtIGFyYy5yYWRpdXMgKiBhcmMuc2luVGhldGE7XG5cbiAgICAgICAgLy8gT3ZlcmZsb3cuXG4gICAgICAgIGFyYyA9IEFyYy5vdmVyZmxvdyhhcmMsIGJvdW5kcyk7XG5cbiAgICAgICAgcmV0dXJuIGFyYztcbiAgICB9LFxuXG4gICAgcmFuZG9taXplOiBmdW5jdGlvbihhcmMpIHtcbiAgICAgICAgYXJjLmxlbmd0aCA9IFJhbmRvbS5udW0oUkFELnQ5MCwgUkFELnQzNjApO1xuXG4gICAgICAgIGFyYyA9IEFyYy5jaGFuZ2VSYWRpdXMoYXJjLCBSYW5kb20ubnVtKDEwMCwgMjAwKSk7XG5cbiAgICAgICAgaWYgKFJhbmRvbS5ib29sKDAuOCkpIHtcbiAgICAgICAgICAgIGFyYyA9IEFyYy5yZXZlcnNlKGFyYyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJjO1xuICAgIH0sXG5cbiAgICBvdmVyZmxvdzogZnVuY3Rpb24oYXJjLCBib3VuZHMpIHtcbiAgICAgICAgaWYgKGFyYy5lbmRYIDwgMCkge1xuICAgICAgICAgICAgYXJjLmVuZFggKz0gYm91bmRzLndpZHRoO1xuICAgICAgICAgICAgYXJjLmNlbnRlclggKz0gYm91bmRzLndpZHRoXG4gICAgICAgIH0gZWxzZSBpZiAoYXJjLmVuZFggPiBib3VuZHMud2lkdGgpIHtcbiAgICAgICAgICAgIGFyYy5lbmRYIC09IGJvdW5kcy53aWR0aDtcbiAgICAgICAgICAgIGFyYy5jZW50ZXJYIC09IGJvdW5kcy53aWR0aFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyYy5lbmRZIDwgMCkge1xuICAgICAgICAgICAgYXJjLmVuZFkgKz0gYm91bmRzLmhlaWdodDtcbiAgICAgICAgICAgIGFyYy5jZW50ZXJZICs9IGJvdW5kcy5oZWlnaHRcbiAgICAgICAgfSBlbHNlIGlmIChhcmMuZW5kWSA+IGJvdW5kcy5oZWlnaHQpIHtcbiAgICAgICAgICAgIGFyYy5lbmRZIC09IGJvdW5kcy5oZWlnaHQ7XG4gICAgICAgICAgICBhcmMuY2VudGVyWSAtPSBib3VuZHMuaGVpZ2h0XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJjO1xuICAgIH0sXG5cbiAgICBjaGFuZ2VSYWRpdXM6IGZ1bmN0aW9uKGFyYywgbmV3UmFkaXVzKSB7XG4gICAgICAgIGNvbnN0IHIwID0gYXJjLnJhZGl1cztcbiAgICAgICAgY29uc3QgcjEgPSBuZXdSYWRpdXM7XG5cbiAgICAgICAgLy8gTW92ZXMgYXJjIGNlbnRlciB0byBuZXcgcmFkaXVzIHdoaWxlIGtlZXBpbmcgdGhldGEgY29uc3RhbnQuXG4gICAgICAgIGFyYy5jZW50ZXJYIC09IChyMSAtIHIwKSAqIGFyYy5jb3NUaGV0YTtcbiAgICAgICAgYXJjLmNlbnRlclkgKz0gKHIxIC0gcjApICogYXJjLnNpblRoZXRhO1xuICAgICAgICBhcmMucmFkaXVzID0gcjE7XG5cbiAgICAgICAgcmV0dXJuIGFyYztcbiAgICB9LFxuXG4gICAgcmV2ZXJzZTogZnVuY3Rpb24oYXJjKSB7XG4gICAgICAgIGFyYy5jbG9ja3dpc2UgPSAhYXJjLmNsb2Nrd2lzZTtcblxuICAgICAgICBhcmMudGhldGEgPSAoYXJjLnRoZXRhICsgUkFELnQxODApICUgUkFELnQzNjA7XG5cbiAgICAgICAgYXJjLmNvc1RoZXRhID0gTWF0aC5jb3MoYXJjLnRoZXRhKTtcbiAgICAgICAgYXJjLnNpblRoZXRhID0gTWF0aC5zaW4oYXJjLnRoZXRhKTtcblxuICAgICAgICBhcmMuY2VudGVyWCAtPSAoMiAqIGFyYy5yYWRpdXMpICogYXJjLmNvc1RoZXRhO1xuICAgICAgICBhcmMuY2VudGVyWSArPSAoMiAqIGFyYy5yYWRpdXMpICogYXJjLnNpblRoZXRhO1xuXG4gICAgICAgIHJldHVybiBhcmM7XG4gICAgfSxcblxuICAgIGZvbGxvdzogZnVuY3Rpb24oYXJjLCBhcmNUb0ZvbGxvdykge1xuICAgICAgICBpZiAoYXJjLmNsb2Nrd2lzZSAhPT0gYXJjVG9Gb2xsb3cuY2xvY2t3aXNlKSB7XG4gICAgICAgICAgICBhcmMgPSBBcmMucmV2ZXJzZShhcmMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKGFyYy50aGV0YSAtIGFyY1RvRm9sbG93LnRoZXRhKSA+IDAuMikge1xuICAgICAgICAgICAgYXJjID0gQXJjLmNoYW5nZVJhZGl1cyhhcmMsIDUwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFyYyA9IEFyYy5jaGFuZ2VSYWRpdXMoYXJjLCBhcmNUb0ZvbGxvdy5yYWRpdXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFyYztcbiAgICB9LFxuXG4gICAgZXZhZGU6IGZ1bmN0aW9uKGFyYykge1xuICAgICAgICBhcmMgPSBBcmMuY2hhbmdlUmFkaXVzKGFyYywgMjApO1xuICAgICAgICBhcmMubGVuZ3RoID0gMTtcblxuICAgICAgICByZXR1cm4gYXJjO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXJjO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGpzL2FyYy5qcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUFBO0FBQ0E7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBQ0E7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE5SEE7QUFDQTtBQWdJQSIsInNvdXJjZVJvb3QiOiIifQ=="); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _enums = __webpack_require__(/*! ./enums */ 15);\n\nvar _random = __webpack_require__(/*! ./random */ 361);\n\nvar _random2 = _interopRequireDefault(_random);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Arc = {\n create: function create(bounds, grid) {\n var arc = {\n centerX: _random2.default.num(0, bounds.width),\n centerY: _random2.default.num(0, bounds.height),\n clockwise: _random2.default.bool(),\n endX: 0,\n endY: 0,\n length: _random2.default.num(_enums.RAD.t90, _enums.RAD.t360),\n prevEndX: 0,\n prevEndY: 0,\n radius: _random2.default.num(100, 200),\n theta: _random2.default.num(_enums.RAD.t90, _enums.RAD.t360)\n };\n\n arc.cosTheta = Math.cos(arc.theta);\n arc.sinTheta = Math.sin(arc.theta);\n\n arc.endX = arc.centerX + arc.radius * arc.cosTheta;\n arc.endY = arc.centerY - arc.radius * arc.sinTheta;\n\n arc = Arc.overflow(arc, bounds);\n\n // If starting in a hazard, recurse.\n if (grid.getPoint({ x: arc.endX, y: arc.endY, type: _enums.ENTITIES.HAZARD })) {\n arc = Arc.create(bounds, grid);\n }\n\n return arc;\n },\n\n step: function step(arc, bounds, speed) {\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.cosTheta = Math.cos(arc.theta);\n arc.sinTheta = Math.sin(arc.theta);\n\n arc.prevEndX = arc.endX;\n arc.prevEndY = arc.endY;\n\n arc.endX = arc.centerX + arc.radius * arc.cosTheta;\n arc.endY = arc.centerY - arc.radius * arc.sinTheta;\n\n // Overflow.\n arc = Arc.overflow(arc, bounds);\n\n return arc;\n },\n\n randomize: function randomize(arc) {\n arc.length = _random2.default.num(_enums.RAD.t90, _enums.RAD.t360);\n\n arc = Arc.changeRadius(arc, _random2.default.num(100, 200));\n\n if (_random2.default.bool(0.8)) {\n arc = Arc.reverse(arc);\n }\n\n return arc;\n },\n\n overflow: function overflow(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\n changeRadius: function changeRadius(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) * arc.cosTheta;\n arc.centerY += (r1 - r0) * arc.sinTheta;\n arc.radius = r1;\n\n return arc;\n },\n\n reverse: function reverse(arc) {\n arc.clockwise = !arc.clockwise;\n\n arc.theta = (arc.theta + _enums.RAD.t180) % _enums.RAD.t360;\n\n arc.cosTheta = Math.cos(arc.theta);\n arc.sinTheta = Math.sin(arc.theta);\n\n arc.centerX -= 2 * arc.radius * arc.cosTheta;\n arc.centerY += 2 * arc.radius * arc.sinTheta;\n\n return arc;\n },\n\n follow: function follow(arc, arcToFollow) {\n if (arc.clockwise !== arcToFollow.clockwise) {\n arc = Arc.reverse(arc);\n }\n\n if (Math.abs(arc.theta - arcToFollow.theta) > 0.2) {\n arc = Arc.changeRadius(arc, 50);\n } else {\n arc = Arc.changeRadius(arc, arcToFollow.radius);\n }\n\n return arc;\n },\n\n goto: function goto(arc, x, y, speed) {\n var prevD = Math.pow(Math.pow(x - arc.prevEndX, 2) + Math.pow(y - arc.prevEndY, 2), 0.5);\n var currD = Math.pow(Math.pow(x - arc.endX, 2) + Math.pow(y - arc.endY, 2), 0.5);\n var ratio = (prevD - currD) / speed;\n\n if (currD < 10) {\n throw new Error('Arc end of (' + arc.endX + ',' + arc.endY + ') is within 50px of (' + x + ',' + y + ')');\n } else if (ratio < 0.8) {\n // arc = (ratio < 0 ? Arc.reverse(arc) : arc);\n arc = Arc.changeRadius(arc, 20);\n } else {\n arc = Arc.changeRadius(arc, 400);\n }\n\n return arc;\n },\n\n evade: function evade(arc) {\n arc = Arc.changeRadius(arc, 20);\n arc.length = 1;\n\n return arc;\n }\n};\n\nexports.default = Arc;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL2pzL2FyYy5qcz85YjVmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVOVElUSUVTLCBSQUQgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCBSYW5kb20gZnJvbSAnLi9yYW5kb20nO1xuXG5jb25zdCBBcmMgPSB7XG4gICAgY3JlYXRlOiBmdW5jdGlvbihib3VuZHMsIGdyaWQpIHtcbiAgICAgICAgbGV0IGFyYyA9IHtcbiAgICAgICAgICAgIGNlbnRlclg6IFJhbmRvbS5udW0oMCwgYm91bmRzLndpZHRoKSxcbiAgICAgICAgICAgIGNlbnRlclk6IFJhbmRvbS5udW0oMCwgYm91bmRzLmhlaWdodCksXG4gICAgICAgICAgICBjbG9ja3dpc2U6IFJhbmRvbS5ib29sKCksXG4gICAgICAgICAgICBlbmRYOiAwLFxuICAgICAgICAgICAgZW5kWTogMCxcbiAgICAgICAgICAgIGxlbmd0aDogUmFuZG9tLm51bShSQUQudDkwLCBSQUQudDM2MCksXG4gICAgICAgICAgICBwcmV2RW5kWDogMCxcbiAgICAgICAgICAgIHByZXZFbmRZOiAwLFxuICAgICAgICAgICAgcmFkaXVzOiBSYW5kb20ubnVtKDEwMCwgMjAwKSxcbiAgICAgICAgICAgIHRoZXRhOiBSYW5kb20ubnVtKFJBRC50OTAsIFJBRC50MzYwKVxuICAgICAgICB9O1xuXG4gICAgICAgIGFyYy5jb3NUaGV0YSA9IE1hdGguY29zKGFyYy50aGV0YSk7XG4gICAgICAgIGFyYy5zaW5UaGV0YSA9IE1hdGguc2luKGFyYy50aGV0YSk7XG5cbiAgICAgICAgYXJjLmVuZFggPSBhcmMuY2VudGVyWCArIGFyYy5yYWRpdXMgKiBhcmMuY29zVGhldGE7XG4gICAgICAgIGFyYy5lbmRZID0gYXJjLmNlbnRlclkgLSBhcmMucmFkaXVzICogYXJjLnNpblRoZXRhO1xuXG4gICAgICAgIGFyYyA9IEFyYy5vdmVyZmxvdyhhcmMsIGJvdW5kcyk7XG5cbiAgICAgICAgLy8gSWYgc3RhcnRpbmcgaW4gYSBoYXphcmQsIHJlY3Vyc2UuXG4gICAgICAgIGlmIChncmlkLmdldFBvaW50KHsgeDogYXJjLmVuZFgsIHk6IGFyYy5lbmRZLCB0eXBlOiBFTlRJVElFUy5IQVpBUkQgfSkpIHtcbiAgICAgICAgICAgIGFyYyA9IEFyYy5jcmVhdGUoYm91bmRzLCBncmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcmM7XG4gICAgfSxcblxuICAgIHN0ZXA6IGZ1bmN0aW9uKGFyYywgYm91bmRzLCBzcGVlZCkge1xuICAgICAgICAvLyBFbnN1cmUgY29uc3RhbnQgdmVsb2NpdHkgYW5kIHRoZXRhIGJldHdlZW4gMCBhbmQgMs+ALlxuICAgICAgICBjb25zdCBkZWx0YSA9IHNwZWVkIC8gYXJjLnJhZGl1cztcbiAgICAgICAgYXJjLmxlbmd0aCAtPSBkZWx0YTtcblxuICAgICAgICBhcmMudGhldGEgKz0gKGFyYy5jbG9ja3dpc2UgPyAtZGVsdGEgOiArZGVsdGEpO1xuICAgICAgICBhcmMudGhldGEgPSAoYXJjLnRoZXRhID4gMCA/IGFyYy50aGV0YSAlIFJBRC50MzYwIDogUkFELnQzNjAgKyBhcmMudGhldGEpO1xuXG4gICAgICAgIGFyYy5jb3NUaGV0YSA9IE1hdGguY29zKGFyYy50aGV0YSk7XG4gICAgICAgIGFyYy5zaW5UaGV0YSA9IE1hdGguc2luKGFyYy50aGV0YSk7XG5cbiAgICAgICAgYXJjLnByZXZFbmRYID0gYXJjLmVuZFg7XG4gICAgICAgIGFyYy5wcmV2RW5kWSA9IGFyYy5lbmRZO1xuXG4gICAgICAgIGFyYy5lbmRYID0gYXJjLmNlbnRlclggKyBhcmMucmFkaXVzICogYXJjLmNvc1RoZXRhO1xuICAgICAgICBhcmMuZW5kWSA9IGFyYy5jZW50ZXJZIC0gYXJjLnJhZGl1cyAqIGFyYy5zaW5UaGV0YTtcblxuICAgICAgICAvLyBPdmVyZmxvdy5cbiAgICAgICAgYXJjID0gQXJjLm92ZXJmbG93KGFyYywgYm91bmRzKTtcblxuICAgICAgICByZXR1cm4gYXJjO1xuICAgIH0sXG5cbiAgICByYW5kb21pemU6IGZ1bmN0aW9uKGFyYykge1xuICAgICAgICBhcmMubGVuZ3RoID0gUmFuZG9tLm51bShSQUQudDkwLCBSQUQudDM2MCk7XG5cbiAgICAgICAgYXJjID0gQXJjLmNoYW5nZVJhZGl1cyhhcmMsIFJhbmRvbS5udW0oMTAwLCAyMDApKTtcblxuICAgICAgICBpZiAoUmFuZG9tLmJvb2woMC44KSkge1xuICAgICAgICAgICAgYXJjID0gQXJjLnJldmVyc2UoYXJjKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcmM7XG4gICAgfSxcblxuICAgIG92ZXJmbG93OiBmdW5jdGlvbihhcmMsIGJvdW5kcykge1xuICAgICAgICBpZiAoYXJjLmVuZFggPCAwKSB7XG4gICAgICAgICAgICBhcmMuZW5kWCArPSBib3VuZHMud2lkdGg7XG4gICAgICAgICAgICBhcmMuY2VudGVyWCArPSBib3VuZHMud2lkdGhcbiAgICAgICAgfSBlbHNlIGlmIChhcmMuZW5kWCA+IGJvdW5kcy53aWR0aCkge1xuICAgICAgICAgICAgYXJjLmVuZFggLT0gYm91bmRzLndpZHRoO1xuICAgICAgICAgICAgYXJjLmNlbnRlclggLT0gYm91bmRzLndpZHRoXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJjLmVuZFkgPCAwKSB7XG4gICAgICAgICAgICBhcmMuZW5kWSArPSBib3VuZHMuaGVpZ2h0O1xuICAgICAgICAgICAgYXJjLmNlbnRlclkgKz0gYm91bmRzLmhlaWdodFxuICAgICAgICB9IGVsc2UgaWYgKGFyYy5lbmRZID4gYm91bmRzLmhlaWdodCkge1xuICAgICAgICAgICAgYXJjLmVuZFkgLT0gYm91bmRzLmhlaWdodDtcbiAgICAgICAgICAgIGFyYy5jZW50ZXJZIC09IGJvdW5kcy5oZWlnaHRcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcmM7XG4gICAgfSxcblxuICAgIGNoYW5nZVJhZGl1czogZnVuY3Rpb24oYXJjLCBuZXdSYWRpdXMpIHtcbiAgICAgICAgY29uc3QgcjAgPSBhcmMucmFkaXVzO1xuICAgICAgICBjb25zdCByMSA9IG5ld1JhZGl1cztcblxuICAgICAgICAvLyBNb3ZlcyBhcmMgY2VudGVyIHRvIG5ldyByYWRpdXMgd2hpbGUga2VlcGluZyB0aGV0YSBjb25zdGFudC5cbiAgICAgICAgYXJjLmNlbnRlclggLT0gKHIxIC0gcjApICogYXJjLmNvc1RoZXRhO1xuICAgICAgICBhcmMuY2VudGVyWSArPSAocjEgLSByMCkgKiBhcmMuc2luVGhldGE7XG4gICAgICAgIGFyYy5yYWRpdXMgPSByMTtcblxuICAgICAgICByZXR1cm4gYXJjO1xuICAgIH0sXG5cbiAgICByZXZlcnNlOiBmdW5jdGlvbihhcmMpIHtcbiAgICAgICAgYXJjLmNsb2Nrd2lzZSA9ICFhcmMuY2xvY2t3aXNlO1xuXG4gICAgICAgIGFyYy50aGV0YSA9IChhcmMudGhldGEgKyBSQUQudDE4MCkgJSBSQUQudDM2MDtcblxuICAgICAgICBhcmMuY29zVGhldGEgPSBNYXRoLmNvcyhhcmMudGhldGEpO1xuICAgICAgICBhcmMuc2luVGhldGEgPSBNYXRoLnNpbihhcmMudGhldGEpO1xuXG4gICAgICAgIGFyYy5jZW50ZXJYIC09ICgyICogYXJjLnJhZGl1cykgKiBhcmMuY29zVGhldGE7XG4gICAgICAgIGFyYy5jZW50ZXJZICs9ICgyICogYXJjLnJhZGl1cykgKiBhcmMuc2luVGhldGE7XG5cbiAgICAgICAgcmV0dXJuIGFyYztcbiAgICB9LFxuXG4gICAgZm9sbG93OiBmdW5jdGlvbihhcmMsIGFyY1RvRm9sbG93KSB7XG4gICAgICAgIGlmIChhcmMuY2xvY2t3aXNlICE9PSBhcmNUb0ZvbGxvdy5jbG9ja3dpc2UpIHtcbiAgICAgICAgICAgIGFyYyA9IEFyYy5yZXZlcnNlKGFyYyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoTWF0aC5hYnMoYXJjLnRoZXRhIC0gYXJjVG9Gb2xsb3cudGhldGEpID4gMC4yKSB7XG4gICAgICAgICAgICBhcmMgPSBBcmMuY2hhbmdlUmFkaXVzKGFyYywgNTApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJjID0gQXJjLmNoYW5nZVJhZGl1cyhhcmMsIGFyY1RvRm9sbG93LnJhZGl1cyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJjO1xuICAgIH0sXG5cbiAgICBnb3RvOiBmdW5jdGlvbiAoYXJjLCB4LCB5LCBzcGVlZCkge1xuICAgICAgICBjb25zdCBwcmV2RCA9IE1hdGgucG93KE1hdGgucG93KHggLSBhcmMucHJldkVuZFgsIDIpICsgTWF0aC5wb3coeSAtIGFyYy5wcmV2RW5kWSwgMiksIDAuNSk7XG4gICAgICAgIGNvbnN0IGN1cnJEID0gTWF0aC5wb3coTWF0aC5wb3coeCAtIGFyYy5lbmRYLCAyKSArIE1hdGgucG93KHkgLSBhcmMuZW5kWSwgMiksIDAuNSk7XG4gICAgICAgIGNvbnN0IHJhdGlvID0gKHByZXZEIC0gY3VyckQpIC8gc3BlZWQ7XG5cbiAgICAgICAgaWYgKGN1cnJEIDwgMTApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXJjIGVuZCBvZiAoJHthcmMuZW5kWH0sJHthcmMuZW5kWX0pIGlzIHdpdGhpbiA1MHB4IG9mICgke3h9LCR7eX0pYCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmF0aW8gPCAwLjgpIHtcbiAgICAgICAgICAgIC8vIGFyYyA9IChyYXRpbyA8IDAgPyBBcmMucmV2ZXJzZShhcmMpIDogYXJjKTtcbiAgICAgICAgICAgIGFyYyA9IEFyYy5jaGFuZ2VSYWRpdXMoYXJjLCAyMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcmMgPSBBcmMuY2hhbmdlUmFkaXVzKGFyYywgNDAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcmM7XG4gICAgfSxcblxuICAgIGV2YWRlOiBmdW5jdGlvbihhcmMpIHtcbiAgICAgICAgYXJjID0gQXJjLmNoYW5nZVJhZGl1cyhhcmMsIDIwKTtcbiAgICAgICAgYXJjLmxlbmd0aCA9IDE7XG5cbiAgICAgICAgcmV0dXJuIGFyYztcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFyYztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBqcy9hcmMuanMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFBQTtBQUNBOzs7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkE7QUFDQTtBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFwSkE7QUFDQTtBQXNKQSIsInNvdXJjZVJvb3QiOiIifQ=="); /***/ }), /* 361 */ diff --git a/js/index.js b/js/index.js index 7e8aab1..b07270a 100644 --- a/js/index.js +++ b/js/index.js @@ -1,10 +1,10 @@ import Rx, { Observable } from 'rxjs'; import Controls from './controls'; -// import Animation1a from './animation1a'; -// import Animation1b from './animation1b'; +import Animation1a from './animation1a'; +import Animation1b from './animation1b'; import Animation2a from './animation2a'; import Animation2b from './animation2b'; -// import Animation3a from './animation3a'; +import Animation3a from './animation3a'; require('../css/reset.scss'); require('../css/index.scss'); @@ -12,9 +12,9 @@ require('../css/particle.scss'); require('../css/controls.scss'); window.addEventListener('load', () => { - // new Animation1a(); + new Animation1a(); // new Animation1b(); - new Animation2a(); - new Animation2b(); + // new Animation2a(); + // new Animation2b(); // new Animation3a(); }); diff --git a/js/particle.js b/js/particle.js index 962938d..4566a20 100644 --- a/js/particle.js +++ b/js/particle.js @@ -7,7 +7,7 @@ import Random from './random'; function Particle(parent, bounds, config, globalGrid) { this.config = Object.assign({}, { - behavior: BEHAVIOR.FREE, + behavior: BEHAVIOR.COHESION, bounds, color: Random.color(), gridSize: 5, @@ -40,8 +40,19 @@ function Particle(parent, bounds, config, globalGrid) { this.isLeader = false; this.arc = Arc.create(bounds, this.grids.global); + console.error('starting', this.arc) this.updateConfig(this.config); this.nextFrame(globalGrid); + + + const point = document.createElement('div'); + point.style.height = '10px' + point.style.width = '10px' + point.style.background = 'red' + point.style.position = 'absolute' + point.style.left = '200px' + point.style.top = '200px' + this.nodes.parent.appendChild(point); }; // ===== PROTOTYPE ===== @@ -53,22 +64,24 @@ Particle.prototype.remove = function() { } Particle.prototype.nextFrame = function() { - this.arc = Arc.step(this.arc, this.config.bounds, this.config.speed); - - if (this.leader !== null) { - this.arc = Arc.follow(this.arc, this.leader.arc); - } else if (this.arc.length <= 0 && this.config.randomize) { - this.arc = Arc.randomize(this.arc); - } - - this.grids.vision = updateVisionGrid(this.arc, this.config, this.grids); - const { hazards, particles } = look(this.arc, this.grids); + this.arc = Arc.goto(this.arc, 200, 200, this.config.speed) - if (hazards.length > 0) { - this.arc = Arc.evade(this.arc); - } + this.arc = Arc.step(this.arc, this.config.bounds, this.config.speed); - this.updateLeader(particles); + // if (this.leader !== null) { + // this.arc = Arc.follow(this.arc, this.leader.arc); + // } else if (this.arc.length <= 0 && this.config.randomize) { + // this.arc = Arc.randomize(this.arc); + // } + // + // this.grids.vision = updateVisionGrid(this.arc, this.config, this.grids); + // const { hazards, particles } = look(this.arc, this.grids); + // + // if (hazards.length > 0) { + // this.arc = Arc.evade(this.arc); + // } + // + // this.updateLeader(particles); repaintContainer(this.nodes.container, this.arc); repaintBody(this.nodes.body, this.arc, this.isLeader);