X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/dbd88d893f3c3fce9cafd666b94396988646d81f..f07af588e65076b6524a69b3951ca1ec2cedc334:/vendor/assets/iD/iD/mapillary-js/mapillary.js diff --git a/vendor/assets/iD/iD/mapillary-js/mapillary.js b/vendor/assets/iD/iD/mapillary-js/mapillary.js index 79183cfb9..40cbd5b8f 100644 --- a/vendor/assets/iD/iD/mapillary-js/mapillary.js +++ b/vendor/assets/iD/iD/mapillary-js/mapillary.js @@ -156,7 +156,7 @@ function getSegDistSq(px, py, a, b) { return dx * dx + dy * dy; } -},{"tinyqueue":177}],2:[function(require,module,exports){ +},{"tinyqueue":241}],2:[function(require,module,exports){ /* * Copyright (C) 2008 Apple Inc. All Rights Reserved. * @@ -679,7 +679,7 @@ process.umask = function() { return 0; }; /*! * The buffer module from node.js, for the browser. * - * @author Feross Aboukhadijeh + * @author Feross Aboukhadijeh * @license MIT */ /* eslint-disable no-proto */ @@ -782,7 +782,7 @@ function from (value, encodingOrOffset, length) { throw new TypeError('"value" argument must not be a number') } - if (value instanceof ArrayBuffer) { + if (isArrayBuffer(value)) { return fromArrayBuffer(value, encodingOrOffset, length) } @@ -1042,7 +1042,7 @@ function byteLength (string, encoding) { if (Buffer.isBuffer(string)) { return string.length } - if (isArrayBufferView(string) || string instanceof ArrayBuffer) { + if (isArrayBufferView(string) || isArrayBuffer(string)) { return string.byteLength } if (typeof string !== 'string') { @@ -2374,6 +2374,14 @@ function blitBuffer (src, dst, offset, length) { return i } +// ArrayBuffers from another context (i.e. an iframe) do not pass the `instanceof` check +// but they should be treated as valid. See: https://github.com/feross/buffer/issues/166 +function isArrayBuffer (obj) { + return obj instanceof ArrayBuffer || + (obj != null && obj.constructor != null && obj.constructor.name === 'ArrayBuffer' && + typeof obj.byteLength === 'number') +} + // Node 0.10 supports `ArrayBuffer` but lacks `ArrayBuffer.isView` function isArrayBufferView (obj) { return (typeof ArrayBuffer.isView === 'function') && ArrayBuffer.isView(obj) @@ -2387,6 +2395,7 @@ function numberIsNaN (obj) { 'use strict'; module.exports = earcut; +module.exports.default = earcut; function earcut(data, holeIndices, dim) { @@ -2399,7 +2408,7 @@ function earcut(data, holeIndices, dim) { if (!outerNode) return triangles; - var minX, minY, maxX, maxY, x, y, size; + var minX, minY, maxX, maxY, x, y, invSize; if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim); @@ -2417,11 +2426,12 @@ function earcut(data, holeIndices, dim) { if (y > maxY) maxY = y; } - // minX, minY and size are later used to transform coords into integers for z-order calculation - size = Math.max(maxX - minX, maxY - minY); + // minX, minY and invSize are later used to transform coords into integers for z-order calculation + invSize = Math.max(maxX - minX, maxY - minY); + invSize = invSize !== 0 ? 1 / invSize : 0; } - earcutLinked(outerNode, triangles, dim, minX, minY, size); + earcutLinked(outerNode, triangles, dim, minX, minY, invSize); return triangles; } @@ -2457,7 +2467,7 @@ function filterPoints(start, end) { if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { removeNode(p); p = end = p.prev; - if (p === p.next) return null; + if (p === p.next) break; again = true; } else { @@ -2469,11 +2479,11 @@ function filterPoints(start, end) { } // main ear slicing loop which triangulates a polygon (given as a linked list) -function earcutLinked(ear, triangles, dim, minX, minY, size, pass) { +function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) { if (!ear) return; // interlink polygon nodes in z-order - if (!pass && size) indexCurve(ear, minX, minY, size); + if (!pass && invSize) indexCurve(ear, minX, minY, invSize); var stop = ear, prev, next; @@ -2483,7 +2493,7 @@ function earcutLinked(ear, triangles, dim, minX, minY, size, pass) { prev = ear.prev; next = ear.next; - if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) { + if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) { // cut off the triangle triangles.push(prev.i / dim); triangles.push(ear.i / dim); @@ -2504,16 +2514,16 @@ function earcutLinked(ear, triangles, dim, minX, minY, size, pass) { if (ear === stop) { // try filtering points and slicing again if (!pass) { - earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1); + earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1); // if this didn't work, try curing all small self-intersections locally } else if (pass === 1) { ear = cureLocalIntersections(ear, triangles, dim); - earcutLinked(ear, triangles, dim, minX, minY, size, 2); + earcutLinked(ear, triangles, dim, minX, minY, invSize, 2); // as a last resort, try splitting the remaining polygon into two } else if (pass === 2) { - splitEarcut(ear, triangles, dim, minX, minY, size); + splitEarcut(ear, triangles, dim, minX, minY, invSize); } break; @@ -2541,7 +2551,7 @@ function isEar(ear) { return true; } -function isEarHashed(ear, minX, minY, size) { +function isEarHashed(ear, minX, minY, invSize) { var a = ear.prev, b = ear, c = ear.next; @@ -2555,8 +2565,8 @@ function isEarHashed(ear, minX, minY, size) { maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y); // z-order range for the current triangle bbox; - var minZ = zOrder(minTX, minTY, minX, minY, size), - maxZ = zOrder(maxTX, maxTY, minX, minY, size); + var minZ = zOrder(minTX, minTY, minX, minY, invSize), + maxZ = zOrder(maxTX, maxTY, minX, minY, invSize); // first look for points inside the triangle in increasing z-order var p = ear.nextZ; @@ -2607,7 +2617,7 @@ function cureLocalIntersections(start, triangles, dim) { } // try splitting polygon into two and triangulate them independently -function splitEarcut(start, triangles, dim, minX, minY, size) { +function splitEarcut(start, triangles, dim, minX, minY, invSize) { // look for a valid diagonal that divides the polygon into two var a = start; do { @@ -2622,8 +2632,8 @@ function splitEarcut(start, triangles, dim, minX, minY, size) { c = filterPoints(c, c.next); // run earcut on each half - earcutLinked(a, triangles, dim, minX, minY, size); - earcutLinked(c, triangles, dim, minX, minY, size); + earcutLinked(a, triangles, dim, minX, minY, invSize); + earcutLinked(c, triangles, dim, minX, minY, invSize); return; } b = b.next; @@ -2680,7 +2690,7 @@ function findHoleBridge(hole, outerNode) { // find a segment intersected by a ray from the hole's leftmost point to the left; // segment's endpoint with lesser x will be potential connection point do { - if (hy <= p.y && hy >= p.next.y) { + if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) { var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); if (x <= hx && x > qx) { qx = x; @@ -2711,7 +2721,7 @@ function findHoleBridge(hole, outerNode) { p = m.next; while (p !== stop) { - if (hx >= p.x && p.x >= mx && + if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { tan = Math.abs(hy - p.y) / (hx - p.x); // tangential @@ -2729,10 +2739,10 @@ function findHoleBridge(hole, outerNode) { } // interlink polygon nodes in z-order -function indexCurve(start, minX, minY, size) { +function indexCurve(start, minX, minY, invSize) { var p = start; do { - if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size); + if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize); p.prevZ = p.prev; p.nextZ = p.next; p = p.next; @@ -2765,20 +2775,11 @@ function sortLinked(list) { q = q.nextZ; if (!q) break; } - qSize = inSize; while (pSize > 0 || (qSize > 0 && q)) { - if (pSize === 0) { - e = q; - q = q.nextZ; - qSize--; - } else if (qSize === 0 || !q) { - e = p; - p = p.nextZ; - pSize--; - } else if (p.z <= q.z) { + if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) { e = p; p = p.nextZ; pSize--; @@ -2806,11 +2807,11 @@ function sortLinked(list) { return list; } -// z-order of a point given coords and size of the data bounding box -function zOrder(x, y, minX, minY, size) { +// z-order of a point given coords and inverse of the longer side of data bbox +function zOrder(x, y, minX, minY, invSize) { // coords are transformed into non-negative 15-bit integer range - x = 32767 * (x - minX) / size; - y = 32767 * (y - minY) / size; + x = 32767 * (x - minX) * invSize; + y = 32767 * (y - minY) * invSize; x = (x | (x << 8)) & 0x00FF00FF; x = (x | (x << 4)) & 0x0F0F0F0F; @@ -2894,7 +2895,8 @@ function middleInside(a, b) { px = (a.x + b.x) / 2, py = (a.y + b.y) / 2; do { - if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) + if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y && + (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) inside = !inside; p = p.next; } while (p !== a); @@ -5392,7 +5394,7 @@ var BehaviorSubject = (function (_super) { }(Subject_1.Subject)); exports.BehaviorSubject = BehaviorSubject; -},{"./Subject":34,"./util/ObjectUnsubscribedError":160}],27:[function(require,module,exports){ +},{"./Subject":34,"./util/ObjectUnsubscribedError":220}],27:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; @@ -5532,7 +5534,7 @@ var Notification = (function () { if (typeof value !== 'undefined') { return new Notification('N', value); } - return this.undefinedValueNotification; + return Notification.undefinedValueNotification; }; /** * A shortcut to create a Notification instance of the type `error` from a @@ -5549,7 +5551,7 @@ var Notification = (function () { * @return {Notification} The valueless "complete" Notification. */ Notification.createComplete = function () { - return this.completeNotification; + return Notification.completeNotification; }; Notification.completeNotification = new Notification('C'); Notification.undefinedValueNotification = new Notification('N', undefined); @@ -5562,8 +5564,9 @@ exports.Notification = Notification; var root_1 = require('./util/root'); var toSubscriber_1 = require('./util/toSubscriber'); var observable_1 = require('./symbol/observable'); +var pipe_1 = require('./util/pipe'); /** - * A representation of any set of values over any amount of time. This the most basic building block + * A representation of any set of values over any amount of time. This is the most basic building block * of RxJS. * * @class Observable @@ -5571,7 +5574,7 @@ var observable_1 = require('./symbol/observable'); var Observable = (function () { /** * @constructor - * @param {Function} subscribe the function that is called when the Observable is + * @param {Function} subscribe the function that is called when the Observable is * initially subscribed to. This function is given a Subscriber, to which new values * can be `next`ed, or an `error` method can be called to raise an error, or * `complete` can be called to notify of a successful completion. @@ -5600,7 +5603,7 @@ var Observable = (function () { * * Use it when you have all these Observables, but still nothing is happening. * - * `subscribe` is not a regular operator, but a method that calls Observables internal `subscribe` function. It + * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It * might be for example a function that you passed to a {@link create} static factory, but most of the time it is * a library implementation, which defines what and when will be emitted by an Observable. This means that calling * `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often @@ -5642,7 +5645,7 @@ var Observable = (function () { * console.log('Adding: ' + value); * this.sum = this.sum + value; * }, - * error() { // We actually could just remote this method, + * error() { // We actually could just remove this method, * }, // since we do not really care about errors right now. * complete() { * console.log('Sum equals: ' + this.sum); @@ -5697,7 +5700,7 @@ var Observable = (function () { * // Logs: * // 0 after 1s * // 1 after 2s - * // "unsubscribed!" after 2,5s + * // "unsubscribed!" after 2.5s * * * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called, @@ -5797,6 +5800,54 @@ var Observable = (function () { Observable.prototype[observable_1.observable] = function () { return this; }; + /* tslint:enable:max-line-length */ + /** + * Used to stitch together functional operators into a chain. + * @method pipe + * @return {Observable} the Observable result of all of the operators having + * been called in the order they were passed in. + * + * @example + * + * import { map, filter, scan } from 'rxjs/operators'; + * + * Rx.Observable.interval(1000) + * .pipe( + * filter(x => x % 2 === 0), + * map(x => x + x), + * scan((acc, x) => acc + x) + * ) + * .subscribe(x => console.log(x)) + */ + Observable.prototype.pipe = function () { + var operations = []; + for (var _i = 0; _i < arguments.length; _i++) { + operations[_i - 0] = arguments[_i]; + } + if (operations.length === 0) { + return this; + } + return pipe_1.pipeFromArray(operations)(this); + }; + /* tslint:enable:max-line-length */ + Observable.prototype.toPromise = function (PromiseCtor) { + var _this = this; + if (!PromiseCtor) { + if (root_1.root.Rx && root_1.root.Rx.config && root_1.root.Rx.config.Promise) { + PromiseCtor = root_1.root.Rx.config.Promise; + } + else if (root_1.root.Promise) { + PromiseCtor = root_1.root.Promise; + } + } + if (!PromiseCtor) { + throw new Error('no Promise impl found'); + } + return new PromiseCtor(function (resolve, reject) { + var value; + _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); }); + }); + }; // HACK: Since TypeScript inherits static properties too, we have to // fight against TypeScript here so Subject can have a different static create signature /** @@ -5814,7 +5865,7 @@ var Observable = (function () { }()); exports.Observable = Observable; -},{"./symbol/observable":155,"./util/root":172,"./util/toSubscriber":174}],30:[function(require,module,exports){ +},{"./symbol/observable":215,"./util/pipe":235,"./util/root":236,"./util/toSubscriber":238}],30:[function(require,module,exports){ "use strict"; exports.empty = { closed: true, @@ -5864,7 +5915,7 @@ var __extends = (this && this.__extends) || function (d, b) { var Subject_1 = require('./Subject'); var queue_1 = require('./scheduler/queue'); var Subscription_1 = require('./Subscription'); -var observeOn_1 = require('./operator/observeOn'); +var observeOn_1 = require('./operators/observeOn'); var ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError'); var SubjectSubscription_1 = require('./SubjectSubscription'); /** @@ -5957,7 +6008,7 @@ var ReplayEvent = (function () { return ReplayEvent; }()); -},{"./Subject":34,"./SubjectSubscription":35,"./Subscription":37,"./operator/observeOn":129,"./scheduler/queue":153,"./util/ObjectUnsubscribedError":160}],33:[function(require,module,exports){ +},{"./Subject":34,"./SubjectSubscription":35,"./Subscription":37,"./operators/observeOn":183,"./scheduler/queue":213,"./util/ObjectUnsubscribedError":220}],33:[function(require,module,exports){ "use strict"; /** * An execution context and a data structure to order tasks and schedule their @@ -6176,7 +6227,7 @@ var AnonymousSubject = (function (_super) { }(Subject)); exports.AnonymousSubject = AnonymousSubject; -},{"./Observable":29,"./SubjectSubscription":35,"./Subscriber":36,"./Subscription":37,"./symbol/rxSubscriber":156,"./util/ObjectUnsubscribedError":160}],35:[function(require,module,exports){ +},{"./Observable":29,"./SubjectSubscription":35,"./Subscriber":36,"./Subscription":37,"./symbol/rxSubscriber":216,"./util/ObjectUnsubscribedError":220}],35:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; @@ -6482,7 +6533,7 @@ var SafeSubscriber = (function (_super) { return SafeSubscriber; }(Subscriber)); -},{"./Observer":30,"./Subscription":37,"./symbol/rxSubscriber":156,"./util/isFunction":167}],37:[function(require,module,exports){ +},{"./Observer":30,"./Subscription":37,"./symbol/rxSubscriber":216,"./util/isFunction":229}],37:[function(require,module,exports){ "use strict"; var isArray_1 = require('./util/isArray'); var isObject_1 = require('./util/isObject'); @@ -6676,293 +6727,335 @@ function flattenUnsubscriptionErrors(errors) { return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError_1.UnsubscriptionError) ? err.errors : err); }, []); } -},{"./util/UnsubscriptionError":162,"./util/errorObject":163,"./util/isArray":164,"./util/isFunction":167,"./util/isObject":169,"./util/tryCatch":175}],38:[function(require,module,exports){ +},{"./util/UnsubscriptionError":223,"./util/errorObject":224,"./util/isArray":226,"./util/isFunction":229,"./util/isObject":231,"./util/tryCatch":239}],38:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var combineLatest_1 = require('../../observable/combineLatest'); Observable_1.Observable.combineLatest = combineLatest_1.combineLatest; -},{"../../Observable":29,"../../observable/combineLatest":97}],39:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/combineLatest":104}],39:[function(require,module,exports){ +"use strict"; +var Observable_1 = require('../../Observable'); +var concat_1 = require('../../observable/concat'); +Observable_1.Observable.concat = concat_1.concat; + +},{"../../Observable":29,"../../observable/concat":105}],40:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var defer_1 = require('../../observable/defer'); Observable_1.Observable.defer = defer_1.defer; -},{"../../Observable":29,"../../observable/defer":98}],40:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/defer":106}],41:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var empty_1 = require('../../observable/empty'); Observable_1.Observable.empty = empty_1.empty; -},{"../../Observable":29,"../../observable/empty":99}],41:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/empty":107}],42:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var from_1 = require('../../observable/from'); Observable_1.Observable.from = from_1.from; -},{"../../Observable":29,"../../observable/from":100}],42:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/from":108}],43:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var fromEvent_1 = require('../../observable/fromEvent'); Observable_1.Observable.fromEvent = fromEvent_1.fromEvent; -},{"../../Observable":29,"../../observable/fromEvent":101}],43:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/fromEvent":109}],44:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var fromPromise_1 = require('../../observable/fromPromise'); Observable_1.Observable.fromPromise = fromPromise_1.fromPromise; -},{"../../Observable":29,"../../observable/fromPromise":102}],44:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/fromPromise":110}],45:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var merge_1 = require('../../observable/merge'); Observable_1.Observable.merge = merge_1.merge; -},{"../../Observable":29,"../../observable/merge":103}],45:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/merge":111}],46:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var of_1 = require('../../observable/of'); Observable_1.Observable.of = of_1.of; -},{"../../Observable":29,"../../observable/of":104}],46:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/of":112}],47:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var throw_1 = require('../../observable/throw'); Observable_1.Observable.throw = throw_1._throw; -},{"../../Observable":29,"../../observable/throw":105}],47:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/throw":113}],48:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var timer_1 = require('../../observable/timer'); Observable_1.Observable.timer = timer_1.timer; -},{"../../Observable":29,"../../observable/timer":106}],48:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/timer":114}],49:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var zip_1 = require('../../observable/zip'); Observable_1.Observable.zip = zip_1.zip; -},{"../../Observable":29,"../../observable/zip":107}],49:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/zip":115}],50:[function(require,module,exports){ +"use strict"; +var Observable_1 = require('../../Observable'); +var auditTime_1 = require('../../operator/auditTime'); +Observable_1.Observable.prototype.auditTime = auditTime_1.auditTime; + +},{"../../Observable":29,"../../operator/auditTime":116}],51:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var buffer_1 = require('../../operator/buffer'); Observable_1.Observable.prototype.buffer = buffer_1.buffer; -},{"../../Observable":29,"../../operator/buffer":108}],50:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/buffer":117}],52:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var bufferCount_1 = require('../../operator/bufferCount'); Observable_1.Observable.prototype.bufferCount = bufferCount_1.bufferCount; -},{"../../Observable":29,"../../operator/bufferCount":109}],51:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/bufferCount":118}],53:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var bufferWhen_1 = require('../../operator/bufferWhen'); Observable_1.Observable.prototype.bufferWhen = bufferWhen_1.bufferWhen; -},{"../../Observable":29,"../../operator/bufferWhen":110}],52:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/bufferWhen":119}],54:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var catch_1 = require('../../operator/catch'); Observable_1.Observable.prototype.catch = catch_1._catch; Observable_1.Observable.prototype._catch = catch_1._catch; -},{"../../Observable":29,"../../operator/catch":111}],53:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/catch":120}],55:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var combineLatest_1 = require('../../operator/combineLatest'); Observable_1.Observable.prototype.combineLatest = combineLatest_1.combineLatest; -},{"../../Observable":29,"../../operator/combineLatest":112}],54:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/combineLatest":121}],56:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var concat_1 = require('../../operator/concat'); Observable_1.Observable.prototype.concat = concat_1.concat; -},{"../../Observable":29,"../../operator/concat":113}],55:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/concat":122}],57:[function(require,module,exports){ +"use strict"; +var Observable_1 = require('../../Observable'); +var count_1 = require('../../operator/count'); +Observable_1.Observable.prototype.count = count_1.count; + +},{"../../Observable":29,"../../operator/count":123}],58:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var debounceTime_1 = require('../../operator/debounceTime'); Observable_1.Observable.prototype.debounceTime = debounceTime_1.debounceTime; -},{"../../Observable":29,"../../operator/debounceTime":114}],56:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/debounceTime":124}],59:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var delay_1 = require('../../operator/delay'); Observable_1.Observable.prototype.delay = delay_1.delay; -},{"../../Observable":29,"../../operator/delay":115}],57:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/delay":125}],60:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var distinct_1 = require('../../operator/distinct'); Observable_1.Observable.prototype.distinct = distinct_1.distinct; -},{"../../Observable":29,"../../operator/distinct":116}],58:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/distinct":126}],61:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var distinctUntilChanged_1 = require('../../operator/distinctUntilChanged'); Observable_1.Observable.prototype.distinctUntilChanged = distinctUntilChanged_1.distinctUntilChanged; -},{"../../Observable":29,"../../operator/distinctUntilChanged":117}],59:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/distinctUntilChanged":127}],62:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var do_1 = require('../../operator/do'); Observable_1.Observable.prototype.do = do_1._do; Observable_1.Observable.prototype._do = do_1._do; -},{"../../Observable":29,"../../operator/do":118}],60:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/do":128}],63:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var expand_1 = require('../../operator/expand'); Observable_1.Observable.prototype.expand = expand_1.expand; -},{"../../Observable":29,"../../operator/expand":119}],61:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/expand":129}],64:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var filter_1 = require('../../operator/filter'); Observable_1.Observable.prototype.filter = filter_1.filter; -},{"../../Observable":29,"../../operator/filter":120}],62:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/filter":130}],65:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var finally_1 = require('../../operator/finally'); Observable_1.Observable.prototype.finally = finally_1._finally; Observable_1.Observable.prototype._finally = finally_1._finally; -},{"../../Observable":29,"../../operator/finally":121}],63:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/finally":131}],66:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var first_1 = require('../../operator/first'); Observable_1.Observable.prototype.first = first_1.first; -},{"../../Observable":29,"../../operator/first":122}],64:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/first":132}],67:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var last_1 = require('../../operator/last'); Observable_1.Observable.prototype.last = last_1.last; -},{"../../Observable":29,"../../operator/last":123}],65:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/last":133}],68:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var map_1 = require('../../operator/map'); Observable_1.Observable.prototype.map = map_1.map; -},{"../../Observable":29,"../../operator/map":124}],66:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/map":134}],69:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var merge_1 = require('../../operator/merge'); Observable_1.Observable.prototype.merge = merge_1.merge; -},{"../../Observable":29,"../../operator/merge":125}],67:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/merge":135}],70:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var mergeAll_1 = require('../../operator/mergeAll'); Observable_1.Observable.prototype.mergeAll = mergeAll_1.mergeAll; -},{"../../Observable":29,"../../operator/mergeAll":126}],68:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/mergeAll":136}],71:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var mergeMap_1 = require('../../operator/mergeMap'); Observable_1.Observable.prototype.mergeMap = mergeMap_1.mergeMap; Observable_1.Observable.prototype.flatMap = mergeMap_1.mergeMap; -},{"../../Observable":29,"../../operator/mergeMap":127}],69:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/mergeMap":137}],72:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var pairwise_1 = require('../../operator/pairwise'); Observable_1.Observable.prototype.pairwise = pairwise_1.pairwise; -},{"../../Observable":29,"../../operator/pairwise":130}],70:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/pairwise":138}],73:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var pluck_1 = require('../../operator/pluck'); Observable_1.Observable.prototype.pluck = pluck_1.pluck; -},{"../../Observable":29,"../../operator/pluck":131}],71:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/pluck":139}],74:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var publish_1 = require('../../operator/publish'); Observable_1.Observable.prototype.publish = publish_1.publish; -},{"../../Observable":29,"../../operator/publish":132}],72:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/publish":140}],75:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var publishReplay_1 = require('../../operator/publishReplay'); Observable_1.Observable.prototype.publishReplay = publishReplay_1.publishReplay; -},{"../../Observable":29,"../../operator/publishReplay":133}],73:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/publishReplay":141}],76:[function(require,module,exports){ +"use strict"; +var Observable_1 = require('../../Observable'); +var reduce_1 = require('../../operator/reduce'); +Observable_1.Observable.prototype.reduce = reduce_1.reduce; + +},{"../../Observable":29,"../../operator/reduce":142}],77:[function(require,module,exports){ +"use strict"; +var Observable_1 = require('../../Observable'); +var retry_1 = require('../../operator/retry'); +Observable_1.Observable.prototype.retry = retry_1.retry; + +},{"../../Observable":29,"../../operator/retry":143}],78:[function(require,module,exports){ +"use strict"; +var Observable_1 = require('../../Observable'); +var sample_1 = require('../../operator/sample'); +Observable_1.Observable.prototype.sample = sample_1.sample; + +},{"../../Observable":29,"../../operator/sample":144}],79:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var scan_1 = require('../../operator/scan'); Observable_1.Observable.prototype.scan = scan_1.scan; -},{"../../Observable":29,"../../operator/scan":134}],74:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/scan":145}],80:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var share_1 = require('../../operator/share'); Observable_1.Observable.prototype.share = share_1.share; -},{"../../Observable":29,"../../operator/share":135}],75:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/share":146}],81:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var skip_1 = require('../../operator/skip'); Observable_1.Observable.prototype.skip = skip_1.skip; -},{"../../Observable":29,"../../operator/skip":136}],76:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/skip":147}],82:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var skipUntil_1 = require('../../operator/skipUntil'); Observable_1.Observable.prototype.skipUntil = skipUntil_1.skipUntil; -},{"../../Observable":29,"../../operator/skipUntil":137}],77:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/skipUntil":148}],83:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var skipWhile_1 = require('../../operator/skipWhile'); Observable_1.Observable.prototype.skipWhile = skipWhile_1.skipWhile; -},{"../../Observable":29,"../../operator/skipWhile":138}],78:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/skipWhile":149}],84:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var startWith_1 = require('../../operator/startWith'); Observable_1.Observable.prototype.startWith = startWith_1.startWith; -},{"../../Observable":29,"../../operator/startWith":139}],79:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/startWith":150}],85:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var switchMap_1 = require('../../operator/switchMap'); Observable_1.Observable.prototype.switchMap = switchMap_1.switchMap; -},{"../../Observable":29,"../../operator/switchMap":140}],80:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/switchMap":151}],86:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var take_1 = require('../../operator/take'); Observable_1.Observable.prototype.take = take_1.take; -},{"../../Observable":29,"../../operator/take":141}],81:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/take":152}],87:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var takeUntil_1 = require('../../operator/takeUntil'); Observable_1.Observable.prototype.takeUntil = takeUntil_1.takeUntil; -},{"../../Observable":29,"../../operator/takeUntil":142}],82:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/takeUntil":153}],88:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); -var throttleTime_1 = require('../../operator/throttleTime'); -Observable_1.Observable.prototype.throttleTime = throttleTime_1.throttleTime; +var takeWhile_1 = require('../../operator/takeWhile'); +Observable_1.Observable.prototype.takeWhile = takeWhile_1.takeWhile; -},{"../../Observable":29,"../../operator/throttleTime":144}],83:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/takeWhile":154}],89:[function(require,module,exports){ +"use strict"; +var Observable_1 = require('../../Observable'); +var timeout_1 = require('../../operator/timeout'); +Observable_1.Observable.prototype.timeout = timeout_1.timeout; + +},{"../../Observable":29,"../../operator/timeout":155}],90:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var withLatestFrom_1 = require('../../operator/withLatestFrom'); Observable_1.Observable.prototype.withLatestFrom = withLatestFrom_1.withLatestFrom; -},{"../../Observable":29,"../../operator/withLatestFrom":145}],84:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/withLatestFrom":156}],91:[function(require,module,exports){ "use strict"; var Observable_1 = require('../../Observable'); var zip_1 = require('../../operator/zip'); Observable_1.Observable.prototype.zip = zip_1.zipProto; -},{"../../Observable":29,"../../operator/zip":146}],85:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/zip":157}],92:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; @@ -7033,7 +7126,7 @@ var ArrayLikeObservable = (function (_super) { }(Observable_1.Observable)); exports.ArrayLikeObservable = ArrayLikeObservable; -},{"../Observable":29,"./EmptyObservable":89,"./ScalarObservable":95}],86:[function(require,module,exports){ +},{"../Observable":29,"./EmptyObservable":96,"./ScalarObservable":102}],93:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; @@ -7156,7 +7249,7 @@ var ArrayObservable = (function (_super) { }(Observable_1.Observable)); exports.ArrayObservable = ArrayObservable; -},{"../Observable":29,"../util/isScheduler":171,"./EmptyObservable":89,"./ScalarObservable":95}],87:[function(require,module,exports){ +},{"../Observable":29,"../util/isScheduler":233,"./EmptyObservable":96,"./ScalarObservable":102}],94:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; @@ -7167,6 +7260,7 @@ var Subject_1 = require('../Subject'); var Observable_1 = require('../Observable'); var Subscriber_1 = require('../Subscriber'); var Subscription_1 = require('../Subscription'); +var refCount_1 = require('../operators/refCount'); /** * @class ConnectableObservable */ @@ -7207,7 +7301,7 @@ var ConnectableObservable = (function (_super) { return connection; }; ConnectableObservable.prototype.refCount = function () { - return this.lift(new RefCountOperator(this)); + return refCount_1.refCount()(this); }; return ConnectableObservable; }(Observable_1.Observable)); @@ -7326,7 +7420,7 @@ var RefCountSubscriber = (function (_super) { return RefCountSubscriber; }(Subscriber_1.Subscriber)); -},{"../Observable":29,"../Subject":34,"../Subscriber":36,"../Subscription":37}],88:[function(require,module,exports){ +},{"../Observable":29,"../Subject":34,"../Subscriber":36,"../Subscription":37,"../operators/refCount":189}],95:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; @@ -7426,7 +7520,7 @@ var DeferSubscriber = (function (_super) { return DeferSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../Observable":29,"../OuterSubscriber":31,"../util/subscribeToResult":173}],89:[function(require,module,exports){ +},{"../Observable":29,"../OuterSubscriber":31,"../util/subscribeToResult":237}],96:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; @@ -7508,7 +7602,7 @@ var EmptyObservable = (function (_super) { }(Observable_1.Observable)); exports.EmptyObservable = EmptyObservable; -},{"../Observable":29}],90:[function(require,module,exports){ +},{"../Observable":29}],97:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; @@ -7592,7 +7686,7 @@ var ErrorObservable = (function (_super) { }(Observable_1.Observable)); exports.ErrorObservable = ErrorObservable; -},{"../Observable":29}],91:[function(require,module,exports){ +},{"../Observable":29}],98:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; @@ -7639,31 +7733,107 @@ var FromEventObservable = (function (_super) { * Creates an Observable that emits events of a specific type coming from the * given event target. * - * Creates an Observable from DOM events, or Node + * Creates an Observable from DOM events, or Node.js * EventEmitter events or others. * * * - * Creates an Observable by attaching an event listener to an "event target", - * which may be an object with `addEventListener` and `removeEventListener`, - * a Node.js EventEmitter, a jQuery style EventEmitter, a NodeList from the - * DOM, or an HTMLCollection from the DOM. The event handler is attached when - * the output Observable is subscribed, and removed when the Subscription is - * unsubscribed. + * `fromEvent` accepts as a first argument event target, which is an object with methods + * for registering event handler functions. As a second argument it takes string that indicates + * type of event we want to listen for. `fromEvent` supports selected types of event targets, + * which are described in detail below. If your event target does not match any of the ones listed, + * you should use {@link fromEventPattern}, which can be used on arbitrary APIs. + * When it comes to APIs supported by `fromEvent`, their methods for adding and removing event + * handler functions have different names, but they all accept a string describing event type + * and function itself, which will be called whenever said event happens. + * + * Every time resulting Observable is subscribed, event handler function will be registered + * to event target on given event type. When that event fires, value + * passed as a first argument to registered function will be emitted by output Observable. + * When Observable is unsubscribed, function will be unregistered from event target. + * + * Note that if event target calls registered function with more than one argument, second + * and following arguments will not appear in resulting stream. In order to get access to them, + * you can pass to `fromEvent` optional project function, which will be called with all arguments + * passed to event handler. Output Observable will then emit value returned by project function, + * instead of the usual value. + * + * Remember that event targets listed below are checked via duck typing. It means that + * no matter what kind of object you have and no matter what environment you work in, + * you can safely use `fromEvent` on that object if it exposes described methods (provided + * of course they behave as was described above). So for example if Node.js library exposes + * event target which has the same method names as DOM EventTarget, `fromEvent` is still + * a good choice. + * + * If the API you use is more callback then event handler oriented (subscribed + * callback function fires only once and thus there is no need to manually + * unregister it), you should use {@link bindCallback} or {@link bindNodeCallback} + * instead. + * + * `fromEvent` supports following types of event targets: + * + * **DOM EventTarget** + * + * This is an object with `addEventListener` and `removeEventListener` methods. + * + * In the browser, `addEventListener` accepts - apart from event type string and event + * handler function arguments - optional third parameter, which is either an object or boolean, + * both used for additional configuration how and when passed function will be called. When + * `fromEvent` is used with event target of that type, you can provide this values + * as third parameter as well. + * + * **Node.js EventEmitter** + * + * An object with `addListener` and `removeListener` methods. + * + * **JQuery-style event target** + * + * An object with `on` and `off` methods + * + * **DOM NodeList** + * + * List of DOM Nodes, returned for example by `document.querySelectorAll` or `Node.childNodes`. + * + * Although this collection is not event target in itself, `fromEvent` will iterate over all Nodes + * it contains and install event handler function in every of them. When returned Observable + * is unsubscribed, function will be removed from all Nodes. + * + * **DOM HtmlCollection** + * + * Just as in case of NodeList it is a collection of DOM nodes. Here as well event handler function is + * installed and removed in each of elements. + * * * @example Emits clicks happening on the DOM document * var clicks = Rx.Observable.fromEvent(document, 'click'); * clicks.subscribe(x => console.log(x)); * * // Results in: - * // MouseEvent object logged to console everytime a click + * // MouseEvent object logged to console every time a click * // occurs on the document. * - * @see {@link from} + * + * @example Use addEventListener with capture option + * var clicksInDocument = Rx.Observable.fromEvent(document, 'click', true); // note optional configuration parameter + * // which will be passed to addEventListener + * var clicksInDiv = Rx.Observable.fromEvent(someDivInDocument, 'click'); + * + * clicksInDocument.subscribe(() => console.log('document')); + * clicksInDiv.subscribe(() => console.log('div')); + * + * // By default events bubble UP in DOM tree, so normally + * // when we would click on div in document + * // "div" would be logged first and then "document". + * // Since we specified optional `capture` option, document + * // will catch event when it goes DOWN DOM tree, so console + * // will log "document" and then "div". + * + * @see {@link bindCallback} + * @see {@link bindNodeCallback} * @see {@link fromEventPattern} * - * @param {EventTargetLike} target The DOMElement, event target, Node.js - * EventEmitter, NodeList or HTMLCollection to attach the event handler to. + * @param {EventTargetLike} target The DOM EventTarget, Node.js + * EventEmitter, JQuery-like event target, NodeList or HTMLCollection to attach the event handler to. * @param {string} eventName The event name of interest, being emitted by the * `target`. * @param {EventListenerOptions} [options] Options to pass through to addEventListener @@ -7733,7 +7903,7 @@ var FromEventObservable = (function (_super) { }(Observable_1.Observable)); exports.FromEventObservable = FromEventObservable; -},{"../Observable":29,"../Subscription":37,"../util/errorObject":163,"../util/isFunction":167,"../util/tryCatch":175}],92:[function(require,module,exports){ +},{"../Observable":29,"../Subscription":37,"../util/errorObject":224,"../util/isFunction":229,"../util/tryCatch":239}],99:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; @@ -7749,7 +7919,7 @@ var ArrayObservable_1 = require('./ArrayObservable'); var ArrayLikeObservable_1 = require('./ArrayLikeObservable'); var iterator_1 = require('../symbol/iterator'); var Observable_1 = require('../Observable'); -var observeOn_1 = require('../operator/observeOn'); +var observeOn_1 = require('../operators/observeOn'); var observable_1 = require('../symbol/observable'); /** * We need this JSDoc comment for affecting ESDoc. @@ -7856,7 +8026,7 @@ var FromObservable = (function (_super) { }(Observable_1.Observable)); exports.FromObservable = FromObservable; -},{"../Observable":29,"../operator/observeOn":129,"../symbol/iterator":154,"../symbol/observable":155,"../util/isArray":164,"../util/isArrayLike":165,"../util/isPromise":170,"./ArrayLikeObservable":85,"./ArrayObservable":86,"./IteratorObservable":93,"./PromiseObservable":94}],93:[function(require,module,exports){ +},{"../Observable":29,"../operators/observeOn":183,"../symbol/iterator":214,"../symbol/observable":215,"../util/isArray":226,"../util/isArrayLike":227,"../util/isPromise":232,"./ArrayLikeObservable":92,"./ArrayObservable":93,"./IteratorObservable":100,"./PromiseObservable":101}],100:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; @@ -8020,7 +8190,7 @@ function sign(value) { return valueAsNumber < 0 ? -1 : 1; } -},{"../Observable":29,"../symbol/iterator":154,"../util/root":172}],94:[function(require,module,exports){ +},{"../Observable":29,"../symbol/iterator":214,"../util/root":236}],101:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; @@ -8142,7 +8312,7 @@ function dispatchError(arg) { } } -},{"../Observable":29,"../util/root":172}],95:[function(require,module,exports){ +},{"../Observable":29,"../util/root":236}],102:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; @@ -8201,7 +8371,7 @@ var ScalarObservable = (function (_super) { }(Observable_1.Observable)); exports.ScalarObservable = ScalarObservable; -},{"../Observable":29}],96:[function(require,module,exports){ +},{"../Observable":29}],103:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; @@ -8309,12 +8479,12 @@ var TimerObservable = (function (_super) { }(Observable_1.Observable)); exports.TimerObservable = TimerObservable; -},{"../Observable":29,"../scheduler/async":152,"../util/isDate":166,"../util/isNumeric":168,"../util/isScheduler":171}],97:[function(require,module,exports){ +},{"../Observable":29,"../scheduler/async":212,"../util/isDate":228,"../util/isNumeric":230,"../util/isScheduler":233}],104:[function(require,module,exports){ "use strict"; var isScheduler_1 = require('../util/isScheduler'); var isArray_1 = require('../util/isArray'); var ArrayObservable_1 = require('./ArrayObservable'); -var combineLatest_1 = require('../operator/combineLatest'); +var combineLatest_1 = require('../operators/combineLatest'); /* tslint:enable:max-line-length */ /** * Combines multiple Observables to create an Observable whose values are @@ -8446,65 +8616,223 @@ function combineLatest() { } exports.combineLatest = combineLatest; -},{"../operator/combineLatest":112,"../util/isArray":164,"../util/isScheduler":171,"./ArrayObservable":86}],98:[function(require,module,exports){ +},{"../operators/combineLatest":164,"../util/isArray":226,"../util/isScheduler":233,"./ArrayObservable":93}],105:[function(require,module,exports){ +"use strict"; +var isScheduler_1 = require('../util/isScheduler'); +var of_1 = require('./of'); +var from_1 = require('./from'); +var concatAll_1 = require('../operators/concatAll'); +/* tslint:enable:max-line-length */ +/** + * Creates an output Observable which sequentially emits all values from given + * Observable and then moves on to the next. + * + * Concatenates multiple Observables together by + * sequentially emitting their values, one Observable after the other. + * + * + * + * `concat` joins multiple Observables together, by subscribing to them one at a time and + * merging their results into the output Observable. You can pass either an array of + * Observables, or put them directly as arguments. Passing an empty array will result + * in Observable that completes immediately. + * + * `concat` will subscribe to first input Observable and emit all its values, without + * changing or affecting them in any way. When that Observable completes, it will + * subscribe to then next Observable passed and, again, emit its values. This will be + * repeated, until the operator runs out of Observables. When last input Observable completes, + * `concat` will complete as well. At any given moment only one Observable passed to operator + * emits values. If you would like to emit values from passed Observables concurrently, check out + * {@link merge} instead, especially with optional `concurrent` parameter. As a matter of fact, + * `concat` is an equivalent of `merge` operator with `concurrent` parameter set to `1`. + * + * Note that if some input Observable never completes, `concat` will also never complete + * and Observables following the one that did not complete will never be subscribed. On the other + * hand, if some Observable simply completes immediately after it is subscribed, it will be + * invisible for `concat`, which will just move on to the next Observable. + * + * If any Observable in chain errors, instead of passing control to the next Observable, + * `concat` will error immediately as well. Observables that would be subscribed after + * the one that emitted error, never will. + * + * If you pass to `concat` the same Observable many times, its stream of values + * will be "replayed" on every subscription, which means you can repeat given Observable + * as many times as you like. If passing the same Observable to `concat` 1000 times becomes tedious, + * you can always use {@link repeat}. + * + * @example Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10 + * var timer = Rx.Observable.interval(1000).take(4); + * var sequence = Rx.Observable.range(1, 10); + * var result = Rx.Observable.concat(timer, sequence); + * result.subscribe(x => console.log(x)); + * + * // results in: + * // 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10 + * + * + * @example Concatenate an array of 3 Observables + * var timer1 = Rx.Observable.interval(1000).take(10); + * var timer2 = Rx.Observable.interval(2000).take(6); + * var timer3 = Rx.Observable.interval(500).take(10); + * var result = Rx.Observable.concat([timer1, timer2, timer3]); // note that array is passed + * result.subscribe(x => console.log(x)); + * + * // results in the following: + * // (Prints to console sequentially) + * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9 + * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5 + * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9 + * + * + * @example Concatenate the same Observable to repeat it + * const timer = Rx.Observable.interval(1000).take(2); + * + * Rx.Observable.concat(timer, timer) // concating the same Observable! + * .subscribe( + * value => console.log(value), + * err => {}, + * () => console.log('...and it is done!') + * ); + * + * // Logs: + * // 0 after 1s + * // 1 after 2s + * // 0 after 3s + * // 1 after 4s + * // "...and it is done!" also after 4s + * + * @see {@link concatAll} + * @see {@link concatMap} + * @see {@link concatMapTo} + * + * @param {ObservableInput} input1 An input Observable to concatenate with others. + * @param {ObservableInput} input2 An input Observable to concatenate with others. + * More than one input Observables may be given as argument. + * @param {Scheduler} [scheduler=null] An optional IScheduler to schedule each + * Observable subscription on. + * @return {Observable} All values of each passed Observable merged into a + * single Observable, in order, in serial fashion. + * @static true + * @name concat + * @owner Observable + */ +function concat() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i - 0] = arguments[_i]; + } + if (observables.length === 1 || (observables.length === 2 && isScheduler_1.isScheduler(observables[1]))) { + return from_1.from(observables[0]); + } + return concatAll_1.concatAll()(of_1.of.apply(void 0, observables)); +} +exports.concat = concat; + +},{"../operators/concatAll":166,"../util/isScheduler":233,"./from":108,"./of":112}],106:[function(require,module,exports){ "use strict"; var DeferObservable_1 = require('./DeferObservable'); exports.defer = DeferObservable_1.DeferObservable.create; -},{"./DeferObservable":88}],99:[function(require,module,exports){ +},{"./DeferObservable":95}],107:[function(require,module,exports){ "use strict"; var EmptyObservable_1 = require('./EmptyObservable'); exports.empty = EmptyObservable_1.EmptyObservable.create; -},{"./EmptyObservable":89}],100:[function(require,module,exports){ +},{"./EmptyObservable":96}],108:[function(require,module,exports){ "use strict"; var FromObservable_1 = require('./FromObservable'); exports.from = FromObservable_1.FromObservable.create; -},{"./FromObservable":92}],101:[function(require,module,exports){ +},{"./FromObservable":99}],109:[function(require,module,exports){ "use strict"; var FromEventObservable_1 = require('./FromEventObservable'); exports.fromEvent = FromEventObservable_1.FromEventObservable.create; -},{"./FromEventObservable":91}],102:[function(require,module,exports){ +},{"./FromEventObservable":98}],110:[function(require,module,exports){ "use strict"; var PromiseObservable_1 = require('./PromiseObservable'); exports.fromPromise = PromiseObservable_1.PromiseObservable.create; -},{"./PromiseObservable":94}],103:[function(require,module,exports){ +},{"./PromiseObservable":101}],111:[function(require,module,exports){ "use strict"; var merge_1 = require('../operator/merge'); exports.merge = merge_1.mergeStatic; -},{"../operator/merge":125}],104:[function(require,module,exports){ +},{"../operator/merge":135}],112:[function(require,module,exports){ "use strict"; var ArrayObservable_1 = require('./ArrayObservable'); exports.of = ArrayObservable_1.ArrayObservable.of; -},{"./ArrayObservable":86}],105:[function(require,module,exports){ +},{"./ArrayObservable":93}],113:[function(require,module,exports){ "use strict"; var ErrorObservable_1 = require('./ErrorObservable'); exports._throw = ErrorObservable_1.ErrorObservable.create; -},{"./ErrorObservable":90}],106:[function(require,module,exports){ +},{"./ErrorObservable":97}],114:[function(require,module,exports){ "use strict"; var TimerObservable_1 = require('./TimerObservable'); exports.timer = TimerObservable_1.TimerObservable.create; -},{"./TimerObservable":96}],107:[function(require,module,exports){ +},{"./TimerObservable":103}],115:[function(require,module,exports){ "use strict"; -var zip_1 = require('../operator/zip'); +var zip_1 = require('../operators/zip'); exports.zip = zip_1.zipStatic; -},{"../operator/zip":146}],108:[function(require,module,exports){ +},{"../operators/zip":206}],116:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var OuterSubscriber_1 = require('../OuterSubscriber'); -var subscribeToResult_1 = require('../util/subscribeToResult'); +var async_1 = require('../scheduler/async'); +var auditTime_1 = require('../operators/auditTime'); +/** + * Ignores source values for `duration` milliseconds, then emits the most recent + * value from the source Observable, then repeats this process. + * + * When it sees a source values, it ignores that plus + * the next ones for `duration` milliseconds, and then it emits the most recent + * value from the source. + * + * + * + * `auditTime` is similar to `throttleTime`, but emits the last value from the + * silenced time window, instead of the first value. `auditTime` emits the most + * recent value from the source Observable on the output Observable as soon as + * its internal timer becomes disabled, and ignores source values while the + * timer is enabled. Initially, the timer is disabled. As soon as the first + * source value arrives, the timer is enabled. After `duration` milliseconds (or + * the time unit determined internally by the optional `scheduler`) has passed, + * the timer is disabled, then the most recent source value is emitted on the + * output Observable, and this process repeats for the next source value. + * Optionally takes a {@link IScheduler} for managing timers. + * + * @example Emit clicks at a rate of at most one click per second + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var result = clicks.auditTime(1000); + * result.subscribe(x => console.log(x)); + * + * @see {@link audit} + * @see {@link debounceTime} + * @see {@link delay} + * @see {@link sampleTime} + * @see {@link throttleTime} + * + * @param {number} duration Time to wait before emitting the most recent source + * value, measured in milliseconds or the time unit determined internally + * by the optional `scheduler`. + * @param {Scheduler} [scheduler=async] The {@link IScheduler} to use for + * managing the timers that handle the rate-limiting behavior. + * @return {Observable} An Observable that performs rate-limiting of + * emissions from the source Observable. + * @method auditTime + * @owner Observable + */ +function auditTime(duration, scheduler) { + if (scheduler === void 0) { scheduler = async_1.async; } + return auditTime_1.auditTime(duration, scheduler)(this); +} +exports.auditTime = auditTime; + +},{"../operators/auditTime":159,"../scheduler/async":212}],117:[function(require,module,exports){ +"use strict"; +var buffer_1 = require('../operators/buffer'); /** * Buffers the source Observable values until `closingNotifier` emits. * @@ -8538,49 +8866,13 @@ var subscribeToResult_1 = require('../util/subscribeToResult'); * @owner Observable */ function buffer(closingNotifier) { - return this.lift(new BufferOperator(closingNotifier)); + return buffer_1.buffer(closingNotifier)(this); } exports.buffer = buffer; -var BufferOperator = (function () { - function BufferOperator(closingNotifier) { - this.closingNotifier = closingNotifier; - } - BufferOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier)); - }; - return BufferOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var BufferSubscriber = (function (_super) { - __extends(BufferSubscriber, _super); - function BufferSubscriber(destination, closingNotifier) { - _super.call(this, destination); - this.buffer = []; - this.add(subscribeToResult_1.subscribeToResult(this, closingNotifier)); - } - BufferSubscriber.prototype._next = function (value) { - this.buffer.push(value); - }; - BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - var buffer = this.buffer; - this.buffer = []; - this.destination.next(buffer); - }; - return BufferSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],109:[function(require,module,exports){ +},{"../operators/buffer":160}],118:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscriber_1 = require('../Subscriber'); +var bufferCount_1 = require('../operators/bufferCount'); /** * Buffers the source Observable values until the size hits the maximum * `bufferSize` given. @@ -8624,108 +8916,13 @@ var Subscriber_1 = require('../Subscriber'); */ function bufferCount(bufferSize, startBufferEvery) { if (startBufferEvery === void 0) { startBufferEvery = null; } - return this.lift(new BufferCountOperator(bufferSize, startBufferEvery)); + return bufferCount_1.bufferCount(bufferSize, startBufferEvery)(this); } exports.bufferCount = bufferCount; -var BufferCountOperator = (function () { - function BufferCountOperator(bufferSize, startBufferEvery) { - this.bufferSize = bufferSize; - this.startBufferEvery = startBufferEvery; - if (!startBufferEvery || bufferSize === startBufferEvery) { - this.subscriberClass = BufferCountSubscriber; - } - else { - this.subscriberClass = BufferSkipCountSubscriber; - } - } - BufferCountOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery)); - }; - return BufferCountOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var BufferCountSubscriber = (function (_super) { - __extends(BufferCountSubscriber, _super); - function BufferCountSubscriber(destination, bufferSize) { - _super.call(this, destination); - this.bufferSize = bufferSize; - this.buffer = []; - } - BufferCountSubscriber.prototype._next = function (value) { - var buffer = this.buffer; - buffer.push(value); - if (buffer.length == this.bufferSize) { - this.destination.next(buffer); - this.buffer = []; - } - }; - BufferCountSubscriber.prototype._complete = function () { - var buffer = this.buffer; - if (buffer.length > 0) { - this.destination.next(buffer); - } - _super.prototype._complete.call(this); - }; - return BufferCountSubscriber; -}(Subscriber_1.Subscriber)); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var BufferSkipCountSubscriber = (function (_super) { - __extends(BufferSkipCountSubscriber, _super); - function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) { - _super.call(this, destination); - this.bufferSize = bufferSize; - this.startBufferEvery = startBufferEvery; - this.buffers = []; - this.count = 0; - } - BufferSkipCountSubscriber.prototype._next = function (value) { - var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count; - this.count++; - if (count % startBufferEvery === 0) { - buffers.push([]); - } - for (var i = buffers.length; i--;) { - var buffer = buffers[i]; - buffer.push(value); - if (buffer.length === bufferSize) { - buffers.splice(i, 1); - this.destination.next(buffer); - } - } - }; - BufferSkipCountSubscriber.prototype._complete = function () { - var _a = this, buffers = _a.buffers, destination = _a.destination; - while (buffers.length > 0) { - var buffer = buffers.shift(); - if (buffer.length > 0) { - destination.next(buffer); - } - } - _super.prototype._complete.call(this); - }; - return BufferSkipCountSubscriber; -}(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],110:[function(require,module,exports){ +},{"../operators/bufferCount":161}],119:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscription_1 = require('../Subscription'); -var tryCatch_1 = require('../util/tryCatch'); -var errorObject_1 = require('../util/errorObject'); -var OuterSubscriber_1 = require('../OuterSubscriber'); -var subscribeToResult_1 = require('../util/subscribeToResult'); +var bufferWhen_1 = require('../operators/bufferWhen'); /** * Buffers the source Observable values, using a factory function of closing * Observables to determine when to close, emit, and reset the buffer. @@ -8760,92 +8957,13 @@ var subscribeToResult_1 = require('../util/subscribeToResult'); * @owner Observable */ function bufferWhen(closingSelector) { - return this.lift(new BufferWhenOperator(closingSelector)); + return bufferWhen_1.bufferWhen(closingSelector)(this); } exports.bufferWhen = bufferWhen; -var BufferWhenOperator = (function () { - function BufferWhenOperator(closingSelector) { - this.closingSelector = closingSelector; - } - BufferWhenOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector)); - }; - return BufferWhenOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var BufferWhenSubscriber = (function (_super) { - __extends(BufferWhenSubscriber, _super); - function BufferWhenSubscriber(destination, closingSelector) { - _super.call(this, destination); - this.closingSelector = closingSelector; - this.subscribing = false; - this.openBuffer(); - } - BufferWhenSubscriber.prototype._next = function (value) { - this.buffer.push(value); - }; - BufferWhenSubscriber.prototype._complete = function () { - var buffer = this.buffer; - if (buffer) { - this.destination.next(buffer); - } - _super.prototype._complete.call(this); - }; - BufferWhenSubscriber.prototype._unsubscribe = function () { - this.buffer = null; - this.subscribing = false; - }; - BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.openBuffer(); - }; - BufferWhenSubscriber.prototype.notifyComplete = function () { - if (this.subscribing) { - this.complete(); - } - else { - this.openBuffer(); - } - }; - BufferWhenSubscriber.prototype.openBuffer = function () { - var closingSubscription = this.closingSubscription; - if (closingSubscription) { - this.remove(closingSubscription); - closingSubscription.unsubscribe(); - } - var buffer = this.buffer; - if (this.buffer) { - this.destination.next(buffer); - } - this.buffer = []; - var closingNotifier = tryCatch_1.tryCatch(this.closingSelector)(); - if (closingNotifier === errorObject_1.errorObject) { - this.error(errorObject_1.errorObject.e); - } - else { - closingSubscription = new Subscription_1.Subscription(); - this.closingSubscription = closingSubscription; - this.add(closingSubscription); - this.subscribing = true; - closingSubscription.add(subscribeToResult_1.subscribeToResult(this, closingNotifier)); - this.subscribing = false; - } - }; - return BufferWhenSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":31,"../Subscription":37,"../util/errorObject":163,"../util/subscribeToResult":173,"../util/tryCatch":175}],111:[function(require,module,exports){ +},{"../operators/bufferWhen":162}],120:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var OuterSubscriber_1 = require('../OuterSubscriber'); -var subscribeToResult_1 = require('../util/subscribeToResult'); +var catchError_1 = require('../operators/catchError'); /** * Catches errors on the observable to be handled by returning a new observable or throwing an error. * @@ -8906,66 +9024,13 @@ var subscribeToResult_1 = require('../util/subscribeToResult'); * @owner Observable */ function _catch(selector) { - var operator = new CatchOperator(selector); - var caught = this.lift(operator); - return (operator.caught = caught); + return catchError_1.catchError(selector)(this); } exports._catch = _catch; -var CatchOperator = (function () { - function CatchOperator(selector) { - this.selector = selector; - } - CatchOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught)); - }; - return CatchOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var CatchSubscriber = (function (_super) { - __extends(CatchSubscriber, _super); - function CatchSubscriber(destination, selector, caught) { - _super.call(this, destination); - this.selector = selector; - this.caught = caught; - } - // NOTE: overriding `error` instead of `_error` because we don't want - // to have this flag this subscriber as `isStopped`. We can mimic the - // behavior of the RetrySubscriber (from the `retry` operator), where - // we unsubscribe from our source chain, reset our Subscriber flags, - // then subscribe to the selector result. - CatchSubscriber.prototype.error = function (err) { - if (!this.isStopped) { - var result = void 0; - try { - result = this.selector(err, this.caught); - } - catch (err2) { - _super.prototype.error.call(this, err2); - return; - } - this._unsubscribeAndRecycle(); - this.add(subscribeToResult_1.subscribeToResult(this, result)); - } - }; - return CatchSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],112:[function(require,module,exports){ +},{"../operators/catchError":163}],121:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var ArrayObservable_1 = require('../observable/ArrayObservable'); -var isArray_1 = require('../util/isArray'); -var OuterSubscriber_1 = require('../OuterSubscriber'); -var subscribeToResult_1 = require('../util/subscribeToResult'); -var none = {}; +var combineLatest_1 = require('../operators/combineLatest'); /* tslint:enable:max-line-length */ /** * Combines multiple Observables to create an Observable whose values are @@ -9015,104 +9080,13 @@ function combineLatest() { for (var _i = 0; _i < arguments.length; _i++) { observables[_i - 0] = arguments[_i]; } - var project = null; - if (typeof observables[observables.length - 1] === 'function') { - project = observables.pop(); - } - // if the first and only other argument besides the resultSelector is an array - // assume it's been called with `combineLatest([obs1, obs2, obs3], project)` - if (observables.length === 1 && isArray_1.isArray(observables[0])) { - observables = observables[0].slice(); - } - observables.unshift(this); - return this.lift.call(new ArrayObservable_1.ArrayObservable(observables), new CombineLatestOperator(project)); + return combineLatest_1.combineLatest.apply(void 0, observables)(this); } exports.combineLatest = combineLatest; -var CombineLatestOperator = (function () { - function CombineLatestOperator(project) { - this.project = project; - } - CombineLatestOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new CombineLatestSubscriber(subscriber, this.project)); - }; - return CombineLatestOperator; -}()); -exports.CombineLatestOperator = CombineLatestOperator; -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var CombineLatestSubscriber = (function (_super) { - __extends(CombineLatestSubscriber, _super); - function CombineLatestSubscriber(destination, project) { - _super.call(this, destination); - this.project = project; - this.active = 0; - this.values = []; - this.observables = []; - } - CombineLatestSubscriber.prototype._next = function (observable) { - this.values.push(none); - this.observables.push(observable); - }; - CombineLatestSubscriber.prototype._complete = function () { - var observables = this.observables; - var len = observables.length; - if (len === 0) { - this.destination.complete(); - } - else { - this.active = len; - this.toRespond = len; - for (var i = 0; i < len; i++) { - var observable = observables[i]; - this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i)); - } - } - }; - CombineLatestSubscriber.prototype.notifyComplete = function (unused) { - if ((this.active -= 1) === 0) { - this.destination.complete(); - } - }; - CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - var values = this.values; - var oldVal = values[outerIndex]; - var toRespond = !this.toRespond - ? 0 - : oldVal === none ? --this.toRespond : this.toRespond; - values[outerIndex] = innerValue; - if (toRespond === 0) { - if (this.project) { - this._tryProject(values); - } - else { - this.destination.next(values.slice()); - } - } - }; - CombineLatestSubscriber.prototype._tryProject = function (values) { - var result; - try { - result = this.project.apply(this, values); - } - catch (err) { - this.destination.error(err); - return; - } - this.destination.next(result); - }; - return CombineLatestSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); -exports.CombineLatestSubscriber = CombineLatestSubscriber; -},{"../OuterSubscriber":31,"../observable/ArrayObservable":86,"../util/isArray":164,"../util/subscribeToResult":173}],113:[function(require,module,exports){ +},{"../operators/combineLatest":164}],122:[function(require,module,exports){ "use strict"; -var Observable_1 = require('../Observable'); -var isScheduler_1 = require('../util/isScheduler'); -var ArrayObservable_1 = require('../observable/ArrayObservable'); -var mergeAll_1 = require('./mergeAll'); +var concat_1 = require('../operators/concat'); /* tslint:enable:max-line-length */ /** * Creates an output Observable which sequentially emits all values from every @@ -9168,129 +9142,70 @@ function concat() { for (var _i = 0; _i < arguments.length; _i++) { observables[_i - 0] = arguments[_i]; } - return this.lift.call(concatStatic.apply(void 0, [this].concat(observables))); + return concat_1.concat.apply(void 0, observables)(this); } exports.concat = concat; -/* tslint:enable:max-line-length */ + +},{"../operators/concat":165}],123:[function(require,module,exports){ +"use strict"; +var count_1 = require('../operators/count'); /** - * Creates an output Observable which sequentially emits all values from given - * Observable and then moves on to the next. - * - * Concatenates multiple Observables together by - * sequentially emitting their values, one Observable after the other. - * - * - * - * `concat` joins multiple Observables together, by subscribing to them one at a time and - * merging their results into the output Observable. You can pass either an array of - * Observables, or put them directly as arguments. Passing an empty array will result - * in Observable that completes immediately. - * - * `concat` will subscribe to first input Observable and emit all its values, without - * changing or affecting them in any way. When that Observable completes, it will - * subscribe to then next Observable passed and, again, emit its values. This will be - * repeated, until the operator runs out of Observables. When last input Observable completes, - * `concat` will complete as well. At any given moment only one Observable passed to operator - * emits values. If you would like to emit values from passed Observables concurrently, check out - * {@link merge} instead, especially with optional `concurrent` parameter. As a matter of fact, - * `concat` is an equivalent of `merge` operator with `concurrent` parameter set to `1`. + * Counts the number of emissions on the source and emits that number when the + * source completes. * - * Note that if some input Observable never completes, `concat` will also never complete - * and Observables following the one that did not complete will never be subscribed. On the other - * hand, if some Observable simply completes immediately after it is subscribed, it will be - * invisible for `concat`, which will just move on to the next Observable. + * Tells how many values were emitted, when the source + * completes. * - * If any Observable in chain errors, instead of passing control to the next Observable, - * `concat` will error immediately as well. Observables that would be subscribed after - * the one that emitted error, never will. + * * - * If you pass to `concat` the same Observable many times, its stream of values - * will be "replayed" on every subscription, which means you can repeat given Observable - * as many times as you like. If passing the same Observable to `concat` 1000 times becomes tedious, - * you can always use {@link repeat}. + * `count` transforms an Observable that emits values into an Observable that + * emits a single value that represents the number of values emitted by the + * source Observable. If the source Observable terminates with an error, `count` + * will pass this error notification along without emitting a value first. If + * the source Observable does not terminate at all, `count` will neither emit + * a value nor terminate. This operator takes an optional `predicate` function + * as argument, in which case the output emission will represent the number of + * source values that matched `true` with the `predicate`. * - * @example Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10 - * var timer = Rx.Observable.interval(1000).take(4); - * var sequence = Rx.Observable.range(1, 10); - * var result = Rx.Observable.concat(timer, sequence); + * @example Counts how many seconds have passed before the first click happened + * var seconds = Rx.Observable.interval(1000); + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var secondsBeforeClick = seconds.takeUntil(clicks); + * var result = secondsBeforeClick.count(); * result.subscribe(x => console.log(x)); * - * // results in: - * // 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10 - * - * - * @example Concatenate an array of 3 Observables - * var timer1 = Rx.Observable.interval(1000).take(10); - * var timer2 = Rx.Observable.interval(2000).take(6); - * var timer3 = Rx.Observable.interval(500).take(10); - * var result = Rx.Observable.concat([timer1, timer2, timer3]); // note that array is passed + * @example Counts how many odd numbers are there between 1 and 7 + * var numbers = Rx.Observable.range(1, 7); + * var result = numbers.count(i => i % 2 === 1); * result.subscribe(x => console.log(x)); * - * // results in the following: - * // (Prints to console sequentially) - * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9 - * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5 - * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9 - * - * - * @example Concatenate the same Observable to repeat it - * const timer = Rx.Observable.interval(1000).take(2); - * - * Rx.Observable.concat(timer, timer) // concating the same Observable! - * .subscribe( - * value => console.log(value), - * err => {}, - * () => console.log('...and it is done!') - * ); - * - * // Logs: - * // 0 after 1s - * // 1 after 2s - * // 0 after 3s - * // 1 after 4s - * // "...and it is done!" also after 4s + * // Results in: + * // 4 * - * @see {@link concatAll} - * @see {@link concatMap} - * @see {@link concatMapTo} + * @see {@link max} + * @see {@link min} + * @see {@link reduce} * - * @param {ObservableInput} input1 An input Observable to concatenate with others. - * @param {ObservableInput} input2 An input Observable to concatenate with others. - * More than one input Observables may be given as argument. - * @param {Scheduler} [scheduler=null] An optional IScheduler to schedule each - * Observable subscription on. - * @return {Observable} All values of each passed Observable merged into a - * single Observable, in order, in serial fashion. - * @static true - * @name concat + * @param {function(value: T, i: number, source: Observable): boolean} [predicate] A + * boolean function to select what values are to be counted. It is provided with + * arguments of: + * - `value`: the value from the source Observable. + * - `index`: the (zero-based) "index" of the value from the source Observable. + * - `source`: the source Observable instance itself. + * @return {Observable} An Observable of one number that represents the count as + * described above. + * @method count * @owner Observable */ -function concatStatic() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i - 0] = arguments[_i]; - } - var scheduler = null; - var args = observables; - if (isScheduler_1.isScheduler(args[observables.length - 1])) { - scheduler = args.pop(); - } - if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) { - return observables[0]; - } - return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(1)); +function count(predicate) { + return count_1.count(predicate)(this); } -exports.concatStatic = concatStatic; +exports.count = count; -},{"../Observable":29,"../observable/ArrayObservable":86,"../util/isScheduler":171,"./mergeAll":126}],114:[function(require,module,exports){ +},{"../operators/count":167}],124:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscriber_1 = require('../Subscriber'); var async_1 = require('../scheduler/async'); +var debounceTime_1 = require('../operators/debounceTime'); /** * Emits a value from the source Observable only after a particular time span * has passed without another source emission. @@ -9339,77 +9254,14 @@ var async_1 = require('../scheduler/async'); */ function debounceTime(dueTime, scheduler) { if (scheduler === void 0) { scheduler = async_1.async; } - return this.lift(new DebounceTimeOperator(dueTime, scheduler)); + return debounceTime_1.debounceTime(dueTime, scheduler)(this); } exports.debounceTime = debounceTime; -var DebounceTimeOperator = (function () { - function DebounceTimeOperator(dueTime, scheduler) { - this.dueTime = dueTime; - this.scheduler = scheduler; - } - DebounceTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler)); - }; - return DebounceTimeOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var DebounceTimeSubscriber = (function (_super) { - __extends(DebounceTimeSubscriber, _super); - function DebounceTimeSubscriber(destination, dueTime, scheduler) { - _super.call(this, destination); - this.dueTime = dueTime; - this.scheduler = scheduler; - this.debouncedSubscription = null; - this.lastValue = null; - this.hasValue = false; - } - DebounceTimeSubscriber.prototype._next = function (value) { - this.clearDebounce(); - this.lastValue = value; - this.hasValue = true; - this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this)); - }; - DebounceTimeSubscriber.prototype._complete = function () { - this.debouncedNext(); - this.destination.complete(); - }; - DebounceTimeSubscriber.prototype.debouncedNext = function () { - this.clearDebounce(); - if (this.hasValue) { - this.destination.next(this.lastValue); - this.lastValue = null; - this.hasValue = false; - } - }; - DebounceTimeSubscriber.prototype.clearDebounce = function () { - var debouncedSubscription = this.debouncedSubscription; - if (debouncedSubscription !== null) { - this.remove(debouncedSubscription); - debouncedSubscription.unsubscribe(); - this.debouncedSubscription = null; - } - }; - return DebounceTimeSubscriber; -}(Subscriber_1.Subscriber)); -function dispatchNext(subscriber) { - subscriber.debouncedNext(); -} -},{"../Subscriber":36,"../scheduler/async":152}],115:[function(require,module,exports){ +},{"../operators/debounceTime":168,"../scheduler/async":212}],125:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; var async_1 = require('../scheduler/async'); -var isDate_1 = require('../util/isDate'); -var Subscriber_1 = require('../Subscriber'); -var Notification_1 = require('../Notification'); +var delay_1 = require('../operators/delay'); /** * Delays the emission of items from the source Observable by a given timeout or * until a given Date. @@ -9451,100 +9303,13 @@ var Notification_1 = require('../Notification'); */ function delay(delay, scheduler) { if (scheduler === void 0) { scheduler = async_1.async; } - var absoluteDelay = isDate_1.isDate(delay); - var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay); - return this.lift(new DelayOperator(delayFor, scheduler)); + return delay_1.delay(delay, scheduler)(this); } exports.delay = delay; -var DelayOperator = (function () { - function DelayOperator(delay, scheduler) { - this.delay = delay; - this.scheduler = scheduler; - } - DelayOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler)); - }; - return DelayOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var DelaySubscriber = (function (_super) { - __extends(DelaySubscriber, _super); - function DelaySubscriber(destination, delay, scheduler) { - _super.call(this, destination); - this.delay = delay; - this.scheduler = scheduler; - this.queue = []; - this.active = false; - this.errored = false; - } - DelaySubscriber.dispatch = function (state) { - var source = state.source; - var queue = source.queue; - var scheduler = state.scheduler; - var destination = state.destination; - while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) { - queue.shift().notification.observe(destination); - } - if (queue.length > 0) { - var delay_1 = Math.max(0, queue[0].time - scheduler.now()); - this.schedule(state, delay_1); - } - else { - source.active = false; - } - }; - DelaySubscriber.prototype._schedule = function (scheduler) { - this.active = true; - this.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, { - source: this, destination: this.destination, scheduler: scheduler - })); - }; - DelaySubscriber.prototype.scheduleNotification = function (notification) { - if (this.errored === true) { - return; - } - var scheduler = this.scheduler; - var message = new DelayMessage(scheduler.now() + this.delay, notification); - this.queue.push(message); - if (this.active === false) { - this._schedule(scheduler); - } - }; - DelaySubscriber.prototype._next = function (value) { - this.scheduleNotification(Notification_1.Notification.createNext(value)); - }; - DelaySubscriber.prototype._error = function (err) { - this.errored = true; - this.queue = []; - this.destination.error(err); - }; - DelaySubscriber.prototype._complete = function () { - this.scheduleNotification(Notification_1.Notification.createComplete()); - }; - return DelaySubscriber; -}(Subscriber_1.Subscriber)); -var DelayMessage = (function () { - function DelayMessage(time, notification) { - this.time = time; - this.notification = notification; - } - return DelayMessage; -}()); -},{"../Notification":28,"../Subscriber":36,"../scheduler/async":152,"../util/isDate":166}],116:[function(require,module,exports){ +},{"../operators/delay":170,"../scheduler/async":212}],126:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var OuterSubscriber_1 = require('../OuterSubscriber'); -var subscribeToResult_1 = require('../util/subscribeToResult'); -var Set_1 = require('../util/Set'); +var distinct_1 = require('../operators/distinct'); /** * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from previous items. * @@ -9591,82 +9356,14 @@ var Set_1 = require('../util/Set'); * @owner Observable */ function distinct(keySelector, flushes) { - return this.lift(new DistinctOperator(keySelector, flushes)); + return distinct_1.distinct(keySelector, flushes)(this); } exports.distinct = distinct; -var DistinctOperator = (function () { - function DistinctOperator(keySelector, flushes) { - this.keySelector = keySelector; - this.flushes = flushes; - } - DistinctOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes)); - }; - return DistinctOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var DistinctSubscriber = (function (_super) { - __extends(DistinctSubscriber, _super); - function DistinctSubscriber(destination, keySelector, flushes) { - _super.call(this, destination); - this.keySelector = keySelector; - this.values = new Set_1.Set(); - if (flushes) { - this.add(subscribeToResult_1.subscribeToResult(this, flushes)); - } - } - DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.values.clear(); - }; - DistinctSubscriber.prototype.notifyError = function (error, innerSub) { - this._error(error); - }; - DistinctSubscriber.prototype._next = function (value) { - if (this.keySelector) { - this._useKeySelector(value); - } - else { - this._finalizeNext(value, value); - } - }; - DistinctSubscriber.prototype._useKeySelector = function (value) { - var key; - var destination = this.destination; - try { - key = this.keySelector(value); - } - catch (err) { - destination.error(err); - return; - } - this._finalizeNext(key, value); - }; - DistinctSubscriber.prototype._finalizeNext = function (key, value) { - var values = this.values; - if (!values.has(key)) { - values.add(key); - this.destination.next(value); - } - }; - return DistinctSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); -exports.DistinctSubscriber = DistinctSubscriber; - -},{"../OuterSubscriber":31,"../util/Set":161,"../util/subscribeToResult":173}],117:[function(require,module,exports){ -"use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscriber_1 = require('../Subscriber'); -var tryCatch_1 = require('../util/tryCatch'); -var errorObject_1 = require('../util/errorObject'); -/* tslint:enable:max-line-length */ + +},{"../operators/distinct":171}],127:[function(require,module,exports){ +"use strict"; +var distinctUntilChanged_1 = require('../operators/distinctUntilChanged'); +/* tslint:enable:max-line-length */ /** * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from the previous item. * @@ -9707,72 +9404,13 @@ var errorObject_1 = require('../util/errorObject'); * @owner Observable */ function distinctUntilChanged(compare, keySelector) { - return this.lift(new DistinctUntilChangedOperator(compare, keySelector)); + return distinctUntilChanged_1.distinctUntilChanged(compare, keySelector)(this); } exports.distinctUntilChanged = distinctUntilChanged; -var DistinctUntilChangedOperator = (function () { - function DistinctUntilChangedOperator(compare, keySelector) { - this.compare = compare; - this.keySelector = keySelector; - } - DistinctUntilChangedOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector)); - }; - return DistinctUntilChangedOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var DistinctUntilChangedSubscriber = (function (_super) { - __extends(DistinctUntilChangedSubscriber, _super); - function DistinctUntilChangedSubscriber(destination, compare, keySelector) { - _super.call(this, destination); - this.keySelector = keySelector; - this.hasKey = false; - if (typeof compare === 'function') { - this.compare = compare; - } - } - DistinctUntilChangedSubscriber.prototype.compare = function (x, y) { - return x === y; - }; - DistinctUntilChangedSubscriber.prototype._next = function (value) { - var keySelector = this.keySelector; - var key = value; - if (keySelector) { - key = tryCatch_1.tryCatch(this.keySelector)(value); - if (key === errorObject_1.errorObject) { - return this.destination.error(errorObject_1.errorObject.e); - } - } - var result = false; - if (this.hasKey) { - result = tryCatch_1.tryCatch(this.compare)(this.key, key); - if (result === errorObject_1.errorObject) { - return this.destination.error(errorObject_1.errorObject.e); - } - } - else { - this.hasKey = true; - } - if (Boolean(result) === false) { - this.key = key; - this.destination.next(value); - } - }; - return DistinctUntilChangedSubscriber; -}(Subscriber_1.Subscriber)); -},{"../Subscriber":36,"../util/errorObject":163,"../util/tryCatch":175}],118:[function(require,module,exports){ +},{"../operators/distinctUntilChanged":172}],128:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscriber_1 = require('../Subscriber'); +var tap_1 = require('../operators/tap'); /* tslint:enable:max-line-length */ /** * Perform a side effect for every emission on the source Observable, but return @@ -9818,78 +9456,13 @@ var Subscriber_1 = require('../Subscriber'); * @owner Observable */ function _do(nextOrObserver, error, complete) { - return this.lift(new DoOperator(nextOrObserver, error, complete)); + return tap_1.tap(nextOrObserver, error, complete)(this); } exports._do = _do; -var DoOperator = (function () { - function DoOperator(nextOrObserver, error, complete) { - this.nextOrObserver = nextOrObserver; - this.error = error; - this.complete = complete; - } - DoOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DoSubscriber(subscriber, this.nextOrObserver, this.error, this.complete)); - }; - return DoOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var DoSubscriber = (function (_super) { - __extends(DoSubscriber, _super); - function DoSubscriber(destination, nextOrObserver, error, complete) { - _super.call(this, destination); - var safeSubscriber = new Subscriber_1.Subscriber(nextOrObserver, error, complete); - safeSubscriber.syncErrorThrowable = true; - this.add(safeSubscriber); - this.safeSubscriber = safeSubscriber; - } - DoSubscriber.prototype._next = function (value) { - var safeSubscriber = this.safeSubscriber; - safeSubscriber.next(value); - if (safeSubscriber.syncErrorThrown) { - this.destination.error(safeSubscriber.syncErrorValue); - } - else { - this.destination.next(value); - } - }; - DoSubscriber.prototype._error = function (err) { - var safeSubscriber = this.safeSubscriber; - safeSubscriber.error(err); - if (safeSubscriber.syncErrorThrown) { - this.destination.error(safeSubscriber.syncErrorValue); - } - else { - this.destination.error(err); - } - }; - DoSubscriber.prototype._complete = function () { - var safeSubscriber = this.safeSubscriber; - safeSubscriber.complete(); - if (safeSubscriber.syncErrorThrown) { - this.destination.error(safeSubscriber.syncErrorValue); - } - else { - this.destination.complete(); - } - }; - return DoSubscriber; -}(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],119:[function(require,module,exports){ +},{"../operators/tap":203}],129:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var tryCatch_1 = require('../util/tryCatch'); -var errorObject_1 = require('../util/errorObject'); -var OuterSubscriber_1 = require('../OuterSubscriber'); -var subscribeToResult_1 = require('../util/subscribeToResult'); +var expand_1 = require('../operators/expand'); /* tslint:enable:max-line-length */ /** * Recursively projects each source value to an Observable which is merged in @@ -9940,105 +9513,13 @@ function expand(project, concurrent, scheduler) { if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; } if (scheduler === void 0) { scheduler = undefined; } concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent; - return this.lift(new ExpandOperator(project, concurrent, scheduler)); + return expand_1.expand(project, concurrent, scheduler)(this); } exports.expand = expand; -var ExpandOperator = (function () { - function ExpandOperator(project, concurrent, scheduler) { - this.project = project; - this.concurrent = concurrent; - this.scheduler = scheduler; - } - ExpandOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler)); - }; - return ExpandOperator; -}()); -exports.ExpandOperator = ExpandOperator; -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var ExpandSubscriber = (function (_super) { - __extends(ExpandSubscriber, _super); - function ExpandSubscriber(destination, project, concurrent, scheduler) { - _super.call(this, destination); - this.project = project; - this.concurrent = concurrent; - this.scheduler = scheduler; - this.index = 0; - this.active = 0; - this.hasCompleted = false; - if (concurrent < Number.POSITIVE_INFINITY) { - this.buffer = []; - } - } - ExpandSubscriber.dispatch = function (arg) { - var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index; - subscriber.subscribeToProjection(result, value, index); - }; - ExpandSubscriber.prototype._next = function (value) { - var destination = this.destination; - if (destination.closed) { - this._complete(); - return; - } - var index = this.index++; - if (this.active < this.concurrent) { - destination.next(value); - var result = tryCatch_1.tryCatch(this.project)(value, index); - if (result === errorObject_1.errorObject) { - destination.error(errorObject_1.errorObject.e); - } - else if (!this.scheduler) { - this.subscribeToProjection(result, value, index); - } - else { - var state = { subscriber: this, result: result, value: value, index: index }; - this.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state)); - } - } - else { - this.buffer.push(value); - } - }; - ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) { - this.active++; - this.add(subscribeToResult_1.subscribeToResult(this, result, value, index)); - }; - ExpandSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (this.hasCompleted && this.active === 0) { - this.destination.complete(); - } - }; - ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this._next(innerValue); - }; - ExpandSubscriber.prototype.notifyComplete = function (innerSub) { - var buffer = this.buffer; - this.remove(innerSub); - this.active--; - if (buffer && buffer.length > 0) { - this._next(buffer.shift()); - } - if (this.hasCompleted && this.active === 0) { - this.destination.complete(); - } - }; - return ExpandSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); -exports.ExpandSubscriber = ExpandSubscriber; -},{"../OuterSubscriber":31,"../util/errorObject":163,"../util/subscribeToResult":173,"../util/tryCatch":175}],120:[function(require,module,exports){ +},{"../operators/expand":173}],130:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscriber_1 = require('../Subscriber'); +var filter_1 = require('../operators/filter'); /* tslint:enable:max-line-length */ /** * Filter items emitted by the source Observable by only emitting those that @@ -10080,60 +9561,13 @@ var Subscriber_1 = require('../Subscriber'); * @owner Observable */ function filter(predicate, thisArg) { - return this.lift(new FilterOperator(predicate, thisArg)); + return filter_1.filter(predicate, thisArg)(this); } exports.filter = filter; -var FilterOperator = (function () { - function FilterOperator(predicate, thisArg) { - this.predicate = predicate; - this.thisArg = thisArg; - } - FilterOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg)); - }; - return FilterOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var FilterSubscriber = (function (_super) { - __extends(FilterSubscriber, _super); - function FilterSubscriber(destination, predicate, thisArg) { - _super.call(this, destination); - this.predicate = predicate; - this.thisArg = thisArg; - this.count = 0; - this.predicate = predicate; - } - // the try catch block below is left specifically for - // optimization and perf reasons. a tryCatcher is not necessary here. - FilterSubscriber.prototype._next = function (value) { - var result; - try { - result = this.predicate.call(this.thisArg, value, this.count++); - } - catch (err) { - this.destination.error(err); - return; - } - if (result) { - this.destination.next(value); - } - }; - return FilterSubscriber; -}(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],121:[function(require,module,exports){ +},{"../operators/filter":174}],131:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscriber_1 = require('../Subscriber'); -var Subscription_1 = require('../Subscription'); +var finalize_1 = require('../operators/finalize'); /** * Returns an Observable that mirrors the source Observable, but will call a specified function when * the source terminates on complete or error. @@ -10143,41 +9577,13 @@ var Subscription_1 = require('../Subscription'); * @owner Observable */ function _finally(callback) { - return this.lift(new FinallyOperator(callback)); + return finalize_1.finalize(callback)(this); } exports._finally = _finally; -var FinallyOperator = (function () { - function FinallyOperator(callback) { - this.callback = callback; - } - FinallyOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new FinallySubscriber(subscriber, this.callback)); - }; - return FinallyOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var FinallySubscriber = (function (_super) { - __extends(FinallySubscriber, _super); - function FinallySubscriber(destination, callback) { - _super.call(this, destination); - this.add(new Subscription_1.Subscription(callback)); - } - return FinallySubscriber; -}(Subscriber_1.Subscriber)); -},{"../Subscriber":36,"../Subscription":37}],122:[function(require,module,exports){ +},{"../operators/finalize":175}],132:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscriber_1 = require('../Subscriber'); -var EmptyError_1 = require('../util/EmptyError'); +var first_1 = require('../operators/first'); /** * Emits only the first value (or the first value that meets some condition) * emitted by the source Observable. @@ -10228,109 +9634,13 @@ var EmptyError_1 = require('../util/EmptyError'); * @owner Observable */ function first(predicate, resultSelector, defaultValue) { - return this.lift(new FirstOperator(predicate, resultSelector, defaultValue, this)); + return first_1.first(predicate, resultSelector, defaultValue)(this); } exports.first = first; -var FirstOperator = (function () { - function FirstOperator(predicate, resultSelector, defaultValue, source) { - this.predicate = predicate; - this.resultSelector = resultSelector; - this.defaultValue = defaultValue; - this.source = source; - } - FirstOperator.prototype.call = function (observer, source) { - return source.subscribe(new FirstSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source)); - }; - return FirstOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var FirstSubscriber = (function (_super) { - __extends(FirstSubscriber, _super); - function FirstSubscriber(destination, predicate, resultSelector, defaultValue, source) { - _super.call(this, destination); - this.predicate = predicate; - this.resultSelector = resultSelector; - this.defaultValue = defaultValue; - this.source = source; - this.index = 0; - this.hasCompleted = false; - this._emitted = false; - } - FirstSubscriber.prototype._next = function (value) { - var index = this.index++; - if (this.predicate) { - this._tryPredicate(value, index); - } - else { - this._emit(value, index); - } - }; - FirstSubscriber.prototype._tryPredicate = function (value, index) { - var result; - try { - result = this.predicate(value, index, this.source); - } - catch (err) { - this.destination.error(err); - return; - } - if (result) { - this._emit(value, index); - } - }; - FirstSubscriber.prototype._emit = function (value, index) { - if (this.resultSelector) { - this._tryResultSelector(value, index); - return; - } - this._emitFinal(value); - }; - FirstSubscriber.prototype._tryResultSelector = function (value, index) { - var result; - try { - result = this.resultSelector(value, index); - } - catch (err) { - this.destination.error(err); - return; - } - this._emitFinal(result); - }; - FirstSubscriber.prototype._emitFinal = function (value) { - var destination = this.destination; - if (!this._emitted) { - this._emitted = true; - destination.next(value); - destination.complete(); - this.hasCompleted = true; - } - }; - FirstSubscriber.prototype._complete = function () { - var destination = this.destination; - if (!this.hasCompleted && typeof this.defaultValue !== 'undefined') { - destination.next(this.defaultValue); - destination.complete(); - } - else if (!this.hasCompleted) { - destination.error(new EmptyError_1.EmptyError); - } - }; - return FirstSubscriber; -}(Subscriber_1.Subscriber)); -},{"../Subscriber":36,"../util/EmptyError":159}],123:[function(require,module,exports){ +},{"../operators/first":176}],133:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscriber_1 = require('../Subscriber'); -var EmptyError_1 = require('../util/EmptyError'); +var last_1 = require('../operators/last'); /* tslint:enable:max-line-length */ /** * Returns an Observable that emits only the last item emitted by the source Observable. @@ -10350,192 +9660,56 @@ var EmptyError_1 = require('../util/EmptyError'); * @owner Observable */ function last(predicate, resultSelector, defaultValue) { - return this.lift(new LastOperator(predicate, resultSelector, defaultValue, this)); + return last_1.last(predicate, resultSelector, defaultValue)(this); } exports.last = last; -var LastOperator = (function () { - function LastOperator(predicate, resultSelector, defaultValue, source) { - this.predicate = predicate; - this.resultSelector = resultSelector; - this.defaultValue = defaultValue; - this.source = source; - } - LastOperator.prototype.call = function (observer, source) { - return source.subscribe(new LastSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source)); - }; - return LastOperator; -}()); + +},{"../operators/last":177}],134:[function(require,module,exports){ +"use strict"; +var map_1 = require('../operators/map'); /** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var LastSubscriber = (function (_super) { - __extends(LastSubscriber, _super); - function LastSubscriber(destination, predicate, resultSelector, defaultValue, source) { - _super.call(this, destination); - this.predicate = predicate; - this.resultSelector = resultSelector; - this.defaultValue = defaultValue; - this.source = source; - this.hasValue = false; - this.index = 0; - if (typeof defaultValue !== 'undefined') { - this.lastValue = defaultValue; - this.hasValue = true; - } - } - LastSubscriber.prototype._next = function (value) { - var index = this.index++; - if (this.predicate) { - this._tryPredicate(value, index); - } - else { - if (this.resultSelector) { - this._tryResultSelector(value, index); - return; - } - this.lastValue = value; - this.hasValue = true; - } - }; - LastSubscriber.prototype._tryPredicate = function (value, index) { - var result; - try { - result = this.predicate(value, index, this.source); - } - catch (err) { - this.destination.error(err); - return; - } - if (result) { - if (this.resultSelector) { - this._tryResultSelector(value, index); - return; - } - this.lastValue = value; - this.hasValue = true; - } - }; - LastSubscriber.prototype._tryResultSelector = function (value, index) { - var result; - try { - result = this.resultSelector(value, index); - } - catch (err) { - this.destination.error(err); - return; - } - this.lastValue = result; - this.hasValue = true; - }; - LastSubscriber.prototype._complete = function () { - var destination = this.destination; - if (this.hasValue) { - destination.next(this.lastValue); - destination.complete(); - } - else { - destination.error(new EmptyError_1.EmptyError); - } - }; - return LastSubscriber; -}(Subscriber_1.Subscriber)); - -},{"../Subscriber":36,"../util/EmptyError":159}],124:[function(require,module,exports){ -"use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscriber_1 = require('../Subscriber'); -/** - * Applies a given `project` function to each value emitted by the source - * Observable, and emits the resulting values as an Observable. - * - * Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map), - * it passes each source value through a transformation function to get - * corresponding output values. - * - * - * - * Similar to the well known `Array.prototype.map` function, this operator - * applies a projection to each value and emits that projection in the output - * Observable. - * - * @example Map every click to the clientX position of that click - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var positions = clicks.map(ev => ev.clientX); - * positions.subscribe(x => console.log(x)); - * - * @see {@link mapTo} - * @see {@link pluck} - * - * @param {function(value: T, index: number): R} project The function to apply - * to each `value` emitted by the source Observable. The `index` parameter is - * the number `i` for the i-th emission that has happened since the - * subscription, starting from the number `0`. - * @param {any} [thisArg] An optional argument to define what `this` is in the - * `project` function. - * @return {Observable} An Observable that emits the values from the source - * Observable transformed by the given `project` function. - * @method map - * @owner Observable + * Applies a given `project` function to each value emitted by the source + * Observable, and emits the resulting values as an Observable. + * + * Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map), + * it passes each source value through a transformation function to get + * corresponding output values. + * + * + * + * Similar to the well known `Array.prototype.map` function, this operator + * applies a projection to each value and emits that projection in the output + * Observable. + * + * @example Map every click to the clientX position of that click + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var positions = clicks.map(ev => ev.clientX); + * positions.subscribe(x => console.log(x)); + * + * @see {@link mapTo} + * @see {@link pluck} + * + * @param {function(value: T, index: number): R} project The function to apply + * to each `value` emitted by the source Observable. The `index` parameter is + * the number `i` for the i-th emission that has happened since the + * subscription, starting from the number `0`. + * @param {any} [thisArg] An optional argument to define what `this` is in the + * `project` function. + * @return {Observable} An Observable that emits the values from the source + * Observable transformed by the given `project` function. + * @method map + * @owner Observable */ function map(project, thisArg) { - if (typeof project !== 'function') { - throw new TypeError('argument is not a function. Are you looking for `mapTo()`?'); - } - return this.lift(new MapOperator(project, thisArg)); + return map_1.map(project, thisArg)(this); } exports.map = map; -var MapOperator = (function () { - function MapOperator(project, thisArg) { - this.project = project; - this.thisArg = thisArg; - } - MapOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg)); - }; - return MapOperator; -}()); -exports.MapOperator = MapOperator; -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var MapSubscriber = (function (_super) { - __extends(MapSubscriber, _super); - function MapSubscriber(destination, project, thisArg) { - _super.call(this, destination); - this.project = project; - this.count = 0; - this.thisArg = thisArg || this; - } - // NOTE: This looks unoptimized, but it's actually purposefully NOT - // using try/catch optimizations. - MapSubscriber.prototype._next = function (value) { - var result; - try { - result = this.project.call(this.thisArg, value, this.count++); - } - catch (err) { - this.destination.error(err); - return; - } - this.destination.next(result); - }; - return MapSubscriber; -}(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],125:[function(require,module,exports){ +},{"../operators/map":178}],135:[function(require,module,exports){ "use strict"; -var Observable_1 = require('../Observable'); -var ArrayObservable_1 = require('../observable/ArrayObservable'); -var mergeAll_1 = require('./mergeAll'); -var isScheduler_1 = require('../util/isScheduler'); +var merge_1 = require('../operators/merge'); +var merge_2 = require('../operators/merge'); +exports.mergeStatic = merge_2.mergeStatic; /* tslint:enable:max-line-length */ /** * Creates an output Observable which concurrently emits all values from every @@ -10588,103 +9762,13 @@ function merge() { for (var _i = 0; _i < arguments.length; _i++) { observables[_i - 0] = arguments[_i]; } - return this.lift.call(mergeStatic.apply(void 0, [this].concat(observables))); + return merge_1.merge.apply(void 0, observables)(this); } exports.merge = merge; -/* tslint:enable:max-line-length */ -/** - * Creates an output Observable which concurrently emits all values from every - * given input Observable. - * - * Flattens multiple Observables together by blending - * their values into one Observable. - * - * - * - * `merge` subscribes to each given input Observable (as arguments), and simply - * forwards (without doing any transformation) all the values from all the input - * Observables to the output Observable. The output Observable only completes - * once all input Observables have completed. Any error delivered by an input - * Observable will be immediately emitted on the output Observable. - * - * @example Merge together two Observables: 1s interval and clicks - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var timer = Rx.Observable.interval(1000); - * var clicksOrTimer = Rx.Observable.merge(clicks, timer); - * clicksOrTimer.subscribe(x => console.log(x)); - * - * // Results in the following: - * // timer will emit ascending values, one every second(1000ms) to console - * // clicks logs MouseEvents to console everytime the "document" is clicked - * // Since the two streams are merged you see these happening - * // as they occur. - * - * @example Merge together 3 Observables, but only 2 run concurrently - * var timer1 = Rx.Observable.interval(1000).take(10); - * var timer2 = Rx.Observable.interval(2000).take(6); - * var timer3 = Rx.Observable.interval(500).take(10); - * var concurrent = 2; // the argument - * var merged = Rx.Observable.merge(timer1, timer2, timer3, concurrent); - * merged.subscribe(x => console.log(x)); - * - * // Results in the following: - * // - First timer1 and timer2 will run concurrently - * // - timer1 will emit a value every 1000ms for 10 iterations - * // - timer2 will emit a value every 2000ms for 6 iterations - * // - after timer1 hits it's max iteration, timer2 will - * // continue, and timer3 will start to run concurrently with timer2 - * // - when timer2 hits it's max iteration it terminates, and - * // timer3 will continue to emit a value every 500ms until it is complete - * - * @see {@link mergeAll} - * @see {@link mergeMap} - * @see {@link mergeMapTo} - * @see {@link mergeScan} - * - * @param {...ObservableInput} observables Input Observables to merge together. - * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input - * Observables being subscribed to concurrently. - * @param {Scheduler} [scheduler=null] The IScheduler to use for managing - * concurrency of input Observables. - * @return {Observable} an Observable that emits items that are the result of - * every input Observable. - * @static true - * @name merge - * @owner Observable - */ -function mergeStatic() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i - 0] = arguments[_i]; - } - var concurrent = Number.POSITIVE_INFINITY; - var scheduler = null; - var last = observables[observables.length - 1]; - if (isScheduler_1.isScheduler(last)) { - scheduler = observables.pop(); - if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') { - concurrent = observables.pop(); - } - } - else if (typeof last === 'number') { - concurrent = observables.pop(); - } - if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) { - return observables[0]; - } - return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(concurrent)); -} -exports.mergeStatic = mergeStatic; -},{"../Observable":29,"../observable/ArrayObservable":86,"../util/isScheduler":171,"./mergeAll":126}],126:[function(require,module,exports){ +},{"../operators/merge":179}],136:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var OuterSubscriber_1 = require('../OuterSubscriber'); -var subscribeToResult_1 = require('../util/subscribeToResult'); +var mergeAll_1 = require('../operators/mergeAll'); /** * Converts a higher-order Observable into a first-order Observable which * concurrently delivers all values that are emitted on the inner Observables. @@ -10731,72 +9815,13 @@ var subscribeToResult_1 = require('../util/subscribeToResult'); */ function mergeAll(concurrent) { if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; } - return this.lift(new MergeAllOperator(concurrent)); + return mergeAll_1.mergeAll(concurrent)(this); } exports.mergeAll = mergeAll; -var MergeAllOperator = (function () { - function MergeAllOperator(concurrent) { - this.concurrent = concurrent; - } - MergeAllOperator.prototype.call = function (observer, source) { - return source.subscribe(new MergeAllSubscriber(observer, this.concurrent)); - }; - return MergeAllOperator; -}()); -exports.MergeAllOperator = MergeAllOperator; -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var MergeAllSubscriber = (function (_super) { - __extends(MergeAllSubscriber, _super); - function MergeAllSubscriber(destination, concurrent) { - _super.call(this, destination); - this.concurrent = concurrent; - this.hasCompleted = false; - this.buffer = []; - this.active = 0; - } - MergeAllSubscriber.prototype._next = function (observable) { - if (this.active < this.concurrent) { - this.active++; - this.add(subscribeToResult_1.subscribeToResult(this, observable)); - } - else { - this.buffer.push(observable); - } - }; - MergeAllSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (this.active === 0 && this.buffer.length === 0) { - this.destination.complete(); - } - }; - MergeAllSubscriber.prototype.notifyComplete = function (innerSub) { - var buffer = this.buffer; - this.remove(innerSub); - this.active--; - if (buffer.length > 0) { - this._next(buffer.shift()); - } - else if (this.active === 0 && this.hasCompleted) { - this.destination.complete(); - } - }; - return MergeAllSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); -exports.MergeAllSubscriber = MergeAllSubscriber; -},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],127:[function(require,module,exports){ +},{"../operators/mergeAll":180}],137:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var subscribeToResult_1 = require('../util/subscribeToResult'); -var OuterSubscriber_1 = require('../OuterSubscriber'); +var mergeMap_1 = require('../operators/mergeMap'); /* tslint:enable:max-line-length */ /** * Projects each source value to an Observable which is merged in the output @@ -10858,467 +9883,262 @@ var OuterSubscriber_1 = require('../OuterSubscriber'); */ function mergeMap(project, resultSelector, concurrent) { if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; } - if (typeof resultSelector === 'number') { - concurrent = resultSelector; - resultSelector = null; - } - return this.lift(new MergeMapOperator(project, resultSelector, concurrent)); + return mergeMap_1.mergeMap(project, resultSelector, concurrent)(this); } exports.mergeMap = mergeMap; -var MergeMapOperator = (function () { - function MergeMapOperator(project, resultSelector, concurrent) { - if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; } - this.project = project; - this.resultSelector = resultSelector; - this.concurrent = concurrent; - } - MergeMapOperator.prototype.call = function (observer, source) { - return source.subscribe(new MergeMapSubscriber(observer, this.project, this.resultSelector, this.concurrent)); - }; - return MergeMapOperator; -}()); -exports.MergeMapOperator = MergeMapOperator; -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var MergeMapSubscriber = (function (_super) { - __extends(MergeMapSubscriber, _super); - function MergeMapSubscriber(destination, project, resultSelector, concurrent) { - if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; } - _super.call(this, destination); - this.project = project; - this.resultSelector = resultSelector; - this.concurrent = concurrent; - this.hasCompleted = false; - this.buffer = []; - this.active = 0; - this.index = 0; - } - MergeMapSubscriber.prototype._next = function (value) { - if (this.active < this.concurrent) { - this._tryNext(value); - } - else { - this.buffer.push(value); - } - }; - MergeMapSubscriber.prototype._tryNext = function (value) { - var result; - var index = this.index++; - try { - result = this.project(value, index); - } - catch (err) { - this.destination.error(err); - return; - } - this.active++; - this._innerSub(result, value, index); - }; - MergeMapSubscriber.prototype._innerSub = function (ish, value, index) { - this.add(subscribeToResult_1.subscribeToResult(this, ish, value, index)); - }; - MergeMapSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (this.active === 0 && this.buffer.length === 0) { - this.destination.complete(); - } - }; - MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - if (this.resultSelector) { - this._notifyResultSelector(outerValue, innerValue, outerIndex, innerIndex); - } - else { - this.destination.next(innerValue); - } - }; - MergeMapSubscriber.prototype._notifyResultSelector = function (outerValue, innerValue, outerIndex, innerIndex) { - var result; - try { - result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex); - } - catch (err) { - this.destination.error(err); - return; - } - this.destination.next(result); - }; - MergeMapSubscriber.prototype.notifyComplete = function (innerSub) { - var buffer = this.buffer; - this.remove(innerSub); - this.active--; - if (buffer.length > 0) { - this._next(buffer.shift()); - } - else if (this.active === 0 && this.hasCompleted) { - this.destination.complete(); - } - }; - return MergeMapSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); -exports.MergeMapSubscriber = MergeMapSubscriber; -},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],128:[function(require,module,exports){ +},{"../operators/mergeMap":181}],138:[function(require,module,exports){ "use strict"; -var ConnectableObservable_1 = require('../observable/ConnectableObservable'); -/* tslint:enable:max-line-length */ +var pairwise_1 = require('../operators/pairwise'); /** - * Returns an Observable that emits the results of invoking a specified selector on items - * emitted by a ConnectableObservable that shares a single subscription to the underlying stream. + * Groups pairs of consecutive emissions together and emits them as an array of + * two values. * - * + * Puts the current value and previous value together as + * an array, and emits that. * - * @param {Function|Subject} subjectOrSubjectFactory - Factory function to create an intermediate subject through - * which the source sequence's elements will be multicast to the selector function - * or Subject to push source elements into. - * @param {Function} [selector] - Optional selector function that can use the multicasted source stream - * as many times as needed, without causing multiple subscriptions to the source stream. - * Subscribers to the given source will receive all notifications of the source from the - * time of the subscription forward. - * @return {Observable} An Observable that emits the results of invoking the selector - * on the items emitted by a `ConnectableObservable` that shares a single subscription to - * the underlying stream. - * @method multicast + * + * + * The Nth emission from the source Observable will cause the output Observable + * to emit an array [(N-1)th, Nth] of the previous and the current value, as a + * pair. For this reason, `pairwise` emits on the second and subsequent + * emissions from the source Observable, but not on the first emission, because + * there is no previous value in that case. + * + * @example On every click (starting from the second), emit the relative distance to the previous click + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var pairs = clicks.pairwise(); + * var distance = pairs.map(pair => { + * var x0 = pair[0].clientX; + * var y0 = pair[0].clientY; + * var x1 = pair[1].clientX; + * var y1 = pair[1].clientY; + * return Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2)); + * }); + * distance.subscribe(x => console.log(x)); + * + * @see {@link buffer} + * @see {@link bufferCount} + * + * @return {Observable>} An Observable of pairs (as arrays) of + * consecutive values from the source Observable. + * @method pairwise * @owner Observable */ -function multicast(subjectOrSubjectFactory, selector) { - var subjectFactory; - if (typeof subjectOrSubjectFactory === 'function') { - subjectFactory = subjectOrSubjectFactory; - } - else { - subjectFactory = function subjectFactory() { - return subjectOrSubjectFactory; - }; - } - if (typeof selector === 'function') { - return this.lift(new MulticastOperator(subjectFactory, selector)); - } - var connectable = Object.create(this, ConnectableObservable_1.connectableObservableDescriptor); - connectable.source = this; - connectable.subjectFactory = subjectFactory; - return connectable; +function pairwise() { + return pairwise_1.pairwise()(this); } -exports.multicast = multicast; -var MulticastOperator = (function () { - function MulticastOperator(subjectFactory, selector) { - this.subjectFactory = subjectFactory; - this.selector = selector; - } - MulticastOperator.prototype.call = function (subscriber, source) { - var selector = this.selector; - var subject = this.subjectFactory(); - var subscription = selector(subject).subscribe(subscriber); - subscription.add(source.subscribe(subject)); - return subscription; - }; - return MulticastOperator; -}()); -exports.MulticastOperator = MulticastOperator; +exports.pairwise = pairwise; -},{"../observable/ConnectableObservable":87}],129:[function(require,module,exports){ +},{"../operators/pairwise":184}],139:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscriber_1 = require('../Subscriber'); -var Notification_1 = require('../Notification'); +var pluck_1 = require('../operators/pluck'); /** + * Maps each source value (an object) to its specified nested property. * - * Re-emits all notifications from source Observable with specified scheduler. - * - * Ensure a specific scheduler is used, from outside of an Observable. - * - * `observeOn` is an operator that accepts a scheduler as a first parameter, which will be used to reschedule - * notifications emitted by the source Observable. It might be useful, if you do not have control over - * internal scheduler of a given Observable, but want to control when its values are emitted nevertheless. + * Like {@link map}, but meant only for picking one of + * the nested properties of every emitted object. * - * Returned Observable emits the same notifications (nexted values, complete and error events) as the source Observable, - * but rescheduled with provided scheduler. Note that this doesn't mean that source Observables internal - * scheduler will be replaced in any way. Original scheduler still will be used, but when the source Observable emits - * notification, it will be immediately scheduled again - this time with scheduler passed to `observeOn`. - * An anti-pattern would be calling `observeOn` on Observable that emits lots of values synchronously, to split - * that emissions into asynchronous chunks. For this to happen, scheduler would have to be passed into the source - * Observable directly (usually into the operator that creates it). `observeOn` simply delays notifications a - * little bit more, to ensure that they are emitted at expected moments. + * * - * As a matter of fact, `observeOn` accepts second parameter, which specifies in milliseconds with what delay notifications - * will be emitted. The main difference between {@link delay} operator and `observeOn` is that `observeOn` - * will delay all notifications - including error notifications - while `delay` will pass through error - * from source Observable immediately when it is emitted. In general it is highly recommended to use `delay` operator - * for any kind of delaying of values in the stream, while using `observeOn` to specify which scheduler should be used - * for notification emissions in general. + * Given a list of strings describing a path to an object property, retrieves + * the value of a specified nested property from all values in the source + * Observable. If a property can't be resolved, it will return `undefined` for + * that value. * - * @example Ensure values in subscribe are called just before browser repaint. - * const intervals = Rx.Observable.interval(10); // Intervals are scheduled - * // with async scheduler by default... + * @example Map every click to the tagName of the clicked target element + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var tagNames = clicks.pluck('target', 'tagName'); + * tagNames.subscribe(x => console.log(x)); * - * intervals - * .observeOn(Rx.Scheduler.animationFrame) // ...but we will observe on animationFrame - * .subscribe(val => { // scheduler to ensure smooth animation. - * someDiv.style.height = val + 'px'; - * }); + * @see {@link map} * - * @see {@link delay} + * @param {...string} properties The nested properties to pluck from each source + * value (an object). + * @return {Observable} A new Observable of property values from the source values. + * @method pluck + * @owner Observable + */ +function pluck() { + var properties = []; + for (var _i = 0; _i < arguments.length; _i++) { + properties[_i - 0] = arguments[_i]; + } + return pluck_1.pluck.apply(void 0, properties)(this); +} +exports.pluck = pluck; + +},{"../operators/pluck":185}],140:[function(require,module,exports){ +"use strict"; +var publish_1 = require('../operators/publish'); +/* tslint:enable:max-line-length */ +/** + * Returns a ConnectableObservable, which is a variety of Observable that waits until its connect method is called + * before it begins emitting items to those Observers that have subscribed to it. * - * @param {IScheduler} scheduler Scheduler that will be used to reschedule notifications from source Observable. - * @param {number} [delay] Number of milliseconds that states with what delay every notification should be rescheduled. - * @return {Observable} Observable that emits the same notifications as the source Observable, - * but with provided scheduler. + * * - * @method observeOn + * @param {Function} [selector] - Optional selector function which can use the multicasted source sequence as many times + * as needed, without causing multiple subscriptions to the source sequence. + * Subscribers to the given source will receive all notifications of the source from the time of the subscription on. + * @return A ConnectableObservable that upon connection causes the source Observable to emit items to its Observers. + * @method publish * @owner Observable */ -function observeOn(scheduler, delay) { - if (delay === void 0) { delay = 0; } - return this.lift(new ObserveOnOperator(scheduler, delay)); +function publish(selector) { + return publish_1.publish(selector)(this); } -exports.observeOn = observeOn; -var ObserveOnOperator = (function () { - function ObserveOnOperator(scheduler, delay) { - if (delay === void 0) { delay = 0; } - this.scheduler = scheduler; - this.delay = delay; - } - ObserveOnOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay)); - }; - return ObserveOnOperator; -}()); -exports.ObserveOnOperator = ObserveOnOperator; -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var ObserveOnSubscriber = (function (_super) { - __extends(ObserveOnSubscriber, _super); - function ObserveOnSubscriber(destination, scheduler, delay) { - if (delay === void 0) { delay = 0; } - _super.call(this, destination); - this.scheduler = scheduler; - this.delay = delay; - } - ObserveOnSubscriber.dispatch = function (arg) { - var notification = arg.notification, destination = arg.destination; - notification.observe(destination); - this.unsubscribe(); - }; - ObserveOnSubscriber.prototype.scheduleMessage = function (notification) { - this.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination))); - }; - ObserveOnSubscriber.prototype._next = function (value) { - this.scheduleMessage(Notification_1.Notification.createNext(value)); - }; - ObserveOnSubscriber.prototype._error = function (err) { - this.scheduleMessage(Notification_1.Notification.createError(err)); - }; - ObserveOnSubscriber.prototype._complete = function () { - this.scheduleMessage(Notification_1.Notification.createComplete()); - }; - return ObserveOnSubscriber; -}(Subscriber_1.Subscriber)); -exports.ObserveOnSubscriber = ObserveOnSubscriber; -var ObserveOnMessage = (function () { - function ObserveOnMessage(notification, destination) { - this.notification = notification; - this.destination = destination; - } - return ObserveOnMessage; -}()); -exports.ObserveOnMessage = ObserveOnMessage; +exports.publish = publish; -},{"../Notification":28,"../Subscriber":36}],130:[function(require,module,exports){ +},{"../operators/publish":186}],141:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscriber_1 = require('../Subscriber'); +var publishReplay_1 = require('../operators/publishReplay'); +/* tslint:enable:max-line-length */ /** - * Groups pairs of consecutive emissions together and emits them as an array of - * two values. - * - * Puts the current value and previous value together as - * an array, and emits that. - * - * - * - * The Nth emission from the source Observable will cause the output Observable - * to emit an array [(N-1)th, Nth] of the previous and the current value, as a - * pair. For this reason, `pairwise` emits on the second and subsequent - * emissions from the source Observable, but not on the first emission, because - * there is no previous value in that case. - * - * @example On every click (starting from the second), emit the relative distance to the previous click - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var pairs = clicks.pairwise(); - * var distance = pairs.map(pair => { - * var x0 = pair[0].clientX; - * var y0 = pair[0].clientY; - * var x1 = pair[1].clientX; - * var y1 = pair[1].clientY; - * return Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2)); - * }); - * distance.subscribe(x => console.log(x)); - * - * @see {@link buffer} - * @see {@link bufferCount} - * - * @return {Observable>} An Observable of pairs (as arrays) of - * consecutive values from the source Observable. - * @method pairwise + * @param bufferSize + * @param windowTime + * @param selectorOrScheduler + * @param scheduler + * @return {Observable | ConnectableObservable} + * @method publishReplay * @owner Observable */ -function pairwise() { - return this.lift(new PairwiseOperator()); +function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) { + return publishReplay_1.publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler)(this); } -exports.pairwise = pairwise; -var PairwiseOperator = (function () { - function PairwiseOperator() { - } - PairwiseOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new PairwiseSubscriber(subscriber)); - }; - return PairwiseOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var PairwiseSubscriber = (function (_super) { - __extends(PairwiseSubscriber, _super); - function PairwiseSubscriber(destination) { - _super.call(this, destination); - this.hasPrev = false; - } - PairwiseSubscriber.prototype._next = function (value) { - if (this.hasPrev) { - this.destination.next([this.prev, value]); - } - else { - this.hasPrev = true; - } - this.prev = value; - }; - return PairwiseSubscriber; -}(Subscriber_1.Subscriber)); +exports.publishReplay = publishReplay; -},{"../Subscriber":36}],131:[function(require,module,exports){ +},{"../operators/publishReplay":187}],142:[function(require,module,exports){ "use strict"; -var map_1 = require('./map'); +var reduce_1 = require('../operators/reduce'); +/* tslint:enable:max-line-length */ /** - * Maps each source value (an object) to its specified nested property. + * Applies an accumulator function over the source Observable, and returns the + * accumulated result when the source completes, given an optional seed value. * - * Like {@link map}, but meant only for picking one of - * the nested properties of every emitted object. + * Combines together all values emitted on the source, + * using an accumulator function that knows how to join a new source value into + * the accumulation from the past. * - * + * * - * Given a list of strings describing a path to an object property, retrieves - * the value of a specified nested property from all values in the source - * Observable. If a property can't be resolved, it will return `undefined` for - * that value. + * Like + * [Array.prototype.reduce()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce), + * `reduce` applies an `accumulator` function against an accumulation and each + * value of the source Observable (from the past) to reduce it to a single + * value, emitted on the output Observable. Note that `reduce` will only emit + * one value, only when the source Observable completes. It is equivalent to + * applying operator {@link scan} followed by operator {@link last}. * - * @example Map every click to the tagName of the clicked target element - * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var tagNames = clicks.pluck('target', 'tagName'); - * tagNames.subscribe(x => console.log(x)); + * Returns an Observable that applies a specified `accumulator` function to each + * item emitted by the source Observable. If a `seed` value is specified, then + * that value will be used as the initial value for the accumulator. If no seed + * value is specified, the first item of the source is used as the seed. * - * @see {@link map} + * @example Count the number of click events that happened in 5 seconds + * var clicksInFiveSeconds = Rx.Observable.fromEvent(document, 'click') + * .takeUntil(Rx.Observable.interval(5000)); + * var ones = clicksInFiveSeconds.mapTo(1); + * var seed = 0; + * var count = ones.reduce((acc, one) => acc + one, seed); + * count.subscribe(x => console.log(x)); * - * @param {...string} properties The nested properties to pluck from each source - * value (an object). - * @return {Observable} A new Observable of property values from the source values. - * @method pluck + * @see {@link count} + * @see {@link expand} + * @see {@link mergeScan} + * @see {@link scan} + * + * @param {function(acc: R, value: T, index: number): R} accumulator The accumulator function + * called on each source value. + * @param {R} [seed] The initial accumulation value. + * @return {Observable} An Observable that emits a single value that is the + * result of accumulating the values emitted by the source Observable. + * @method reduce * @owner Observable */ -function pluck() { - var properties = []; - for (var _i = 0; _i < arguments.length; _i++) { - properties[_i - 0] = arguments[_i]; - } - var length = properties.length; - if (length === 0) { - throw new Error('list of properties cannot be empty.'); +function reduce(accumulator, seed) { + // providing a seed of `undefined` *should* be valid and trigger + // hasSeed! so don't use `seed !== undefined` checks! + // For this reason, we have to check it here at the original call site + // otherwise inside Operator/Subscriber we won't know if `undefined` + // means they didn't provide anything or if they literally provided `undefined` + if (arguments.length >= 2) { + return reduce_1.reduce(accumulator, seed)(this); } - return map_1.map.call(this, plucker(properties, length)); -} -exports.pluck = pluck; -function plucker(props, length) { - var mapper = function (x) { - var currentProp = x; - for (var i = 0; i < length; i++) { - var p = currentProp[props[i]]; - if (typeof p !== 'undefined') { - currentProp = p; - } - else { - return undefined; - } - } - return currentProp; - }; - return mapper; + return reduce_1.reduce(accumulator)(this); } +exports.reduce = reduce; -},{"./map":124}],132:[function(require,module,exports){ +},{"../operators/reduce":188}],143:[function(require,module,exports){ "use strict"; -var Subject_1 = require('../Subject'); -var multicast_1 = require('./multicast'); -/* tslint:enable:max-line-length */ +var retry_1 = require('../operators/retry'); /** - * Returns a ConnectableObservable, which is a variety of Observable that waits until its connect method is called - * before it begins emitting items to those Observers that have subscribed to it. - * - * - * - * @param {Function} [selector] - Optional selector function which can use the multicasted source sequence as many times - * as needed, without causing multiple subscriptions to the source sequence. - * Subscribers to the given source will receive all notifications of the source from the time of the subscription on. - * @return A ConnectableObservable that upon connection causes the source Observable to emit items to its Observers. - * @method publish + * Returns an Observable that mirrors the source Observable with the exception of an `error`. If the source Observable + * calls `error`, this method will resubscribe to the source Observable for a maximum of `count` resubscriptions (given + * as a number parameter) rather than propagating the `error` call. + * + * + * + * Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted + * during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second + * time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications + * would be: [1, 2, 1, 2, 3, 4, 5, `complete`]. + * @param {number} count - Number of retry attempts before failing. + * @return {Observable} The source Observable modified with the retry logic. + * @method retry * @owner Observable */ -function publish(selector) { - return selector ? multicast_1.multicast.call(this, function () { return new Subject_1.Subject(); }, selector) : - multicast_1.multicast.call(this, new Subject_1.Subject()); +function retry(count) { + if (count === void 0) { count = -1; } + return retry_1.retry(count)(this); } -exports.publish = publish; +exports.retry = retry; -},{"../Subject":34,"./multicast":128}],133:[function(require,module,exports){ +},{"../operators/retry":190}],144:[function(require,module,exports){ "use strict"; -var ReplaySubject_1 = require('../ReplaySubject'); -var multicast_1 = require('./multicast'); +var sample_1 = require('../operators/sample'); /** - * @param bufferSize - * @param windowTime - * @param scheduler - * @return {ConnectableObservable} - * @method publishReplay + * Emits the most recently emitted value from the source Observable whenever + * another Observable, the `notifier`, emits. + * + * It's like {@link sampleTime}, but samples whenever + * the `notifier` Observable emits something. + * + * + * + * Whenever the `notifier` Observable emits a value or completes, `sample` + * looks at the source Observable and emits whichever value it has most recently + * emitted since the previous sampling, unless the source has not emitted + * anything since the previous sampling. The `notifier` is subscribed to as soon + * as the output Observable is subscribed. + * + * @example On every click, sample the most recent "seconds" timer + * var seconds = Rx.Observable.interval(1000); + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var result = seconds.sample(clicks); + * result.subscribe(x => console.log(x)); + * + * @see {@link audit} + * @see {@link debounce} + * @see {@link sampleTime} + * @see {@link throttle} + * + * @param {Observable} notifier The Observable to use for sampling the + * source Observable. + * @return {Observable} An Observable that emits the results of sampling the + * values emitted by the source Observable whenever the notifier Observable + * emits value or completes. + * @method sample * @owner Observable */ -function publishReplay(bufferSize, windowTime, scheduler) { - if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; } - if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; } - return multicast_1.multicast.call(this, new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler)); +function sample(notifier) { + return sample_1.sample(notifier)(this); } -exports.publishReplay = publishReplay; +exports.sample = sample; -},{"../ReplaySubject":32,"./multicast":128}],134:[function(require,module,exports){ +},{"../operators/sample":191}],145:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscriber_1 = require('../Subscriber'); +var scan_1 = require('../operators/scan'); /* tslint:enable:max-line-length */ /** * Applies an accumulator function over the source Observable, and returns each @@ -11358,91 +10178,25 @@ var Subscriber_1 = require('../Subscriber'); * @owner Observable */ function scan(accumulator, seed) { - var hasSeed = false; - // providing a seed of `undefined` *should* be valid and trigger - // hasSeed! so don't use `seed !== undefined` checks! - // For this reason, we have to check it here at the original call site - // otherwise inside Operator/Subscriber we won't know if `undefined` - // means they didn't provide anything or if they literally provided `undefined` if (arguments.length >= 2) { - hasSeed = true; + return scan_1.scan(accumulator, seed)(this); } - return this.lift(new ScanOperator(accumulator, seed, hasSeed)); + return scan_1.scan(accumulator)(this); } exports.scan = scan; -var ScanOperator = (function () { - function ScanOperator(accumulator, seed, hasSeed) { - if (hasSeed === void 0) { hasSeed = false; } - this.accumulator = accumulator; - this.seed = seed; - this.hasSeed = hasSeed; - } - ScanOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed)); - }; - return ScanOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var ScanSubscriber = (function (_super) { - __extends(ScanSubscriber, _super); - function ScanSubscriber(destination, accumulator, _seed, hasSeed) { - _super.call(this, destination); - this.accumulator = accumulator; - this._seed = _seed; - this.hasSeed = hasSeed; - this.index = 0; - } - Object.defineProperty(ScanSubscriber.prototype, "seed", { - get: function () { - return this._seed; - }, - set: function (value) { - this.hasSeed = true; - this._seed = value; - }, - enumerable: true, - configurable: true - }); - ScanSubscriber.prototype._next = function (value) { - if (!this.hasSeed) { - this.seed = value; - this.destination.next(value); - } - else { - return this._tryNext(value); - } - }; - ScanSubscriber.prototype._tryNext = function (value) { - var index = this.index++; - var result; - try { - result = this.accumulator(this.seed, value, index); - } - catch (err) { - this.destination.error(err); - } - this.seed = result; - this.destination.next(result); - }; - return ScanSubscriber; -}(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],135:[function(require,module,exports){ +},{"../operators/scan":192}],146:[function(require,module,exports){ "use strict"; -var multicast_1 = require('./multicast'); -var Subject_1 = require('../Subject'); -function shareSubjectFactory() { - return new Subject_1.Subject(); -} +var share_1 = require('../operators/share'); /** * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`. - * This is an alias for .publish().refCount(). + * + * This behaves similarly to .publish().refCount(), with a behavior difference when the source observable emits complete. + * .publish().refCount() will not resubscribe to the original source, however .share() will resubscribe to the original source. + * Observable.of("test").publish().refCount() will not re-emit "test" on new subscriptions, Observable.of("test").share() will + * re-emit "test" to new subscriptions. * * * @@ -11451,19 +10205,14 @@ function shareSubjectFactory() { * @owner Observable */ function share() { - return multicast_1.multicast.call(this, shareSubjectFactory).refCount(); + return share_1.share()(this); } exports.share = share; ; -},{"../Subject":34,"./multicast":128}],136:[function(require,module,exports){ +},{"../operators/share":193}],147:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscriber_1 = require('../Subscriber'); +var skip_1 = require('../operators/skip'); /** * Returns an Observable that skips the first `count` items emitted by the source Observable. * @@ -11476,47 +10225,13 @@ var Subscriber_1 = require('../Subscriber'); * @owner Observable */ function skip(count) { - return this.lift(new SkipOperator(count)); + return skip_1.skip(count)(this); } exports.skip = skip; -var SkipOperator = (function () { - function SkipOperator(total) { - this.total = total; - } - SkipOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SkipSubscriber(subscriber, this.total)); - }; - return SkipOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var SkipSubscriber = (function (_super) { - __extends(SkipSubscriber, _super); - function SkipSubscriber(destination, total) { - _super.call(this, destination); - this.total = total; - this.count = 0; - } - SkipSubscriber.prototype._next = function (x) { - if (++this.count > this.total) { - this.destination.next(x); - } - }; - return SkipSubscriber; -}(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],137:[function(require,module,exports){ +},{"../operators/skip":194}],148:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var OuterSubscriber_1 = require('../OuterSubscriber'); -var subscribeToResult_1 = require('../util/subscribeToResult'); +var skipUntil_1 = require('../operators/skipUntil'); /** * Returns an Observable that skips items emitted by the source Observable until a second Observable emits an item. * @@ -11530,64 +10245,13 @@ var subscribeToResult_1 = require('../util/subscribeToResult'); * @owner Observable */ function skipUntil(notifier) { - return this.lift(new SkipUntilOperator(notifier)); + return skipUntil_1.skipUntil(notifier)(this); } exports.skipUntil = skipUntil; -var SkipUntilOperator = (function () { - function SkipUntilOperator(notifier) { - this.notifier = notifier; - } - SkipUntilOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SkipUntilSubscriber(subscriber, this.notifier)); - }; - return SkipUntilOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var SkipUntilSubscriber = (function (_super) { - __extends(SkipUntilSubscriber, _super); - function SkipUntilSubscriber(destination, notifier) { - _super.call(this, destination); - this.hasValue = false; - this.isInnerStopped = false; - this.add(subscribeToResult_1.subscribeToResult(this, notifier)); - } - SkipUntilSubscriber.prototype._next = function (value) { - if (this.hasValue) { - _super.prototype._next.call(this, value); - } - }; - SkipUntilSubscriber.prototype._complete = function () { - if (this.isInnerStopped) { - _super.prototype._complete.call(this); - } - else { - this.unsubscribe(); - } - }; - SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.hasValue = true; - }; - SkipUntilSubscriber.prototype.notifyComplete = function () { - this.isInnerStopped = true; - if (this.isStopped) { - _super.prototype._complete.call(this); - } - }; - return SkipUntilSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],138:[function(require,module,exports){ +},{"../operators/skipUntil":195}],149:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscriber_1 = require('../Subscriber'); +var skipWhile_1 = require('../operators/skipWhile'); /** * Returns an Observable that skips all items emitted by the source Observable as long as a specified condition holds * true, but emits all further source items as soon as the condition becomes false. @@ -11601,59 +10265,13 @@ var Subscriber_1 = require('../Subscriber'); * @owner Observable */ function skipWhile(predicate) { - return this.lift(new SkipWhileOperator(predicate)); + return skipWhile_1.skipWhile(predicate)(this); } exports.skipWhile = skipWhile; -var SkipWhileOperator = (function () { - function SkipWhileOperator(predicate) { - this.predicate = predicate; - } - SkipWhileOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate)); - }; - return SkipWhileOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var SkipWhileSubscriber = (function (_super) { - __extends(SkipWhileSubscriber, _super); - function SkipWhileSubscriber(destination, predicate) { - _super.call(this, destination); - this.predicate = predicate; - this.skipping = true; - this.index = 0; - } - SkipWhileSubscriber.prototype._next = function (value) { - var destination = this.destination; - if (this.skipping) { - this.tryCallPredicate(value); - } - if (!this.skipping) { - destination.next(value); - } - }; - SkipWhileSubscriber.prototype.tryCallPredicate = function (value) { - try { - var result = this.predicate(value, this.index++); - this.skipping = Boolean(result); - } - catch (err) { - this.destination.error(err); - } - }; - return SkipWhileSubscriber; -}(Subscriber_1.Subscriber)); -},{"../Subscriber":36}],139:[function(require,module,exports){ +},{"../operators/skipWhile":196}],150:[function(require,module,exports){ "use strict"; -var ArrayObservable_1 = require('../observable/ArrayObservable'); -var ScalarObservable_1 = require('../observable/ScalarObservable'); -var EmptyObservable_1 = require('../observable/EmptyObservable'); -var concat_1 = require('./concat'); -var isScheduler_1 = require('../util/isScheduler'); +var startWith_1 = require('../operators/startWith'); /* tslint:enable:max-line-length */ /** * Returns an Observable that emits the items you specify as arguments before it begins to emit @@ -11674,35 +10292,13 @@ function startWith() { for (var _i = 0; _i < arguments.length; _i++) { array[_i - 0] = arguments[_i]; } - var scheduler = array[array.length - 1]; - if (isScheduler_1.isScheduler(scheduler)) { - array.pop(); - } - else { - scheduler = null; - } - var len = array.length; - if (len === 1) { - return concat_1.concatStatic(new ScalarObservable_1.ScalarObservable(array[0], scheduler), this); - } - else if (len > 1) { - return concat_1.concatStatic(new ArrayObservable_1.ArrayObservable(array, scheduler), this); - } - else { - return concat_1.concatStatic(new EmptyObservable_1.EmptyObservable(scheduler), this); - } + return startWith_1.startWith.apply(void 0, array)(this); } exports.startWith = startWith; -},{"../observable/ArrayObservable":86,"../observable/EmptyObservable":89,"../observable/ScalarObservable":95,"../util/isScheduler":171,"./concat":113}],140:[function(require,module,exports){ +},{"../operators/startWith":197}],151:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var OuterSubscriber_1 = require('../OuterSubscriber'); -var subscribeToResult_1 = require('../util/subscribeToResult'); +var switchMap_1 = require('../operators/switchMap'); /* tslint:enable:max-line-length */ /** * Projects each source value to an Observable which is merged in the output @@ -11752,188 +10348,54 @@ var subscribeToResult_1 = require('../util/subscribeToResult'); * @owner Observable */ function switchMap(project, resultSelector) { - return this.lift(new SwitchMapOperator(project, resultSelector)); + return switchMap_1.switchMap(project, resultSelector)(this); } exports.switchMap = switchMap; -var SwitchMapOperator = (function () { - function SwitchMapOperator(project, resultSelector) { - this.project = project; - this.resultSelector = resultSelector; - } - SwitchMapOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SwitchMapSubscriber(subscriber, this.project, this.resultSelector)); - }; - return SwitchMapOperator; -}()); + +},{"../operators/switchMap":198}],152:[function(require,module,exports){ +"use strict"; +var take_1 = require('../operators/take'); /** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var SwitchMapSubscriber = (function (_super) { - __extends(SwitchMapSubscriber, _super); - function SwitchMapSubscriber(destination, project, resultSelector) { - _super.call(this, destination); - this.project = project; - this.resultSelector = resultSelector; - this.index = 0; - } - SwitchMapSubscriber.prototype._next = function (value) { - var result; - var index = this.index++; - try { - result = this.project(value, index); - } - catch (error) { - this.destination.error(error); - return; - } - this._innerSub(result, value, index); - }; - SwitchMapSubscriber.prototype._innerSub = function (result, value, index) { - var innerSubscription = this.innerSubscription; - if (innerSubscription) { - innerSubscription.unsubscribe(); - } - this.add(this.innerSubscription = subscribeToResult_1.subscribeToResult(this, result, value, index)); - }; - SwitchMapSubscriber.prototype._complete = function () { - var innerSubscription = this.innerSubscription; - if (!innerSubscription || innerSubscription.closed) { - _super.prototype._complete.call(this); - } - }; - SwitchMapSubscriber.prototype._unsubscribe = function () { - this.innerSubscription = null; - }; - SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) { - this.remove(innerSub); - this.innerSubscription = null; - if (this.isStopped) { - _super.prototype._complete.call(this); - } - }; - SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - if (this.resultSelector) { - this._tryNotifyNext(outerValue, innerValue, outerIndex, innerIndex); - } - else { - this.destination.next(innerValue); - } - }; - SwitchMapSubscriber.prototype._tryNotifyNext = function (outerValue, innerValue, outerIndex, innerIndex) { - var result; - try { - result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex); - } - catch (err) { - this.destination.error(err); - return; - } - this.destination.next(result); - }; - return SwitchMapSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); - -},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],141:[function(require,module,exports){ -"use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscriber_1 = require('../Subscriber'); -var ArgumentOutOfRangeError_1 = require('../util/ArgumentOutOfRangeError'); -var EmptyObservable_1 = require('../observable/EmptyObservable'); -/** - * Emits only the first `count` values emitted by the source Observable. - * - * Takes the first `count` values from the source, then - * completes. - * - * - * - * `take` returns an Observable that emits only the first `count` values emitted - * by the source Observable. If the source emits fewer than `count` values then - * all of its values are emitted. After that, it completes, regardless if the - * source completes. - * - * @example Take the first 5 seconds of an infinite 1-second interval Observable - * var interval = Rx.Observable.interval(1000); - * var five = interval.take(5); - * five.subscribe(x => console.log(x)); - * - * @see {@link takeLast} - * @see {@link takeUntil} - * @see {@link takeWhile} - * @see {@link skip} - * - * @throws {ArgumentOutOfRangeError} When using `take(i)`, it delivers an - * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`. - * - * @param {number} count The maximum number of `next` values to emit. - * @return {Observable} An Observable that emits only the first `count` - * values emitted by the source Observable, or all of the values from the source - * if the source emits fewer than `count` values. - * @method take - * @owner Observable + * Emits only the first `count` values emitted by the source Observable. + * + * Takes the first `count` values from the source, then + * completes. + * + * + * + * `take` returns an Observable that emits only the first `count` values emitted + * by the source Observable. If the source emits fewer than `count` values then + * all of its values are emitted. After that, it completes, regardless if the + * source completes. + * + * @example Take the first 5 seconds of an infinite 1-second interval Observable + * var interval = Rx.Observable.interval(1000); + * var five = interval.take(5); + * five.subscribe(x => console.log(x)); + * + * @see {@link takeLast} + * @see {@link takeUntil} + * @see {@link takeWhile} + * @see {@link skip} + * + * @throws {ArgumentOutOfRangeError} When using `take(i)`, it delivers an + * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`. + * + * @param {number} count The maximum number of `next` values to emit. + * @return {Observable} An Observable that emits only the first `count` + * values emitted by the source Observable, or all of the values from the source + * if the source emits fewer than `count` values. + * @method take + * @owner Observable */ function take(count) { - if (count === 0) { - return new EmptyObservable_1.EmptyObservable(); - } - else { - return this.lift(new TakeOperator(count)); - } + return take_1.take(count)(this); } exports.take = take; -var TakeOperator = (function () { - function TakeOperator(total) { - this.total = total; - if (this.total < 0) { - throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError; - } - } - TakeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TakeSubscriber(subscriber, this.total)); - }; - return TakeOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var TakeSubscriber = (function (_super) { - __extends(TakeSubscriber, _super); - function TakeSubscriber(destination, total) { - _super.call(this, destination); - this.total = total; - this.count = 0; - } - TakeSubscriber.prototype._next = function (value) { - var total = this.total; - var count = ++this.count; - if (count <= total) { - this.destination.next(value); - if (count === total) { - this.destination.complete(); - this.unsubscribe(); - } - } - }; - return TakeSubscriber; -}(Subscriber_1.Subscriber)); -},{"../Subscriber":36,"../observable/EmptyObservable":89,"../util/ArgumentOutOfRangeError":158}],142:[function(require,module,exports){ +},{"../operators/take":199}],153:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var OuterSubscriber_1 = require('../OuterSubscriber'); -var subscribeToResult_1 = require('../util/subscribeToResult'); +var takeUntil_1 = require('../operators/takeUntil'); /** * Emits the values emitted by the source Observable until a `notifier` * Observable emits a value. @@ -11945,8 +10407,8 @@ var subscribeToResult_1 = require('../util/subscribeToResult'); * * `takeUntil` subscribes and begins mirroring the source Observable. It also * monitors a second Observable, `notifier` that you provide. If the `notifier` - * emits a value or a complete notification, the output Observable stops - * mirroring the source Observable and completes. + * emits a value, the output Observable stops mirroring the source Observable + * and completes. * * @example Tick every second until the first click happens * var interval = Rx.Observable.interval(1000); @@ -11968,300 +10430,372 @@ var subscribeToResult_1 = require('../util/subscribeToResult'); * @owner Observable */ function takeUntil(notifier) { - return this.lift(new TakeUntilOperator(notifier)); + return takeUntil_1.takeUntil(notifier)(this); } exports.takeUntil = takeUntil; -var TakeUntilOperator = (function () { - function TakeUntilOperator(notifier) { - this.notifier = notifier; + +},{"../operators/takeUntil":201}],154:[function(require,module,exports){ +"use strict"; +var takeWhile_1 = require('../operators/takeWhile'); +/** + * Emits values emitted by the source Observable so long as each value satisfies + * the given `predicate`, and then completes as soon as this `predicate` is not + * satisfied. + * + * Takes values from the source only while they pass the + * condition given. When the first value does not satisfy, it completes. + * + * + * + * `takeWhile` subscribes and begins mirroring the source Observable. Each value + * emitted on the source is given to the `predicate` function which returns a + * boolean, representing a condition to be satisfied by the source values. The + * output Observable emits the source values until such time as the `predicate` + * returns false, at which point `takeWhile` stops mirroring the source + * Observable and completes the output Observable. + * + * @example Emit click events only while the clientX property is greater than 200 + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var result = clicks.takeWhile(ev => ev.clientX > 200); + * result.subscribe(x => console.log(x)); + * + * @see {@link take} + * @see {@link takeLast} + * @see {@link takeUntil} + * @see {@link skip} + * + * @param {function(value: T, index: number): boolean} predicate A function that + * evaluates a value emitted by the source Observable and returns a boolean. + * Also takes the (zero-based) index as the second argument. + * @return {Observable} An Observable that emits the values from the source + * Observable so long as each value satisfies the condition defined by the + * `predicate`, then completes. + * @method takeWhile + * @owner Observable + */ +function takeWhile(predicate) { + return takeWhile_1.takeWhile(predicate)(this); +} +exports.takeWhile = takeWhile; + +},{"../operators/takeWhile":202}],155:[function(require,module,exports){ +"use strict"; +var async_1 = require('../scheduler/async'); +var timeout_1 = require('../operators/timeout'); +/** + * + * Errors if Observable does not emit a value in given time span. + * + * Timeouts on Observable that doesn't emit values fast enough. + * + * + * + * `timeout` operator accepts as an argument either a number or a Date. + * + * If number was provided, it returns an Observable that behaves like a source + * Observable, unless there is a period of time where there is no value emitted. + * So if you provide `100` as argument and first value comes after 50ms from + * the moment of subscription, this value will be simply re-emitted by the resulting + * Observable. If however after that 100ms passes without a second value being emitted, + * stream will end with an error and source Observable will be unsubscribed. + * These checks are performed throughout whole lifecycle of Observable - from the moment + * it was subscribed to, until it completes or errors itself. Thus every value must be + * emitted within specified period since previous value. + * + * If provided argument was Date, returned Observable behaves differently. It throws + * if Observable did not complete before provided Date. This means that periods between + * emission of particular values do not matter in this case. If Observable did not complete + * before provided Date, source Observable will be unsubscribed. Other than that, resulting + * stream behaves just as source Observable. + * + * `timeout` accepts also a Scheduler as a second parameter. It is used to schedule moment (or moments) + * when returned Observable will check if source stream emitted value or completed. + * + * @example Check if ticks are emitted within certain timespan + * const seconds = Rx.Observable.interval(1000); + * + * seconds.timeout(1100) // Let's use bigger timespan to be safe, + * // since `interval` might fire a bit later then scheduled. + * .subscribe( + * value => console.log(value), // Will emit numbers just as regular `interval` would. + * err => console.log(err) // Will never be called. + * ); + * + * seconds.timeout(900).subscribe( + * value => console.log(value), // Will never be called. + * err => console.log(err) // Will emit error before even first value is emitted, + * // since it did not arrive within 900ms period. + * ); + * + * @example Use Date to check if Observable completed + * const seconds = Rx.Observable.interval(1000); + * + * seconds.timeout(new Date("December 17, 2020 03:24:00")) + * .subscribe( + * value => console.log(value), // Will emit values as regular `interval` would + * // until December 17, 2020 at 03:24:00. + * err => console.log(err) // On December 17, 2020 at 03:24:00 it will emit an error, + * // since Observable did not complete by then. + * ); + * + * @see {@link timeoutWith} + * + * @param {number|Date} due Number specifying period within which Observable must emit values + * or Date specifying before when Observable should complete + * @param {Scheduler} [scheduler] Scheduler controlling when timeout checks occur. + * @return {Observable} Observable that mirrors behaviour of source, unless timeout checks fail. + * @method timeout + * @owner Observable + */ +function timeout(due, scheduler) { + if (scheduler === void 0) { scheduler = async_1.async; } + return timeout_1.timeout(due, scheduler)(this); +} +exports.timeout = timeout; + +},{"../operators/timeout":204,"../scheduler/async":212}],156:[function(require,module,exports){ +"use strict"; +var withLatestFrom_1 = require('../operators/withLatestFrom'); +/* tslint:enable:max-line-length */ +/** + * Combines the source Observable with other Observables to create an Observable + * whose values are calculated from the latest values of each, only when the + * source emits. + * + * Whenever the source Observable emits a value, it + * computes a formula using that value plus the latest values from other input + * Observables, then emits the output of that formula. + * + * + * + * `withLatestFrom` combines each value from the source Observable (the + * instance) with the latest values from the other input Observables only when + * the source emits a value, optionally using a `project` function to determine + * the value to be emitted on the output Observable. All input Observables must + * emit at least one value before the output Observable will emit a value. + * + * @example On every click event, emit an array with the latest timer event plus the click event + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var timer = Rx.Observable.interval(1000); + * var result = clicks.withLatestFrom(timer); + * result.subscribe(x => console.log(x)); + * + * @see {@link combineLatest} + * + * @param {ObservableInput} other An input Observable to combine with the source + * Observable. More than one input Observables may be given as argument. + * @param {Function} [project] Projection function for combining values + * together. Receives all values in order of the Observables passed, where the + * first parameter is a value from the source Observable. (e.g. + * `a.withLatestFrom(b, c, (a1, b1, c1) => a1 + b1 + c1)`). If this is not + * passed, arrays will be emitted on the output Observable. + * @return {Observable} An Observable of projected values from the most recent + * values from each input Observable, or an array of the most recent values from + * each input Observable. + * @method withLatestFrom + * @owner Observable + */ +function withLatestFrom() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i - 0] = arguments[_i]; } - TakeUntilOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TakeUntilSubscriber(subscriber, this.notifier)); - }; - return TakeUntilOperator; -}()); + return withLatestFrom_1.withLatestFrom.apply(void 0, args)(this); +} +exports.withLatestFrom = withLatestFrom; + +},{"../operators/withLatestFrom":205}],157:[function(require,module,exports){ +"use strict"; +var zip_1 = require('../operators/zip'); +/* tslint:enable:max-line-length */ /** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} + * @param observables + * @return {Observable} + * @method zip + * @owner Observable */ -var TakeUntilSubscriber = (function (_super) { - __extends(TakeUntilSubscriber, _super); - function TakeUntilSubscriber(destination, notifier) { - _super.call(this, destination); - this.notifier = notifier; - this.add(subscribeToResult_1.subscribeToResult(this, notifier)); +function zipProto() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i - 0] = arguments[_i]; } - TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.complete(); - }; - TakeUntilSubscriber.prototype.notifyComplete = function () { - // noop - }; - return TakeUntilSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); + return zip_1.zip.apply(void 0, observables)(this); +} +exports.zipProto = zipProto; -},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],143:[function(require,module,exports){ +},{"../operators/zip":206}],158:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; +var tryCatch_1 = require('../util/tryCatch'); +var errorObject_1 = require('../util/errorObject'); var OuterSubscriber_1 = require('../OuterSubscriber'); var subscribeToResult_1 = require('../util/subscribeToResult'); -exports.defaultThrottleConfig = { - leading: true, - trailing: false -}; /** - * Emits a value from the source Observable, then ignores subsequent source - * values for a duration determined by another Observable, then repeats this + * Ignores source values for a duration determined by another Observable, then + * emits the most recent value from the source Observable, then repeats this * process. * - * It's like {@link throttleTime}, but the silencing + * It's like {@link auditTime}, but the silencing * duration is determined by a second Observable. * - * + * * - * `throttle` emits the source Observable values on the output Observable - * when its internal timer is disabled, and ignores source values when the timer - * is enabled. Initially, the timer is disabled. As soon as the first source - * value arrives, it is forwarded to the output Observable, and then the timer - * is enabled by calling the `durationSelector` function with the source value, - * which returns the "duration" Observable. When the duration Observable emits a - * value or completes, the timer is disabled, and this process repeats for the - * next source value. + * `audit` is similar to `throttle`, but emits the last value from the silenced + * time window, instead of the first value. `audit` emits the most recent value + * from the source Observable on the output Observable as soon as its internal + * timer becomes disabled, and ignores source values while the timer is enabled. + * Initially, the timer is disabled. As soon as the first source value arrives, + * the timer is enabled by calling the `durationSelector` function with the + * source value, which returns the "duration" Observable. When the duration + * Observable emits a value or completes, the timer is disabled, then the most + * recent source value is emitted on the output Observable, and this process + * repeats for the next source value. * * @example Emit clicks at a rate of at most one click per second * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var result = clicks.throttle(ev => Rx.Observable.interval(1000)); + * var result = clicks.audit(ev => Rx.Observable.interval(1000)); * result.subscribe(x => console.log(x)); * - * @see {@link audit} + * @see {@link auditTime} * @see {@link debounce} * @see {@link delayWhen} * @see {@link sample} - * @see {@link throttleTime} + * @see {@link throttle} * * @param {function(value: T): SubscribableOrPromise} durationSelector A function * that receives a value from the source Observable, for computing the silencing - * duration for each source value, returned as an Observable or a Promise. - * @param {Object} config a configuration object to define `leading` and `trailing` behavior. Defaults - * to `{ leading: true, trailing: false }`. - * @return {Observable} An Observable that performs the throttle operation to - * limit the rate of emissions from the source. - * @method throttle + * duration, returned as an Observable or a Promise. + * @return {Observable} An Observable that performs rate-limiting of + * emissions from the source Observable. + * @method audit * @owner Observable */ -function throttle(durationSelector, config) { - if (config === void 0) { config = exports.defaultThrottleConfig; } - return this.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); +function audit(durationSelector) { + return function auditOperatorFunction(source) { + return source.lift(new AuditOperator(durationSelector)); + }; } -exports.throttle = throttle; -var ThrottleOperator = (function () { - function ThrottleOperator(durationSelector, leading, trailing) { +exports.audit = audit; +var AuditOperator = (function () { + function AuditOperator(durationSelector) { this.durationSelector = durationSelector; - this.leading = leading; - this.trailing = trailing; } - ThrottleOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing)); + AuditOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector)); }; - return ThrottleOperator; + return AuditOperator; }()); /** - * We need this JSDoc comment for affecting ESDoc + * We need this JSDoc comment for affecting ESDoc. * @ignore * @extends {Ignored} */ -var ThrottleSubscriber = (function (_super) { - __extends(ThrottleSubscriber, _super); - function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) { +var AuditSubscriber = (function (_super) { + __extends(AuditSubscriber, _super); + function AuditSubscriber(destination, durationSelector) { _super.call(this, destination); - this.destination = destination; this.durationSelector = durationSelector; - this._leading = _leading; - this._trailing = _trailing; - this._hasTrailingValue = false; + this.hasValue = false; } - ThrottleSubscriber.prototype._next = function (value) { - if (this.throttled) { - if (this._trailing) { - this._hasTrailingValue = true; - this._trailingValue = value; + AuditSubscriber.prototype._next = function (value) { + this.value = value; + this.hasValue = true; + if (!this.throttled) { + var duration = tryCatch_1.tryCatch(this.durationSelector)(value); + if (duration === errorObject_1.errorObject) { + this.destination.error(errorObject_1.errorObject.e); } - } - else { - var duration = this.tryDurationSelector(value); - if (duration) { - this.add(this.throttled = subscribeToResult_1.subscribeToResult(this, duration)); - } - if (this._leading) { - this.destination.next(value); - if (this._trailing) { - this._hasTrailingValue = true; - this._trailingValue = value; + else { + var innerSubscription = subscribeToResult_1.subscribeToResult(this, duration); + if (innerSubscription.closed) { + this.clearThrottle(); + } + else { + this.add(this.throttled = innerSubscription); } } } }; - ThrottleSubscriber.prototype.tryDurationSelector = function (value) { - try { - return this.durationSelector(value); - } - catch (err) { - this.destination.error(err); - return null; - } - }; - ThrottleSubscriber.prototype._unsubscribe = function () { - var _a = this, throttled = _a.throttled, _trailingValue = _a._trailingValue, _hasTrailingValue = _a._hasTrailingValue, _trailing = _a._trailing; - this._trailingValue = null; - this._hasTrailingValue = false; + AuditSubscriber.prototype.clearThrottle = function () { + var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled; if (throttled) { this.remove(throttled); this.throttled = null; throttled.unsubscribe(); } - }; - ThrottleSubscriber.prototype._sendTrailing = function () { - var _a = this, destination = _a.destination, throttled = _a.throttled, _trailing = _a._trailing, _trailingValue = _a._trailingValue, _hasTrailingValue = _a._hasTrailingValue; - if (throttled && _trailing && _hasTrailingValue) { - destination.next(_trailingValue); - this._trailingValue = null; - this._hasTrailingValue = false; + if (hasValue) { + this.value = null; + this.hasValue = false; + this.destination.next(value); } }; - ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this._sendTrailing(); - this._unsubscribe(); + AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) { + this.clearThrottle(); }; - ThrottleSubscriber.prototype.notifyComplete = function () { - this._sendTrailing(); - this._unsubscribe(); + AuditSubscriber.prototype.notifyComplete = function () { + this.clearThrottle(); }; - return ThrottleSubscriber; + return AuditSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],144:[function(require,module,exports){ +},{"../OuterSubscriber":31,"../util/errorObject":224,"../util/subscribeToResult":237,"../util/tryCatch":239}],159:[function(require,module,exports){ "use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Subscriber_1 = require('../Subscriber'); var async_1 = require('../scheduler/async'); -var throttle_1 = require('./throttle'); +var audit_1 = require('./audit'); +var timer_1 = require('../observable/timer'); /** - * Emits a value from the source Observable, then ignores subsequent source - * values for `duration` milliseconds, then repeats this process. - * - * Lets a value pass, then ignores source values for the - * next `duration` milliseconds. - * - * - * - * `throttleTime` emits the source Observable values on the output Observable - * when its internal timer is disabled, and ignores source values when the timer - * is enabled. Initially, the timer is disabled. As soon as the first source - * value arrives, it is forwarded to the output Observable, and then the timer - * is enabled. After `duration` milliseconds (or the time unit determined - * internally by the optional `scheduler`) has passed, the timer is disabled, - * and this process repeats for the next source value. Optionally takes a - * {@link IScheduler} for managing timers. + * Ignores source values for `duration` milliseconds, then emits the most recent + * value from the source Observable, then repeats this process. + * + * When it sees a source values, it ignores that plus + * the next ones for `duration` milliseconds, and then it emits the most recent + * value from the source. + * + * + * + * `auditTime` is similar to `throttleTime`, but emits the last value from the + * silenced time window, instead of the first value. `auditTime` emits the most + * recent value from the source Observable on the output Observable as soon as + * its internal timer becomes disabled, and ignores source values while the + * timer is enabled. Initially, the timer is disabled. As soon as the first + * source value arrives, the timer is enabled. After `duration` milliseconds (or + * the time unit determined internally by the optional `scheduler`) has passed, + * the timer is disabled, then the most recent source value is emitted on the + * output Observable, and this process repeats for the next source value. + * Optionally takes a {@link IScheduler} for managing timers. * * @example Emit clicks at a rate of at most one click per second * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var result = clicks.throttleTime(1000); + * var result = clicks.auditTime(1000); * result.subscribe(x => console.log(x)); * - * @see {@link auditTime} + * @see {@link audit} * @see {@link debounceTime} * @see {@link delay} * @see {@link sampleTime} - * @see {@link throttle} + * @see {@link throttleTime} * - * @param {number} duration Time to wait before emitting another value after - * emitting the last value, measured in milliseconds or the time unit determined - * internally by the optional `scheduler`. + * @param {number} duration Time to wait before emitting the most recent source + * value, measured in milliseconds or the time unit determined internally + * by the optional `scheduler`. * @param {Scheduler} [scheduler=async] The {@link IScheduler} to use for - * managing the timers that handle the throttling. - * @return {Observable} An Observable that performs the throttle operation to - * limit the rate of emissions from the source. - * @method throttleTime + * managing the timers that handle the rate-limiting behavior. + * @return {Observable} An Observable that performs rate-limiting of + * emissions from the source Observable. + * @method auditTime * @owner Observable */ -function throttleTime(duration, scheduler, config) { +function auditTime(duration, scheduler) { if (scheduler === void 0) { scheduler = async_1.async; } - if (config === void 0) { config = throttle_1.defaultThrottleConfig; } - return this.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); -} -exports.throttleTime = throttleTime; -var ThrottleTimeOperator = (function () { - function ThrottleTimeOperator(duration, scheduler, leading, trailing) { - this.duration = duration; - this.scheduler = scheduler; - this.leading = leading; - this.trailing = trailing; - } - ThrottleTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing)); - }; - return ThrottleTimeOperator; -}()); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var ThrottleTimeSubscriber = (function (_super) { - __extends(ThrottleTimeSubscriber, _super); - function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) { - _super.call(this, destination); - this.duration = duration; - this.scheduler = scheduler; - this.leading = leading; - this.trailing = trailing; - this._hasTrailingValue = false; - this._trailingValue = null; - } - ThrottleTimeSubscriber.prototype._next = function (value) { - if (this.throttled) { - if (this.trailing) { - this._trailingValue = value; - this._hasTrailingValue = true; - } - } - else { - this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this })); - if (this.leading) { - this.destination.next(value); - } - } - }; - ThrottleTimeSubscriber.prototype.clearThrottle = function () { - var throttled = this.throttled; - if (throttled) { - if (this.trailing && this._hasTrailingValue) { - this.destination.next(this._trailingValue); - this._trailingValue = null; - this._hasTrailingValue = false; - } - throttled.unsubscribe(); - this.remove(throttled); - this.throttled = null; - } - }; - return ThrottleTimeSubscriber; -}(Subscriber_1.Subscriber)); -function dispatchNext(arg) { - var subscriber = arg.subscriber; - subscriber.clearThrottle(); + return audit_1.audit(function () { return timer_1.timer(duration, scheduler); }); } +exports.auditTime = auditTime; -},{"../Subscriber":36,"../scheduler/async":152,"./throttle":143}],145:[function(require,module,exports){ +},{"../observable/timer":114,"../scheduler/async":212,"./audit":158}],160:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; @@ -12270,1116 +10804,5363 @@ var __extends = (this && this.__extends) || function (d, b) { }; var OuterSubscriber_1 = require('../OuterSubscriber'); var subscribeToResult_1 = require('../util/subscribeToResult'); -/* tslint:enable:max-line-length */ /** - * Combines the source Observable with other Observables to create an Observable - * whose values are calculated from the latest values of each, only when the - * source emits. + * Buffers the source Observable values until `closingNotifier` emits. * - * Whenever the source Observable emits a value, it - * computes a formula using that value plus the latest values from other input - * Observables, then emits the output of that formula. + * Collects values from the past as an array, and emits + * that array only when another Observable emits. * - * + * * - * `withLatestFrom` combines each value from the source Observable (the - * instance) with the latest values from the other input Observables only when - * the source emits a value, optionally using a `project` function to determine - * the value to be emitted on the output Observable. All input Observables must - * emit at least one value before the output Observable will emit a value. + * Buffers the incoming Observable values until the given `closingNotifier` + * Observable emits a value, at which point it emits the buffer on the output + * Observable and starts a new buffer internally, awaiting the next time + * `closingNotifier` emits. * - * @example On every click event, emit an array with the latest timer event plus the click event + * @example On every click, emit array of most recent interval events * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var timer = Rx.Observable.interval(1000); - * var result = clicks.withLatestFrom(timer); - * result.subscribe(x => console.log(x)); + * var interval = Rx.Observable.interval(1000); + * var buffered = interval.buffer(clicks); + * buffered.subscribe(x => console.log(x)); * - * @see {@link combineLatest} + * @see {@link bufferCount} + * @see {@link bufferTime} + * @see {@link bufferToggle} + * @see {@link bufferWhen} + * @see {@link window} * - * @param {ObservableInput} other An input Observable to combine with the source - * Observable. More than one input Observables may be given as argument. - * @param {Function} [project] Projection function for combining values - * together. Receives all values in order of the Observables passed, where the - * first parameter is a value from the source Observable. (e.g. - * `a.withLatestFrom(b, c, (a1, b1, c1) => a1 + b1 + c1)`). If this is not - * passed, arrays will be emitted on the output Observable. - * @return {Observable} An Observable of projected values from the most recent - * values from each input Observable, or an array of the most recent values from - * each input Observable. - * @method withLatestFrom + * @param {Observable} closingNotifier An Observable that signals the + * buffer to be emitted on the output Observable. + * @return {Observable} An Observable of buffers, which are arrays of + * values. + * @method buffer * @owner Observable */ -function withLatestFrom() { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i - 0] = arguments[_i]; - } - var project; - if (typeof args[args.length - 1] === 'function') { - project = args.pop(); - } - var observables = args; - return this.lift(new WithLatestFromOperator(observables, project)); +function buffer(closingNotifier) { + return function bufferOperatorFunction(source) { + return source.lift(new BufferOperator(closingNotifier)); + }; } -exports.withLatestFrom = withLatestFrom; -var WithLatestFromOperator = (function () { - function WithLatestFromOperator(observables, project) { - this.observables = observables; - this.project = project; +exports.buffer = buffer; +var BufferOperator = (function () { + function BufferOperator(closingNotifier) { + this.closingNotifier = closingNotifier; } - WithLatestFromOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project)); + BufferOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier)); }; - return WithLatestFromOperator; + return BufferOperator; }()); /** * We need this JSDoc comment for affecting ESDoc. * @ignore * @extends {Ignored} */ -var WithLatestFromSubscriber = (function (_super) { - __extends(WithLatestFromSubscriber, _super); - function WithLatestFromSubscriber(destination, observables, project) { +var BufferSubscriber = (function (_super) { + __extends(BufferSubscriber, _super); + function BufferSubscriber(destination, closingNotifier) { _super.call(this, destination); - this.observables = observables; - this.project = project; - this.toRespond = []; - var len = observables.length; - this.values = new Array(len); - for (var i = 0; i < len; i++) { - this.toRespond.push(i); - } - for (var i = 0; i < len; i++) { - var observable = observables[i]; - this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i)); - } + this.buffer = []; + this.add(subscribeToResult_1.subscribeToResult(this, closingNotifier)); } - WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.values[outerIndex] = innerValue; - var toRespond = this.toRespond; - if (toRespond.length > 0) { - var found = toRespond.indexOf(outerIndex); - if (found !== -1) { - toRespond.splice(found, 1); - } - } - }; - WithLatestFromSubscriber.prototype.notifyComplete = function () { - // noop - }; - WithLatestFromSubscriber.prototype._next = function (value) { - if (this.toRespond.length === 0) { - var args = [value].concat(this.values); - if (this.project) { - this._tryProject(args); - } - else { - this.destination.next(args); - } - } + BufferSubscriber.prototype._next = function (value) { + this.buffer.push(value); }; - WithLatestFromSubscriber.prototype._tryProject = function (args) { - var result; - try { - result = this.project.apply(this, args); - } - catch (err) { - this.destination.error(err); - return; - } - this.destination.next(result); + BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + var buffer = this.buffer; + this.buffer = []; + this.destination.next(buffer); }; - return WithLatestFromSubscriber; + return BufferSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":31,"../util/subscribeToResult":173}],146:[function(require,module,exports){ +},{"../OuterSubscriber":31,"../util/subscribeToResult":237}],161:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; -var ArrayObservable_1 = require('../observable/ArrayObservable'); -var isArray_1 = require('../util/isArray'); var Subscriber_1 = require('../Subscriber'); -var OuterSubscriber_1 = require('../OuterSubscriber'); -var subscribeToResult_1 = require('../util/subscribeToResult'); -var iterator_1 = require('../symbol/iterator'); -/* tslint:enable:max-line-length */ -/** - * @param observables - * @return {Observable} - * @method zip - * @owner Observable - */ -function zipProto() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i - 0] = arguments[_i]; - } - return this.lift.call(zipStatic.apply(void 0, [this].concat(observables))); -} -exports.zipProto = zipProto; -/* tslint:enable:max-line-length */ /** - * Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each - * of its input Observables. - * - * If the latest parameter is a function, this function is used to compute the created value from the input values. - * Otherwise, an array of the input values is returned. + * Buffers the source Observable values until the size hits the maximum + * `bufferSize` given. * - * @example Combine age and name from different sources + * Collects values from the past as an array, and emits + * that array only when its size reaches `bufferSize`. * - * let age$ = Observable.of(27, 25, 29); - * let name$ = Observable.of('Foo', 'Bar', 'Beer'); - * let isDev$ = Observable.of(true, true, false); + * * - * Observable - * .zip(age$, - * name$, - * isDev$, - * (age: number, name: string, isDev: boolean) => ({ age, name, isDev })) - * .subscribe(x => console.log(x)); + * Buffers a number of values from the source Observable by `bufferSize` then + * emits the buffer and clears it, and starts a new buffer each + * `startBufferEvery` values. If `startBufferEvery` is not provided or is + * `null`, then new buffers are started immediately at the start of the source + * and when each buffer closes and is emitted. * - * // outputs - * // { age: 27, name: 'Foo', isDev: true } - * // { age: 25, name: 'Bar', isDev: true } - * // { age: 29, name: 'Beer', isDev: false } + * @example Emit the last two click events as an array + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var buffered = clicks.bufferCount(2); + * buffered.subscribe(x => console.log(x)); * - * @param observables - * @return {Observable} - * @static true - * @name zip + * @example On every click, emit the last two click events as an array + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var buffered = clicks.bufferCount(2, 1); + * buffered.subscribe(x => console.log(x)); + * + * @see {@link buffer} + * @see {@link bufferTime} + * @see {@link bufferToggle} + * @see {@link bufferWhen} + * @see {@link pairwise} + * @see {@link windowCount} + * + * @param {number} bufferSize The maximum size of the buffer emitted. + * @param {number} [startBufferEvery] Interval at which to start a new buffer. + * For example if `startBufferEvery` is `2`, then a new buffer will be started + * on every other value from the source. A new buffer is started at the + * beginning of the source by default. + * @return {Observable} An Observable of arrays of buffered values. + * @method bufferCount * @owner Observable */ -function zipStatic() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i - 0] = arguments[_i]; - } - var project = observables[observables.length - 1]; - if (typeof project === 'function') { - observables.pop(); - } - return new ArrayObservable_1.ArrayObservable(observables).lift(new ZipOperator(project)); +function bufferCount(bufferSize, startBufferEvery) { + if (startBufferEvery === void 0) { startBufferEvery = null; } + return function bufferCountOperatorFunction(source) { + return source.lift(new BufferCountOperator(bufferSize, startBufferEvery)); + }; } -exports.zipStatic = zipStatic; -var ZipOperator = (function () { - function ZipOperator(project) { - this.project = project; +exports.bufferCount = bufferCount; +var BufferCountOperator = (function () { + function BufferCountOperator(bufferSize, startBufferEvery) { + this.bufferSize = bufferSize; + this.startBufferEvery = startBufferEvery; + if (!startBufferEvery || bufferSize === startBufferEvery) { + this.subscriberClass = BufferCountSubscriber; + } + else { + this.subscriberClass = BufferSkipCountSubscriber; + } } - ZipOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ZipSubscriber(subscriber, this.project)); + BufferCountOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery)); }; - return ZipOperator; + return BufferCountOperator; }()); -exports.ZipOperator = ZipOperator; /** * We need this JSDoc comment for affecting ESDoc. * @ignore * @extends {Ignored} */ -var ZipSubscriber = (function (_super) { - __extends(ZipSubscriber, _super); - function ZipSubscriber(destination, project, values) { - if (values === void 0) { values = Object.create(null); } +var BufferCountSubscriber = (function (_super) { + __extends(BufferCountSubscriber, _super); + function BufferCountSubscriber(destination, bufferSize) { _super.call(this, destination); - this.iterators = []; - this.active = 0; - this.project = (typeof project === 'function') ? project : null; - this.values = values; + this.bufferSize = bufferSize; + this.buffer = []; } - ZipSubscriber.prototype._next = function (value) { - var iterators = this.iterators; - if (isArray_1.isArray(value)) { - iterators.push(new StaticArrayIterator(value)); - } - else if (typeof value[iterator_1.iterator] === 'function') { - iterators.push(new StaticIterator(value[iterator_1.iterator]())); - } - else { - iterators.push(new ZipBufferIterator(this.destination, this, value)); - } - }; - ZipSubscriber.prototype._complete = function () { - var iterators = this.iterators; - var len = iterators.length; - if (len === 0) { - this.destination.complete(); - return; - } - this.active = len; - for (var i = 0; i < len; i++) { - var iterator = iterators[i]; - if (iterator.stillUnsubscribed) { - this.add(iterator.subscribe(iterator, i)); - } - else { - this.active--; // not an observable - } + BufferCountSubscriber.prototype._next = function (value) { + var buffer = this.buffer; + buffer.push(value); + if (buffer.length == this.bufferSize) { + this.destination.next(buffer); + this.buffer = []; } }; - ZipSubscriber.prototype.notifyInactive = function () { - this.active--; - if (this.active === 0) { - this.destination.complete(); + BufferCountSubscriber.prototype._complete = function () { + var buffer = this.buffer; + if (buffer.length > 0) { + this.destination.next(buffer); } + _super.prototype._complete.call(this); }; - ZipSubscriber.prototype.checkIterators = function () { - var iterators = this.iterators; - var len = iterators.length; - var destination = this.destination; - // abort if not all of them have values - for (var i = 0; i < len; i++) { - var iterator = iterators[i]; - if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) { - return; - } + return BufferCountSubscriber; +}(Subscriber_1.Subscriber)); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var BufferSkipCountSubscriber = (function (_super) { + __extends(BufferSkipCountSubscriber, _super); + function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) { + _super.call(this, destination); + this.bufferSize = bufferSize; + this.startBufferEvery = startBufferEvery; + this.buffers = []; + this.count = 0; + } + BufferSkipCountSubscriber.prototype._next = function (value) { + var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count; + this.count++; + if (count % startBufferEvery === 0) { + buffers.push([]); } - var shouldComplete = false; - var args = []; - for (var i = 0; i < len; i++) { - var iterator = iterators[i]; - var result = iterator.next(); - // check to see if it's completed now that you've gotten - // the next value. - if (iterator.hasCompleted()) { - shouldComplete = true; - } - if (result.done) { - destination.complete(); - return; + for (var i = buffers.length; i--;) { + var buffer = buffers[i]; + buffer.push(value); + if (buffer.length === bufferSize) { + buffers.splice(i, 1); + this.destination.next(buffer); } - args.push(result.value); - } - if (this.project) { - this._tryProject(args); - } - else { - destination.next(args); - } - if (shouldComplete) { - destination.complete(); } }; - ZipSubscriber.prototype._tryProject = function (args) { - var result; - try { - result = this.project.apply(this, args); - } - catch (err) { - this.destination.error(err); - return; + BufferSkipCountSubscriber.prototype._complete = function () { + var _a = this, buffers = _a.buffers, destination = _a.destination; + while (buffers.length > 0) { + var buffer = buffers.shift(); + if (buffer.length > 0) { + destination.next(buffer); + } } - this.destination.next(result); + _super.prototype._complete.call(this); }; - return ZipSubscriber; + return BufferSkipCountSubscriber; }(Subscriber_1.Subscriber)); -exports.ZipSubscriber = ZipSubscriber; -var StaticIterator = (function () { - function StaticIterator(iterator) { - this.iterator = iterator; - this.nextResult = iterator.next(); - } - StaticIterator.prototype.hasValue = function () { - return true; - }; - StaticIterator.prototype.next = function () { - var result = this.nextResult; - this.nextResult = this.iterator.next(); - return result; - }; - StaticIterator.prototype.hasCompleted = function () { - var nextResult = this.nextResult; - return nextResult && nextResult.done; + +},{"../Subscriber":36}],162:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscription_1 = require('../Subscription'); +var tryCatch_1 = require('../util/tryCatch'); +var errorObject_1 = require('../util/errorObject'); +var OuterSubscriber_1 = require('../OuterSubscriber'); +var subscribeToResult_1 = require('../util/subscribeToResult'); +/** + * Buffers the source Observable values, using a factory function of closing + * Observables to determine when to close, emit, and reset the buffer. + * + * Collects values from the past as an array. When it + * starts collecting values, it calls a function that returns an Observable that + * tells when to close the buffer and restart collecting. + * + * + * + * Opens a buffer immediately, then closes the buffer when the observable + * returned by calling `closingSelector` function emits a value. When it closes + * the buffer, it immediately opens a new buffer and repeats the process. + * + * @example Emit an array of the last clicks every [1-5] random seconds + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var buffered = clicks.bufferWhen(() => + * Rx.Observable.interval(1000 + Math.random() * 4000) + * ); + * buffered.subscribe(x => console.log(x)); + * + * @see {@link buffer} + * @see {@link bufferCount} + * @see {@link bufferTime} + * @see {@link bufferToggle} + * @see {@link windowWhen} + * + * @param {function(): Observable} closingSelector A function that takes no + * arguments and returns an Observable that signals buffer closure. + * @return {Observable} An observable of arrays of buffered values. + * @method bufferWhen + * @owner Observable + */ +function bufferWhen(closingSelector) { + return function (source) { + return source.lift(new BufferWhenOperator(closingSelector)); }; - return StaticIterator; -}()); -var StaticArrayIterator = (function () { - function StaticArrayIterator(array) { - this.array = array; - this.index = 0; - this.length = 0; - this.length = array.length; +} +exports.bufferWhen = bufferWhen; +var BufferWhenOperator = (function () { + function BufferWhenOperator(closingSelector) { + this.closingSelector = closingSelector; } - StaticArrayIterator.prototype[iterator_1.iterator] = function () { - return this; - }; - StaticArrayIterator.prototype.next = function (value) { - var i = this.index++; - var array = this.array; - return i < this.length ? { value: array[i], done: false } : { value: null, done: true }; - }; - StaticArrayIterator.prototype.hasValue = function () { - return this.array.length > this.index; - }; - StaticArrayIterator.prototype.hasCompleted = function () { - return this.array.length === this.index; + BufferWhenOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector)); }; - return StaticArrayIterator; + return BufferWhenOperator; }()); /** * We need this JSDoc comment for affecting ESDoc. * @ignore * @extends {Ignored} */ -var ZipBufferIterator = (function (_super) { - __extends(ZipBufferIterator, _super); - function ZipBufferIterator(destination, parent, observable) { +var BufferWhenSubscriber = (function (_super) { + __extends(BufferWhenSubscriber, _super); + function BufferWhenSubscriber(destination, closingSelector) { _super.call(this, destination); - this.parent = parent; - this.observable = observable; - this.stillUnsubscribed = true; - this.buffer = []; - this.isComplete = false; + this.closingSelector = closingSelector; + this.subscribing = false; + this.openBuffer(); } - ZipBufferIterator.prototype[iterator_1.iterator] = function () { - return this; + BufferWhenSubscriber.prototype._next = function (value) { + this.buffer.push(value); }; - // NOTE: there is actually a name collision here with Subscriber.next and Iterator.next - // this is legit because `next()` will never be called by a subscription in this case. - ZipBufferIterator.prototype.next = function () { + BufferWhenSubscriber.prototype._complete = function () { var buffer = this.buffer; - if (buffer.length === 0 && this.isComplete) { - return { value: null, done: true }; - } - else { - return { value: buffer.shift(), done: false }; + if (buffer) { + this.destination.next(buffer); } + _super.prototype._complete.call(this); }; - ZipBufferIterator.prototype.hasValue = function () { - return this.buffer.length > 0; + BufferWhenSubscriber.prototype._unsubscribe = function () { + this.buffer = null; + this.subscribing = false; }; - ZipBufferIterator.prototype.hasCompleted = function () { - return this.buffer.length === 0 && this.isComplete; + BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.openBuffer(); }; - ZipBufferIterator.prototype.notifyComplete = function () { - if (this.buffer.length > 0) { - this.isComplete = true; - this.parent.notifyInactive(); + BufferWhenSubscriber.prototype.notifyComplete = function () { + if (this.subscribing) { + this.complete(); } else { - this.destination.complete(); + this.openBuffer(); } }; - ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.buffer.push(innerValue); - this.parent.checkIterators(); - }; - ZipBufferIterator.prototype.subscribe = function (value, index) { - return subscribeToResult_1.subscribeToResult(this, this.observable, this, index); + BufferWhenSubscriber.prototype.openBuffer = function () { + var closingSubscription = this.closingSubscription; + if (closingSubscription) { + this.remove(closingSubscription); + closingSubscription.unsubscribe(); + } + var buffer = this.buffer; + if (this.buffer) { + this.destination.next(buffer); + } + this.buffer = []; + var closingNotifier = tryCatch_1.tryCatch(this.closingSelector)(); + if (closingNotifier === errorObject_1.errorObject) { + this.error(errorObject_1.errorObject.e); + } + else { + closingSubscription = new Subscription_1.Subscription(); + this.closingSubscription = closingSubscription; + this.add(closingSubscription); + this.subscribing = true; + closingSubscription.add(subscribeToResult_1.subscribeToResult(this, closingNotifier)); + this.subscribing = false; + } }; - return ZipBufferIterator; + return BufferWhenSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":31,"../Subscriber":36,"../observable/ArrayObservable":86,"../symbol/iterator":154,"../util/isArray":164,"../util/subscribeToResult":173}],147:[function(require,module,exports){ +},{"../OuterSubscriber":31,"../Subscription":37,"../util/errorObject":224,"../util/subscribeToResult":237,"../util/tryCatch":239}],163:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; -var Subscription_1 = require('../Subscription'); +var OuterSubscriber_1 = require('../OuterSubscriber'); +var subscribeToResult_1 = require('../util/subscribeToResult'); /** - * A unit of work to be executed in a {@link Scheduler}. An action is typically - * created from within a Scheduler and an RxJS user does not need to concern - * themselves about creating and manipulating an Action. + * Catches errors on the observable to be handled by returning a new observable or throwing an error. * - * ```ts - * class Action extends Subscription { - * new (scheduler: Scheduler, work: (state?: T) => void); - * schedule(state?: T, delay: number = 0): Subscription; - * } - * ``` + * * - * @class Action + * @example Continues with a different Observable when there's an error + * + * Observable.of(1, 2, 3, 4, 5) + * .map(n => { + * if (n == 4) { + * throw 'four!'; + * } + * return n; + * }) + * .catch(err => Observable.of('I', 'II', 'III', 'IV', 'V')) + * .subscribe(x => console.log(x)); + * // 1, 2, 3, I, II, III, IV, V + * + * @example Retries the caught source Observable again in case of error, similar to retry() operator + * + * Observable.of(1, 2, 3, 4, 5) + * .map(n => { + * if (n === 4) { + * throw 'four!'; + * } + * return n; + * }) + * .catch((err, caught) => caught) + * .take(30) + * .subscribe(x => console.log(x)); + * // 1, 2, 3, 1, 2, 3, ... + * + * @example Throws a new error when the source Observable throws an error + * + * Observable.of(1, 2, 3, 4, 5) + * .map(n => { + * if (n == 4) { + * throw 'four!'; + * } + * return n; + * }) + * .catch(err => { + * throw 'error in source. Details: ' + err; + * }) + * .subscribe( + * x => console.log(x), + * err => console.log(err) + * ); + * // 1, 2, 3, error in source. Details: four! + * + * @param {function} selector a function that takes as arguments `err`, which is the error, and `caught`, which + * is the source observable, in case you'd like to "retry" that observable by returning it again. Whatever observable + * is returned by the `selector` will be used to continue the observable chain. + * @return {Observable} An observable that originates from either the source or the observable returned by the + * catch `selector` function. + * @name catchError */ -var Action = (function (_super) { - __extends(Action, _super); - function Action(scheduler, work) { - _super.call(this); +function catchError(selector) { + return function catchErrorOperatorFunction(source) { + var operator = new CatchOperator(selector); + var caught = source.lift(operator); + return (operator.caught = caught); + }; +} +exports.catchError = catchError; +var CatchOperator = (function () { + function CatchOperator(selector) { + this.selector = selector; } - /** - * Schedules this action on its parent Scheduler for execution. May be passed - * some context object, `state`. May happen at some point in the future, - * according to the `delay` parameter, if specified. - * @param {T} [state] Some contextual data that the `work` function uses when - * called by the Scheduler. - * @param {number} [delay] Time to wait before executing the work, where the - * time unit is implicit and defined by the Scheduler. - * @return {void} - */ - Action.prototype.schedule = function (state, delay) { - if (delay === void 0) { delay = 0; } - return this; + CatchOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught)); }; - return Action; -}(Subscription_1.Subscription)); -exports.Action = Action; + return CatchOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var CatchSubscriber = (function (_super) { + __extends(CatchSubscriber, _super); + function CatchSubscriber(destination, selector, caught) { + _super.call(this, destination); + this.selector = selector; + this.caught = caught; + } + // NOTE: overriding `error` instead of `_error` because we don't want + // to have this flag this subscriber as `isStopped`. We can mimic the + // behavior of the RetrySubscriber (from the `retry` operator), where + // we unsubscribe from our source chain, reset our Subscriber flags, + // then subscribe to the selector result. + CatchSubscriber.prototype.error = function (err) { + if (!this.isStopped) { + var result = void 0; + try { + result = this.selector(err, this.caught); + } + catch (err2) { + _super.prototype.error.call(this, err2); + return; + } + this._unsubscribeAndRecycle(); + this.add(subscribeToResult_1.subscribeToResult(this, result)); + } + }; + return CatchSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); -},{"../Subscription":37}],148:[function(require,module,exports){ +},{"../OuterSubscriber":31,"../util/subscribeToResult":237}],164:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; -var root_1 = require('../util/root'); -var Action_1 = require('./Action'); +var ArrayObservable_1 = require('../observable/ArrayObservable'); +var isArray_1 = require('../util/isArray'); +var OuterSubscriber_1 = require('../OuterSubscriber'); +var subscribeToResult_1 = require('../util/subscribeToResult'); +var none = {}; +/* tslint:enable:max-line-length */ +/** + * Combines multiple Observables to create an Observable whose values are + * calculated from the latest values of each of its input Observables. + * + * Whenever any input Observable emits a value, it + * computes a formula using the latest values from all the inputs, then emits + * the output of that formula. + * + * + * + * `combineLatest` combines the values from this Observable with values from + * Observables passed as arguments. This is done by subscribing to each + * Observable, in order, and collecting an array of each of the most recent + * values any time any of the input Observables emits, then either taking that + * array and passing it as arguments to an optional `project` function and + * emitting the return value of that, or just emitting the array of recent + * values directly if there is no `project` function. + * + * @example Dynamically calculate the Body-Mass Index from an Observable of weight and one for height + * var weight = Rx.Observable.of(70, 72, 76, 79, 75); + * var height = Rx.Observable.of(1.76, 1.77, 1.78); + * var bmi = weight.combineLatest(height, (w, h) => w / (h * h)); + * bmi.subscribe(x => console.log('BMI is ' + x)); + * + * // With output to console: + * // BMI is 24.212293388429753 + * // BMI is 23.93948099205209 + * // BMI is 23.671253629592222 + * + * @see {@link combineAll} + * @see {@link merge} + * @see {@link withLatestFrom} + * + * @param {ObservableInput} other An input Observable to combine with the source + * Observable. More than one input Observables may be given as argument. + * @param {function} [project] An optional function to project the values from + * the combined latest values into a new value on the output Observable. + * @return {Observable} An Observable of projected values from the most recent + * values from each input Observable, or an array of the most recent values from + * each input Observable. + * @method combineLatest + * @owner Observable + */ +function combineLatest() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i - 0] = arguments[_i]; + } + var project = null; + if (typeof observables[observables.length - 1] === 'function') { + project = observables.pop(); + } + // if the first and only other argument besides the resultSelector is an array + // assume it's been called with `combineLatest([obs1, obs2, obs3], project)` + if (observables.length === 1 && isArray_1.isArray(observables[0])) { + observables = observables[0].slice(); + } + return function (source) { return source.lift.call(new ArrayObservable_1.ArrayObservable([source].concat(observables)), new CombineLatestOperator(project)); }; +} +exports.combineLatest = combineLatest; +var CombineLatestOperator = (function () { + function CombineLatestOperator(project) { + this.project = project; + } + CombineLatestOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new CombineLatestSubscriber(subscriber, this.project)); + }; + return CombineLatestOperator; +}()); +exports.CombineLatestOperator = CombineLatestOperator; /** * We need this JSDoc comment for affecting ESDoc. * @ignore * @extends {Ignored} */ -var AsyncAction = (function (_super) { - __extends(AsyncAction, _super); - function AsyncAction(scheduler, work) { - _super.call(this, scheduler, work); - this.scheduler = scheduler; - this.work = work; - this.pending = false; +var CombineLatestSubscriber = (function (_super) { + __extends(CombineLatestSubscriber, _super); + function CombineLatestSubscriber(destination, project) { + _super.call(this, destination); + this.project = project; + this.active = 0; + this.values = []; + this.observables = []; } - AsyncAction.prototype.schedule = function (state, delay) { - if (delay === void 0) { delay = 0; } - if (this.closed) { - return this; - } - // Always replace the current state with the new state. - this.state = state; - // Set the pending flag indicating that this action has been scheduled, or - // has recursively rescheduled itself. - this.pending = true; - var id = this.id; - var scheduler = this.scheduler; - // - // Important implementation note: - // - // Actions only execute once by default, unless rescheduled from within the - // scheduled callback. This allows us to implement single and repeat - // actions via the same code path, without adding API surface area, as well - // as mimic traditional recursion but across asynchronous boundaries. - // - // However, JS runtimes and timers distinguish between intervals achieved by - // serial `setTimeout` calls vs. a single `setInterval` call. An interval of - // serial `setTimeout` calls can be individually delayed, which delays - // scheduling the next `setTimeout`, and so on. `setInterval` attempts to - // guarantee the interval callback will be invoked more precisely to the - // interval period, regardless of load. - // - // Therefore, we use `setInterval` to schedule single and repeat actions. - // If the action reschedules itself with the same delay, the interval is not - // canceled. If the action doesn't reschedule, or reschedules with a - // different delay, the interval will be canceled after scheduled callback - // execution. - // - if (id != null) { - this.id = this.recycleAsyncId(scheduler, id, delay); - } - this.delay = delay; - // If this action has already an async Id, don't request a new one. - this.id = this.id || this.requestAsyncId(scheduler, this.id, delay); - return this; - }; - AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { delay = 0; } - return root_1.root.setInterval(scheduler.flush.bind(scheduler, this), delay); - }; - AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { delay = 0; } - // If this action is rescheduled with the same delay time, don't clear the interval id. - if (delay !== null && this.delay === delay && this.pending === false) { - return id; - } - // Otherwise, if the action's delay time is different from the current delay, - // or the action has been rescheduled before it's executed, clear the interval id - return root_1.root.clearInterval(id) && undefined || undefined; - }; - /** - * Immediately executes this action and the `work` it contains. - * @return {any} - */ - AsyncAction.prototype.execute = function (state, delay) { - if (this.closed) { - return new Error('executing a cancelled action'); - } - this.pending = false; - var error = this._execute(state, delay); - if (error) { - return error; - } - else if (this.pending === false && this.id != null) { - // Dequeue if the action didn't reschedule itself. Don't call - // unsubscribe(), because the action could reschedule later. - // For example: - // ``` - // scheduler.schedule(function doWork(counter) { - // /* ... I'm a busy worker bee ... */ - // var originalAction = this; - // /* wait 100ms before rescheduling the action */ - // setTimeout(function () { - // originalAction.schedule(counter + 1); - // }, 100); - // }, 1000); - // ``` - this.id = this.recycleAsyncId(this.scheduler, this.id, null); - } + CombineLatestSubscriber.prototype._next = function (observable) { + this.values.push(none); + this.observables.push(observable); }; - AsyncAction.prototype._execute = function (state, delay) { - var errored = false; - var errorValue = undefined; - try { - this.work(state); - } - catch (e) { - errored = true; - errorValue = !!e && e || new Error(e); + CombineLatestSubscriber.prototype._complete = function () { + var observables = this.observables; + var len = observables.length; + if (len === 0) { + this.destination.complete(); } - if (errored) { - this.unsubscribe(); - return errorValue; + else { + this.active = len; + this.toRespond = len; + for (var i = 0; i < len; i++) { + var observable = observables[i]; + this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i)); + } } }; - AsyncAction.prototype._unsubscribe = function () { - var id = this.id; - var scheduler = this.scheduler; - var actions = scheduler.actions; - var index = actions.indexOf(this); - this.work = null; - this.state = null; - this.pending = false; - this.scheduler = null; - if (index !== -1) { - actions.splice(index, 1); - } - if (id != null) { - this.id = this.recycleAsyncId(scheduler, id, null); + CombineLatestSubscriber.prototype.notifyComplete = function (unused) { + if ((this.active -= 1) === 0) { + this.destination.complete(); } - this.delay = null; }; - return AsyncAction; -}(Action_1.Action)); -exports.AsyncAction = AsyncAction; - -},{"../util/root":172,"./Action":147}],149:[function(require,module,exports){ -"use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var Scheduler_1 = require('../Scheduler'); -var AsyncScheduler = (function (_super) { - __extends(AsyncScheduler, _super); - function AsyncScheduler() { - _super.apply(this, arguments); - this.actions = []; - /** - * A flag to indicate whether the Scheduler is currently executing a batch of - * queued actions. - * @type {boolean} - */ - this.active = false; - /** - * An internal ID used to track the latest asynchronous task such as those - * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and - * others. - * @type {any} - */ - this.scheduled = undefined; - } - AsyncScheduler.prototype.flush = function (action) { - var actions = this.actions; - if (this.active) { - actions.push(action); - return; - } - var error; - this.active = true; - do { - if (error = action.execute(action.state, action.delay)) { - break; + CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + var values = this.values; + var oldVal = values[outerIndex]; + var toRespond = !this.toRespond + ? 0 + : oldVal === none ? --this.toRespond : this.toRespond; + values[outerIndex] = innerValue; + if (toRespond === 0) { + if (this.project) { + this._tryProject(values); } - } while (action = actions.shift()); // exhaust the scheduler queue - this.active = false; - if (error) { - while (action = actions.shift()) { - action.unsubscribe(); + else { + this.destination.next(values.slice()); } - throw error; } }; - return AsyncScheduler; -}(Scheduler_1.Scheduler)); -exports.AsyncScheduler = AsyncScheduler; - -},{"../Scheduler":33}],150:[function(require,module,exports){ -"use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var AsyncAction_1 = require('./AsyncAction'); -/** - * We need this JSDoc comment for affecting ESDoc. - * @ignore - * @extends {Ignored} - */ -var QueueAction = (function (_super) { - __extends(QueueAction, _super); - function QueueAction(scheduler, work) { - _super.call(this, scheduler, work); - this.scheduler = scheduler; - this.work = work; - } - QueueAction.prototype.schedule = function (state, delay) { - if (delay === void 0) { delay = 0; } - if (delay > 0) { - return _super.prototype.schedule.call(this, state, delay); + CombineLatestSubscriber.prototype._tryProject = function (values) { + var result; + try { + result = this.project.apply(this, values); } - this.delay = delay; - this.state = state; - this.scheduler.flush(this); - return this; - }; - QueueAction.prototype.execute = function (state, delay) { - return (delay > 0 || this.closed) ? - _super.prototype.execute.call(this, state, delay) : - this._execute(state, delay); - }; - QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { delay = 0; } - // If delay exists and is greater than 0, or if the delay is null (the - // action wasn't rescheduled) but was originally scheduled as an async - // action, then recycle as an async action. - if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { - return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); + catch (err) { + this.destination.error(err); + return; } - // Otherwise flush the scheduler starting with this action. - return scheduler.flush(this); + this.destination.next(result); }; - return QueueAction; -}(AsyncAction_1.AsyncAction)); -exports.QueueAction = QueueAction; - -},{"./AsyncAction":148}],151:[function(require,module,exports){ -"use strict"; -var __extends = (this && this.__extends) || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -}; -var AsyncScheduler_1 = require('./AsyncScheduler'); -var QueueScheduler = (function (_super) { - __extends(QueueScheduler, _super); - function QueueScheduler() { - _super.apply(this, arguments); - } - return QueueScheduler; -}(AsyncScheduler_1.AsyncScheduler)); -exports.QueueScheduler = QueueScheduler; + return CombineLatestSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); +exports.CombineLatestSubscriber = CombineLatestSubscriber; -},{"./AsyncScheduler":149}],152:[function(require,module,exports){ +},{"../OuterSubscriber":31,"../observable/ArrayObservable":93,"../util/isArray":226,"../util/subscribeToResult":237}],165:[function(require,module,exports){ "use strict"; -var AsyncAction_1 = require('./AsyncAction'); -var AsyncScheduler_1 = require('./AsyncScheduler'); +var concat_1 = require('../observable/concat'); +/* tslint:enable:max-line-length */ /** + * Creates an output Observable which sequentially emits all values from every + * given input Observable after the current Observable. * - * Async Scheduler - * - * Schedule task as if you used setTimeout(task, duration) - * - * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript - * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating - * in intervals. - * - * If you just want to "defer" task, that is to perform it right after currently - * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`), - * better choice will be the {@link asap} scheduler. + * Concatenates multiple Observables together by + * sequentially emitting their values, one Observable after the other. * - * @example Use async scheduler to delay task - * const task = () => console.log('it works!'); + * * - * Rx.Scheduler.async.schedule(task, 2000); + * Joins this Observable with multiple other Observables by subscribing to them + * one at a time, starting with the source, and merging their results into the + * output Observable. Will wait for each Observable to complete before moving + * on to the next. * - * // After 2 seconds logs: - * // "it works!" + * @example Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10 + * var timer = Rx.Observable.interval(1000).take(4); + * var sequence = Rx.Observable.range(1, 10); + * var result = timer.concat(sequence); + * result.subscribe(x => console.log(x)); * + * // results in: + * // 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10 * - * @example Use async scheduler to repeat task in intervals - * function task(state) { - * console.log(state); - * this.schedule(state + 1, 1000); // `this` references currently executing Action, - * // which we reschedule with new state and delay - * } + * @example Concatenate 3 Observables + * var timer1 = Rx.Observable.interval(1000).take(10); + * var timer2 = Rx.Observable.interval(2000).take(6); + * var timer3 = Rx.Observable.interval(500).take(10); + * var result = timer1.concat(timer2, timer3); + * result.subscribe(x => console.log(x)); * - * Rx.Scheduler.async.schedule(task, 3000, 0); + * // results in the following: + * // (Prints to console sequentially) + * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9 + * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5 + * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9 * - * // Logs: - * // 0 after 3s - * // 1 after 4s - * // 2 after 5s - * // 3 after 6s + * @see {@link concatAll} + * @see {@link concatMap} + * @see {@link concatMapTo} * - * @static true - * @name async - * @owner Scheduler + * @param {ObservableInput} other An input Observable to concatenate after the source + * Observable. More than one input Observables may be given as argument. + * @param {Scheduler} [scheduler=null] An optional IScheduler to schedule each + * Observable subscription on. + * @return {Observable} All values of each passed Observable merged into a + * single Observable, in order, in serial fashion. + * @method concat + * @owner Observable */ -exports.async = new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction); +function concat() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i - 0] = arguments[_i]; + } + return function (source) { return source.lift.call(concat_1.concat.apply(void 0, [source].concat(observables))); }; +} +exports.concat = concat; -},{"./AsyncAction":148,"./AsyncScheduler":149}],153:[function(require,module,exports){ +},{"../observable/concat":105}],166:[function(require,module,exports){ "use strict"; -var QueueAction_1 = require('./QueueAction'); -var QueueScheduler_1 = require('./QueueScheduler'); +var mergeAll_1 = require('./mergeAll'); /** + * Converts a higher-order Observable into a first-order Observable by + * concatenating the inner Observables in order. * - * Queue Scheduler + * Flattens an Observable-of-Observables by putting one + * inner Observable after the other. * - * Put every next task on a queue, instead of executing it immediately + * * - * `queue` scheduler, when used with delay, behaves the same as {@link async} scheduler. + * Joins every Observable emitted by the source (a higher-order Observable), in + * a serial fashion. It subscribes to each inner Observable only after the + * previous inner Observable has completed, and merges all of their values into + * the returned observable. * - * When used without delay, it schedules given task synchronously - executes it right when - * it is scheduled. However when called recursively, that is when inside the scheduled task, - * another task is scheduled with queue scheduler, instead of executing immediately as well, - * that task will be put on a queue and wait for current one to finish. + * __Warning:__ If the source Observable emits Observables quickly and + * endlessly, and the inner Observables it emits generally complete slower than + * the source emits, you can run into memory issues as the incoming Observables + * collect in an unbounded buffer. * - * This means that when you execute task with `queue` scheduler, you are sure it will end - * before any other task scheduled with that scheduler will start. + * Note: `concatAll` is equivalent to `mergeAll` with concurrency parameter set + * to `1`. * - * @examples Schedule recursively first, then do something + * @example For each click event, tick every second from 0 to 3, with no concurrency + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var higherOrder = clicks.map(ev => Rx.Observable.interval(1000).take(4)); + * var firstOrder = higherOrder.concatAll(); + * firstOrder.subscribe(x => console.log(x)); * - * Rx.Scheduler.queue.schedule(() => { - * Rx.Scheduler.queue.schedule(() => console.log('second')); // will not happen now, but will be put on a queue + * // Results in the following: + * // (results are not concurrent) + * // For every click on the "document" it will emit values 0 to 3 spaced + * // on a 1000ms interval + * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 * - * console.log('first'); - * }); + * @see {@link combineAll} + * @see {@link concat} + * @see {@link concatMap} + * @see {@link concatMapTo} + * @see {@link exhaust} + * @see {@link mergeAll} + * @see {@link switch} + * @see {@link zipAll} * - * // Logs: - * // "first" - * // "second" + * @return {Observable} An Observable emitting values from all the inner + * Observables concatenated. + * @method concatAll + * @owner Observable + */ +function concatAll() { + return mergeAll_1.mergeAll(1); +} +exports.concatAll = concatAll; + +},{"./mergeAll":180}],167:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +/** + * Counts the number of emissions on the source and emits that number when the + * source completes. * + * Tells how many values were emitted, when the source + * completes. * - * @example Reschedule itself recursively + * * - * Rx.Scheduler.queue.schedule(function(state) { - * if (state !== 0) { - * console.log('before', state); - * this.schedule(state - 1); // `this` references currently executing Action, - * // which we reschedule with new state - * console.log('after', state); - * } - * }, 0, 3); + * `count` transforms an Observable that emits values into an Observable that + * emits a single value that represents the number of values emitted by the + * source Observable. If the source Observable terminates with an error, `count` + * will pass this error notification along without emitting a value first. If + * the source Observable does not terminate at all, `count` will neither emit + * a value nor terminate. This operator takes an optional `predicate` function + * as argument, in which case the output emission will represent the number of + * source values that matched `true` with the `predicate`. * - * // In scheduler that runs recursively, you would expect: - * // "before", 3 - * // "before", 2 - * // "before", 1 - * // "after", 1 - * // "after", 2 - * // "after", 3 + * @example Counts how many seconds have passed before the first click happened + * var seconds = Rx.Observable.interval(1000); + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var secondsBeforeClick = seconds.takeUntil(clicks); + * var result = secondsBeforeClick.count(); + * result.subscribe(x => console.log(x)); * - * // But with queue it logs: - * // "before", 3 - * // "after", 3 - * // "before", 2 - * // "after", 2 - * // "before", 1 - * // "after", 1 + * @example Counts how many odd numbers are there between 1 and 7 + * var numbers = Rx.Observable.range(1, 7); + * var result = numbers.count(i => i % 2 === 1); + * result.subscribe(x => console.log(x)); * + * // Results in: + * // 4 * - * @static true - * @name queue - * @owner Scheduler + * @see {@link max} + * @see {@link min} + * @see {@link reduce} + * + * @param {function(value: T, i: number, source: Observable): boolean} [predicate] A + * boolean function to select what values are to be counted. It is provided with + * arguments of: + * - `value`: the value from the source Observable. + * - `index`: the (zero-based) "index" of the value from the source Observable. + * - `source`: the source Observable instance itself. + * @return {Observable} An Observable of one number that represents the count as + * described above. + * @method count + * @owner Observable */ -exports.queue = new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction); - -},{"./QueueAction":150,"./QueueScheduler":151}],154:[function(require,module,exports){ -"use strict"; -var root_1 = require('../util/root'); -function symbolIteratorPonyfill(root) { - var Symbol = root.Symbol; - if (typeof Symbol === 'function') { - if (!Symbol.iterator) { - Symbol.iterator = Symbol('iterator polyfill'); - } - return Symbol.iterator; - } - else { - // [for Mozilla Gecko 27-35:](https://mzl.la/2ewE1zC) - var Set_1 = root.Set; - if (Set_1 && typeof new Set_1()['@@iterator'] === 'function') { - return '@@iterator'; - } - var Map_1 = root.Map; - // required for compatability with es6-shim - if (Map_1) { - var keys = Object.getOwnPropertyNames(Map_1.prototype); - for (var i = 0; i < keys.length; ++i) { - var key = keys[i]; - // according to spec, Map.prototype[@@iterator] and Map.orototype.entries must be equal. - if (key !== 'entries' && key !== 'size' && Map_1.prototype[key] === Map_1.prototype['entries']) { - return key; - } - } - } - return '@@iterator'; - } +function count(predicate) { + return function (source) { return source.lift(new CountOperator(predicate, source)); }; } -exports.symbolIteratorPonyfill = symbolIteratorPonyfill; -exports.iterator = symbolIteratorPonyfill(root_1.root); -/** - * @deprecated use iterator instead - */ -exports.$$iterator = exports.iterator; - -},{"../util/root":172}],155:[function(require,module,exports){ -"use strict"; -var root_1 = require('../util/root'); -function getSymbolObservable(context) { - var $$observable; - var Symbol = context.Symbol; - if (typeof Symbol === 'function') { - if (Symbol.observable) { - $$observable = Symbol.observable; - } - else { - $$observable = Symbol('observable'); - Symbol.observable = $$observable; - } - } - else { - $$observable = '@@observable'; +exports.count = count; +var CountOperator = (function () { + function CountOperator(predicate, source) { + this.predicate = predicate; + this.source = source; } - return $$observable; -} -exports.getSymbolObservable = getSymbolObservable; -exports.observable = getSymbolObservable(root_1.root); -/** - * @deprecated use observable instead - */ -exports.$$observable = exports.observable; - -},{"../util/root":172}],156:[function(require,module,exports){ -"use strict"; -var root_1 = require('../util/root'); -var Symbol = root_1.root.Symbol; -exports.rxSubscriber = (typeof Symbol === 'function' && typeof Symbol.for === 'function') ? - Symbol.for('rxSubscriber') : '@@rxSubscriber'; + CountOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source)); + }; + return CountOperator; +}()); /** - * @deprecated use rxSubscriber instead + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} */ -exports.$$rxSubscriber = exports.rxSubscriber; - -},{"../util/root":172}],157:[function(require,module,exports){ -"use strict"; -var root_1 = require('./root'); -var RequestAnimationFrameDefinition = (function () { - function RequestAnimationFrameDefinition(root) { - if (root.requestAnimationFrame) { - this.cancelAnimationFrame = root.cancelAnimationFrame.bind(root); - this.requestAnimationFrame = root.requestAnimationFrame.bind(root); - } - else if (root.mozRequestAnimationFrame) { - this.cancelAnimationFrame = root.mozCancelAnimationFrame.bind(root); - this.requestAnimationFrame = root.mozRequestAnimationFrame.bind(root); +var CountSubscriber = (function (_super) { + __extends(CountSubscriber, _super); + function CountSubscriber(destination, predicate, source) { + _super.call(this, destination); + this.predicate = predicate; + this.source = source; + this.count = 0; + this.index = 0; + } + CountSubscriber.prototype._next = function (value) { + if (this.predicate) { + this._tryPredicate(value); } - else if (root.webkitRequestAnimationFrame) { - this.cancelAnimationFrame = root.webkitCancelAnimationFrame.bind(root); - this.requestAnimationFrame = root.webkitRequestAnimationFrame.bind(root); + else { + this.count++; } - else if (root.msRequestAnimationFrame) { - this.cancelAnimationFrame = root.msCancelAnimationFrame.bind(root); - this.requestAnimationFrame = root.msRequestAnimationFrame.bind(root); + }; + CountSubscriber.prototype._tryPredicate = function (value) { + var result; + try { + result = this.predicate(value, this.index++, this.source); } - else if (root.oRequestAnimationFrame) { - this.cancelAnimationFrame = root.oCancelAnimationFrame.bind(root); - this.requestAnimationFrame = root.oRequestAnimationFrame.bind(root); + catch (err) { + this.destination.error(err); + return; } - else { - this.cancelAnimationFrame = root.clearTimeout.bind(root); - this.requestAnimationFrame = function (cb) { return root.setTimeout(cb, 1000 / 60); }; + if (result) { + this.count++; } - } - return RequestAnimationFrameDefinition; -}()); -exports.RequestAnimationFrameDefinition = RequestAnimationFrameDefinition; -exports.AnimationFrame = new RequestAnimationFrameDefinition(root_1.root); + }; + CountSubscriber.prototype._complete = function () { + this.destination.next(this.count); + this.destination.complete(); + }; + return CountSubscriber; +}(Subscriber_1.Subscriber)); -},{"./root":172}],158:[function(require,module,exports){ +},{"../Subscriber":36}],168:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; +var Subscriber_1 = require('../Subscriber'); +var async_1 = require('../scheduler/async'); /** - * An error thrown when an element was queried at a certain index of an - * Observable, but no such index or position exists in that sequence. + * Emits a value from the source Observable only after a particular time span + * has passed without another source emission. * - * @see {@link elementAt} - * @see {@link take} - * @see {@link takeLast} + * It's like {@link delay}, but passes only the most + * recent value from each burst of emissions. * - * @class ArgumentOutOfRangeError + * + * + * `debounceTime` delays values emitted by the source Observable, but drops + * previous pending delayed emissions if a new value arrives on the source + * Observable. This operator keeps track of the most recent value from the + * source Observable, and emits that only when `dueTime` enough time has passed + * without any other value appearing on the source Observable. If a new value + * appears before `dueTime` silence occurs, the previous value will be dropped + * and will not be emitted on the output Observable. + * + * This is a rate-limiting operator, because it is impossible for more than one + * value to be emitted in any time window of duration `dueTime`, but it is also + * a delay-like operator since output emissions do not occur at the same time as + * they did on the source Observable. Optionally takes a {@link IScheduler} for + * managing timers. + * + * @example Emit the most recent click after a burst of clicks + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var result = clicks.debounceTime(1000); + * result.subscribe(x => console.log(x)); + * + * @see {@link auditTime} + * @see {@link debounce} + * @see {@link delay} + * @see {@link sampleTime} + * @see {@link throttleTime} + * + * @param {number} dueTime The timeout duration in milliseconds (or the time + * unit determined internally by the optional `scheduler`) for the window of + * time required to wait for emission silence before emitting the most recent + * source value. + * @param {Scheduler} [scheduler=async] The {@link IScheduler} to use for + * managing the timers that handle the timeout for each value. + * @return {Observable} An Observable that delays the emissions of the source + * Observable by the specified `dueTime`, and may drop some values if they occur + * too frequently. + * @method debounceTime + * @owner Observable */ -var ArgumentOutOfRangeError = (function (_super) { - __extends(ArgumentOutOfRangeError, _super); - function ArgumentOutOfRangeError() { - var err = _super.call(this, 'argument out of range'); - this.name = err.name = 'ArgumentOutOfRangeError'; - this.stack = err.stack; - this.message = err.message; +function debounceTime(dueTime, scheduler) { + if (scheduler === void 0) { scheduler = async_1.async; } + return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); }; +} +exports.debounceTime = debounceTime; +var DebounceTimeOperator = (function () { + function DebounceTimeOperator(dueTime, scheduler) { + this.dueTime = dueTime; + this.scheduler = scheduler; } - return ArgumentOutOfRangeError; -}(Error)); -exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError; + DebounceTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler)); + }; + return DebounceTimeOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var DebounceTimeSubscriber = (function (_super) { + __extends(DebounceTimeSubscriber, _super); + function DebounceTimeSubscriber(destination, dueTime, scheduler) { + _super.call(this, destination); + this.dueTime = dueTime; + this.scheduler = scheduler; + this.debouncedSubscription = null; + this.lastValue = null; + this.hasValue = false; + } + DebounceTimeSubscriber.prototype._next = function (value) { + this.clearDebounce(); + this.lastValue = value; + this.hasValue = true; + this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this)); + }; + DebounceTimeSubscriber.prototype._complete = function () { + this.debouncedNext(); + this.destination.complete(); + }; + DebounceTimeSubscriber.prototype.debouncedNext = function () { + this.clearDebounce(); + if (this.hasValue) { + this.destination.next(this.lastValue); + this.lastValue = null; + this.hasValue = false; + } + }; + DebounceTimeSubscriber.prototype.clearDebounce = function () { + var debouncedSubscription = this.debouncedSubscription; + if (debouncedSubscription !== null) { + this.remove(debouncedSubscription); + debouncedSubscription.unsubscribe(); + this.debouncedSubscription = null; + } + }; + return DebounceTimeSubscriber; +}(Subscriber_1.Subscriber)); +function dispatchNext(subscriber) { + subscriber.debouncedNext(); +} -},{}],159:[function(require,module,exports){ +},{"../Subscriber":36,"../scheduler/async":212}],169:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; +var Subscriber_1 = require('../Subscriber'); +/* tslint:enable:max-line-length */ /** - * An error thrown when an Observable or a sequence was queried but has no - * elements. + * Emits a given value if the source Observable completes without emitting any + * `next` value, otherwise mirrors the source Observable. * - * @see {@link first} + * If the source Observable turns out to be empty, then + * this operator will emit a default value. + * + * + * + * `defaultIfEmpty` emits the values emitted by the source Observable or a + * specified default value if the source Observable is empty (completes without + * having emitted any `next` value). + * + * @example If no clicks happen in 5 seconds, then emit "no clicks" + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var clicksBeforeFive = clicks.takeUntil(Rx.Observable.interval(5000)); + * var result = clicksBeforeFive.defaultIfEmpty('no clicks'); + * result.subscribe(x => console.log(x)); + * + * @see {@link empty} * @see {@link last} - * @see {@link single} * - * @class EmptyError + * @param {any} [defaultValue=null] The default value used if the source + * Observable is empty. + * @return {Observable} An Observable that emits either the specified + * `defaultValue` if the source Observable emits no items, or the values emitted + * by the source Observable. + * @method defaultIfEmpty + * @owner Observable */ -var EmptyError = (function (_super) { - __extends(EmptyError, _super); - function EmptyError() { - var err = _super.call(this, 'no elements in sequence'); - this.name = err.name = 'EmptyError'; - this.stack = err.stack; - this.message = err.message; +function defaultIfEmpty(defaultValue) { + if (defaultValue === void 0) { defaultValue = null; } + return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); }; +} +exports.defaultIfEmpty = defaultIfEmpty; +var DefaultIfEmptyOperator = (function () { + function DefaultIfEmptyOperator(defaultValue) { + this.defaultValue = defaultValue; } - return EmptyError; -}(Error)); -exports.EmptyError = EmptyError; + DefaultIfEmptyOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue)); + }; + return DefaultIfEmptyOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var DefaultIfEmptySubscriber = (function (_super) { + __extends(DefaultIfEmptySubscriber, _super); + function DefaultIfEmptySubscriber(destination, defaultValue) { + _super.call(this, destination); + this.defaultValue = defaultValue; + this.isEmpty = true; + } + DefaultIfEmptySubscriber.prototype._next = function (value) { + this.isEmpty = false; + this.destination.next(value); + }; + DefaultIfEmptySubscriber.prototype._complete = function () { + if (this.isEmpty) { + this.destination.next(this.defaultValue); + } + this.destination.complete(); + }; + return DefaultIfEmptySubscriber; +}(Subscriber_1.Subscriber)); -},{}],160:[function(require,module,exports){ +},{"../Subscriber":36}],170:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; +var async_1 = require('../scheduler/async'); +var isDate_1 = require('../util/isDate'); +var Subscriber_1 = require('../Subscriber'); +var Notification_1 = require('../Notification'); /** - * An error thrown when an action is invalid because the object has been - * unsubscribed. + * Delays the emission of items from the source Observable by a given timeout or + * until a given Date. * - * @see {@link Subject} - * @see {@link BehaviorSubject} + * Time shifts each item by some specified amount of + * milliseconds. * - * @class ObjectUnsubscribedError + * + * + * If the delay argument is a Number, this operator time shifts the source + * Observable by that amount of time expressed in milliseconds. The relative + * time intervals between the values are preserved. + * + * If the delay argument is a Date, this operator time shifts the start of the + * Observable execution until the given date occurs. + * + * @example Delay each click by one second + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var delayedClicks = clicks.delay(1000); // each click emitted after 1 second + * delayedClicks.subscribe(x => console.log(x)); + * + * @example Delay all clicks until a future date happens + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var date = new Date('March 15, 2050 12:00:00'); // in the future + * var delayedClicks = clicks.delay(date); // click emitted only after that date + * delayedClicks.subscribe(x => console.log(x)); + * + * @see {@link debounceTime} + * @see {@link delayWhen} + * + * @param {number|Date} delay The delay duration in milliseconds (a `number`) or + * a `Date` until which the emission of the source items is delayed. + * @param {Scheduler} [scheduler=async] The IScheduler to use for + * managing the timers that handle the time-shift for each item. + * @return {Observable} An Observable that delays the emissions of the source + * Observable by the specified timeout or Date. + * @method delay + * @owner Observable */ -var ObjectUnsubscribedError = (function (_super) { - __extends(ObjectUnsubscribedError, _super); - function ObjectUnsubscribedError() { - var err = _super.call(this, 'object unsubscribed'); - this.name = err.name = 'ObjectUnsubscribedError'; - this.stack = err.stack; - this.message = err.message; +function delay(delay, scheduler) { + if (scheduler === void 0) { scheduler = async_1.async; } + var absoluteDelay = isDate_1.isDate(delay); + var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay); + return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); }; +} +exports.delay = delay; +var DelayOperator = (function () { + function DelayOperator(delay, scheduler) { + this.delay = delay; + this.scheduler = scheduler; } - return ObjectUnsubscribedError; -}(Error)); -exports.ObjectUnsubscribedError = ObjectUnsubscribedError; - -},{}],161:[function(require,module,exports){ -"use strict"; -var root_1 = require('./root'); -function minimalSetImpl() { - // THIS IS NOT a full impl of Set, this is just the minimum - // bits of functionality we need for this library. - return (function () { - function MinimalSet() { - this._values = []; + DelayOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler)); + }; + return DelayOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var DelaySubscriber = (function (_super) { + __extends(DelaySubscriber, _super); + function DelaySubscriber(destination, delay, scheduler) { + _super.call(this, destination); + this.delay = delay; + this.scheduler = scheduler; + this.queue = []; + this.active = false; + this.errored = false; + } + DelaySubscriber.dispatch = function (state) { + var source = state.source; + var queue = source.queue; + var scheduler = state.scheduler; + var destination = state.destination; + while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) { + queue.shift().notification.observe(destination); } - MinimalSet.prototype.add = function (value) { - if (!this.has(value)) { - this._values.push(value); - } - }; - MinimalSet.prototype.has = function (value) { - return this._values.indexOf(value) !== -1; - }; - Object.defineProperty(MinimalSet.prototype, "size", { - get: function () { - return this._values.length; - }, - enumerable: true, - configurable: true - }); - MinimalSet.prototype.clear = function () { - this._values.length = 0; - }; - return MinimalSet; - }()); -} -exports.minimalSetImpl = minimalSetImpl; -exports.Set = root_1.root.Set || minimalSetImpl(); + if (queue.length > 0) { + var delay_1 = Math.max(0, queue[0].time - scheduler.now()); + this.schedule(state, delay_1); + } + else { + source.active = false; + } + }; + DelaySubscriber.prototype._schedule = function (scheduler) { + this.active = true; + this.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, { + source: this, destination: this.destination, scheduler: scheduler + })); + }; + DelaySubscriber.prototype.scheduleNotification = function (notification) { + if (this.errored === true) { + return; + } + var scheduler = this.scheduler; + var message = new DelayMessage(scheduler.now() + this.delay, notification); + this.queue.push(message); + if (this.active === false) { + this._schedule(scheduler); + } + }; + DelaySubscriber.prototype._next = function (value) { + this.scheduleNotification(Notification_1.Notification.createNext(value)); + }; + DelaySubscriber.prototype._error = function (err) { + this.errored = true; + this.queue = []; + this.destination.error(err); + }; + DelaySubscriber.prototype._complete = function () { + this.scheduleNotification(Notification_1.Notification.createComplete()); + }; + return DelaySubscriber; +}(Subscriber_1.Subscriber)); +var DelayMessage = (function () { + function DelayMessage(time, notification) { + this.time = time; + this.notification = notification; + } + return DelayMessage; +}()); -},{"./root":172}],162:[function(require,module,exports){ +},{"../Notification":28,"../Subscriber":36,"../scheduler/async":212,"../util/isDate":228}],171:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; +var OuterSubscriber_1 = require('../OuterSubscriber'); +var subscribeToResult_1 = require('../util/subscribeToResult'); +var Set_1 = require('../util/Set'); /** - * An error thrown when one or more errors have occurred during the - * `unsubscribe` of a {@link Subscription}. + * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from previous items. + * + * If a keySelector function is provided, then it will project each value from the source observable into a new value that it will + * check for equality with previously projected values. If a keySelector function is not provided, it will use each value from the + * source observable directly with an equality check against previous values. + * + * In JavaScript runtimes that support `Set`, this operator will use a `Set` to improve performance of the distinct value checking. + * + * In other runtimes, this operator will use a minimal implementation of `Set` that relies on an `Array` and `indexOf` under the + * hood, so performance will degrade as more values are checked for distinction. Even in newer browsers, a long-running `distinct` + * use might result in memory leaks. To help alleviate this in some scenarios, an optional `flushes` parameter is also provided so + * that the internal `Set` can be "flushed", basically clearing it of values. + * + * @example A simple example with numbers + * Observable.of(1, 1, 2, 2, 2, 1, 2, 3, 4, 3, 2, 1) + * .distinct() + * .subscribe(x => console.log(x)); // 1, 2, 3, 4 + * + * @example An example using a keySelector function + * interface Person { + * age: number, + * name: string + * } + * + * Observable.of( + * { age: 4, name: 'Foo'}, + * { age: 7, name: 'Bar'}, + * { age: 5, name: 'Foo'}) + * .distinct((p: Person) => p.name) + * .subscribe(x => console.log(x)); + * + * // displays: + * // { age: 4, name: 'Foo' } + * // { age: 7, name: 'Bar' } + * + * @see {@link distinctUntilChanged} + * @see {@link distinctUntilKeyChanged} + * + * @param {function} [keySelector] Optional function to select which value you want to check as distinct. + * @param {Observable} [flushes] Optional Observable for flushing the internal HashSet of the operator. + * @return {Observable} An Observable that emits items from the source Observable with distinct values. + * @method distinct + * @owner Observable */ -var UnsubscriptionError = (function (_super) { - __extends(UnsubscriptionError, _super); - function UnsubscriptionError(errors) { - _super.call(this); - this.errors = errors; - var err = Error.call(this, errors ? - errors.length + " errors occurred during unsubscription:\n " + errors.map(function (err, i) { return ((i + 1) + ") " + err.toString()); }).join('\n ') : ''); - this.name = err.name = 'UnsubscriptionError'; - this.stack = err.stack; - this.message = err.message; +function distinct(keySelector, flushes) { + return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); }; +} +exports.distinct = distinct; +var DistinctOperator = (function () { + function DistinctOperator(keySelector, flushes) { + this.keySelector = keySelector; + this.flushes = flushes; + } + DistinctOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes)); + }; + return DistinctOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var DistinctSubscriber = (function (_super) { + __extends(DistinctSubscriber, _super); + function DistinctSubscriber(destination, keySelector, flushes) { + _super.call(this, destination); + this.keySelector = keySelector; + this.values = new Set_1.Set(); + if (flushes) { + this.add(subscribeToResult_1.subscribeToResult(this, flushes)); + } + } + DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.values.clear(); + }; + DistinctSubscriber.prototype.notifyError = function (error, innerSub) { + this._error(error); + }; + DistinctSubscriber.prototype._next = function (value) { + if (this.keySelector) { + this._useKeySelector(value); + } + else { + this._finalizeNext(value, value); + } + }; + DistinctSubscriber.prototype._useKeySelector = function (value) { + var key; + var destination = this.destination; + try { + key = this.keySelector(value); + } + catch (err) { + destination.error(err); + return; + } + this._finalizeNext(key, value); + }; + DistinctSubscriber.prototype._finalizeNext = function (key, value) { + var values = this.values; + if (!values.has(key)) { + values.add(key); + this.destination.next(value); + } + }; + return DistinctSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); +exports.DistinctSubscriber = DistinctSubscriber; + +},{"../OuterSubscriber":31,"../util/Set":221,"../util/subscribeToResult":237}],172:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +var tryCatch_1 = require('../util/tryCatch'); +var errorObject_1 = require('../util/errorObject'); +/* tslint:enable:max-line-length */ +/** + * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from the previous item. + * + * If a comparator function is provided, then it will be called for each item to test for whether or not that value should be emitted. + * + * If a comparator function is not provided, an equality check is used by default. + * + * @example A simple example with numbers + * Observable.of(1, 1, 2, 2, 2, 1, 1, 2, 3, 3, 4) + * .distinctUntilChanged() + * .subscribe(x => console.log(x)); // 1, 2, 1, 2, 3, 4 + * + * @example An example using a compare function + * interface Person { + * age: number, + * name: string + * } + * + * Observable.of( + * { age: 4, name: 'Foo'}, + * { age: 7, name: 'Bar'}, + * { age: 5, name: 'Foo'}) + * { age: 6, name: 'Foo'}) + * .distinctUntilChanged((p: Person, q: Person) => p.name === q.name) + * .subscribe(x => console.log(x)); + * + * // displays: + * // { age: 4, name: 'Foo' } + * // { age: 7, name: 'Bar' } + * // { age: 5, name: 'Foo' } + * + * @see {@link distinct} + * @see {@link distinctUntilKeyChanged} + * + * @param {function} [compare] Optional comparison function called to test if an item is distinct from the previous item in the source. + * @return {Observable} An Observable that emits items from the source Observable with distinct values. + * @method distinctUntilChanged + * @owner Observable + */ +function distinctUntilChanged(compare, keySelector) { + return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); }; +} +exports.distinctUntilChanged = distinctUntilChanged; +var DistinctUntilChangedOperator = (function () { + function DistinctUntilChangedOperator(compare, keySelector) { + this.compare = compare; + this.keySelector = keySelector; + } + DistinctUntilChangedOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector)); + }; + return DistinctUntilChangedOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var DistinctUntilChangedSubscriber = (function (_super) { + __extends(DistinctUntilChangedSubscriber, _super); + function DistinctUntilChangedSubscriber(destination, compare, keySelector) { + _super.call(this, destination); + this.keySelector = keySelector; + this.hasKey = false; + if (typeof compare === 'function') { + this.compare = compare; + } + } + DistinctUntilChangedSubscriber.prototype.compare = function (x, y) { + return x === y; + }; + DistinctUntilChangedSubscriber.prototype._next = function (value) { + var keySelector = this.keySelector; + var key = value; + if (keySelector) { + key = tryCatch_1.tryCatch(this.keySelector)(value); + if (key === errorObject_1.errorObject) { + return this.destination.error(errorObject_1.errorObject.e); + } + } + var result = false; + if (this.hasKey) { + result = tryCatch_1.tryCatch(this.compare)(this.key, key); + if (result === errorObject_1.errorObject) { + return this.destination.error(errorObject_1.errorObject.e); + } + } + else { + this.hasKey = true; + } + if (Boolean(result) === false) { + this.key = key; + this.destination.next(value); + } + }; + return DistinctUntilChangedSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36,"../util/errorObject":224,"../util/tryCatch":239}],173:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var tryCatch_1 = require('../util/tryCatch'); +var errorObject_1 = require('../util/errorObject'); +var OuterSubscriber_1 = require('../OuterSubscriber'); +var subscribeToResult_1 = require('../util/subscribeToResult'); +/* tslint:enable:max-line-length */ +/** + * Recursively projects each source value to an Observable which is merged in + * the output Observable. + * + * It's similar to {@link mergeMap}, but applies the + * projection function to every source value as well as every output value. + * It's recursive. + * + * + * + * Returns an Observable that emits items based on applying a function that you + * supply to each item emitted by the source Observable, where that function + * returns an Observable, and then merging those resulting Observables and + * emitting the results of this merger. *Expand* will re-emit on the output + * Observable every source value. Then, each output value is given to the + * `project` function which returns an inner Observable to be merged on the + * output Observable. Those output values resulting from the projection are also + * given to the `project` function to produce new output values. This is how + * *expand* behaves recursively. + * + * @example Start emitting the powers of two on every click, at most 10 of them + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var powersOfTwo = clicks + * .mapTo(1) + * .expand(x => Rx.Observable.of(2 * x).delay(1000)) + * .take(10); + * powersOfTwo.subscribe(x => console.log(x)); + * + * @see {@link mergeMap} + * @see {@link mergeScan} + * + * @param {function(value: T, index: number) => Observable} project A function + * that, when applied to an item emitted by the source or the output Observable, + * returns an Observable. + * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input + * Observables being subscribed to concurrently. + * @param {Scheduler} [scheduler=null] The IScheduler to use for subscribing to + * each projected inner Observable. + * @return {Observable} An Observable that emits the source values and also + * result of applying the projection function to each value emitted on the + * output Observable and and merging the results of the Observables obtained + * from this transformation. + * @method expand + * @owner Observable + */ +function expand(project, concurrent, scheduler) { + if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; } + if (scheduler === void 0) { scheduler = undefined; } + concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent; + return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); }; +} +exports.expand = expand; +var ExpandOperator = (function () { + function ExpandOperator(project, concurrent, scheduler) { + this.project = project; + this.concurrent = concurrent; + this.scheduler = scheduler; + } + ExpandOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler)); + }; + return ExpandOperator; +}()); +exports.ExpandOperator = ExpandOperator; +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var ExpandSubscriber = (function (_super) { + __extends(ExpandSubscriber, _super); + function ExpandSubscriber(destination, project, concurrent, scheduler) { + _super.call(this, destination); + this.project = project; + this.concurrent = concurrent; + this.scheduler = scheduler; + this.index = 0; + this.active = 0; + this.hasCompleted = false; + if (concurrent < Number.POSITIVE_INFINITY) { + this.buffer = []; + } + } + ExpandSubscriber.dispatch = function (arg) { + var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index; + subscriber.subscribeToProjection(result, value, index); + }; + ExpandSubscriber.prototype._next = function (value) { + var destination = this.destination; + if (destination.closed) { + this._complete(); + return; + } + var index = this.index++; + if (this.active < this.concurrent) { + destination.next(value); + var result = tryCatch_1.tryCatch(this.project)(value, index); + if (result === errorObject_1.errorObject) { + destination.error(errorObject_1.errorObject.e); + } + else if (!this.scheduler) { + this.subscribeToProjection(result, value, index); + } + else { + var state = { subscriber: this, result: result, value: value, index: index }; + this.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state)); + } + } + else { + this.buffer.push(value); + } + }; + ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) { + this.active++; + this.add(subscribeToResult_1.subscribeToResult(this, result, value, index)); + }; + ExpandSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (this.hasCompleted && this.active === 0) { + this.destination.complete(); + } + }; + ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this._next(innerValue); + }; + ExpandSubscriber.prototype.notifyComplete = function (innerSub) { + var buffer = this.buffer; + this.remove(innerSub); + this.active--; + if (buffer && buffer.length > 0) { + this._next(buffer.shift()); + } + if (this.hasCompleted && this.active === 0) { + this.destination.complete(); + } + }; + return ExpandSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); +exports.ExpandSubscriber = ExpandSubscriber; + +},{"../OuterSubscriber":31,"../util/errorObject":224,"../util/subscribeToResult":237,"../util/tryCatch":239}],174:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +/* tslint:enable:max-line-length */ +/** + * Filter items emitted by the source Observable by only emitting those that + * satisfy a specified predicate. + * + * Like + * [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter), + * it only emits a value from the source if it passes a criterion function. + * + * + * + * Similar to the well-known `Array.prototype.filter` method, this operator + * takes values from the source Observable, passes them through a `predicate` + * function and only emits those values that yielded `true`. + * + * @example Emit only click events whose target was a DIV element + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var clicksOnDivs = clicks.filter(ev => ev.target.tagName === 'DIV'); + * clicksOnDivs.subscribe(x => console.log(x)); + * + * @see {@link distinct} + * @see {@link distinctUntilChanged} + * @see {@link distinctUntilKeyChanged} + * @see {@link ignoreElements} + * @see {@link partition} + * @see {@link skip} + * + * @param {function(value: T, index: number): boolean} predicate A function that + * evaluates each value emitted by the source Observable. If it returns `true`, + * the value is emitted, if `false` the value is not passed to the output + * Observable. The `index` parameter is the number `i` for the i-th source + * emission that has happened since the subscription, starting from the number + * `0`. + * @param {any} [thisArg] An optional argument to determine the value of `this` + * in the `predicate` function. + * @return {Observable} An Observable of values from the source that were + * allowed by the `predicate` function. + * @method filter + * @owner Observable + */ +function filter(predicate, thisArg) { + return function filterOperatorFunction(source) { + return source.lift(new FilterOperator(predicate, thisArg)); + }; +} +exports.filter = filter; +var FilterOperator = (function () { + function FilterOperator(predicate, thisArg) { + this.predicate = predicate; + this.thisArg = thisArg; + } + FilterOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg)); + }; + return FilterOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var FilterSubscriber = (function (_super) { + __extends(FilterSubscriber, _super); + function FilterSubscriber(destination, predicate, thisArg) { + _super.call(this, destination); + this.predicate = predicate; + this.thisArg = thisArg; + this.count = 0; + } + // the try catch block below is left specifically for + // optimization and perf reasons. a tryCatcher is not necessary here. + FilterSubscriber.prototype._next = function (value) { + var result; + try { + result = this.predicate.call(this.thisArg, value, this.count++); + } + catch (err) { + this.destination.error(err); + return; + } + if (result) { + this.destination.next(value); + } + }; + return FilterSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36}],175:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +var Subscription_1 = require('../Subscription'); +/** + * Returns an Observable that mirrors the source Observable, but will call a specified function when + * the source terminates on complete or error. + * @param {function} callback Function to be called when source terminates. + * @return {Observable} An Observable that mirrors the source, but will call the specified function on termination. + * @method finally + * @owner Observable + */ +function finalize(callback) { + return function (source) { return source.lift(new FinallyOperator(callback)); }; +} +exports.finalize = finalize; +var FinallyOperator = (function () { + function FinallyOperator(callback) { + this.callback = callback; + } + FinallyOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new FinallySubscriber(subscriber, this.callback)); + }; + return FinallyOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var FinallySubscriber = (function (_super) { + __extends(FinallySubscriber, _super); + function FinallySubscriber(destination, callback) { + _super.call(this, destination); + this.add(new Subscription_1.Subscription(callback)); + } + return FinallySubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36,"../Subscription":37}],176:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +var EmptyError_1 = require('../util/EmptyError'); +/** + * Emits only the first value (or the first value that meets some condition) + * emitted by the source Observable. + * + * Emits only the first value. Or emits only the first + * value that passes some test. + * + * + * + * If called with no arguments, `first` emits the first value of the source + * Observable, then completes. If called with a `predicate` function, `first` + * emits the first value of the source that matches the specified condition. It + * may also take a `resultSelector` function to produce the output value from + * the input value, and a `defaultValue` to emit in case the source completes + * before it is able to emit a valid value. Throws an error if `defaultValue` + * was not provided and a matching element is not found. + * + * @example Emit only the first click that happens on the DOM + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var result = clicks.first(); + * result.subscribe(x => console.log(x)); + * + * @example Emits the first click that happens on a DIV + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var result = clicks.first(ev => ev.target.tagName === 'DIV'); + * result.subscribe(x => console.log(x)); + * + * @see {@link filter} + * @see {@link find} + * @see {@link take} + * + * @throws {EmptyError} Delivers an EmptyError to the Observer's `error` + * callback if the Observable completes before any `next` notification was sent. + * + * @param {function(value: T, index: number, source: Observable): boolean} [predicate] + * An optional function called with each item to test for condition matching. + * @param {function(value: T, index: number): R} [resultSelector] A function to + * produce the value on the output Observable based on the values + * and the indices of the source Observable. The arguments passed to this + * function are: + * - `value`: the value that was emitted on the source. + * - `index`: the "index" of the value from the source. + * @param {R} [defaultValue] The default value emitted in case no valid value + * was found on the source. + * @return {Observable} An Observable of the first item that matches the + * condition. + * @method first + * @owner Observable + */ +function first(predicate, resultSelector, defaultValue) { + return function (source) { return source.lift(new FirstOperator(predicate, resultSelector, defaultValue, source)); }; +} +exports.first = first; +var FirstOperator = (function () { + function FirstOperator(predicate, resultSelector, defaultValue, source) { + this.predicate = predicate; + this.resultSelector = resultSelector; + this.defaultValue = defaultValue; + this.source = source; + } + FirstOperator.prototype.call = function (observer, source) { + return source.subscribe(new FirstSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source)); + }; + return FirstOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var FirstSubscriber = (function (_super) { + __extends(FirstSubscriber, _super); + function FirstSubscriber(destination, predicate, resultSelector, defaultValue, source) { + _super.call(this, destination); + this.predicate = predicate; + this.resultSelector = resultSelector; + this.defaultValue = defaultValue; + this.source = source; + this.index = 0; + this.hasCompleted = false; + this._emitted = false; + } + FirstSubscriber.prototype._next = function (value) { + var index = this.index++; + if (this.predicate) { + this._tryPredicate(value, index); + } + else { + this._emit(value, index); + } + }; + FirstSubscriber.prototype._tryPredicate = function (value, index) { + var result; + try { + result = this.predicate(value, index, this.source); + } + catch (err) { + this.destination.error(err); + return; + } + if (result) { + this._emit(value, index); + } + }; + FirstSubscriber.prototype._emit = function (value, index) { + if (this.resultSelector) { + this._tryResultSelector(value, index); + return; + } + this._emitFinal(value); + }; + FirstSubscriber.prototype._tryResultSelector = function (value, index) { + var result; + try { + result = this.resultSelector(value, index); + } + catch (err) { + this.destination.error(err); + return; + } + this._emitFinal(result); + }; + FirstSubscriber.prototype._emitFinal = function (value) { + var destination = this.destination; + if (!this._emitted) { + this._emitted = true; + destination.next(value); + destination.complete(); + this.hasCompleted = true; + } + }; + FirstSubscriber.prototype._complete = function () { + var destination = this.destination; + if (!this.hasCompleted && typeof this.defaultValue !== 'undefined') { + destination.next(this.defaultValue); + destination.complete(); + } + else if (!this.hasCompleted) { + destination.error(new EmptyError_1.EmptyError); + } + }; + return FirstSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36,"../util/EmptyError":219}],177:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +var EmptyError_1 = require('../util/EmptyError'); +/* tslint:enable:max-line-length */ +/** + * Returns an Observable that emits only the last item emitted by the source Observable. + * It optionally takes a predicate function as a parameter, in which case, rather than emitting + * the last item from the source Observable, the resulting Observable will emit the last item + * from the source Observable that satisfies the predicate. + * + * + * + * @throws {EmptyError} Delivers an EmptyError to the Observer's `error` + * callback if the Observable completes before any `next` notification was sent. + * @param {function} predicate - The condition any source emitted item has to satisfy. + * @return {Observable} An Observable that emits only the last item satisfying the given condition + * from the source, or an NoSuchElementException if no such items are emitted. + * @throws - Throws if no items that match the predicate are emitted by the source Observable. + * @method last + * @owner Observable + */ +function last(predicate, resultSelector, defaultValue) { + return function (source) { return source.lift(new LastOperator(predicate, resultSelector, defaultValue, source)); }; +} +exports.last = last; +var LastOperator = (function () { + function LastOperator(predicate, resultSelector, defaultValue, source) { + this.predicate = predicate; + this.resultSelector = resultSelector; + this.defaultValue = defaultValue; + this.source = source; + } + LastOperator.prototype.call = function (observer, source) { + return source.subscribe(new LastSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source)); + }; + return LastOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var LastSubscriber = (function (_super) { + __extends(LastSubscriber, _super); + function LastSubscriber(destination, predicate, resultSelector, defaultValue, source) { + _super.call(this, destination); + this.predicate = predicate; + this.resultSelector = resultSelector; + this.defaultValue = defaultValue; + this.source = source; + this.hasValue = false; + this.index = 0; + if (typeof defaultValue !== 'undefined') { + this.lastValue = defaultValue; + this.hasValue = true; + } + } + LastSubscriber.prototype._next = function (value) { + var index = this.index++; + if (this.predicate) { + this._tryPredicate(value, index); + } + else { + if (this.resultSelector) { + this._tryResultSelector(value, index); + return; + } + this.lastValue = value; + this.hasValue = true; + } + }; + LastSubscriber.prototype._tryPredicate = function (value, index) { + var result; + try { + result = this.predicate(value, index, this.source); + } + catch (err) { + this.destination.error(err); + return; + } + if (result) { + if (this.resultSelector) { + this._tryResultSelector(value, index); + return; + } + this.lastValue = value; + this.hasValue = true; + } + }; + LastSubscriber.prototype._tryResultSelector = function (value, index) { + var result; + try { + result = this.resultSelector(value, index); + } + catch (err) { + this.destination.error(err); + return; + } + this.lastValue = result; + this.hasValue = true; + }; + LastSubscriber.prototype._complete = function () { + var destination = this.destination; + if (this.hasValue) { + destination.next(this.lastValue); + destination.complete(); + } + else { + destination.error(new EmptyError_1.EmptyError); + } + }; + return LastSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36,"../util/EmptyError":219}],178:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +/** + * Applies a given `project` function to each value emitted by the source + * Observable, and emits the resulting values as an Observable. + * + * Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map), + * it passes each source value through a transformation function to get + * corresponding output values. + * + * + * + * Similar to the well known `Array.prototype.map` function, this operator + * applies a projection to each value and emits that projection in the output + * Observable. + * + * @example Map every click to the clientX position of that click + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var positions = clicks.map(ev => ev.clientX); + * positions.subscribe(x => console.log(x)); + * + * @see {@link mapTo} + * @see {@link pluck} + * + * @param {function(value: T, index: number): R} project The function to apply + * to each `value` emitted by the source Observable. The `index` parameter is + * the number `i` for the i-th emission that has happened since the + * subscription, starting from the number `0`. + * @param {any} [thisArg] An optional argument to define what `this` is in the + * `project` function. + * @return {Observable} An Observable that emits the values from the source + * Observable transformed by the given `project` function. + * @method map + * @owner Observable + */ +function map(project, thisArg) { + return function mapOperation(source) { + if (typeof project !== 'function') { + throw new TypeError('argument is not a function. Are you looking for `mapTo()`?'); + } + return source.lift(new MapOperator(project, thisArg)); + }; +} +exports.map = map; +var MapOperator = (function () { + function MapOperator(project, thisArg) { + this.project = project; + this.thisArg = thisArg; + } + MapOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg)); + }; + return MapOperator; +}()); +exports.MapOperator = MapOperator; +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var MapSubscriber = (function (_super) { + __extends(MapSubscriber, _super); + function MapSubscriber(destination, project, thisArg) { + _super.call(this, destination); + this.project = project; + this.count = 0; + this.thisArg = thisArg || this; + } + // NOTE: This looks unoptimized, but it's actually purposefully NOT + // using try/catch optimizations. + MapSubscriber.prototype._next = function (value) { + var result; + try { + result = this.project.call(this.thisArg, value, this.count++); + } + catch (err) { + this.destination.error(err); + return; + } + this.destination.next(result); + }; + return MapSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36}],179:[function(require,module,exports){ +"use strict"; +var Observable_1 = require('../Observable'); +var ArrayObservable_1 = require('../observable/ArrayObservable'); +var mergeAll_1 = require('./mergeAll'); +var isScheduler_1 = require('../util/isScheduler'); +/* tslint:enable:max-line-length */ +function merge() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i - 0] = arguments[_i]; + } + return function (source) { return source.lift.call(mergeStatic.apply(void 0, [source].concat(observables))); }; +} +exports.merge = merge; +/* tslint:enable:max-line-length */ +/** + * Creates an output Observable which concurrently emits all values from every + * given input Observable. + * + * Flattens multiple Observables together by blending + * their values into one Observable. + * + * + * + * `merge` subscribes to each given input Observable (as arguments), and simply + * forwards (without doing any transformation) all the values from all the input + * Observables to the output Observable. The output Observable only completes + * once all input Observables have completed. Any error delivered by an input + * Observable will be immediately emitted on the output Observable. + * + * @example Merge together two Observables: 1s interval and clicks + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var timer = Rx.Observable.interval(1000); + * var clicksOrTimer = Rx.Observable.merge(clicks, timer); + * clicksOrTimer.subscribe(x => console.log(x)); + * + * // Results in the following: + * // timer will emit ascending values, one every second(1000ms) to console + * // clicks logs MouseEvents to console everytime the "document" is clicked + * // Since the two streams are merged you see these happening + * // as they occur. + * + * @example Merge together 3 Observables, but only 2 run concurrently + * var timer1 = Rx.Observable.interval(1000).take(10); + * var timer2 = Rx.Observable.interval(2000).take(6); + * var timer3 = Rx.Observable.interval(500).take(10); + * var concurrent = 2; // the argument + * var merged = Rx.Observable.merge(timer1, timer2, timer3, concurrent); + * merged.subscribe(x => console.log(x)); + * + * // Results in the following: + * // - First timer1 and timer2 will run concurrently + * // - timer1 will emit a value every 1000ms for 10 iterations + * // - timer2 will emit a value every 2000ms for 6 iterations + * // - after timer1 hits it's max iteration, timer2 will + * // continue, and timer3 will start to run concurrently with timer2 + * // - when timer2 hits it's max iteration it terminates, and + * // timer3 will continue to emit a value every 500ms until it is complete + * + * @see {@link mergeAll} + * @see {@link mergeMap} + * @see {@link mergeMapTo} + * @see {@link mergeScan} + * + * @param {...ObservableInput} observables Input Observables to merge together. + * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input + * Observables being subscribed to concurrently. + * @param {Scheduler} [scheduler=null] The IScheduler to use for managing + * concurrency of input Observables. + * @return {Observable} an Observable that emits items that are the result of + * every input Observable. + * @static true + * @name merge + * @owner Observable + */ +function mergeStatic() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i - 0] = arguments[_i]; + } + var concurrent = Number.POSITIVE_INFINITY; + var scheduler = null; + var last = observables[observables.length - 1]; + if (isScheduler_1.isScheduler(last)) { + scheduler = observables.pop(); + if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') { + concurrent = observables.pop(); + } + } + else if (typeof last === 'number') { + concurrent = observables.pop(); + } + if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) { + return observables[0]; + } + return mergeAll_1.mergeAll(concurrent)(new ArrayObservable_1.ArrayObservable(observables, scheduler)); +} +exports.mergeStatic = mergeStatic; + +},{"../Observable":29,"../observable/ArrayObservable":93,"../util/isScheduler":233,"./mergeAll":180}],180:[function(require,module,exports){ +"use strict"; +var mergeMap_1 = require('./mergeMap'); +var identity_1 = require('../util/identity'); +/** + * Converts a higher-order Observable into a first-order Observable which + * concurrently delivers all values that are emitted on the inner Observables. + * + * Flattens an Observable-of-Observables. + * + * + * + * `mergeAll` subscribes to an Observable that emits Observables, also known as + * a higher-order Observable. Each time it observes one of these emitted inner + * Observables, it subscribes to that and delivers all the values from the + * inner Observable on the output Observable. The output Observable only + * completes once all inner Observables have completed. Any error delivered by + * a inner Observable will be immediately emitted on the output Observable. + * + * @example Spawn a new interval Observable for each click event, and blend their outputs as one Observable + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000)); + * var firstOrder = higherOrder.mergeAll(); + * firstOrder.subscribe(x => console.log(x)); + * + * @example Count from 0 to 9 every second for each click, but only allow 2 concurrent timers + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000).take(10)); + * var firstOrder = higherOrder.mergeAll(2); + * firstOrder.subscribe(x => console.log(x)); + * + * @see {@link combineAll} + * @see {@link concatAll} + * @see {@link exhaust} + * @see {@link merge} + * @see {@link mergeMap} + * @see {@link mergeMapTo} + * @see {@link mergeScan} + * @see {@link switch} + * @see {@link zipAll} + * + * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of inner + * Observables being subscribed to concurrently. + * @return {Observable} An Observable that emits values coming from all the + * inner Observables emitted by the source Observable. + * @method mergeAll + * @owner Observable + */ +function mergeAll(concurrent) { + if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; } + return mergeMap_1.mergeMap(identity_1.identity, null, concurrent); +} +exports.mergeAll = mergeAll; + +},{"../util/identity":225,"./mergeMap":181}],181:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var subscribeToResult_1 = require('../util/subscribeToResult'); +var OuterSubscriber_1 = require('../OuterSubscriber'); +/* tslint:enable:max-line-length */ +/** + * Projects each source value to an Observable which is merged in the output + * Observable. + * + * Maps each value to an Observable, then flattens all of + * these inner Observables using {@link mergeAll}. + * + * + * + * Returns an Observable that emits items based on applying a function that you + * supply to each item emitted by the source Observable, where that function + * returns an Observable, and then merging those resulting Observables and + * emitting the results of this merger. + * + * @example Map and flatten each letter to an Observable ticking every 1 second + * var letters = Rx.Observable.of('a', 'b', 'c'); + * var result = letters.mergeMap(x => + * Rx.Observable.interval(1000).map(i => x+i) + * ); + * result.subscribe(x => console.log(x)); + * + * // Results in the following: + * // a0 + * // b0 + * // c0 + * // a1 + * // b1 + * // c1 + * // continues to list a,b,c with respective ascending integers + * + * @see {@link concatMap} + * @see {@link exhaustMap} + * @see {@link merge} + * @see {@link mergeAll} + * @see {@link mergeMapTo} + * @see {@link mergeScan} + * @see {@link switchMap} + * + * @param {function(value: T, ?index: number): ObservableInput} project A function + * that, when applied to an item emitted by the source Observable, returns an + * Observable. + * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector] + * A function to produce the value on the output Observable based on the values + * and the indices of the source (outer) emission and the inner Observable + * emission. The arguments passed to this function are: + * - `outerValue`: the value that came from the source + * - `innerValue`: the value that came from the projected Observable + * - `outerIndex`: the "index" of the value that came from the source + * - `innerIndex`: the "index" of the value from the projected Observable + * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input + * Observables being subscribed to concurrently. + * @return {Observable} An Observable that emits the result of applying the + * projection function (and the optional `resultSelector`) to each item emitted + * by the source Observable and merging the results of the Observables obtained + * from this transformation. + * @method mergeMap + * @owner Observable + */ +function mergeMap(project, resultSelector, concurrent) { + if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; } + return function mergeMapOperatorFunction(source) { + if (typeof resultSelector === 'number') { + concurrent = resultSelector; + resultSelector = null; + } + return source.lift(new MergeMapOperator(project, resultSelector, concurrent)); + }; +} +exports.mergeMap = mergeMap; +var MergeMapOperator = (function () { + function MergeMapOperator(project, resultSelector, concurrent) { + if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; } + this.project = project; + this.resultSelector = resultSelector; + this.concurrent = concurrent; + } + MergeMapOperator.prototype.call = function (observer, source) { + return source.subscribe(new MergeMapSubscriber(observer, this.project, this.resultSelector, this.concurrent)); + }; + return MergeMapOperator; +}()); +exports.MergeMapOperator = MergeMapOperator; +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var MergeMapSubscriber = (function (_super) { + __extends(MergeMapSubscriber, _super); + function MergeMapSubscriber(destination, project, resultSelector, concurrent) { + if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; } + _super.call(this, destination); + this.project = project; + this.resultSelector = resultSelector; + this.concurrent = concurrent; + this.hasCompleted = false; + this.buffer = []; + this.active = 0; + this.index = 0; + } + MergeMapSubscriber.prototype._next = function (value) { + if (this.active < this.concurrent) { + this._tryNext(value); + } + else { + this.buffer.push(value); + } + }; + MergeMapSubscriber.prototype._tryNext = function (value) { + var result; + var index = this.index++; + try { + result = this.project(value, index); + } + catch (err) { + this.destination.error(err); + return; + } + this.active++; + this._innerSub(result, value, index); + }; + MergeMapSubscriber.prototype._innerSub = function (ish, value, index) { + this.add(subscribeToResult_1.subscribeToResult(this, ish, value, index)); + }; + MergeMapSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (this.active === 0 && this.buffer.length === 0) { + this.destination.complete(); + } + }; + MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + if (this.resultSelector) { + this._notifyResultSelector(outerValue, innerValue, outerIndex, innerIndex); + } + else { + this.destination.next(innerValue); + } + }; + MergeMapSubscriber.prototype._notifyResultSelector = function (outerValue, innerValue, outerIndex, innerIndex) { + var result; + try { + result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex); + } + catch (err) { + this.destination.error(err); + return; + } + this.destination.next(result); + }; + MergeMapSubscriber.prototype.notifyComplete = function (innerSub) { + var buffer = this.buffer; + this.remove(innerSub); + this.active--; + if (buffer.length > 0) { + this._next(buffer.shift()); + } + else if (this.active === 0 && this.hasCompleted) { + this.destination.complete(); + } + }; + return MergeMapSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); +exports.MergeMapSubscriber = MergeMapSubscriber; + +},{"../OuterSubscriber":31,"../util/subscribeToResult":237}],182:[function(require,module,exports){ +"use strict"; +var ConnectableObservable_1 = require('../observable/ConnectableObservable'); +/* tslint:enable:max-line-length */ +/** + * Returns an Observable that emits the results of invoking a specified selector on items + * emitted by a ConnectableObservable that shares a single subscription to the underlying stream. + * + * + * + * @param {Function|Subject} subjectOrSubjectFactory - Factory function to create an intermediate subject through + * which the source sequence's elements will be multicast to the selector function + * or Subject to push source elements into. + * @param {Function} [selector] - Optional selector function that can use the multicasted source stream + * as many times as needed, without causing multiple subscriptions to the source stream. + * Subscribers to the given source will receive all notifications of the source from the + * time of the subscription forward. + * @return {Observable} An Observable that emits the results of invoking the selector + * on the items emitted by a `ConnectableObservable` that shares a single subscription to + * the underlying stream. + * @method multicast + * @owner Observable + */ +function multicast(subjectOrSubjectFactory, selector) { + return function multicastOperatorFunction(source) { + var subjectFactory; + if (typeof subjectOrSubjectFactory === 'function') { + subjectFactory = subjectOrSubjectFactory; + } + else { + subjectFactory = function subjectFactory() { + return subjectOrSubjectFactory; + }; + } + if (typeof selector === 'function') { + return source.lift(new MulticastOperator(subjectFactory, selector)); + } + var connectable = Object.create(source, ConnectableObservable_1.connectableObservableDescriptor); + connectable.source = source; + connectable.subjectFactory = subjectFactory; + return connectable; + }; +} +exports.multicast = multicast; +var MulticastOperator = (function () { + function MulticastOperator(subjectFactory, selector) { + this.subjectFactory = subjectFactory; + this.selector = selector; + } + MulticastOperator.prototype.call = function (subscriber, source) { + var selector = this.selector; + var subject = this.subjectFactory(); + var subscription = selector(subject).subscribe(subscriber); + subscription.add(source.subscribe(subject)); + return subscription; + }; + return MulticastOperator; +}()); +exports.MulticastOperator = MulticastOperator; + +},{"../observable/ConnectableObservable":94}],183:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +var Notification_1 = require('../Notification'); +/** + * + * Re-emits all notifications from source Observable with specified scheduler. + * + * Ensure a specific scheduler is used, from outside of an Observable. + * + * `observeOn` is an operator that accepts a scheduler as a first parameter, which will be used to reschedule + * notifications emitted by the source Observable. It might be useful, if you do not have control over + * internal scheduler of a given Observable, but want to control when its values are emitted nevertheless. + * + * Returned Observable emits the same notifications (nexted values, complete and error events) as the source Observable, + * but rescheduled with provided scheduler. Note that this doesn't mean that source Observables internal + * scheduler will be replaced in any way. Original scheduler still will be used, but when the source Observable emits + * notification, it will be immediately scheduled again - this time with scheduler passed to `observeOn`. + * An anti-pattern would be calling `observeOn` on Observable that emits lots of values synchronously, to split + * that emissions into asynchronous chunks. For this to happen, scheduler would have to be passed into the source + * Observable directly (usually into the operator that creates it). `observeOn` simply delays notifications a + * little bit more, to ensure that they are emitted at expected moments. + * + * As a matter of fact, `observeOn` accepts second parameter, which specifies in milliseconds with what delay notifications + * will be emitted. The main difference between {@link delay} operator and `observeOn` is that `observeOn` + * will delay all notifications - including error notifications - while `delay` will pass through error + * from source Observable immediately when it is emitted. In general it is highly recommended to use `delay` operator + * for any kind of delaying of values in the stream, while using `observeOn` to specify which scheduler should be used + * for notification emissions in general. + * + * @example Ensure values in subscribe are called just before browser repaint. + * const intervals = Rx.Observable.interval(10); // Intervals are scheduled + * // with async scheduler by default... + * + * intervals + * .observeOn(Rx.Scheduler.animationFrame) // ...but we will observe on animationFrame + * .subscribe(val => { // scheduler to ensure smooth animation. + * someDiv.style.height = val + 'px'; + * }); + * + * @see {@link delay} + * + * @param {IScheduler} scheduler Scheduler that will be used to reschedule notifications from source Observable. + * @param {number} [delay] Number of milliseconds that states with what delay every notification should be rescheduled. + * @return {Observable} Observable that emits the same notifications as the source Observable, + * but with provided scheduler. + * + * @method observeOn + * @owner Observable + */ +function observeOn(scheduler, delay) { + if (delay === void 0) { delay = 0; } + return function observeOnOperatorFunction(source) { + return source.lift(new ObserveOnOperator(scheduler, delay)); + }; +} +exports.observeOn = observeOn; +var ObserveOnOperator = (function () { + function ObserveOnOperator(scheduler, delay) { + if (delay === void 0) { delay = 0; } + this.scheduler = scheduler; + this.delay = delay; + } + ObserveOnOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay)); + }; + return ObserveOnOperator; +}()); +exports.ObserveOnOperator = ObserveOnOperator; +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var ObserveOnSubscriber = (function (_super) { + __extends(ObserveOnSubscriber, _super); + function ObserveOnSubscriber(destination, scheduler, delay) { + if (delay === void 0) { delay = 0; } + _super.call(this, destination); + this.scheduler = scheduler; + this.delay = delay; + } + ObserveOnSubscriber.dispatch = function (arg) { + var notification = arg.notification, destination = arg.destination; + notification.observe(destination); + this.unsubscribe(); + }; + ObserveOnSubscriber.prototype.scheduleMessage = function (notification) { + this.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination))); + }; + ObserveOnSubscriber.prototype._next = function (value) { + this.scheduleMessage(Notification_1.Notification.createNext(value)); + }; + ObserveOnSubscriber.prototype._error = function (err) { + this.scheduleMessage(Notification_1.Notification.createError(err)); + }; + ObserveOnSubscriber.prototype._complete = function () { + this.scheduleMessage(Notification_1.Notification.createComplete()); + }; + return ObserveOnSubscriber; +}(Subscriber_1.Subscriber)); +exports.ObserveOnSubscriber = ObserveOnSubscriber; +var ObserveOnMessage = (function () { + function ObserveOnMessage(notification, destination) { + this.notification = notification; + this.destination = destination; + } + return ObserveOnMessage; +}()); +exports.ObserveOnMessage = ObserveOnMessage; + +},{"../Notification":28,"../Subscriber":36}],184:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +/** + * Groups pairs of consecutive emissions together and emits them as an array of + * two values. + * + * Puts the current value and previous value together as + * an array, and emits that. + * + * + * + * The Nth emission from the source Observable will cause the output Observable + * to emit an array [(N-1)th, Nth] of the previous and the current value, as a + * pair. For this reason, `pairwise` emits on the second and subsequent + * emissions from the source Observable, but not on the first emission, because + * there is no previous value in that case. + * + * @example On every click (starting from the second), emit the relative distance to the previous click + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var pairs = clicks.pairwise(); + * var distance = pairs.map(pair => { + * var x0 = pair[0].clientX; + * var y0 = pair[0].clientY; + * var x1 = pair[1].clientX; + * var y1 = pair[1].clientY; + * return Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2)); + * }); + * distance.subscribe(x => console.log(x)); + * + * @see {@link buffer} + * @see {@link bufferCount} + * + * @return {Observable>} An Observable of pairs (as arrays) of + * consecutive values from the source Observable. + * @method pairwise + * @owner Observable + */ +function pairwise() { + return function (source) { return source.lift(new PairwiseOperator()); }; +} +exports.pairwise = pairwise; +var PairwiseOperator = (function () { + function PairwiseOperator() { + } + PairwiseOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new PairwiseSubscriber(subscriber)); + }; + return PairwiseOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var PairwiseSubscriber = (function (_super) { + __extends(PairwiseSubscriber, _super); + function PairwiseSubscriber(destination) { + _super.call(this, destination); + this.hasPrev = false; + } + PairwiseSubscriber.prototype._next = function (value) { + if (this.hasPrev) { + this.destination.next([this.prev, value]); + } + else { + this.hasPrev = true; + } + this.prev = value; + }; + return PairwiseSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36}],185:[function(require,module,exports){ +"use strict"; +var map_1 = require('./map'); +/** + * Maps each source value (an object) to its specified nested property. + * + * Like {@link map}, but meant only for picking one of + * the nested properties of every emitted object. + * + * + * + * Given a list of strings describing a path to an object property, retrieves + * the value of a specified nested property from all values in the source + * Observable. If a property can't be resolved, it will return `undefined` for + * that value. + * + * @example Map every click to the tagName of the clicked target element + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var tagNames = clicks.pluck('target', 'tagName'); + * tagNames.subscribe(x => console.log(x)); + * + * @see {@link map} + * + * @param {...string} properties The nested properties to pluck from each source + * value (an object). + * @return {Observable} A new Observable of property values from the source values. + * @method pluck + * @owner Observable + */ +function pluck() { + var properties = []; + for (var _i = 0; _i < arguments.length; _i++) { + properties[_i - 0] = arguments[_i]; + } + var length = properties.length; + if (length === 0) { + throw new Error('list of properties cannot be empty.'); + } + return function (source) { return map_1.map(plucker(properties, length))(source); }; +} +exports.pluck = pluck; +function plucker(props, length) { + var mapper = function (x) { + var currentProp = x; + for (var i = 0; i < length; i++) { + var p = currentProp[props[i]]; + if (typeof p !== 'undefined') { + currentProp = p; + } + else { + return undefined; + } + } + return currentProp; + }; + return mapper; +} + +},{"./map":178}],186:[function(require,module,exports){ +"use strict"; +var Subject_1 = require('../Subject'); +var multicast_1 = require('./multicast'); +/* tslint:enable:max-line-length */ +/** + * Returns a ConnectableObservable, which is a variety of Observable that waits until its connect method is called + * before it begins emitting items to those Observers that have subscribed to it. + * + * + * + * @param {Function} [selector] - Optional selector function which can use the multicasted source sequence as many times + * as needed, without causing multiple subscriptions to the source sequence. + * Subscribers to the given source will receive all notifications of the source from the time of the subscription on. + * @return A ConnectableObservable that upon connection causes the source Observable to emit items to its Observers. + * @method publish + * @owner Observable + */ +function publish(selector) { + return selector ? + multicast_1.multicast(function () { return new Subject_1.Subject(); }, selector) : + multicast_1.multicast(new Subject_1.Subject()); +} +exports.publish = publish; + +},{"../Subject":34,"./multicast":182}],187:[function(require,module,exports){ +"use strict"; +var ReplaySubject_1 = require('../ReplaySubject'); +var multicast_1 = require('./multicast'); +/* tslint:enable:max-line-length */ +function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) { + if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') { + scheduler = selectorOrScheduler; + } + var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined; + var subject = new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler); + return function (source) { return multicast_1.multicast(function () { return subject; }, selector)(source); }; +} +exports.publishReplay = publishReplay; + +},{"../ReplaySubject":32,"./multicast":182}],188:[function(require,module,exports){ +"use strict"; +var scan_1 = require('./scan'); +var takeLast_1 = require('./takeLast'); +var defaultIfEmpty_1 = require('./defaultIfEmpty'); +var pipe_1 = require('../util/pipe'); +/* tslint:enable:max-line-length */ +/** + * Applies an accumulator function over the source Observable, and returns the + * accumulated result when the source completes, given an optional seed value. + * + * Combines together all values emitted on the source, + * using an accumulator function that knows how to join a new source value into + * the accumulation from the past. + * + * + * + * Like + * [Array.prototype.reduce()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce), + * `reduce` applies an `accumulator` function against an accumulation and each + * value of the source Observable (from the past) to reduce it to a single + * value, emitted on the output Observable. Note that `reduce` will only emit + * one value, only when the source Observable completes. It is equivalent to + * applying operator {@link scan} followed by operator {@link last}. + * + * Returns an Observable that applies a specified `accumulator` function to each + * item emitted by the source Observable. If a `seed` value is specified, then + * that value will be used as the initial value for the accumulator. If no seed + * value is specified, the first item of the source is used as the seed. + * + * @example Count the number of click events that happened in 5 seconds + * var clicksInFiveSeconds = Rx.Observable.fromEvent(document, 'click') + * .takeUntil(Rx.Observable.interval(5000)); + * var ones = clicksInFiveSeconds.mapTo(1); + * var seed = 0; + * var count = ones.reduce((acc, one) => acc + one, seed); + * count.subscribe(x => console.log(x)); + * + * @see {@link count} + * @see {@link expand} + * @see {@link mergeScan} + * @see {@link scan} + * + * @param {function(acc: R, value: T, index: number): R} accumulator The accumulator function + * called on each source value. + * @param {R} [seed] The initial accumulation value. + * @return {Observable} An Observable that emits a single value that is the + * result of accumulating the values emitted by the source Observable. + * @method reduce + * @owner Observable + */ +function reduce(accumulator, seed) { + // providing a seed of `undefined` *should* be valid and trigger + // hasSeed! so don't use `seed !== undefined` checks! + // For this reason, we have to check it here at the original call site + // otherwise inside Operator/Subscriber we won't know if `undefined` + // means they didn't provide anything or if they literally provided `undefined` + if (arguments.length >= 2) { + return function reduceOperatorFunctionWithSeed(source) { + return pipe_1.pipe(scan_1.scan(accumulator, seed), takeLast_1.takeLast(1), defaultIfEmpty_1.defaultIfEmpty(seed))(source); + }; + } + return function reduceOperatorFunction(source) { + return pipe_1.pipe(scan_1.scan(function (acc, value, index) { + return accumulator(acc, value, index + 1); + }), takeLast_1.takeLast(1))(source); + }; +} +exports.reduce = reduce; + +},{"../util/pipe":235,"./defaultIfEmpty":169,"./scan":192,"./takeLast":200}],189:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +function refCount() { + return function refCountOperatorFunction(source) { + return source.lift(new RefCountOperator(source)); + }; +} +exports.refCount = refCount; +var RefCountOperator = (function () { + function RefCountOperator(connectable) { + this.connectable = connectable; + } + RefCountOperator.prototype.call = function (subscriber, source) { + var connectable = this.connectable; + connectable._refCount++; + var refCounter = new RefCountSubscriber(subscriber, connectable); + var subscription = source.subscribe(refCounter); + if (!refCounter.closed) { + refCounter.connection = connectable.connect(); + } + return subscription; + }; + return RefCountOperator; +}()); +var RefCountSubscriber = (function (_super) { + __extends(RefCountSubscriber, _super); + function RefCountSubscriber(destination, connectable) { + _super.call(this, destination); + this.connectable = connectable; + } + RefCountSubscriber.prototype._unsubscribe = function () { + var connectable = this.connectable; + if (!connectable) { + this.connection = null; + return; + } + this.connectable = null; + var refCount = connectable._refCount; + if (refCount <= 0) { + this.connection = null; + return; + } + connectable._refCount = refCount - 1; + if (refCount > 1) { + this.connection = null; + return; + } + /// + // Compare the local RefCountSubscriber's connection Subscription to the + // connection Subscription on the shared ConnectableObservable. In cases + // where the ConnectableObservable source synchronously emits values, and + // the RefCountSubscriber's downstream Observers synchronously unsubscribe, + // execution continues to here before the RefCountOperator has a chance to + // supply the RefCountSubscriber with the shared connection Subscription. + // For example: + // ``` + // Observable.range(0, 10) + // .publish() + // .refCount() + // .take(5) + // .subscribe(); + // ``` + // In order to account for this case, RefCountSubscriber should only dispose + // the ConnectableObservable's shared connection Subscription if the + // connection Subscription exists, *and* either: + // a. RefCountSubscriber doesn't have a reference to the shared connection + // Subscription yet, or, + // b. RefCountSubscriber's connection Subscription reference is identical + // to the shared connection Subscription + /// + var connection = this.connection; + var sharedConnection = connectable._connection; + this.connection = null; + if (sharedConnection && (!connection || sharedConnection === connection)) { + sharedConnection.unsubscribe(); + } + }; + return RefCountSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36}],190:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +/** + * Returns an Observable that mirrors the source Observable with the exception of an `error`. If the source Observable + * calls `error`, this method will resubscribe to the source Observable for a maximum of `count` resubscriptions (given + * as a number parameter) rather than propagating the `error` call. + * + * + * + * Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted + * during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second + * time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications + * would be: [1, 2, 1, 2, 3, 4, 5, `complete`]. + * @param {number} count - Number of retry attempts before failing. + * @return {Observable} The source Observable modified with the retry logic. + * @method retry + * @owner Observable + */ +function retry(count) { + if (count === void 0) { count = -1; } + return function (source) { return source.lift(new RetryOperator(count, source)); }; +} +exports.retry = retry; +var RetryOperator = (function () { + function RetryOperator(count, source) { + this.count = count; + this.source = source; + } + RetryOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source)); + }; + return RetryOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var RetrySubscriber = (function (_super) { + __extends(RetrySubscriber, _super); + function RetrySubscriber(destination, count, source) { + _super.call(this, destination); + this.count = count; + this.source = source; + } + RetrySubscriber.prototype.error = function (err) { + if (!this.isStopped) { + var _a = this, source = _a.source, count = _a.count; + if (count === 0) { + return _super.prototype.error.call(this, err); + } + else if (count > -1) { + this.count = count - 1; + } + source.subscribe(this._unsubscribeAndRecycle()); + } + }; + return RetrySubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36}],191:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var OuterSubscriber_1 = require('../OuterSubscriber'); +var subscribeToResult_1 = require('../util/subscribeToResult'); +/** + * Emits the most recently emitted value from the source Observable whenever + * another Observable, the `notifier`, emits. + * + * It's like {@link sampleTime}, but samples whenever + * the `notifier` Observable emits something. + * + * + * + * Whenever the `notifier` Observable emits a value or completes, `sample` + * looks at the source Observable and emits whichever value it has most recently + * emitted since the previous sampling, unless the source has not emitted + * anything since the previous sampling. The `notifier` is subscribed to as soon + * as the output Observable is subscribed. + * + * @example On every click, sample the most recent "seconds" timer + * var seconds = Rx.Observable.interval(1000); + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var result = seconds.sample(clicks); + * result.subscribe(x => console.log(x)); + * + * @see {@link audit} + * @see {@link debounce} + * @see {@link sampleTime} + * @see {@link throttle} + * + * @param {Observable} notifier The Observable to use for sampling the + * source Observable. + * @return {Observable} An Observable that emits the results of sampling the + * values emitted by the source Observable whenever the notifier Observable + * emits value or completes. + * @method sample + * @owner Observable + */ +function sample(notifier) { + return function (source) { return source.lift(new SampleOperator(notifier)); }; +} +exports.sample = sample; +var SampleOperator = (function () { + function SampleOperator(notifier) { + this.notifier = notifier; + } + SampleOperator.prototype.call = function (subscriber, source) { + var sampleSubscriber = new SampleSubscriber(subscriber); + var subscription = source.subscribe(sampleSubscriber); + subscription.add(subscribeToResult_1.subscribeToResult(sampleSubscriber, this.notifier)); + return subscription; + }; + return SampleOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var SampleSubscriber = (function (_super) { + __extends(SampleSubscriber, _super); + function SampleSubscriber() { + _super.apply(this, arguments); + this.hasValue = false; + } + SampleSubscriber.prototype._next = function (value) { + this.value = value; + this.hasValue = true; + }; + SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.emitValue(); + }; + SampleSubscriber.prototype.notifyComplete = function () { + this.emitValue(); + }; + SampleSubscriber.prototype.emitValue = function () { + if (this.hasValue) { + this.hasValue = false; + this.destination.next(this.value); + } + }; + return SampleSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); + +},{"../OuterSubscriber":31,"../util/subscribeToResult":237}],192:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +/* tslint:enable:max-line-length */ +/** + * Applies an accumulator function over the source Observable, and returns each + * intermediate result, with an optional seed value. + * + * It's like {@link reduce}, but emits the current + * accumulation whenever the source emits a value. + * + * + * + * Combines together all values emitted on the source, using an accumulator + * function that knows how to join a new source value into the accumulation from + * the past. Is similar to {@link reduce}, but emits the intermediate + * accumulations. + * + * Returns an Observable that applies a specified `accumulator` function to each + * item emitted by the source Observable. If a `seed` value is specified, then + * that value will be used as the initial value for the accumulator. If no seed + * value is specified, the first item of the source is used as the seed. + * + * @example Count the number of click events + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var ones = clicks.mapTo(1); + * var seed = 0; + * var count = ones.scan((acc, one) => acc + one, seed); + * count.subscribe(x => console.log(x)); + * + * @see {@link expand} + * @see {@link mergeScan} + * @see {@link reduce} + * + * @param {function(acc: R, value: T, index: number): R} accumulator + * The accumulator function called on each source value. + * @param {T|R} [seed] The initial accumulation value. + * @return {Observable} An observable of the accumulated values. + * @method scan + * @owner Observable + */ +function scan(accumulator, seed) { + var hasSeed = false; + // providing a seed of `undefined` *should* be valid and trigger + // hasSeed! so don't use `seed !== undefined` checks! + // For this reason, we have to check it here at the original call site + // otherwise inside Operator/Subscriber we won't know if `undefined` + // means they didn't provide anything or if they literally provided `undefined` + if (arguments.length >= 2) { + hasSeed = true; + } + return function scanOperatorFunction(source) { + return source.lift(new ScanOperator(accumulator, seed, hasSeed)); + }; +} +exports.scan = scan; +var ScanOperator = (function () { + function ScanOperator(accumulator, seed, hasSeed) { + if (hasSeed === void 0) { hasSeed = false; } + this.accumulator = accumulator; + this.seed = seed; + this.hasSeed = hasSeed; + } + ScanOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed)); + }; + return ScanOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var ScanSubscriber = (function (_super) { + __extends(ScanSubscriber, _super); + function ScanSubscriber(destination, accumulator, _seed, hasSeed) { + _super.call(this, destination); + this.accumulator = accumulator; + this._seed = _seed; + this.hasSeed = hasSeed; + this.index = 0; + } + Object.defineProperty(ScanSubscriber.prototype, "seed", { + get: function () { + return this._seed; + }, + set: function (value) { + this.hasSeed = true; + this._seed = value; + }, + enumerable: true, + configurable: true + }); + ScanSubscriber.prototype._next = function (value) { + if (!this.hasSeed) { + this.seed = value; + this.destination.next(value); + } + else { + return this._tryNext(value); + } + }; + ScanSubscriber.prototype._tryNext = function (value) { + var index = this.index++; + var result; + try { + result = this.accumulator(this.seed, value, index); + } + catch (err) { + this.destination.error(err); + } + this.seed = result; + this.destination.next(result); + }; + return ScanSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36}],193:[function(require,module,exports){ +"use strict"; +var multicast_1 = require('./multicast'); +var refCount_1 = require('./refCount'); +var Subject_1 = require('../Subject'); +function shareSubjectFactory() { + return new Subject_1.Subject(); +} +/** + * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one + * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will + * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`. + * This is an alias for .multicast(() => new Subject()).refCount(). + * + * + * + * @return {Observable} An Observable that upon connection causes the source Observable to emit items to its Observers. + * @method share + * @owner Observable + */ +function share() { + return function (source) { return refCount_1.refCount()(multicast_1.multicast(shareSubjectFactory)(source)); }; +} +exports.share = share; +; + +},{"../Subject":34,"./multicast":182,"./refCount":189}],194:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +/** + * Returns an Observable that skips the first `count` items emitted by the source Observable. + * + * + * + * @param {Number} count - The number of times, items emitted by source Observable should be skipped. + * @return {Observable} An Observable that skips values emitted by the source Observable. + * + * @method skip + * @owner Observable + */ +function skip(count) { + return function (source) { return source.lift(new SkipOperator(count)); }; +} +exports.skip = skip; +var SkipOperator = (function () { + function SkipOperator(total) { + this.total = total; + } + SkipOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SkipSubscriber(subscriber, this.total)); + }; + return SkipOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var SkipSubscriber = (function (_super) { + __extends(SkipSubscriber, _super); + function SkipSubscriber(destination, total) { + _super.call(this, destination); + this.total = total; + this.count = 0; + } + SkipSubscriber.prototype._next = function (x) { + if (++this.count > this.total) { + this.destination.next(x); + } + }; + return SkipSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36}],195:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var OuterSubscriber_1 = require('../OuterSubscriber'); +var subscribeToResult_1 = require('../util/subscribeToResult'); +/** + * Returns an Observable that skips items emitted by the source Observable until a second Observable emits an item. + * + * + * + * @param {Observable} notifier - The second Observable that has to emit an item before the source Observable's elements begin to + * be mirrored by the resulting Observable. + * @return {Observable} An Observable that skips items from the source Observable until the second Observable emits + * an item, then emits the remaining items. + * @method skipUntil + * @owner Observable + */ +function skipUntil(notifier) { + return function (source) { return source.lift(new SkipUntilOperator(notifier)); }; +} +exports.skipUntil = skipUntil; +var SkipUntilOperator = (function () { + function SkipUntilOperator(notifier) { + this.notifier = notifier; + } + SkipUntilOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SkipUntilSubscriber(subscriber, this.notifier)); + }; + return SkipUntilOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var SkipUntilSubscriber = (function (_super) { + __extends(SkipUntilSubscriber, _super); + function SkipUntilSubscriber(destination, notifier) { + _super.call(this, destination); + this.hasValue = false; + this.isInnerStopped = false; + this.add(subscribeToResult_1.subscribeToResult(this, notifier)); + } + SkipUntilSubscriber.prototype._next = function (value) { + if (this.hasValue) { + _super.prototype._next.call(this, value); + } + }; + SkipUntilSubscriber.prototype._complete = function () { + if (this.isInnerStopped) { + _super.prototype._complete.call(this); + } + else { + this.unsubscribe(); + } + }; + SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.hasValue = true; + }; + SkipUntilSubscriber.prototype.notifyComplete = function () { + this.isInnerStopped = true; + if (this.isStopped) { + _super.prototype._complete.call(this); + } + }; + return SkipUntilSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); + +},{"../OuterSubscriber":31,"../util/subscribeToResult":237}],196:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +/** + * Returns an Observable that skips all items emitted by the source Observable as long as a specified condition holds + * true, but emits all further source items as soon as the condition becomes false. + * + * + * + * @param {Function} predicate - A function to test each item emitted from the source Observable. + * @return {Observable} An Observable that begins emitting items emitted by the source Observable when the + * specified predicate becomes false. + * @method skipWhile + * @owner Observable + */ +function skipWhile(predicate) { + return function (source) { return source.lift(new SkipWhileOperator(predicate)); }; +} +exports.skipWhile = skipWhile; +var SkipWhileOperator = (function () { + function SkipWhileOperator(predicate) { + this.predicate = predicate; + } + SkipWhileOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate)); + }; + return SkipWhileOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var SkipWhileSubscriber = (function (_super) { + __extends(SkipWhileSubscriber, _super); + function SkipWhileSubscriber(destination, predicate) { + _super.call(this, destination); + this.predicate = predicate; + this.skipping = true; + this.index = 0; + } + SkipWhileSubscriber.prototype._next = function (value) { + var destination = this.destination; + if (this.skipping) { + this.tryCallPredicate(value); + } + if (!this.skipping) { + destination.next(value); + } + }; + SkipWhileSubscriber.prototype.tryCallPredicate = function (value) { + try { + var result = this.predicate(value, this.index++); + this.skipping = Boolean(result); + } + catch (err) { + this.destination.error(err); + } + }; + return SkipWhileSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36}],197:[function(require,module,exports){ +"use strict"; +var ArrayObservable_1 = require('../observable/ArrayObservable'); +var ScalarObservable_1 = require('../observable/ScalarObservable'); +var EmptyObservable_1 = require('../observable/EmptyObservable'); +var concat_1 = require('../observable/concat'); +var isScheduler_1 = require('../util/isScheduler'); +/* tslint:enable:max-line-length */ +/** + * Returns an Observable that emits the items you specify as arguments before it begins to emit + * items emitted by the source Observable. + * + * + * + * @param {...T} values - Items you want the modified Observable to emit first. + * @param {Scheduler} [scheduler] - A {@link IScheduler} to use for scheduling + * the emissions of the `next` notifications. + * @return {Observable} An Observable that emits the items in the specified Iterable and then emits the items + * emitted by the source Observable. + * @method startWith + * @owner Observable + */ +function startWith() { + var array = []; + for (var _i = 0; _i < arguments.length; _i++) { + array[_i - 0] = arguments[_i]; + } + return function (source) { + var scheduler = array[array.length - 1]; + if (isScheduler_1.isScheduler(scheduler)) { + array.pop(); + } + else { + scheduler = null; + } + var len = array.length; + if (len === 1) { + return concat_1.concat(new ScalarObservable_1.ScalarObservable(array[0], scheduler), source); + } + else if (len > 1) { + return concat_1.concat(new ArrayObservable_1.ArrayObservable(array, scheduler), source); + } + else { + return concat_1.concat(new EmptyObservable_1.EmptyObservable(scheduler), source); + } + }; +} +exports.startWith = startWith; + +},{"../observable/ArrayObservable":93,"../observable/EmptyObservable":96,"../observable/ScalarObservable":102,"../observable/concat":105,"../util/isScheduler":233}],198:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var OuterSubscriber_1 = require('../OuterSubscriber'); +var subscribeToResult_1 = require('../util/subscribeToResult'); +/* tslint:enable:max-line-length */ +/** + * Projects each source value to an Observable which is merged in the output + * Observable, emitting values only from the most recently projected Observable. + * + * Maps each value to an Observable, then flattens all of + * these inner Observables using {@link switch}. + * + * + * + * Returns an Observable that emits items based on applying a function that you + * supply to each item emitted by the source Observable, where that function + * returns an (so-called "inner") Observable. Each time it observes one of these + * inner Observables, the output Observable begins emitting the items emitted by + * that inner Observable. When a new inner Observable is emitted, `switchMap` + * stops emitting items from the earlier-emitted inner Observable and begins + * emitting items from the new one. It continues to behave like this for + * subsequent inner Observables. + * + * @example Rerun an interval Observable on every click event + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var result = clicks.switchMap((ev) => Rx.Observable.interval(1000)); + * result.subscribe(x => console.log(x)); + * + * @see {@link concatMap} + * @see {@link exhaustMap} + * @see {@link mergeMap} + * @see {@link switch} + * @see {@link switchMapTo} + * + * @param {function(value: T, ?index: number): ObservableInput} project A function + * that, when applied to an item emitted by the source Observable, returns an + * Observable. + * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector] + * A function to produce the value on the output Observable based on the values + * and the indices of the source (outer) emission and the inner Observable + * emission. The arguments passed to this function are: + * - `outerValue`: the value that came from the source + * - `innerValue`: the value that came from the projected Observable + * - `outerIndex`: the "index" of the value that came from the source + * - `innerIndex`: the "index" of the value from the projected Observable + * @return {Observable} An Observable that emits the result of applying the + * projection function (and the optional `resultSelector`) to each item emitted + * by the source Observable and taking only the values from the most recently + * projected inner Observable. + * @method switchMap + * @owner Observable + */ +function switchMap(project, resultSelector) { + return function switchMapOperatorFunction(source) { + return source.lift(new SwitchMapOperator(project, resultSelector)); + }; +} +exports.switchMap = switchMap; +var SwitchMapOperator = (function () { + function SwitchMapOperator(project, resultSelector) { + this.project = project; + this.resultSelector = resultSelector; + } + SwitchMapOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SwitchMapSubscriber(subscriber, this.project, this.resultSelector)); + }; + return SwitchMapOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var SwitchMapSubscriber = (function (_super) { + __extends(SwitchMapSubscriber, _super); + function SwitchMapSubscriber(destination, project, resultSelector) { + _super.call(this, destination); + this.project = project; + this.resultSelector = resultSelector; + this.index = 0; + } + SwitchMapSubscriber.prototype._next = function (value) { + var result; + var index = this.index++; + try { + result = this.project(value, index); + } + catch (error) { + this.destination.error(error); + return; + } + this._innerSub(result, value, index); + }; + SwitchMapSubscriber.prototype._innerSub = function (result, value, index) { + var innerSubscription = this.innerSubscription; + if (innerSubscription) { + innerSubscription.unsubscribe(); + } + this.add(this.innerSubscription = subscribeToResult_1.subscribeToResult(this, result, value, index)); + }; + SwitchMapSubscriber.prototype._complete = function () { + var innerSubscription = this.innerSubscription; + if (!innerSubscription || innerSubscription.closed) { + _super.prototype._complete.call(this); + } + }; + SwitchMapSubscriber.prototype._unsubscribe = function () { + this.innerSubscription = null; + }; + SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) { + this.remove(innerSub); + this.innerSubscription = null; + if (this.isStopped) { + _super.prototype._complete.call(this); + } + }; + SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + if (this.resultSelector) { + this._tryNotifyNext(outerValue, innerValue, outerIndex, innerIndex); + } + else { + this.destination.next(innerValue); + } + }; + SwitchMapSubscriber.prototype._tryNotifyNext = function (outerValue, innerValue, outerIndex, innerIndex) { + var result; + try { + result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex); + } + catch (err) { + this.destination.error(err); + return; + } + this.destination.next(result); + }; + return SwitchMapSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); + +},{"../OuterSubscriber":31,"../util/subscribeToResult":237}],199:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +var ArgumentOutOfRangeError_1 = require('../util/ArgumentOutOfRangeError'); +var EmptyObservable_1 = require('../observable/EmptyObservable'); +/** + * Emits only the first `count` values emitted by the source Observable. + * + * Takes the first `count` values from the source, then + * completes. + * + * + * + * `take` returns an Observable that emits only the first `count` values emitted + * by the source Observable. If the source emits fewer than `count` values then + * all of its values are emitted. After that, it completes, regardless if the + * source completes. + * + * @example Take the first 5 seconds of an infinite 1-second interval Observable + * var interval = Rx.Observable.interval(1000); + * var five = interval.take(5); + * five.subscribe(x => console.log(x)); + * + * @see {@link takeLast} + * @see {@link takeUntil} + * @see {@link takeWhile} + * @see {@link skip} + * + * @throws {ArgumentOutOfRangeError} When using `take(i)`, it delivers an + * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`. + * + * @param {number} count The maximum number of `next` values to emit. + * @return {Observable} An Observable that emits only the first `count` + * values emitted by the source Observable, or all of the values from the source + * if the source emits fewer than `count` values. + * @method take + * @owner Observable + */ +function take(count) { + return function (source) { + if (count === 0) { + return new EmptyObservable_1.EmptyObservable(); + } + else { + return source.lift(new TakeOperator(count)); + } + }; +} +exports.take = take; +var TakeOperator = (function () { + function TakeOperator(total) { + this.total = total; + if (this.total < 0) { + throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError; + } + } + TakeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TakeSubscriber(subscriber, this.total)); + }; + return TakeOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var TakeSubscriber = (function (_super) { + __extends(TakeSubscriber, _super); + function TakeSubscriber(destination, total) { + _super.call(this, destination); + this.total = total; + this.count = 0; + } + TakeSubscriber.prototype._next = function (value) { + var total = this.total; + var count = ++this.count; + if (count <= total) { + this.destination.next(value); + if (count === total) { + this.destination.complete(); + this.unsubscribe(); + } + } + }; + return TakeSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36,"../observable/EmptyObservable":96,"../util/ArgumentOutOfRangeError":218}],200:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +var ArgumentOutOfRangeError_1 = require('../util/ArgumentOutOfRangeError'); +var EmptyObservable_1 = require('../observable/EmptyObservable'); +/** + * Emits only the last `count` values emitted by the source Observable. + * + * Remembers the latest `count` values, then emits those + * only when the source completes. + * + * + * + * `takeLast` returns an Observable that emits at most the last `count` values + * emitted by the source Observable. If the source emits fewer than `count` + * values then all of its values are emitted. This operator must wait until the + * `complete` notification emission from the source in order to emit the `next` + * values on the output Observable, because otherwise it is impossible to know + * whether or not more values will be emitted on the source. For this reason, + * all values are emitted synchronously, followed by the complete notification. + * + * @example Take the last 3 values of an Observable with many values + * var many = Rx.Observable.range(1, 100); + * var lastThree = many.takeLast(3); + * lastThree.subscribe(x => console.log(x)); + * + * @see {@link take} + * @see {@link takeUntil} + * @see {@link takeWhile} + * @see {@link skip} + * + * @throws {ArgumentOutOfRangeError} When using `takeLast(i)`, it delivers an + * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`. + * + * @param {number} count The maximum number of values to emit from the end of + * the sequence of values emitted by the source Observable. + * @return {Observable} An Observable that emits at most the last count + * values emitted by the source Observable. + * @method takeLast + * @owner Observable + */ +function takeLast(count) { + return function takeLastOperatorFunction(source) { + if (count === 0) { + return new EmptyObservable_1.EmptyObservable(); + } + else { + return source.lift(new TakeLastOperator(count)); + } + }; +} +exports.takeLast = takeLast; +var TakeLastOperator = (function () { + function TakeLastOperator(total) { + this.total = total; + if (this.total < 0) { + throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError; + } + } + TakeLastOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TakeLastSubscriber(subscriber, this.total)); + }; + return TakeLastOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var TakeLastSubscriber = (function (_super) { + __extends(TakeLastSubscriber, _super); + function TakeLastSubscriber(destination, total) { + _super.call(this, destination); + this.total = total; + this.ring = new Array(); + this.count = 0; + } + TakeLastSubscriber.prototype._next = function (value) { + var ring = this.ring; + var total = this.total; + var count = this.count++; + if (ring.length < total) { + ring.push(value); + } + else { + var index = count % total; + ring[index] = value; + } + }; + TakeLastSubscriber.prototype._complete = function () { + var destination = this.destination; + var count = this.count; + if (count > 0) { + var total = this.count >= this.total ? this.total : this.count; + var ring = this.ring; + for (var i = 0; i < total; i++) { + var idx = (count++) % total; + destination.next(ring[idx]); + } + } + destination.complete(); + }; + return TakeLastSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36,"../observable/EmptyObservable":96,"../util/ArgumentOutOfRangeError":218}],201:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var OuterSubscriber_1 = require('../OuterSubscriber'); +var subscribeToResult_1 = require('../util/subscribeToResult'); +/** + * Emits the values emitted by the source Observable until a `notifier` + * Observable emits a value. + * + * Lets values pass until a second Observable, + * `notifier`, emits something. Then, it completes. + * + * + * + * `takeUntil` subscribes and begins mirroring the source Observable. It also + * monitors a second Observable, `notifier` that you provide. If the `notifier` + * emits a value or a complete notification, the output Observable stops + * mirroring the source Observable and completes. + * + * @example Tick every second until the first click happens + * var interval = Rx.Observable.interval(1000); + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var result = interval.takeUntil(clicks); + * result.subscribe(x => console.log(x)); + * + * @see {@link take} + * @see {@link takeLast} + * @see {@link takeWhile} + * @see {@link skip} + * + * @param {Observable} notifier The Observable whose first emitted value will + * cause the output Observable of `takeUntil` to stop emitting values from the + * source Observable. + * @return {Observable} An Observable that emits the values from the source + * Observable until such time as `notifier` emits its first value. + * @method takeUntil + * @owner Observable + */ +function takeUntil(notifier) { + return function (source) { return source.lift(new TakeUntilOperator(notifier)); }; +} +exports.takeUntil = takeUntil; +var TakeUntilOperator = (function () { + function TakeUntilOperator(notifier) { + this.notifier = notifier; + } + TakeUntilOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TakeUntilSubscriber(subscriber, this.notifier)); + }; + return TakeUntilOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var TakeUntilSubscriber = (function (_super) { + __extends(TakeUntilSubscriber, _super); + function TakeUntilSubscriber(destination, notifier) { + _super.call(this, destination); + this.notifier = notifier; + this.add(subscribeToResult_1.subscribeToResult(this, notifier)); + } + TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.complete(); + }; + TakeUntilSubscriber.prototype.notifyComplete = function () { + // noop + }; + return TakeUntilSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); + +},{"../OuterSubscriber":31,"../util/subscribeToResult":237}],202:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +/** + * Emits values emitted by the source Observable so long as each value satisfies + * the given `predicate`, and then completes as soon as this `predicate` is not + * satisfied. + * + * Takes values from the source only while they pass the + * condition given. When the first value does not satisfy, it completes. + * + * + * + * `takeWhile` subscribes and begins mirroring the source Observable. Each value + * emitted on the source is given to the `predicate` function which returns a + * boolean, representing a condition to be satisfied by the source values. The + * output Observable emits the source values until such time as the `predicate` + * returns false, at which point `takeWhile` stops mirroring the source + * Observable and completes the output Observable. + * + * @example Emit click events only while the clientX property is greater than 200 + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var result = clicks.takeWhile(ev => ev.clientX > 200); + * result.subscribe(x => console.log(x)); + * + * @see {@link take} + * @see {@link takeLast} + * @see {@link takeUntil} + * @see {@link skip} + * + * @param {function(value: T, index: number): boolean} predicate A function that + * evaluates a value emitted by the source Observable and returns a boolean. + * Also takes the (zero-based) index as the second argument. + * @return {Observable} An Observable that emits the values from the source + * Observable so long as each value satisfies the condition defined by the + * `predicate`, then completes. + * @method takeWhile + * @owner Observable + */ +function takeWhile(predicate) { + return function (source) { return source.lift(new TakeWhileOperator(predicate)); }; +} +exports.takeWhile = takeWhile; +var TakeWhileOperator = (function () { + function TakeWhileOperator(predicate) { + this.predicate = predicate; + } + TakeWhileOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate)); + }; + return TakeWhileOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var TakeWhileSubscriber = (function (_super) { + __extends(TakeWhileSubscriber, _super); + function TakeWhileSubscriber(destination, predicate) { + _super.call(this, destination); + this.predicate = predicate; + this.index = 0; + } + TakeWhileSubscriber.prototype._next = function (value) { + var destination = this.destination; + var result; + try { + result = this.predicate(value, this.index++); + } + catch (err) { + destination.error(err); + return; + } + this.nextOrComplete(value, result); + }; + TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) { + var destination = this.destination; + if (Boolean(predicateResult)) { + destination.next(value); + } + else { + destination.complete(); + } + }; + return TakeWhileSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36}],203:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscriber_1 = require('../Subscriber'); +/* tslint:enable:max-line-length */ +/** + * Perform a side effect for every emission on the source Observable, but return + * an Observable that is identical to the source. + * + * Intercepts each emission on the source and runs a + * function, but returns an output which is identical to the source as long as errors don't occur. + * + * + * + * Returns a mirrored Observable of the source Observable, but modified so that + * the provided Observer is called to perform a side effect for every value, + * error, and completion emitted by the source. Any errors that are thrown in + * the aforementioned Observer or handlers are safely sent down the error path + * of the output Observable. + * + * This operator is useful for debugging your Observables for the correct values + * or performing other side effects. + * + * Note: this is different to a `subscribe` on the Observable. If the Observable + * returned by `do` is not subscribed, the side effects specified by the + * Observer will never happen. `do` therefore simply spies on existing + * execution, it does not trigger an execution to happen like `subscribe` does. + * + * @example Map every click to the clientX position of that click, while also logging the click event + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var positions = clicks + * .do(ev => console.log(ev)) + * .map(ev => ev.clientX); + * positions.subscribe(x => console.log(x)); + * + * @see {@link map} + * @see {@link subscribe} + * + * @param {Observer|function} [nextOrObserver] A normal Observer object or a + * callback for `next`. + * @param {function} [error] Callback for errors in the source. + * @param {function} [complete] Callback for the completion of the source. + * @return {Observable} An Observable identical to the source, but runs the + * specified Observer or callback(s) for each item. + * @name tap + */ +function tap(nextOrObserver, error, complete) { + return function tapOperatorFunction(source) { + return source.lift(new DoOperator(nextOrObserver, error, complete)); + }; +} +exports.tap = tap; +var DoOperator = (function () { + function DoOperator(nextOrObserver, error, complete) { + this.nextOrObserver = nextOrObserver; + this.error = error; + this.complete = complete; + } + DoOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DoSubscriber(subscriber, this.nextOrObserver, this.error, this.complete)); + }; + return DoOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var DoSubscriber = (function (_super) { + __extends(DoSubscriber, _super); + function DoSubscriber(destination, nextOrObserver, error, complete) { + _super.call(this, destination); + var safeSubscriber = new Subscriber_1.Subscriber(nextOrObserver, error, complete); + safeSubscriber.syncErrorThrowable = true; + this.add(safeSubscriber); + this.safeSubscriber = safeSubscriber; + } + DoSubscriber.prototype._next = function (value) { + var safeSubscriber = this.safeSubscriber; + safeSubscriber.next(value); + if (safeSubscriber.syncErrorThrown) { + this.destination.error(safeSubscriber.syncErrorValue); + } + else { + this.destination.next(value); + } + }; + DoSubscriber.prototype._error = function (err) { + var safeSubscriber = this.safeSubscriber; + safeSubscriber.error(err); + if (safeSubscriber.syncErrorThrown) { + this.destination.error(safeSubscriber.syncErrorValue); + } + else { + this.destination.error(err); + } + }; + DoSubscriber.prototype._complete = function () { + var safeSubscriber = this.safeSubscriber; + safeSubscriber.complete(); + if (safeSubscriber.syncErrorThrown) { + this.destination.error(safeSubscriber.syncErrorValue); + } + else { + this.destination.complete(); + } + }; + return DoSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36}],204:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var async_1 = require('../scheduler/async'); +var isDate_1 = require('../util/isDate'); +var Subscriber_1 = require('../Subscriber'); +var TimeoutError_1 = require('../util/TimeoutError'); +/** + * + * Errors if Observable does not emit a value in given time span. + * + * Timeouts on Observable that doesn't emit values fast enough. + * + * + * + * `timeout` operator accepts as an argument either a number or a Date. + * + * If number was provided, it returns an Observable that behaves like a source + * Observable, unless there is a period of time where there is no value emitted. + * So if you provide `100` as argument and first value comes after 50ms from + * the moment of subscription, this value will be simply re-emitted by the resulting + * Observable. If however after that 100ms passes without a second value being emitted, + * stream will end with an error and source Observable will be unsubscribed. + * These checks are performed throughout whole lifecycle of Observable - from the moment + * it was subscribed to, until it completes or errors itself. Thus every value must be + * emitted within specified period since previous value. + * + * If provided argument was Date, returned Observable behaves differently. It throws + * if Observable did not complete before provided Date. This means that periods between + * emission of particular values do not matter in this case. If Observable did not complete + * before provided Date, source Observable will be unsubscribed. Other than that, resulting + * stream behaves just as source Observable. + * + * `timeout` accepts also a Scheduler as a second parameter. It is used to schedule moment (or moments) + * when returned Observable will check if source stream emitted value or completed. + * + * @example Check if ticks are emitted within certain timespan + * const seconds = Rx.Observable.interval(1000); + * + * seconds.timeout(1100) // Let's use bigger timespan to be safe, + * // since `interval` might fire a bit later then scheduled. + * .subscribe( + * value => console.log(value), // Will emit numbers just as regular `interval` would. + * err => console.log(err) // Will never be called. + * ); + * + * seconds.timeout(900).subscribe( + * value => console.log(value), // Will never be called. + * err => console.log(err) // Will emit error before even first value is emitted, + * // since it did not arrive within 900ms period. + * ); + * + * @example Use Date to check if Observable completed + * const seconds = Rx.Observable.interval(1000); + * + * seconds.timeout(new Date("December 17, 2020 03:24:00")) + * .subscribe( + * value => console.log(value), // Will emit values as regular `interval` would + * // until December 17, 2020 at 03:24:00. + * err => console.log(err) // On December 17, 2020 at 03:24:00 it will emit an error, + * // since Observable did not complete by then. + * ); + * + * @see {@link timeoutWith} + * + * @param {number|Date} due Number specifying period within which Observable must emit values + * or Date specifying before when Observable should complete + * @param {Scheduler} [scheduler] Scheduler controlling when timeout checks occur. + * @return {Observable} Observable that mirrors behaviour of source, unless timeout checks fail. + * @method timeout + * @owner Observable + */ +function timeout(due, scheduler) { + if (scheduler === void 0) { scheduler = async_1.async; } + var absoluteTimeout = isDate_1.isDate(due); + var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due); + return function (source) { return source.lift(new TimeoutOperator(waitFor, absoluteTimeout, scheduler, new TimeoutError_1.TimeoutError())); }; +} +exports.timeout = timeout; +var TimeoutOperator = (function () { + function TimeoutOperator(waitFor, absoluteTimeout, scheduler, errorInstance) { + this.waitFor = waitFor; + this.absoluteTimeout = absoluteTimeout; + this.scheduler = scheduler; + this.errorInstance = errorInstance; + } + TimeoutOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TimeoutSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.scheduler, this.errorInstance)); + }; + return TimeoutOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var TimeoutSubscriber = (function (_super) { + __extends(TimeoutSubscriber, _super); + function TimeoutSubscriber(destination, absoluteTimeout, waitFor, scheduler, errorInstance) { + _super.call(this, destination); + this.absoluteTimeout = absoluteTimeout; + this.waitFor = waitFor; + this.scheduler = scheduler; + this.errorInstance = errorInstance; + this.action = null; + this.scheduleTimeout(); + } + TimeoutSubscriber.dispatchTimeout = function (subscriber) { + subscriber.error(subscriber.errorInstance); + }; + TimeoutSubscriber.prototype.scheduleTimeout = function () { + var action = this.action; + if (action) { + // Recycle the action if we've already scheduled one. All the production + // Scheduler Actions mutate their state/delay time and return themeselves. + // VirtualActions are immutable, so they create and return a clone. In this + // case, we need to set the action reference to the most recent VirtualAction, + // to ensure that's the one we clone from next time. + this.action = action.schedule(this, this.waitFor); + } + else { + this.add(this.action = this.scheduler.schedule(TimeoutSubscriber.dispatchTimeout, this.waitFor, this)); + } + }; + TimeoutSubscriber.prototype._next = function (value) { + if (!this.absoluteTimeout) { + this.scheduleTimeout(); + } + _super.prototype._next.call(this, value); + }; + TimeoutSubscriber.prototype._unsubscribe = function () { + this.action = null; + this.scheduler = null; + this.errorInstance = null; + }; + return TimeoutSubscriber; +}(Subscriber_1.Subscriber)); + +},{"../Subscriber":36,"../scheduler/async":212,"../util/TimeoutError":222,"../util/isDate":228}],205:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var OuterSubscriber_1 = require('../OuterSubscriber'); +var subscribeToResult_1 = require('../util/subscribeToResult'); +/* tslint:enable:max-line-length */ +/** + * Combines the source Observable with other Observables to create an Observable + * whose values are calculated from the latest values of each, only when the + * source emits. + * + * Whenever the source Observable emits a value, it + * computes a formula using that value plus the latest values from other input + * Observables, then emits the output of that formula. + * + * + * + * `withLatestFrom` combines each value from the source Observable (the + * instance) with the latest values from the other input Observables only when + * the source emits a value, optionally using a `project` function to determine + * the value to be emitted on the output Observable. All input Observables must + * emit at least one value before the output Observable will emit a value. + * + * @example On every click event, emit an array with the latest timer event plus the click event + * var clicks = Rx.Observable.fromEvent(document, 'click'); + * var timer = Rx.Observable.interval(1000); + * var result = clicks.withLatestFrom(timer); + * result.subscribe(x => console.log(x)); + * + * @see {@link combineLatest} + * + * @param {ObservableInput} other An input Observable to combine with the source + * Observable. More than one input Observables may be given as argument. + * @param {Function} [project] Projection function for combining values + * together. Receives all values in order of the Observables passed, where the + * first parameter is a value from the source Observable. (e.g. + * `a.withLatestFrom(b, c, (a1, b1, c1) => a1 + b1 + c1)`). If this is not + * passed, arrays will be emitted on the output Observable. + * @return {Observable} An Observable of projected values from the most recent + * values from each input Observable, or an array of the most recent values from + * each input Observable. + * @method withLatestFrom + * @owner Observable + */ +function withLatestFrom() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i - 0] = arguments[_i]; + } + return function (source) { + var project; + if (typeof args[args.length - 1] === 'function') { + project = args.pop(); + } + var observables = args; + return source.lift(new WithLatestFromOperator(observables, project)); + }; +} +exports.withLatestFrom = withLatestFrom; +var WithLatestFromOperator = (function () { + function WithLatestFromOperator(observables, project) { + this.observables = observables; + this.project = project; + } + WithLatestFromOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project)); + }; + return WithLatestFromOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var WithLatestFromSubscriber = (function (_super) { + __extends(WithLatestFromSubscriber, _super); + function WithLatestFromSubscriber(destination, observables, project) { + _super.call(this, destination); + this.observables = observables; + this.project = project; + this.toRespond = []; + var len = observables.length; + this.values = new Array(len); + for (var i = 0; i < len; i++) { + this.toRespond.push(i); + } + for (var i = 0; i < len; i++) { + var observable = observables[i]; + this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i)); + } + } + WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.values[outerIndex] = innerValue; + var toRespond = this.toRespond; + if (toRespond.length > 0) { + var found = toRespond.indexOf(outerIndex); + if (found !== -1) { + toRespond.splice(found, 1); + } + } + }; + WithLatestFromSubscriber.prototype.notifyComplete = function () { + // noop + }; + WithLatestFromSubscriber.prototype._next = function (value) { + if (this.toRespond.length === 0) { + var args = [value].concat(this.values); + if (this.project) { + this._tryProject(args); + } + else { + this.destination.next(args); + } + } + }; + WithLatestFromSubscriber.prototype._tryProject = function (args) { + var result; + try { + result = this.project.apply(this, args); + } + catch (err) { + this.destination.error(err); + return; + } + this.destination.next(result); + }; + return WithLatestFromSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); + +},{"../OuterSubscriber":31,"../util/subscribeToResult":237}],206:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var ArrayObservable_1 = require('../observable/ArrayObservable'); +var isArray_1 = require('../util/isArray'); +var Subscriber_1 = require('../Subscriber'); +var OuterSubscriber_1 = require('../OuterSubscriber'); +var subscribeToResult_1 = require('../util/subscribeToResult'); +var iterator_1 = require('../symbol/iterator'); +/* tslint:enable:max-line-length */ +/** + * @param observables + * @return {Observable} + * @method zip + * @owner Observable + */ +function zip() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i - 0] = arguments[_i]; + } + return function zipOperatorFunction(source) { + return source.lift.call(zipStatic.apply(void 0, [source].concat(observables))); + }; +} +exports.zip = zip; +/* tslint:enable:max-line-length */ +/** + * Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each + * of its input Observables. + * + * If the latest parameter is a function, this function is used to compute the created value from the input values. + * Otherwise, an array of the input values is returned. + * + * @example Combine age and name from different sources + * + * let age$ = Observable.of(27, 25, 29); + * let name$ = Observable.of('Foo', 'Bar', 'Beer'); + * let isDev$ = Observable.of(true, true, false); + * + * Observable + * .zip(age$, + * name$, + * isDev$, + * (age: number, name: string, isDev: boolean) => ({ age, name, isDev })) + * .subscribe(x => console.log(x)); + * + * // outputs + * // { age: 27, name: 'Foo', isDev: true } + * // { age: 25, name: 'Bar', isDev: true } + * // { age: 29, name: 'Beer', isDev: false } + * + * @param observables + * @return {Observable} + * @static true + * @name zip + * @owner Observable + */ +function zipStatic() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i - 0] = arguments[_i]; + } + var project = observables[observables.length - 1]; + if (typeof project === 'function') { + observables.pop(); + } + return new ArrayObservable_1.ArrayObservable(observables).lift(new ZipOperator(project)); +} +exports.zipStatic = zipStatic; +var ZipOperator = (function () { + function ZipOperator(project) { + this.project = project; + } + ZipOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ZipSubscriber(subscriber, this.project)); + }; + return ZipOperator; +}()); +exports.ZipOperator = ZipOperator; +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var ZipSubscriber = (function (_super) { + __extends(ZipSubscriber, _super); + function ZipSubscriber(destination, project, values) { + if (values === void 0) { values = Object.create(null); } + _super.call(this, destination); + this.iterators = []; + this.active = 0; + this.project = (typeof project === 'function') ? project : null; + this.values = values; + } + ZipSubscriber.prototype._next = function (value) { + var iterators = this.iterators; + if (isArray_1.isArray(value)) { + iterators.push(new StaticArrayIterator(value)); + } + else if (typeof value[iterator_1.iterator] === 'function') { + iterators.push(new StaticIterator(value[iterator_1.iterator]())); + } + else { + iterators.push(new ZipBufferIterator(this.destination, this, value)); + } + }; + ZipSubscriber.prototype._complete = function () { + var iterators = this.iterators; + var len = iterators.length; + if (len === 0) { + this.destination.complete(); + return; + } + this.active = len; + for (var i = 0; i < len; i++) { + var iterator = iterators[i]; + if (iterator.stillUnsubscribed) { + this.add(iterator.subscribe(iterator, i)); + } + else { + this.active--; // not an observable + } + } + }; + ZipSubscriber.prototype.notifyInactive = function () { + this.active--; + if (this.active === 0) { + this.destination.complete(); + } + }; + ZipSubscriber.prototype.checkIterators = function () { + var iterators = this.iterators; + var len = iterators.length; + var destination = this.destination; + // abort if not all of them have values + for (var i = 0; i < len; i++) { + var iterator = iterators[i]; + if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) { + return; + } + } + var shouldComplete = false; + var args = []; + for (var i = 0; i < len; i++) { + var iterator = iterators[i]; + var result = iterator.next(); + // check to see if it's completed now that you've gotten + // the next value. + if (iterator.hasCompleted()) { + shouldComplete = true; + } + if (result.done) { + destination.complete(); + return; + } + args.push(result.value); + } + if (this.project) { + this._tryProject(args); + } + else { + destination.next(args); + } + if (shouldComplete) { + destination.complete(); + } + }; + ZipSubscriber.prototype._tryProject = function (args) { + var result; + try { + result = this.project.apply(this, args); + } + catch (err) { + this.destination.error(err); + return; + } + this.destination.next(result); + }; + return ZipSubscriber; +}(Subscriber_1.Subscriber)); +exports.ZipSubscriber = ZipSubscriber; +var StaticIterator = (function () { + function StaticIterator(iterator) { + this.iterator = iterator; + this.nextResult = iterator.next(); + } + StaticIterator.prototype.hasValue = function () { + return true; + }; + StaticIterator.prototype.next = function () { + var result = this.nextResult; + this.nextResult = this.iterator.next(); + return result; + }; + StaticIterator.prototype.hasCompleted = function () { + var nextResult = this.nextResult; + return nextResult && nextResult.done; + }; + return StaticIterator; +}()); +var StaticArrayIterator = (function () { + function StaticArrayIterator(array) { + this.array = array; + this.index = 0; + this.length = 0; + this.length = array.length; + } + StaticArrayIterator.prototype[iterator_1.iterator] = function () { + return this; + }; + StaticArrayIterator.prototype.next = function (value) { + var i = this.index++; + var array = this.array; + return i < this.length ? { value: array[i], done: false } : { value: null, done: true }; + }; + StaticArrayIterator.prototype.hasValue = function () { + return this.array.length > this.index; + }; + StaticArrayIterator.prototype.hasCompleted = function () { + return this.array.length === this.index; + }; + return StaticArrayIterator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var ZipBufferIterator = (function (_super) { + __extends(ZipBufferIterator, _super); + function ZipBufferIterator(destination, parent, observable) { + _super.call(this, destination); + this.parent = parent; + this.observable = observable; + this.stillUnsubscribed = true; + this.buffer = []; + this.isComplete = false; + } + ZipBufferIterator.prototype[iterator_1.iterator] = function () { + return this; + }; + // NOTE: there is actually a name collision here with Subscriber.next and Iterator.next + // this is legit because `next()` will never be called by a subscription in this case. + ZipBufferIterator.prototype.next = function () { + var buffer = this.buffer; + if (buffer.length === 0 && this.isComplete) { + return { value: null, done: true }; + } + else { + return { value: buffer.shift(), done: false }; + } + }; + ZipBufferIterator.prototype.hasValue = function () { + return this.buffer.length > 0; + }; + ZipBufferIterator.prototype.hasCompleted = function () { + return this.buffer.length === 0 && this.isComplete; + }; + ZipBufferIterator.prototype.notifyComplete = function () { + if (this.buffer.length > 0) { + this.isComplete = true; + this.parent.notifyInactive(); + } + else { + this.destination.complete(); + } + }; + ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.buffer.push(innerValue); + this.parent.checkIterators(); + }; + ZipBufferIterator.prototype.subscribe = function (value, index) { + return subscribeToResult_1.subscribeToResult(this, this.observable, this, index); + }; + return ZipBufferIterator; +}(OuterSubscriber_1.OuterSubscriber)); + +},{"../OuterSubscriber":31,"../Subscriber":36,"../observable/ArrayObservable":93,"../symbol/iterator":214,"../util/isArray":226,"../util/subscribeToResult":237}],207:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Subscription_1 = require('../Subscription'); +/** + * A unit of work to be executed in a {@link Scheduler}. An action is typically + * created from within a Scheduler and an RxJS user does not need to concern + * themselves about creating and manipulating an Action. + * + * ```ts + * class Action extends Subscription { + * new (scheduler: Scheduler, work: (state?: T) => void); + * schedule(state?: T, delay: number = 0): Subscription; + * } + * ``` + * + * @class Action + */ +var Action = (function (_super) { + __extends(Action, _super); + function Action(scheduler, work) { + _super.call(this); + } + /** + * Schedules this action on its parent Scheduler for execution. May be passed + * some context object, `state`. May happen at some point in the future, + * according to the `delay` parameter, if specified. + * @param {T} [state] Some contextual data that the `work` function uses when + * called by the Scheduler. + * @param {number} [delay] Time to wait before executing the work, where the + * time unit is implicit and defined by the Scheduler. + * @return {void} + */ + Action.prototype.schedule = function (state, delay) { + if (delay === void 0) { delay = 0; } + return this; + }; + return Action; +}(Subscription_1.Subscription)); +exports.Action = Action; + +},{"../Subscription":37}],208:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var root_1 = require('../util/root'); +var Action_1 = require('./Action'); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var AsyncAction = (function (_super) { + __extends(AsyncAction, _super); + function AsyncAction(scheduler, work) { + _super.call(this, scheduler, work); + this.scheduler = scheduler; + this.work = work; + this.pending = false; + } + AsyncAction.prototype.schedule = function (state, delay) { + if (delay === void 0) { delay = 0; } + if (this.closed) { + return this; + } + // Always replace the current state with the new state. + this.state = state; + // Set the pending flag indicating that this action has been scheduled, or + // has recursively rescheduled itself. + this.pending = true; + var id = this.id; + var scheduler = this.scheduler; + // + // Important implementation note: + // + // Actions only execute once by default, unless rescheduled from within the + // scheduled callback. This allows us to implement single and repeat + // actions via the same code path, without adding API surface area, as well + // as mimic traditional recursion but across asynchronous boundaries. + // + // However, JS runtimes and timers distinguish between intervals achieved by + // serial `setTimeout` calls vs. a single `setInterval` call. An interval of + // serial `setTimeout` calls can be individually delayed, which delays + // scheduling the next `setTimeout`, and so on. `setInterval` attempts to + // guarantee the interval callback will be invoked more precisely to the + // interval period, regardless of load. + // + // Therefore, we use `setInterval` to schedule single and repeat actions. + // If the action reschedules itself with the same delay, the interval is not + // canceled. If the action doesn't reschedule, or reschedules with a + // different delay, the interval will be canceled after scheduled callback + // execution. + // + if (id != null) { + this.id = this.recycleAsyncId(scheduler, id, delay); + } + this.delay = delay; + // If this action has already an async Id, don't request a new one. + this.id = this.id || this.requestAsyncId(scheduler, this.id, delay); + return this; + }; + AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { delay = 0; } + return root_1.root.setInterval(scheduler.flush.bind(scheduler, this), delay); + }; + AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { delay = 0; } + // If this action is rescheduled with the same delay time, don't clear the interval id. + if (delay !== null && this.delay === delay && this.pending === false) { + return id; + } + // Otherwise, if the action's delay time is different from the current delay, + // or the action has been rescheduled before it's executed, clear the interval id + return root_1.root.clearInterval(id) && undefined || undefined; + }; + /** + * Immediately executes this action and the `work` it contains. + * @return {any} + */ + AsyncAction.prototype.execute = function (state, delay) { + if (this.closed) { + return new Error('executing a cancelled action'); + } + this.pending = false; + var error = this._execute(state, delay); + if (error) { + return error; + } + else if (this.pending === false && this.id != null) { + // Dequeue if the action didn't reschedule itself. Don't call + // unsubscribe(), because the action could reschedule later. + // For example: + // ``` + // scheduler.schedule(function doWork(counter) { + // /* ... I'm a busy worker bee ... */ + // var originalAction = this; + // /* wait 100ms before rescheduling the action */ + // setTimeout(function () { + // originalAction.schedule(counter + 1); + // }, 100); + // }, 1000); + // ``` + this.id = this.recycleAsyncId(this.scheduler, this.id, null); + } + }; + AsyncAction.prototype._execute = function (state, delay) { + var errored = false; + var errorValue = undefined; + try { + this.work(state); + } + catch (e) { + errored = true; + errorValue = !!e && e || new Error(e); + } + if (errored) { + this.unsubscribe(); + return errorValue; + } + }; + AsyncAction.prototype._unsubscribe = function () { + var id = this.id; + var scheduler = this.scheduler; + var actions = scheduler.actions; + var index = actions.indexOf(this); + this.work = null; + this.state = null; + this.pending = false; + this.scheduler = null; + if (index !== -1) { + actions.splice(index, 1); + } + if (id != null) { + this.id = this.recycleAsyncId(scheduler, id, null); + } + this.delay = null; + }; + return AsyncAction; +}(Action_1.Action)); +exports.AsyncAction = AsyncAction; + +},{"../util/root":236,"./Action":207}],209:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var Scheduler_1 = require('../Scheduler'); +var AsyncScheduler = (function (_super) { + __extends(AsyncScheduler, _super); + function AsyncScheduler() { + _super.apply(this, arguments); + this.actions = []; + /** + * A flag to indicate whether the Scheduler is currently executing a batch of + * queued actions. + * @type {boolean} + */ + this.active = false; + /** + * An internal ID used to track the latest asynchronous task such as those + * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and + * others. + * @type {any} + */ + this.scheduled = undefined; + } + AsyncScheduler.prototype.flush = function (action) { + var actions = this.actions; + if (this.active) { + actions.push(action); + return; + } + var error; + this.active = true; + do { + if (error = action.execute(action.state, action.delay)) { + break; + } + } while (action = actions.shift()); // exhaust the scheduler queue + this.active = false; + if (error) { + while (action = actions.shift()) { + action.unsubscribe(); + } + throw error; + } + }; + return AsyncScheduler; +}(Scheduler_1.Scheduler)); +exports.AsyncScheduler = AsyncScheduler; + +},{"../Scheduler":33}],210:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var AsyncAction_1 = require('./AsyncAction'); +/** + * We need this JSDoc comment for affecting ESDoc. + * @ignore + * @extends {Ignored} + */ +var QueueAction = (function (_super) { + __extends(QueueAction, _super); + function QueueAction(scheduler, work) { + _super.call(this, scheduler, work); + this.scheduler = scheduler; + this.work = work; + } + QueueAction.prototype.schedule = function (state, delay) { + if (delay === void 0) { delay = 0; } + if (delay > 0) { + return _super.prototype.schedule.call(this, state, delay); + } + this.delay = delay; + this.state = state; + this.scheduler.flush(this); + return this; + }; + QueueAction.prototype.execute = function (state, delay) { + return (delay > 0 || this.closed) ? + _super.prototype.execute.call(this, state, delay) : + this._execute(state, delay); + }; + QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { delay = 0; } + // If delay exists and is greater than 0, or if the delay is null (the + // action wasn't rescheduled) but was originally scheduled as an async + // action, then recycle as an async action. + if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { + return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); + } + // Otherwise flush the scheduler starting with this action. + return scheduler.flush(this); + }; + return QueueAction; +}(AsyncAction_1.AsyncAction)); +exports.QueueAction = QueueAction; + +},{"./AsyncAction":208}],211:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var AsyncScheduler_1 = require('./AsyncScheduler'); +var QueueScheduler = (function (_super) { + __extends(QueueScheduler, _super); + function QueueScheduler() { + _super.apply(this, arguments); + } + return QueueScheduler; +}(AsyncScheduler_1.AsyncScheduler)); +exports.QueueScheduler = QueueScheduler; + +},{"./AsyncScheduler":209}],212:[function(require,module,exports){ +"use strict"; +var AsyncAction_1 = require('./AsyncAction'); +var AsyncScheduler_1 = require('./AsyncScheduler'); +/** + * + * Async Scheduler + * + * Schedule task as if you used setTimeout(task, duration) + * + * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript + * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating + * in intervals. + * + * If you just want to "defer" task, that is to perform it right after currently + * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`), + * better choice will be the {@link asap} scheduler. + * + * @example Use async scheduler to delay task + * const task = () => console.log('it works!'); + * + * Rx.Scheduler.async.schedule(task, 2000); + * + * // After 2 seconds logs: + * // "it works!" + * + * + * @example Use async scheduler to repeat task in intervals + * function task(state) { + * console.log(state); + * this.schedule(state + 1, 1000); // `this` references currently executing Action, + * // which we reschedule with new state and delay + * } + * + * Rx.Scheduler.async.schedule(task, 3000, 0); + * + * // Logs: + * // 0 after 3s + * // 1 after 4s + * // 2 after 5s + * // 3 after 6s + * + * @static true + * @name async + * @owner Scheduler + */ +exports.async = new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction); + +},{"./AsyncAction":208,"./AsyncScheduler":209}],213:[function(require,module,exports){ +"use strict"; +var QueueAction_1 = require('./QueueAction'); +var QueueScheduler_1 = require('./QueueScheduler'); +/** + * + * Queue Scheduler + * + * Put every next task on a queue, instead of executing it immediately + * + * `queue` scheduler, when used with delay, behaves the same as {@link async} scheduler. + * + * When used without delay, it schedules given task synchronously - executes it right when + * it is scheduled. However when called recursively, that is when inside the scheduled task, + * another task is scheduled with queue scheduler, instead of executing immediately as well, + * that task will be put on a queue and wait for current one to finish. + * + * This means that when you execute task with `queue` scheduler, you are sure it will end + * before any other task scheduled with that scheduler will start. + * + * @examples Schedule recursively first, then do something + * + * Rx.Scheduler.queue.schedule(() => { + * Rx.Scheduler.queue.schedule(() => console.log('second')); // will not happen now, but will be put on a queue + * + * console.log('first'); + * }); + * + * // Logs: + * // "first" + * // "second" + * + * + * @example Reschedule itself recursively + * + * Rx.Scheduler.queue.schedule(function(state) { + * if (state !== 0) { + * console.log('before', state); + * this.schedule(state - 1); // `this` references currently executing Action, + * // which we reschedule with new state + * console.log('after', state); + * } + * }, 0, 3); + * + * // In scheduler that runs recursively, you would expect: + * // "before", 3 + * // "before", 2 + * // "before", 1 + * // "after", 1 + * // "after", 2 + * // "after", 3 + * + * // But with queue it logs: + * // "before", 3 + * // "after", 3 + * // "before", 2 + * // "after", 2 + * // "before", 1 + * // "after", 1 + * + * + * @static true + * @name queue + * @owner Scheduler + */ +exports.queue = new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction); + +},{"./QueueAction":210,"./QueueScheduler":211}],214:[function(require,module,exports){ +"use strict"; +var root_1 = require('../util/root'); +function symbolIteratorPonyfill(root) { + var Symbol = root.Symbol; + if (typeof Symbol === 'function') { + if (!Symbol.iterator) { + Symbol.iterator = Symbol('iterator polyfill'); + } + return Symbol.iterator; + } + else { + // [for Mozilla Gecko 27-35:](https://mzl.la/2ewE1zC) + var Set_1 = root.Set; + if (Set_1 && typeof new Set_1()['@@iterator'] === 'function') { + return '@@iterator'; + } + var Map_1 = root.Map; + // required for compatability with es6-shim + if (Map_1) { + var keys = Object.getOwnPropertyNames(Map_1.prototype); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + // according to spec, Map.prototype[@@iterator] and Map.orototype.entries must be equal. + if (key !== 'entries' && key !== 'size' && Map_1.prototype[key] === Map_1.prototype['entries']) { + return key; + } + } + } + return '@@iterator'; + } +} +exports.symbolIteratorPonyfill = symbolIteratorPonyfill; +exports.iterator = symbolIteratorPonyfill(root_1.root); +/** + * @deprecated use iterator instead + */ +exports.$$iterator = exports.iterator; + +},{"../util/root":236}],215:[function(require,module,exports){ +"use strict"; +var root_1 = require('../util/root'); +function getSymbolObservable(context) { + var $$observable; + var Symbol = context.Symbol; + if (typeof Symbol === 'function') { + if (Symbol.observable) { + $$observable = Symbol.observable; + } + else { + $$observable = Symbol('observable'); + Symbol.observable = $$observable; + } + } + else { + $$observable = '@@observable'; + } + return $$observable; +} +exports.getSymbolObservable = getSymbolObservable; +exports.observable = getSymbolObservable(root_1.root); +/** + * @deprecated use observable instead + */ +exports.$$observable = exports.observable; + +},{"../util/root":236}],216:[function(require,module,exports){ +"use strict"; +var root_1 = require('../util/root'); +var Symbol = root_1.root.Symbol; +exports.rxSubscriber = (typeof Symbol === 'function' && typeof Symbol.for === 'function') ? + Symbol.for('rxSubscriber') : '@@rxSubscriber'; +/** + * @deprecated use rxSubscriber instead + */ +exports.$$rxSubscriber = exports.rxSubscriber; + +},{"../util/root":236}],217:[function(require,module,exports){ +"use strict"; +var root_1 = require('./root'); +var RequestAnimationFrameDefinition = (function () { + function RequestAnimationFrameDefinition(root) { + if (root.requestAnimationFrame) { + this.cancelAnimationFrame = root.cancelAnimationFrame.bind(root); + this.requestAnimationFrame = root.requestAnimationFrame.bind(root); + } + else if (root.mozRequestAnimationFrame) { + this.cancelAnimationFrame = root.mozCancelAnimationFrame.bind(root); + this.requestAnimationFrame = root.mozRequestAnimationFrame.bind(root); + } + else if (root.webkitRequestAnimationFrame) { + this.cancelAnimationFrame = root.webkitCancelAnimationFrame.bind(root); + this.requestAnimationFrame = root.webkitRequestAnimationFrame.bind(root); + } + else if (root.msRequestAnimationFrame) { + this.cancelAnimationFrame = root.msCancelAnimationFrame.bind(root); + this.requestAnimationFrame = root.msRequestAnimationFrame.bind(root); + } + else if (root.oRequestAnimationFrame) { + this.cancelAnimationFrame = root.oCancelAnimationFrame.bind(root); + this.requestAnimationFrame = root.oRequestAnimationFrame.bind(root); + } + else { + this.cancelAnimationFrame = root.clearTimeout.bind(root); + this.requestAnimationFrame = function (cb) { return root.setTimeout(cb, 1000 / 60); }; + } + } + return RequestAnimationFrameDefinition; +}()); +exports.RequestAnimationFrameDefinition = RequestAnimationFrameDefinition; +exports.AnimationFrame = new RequestAnimationFrameDefinition(root_1.root); + +},{"./root":236}],218:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +/** + * An error thrown when an element was queried at a certain index of an + * Observable, but no such index or position exists in that sequence. + * + * @see {@link elementAt} + * @see {@link take} + * @see {@link takeLast} + * + * @class ArgumentOutOfRangeError + */ +var ArgumentOutOfRangeError = (function (_super) { + __extends(ArgumentOutOfRangeError, _super); + function ArgumentOutOfRangeError() { + var err = _super.call(this, 'argument out of range'); + this.name = err.name = 'ArgumentOutOfRangeError'; + this.stack = err.stack; + this.message = err.message; + } + return ArgumentOutOfRangeError; +}(Error)); +exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError; + +},{}],219:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +/** + * An error thrown when an Observable or a sequence was queried but has no + * elements. + * + * @see {@link first} + * @see {@link last} + * @see {@link single} + * + * @class EmptyError + */ +var EmptyError = (function (_super) { + __extends(EmptyError, _super); + function EmptyError() { + var err = _super.call(this, 'no elements in sequence'); + this.name = err.name = 'EmptyError'; + this.stack = err.stack; + this.message = err.message; + } + return EmptyError; +}(Error)); +exports.EmptyError = EmptyError; + +},{}],220:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +/** + * An error thrown when an action is invalid because the object has been + * unsubscribed. + * + * @see {@link Subject} + * @see {@link BehaviorSubject} + * + * @class ObjectUnsubscribedError + */ +var ObjectUnsubscribedError = (function (_super) { + __extends(ObjectUnsubscribedError, _super); + function ObjectUnsubscribedError() { + var err = _super.call(this, 'object unsubscribed'); + this.name = err.name = 'ObjectUnsubscribedError'; + this.stack = err.stack; + this.message = err.message; + } + return ObjectUnsubscribedError; +}(Error)); +exports.ObjectUnsubscribedError = ObjectUnsubscribedError; + +},{}],221:[function(require,module,exports){ +"use strict"; +var root_1 = require('./root'); +function minimalSetImpl() { + // THIS IS NOT a full impl of Set, this is just the minimum + // bits of functionality we need for this library. + return (function () { + function MinimalSet() { + this._values = []; + } + MinimalSet.prototype.add = function (value) { + if (!this.has(value)) { + this._values.push(value); + } + }; + MinimalSet.prototype.has = function (value) { + return this._values.indexOf(value) !== -1; + }; + Object.defineProperty(MinimalSet.prototype, "size", { + get: function () { + return this._values.length; + }, + enumerable: true, + configurable: true + }); + MinimalSet.prototype.clear = function () { + this._values.length = 0; + }; + return MinimalSet; + }()); +} +exports.minimalSetImpl = minimalSetImpl; +exports.Set = root_1.root.Set || minimalSetImpl(); + +},{"./root":236}],222:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +/** + * An error thrown when duetime elapses. + * + * @see {@link timeout} + * + * @class TimeoutError + */ +var TimeoutError = (function (_super) { + __extends(TimeoutError, _super); + function TimeoutError() { + var err = _super.call(this, 'Timeout has occurred'); + this.name = err.name = 'TimeoutError'; + this.stack = err.stack; + this.message = err.message; + } + return TimeoutError; +}(Error)); +exports.TimeoutError = TimeoutError; + +},{}],223:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +/** + * An error thrown when one or more errors have occurred during the + * `unsubscribe` of a {@link Subscription}. + */ +var UnsubscriptionError = (function (_super) { + __extends(UnsubscriptionError, _super); + function UnsubscriptionError(errors) { + _super.call(this); + this.errors = errors; + var err = Error.call(this, errors ? + errors.length + " errors occurred during unsubscription:\n " + errors.map(function (err, i) { return ((i + 1) + ") " + err.toString()); }).join('\n ') : ''); + this.name = err.name = 'UnsubscriptionError'; + this.stack = err.stack; + this.message = err.message; } return UnsubscriptionError; }(Error)); exports.UnsubscriptionError = UnsubscriptionError; -},{}],163:[function(require,module,exports){ +},{}],224:[function(require,module,exports){ "use strict"; // typeof any so that it we don't have to cast when comparing a result to the error object exports.errorObject = { e: {} }; -},{}],164:[function(require,module,exports){ +},{}],225:[function(require,module,exports){ +"use strict"; +function identity(x) { + return x; +} +exports.identity = identity; + +},{}],226:[function(require,module,exports){ "use strict"; exports.isArray = Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); -},{}],165:[function(require,module,exports){ +},{}],227:[function(require,module,exports){ "use strict"; exports.isArrayLike = (function (x) { return x && typeof x.length === 'number'; }); -},{}],166:[function(require,module,exports){ +},{}],228:[function(require,module,exports){ "use strict"; function isDate(value) { return value instanceof Date && !isNaN(+value); } exports.isDate = isDate; -},{}],167:[function(require,module,exports){ +},{}],229:[function(require,module,exports){ "use strict"; function isFunction(x) { return typeof x === 'function'; } exports.isFunction = isFunction; -},{}],168:[function(require,module,exports){ +},{}],230:[function(require,module,exports){ "use strict"; var isArray_1 = require('../util/isArray'); function isNumeric(val) { @@ -13392,28 +16173,60 @@ function isNumeric(val) { exports.isNumeric = isNumeric; ; -},{"../util/isArray":164}],169:[function(require,module,exports){ +},{"../util/isArray":226}],231:[function(require,module,exports){ "use strict"; function isObject(x) { return x != null && typeof x === 'object'; } exports.isObject = isObject; -},{}],170:[function(require,module,exports){ +},{}],232:[function(require,module,exports){ "use strict"; function isPromise(value) { return value && typeof value.subscribe !== 'function' && typeof value.then === 'function'; } exports.isPromise = isPromise; -},{}],171:[function(require,module,exports){ +},{}],233:[function(require,module,exports){ "use strict"; function isScheduler(value) { return value && typeof value.schedule === 'function'; } exports.isScheduler = isScheduler; -},{}],172:[function(require,module,exports){ +},{}],234:[function(require,module,exports){ +"use strict"; +/* tslint:disable:no-empty */ +function noop() { } +exports.noop = noop; + +},{}],235:[function(require,module,exports){ +"use strict"; +var noop_1 = require('./noop'); +/* tslint:enable:max-line-length */ +function pipe() { + var fns = []; + for (var _i = 0; _i < arguments.length; _i++) { + fns[_i - 0] = arguments[_i]; + } + return pipeFromArray(fns); +} +exports.pipe = pipe; +/* @internal */ +function pipeFromArray(fns) { + if (!fns) { + return noop_1.noop; + } + if (fns.length === 1) { + return fns[0]; + } + return function piped(input) { + return fns.reduce(function (prev, fn) { return fn(prev); }, input); + }; +} +exports.pipeFromArray = pipeFromArray; + +},{"./noop":234}],236:[function(require,module,exports){ (function (global){ "use strict"; // CommonJS / Node have global context exposed as "global" variable. @@ -13436,7 +16249,7 @@ exports.root = _root; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],173:[function(require,module,exports){ +},{}],237:[function(require,module,exports){ "use strict"; var root_1 = require('./root'); var isArrayLike_1 = require('./isArrayLike'); @@ -13458,6 +16271,7 @@ function subscribeToResult(outerSubscriber, result, outerValue, outerIndex) { return null; } else { + destination.syncErrorThrowable = true; return result.subscribe(destination); } } @@ -13515,7 +16329,7 @@ function subscribeToResult(outerSubscriber, result, outerValue, outerIndex) { } exports.subscribeToResult = subscribeToResult; -},{"../InnerSubscriber":27,"../Observable":29,"../symbol/iterator":154,"../symbol/observable":155,"./isArrayLike":165,"./isObject":169,"./isPromise":170,"./root":172}],174:[function(require,module,exports){ +},{"../InnerSubscriber":27,"../Observable":29,"../symbol/iterator":214,"../symbol/observable":215,"./isArrayLike":227,"./isObject":231,"./isPromise":232,"./root":236}],238:[function(require,module,exports){ "use strict"; var Subscriber_1 = require('../Subscriber'); var rxSubscriber_1 = require('../symbol/rxSubscriber'); @@ -13536,7 +16350,7 @@ function toSubscriber(nextOrObserver, error, complete) { } exports.toSubscriber = toSubscriber; -},{"../Observer":30,"../Subscriber":36,"../symbol/rxSubscriber":156}],175:[function(require,module,exports){ +},{"../Observer":30,"../Subscriber":36,"../symbol/rxSubscriber":216}],239:[function(require,module,exports){ "use strict"; var errorObject_1 = require('./errorObject'); var tryCatchTarget; @@ -13556,874 +16370,907 @@ function tryCatch(fn) { exports.tryCatch = tryCatch; ; -},{"./errorObject":163}],176:[function(require,module,exports){ +},{"./errorObject":224}],240:[function(require,module,exports){ // threejs.org/license -(function(l,sa){"object"===typeof exports&&"undefined"!==typeof module?sa(exports):"function"===typeof define&&define.amd?define(["exports"],sa):sa(l.THREE=l.THREE||{})})(this,function(l){function sa(){}function D(a,b){this.x=a||0;this.y=b||0}function X(a,b,c,d,e,f,g,h,k,m){Object.defineProperty(this,"id",{value:jf++});this.uuid=Y.generateUUID();this.name="";this.image=void 0!==a?a:X.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:X.DEFAULT_MAPPING;this.wrapS=void 0!==c?c:1001;this.wrapT= -void 0!==d?d:1001;this.magFilter=void 0!==e?e:1006;this.minFilter=void 0!==f?f:1008;this.anisotropy=void 0!==k?k:1;this.format=void 0!==g?g:1023;this.type=void 0!==h?h:1009;this.offset=new D(0,0);this.repeat=new D(1,1);this.generateMipmaps=!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.encoding=void 0!==m?m:3E3;this.version=0;this.onUpdate=null}function ga(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function Db(a,b,c){this.uuid=Y.generateUUID();this.width= -a;this.height=b;this.scissor=new ga(0,0,a,b);this.scissorTest=!1;this.viewport=new ga(0,0,a,b);c=c||{};void 0===c.minFilter&&(c.minFilter=1006);this.texture=new X(void 0,void 0,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,c.encoding);this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.depthTexture=void 0!==c.depthTexture?c.depthTexture:null}function Eb(a,b,c){Db.call(this,a,b,c);this.activeMipMapLevel= -this.activeCubeFace=0}function qa(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function p(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}function J(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0=d||0 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"].join("\n")); -w.compileShader(P);w.compileShader(K);w.attachShader(ja,P);w.attachShader(ja,K);w.linkProgram(ja);F=ja;x=w.getAttribLocation(F,"position");v=w.getAttribLocation(F,"uv");c=w.getUniformLocation(F,"uvOffset");d=w.getUniformLocation(F,"uvScale");e=w.getUniformLocation(F,"rotation");f=w.getUniformLocation(F,"scale");g=w.getUniformLocation(F,"color");h=w.getUniformLocation(F,"map");k=w.getUniformLocation(F,"opacity");m=w.getUniformLocation(F,"modelViewMatrix");u=w.getUniformLocation(F,"projectionMatrix"); -q=w.getUniformLocation(F,"fogType");n=w.getUniformLocation(F,"fogDensity");r=w.getUniformLocation(F,"fogNear");l=w.getUniformLocation(F,"fogFar");t=w.getUniformLocation(F,"fogColor");y=w.getUniformLocation(F,"alphaTest");ja=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");ja.width=8;ja.height=8;P=ja.getContext("2d");P.fillStyle="white";P.fillRect(0,0,8,8);aa=new X(ja);aa.needsUpdate=!0}w.useProgram(F);O.initAttributes();O.enableAttribute(x);O.enableAttribute(v);O.disableUnusedAttributes(); -O.disable(w.CULL_FACE);O.enable(w.BLEND);w.bindBuffer(w.ARRAY_BUFFER,S);w.vertexAttribPointer(x,2,w.FLOAT,!1,16,0);w.vertexAttribPointer(v,2,w.FLOAT,!1,16,8);w.bindBuffer(w.ELEMENT_ARRAY_BUFFER,E);w.uniformMatrix4fv(u,!1,Gb.projectionMatrix.elements);O.activeTexture(w.TEXTURE0);w.uniform1i(h,0);P=ja=0;(K=p.fog)?(w.uniform3f(t,K.color.r,K.color.g,K.color.b),K.isFog?(w.uniform1f(r,K.near),w.uniform1f(l,K.far),w.uniform1i(q,1),P=ja=1):K.isFogExp2&&(w.uniform1f(n,K.density),w.uniform1i(q,2),P=ja=2)): -(w.uniform1i(q,0),P=ja=0);for(var K=0,W=b.length;Kb&&(b=a[c]);return b}function M(){Object.defineProperty(this,"id",{value:Td++});this.uuid=Y.generateUUID();this.name="";this.type="Geometry";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate= -this.colorsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function I(){Object.defineProperty(this,"id",{value:Td++});this.uuid=Y.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity}}function Ca(a,b){B.call(this);this.type="Mesh";this.geometry=void 0!==a?a:new I;this.material=void 0!==b? -b:new Na({color:16777215*Math.random()});this.drawMode=0;this.updateMorphTargets()}function Ib(a,b,c,d,e,f){M.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};this.fromBufferGeometry(new kb(a,b,c,d,e,f));this.mergeVertices()}function kb(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,l,S,E,F){var aa=f/S,R=g/E,ca=f/2,la=g/2,D=l/2;g=S+1;var C=E+1,B=f=0,P,K,W=new p;for(K=0;K/gm,function(a,c){var d=U[c]; -if(void 0===d)throw Error("Can not resolve #include <"+c+">");return Vd(d)})}function Oe(a){return a.replace(/for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(a,c,d,e){a="";for(c=parseInt(c);cb||a.height>b){var c=b/Math.max(a.width,a.height),d=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");d.width=Math.floor(a.width*c);d.height=Math.floor(a.height*c);d.getContext("2d").drawImage(a,0,0,a.width,a.height,0,0,d.width,d.height);console.warn("THREE.WebGLRenderer: image is too big ("+ -a.width+"x"+a.height+"). Resized to "+d.width+"x"+d.height,a);return d}return a}function k(a){return Y.isPowerOfTwo(a.width)&&Y.isPowerOfTwo(a.height)}function m(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function u(b){b=b.target;b.removeEventListener("dispose",u);a:{var c=d.get(b);if(b.image&&c.__image__webglTextureCube)a.deleteTexture(c.__image__webglTextureCube);else{if(void 0===c.__webglInit)break a;a.deleteTexture(c.__webglTexture)}d.remove(b)}g.textures--}function q(b){b=b.target; -b.removeEventListener("dispose",q);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b.isWebGLRenderTargetCube)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer);d.remove(b.texture);d.remove(b)}g.textures--}function n(b, -m){var n=d.get(b);if(0z;z++)t[z]=q||l?l?b.image[z].image:b.image[z]:h(b.image[z],e.maxCubemapSize);var p=k(t[0]),y=f(b.format),R=f(b.type);r(a.TEXTURE_CUBE_MAP,b,p);for(z=0;6>z;z++)if(q)for(var ca,la=t[z].mipmaps,D=0,B=la.length;Du;u++)e.__webglFramebuffer[u]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);r(a.TEXTURE_CUBE_MAP,b.texture,m);for(u=0;6>u;u++)l(e.__webglFramebuffer[u], -b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+u);b.texture.generateMipmaps&&m&&a.generateMipmap(a.TEXTURE_CUBE_MAP);c.bindTexture(a.TEXTURE_CUBE_MAP,null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),r(a.TEXTURE_2D,b.texture,m),l(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),b.texture.generateMipmaps&&m&&a.generateMipmap(a.TEXTURE_2D),c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=!0===b.isWebGLRenderTargetCube;if(b.depthTexture){if(f)throw Error("target.depthTexture not supported in Cube render targets"); -if(b&&b.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported!");a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate= -!0);n(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.TEXTURE_2D,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.TEXTURE_2D,e,0);else throw Error("Unknown depthTexture format");}else if(f)for(e.__webglDepthbuffer=[],f=0;6>f;f++)a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer[f]),e.__webglDepthbuffer[f]=a.createRenderbuffer(),t(e.__webglDepthbuffer[f], -b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),t(e.__webglDepthbuffer,b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture;e.generateMipmaps&&k(b)&&1003!==e.minFilter&&1006!==e.minFilter&&(b=b&&b.isWebGLRenderTargetCube?a.TEXTURE_CUBE_MAP:a.TEXTURE_2D,e=d.get(e).__webglTexture,c.bindTexture(b,e),a.generateMipmap(b),c.bindTexture(b,null))}}function eg(){var a={};return{get:function(b){b=b.uuid; -var c=a[b];void 0===c&&(c={},a[b]=c);return c},remove:function(b){delete a[b.uuid]},clear:function(){a={}}}}function fg(a,b,c){function d(b,c,d){var e=new Uint8Array(4),f=a.createTexture();a.bindTexture(b,f);a.texParameteri(b,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(b,a.TEXTURE_MAG_FILTER,a.NEAREST);for(b=0;b=na.maxTextures&&console.warn("WebGLRenderer: trying to use "+a+" texture units while this GPU supports only "+na.maxTextures);U+=1;return a};this.setTexture2D=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTarget&&(a||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."), -a=!0),b=b.texture);sa.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),a=!0);sa.setTexture2D(b,c)}}();this.setTextureCube=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTargetCube&&(a||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&& -6===b.image.length?sa.setTextureCube(b,c):sa.setTextureCubeDynamic(b,c)}}();this.getRenderTarget=function(){return P};this.setRenderTarget=function(a){(P=a)&&void 0===ia.get(a).__webglFramebuffer&&sa.setupRenderTarget(a);var b=a&&a.isWebGLRenderTargetCube,c;a?(c=ia.get(a),c=b?c.__webglFramebuffer[a.activeCubeFace]:c.__webglFramebuffer,Q.copy(a.scissor),L=a.scissorTest,Z.copy(a.viewport)):(c=null,Q.copy(ha).multiplyScalar(ka),L=Pe,Z.copy(zc).multiplyScalar(ka));K!==c&&(A.bindFramebuffer(A.FRAMEBUFFER, -c),K=c);fa.scissor(Q);fa.setScissorTest(L);fa.viewport(Z);b&&(b=ia.get(a.texture),A.framebufferTexture2D(A.FRAMEBUFFER,A.COLOR_ATTACHMENT0,A.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,b.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=function(a,b,c,d,e,f){if(!1===(a&&a.isWebGLRenderTarget))console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");else{var g=ia.get(a).__webglFramebuffer;if(g){var h=!1;g!==K&&(A.bindFramebuffer(A.FRAMEBUFFER, -g),h=!0);try{var k=a.texture,m=k.format,n=k.type;1023!==m&&y(m)!==A.getParameter(A.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===n||y(n)===A.getParameter(A.IMPLEMENTATION_COLOR_READ_TYPE)||1015===n&&(pa.get("OES_texture_float")||pa.get("WEBGL_color_buffer_float"))||1016===n&&pa.get("EXT_color_buffer_half_float")?A.checkFramebufferStatus(A.FRAMEBUFFER)===A.FRAMEBUFFER_COMPLETE?0<=b&& -b<=a.width-d&&0<=c&&c<=a.height-e&&A.readPixels(b,c,d,e,y(m),y(n),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{h&&A.bindFramebuffer(A.FRAMEBUFFER,K)}}}}}function Kb(a,b){this.name="";this.color=new H(a);this.density=void 0!==b?b:2.5E-4}function Lb(a,b,c){this.name="";this.color= -new H(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function md(){B.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function Yd(a,b,c,d,e){B.call(this);this.lensFlares=[];this.positionScreen=new p;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)}function cb(a){Z.call(this);this.type="SpriteMaterial";this.color=new H(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}function Ac(a){B.call(this); -this.type="Sprite";this.material=void 0!==a?a:new cb}function Bc(){B.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function Cc(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else{console.warn("THREE.Skeleton boneInverses is the wrong length.");this.boneInverses=[];for(var c=0,d=this.bones.length;c=a.HAVE_CURRENT_DATA&&(u.needsUpdate=!0)}X.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1;var u=this;m()}function Nb(a,b,c,d,e,f,g,h,k,m,u,q){X.call(this,null,f,g,h,k,m,d,e,u,q);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function rd(a,b,c,d,e,f,g,h,k){X.call(this,a, -b,c,d,e,f,g,h,k);this.needsUpdate=!0}function Ec(a,b,c,d,e,f,g,h,k,m){m=void 0!==m?m:1026;if(1026!==m&&1027!==m)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===c&&1026===m&&(c=1012);void 0===c&&1027===m&&(c=1020);X.call(this,null,d,e,f,g,h,m,c,k);this.image={width:a,height:b};this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!==h?h:1003;this.generateMipmaps=this.flipY=!1}function Ob(a){I.call(this);this.type="WireframeGeometry";var b=[], -c,d,e,f,g=[0,0],h={},k,m,u=["a","b","c"];if(a&&a.isGeometry){var q=a.faces;c=0;for(e=q.length;cd;d++)k=n[u[d]],m=n[u[(d+1)%3]],g[0]=Math.min(k,m),g[1]=Math.max(k,m),k=g[0]+","+g[1],void 0===h[k]&&(h[k]={index1:g[0],index2:g[1]})}for(k in h)c=h[k],u=a.vertices[c.index1],b.push(u.x,u.y,u.z),u=a.vertices[c.index2],b.push(u.x,u.y,u.z)}else if(a&&a.isBufferGeometry){var r,u=new p;if(null!==a.index){q=a.attributes.position;n=a.index;r=a.groups;0===r.length&&(r=[{start:0,count:n.count, -materialIndex:0}]);a=0;for(f=r.length;ad;d++)k=n.getX(c+d),m=n.getX(c+(d+1)%3),g[0]=Math.min(k,m),g[1]=Math.max(k,m),k=g[0]+","+g[1],void 0===h[k]&&(h[k]={index1:g[0],index2:g[1]});for(k in h)c=h[k],u.fromBufferAttribute(q,c.index1),b.push(u.x,u.y,u.z),u.fromBufferAttribute(q,c.index2),b.push(u.x,u.y,u.z)}else for(q=a.attributes.position,c=0,e=q.count/3;cd;d++)h=3*c+d,u.fromBufferAttribute(q,h),b.push(u.x,u.y,u.z), -h=3*c+(d+1)%3,u.fromBufferAttribute(q,h),b.push(u.x,u.y,u.z)}this.addAttribute("position",new C(b,3))}function Fc(a,b,c){M.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Pb(a,b,c));this.mergeVertices()}function Pb(a,b,c){I.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=new p,k=new p,m=new p,u=new p,q=new p,n,r,l=b+1;for(n=0;n<=c;n++){var t=n/c;for(r=0;r<=b;r++){var y= -r/b,k=a(y,t,k);e.push(k.x,k.y,k.z);0<=y-1E-5?(m=a(y-1E-5,t,m),u.subVectors(k,m)):(m=a(y+1E-5,t,m),u.subVectors(m,k));0<=t-1E-5?(m=a(y,t-1E-5,m),q.subVectors(k,m)):(m=a(y,t+1E-5,m),q.subVectors(m,k));h.crossVectors(u,q).normalize();f.push(h.x,h.y,h.z);g.push(y,t)}}for(n=0;nd&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}I.call(this);this.type="PolyhedronBufferGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};c=c||1;var h=[],k=[];(function(a){for(var c= -new p,d=new p,g=new p,h=0;he&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute("position",new C(h,3));this.addAttribute("normal",new C(h.slice(),3));this.addAttribute("uv",new C(k,2));this.normalizeNormals()}function Hc(a,b){M.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Qb(a,b)); -this.mergeVertices()}function Qb(a,b){ia.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b);this.type="TetrahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Ic(a,b){M.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new mb(a,b));this.mergeVertices()}function mb(a,b){ia.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b);this.type="OctahedronBufferGeometry"; -this.parameters={radius:a,detail:b}}function Jc(a,b){M.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Rb(a,b));this.mergeVertices()}function Rb(a,b){var c=(1+Math.sqrt(5))/2;ia.call(this,[-1,c,0,1,c,0,-1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b);this.type="IcosahedronBufferGeometry"; -this.parameters={radius:a,detail:b}}function Kc(a,b){M.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Sb(a,b));this.mergeVertices()}function Sb(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;ia.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18, -0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Lc(a,b,c,d,e,f){M.call(this);this.type="TubeGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};void 0!==f&&console.warn("THREE.TubeGeometry: taper has been removed.");a=new Tb(a,b,c,d,e);this.tangents=a.tangents; -this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Tb(a,b,c,d,e){function f(e){var f=a.getPointAt(e/b),m=g.normals[e];e=g.binormals[e];for(q=0;q<=d;q++){var u=q/d*Math.PI*2,t=Math.sin(u),u=-Math.cos(u);k.x=u*m.x+t*e.x;k.y=u*m.y+t*e.y;k.z=u*m.z+t*e.z;k.normalize();l.push(k.x,k.y,k.z);h.x=f.x+c*k.x;h.y=f.y+c*k.y;h.z=f.z+c*k.z;n.push(h.x,h.y,h.z)}}I.call(this);this.type="TubeBufferGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d, -closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new p,k=new p,m=new D,u,q,n=[],l=[],z=[],t=[];for(u=0;up;p++)g=r[k[p]],h=r[k[(p+1)%3]],e[0]=Math.min(g,h),e[1]=Math.max(g,h),g=e[0]+","+e[1],void 0=== -f[g]?f[g]={index1:e[0],index2:e[1],face1:l,face2:void 0}:f[g].face2=l;for(g in f)if(e=f[g],void 0===e.face2||m[e.face1].normal.dot(m[e.face2].normal)<=d)k=u[e.index1],c.push(k.x,k.y,k.z),k=u[e.index2],c.push(k.x,k.y,k.z);this.addAttribute("position",new C(c,3))}function ob(a,b,c,d,e,f,g,h){M.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new Wa(a,b,c,d,e, -f,g,h));this.mergeVertices()}function Wa(a,b,c,d,e,f,g,h){function k(c){var e,f,k,t=new D,E=new p,F=0,aa=!0===c?a:b,R=!0===c?1:-1;f=z;for(e=1;e<=d;e++)l.push(0,y*R,0),n.push(0,R,0),r.push(.5,.5),z++;k=z;for(e=0;e<=d;e++){var C=e/d*h+g,B=Math.cos(C),C=Math.sin(C);E.x=aa*C;E.y=y*R;E.z=aa*B;l.push(E.x,E.y,E.z);n.push(0,R,0);t.x=.5*B+.5;t.y=.5*C*R+.5;r.push(t.x,t.y);z++}for(e=0;ethis.duration&&this.resetDuration();this.optimize()}function Hd(a){this.manager=void 0!==a?a:Aa;this.textures={}}function be(a){this.manager=void 0!==a?a:Aa}function gc(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}function ce(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!== -a?a:Aa;this.withCredentials=!1}function Re(a){this.manager=void 0!==a?a:Aa;this.texturePath=""}function Se(a,b,c,d,e){b=.5*(d-b);e=.5*(e-c);var f=a*a;return(2*c-2*d+b+e)*a*f+(-3*c+3*d-2*b-e)*f+b*a+c}function xb(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function yb(a,b,c,d,e){var f=1-a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}function na(){this.arcLengthDivisions=200}function Sa(a,b){this.arcLengthDivisions=200;this.v1=a;this.v2=b}function Yc(){this.arcLengthDivisions=200;this.curves= -[];this.autoClose=!1}function Xa(a,b,c,d,e,f,g,h){this.arcLengthDivisions=200;this.aX=a;this.aY=b;this.xRadius=c;this.yRadius=d;this.aStartAngle=e;this.aEndAngle=f;this.aClockwise=g;this.aRotation=h||0}function zb(a){this.arcLengthDivisions=200;this.points=void 0===a?[]:a}function hc(a,b,c,d){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c;this.v3=d}function ic(a,b,c){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c}function Zc(a){Yc.call(this);this.currentPoint=new D;a&&this.fromPoints(a)} -function Ab(){Zc.apply(this,arguments);this.holes=[]}function de(){this.subPaths=[];this.currentPath=null}function ee(a){this.data=a}function Te(a){this.manager=void 0!==a?a:Aa}function fe(a){this.manager=void 0!==a?a:Aa}function Ue(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new xa;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new xa;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1}function Id(a,b,c){B.call(this);this.type="CubeCamera"; -var d=new xa(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new p(1,0,0));this.add(d);var e=new xa(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new p(-1,0,0));this.add(e);var f=new xa(90,1,a,b);f.up.set(0,0,1);f.lookAt(new p(0,1,0));this.add(f);var g=new xa(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new p(0,-1,0));this.add(g);var h=new xa(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new p(0,0,1));this.add(h);var k=new xa(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new p(0,0,-1));this.add(k);this.renderTarget=new Eb(c,c,{format:1022,magFilter:1006, -minFilter:1006});this.renderTarget.texture.name="CubeCamera";this.updateCubeMap=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,n=c.texture.generateMipmaps;c.texture.generateMipmaps=!1;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.texture.generateMipmaps=n;c.activeCubeFace=5;a.render(b,k,c);a.setRenderTarget(null)}}function ge(a){xa.call(this); -this.enabled=!1;this.cameras=a||[]}function he(){B.call(this);this.type="AudioListener";this.context=ie.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function jc(a){B.call(this);this.type="Audio";this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.loop=!1;this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty"; -this.filters=[]}function je(a){jc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function ke(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function le(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case "quaternion":b=this._slerp;break;case "string":case "bool":a=Array;b=this._select;break;default:b=this._lerp}this.buffer= -new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function Ve(a,b,c){c=c||oa.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function oa(a,b,c){this.path=b;this.parsedPath=c||oa.parseTrackName(b);this.node=oa.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function We(a){this.uuid=Y.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var b={};this._indicesByUUID=b;for(var c=0,d=arguments.length;c!== -d;++c)b[arguments[c].uuid]=c;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var e=this;this.stats={objects:{get total(){return e._objects.length},get inUse(){return this.total-e.nCachedObjects_}},get bindingsPerObject(){return e._bindings.length}}}function Xe(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings= -d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function Ye(a){this._root=a;this._initMemoryManager(); -this.time=this._accuIndex=0;this.timeScale=1}function Jd(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function me(){I.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function ne(a,b,c,d){this.uuid=Y.generateUUID();this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function kc(a,b){this.uuid=Y.generateUUID();this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange= -{offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function oe(a,b,c){kc.call(this,a,b);this.meshPerAttribute=c||1}function pe(a,b,c){L.call(this,a,b);this.meshPerAttribute=c||1}function Ze(a,b,c,d){this.ray=new hb(a,b);this.near=c||0;this.far=d||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})} -function $e(a,b){return a.distance-b.distance}function qe(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=a.length;dc;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,Math.cos(f),Math.sin(f),1)}a.addAttribute("position",new C(b,3));b=new ha({fog:!1});this.cone=new da(a,b);this.add(this.cone); -this.update()}function mc(a){this.bones=this.getBoneList(a);for(var b=new I,c=[],d=[],e=new H(0,0,1),f=new H(0,1,0),g=0;ga?-1:0e;e++)8===e||13===e||18===e||23===e?b[e]="-":14===e?b[e]="4":(2>=c&&(c=33554432+16777216*Math.random()|0),d=c&15,c>>=4,b[e]=a[19===e?d&3|8:d]);return b.join("")}}(),clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c- -b)},lerp:function(a,b,c){return(1-c)*a+c*b},smoothstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},degToRad:function(a){return a*Y.DEG2RAD},radToDeg:function(a){return a*Y.RAD2DEG}, -isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a},nearestPowerOfTwo:function(a){return Math.pow(2,Math.round(Math.log(a)/Math.LN2))},nextPowerOfTwo:function(a){a--;a|=a>>1;a|=a>>2;a|=a>>4;a|=a>>8;a|=a>>16;a++;return a}};Object.defineProperties(D.prototype,{width:{get:function(){return this.x},set:function(a){this.x=a}},height:{get:function(){return this.y},set:function(a){this.y=a}}});Object.assign(D.prototype,{isVector2:!0,set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y= -this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a, -b){if(void 0!==b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), -this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},max:function(a){this.x= -Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a=new D,b=new D;return function(c,d){a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.multiplyScalar(Math.max(a,Math.min(b,c))/c)},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){this.x=Math.ceil(this.x); -this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},lengthManhattan:function(){return Math.abs(this.x)+ -Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length())},angle:function(){var a=Math.atan2(this.y,this.x);0>a&&(a+=2*Math.PI);return a},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.multiplyScalar(a/this.length())},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+= +(function(m,ja){"object"===typeof exports&&"undefined"!==typeof module?ja(exports):"function"===typeof define&&define.amd?define(["exports"],ja):ja(m.THREE=m.THREE||{})})(this,function(m){function ja(){}function C(a,b){this.x=a||0;this.y=b||0}function K(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0=d||0 0 ) {\n\t\tfloat fogFactor = 0.0;\n\t\tif ( fogType == 1 ) {\n\t\t\tfogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t\t} else {\n\t\t\tconst float LOG2 = 1.442695;\n\t\t\tfogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );\n\t\t\tfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n\t\t}\n\t\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n\t}\n}"].join("\n")); +b.compileShader(y);b.compileShader(Y);b.attachShader(M,y);b.attachShader(M,Y);b.linkProgram(M);ha=M;B=b.getAttribLocation(ha,"position");J=b.getAttribLocation(ha,"uv");f=b.getUniformLocation(ha,"uvOffset");g=b.getUniformLocation(ha,"uvScale");h=b.getUniformLocation(ha,"rotation");k=b.getUniformLocation(ha,"scale");l=b.getUniformLocation(ha,"color");q=b.getUniformLocation(ha,"map");n=b.getUniformLocation(ha,"opacity");t=b.getUniformLocation(ha,"modelViewMatrix");r=b.getUniformLocation(ha,"projectionMatrix"); +m=b.getUniformLocation(ha,"fogType");v=b.getUniformLocation(ha,"fogDensity");w=b.getUniformLocation(ha,"fogNear");x=b.getUniformLocation(ha,"fogFar");z=b.getUniformLocation(ha,"fogColor");b.getUniformLocation(ha,"fogDepth");I=b.getUniformLocation(ha,"alphaTest");M=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");M.width=8;M.height=8;y=M.getContext("2d");y.fillStyle="white";y.fillRect(0,0,8,8);He=new tc(M)}c.useProgram(ha);c.initAttributes();c.enableAttribute(B);c.enableAttribute(J); +c.disableUnusedAttributes();c.disable(b.CULL_FACE);c.enable(b.BLEND);b.bindBuffer(b.ARRAY_BUFFER,za);b.vertexAttribPointer(B,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(J,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,la);b.uniformMatrix4fv(r,!1,V.projectionMatrix.elements);c.activeTexture(b.TEXTURE0);b.uniform1i(q,0);y=M=0;(Y=p.fog)?(b.uniform3f(z,Y.color.r,Y.color.g,Y.color.b),Y.isFog?(b.uniform1f(w,Y.near),b.uniform1f(x,Y.far),b.uniform1i(m,1),y=M=1):Y.isFogExp2&&(b.uniform1f(v,Y.density), +b.uniform1i(m,2),y=M=2)):(b.uniform1i(m,0),y=M=0);for(var A=0,ua=u.length;Ab&&(b=a[c]);return b}function D(){Object.defineProperty(this,"id",{value:Pf+=2});this.uuid=R.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes= +{};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity}}function Lb(a,b,c,d,e,f){N.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};this.fromBufferGeometry(new jb(a,b,c,d,e,f));this.mergeVertices()}function jb(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,m,ta,za,la){var z=f/ta,u=g/za,v=f/2,w=g/2,I=m/2;g=ta+1;var B=za+1,x=f=0,J,y,C=new p;for(y=0;yl;l++){if(n=d[l])if(h=n[0],n=n[1]){q&&e.addAttribute("morphTarget"+l,q[h]);f&&e.addAttribute("morphNormal"+l,f[h]);c[l]=n;continue}c[l]=0}g.getUniforms().setValue(a,"morphTargetInfluences",c)}}}function Xf(a,b,c){var d,e,f;this.setMode=function(a){d= +a};this.setIndex=function(a){e=a.type;f=a.bytesPerElement};this.render=function(b,h){a.drawElements(d,h,e,b*f);c.calls++;c.vertices+=h;d===a.TRIANGLES?c.faces+=h/3:d===a.POINTS&&(c.points+=h)};this.renderInstances=function(g,h,k){var l=b.get("ANGLE_instanced_arrays");null===l?console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."):(l.drawElementsInstancedANGLE(d,k,e,h*f,g.maxInstancedCount),c.calls++,c.vertices+= +k*g.maxInstancedCount,d===a.TRIANGLES?c.faces+=g.maxInstancedCount*k/3:d===a.POINTS&&(c.points+=g.maxInstancedCount*k))}}function Yf(a,b,c){var d;this.setMode=function(a){d=a};this.render=function(b,f){a.drawArrays(d,b,f);c.calls++;c.vertices+=f;d===a.TRIANGLES?c.faces+=f/3:d===a.POINTS&&(c.points+=f)};this.renderInstances=function(e,f,g){var h=b.get("ANGLE_instanced_arrays");if(null===h)console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."); +else{var k=e.attributes.position;k.isInterleavedBufferAttribute?(g=k.data.count,h.drawArraysInstancedANGLE(d,0,g,e.maxInstancedCount)):h.drawArraysInstancedANGLE(d,f,g,e.maxInstancedCount);c.calls++;c.vertices+=g*e.maxInstancedCount;d===a.TRIANGLES?c.faces+=e.maxInstancedCount*g/3:d===a.POINTS&&(c.points+=e.maxInstancedCount*g)}}}function Zf(a,b,c){function d(a){a=a.target;var g=e[a.id];null!==g.index&&b.remove(g.index);for(var k in g.attributes)b.remove(g.attributes[k]);a.removeEventListener("dispose", +d);delete e[a.id];if(k=f[a.id])b.remove(k),delete f[a.id];if(k=f[g.id])b.remove(k),delete f[g.id];c.geometries--}var e={},f={};return{get:function(a,b){var f=e[b.id];if(f)return f;b.addEventListener("dispose",d);b.isBufferGeometry?f=b:b.isGeometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new D).setFromObject(a)),f=b._bufferGeometry);e[b.id]=f;c.geometries++;return f},update:function(c){var d=c.index,e=c.attributes;null!==d&&b.update(d,a.ELEMENT_ARRAY_BUFFER);for(var f in e)b.update(e[f], +a.ARRAY_BUFFER);c=c.morphAttributes;for(f in c)for(var d=c[f],e=0,g=d.length;e/gm,function(a,c){a=W[c];if(void 0===a)throw Error("Can not resolve #include <"+c+">");return Sd(a)})}function Ne(a){return a.replace(/for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g, +function(a,c,d,e){a="";for(c=parseInt(c);cb||a.height>b){b/=Math.max(a.width,a.height);var c=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");c.width=Math.floor(a.width*b);c.height=Math.floor(a.height*b);c.getContext("2d").drawImage(a, +0,0,a.width,a.height,0,0,c.width,c.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+c.width+"x"+c.height,a);return c}return a}function k(a){return R.isPowerOfTwo(a.width)&&R.isPowerOfTwo(a.height)}function l(a,b){return a.generateMipmaps&&b&&1003!==a.minFilter&&1006!==a.minFilter}function q(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function n(b){b=b.target;b.removeEventListener("dispose",n);a:{var c=d.get(b);if(b.image&&c.__image__webglTextureCube)a.deleteTexture(c.__image__webglTextureCube); +else{if(void 0===c.__webglInit)break a;a.deleteTexture(c.__webglTexture)}d.remove(b)}g.textures--}function t(b){b=b.target;b.removeEventListener("dispose",t);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b.isWebGLRenderTargetCube)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer), +c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer);d.remove(b.texture);d.remove(b)}g.textures--}function r(b,q){var t=d.get(b);if(0p;p++)u[p]=q||r?r?b.image[p].image:b.image[p]:h(b.image[p],e.maxCubemapSize); +var v=k(u[0]),w=f.convert(b.format),z=f.convert(b.type);m(a.TEXTURE_CUBE_MAP,b,v);for(p=0;6>p;p++)if(q)for(var x,I=u[p].mipmaps,y=0,C=I.length;yq;q++)e.__webglFramebuffer[q]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);m(a.TEXTURE_CUBE_MAP,b.texture,n);for(q=0;6>q;q++)p(e.__webglFramebuffer[q],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+q); +l(b.texture,n)&&a.generateMipmap(a.TEXTURE_CUBE_MAP);c.bindTexture(a.TEXTURE_CUBE_MAP,null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),m(a.TEXTURE_2D,b.texture,n),p(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),l(b.texture,n)&&a.generateMipmap(a.TEXTURE_2D),c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=!0===b.isWebGLRenderTargetCube;if(b.depthTexture){if(f)throw Error("target.depthTexture not supported in Cube render targets");if(b&&b.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported"); +a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate=!0);r(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER, +a.DEPTH_ATTACHMENT,a.TEXTURE_2D,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.TEXTURE_2D,e,0);else throw Error("Unknown depthTexture format");}else if(f)for(e.__webglDepthbuffer=[],f=0;6>f;f++)a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer[f]),e.__webglDepthbuffer[f]=a.createRenderbuffer(),w(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),w(e.__webglDepthbuffer, +b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture,f=k(b);l(e,f)&&(b=b.isWebGLRenderTargetCube?a.TEXTURE_CUBE_MAP:a.TEXTURE_2D,e=d.get(e).__webglTexture,c.bindTexture(b,e),a.generateMipmap(b),c.bindTexture(b,null))}}function lg(){var a={};return{get:function(b){b=b.uuid;var c=a[b];void 0===c&&(c={},a[b]=c);return c},remove:function(b){delete a[b.uuid]},clear:function(){a={}}}}function mg(a,b,c){function d(b,c,d){var e=new Uint8Array(4),f=a.createTexture(); +a.bindTexture(b,f);a.texParameteri(b,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(b,a.TEXTURE_MAG_FILTER,a.NEAREST);for(b=0;b=Z.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+a+" texture units while this GPU supports only "+Z.maxTextures);G+=1;return a}; +this.setTexture2D=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTarget&&(a||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);T.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),a=!0);T.setTexture2D(b,c)}}();this.setTextureCube=function(){var a=!1;return function(b,c){b&& +b.isWebGLRenderTargetCube&&(a||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&&6===b.image.length?T.setTextureCube(b,c):T.setTextureCubeDynamic(b,c)}}();this.getRenderTarget=function(){return H};this.setRenderTarget=function(a){(H=a)&&void 0===U.get(a).__webglFramebuffer&&T.setupRenderTarget(a);var b=null,c=!1;a?(b=U.get(a).__webglFramebuffer,a.isWebGLRenderTargetCube&& +(b=b[a.activeCubeFace],c=!0),Q.copy(a.viewport),S.copy(a.scissor),W=a.scissorTest):(Q.copy(ca).multiplyScalar(O),S.copy(ea).multiplyScalar(O),W=Oe);M!==b&&(F.bindFramebuffer(F.FRAMEBUFFER,b),M=b);ba.viewport(Q);ba.scissor(S);ba.setScissorTest(W);c&&(c=U.get(a.texture),F.framebufferTexture2D(F.FRAMEBUFFER,F.COLOR_ATTACHMENT0,F.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,c.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=function(a,b,c,d,e,f){if(a&&a.isWebGLRenderTarget){var g=U.get(a).__webglFramebuffer; +if(g){var h=!1;g!==M&&(F.bindFramebuffer(F.FRAMEBUFFER,g),h=!0);try{var l=a.texture,k=l.format,n=l.type;1023!==k&&oa.convert(k)!==F.getParameter(F.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===n||oa.convert(n)===F.getParameter(F.IMPLEMENTATION_COLOR_READ_TYPE)||1015===n&&(ia.get("OES_texture_float")||ia.get("WEBGL_color_buffer_float"))||1016===n&&ia.get("EXT_color_buffer_half_float")? +F.checkFramebufferStatus(F.FRAMEBUFFER)===F.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&F.readPixels(b,c,d,e,oa.convert(k),oa.convert(n),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{h&&F.bindFramebuffer(F.FRAMEBUFFER,M)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")}} +function Ob(a,b){this.name="";this.color=new H(a);this.density=void 0!==b?b:2.5E-4}function Pb(a,b,c){this.name="";this.color=new H(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function od(){A.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function Xd(a,b,c,d,e){A.call(this);this.lensFlares=[];this.positionScreen=new p;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)}function Za(a){Q.call(this);this.type="SpriteMaterial"; +this.color=new H(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}function Cc(a){A.call(this);this.type="Sprite";this.material=void 0!==a?a:new Za}function Dc(){A.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function Ec(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else for(console.warn("THREE.Skeleton boneInverses is the wrong length."), +this.boneInverses=[],a=0,b=this.bones.length;a=a.HAVE_CURRENT_DATA&&(q.needsUpdate=!0);requestAnimationFrame(l)}ea.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1;var q=this;requestAnimationFrame(l)} +function Rb(a,b,c,d,e,f,g,h,k,l,q,n){ea.call(this,null,f,g,h,k,l,d,e,q,n);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function Gc(a,b,c,d,e,f,g,h,k,l){l=void 0!==l?l:1026;if(1026!==l&&1027!==l)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===c&&1026===l&&(c=1012);void 0===c&&1027===l&&(c=1020);ea.call(this,null,d,e,f,g,h,l,c,k);this.image={width:a,height:b};this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!== +h?h:1003;this.generateMipmaps=this.flipY=!1}function Sb(a){D.call(this);this.type="WireframeGeometry";var b=[],c,d,e,f=[0,0],g={},h=["a","b","c"];if(a&&a.isGeometry){var k=a.faces;var l=0;for(d=k.length;lc;c++){var n=q[h[c]];var t=q[h[(c+1)%3]];f[0]=Math.min(n,t);f[1]=Math.max(n,t);n=f[0]+","+f[1];void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]})}}for(n in g)l=g[n],h=a.vertices[l.index1],b.push(h.x,h.y,h.z),h=a.vertices[l.index2],b.push(h.x,h.y,h.z)}else if(a&&a.isBufferGeometry){var h= +new p;if(null!==a.index){k=a.attributes.position;q=a.index;var r=a.groups;0===r.length&&(r=[{start:0,count:q.count,materialIndex:0}]);a=0;for(e=r.length;ac;c++)n=q.getX(l+c),t=q.getX(l+(c+1)%3),f[0]=Math.min(n,t),f[1]=Math.max(n,t),n=f[0]+","+f[1],void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]});for(n in g)l=g[n],h.fromBufferAttribute(k,l.index1),b.push(h.x,h.y,h.z),h.fromBufferAttribute(k,l.index2),b.push(h.x,h.y,h.z)}else for(k=a.attributes.position, +l=0,d=k.count/3;lc;c++)g=3*l+c,h.fromBufferAttribute(k,g),b.push(h.x,h.y,h.z),g=3*l+(c+1)%3,h.fromBufferAttribute(k,g),b.push(h.x,h.y,h.z)}this.addAttribute("position",new y(b,3))}function Hc(a,b,c){N.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Tb(a,b,c));this.mergeVertices()}function Tb(a,b,c){D.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h= +new p,k=new p,l=new p,q=new p,n=new p,t,r,m=b+1;for(t=0;t<=c;t++){var v=t/c;for(r=0;r<=b;r++){var w=r/b,k=a(w,v,k);e.push(k.x,k.y,k.z);0<=w-1E-5?(l=a(w-1E-5,v,l),q.subVectors(k,l)):(l=a(w+1E-5,v,l),q.subVectors(l,k));0<=v-1E-5?(l=a(w,v-1E-5,l),n.subVectors(k,l)):(l=a(w,v+1E-5,l),n.subVectors(l,k));h.crossVectors(q,n).normalize();f.push(h.x,h.y,h.z);g.push(w,v)}}for(t=0;td&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}D.call(this);this.type="PolyhedronBufferGeometry"; +this.parameters={vertices:a,indices:b,radius:c,detail:d};c=c||1;d=d||0;var h=[],k=[];(function(a){for(var c=new p,d=new p,g=new p,h=0;he&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute("position",new y(h,3));this.addAttribute("normal",new y(h.slice(),3));this.addAttribute("uv",new y(k,2));0===d?this.computeVertexNormals(): +this.normalizeNormals()}function Jc(a,b){N.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ub(a,b));this.mergeVertices()}function Ub(a,b){qa.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b);this.type="TetrahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Kc(a,b){N.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new nb(a,b));this.mergeVertices()} +function nb(a,b){qa.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b);this.type="OctahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Lc(a,b){N.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Vb(a,b));this.mergeVertices()}function Vb(a,b){var c=(1+Math.sqrt(5))/2;qa.call(this,[-1,c,0,1,c,0,-1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11, +5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b);this.type="IcosahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Mc(a,b){N.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Wb(a,b));this.mergeVertices()}function Wb(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;qa.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0, +d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Nc(a,b,c,d,e,f){N.call(this);this.type="TubeGeometry";this.parameters={path:a, +tubularSegments:b,radius:c,radialSegments:d,closed:e};void 0!==f&&console.warn("THREE.TubeGeometry: taper has been removed.");a=new Xb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Xb(a,b,c,d,e){function f(e){q=a.getPointAt(e/b,q);var f=g.normals[e];e=g.binormals[e];for(t=0;t<=d;t++){var l=t/d*Math.PI*2,n=Math.sin(l),l=-Math.cos(l);k.x=l*f.x+n*e.x;k.y=l*f.y+n*e.y;k.z=l*f.z+n*e.z;k.normalize();u.push(k.x, +k.y,k.z);h.x=q.x+c*k.x;h.y=q.y+c*k.y;h.z=q.z+c*k.z;m.push(h.x,h.y,h.z)}}D.call(this);this.type="TubeBufferGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new p,k=new p,l=new C,q=new p,n,t,m=[],u=[],v=[],w=[];for(n=0;nq;q++){var n=l[f[q]];var t=l[f[(q+1)%3]];d[0]=Math.min(n,t);d[1]=Math.max(n,t);n=d[0]+","+d[1];void 0===e[n]?e[n]={index1:d[0],index2:d[1],face1:h,face2:void 0}:e[n].face2=h}for(n in e)if(d=e[n],void 0===d.face2||g[d.face1].normal.dot(g[d.face2].normal)<=b)f=a[d.index1],c.push(f.x,f.y,f.z),f=a[d.index2],c.push(f.x,f.y,f.z);this.addAttribute("position", +new y(c,3))}function pb(a,b,c,d,e,f,g,h){N.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new Sa(a,b,c,d,e,f,g,h));this.mergeVertices()}function Sa(a,b,c,d,e,f,g,h){function k(c){var e,f=new C,k=new p,r=0,v=!0===c?a:b,z=!0===c?1:-1;var y=u;for(e=1;e<=d;e++)n.push(0,w*z,0),t.push(0,z,0),m.push(.5,.5),u++;var A=u;for(e=0;e<=d;e++){var D=e/d*h+g,L=Math.cos(D), +D=Math.sin(D);k.x=v*D;k.y=w*z;k.z=v*L;n.push(k.x,k.y,k.z);t.push(0,z,0);f.x=.5*L+.5;f.y=.5*D*z+.5;m.push(f.x,f.y);u++}for(e=0;ethis.duration&&this.resetDuration();this.optimize()}function Id(a){this.manager=void 0!==a?a:wa;this.textures={}}function ae(a){this.manager=void 0!==a?a:wa}function kc(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}function be(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."), +a=void 0);this.manager=void 0!==a?a:wa;this.withCredentials=!1}function Re(a){this.manager=void 0!==a?a:wa;this.texturePath=""}function Se(a,b,c,d,e){b=.5*(d-b);e=.5*(e-c);var f=a*a;return(2*c-2*d+b+e)*a*f+(-3*c+3*d-2*b-e)*f+b*a+c}function yb(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function zb(a,b,c,d,e){var f=1-a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}function S(){this.type="Curve";this.arcLengthDivisions=200}function Ka(a,b){S.call(this);this.type="LineCurve";this.v1=a|| +new C;this.v2=b||new C}function Ab(){S.call(this);this.type="CurvePath";this.curves=[];this.autoClose=!1}function Na(a,b,c,d,e,f,g,h){S.call(this);this.type="EllipseCurve";this.aX=a||0;this.aY=b||0;this.xRadius=c||1;this.yRadius=d||1;this.aStartAngle=e||0;this.aEndAngle=f||2*Math.PI;this.aClockwise=g||!1;this.aRotation=h||0}function ab(a){S.call(this);this.type="SplineCurve";this.points=a||[]}function bb(a,b,c,d){S.call(this);this.type="CubicBezierCurve";this.v0=a||new C;this.v1=b||new C;this.v2= +c||new C;this.v3=d||new C}function cb(a,b,c){S.call(this);this.type="QuadraticBezierCurve";this.v0=a||new C;this.v1=b||new C;this.v2=c||new C}function Bb(a){Ab.call(this);this.type="Path";this.currentPoint=new C;a&&this.setFromPoints(a)}function Cb(a){Bb.call(this,a);this.type="Shape";this.holes=[]}function ce(){this.type="ShapePath";this.subPaths=[];this.currentPath=null}function de(a){this.type="Font";this.data=a}function Te(a){this.manager=void 0!==a?a:wa}function ee(a){this.manager=void 0!==a? +a:wa}function Ue(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new U;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new U;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1}function $c(a,b,c){A.call(this);this.type="CubeCamera";var d=new U(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new p(1,0,0));this.add(d);var e=new U(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new p(-1,0,0));this.add(e);var f=new U(90,1,a,b);f.up.set(0,0,1);f.lookAt(new p(0,1,0)); +this.add(f);var g=new U(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new p(0,-1,0));this.add(g);var h=new U(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new p(0,0,1));this.add(h);var k=new U(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new p(0,0,-1));this.add(k);this.renderTarget=new Ib(c,c,{format:1022,magFilter:1006,minFilter:1006});this.renderTarget.texture.name="CubeCamera";this.update=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,l=c.texture.generateMipmaps;c.texture.generateMipmaps= +!1;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.texture.generateMipmaps=l;c.activeCubeFace=5;a.render(b,k,c);a.setRenderTarget(null)};this.clear=function(a,b,c,d){for(var e=this.renderTarget,f=0;6>f;f++)e.activeCubeFace=f,a.setRenderTarget(e),a.clear(b,c,d);a.setRenderTarget(null)}}function fe(){A.call(this);this.type="AudioListener";this.context=ge.getContext();this.gain= +this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function lc(a){A.call(this);this.type="Audio";this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.loop=!1;this.offset=this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function he(a){lc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)} +function ie(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function je(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case "quaternion":b=this._slerp;break;case "string":case "bool":a=Array;b=this._select;break;default:b=this._lerp}this.buffer=new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function Ve(a, +b,c){c=c||na.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function na(a,b,c){this.path=b;this.parsedPath=c||na.parseTrackName(b);this.node=na.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function We(){this.uuid=R.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var a={};this._indicesByUUID=a;for(var b=0,c=arguments.length;b!==c;++b)a[arguments[b].uuid]=b;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath= +{};var d=this;this.stats={objects:{get total(){return d._objects.length},get inUse(){return this.total-d.nCachedObjects_}},get bindingsPerObject(){return d._bindings.length}}}function Xe(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant= +this._byClipCacheIndex=this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function Ye(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Jd(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."), +a=b);this.value=a}function ke(){D.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function le(a,b,c,d){this.uuid=R.generateUUID();this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function mc(a,b){this.uuid=R.generateUUID();this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function me(a,b,c){mc.call(this,a,b);this.meshPerAttribute=c||1}function ne(a, +b,c){P.call(this,a,b);this.meshPerAttribute=c||1}function Ze(a,b,c,d){this.ray=new lb(a,b);this.near=c||0;this.far=d||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})}function $e(a,b){return a.distance-b.distance}function oe(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e= +a.length;dc;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,Math.cos(f),Math.sin(f),1)}a.addAttribute("position",new y(b,3));b=new O({fog:!1});this.cone=new ca(a,b);this.add(this.cone);this.update()}function df(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;ca?-1:0e;e++)8===e||13===e||18===e||23===e?d+="-":14===e?d+="4":(2>=b&&(b=33554432+16777216*Math.random()|0),c=b&15,b>>=4,d+=a[19===e?c&3|8:c]);return d}}(),clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},lerp:function(a,b,c){return(1-c)*a+c*b},smoothstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a, +b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},degToRad:function(a){return a*R.DEG2RAD},radToDeg:function(a){return a*R.RAD2DEG},isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a},ceilPowerOfTwo:function(a){return Math.pow(2,Math.ceil(Math.log(a)/Math.LN2))},floorPowerOfTwo:function(a){return Math.pow(2, +Math.floor(Math.log(a)/Math.LN2))}};Object.defineProperties(C.prototype,{width:{get:function(){return this.x},set:function(a){this.x=a}},height:{get:function(){return this.y},set:function(a){this.y=a}}});Object.assign(C.prototype,{isVector2:!0,set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break; +default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this}, +addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y; +return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},applyMatrix3:function(a){var b=this.x,c=this.y;a=a.elements;this.x=a[0]*b+a[3]*c+a[6];this.y=a[1]*b+a[4]*c+a[7];return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y= +Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a=new C,b=new C;return function(c,d){a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){this.x=Math.ceil(this.x); +this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+ +Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){var a=Math.atan2(this.y,this.x);0>a&&(a+=2*Math.PI);return a},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+= (a.y-this.y)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b); -return this},rotateAround:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=this.x-a.x,f=this.y-a.y;this.x=e*c-f*d+a.x;this.y=e*d+f*c+a.y;return this}});var jf=0;X.DEFAULT_IMAGE=void 0;X.DEFAULT_MAPPING=300;Object.defineProperty(X.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(X.prototype,sa.prototype,{constructor:X,isTexture:!0,clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0); -this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){if(void 0!==a.textures[this.uuid])return a.textures[this.uuid];var b={metadata:{version:4.5, -type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(void 0!==this.image){var c=this.image;void 0===c.uuid&&(c.uuid=Y.generateUUID());if(void 0===a.images[c.uuid]){var d=a.images,e=c.uuid,f=c.uuid,g;void 0!==c.toDataURL?g=c:(g=document.createElementNS("http://www.w3.org/1999/xhtml", -"canvas"),g.width=c.width,g.height=c.height,g.getContext("2d").drawImage(c,0,0,c.width,c.height));g=2048a.x||1a.x?0:1;break;case 1002:a.x= -1===Math.abs(Math.floor(a.x)%2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y)}}});Object.assign(ga.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this}, -setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x, -this.y,this.z,this.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this}, -addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*= -a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/ -b);return this},setAxisAngleFromRotationMatrix:function(a){var b,c,d;a=a.elements;var e=a[0];d=a[4];var f=a[8],g=a[1],h=a[5],k=a[9];c=a[2];b=a[6];var m=a[10];if(.01>Math.abs(d-g)&&.01>Math.abs(f-c)&&.01>Math.abs(k-b)){if(.1>Math.abs(d+g)&&.1>Math.abs(f+c)&&.1>Math.abs(k+b)&&.1>Math.abs(e+h+m-3))return this.set(1,0,0,0),this;a=Math.PI;e=(e+1)/2;h=(h+1)/2;m=(m+1)/2;d=(d+g)/4;f=(f+c)/4;k=(k+b)/4;e>h&&e>m?.01>e?(b=0,d=c=.707106781):(b=Math.sqrt(e),c=d/b,d=f/b):h>m?.01>h?(b=.707106781,c=0,d=.707106781): -(c=Math.sqrt(h),b=d/c,d=k/c):.01>m?(c=b=.707106781,d=0):(d=Math.sqrt(m),b=f/d,c=k/d);this.set(b,c,d,a);return this}a=Math.sqrt((b-k)*(b-k)+(f-c)*(f-c)+(g-d)*(g-d));.001>Math.abs(a)&&(a=1);this.x=(b-k)/a;this.y=(f-c)/a;this.z=(g-d)/a;this.w=Math.acos((e+h+m-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z, -a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,this.w));return this},clampScalar:function(){var a=new ga,b=new ga;return function(c,d){a.set(c,c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this}, -ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this}, -negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length())}, -setLength:function(a){return this.multiplyScalar(a/this.length())},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a= -[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}});Object.assign(Db.prototype,sa.prototype,{isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0, -0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Eb.prototype=Object.create(Db.prototype);Eb.prototype.constructor=Eb;Eb.prototype.isWebGLRenderTargetCube=!0;Object.assign(qa,{slerp:function(a,b, -c,d){return c.copy(a).slerp(b,d)},slerpFlat:function(a,b,c,d,e,f,g){var h=c[d+0],k=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var u=e[f+1],l=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==u||m!==l){f=1-g;var n=h*d+k*u+m*l+c*e,r=0<=n?1:-1,p=1-n*n;p>Number.EPSILON&&(p=Math.sqrt(p),n=Math.atan2(p,n*r),f=Math.sin(f*n)/p,g=Math.sin(g*n)/p);r*=g;h=h*f+d*r;k=k*f+u*r;m=m*f+l*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+k*k+m*m+c*c),h*=g,k*=g,m*=g,c*=g)}a[b]=h;a[b+1]=k;a[b+2]=m;a[b+3]=c}});Object.defineProperties(qa.prototype,{x:{get:function(){return this._x}, -set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=a;this.onChangeCallback()}}});Object.assign(qa.prototype,{set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z, -this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback();return this},setFromEuler:function(a,b){if(!1===(a&&a.isEuler))throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var c=a._x,d=a._y,e=a._z,f=a.order,g=Math.cos,h=Math.sin,k=g(c/2),m=g(d/2),g=g(e/2),c=h(c/2),d=h(d/2),e=h(e/2);"XYZ"===f?(this._x=c*m*g+k*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g-c*d*e):"YXZ"===f?(this._x=c*m*g+ -k*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g+c*d*e):"ZXY"===f?(this._x=c*m*g-k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g-c*d*e):"ZYX"===f?(this._x=c*m*g-k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g+c*d*e):"YZX"===f?(this._x=c*m*g+k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g-c*d*e):"XZY"===f&&(this._x=c*m*g-k*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g+c*d*e);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a, -b){var c=b/2,d=Math.sin(c);this._x=a.x*d;this._y=a.y*d;this._z=a.z*d;this._w=Math.cos(c);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],k=b[6],b=b[10],m=c+f+b;0f&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(k-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y= +return this},rotateAround:function(a,b){var c=Math.cos(b);b=Math.sin(b);var d=this.x-a.x,e=this.y-a.y;this.x=d*c-e*b+a.x;this.y=d*b+e*c+a.y;return this}});Object.assign(K.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,l,q,n,t,m,p,v){var r=this.elements;r[0]=a;r[4]=b;r[8]=c;r[12]=d;r[1]=e;r[5]=f;r[9]=g;r[13]=h;r[2]=k;r[6]=l;r[10]=q;r[14]=n;r[3]=t;r[7]=m;r[11]=p;r[15]=v;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new K).fromArray(this.elements)}, +copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x, +b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(){var a=new p;return function(b){var c=this.elements,d=b.elements,e=1/a.setFromMatrixColumn(b,0).length(),f=1/a.setFromMatrixColumn(b,1).length();b=1/a.setFromMatrixColumn(b,2).length();c[0]=d[0]*e;c[1]=d[1]*e;c[2]=d[2]*e;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*f;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;return this}}(),makeRotationFromEuler:function(a){a&&a.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order."); +var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c),c=Math.sin(c),g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e);if("XYZ"===a.order){var k=f*h;var l=f*e;var q=c*h;a=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=l+q*d;b[5]=k-a*d;b[9]=-c*g;b[2]=a-k*d;b[6]=q+l*d;b[10]=f*g}else"YXZ"===a.order?(k=g*h,l=g*e,q=d*h,a=d*e,b[0]=k+a*c,b[4]=q*c-l,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=l*c-q,b[6]=a+k*c,b[10]=f*g):"ZXY"===a.order?(k=g*h,l=g*e,q=d*h,a=d*e,b[0]=k-a*c,b[4]=-f*e,b[8]=q+l*c,b[1]=l+q*c,b[5]=f*h,b[9]= +a-k*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(k=f*h,l=f*e,q=c*h,a=c*e,b[0]=g*h,b[4]=q*d-l,b[8]=k*d+a,b[1]=g*e,b[5]=a*d+k,b[9]=l*d-q,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(k=f*g,l=f*d,q=c*g,a=c*d,b[0]=g*h,b[4]=a-k*e,b[8]=q*e+l,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=l*e+q,b[10]=k-a*e):"XZY"===a.order&&(k=f*g,l=f*d,q=c*g,a=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=k*e+a,b[5]=f*h,b[9]=l*e-q,b[2]=q*e-l,b[6]=c*h,b[10]=a*e+k);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){var b= +this.elements,c=a._x,d=a._y,e=a._z,f=a._w,g=c+c,h=d+d,k=e+e;a=c*g;var l=c*h,c=c*k,q=d*h,d=d*k,e=e*k,g=f*g,h=f*h,f=f*k;b[0]=1-(q+e);b[4]=l-f;b[8]=c+h;b[1]=l+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+q);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},lookAt:function(){var a=new p,b=new p,c=new p;return function(d,e,f){var g=this.elements;c.subVectors(d,e);0===c.lengthSq()&&(c.z=1);c.normalize();a.crossVectors(f,c);0===a.lengthSq()&&(1===Math.abs(f.z)?c.x+=1E-4:c.z+=1E-4, +c.normalize(),a.crossVectors(f,c));a.normalize();b.crossVectors(c,a);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements; +b=this.elements;a=c[0];var e=c[4],f=c[8],g=c[12],h=c[1],k=c[5],l=c[9],q=c[13],n=c[2],m=c[6],r=c[10],p=c[14],v=c[3],w=c[7],x=c[11],c=c[15],z=d[0],I=d[4],B=d[8],J=d[12],y=d[1],C=d[5],A=d[9],D=d[13],E=d[2],H=d[6],L=d[10],Y=d[14],N=d[3],M=d[7],V=d[11],d=d[15];b[0]=a*z+e*y+f*E+g*N;b[4]=a*I+e*C+f*H+g*M;b[8]=a*B+e*A+f*L+g*V;b[12]=a*J+e*D+f*Y+g*d;b[1]=h*z+k*y+l*E+q*N;b[5]=h*I+k*C+l*H+q*M;b[9]=h*B+k*A+l*L+q*V;b[13]=h*J+k*D+l*Y+q*d;b[2]=n*z+m*y+r*E+p*N;b[6]=n*I+m*C+r*H+p*M;b[10]=n*B+m*A+r*L+p*V;b[14]=n*J+m* +D+r*Y+p*d;b[3]=v*z+w*y+x*E+c*N;b[7]=v*I+w*C+x*H+c*M;b[11]=v*B+w*A+x*L+c*V;b[15]=v*J+w*D+x*Y+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;cthis.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.copy(this);c=1/g;var f=1/h,l=1/k;b.elements[0]*=c;b.elements[1]*=c;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*=f;b.elements[6]*=f;b.elements[8]*=l;b.elements[9]*=l;b.elements[10]*=l;d.setFromRotationMatrix(b);e.x=g;e.y=h;e.z=k;return this}}(),makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs."); +var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(c-d);g[9]=(c+d)/(c-d);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),k=1/(c-d),l=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*k;g[9]=0;g[13]=-((c+d)*k);g[2]=0;g[6]=0;g[10]=-2*l;g[14]=-((f+e)*l);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements; +a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}});Object.assign(Z,{slerp:function(a,b,c,d){return c.copy(a).slerp(b, +d)},slerpFlat:function(a,b,c,d,e,f,g){var h=c[d+0],k=c[d+1],l=c[d+2];c=c[d+3];d=e[f+0];var q=e[f+1],n=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==q||l!==n){f=1-g;var m=h*d+k*q+l*n+c*e,r=0<=m?1:-1,p=1-m*m;p>Number.EPSILON&&(p=Math.sqrt(p),m=Math.atan2(p,m*r),f=Math.sin(f*m)/p,g=Math.sin(g*m)/p);r*=g;h=h*f+d*r;k=k*f+q*r;l=l*f+n*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+k*k+l*l+c*c),h*=g,k*=g,l*=g,c*=g)}a[b]=h;a[b+1]=k;a[b+2]=l;a[b+3]=c}});Object.defineProperties(Z.prototype,{x:{get:function(){return this._x}, +set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=a;this.onChangeCallback()}}});Object.assign(Z.prototype,{set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z, +this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback();return this},setFromEuler:function(a,b){if(!a||!a.isEuler)throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var c=a._x,d=a._y,e=a._z;a=a.order;var f=Math.cos,g=Math.sin,h=f(c/2),k=f(d/2),f=f(e/2),c=g(c/2),d=g(d/2),e=g(e/2);"XYZ"===a?(this._x=c*k*f+h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f-c*d*e):"YXZ"===a?(this._x=c*k*f+ +h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f+c*d*e):"ZXY"===a?(this._x=c*k*f-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f-c*d*e):"ZYX"===a?(this._x=c*k*f-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f+c*d*e):"YZX"===a?(this._x=c*k*f+h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f-c*d*e):"XZY"===a&&(this._x=c*k*f-h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f+c*d*e);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a, +b){b/=2;var c=Math.sin(b);this._x=a.x*c;this._y=a.y*c;this._z=a.z*c;this._w=Math.cos(b);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],k=b[6],b=b[10],l=c+f+b;0f&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(k-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y= .25*c,this._z=(g+k)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+k)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a=new p,b;return function(c,d){void 0===a&&(a=new p);b=c.dot(d)+1;1E-6>b?(b=0,Math.abs(c.x)>Math.abs(c.z)?a.set(-c.y,c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=a.y;this._z=a.z;this._w=b;return this.normalize()}}(),inverse:function(){return this.conjugate().normalize()},conjugate:function(){this._x*= -1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this.onChangeCallback();return this}, -multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z,f=a._w,g=b._x,h=b._y,k=b._z,m=b._w;this._x=c*m+f*g+d*k-e*h;this._y=d*m+f*h+e*g-c*k;this._z=e*m+f*k+c*h-d*g;this._w=f*m-c*g-d*h-e*k;this.onChangeCallback(); -return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;var h=Math.sqrt(1-g*g);if(.001>Math.abs(h))return this._w=.5*(f+this._w),this._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;var k=Math.atan2(h,g),g=Math.sin((1-b)*k)/h,h=Math.sin(b* -k)/h;this._w=f*g+this._w*h;this._x=c*g+this._x*h;this._y=d*g+this._y*h;this._z=e*g+this._z*h;this.onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback= +multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z;a=a._w;var f=b._x,g=b._y,h=b._z;b=b._w;this._x=c*b+a*f+d*h-e*g;this._y=d*b+a*g+e*f-c*h;this._z=e*b+a*h+c*g-d*f;this._w=a*b-c*f-d*g-e*h;this.onChangeCallback(); +return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;a=Math.sqrt(1-g*g);if(.001>Math.abs(a))return this._w=.5*(f+this._w),this._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;var h=Math.atan2(a,g),g=Math.sin((1-b)*h)/a;b=Math.sin(b*h)/a; +this._w=f*g+this._w*b;this._x=c*g+this._x*b;this._y=d*g+this._y*b;this._z=e*g+this._z*b;this.onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback= a;return this},onChangeCallback:function(){}});Object.assign(p.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x; case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this}, addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z= -a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a=new qa;return function(b){!1===(b&&b.isEuler)&&console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."); -return this.applyQuaternion(a.setFromEuler(b))}}(),applyAxisAngle:function(){var a=new qa;return function(b,c){return this.applyQuaternion(a.setFromAxisAngle(b,c))}}(),applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12];this.y=a[1]*b+a[5]*c+a[9]*d+a[13];this.z=a[2]*b+a[6]*c+a[10]*d+a[14]; -return this.divideScalar(a[3]*b+a[7]*c+a[11]*d+a[15])},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,k=a*c+g*b-e*d,m=a*d+e*c-f*b,b=-e*b-f*c-g*d;this.x=h*a+b*-e+k*-g-m*-f;this.y=k*a+b*-f+m*-e-h*-g;this.z=m*a+b*-g+h*-f-k*-e;return this},project:function(){var a=new J;return function(b){a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyMatrix4(a)}}(),unproject:function(){var a=new J;return function(b){a.multiplyMatrices(b.matrixWorld, +a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a=new Z;return function(b){b&&b.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."); +return this.applyQuaternion(a.setFromEuler(b))}}(),applyAxisAngle:function(){var a=new Z;return function(b,c){return this.applyQuaternion(a.setFromAxisAngle(b,c))}}(),applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]* +d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,k=a*c+g*b-e*d,l=a*d+e*c-f*b,b=-e*b-f*c-g*d;this.x=h*a+b*-e+k*-g-l*-f;this.y=k*a+b*-f+l*-e-h*-g;this.z=l*a+b*-g+h*-f-k*-e;return this},project:function(){var a=new K;return function(b){a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyMatrix4(a)}}(),unproject:function(){var a=new K;return function(b){a.multiplyMatrices(b.matrixWorld, a.getInverse(b.projectionMatrix));return this.applyMatrix4(a)}}(),transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x= -Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},clampScalar:function(){var a=new p,b=new p;return function(c,d){a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.multiplyScalar(Math.max(a,Math.min(b,c))/c)},floor:function(){this.x=Math.floor(this.x); -this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=-this.x; -this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.multiplyScalar(a/this.length())},lerp:function(a,b){this.x+=(a.x-this.x)* -b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},cross:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,b);var c=this.x,d=this.y,e=this.z;this.x=d*a.z-e*a.y;this.y=e*a.x-c*a.z;this.z=c*a.y-d*a.x;return this},crossVectors:function(a,b){var c=a.x,d=a.y,e=a.z,f=b.x,g=b.y,h=b.z;this.x=d*h-e*g;this.y= -e*f-c*h;this.z=c*g-d*f;return this},projectOnVector:function(a){var b=a.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a=new p;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=new p;return function(b){return this.sub(a.copy(b).multiplyScalar(2*this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*a.lengthSq());return Math.acos(Y.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))}, -distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){var b=Math.sin(a.phi)*a.radius;this.x=b*Math.sin(a.theta);this.y=Math.cos(a.phi)*a.radius;this.z=b*Math.cos(a.theta);return this},setFromCylindrical:function(a){this.x=a.radius*Math.sin(a.theta);this.y=a.y;this.z=a.radius*Math.cos(a.theta);return this},setFromMatrixPosition:function(a){return this.setFromMatrixColumn(a, -3)},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,4*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]= -this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}});Object.assign(J.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,m,u,l,n,r,p,t){var y=this.elements;y[0]=a;y[4]=b;y[8]=c;y[12]=d;y[1]=e;y[5]=f;y[9]=g;y[13]=h;y[2]=k;y[6]=m;y[10]=u;y[14]=l;y[3]=n;y[7]=r;y[11]=p;y[15]=t;return this},identity:function(){this.set(1, -0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new J).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0); -b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(){var a=new p;return function(b){var c=this.elements,d=b.elements,e=1/a.setFromMatrixColumn(b,0).length(),f=1/a.setFromMatrixColumn(b,1).length();b=1/a.setFromMatrixColumn(b,2).length();c[0]=d[0]*e;c[1]=d[1]*e;c[2]=d[2]*e;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*f;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;return this}}(), -makeRotationFromEuler:function(a){!1===(a&&a.isEuler)&&console.error("THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c),c=Math.sin(c),g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e);if("XYZ"===a.order){a=f*h;var k=f*e,m=c*h,u=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=k+m*d;b[5]=a-u*d;b[9]=-c*g;b[2]=u-a*d;b[6]=m+k*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,k=g*e,m=d*h,u=d*e,b[0]=a+u*c,b[4]=m*c-k,b[8]= -f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=k*c-m,b[6]=u+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,k=g*e,m=d*h,u=d*e,b[0]=a-u*c,b[4]=-f*e,b[8]=m+k*c,b[1]=k+m*c,b[5]=f*h,b[9]=u-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,k=f*e,m=c*h,u=c*e,b[0]=g*h,b[4]=m*d-k,b[8]=a*d+u,b[1]=g*e,b[5]=u*d+a,b[9]=k*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,k=f*d,m=c*g,u=c*d,b[0]=g*h,b[4]=u-a*e,b[8]=m*e+k,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=k*e+m,b[10]=a-u*e):"XZY"===a.order&&(a=f*g,k=f*d,m=c*g,u=c*d,b[0]= -g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+u,b[5]=f*h,b[9]=k*e-m,b[2]=m*e-k,b[6]=c*h,b[10]=u*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){var b=this.elements,c=a._x,d=a._y,e=a._z,f=a._w,g=c+c,h=d+d,k=e+e;a=c*g;var m=c*h,c=c*k,u=d*h,d=d*k,e=e*k,g=f*g,h=f*h,f=f*k;b[0]=1-(u+e);b[4]=m-f;b[8]=c+h;b[1]=m+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+u);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},lookAt:function(){var a=new p, -b=new p,c=new p;return function(d,e,f){var g=this.elements;c.subVectors(d,e);0===c.lengthSq()&&(c.z=1);c.normalize();a.crossVectors(f,c);0===a.lengthSq()&&(c.z+=1E-4,a.crossVectors(f,c));a.normalize();b.crossVectors(c,a);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)): -this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],k=c[12],m=c[1],u=c[5],l=c[9],n=c[13],r=c[2],p=c[6],t=c[10],y=c[14],x=c[3],v=c[7],G=c[11],c=c[15],w=d[0],O=d[4],S=d[8],E=d[12],F=d[1],C=d[5],R=d[9],D=d[13],B=d[2],I=d[6],H=d[10],J=d[14],P=d[3],K=d[7],W=d[11],d=d[15];e[0]=f*w+g*F+h*B+k*P;e[4]=f*O+g*C+h*I+k*K;e[8]=f*S+g*R+h*H+k*W;e[12]=f*E+g*D+h*J+k*d;e[1]=m*w+u* -F+l*B+n*P;e[5]=m*O+u*C+l*I+n*K;e[9]=m*S+u*R+l*H+n*W;e[13]=m*E+u*D+l*J+n*d;e[2]=r*w+p*F+t*B+y*P;e[6]=r*O+p*C+t*I+y*K;e[10]=r*S+p*R+t*H+y*W;e[14]=r*E+p*D+t*J+y*d;e[3]=x*w+v*F+G*B+c*P;e[7]=x*O+v*C+G*I+c*K;e[11]=x*S+v*R+G*H+c*W;e[15]=x*E+v*D+G*J+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c= -0,d=b.count;cthis.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.copy(this);c=1/g;var f=1/h,m=1/k;b.elements[0]*=c;b.elements[1]*=c;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*=f;b.elements[6]*=f;b.elements[8]*= -m;b.elements[9]*=m;b.elements[10]*=m;d.setFromRotationMatrix(b);e.x=g;e.y=h;e.z=k;return this}}(),makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(c-d);g[9]=(c+d)/(c-d);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makeOrthographic:function(a, -b,c,d,e,f){var g=this.elements,h=1/(b-a),k=1/(c-d),m=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*k;g[9]=0;g[13]=-((c+d)*k);g[2]=0;g[6]=0;g[10]=-2*m;g[14]=-((f+e)*m);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements; -a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}});eb.prototype=Object.create(X.prototype);eb.prototype.constructor=eb;eb.prototype.isDataTexture=!0;Za.prototype=Object.create(X.prototype);Za.prototype.constructor=Za;Za.prototype.isCubeTexture=!0;Object.defineProperty(Za.prototype,"images",{get:function(){return this.image},set:function(a){this.image= -a}});var De=new X,Ee=new Za,ye=[],Ae=[],Ce=new Float32Array(16),Be=new Float32Array(9);Ie.prototype.setValue=function(a,b){for(var c=this.seq,d=0,e=c.length;d!==e;++d){var f=c[d];f.setValue(a,b[f.id])}};var Qd=/([\w\d_]+)(\])?(\[|\.)?/g;fb.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};fb.prototype.setOptional=function(a,b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};fb.upload=function(a,b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],h=c[g.id];!1!== -h.needsUpdate&&g.setValue(a,h.value,d)}};fb.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in b&&c.push(f)}return c};var kg={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535, -darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842, -fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762, -lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685, -navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331, -slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Object.assign(H.prototype,{isColor:!0,r:1,g:1,b:1,set:function(a){a&&a.isColor?this.copy(a):"number"===typeof a?this.setHex(a):"string"===typeof a&&this.setStyle(a);return this},setScalar:function(a){this.b=this.g=this.r= -a;return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(){function a(a,c,d){0>d&&(d+=1);1d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b,c,d){b=Y.euclideanModulo(b,1);c=Y.clamp(c,0,1);d=Y.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c=.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-1/ -3));return this}}(),setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r= -Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){var d=parseFloat(c[1])/360,e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^\#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+ -c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0=h?k/(e+f):k/(2-e-f);switch(e){case b:g=(c-d)/k+(c 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\n\tfloat b = 3.45068 + (4.18814 + y) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\n\treturn result;\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n", -bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = dFdx( surf_pos );\n\t\tvec3 vSigmaY = dFdy( surf_pos );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n", +Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},clampScalar:function(){var a=new p,b=new p;return function(c,d){a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x= +Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x= +-this.x;this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x- +this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},cross:function(a,b){return void 0!==b?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,b)):this.crossVectors(this,a)},crossVectors:function(a,b){var c=a.x,d=a.y;a=a.z;var e=b.x,f=b.y;b=b.z;this.x=d*b-a*f;this.y=a*e-c*b;this.z=c*f-d*e;return this},projectOnVector:function(a){var b= +a.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a=new p;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=new p;return function(b){return this.sub(a.copy(b).multiplyScalar(2*this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*a.lengthSq());return Math.acos(R.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x- +a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){var b=Math.sin(a.phi)*a.radius;this.x=b*Math.sin(a.theta);this.y=Math.cos(a.phi)*a.radius;this.z=b*Math.cos(a.theta);return this},setFromCylindrical:function(a){this.x=a.radius*Math.sin(a.theta);this.y=a.y;this.z=a.radius*Math.cos(a.theta);return this},setFromMatrixPosition:function(a){a=a.elements;this.x=a[12];this.y= +a[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,4*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a= +[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}});Object.assign(ra.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,k){var l=this.elements;l[0]=a;l[1]=d;l[2]=g;l[3]=b;l[4]=e;l[5]=h;l[6]=c;l[7]=f;l[8]=k;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)}, +copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;cc;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c= +this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a}});var kf=0;ea.DEFAULT_IMAGE=void 0;ea.DEFAULT_MAPPING=300;Object.defineProperty(ea.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(ea.prototype,ja.prototype,{constructor:ea,isTexture:!0,clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping= +a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.center.copy(a.center);this.rotation=a.rotation;this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrix.copy(a.matrix);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding; +return this},toJSON:function(a){var b=void 0===a||"string"===typeof a;if(!b&&void 0!==a.textures[this.uuid])return a.textures[this.uuid];var c={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY}; +if(void 0!==this.image){var d=this.image;void 0===d.uuid&&(d.uuid=R.generateUUID());if(!b&&void 0===a.images[d.uuid]){var e=a.images,f=d.uuid,g=d.uuid;if(d instanceof HTMLCanvasElement)var h=d;else{h=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");h.width=d.width;h.height=d.height;var k=h.getContext("2d");d instanceof ImageData?k.putImageData(d,0,0):k.drawImage(d,0,0,d.width,d.height)}h=2048a.x||1a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)% +2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y)}}});Object.assign(da.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break; +case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."), +this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a, +b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]* +e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/b);return this},setAxisAngleFromRotationMatrix:function(a){a=a.elements;var b=a[0];var c=a[4];var d=a[8],e=a[1],f=a[5],g=a[9];var h=a[2];var k=a[6];var l=a[10];if(.01>Math.abs(c-e)&&.01>Math.abs(d-h)&&.01>Math.abs(g-k)){if(.1>Math.abs(c+ +e)&&.1>Math.abs(d+h)&&.1>Math.abs(g+k)&&.1>Math.abs(b+f+l-3))return this.set(1,0,0,0),this;a=Math.PI;b=(b+1)/2;f=(f+1)/2;l=(l+1)/2;c=(c+e)/4;d=(d+h)/4;g=(g+k)/4;b>f&&b>l?.01>b?(k=0,c=h=.707106781):(k=Math.sqrt(b),h=c/k,c=d/k):f>l?.01>f?(k=.707106781,h=0,c=.707106781):(h=Math.sqrt(f),k=c/h,c=g/h):.01>l?(h=k=.707106781,c=0):(c=Math.sqrt(l),k=d/c,h=g/c);this.set(k,h,c,a);return this}a=Math.sqrt((k-g)*(k-g)+(d-h)*(d-h)+(e-c)*(e-c));.001>Math.abs(a)&&(a=1);this.x=(k-g)/a;this.y=(d-h)/a;this.z=(e-c)/a; +this.w=Math.acos((b+f+l-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w, +this.w));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new da,b=new da);a.set(c,c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z); +this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this}, +dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+= +(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromBufferAttribute:function(a, +b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}});Object.assign(Hb.prototype,ja.prototype,{isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height= +a.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Ib.prototype=Object.create(Hb.prototype);Ib.prototype.constructor=Ib;Ib.prototype.isWebGLRenderTargetCube=!0;fb.prototype=Object.create(ea.prototype);fb.prototype.constructor=fb;fb.prototype.isDataTexture=!0;Ua.prototype=Object.create(ea.prototype);Ua.prototype.constructor= +Ua;Ua.prototype.isCubeTexture=!0;Object.defineProperty(Ua.prototype,"images",{get:function(){return this.image},set:function(a){this.image=a}});var Be=new ea,Ce=new Ua,we=[],ye=[],Ae=new Float32Array(16),ze=new Float32Array(9);Ge.prototype.setValue=function(a,b){for(var c=this.seq,d=0,e=c.length;d!==e;++d){var f=c[d];f.setValue(a,b[f.id])}};var Od=/([\w\d_]+)(\])?(\[|\.)?/g;gb.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};gb.prototype.setOptional=function(a, +b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};gb.upload=function(a,b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],h=c[g.id];!1!==h.needsUpdate&&g.setValue(a,h.value,d)}};gb.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in b&&c.push(f)}return c};var sg={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231, +cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539, +deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536, +lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154, +mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519, +royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Object.assign(H.prototype,{isColor:!0,r:1,g:1,b:1,set:function(a){a&& +a.isColor?this.copy(a):"number"===typeof a?this.setHex(a):"string"===typeof a&&this.setStyle(a);return this},setScalar:function(a){this.b=this.g=this.r=a;return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(){function a(a,c,d){0>d&&(d+=1);1d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b,c,d){b=R.euclideanModulo(b, +1);c=R.clamp(c,0,1);d=R.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c=.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-1/3));return this}}(),setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(255, +parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){var d=parseFloat(c[1])/360, +e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^\#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0=h?k/(e+f): +k/(2-e-f);switch(e){case b:g=(c-d)/k+(c 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\n\tfloat b = 3.45068 + (4.18814 + y) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\n\treturn result;\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n", +bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n", clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n", clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n", -color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transpose( const in mat3 v ) {\n\tmat3 tmp;\n\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\n\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\n\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\n\treturn tmp;\n}\n", +color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\n", cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n", -defaultnormal_vertex:"#ifdef FLIP_SIDED\n\tobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;\n",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n", -emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n",encodings_fragment:" gl_FragColor = linearToOutputTexel( gl_FragColor );\n",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n", -envmap_fragment:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n", +defaultnormal_vertex:"vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n", +emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n",encodings_fragment:" gl_FragColor = linearToOutputTexel( gl_FragColor );\n",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n", +envmap_fragment:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n", envmap_pars_fragment:"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n", envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n",envmap_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n", fog_vertex:"\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n varying float fogDepth;\n#endif\n",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n", gradientmap_pars_fragment:"#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n", lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n", -lights_pars:"uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltcMat;\tuniform sampler2D ltcMag;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n", -lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = BlinnExponentToGGXRoughness( material.specularShininess );\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( 1, 0, t.y ),\n\t\t\tvec3( 0, t.z, 0 ),\n\t\t\tvec3( t.w, 0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n", +lights_pars:"uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltcMat;\tuniform sampler2D ltcMag;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n", +lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n", lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n", lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( 1, 0, t.y ),\n\t\t\tvec3( 0, t.z, 0 ),\n\t\t\tvec3( t.w, 0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n", -lights_template:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n", -logdepthbuf_fragment:"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n", -map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n",map_particle_fragment:"#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n", +lights_template:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n", +logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif\n", +map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n",map_particle_fragment:"#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n", metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n", morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n", -normal_flip:"#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n",normal_fragment:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n", -normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n", -packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n", -premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"#ifdef USE_SKINNING\n\tvec4 mvPosition = modelViewMatrix * skinned;\n#else\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;\n",dithering_fragment:"#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n",dithering_pars_fragment:"#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n", -roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn 1.0;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n", +normal_fragment:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n", +normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n", +packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n", +premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n",dithering_fragment:"#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n",dithering_pars_fragment:"#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n", +roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n", shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n", shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n", -shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n", +shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n", skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n", -skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\tskinned = bindMatrixInverse * skinned;\n#endif\n",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n", -specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n",tonemapping_pars_fragment:"#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n", -uv_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n", -uv_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif", -uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\t#ifdef USE_SKINNING\n\t\tvec4 worldPosition = modelMatrix * skinned;\n\t#else\n\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\t#endif\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n", -cube_vert:"varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n", -depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -distanceRGBA_frag:"uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include \n#include \n#include \nvoid main () {\n\t#include \n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n",distanceRGBA_vert:"varying vec4 vWorldPosition;\n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition;\n}\n", -equirect_frag:"uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n",equirect_vert:"varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n", +skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n", +specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n",tonemapping_pars_fragment:"#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n", +uv_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\n", +uv_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif", +uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n", +cube_vert:"varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n", +depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n", +distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}\n", +equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n",equirect_vert:"varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n", linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n", -meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -meshphysical_frag:"#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n", -normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n", -normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n", +meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphysical_frag:"#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n", +normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n", +normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n", points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", -shadow_frag:"uniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n",shadow_vert:"#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"},ab={basic:{uniforms:Ha.merge([V.common, -V.aomap,V.lightmap,V.fog]),vertexShader:U.meshbasic_vert,fragmentShader:U.meshbasic_frag},lambert:{uniforms:Ha.merge([V.common,V.aomap,V.lightmap,V.emissivemap,V.fog,V.lights,{emissive:{value:new H(0)}}]),vertexShader:U.meshlambert_vert,fragmentShader:U.meshlambert_frag},phong:{uniforms:Ha.merge([V.common,V.aomap,V.lightmap,V.emissivemap,V.bumpmap,V.normalmap,V.displacementmap,V.gradientmap,V.fog,V.lights,{emissive:{value:new H(0)},specular:{value:new H(1118481)},shininess:{value:30}}]),vertexShader:U.meshphong_vert, -fragmentShader:U.meshphong_frag},standard:{uniforms:Ha.merge([V.common,V.aomap,V.lightmap,V.emissivemap,V.bumpmap,V.normalmap,V.displacementmap,V.roughnessmap,V.metalnessmap,V.fog,V.lights,{emissive:{value:new H(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:U.meshphysical_vert,fragmentShader:U.meshphysical_frag},points:{uniforms:Ha.merge([V.points,V.fog]),vertexShader:U.points_vert,fragmentShader:U.points_frag},dashed:{uniforms:Ha.merge([V.common,V.fog,{scale:{value:1}, -dashSize:{value:1},totalSize:{value:2}}]),vertexShader:U.linedashed_vert,fragmentShader:U.linedashed_frag},depth:{uniforms:Ha.merge([V.common,V.displacementmap]),vertexShader:U.depth_vert,fragmentShader:U.depth_frag},normal:{uniforms:Ha.merge([V.common,V.bumpmap,V.normalmap,V.displacementmap,{opacity:{value:1}}]),vertexShader:U.normal_vert,fragmentShader:U.normal_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:U.cube_vert,fragmentShader:U.cube_frag},equirect:{uniforms:{tEquirect:{value:null}, -tFlip:{value:-1}},vertexShader:U.equirect_vert,fragmentShader:U.equirect_frag},distanceRGBA:{uniforms:{lightPos:{value:new p}},vertexShader:U.distanceRGBA_vert,fragmentShader:U.distanceRGBA_frag}};ab.physical={uniforms:Ha.merge([ab.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:U.meshphysical_vert,fragmentShader:U.meshphysical_frag};Object.assign(id.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty(); -for(var b=0,c=a.length;bthis.max.x||a.ythis.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y},getParameter:function(a,b){return(b||new D).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.xthis.max.x||a.max.ythis.max.y?!1:!0},clampPoint:function(a,b){return(b||new D).copy(a).clamp(this.min,this.max)}, -distanceToPoint:function(){var a=new D;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});var Kf=0;Object.assign(Z.prototype,sa.prototype,{isMaterial:!0,setValues:function(a){if(void 0!== -a)for(var b in a){var c=a[b];if(void 0===c)console.warn("THREE.Material: '"+b+"' parameter is undefined.");else{var d=this[b];void 0===d?console.warn("THREE."+this.type+": '"+b+"' is not a property of this material."):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]="overdraw"===b?Number(c):c}}},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c=void 0===a;c&&(a={textures:{},images:{}});var d={metadata:{version:4.5,type:"Material", -generator:"Material.toJSON"}};d.uuid=this.uuid;d.type=this.type;""!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());this.specular&&this.specular.isColor&&(d.specular=this.specular.getHex());void 0!==this.shininess&&(d.shininess=this.shininess);void 0!==this.clearCoat&&(d.clearCoat= -this.clearCoat);void 0!==this.clearCoatRoughness&&(d.clearCoatRoughness=this.clearCoatRoughness);this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);this.alphaMap&&this.alphaMap.isTexture&&(d.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap&&this.lightMap.isTexture&&(d.lightMap=this.lightMap.toJSON(a).uuid);this.bumpMap&&this.bumpMap.isTexture&&(d.bumpMap=this.bumpMap.toJSON(a).uuid,d.bumpScale=this.bumpScale);this.normalMap&&this.normalMap.isTexture&&(d.normalMap=this.normalMap.toJSON(a).uuid, -d.normalScale=this.normalScale.toArray());this.displacementMap&&this.displacementMap.isTexture&&(d.displacementMap=this.displacementMap.toJSON(a).uuid,d.displacementScale=this.displacementScale,d.displacementBias=this.displacementBias);this.roughnessMap&&this.roughnessMap.isTexture&&(d.roughnessMap=this.roughnessMap.toJSON(a).uuid);this.metalnessMap&&this.metalnessMap.isTexture&&(d.metalnessMap=this.metalnessMap.toJSON(a).uuid);this.emissiveMap&&this.emissiveMap.isTexture&&(d.emissiveMap=this.emissiveMap.toJSON(a).uuid); -this.specularMap&&this.specularMap.isTexture&&(d.specularMap=this.specularMap.toJSON(a).uuid);this.envMap&&this.envMap.isTexture&&(d.envMap=this.envMap.toJSON(a).uuid,d.reflectivity=this.reflectivity);this.gradientMap&&this.gradientMap.isTexture&&(d.gradientMap=this.gradientMap.toJSON(a).uuid);void 0!==this.size&&(d.size=this.size);void 0!==this.sizeAttenuation&&(d.sizeAttenuation=this.sizeAttenuation);1!==this.blending&&(d.blending=this.blending);2!==this.shading&&(d.shading=this.shading);0!==this.side&& -(d.side=this.side);0!==this.vertexColors&&(d.vertexColors=this.vertexColors);1>this.opacity&&(d.opacity=this.opacity);!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;0e&&(e=m);l>f&&(f=l);q>g&&(g=q)}this.min.set(b,c,d);this.max.set(e, -f,g);return this},setFromBufferAttribute:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.count;he&&(e=m);l>f&&(f=l);q>g&&(g=q)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;bthis.max.x||a.ythis.max.y||a.zthis.max.z?!1:!0},containsBox:function(a){return this.min.x<= -a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z},getParameter:function(a,b){return(b||new p).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.xthis.max.x||a.max.ythis.max.y||a.max.zthis.max.z?!1:!0},intersectsSphere:function(){var a=new p;return function(b){this.clampPoint(b.center, -a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){var b,c;0=a.constant},clampPoint:function(a, -b){return(b||new p).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new p;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new p;return function(b){b=b||new Ga;this.getCenter(b.center);b.radius=.5*this.getSize(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a= +shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n}\n",shadow_vert:"#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"}, +mb={basic:{uniforms:Ea.merge([E.common,E.specularmap,E.envmap,E.aomap,E.lightmap,E.fog]),vertexShader:W.meshbasic_vert,fragmentShader:W.meshbasic_frag},lambert:{uniforms:Ea.merge([E.common,E.specularmap,E.envmap,E.aomap,E.lightmap,E.emissivemap,E.fog,E.lights,{emissive:{value:new H(0)}}]),vertexShader:W.meshlambert_vert,fragmentShader:W.meshlambert_frag},phong:{uniforms:Ea.merge([E.common,E.specularmap,E.envmap,E.aomap,E.lightmap,E.emissivemap,E.bumpmap,E.normalmap,E.displacementmap,E.gradientmap, +E.fog,E.lights,{emissive:{value:new H(0)},specular:{value:new H(1118481)},shininess:{value:30}}]),vertexShader:W.meshphong_vert,fragmentShader:W.meshphong_frag},standard:{uniforms:Ea.merge([E.common,E.envmap,E.aomap,E.lightmap,E.emissivemap,E.bumpmap,E.normalmap,E.displacementmap,E.roughnessmap,E.metalnessmap,E.fog,E.lights,{emissive:{value:new H(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:W.meshphysical_vert,fragmentShader:W.meshphysical_frag},points:{uniforms:Ea.merge([E.points, +E.fog]),vertexShader:W.points_vert,fragmentShader:W.points_frag},dashed:{uniforms:Ea.merge([E.common,E.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:W.linedashed_vert,fragmentShader:W.linedashed_frag},depth:{uniforms:Ea.merge([E.common,E.displacementmap]),vertexShader:W.depth_vert,fragmentShader:W.depth_frag},normal:{uniforms:Ea.merge([E.common,E.bumpmap,E.normalmap,E.displacementmap,{opacity:{value:1}}]),vertexShader:W.normal_vert,fragmentShader:W.normal_frag},cube:{uniforms:{tCube:{value:null}, +tFlip:{value:-1},opacity:{value:1}},vertexShader:W.cube_vert,fragmentShader:W.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:W.equirect_vert,fragmentShader:W.equirect_frag},distanceRGBA:{uniforms:Ea.merge([E.common,E.displacementmap,{referencePosition:{value:new p},nearDistance:{value:1},farDistance:{value:1E3}}]),vertexShader:W.distanceRGBA_vert,fragmentShader:W.distanceRGBA_frag},shadow:{uniforms:Ea.merge([E.lights,E.fog,{color:{value:new H(0)},opacity:{value:1}}]),vertexShader:W.shadow_vert, +fragmentShader:W.shadow_frag}};mb.physical={uniforms:Ea.merge([mb.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:W.meshphysical_vert,fragmentShader:W.meshphysical_frag};Object.assign(kd.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;bthis.max.x||a.ythis.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<= +this.max.y},getParameter:function(a,b){return(b||new C).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.xthis.max.x||a.max.ythis.max.y?!1:!0},clampPoint:function(a,b){return(b||new C).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new C;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min); +this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});tc.prototype=Object.create(ea.prototype);tc.prototype.constructor=tc;var Lf=0;Object.assign(Q.prototype,ja.prototype,{isMaterial:!0,onBeforeCompile:function(){},setValues:function(a){if(void 0!==a)for(var b in a){var c=a[b];if(void 0===c)console.warn("THREE.Material: '"+ +b+"' parameter is undefined.");else if("shading"===b)console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===c?!0:!1;else{var d=this[b];void 0===d?console.warn("THREE."+this.type+": '"+b+"' is not a property of this material."):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]="overdraw"===b?Number(c):c}}},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c= +void 0===a||"string"===typeof a;c&&(a={textures:{},images:{}});var d={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};d.uuid=this.uuid;d.type=this.type;""!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());1!==this.emissiveIntensity&&(d.emissiveIntensity=this.emissiveIntensity); +this.specular&&this.specular.isColor&&(d.specular=this.specular.getHex());void 0!==this.shininess&&(d.shininess=this.shininess);void 0!==this.clearCoat&&(d.clearCoat=this.clearCoat);void 0!==this.clearCoatRoughness&&(d.clearCoatRoughness=this.clearCoatRoughness);this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);this.alphaMap&&this.alphaMap.isTexture&&(d.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap&&this.lightMap.isTexture&&(d.lightMap=this.lightMap.toJSON(a).uuid);this.bumpMap&& +this.bumpMap.isTexture&&(d.bumpMap=this.bumpMap.toJSON(a).uuid,d.bumpScale=this.bumpScale);this.normalMap&&this.normalMap.isTexture&&(d.normalMap=this.normalMap.toJSON(a).uuid,d.normalScale=this.normalScale.toArray());this.displacementMap&&this.displacementMap.isTexture&&(d.displacementMap=this.displacementMap.toJSON(a).uuid,d.displacementScale=this.displacementScale,d.displacementBias=this.displacementBias);this.roughnessMap&&this.roughnessMap.isTexture&&(d.roughnessMap=this.roughnessMap.toJSON(a).uuid); +this.metalnessMap&&this.metalnessMap.isTexture&&(d.metalnessMap=this.metalnessMap.toJSON(a).uuid);this.emissiveMap&&this.emissiveMap.isTexture&&(d.emissiveMap=this.emissiveMap.toJSON(a).uuid);this.specularMap&&this.specularMap.isTexture&&(d.specularMap=this.specularMap.toJSON(a).uuid);this.envMap&&this.envMap.isTexture&&(d.envMap=this.envMap.toJSON(a).uuid,d.reflectivity=this.reflectivity);this.gradientMap&&this.gradientMap.isTexture&&(d.gradientMap=this.gradientMap.toJSON(a).uuid);void 0!==this.size&& +(d.size=this.size);void 0!==this.sizeAttenuation&&(d.sizeAttenuation=this.sizeAttenuation);1!==this.blending&&(d.blending=this.blending);!0===this.flatShading&&(d.flatShading=this.flatShading);0!==this.side&&(d.side=this.side);0!==this.vertexColors&&(d.vertexColors=this.vertexColors);1>this.opacity&&(d.opacity=this.opacity);!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;0!==this.rotation&&(d.rotation=this.rotation); +1!==this.linewidth&&(d.linewidth=this.linewidth);void 0!==this.dashSize&&(d.dashSize=this.dashSize);void 0!==this.gapSize&&(d.gapSize=this.gapSize);void 0!==this.scale&&(d.scale=this.scale);!0===this.dithering&&(d.dithering=!0);0e&&(e=l);q>f&&(f=q);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromBufferAttribute:function(a){for(var b= +Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.count;he&&(e=l);q>f&&(f=q);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;bthis.max.x||a.ythis.max.y||a.zthis.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<= +this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z},getParameter:function(a,b){return(b||new p).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.xthis.max.x||a.max.ythis.max.y||a.max.zthis.max.z?!1:!0},intersectsSphere:function(){var a=new p;return function(b){this.clampPoint(b.center, +a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){if(0=a.constant},clampPoint:function(a, +b){return(b||new p).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new p;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new p;return function(b){b=b||new Da;this.getCenter(b.center);b.radius=.5*this.getSize(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a= [new p,new p,new p,new p,new p,new p,new p,new p];return function(b){if(this.isEmpty())return this;a[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(b); -a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});Object.assign(Ga.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new Ta;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e=0,f=0,g=b.length;f=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<= -b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(this.center.dot(a.normal)-a.constant)<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a),d=b||new p;d.copy(a);c>this.radius*this.radius&&(d.sub(this.center).normalize(),d.multiplyScalar(this.radius).add(this.center));return d},getBoundingBox:function(a){a=a||new Ta;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a); -this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}});Object.assign(Ka.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,k){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=k;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){var b= -this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;cc;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]= -c[8];return a}});Object.assign(wa.prototype,{set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=new p,b=new p;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(),clone:function(){return(new this.constructor).copy(this)}, -copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){return this.orthoPoint(a,b).sub(a).negate()},orthoPoint:function(a, -b){var c=this.distanceToPoint(a);return(b||new p).copy(this.normal).multiplyScalar(c)},intersectLine:function(){var a=new p;return function(b,c){var d=c||new p,e=b.delta(a),f=this.normal.dot(e);if(0===f){if(0===this.distanceToPoint(b.start))return d.copy(b.start)}else return f=-(b.start.dot(this.normal)+this.constant)/f,0>f||1b&&0a&&0c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],k=c[6],m=c[7],l=c[8],q=c[9],n=c[10],r=c[11],p=c[12],t=c[13], -y=c[14],c=c[15];b[0].setComponents(f-a,m-g,r-l,c-p).normalize();b[1].setComponents(f+a,m+g,r+l,c+p).normalize();b[2].setComponents(f+d,m+h,r+q,c+t).normalize();b[3].setComponents(f-d,m-h,r-q,c-t).normalize();b[4].setComponents(f-e,m-k,r-n,c-y).normalize();b[5].setComponents(f+e,m+k,r+n,c+y).normalize();return this},intersectsObject:function(){var a=new Ga;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(), -intersectsSprite:function(){var a=new Ga;return function(b){a.center.set(0,0,0);a.radius=.7071067811865476;a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)e;e++){var f=d[e];a.x=0g&&0>f)return!1}return!0}}(),containsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});Object.assign(hb.prototype,{set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.origin.copy(a.origin); -this.direction.copy(a.direction);return this},at:function(a,b){return(b||new p).copy(this.direction).multiplyScalar(a).add(this.origin)},lookAt:function(a){this.direction.copy(a).sub(this.origin).normalize();return this},recast:function(){var a=new p;return function(b){this.origin.copy(this.at(b,a));return this}}(),closestPointToPoint:function(a,b){var c=b||new p;c.subVectors(a,this.origin);var d=c.dot(this.direction);return 0>d?c.copy(this.origin):c.copy(this.direction).multiplyScalar(d).add(this.origin)}, -distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new p;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceToSquared(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceToSquared(b)}}(),distanceSqToSegment:function(){var a=new p,b=new p,c=new p;return function(d,e,f,g){a.copy(d).add(e).multiplyScalar(.5);b.copy(e).sub(d).normalize();c.copy(this.origin).sub(a); -var h=.5*d.distanceTo(e),k=-this.direction.dot(b),m=c.dot(this.direction),l=-c.dot(b),q=c.lengthSq(),n=Math.abs(1-k*k),r;0=-r?e<=r?(h=1/n,d*=h,e*=h,k=d*(d+k*e+2*m)+e*(k*d+e+2*l)+q):(e=h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+q):(e=-h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+q):e<=-r?(d=Math.max(0,-(-k*h+m)),e=0f)return null;f=Math.sqrt(f-e);e=d-f;d+=f;return 0>e&&0>d?null:0>e?this.at(d,c):this.at(e,c)}}(),intersectsSphere:function(a){return this.distanceToPoint(a.center)<= -a.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){var c=this.distanceToPlane(a);return null===c?null:this.at(c,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin);return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},intersectBox:function(a,b){var c,d,e,f,g;d=1/this.direction.x;f=1/this.direction.y;g=1/this.direction.z; -var h=this.origin;0<=d?(c=(a.min.x-h.x)*d,d*=a.max.x-h.x):(c=(a.max.x-h.x)*d,d*=a.min.x-h.x);0<=f?(e=(a.min.y-h.y)*f,f*=a.max.y-h.y):(e=(a.max.y-h.y)*f,f*=a.min.y-h.y);if(c>f||e>d)return null;if(e>c||c!==c)c=e;if(fg||e>d)return null;if(e>c||c!==c)c=e;if(gd?null:this.at(0<=c?c:d,b)},intersectsBox:function(){var a=new p;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a= -new p,b=new p,c=new p,d=new p;return function(e,f,g,h,k){b.subVectors(f,e);c.subVectors(g,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0f)h=-1,f=-f;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;g=h*this.direction.dot(b.cross(a));if(0>g||e+g>f)return null;e=-h*a.dot(d);return 0>e?null:this.at(e/f,k)}}(),applyMatrix4:function(a){this.direction.add(this.origin).applyMatrix4(a);this.origin.applyMatrix4(a); -this.direction.sub(this.origin);this.direction.normalize();return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});bb.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");bb.DefaultOrder="XYZ";Object.defineProperties(bb.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z= -a;this.onChangeCallback()}},order:{get:function(){return this._order},set:function(a){this._order=a;this.onChangeCallback()}}});Object.assign(bb.prototype,{isEuler:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a, -b,c){var d=Y.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],k=e[5],m=e[9],l=e[2],q=e[6],e=e[10];b=b||this._order;"XYZ"===b?(this._y=Math.asin(d(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(-m,e),this._z=Math.atan2(-f,a)):(this._x=Math.atan2(q,k),this._z=0)):"YXZ"===b?(this._x=Math.asin(-d(m,-1,1)),.99999>Math.abs(m)?(this._y=Math.atan2(g,e),this._z=Math.atan2(h,k)):(this._y=Math.atan2(-l,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(q,-1,1)),.99999>Math.abs(q)?(this._y=Math.atan2(-l,e),this._z= -Math.atan2(-f,k)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(l,-1,1)),.99999>Math.abs(l)?(this._x=Math.atan2(q,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,k))):"YZX"===b?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-m,k),this._y=Math.atan2(-l,a)):(this._x=0,this._y=Math.atan2(g,e))):"XZY"===b?(this._z=Math.asin(-d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(q,k),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-m,e),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+ -b);this._order=b;if(!1!==c)this.onChangeCallback();return this},setFromQuaternion:function(){var a=new J;return function(b,c,d){a.makeRotationFromQuaternion(b);return this.setFromRotationMatrix(a,c,d)}}(),setFromVector3:function(a,b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(){var a=new qa;return function(b){a.setFromEuler(this);return this.setFromQuaternion(a,b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x= -a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,this._y,this._z):new p(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(Rd.prototype,{set:function(a){this.mask=1<=b.x+b.y}}()});Object.assign(Ua.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)}, -copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},area:function(){var a=new p,b=new p;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b);return.5*a.cross(b).length()}}(),midpoint:function(a){return(a||new p).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return Ua.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new wa).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return Ua.barycoordFromPoint(a, -this.a,this.b,this.c,b)},containsPoint:function(a){return Ua.containsPoint(a,this.a,this.b,this.c)},closestPointToPoint:function(){var a=new wa,b=[new Hb,new Hb,new Hb],c=new p,d=new p;return function(e,f){var g=f||new p,h=Infinity;a.setFromCoplanarPoints(this.a,this.b,this.c);a.projectPoint(e,c);if(!0===this.containsPoint(c))g.copy(c);else{b[0].set(this.a,this.b);b[1].set(this.b,this.c);b[2].set(this.c,this.a);for(var k=0;kd;d++)if(e[d]===e[(d+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(e=a[f],this.faces.splice(e,1),c=0,g=this.faceVertexUvs.length;c=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<= +b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(a.distanceToPoint(this.center))<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a);b=b||new p;b.copy(a);c>this.radius*this.radius&&(b.sub(this.center).normalize(),b.multiplyScalar(this.radius).add(this.center));return b},getBoundingBox:function(a){a=a||new Oa;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a); +this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}});Object.assign(Aa.prototype,{set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a= +new p,b=new p;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+ +this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){return(b||new p).copy(this.normal).multiplyScalar(-this.distanceToPoint(a)).add(a)},intersectLine:function(){var a=new p;return function(b,c){c=c||new p;var d=b.delta(a),e=this.normal.dot(d);if(0===e){if(0===this.distanceToPoint(b.start))return c.copy(b.start)}else if(e=-(b.start.dot(this.normal)+this.constant)/e,!(0>e||1b&&0a&&0c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes, +c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],k=c[6],l=c[7],q=c[8],n=c[9],m=c[10],r=c[11],p=c[12],v=c[13],w=c[14],c=c[15];b[0].setComponents(f-a,l-g,r-q,c-p).normalize();b[1].setComponents(f+a,l+g,r+q,c+p).normalize();b[2].setComponents(f+d,l+h,r+n,c+v).normalize();b[3].setComponents(f-d,l-h,r-n,c-v).normalize();b[4].setComponents(f-e,l-k,r-m,c-w).normalize();b[5].setComponents(f+e,l+k,r+m,c+w).normalize();return this},intersectsObject:function(){var a=new Da;return function(b){var c= +b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSprite:function(){var a=new Da;return function(b){a.center.set(0,0,0);a.radius=.7071067811865476;a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)e;e++){var f=d[e];a.x=0g&&0>f)return!1}return!0}}(),containsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});Ya.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" "); +Ya.DefaultOrder="XYZ";Object.defineProperties(Ya.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},order:{get:function(){return this._order},set:function(a){this._order=a;this.onChangeCallback()}}});Object.assign(Ya.prototype,{isEuler:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z= +c;this._order=d||this._order;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=R.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],k=e[5],l=e[9],q=e[2],n=e[6],e=e[10];b=b||this._order;"XYZ"===b?(this._y=Math.asin(d(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(-l,e),this._z= +Math.atan2(-f,a)):(this._x=Math.atan2(n,k),this._z=0)):"YXZ"===b?(this._x=Math.asin(-d(l,-1,1)),.99999>Math.abs(l)?(this._y=Math.atan2(g,e),this._z=Math.atan2(h,k)):(this._y=Math.atan2(-q,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(n,-1,1)),.99999>Math.abs(n)?(this._y=Math.atan2(-q,e),this._z=Math.atan2(-f,k)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(q,-1,1)),.99999>Math.abs(q)?(this._x=Math.atan2(n,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,k))):"YZX"=== +b?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-l,k),this._y=Math.atan2(-q,a)):(this._x=0,this._y=Math.atan2(g,e))):"XZY"===b?(this._z=Math.asin(-d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(n,k),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-l,e),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+b);this._order=b;if(!1!==c)this.onChangeCallback();return this},setFromQuaternion:function(){var a=new K;return function(b,c,d){a.makeRotationFromQuaternion(b); +return this.setFromRotationMatrix(a,c,d)}}(),setFromVector3:function(a,b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(){var a=new Z;return function(b){a.setFromEuler(this);return this.setFromQuaternion(a,b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0=== +b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,this._y,this._z):new p(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(Pd.prototype,{set:function(a){this.mask=1<g;g++)if(d[g]===d[(g+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(d=a[f],this.faces.splice(d,1),c=0,e=this.faceVertexUvs.length;cb.far?null:{distance:c,point:x.clone(),object:a}}function c(c,d,e,f,m,l,u,q){g.fromBufferAttribute(f,l);h.fromBufferAttribute(f,u);k.fromBufferAttribute(f,q);if(c=b(c,d,e,g,h,k,y))m&&(n.fromBufferAttribute(m,l),r.fromBufferAttribute(m,u),z.fromBufferAttribute(m,q),c.uv=a(y,g,h,k,n,r,z)),c.face=new Va(l,u,q,Ua.normal(g, -h,k)),c.faceIndex=l;return c}var d=new J,e=new hb,f=new Ga,g=new p,h=new p,k=new p,m=new p,l=new p,q=new p,n=new D,r=new D,z=new D,t=new p,y=new p,x=new p;return function(p,t){var w=this.geometry,x=this.material,C=this.matrixWorld;if(void 0!==x&&(null===w.boundingSphere&&w.computeBoundingSphere(),f.copy(w.boundingSphere),f.applyMatrix4(C),!1!==p.ray.intersectsSphere(f)&&(d.getInverse(C),e.copy(p.ray).applyMatrix4(d),null===w.boundingBox||!1!==e.intersectsBox(w.boundingBox)))){var E;if(w.isBufferGeometry){var F, -D,x=w.index,B=w.attributes.position,C=w.attributes.uv,ca,I;if(null!==x)for(ca=0,I=x.count;caf||(f=d.ray.origin.distanceTo(a),fd.far||e.push({distance:f,point:a.clone(),face:null,object:this}))}}(),clone:function(){return(new this.constructor(this.material)).copy(this)}}); -Bc.prototype=Object.assign(Object.create(B.prototype),{constructor:Bc,copy:function(a){B.prototype.copy.call(this,a,!1);a=a.levels;for(var b=0,c=a.length;b=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break; -for(;ef||(l.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(l),td.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else for(g=0,z=r.length/3-1;gf||(l.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(l),td.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else if(g.isGeometry)for(k=g.vertices,m=k.length,g=0;gf||(l.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(l),td.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld), -index:g,face:null,faceIndex:null,object:this}))}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});da.prototype=Object.assign(Object.create(ya.prototype),{constructor:da,isLineSegments:!0});pd.prototype=Object.assign(Object.create(ya.prototype),{constructor:pd,isLineLoop:!0});La.prototype=Object.create(Z.prototype);La.prototype.constructor=La;La.prototype.isPointsMaterial=!0;La.prototype.copy=function(a){Z.prototype.copy.call(this,a);this.color.copy(a.color); -this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;return this};Mb.prototype=Object.assign(Object.create(B.prototype),{constructor:Mb,isPoints:!0,raycast:function(){var a=new J,b=new hb,c=new Ga;return function(d,e){function f(a,c){var f=b.distanceSqToPoint(a);if(fd.far||e.push({distance:m,distanceToRay:Math.sqrt(f),point:h.clone(),index:c,face:null,object:g})}}var g=this,h=this.geometry, -k=this.matrixWorld,m=d.params.Points.threshold;null===h.boundingSphere&&h.computeBoundingSphere();c.copy(h.boundingSphere);c.applyMatrix4(k);c.radius+=m;if(!1!==d.ray.intersectsSphere(c)){a.getInverse(k);b.copy(d.ray).applyMatrix4(a);var m=m/((this.scale.x+this.scale.y+this.scale.z)/3),l=m*m,m=new p;if(h.isBufferGeometry){var q=h.index,h=h.attributes.position.array;if(null!==q)for(var n=q.array,q=0,r=n.length;qc)return null;var d=[],e=[],f=[],g,h,k;if(0=m--){console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()");break}g=h;c<=g&&(g=0);h=g+1;c<=h&&(h=0);k=h+1;c<=k&&(k=0);var l;a:{var q,n,r,p,t,y,x,v;q=a[e[g]].x;n=a[e[g]].y;r=a[e[h]].x;p=a[e[h]].y;t=a[e[k]].x;y=a[e[k]].y;if(0>=(r-q)*(y-n)-(p-n)*(t-q))l=!1;else{var G,w,O,C,E,F,D,B,I,H;G=t-r;w=y-p;O=q-t;C=n-y;E=r-q;F=p-n; -for(l=0;l=-Number.EPSILON&&B>=-Number.EPSILON&&D>=-Number.EPSILON)){l=!1;break a}l=!0}}if(l){d.push([a[e[g]],a[e[h]],a[e[k]]]);f.push([e[g],e[h],e[k]]);g=h;for(k=h+1;kNumber.EPSILON){if(0u||u>q)return[];k=m*l-k*n;if(0>k||k>q)return[]}else{if(0c?[]:k===c?f?[]:[g]:a<=c?[g,h]:[g,m]}function f(a,b,c,d){var e=b.x-a.x,f=b.y-a.y;b=c.x-a.x; -c=c.y-a.y;var g=d.x-a.x;d=d.y-a.y;a=e*c-f*b;e=e*d-f*g;return Math.abs(a)>Number.EPSILON?(b=g*c-d*b,0e&&(e=d);var g=a+1;g>d&&(g=0);d=f(h[a],h[e],h[g],k[b]);if(!d)return!1;d=k.length- -1;e=b-1;0>e&&(e=d);g=b+1;g>d&&(g=0);return(d=f(k[b],k[e],k[g],h[a]))?!0:!1}function d(a,b){var c,f;for(c=0;cJ){console.log("Infinite Loop! Holes left:"+ -m.length+", Probably Hole outside Shape!");break}for(n=D;nk;k++)l=m[k].x+":"+m[k].y,l=q[l],void 0!== -l&&(m[k]=l);return n.concat()},isClockWise:function(a){return 0>za.area(a)}};db.prototype=Object.create(M.prototype);db.prototype.constructor=db;Fa.prototype=Object.create(I.prototype);Fa.prototype.constructor=Fa;Fa.prototype.getArrays=function(){var a=this.getAttribute("position"),a=a?Array.prototype.slice.call(a.array):[],b=this.getAttribute("uv"),b=b?Array.prototype.slice.call(b.array):[],c=this.index,c=c?Array.prototype.slice.call(c.array):[];return{position:a,uv:b,index:c}};Fa.prototype.addShapeList= -function(a,b){var c=a.length;b.arrays=this.getArrays();for(var d=0;dNumber.EPSILON){var k= -Math.sqrt(h),m=Math.sqrt(d*d+g*g),h=b.x-f/k;b=b.y+e/k;g=((c.x-g/m-h)*g-(c.y+d/m-b)*d)/(e*g-f*d);d=h+e*g-a.x;e=b+f*g-a.y;f=d*d+e*e;if(2>=f)return new D(d,e);f=Math.sqrt(f/2)}else a=!1,e>Number.EPSILON?d>Number.EPSILON&&(a=!0):e<-Number.EPSILON?d<-Number.EPSILON&&(a=!0):Math.sign(f)===Math.sign(g)&&(a=!0),a?(d=-f,f=Math.sqrt(h)):(d=e,e=f,f=Math.sqrt(h/2));return new D(d/f,e/f)}function e(a,b){var c,d;for(N=a.length;0<=--N;){c=N;d=N-1;0>d&&(d=a.length-1);var e,f=G+2*y;for(e=0;eMath.abs(g-k)?[new D(a,1-c),new D(h, -1-d),new D(m,1-e),new D(q,1-b)]:[new D(g,1-c),new D(k,1-d),new D(l,1-e),new D(n,1-b)]}};Oc.prototype=Object.create(M.prototype);Oc.prototype.constructor=Oc;Wb.prototype=Object.create(Fa.prototype);Wb.prototype.constructor=Wb;Pc.prototype=Object.create(M.prototype);Pc.prototype.constructor=Pc;nb.prototype=Object.create(I.prototype);nb.prototype.constructor=nb;Qc.prototype=Object.create(M.prototype);Qc.prototype.constructor=Qc;Xb.prototype=Object.create(I.prototype);Xb.prototype.constructor=Xb;Rc.prototype= -Object.create(M.prototype);Rc.prototype.constructor=Rc;Yb.prototype=Object.create(I.prototype);Yb.prototype.constructor=Yb;Zb.prototype=Object.create(M.prototype);Zb.prototype.constructor=Zb;$b.prototype=Object.create(I.prototype);$b.prototype.constructor=$b;ac.prototype=Object.create(I.prototype);ac.prototype.constructor=ac;ob.prototype=Object.create(M.prototype);ob.prototype.constructor=ob;Wa.prototype=Object.create(I.prototype);Wa.prototype.constructor=Wa;Sc.prototype=Object.create(ob.prototype); -Sc.prototype.constructor=Sc;Tc.prototype=Object.create(Wa.prototype);Tc.prototype.constructor=Tc;Uc.prototype=Object.create(M.prototype);Uc.prototype.constructor=Uc;bc.prototype=Object.create(I.prototype);bc.prototype.constructor=bc;var Ma=Object.freeze({WireframeGeometry:Ob,ParametricGeometry:Fc,ParametricBufferGeometry:Pb,TetrahedronGeometry:Hc,TetrahedronBufferGeometry:Qb,OctahedronGeometry:Ic,OctahedronBufferGeometry:mb,IcosahedronGeometry:Jc,IcosahedronBufferGeometry:Rb,DodecahedronGeometry:Kc, -DodecahedronBufferGeometry:Sb,PolyhedronGeometry:Gc,PolyhedronBufferGeometry:ia,TubeGeometry:Lc,TubeBufferGeometry:Tb,TorusKnotGeometry:Mc,TorusKnotBufferGeometry:Ub,TorusGeometry:Nc,TorusBufferGeometry:Vb,TextGeometry:Oc,TextBufferGeometry:Wb,SphereGeometry:Pc,SphereBufferGeometry:nb,RingGeometry:Qc,RingBufferGeometry:Xb,PlaneGeometry:xc,PlaneBufferGeometry:lb,LatheGeometry:Rc,LatheBufferGeometry:Yb,ShapeGeometry:Zb,ShapeBufferGeometry:$b,ExtrudeGeometry:db,ExtrudeBufferGeometry:Fa,EdgesGeometry:ac, -ConeGeometry:Sc,ConeBufferGeometry:Tc,CylinderGeometry:ob,CylinderBufferGeometry:Wa,CircleGeometry:Uc,CircleBufferGeometry:bc,BoxGeometry:Ib,BoxBufferGeometry:kb});cc.prototype=Object.create(Ea.prototype);cc.prototype.constructor=cc;cc.prototype.isShadowMaterial=!0;dc.prototype=Object.create(Ea.prototype);dc.prototype.constructor=dc;dc.prototype.isRawShaderMaterial=!0;Ra.prototype=Object.create(Z.prototype);Ra.prototype.constructor=Ra;Ra.prototype.isMeshStandardMaterial=!0;Ra.prototype.copy=function(a){Z.prototype.copy.call(this, -a);this.defines={STANDARD:""};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap; -this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap;this.metalnessMap=a.metalnessMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.envMapIntensity=a.envMapIntensity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals= -a.morphNormals;return this};pb.prototype=Object.create(Ra.prototype);pb.prototype.constructor=pb;pb.prototype.isMeshPhysicalMaterial=!0;pb.prototype.copy=function(a){Ra.prototype.copy.call(this,a);this.defines={PHYSICAL:""};this.reflectivity=a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};ta.prototype=Object.create(Z.prototype);ta.prototype.constructor=ta;ta.prototype.isMeshPhongMaterial=!0;ta.prototype.copy=function(a){Z.prototype.copy.call(this, -a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale= -a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};qb.prototype= -Object.create(ta.prototype);qb.prototype.constructor=qb;qb.prototype.isMeshToonMaterial=!0;qb.prototype.copy=function(a){ta.prototype.copy.call(this,a);this.gradientMap=a.gradientMap;return this};rb.prototype=Object.create(Z.prototype);rb.prototype.constructor=rb;rb.prototype.isMeshNormalMaterial=!0;rb.prototype.copy=function(a){Z.prototype.copy.call(this,a);this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap; -this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};sb.prototype=Object.create(Z.prototype);sb.prototype.constructor=sb;sb.prototype.isMeshLambertMaterial=!0;sb.prototype.copy=function(a){Z.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity= -a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin; -this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};tb.prototype=Object.create(Z.prototype);tb.prototype.constructor=tb;tb.prototype.isLineDashedMaterial=!0;tb.prototype.copy=function(a){Z.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var lg=Object.freeze({ShadowMaterial:cc,SpriteMaterial:cb,RawShaderMaterial:dc,ShaderMaterial:Ea,PointsMaterial:La, -MeshPhysicalMaterial:pb,MeshStandardMaterial:Ra,MeshPhongMaterial:ta,MeshToonMaterial:qb,MeshNormalMaterial:rb,MeshLambertMaterial:sb,MeshDepthMaterial:$a,MeshBasicMaterial:Na,LineDashedMaterial:tb,LineBasicMaterial:ha,Material:Z}),hd={enabled:!1,files:{},add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}},Aa=new Zd;Object.assign(ua.prototype,{load:function(a,b, -c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);var e=this,f=hd.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){var h=g[1],k=!!g[2],g=g[3],g=window.decodeURIComponent(g);k&&(g=window.atob(g));try{var m,l=(this.responseType||"").toLowerCase();switch(l){case "arraybuffer":case "blob":m=new ArrayBuffer(g.length);for(var q=new Uint8Array(m),k=0;k=e)break a;else{f=b[1];a=e)break b}d=c;c=0}}for(;c>>1,ab;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),d=this.getValueSize(),this.times=va.arraySlice(c,e,f),this.values=va.arraySlice(this.values,e*d,f*d);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error("invalid value size in track",this),a=!1);var c=this.times,b=this.values,d=c.length;0===d&&(console.error("track is empty", -this),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if("number"===typeof g&&isNaN(g)){console.error("time is not a valid number",this,f,g);a=!1;break}if(null!==e&&e>g){console.error("out of order keys",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&va.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error("value is not a valid number",this,f,d);a=!1;break}return a},optimize:function(){for(var a=this.times,b=this.values,c=this.getValueSize(),d=2302===this.getInterpolation(),e=1, -f=a.length-1,g=1;gm.opacity&&(m.transparent=!0);d.setTextures(k);return d.parse(m)}}()});Object.assign(ce.prototype, -{load:function(a,b,c,d){var e=this,f=this.texturePath&&"string"===typeof this.texturePath?this.texturePath:gc.prototype.extractUrlBase(a),g=new ua(this.manager);g.setResponseType("json");g.setWithCredentials(this.withCredentials);g.load(a,function(c){var d=c.metadata;if(void 0!==d&&(d=d.type,void 0!==d)){if("object"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.ObjectLoader instead.");return}if("scene"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+ -" should be loaded with THREE.SceneLoader instead.");return}}c=e.parse(c,f);b(c.geometry,c.materials)},c,d)},setTexturePath:function(a){this.texturePath=a},parse:function(){return function(a,b){void 0!==a.data&&(a=a.data);a.scale=void 0!==a.scale?1/a.scale:1;var c=new M,d=a,e,f,g,h,k,m,l,q,n,r,z,t,y,x,v=d.faces;n=d.vertices;var G=d.normals,w=d.colors;m=d.scale;var B=0;if(void 0!==d.uvs){for(e=0;ef;f++)q=v[h++],x=y[2*q],q=y[2*q+1],x=new D(x,q),2!==f&&c.faceVertexUvs[e][g].push(x),0!==f&&c.faceVertexUvs[e][g+ -1].push(x);l&&(l=3*v[h++],r.normal.set(G[l++],G[l++],G[l]),t.normal.copy(r.normal));if(z)for(e=0;4>e;e++)l=3*v[h++],z=new p(G[l++],G[l++],G[l]),2!==e&&r.vertexNormals.push(z),0!==e&&t.vertexNormals.push(z);m&&(m=v[h++],m=w[m],r.color.setHex(m),t.color.setHex(m));if(n)for(e=0;4>e;e++)m=v[h++],m=w[m],2!==e&&r.vertexColors.push(new H(m)),0!==e&&t.vertexColors.push(new H(m));c.faces.push(r);c.faces.push(t)}else{r=new Va;r.a=v[h++];r.b=v[h++];r.c=v[h++];g&&(g=v[h++],r.materialIndex=g);g=c.faces.length; -if(e)for(e=0;ef;f++)q=v[h++],x=y[2*q],q=y[2*q+1],x=new D(x,q),c.faceVertexUvs[e][g].push(x);l&&(l=3*v[h++],r.normal.set(G[l++],G[l++],G[l]));if(z)for(e=0;3>e;e++)l=3*v[h++],z=new p(G[l++],G[l++],G[l]),r.vertexNormals.push(z);m&&(m=v[h++],r.color.setHex(w[m]));if(n)for(e=0;3>e;e++)m=v[h++],r.vertexColors.push(new H(w[m]));c.faces.push(r)}d=a;h=void 0!==d.influencesPerVertex?d.influencesPerVertex:2;if(d.skinWeights)for(k=0,v=d.skinWeights.length;k< -v;k+=h)c.skinWeights.push(new ga(d.skinWeights[k],1k)g=d+1;else if(0b&&(b=0);1Number.EPSILON&&(g.normalize(),c=Math.acos(Y.clamp(d[k-1].dot(d[k]),-1,1)),e[k].applyMatrix4(h.makeRotationAxis(g,c))),f[k].crossVectors(d[k],e[k]);if(!0===b)for(c=Math.acos(Y.clamp(e[0].dot(e[a]),-1,1)),c/=a,0=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();return a[a.length-1]},updateArcLengths:function(){this.needsUpdate=!0;this.cacheLengths=null;this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&& -this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var a=[],b=0,c=0,d=this.curves.length;cc;)c+=b;for(;c>b;)c-=b;cb.length-2?b.length-1:a+1],b=b[a>b.length-3?b.length-1:a+2];return new D(Se(c,d.x,e.x,f.x,b.x),Se(c,d.y,e.y,f.y,b.y))};hc.prototype=Object.create(na.prototype);hc.prototype.constructor=hc;hc.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2,e=this.v3;return new D(yb(a,b.x,c.x, -d.x,e.x),yb(a,b.y,c.y,d.y,e.y))};ic.prototype=Object.create(na.prototype);ic.prototype.constructor=ic;ic.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2;return new D(xb(a,b.x,c.x,d.x),xb(a,b.y,c.y,d.y))};var ue=Object.assign(Object.create(Yc.prototype),{fromPoints:function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;bNumber.EPSILON){if(0>l&&(g=b[f],k=-k, -h=b[e],l=-l),!(a.yh.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=l*(a.x-g.x)-k*(a.y-g.y);if(0===e)return!0;0>e||(d=!d)}}else if(a.y===g.y&&(h.x<=a.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}var e=za.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);var g,h,k,l=[];if(1===f.length)return h=f[0],k=new Ab,k.curves=h.curves,l.push(k),l;var p=!e(f[0].getPoints()),p=a?!p:p;k=[];var q=[],n=[],r=0,z;q[r]=void 0;n[r]=[];for(var t=0,y=f.length;ta?b.copy(this.origin):b.copy(this.direction).multiplyScalar(a).add(this.origin)},distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new p;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceToSquared(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceToSquared(b)}}(),distanceSqToSegment:function(){var a= +new p,b=new p,c=new p;return function(d,e,f,g){a.copy(d).add(e).multiplyScalar(.5);b.copy(e).sub(d).normalize();c.copy(this.origin).sub(a);var h=.5*d.distanceTo(e),k=-this.direction.dot(b),l=c.dot(this.direction),q=-c.dot(b),n=c.lengthSq(),m=Math.abs(1-k*k);if(0=-p?e<=p?(h=1/m,d*=h,e*=h,k=d*(d+k*e+2*l)+e*(k*d+e+2*q)+n):(e=h,d=Math.max(0,-(k*e+l)),k=-d*d+e*(e+2*q)+n):(e=-h,d=Math.max(0,-(k*e+l)),k=-d*d+e*(e+2*q)+n):e<=-p?(d=Math.max(0,-(-k*h+l)),e=0b)return null; +b=Math.sqrt(b-e);e=d-b;d+=b;return 0>e&&0>d?null:0>e?this.at(d,c):this.at(e,c)}}(),intersectsSphere:function(a){return this.distanceToPoint(a.center)<=a.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){a=this.distanceToPlane(a);return null===a?null:this.at(a,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin); +return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},intersectBox:function(a,b){var c=1/this.direction.x;var d=1/this.direction.y;var e=1/this.direction.z,f=this.origin;if(0<=c){var g=(a.min.x-f.x)*c;c*=a.max.x-f.x}else g=(a.max.x-f.x)*c,c*=a.min.x-f.x;if(0<=d){var h=(a.min.y-f.y)*d;d*=a.max.y-f.y}else h=(a.max.y-f.y)*d,d*=a.min.y-f.y;if(g>d||h>c)return null;if(h>g||g!==g)g=h;if(da||h>c)return null; +if(h>g||g!==g)g=h;if(ac?null:this.at(0<=g?g:c,b)},intersectsBox:function(){var a=new p;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a=new p,b=new p,c=new p,d=new p;return function(e,f,g,h,k){b.subVectors(f,e);c.subVectors(g,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0f)h=-1,f=-f;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null; +g=h*this.direction.dot(b.cross(a));if(0>g||e+g>f)return null;e=-h*a.dot(d);return 0>e?null:this.at(e/f,k)}}(),applyMatrix4:function(a){this.origin.applyMatrix4(a);this.direction.transformDirection(a);return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});Object.assign(Mb.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start); +this.end.copy(a.end);return this},getCenter:function(a){return(a||new p).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){return(a||new p).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(a,b){b=b||new p;return this.delta(b).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new p,b=new p;return function(c,d){a.subVectors(c, +this.start);b.subVectors(this.end,this.start);c=b.dot(b);c=b.dot(a)/c;d&&(c=R.clamp(c,0,1));return c}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new p;return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}});Object.assign(Qa,{normal:function(){var a=new p;return function(b,c,d,e){e=e||new p; +e.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0=b.x+b.y}}()});Object.assign(Qa.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},area:function(){var a=new p,b=new p;return function(){a.subVectors(this.c, +this.b);b.subVectors(this.a,this.b);return.5*a.cross(b).length()}}(),midpoint:function(a){return(a||new p).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return Qa.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new Aa).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return Qa.barycoordFromPoint(a,this.a,this.b,this.c,b)},containsPoint:function(a){return Qa.containsPoint(a,this.a,this.b,this.c)},closestPointToPoint:function(){var a= +new Aa,b=[new Mb,new Mb,new Mb],c=new p,d=new p;return function(e,f){f=f||new p;var g=Infinity;a.setFromCoplanarPoints(this.a,this.b,this.c);a.projectPoint(e,c);if(!0===this.containsPoint(c))f.copy(c);else for(b[0].set(this.a,this.b),b[1].set(this.b,this.c),b[2].set(this.c,this.a),e=0;ec.far?null:{distance:b,point:x.clone(),object:a}}function c(c,d,e,f,l,n,q,t){g.fromBufferAttribute(f,n);h.fromBufferAttribute(f,q);k.fromBufferAttribute(f,t);if(c=b(c,c.material,d,e,g,h,k,w))l&&(m.fromBufferAttribute(l, +n),r.fromBufferAttribute(l,q),u.fromBufferAttribute(l,t),c.uv=a(w,g,h,k,m,r,u)),c.face=new Pa(n,q,t,Qa.normal(g,h,k)),c.faceIndex=n;return c}var d=new K,e=new lb,f=new Da,g=new p,h=new p,k=new p,l=new p,q=new p,n=new p,m=new C,r=new C,u=new C,v=new p,w=new p,x=new p;return function(t,p){var v=this.geometry,x=this.material,z=this.matrixWorld;if(void 0!==x&&(null===v.boundingSphere&&v.computeBoundingSphere(),f.copy(v.boundingSphere),f.applyMatrix4(z),!1!==t.ray.intersectsSphere(f)&&(d.getInverse(z), +e.copy(t.ray).applyMatrix4(d),null===v.boundingBox||!1!==e.intersectsBox(v.boundingBox)))){var y;if(v.isBufferGeometry){var x=v.index,I=v.attributes.position,z=v.attributes.uv,C;if(null!==x){var A=0;for(C=x.count;Af||(f=d.ray.origin.distanceTo(a),fd.far||e.push({distance:f,point:a.clone(),face:null,object:this}))}}(),clone:function(){return(new this.constructor(this.material)).copy(this)}});Dc.prototype=Object.assign(Object.create(A.prototype),{constructor:Dc,copy:function(a){A.prototype.copy.call(this, +a,!1);a=a.levels;for(var b=0,c=a.length;b=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break;for(;ef||(q.applyMatrix4(this.matrixWorld),m=d.ray.origin.distanceTo(q),md.far||e.push({distance:m,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}));else for(g=0,v=r.length/3-1;gf||(q.applyMatrix4(this.matrixWorld),m=d.ray.origin.distanceTo(q), +md.far||e.push({distance:m,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else if(g.isGeometry)for(k=g.vertices,l=k.length,g=0;gf||(q.applyMatrix4(this.matrixWorld),m=d.ray.origin.distanceTo(q),md.far||e.push({distance:m,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}}(),clone:function(){return(new this.constructor(this.geometry, +this.material)).copy(this)}});ca.prototype=Object.assign(Object.create(ma.prototype),{constructor:ca,isLineSegments:!0});rd.prototype=Object.assign(Object.create(ma.prototype),{constructor:rd,isLineLoop:!0});Ba.prototype=Object.create(Q.prototype);Ba.prototype.constructor=Ba;Ba.prototype.isPointsMaterial=!0;Ba.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;return this};Qb.prototype=Object.assign(Object.create(A.prototype), +{constructor:Qb,isPoints:!0,raycast:function(){var a=new K,b=new lb,c=new Da;return function(d,e){function f(a,c){var f=b.distanceSqToPoint(a);if(fd.far||e.push({distance:h,distanceToRay:Math.sqrt(f),point:a.clone(),index:c,face:null,object:g})}}var g=this,h=this.geometry,k=this.matrixWorld,l=d.params.Points.threshold;null===h.boundingSphere&&h.computeBoundingSphere();c.copy(h.boundingSphere);c.applyMatrix4(k); +c.radius+=l;if(!1!==d.ray.intersectsSphere(c)){a.getInverse(k);b.copy(d.ray).applyMatrix4(a);var l=l/((this.scale.x+this.scale.y+this.scale.z)/3),m=l*l,l=new p;if(h.isBufferGeometry){var n=h.index,h=h.attributes.position.array;if(null!==n)for(var t=n.array,n=0,r=t.length;nc)return null;var d=[],e=[],f=[],g;if(0=h--){console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()");break}var k= +g;c<=k&&(k=0);g=k+1;c<=g&&(g=0);var l=g+1;c<=l&&(l=0);a:{var m;var n=a[e[k]].x;var p=a[e[k]].y;var r=a[e[g]].x;var u=a[e[g]].y;var v=a[e[l]].x;var w=a[e[l]].y;if(0>=(r-n)*(w-p)-(u-p)*(v-n))var x=!1;else{var z=v-r;var y=w-u;var B=n-v;var C=p-w;var A=r-n;x=u-p;for(m=0;m=-Number.EPSILON&&D>=-Number.EPSILON&&N>=-Number.EPSILON){x= +!1;break a}}}x=!0}}if(x){d.push([a[e[k]],a[e[g]],a[e[l]]]);f.push([e[k],e[g],e[l]]);k=g;for(l=g+1;lNumber.EPSILON){if(0< +q){if(0>p||p>q)return[];k=l*m-k*n;if(0>k||k>q)return[]}else{if(0c?[]:k===c?f?[]:[g]:a<=c?[g,h]:[g,l]}function f(a,b,c,d){var e=b.x-a.x,f=b.y-a.y;b=c.x-a.x;c=c.y-a.y;var g=d.x-a.x;d=d.y-a.y;a=e*c-f*b;e=e*d-f*g;return Math.abs(a)>Number.EPSILON?(b=g*c-d*b,0d&&(d=c);var e=a+1;e>c&&(e=0);c=f(h[a],h[d],h[e],D[b]);if(!c)return!1;c=D.length-1;d=b-1;0>d&&(d=c);e=b+1;e>c&&(e=0);return(c=f(D[b],D[d],D[e],h[a]))?!0:!1}function d(a,b){var c;for(c=0;ct){console.log('THREE.ShapeUtils: Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!');break}for(m=p;ma;a++)m=b[a].x+":"+b[a].y,m=h[m],void 0!==m&&(b[a]=m);return k.concat()},isClockWise:function(a){return 0>Ha.area(a)}};$a.prototype=Object.create(N.prototype);$a.prototype.constructor=$a;Ga.prototype= +Object.create(D.prototype);Ga.prototype.constructor=Ga;Ga.prototype.getArrays=function(){var a=this.getAttribute("position"),a=a?Array.prototype.slice.call(a.array):[],b=this.getAttribute("uv"),b=b?Array.prototype.slice.call(b.array):[],c=this.index,c=c?Array.prototype.slice.call(c.array):[];return{position:a,uv:b,index:c}};Ga.prototype.addShapeList=function(a,b){var c=a.length;b.arrays=this.getArrays();for(var d=0;dNumber.EPSILON){var k=Math.sqrt(h),l=Math.sqrt(f*f+g*g),h=b.x-e/k;b=b.y+d/k;g=((c.x-g/l-h)*g-(c.y+f/l-b)*f)/(d*g-e*f);f=h+d*g-a.x;d=b+e*g-a.y;e=f*f+d*d;if(2>=e)return new C(f, +d);e=Math.sqrt(e/2)}else a=!1,d>Number.EPSILON?f>Number.EPSILON&&(a=!0):d<-Number.EPSILON?f<-Number.EPSILON&&(a=!0):Math.sign(e)===Math.sign(g)&&(a=!0),a?(f=-e,e=Math.sqrt(h)):(f=d,d=e,e=Math.sqrt(h/2));return new C(f/e,d/e)}function e(a,b){for(G=a.length;0<=--G;){var c=G;var d=G-1;0>d&&(d=a.length-1);var e,f=A+2*w;for(e=0;eMath.abs(g-k)?[new C(a,1-c),new C(h,1-d),new C(l,1-e),new C(n,1-b)]:[new C(g,1-c),new C(k,1-d),new C(m,1-e),new C(p,1-b)]}};Qc.prototype=Object.create(N.prototype); +Qc.prototype.constructor=Qc;$b.prototype=Object.create(Ga.prototype);$b.prototype.constructor=$b;Rc.prototype=Object.create(N.prototype);Rc.prototype.constructor=Rc;ob.prototype=Object.create(D.prototype);ob.prototype.constructor=ob;Sc.prototype=Object.create(N.prototype);Sc.prototype.constructor=Sc;ac.prototype=Object.create(D.prototype);ac.prototype.constructor=ac;Tc.prototype=Object.create(N.prototype);Tc.prototype.constructor=Tc;bc.prototype=Object.create(D.prototype);bc.prototype.constructor= +bc;cc.prototype=Object.create(N.prototype);cc.prototype.constructor=cc;dc.prototype=Object.create(D.prototype);dc.prototype.constructor=dc;ec.prototype=Object.create(D.prototype);ec.prototype.constructor=ec;pb.prototype=Object.create(N.prototype);pb.prototype.constructor=pb;Sa.prototype=Object.create(D.prototype);Sa.prototype.constructor=Sa;Uc.prototype=Object.create(pb.prototype);Uc.prototype.constructor=Uc;Vc.prototype=Object.create(Sa.prototype);Vc.prototype.constructor=Vc;Wc.prototype=Object.create(N.prototype); +Wc.prototype.constructor=Wc;fc.prototype=Object.create(D.prototype);fc.prototype.constructor=fc;var Ca=Object.freeze({WireframeGeometry:Sb,ParametricGeometry:Hc,ParametricBufferGeometry:Tb,TetrahedronGeometry:Jc,TetrahedronBufferGeometry:Ub,OctahedronGeometry:Kc,OctahedronBufferGeometry:nb,IcosahedronGeometry:Lc,IcosahedronBufferGeometry:Vb,DodecahedronGeometry:Mc,DodecahedronBufferGeometry:Wb,PolyhedronGeometry:Ic,PolyhedronBufferGeometry:qa,TubeGeometry:Nc,TubeBufferGeometry:Xb,TorusKnotGeometry:Oc, +TorusKnotBufferGeometry:Yb,TorusGeometry:Pc,TorusBufferGeometry:Zb,TextGeometry:Qc,TextBufferGeometry:$b,SphereGeometry:Rc,SphereBufferGeometry:ob,RingGeometry:Sc,RingBufferGeometry:ac,PlaneGeometry:Ac,PlaneBufferGeometry:kb,LatheGeometry:Tc,LatheBufferGeometry:bc,ShapeGeometry:cc,ShapeBufferGeometry:dc,ExtrudeGeometry:$a,ExtrudeBufferGeometry:Ga,EdgesGeometry:ec,ConeGeometry:Uc,ConeBufferGeometry:Vc,CylinderGeometry:pb,CylinderBufferGeometry:Sa,CircleGeometry:Wc,CircleBufferGeometry:fc,BoxGeometry:Lb, +BoxBufferGeometry:jb});gc.prototype=Object.create(Q.prototype);gc.prototype.constructor=gc;gc.prototype.isShadowMaterial=!0;hc.prototype=Object.create(oa.prototype);hc.prototype.constructor=hc;hc.prototype.isRawShaderMaterial=!0;Ma.prototype=Object.create(Q.prototype);Ma.prototype.constructor=Ma;Ma.prototype.isMeshStandardMaterial=!0;Ma.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.defines={STANDARD:""};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness; +this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap; +this.metalnessMap=a.metalnessMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.envMapIntensity=a.envMapIntensity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};qb.prototype=Object.create(Ma.prototype);qb.prototype.constructor=qb;qb.prototype.isMeshPhysicalMaterial= +!0;qb.prototype.copy=function(a){Ma.prototype.copy.call(this,a);this.defines={PHYSICAL:""};this.reflectivity=a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};Ia.prototype=Object.create(Q.prototype);Ia.prototype.constructor=Ia;Ia.prototype.isMeshPhongMaterial=!0;Ia.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity= +a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine= +a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};rb.prototype=Object.create(Ia.prototype);rb.prototype.constructor=rb;rb.prototype.isMeshToonMaterial=!0;rb.prototype.copy=function(a){Ia.prototype.copy.call(this, +a);this.gradientMap=a.gradientMap;return this};sb.prototype=Object.create(Q.prototype);sb.prototype.constructor=sb;sb.prototype.isMeshNormalMaterial=!0;sb.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth; +this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};tb.prototype=Object.create(Q.prototype);tb.prototype.constructor=tb;tb.prototype.isMeshLambertMaterial=!0;tb.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity= +a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};ub.prototype=Object.create(O.prototype);ub.prototype.constructor= +ub;ub.prototype.isLineDashedMaterial=!0;ub.prototype.copy=function(a){O.prototype.copy.call(this,a);this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var tg=Object.freeze({ShadowMaterial:gc,SpriteMaterial:Za,RawShaderMaterial:hc,ShaderMaterial:oa,PointsMaterial:Ba,MeshPhysicalMaterial:qb,MeshStandardMaterial:Ma,MeshPhongMaterial:Ia,MeshToonMaterial:rb,MeshNormalMaterial:sb,MeshLambertMaterial:tb,MeshDepthMaterial:Wa,MeshDistanceMaterial:Xa,MeshBasicMaterial:va,LineDashedMaterial:ub, +LineBasicMaterial:O,Material:Q}),jd={enabled:!1,files:{},add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}},wa=new Yd,Ta={};Object.assign(Ja.prototype,{load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=jd.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)}, +0),f;if(void 0!==Ta[a])Ta[a].push({onLoad:b,onProgress:c,onError:d});else{var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){c=g[1];var h=!!g[2],g=g[3],g=window.decodeURIComponent(g);h&&(g=window.atob(g));try{var k=(this.responseType||"").toLowerCase();switch(k){case "arraybuffer":case "blob":for(var l=new Uint8Array(g.length),h=0;h=e)break a;else{f=b[1];a=e)break b}d=c;c=0}}for(;c>>1,ab;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),a=this.getValueSize(),this.times=T.arraySlice(c,e,f),this.values=T.arraySlice(this.values,e*a,f*a);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error("THREE.KeyframeTrackPrototype: Invalid value size in track.",this),a=!1);var c=this.times,b=this.values,d=c.length;0===d&&(console.error("THREE.KeyframeTrackPrototype: Track is empty.", +this),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if("number"===typeof g&&isNaN(g)){console.error("THREE.KeyframeTrackPrototype: Time is not a valid number.",this,f,g);a=!1;break}if(null!==e&&e>g){console.error("THREE.KeyframeTrackPrototype: Out of order keys.",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&T.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error("THREE.KeyframeTrackPrototype: Value is not a valid number.",this,f,d);a=!1;break}return a},optimize:function(){for(var a, +b,c=this.times,d=this.values,e=this.getValueSize(),f=2302===this.getInterpolation(),g=1,h=c.length-1,k=1;kl.opacity&&(l.transparent=!0);d.setTextures(k);return d.parse(l)}}()});Object.assign(be.prototype, +{load:function(a,b,c,d){var e=this,f=this.texturePath&&"string"===typeof this.texturePath?this.texturePath:kc.prototype.extractUrlBase(a),g=new Ja(this.manager);g.setWithCredentials(this.withCredentials);g.load(a,function(c){c=JSON.parse(c);var d=c.metadata;if(void 0!==d&&(d=d.type,void 0!==d)){if("object"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.ObjectLoader instead.");return}if("scene"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.SceneLoader instead."); +return}}c=e.parse(c,f);b(c.geometry,c.materials)},c,d)},setTexturePath:function(a){this.texturePath=a},parse:function(){return function(a,b){void 0!==a.data&&(a=a.data);a.scale=void 0!==a.scale?1/a.scale:1;var c=new N,d=a,e,f,g,h=d.faces;var k=d.vertices;var l=d.normals,m=d.colors;var n=d.scale;var t=0;if(void 0!==d.uvs){for(e=0;ef;f++){var B=h[r++];var A=y[2*B];B=y[2*B+1];A=new C(A,B);2!==f&&c.faceVertexUvs[e][v].push(A);0!==f&&c.faceVertexUvs[e][v+1].push(A)}}w&&(w=3* +h[r++],u.normal.set(l[w++],l[w++],l[w]),z.normal.copy(u.normal));if(x)for(e=0;4>e;e++)w=3*h[r++],x=new p(l[w++],l[w++],l[w]),2!==e&&u.vertexNormals.push(x),0!==e&&z.vertexNormals.push(x);n&&(n=h[r++],n=m[n],u.color.setHex(n),z.color.setHex(n));if(k)for(e=0;4>e;e++)n=h[r++],n=m[n],2!==e&&u.vertexColors.push(new H(n)),0!==e&&z.vertexColors.push(new H(n));c.faces.push(u);c.faces.push(z)}else{u=new Pa;u.a=h[r++];u.b=h[r++];u.c=h[r++];v&&(v=h[r++],u.materialIndex=v);v=c.faces.length;if(e)for(e=0;ef;f++)B=h[r++],A=y[2*B],B=y[2*B+1],A=new C(A,B),c.faceVertexUvs[e][v].push(A);w&&(w=3*h[r++],u.normal.set(l[w++],l[w++],l[w]));if(x)for(e=0;3>e;e++)w=3*h[r++],x=new p(l[w++],l[w++],l[w]),u.vertexNormals.push(x);n&&(n=h[r++],u.color.setHex(m[n]));if(k)for(e=0;3>e;e++)n=h[r++],u.vertexColors.push(new H(m[n]));c.faces.push(u)}}d=a;r=void 0!==d.influencesPerVertex?d.influencesPerVertex:2;if(d.skinWeights)for(g=0,h=d.skinWeights.length;gg)e=a+1;else if(0b&&(b=0);1Number.EPSILON&&(g.normalize(),c=Math.acos(R.clamp(d[k- +1].dot(d[k]),-1,1)),e[k].applyMatrix4(h.makeRotationAxis(g,c))),f[k].crossVectors(d[k],e[k]);if(!0===b)for(c=Math.acos(R.clamp(e[0].dot(e[a]),-1,1)),c/=a,0=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();return a[a.length-1]},updateArcLengths:function(){this.needsUpdate= +!0;this.cacheLengths=null;this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var a=[],b=0,c=0,d=this.curves.length;cd;)d+=c;for(;d>c;)d-=c;dc.length-2?c.length-1:a+1],c=c[a>c.length-3?c.length-1:a+2];b.set(Se(d, +e.x,f.x,g.x,c.x),Se(d,e.y,f.y,g.y,c.y));return b};ab.prototype.copy=function(a){S.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;bNumber.EPSILON){if(0>l&&(g=b[f],k=-k,h=b[e],l=-l),!(a.yh.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=l*(a.x-g.x)-k*(a.y-g.y);if(0===e)return!0;0>e||(d=!d)}}else if(a.y===g.y&&(h.x<= +a.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}var e=Ha.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);b=[];if(1===f.length){var g=f[0];var h=new Cb;h.curves=g.curves;b.push(h);return b}var k=!e(f[0].getPoints()),k=a?!k:k;h=[];var l=[],m=[],n=0;l[n]=void 0;m[n]=[];for(var p=0,r=f.length;pd&&this._mixBufferRegion(c,a,3*b,1-d,b);for(var d=b,f=b+b;d!==f;++d)if(c[d]!==c[d+b]){e.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=3*b;this.binding.getValue(a,c);for(var d=b;d!==c;++d)a[d]=a[c+d%b];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_select:function(a,b,c,d,e){if(.5<=d)for(d= -0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d){qa.slerpFlat(a,b,a,b,a,c,d)},_lerp:function(a,b,c,d,e){for(var f=1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}}});Object.assign(Ve.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_, -c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].unbind()}});Object.assign(oa,{Composite:Ve,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new oa.Composite(a,b,c):new oa(a,b,c)},parseTrackName:function(){var a=new RegExp("^"+/((?:[\w-]+[\/:])*)/.source+/([\w-\.]+)?/.source+/(?:\.([\w-]+)(?:\[(.+)\])?)?/.source+/\.([\w-]+)(?:\[(.+)\])?/.source+"$"),b=["material","materials","bones"];return function(c){var d= -a.exec(c);if(!d)throw Error("PropertyBinding: Cannot parse trackName: "+c);var d={nodeName:d[2],objectName:d[3],objectIndex:d[4],propertyName:d[5],propertyIndex:d[6]},e=d.nodeName&&d.nodeName.lastIndexOf(".");if(void 0!==e&&-1!==e){var f=d.nodeName.substring(e+1);-1!==b.indexOf(f)&&(d.nodeName=d.nodeName.substring(0,e),d.objectName=f)}if(null===d.propertyName||0===d.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+c);return d}}(),findNode:function(a,b){if(!b|| -""===b||"root"===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;if(a.skeleton){var c=function(a){for(var c=0;c=c){var q=c++,n=b[q];d[n.uuid]=p;b[p]=n;d[l]=q;b[q]=k;k=0;for(l=f;k!==l;++k){var n=e[k],r=n[p];n[p]=n[q];n[q]=r}}}this.nCachedObjects_=c},uncache:function(a){for(var b=this._objects,c=b.length,d=this.nCachedObjects_,e=this._indicesByUUID,f=this._bindings,g=f.length,h=0,k=arguments.length;h!==k;++h){var l=arguments[h].uuid,p=e[l];if(void 0!== -p)if(delete e[l],pb||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0c.parameterPositions[1]&&(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){var b=this.timeScale,c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0],b=b*d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a;if(0===a)return b;var c=this._clip.duration,d=this.loop,e=this._loopCount;if(2200=== -d)a:{if(-1===e&&(this._loopCount=0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;this._mixer.dispatchEvent({type:"finished",action:this,direction:0>a?-1:1})}else{d=2202===d;-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,d)):this._setEndings(0===this.repetitions,!0,d));if(b>=c||0>b){var f=Math.floor(b/c),b=b-c*f,e=e+Math.abs(f),g=this.repetitions-e;0>g?(this.clampWhenFinished?this.paused=!0:this.enabled=!1,b=0a,this._setEndings(a,!a,d)):this._setEndings(!1,!1,d),this._loopCount=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:f}))}if(d&&1===(e&1))return this.time=b,c-b}return this.time=b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(a, -b,c){var d=this._mixer,e=d.time,f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}});Object.assign(Ye.prototype,sa.prototype,{_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings,g=a._interpolants,h=c.uuid,k=this._bindingsByRootAndName,l=k[h];void 0===l&&(l={},k[h]=l);for(k=0;k!==e;++k){var p=d[k],q=p.name,n=l[q];if(void 0=== -n){n=f[k];if(void 0!==n){null===n._cacheIndex&&(++n.referenceCount,this._addInactiveBinding(n,h,q));continue}n=new le(oa.create(c,q,b&&b._propertyBindings[k].binding.parsedPath),p.ValueTypeName,p.getValueSize());++n.referenceCount;this._addInactiveBinding(n,h,q)}f[k]=n;g[k].resultBuffer=n.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,d=this._actionsByClip[c];this._bindAction(a,d&&d.knownActions[0]);this._addInactiveAction(a, -c,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}},_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b=a._propertyBindings,c=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=[];this._nActiveActions=0;this._actionsByClip={};this._bindings=[];this._nActiveBindings= -0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length},get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length},get inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},_isActiveAction:function(a){a=a._cacheIndex;return null!==a&&ah.end&&(h.end=f);c||(c=k)}}for(k in d)h=d[k],this.createAnimation(k,h.start,h.end,a);this.firstAnimation=c};ra.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a])a.direction=1,a.directionBackwards=!1};ra.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a])a.direction=-1,a.directionBackwards=!0};ra.prototype.setAnimationFPS= -function(a,b){var c=this.animationsMap[a];c&&(c.fps=b,c.duration=(c.end-c.start)/c.fps)};ra.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];c&&(c.duration=b,c.fps=(c.end-c.start)/c.duration)};ra.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];c&&(c.weight=b)};ra.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];c&&(c.time=b)};ra.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};ra.prototype.getAnimationDuration= -function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};ra.prototype.playAnimation=function(a){var b=this.animationsMap[a];b?(b.time=0,b.active=!0):console.warn("THREE.MorphBlendMesh: animation["+a+"] undefined in .playAnimation()")};ra.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=!1};ra.prototype.update=function(a){for(var b=0,c=this.animationsList.length;b -d.duration||0>d.time)d.direction*=-1,d.time>d.duration&&(d.time=d.duration,d.directionBackwards=!0),0>d.time&&(d.time=0,d.directionBackwards=!1)}else d.time%=d.duration,0>d.time&&(d.time+=d.duration);var f=d.start+Y.clamp(Math.floor(d.time/e),0,d.length-1),g=d.weight;f!==d.currentFrame&&(this.morphTargetInfluences[d.lastFrame]=0,this.morphTargetInfluences[d.currentFrame]=1*g,this.morphTargetInfluences[f]=0,d.lastFrame=d.currentFrame,d.currentFrame=f);e=d.time%e/e;d.directionBackwards&&(e=1-e);d.currentFrame!== -d.lastFrame?(this.morphTargetInfluences[d.currentFrame]=e*g,this.morphTargetInfluences[d.lastFrame]=(1-e)*g):this.morphTargetInfluences[d.currentFrame]=g}}};$c.prototype=Object.create(B.prototype);$c.prototype.constructor=$c;$c.prototype.isImmediateRenderObject=!0;ad.prototype=Object.create(da.prototype);ad.prototype.constructor=ad;ad.prototype.update=function(){var a=new p,b=new p,c=new Ka;return function(){var d=["a","b","c"];this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld); -var e=this.object.matrixWorld,f=this.geometry.attributes.position,g=this.object.geometry;if(g&&g.isGeometry)for(var h=g.vertices,k=g.faces,l=g=0,p=k.length;lc.y?this.quaternion.set(1,0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,b))}}();Cb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(0,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};Cb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)}; -Md.prototype=Object.create(da.prototype);Md.prototype.constructor=Md;var Pd=new p,ve=new se,we=new se,xe=new se;Ja.prototype=Object.create(na.prototype);Ja.prototype.constructor=Ja;Ja.prototype.getPoint=function(a){var b=this.points,c=b.length;2>c&&console.log("duh, you need at least 2 points");a*=c-(this.closed?0:1);var d=Math.floor(a);a-=d;this.closed?d+=0d&&(d=1);1E-4>c&&(c=d);1E-4>h&&(h=d);ve.initNonuniformCatmullRom(e.x,f.x,g.x,b.x,c,d,h);we.initNonuniformCatmullRom(e.y,f.y,g.y,b.y,c,d,h);xe.initNonuniformCatmullRom(e.z, -f.z,g.z,b.z,c,d,h)}else"catmullrom"===this.type&&(c=void 0!==this.tension?this.tension:.5,ve.initCatmullRom(e.x,f.x,g.x,b.x,c),we.initCatmullRom(e.y,f.y,g.y,b.y,c),xe.initCatmullRom(e.z,f.z,g.z,b.z,c));return new p(ve.calc(a),we.calc(a),xe.calc(a))};ed.prototype=Object.create(na.prototype);ed.prototype.constructor=ed;ed.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2,e=this.v3;return new p(yb(a,b.x,c.x,d.x,e.x),yb(a,b.y,c.y,d.y,e.y),yb(a,b.z,c.z,d.z,e.z))};fd.prototype=Object.create(na.prototype); -fd.prototype.constructor=fd;fd.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2;return new p(xb(a,b.x,c.x,d.x),xb(a,b.y,c.y,d.y),xb(a,b.z,c.z,d.z))};gd.prototype=Object.create(na.prototype);gd.prototype.constructor=gd;gd.prototype.getPoint=function(a){if(1===a)return this.v2.clone();var b=new p;b.subVectors(this.v2,this.v1);b.multiplyScalar(a);b.add(this.v1);return b};Nd.prototype=Object.create(Xa.prototype);Nd.prototype.constructor=Nd;na.create=function(a,b){console.log("THREE.Curve.create() has been deprecated"); -a.prototype=Object.create(na.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};df.prototype=Object.create(Ja.prototype);ef.prototype=Object.create(Ja.prototype);te.prototype=Object.create(Ja.prototype);Object.assign(te.prototype,{initFromArray:function(a){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(a){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},reparametrizeByArcLength:function(a){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}}); -bd.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};Object.assign(id.prototype,{center:function(a){console.warn("THREE.Box2: .center() has been renamed to .getCenter().");return this.getCenter(a)},empty:function(){console.warn("THREE.Box2: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."); -return this.intersectsBox(a)},size:function(a){console.warn("THREE.Box2: .size() has been renamed to .getSize().");return this.getSize(a)}});Object.assign(Ta.prototype,{center:function(a){console.warn("THREE.Box3: .center() has been renamed to .getCenter().");return this.getCenter(a)},empty:function(){console.warn("THREE.Box3: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."); -return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)},size:function(a){console.warn("THREE.Box3: .size() has been renamed to .getSize().");return this.getSize(a)}});Hb.prototype.center=function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");return this.getCenter(a)};Y.random16=function(){console.warn("THREE.Math.random16() has been deprecated. Use Math.random() instead."); -return Math.random()};Object.assign(Ka.prototype,{flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},multiplyVector3Array:function(a){console.warn("THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead."); -return this.applyToVector3Array(a)},applyToBuffer:function(a,b,c){console.warn("THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");return this.applyToBufferAttribute(a)},applyToVector3Array:function(a,b,c){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}});Object.assign(J.prototype,{extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");return this.copyPosition(a)}, -flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},getPosition:function(){var a;return function(){void 0===a&&(a=new p);console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");return a.setFromMatrixColumn(this,3)}}(),setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."); -return this.makeRotationFromQuaternion(a)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector4:function(a){console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector3Array:function(a){console.warn("THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead."); -return this.applyToVector3Array(a)},rotateAxis:function(a){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");a.transformDirection(this)},crossVector:function(a){console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")}, -rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBuffer:function(a,b,c){console.warn("THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");return this.applyToBufferAttribute(a)},applyToVector3Array:function(a,b,c){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")}, -makeFrustum:function(a,b,c,d,e,f){console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.");return this.makePerspective(a,b,d,c,e,f)}});wa.prototype.isIntersectionLine=function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");return this.intersectsLine(a)};qa.prototype.multiplyVector3=function(a){console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."); -return a.applyQuaternion(this)};Object.assign(hb.prototype,{isIntersectionBox:function(a){console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionPlane:function(a){console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().");return this.intersectsPlane(a)},isIntersectionSphere:function(a){console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)}}); -Object.assign(Ab.prototype,{extrude:function(a){console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");return new db(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new Zb(this,a)}});Object.assign(D.prototype,{fromAttribute:function(a,b,c){console.error("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)}});Object.assign(p.prototype, -{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(a){console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().");return this.setFromMatrixPosition(a)},getScaleFromMatrix:function(a){console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."); -return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,b){console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().");return this.setFromMatrixColumn(b,a)},applyProjection:function(a){console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.");return this.applyMatrix4(a)},fromAttribute:function(a,b,c){console.error("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a, -b,c)}});Object.assign(ga.prototype,{fromAttribute:function(a,b,c){console.error("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)}});M.prototype.computeTangents=function(){console.warn("THREE.Geometry: .computeTangents() has been removed.")};Object.assign(B.prototype,{getChildByName:function(a){console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().");return this.getObjectByName(a)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")}, -translate:function(a,b){console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.");return this.translateOnAxis(b,a)}});Object.defineProperties(B.prototype,{eulerOrder:{get:function(){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");return this.rotation.order},set:function(a){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");this.rotation.order=a}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}, -set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}});Object.defineProperties(Bc.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");return this.levels}}});Object.defineProperty(Cc.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}}); -Object.defineProperty(na.prototype,"__arcLengthDivisions",{get:function(){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");return this.arcLengthDivisions},set:function(a){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");this.arcLengthDivisions=a}});xa.prototype.setLens=function(a,b){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.");void 0!==b&&(this.filmGauge=b);this.setFocalLength(a)}; -Object.defineProperties(ma.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(a){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov.");this.shadow.camera.fov=a}},shadowCameraLeft:{set:function(a){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left.");this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."); +0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d){Z.slerpFlat(a,b,a,b,a,c,d)},_lerp:function(a,b,c,d,e){for(var f=1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}}});Object.assign(Ve.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_, +c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].unbind()}});Object.assign(na,{Composite:Ve,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new na.Composite(a,b,c):new na(a,b,c)},sanitizeNodeName:function(a){return a.replace(/\s/g,"_").replace(/[^\w-]/g,"")},parseTrackName:function(){var a=new RegExp("^"+/((?:[\w-]+[\/:])*)/.source+/([\w-\.]+)?/.source+/(?:\.([\w-]+)(?:\[(.+)\])?)?/.source+/\.([\w-]+)(?:\[(.+)\])?/.source+ +"$"),b=["material","materials","bones"];return function(c){var d=a.exec(c);if(!d)throw Error("PropertyBinding: Cannot parse trackName: "+c);var d={nodeName:d[2],objectName:d[3],objectIndex:d[4],propertyName:d[5],propertyIndex:d[6]},e=d.nodeName&&d.nodeName.lastIndexOf(".");if(void 0!==e&&-1!==e){var f=d.nodeName.substring(e+1);-1!==b.indexOf(f)&&(d.nodeName=d.nodeName.substring(0,e),d.objectName=f)}if(null===d.propertyName||0===d.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+ +c);return d}}(),findNode:function(a,b){if(!b||""===b||"root"===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;if(a.skeleton){var c=function(a){for(var c=0;c=b){var m=b++,n=a[m];c[n.uuid]=l;a[l]=n;c[k]=m;a[m]=h;h=0;for(k=e;h!==k;++h){var n=d[h],p= +n[l];n[l]=n[m];n[m]=p}}}this.nCachedObjects_=b},uncache:function(){for(var a,b,c=this._objects,d=c.length,e=this.nCachedObjects_,f=this._indicesByUUID,g=this._bindings,h=g.length,k=0,l=arguments.length;k!==l;++k){b=arguments[k].uuid;var m=f[b];if(void 0!==m)if(delete f[b],mb||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0c.parameterPositions[1]&&(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){var b=this.timeScale,c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0], +b=b*d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a;if(0===a)return b;var c=this._clip.duration,d=this.loop,e=this._loopCount;if(2200===d)a:{if(-1===e&&(this._loopCount=0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;this._mixer.dispatchEvent({type:"finished",action:this,direction:0>a?-1:1})}else{d=2202===d; +-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,d)):this._setEndings(0===this.repetitions,!0,d));if(b>=c||0>b){var f=Math.floor(b/c),b=b-c*f,e=e+Math.abs(f),g=this.repetitions-e;0>g?(this.clampWhenFinished?this.paused=!0:this.enabled=!1,b=0a,this._setEndings(a,!a,d)):this._setEndings(!1,!1,d),this._loopCount=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:f}))}if(d&&1===(e&1))return this.time= +b,c-b}return this.time=b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(a,b,c){var d=this._mixer,e=d.time,f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}});Object.assign(Ye.prototype,ja.prototype, +{_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings;a=a._interpolants;var g=c.uuid,h=this._bindingsByRootAndName,k=h[g];void 0===k&&(k={},h[g]=k);for(h=0;h!==e;++h){var l=d[h],m=l.name,n=k[m];if(void 0===n){n=f[h];if(void 0!==n){null===n._cacheIndex&&(++n.referenceCount,this._addInactiveBinding(n,g,m));continue}n=new je(na.create(c,m,b&&b._propertyBindings[h].binding.parsedPath),l.ValueTypeName,l.getValueSize());++n.referenceCount;this._addInactiveBinding(n, +g,m)}f[h]=n;a[h].resultBuffer=n.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,d=this._actionsByClip[c];this._bindAction(a,d&&d.knownActions[0]);this._addInactiveAction(a,c,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}},_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b=a._propertyBindings, +c=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=[];this._nActiveActions=0;this._actionsByClip={};this._bindings=[];this._nActiveBindings=0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length},get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length}, +get inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},_isActiveAction:function(a){a=a._cacheIndex;return null!==a&&aMath.abs(b)&&(b=1E-8);this.scale.set(.5*this.size,.5*this.size,b);this.lookAt(this.plane.normal);A.prototype.updateMatrixWorld.call(this,a)};var Ld,pe;Eb.prototype=Object.create(A.prototype);Eb.prototype.constructor=Eb;Eb.prototype.setDirection=function(){var a=new p,b;return function(c){.99999c.y?this.quaternion.set(1, +0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,b))}}();Eb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(0,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};Eb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)};hd.prototype=Object.create(ca.prototype);hd.prototype.constructor=hd;var Nd=new p, +te=new qe,ue=new qe,ve=new qe;ya.prototype=Object.create(S.prototype);ya.prototype.constructor=ya;ya.prototype.isCatmullRomCurve3=!0;ya.prototype.getPoint=function(a,b){b=b||new p;var c=this.points,d=c.length;a*=d-(this.closed?0:1);var e=Math.floor(a);a-=e;this.closed?e+=0e&&(e=1);1E-4>d&&(d=e);1E-4>k&&(k=e);te.initNonuniformCatmullRom(f.x,g.x,h.x,c.x,d,e,k);ue.initNonuniformCatmullRom(f.y,g.y,h.y,c.y,d,e,k);ve.initNonuniformCatmullRom(f.z,g.z,h.z,c.z,d,e,k)}else"catmullrom"===this.curveType&&(te.initCatmullRom(f.x,g.x,h.x, +c.x,this.tension),ue.initCatmullRom(f.y,g.y,h.y,c.y,this.tension),ve.initCatmullRom(f.z,g.z,h.z,c.z,this.tension));b.set(te.calc(a),ue.calc(a),ve.calc(a));return b};ya.prototype.copy=function(a){S.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b b ? 1 : -1 } -},{}],187:[function(require,module,exports){ +},{}],251:[function(require,module,exports){ var applyProperties = require("./apply-properties") var isWidget = require("../vnode/is-widget.js") @@ -16484,7 +19331,7 @@ function replaceRoot(oldRoot, newRoot) { return newRoot; } -},{"../vnode/is-widget.js":199,"../vnode/vpatch.js":202,"./apply-properties":184,"./update-widget":189}],188:[function(require,module,exports){ +},{"../vnode/is-widget.js":263,"../vnode/vpatch.js":266,"./apply-properties":248,"./update-widget":253}],252:[function(require,module,exports){ var document = require("global/document") var isArray = require("x-is-array") @@ -16566,7 +19413,7 @@ function patchIndices(patches) { return indices } -},{"./create-element":185,"./dom-index":186,"./patch-op":187,"global/document":16,"x-is-array":224}],189:[function(require,module,exports){ +},{"./create-element":249,"./dom-index":250,"./patch-op":251,"global/document":16,"x-is-array":288}],253:[function(require,module,exports){ var isWidget = require("../vnode/is-widget.js") module.exports = updateWidget @@ -16583,7 +19430,7 @@ function updateWidget(a, b) { return false } -},{"../vnode/is-widget.js":199}],190:[function(require,module,exports){ +},{"../vnode/is-widget.js":263}],254:[function(require,module,exports){ 'use strict'; var EvStore = require('ev-store'); @@ -16612,7 +19459,7 @@ EvHook.prototype.unhook = function(node, propertyName) { es[propName] = undefined; }; -},{"ev-store":9}],191:[function(require,module,exports){ +},{"ev-store":9}],255:[function(require,module,exports){ 'use strict'; module.exports = SoftSetHook; @@ -16631,7 +19478,7 @@ SoftSetHook.prototype.hook = function (node, propertyName) { } }; -},{}],192:[function(require,module,exports){ +},{}],256:[function(require,module,exports){ 'use strict'; var isArray = require('x-is-array'); @@ -16770,7 +19617,7 @@ function errorString(obj) { } } -},{"../vnode/is-thunk":195,"../vnode/is-vhook":196,"../vnode/is-vnode":197,"../vnode/is-vtext":198,"../vnode/is-widget":199,"../vnode/vnode.js":201,"../vnode/vtext.js":203,"./hooks/ev-hook.js":190,"./hooks/soft-set-hook.js":191,"./parse-tag.js":193,"x-is-array":224}],193:[function(require,module,exports){ +},{"../vnode/is-thunk":259,"../vnode/is-vhook":260,"../vnode/is-vnode":261,"../vnode/is-vtext":262,"../vnode/is-widget":263,"../vnode/vnode.js":265,"../vnode/vtext.js":267,"./hooks/ev-hook.js":254,"./hooks/soft-set-hook.js":255,"./parse-tag.js":257,"x-is-array":288}],257:[function(require,module,exports){ 'use strict'; var split = require('browser-split'); @@ -16826,7 +19673,7 @@ function parseTag(tag, props) { return props.namespace ? tagName : tagName.toUpperCase(); } -},{"browser-split":5}],194:[function(require,module,exports){ +},{"browser-split":5}],258:[function(require,module,exports){ var isVNode = require("./is-vnode") var isVText = require("./is-vtext") var isWidget = require("./is-widget") @@ -16868,14 +19715,14 @@ function renderThunk(thunk, previous) { return renderedThunk } -},{"./is-thunk":195,"./is-vnode":197,"./is-vtext":198,"./is-widget":199}],195:[function(require,module,exports){ +},{"./is-thunk":259,"./is-vnode":261,"./is-vtext":262,"./is-widget":263}],259:[function(require,module,exports){ module.exports = isThunk function isThunk(t) { return t && t.type === "Thunk" } -},{}],196:[function(require,module,exports){ +},{}],260:[function(require,module,exports){ module.exports = isHook function isHook(hook) { @@ -16884,7 +19731,7 @@ function isHook(hook) { typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook")) } -},{}],197:[function(require,module,exports){ +},{}],261:[function(require,module,exports){ var version = require("./version") module.exports = isVirtualNode @@ -16893,7 +19740,7 @@ function isVirtualNode(x) { return x && x.type === "VirtualNode" && x.version === version } -},{"./version":200}],198:[function(require,module,exports){ +},{"./version":264}],262:[function(require,module,exports){ var version = require("./version") module.exports = isVirtualText @@ -16902,17 +19749,17 @@ function isVirtualText(x) { return x && x.type === "VirtualText" && x.version === version } -},{"./version":200}],199:[function(require,module,exports){ +},{"./version":264}],263:[function(require,module,exports){ module.exports = isWidget function isWidget(w) { return w && w.type === "Widget" } -},{}],200:[function(require,module,exports){ +},{}],264:[function(require,module,exports){ module.exports = "2" -},{}],201:[function(require,module,exports){ +},{}],265:[function(require,module,exports){ var version = require("./version") var isVNode = require("./is-vnode") var isWidget = require("./is-widget") @@ -16986,7 +19833,7 @@ function VirtualNode(tagName, properties, children, key, namespace) { VirtualNode.prototype.version = version VirtualNode.prototype.type = "VirtualNode" -},{"./is-thunk":195,"./is-vhook":196,"./is-vnode":197,"./is-widget":199,"./version":200}],202:[function(require,module,exports){ +},{"./is-thunk":259,"./is-vhook":260,"./is-vnode":261,"./is-widget":263,"./version":264}],266:[function(require,module,exports){ var version = require("./version") VirtualPatch.NONE = 0 @@ -17010,7 +19857,7 @@ function VirtualPatch(type, vNode, patch) { VirtualPatch.prototype.version = version VirtualPatch.prototype.type = "VirtualPatch" -},{"./version":200}],203:[function(require,module,exports){ +},{"./version":264}],267:[function(require,module,exports){ var version = require("./version") module.exports = VirtualText @@ -17022,7 +19869,7 @@ function VirtualText(text) { VirtualText.prototype.version = version VirtualText.prototype.type = "VirtualText" -},{"./version":200}],204:[function(require,module,exports){ +},{"./version":264}],268:[function(require,module,exports){ var isObject = require("is-object") var isHook = require("../vnode/is-vhook") @@ -17082,7 +19929,7 @@ function getPrototype(value) { } } -},{"../vnode/is-vhook":196,"is-object":20}],205:[function(require,module,exports){ +},{"../vnode/is-vhook":260,"is-object":20}],269:[function(require,module,exports){ var isArray = require("x-is-array") var VPatch = require("../vnode/vpatch") @@ -17511,7 +20358,7 @@ function appendPatch(apply, patch) { } } -},{"../vnode/handle-thunk":194,"../vnode/is-thunk":195,"../vnode/is-vnode":197,"../vnode/is-vtext":198,"../vnode/is-widget":199,"../vnode/vpatch":202,"./diff-props":204,"x-is-array":224}],206:[function(require,module,exports){ +},{"../vnode/handle-thunk":258,"../vnode/is-thunk":259,"../vnode/is-vnode":261,"../vnode/is-vtext":262,"../vnode/is-widget":263,"../vnode/vpatch":266,"./diff-props":268,"x-is-array":288}],270:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -17530,7 +20377,7 @@ define(function (require) { }); })(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); }); -},{"./Scheduler":207,"./env":219,"./makePromise":221}],207:[function(require,module,exports){ +},{"./Scheduler":271,"./env":283,"./makePromise":285}],271:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -17612,7 +20459,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],208:[function(require,module,exports){ +},{}],272:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -17640,7 +20487,7 @@ define(function() { return TimeoutError; }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],209:[function(require,module,exports){ +},{}],273:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -17697,7 +20544,7 @@ define(function() { -},{}],210:[function(require,module,exports){ +},{}],274:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -17998,7 +20845,7 @@ define(function(require) { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); -},{"../apply":209,"../state":222}],211:[function(require,module,exports){ +},{"../apply":273,"../state":286}],275:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -18160,7 +21007,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],212:[function(require,module,exports){ +},{}],276:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -18189,7 +21036,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],213:[function(require,module,exports){ +},{}],277:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -18211,7 +21058,7 @@ define(function(require) { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); -},{"../state":222}],214:[function(require,module,exports){ +},{"../state":286}],278:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -18278,7 +21125,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],215:[function(require,module,exports){ +},{}],279:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -18304,7 +21151,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],216:[function(require,module,exports){ +},{}],280:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -18384,7 +21231,7 @@ define(function(require) { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); -},{"../TimeoutError":208,"../env":219}],217:[function(require,module,exports){ +},{"../TimeoutError":272,"../env":283}],281:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -18472,7 +21319,7 @@ define(function(require) { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); -},{"../env":219,"../format":220}],218:[function(require,module,exports){ +},{"../env":283,"../format":284}],282:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -18512,7 +21359,7 @@ define(function() { }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],219:[function(require,module,exports){ +},{}],283:[function(require,module,exports){ (function (process){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ @@ -18590,7 +21437,7 @@ define(function(require) { }).call(this,require('_process')) -},{"_process":6}],220:[function(require,module,exports){ +},{"_process":6}],284:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -18648,7 +21495,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],221:[function(require,module,exports){ +},{}],285:[function(require,module,exports){ (function (process){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ @@ -19608,7 +22455,7 @@ define(function() { }).call(this,require('_process')) -},{"_process":6}],222:[function(require,module,exports){ +},{"_process":6}],286:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -19645,7 +22492,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],223:[function(require,module,exports){ +},{}],287:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @@ -19875,7 +22722,7 @@ define(function (require) { }); })(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); }); -},{"./lib/Promise":206,"./lib/TimeoutError":208,"./lib/apply":209,"./lib/decorators/array":210,"./lib/decorators/flow":211,"./lib/decorators/fold":212,"./lib/decorators/inspect":213,"./lib/decorators/iterate":214,"./lib/decorators/progress":215,"./lib/decorators/timed":216,"./lib/decorators/unhandledRejection":217,"./lib/decorators/with":218}],224:[function(require,module,exports){ +},{"./lib/Promise":270,"./lib/TimeoutError":272,"./lib/apply":273,"./lib/decorators/array":274,"./lib/decorators/flow":275,"./lib/decorators/fold":276,"./lib/decorators/inspect":277,"./lib/decorators/iterate":278,"./lib/decorators/progress":279,"./lib/decorators/timed":280,"./lib/decorators/unhandledRejection":281,"./lib/decorators/with":282}],288:[function(require,module,exports){ var nativeIsArray = Array.isArray var toString = Object.prototype.toString @@ -19885,7 +22732,7 @@ function isArray(obj) { return toString.call(obj) === "[object Array]" } -},{}],225:[function(require,module,exports){ +},{}],289:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var APIv3_1 = require("./api/APIv3"); @@ -19893,13 +22740,22 @@ exports.APIv3 = APIv3_1.APIv3; var ModelCreator_1 = require("./api/ModelCreator"); exports.ModelCreator = ModelCreator_1.ModelCreator; -},{"./api/APIv3":237,"./api/ModelCreator":238}],226:[function(require,module,exports){ +},{"./api/APIv3":302,"./api/ModelCreator":303}],290:[function(require,module,exports){ "use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} Object.defineProperty(exports, "__esModule", { value: true }); var Component_1 = require("./component/Component"); exports.Component = Component_1.Component; var ComponentService_1 = require("./component/ComponentService"); exports.ComponentService = ComponentService_1.ComponentService; +var HandlerBase_1 = require("./component/utils/HandlerBase"); +exports.HandlerBase = HandlerBase_1.HandlerBase; +var MeshFactory_1 = require("./component/utils/MeshFactory"); +exports.MeshFactory = MeshFactory_1.MeshFactory; +var MeshScene_1 = require("./component/utils/MeshScene"); +exports.MeshScene = MeshScene_1.MeshScene; var AttributionComponent_1 = require("./component/AttributionComponent"); exports.AttributionComponent = AttributionComponent_1.AttributionComponent; var BackgroundComponent_1 = require("./component/BackgroundComponent"); @@ -19920,8 +22776,16 @@ var DirectionDOMRenderer_1 = require("./component/direction/DirectionDOMRenderer exports.DirectionDOMRenderer = DirectionDOMRenderer_1.DirectionDOMRenderer; var ImageComponent_1 = require("./component/ImageComponent"); exports.ImageComponent = ImageComponent_1.ImageComponent; -var KeyboardComponent_1 = require("./component/KeyboardComponent"); +var KeyboardComponent_1 = require("./component/keyboard/KeyboardComponent"); exports.KeyboardComponent = KeyboardComponent_1.KeyboardComponent; +var KeyPlayHandler_1 = require("./component/keyboard/KeyPlayHandler"); +exports.KeyPlayHandler = KeyPlayHandler_1.KeyPlayHandler; +var KeyZoomHandler_1 = require("./component/keyboard/KeyZoomHandler"); +exports.KeyZoomHandler = KeyZoomHandler_1.KeyZoomHandler; +var KeySequenceNavigationHandler_1 = require("./component/keyboard/KeySequenceNavigationHandler"); +exports.KeySequenceNavigationHandler = KeySequenceNavigationHandler_1.KeySequenceNavigationHandler; +var KeySpatialNavigationHandler_1 = require("./component/keyboard/KeySpatialNavigationHandler"); +exports.KeySpatialNavigationHandler = KeySpatialNavigationHandler_1.KeySpatialNavigationHandler; var LoadingComponent_1 = require("./component/LoadingComponent"); exports.LoadingComponent = LoadingComponent_1.LoadingComponent; var Marker_1 = require("./component/marker/marker/Marker"); @@ -19934,8 +22798,8 @@ var MarkerSet_1 = require("./component/marker/MarkerSet"); exports.MarkerSet = MarkerSet_1.MarkerSet; var MouseComponent_1 = require("./component/mouse/MouseComponent"); exports.MouseComponent = MouseComponent_1.MouseComponent; -var MouseHandlerBase_1 = require("./component/mouse/MouseHandlerBase"); -exports.MouseHandlerBase = MouseHandlerBase_1.MouseHandlerBase; +var BounceHandler_1 = require("./component/mouse/BounceHandler"); +exports.BounceHandler = BounceHandler_1.BounceHandler; var DragPanHandler_1 = require("./component/mouse/DragPanHandler"); exports.DragPanHandler = DragPanHandler_1.DragPanHandler; var DoubleClickZoomHandler_1 = require("./component/mouse/DoubleClickZoomHandler"); @@ -19956,26 +22820,42 @@ var SequenceComponent_1 = require("./component/sequence/SequenceComponent"); exports.SequenceComponent = SequenceComponent_1.SequenceComponent; var SequenceDOMRenderer_1 = require("./component/sequence/SequenceDOMRenderer"); exports.SequenceDOMRenderer = SequenceDOMRenderer_1.SequenceDOMRenderer; -var SequenceDOMInteraction_1 = require("./component/sequence/SequenceDOMInteraction"); -exports.SequenceDOMInteraction = SequenceDOMInteraction_1.SequenceDOMInteraction; +var SequenceMode_1 = require("./component/sequence/SequenceMode"); +exports.SequenceMode = SequenceMode_1.SequenceMode; var ImagePlaneComponent_1 = require("./component/imageplane/ImagePlaneComponent"); exports.ImagePlaneComponent = ImagePlaneComponent_1.ImagePlaneComponent; -var ImagePlaneFactory_1 = require("./component/imageplane/ImagePlaneFactory"); -exports.ImagePlaneFactory = ImagePlaneFactory_1.ImagePlaneFactory; var ImagePlaneGLRenderer_1 = require("./component/imageplane/ImagePlaneGLRenderer"); exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer_1.ImagePlaneGLRenderer; -var ImagePlaneScene_1 = require("./component/imageplane/ImagePlaneScene"); -exports.ImagePlaneScene = ImagePlaneScene_1.ImagePlaneScene; -var ImagePlaneShaders_1 = require("./component/imageplane/ImagePlaneShaders"); -exports.ImagePlaneShaders = ImagePlaneShaders_1.ImagePlaneShaders; +var Shaders_1 = require("./component/shaders/Shaders"); +exports.Shaders = Shaders_1.Shaders; var SimpleMarker_1 = require("./component/marker/marker/SimpleMarker"); exports.SimpleMarker = SimpleMarker_1.SimpleMarker; var CircleMarker_1 = require("./component/marker/marker/CircleMarker"); exports.CircleMarker = CircleMarker_1.CircleMarker; -var SliderComponent_1 = require("./component/imageplane/SliderComponent"); +var SliderComponent_1 = require("./component/slider/SliderComponent"); exports.SliderComponent = SliderComponent_1.SliderComponent; +var SliderDOMRenderer_1 = require("./component/slider/SliderDOMRenderer"); +exports.SliderDOMRenderer = SliderDOMRenderer_1.SliderDOMRenderer; +var SliderGLRenderer_1 = require("./component/slider/SliderGLRenderer"); +exports.SliderGLRenderer = SliderGLRenderer_1.SliderGLRenderer; var StatsComponent_1 = require("./component/StatsComponent"); exports.StatsComponent = StatsComponent_1.StatsComponent; +var TagHandlerBase_1 = require("./component/tag/handlers/TagHandlerBase"); +exports.TagHandlerBase = TagHandlerBase_1.TagHandlerBase; +var CreateHandlerBase_1 = require("./component/tag/handlers/CreateHandlerBase"); +exports.CreateHandlerBase = CreateHandlerBase_1.CreateHandlerBase; +var CreatePointHandler_1 = require("./component/tag/handlers/CreatePointHandler"); +exports.CreatePointHandler = CreatePointHandler_1.CreatePointHandler; +var CreateVertexHandler_1 = require("./component/tag/handlers/CreateVertexHandler"); +exports.CreateVertexHandler = CreateVertexHandler_1.CreateVertexHandler; +var CreatePolygonHandler_1 = require("./component/tag/handlers/CreatePolygonHandler"); +exports.CreatePolygonHandler = CreatePolygonHandler_1.CreatePolygonHandler; +var CreateRectHandler_1 = require("./component/tag/handlers/CreateRectHandler"); +exports.CreateRectHandler = CreateRectHandler_1.CreateRectHandler; +var CreateRectDragHandler_1 = require("./component/tag/handlers/CreateRectDragHandler"); +exports.CreateRectDragHandler = CreateRectDragHandler_1.CreateRectDragHandler; +var EditVertexHandler_1 = require("./component/tag/handlers/EditVertexHandler"); +exports.EditVertexHandler = EditVertexHandler_1.EditVertexHandler; var Tag_1 = require("./component/tag/tag/Tag"); exports.Tag = Tag_1.Tag; var OutlineTag_1 = require("./component/tag/tag/OutlineTag"); @@ -20016,8 +22896,11 @@ var PolygonGeometry_1 = require("./component/tag/geometry/PolygonGeometry"); exports.PolygonGeometry = PolygonGeometry_1.PolygonGeometry; var GeometryTagError_1 = require("./component/tag/error/GeometryTagError"); exports.GeometryTagError = GeometryTagError_1.GeometryTagError; +var ZoomComponent_1 = require("./component/zoom/ZoomComponent"); +exports.ZoomComponent = ZoomComponent_1.ZoomComponent; +__export(require("./component/interfaces/interfaces")); -},{"./component/AttributionComponent":239,"./component/BackgroundComponent":240,"./component/BearingComponent":241,"./component/CacheComponent":242,"./component/Component":243,"./component/ComponentService":244,"./component/CoverComponent":245,"./component/DebugComponent":246,"./component/ImageComponent":247,"./component/KeyboardComponent":248,"./component/LoadingComponent":249,"./component/NavigationComponent":250,"./component/RouteComponent":251,"./component/StatsComponent":252,"./component/direction/DirectionComponent":253,"./component/direction/DirectionDOMCalculator":254,"./component/direction/DirectionDOMRenderer":255,"./component/imageplane/ImagePlaneComponent":256,"./component/imageplane/ImagePlaneFactory":257,"./component/imageplane/ImagePlaneGLRenderer":258,"./component/imageplane/ImagePlaneScene":259,"./component/imageplane/ImagePlaneShaders":260,"./component/imageplane/SliderComponent":261,"./component/marker/MarkerComponent":263,"./component/marker/MarkerScene":264,"./component/marker/MarkerSet":265,"./component/marker/marker/CircleMarker":266,"./component/marker/marker/Marker":267,"./component/marker/marker/SimpleMarker":268,"./component/mouse/DoubleClickZoomHandler":269,"./component/mouse/DragPanHandler":270,"./component/mouse/MouseComponent":271,"./component/mouse/MouseHandlerBase":272,"./component/mouse/ScrollZoomHandler":273,"./component/mouse/TouchZoomHandler":274,"./component/popup/PopupComponent":276,"./component/popup/popup/Popup":277,"./component/sequence/SequenceComponent":278,"./component/sequence/SequenceDOMInteraction":279,"./component/sequence/SequenceDOMRenderer":280,"./component/tag/TagComponent":282,"./component/tag/TagCreator":283,"./component/tag/TagDOMRenderer":284,"./component/tag/TagMode":285,"./component/tag/TagOperation":286,"./component/tag/TagScene":287,"./component/tag/TagSet":288,"./component/tag/error/GeometryTagError":289,"./component/tag/geometry/Geometry":290,"./component/tag/geometry/PointGeometry":291,"./component/tag/geometry/PolygonGeometry":292,"./component/tag/geometry/RectGeometry":293,"./component/tag/geometry/VertexGeometry":294,"./component/tag/tag/OutlineCreateTag":295,"./component/tag/tag/OutlineRenderTag":296,"./component/tag/tag/OutlineTag":297,"./component/tag/tag/RenderTag":298,"./component/tag/tag/SpotRenderTag":299,"./component/tag/tag/SpotTag":300,"./component/tag/tag/Tag":301}],227:[function(require,module,exports){ +},{"./component/AttributionComponent":304,"./component/BackgroundComponent":305,"./component/BearingComponent":306,"./component/CacheComponent":307,"./component/Component":308,"./component/ComponentService":309,"./component/CoverComponent":310,"./component/DebugComponent":311,"./component/ImageComponent":312,"./component/LoadingComponent":313,"./component/NavigationComponent":314,"./component/RouteComponent":315,"./component/StatsComponent":316,"./component/direction/DirectionComponent":317,"./component/direction/DirectionDOMCalculator":318,"./component/direction/DirectionDOMRenderer":319,"./component/imageplane/ImagePlaneComponent":320,"./component/imageplane/ImagePlaneGLRenderer":321,"./component/interfaces/interfaces":324,"./component/keyboard/KeyPlayHandler":325,"./component/keyboard/KeySequenceNavigationHandler":326,"./component/keyboard/KeySpatialNavigationHandler":327,"./component/keyboard/KeyZoomHandler":328,"./component/keyboard/KeyboardComponent":329,"./component/marker/MarkerComponent":331,"./component/marker/MarkerScene":332,"./component/marker/MarkerSet":333,"./component/marker/marker/CircleMarker":334,"./component/marker/marker/Marker":335,"./component/marker/marker/SimpleMarker":336,"./component/mouse/BounceHandler":337,"./component/mouse/DoubleClickZoomHandler":338,"./component/mouse/DragPanHandler":339,"./component/mouse/MouseComponent":340,"./component/mouse/ScrollZoomHandler":341,"./component/mouse/TouchZoomHandler":342,"./component/popup/PopupComponent":344,"./component/popup/popup/Popup":345,"./component/sequence/SequenceComponent":346,"./component/sequence/SequenceDOMRenderer":347,"./component/sequence/SequenceMode":348,"./component/shaders/Shaders":349,"./component/slider/SliderComponent":350,"./component/slider/SliderDOMRenderer":351,"./component/slider/SliderGLRenderer":352,"./component/tag/TagComponent":354,"./component/tag/TagCreator":355,"./component/tag/TagDOMRenderer":356,"./component/tag/TagMode":357,"./component/tag/TagOperation":358,"./component/tag/TagScene":359,"./component/tag/TagSet":360,"./component/tag/error/GeometryTagError":361,"./component/tag/geometry/Geometry":362,"./component/tag/geometry/PointGeometry":363,"./component/tag/geometry/PolygonGeometry":364,"./component/tag/geometry/RectGeometry":365,"./component/tag/geometry/VertexGeometry":366,"./component/tag/handlers/CreateHandlerBase":367,"./component/tag/handlers/CreatePointHandler":368,"./component/tag/handlers/CreatePolygonHandler":369,"./component/tag/handlers/CreateRectDragHandler":370,"./component/tag/handlers/CreateRectHandler":371,"./component/tag/handlers/CreateVertexHandler":372,"./component/tag/handlers/EditVertexHandler":373,"./component/tag/handlers/TagHandlerBase":374,"./component/tag/tag/OutlineCreateTag":375,"./component/tag/tag/OutlineRenderTag":376,"./component/tag/tag/OutlineTag":377,"./component/tag/tag/RenderTag":378,"./component/tag/tag/SpotRenderTag":379,"./component/tag/tag/SpotTag":380,"./component/tag/tag/Tag":381,"./component/utils/HandlerBase":382,"./component/utils/MeshFactory":383,"./component/utils/MeshScene":384,"./component/zoom/ZoomComponent":385}],291:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var EdgeDirection_1 = require("./graph/edge/EdgeDirection"); @@ -20031,9 +22914,11 @@ exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients_1.EdgeCalculator var EdgeCalculator_1 = require("./graph/edge/EdgeCalculator"); exports.EdgeCalculator = EdgeCalculator_1.EdgeCalculator; -},{"./graph/edge/EdgeCalculator":319,"./graph/edge/EdgeCalculatorCoefficients":320,"./graph/edge/EdgeCalculatorDirections":321,"./graph/edge/EdgeCalculatorSettings":322,"./graph/edge/EdgeDirection":323}],228:[function(require,module,exports){ +},{"./graph/edge/EdgeCalculator":405,"./graph/edge/EdgeCalculatorCoefficients":406,"./graph/edge/EdgeCalculatorDirections":407,"./graph/edge/EdgeCalculatorSettings":408,"./graph/edge/EdgeDirection":409}],292:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +var AbortMapillaryError_1 = require("./error/AbortMapillaryError"); +exports.AbortMapillaryError = AbortMapillaryError_1.AbortMapillaryError; var ArgumentMapillaryError_1 = require("./error/ArgumentMapillaryError"); exports.ArgumentMapillaryError = ArgumentMapillaryError_1.ArgumentMapillaryError; var GraphMapillaryError_1 = require("./error/GraphMapillaryError"); @@ -20041,7 +22926,7 @@ exports.GraphMapillaryError = GraphMapillaryError_1.GraphMapillaryError; var MapillaryError_1 = require("./error/MapillaryError"); exports.MapillaryError = MapillaryError_1.MapillaryError; -},{"./error/ArgumentMapillaryError":302,"./error/GraphMapillaryError":303,"./error/MapillaryError":304}],229:[function(require,module,exports){ +},{"./error/AbortMapillaryError":386,"./error/ArgumentMapillaryError":387,"./error/GraphMapillaryError":388,"./error/MapillaryError":389}],293:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Camera_1 = require("./geo/Camera"); @@ -20055,7 +22940,7 @@ exports.Spatial = Spatial_1.Spatial; var Transform_1 = require("./geo/Transform"); exports.Transform = Transform_1.Transform; -},{"./geo/Camera":305,"./geo/GeoCoords":306,"./geo/Spatial":307,"./geo/Transform":308,"./geo/ViewportCoords":309}],230:[function(require,module,exports){ +},{"./geo/Camera":390,"./geo/GeoCoords":391,"./geo/Spatial":392,"./geo/Transform":393,"./geo/ViewportCoords":394}],294:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var FilterCreator_1 = require("./graph/FilterCreator"); @@ -20064,6 +22949,8 @@ var Graph_1 = require("./graph/Graph"); exports.Graph = Graph_1.Graph; var GraphCalculator_1 = require("./graph/GraphCalculator"); exports.GraphCalculator = GraphCalculator_1.GraphCalculator; +var GraphMode_1 = require("./graph/GraphMode"); +exports.GraphMode = GraphMode_1.GraphMode; var GraphService_1 = require("./graph/GraphService"); exports.GraphService = GraphService_1.GraphService; var ImageLoadingService_1 = require("./graph/ImageLoadingService"); @@ -20077,21 +22964,31 @@ exports.NodeCache = NodeCache_1.NodeCache; var Sequence_1 = require("./graph/Sequence"); exports.Sequence = Sequence_1.Sequence; -},{"./graph/FilterCreator":310,"./graph/Graph":311,"./graph/GraphCalculator":312,"./graph/GraphService":313,"./graph/ImageLoadingService":314,"./graph/MeshReader":315,"./graph/Node":316,"./graph/NodeCache":317,"./graph/Sequence":318}],231:[function(require,module,exports){ +},{"./graph/FilterCreator":395,"./graph/Graph":396,"./graph/GraphCalculator":397,"./graph/GraphMode":398,"./graph/GraphService":399,"./graph/ImageLoadingService":400,"./graph/MeshReader":401,"./graph/Node":402,"./graph/NodeCache":403,"./graph/Sequence":404}],295:[function(require,module,exports){ "use strict"; /** * MapillaryJS is a WebGL JavaScript library for exploring street level imagery * @name Mapillary */ +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./Support")); var Edge_1 = require("./Edge"); exports.EdgeDirection = Edge_1.EdgeDirection; +var Error_1 = require("./Error"); +exports.AbortMapillaryError = Error_1.AbortMapillaryError; var Render_1 = require("./Render"); exports.RenderMode = Render_1.RenderMode; +var State_1 = require("./State"); +exports.TransitionMode = State_1.TransitionMode; var Viewer_1 = require("./Viewer"); exports.Alignment = Viewer_1.Alignment; exports.ImageSize = Viewer_1.ImageSize; exports.Viewer = Viewer_1.Viewer; +var Component_1 = require("./Component"); +exports.SliderMode = Component_1.SliderMode; var TagComponent = require("./component/tag/Tag"); exports.TagComponent = TagComponent; var MarkerComponent = require("./component/marker/Marker"); @@ -20099,7 +22996,7 @@ exports.MarkerComponent = MarkerComponent; var PopupComponent = require("./component/popup/Popup"); exports.PopupComponent = PopupComponent; -},{"./Edge":227,"./Render":232,"./Viewer":236,"./component/marker/Marker":262,"./component/popup/Popup":275,"./component/tag/Tag":281}],232:[function(require,module,exports){ +},{"./Component":290,"./Edge":291,"./Error":292,"./Render":296,"./State":297,"./Support":298,"./Viewer":301,"./component/marker/Marker":330,"./component/popup/Popup":343,"./component/tag/Tag":353}],296:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var DOMRenderer_1 = require("./render/DOMRenderer"); @@ -20115,9 +23012,11 @@ exports.RenderMode = RenderMode_1.RenderMode; var RenderService_1 = require("./render/RenderService"); exports.RenderService = RenderService_1.RenderService; -},{"./render/DOMRenderer":324,"./render/GLRenderStage":325,"./render/GLRenderer":326,"./render/RenderCamera":327,"./render/RenderMode":328,"./render/RenderService":329}],233:[function(require,module,exports){ +},{"./render/DOMRenderer":410,"./render/GLRenderStage":411,"./render/GLRenderer":412,"./render/RenderCamera":413,"./render/RenderMode":414,"./render/RenderService":415}],297:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +var RotationDelta_1 = require("./state/RotationDelta"); +exports.RotationDelta = RotationDelta_1.RotationDelta; var State_1 = require("./state/State"); exports.State = State_1.State; var StateBase_1 = require("./state/states/StateBase"); @@ -20126,12 +23025,58 @@ var StateContext_1 = require("./state/StateContext"); exports.StateContext = StateContext_1.StateContext; var StateService_1 = require("./state/StateService"); exports.StateService = StateService_1.StateService; +var TransitionMode_1 = require("./state/TransitionMode"); +exports.TransitionMode = TransitionMode_1.TransitionMode; +var InteractiveStateBase_1 = require("./state/states/InteractiveStateBase"); +exports.InteractiveStateBase = InteractiveStateBase_1.InteractiveStateBase; +var InteractiveWaitingState_1 = require("./state/states/InteractiveWaitingState"); +exports.InteractiveWaitingState = InteractiveWaitingState_1.InteractiveWaitingState; var TraversingState_1 = require("./state/states/TraversingState"); exports.TraversingState = TraversingState_1.TraversingState; var WaitingState_1 = require("./state/states/WaitingState"); exports.WaitingState = WaitingState_1.WaitingState; -},{"./state/State":330,"./state/StateContext":331,"./state/StateService":332,"./state/states/StateBase":333,"./state/states/TraversingState":334,"./state/states/WaitingState":335}],234:[function(require,module,exports){ +},{"./state/RotationDelta":416,"./state/State":417,"./state/StateContext":418,"./state/StateService":419,"./state/TransitionMode":420,"./state/states/InteractiveStateBase":421,"./state/states/InteractiveWaitingState":422,"./state/states/StateBase":423,"./state/states/TraversingState":424,"./state/states/WaitingState":425}],298:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var support = require("./utils/Support"); +/** + * Test whether the current browser supports the full + * functionality of MapillaryJS. + * + * @description The full functionality includes WebGL rendering. + * + * @return {boolean} + * + * @example `var supported = Mapillary.isSupported();` + */ +function isSupported() { + return isFallbackSupported() && + support.isWebGLSupportedCached(); +} +exports.isSupported = isSupported; +/** + * Test whether the current browser supports the fallback + * functionality of MapillaryJS. + * + * @description The fallback functionality does not include WebGL + * rendering, only 2D canvas rendering. + * + * @return {boolean} + * + * @example `var fallbackSupported = Mapillary.isFallbackSupported();` + */ +function isFallbackSupported() { + return support.isBrowser() && + support.isBlobSupported() && + support.isArraySupported() && + support.isFunctionSupported() && + support.isJSONSupported() && + support.isObjectSupported(); +} +exports.isFallbackSupported = isFallbackSupported; + +},{"./utils/Support":433}],299:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ImageTileLoader_1 = require("./tiles/ImageTileLoader"); @@ -20143,17 +23088,23 @@ exports.TextureProvider = TextureProvider_1.TextureProvider; var RegionOfInterestCalculator_1 = require("./tiles/RegionOfInterestCalculator"); exports.RegionOfInterestCalculator = RegionOfInterestCalculator_1.RegionOfInterestCalculator; -},{"./tiles/ImageTileLoader":336,"./tiles/ImageTileStore":337,"./tiles/RegionOfInterestCalculator":338,"./tiles/TextureProvider":339}],235:[function(require,module,exports){ +},{"./tiles/ImageTileLoader":426,"./tiles/ImageTileStore":427,"./tiles/RegionOfInterestCalculator":428,"./tiles/TextureProvider":429}],300:[function(require,module,exports){ "use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} Object.defineProperty(exports, "__esModule", { value: true }); +var DOM_1 = require("./utils/DOM"); +exports.DOM = DOM_1.DOM; var EventEmitter_1 = require("./utils/EventEmitter"); exports.EventEmitter = EventEmitter_1.EventEmitter; var Settings_1 = require("./utils/Settings"); exports.Settings = Settings_1.Settings; +__export(require("./utils/Support")); var Urls_1 = require("./utils/Urls"); exports.Urls = Urls_1.Urls; -},{"./utils/EventEmitter":340,"./utils/Settings":341,"./utils/Urls":342}],236:[function(require,module,exports){ +},{"./utils/DOM":430,"./utils/EventEmitter":431,"./utils/Settings":432,"./utils/Support":433,"./utils/Urls":434}],301:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Alignment_1 = require("./viewer/Alignment"); @@ -20168,12 +23119,16 @@ var Observer_1 = require("./viewer/Observer"); exports.Observer = Observer_1.Observer; var ImageSize_1 = require("./viewer/ImageSize"); exports.ImageSize = ImageSize_1.ImageSize; +var KeyboardService_1 = require("./viewer/KeyboardService"); +exports.KeyboardService = KeyboardService_1.KeyboardService; var LoadingService_1 = require("./viewer/LoadingService"); exports.LoadingService = LoadingService_1.LoadingService; var MouseService_1 = require("./viewer/MouseService"); exports.MouseService = MouseService_1.MouseService; var Navigator_1 = require("./viewer/Navigator"); exports.Navigator = Navigator_1.Navigator; +var PlayService_1 = require("./viewer/PlayService"); +exports.PlayService = PlayService_1.PlayService; var Projection_1 = require("./viewer/Projection"); exports.Projection = Projection_1.Projection; var SpriteService_1 = require("./viewer/SpriteService"); @@ -20183,22 +23138,18 @@ exports.TouchService = TouchService_1.TouchService; var Viewer_1 = require("./viewer/Viewer"); exports.Viewer = Viewer_1.Viewer; -},{"./viewer/Alignment":343,"./viewer/CacheService":344,"./viewer/ComponentController":345,"./viewer/Container":346,"./viewer/ImageSize":347,"./viewer/LoadingService":348,"./viewer/MouseService":349,"./viewer/Navigator":350,"./viewer/Observer":351,"./viewer/Projection":352,"./viewer/SpriteService":353,"./viewer/TouchService":354,"./viewer/Viewer":355}],237:[function(require,module,exports){ +},{"./viewer/Alignment":435,"./viewer/CacheService":436,"./viewer/ComponentController":437,"./viewer/Container":438,"./viewer/ImageSize":439,"./viewer/KeyboardService":440,"./viewer/LoadingService":441,"./viewer/MouseService":442,"./viewer/Navigator":443,"./viewer/Observer":444,"./viewer/PlayService":445,"./viewer/Projection":446,"./viewer/SpriteService":447,"./viewer/TouchService":448,"./viewer/Viewer":449}],302:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var Observable_1 = require("rxjs/Observable"); -require("rxjs/add/observable/defer"); -require("rxjs/add/observable/fromPromise"); -require("rxjs/add/operator/catch"); -require("rxjs/add/operator/map"); var API_1 = require("../API"); /** * @class APIv3 * * @classdesc Provides methods for access of API v3. */ -var APIv3 = (function () { +var APIv3 = /** @class */ (function () { /** * Create a new api v3 instance. * @@ -20221,11 +23172,14 @@ var APIv3 = (function () { this._propertiesCore = [ "cl", "l", - "sequence", + "sequence_key", ]; this._propertiesFill = [ "captured_at", + "captured_with_camera_uuid", "user", + "organization_key", + "private", "project", ]; this._propertiesKey = [ @@ -20310,11 +23264,10 @@ var APIv3 = (function () { hs, { from: 0, to: this._pageCount }, this._propertiesKey - .concat(this._propertiesCore), - this._propertiesKey + .concat(this._propertiesCore) ])) .map(function (value) { - if (value == null) { + if (!value) { value = { json: { imagesByH: {} } }; for (var _i = 0, hs_1 = hs; _i < hs_1.length; _i++) { var h = hs_1[_i]; @@ -20352,6 +23305,16 @@ var APIv3 = (function () { .concat(this._propertiesSequence) ])) .map(function (value) { + if (!value) { + value = { json: { sequenceByKey: {} } }; + } + for (var _i = 0, sequenceKeys_1 = sequenceKeys; _i < sequenceKeys_1.length; _i++) { + var sequenceKey = sequenceKeys_1[_i]; + if (!(sequenceKey in value.json.sequenceByKey)) { + console.warn("Sequence data missing (" + sequenceKey + ")"); + value.json.sequenceByKey[sequenceKey] = { key: sequenceKey, keys: [] }; + } + } return value.json.sequenceByKey; }), this._pathSequenceByKey, sequenceKeys); }; @@ -20395,7 +23358,7 @@ var APIv3 = (function () { exports.APIv3 = APIv3; exports.default = APIv3; -},{"../API":225,"rxjs/Observable":29,"rxjs/add/observable/defer":39,"rxjs/add/observable/fromPromise":43,"rxjs/add/operator/catch":52,"rxjs/add/operator/map":65}],238:[function(require,module,exports){ +},{"../API":289,"rxjs/Observable":29}],303:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); @@ -20407,7 +23370,7 @@ var Utils_1 = require("../Utils"); * * @classdesc Creates API models. */ -var ModelCreator = (function () { +var ModelCreator = /** @class */ (function () { function ModelCreator() { } /** @@ -20439,7 +23402,7 @@ var ModelCreator = (function () { exports.ModelCreator = ModelCreator; exports.default = ModelCreator; -},{"../Utils":235,"falcor":15,"falcor-http-datasource":10}],239:[function(require,module,exports){ +},{"../Utils":300,"falcor":15,"falcor-http-datasource":10}],304:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -20454,17 +23417,24 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var vd = require("virtual-dom"); +var Observable_1 = require("rxjs/Observable"); var Component_1 = require("../Component"); -var AttributionComponent = (function (_super) { +var Utils_1 = require("../Utils"); +var AttributionComponent = /** @class */ (function (_super) { __extends(AttributionComponent, _super); function AttributionComponent(name, container, navigator) { return _super.call(this, name, container, navigator) || this; } AttributionComponent.prototype._activate = function () { var _this = this; - this._disposable = this._navigator.stateService.currentNode$ - .map(function (node) { - return { name: _this._name, vnode: _this._getAttributionNode(node.username, node.key) }; + this._disposable = Observable_1.Observable + .combineLatest(this._navigator.stateService.currentNode$, this._container.renderService.size$) + .map(function (_a) { + var node = _a[0], size = _a[1]; + return { + name: _this._name, + vnode: _this._getAttributionNode(node.username, node.key, node.capturedAt, size.width), + }; }) .subscribe(this._container.domRenderer.render$); }; @@ -20474,27 +23444,31 @@ var AttributionComponent = (function (_super) { AttributionComponent.prototype._getDefaultConfiguration = function () { return {}; }; - AttributionComponent.prototype._getAttributionNode = function (username, photoId) { - return vd.h("div.Attribution", {}, [ - vd.h("a", { href: "https://www.mapillary.com/app/user/" + username, - target: "_blank", - textContent: "@" + username, - }, []), - vd.h("span", { textContent: "|" }, []), - vd.h("a", { href: "https://www.mapillary.com/app/?pKey=" + photoId + "&focus=photo", - target: "_blank", - textContent: "mapillary.com", - }, []), - ]); - }; + AttributionComponent.prototype._getAttributionNode = function (username, key, capturedAt, width) { + var compact = width <= 640; + var mapillaryIcon = vd.h("div.AttributionMapillaryLogo", []); + var mapillaryLink = vd.h("a.AttributionIconContainer", { href: Utils_1.Urls.explore, target: "_blank" }, [mapillaryIcon]); + var imageBy = compact ? "" + username : "image by " + username; + var imageByContent = vd.h("div.AttributionUsername", { textContent: imageBy }, []); + var date = new Date(capturedAt).toDateString().split(" "); + var formatted = (date.length > 3 ? + compact ? + [date[3]] : + [date[1], date[2] + ",", date[3]] : + date).join(" "); + var dateContent = vd.h("div.AttributionDate", { textContent: formatted }, []); + var imageLink = vd.h("a.AttributionImageContainer", { href: Utils_1.Urls.exporeImage(key), target: "_blank" }, [imageByContent, dateContent]); + var compactClass = compact ? ".AttributionCompact" : ""; + return vd.h("div.AttributionContainer" + compactClass, {}, [mapillaryLink, imageLink]); + }; + AttributionComponent.componentName = "attribution"; return AttributionComponent; }(Component_1.Component)); -AttributionComponent.componentName = "attribution"; exports.AttributionComponent = AttributionComponent; Component_1.ComponentService.register(AttributionComponent); exports.default = AttributionComponent; -},{"../Component":226,"virtual-dom":182}],240:[function(require,module,exports){ +},{"../Component":290,"../Utils":300,"rxjs/Observable":29,"virtual-dom":246}],305:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -20510,14 +23484,14 @@ var __extends = (this && this.__extends) || (function () { Object.defineProperty(exports, "__esModule", { value: true }); var vd = require("virtual-dom"); var Component_1 = require("../Component"); -var BackgroundComponent = (function (_super) { +var BackgroundComponent = /** @class */ (function (_super) { __extends(BackgroundComponent, _super); function BackgroundComponent(name, container, navigator) { return _super.call(this, name, container, navigator) || this; } BackgroundComponent.prototype._activate = function () { this._container.domRenderer.render$ - .next({ name: this._name, vnode: this._getBackgroundNode("The viewer can't display the given photo.") }); + .next({ name: this._name, vnode: this._getBackgroundNode("The viewer can't display the given image.") }); }; BackgroundComponent.prototype._deactivate = function () { return; @@ -20531,14 +23505,14 @@ var BackgroundComponent = (function (_super) { vd.h("p", { textContent: notice }, []), ]); }; + BackgroundComponent.componentName = "background"; return BackgroundComponent; }(Component_1.Component)); -BackgroundComponent.componentName = "background"; exports.BackgroundComponent = BackgroundComponent; Component_1.ComponentService.register(BackgroundComponent); exports.default = BackgroundComponent; -},{"../Component":226,"virtual-dom":182}],241:[function(require,module,exports){ +},{"../Component":290,"virtual-dom":246}],306:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -20553,45 +23527,19 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var vd = require("virtual-dom"); -var Observable_1 = require("rxjs/Observable"); var Component_1 = require("../Component"); var Geo_1 = require("../Geo"); -var BearingComponent = (function (_super) { +var BearingComponent = /** @class */ (function (_super) { __extends(BearingComponent, _super); function BearingComponent(name, container, navigator) { var _this = _super.call(this, name, container, navigator) || this; _this._spatial = new Geo_1.Spatial(); _this._svgNamespace = "http://www.w3.org/2000/svg"; - _this._distinctThreshold = Math.PI / 90; + _this._distinctThreshold = Math.PI / 360; return _this; } BearingComponent.prototype._activate = function () { var _this = this; - var nodeBearingFov$ = this._navigator.stateService.currentState$ - .distinctUntilChanged(undefined, function (frame) { - return frame.state.currentNode.key; - }) - .map(function (frame) { - var node = frame.state.currentNode; - var transform = frame.state.currentTransform; - if (node.pano) { - var hFov_1 = 2 * Math.PI * node.gpano.CroppedAreaImageWidthPixels / node.gpano.FullPanoWidthPixels; - return [_this._spatial.degToRad(node.ca), hFov_1]; - } - var size = Math.max(transform.basicWidth, transform.basicHeight); - if (size <= 0) { - console.warn("Original image size (" + transform.basicWidth + ", " + transform.basicHeight + ") is invalid (" + node.key + ". " + - "Not showing available fov."); - } - var hFov = size > 0 ? - 2 * Math.atan(0.5 * transform.basicWidth / (size * transform.focal)) : - 0; - return [_this._spatial.degToRad(node.ca), hFov]; - }) - .distinctUntilChanged(function (a1, a2) { - return Math.abs(a2[0] - a1[0]) < _this._distinctThreshold && - Math.abs(a2[1] - a1[1]) < _this._distinctThreshold; - }); var cameraBearingFov$ = this._container.renderService.renderCamera$ .map(function (rc) { var vFov = _this._spatial.degToRad(rc.perspective.fov); @@ -20604,23 +23552,20 @@ var BearingComponent = (function (_super) { return Math.abs(a2[0] - a1[0]) < _this._distinctThreshold && Math.abs(a2[1] - a1[1]) < _this._distinctThreshold; }); - this._renderSubscription = Observable_1.Observable - .combineLatest(nodeBearingFov$, cameraBearingFov$) - .map(function (args) { - var background = vd.h("div.BearingIndicatorBackground", { oncontextmenu: function (event) { event.preventDefault(); } }, [ - vd.h("div.BearingIndicatorBackgroundRectangle", {}, []), - vd.h("div.BearingIndicatorBackgroundCircle", {}, []), - ]); - var north = vd.h("div.BearingIndicatorNorth", {}, []); - var nodeSector = _this._createCircleSector(args[0][0], args[0][1], "#000"); - var cameraSector = _this._createCircleSector(args[1][0], args[1][1], "#fff"); - var compass = _this._createCircleSectorCompass(nodeSector, cameraSector); + this._renderSubscription = cameraBearingFov$ + .map(function (_a) { + var bearing = _a[0], fov = _a[1]; + var background = vd.h("div.BearingIndicatorBackground", {}, []); + var backgroundCircle = vd.h("div.BearingIndicatorBackgroundCircle", {}, []); + var north = _this._createNorth(bearing); + var cameraSector = _this._createCircleSectorCompass(_this._createCircleSector(Math.max(Math.PI / 20, fov), "#FFF")); return { name: _this._name, - vnode: vd.h("div.BearingIndicator", {}, [ + vnode: vd.h("div.BearingIndicatorContainer", { oncontextmenu: function (event) { event.preventDefault(); } }, [ background, + backgroundCircle, north, - compass, + cameraSector, ]), }; }) @@ -20632,43 +23577,32 @@ var BearingComponent = (function (_super) { BearingComponent.prototype._getDefaultConfiguration = function () { return {}; }; - BearingComponent.prototype._createCircleSectorCompass = function (nodeSector, cameraSector) { + BearingComponent.prototype._createCircleSectorCompass = function (cameraSector) { var group = vd.h("g", { attributes: { transform: "translate(1,1)" }, namespace: this._svgNamespace, - }, [nodeSector, cameraSector]); - var centerCircle = vd.h("circle", { - attributes: { - cx: "1", - cy: "1", - fill: "#abb1b9", - r: "0.291667", - stroke: "#000", - "stroke-width": "0.0833333", - }, - namespace: this._svgNamespace, - }, []); + }, [cameraSector]); var svg = vd.h("svg", { attributes: { viewBox: "0 0 2 2" }, namespace: this._svgNamespace, style: { - bottom: "4px", - height: "48px", + height: "30px", left: "4px", position: "absolute", - width: "48px", + top: "4px", + width: "30px", }, - }, [group, centerCircle]); + }, [group]); return svg; }; - BearingComponent.prototype._createCircleSector = function (bearing, fov, fill) { + BearingComponent.prototype._createCircleSector = function (fov, fill) { if (fov > 2 * Math.PI - Math.PI / 90) { return vd.h("circle", { attributes: { cx: "0", cy: "0", fill: fill, r: "1" }, namespace: this._svgNamespace, }, []); } - var arcStart = bearing - fov / 2 - Math.PI / 2; + var arcStart = -Math.PI / 2 - fov / 2; var arcEnd = arcStart + fov; var startX = Math.cos(arcStart); var startY = Math.sin(arcStart); @@ -20681,14 +23615,19 @@ var BearingComponent = (function (_super) { namespace: this._svgNamespace, }, []); }; + BearingComponent.prototype._createNorth = function (bearing) { + var north = vd.h("div.BearingNorth", []); + var container = vd.h("div.BearingNorthContainer", { style: { transform: "rotateZ(" + -bearing * 180 / Math.PI + "deg)" } }, [north]); + return container; + }; + BearingComponent.componentName = "bearing"; return BearingComponent; }(Component_1.Component)); -BearingComponent.componentName = "bearing"; exports.BearingComponent = BearingComponent; Component_1.ComponentService.register(BearingComponent); exports.default = BearingComponent; -},{"../Component":226,"../Geo":229,"rxjs/Observable":29,"virtual-dom":182}],242:[function(require,module,exports){ +},{"../Component":290,"../Geo":293,"virtual-dom":246}],307:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -20702,25 +23641,9 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var Observable_1 = require("rxjs/Observable"); -require("rxjs/add/observable/combineLatest"); -require("rxjs/add/observable/from"); -require("rxjs/add/observable/merge"); -require("rxjs/add/observable/of"); -require("rxjs/add/observable/zip"); -require("rxjs/add/operator/catch"); -require("rxjs/add/operator/combineLatest"); -require("rxjs/add/operator/distinct"); -require("rxjs/add/operator/expand"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/merge"); -require("rxjs/add/operator/mergeMap"); -require("rxjs/add/operator/mergeAll"); -require("rxjs/add/operator/skip"); -require("rxjs/add/operator/switchMap"); var Edge_1 = require("../Edge"); var Component_1 = require("../Component"); -var CacheComponent = (function (_super) { +var CacheComponent = /** @class */ (function (_super) { __extends(CacheComponent, _super); function CacheComponent(name, container, navigator) { return _super.call(this, name, container, navigator) || this; @@ -20839,14 +23762,14 @@ var CacheComponent = (function (_super) { return status.edges; }); }; + CacheComponent.componentName = "cache"; return CacheComponent; }(Component_1.Component)); -CacheComponent.componentName = "cache"; exports.CacheComponent = CacheComponent; Component_1.ComponentService.register(CacheComponent); exports.default = CacheComponent; -},{"../Component":226,"../Edge":227,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/from":41,"rxjs/add/observable/merge":44,"rxjs/add/observable/of":45,"rxjs/add/observable/zip":48,"rxjs/add/operator/catch":52,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinct":57,"rxjs/add/operator/expand":60,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeAll":67,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/skip":75,"rxjs/add/operator/switchMap":79}],243:[function(require,module,exports){ +},{"../Component":290,"../Edge":291,"rxjs/Observable":29}],308:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -20861,11 +23784,8 @@ var __extends = (this && this.__extends) || (function () { Object.defineProperty(exports, "__esModule", { value: true }); var BehaviorSubject_1 = require("rxjs/BehaviorSubject"); var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/operator/publishReplay"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/startWith"); var Utils_1 = require("../Utils"); -var Component = (function (_super) { +var Component = /** @class */ (function (_super) { __extends(Component, _super); function Component(name, container, navigator) { var _this = _super.call(this) || this; @@ -20960,26 +23880,24 @@ var Component = (function (_super) { * rendered elements accordingly if applicable. */ Component.prototype.resize = function () { return; }; + /** + * Component name. Used when interacting with component through the Viewer's API. + */ + Component.componentName = "not_worthy"; return Component; }(Utils_1.EventEmitter)); -/** - * Component name. Used when interacting with component through the Viewer's API. - */ -Component.componentName = "not_worthy"; exports.Component = Component; exports.default = Component; -},{"../Utils":235,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/startWith":78}],244:[function(require,module,exports){ +},{"../Utils":300,"rxjs/BehaviorSubject":26,"rxjs/Subject":34}],309:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var _ = require("underscore"); var Error_1 = require("../Error"); -var ComponentService = (function () { +var ComponentService = /** @class */ (function () { function ComponentService(container, navigator) { this._components = {}; - this._container = container; - this._navigator = navigator; for (var _i = 0, _a = _.values(ComponentService.registeredComponents); _i < _a.length; _i++) { var component = _a[_i]; this._components[component.componentName] = { @@ -20999,6 +23917,13 @@ var ComponentService = (function () { ComponentService.registerCover = function (coverComponent) { ComponentService.registeredCoverComponent = coverComponent; }; + Object.defineProperty(ComponentService.prototype, "coverActivated", { + get: function () { + return this._coverActivated; + }, + enumerable: true, + configurable: true + }); ComponentService.prototype.activateCover = function () { if (this._coverActivated) { return; @@ -21060,13 +23985,13 @@ var ComponentService = (function () { throw new Error_1.ArgumentMapillaryError("Component does not exist: " + name); } }; + ComponentService.registeredComponents = {}; return ComponentService; }()); -ComponentService.registeredComponents = {}; exports.ComponentService = ComponentService; exports.default = ComponentService; -},{"../Error":228,"underscore":178}],245:[function(require,module,exports){ +},{"../Error":292,"underscore":242}],310:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -21081,77 +24006,93 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var vd = require("virtual-dom"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/withLatestFrom"); +var Observable_1 = require("rxjs/Observable"); var Component_1 = require("../Component"); -var CoverComponent = (function (_super) { +var Utils_1 = require("../Utils"); +var Viewer_1 = require("../Viewer"); +var CoverComponent = /** @class */ (function (_super) { __extends(CoverComponent, _super); function CoverComponent(name, container, navigator) { return _super.call(this, name, container, navigator) || this; } CoverComponent.prototype._activate = function () { var _this = this; - this._keyDisposable = this._navigator.stateService.currentNode$ - .withLatestFrom(this._configuration$, function (node, configuration) { - return [node, configuration]; + this._configuration$ + .distinctUntilChanged(undefined, function (configuration) { + return configuration.state; }) - .filter(function (nc) { - return nc[0].key !== nc[1].key; + .switchMap(function (configuration) { + return Observable_1.Observable + .combineLatest(Observable_1.Observable.of(configuration.state), _this._navigator.stateService.currentNode$); + }) + .switchMap(function (_a) { + var state = _a[0], node = _a[1]; + var keySrc$ = Observable_1.Observable + .combineLatest(Observable_1.Observable.of(node.key), node.image$ + .map(function (image) { + return image.src; + })); + return state === Component_1.CoverState.Visible ? keySrc$.first() : keySrc$; }) - .map(function (nc) { return nc[0]; }) - .map(function (node) { - return { key: node.key, src: node.image.src }; + .distinctUntilChanged(function (_a, _b) { + var k1 = _a[0], s1 = _a[1]; + var k2 = _b[0], s2 = _b[1]; + return k1 === k2 && s1 === s2; + }) + .map(function (_a) { + var key = _a[0], src = _a[1]; + return { key: key, src: src }; }) .subscribe(this._configurationSubject$); - this._disposable = this._configuration$ - .map(function (conf) { - if (!conf.key) { + this._renderSubscription = Observable_1.Observable + .combineLatest(this._configuration$, this._container.renderService.size$) + .map(function (_a) { + var configuration = _a[0], size = _a[1]; + if (!configuration.key) { return { name: _this._name, vnode: vd.h("div", []) }; } - if (!conf.visible) { - return { name: _this._name, vnode: vd.h("div.Cover.CoverDone", [_this._getCoverBackgroundVNode(conf)]) }; + var compactClass = size.width <= 640 || size.height <= 480 ? ".CoverCompact" : ""; + if (configuration.state === Component_1.CoverState.Hidden) { + var doneContainer = vd.h("div.CoverContainer.CoverDone" + compactClass, [_this._getCoverBackgroundVNode(configuration)]); + return { name: _this._name, vnode: doneContainer }; } - return { name: _this._name, vnode: _this._getCoverButtonVNode(conf) }; + var container = vd.h("div.CoverContainer" + compactClass, [_this._getCoverButtonVNode(configuration)]); + return { name: _this._name, vnode: container }; }) .subscribe(this._container.domRenderer.render$); }; CoverComponent.prototype._deactivate = function () { - this._disposable.unsubscribe(); - this._keyDisposable.unsubscribe(); + this._renderSubscription.unsubscribe(); + this._keySubscription.unsubscribe(); }; CoverComponent.prototype._getDefaultConfiguration = function () { - return { "loading": false, "visible": true }; + return { state: Component_1.CoverState.Visible }; }; - CoverComponent.prototype._getCoverButtonVNode = function (conf) { + CoverComponent.prototype._getCoverButtonVNode = function (configuration) { var _this = this; - var cover = conf.loading ? "div.Cover.CoverLoading" : "div.Cover"; - return vd.h(cover, [ - this._getCoverBackgroundVNode(conf), - vd.h("button.CoverButton", { onclick: function () { _this.configure({ loading: true }); } }, ["Explore"]), - vd.h("a.CoverLogo", { href: "https://www.mapillary.com", target: "_blank" }, []), - ]); + var cover = configuration.state === Component_1.CoverState.Loading ? "div.Cover.CoverLoading" : "div.Cover"; + var coverButton = vd.h("div.CoverButton", { onclick: function () { _this.configure({ state: Component_1.CoverState.Loading }); } }, [vd.h("div.CoverButtonIcon", [])]); + var coverLogo = vd.h("a.CoverLogo", { href: Utils_1.Urls.explore, target: "_blank" }, []); + return vd.h(cover, [this._getCoverBackgroundVNode(configuration), coverButton, coverLogo]); }; CoverComponent.prototype._getCoverBackgroundVNode = function (conf) { var url = conf.src != null ? - "url(" + conf.src + ")" : - "url(https://d1cuyjsrcm0gby.cloudfront.net/" + conf.key + "/thumb-640.jpg)"; - var properties = { style: { backgroundImage: url } }; + conf.src : Utils_1.Urls.thumbnail(conf.key, Viewer_1.ImageSize.Size640); + var properties = { style: { backgroundImage: "url(" + url + ")" } }; var children = []; - if (conf.loading) { + if (conf.state === Component_1.CoverState.Loading) { children.push(vd.h("div.Spinner", {}, [])); } - children.push(vd.h("div.CoverBackgroundGradient", {}, [])); return vd.h("div.CoverBackground", properties, children); }; + CoverComponent.componentName = "cover"; return CoverComponent; }(Component_1.Component)); -CoverComponent.componentName = "cover"; exports.CoverComponent = CoverComponent; Component_1.ComponentService.registerCover(CoverComponent); exports.default = CoverComponent; -},{"../Component":226,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/withLatestFrom":83,"virtual-dom":182}],246:[function(require,module,exports){ +},{"../Component":290,"../Utils":300,"../Viewer":301,"rxjs/Observable":29,"virtual-dom":246}],311:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -21168,14 +24109,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); var _ = require("underscore"); var vd = require("virtual-dom"); var BehaviorSubject_1 = require("rxjs/BehaviorSubject"); -require("rxjs/add/operator/combineLatest"); var Component_1 = require("../Component"); -var DebugComponent = (function (_super) { +var DebugComponent = /** @class */ (function (_super) { __extends(DebugComponent, _super); - function DebugComponent(name, container, navigator) { - var _this = _super.call(this, name, container, navigator) || this; + function DebugComponent() { + var _this = _super !== null && _super.apply(this, arguments) || this; _this._open$ = new BehaviorSubject_1.BehaviorSubject(false); - _this._displaying = false; return _this; } DebugComponent.prototype._activate = function () { @@ -21258,14 +24197,14 @@ var DebugComponent = (function (_super) { DebugComponent.prototype._openDebugElement = function () { this._open$.next(true); }; + DebugComponent.componentName = "debug"; return DebugComponent; }(Component_1.Component)); -DebugComponent.componentName = "debug"; exports.DebugComponent = DebugComponent; Component_1.ComponentService.register(DebugComponent); exports.default = DebugComponent; -},{"../Component":226,"rxjs/BehaviorSubject":26,"rxjs/add/operator/combineLatest":53,"underscore":178,"virtual-dom":182}],247:[function(require,module,exports){ +},{"../Component":290,"rxjs/BehaviorSubject":26,"underscore":242,"virtual-dom":246}],312:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -21280,35 +24219,47 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var vd = require("virtual-dom"); -require("rxjs/add/operator/combineLatest"); +var Observable_1 = require("rxjs/Observable"); var Component_1 = require("../Component"); -var ImageComponent = (function (_super) { +var Utils_1 = require("../Utils"); +var ImageComponent = /** @class */ (function (_super) { __extends(ImageComponent, _super); - function ImageComponent(name, container, navigator) { + function ImageComponent(name, container, navigator, dom) { var _this = _super.call(this, name, container, navigator) || this; _this._canvasId = container.id + "-" + _this._name; + _this._dom = !!dom ? dom : new Utils_1.DOM(); return _this; } ImageComponent.prototype._activate = function () { var _this = this; - this.drawSubscription = this._container.domRenderer.element$ - .combineLatest(this._navigator.stateService.currentNode$, function (element, node) { - var canvas = document.getElementById(_this._canvasId); - return { canvas: canvas, node: node }; - }) - .subscribe(function (canvasNode) { - var canvas = canvasNode.canvas; - var node = canvasNode.node; - if (!node || !canvas) { - return null; - } + var canvasSize$ = this._container.domRenderer.element$ + .map(function (element) { + return _this._dom.document.getElementById(_this._canvasId); + }) + .filter(function (canvas) { + return !!canvas; + }) + .map(function (canvas) { var adaptableDomRenderer = canvas.parentElement; var width = adaptableDomRenderer.offsetWidth; var height = adaptableDomRenderer.offsetHeight; - canvas.width = width; - canvas.height = height; - var ctx = canvas.getContext("2d"); - ctx.drawImage(node.image, 0, 0, width, height); + return [canvas, { height: height, width: width }]; + }) + .distinctUntilChanged(function (s1, s2) { + return s1.height === s2.height && s1.width === s2.width; + }, function (_a) { + var canvas = _a[0], size = _a[1]; + return size; + }); + this.drawSubscription = Observable_1.Observable + .combineLatest(canvasSize$, this._navigator.stateService.currentNode$) + .subscribe(function (_a) { + var _b = _a[0], canvas = _b[0], size = _b[1], node = _a[1]; + canvas.width = size.width; + canvas.height = size.height; + canvas + .getContext("2d") + .drawImage(node.image, 0, 0, size.width, size.height); }); this._container.domRenderer.renderAdaptive$.next({ name: this._name, vnode: vd.h("canvas#" + this._canvasId, []) }); }; @@ -21318,222 +24269,14 @@ var ImageComponent = (function (_super) { ImageComponent.prototype._getDefaultConfiguration = function () { return {}; }; + ImageComponent.componentName = "image"; return ImageComponent; }(Component_1.Component)); -ImageComponent.componentName = "image"; exports.ImageComponent = ImageComponent; Component_1.ComponentService.register(ImageComponent); exports.default = ImageComponent; -},{"../Component":226,"rxjs/add/operator/combineLatest":53,"virtual-dom":182}],248:[function(require,module,exports){ -"use strict"; -var __extends = (this && this.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); -require("rxjs/add/observable/fromEvent"); -require("rxjs/add/operator/withLatestFrom"); -var Edge_1 = require("../Edge"); -var Component_1 = require("../Component"); -var Geo_1 = require("../Geo"); -var KeyboardComponent = (function (_super) { - __extends(KeyboardComponent, _super); - function KeyboardComponent(name, container, navigator) { - var _this = _super.call(this, name, container, navigator) || this; - _this._spatial = new Geo_1.Spatial(); - _this._perspectiveDirections = [ - Edge_1.EdgeDirection.StepForward, - Edge_1.EdgeDirection.StepBackward, - Edge_1.EdgeDirection.StepLeft, - Edge_1.EdgeDirection.StepRight, - Edge_1.EdgeDirection.TurnLeft, - Edge_1.EdgeDirection.TurnRight, - Edge_1.EdgeDirection.TurnU, - ]; - return _this; - } - KeyboardComponent.prototype._activate = function () { - var _this = this; - var sequenceEdges$ = this._navigator.stateService.currentNode$ - .switchMap(function (node) { - return node.sequenceEdges$; - }); - var spatialEdges$ = this._navigator.stateService.currentNode$ - .switchMap(function (node) { - return node.spatialEdges$; - }); - this._disposable = Observable_1.Observable - .fromEvent(document, "keydown") - .withLatestFrom(this._navigator.stateService.currentState$, sequenceEdges$, spatialEdges$, function (event, frame, sequenceEdges, spatialEdges) { - return { event: event, frame: frame, sequenceEdges: sequenceEdges, spatialEdges: spatialEdges }; - }) - .subscribe(function (kf) { - if (!kf.frame.state.currentNode.pano) { - _this._navigatePerspective(kf.event, kf.sequenceEdges, kf.spatialEdges); - } - else { - _this._navigatePanorama(kf.event, kf.sequenceEdges, kf.spatialEdges, kf.frame.state.camera); - } - }); - }; - KeyboardComponent.prototype._deactivate = function () { - this._disposable.unsubscribe(); - }; - KeyboardComponent.prototype._getDefaultConfiguration = function () { - return {}; - }; - KeyboardComponent.prototype._navigatePanorama = function (event, sequenceEdges, spatialEdges, camera) { - var navigationAngle = 0; - var stepDirection = null; - var sequenceDirection = null; - var phi = this._rotationFromCamera(camera).phi; - switch (event.keyCode) { - case 37: - if (event.shiftKey || event.altKey) { - break; - } - navigationAngle = Math.PI / 2 + phi; - stepDirection = Edge_1.EdgeDirection.StepLeft; - break; - case 38: - if (event.shiftKey) { - break; - } - if (event.altKey) { - sequenceDirection = Edge_1.EdgeDirection.Next; - break; - } - navigationAngle = phi; - stepDirection = Edge_1.EdgeDirection.StepForward; - break; - case 39: - if (event.shiftKey || event.altKey) { - break; - } - navigationAngle = -Math.PI / 2 + phi; - stepDirection = Edge_1.EdgeDirection.StepRight; - break; - case 40: - if (event.shiftKey) { - break; - } - if (event.altKey) { - sequenceDirection = Edge_1.EdgeDirection.Prev; - break; - } - navigationAngle = Math.PI + phi; - stepDirection = Edge_1.EdgeDirection.StepBackward; - break; - default: - return; - } - event.preventDefault(); - if (sequenceDirection != null) { - this._moveInDir(sequenceDirection, sequenceEdges); - return; - } - if (stepDirection == null || !spatialEdges.cached) { - return; - } - navigationAngle = this._spatial.wrapAngle(navigationAngle); - var threshold = Math.PI / 4; - var edges = spatialEdges.edges.filter(function (e) { - return e.data.direction === Edge_1.EdgeDirection.Pano || - e.data.direction === stepDirection; - }); - var smallestAngle = Number.MAX_VALUE; - var toKey = null; - for (var _i = 0, edges_1 = edges; _i < edges_1.length; _i++) { - var edge = edges_1[_i]; - var angle = Math.abs(this._spatial.wrapAngle(edge.data.worldMotionAzimuth - navigationAngle)); - if (angle < Math.min(smallestAngle, threshold)) { - smallestAngle = angle; - toKey = edge.to; - } - } - if (toKey == null) { - return; - } - this._navigator.moveToKey$(toKey) - .subscribe(function (n) { return; }, function (e) { console.error(e); }); - }; - KeyboardComponent.prototype._rotationFromCamera = function (camera) { - var direction = camera.lookat.clone().sub(camera.position); - var upProjection = direction.clone().dot(camera.up); - var planeProjection = direction.clone().sub(camera.up.clone().multiplyScalar(upProjection)); - var phi = Math.atan2(planeProjection.y, planeProjection.x); - var theta = Math.PI / 2 - this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]); - return { phi: phi, theta: theta }; - }; - KeyboardComponent.prototype._navigatePerspective = function (event, sequenceEdges, spatialEdges) { - var direction = null; - var sequenceDirection = null; - switch (event.keyCode) { - case 37: - if (event.altKey) { - break; - } - direction = event.shiftKey ? Edge_1.EdgeDirection.TurnLeft : Edge_1.EdgeDirection.StepLeft; - break; - case 38: - if (event.altKey) { - sequenceDirection = Edge_1.EdgeDirection.Next; - break; - } - direction = event.shiftKey ? Edge_1.EdgeDirection.Pano : Edge_1.EdgeDirection.StepForward; - break; - case 39: - if (event.altKey) { - break; - } - direction = event.shiftKey ? Edge_1.EdgeDirection.TurnRight : Edge_1.EdgeDirection.StepRight; - break; - case 40: - if (event.altKey) { - sequenceDirection = Edge_1.EdgeDirection.Prev; - break; - } - direction = event.shiftKey ? Edge_1.EdgeDirection.TurnU : Edge_1.EdgeDirection.StepBackward; - break; - default: - return; - } - event.preventDefault(); - if (sequenceDirection != null) { - this._moveInDir(sequenceDirection, sequenceEdges); - return; - } - this._moveInDir(direction, spatialEdges); - }; - KeyboardComponent.prototype._moveInDir = function (direction, edgeStatus) { - if (!edgeStatus.cached) { - return; - } - for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) { - var edge = _a[_i]; - if (edge.data.direction === direction) { - this._navigator.moveToKey$(edge.to) - .subscribe(function (n) { return; }, function (e) { console.error(e); }); - return; - } - } - }; - return KeyboardComponent; -}(Component_1.Component)); -KeyboardComponent.componentName = "keyboard"; -exports.KeyboardComponent = KeyboardComponent; -Component_1.ComponentService.register(KeyboardComponent); -exports.default = KeyboardComponent; - -},{"../Component":226,"../Edge":227,"../Geo":229,"rxjs/Observable":29,"rxjs/add/observable/fromEvent":42,"rxjs/add/operator/withLatestFrom":83}],249:[function(require,module,exports){ +},{"../Component":290,"../Utils":300,"rxjs/Observable":29,"virtual-dom":246}],313:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -21549,9 +24292,9 @@ var __extends = (this && this.__extends) || (function () { Object.defineProperty(exports, "__esModule", { value: true }); var _ = require("underscore"); var vd = require("virtual-dom"); -require("rxjs/add/operator/combineLatest"); +var Observable_1 = require("rxjs/Observable"); var Component_1 = require("../Component"); -var LoadingComponent = (function (_super) { +var LoadingComponent = /** @class */ (function (_super) { __extends(LoadingComponent, _super); function LoadingComponent(name, container, navigator) { return _super.call(this, name, container, navigator) || this; @@ -21559,10 +24302,12 @@ var LoadingComponent = (function (_super) { LoadingComponent.prototype._activate = function () { var _this = this; this._loadingSubscription = this._navigator.loadingService.loading$ - .combineLatest(this._navigator.imageLoadingService.loadstatus$, function (loading, loadStatus) { - if (!loading) { - return { name: "loading", vnode: _this._getBarVNode(100) }; - } + .switchMap(function (loading) { + return loading ? + _this._navigator.imageLoadingService.loadstatus$ : + Observable_1.Observable.of({}); + }) + .map(function (loadStatus) { var total = 0; var loaded = 0; for (var _i = 0, _a = _.values(loadStatus); _i < _a.length; _i++) { @@ -21599,14 +24344,14 @@ var LoadingComponent = (function (_super) { } return vd.h("div.Loading", { style: loadingContainerStyle }, [vd.h("div.LoadingBar", { style: loadingBarStyle }, [])]); }; + LoadingComponent.componentName = "loading"; return LoadingComponent; }(Component_1.Component)); -LoadingComponent.componentName = "loading"; exports.LoadingComponent = LoadingComponent; Component_1.ComponentService.register(LoadingComponent); exports.default = LoadingComponent; -},{"../Component":226,"rxjs/add/operator/combineLatest":53,"underscore":178,"virtual-dom":182}],250:[function(require,module,exports){ +},{"../Component":290,"rxjs/Observable":29,"underscore":242,"virtual-dom":246}],314:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -21622,46 +24367,74 @@ var __extends = (this && this.__extends) || (function () { Object.defineProperty(exports, "__esModule", { value: true }); var vd = require("virtual-dom"); var Observable_1 = require("rxjs/Observable"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/first"); var Edge_1 = require("../Edge"); +var Error_1 = require("../Error"); var Component_1 = require("../Component"); -var NavigationComponent = (function (_super) { +/** + * @class NavigationComponent + * + * @classdesc Fallback navigation component for environments without WebGL support. + * + * Replaces the functionality in the Direction and Sequence components. + */ +var NavigationComponent = /** @class */ (function (_super) { __extends(NavigationComponent, _super); function NavigationComponent(name, container, navigator) { var _this = _super.call(this, name, container, navigator) || this; - _this._dirNames = {}; - _this._dirNames[Edge_1.EdgeDirection.StepForward] = "Forward"; - _this._dirNames[Edge_1.EdgeDirection.StepBackward] = "Backward"; - _this._dirNames[Edge_1.EdgeDirection.StepLeft] = "Left"; - _this._dirNames[Edge_1.EdgeDirection.StepRight] = "Right"; - _this._dirNames[Edge_1.EdgeDirection.TurnLeft] = "Turnleft"; - _this._dirNames[Edge_1.EdgeDirection.TurnRight] = "Turnright"; - _this._dirNames[Edge_1.EdgeDirection.TurnU] = "Turnaround"; + _this._seqNames = {}; + _this._seqNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.Prev]] = "Prev"; + _this._seqNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.Next]] = "Next"; + _this._spaTopNames = {}; + _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.TurnLeft]] = "Turnleft"; + _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepLeft]] = "Left"; + _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepForward]] = "Forward"; + _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepRight]] = "Right"; + _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.TurnRight]] = "Turnright"; + _this._spaBottomNames = {}; + _this._spaBottomNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.TurnU]] = "Turnaround"; + _this._spaBottomNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepBackward]] = "Backward"; return _this; } NavigationComponent.prototype._activate = function () { var _this = this; - this._renderSubscription = this._navigator.stateService.currentNode$ - .switchMap(function (node) { - return node.pano ? - Observable_1.Observable.of([]) : - Observable_1.Observable.combineLatest(node.sequenceEdges$, node.spatialEdges$, function (seq, spa) { - return seq.edges.concat(spa.edges); - }); + this._renderSubscription = Observable_1.Observable + .combineLatest(this._navigator.stateService.currentNode$, this._configuration$) + .switchMap(function (_a) { + var node = _a[0], configuration = _a[1]; + var sequenceEdges$ = configuration.sequence ? + node.sequenceEdges$ + .map(function (status) { + return status.edges + .map(function (edge) { + return edge.data.direction; + }); + }) : + Observable_1.Observable.of([]); + var spatialEdges$ = !node.pano && configuration.spatial ? + node.spatialEdges$ + .map(function (status) { + return status.edges + .map(function (edge) { + return edge.data.direction; + }); + }) : + Observable_1.Observable.of([]); + return Observable_1.Observable + .combineLatest(sequenceEdges$, spatialEdges$) + .map(function (_a) { + var seq = _a[0], spa = _a[1]; + return seq.concat(spa); + }); }) - .map(function (edges) { - var btns = []; - for (var _i = 0, edges_1 = edges; _i < edges_1.length; _i++) { - var edge = edges_1[_i]; - var direction = edge.data.direction; - var name_1 = _this._dirNames[direction]; - if (name_1 == null) { - continue; - } - btns.push(_this._createVNode(direction, name_1)); - } - return { name: _this._name, vnode: vd.h("div.NavigationComponent", btns) }; + .map(function (edgeDirections) { + var seqs = _this._createArrowRow(_this._seqNames, edgeDirections); + var spaTops = _this._createArrowRow(_this._spaTopNames, edgeDirections); + var spaBottoms = _this._createArrowRow(_this._spaBottomNames, edgeDirections); + var seqContainer = vd.h("div.NavigationSequence", seqs); + var spaTopContainer = vd.h("div.NavigationSpatialTop", spaTops); + var spaBottomContainer = vd.h("div.NavigationSpatialBottom", spaBottoms); + var spaContainer = vd.h("div.NavigationSpatial", [spaTopContainer, spaBottomContainer]); + return { name: _this._name, vnode: vd.h("div.NavigationContainer", [seqContainer, spaContainer]) }; }) .subscribe(this._container.domRenderer.render$); }; @@ -21669,25 +24442,48 @@ var NavigationComponent = (function (_super) { this._renderSubscription.unsubscribe(); }; NavigationComponent.prototype._getDefaultConfiguration = function () { - return {}; + return { sequence: true, spatial: true }; }; - NavigationComponent.prototype._createVNode = function (direction, name) { + NavigationComponent.prototype._createArrowRow = function (arrowNames, edgeDirections) { + var arrows = []; + for (var arrowName in arrowNames) { + if (!(arrowNames.hasOwnProperty(arrowName))) { + continue; + } + var direction = Edge_1.EdgeDirection[arrowName]; + if (edgeDirections.indexOf(direction) !== -1) { + arrows.push(this._createVNode(direction, arrowNames[arrowName], "visible")); + } + else { + arrows.push(this._createVNode(direction, arrowNames[arrowName], "hidden")); + } + } + return arrows; + }; + NavigationComponent.prototype._createVNode = function (direction, name, visibility) { var _this = this; return vd.h("span.Direction.Direction" + name, { onclick: function (ev) { _this._navigator.moveDir$(direction) - .subscribe(function (node) { return; }, function (error) { console.error(error); }); + .subscribe(undefined, function (error) { + if (!(error instanceof Error_1.AbortMapillaryError)) { + console.error(error); + } + }); + }, + style: { + visibility: visibility, }, }, []); }; + NavigationComponent.componentName = "navigation"; return NavigationComponent; }(Component_1.Component)); -NavigationComponent.componentName = "navigation"; exports.NavigationComponent = NavigationComponent; Component_1.ComponentService.register(NavigationComponent); exports.default = NavigationComponent; -},{"../Component":226,"../Edge":227,"rxjs/Observable":29,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"virtual-dom":182}],251:[function(require,module,exports){ +},{"../Component":290,"../Edge":291,"../Error":292,"rxjs/Observable":29,"virtual-dom":246}],315:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -21704,35 +24500,25 @@ Object.defineProperty(exports, "__esModule", { value: true }); var _ = require("underscore"); var vd = require("virtual-dom"); var Observable_1 = require("rxjs/Observable"); -require("rxjs/add/observable/fromPromise"); -require("rxjs/add/observable/of"); -require("rxjs/add/operator/combineLatest"); -require("rxjs/add/operator/distinct"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/mergeMap"); -require("rxjs/add/operator/pluck"); -require("rxjs/add/operator/scan"); var Component_1 = require("../Component"); -var DescriptionState = (function () { +var DescriptionState = /** @class */ (function () { function DescriptionState() { } return DescriptionState; }()); -var RouteState = (function () { +var RouteState = /** @class */ (function () { function RouteState() { } return RouteState; }()); -var RouteTrack = (function () { +var RouteTrack = /** @class */ (function () { function RouteTrack() { this.nodeInstructions = []; this.nodeInstructionsOrdered = []; } return RouteTrack; }()); -var RouteComponent = (function (_super) { +var RouteComponent = /** @class */ (function (_super) { __extends(RouteComponent, _super); function RouteComponent(name, container, navigator) { return _super.call(this, name, container, navigator) || this; @@ -21900,14 +24686,14 @@ var RouteComponent = (function (_super) { vd.h("p", { textContent: description }, []), ]); }; + RouteComponent.componentName = "route"; return RouteComponent; }(Component_1.Component)); -RouteComponent.componentName = "route"; exports.RouteComponent = RouteComponent; Component_1.ComponentService.register(RouteComponent); exports.default = RouteComponent; -},{"../Component":226,"rxjs/Observable":29,"rxjs/add/observable/fromPromise":43,"rxjs/add/observable/of":45,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinct":57,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/pluck":70,"rxjs/add/operator/scan":73,"underscore":178,"virtual-dom":182}],252:[function(require,module,exports){ +},{"../Component":290,"rxjs/Observable":29,"underscore":242,"virtual-dom":246}],316:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -21921,13 +24707,8 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var Observable_1 = require("rxjs/Observable"); -require("rxjs/add/operator/buffer"); -require("rxjs/add/operator/debounceTime"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/scan"); var Component_1 = require("../Component"); -var StatsComponent = (function (_super) { +var StatsComponent = /** @class */ (function (_super) { __extends(StatsComponent, _super); function StatsComponent(name, container, navigator) { return _super.call(this, name, container, navigator) || this; @@ -21990,14 +24771,14 @@ var StatsComponent = (function (_super) { StatsComponent.prototype._getDefaultConfiguration = function () { return {}; }; + StatsComponent.componentName = "stats"; return StatsComponent; }(Component_1.Component)); -StatsComponent.componentName = "stats"; exports.StatsComponent = StatsComponent; Component_1.ComponentService.register(StatsComponent); exports.default = StatsComponent; -},{"../Component":226,"rxjs/Observable":29,"rxjs/add/operator/buffer":49,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":73}],253:[function(require,module,exports){ +},{"../Component":290,"rxjs/Observable":29}],317:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -22014,22 +24795,18 @@ Object.defineProperty(exports, "__esModule", { value: true }); var vd = require("virtual-dom"); var Observable_1 = require("rxjs/Observable"); var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/observable/combineLatest"); -require("rxjs/add/operator/do"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/share"); var Component_1 = require("../../Component"); /** * @class DirectionComponent * @classdesc Component showing navigation arrows for steps and turns. */ -var DirectionComponent = (function (_super) { +var DirectionComponent = /** @class */ (function (_super) { __extends(DirectionComponent, _super); - function DirectionComponent(name, container, navigator) { + function DirectionComponent(name, container, navigator, directionDOMRenderer) { var _this = _super.call(this, name, container, navigator) || this; - _this._renderer = new Component_1.DirectionDOMRenderer(_this.defaultConfiguration, container.element); + _this._renderer = !!directionDOMRenderer ? + directionDOMRenderer : + new Component_1.DirectionDOMRenderer(_this.defaultConfiguration, container.element); _this._hoveredKeySubject$ = new Subject_1.Subject(); _this._hoveredKey$ = _this._hoveredKeySubject$.share(); return _this; @@ -22108,21 +24885,21 @@ var DirectionComponent = (function (_super) { _this._renderer.setNode(node); }) .withLatestFrom(this._configuration$) - .switchMap(function (nc) { - var node = nc[0]; - var configuration = nc[1]; - return node.spatialEdges$ - .withLatestFrom(configuration.distinguishSequence ? + .switchMap(function (_a) { + var node = _a[0], configuration = _a[1]; + return Observable_1.Observable + .combineLatest(node.spatialEdges$, configuration.distinguishSequence ? _this._navigator.graphService .cacheSequence$(node.sequenceKey) .catch(function (error, caught) { console.error("Failed to cache sequence (" + node.sequenceKey + ")", error); - return Observable_1.Observable.empty(); + return Observable_1.Observable.of(null); }) : Observable_1.Observable.of(null)); }) - .subscribe(function (es) { - _this._renderer.setEdges(es[0], es[1]); + .subscribe(function (_a) { + var edgeStatus = _a[0], sequence = _a[1]; + _this._renderer.setEdges(edgeStatus, sequence); }); this._renderCameraSubscription = this._container.renderService.renderCameraFrame$ .do(function (renderCamera) { @@ -22173,15 +24950,15 @@ var DirectionComponent = (function (_super) { minWidth: 260, }; }; + /** @inheritdoc */ + DirectionComponent.componentName = "direction"; return DirectionComponent; }(Component_1.Component)); -/** @inheritdoc */ -DirectionComponent.componentName = "direction"; exports.DirectionComponent = DirectionComponent; Component_1.ComponentService.register(DirectionComponent); exports.default = DirectionComponent; -},{"../../Component":226,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/share":74,"virtual-dom":182}],254:[function(require,module,exports){ +},{"../../Component":290,"rxjs/Observable":29,"rxjs/Subject":34,"virtual-dom":246}],318:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Geo_1 = require("../../Geo"); @@ -22189,7 +24966,7 @@ var Geo_1 = require("../../Geo"); * @class DirectionDOMCalculator * @classdesc Helper class for calculating DOM CSS properties. */ -var DirectionDOMCalculator = (function () { +var DirectionDOMCalculator = /** @class */ (function () { function DirectionDOMCalculator(configuration, element) { this._spatial = new Geo_1.Spatial(); this._minThresholdWidth = 320; @@ -22420,19 +25197,20 @@ var DirectionDOMCalculator = (function () { exports.DirectionDOMCalculator = DirectionDOMCalculator; exports.default = DirectionDOMCalculator; -},{"../../Geo":229}],255:[function(require,module,exports){ +},{"../../Geo":293}],319:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var vd = require("virtual-dom"); var Component_1 = require("../../Component"); var Edge_1 = require("../../Edge"); +var Error_1 = require("../../Error"); var Geo_1 = require("../../Geo"); /** * @class DirectionDOMRenderer * @classdesc DOM renderer for direction arrows. */ -var DirectionDOMRenderer = (function () { +var DirectionDOMRenderer = /** @class */ (function () { function DirectionDOMRenderer(configuration, element) { this._isEdge = false; this._spatial = new Geo_1.Spatial(); @@ -22667,21 +25445,33 @@ var DirectionDOMRenderer = (function () { DirectionDOMRenderer.prototype._createVNodeByKey = function (navigator, key, azimuth, rotation, offset, className, shiftVertically) { var onClick = function (e) { navigator.moveToKey$(key) - .subscribe(function (node) { return; }, function (error) { console.error(error); }); + .subscribe(undefined, function (error) { + if (!(error instanceof Error_1.AbortMapillaryError)) { + console.error(error); + } + }); }; return this._createVNode(key, azimuth, rotation, offset, className, "DirectionsCircle", onClick, shiftVertically); }; DirectionDOMRenderer.prototype._createVNodeByDirection = function (navigator, key, azimuth, rotation, direction) { var onClick = function (e) { navigator.moveDir$(direction) - .subscribe(function (node) { return; }, function (error) { console.error(error); }); + .subscribe(undefined, function (error) { + if (!(error instanceof Error_1.AbortMapillaryError)) { + console.error(error); + } + }); }; return this._createVNode(key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowStep", "DirectionsCircle", onClick); }; DirectionDOMRenderer.prototype._createVNodeByTurn = function (navigator, key, className, direction) { var onClick = function (e) { navigator.moveDir$(direction) - .subscribe(function (node) { return; }, function (error) { console.error(error); }); + .subscribe(undefined, function (error) { + if (!(error instanceof Error_1.AbortMapillaryError)) { + console.error(error); + } + }); }; var style = { height: this._calculator.turnCircleSizeCss, @@ -22787,7 +25577,7 @@ var DirectionDOMRenderer = (function () { exports.DirectionDOMRenderer = DirectionDOMRenderer; exports.default = DirectionDOMRenderer; -},{"../../Component":226,"../../Edge":227,"../../Geo":229,"virtual-dom":182}],256:[function(require,module,exports){ +},{"../../Component":290,"../../Edge":291,"../../Error":292,"../../Geo":293,"virtual-dom":246}],320:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -22802,26 +25592,11 @@ var __extends = (this && this.__extends) || (function () { Object.defineProperty(exports, "__esModule", { value: true }); var Observable_1 = require("rxjs/Observable"); var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/operator/catch"); -require("rxjs/add/operator/combineLatest"); -require("rxjs/add/operator/debounceTime"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/pairwise"); -require("rxjs/add/operator/publish"); -require("rxjs/add/operator/publishReplay"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/skipWhile"); -require("rxjs/add/operator/startWith"); -require("rxjs/add/operator/switchMap"); -require("rxjs/add/operator/takeUntil"); -require("rxjs/add/operator/withLatestFrom"); var Component_1 = require("../../Component"); var Render_1 = require("../../Render"); var Tiles_1 = require("../../Tiles"); var Utils_1 = require("../../Utils"); -var ImagePlaneComponent = (function (_super) { +var ImagePlaneComponent = /** @class */ (function (_super) { __extends(ImagePlaneComponent, _super); function ImagePlaneComponent(name, container, navigator) { var _this = _super.call(this, name, container, navigator) || this; @@ -22898,13 +25673,13 @@ var ImagePlaneComponent = (function (_super) { return args[0]; }) .withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$) - .map(function (args) { - var state = args[0].state; - var renderer = args[1]; - var viewportSize = args[2]; + .map(function (_a) { + var frame = _a[0], renderer = _a[1], size = _a[2]; + var state = frame.state; + var viewportSize = Math.max(size.width, size.height); var currentNode = state.currentNode; var currentTransform = state.currentTransform; - var tileSize = Math.max(viewportSize.width, viewportSize.height) > 1024 ? 1024 : 512; + var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512; return new Tiles_1.TextureProvider(currentNode.key, currentTransform.basicWidth, currentTransform.basicHeight, tileSize, currentNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer); }) .publishReplay(1) @@ -22918,18 +25693,34 @@ var ImagePlaneComponent = (function (_super) { }; }) .subscribe(this._rendererOperation$); + this._setTileSizeSubscription = this._container.renderService.size$ + .switchMap(function (size) { + return Observable_1.Observable + .combineLatest(textureProvider$, Observable_1.Observable.of(size)) + .first(); + }) + .subscribe(function (_a) { + var provider = _a[0], size = _a[1]; + var viewportSize = Math.max(size.width, size.height); + var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512; + provider.setTileSize(tileSize); + }); this._abortTextureProviderSubscription = textureProvider$ .pairwise() .subscribe(function (pair) { var previous = pair[0]; previous.abort(); }); - var roiTrigger$ = this._container.renderService.renderCameraFrame$ - .map(function (renderCamera) { + var roiTrigger$ = Observable_1.Observable + .combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.debounceTime(250)) + .map(function (_a) { + var camera = _a[0], size = _a[1]; return [ - renderCamera.camera.position.clone(), - renderCamera.camera.lookat.clone(), - renderCamera.zoom.valueOf() + camera.camera.position.clone(), + camera.camera.lookat.clone(), + camera.zoom.valueOf(), + size.height.valueOf(), + size.width.valueOf() ]; }) .pairwise() @@ -22940,7 +25731,9 @@ var ImagePlaneComponent = (function (_super) { var samePosition = pls[0][0].equals(pls[1][0]); var sameLookat = pls[0][1].equals(pls[1][1]); var sameZoom = pls[0][2] === pls[1][2]; - return samePosition && sameLookat && sameZoom; + var sameHeight = pls[0][3] === pls[1][3]; + var sameWidth = pls[0][4] === pls[1][4]; + return samePosition && sameLookat && sameZoom && sameHeight && sameWidth; }) .distinctUntilChanged() .filter(function (stalled) { @@ -22954,9 +25747,10 @@ var ImagePlaneComponent = (function (_super) { this._setRegionOfInterestSubscription = textureProvider$ .switchMap(function (provider) { return roiTrigger$ - .map(function (args) { + .map(function (_a) { + var camera = _a[0], size = _a[1], transform = _a[2]; return [ - _this._roiCalculator.computeRegionOfInterest(args[0], args[1], args[2]), + _this._roiCalculator.computeRegionOfInterest(camera, size, transform), provider, ]; }); @@ -22977,7 +25771,16 @@ var ImagePlaneComponent = (function (_super) { .publishReplay(1) .refCount(); this._hasTextureSubscription = hasTexture$.subscribe(function () { }); - var nodeImage$ = this._navigator.stateService.currentNode$ + var nodeImage$ = this._navigator.stateService.currentState$ + .filter(function (frame) { + return frame.state.nodesAhead === 0; + }) + .map(function (frame) { + return frame.state.currentNode; + }) + .distinctUntilChanged(undefined, function (node) { + return node.key; + }) .debounceTime(1000) .withLatestFrom(hasTexture$) .filter(function (args) { @@ -23040,6 +25843,7 @@ var ImagePlaneComponent = (function (_super) { this._rendererSubscription.unsubscribe(); this._setRegionOfInterestSubscription.unsubscribe(); this._setTextureProviderSubscription.unsubscribe(); + this._setTileSizeSubscription.unsubscribe(); this._stateSubscription.unsubscribe(); this._textureProviderSubscription.unsubscribe(); this._updateBackgroundSubscription.unsubscribe(); @@ -23048,257 +25852,25 @@ var ImagePlaneComponent = (function (_super) { ImagePlaneComponent.prototype._getDefaultConfiguration = function () { return { imageTiling: false }; }; + ImagePlaneComponent.componentName = "imagePlane"; return ImagePlaneComponent; }(Component_1.Component)); -ImagePlaneComponent.componentName = "imagePlane"; exports.ImagePlaneComponent = ImagePlaneComponent; Component_1.ComponentService.register(ImagePlaneComponent); exports.default = ImagePlaneComponent; -},{"../../Component":226,"../../Render":232,"../../Tiles":234,"../../Utils":235,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/operator/catch":52,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/pairwise":69,"rxjs/add/operator/publish":71,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/skipWhile":77,"rxjs/add/operator/startWith":78,"rxjs/add/operator/switchMap":79,"rxjs/add/operator/takeUntil":81,"rxjs/add/operator/withLatestFrom":83}],257:[function(require,module,exports){ +},{"../../Component":290,"../../Render":296,"../../Tiles":299,"../../Utils":300,"rxjs/Observable":29,"rxjs/Subject":34}],321:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); -var THREE = require("three"); var Component_1 = require("../../Component"); -var ImagePlaneFactory = (function () { - function ImagePlaneFactory(imagePlaneDepth, imageSphereRadius) { - this._imagePlaneDepth = imagePlaneDepth != null ? imagePlaneDepth : 200; - this._imageSphereRadius = imageSphereRadius != null ? imageSphereRadius : 200; - } - ImagePlaneFactory.prototype.createMesh = function (node, transform) { - var mesh = node.pano ? - this._createImageSphere(node, transform) : - this._createImagePlane(node, transform); - return mesh; - }; - ImagePlaneFactory.prototype._createImageSphere = function (node, transform) { - var texture = this._createTexture(node.image); - var materialParameters = this._createSphereMaterialParameters(transform, texture); - var material = new THREE.ShaderMaterial(materialParameters); - var mesh = this._useMesh(transform, node) ? - new THREE.Mesh(this._getImageSphereGeo(transform, node), material) : - new THREE.Mesh(this._getFlatImageSphereGeo(transform), material); - return mesh; - }; - ImagePlaneFactory.prototype._createImagePlane = function (node, transform) { - var texture = this._createTexture(node.image); - var materialParameters = this._createPlaneMaterialParameters(transform, texture); - var material = new THREE.ShaderMaterial(materialParameters); - var geometry = this._useMesh(transform, node) ? - this._getImagePlaneGeo(transform, node) : - this._getFlatImagePlaneGeo(transform); - return new THREE.Mesh(geometry, material); - }; - ImagePlaneFactory.prototype._createSphereMaterialParameters = function (transform, texture) { - var gpano = transform.gpano; - var halfCroppedWidth = (gpano.FullPanoWidthPixels - gpano.CroppedAreaImageWidthPixels) / 2; - var phiShift = 2 * Math.PI * (gpano.CroppedAreaLeftPixels - halfCroppedWidth) / gpano.FullPanoWidthPixels; - var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels; - var halfCroppedHeight = (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels) / 2; - var thetaShift = Math.PI * (halfCroppedHeight - gpano.CroppedAreaTopPixels) / gpano.FullPanoHeightPixels; - var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels; - var materialParameters = { - depthWrite: false, - fragmentShader: Component_1.ImagePlaneShaders.equirectangular.fragment, - side: THREE.DoubleSide, - transparent: true, - uniforms: { - opacity: { - type: "f", - value: 1, - }, - phiLength: { - type: "f", - value: phiLength, - }, - phiShift: { - type: "f", - value: phiShift, - }, - projectorMat: { - type: "m4", - value: transform.rt, - }, - projectorTex: { - type: "t", - value: texture, - }, - thetaLength: { - type: "f", - value: thetaLength, - }, - thetaShift: { - type: "f", - value: thetaShift, - }, - }, - vertexShader: Component_1.ImagePlaneShaders.equirectangular.vertex, - }; - return materialParameters; - }; - ImagePlaneFactory.prototype._createPlaneMaterialParameters = function (transform, texture) { - var materialParameters = { - depthWrite: false, - fragmentShader: Component_1.ImagePlaneShaders.perspective.fragment, - side: THREE.DoubleSide, - transparent: true, - uniforms: { - bbox: { - type: "v4", - value: new THREE.Vector4(0, 0, 1, 1), - }, - opacity: { - type: "f", - value: 1, - }, - projectorMat: { - type: "m4", - value: transform.projectorMatrix(), - }, - projectorTex: { - type: "t", - value: texture, - }, - }, - vertexShader: Component_1.ImagePlaneShaders.perspective.vertex, - }; - return materialParameters; - }; - ImagePlaneFactory.prototype._createTexture = function (image) { - var texture = new THREE.Texture(image); - texture.minFilter = THREE.LinearFilter; - texture.needsUpdate = true; - return texture; - }; - ImagePlaneFactory.prototype._useMesh = function (transform, node) { - return node.mesh.vertices.length && transform.hasValidScale; - }; - ImagePlaneFactory.prototype._getImageSphereGeo = function (transform, node) { - var t = new THREE.Matrix4().getInverse(transform.srt); - // push everything at least 5 meters in front of the camera - var minZ = 5.0 * transform.scale; - var maxZ = this._imageSphereRadius * transform.scale; - var vertices = node.mesh.vertices; - var numVertices = vertices.length / 3; - var positions = new Float32Array(vertices.length); - for (var i = 0; i < numVertices; ++i) { - var index = 3 * i; - var x = vertices[index + 0]; - var y = vertices[index + 1]; - var z = vertices[index + 2]; - var l = Math.sqrt(x * x + y * y + z * z); - var boundedL = Math.max(minZ, Math.min(l, maxZ)); - var factor = boundedL / l; - var p = new THREE.Vector3(x * factor, y * factor, z * factor); - p.applyMatrix4(t); - positions[index + 0] = p.x; - positions[index + 1] = p.y; - positions[index + 2] = p.z; - } - var faces = node.mesh.faces; - var indices = new Uint16Array(faces.length); - for (var i = 0; i < faces.length; ++i) { - indices[i] = faces[i]; - } - var geometry = new THREE.BufferGeometry(); - geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3)); - geometry.setIndex(new THREE.BufferAttribute(indices, 1)); - return geometry; - }; - ImagePlaneFactory.prototype._getImagePlaneGeo = function (transform, node) { - var t = new THREE.Matrix4().getInverse(transform.srt); - // push everything at least 5 meters in front of the camera - var minZ = 5.0 * transform.scale; - var maxZ = this._imagePlaneDepth * transform.scale; - var vertices = node.mesh.vertices; - var numVertices = vertices.length / 3; - var positions = new Float32Array(vertices.length); - for (var i = 0; i < numVertices; ++i) { - var index = 3 * i; - var x = vertices[index + 0]; - var y = vertices[index + 1]; - var z = vertices[index + 2]; - var boundedZ = Math.max(minZ, Math.min(z, maxZ)); - var factor = boundedZ / z; - var p = new THREE.Vector3(x * factor, y * factor, boundedZ); - p.applyMatrix4(t); - positions[index + 0] = p.x; - positions[index + 1] = p.y; - positions[index + 2] = p.z; - } - var faces = node.mesh.faces; - var indices = new Uint16Array(faces.length); - for (var i = 0; i < faces.length; ++i) { - indices[i] = faces[i]; - } - var geometry = new THREE.BufferGeometry(); - geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3)); - geometry.setIndex(new THREE.BufferAttribute(indices, 1)); - return geometry; - }; - ImagePlaneFactory.prototype._getFlatImageSphereGeo = function (transform) { - var gpano = transform.gpano; - var phiStart = 2 * Math.PI * gpano.CroppedAreaLeftPixels / gpano.FullPanoWidthPixels; - var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels; - var thetaStart = Math.PI * - (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels - gpano.CroppedAreaTopPixels) / - gpano.FullPanoHeightPixels; - var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels; - var geometry = new THREE.SphereGeometry(this._imageSphereRadius, 20, 40, phiStart - Math.PI / 2, phiLength, thetaStart, thetaLength); - geometry.applyMatrix(new THREE.Matrix4().getInverse(transform.rt)); - return geometry; - }; - ImagePlaneFactory.prototype._getFlatImagePlaneGeo = function (transform) { - var width = transform.width; - var height = transform.height; - var size = Math.max(width, height); - var dx = width / 2.0 / size; - var dy = height / 2.0 / size; - var vertices = []; - vertices.push(transform.unprojectSfM([-dx, -dy], this._imagePlaneDepth)); - vertices.push(transform.unprojectSfM([dx, -dy], this._imagePlaneDepth)); - vertices.push(transform.unprojectSfM([dx, dy], this._imagePlaneDepth)); - vertices.push(transform.unprojectSfM([-dx, dy], this._imagePlaneDepth)); - var positions = new Float32Array(12); - for (var i = 0; i < vertices.length; i++) { - var index = 3 * i; - positions[index + 0] = vertices[i][0]; - positions[index + 1] = vertices[i][1]; - positions[index + 2] = vertices[i][2]; - } - var indices = new Uint16Array(6); - indices[0] = 0; - indices[1] = 1; - indices[2] = 3; - indices[3] = 1; - indices[4] = 2; - indices[5] = 3; - var geometry = new THREE.BufferGeometry(); - geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3)); - geometry.setIndex(new THREE.BufferAttribute(indices, 1)); - return geometry; - }; - return ImagePlaneFactory; -}()); -exports.ImagePlaneFactory = ImagePlaneFactory; -exports.default = ImagePlaneFactory; - -},{"../../Component":226,"three":176}],258:[function(require,module,exports){ -"use strict"; -/// -Object.defineProperty(exports, "__esModule", { value: true }); -var Component_1 = require("../../Component"); -var Geo_1 = require("../../Geo"); -var ImagePlaneGLRenderer = (function () { +var ImagePlaneGLRenderer = /** @class */ (function () { function ImagePlaneGLRenderer() { - this._imagePlaneFactory = new Component_1.ImagePlaneFactory(); - this._imagePlaneScene = new Component_1.ImagePlaneScene(); + this._factory = new Component_1.MeshFactory(); + this._scene = new Component_1.MeshScene(); this._alpha = 0; this._alphaOld = 0; this._fadeOutSpeed = 0.05; - this._lastCamera = new Geo_1.Camera(); - this._epsilon = 0.000001; this._currentKey = null; this._previousKey = null; this._providerDisposers = {}; @@ -23355,7 +25927,7 @@ var ImagePlaneGLRenderer = (function () { }; ImagePlaneGLRenderer.prototype._updateTexture = function (texture) { this._needsRender = true; - for (var _i = 0, _a = this._imagePlaneScene.imagePlanes; _i < _a.length; _i++) { + for (var _i = 0, _a = this._scene.imagePlanes; _i < _a.length; _i++) { var plane = _a[_i]; var material = plane.material; var oldTexture = material.uniforms.projectorTex.value; @@ -23369,7 +25941,7 @@ var ImagePlaneGLRenderer = (function () { return; } this._needsRender = true; - for (var _i = 0, _a = this._imagePlaneScene.imagePlanes; _i < _a.length; _i++) { + for (var _i = 0, _a = this._scene.imagePlanes; _i < _a.length; _i++) { var plane = _a[_i]; var material = plane.material; var texture = material.uniforms.projectorTex.value; @@ -23378,28 +25950,28 @@ var ImagePlaneGLRenderer = (function () { } }; ImagePlaneGLRenderer.prototype.render = function (perspectiveCamera, renderer) { - var planeAlpha = this._imagePlaneScene.imagePlanesOld.length ? 1 : this._alpha; - for (var _i = 0, _a = this._imagePlaneScene.imagePlanes; _i < _a.length; _i++) { + var planeAlpha = this._scene.imagePlanesOld.length ? 1 : this._alpha; + for (var _i = 0, _a = this._scene.imagePlanes; _i < _a.length; _i++) { var plane = _a[_i]; plane.material.uniforms.opacity.value = planeAlpha; } - for (var _b = 0, _c = this._imagePlaneScene.imagePlanesOld; _b < _c.length; _b++) { + for (var _b = 0, _c = this._scene.imagePlanesOld; _b < _c.length; _b++) { var plane = _c[_b]; plane.material.uniforms.opacity.value = this._alphaOld; } - renderer.render(this._imagePlaneScene.scene, perspectiveCamera); - renderer.render(this._imagePlaneScene.sceneOld, perspectiveCamera); - for (var _d = 0, _e = this._imagePlaneScene.imagePlanes; _d < _e.length; _d++) { + renderer.render(this._scene.scene, perspectiveCamera); + renderer.render(this._scene.sceneOld, perspectiveCamera); + for (var _d = 0, _e = this._scene.imagePlanes; _d < _e.length; _d++) { var plane = _e[_d]; plane.material.uniforms.opacity.value = this._alpha; } - renderer.render(this._imagePlaneScene.scene, perspectiveCamera); + renderer.render(this._scene.scene, perspectiveCamera); }; ImagePlaneGLRenderer.prototype.clearNeedsRender = function () { this._needsRender = false; }; ImagePlaneGLRenderer.prototype.dispose = function () { - this._imagePlaneScene.clear(); + this._scene.clear(); }; ImagePlaneGLRenderer.prototype._updateFrameId = function (frameId) { this._frameId = frameId; @@ -23433,14 +26005,14 @@ var ImagePlaneGLRenderer = (function () { } if (previousKey != null) { if (previousKey !== this._currentKey && previousKey !== this._previousKey) { - var previousMesh = this._imagePlaneFactory.createMesh(state.previousNode, state.previousTransform); - this._imagePlaneScene.updateImagePlanes([previousMesh]); + var previousMesh = this._factory.createMesh(state.previousNode, state.previousTransform); + this._scene.updateImagePlanes([previousMesh]); } this._previousKey = previousKey; } this._currentKey = currentKey; - var currentMesh = this._imagePlaneFactory.createMesh(state.currentNode, state.currentTransform); - this._imagePlaneScene.updateImagePlanes([currentMesh]); + var currentMesh = this._factory.createMesh(state.currentNode, state.currentTransform); + this._scene.updateImagePlanes([currentMesh]); this._alphaOld = 1; return true; }; @@ -23449,107 +26021,482 @@ var ImagePlaneGLRenderer = (function () { exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer; exports.default = ImagePlaneGLRenderer; -},{"../../Component":226,"../../Geo":229}],259:[function(require,module,exports){ +},{"../../Component":290}],322:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var CoverState; +(function (CoverState) { + CoverState[CoverState["Hidden"] = 0] = "Hidden"; + CoverState[CoverState["Loading"] = 1] = "Loading"; + CoverState[CoverState["Visible"] = 2] = "Visible"; +})(CoverState = exports.CoverState || (exports.CoverState = {})); + +},{}],323:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Enumeration for slider mode. + * + * @enum {number} + * @readonly + * + * @description Modes for specifying how transitions + * between nodes are performed in slider mode. Only + * applicable when the slider component determines + * that transitions with motion is possilble. When it + * is not, the stationary mode will be applied. + */ +var SliderMode; +(function (SliderMode) { + /** + * Transitions with motion. + * + * @description The slider component moves the + * camera between the node origins. + * + * In this mode it is not possible to zoom or pan. + * + * The slider component falls back to stationary + * mode when it determines that the pair of nodes + * does not have a strong enough relation. + */ + SliderMode[SliderMode["Motion"] = 0] = "Motion"; + /** + * Stationary transitions. + * + * @description The camera is stationary. + * + * In this mode it is possible to zoom and pan. + */ + SliderMode[SliderMode["Stationary"] = 1] = "Stationary"; +})(SliderMode = exports.SliderMode || (exports.SliderMode = {})); + +},{}],324:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var ICoverConfiguration_1 = require("./ICoverConfiguration"); +exports.CoverState = ICoverConfiguration_1.CoverState; +var ISliderConfiguration_1 = require("./ISliderConfiguration"); +exports.SliderMode = ISliderConfiguration_1.SliderMode; + +},{"./ICoverConfiguration":322,"./ISliderConfiguration":323}],325:[function(require,module,exports){ "use strict"; /// +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); Object.defineProperty(exports, "__esModule", { value: true }); -var THREE = require("three"); -var ImagePlaneScene = (function () { - function ImagePlaneScene() { - this.scene = new THREE.Scene(); - this.sceneOld = new THREE.Scene(); - this.imagePlanes = []; - this.imagePlanesOld = []; +var Component_1 = require("../../Component"); +var Edge_1 = require("../../Edge"); +/** + * The `KeyPlayHandler` allows the user to control the play behavior + * using the following key commands: + * + * `Spacebar`: Start or stop playing. + * `SHIFT` + `D`: Switch direction. + * `<`: Decrease speed. + * `>`: Increase speed. + * + * @example + * ``` + * var keyboardComponent = viewer.getComponent("keyboard"); + * + * keyboardComponent.keyPlay.disable(); + * keyboardComponent.keyPlay.enable(); + * + * var isEnabled = keyboardComponent.keyPlay.isEnabled; + * ``` + */ +var KeyPlayHandler = /** @class */ (function (_super) { + __extends(KeyPlayHandler, _super); + function KeyPlayHandler() { + return _super !== null && _super.apply(this, arguments) || this; } - ImagePlaneScene.prototype.updateImagePlanes = function (planes) { - this._dispose(this.imagePlanesOld, this.sceneOld); - for (var _i = 0, _a = this.imagePlanes; _i < _a.length; _i++) { - var plane = _a[_i]; - this.scene.remove(plane); - this.sceneOld.add(plane); - } - for (var _b = 0, planes_1 = planes; _b < planes_1.length; _b++) { - var plane = planes_1[_b]; - this.scene.add(plane); - } - this.imagePlanesOld = this.imagePlanes; - this.imagePlanes = planes; + KeyPlayHandler.prototype._enable = function () { + var _this = this; + this._keyDownSubscription = this._container.keyboardService.keyDown$ + .withLatestFrom(this._navigator.playService.playing$, this._navigator.playService.direction$, this._navigator.playService.speed$, this._navigator.stateService.currentNode$ + .switchMap(function (node) { + return node.sequenceEdges$; + })) + .subscribe(function (_a) { + var event = _a[0], playing = _a[1], direction = _a[2], speed = _a[3], status = _a[4]; + if (event.altKey || event.ctrlKey || event.metaKey) { + return; + } + switch (event.key) { + case "D": + if (!event.shiftKey) { + return; + } + var newDirection = playing ? + null : direction === Edge_1.EdgeDirection.Next ? + Edge_1.EdgeDirection.Prev : direction === Edge_1.EdgeDirection.Prev ? + Edge_1.EdgeDirection.Next : null; + if (newDirection != null) { + _this._navigator.playService.setDirection(newDirection); + } + break; + case " ": + if (event.shiftKey) { + return; + } + if (playing) { + _this._navigator.playService.stop(); + } + else { + for (var _i = 0, _b = status.edges; _i < _b.length; _i++) { + var edge = _b[_i]; + if (edge.data.direction === direction) { + _this._navigator.playService.play(); + } + } + } + break; + case "<": + _this._navigator.playService.setSpeed(speed - 0.05); + break; + case ">": + _this._navigator.playService.setSpeed(speed + 0.05); + break; + default: + return; + } + event.preventDefault(); + }); }; - ImagePlaneScene.prototype.addImagePlanes = function (planes) { - for (var _i = 0, planes_2 = planes; _i < planes_2.length; _i++) { - var plane = planes_2[_i]; - this.scene.add(plane); - this.imagePlanes.push(plane); - } + KeyPlayHandler.prototype._disable = function () { + this._keyDownSubscription.unsubscribe(); }; - ImagePlaneScene.prototype.addImagePlanesOld = function (planes) { - for (var _i = 0, planes_3 = planes; _i < planes_3.length; _i++) { - var plane = planes_3[_i]; - this.sceneOld.add(plane); - this.imagePlanesOld.push(plane); - } + KeyPlayHandler.prototype._getConfiguration = function (enable) { + return { keyZoom: enable }; }; - ImagePlaneScene.prototype.setImagePlanes = function (planes) { - this._clear(); - this.addImagePlanes(planes); + return KeyPlayHandler; +}(Component_1.HandlerBase)); +exports.KeyPlayHandler = KeyPlayHandler; +exports.default = KeyPlayHandler; + +},{"../../Component":290,"../../Edge":291}],326:[function(require,module,exports){ +"use strict"; +/// +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - ImagePlaneScene.prototype.setImagePlanesOld = function (planes) { - this._clearOld(); - this.addImagePlanesOld(planes); +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Component_1 = require("../../Component"); +var Edge_1 = require("../../Edge"); +var Error_1 = require("../../Error"); +/** + * The `KeySequenceNavigationHandler` allows the user to navigate through a sequence using the + * following key commands: + * + * `ALT` + `Up Arrow`: Navigate to next image in the sequence. + * `ALT` + `Down Arrow`: Navigate to previous image in sequence. + * + * @example + * ``` + * var keyboardComponent = viewer.getComponent("keyboard"); + * + * keyboardComponent.keySequenceNavigation.disable(); + * keyboardComponent.keySequenceNavigation.enable(); + * + * var isEnabled = keyboardComponent.keySequenceNavigation.isEnabled; + * ``` + */ +var KeySequenceNavigationHandler = /** @class */ (function (_super) { + __extends(KeySequenceNavigationHandler, _super); + function KeySequenceNavigationHandler() { + return _super !== null && _super.apply(this, arguments) || this; + } + KeySequenceNavigationHandler.prototype._enable = function () { + var _this = this; + var sequenceEdges$ = this._navigator.stateService.currentNode$ + .switchMap(function (node) { + return node.sequenceEdges$; + }); + this._keyDownSubscription = this._container.keyboardService.keyDown$ + .withLatestFrom(sequenceEdges$) + .subscribe(function (_a) { + var event = _a[0], edgeStatus = _a[1]; + var direction = null; + switch (event.keyCode) { + case 38:// up + direction = Edge_1.EdgeDirection.Next; + break; + case 40:// down + direction = Edge_1.EdgeDirection.Prev; + break; + default: + return; + } + event.preventDefault(); + if (!event.altKey || event.shiftKey || !edgeStatus.cached) { + return; + } + for (var _i = 0, _b = edgeStatus.edges; _i < _b.length; _i++) { + var edge = _b[_i]; + if (edge.data.direction === direction) { + _this._navigator.moveToKey$(edge.to) + .subscribe(undefined, function (error) { + if (!(error instanceof Error_1.AbortMapillaryError)) { + console.error(error); + } + }); + return; + } + } + }); }; - ImagePlaneScene.prototype.clear = function () { - this._clear(); - this._clearOld(); + KeySequenceNavigationHandler.prototype._disable = function () { + this._keyDownSubscription.unsubscribe(); }; - ImagePlaneScene.prototype._clear = function () { - this._dispose(this.imagePlanes, this.scene); - this.imagePlanes.length = 0; + KeySequenceNavigationHandler.prototype._getConfiguration = function (enable) { + return { keySequenceNavigation: enable }; }; - ImagePlaneScene.prototype._clearOld = function () { - this._dispose(this.imagePlanesOld, this.sceneOld); - this.imagePlanesOld.length = 0; + return KeySequenceNavigationHandler; +}(Component_1.HandlerBase)); +exports.KeySequenceNavigationHandler = KeySequenceNavigationHandler; +exports.default = KeySequenceNavigationHandler; + +},{"../../Component":290,"../../Edge":291,"../../Error":292}],327:[function(require,module,exports){ +"use strict"; +/// +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - ImagePlaneScene.prototype._dispose = function (planes, scene) { - for (var _i = 0, planes_4 = planes; _i < planes_4.length; _i++) { - var plane = planes_4[_i]; - scene.remove(plane); - plane.geometry.dispose(); - plane.material.dispose(); - var texture = plane.material.uniforms.projectorTex.value; - if (texture != null) { - texture.dispose(); +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Component_1 = require("../../Component"); +var Edge_1 = require("../../Edge"); +var Error_1 = require("../../Error"); +/** + * The `KeySpatialNavigationHandler` allows the user to navigate through a sequence using the + * following key commands: + * + * `Up Arrow`: Step forward. + * `Down Arrow`: Step backward. + * `Left Arrow`: Step to the left. + * `Rigth Arrow`: Step to the right. + * `SHIFT` + `Down Arrow`: Turn around. + * `SHIFT` + `Left Arrow`: Turn to the left. + * `SHIFT` + `Rigth Arrow`: Turn to the right. + * + * @example + * ``` + * var keyboardComponent = viewer.getComponent("keyboard"); + * + * keyboardComponent.keySpatialNavigation.disable(); + * keyboardComponent.keySpatialNavigation.enable(); + * + * var isEnabled = keyboardComponent.keySpatialNavigation.isEnabled; + * ``` + */ +var KeySpatialNavigationHandler = /** @class */ (function (_super) { + __extends(KeySpatialNavigationHandler, _super); + function KeySpatialNavigationHandler(component, container, navigator, spatial) { + var _this = _super.call(this, component, container, navigator) || this; + _this._spatial = spatial; + return _this; + } + KeySpatialNavigationHandler.prototype._enable = function () { + var _this = this; + var spatialEdges$ = this._navigator.stateService.currentNode$ + .switchMap(function (node) { + return node.spatialEdges$; + }); + this._keyDownSubscription = this._container.keyboardService.keyDown$ + .withLatestFrom(spatialEdges$, this._navigator.stateService.currentState$) + .subscribe(function (_a) { + var event = _a[0], edgeStatus = _a[1], frame = _a[2]; + var pano = frame.state.currentNode.pano; + var direction = null; + switch (event.keyCode) { + case 37:// left + direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnLeft : Edge_1.EdgeDirection.StepLeft; + break; + case 38:// up + direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.Pano : Edge_1.EdgeDirection.StepForward; + break; + case 39:// right + direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnRight : Edge_1.EdgeDirection.StepRight; + break; + case 40:// down + direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnU : Edge_1.EdgeDirection.StepBackward; + break; + default: + return; + } + event.preventDefault(); + if (event.altKey || !edgeStatus.cached || + (event.shiftKey && pano)) { + return; + } + if (!pano) { + _this._moveDir(direction, edgeStatus); + } + else { + var shifts = {}; + shifts[Edge_1.EdgeDirection.StepBackward] = Math.PI; + shifts[Edge_1.EdgeDirection.StepForward] = 0; + shifts[Edge_1.EdgeDirection.StepLeft] = Math.PI / 2; + shifts[Edge_1.EdgeDirection.StepRight] = -Math.PI / 2; + var phi = _this._rotationFromCamera(frame.state.camera).phi; + var navigationAngle = _this._spatial.wrapAngle(phi + shifts[direction]); + var threshold = Math.PI / 4; + var edges = edgeStatus.edges.filter(function (e) { + return e.data.direction === Edge_1.EdgeDirection.Pano || e.data.direction === direction; + }); + var smallestAngle = Number.MAX_VALUE; + var toKey = null; + for (var _i = 0, edges_1 = edges; _i < edges_1.length; _i++) { + var edge = edges_1[_i]; + var angle = Math.abs(_this._spatial.wrapAngle(edge.data.worldMotionAzimuth - navigationAngle)); + if (angle < Math.min(smallestAngle, threshold)) { + smallestAngle = angle; + toKey = edge.to; + } + } + if (toKey == null) { + return; + } + _this._moveToKey(toKey); + } + }); + }; + KeySpatialNavigationHandler.prototype._disable = function () { + this._keyDownSubscription.unsubscribe(); + }; + KeySpatialNavigationHandler.prototype._getConfiguration = function (enable) { + return { keySpatialNavigation: enable }; + }; + KeySpatialNavigationHandler.prototype._moveDir = function (direction, edgeStatus) { + for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) { + var edge = _a[_i]; + if (edge.data.direction === direction) { + this._moveToKey(edge.to); + return; } } }; - return ImagePlaneScene; -}()); -exports.ImagePlaneScene = ImagePlaneScene; -exports.default = ImagePlaneScene; - -},{"three":176}],260:[function(require,module,exports){ -"use strict"; -/// + KeySpatialNavigationHandler.prototype._moveToKey = function (key) { + this._navigator.moveToKey$(key) + .subscribe(undefined, function (error) { + if (!(error instanceof Error_1.AbortMapillaryError)) { + console.error(error); + } + }); + }; + KeySpatialNavigationHandler.prototype._rotationFromCamera = function (camera) { + var direction = camera.lookat.clone().sub(camera.position); + var upProjection = direction.clone().dot(camera.up); + var planeProjection = direction.clone().sub(camera.up.clone().multiplyScalar(upProjection)); + var phi = Math.atan2(planeProjection.y, planeProjection.x); + var theta = Math.PI / 2 - this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]); + return { phi: phi, theta: theta }; + }; + return KeySpatialNavigationHandler; +}(Component_1.HandlerBase)); +exports.KeySpatialNavigationHandler = KeySpatialNavigationHandler; +exports.default = KeySpatialNavigationHandler; + +},{"../../Component":290,"../../Edge":291,"../../Error":292}],328:[function(require,module,exports){ +"use strict"; +/// +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); Object.defineProperty(exports, "__esModule", { value: true }); - -var path = require("path"); -var ImagePlaneShaders = (function () { - function ImagePlaneShaders() { +var Component_1 = require("../../Component"); +/** + * The `KeyZoomHandler` allows the user to zoom in and out using the + * following key commands: + * + * `+`: Zoom in. + * `-`: Zoom out. + * + * @example + * ``` + * var keyboardComponent = viewer.getComponent("keyboard"); + * + * keyboardComponent.keyZoom.disable(); + * keyboardComponent.keyZoom.enable(); + * + * var isEnabled = keyboardComponent.keyZoom.isEnabled; + * ``` + */ +var KeyZoomHandler = /** @class */ (function (_super) { + __extends(KeyZoomHandler, _super); + function KeyZoomHandler(component, container, navigator, viewportCoords) { + var _this = _super.call(this, component, container, navigator) || this; + _this._viewportCoords = viewportCoords; + return _this; } - return ImagePlaneShaders; -}()); -ImagePlaneShaders.equirectangular = { - fragment: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n vec3 b = normalize(vRstq.xyz);\n float lat = -asin(b.y);\n float lon = atan(b.x, b.z);\n float x = (lon - phiShift) / phiLength + 0.5;\n float y = (lat - thetaShift) / thetaLength + 0.5;\n vec4 baseColor = texture2D(projectorTex, vec2(x, y));\n baseColor.a = opacity;\n gl_FragColor = baseColor;\n}", - vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n vRstq = projectorMat * vec4(position, 1.0);\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}", -}; -ImagePlaneShaders.perspective = { - fragment: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform vec4 bbox;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n float x = vRstq.x / vRstq.w;\n float y = vRstq.y / vRstq.w;\n\n vec4 baseColor;\n if (x > bbox[0] && y > bbox[1] && x < bbox[2] && y < bbox[3]) {\n baseColor = texture2D(projectorTex, vec2(x, y));\n baseColor.a = opacity;\n } else {\n baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n }\n\n gl_FragColor = baseColor;\n}", - vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n vRstq = projectorMat * vec4(position, 1.0);\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}", -}; -exports.ImagePlaneShaders = ImagePlaneShaders; + KeyZoomHandler.prototype._enable = function () { + var _this = this; + this._keyDownSubscription = this._container.keyboardService.keyDown$ + .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$) + .subscribe(function (_a) { + var event = _a[0], render = _a[1], transform = _a[2]; + if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) { + return; + } + var delta = 0; + switch (event.key) { + case "+": + delta = 1; + break; + case "-": + delta = -1; + break; + default: + return; + } + event.preventDefault(); + var unprojected = _this._viewportCoords.unprojectFromViewport(0, 0, render.perspective); + var reference = transform.projectBasic(unprojected.toArray()); + _this._navigator.stateService.zoomIn(delta, reference); + }); + }; + KeyZoomHandler.prototype._disable = function () { + this._keyDownSubscription.unsubscribe(); + }; + KeyZoomHandler.prototype._getConfiguration = function (enable) { + return { keyZoom: enable }; + }; + return KeyZoomHandler; +}(Component_1.HandlerBase)); +exports.KeyZoomHandler = KeyZoomHandler; +exports.default = KeyZoomHandler; -},{"path":22}],261:[function(require,module,exports){ +},{"../../Component":290}],329:[function(require,module,exports){ "use strict"; -/// var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || @@ -23561,446 +26508,131 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); -var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/observable/combineLatest"); -require("rxjs/add/observable/fromEvent"); -require("rxjs/add/observable/of"); -require("rxjs/add/observable/zip"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/first"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/merge"); -require("rxjs/add/operator/mergeMap"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/switchMap"); -require("rxjs/add/operator/withLatestFrom"); -require("rxjs/add/operator/zip"); -var State_1 = require("../../State"); -var Render_1 = require("../../Render"); -var Utils_1 = require("../../Utils"); var Component_1 = require("../../Component"); -var SliderState = (function () { - function SliderState() { - this._imagePlaneFactory = new Component_1.ImagePlaneFactory(); - this._imagePlaneScene = new Component_1.ImagePlaneScene(); - this._currentKey = null; - this._previousKey = null; - this._currentPano = false; - this._frameId = 0; - this._glNeedsRender = false; - this._domNeedsRender = true; - this._curtain = 1; +var Geo_1 = require("../../Geo"); +/** + * @class KeyboardComponent + * + * @classdesc Component for keyboard event handling. + * + * To retrive and use the keyboard component + * + * @example + * ``` + * var viewer = new Mapillary.Viewer( + * "", + * "", + * ""); + * + * var keyboardComponent = viewer.getComponent("keyboard"); + * ``` + */ +var KeyboardComponent = /** @class */ (function (_super) { + __extends(KeyboardComponent, _super); + function KeyboardComponent(name, container, navigator) { + var _this = _super.call(this, name, container, navigator) || this; + _this._keyPlayHandler = new Component_1.KeyPlayHandler(_this, container, navigator); + _this._keySequenceNavigationHandler = new Component_1.KeySequenceNavigationHandler(_this, container, navigator); + _this._keySpatialNavigationHandler = new Component_1.KeySpatialNavigationHandler(_this, container, navigator, new Geo_1.Spatial()); + _this._keyZoomHandler = new Component_1.KeyZoomHandler(_this, container, navigator, new Geo_1.ViewportCoords()); + return _this; } - Object.defineProperty(SliderState.prototype, "frameId", { - get: function () { - return this._frameId; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SliderState.prototype, "curtain", { - get: function () { - return this._curtain; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SliderState.prototype, "glNeedsRender", { + Object.defineProperty(KeyboardComponent.prototype, "keyPlay", { + /** + * Get key play. + * + * @returns {KeyPlayHandler} The key play handler. + */ get: function () { - return this._glNeedsRender; + return this._keyPlayHandler; }, enumerable: true, configurable: true }); - Object.defineProperty(SliderState.prototype, "domNeedsRender", { + Object.defineProperty(KeyboardComponent.prototype, "keySequenceNavigation", { + /** + * Get key sequence navigation. + * + * @returns {KeySequenceNavigationHandler} The key sequence navigation handler. + */ get: function () { - return this._domNeedsRender; + return this._keySequenceNavigationHandler; }, enumerable: true, configurable: true }); - Object.defineProperty(SliderState.prototype, "sliderVisible", { + Object.defineProperty(KeyboardComponent.prototype, "keySpatialNavigation", { + /** + * Get spatial. + * + * @returns {KeySpatialNavigationHandler} The spatial handler. + */ get: function () { - return this._sliderVisible; - }, - set: function (value) { - this._sliderVisible = value; - this._domNeedsRender = true; + return this._keySpatialNavigationHandler; }, enumerable: true, configurable: true }); - Object.defineProperty(SliderState.prototype, "disabled", { + Object.defineProperty(KeyboardComponent.prototype, "keyZoom", { + /** + * Get key zoom. + * + * @returns {KeyZoomHandler} The key zoom handler. + */ get: function () { - return this._currentKey == null || - this._previousKey == null || - this._currentPano; + return this._keyZoomHandler; }, enumerable: true, configurable: true }); - SliderState.prototype.update = function (frame) { - this._updateFrameId(frame.id); - var needsRender = this._updateImagePlanes(frame.state); - this._domNeedsRender = needsRender || this._domNeedsRender; - needsRender = this._updateCurtain(frame.state.alpha) || needsRender; - this._glNeedsRender = needsRender || this._glNeedsRender; - }; - SliderState.prototype.updateTexture = function (image, node) { - var imagePlanes = node.key === this._currentKey ? - this._imagePlaneScene.imagePlanes : - node.key === this._previousKey ? - this._imagePlaneScene.imagePlanesOld : - []; - if (imagePlanes.length === 0) { - return; - } - this._glNeedsRender = true; - for (var _i = 0, imagePlanes_1 = imagePlanes; _i < imagePlanes_1.length; _i++) { - var plane = imagePlanes_1[_i]; - var material = plane.material; - var texture = material.uniforms.projectorTex.value; - texture.image = image; - texture.needsUpdate = true; - } - }; - SliderState.prototype.render = function (perspectiveCamera, renderer) { - if (!this.disabled) { - renderer.render(this._imagePlaneScene.sceneOld, perspectiveCamera); - } - renderer.render(this._imagePlaneScene.scene, perspectiveCamera); - }; - SliderState.prototype.dispose = function () { - this._imagePlaneScene.clear(); - }; - SliderState.prototype.clearGLNeedsRender = function () { - this._glNeedsRender = false; - }; - SliderState.prototype.clearDomNeedsRender = function () { - this._domNeedsRender = false; - }; - SliderState.prototype._updateFrameId = function (frameId) { - this._frameId = frameId; - }; - SliderState.prototype._updateImagePlanes = function (state) { - if (state.currentNode == null) { - return; - } - var needsRender = false; - if (state.previousNode != null && this._previousKey !== state.previousNode.key) { - needsRender = true; - this._previousKey = state.previousNode.key; - this._imagePlaneScene.setImagePlanesOld([ - this._imagePlaneFactory.createMesh(state.previousNode, state.previousTransform), - ]); - } - if (this._currentKey !== state.currentNode.key) { - needsRender = true; - this._currentKey = state.currentNode.key; - this._currentPano = state.currentNode.pano; - this._imagePlaneScene.setImagePlanes([ - this._imagePlaneFactory.createMesh(state.currentNode, state.currentTransform), - ]); - if (!this.disabled) { - this._updateBbox(); - } - } - return needsRender; - }; - SliderState.prototype._updateCurtain = function (alpha) { - if (this.disabled || - Math.abs(this._curtain - alpha) < 0.001) { - return false; - } - this._curtain = alpha; - this._updateBbox(); - return true; - }; - SliderState.prototype._updateBbox = function () { - for (var _i = 0, _a = this._imagePlaneScene.imagePlanes; _i < _a.length; _i++) { - var plane = _a[_i]; - var shaderMaterial = plane.material; - var bbox = shaderMaterial.uniforms.bbox.value; - bbox.z = this._curtain; - } - }; - return SliderState; -}()); -var SliderComponent = (function (_super) { - __extends(SliderComponent, _super); - /** - * Create a new slider component instance. - * @class SliderComponent - */ - function SliderComponent(name, container, navigator) { - var _this = _super.call(this, name, container, navigator) || this; - _this._sliderStateOperation$ = new Subject_1.Subject(); - _this._sliderStateCreator$ = new Subject_1.Subject(); - _this._sliderStateDisposer$ = new Subject_1.Subject(); - _this._sliderState$ = _this._sliderStateOperation$ - .scan(function (sliderState, operation) { - return operation(sliderState); - }, null) - .filter(function (sliderState) { - return sliderState != null; - }) - .distinctUntilChanged(undefined, function (sliderState) { - return sliderState.frameId; - }); - _this._sliderStateCreator$ - .map(function () { - return function (sliderState) { - if (sliderState != null) { - throw new Error("Multiple slider states can not be created at the same time"); - } - return new SliderState(); - }; - }) - .subscribe(_this._sliderStateOperation$); - _this._sliderStateDisposer$ - .map(function () { - return function (sliderState) { - sliderState.dispose(); - return null; - }; - }) - .subscribe(_this._sliderStateOperation$); - return _this; - } - /** - * Set the image keys. - * - * Configures the component to show the image planes for the supplied image keys. - * - * @param {keys} ISliderKeys - Slider keys object specifying the images to be shown in the foreground and the background. - */ - SliderComponent.prototype.setKeys = function (keys) { - this.configure({ keys: keys }); - }; - /** - * Set the initial position. - * - * Configures the intial position of the slider. The inital position value will be used when the component is activated. - * - * @param {number} initialPosition - Initial slider position. - */ - SliderComponent.prototype.setInitialPosition = function (initialPosition) { - this.configure({ initialPosition: initialPosition }); - }; - /** - * Set the value controlling if the slider is visible. - * - * @param {boolean} sliderVisible - Value indicating if the slider should be visible or not. - */ - SliderComponent.prototype.setSliderVisible = function (sliderVisible) { - this.configure({ sliderVisible: sliderVisible }); - }; - SliderComponent.prototype._activate = function () { + KeyboardComponent.prototype._activate = function () { var _this = this; - this._sliderContainer = this._createElement("div", "mapillary-js-slider-container", this._container.element); - this._sliderWrapper = this._createElement("div", "SliderWrapper", this._sliderContainer); - this._sliderControl = this._createElement("input", "SliderControl", this._sliderWrapper); - this._sliderControl.setAttribute("type", "range"); - this._sliderControl.setAttribute("min", "0"); - this._sliderControl.setAttribute("max", "1000"); - this._sliderControl.style.visibility = "hidden"; - this._moveToHandler = function (e) { - var curtain = Number(e.target.value) / 1000; - _this._navigator.stateService.moveTo(curtain); - }; - this._sliderControl.addEventListener("input", this._moveToHandler); - this._sliderControl.addEventListener("change", this._moveToHandler); - Observable_1.Observable - .combineLatest(this._navigator.stateService.state$, this._configuration$) - .first() - .subscribe(function (_a) { - var state = _a[0], configuration = _a[1]; - if (state === State_1.State.Traversing) { - _this._navigator.stateService.wait(); - var position = configuration.initialPosition != null ? configuration.initialPosition : 1; - _this._sliderControl.value = (1000 * position).toString(); - _this._navigator.stateService.moveTo(position); + this._configurationSubscription = this._configuration$ + .subscribe(function (configuration) { + if (configuration.keyPlay) { + _this._keyPlayHandler.enable(); } - }); - this._glRenderSubscription = this._sliderState$ - .map(function (sliderState) { - var renderHash = { - name: _this._name, - render: { - frameId: sliderState.frameId, - needsRender: sliderState.glNeedsRender, - render: sliderState.render.bind(sliderState), - stage: Render_1.GLRenderStage.Background, - }, - }; - sliderState.clearGLNeedsRender(); - return renderHash; - }) - .subscribe(this._container.glRenderer.render$); - this._domRenderSubscription = this._sliderState$ - .filter(function (sliderState) { - return sliderState.domNeedsRender; - }) - .subscribe(function (sliderState) { - _this._sliderControl.value = (1000 * sliderState.curtain).toString(); - var visibility = sliderState.disabled || !sliderState.sliderVisible ? "hidden" : "visible"; - _this._sliderControl.style.visibility = visibility; - sliderState.clearDomNeedsRender(); - }); - this._sliderStateCreator$.next(null); - this._stateSubscription = this._navigator.stateService.currentState$ - .map(function (frame) { - return function (sliderState) { - sliderState.update(frame); - return sliderState; - }; - }) - .subscribe(this._sliderStateOperation$); - this._setSliderVisibleSubscription = this._configuration$ - .map(function (configuration) { - return configuration.sliderVisible == null || configuration.sliderVisible; - }) - .distinctUntilChanged() - .map(function (sliderVisible) { - return function (sliderState) { - sliderState.sliderVisible = sliderVisible; - return sliderState; - }; - }) - .subscribe(this._sliderStateOperation$); - this._setKeysSubscription = this._configuration$ - .filter(function (configuration) { - return configuration.keys != null; - }) - .switchMap(function (configuration) { - return Observable_1.Observable - .zip(_this._catchCacheNode$(configuration.keys.background), _this._catchCacheNode$(configuration.keys.foreground)) - .map(function (nodes) { - return { background: nodes[0], foreground: nodes[1] }; - }) - .zip(_this._navigator.stateService.currentState$.first()) - .map(function (nf) { - return { nodes: nf[0], state: nf[1].state }; - }); - }) - .subscribe(function (co) { - if (co.state.currentNode != null && - co.state.previousNode != null && - co.state.currentNode.key === co.nodes.foreground.key && - co.state.previousNode.key === co.nodes.background.key) { - return; + else { + _this._keyPlayHandler.disable(); } - if (co.state.currentNode.key === co.nodes.background.key) { - _this._navigator.stateService.setNodes([co.nodes.foreground]); - return; + if (configuration.keySequenceNavigation) { + _this._keySequenceNavigationHandler.enable(); } - if (co.state.currentNode.key === co.nodes.foreground.key && - co.state.trajectory.length === 1) { - _this._navigator.stateService.prependNodes([co.nodes.background]); - return; + else { + _this._keySequenceNavigationHandler.disable(); } - _this._navigator.stateService.setNodes([co.nodes.background]); - _this._navigator.stateService.setNodes([co.nodes.foreground]); - }, function (e) { - console.error(e); - }); - var previousNode$ = this._navigator.stateService.currentState$ - .map(function (frame) { - return frame.state.previousNode; - }) - .filter(function (node) { - return node != null; - }) - .distinctUntilChanged(undefined, function (node) { - return node.key; - }); - this._nodeSubscription = Observable_1.Observable - .merge(previousNode$, this._navigator.stateService.currentNode$) - .filter(function (node) { - return node.pano ? - Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize : - Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize; - }) - .mergeMap(function (node) { - var baseImageSize = node.pano ? - Utils_1.Settings.basePanoramaSize : - Utils_1.Settings.baseImageSize; - if (Math.max(node.image.width, node.image.height) > baseImageSize) { - return Observable_1.Observable.empty(); + if (configuration.keySpatialNavigation) { + _this._keySpatialNavigationHandler.enable(); } - return node.cacheImage$(Utils_1.Settings.maxImageSize) - .map(function (n) { - return [n.image, n]; - }) - .catch(function (error, caught) { - console.error("Failed to fetch high res slider image (" + node.key + ")", error); - return Observable_1.Observable.empty(); - }); - }) - .map(function (_a) { - var element = _a[0], node = _a[1]; - return function (sliderState) { - sliderState.updateTexture(element, node); - return sliderState; - }; - }) - .subscribe(this._sliderStateOperation$); - }; - SliderComponent.prototype._deactivate = function () { - var _this = this; - this._navigator.stateService.state$ - .first() - .subscribe(function (state) { - if (state === State_1.State.Waiting) { - _this._navigator.stateService.traverse(); + else { + _this._keySpatialNavigationHandler.disable(); + } + if (configuration.keyZoom) { + _this._keyZoomHandler.enable(); + } + else { + _this._keyZoomHandler.disable(); } }); - this._sliderStateDisposer$.next(null); - this._setKeysSubscription.unsubscribe(); - this._setSliderVisibleSubscription.unsubscribe(); - this._stateSubscription.unsubscribe(); - this._glRenderSubscription.unsubscribe(); - this._domRenderSubscription.unsubscribe(); - this._nodeSubscription.unsubscribe(); - this.configure({ keys: null }); - this._sliderControl.removeEventListener("input", this._moveToHandler); - this._sliderControl.removeEventListener("change", this._moveToHandler); - this._container.element.removeChild(this._sliderContainer); - this._moveToHandler = null; - this._sliderControl = null; - this._sliderWrapper = null; - this._sliderContainer = null; }; - SliderComponent.prototype._getDefaultConfiguration = function () { - return {}; - }; - SliderComponent.prototype._catchCacheNode$ = function (key) { - return this._navigator.graphService.cacheNode$(key) - .catch(function (error, caught) { - console.error("Failed to cache slider node (" + key + ")", error); - return Observable_1.Observable.empty(); - }); + KeyboardComponent.prototype._deactivate = function () { + this._configurationSubscription.unsubscribe(); + this._keyPlayHandler.disable(); + this._keySequenceNavigationHandler.disable(); + this._keySpatialNavigationHandler.disable(); + this._keyZoomHandler.disable(); }; - SliderComponent.prototype._createElement = function (tagName, className, container) { - var element = document.createElement(tagName); - if (!!className) { - element.className = className; - } - if (!!container) { - container.appendChild(element); - } - return element; + KeyboardComponent.prototype._getDefaultConfiguration = function () { + return { keyPlay: true, keySequenceNavigation: true, keySpatialNavigation: true, keyZoom: true }; }; - return SliderComponent; + KeyboardComponent.componentName = "keyboard"; + return KeyboardComponent; }(Component_1.Component)); -SliderComponent.componentName = "slider"; -exports.SliderComponent = SliderComponent; -Component_1.ComponentService.register(SliderComponent); -exports.default = SliderComponent; +exports.KeyboardComponent = KeyboardComponent; +Component_1.ComponentService.register(KeyboardComponent); +exports.default = KeyboardComponent; -},{"../../Component":226,"../../Render":232,"../../State":233,"../../Utils":235,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/fromEvent":42,"rxjs/add/observable/of":45,"rxjs/add/observable/zip":48,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/scan":73,"rxjs/add/operator/switchMap":79,"rxjs/add/operator/withLatestFrom":83,"rxjs/add/operator/zip":84}],262:[function(require,module,exports){ +},{"../../Component":290,"../../Geo":293}],330:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var MarkerComponent_1 = require("./MarkerComponent"); @@ -24010,7 +26642,7 @@ exports.SimpleMarker = SimpleMarker_1.SimpleMarker; var CircleMarker_1 = require("./marker/CircleMarker"); exports.CircleMarker = CircleMarker_1.CircleMarker; -},{"./MarkerComponent":263,"./marker/CircleMarker":266,"./marker/SimpleMarker":268}],263:[function(require,module,exports){ +},{"./MarkerComponent":331,"./marker/CircleMarker":334,"./marker/SimpleMarker":336}],331:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -24027,9 +26659,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var when = require("when"); var Observable_1 = require("rxjs/Observable"); -require("rxjs/add/observable/combineLatest"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/map"); var Component_1 = require("../../Component"); var Render_1 = require("../../Render"); var Graph_1 = require("../../Graph"); @@ -24070,7 +26699,7 @@ var Geo_1 = require("../../Geo"); * var markerComponent = viewer.getComponent("marker"); * ``` */ -var MarkerComponent = (function (_super) { +var MarkerComponent = /** @class */ (function (_super) { __extends(MarkerComponent, _super); function MarkerComponent(name, container, navigator) { var _this = _super.call(this, name, container, navigator) || this; @@ -24357,7 +26986,7 @@ var MarkerComponent = (function (_super) { .map(function (event) { return false; }); - var dragging$ = Observable_1.Observable + var filteredDragging$ = Observable_1.Observable .merge(draggingStarted$, draggingStopped$) .startWith(false); this._dragEventSubscription = draggingStarted$ @@ -24375,19 +27004,26 @@ var MarkerComponent = (function (_super) { var markerEvent = { marker: marker, target: _this, type: eventType }; _this.fire(eventType, markerEvent); }); + var mouseDown$ = Observable_1.Observable + .merge(this._container.mouseService.mouseDown$ + .map(function (event) { return true; }), this._container.mouseService.documentMouseUp$ + .map(function (event) { return false; })) + .startWith(false); this._mouseClaimSubscription = Observable_1.Observable - .combineLatest(this._container.mouseService.active$, hoveredMarkerId$, dragging$) + .combineLatest(this._container.mouseService.active$, hoveredMarkerId$.distinctUntilChanged(), mouseDown$, filteredDragging$) .map(function (_a) { - var active = _a[0], markerId = _a[1], dragging = _a[2]; - return (!active && markerId != null) || dragging; + var active = _a[0], markerId = _a[1], mouseDown = _a[2], filteredDragging = _a[3]; + return (!active && markerId != null && mouseDown) || filteredDragging; }) .distinctUntilChanged() - .subscribe(function (hovered) { - if (hovered) { + .subscribe(function (claim) { + if (claim) { _this._container.mouseService.claimMouse(_this._name, 1); + _this._container.mouseService.claimWheel(_this._name, 1); } else { _this._container.mouseService.unclaimMouse(_this._name); + _this._container.mouseService.unclaimWheel(_this._name); } }); var offset$ = this._container.mouseService @@ -24453,55 +27089,55 @@ var MarkerComponent = (function (_super) { MarkerComponent.prototype._getDefaultConfiguration = function () { return { visibleBBoxSize: 100 }; }; + MarkerComponent.componentName = "marker"; + /** + * Fired when the position of a marker is changed. + * @event + * @type {IMarkerEvent} markerEvent - Marker event data. + * @example + * ``` + * markerComponent.on("changed", function(e) { + * console.log(e.marker.id, e.marker.latLon); + * }); + * ``` + */ + MarkerComponent.changed = "changed"; + /** + * Fired when a marker drag interaction starts. + * @event + * @type {IMarkerEvent} markerEvent - Marker event data. + * @example + * ``` + * markerComponent.on("dragstart", function(e) { + * console.log(e.marker.id, e.marker.latLon); + * }); + * ``` + */ + MarkerComponent.dragstart = "dragstart"; + /** + * Fired when a marker drag interaction ends. + * @event + * @type {IMarkerEvent} markerEvent - Marker event data. + * @example + * ``` + * markerComponent.on("dragend", function(e) { + * console.log(e.marker.id, e.marker.latLon); + * }); + * ``` + */ + MarkerComponent.dragend = "dragend"; return MarkerComponent; }(Component_1.Component)); -MarkerComponent.componentName = "marker"; -/** - * Fired when the position of a marker is changed. - * @event - * @type {IMarkerEvent} markerEvent - Marker event data. - * @example - * ``` - * markerComponent.on("changed", function(e) { - * console.log(e.marker.id, e.marker.latLon); - * }); - * ``` - */ -MarkerComponent.changed = "changed"; -/** - * Fired when a marker drag interaction starts. - * @event - * @type {IMarkerEvent} markerEvent - Marker event data. - * @example - * ``` - * markerComponent.on("dragstart", function(e) { - * console.log(e.marker.id, e.marker.latLon); - * }); - * ``` - */ -MarkerComponent.dragstart = "dragstart"; -/** - * Fired when a marker drag interaction ends. - * @event - * @type {IMarkerEvent} markerEvent - Marker event data. - * @example - * ``` - * markerComponent.on("dragend", function(e) { - * console.log(e.marker.id, e.marker.latLon); - * }); - * ``` - */ -MarkerComponent.dragend = "dragend"; exports.MarkerComponent = MarkerComponent; Component_1.ComponentService.register(MarkerComponent); exports.default = MarkerComponent; -},{"../../Component":226,"../../Geo":229,"../../Graph":230,"../../Render":232,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"three":176,"when":223}],264:[function(require,module,exports){ +},{"../../Component":290,"../../Geo":293,"../../Graph":294,"../../Render":296,"rxjs/Observable":29,"three":240,"when":287}],332:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); -var MarkerScene = (function () { +var MarkerScene = /** @class */ (function () { function MarkerScene(scene, raycaster) { this._needsRender = false; this._interactiveObjects = []; @@ -24619,16 +27255,13 @@ var MarkerScene = (function () { exports.MarkerScene = MarkerScene; exports.default = MarkerScene; -},{"three":176}],265:[function(require,module,exports){ +},{"three":240}],333:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var rbush = require("rbush"); var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/publishReplay"); -require("rxjs/add/operator/scan"); -var MarkerSet = (function () { +var MarkerSet = /** @class */ (function () { function MarkerSet() { this._hash = {}; this._index = rbush(16, [".lon", ".lat", ".lon", ".lat"]); @@ -24740,7 +27373,7 @@ var MarkerSet = (function () { exports.MarkerSet = MarkerSet; exports.default = MarkerSet; -},{"rbush":25,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73}],266:[function(require,module,exports){ +},{"rbush":25,"rxjs/Subject":34}],334:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -24785,7 +27418,7 @@ var Component_1 = require("../../../Component"); * markerComponent.add([defaultMarker, configuredMarker]); * ``` */ -var CircleMarker = (function (_super) { +var CircleMarker = /** @class */ (function (_super) { __extends(CircleMarker, _super); function CircleMarker(id, latLon, options) { var _this = _super.call(this, id, latLon) || this; @@ -24823,7 +27456,7 @@ var CircleMarker = (function (_super) { exports.CircleMarker = CircleMarker; exports.default = CircleMarker; -},{"../../../Component":226,"three":176}],267:[function(require,module,exports){ +},{"../../../Component":290,"three":240}],335:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); @@ -24833,7 +27466,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); * @classdesc Represents an abstract marker class that should be extended * by marker implementations used in the marker component. */ -var Marker = (function () { +var Marker = /** @class */ (function () { function Marker(id, latLon) { this._id = id; this._latLon = latLon; @@ -24910,7 +27543,7 @@ var Marker = (function () { exports.Marker = Marker; exports.default = Marker; -},{}],268:[function(require,module,exports){ +},{}],336:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -24958,7 +27591,7 @@ var Component_1 = require("../../../Component"); * markerComponent.add([defaultMarker, interactiveMarker]); * ``` */ -var SimpleMarker = (function (_super) { +var SimpleMarker = /** @class */ (function (_super) { __extends(SimpleMarker, _super); function SimpleMarker(id, latLon, options) { var _this = _super.call(this, id, latLon) || this; @@ -24977,14 +27610,12 @@ var SimpleMarker = (function (_super) { var cone = new THREE.Mesh(this._markerGeometry(radius, 8, 8), new THREE.MeshBasicMaterial({ color: this._color, opacity: this._opacity, - shading: THREE.SmoothShading, transparent: true, })); cone.renderOrder = 1; var ball = new THREE.Mesh(new THREE.SphereGeometry(radius / 2, 8, 8), new THREE.MeshBasicMaterial({ color: this._ballColor, opacity: this._ballOpacity, - shading: THREE.SmoothShading, transparent: true, })); ball.position.z = this._markerHeight(radius); @@ -25059,7 +27690,117 @@ var SimpleMarker = (function (_super) { exports.SimpleMarker = SimpleMarker; exports.default = SimpleMarker; -},{"../../../Component":226,"three":176}],269:[function(require,module,exports){ +},{"../../../Component":290,"three":240}],337:[function(require,module,exports){ +"use strict"; +/// +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("rxjs/Observable"); +var Component_1 = require("../../Component"); +/** + * The `BounceHandler` ensures that the viewer bounces back to the image + * when drag panning outside of the image edge. + */ +var BounceHandler = /** @class */ (function (_super) { + __extends(BounceHandler, _super); + function BounceHandler(component, container, navigator, viewportCoords, spatial) { + var _this = _super.call(this, component, container, navigator) || this; + _this._spatial = spatial; + _this._viewportCoords = viewportCoords; + _this._basicDistanceThreshold = 1e-3; + _this._basicRotationThreshold = 5e-2; + _this._bounceCoeff = 1e-1; + return _this; + } + BounceHandler.prototype._enable = function () { + var _this = this; + var inTransition$ = this._navigator.stateService.currentState$ + .map(function (frame) { + return frame.state.alpha < 1; + }); + this._bounceSubscription = Observable_1.Observable + .combineLatest(inTransition$, this._navigator.stateService.inTranslation$, this._container.mouseService.active$, this._container.touchService.active$) + .map(function (noForce) { + return noForce[0] || noForce[1] || noForce[2] || noForce[3]; + }) + .distinctUntilChanged() + .switchMap(function (noForce) { + return noForce ? + Observable_1.Observable.empty() : + Observable_1.Observable.combineLatest(_this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$.first()); + }) + .subscribe(function (args) { + var renderCamera = args[0]; + var perspectiveCamera = renderCamera.perspective; + var transform = args[1]; + if (!transform.hasValidScale && renderCamera.camera.focal < 0.1) { + return; + } + if (renderCamera.perspective.aspect === 0 || renderCamera.perspective.aspect === Number.POSITIVE_INFINITY) { + return; + } + var distanceThreshold = _this._basicDistanceThreshold / Math.pow(2, renderCamera.zoom); + var basicCenter = _this._viewportCoords.viewportToBasic(0, 0, transform, perspectiveCamera); + if (Math.abs(basicCenter[0] - 0.5) < distanceThreshold && Math.abs(basicCenter[1] - 0.5) < distanceThreshold) { + return; + } + var basicDistances = _this._viewportCoords.getBasicDistances(transform, perspectiveCamera); + var basicX = 0; + var basicY = 0; + if (basicDistances[0] < distanceThreshold && basicDistances[1] < distanceThreshold && + basicDistances[2] < distanceThreshold && basicDistances[3] < distanceThreshold) { + return; + } + if (Math.abs(basicDistances[0] - basicDistances[2]) < distanceThreshold && + Math.abs(basicDistances[1] - basicDistances[3]) < distanceThreshold) { + return; + } + var coeff = _this._bounceCoeff; + if (basicDistances[1] > 0 && basicDistances[3] === 0) { + basicX = -coeff * basicDistances[1]; + } + else if (basicDistances[1] === 0 && basicDistances[3] > 0) { + basicX = coeff * basicDistances[3]; + } + else if (basicDistances[1] > 0 && basicDistances[3] > 0) { + basicX = coeff * (basicDistances[3] - basicDistances[1]) / 2; + } + if (basicDistances[0] > 0 && basicDistances[2] === 0) { + basicY = coeff * basicDistances[0]; + } + else if (basicDistances[0] === 0 && basicDistances[2] > 0) { + basicY = -coeff * basicDistances[2]; + } + else if (basicDistances[0] > 0 && basicDistances[2] > 0) { + basicY = coeff * (basicDistances[0] - basicDistances[2]) / 2; + } + var rotationThreshold = _this._basicRotationThreshold; + basicX = _this._spatial.clamp(basicX, -rotationThreshold, rotationThreshold); + basicY = _this._spatial.clamp(basicY, -rotationThreshold, rotationThreshold); + _this._navigator.stateService.rotateBasicUnbounded([basicX, basicY]); + }); + }; + BounceHandler.prototype._disable = function () { + this._bounceSubscription.unsubscribe(); + }; + BounceHandler.prototype._getConfiguration = function (enable) { + return {}; + }; + return BounceHandler; +}(Component_1.HandlerBase)); +exports.BounceHandler = BounceHandler; +exports.default = BounceHandler; + +},{"../../Component":290,"rxjs/Observable":29}],338:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -25075,7 +27816,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); var Observable_1 = require("rxjs/Observable"); var Component_1 = require("../../Component"); /** - * The `DoubleClickZoomHandler` allows the user to zoom the viewer photo at a point by double clicking. + * The `DoubleClickZoomHandler` allows the user to zoom the viewer image at a point by double clicking. * * @example * ``` @@ -25087,10 +27828,12 @@ var Component_1 = require("../../Component"); * var isEnabled = mouseComponent.doubleClickZoom.isEnabled; * ``` */ -var DoubleClickZoomHandler = (function (_super) { +var DoubleClickZoomHandler = /** @class */ (function (_super) { __extends(DoubleClickZoomHandler, _super); - function DoubleClickZoomHandler() { - return _super !== null && _super.apply(this, arguments) || this; + function DoubleClickZoomHandler(component, container, navigator, viewportCoords) { + var _this = _super.call(this, component, container, navigator) || this; + _this._viewportCoords = viewportCoords; + return _this; } DoubleClickZoomHandler.prototype._enable = function () { var _this = this; @@ -25119,11 +27862,11 @@ var DoubleClickZoomHandler = (function (_super) { return { doubleClickZoom: enable }; }; return DoubleClickZoomHandler; -}(Component_1.MouseHandlerBase)); +}(Component_1.HandlerBase)); exports.DoubleClickZoomHandler = DoubleClickZoomHandler; exports.default = DoubleClickZoomHandler; -},{"../../Component":226,"rxjs/Observable":29}],270:[function(require,module,exports){ +},{"../../Component":290,"rxjs/Observable":29}],339:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -25141,7 +27884,7 @@ var THREE = require("three"); var Observable_1 = require("rxjs/Observable"); var Component_1 = require("../../Component"); /** - * The `DragPanHandler` allows the user to pan the viewer photo by clicking and dragging the cursor. + * The `DragPanHandler` allows the user to pan the viewer image by clicking and dragging the cursor. * * @example * ``` @@ -25153,11 +27896,12 @@ var Component_1 = require("../../Component"); * var isEnabled = mouseComponent.dragPan.isEnabled; * ``` */ -var DragPanHandler = (function (_super) { +var DragPanHandler = /** @class */ (function (_super) { __extends(DragPanHandler, _super); function DragPanHandler(component, container, navigator, viewportCoords, spatial) { - var _this = _super.call(this, component, container, navigator, viewportCoords) || this; + var _this = _super.call(this, component, container, navigator) || this; _this._spatial = spatial; + _this._viewportCoords = viewportCoords; _this._basicRotationThreshold = 5e-2; _this._forceCoeff = 2e-1; return _this; @@ -25168,12 +27912,14 @@ var DragPanHandler = (function (_super) { .filtered$(this._component.name, this._container.mouseService.mouseDragStart$) .map(function (event) { return true; - }); + }) + .share(); var draggingStopped$ = this._container.mouseService .filtered$(this._component.name, this._container.mouseService.mouseDragEnd$) .map(function (event) { return false; - }); + }) + .share(); this._activeMouseSubscription = Observable_1.Observable .merge(draggingStarted$, draggingStopped$) .subscribe(this._container.mouseService.activate$); @@ -25199,7 +27945,7 @@ var DragPanHandler = (function (_super) { this._activeTouchSubscription = Observable_1.Observable .merge(touchMovingStarted$, touchMovingStopped$) .subscribe(this._container.touchService.activate$); - this._rotateBasicSubscription = this._navigator.stateService.currentState$ + var basicRotation$ = this._navigator.stateService.currentState$ .map(function (frame) { return frame.state.currentNode.fullPano || frame.state.nodesAhead < 1; }) @@ -25208,9 +27954,23 @@ var DragPanHandler = (function (_super) { if (!enable) { return Observable_1.Observable.empty(); } - var mouseDrag$ = Observable_1.Observable - .merge(_this._container.mouseService.filtered$(_this._component.name, _this._container.mouseService.mouseDragStart$), _this._container.mouseService.filtered$(_this._component.name, _this._container.mouseService.mouseDrag$), _this._container.mouseService.filtered$(_this._component.name, _this._container.mouseService.mouseDragEnd$) - .map(function (e) { return null; })) + var mouseDrag$ = _this._container.mouseService + .filtered$(_this._component.name, _this._container.mouseService.mouseDragStart$) + .switchMap(function (mouseDragStart) { + return Observable_1.Observable + .of(mouseDragStart) + .concat(_this._container.mouseService + .filtered$(_this._component.name, _this._container.mouseService.mouseDrag$)) + .merge(_this._container.mouseService + .filtered$(_this._component.name, _this._container.mouseService.mouseDragEnd$) + .map(function (e) { + return null; + })) + .takeWhile(function (e) { + return !!e; + }) + .startWith(null); + }) .pairwise() .filter(function (pair) { return pair[0] != null && pair[1] != null; @@ -25296,6 +28056,34 @@ var DragPanHandler = (function (_super) { x /= Math.max(1, coeff * pixelDistances[3]); } return [x, y]; + }) + .share(); + this._rotateBasicWithoutInertiaSubscription = basicRotation$ + .subscribe(function (basicRotation) { + _this._navigator.stateService.rotateBasicWithoutInertia(basicRotation); + }); + this._rotateBasicSubscription = basicRotation$ + .scan(function (rotationBuffer, rotation) { + _this._drainBuffer(rotationBuffer); + rotationBuffer.push([Date.now(), rotation]); + return rotationBuffer; + }, []) + .sample(Observable_1.Observable + .merge(this._container.mouseService.filtered$(this._component.name, this._container.mouseService.mouseDragEnd$), this._container.touchService.singleTouchDragEnd$)) + .map(function (rotationBuffer) { + var drainedBuffer = _this._drainBuffer(rotationBuffer.slice()); + var basicRotation = [0, 0]; + for (var _i = 0, drainedBuffer_1 = drainedBuffer; _i < drainedBuffer_1.length; _i++) { + var rotation = drainedBuffer_1[_i]; + basicRotation[0] += rotation[1][0]; + basicRotation[1] += rotation[1][1]; + } + var count = drainedBuffer.length; + if (count > 0) { + basicRotation[0] /= count; + basicRotation[1] /= count; + } + return basicRotation; }) .subscribe(function (basicRotation) { _this._navigator.stateService.rotateBasic(basicRotation); @@ -25306,21 +28094,30 @@ var DragPanHandler = (function (_super) { this._activeTouchSubscription.unsubscribe(); this._preventDefaultSubscription.unsubscribe(); this._rotateBasicSubscription.unsubscribe(); + this._rotateBasicWithoutInertiaSubscription.unsubscribe(); this._activeMouseSubscription = null; this._activeTouchSubscription = null; + this._preventDefaultSubscription = null; this._rotateBasicSubscription = null; }; DragPanHandler.prototype._getConfiguration = function (enable) { return { dragPan: enable }; }; + DragPanHandler.prototype._drainBuffer = function (buffer) { + var cutoff = 50; + var now = Date.now(); + while (buffer.length > 0 && now - buffer[0][0] > cutoff) { + buffer.shift(); + } + return buffer; + }; return DragPanHandler; -}(Component_1.MouseHandlerBase)); +}(Component_1.HandlerBase)); exports.DragPanHandler = DragPanHandler; exports.default = DragPanHandler; -},{"../../Component":226,"rxjs/Observable":29,"three":176}],271:[function(require,module,exports){ +},{"../../Component":290,"rxjs/Observable":29,"three":240}],340:[function(require,module,exports){ "use strict"; -/// var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || @@ -25332,29 +28129,32 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Observable_1 = require("rxjs/Observable"); -require("rxjs/add/observable/merge"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/withLatestFrom"); var Component_1 = require("../../Component"); var Geo_1 = require("../../Geo"); /** * @class MouseComponent * * @classdesc Component handling mouse and touch events for camera movement. + * + * To retrive and use the mouse component + * + * @example + * ``` + * var viewer = new Mapillary.Viewer( + * "", + * "", + * ""); + * + * var mouseComponent = viewer.getComponent("mouse"); + * ``` */ -var MouseComponent = (function (_super) { +var MouseComponent = /** @class */ (function (_super) { __extends(MouseComponent, _super); function MouseComponent(name, container, navigator) { var _this = _super.call(this, name, container, navigator) || this; - _this._basicDistanceThreshold = 1e-3; - _this._basicRotationThreshold = 5e-2; - _this._bounceCoeff = 1e-1; var spatial = new Geo_1.Spatial(); var viewportCoords = new Geo_1.ViewportCoords(); - _this._spatial = spatial; - _this._viewportCoords = viewportCoords; + _this._bounceHandler = new Component_1.BounceHandler(_this, container, navigator, viewportCoords, spatial); _this._doubleClickZoomHandler = new Component_1.DoubleClickZoomHandler(_this, container, navigator, viewportCoords); _this._dragPanHandler = new Component_1.DragPanHandler(_this, container, navigator, viewportCoords, spatial); _this._scrollZoomHandler = new Component_1.ScrollZoomHandler(_this, container, navigator, viewportCoords); @@ -25411,6 +28211,7 @@ var MouseComponent = (function (_super) { }); MouseComponent.prototype._activate = function () { var _this = this; + this._bounceHandler.enable(); this._configurationSubscription = this._configuration$ .subscribe(function (configuration) { if (configuration.doubleClickZoom) { @@ -25438,150 +28239,29 @@ var MouseComponent = (function (_super) { _this._touchZoomHandler.disable(); } }); - var inTransition$ = this._navigator.stateService.currentState$ - .map(function (frame) { - return frame.state.alpha < 1; - }); - this._bounceSubscription = Observable_1.Observable - .combineLatest(inTransition$, this._navigator.stateService.inTranslation$, this._container.mouseService.active$, this._container.touchService.active$) - .map(function (noForce) { - return noForce[0] || noForce[1] || noForce[2] || noForce[3]; - }) - .distinctUntilChanged() - .switchMap(function (noForce) { - return noForce ? - Observable_1.Observable.empty() : - Observable_1.Observable.combineLatest(_this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$.first()); - }) - .subscribe(function (args) { - var renderCamera = args[0]; - var perspectiveCamera = renderCamera.perspective; - var transform = args[1]; - if (!transform.hasValidScale && renderCamera.camera.focal < 0.1) { - return; - } - if (renderCamera.perspective.aspect === 0 || renderCamera.perspective.aspect === Number.POSITIVE_INFINITY) { - return; - } - var distanceThreshold = _this._basicDistanceThreshold / Math.pow(2, renderCamera.zoom); - var basicCenter = _this._viewportCoords.viewportToBasic(0, 0, transform, perspectiveCamera); - if (Math.abs(basicCenter[0] - 0.5) < distanceThreshold && Math.abs(basicCenter[1] - 0.5) < distanceThreshold) { - return; - } - var basicDistances = _this._viewportCoords.getBasicDistances(transform, perspectiveCamera); - var basicX = 0; - var basicY = 0; - if (basicDistances[0] < distanceThreshold && basicDistances[1] < distanceThreshold && - basicDistances[2] < distanceThreshold && basicDistances[3] < distanceThreshold) { - return; - } - if (Math.abs(basicDistances[0] - basicDistances[2]) < distanceThreshold && - Math.abs(basicDistances[1] - basicDistances[3]) < distanceThreshold) { - return; - } - var coeff = _this._bounceCoeff; - if (basicDistances[1] > 0 && basicDistances[3] === 0) { - basicX = -coeff * basicDistances[1]; - } - else if (basicDistances[1] === 0 && basicDistances[3] > 0) { - basicX = coeff * basicDistances[3]; - } - else if (basicDistances[1] > 0 && basicDistances[3] > 0) { - basicX = coeff * (basicDistances[3] - basicDistances[1]) / 2; - } - if (basicDistances[0] > 0 && basicDistances[2] === 0) { - basicY = coeff * basicDistances[0]; - } - else if (basicDistances[0] === 0 && basicDistances[2] > 0) { - basicY = -coeff * basicDistances[2]; - } - else if (basicDistances[0] > 0 && basicDistances[2] > 0) { - basicY = coeff * (basicDistances[0] - basicDistances[2]) / 2; - } - var rotationThreshold = _this._basicRotationThreshold; - basicX = _this._spatial.clamp(basicX, -rotationThreshold, rotationThreshold); - basicY = _this._spatial.clamp(basicY, -rotationThreshold, rotationThreshold); - _this._navigator.stateService.rotateBasicUnbounded([basicX, basicY]); - }); this._container.mouseService.claimMouse(this._name, 0); }; MouseComponent.prototype._deactivate = function () { this._container.mouseService.unclaimMouse(this._name); - this._bounceSubscription.unsubscribe(); this._configurationSubscription.unsubscribe(); + this._bounceHandler.disable(); this._doubleClickZoomHandler.disable(); this._dragPanHandler.disable(); this._scrollZoomHandler.disable(); this._touchZoomHandler.disable(); }; MouseComponent.prototype._getDefaultConfiguration = function () { - return { doubleClickZoom: true, dragPan: true, scrollZoom: true, touchZoom: true }; + return { doubleClickZoom: false, dragPan: true, scrollZoom: true, touchZoom: true }; }; + /** @inheritdoc */ + MouseComponent.componentName = "mouse"; return MouseComponent; }(Component_1.Component)); -/** @inheritdoc */ -MouseComponent.componentName = "mouse"; exports.MouseComponent = MouseComponent; Component_1.ComponentService.register(MouseComponent); exports.default = MouseComponent; -},{"../../Component":226,"../../Geo":229,"rxjs/Observable":29,"rxjs/add/observable/merge":44,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/withLatestFrom":83}],272:[function(require,module,exports){ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var MouseHandlerBase = (function () { - function MouseHandlerBase(component, container, navigator, viewportCoords) { - this._component = component; - this._container = container; - this._navigator = navigator; - this._viewportCoords = viewportCoords; - this._enabled = false; - } - Object.defineProperty(MouseHandlerBase.prototype, "isEnabled", { - /** - * Returns a Boolean indicating whether the interaction is enabled. - * - * @returns {boolean} `true` if the interaction is enabled. - */ - get: function () { - return this._enabled; - }, - enumerable: true, - configurable: true - }); - /** - * Enables the interaction. - * - * @example ```mouseComponent..enable();``` - */ - MouseHandlerBase.prototype.enable = function () { - if (this._enabled || !this._component.activated) { - return; - } - this._enable(); - this._enabled = true; - this._component.configure(this._getConfiguration(true)); - }; - /** - * Disables the interaction. - * - * @example ```mouseComponent..disable();``` - */ - MouseHandlerBase.prototype.disable = function () { - if (!this._enabled) { - return; - } - this._disable(); - this._enabled = false; - if (this._component.activated) { - this._component.configure(this._getConfiguration(false)); - } - }; - return MouseHandlerBase; -}()); -exports.MouseHandlerBase = MouseHandlerBase; -exports.default = MouseHandlerBase; - -},{}],273:[function(require,module,exports){ +},{"../../Component":290,"../../Geo":293}],341:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -25596,7 +28276,7 @@ var __extends = (this && this.__extends) || (function () { Object.defineProperty(exports, "__esModule", { value: true }); var Component_1 = require("../../Component"); /** - * The `ScrollZoomHandler` allows the user to zoom the viewer photo by scrolling. + * The `ScrollZoomHandler` allows the user to zoom the viewer image by scrolling. * * @example * ``` @@ -25608,19 +28288,22 @@ var Component_1 = require("../../Component"); * var isEnabled = mouseComponent.scrollZoom.isEnabled; * ``` */ -var ScrollZoomHandler = (function (_super) { +var ScrollZoomHandler = /** @class */ (function (_super) { __extends(ScrollZoomHandler, _super); - function ScrollZoomHandler() { - return _super !== null && _super.apply(this, arguments) || this; + function ScrollZoomHandler(component, container, navigator, viewportCoords) { + var _this = _super.call(this, component, container, navigator) || this; + _this._viewportCoords = viewportCoords; + return _this; } ScrollZoomHandler.prototype._enable = function () { var _this = this; + this._container.mouseService.claimWheel(this._component.name, 0); this._preventDefaultSubscription = this._container.mouseService.mouseWheel$ .subscribe(function (event) { event.preventDefault(); }); this._zoomSubscription = this._container.mouseService - .filtered$(this._component.name, this._container.mouseService.mouseWheel$) + .filteredWheel$(this._component.name, this._container.mouseService.mouseWheel$) .withLatestFrom(this._navigator.stateService.currentState$, function (w, f) { return [w, f]; }) @@ -25655,6 +28338,7 @@ var ScrollZoomHandler = (function (_super) { }); }; ScrollZoomHandler.prototype._disable = function () { + this._container.mouseService.unclaimWheel(this._component.name); this._preventDefaultSubscription.unsubscribe(); this._zoomSubscription.unsubscribe(); this._preventDefaultSubscription = null; @@ -25664,11 +28348,11 @@ var ScrollZoomHandler = (function (_super) { return { scrollZoom: enable }; }; return ScrollZoomHandler; -}(Component_1.MouseHandlerBase)); +}(Component_1.HandlerBase)); exports.ScrollZoomHandler = ScrollZoomHandler; exports.default = ScrollZoomHandler; -},{"../../Component":226}],274:[function(require,module,exports){ +},{"../../Component":290}],342:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -25685,7 +28369,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); var Observable_1 = require("rxjs/Observable"); var Component_1 = require("../../Component"); /** - * The `TouchZoomHandler` allows the user to zoom the viewer photo by pinching on a touchscreen. + * The `TouchZoomHandler` allows the user to zoom the viewer image by pinching on a touchscreen. * * @example * ``` @@ -25697,10 +28381,12 @@ var Component_1 = require("../../Component"); * var isEnabled = mouseComponent.touchZoom.isEnabled; * ``` */ -var TouchZoomHandler = (function (_super) { +var TouchZoomHandler = /** @class */ (function (_super) { __extends(TouchZoomHandler, _super); - function TouchZoomHandler() { - return _super !== null && _super.apply(this, arguments) || this; + function TouchZoomHandler(component, container, navigator, viewportCoords) { + var _this = _super.call(this, component, container, navigator) || this; + _this._viewportCoords = viewportCoords; + return _this; } TouchZoomHandler.prototype._enable = function () { var _this = this; @@ -25751,11 +28437,11 @@ var TouchZoomHandler = (function (_super) { return { touchZoom: enable }; }; return TouchZoomHandler; -}(Component_1.MouseHandlerBase)); +}(Component_1.HandlerBase)); exports.TouchZoomHandler = TouchZoomHandler; exports.default = TouchZoomHandler; -},{"../../Component":226,"rxjs/Observable":29}],275:[function(require,module,exports){ +},{"../../Component":290,"rxjs/Observable":29}],343:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Popup_1 = require("./popup/Popup"); @@ -25763,7 +28449,7 @@ exports.Popup = Popup_1.Popup; var PopupComponent_1 = require("./PopupComponent"); exports.PopupComponent = PopupComponent_1.PopupComponent; -},{"./PopupComponent":276,"./popup/Popup":277}],276:[function(require,module,exports){ +},{"./PopupComponent":344,"./popup/Popup":345}],344:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -25779,6 +28465,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); var Observable_1 = require("rxjs/Observable"); var Subject_1 = require("rxjs/Subject"); var Component_1 = require("../../Component"); +var Utils_1 = require("../../Utils"); /** * @class PopupComponent * @@ -25808,10 +28495,11 @@ var Component_1 = require("../../Component"); * var popupComponent = viewer.getComponent("popup"); * ``` */ -var PopupComponent = (function (_super) { +var PopupComponent = /** @class */ (function (_super) { __extends(PopupComponent, _super); - function PopupComponent(name, container, navigator) { + function PopupComponent(name, container, navigator, dom) { var _this = _super.call(this, name, container, navigator) || this; + _this._dom = !!dom ? dom : new Utils_1.DOM(); _this._popups = []; _this._added$ = new Subject_1.Subject(); _this._popups$ = new Subject_1.Subject(); @@ -25878,9 +28566,7 @@ var PopupComponent = (function (_super) { }; PopupComponent.prototype._activate = function () { var _this = this; - this._popupContainer = document.createElement("div"); - this._popupContainer.className = "mapillary-js-popup-container"; - this._container.element.appendChild(this._popupContainer); + this._popupContainer = this._dom.createElement("div", "mapillary-js-popup-container", this._container.element); for (var _i = 0, _a = this._popups; _i < _a.length; _i++) { var popup = _a[_i]; popup.setParentContainer(this._popupContainer); @@ -25940,19 +28626,20 @@ var PopupComponent = (function (_super) { removed.remove(); } }; + PopupComponent.componentName = "popup"; return PopupComponent; }(Component_1.Component)); -PopupComponent.componentName = "popup"; exports.PopupComponent = PopupComponent; Component_1.ComponentService.register(PopupComponent); exports.default = PopupComponent; -},{"../../Component":226,"rxjs/Observable":29,"rxjs/Subject":34}],277:[function(require,module,exports){ +},{"../../Component":290,"../../Utils":300,"rxjs/Observable":29,"rxjs/Subject":34}],345:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var Subject_1 = require("rxjs/Subject"); var Geo_1 = require("../../../Geo"); +var Utils_1 = require("../../../Utils"); var Viewer_1 = require("../../../Viewer"); /** * @class Popup @@ -26001,16 +28688,18 @@ var Viewer_1 = require("../../../Viewer"); * @description Implementation of API methods and API documentation inspired * by/used from https://github.com/mapbox/mapbox-gl-js/blob/v0.38.0/src/ui/popup.js */ -var Popup = (function () { - function Popup(options, viewportCoords) { +var Popup = /** @class */ (function () { + function Popup(options, viewportCoords, dom) { this._options = {}; if (!!options) { + this._options.capturePointer = options.capturePointer == null ? true : options.capturePointer; this._options.clean = options.clean; this._options.float = options.float; this._options.offset = options.offset; this._options.opacity = options.opacity; this._options.position = options.position; } + this._dom = !!dom ? dom : new Utils_1.DOM(); this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords(); this._notifyChanged$ = new Subject_1.Subject(); } @@ -26018,390 +28707,1287 @@ var Popup = (function () { /** * @ignore * - * @description Internal observable used by the component to - * render the popup when its position or content has changed. + * @description Internal observable used by the component to + * render the popup when its position or content has changed. + */ + get: function () { + return this._notifyChanged$; + }, + enumerable: true, + configurable: true + }); + /** + * @ignore + * + * @description Internal method used by the component to + * remove all references to the popup. + */ + Popup.prototype.remove = function () { + if (this._content && this._content.parentNode) { + this._content.parentNode.removeChild(this._content); + } + if (this._container) { + this._container.parentNode.removeChild(this._container); + delete this._container; + } + if (this._parentContainer) { + delete this._parentContainer; + } + }; + /** + * Sets a 2D basic image coordinates point to the popup's anchor, and + * moves the popup to it. + * + * @description Overwrites any previously set point or rect. + * + * @param {Array} basicPoint - Point in 2D basic image coordinates. + * + * @example + * ``` + * var popup = new Mapillary.PopupComponent.Popup(); + * popup.setText('hello image'); + * popup.setBasicPoint([0.3, 0.3]); + * + * popupComponent.add([popup]); + * ``` + */ + Popup.prototype.setBasicPoint = function (basicPoint) { + this._point = basicPoint.slice(); + this._rect = null; + this._notifyChanged$.next(this); + }; + /** + * Sets a 2D basic image coordinates rect to the popup's anchor, and + * moves the popup to it. + * + * @description Overwrites any previously set point or rect. + * + * @param {Array} basicRect - Rect in 2D basic image + * coordinates ([topLeftX, topLeftY, bottomRightX, bottomRightY]) . + * + * @example + * ``` + * var popup = new Mapillary.PopupComponent.Popup(); + * popup.setText('hello image'); + * popup.setBasicRect([0.3, 0.3, 0.5, 0.6]); + * + * popupComponent.add([popup]); + * ``` + */ + Popup.prototype.setBasicRect = function (basicRect) { + this._rect = basicRect.slice(); + this._point = null; + this._notifyChanged$.next(this); + }; + /** + * Sets the popup's content to the element provided as a DOM node. + * + * @param {Node} htmlNode - A DOM node to be used as content for the popup. + * + * @example + * ``` + * var div = document.createElement('div'); + * div.innerHTML = 'hello image'; + * + * var popup = new Mapillary.PopupComponent.Popup(); + * popup.setDOMContent(div); + * popup.setBasicPoint([0.3, 0.3]); + * + * popupComponent.add([popup]); + * ``` + */ + Popup.prototype.setDOMContent = function (htmlNode) { + if (this._content && this._content.parentNode) { + this._content.parentNode.removeChild(this._content); + } + var className = "mapillaryjs-popup-content" + + (this._options.clean === true ? "-clean" : "") + + (this._options.capturePointer === true ? " mapillaryjs-popup-capture-pointer" : ""); + this._content = this._dom.createElement("div", className, this._container); + this._content.appendChild(htmlNode); + this._notifyChanged$.next(this); + }; + /** + * Sets the popup's content to the HTML provided as a string. + * + * @description This method does not perform HTML filtering or sanitization, + * and must be used only with trusted content. Consider Popup#setText if the + * content is an untrusted text string. + * + * @param {string} html - A string representing HTML content for the popup. + * + * @example + * ``` + * var popup = new Mapillary.PopupComponent.Popup(); + * popup.setHTML('
hello image
'); + * popup.setBasicPoint([0.3, 0.3]); + * + * popupComponent.add([popup]); + * ``` + */ + Popup.prototype.setHTML = function (html) { + var frag = this._dom.document.createDocumentFragment(); + var temp = this._dom.createElement("body"); + var child; + temp.innerHTML = html; + while (true) { + child = temp.firstChild; + if (!child) { + break; + } + frag.appendChild(child); + } + this.setDOMContent(frag); + }; + /** + * Sets the popup's content to a string of text. + * + * @description This function creates a Text node in the DOM, so it cannot insert raw HTML. + * Use this method for security against XSS if the popup content is user-provided. + * + * @param {string} text - Textual content for the popup. + * + * @example + * ``` + * var popup = new Mapillary.PopupComponent.Popup(); + * popup.setText('hello image'); + * popup.setBasicPoint([0.3, 0.3]); + * + * popupComponent.add([popup]); + * ``` + */ + Popup.prototype.setText = function (text) { + this.setDOMContent(this._dom.document.createTextNode(text)); + }; + /** + * @ignore + * + * @description Internal method for attaching the popup to + * its parent container so that it is rendered in the DOM tree. + */ + Popup.prototype.setParentContainer = function (parentContainer) { + this._parentContainer = parentContainer; + }; + /** + * @ignore + * + * @description Internal method for updating the rendered + * position of the popup called by the popup component. + */ + Popup.prototype.update = function (renderCamera, size, transform) { + if (!this._parentContainer || !this._content) { + return; + } + if (!this._point && !this._rect) { + return; + } + if (!this._container) { + this._container = this._dom.createElement("div", "mapillaryjs-popup", this._parentContainer); + var showTip = this._options.clean !== true && + this._options.float !== Viewer_1.Alignment.Center; + if (showTip) { + var tipClassName = "mapillaryjs-popup-tip" + + (this._options.capturePointer === true ? " mapillaryjs-popup-capture-pointer" : ""); + this._tip = this._dom.createElement("div", tipClassName, this._container); + this._dom.createElement("div", "mapillaryjs-popup-tip-inner", this._tip); + } + this._container.appendChild(this._content); + this._parentContainer.appendChild(this._container); + if (this._options.opacity != null) { + this._container.style.opacity = this._options.opacity.toString(); + } + } + var pointPixel = null; + var position = this._alignmentToPopupAligment(this._options.position); + var float = this._alignmentToPopupAligment(this._options.float); + var classList = this._container.classList; + if (this._point != null) { + pointPixel = + this._viewportCoords.basicToCanvasSafe(this._point[0], this._point[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective); + } + else { + var alignments = ["center", "top", "bottom", "left", "right", "top-left", "top-right", "bottom-left", "bottom-right"]; + var appliedPosition = null; + for (var _i = 0, alignments_1 = alignments; _i < alignments_1.length; _i++) { + var alignment = alignments_1[_i]; + if (classList.contains("mapillaryjs-popup-float-" + alignment)) { + appliedPosition = alignment; + break; + } + } + _a = this._rectToPixel(this._rect, position, appliedPosition, renderCamera, size, transform), pointPixel = _a[0], position = _a[1]; + if (!float) { + float = position; + } + } + if (pointPixel == null) { + this._container.style.visibility = "hidden"; + return; + } + this._container.style.visibility = "visible"; + if (!float) { + var width = this._container.offsetWidth; + var height = this._container.offsetHeight; + var floats = this._pixelToFloats(pointPixel, size, width, height); + float = floats.length === 0 ? "top" : floats.join("-"); + } + var offset = this._normalizeOffset(this._options.offset); + pointPixel = [pointPixel[0] + offset[float][0], pointPixel[1] + offset[float][1]]; + pointPixel = [Math.round(pointPixel[0]), Math.round(pointPixel[1])]; + var floatTranslate = { + "bottom": "translate(-50%,0)", + "bottom-left": "translate(-100%,0)", + "bottom-right": "translate(0,0)", + "center": "translate(-50%,-50%)", + "left": "translate(-100%,-50%)", + "right": "translate(0,-50%)", + "top": "translate(-50%,-100%)", + "top-left": "translate(-100%,-100%)", + "top-right": "translate(0,-100%)", + }; + for (var key in floatTranslate) { + if (!floatTranslate.hasOwnProperty(key)) { + continue; + } + classList.remove("mapillaryjs-popup-float-" + key); + } + classList.add("mapillaryjs-popup-float-" + float); + this._container.style.transform = floatTranslate[float] + " translate(" + pointPixel[0] + "px," + pointPixel[1] + "px)"; + var _a; + }; + Popup.prototype._rectToPixel = function (rect, position, appliedPosition, renderCamera, size, transform) { + if (!position) { + var width = this._container.offsetWidth; + var height = this._container.offsetHeight; + var floatOffsets = { + "bottom": [0, height / 2], + "bottom-left": [-width / 2, height / 2], + "bottom-right": [width / 2, height / 2], + "left": [-width / 2, 0], + "right": [width / 2, 0], + "top": [0, -height / 2], + "top-left": [-width / 2, -height / 2], + "top-right": [width / 2, -height / 2], + }; + var automaticPositions = ["top", "bottom", "left", "right"]; + var largestVisibleArea = [0, null, null]; + for (var _i = 0, automaticPositions_1 = automaticPositions; _i < automaticPositions_1.length; _i++) { + var automaticPosition = automaticPositions_1[_i]; + var autoPointBasic = this._pointFromRectPosition(rect, automaticPosition); + var autoPointPixel = this._viewportCoords.basicToCanvasSafe(autoPointBasic[0], autoPointBasic[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective); + if (autoPointPixel == null) { + continue; + } + var floatOffset = floatOffsets[automaticPosition]; + var offsetedPosition = [autoPointPixel[0] + floatOffset[0], autoPointPixel[1] + floatOffset[1]]; + var staticCoeff = appliedPosition != null && appliedPosition === automaticPosition ? 1 : 0.7; + var floats = this._pixelToFloats(offsetedPosition, size, width / staticCoeff, height / (2 * staticCoeff)); + if (floats.length === 0 && + autoPointPixel[0] > 0 && + autoPointPixel[0] < size.width && + autoPointPixel[1] > 0 && + autoPointPixel[1] < size.height) { + return [autoPointPixel, automaticPosition]; + } + var minX = Math.max(offsetedPosition[0] - width / 2, 0); + var maxX = Math.min(offsetedPosition[0] + width / 2, size.width); + var minY = Math.max(offsetedPosition[1] - height / 2, 0); + var maxY = Math.min(offsetedPosition[1] + height / 2, size.height); + var visibleX = Math.max(0, maxX - minX); + var visibleY = Math.max(0, maxY - minY); + var visibleArea = staticCoeff * visibleX * visibleY; + if (visibleArea > largestVisibleArea[0]) { + largestVisibleArea[0] = visibleArea; + largestVisibleArea[1] = autoPointPixel; + largestVisibleArea[2] = automaticPosition; + } + } + if (largestVisibleArea[0] > 0) { + return [largestVisibleArea[1], largestVisibleArea[2]]; + } + } + var pointBasic = this._pointFromRectPosition(rect, position); + var pointPixel = this._viewportCoords.basicToCanvasSafe(pointBasic[0], pointBasic[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective); + return [pointPixel, position != null ? position : "top"]; + }; + Popup.prototype._alignmentToPopupAligment = function (float) { + switch (float) { + case Viewer_1.Alignment.Bottom: + return "bottom"; + case Viewer_1.Alignment.BottomLeft: + return "bottom-left"; + case Viewer_1.Alignment.BottomRight: + return "bottom-right"; + case Viewer_1.Alignment.Center: + return "center"; + case Viewer_1.Alignment.Left: + return "left"; + case Viewer_1.Alignment.Right: + return "right"; + case Viewer_1.Alignment.Top: + return "top"; + case Viewer_1.Alignment.TopLeft: + return "top-left"; + case Viewer_1.Alignment.TopRight: + return "top-right"; + default: + return null; + } + }; + Popup.prototype._normalizeOffset = function (offset) { + if (offset == null) { + return this._normalizeOffset(0); + } + if (typeof offset === "number") { + // input specifies a radius + var sideOffset = offset; + var sign = sideOffset >= 0 ? 1 : -1; + var cornerOffset = sign * Math.round(Math.sqrt(0.5 * Math.pow(sideOffset, 2))); + return { + "bottom": [0, sideOffset], + "bottom-left": [-cornerOffset, cornerOffset], + "bottom-right": [cornerOffset, cornerOffset], + "center": [0, 0], + "left": [-sideOffset, 0], + "right": [sideOffset, 0], + "top": [0, -sideOffset], + "top-left": [-cornerOffset, -cornerOffset], + "top-right": [cornerOffset, -cornerOffset], + }; + } + else { + // input specifes a value for each position + return { + "bottom": offset.bottom || [0, 0], + "bottom-left": offset.bottomLeft || [0, 0], + "bottom-right": offset.bottomRight || [0, 0], + "center": offset.center || [0, 0], + "left": offset.left || [0, 0], + "right": offset.right || [0, 0], + "top": offset.top || [0, 0], + "top-left": offset.topLeft || [0, 0], + "top-right": offset.topRight || [0, 0], + }; + } + }; + Popup.prototype._pixelToFloats = function (pointPixel, size, width, height) { + var floats = []; + if (pointPixel[1] < height) { + floats.push("bottom"); + } + else if (pointPixel[1] > size.height - height) { + floats.push("top"); + } + if (pointPixel[0] < width / 2) { + floats.push("right"); + } + else if (pointPixel[0] > size.width - width / 2) { + floats.push("left"); + } + return floats; + }; + Popup.prototype._pointFromRectPosition = function (rect, position) { + var x0 = rect[0]; + var x1 = rect[0] < rect[2] ? rect[2] : rect[2] + 1; + var y0 = rect[1]; + var y1 = rect[3]; + switch (position) { + case "bottom": + return [(x0 + x1) / 2, y1]; + case "bottom-left": + return [x0, y1]; + case "bottom-right": + return [x1, y1]; + case "center": + return [(x0 + x1) / 2, (y0 + y1) / 2]; + case "left": + return [x0, (y0 + y1) / 2]; + case "right": + return [x1, (y0 + y1) / 2]; + case "top": + return [(x0 + x1) / 2, y0]; + case "top-left": + return [x0, y0]; + case "top-right": + return [x1, y0]; + default: + return [(x0 + x1) / 2, y1]; + } + }; + return Popup; +}()); +exports.Popup = Popup; +exports.default = Popup; + +},{"../../../Geo":293,"../../../Utils":300,"../../../Viewer":301,"rxjs/Subject":34}],346:[function(require,module,exports){ +"use strict"; +/// +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("rxjs/Observable"); +var Subject_1 = require("rxjs/Subject"); +var Component_1 = require("../../Component"); +var Edge_1 = require("../../Edge"); +var Graph_1 = require("../../Graph"); +/** + * @class SequenceComponent + * @classdesc Component showing navigation arrows for sequence directions + * as well as playing button. Exposes an API to start and stop play. + */ +var SequenceComponent = /** @class */ (function (_super) { + __extends(SequenceComponent, _super); + function SequenceComponent(name, container, navigator, renderer, scheduler) { + var _this = _super.call(this, name, container, navigator) || this; + _this._sequenceDOMRenderer = !!renderer ? renderer : new Component_1.SequenceDOMRenderer(container); + _this._scheduler = scheduler; + _this._containerWidth$ = new Subject_1.Subject(); + _this._hoveredKeySubject$ = new Subject_1.Subject(); + _this._hoveredKey$ = _this._hoveredKeySubject$.share(); + _this._navigator.playService.playing$ + .skip(1) + .withLatestFrom(_this._configuration$) + .subscribe(function (_a) { + var playing = _a[0], configuration = _a[1]; + _this.fire(SequenceComponent.playingchanged, playing); + if (playing === configuration.playing) { + return; + } + if (playing) { + _this.play(); + } + else { + _this.stop(); + } + }); + _this._navigator.playService.direction$ + .skip(1) + .withLatestFrom(_this._configuration$) + .subscribe(function (_a) { + var direction = _a[0], configuration = _a[1]; + if (direction !== configuration.direction) { + _this.setDirection(direction); + } + }); + return _this; + } + Object.defineProperty(SequenceComponent.prototype, "hoveredKey$", { + /** + * Get hovered key observable. + * + * @description An observable emitting the key of the node for the direction + * arrow that is being hovered. When the mouse leaves a direction arrow null + * is emitted. + * + * @returns {Observable} */ get: function () { - return this._notifyChanged$; + return this._hoveredKey$; }, enumerable: true, configurable: true }); /** - * @ignore + * Start playing. * - * @description Internal method used by the component to - * remove all references to the popup. + * @fires PlayerComponent#playingchanged */ - Popup.prototype.remove = function () { - if (this._content && this._content.parentNode) { - this._content.parentNode.removeChild(this._content); - } - if (this._container) { - this._container.parentNode.removeChild(this._container); - delete this._container; - } - if (this._parentContainer) { - delete this._parentContainer; - } + SequenceComponent.prototype.play = function () { + this.configure({ playing: true }); }; /** - * Sets a 2D basic image coordinates point to the popup's anchor, and - * moves the popup to it. - * - * @description Overwrites any previously set point or rect. - * - * @param {Array} basicPoint - Point in 2D basic image coordinates. - * - * @example - * ``` - * var popup = new Mapillary.PopupComponent.Popup(); - * popup.setText('hello image'); - * popup.setBasicPoint([0.3, 0.3]); + * Stop playing. * - * popupComponent.add([popup]); - * ``` + * @fires PlayerComponent#playingchanged */ - Popup.prototype.setBasicPoint = function (basicPoint) { - this._point = basicPoint.slice(); - this._rect = null; - this._notifyChanged$.next(this); + SequenceComponent.prototype.stop = function () { + this.configure({ playing: false }); }; /** - * Sets a 2D basic image coordinates rect to the popup's anchor, and - * moves the popup to it. - * - * @description Overwrites any previously set point or rect. - * - * @param {Array} basicRect - Rect in 2D basic image - * coordinates ([topLeftX, topLeftY, bottomRightX, bottomRightY]) . - * - * @example - * ``` - * var popup = new Mapillary.PopupComponent.Popup(); - * popup.setText('hello image'); - * popup.setBasicRect([0.3, 0.3, 0.5, 0.6]); + * Set the direction to follow when playing. * - * popupComponent.add([popup]); - * ``` + * @param {EdgeDirection} direction - The direction that will be followed when playing. */ - Popup.prototype.setBasicRect = function (basicRect) { - this._rect = basicRect.slice(); - this._point = null; - this._notifyChanged$.next(this); + SequenceComponent.prototype.setDirection = function (direction) { + this.configure({ direction: direction }); }; /** - * Sets the popup's content to the element provided as a DOM node. - * - * @param {Node} htmlNode - A DOM node to be used as content for the popup. - * - * @example - * ``` - * var div = document.createElement('div'); - * div.innerHTML = 'hello image'; + * Set highlight key. * - * var popup = new Mapillary.PopupComponent.Popup(); - * popup.setDOMContent(div); - * popup.setBasicPoint([0.3, 0.3]); + * @description The arrow pointing towards the node corresponding to the + * highlight key will be highlighted. * - * popupComponent.add([popup]); - * ``` + * @param {string} highlightKey Key of node to be highlighted if existing. */ - Popup.prototype.setDOMContent = function (htmlNode) { - if (this._content && this._content.parentNode) { - this._content.parentNode.removeChild(this._content); - } - var className = "mapillaryjs-popup-content" + (this._options.clean === true ? "-clean" : ""); - this._content = this._createElement("div", className, this._container); - this._content.appendChild(htmlNode); - this._notifyChanged$.next(this); + SequenceComponent.prototype.setHighlightKey = function (highlightKey) { + this.configure({ highlightKey: highlightKey }); }; /** - * Sets the popup's content to the HTML provided as a string. - * - * @description This method does not perform HTML filtering or sanitization, - * and must be used only with trusted content. Consider Popup#setText if the - * content is an untrusted text string. + * Set max width of container element. * - * @param {string} html - A string representing HTML content for the popup. + * @description Set max width of the container element holding + * the sequence navigation elements. If the min width is larger than the + * max width the min width value will be used. * - * @example - * ``` - * var popup = new Mapillary.PopupComponent.Popup(); - * popup.setHTML('
hello image
'); - * popup.setBasicPoint([0.3, 0.3]); + * The container element is automatically resized when the resize + * method on the Viewer class is called. * - * popupComponent.add([popup]); - * ``` + * @param {number} minWidth */ - Popup.prototype.setHTML = function (html) { - var frag = document.createDocumentFragment(); - var temp = document.createElement("body"); - var child; - temp.innerHTML = html; - while (true) { - child = temp.firstChild; - if (!child) { - break; - } - frag.appendChild(child); - } - this.setDOMContent(frag); + SequenceComponent.prototype.setMaxWidth = function (maxWidth) { + this.configure({ maxWidth: maxWidth }); }; /** - * Sets the popup's content to a string of text. - * - * @description This function creates a Text node in the DOM, so it cannot insert raw HTML. - * Use this method for security against XSS if the popup content is user-provided. + * Set min width of container element. * - * @param {string} text - Textual content for the popup. + * @description Set min width of the container element holding + * the sequence navigation elements. If the min width is larger than the + * max width the min width value will be used. * - * @example - * ``` - * var popup = new Mapillary.PopupComponent.Popup(); - * popup.setText('hello image'); - * popup.setBasicPoint([0.3, 0.3]); + * The container element is automatically resized when the resize + * method on the Viewer class is called. * - * popupComponent.add([popup]); - * ``` + * @param {number} minWidth */ - Popup.prototype.setText = function (text) { - this.setDOMContent(document.createTextNode(text)); + SequenceComponent.prototype.setMinWidth = function (minWidth) { + this.configure({ minWidth: minWidth }); }; /** - * @ignore + * Set the value indicating whether the sequence UI elements should be visible. * - * @description Internal method for attaching the popup to - * its parent container so that it is rendered in the DOM tree. + * @param {boolean} visible */ - Popup.prototype.setParentContainer = function (parentContainer) { - this._parentContainer = parentContainer; + SequenceComponent.prototype.setVisible = function (visible) { + this.configure({ visible: visible }); + }; + /** @inheritdoc */ + SequenceComponent.prototype.resize = function () { + var _this = this; + this._configuration$ + .first() + .map(function (configuration) { + return _this._sequenceDOMRenderer.getContainerWidth(_this._container.element, configuration); + }) + .subscribe(function (containerWidth) { + _this._containerWidth$.next(containerWidth); + }); + }; + SequenceComponent.prototype._activate = function () { + var _this = this; + this._sequenceDOMRenderer.activate(); + var edgeStatus$ = this._navigator.stateService.currentNode$ + .switchMap(function (node) { + return node.sequenceEdges$; + }) + .publishReplay(1) + .refCount(); + var sequence$ = this._navigator.stateService.currentNode$ + .distinctUntilChanged(undefined, function (node) { + return node.sequenceKey; + }) + .switchMap(function (node) { + return Observable_1.Observable + .concat(Observable_1.Observable.of(null), _this._navigator.graphService.cacheSequence$(node.sequenceKey) + .retry(3) + .catch(function (e) { + console.error("Failed to cache sequence", e); + return Observable_1.Observable.of(null); + })); + }) + .startWith(null) + .publishReplay(1) + .refCount(); + this._sequenceSubscription = sequence$.subscribe(); + var rendererKey$ = this._sequenceDOMRenderer.index$ + .withLatestFrom(sequence$) + .map(function (_a) { + var index = _a[0], sequence = _a[1]; + return sequence != null ? sequence.keys[index] : null; + }) + .filter(function (key) { + return !!key; + }) + .distinctUntilChanged() + .publish() + .refCount(); + this._moveSubscription = Observable_1.Observable + .merge(rendererKey$.debounceTime(100, this._scheduler), rendererKey$.auditTime(400, this._scheduler)) + .distinctUntilChanged() + .switchMap(function (key) { + return _this._navigator.moveToKey$(key) + .catch(function (e) { + return Observable_1.Observable.empty(); + }); + }) + .subscribe(); + this._setSequenceGraphModeSubscription = this._sequenceDOMRenderer.changingPositionChanged$ + .filter(function (changing) { + return changing; + }) + .subscribe(function () { + _this._navigator.graphService.setGraphMode(Graph_1.GraphMode.Sequence); + }); + this._setSpatialGraphModeSubscription = this._sequenceDOMRenderer.changingPositionChanged$ + .filter(function (changing) { + return !changing; + }) + .subscribe(function () { + _this._navigator.graphService.setGraphMode(Graph_1.GraphMode.Spatial); + }); + this._navigator.graphService.graphMode$ + .switchMap(function (mode) { + return mode === Graph_1.GraphMode.Spatial ? + _this._navigator.stateService.currentNode$ + .take(2) : + Observable_1.Observable.empty(); + }) + .filter(function (node) { + return !node.spatialEdges.cached; + }) + .switchMap(function (node) { + return _this._navigator.graphService.cacheNode$(node.key) + .catch(function (e) { + return Observable_1.Observable.empty(); + }); + }) + .subscribe(); + this._stopSubscription = this._sequenceDOMRenderer.changingPositionChanged$ + .filter(function (changing) { + return changing; + }) + .subscribe(function () { + _this._navigator.playService.stop(); + }); + this._cacheSequenceNodesSubscription = Observable_1.Observable + .combineLatest(this._navigator.graphService.graphMode$, this._sequenceDOMRenderer.changingPositionChanged$ + .startWith(false) + .distinctUntilChanged()) + .withLatestFrom(this._navigator.stateService.currentNode$) + .switchMap(function (_a) { + var _b = _a[0], mode = _b[0], changing = _b[1], node = _a[1]; + return changing && mode === Graph_1.GraphMode.Sequence ? + _this._navigator.graphService.cacheSequenceNodes$(node.sequenceKey, node.key) + .retry(3) + .catch(function (error) { + console.error("Failed to cache sequence nodes.", error); + return Observable_1.Observable.empty(); + }) : + Observable_1.Observable.empty(); + }) + .subscribe(); + var position$ = sequence$ + .switchMap(function (sequence) { + if (!sequence) { + return Observable_1.Observable.of({ index: null, max: null }); + } + var firstCurrentKey = true; + return _this._sequenceDOMRenderer.changingPositionChanged$ + .startWith(false) + .distinctUntilChanged() + .switchMap(function (changingPosition) { + var skip = !changingPosition && firstCurrentKey ? 0 : 1; + firstCurrentKey = false; + return changingPosition ? + rendererKey$ : + _this._navigator.stateService.currentNode$ + .map(function (node) { + return node.key; + }) + .distinctUntilChanged() + .skip(skip); + }) + .map(function (key) { + var index = sequence.keys.indexOf(key); + if (index === -1) { + return { index: null, max: null }; + } + return { index: index, max: sequence.keys.length - 1 }; + }); + }); + this._renderSubscription = Observable_1.Observable + .combineLatest(edgeStatus$, this._configuration$, this._containerWidth$, this._sequenceDOMRenderer.changed$.startWith(this._sequenceDOMRenderer), this._navigator.playService.speed$, position$) + .map(function (_a) { + var edgeStatus = _a[0], configuration = _a[1], containerWidth = _a[2], renderer = _a[3], speed = _a[4], position = _a[5]; + var vNode = _this._sequenceDOMRenderer + .render(edgeStatus, configuration, containerWidth, speed, position.index, position.max, _this, _this._navigator); + return { name: _this._name, vnode: vNode }; + }) + .subscribe(this._container.domRenderer.render$); + this._setSpeedSubscription = this._sequenceDOMRenderer.speed$ + .subscribe(function (speed) { + _this._navigator.playService.setSpeed(speed); + }); + this._setDirectionSubscription = this._configuration$ + .map(function (configuration) { + return configuration.direction; + }) + .distinctUntilChanged() + .subscribe(function (direction) { + _this._navigator.playService.setDirection(direction); + }); + this._containerWidthSubscription = this._configuration$ + .distinctUntilChanged(function (value1, value2) { + return value1[0] === value2[0] && value1[1] === value2[1]; + }, function (configuration) { + return [configuration.minWidth, configuration.maxWidth]; + }) + .map(function (configuration) { + return _this._sequenceDOMRenderer.getContainerWidth(_this._container.element, configuration); + }) + .subscribe(this._containerWidth$); + this._playingSubscription = this._configuration$ + .map(function (configuration) { + return configuration.playing; + }) + .distinctUntilChanged() + .subscribe(function (playing) { + if (playing) { + _this._navigator.playService.play(); + } + else { + _this._navigator.playService.stop(); + } + }); + this._hoveredKeySubscription = this._sequenceDOMRenderer.mouseEnterDirection$ + .switchMap(function (direction) { + return edgeStatus$ + .map(function (edgeStatus) { + for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) { + var edge = _a[_i]; + if (edge.data.direction === direction) { + return edge.to; + } + } + return null; + }) + .takeUntil(_this._sequenceDOMRenderer.mouseLeaveDirection$) + .concat(Observable_1.Observable.of(null)); + }) + .distinctUntilChanged() + .subscribe(this._hoveredKeySubject$); + }; + SequenceComponent.prototype._deactivate = function () { + this._renderSubscription.unsubscribe(); + this._playingSubscription.unsubscribe(); + this._containerWidthSubscription.unsubscribe(); + this._hoveredKeySubscription.unsubscribe(); + this._setSpeedSubscription.unsubscribe(); + this._setDirectionSubscription.unsubscribe(); + this._setSequenceGraphModeSubscription.unsubscribe(); + this._setSpatialGraphModeSubscription.unsubscribe(); + this._sequenceSubscription.unsubscribe(); + this._moveSubscription.unsubscribe(); + this._cacheSequenceNodesSubscription.unsubscribe(); + this._stopSubscription.unsubscribe(); + this._sequenceDOMRenderer.deactivate(); + }; + SequenceComponent.prototype._getDefaultConfiguration = function () { + return { + direction: Edge_1.EdgeDirection.Next, + maxWidth: 108, + minWidth: 70, + playing: false, + visible: true, + }; }; + /** @inheritdoc */ + SequenceComponent.componentName = "sequence"; /** - * @ignore + * Event fired when playing starts or stops. * - * @description Internal method for updating the rendered - * position of the popup called by the popup component. + * @event PlayerComponent#playingchanged + * @type {boolean} Indicates whether the player is playing. */ - Popup.prototype.update = function (renderCamera, size, transform) { - if (!this._parentContainer || !this._content) { - return; - } - if (!this._point && !this._rect) { + SequenceComponent.playingchanged = "playingchanged"; + return SequenceComponent; +}(Component_1.Component)); +exports.SequenceComponent = SequenceComponent; +Component_1.ComponentService.register(SequenceComponent); +exports.default = SequenceComponent; + +},{"../../Component":290,"../../Edge":291,"../../Graph":294,"rxjs/Observable":29,"rxjs/Subject":34}],347:[function(require,module,exports){ +"use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); +var vd = require("virtual-dom"); +var Observable_1 = require("rxjs/Observable"); +var Subject_1 = require("rxjs/Subject"); +var Component_1 = require("../../Component"); +var Edge_1 = require("../../Edge"); +var Error_1 = require("../../Error"); +var SequenceDOMRenderer = /** @class */ (function () { + function SequenceDOMRenderer(container) { + this._container = container; + this._minThresholdWidth = 320; + this._maxThresholdWidth = 1480; + this._minThresholdHeight = 240; + this._maxThresholdHeight = 820; + this._stepperDefaultWidth = 108; + this._controlsDefaultWidth = 88; + this._defaultHeight = 30; + this._expandControls = false; + this._mode = Component_1.SequenceMode.Default; + this._speed = 0.5; + this._changingSpeed = false; + this._index = null; + this._changingPosition = false; + this._mouseEnterDirection$ = new Subject_1.Subject(); + this._mouseLeaveDirection$ = new Subject_1.Subject(); + this._notifyChanged$ = new Subject_1.Subject(); + this._notifyChangingPositionChanged$ = new Subject_1.Subject(); + this._notifySpeedChanged$ = new Subject_1.Subject(); + this._notifyIndexChanged$ = new Subject_1.Subject(); + } + Object.defineProperty(SequenceDOMRenderer.prototype, "changed$", { + get: function () { + return this._notifyChanged$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SequenceDOMRenderer.prototype, "changingPositionChanged$", { + get: function () { + return this._notifyChangingPositionChanged$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SequenceDOMRenderer.prototype, "speed$", { + get: function () { + return this._notifySpeedChanged$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SequenceDOMRenderer.prototype, "index$", { + get: function () { + return this._notifyIndexChanged$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SequenceDOMRenderer.prototype, "mouseEnterDirection$", { + get: function () { + return this._mouseEnterDirection$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SequenceDOMRenderer.prototype, "mouseLeaveDirection$", { + get: function () { + return this._mouseLeaveDirection$; + }, + enumerable: true, + configurable: true + }); + SequenceDOMRenderer.prototype.activate = function () { + var _this = this; + if (!!this._changingSubscription) { return; } - if (!this._container) { - this._container = this._createElement("div", "mapillaryjs-popup", this._parentContainer); - var showTip = this._options.clean !== true && - this._options.float !== Viewer_1.Alignment.Center; - if (showTip) { - this._tip = this._createElement("div", "mapillaryjs-popup-tip", this._container); - this._createElement("div", "mapillaryjs-popup-tip-inner", this._tip); - } - this._container.appendChild(this._content); - this._parentContainer.appendChild(this._container); - if (this._options.opacity != null) { - this._container.style.opacity = this._options.opacity.toString(); + this._changingSubscription = Observable_1.Observable + .merge(this._container.mouseService.documentMouseUp$, this._container.touchService.touchEnd$ + .filter(function (touchEvent) { + return touchEvent.touches.length === 0; + })) + .subscribe(function (event) { + if (_this._changingSpeed) { + _this._changingSpeed = false; } - } - var pointPixel = null; - var position = this._alignmentToPopupAligment(this._options.position); - var float = this._alignmentToPopupAligment(this._options.float); - if (this._point != null) { - pointPixel = - this._viewportCoords.basicToCanvasSafe(this._point[0], this._point[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective); - } - else { - _a = this._rectToPixel(this._rect, position, renderCamera, size, transform), pointPixel = _a[0], position = _a[1]; - if (!float) { - float = position; + if (_this._changingPosition) { + _this._setChangingPosition(false); } - } - if (pointPixel == null) { - this._container.style.visibility = "hidden"; + }); + }; + SequenceDOMRenderer.prototype.deactivate = function () { + if (!this._changingSubscription) { return; } - this._container.style.visibility = "visible"; - if (!float) { - var width = this._container.offsetWidth; - var height = this._container.offsetHeight; - var floats = this._pixelToFloats(pointPixel, size, width, height); - float = floats.length === 0 ? "bottom" : floats.join("-"); - } - if (!!this._options.offset) { - var offset = this._options.offset; - var sign = offset >= 0 ? 1 : -1; - var cornerOffset = sign * Math.round(Math.sqrt(0.5 * Math.pow(offset, 2))); - var floatOffset = { - "bottom": [0, offset], - "bottom-left": [-cornerOffset, cornerOffset], - "bottom-right": [cornerOffset, cornerOffset], - "center": [0, 0], - "left": [-offset, 0], - "right": [offset, 0], - "top": [0, -offset], - "top-left": [-cornerOffset, -cornerOffset], - "top-right": [cornerOffset, -cornerOffset], - }; - pointPixel = [pointPixel[0] + floatOffset[float][0], pointPixel[1] + floatOffset[float][1]]; + this._changingSpeed = false; + this._changingPosition = false; + this._expandControls = false; + this._mode = Component_1.SequenceMode.Default; + this._changingSubscription.unsubscribe(); + this._changingSubscription = null; + }; + SequenceDOMRenderer.prototype.render = function (edgeStatus, configuration, containerWidth, speed, index, max, component, navigator) { + if (configuration.visible === false) { + return vd.h("div.SequenceContainer", {}, []); } - pointPixel = [Math.round(pointPixel[0]), Math.round(pointPixel[1])]; - var floatTranslate = { - "bottom": "translate(-50%,0)", - "bottom-left": "translate(-100%,0)", - "bottom-right": "translate(0,0)", - "center": "translate(-50%,-50%)", - "left": "translate(-100%,-50%)", - "right": "translate(0,-50%)", - "top": "translate(-50%,-100%)", - "top-left": "translate(-100%,-100%)", - "top-right": "translate(0,-100%)", + var stepper = this._createStepper(edgeStatus, configuration, containerWidth, component, navigator); + var controls = this._createSequenceControls(containerWidth); + var playback = this._createPlaybackControls(containerWidth, speed, component, configuration); + var timeline = this._createTimelineControls(containerWidth, index, max); + return vd.h("div.SequenceContainer", [stepper, controls, playback, timeline]); + }; + SequenceDOMRenderer.prototype.getContainerWidth = function (element, configuration) { + var elementWidth = element.offsetWidth; + var elementHeight = element.offsetHeight; + var minWidth = configuration.minWidth; + var maxWidth = configuration.maxWidth; + if (maxWidth < minWidth) { + maxWidth = minWidth; + } + var relativeWidth = (elementWidth - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth); + var relativeHeight = (elementHeight - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight); + var coeff = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight))); + return minWidth + coeff * (maxWidth - minWidth); + }; + SequenceDOMRenderer.prototype._createPositionInput = function (index, max) { + var _this = this; + this._index = index; + var onPosition = function (e) { + _this._index = Number(e.target.value); + _this._notifyIndexChanged$.next(_this._index); }; - var classList = this._container.classList; - for (var key in floatTranslate) { - if (!floatTranslate.hasOwnProperty(key)) { - continue; + var boundingRect = this._container.domContainer.getBoundingClientRect(); + var width = Math.max(276, Math.min(410, 5 + 0.8 * boundingRect.width)) - 65; + var onStart = function (e) { + e.stopPropagation(); + _this._setChangingPosition(true); + }; + var onMove = function (e) { + if (_this._changingPosition === true) { + e.stopPropagation(); } - classList.remove("mapillaryjs-popup-float-" + key); + }; + var onKeyDown = function (e) { + if (e.key === "ArrowDown" || e.key === "ArrowLeft" || + e.key === "ArrowRight" || e.key === "ArrowUp") { + e.preventDefault(); + } + }; + var positionInputProperties = { + max: max != null ? max : 1, + min: 0, + onchange: onPosition, + oninput: onPosition, + onkeydown: onKeyDown, + onmousedown: onStart, + onmousemove: onMove, + ontouchmove: onMove, + ontouchstart: onStart, + style: { + width: width + "px", + }, + type: "range", + value: index != null ? index : 0, + }; + var disabled = index == null || max == null || max <= 1; + if (disabled) { + positionInputProperties.disabled = "true"; } - classList.add("mapillaryjs-popup-float-" + float); - this._container.style.transform = floatTranslate[float] + " translate(" + pointPixel[0] + "px," + pointPixel[1] + "px)"; - var _a; + var positionInput = vd.h("input.SequencePosition", positionInputProperties, []); + var positionContainerClass = disabled ? ".SequencePositionContainerDisabled" : ".SequencePositionContainer"; + return vd.h("div" + positionContainerClass, [positionInput]); }; - Popup.prototype._createElement = function (tagName, className, container) { - var element = document.createElement(tagName); - if (!!className) { - element.className = className; - } - if (!!container) { - container.appendChild(element); + SequenceDOMRenderer.prototype._createSpeedInput = function (speed) { + var _this = this; + this._speed = speed; + var onSpeed = function (e) { + _this._speed = Number(e.target.value) / 1000; + _this._notifySpeedChanged$.next(_this._speed); + }; + var boundingRect = this._container.domContainer.getBoundingClientRect(); + var width = Math.max(276, Math.min(410, 5 + 0.8 * boundingRect.width)) - 160; + var onStart = function (e) { + _this._changingSpeed = true; + e.stopPropagation(); + }; + var onMove = function (e) { + if (_this._changingSpeed === true) { + e.stopPropagation(); + } + }; + var onKeyDown = function (e) { + if (e.key === "ArrowDown" || e.key === "ArrowLeft" || + e.key === "ArrowRight" || e.key === "ArrowUp") { + e.preventDefault(); + } + }; + var speedInput = vd.h("input.SequenceSpeed", { + max: 1000, + min: 0, + onchange: onSpeed, + oninput: onSpeed, + onkeydown: onKeyDown, + onmousedown: onStart, + onmousemove: onMove, + ontouchmove: onMove, + ontouchstart: onStart, + style: { + width: width + "px", + }, + type: "range", + value: 1000 * speed, + }, []); + return vd.h("div.SequenceSpeedContainer", [speedInput]); + }; + SequenceDOMRenderer.prototype._createPlaybackControls = function (containerWidth, speed, component, configuration) { + var _this = this; + if (this._mode !== Component_1.SequenceMode.Playback) { + return vd.h("div.SequencePlayback", []); + } + var switchIcon = vd.h("div.SequenceSwitchIcon.SequenceIconVisible", []); + var direction = configuration.direction === Edge_1.EdgeDirection.Next ? + Edge_1.EdgeDirection.Prev : Edge_1.EdgeDirection.Next; + var playing = configuration.playing; + var switchButtonProperties = { + onclick: function () { + if (!playing) { + component.setDirection(direction); + } + }, + }; + var switchButtonClassName = configuration.playing ? ".SequenceSwitchButtonDisabled" : ".SequenceSwitchButton"; + var switchButton = vd.h("div" + switchButtonClassName, switchButtonProperties, [switchIcon]); + var slowIcon = vd.h("div.SequenceSlowIcon.SequenceIconVisible", []); + var slowContainer = vd.h("div.SequenceSlowContainer", [slowIcon]); + var fastIcon = vd.h("div.SequenceFastIcon.SequenceIconVisible", []); + var fastContainer = vd.h("div.SequenceFastContainer", [fastIcon]); + var closeIcon = vd.h("div.SequenceCloseIcon.SequenceIconVisible", []); + var closeButtonProperties = { + onclick: function () { + _this._mode = Component_1.SequenceMode.Default; + _this._notifyChanged$.next(_this); + }, + }; + var closeButton = vd.h("div.SequenceCloseButton", closeButtonProperties, [closeIcon]); + var speedInput = this._createSpeedInput(speed); + var playbackChildren = [switchButton, slowContainer, speedInput, fastContainer, closeButton]; + var top = Math.round(containerWidth / this._stepperDefaultWidth * this._defaultHeight + 10); + var playbackProperties = { style: { top: top + "px" } }; + return vd.h("div.SequencePlayback", playbackProperties, playbackChildren); + }; + SequenceDOMRenderer.prototype._createPlayingButton = function (nextKey, prevKey, configuration, component) { + var canPlay = configuration.direction === Edge_1.EdgeDirection.Next && nextKey != null || + configuration.direction === Edge_1.EdgeDirection.Prev && prevKey != null; + var onclick = configuration.playing ? + function (e) { component.stop(); } : + canPlay ? function (e) { component.play(); } : null; + var buttonProperties = { onclick: onclick }; + var iconClass = configuration.playing ? + "Stop" : + canPlay ? "Play" : "PlayDisabled"; + var iconProperties = { className: iconClass }; + if (configuration.direction === Edge_1.EdgeDirection.Prev) { + iconProperties.style = { + transform: "rotate(180deg) translate(50%, 50%)", + }; } - return element; + var icon = vd.h("div.SequenceComponentIcon", iconProperties, []); + var buttonClass = canPlay ? "SequencePlay" : "SequencePlayDisabled"; + return vd.h("div." + buttonClass, buttonProperties, [icon]); + }; + SequenceDOMRenderer.prototype._createSequenceControls = function (containerWidth) { + var _this = this; + var borderRadius = Math.round(8 / this._stepperDefaultWidth * containerWidth); + var expanderProperties = { + onclick: function () { + _this._expandControls = !_this._expandControls; + _this._mode = Component_1.SequenceMode.Default; + _this._notifyChanged$.next(_this); + }, + style: { + "border-bottom-right-radius": borderRadius + "px", + "border-top-right-radius": borderRadius + "px", + }, + }; + var expanderBar = vd.h("div.SequenceExpanderBar", []); + var expander = vd.h("div.SequenceExpanderButton", expanderProperties, [expanderBar]); + var fastIconClassName = this._mode === Component_1.SequenceMode.Playback ? + ".SequenceFastIconGrey.SequenceIconVisible" : ".SequenceFastIcon"; + var fastIcon = vd.h("div" + fastIconClassName, []); + var playbackProperties = { + onclick: function () { + _this._mode = _this._mode === Component_1.SequenceMode.Playback ? + Component_1.SequenceMode.Default : + Component_1.SequenceMode.Playback; + _this._notifyChanged$.next(_this); + }, + }; + var playback = vd.h("div.SequencePlaybackButton", playbackProperties, [fastIcon]); + var timelineIconClassName = this._mode === Component_1.SequenceMode.Timeline ? + ".SequenceTimelineIconGrey.SequenceIconVisible" : ".SequenceTimelineIcon"; + var timelineIcon = vd.h("div" + timelineIconClassName, []); + var timelineProperties = { + onclick: function () { + _this._mode = _this._mode === Component_1.SequenceMode.Timeline ? + Component_1.SequenceMode.Default : + Component_1.SequenceMode.Timeline; + _this._notifyChanged$.next(_this); + }, + }; + var timeline = vd.h("div.SequenceTimelineButton", timelineProperties, [timelineIcon]); + var properties = { + style: { + height: (this._defaultHeight / this._stepperDefaultWidth * containerWidth) + "px", + transform: "translate(" + (containerWidth / 2 + 2) + "px, 0)", + width: (this._controlsDefaultWidth / this._stepperDefaultWidth * containerWidth) + "px", + }, + }; + var className = ".SequenceControls" + + (this._expandControls ? ".SequenceControlsExpanded" : ""); + return vd.h("div" + className, properties, [playback, timeline, expander]); + }; + SequenceDOMRenderer.prototype._createSequenceArrows = function (nextKey, prevKey, containerWidth, configuration, navigator) { + var _this = this; + var nextProperties = { + onclick: nextKey != null ? + function (e) { + navigator.moveDir$(Edge_1.EdgeDirection.Next) + .subscribe(undefined, function (error) { + if (!(error instanceof Error_1.AbortMapillaryError)) { + console.error(error); + } + }); + } : + null, + onmouseenter: function (e) { _this._mouseEnterDirection$.next(Edge_1.EdgeDirection.Next); }, + onmouseleave: function (e) { _this._mouseLeaveDirection$.next(Edge_1.EdgeDirection.Next); }, + }; + var borderRadius = Math.round(8 / this._stepperDefaultWidth * containerWidth); + var prevProperties = { + onclick: prevKey != null ? + function (e) { + navigator.moveDir$(Edge_1.EdgeDirection.Prev) + .subscribe(undefined, function (error) { + if (!(error instanceof Error_1.AbortMapillaryError)) { + console.error(error); + } + }); + } : + null, + onmouseenter: function (e) { _this._mouseEnterDirection$.next(Edge_1.EdgeDirection.Prev); }, + onmouseleave: function (e) { _this._mouseLeaveDirection$.next(Edge_1.EdgeDirection.Prev); }, + style: { + "border-bottom-left-radius": borderRadius + "px", + "border-top-left-radius": borderRadius + "px", + }, + }; + var nextClass = this._getStepClassName(Edge_1.EdgeDirection.Next, nextKey, configuration.highlightKey); + var prevClass = this._getStepClassName(Edge_1.EdgeDirection.Prev, prevKey, configuration.highlightKey); + var nextIcon = vd.h("div.SequenceComponentIcon", []); + var prevIcon = vd.h("div.SequenceComponentIcon", []); + return [ + vd.h("div." + prevClass, prevProperties, [prevIcon]), + vd.h("div." + nextClass, nextProperties, [nextIcon]), + ]; }; - Popup.prototype._rectToPixel = function (rect, position, renderCamera, size, transform) { - if (!position) { - var width = this._container.offsetWidth; - var height = this._container.offsetHeight; - var floatOffsets = { - "bottom": [0, height / 2], - "bottom-left": [-width / 2, height / 2], - "bottom-right": [width / 2, height / 2], - "left": [-width / 2, 0], - "right": [width / 2, 0], - "top": [0, -height / 2], - "top-left": [-width / 2, -height / 2], - "top-right": [width / 2, -height / 2], - }; - var automaticPositions = ["bottom", "top", "left", "right"]; - var largestVisibleArea = [0, null, null]; - for (var _i = 0, automaticPositions_1 = automaticPositions; _i < automaticPositions_1.length; _i++) { - var automaticPosition = automaticPositions_1[_i]; - var pointBasic_1 = this._pointFromRectPosition(rect, automaticPosition); - var pointPixel = this._viewportCoords.basicToCanvasSafe(pointBasic_1[0], pointBasic_1[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective); - if (pointPixel == null) { - continue; - } - var floatOffset = floatOffsets[automaticPosition]; - var offsetedPosition = [pointPixel[0] + floatOffset[0], pointPixel[1] + floatOffset[1]]; - var floats = this._pixelToFloats(offsetedPosition, size, width, height / 2); - if (floats.length === 0 && - pointPixel[0] > 0 && - pointPixel[0] < size.width && - pointPixel[1] > 0 && - pointPixel[1] < size.height) { - return [pointPixel, automaticPosition]; - } - var minX = Math.max(offsetedPosition[0] - width / 2, 0); - var maxX = Math.min(offsetedPosition[0] + width / 2, size.width); - var minY = Math.max(offsetedPosition[1] - height / 2, 0); - var maxY = Math.min(offsetedPosition[1] + height / 2, size.height); - var visibleX = Math.max(0, maxX - minX); - var visibleY = Math.max(0, maxY - minY); - var visibleArea = visibleX * visibleY; - if (visibleArea > largestVisibleArea[0]) { - largestVisibleArea[0] = visibleArea; - largestVisibleArea[1] = pointPixel; - largestVisibleArea[2] = automaticPosition; - } + SequenceDOMRenderer.prototype._createStepper = function (edgeStatus, configuration, containerWidth, component, navigator) { + var nextKey = null; + var prevKey = null; + for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) { + var edge = _a[_i]; + if (edge.data.direction === Edge_1.EdgeDirection.Next) { + nextKey = edge.to; } - if (largestVisibleArea[0] > 0) { - return [largestVisibleArea[1], largestVisibleArea[2]]; + if (edge.data.direction === Edge_1.EdgeDirection.Prev) { + prevKey = edge.to; } } - var pointBasic = this._pointFromRectPosition(rect, position); - var pointCanvas = this._viewportCoords.basicToCanvasSafe(pointBasic[0], pointBasic[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective); - return [pointCanvas, position != null ? position : "bottom"]; + var playingButton = this._createPlayingButton(nextKey, prevKey, configuration, component); + var buttons = this._createSequenceArrows(nextKey, prevKey, containerWidth, configuration, navigator); + buttons.splice(1, 0, playingButton); + var containerProperties = { + oncontextmenu: function (event) { event.preventDefault(); }, + style: { + height: (this._defaultHeight / this._stepperDefaultWidth * containerWidth) + "px", + width: containerWidth + "px", + }, + }; + return vd.h("div.SequenceStepper", containerProperties, buttons); }; - Popup.prototype._alignmentToPopupAligment = function (float) { - switch (float) { - case Viewer_1.Alignment.Bottom: - return "bottom"; - case Viewer_1.Alignment.BottomLeft: - return "bottom-left"; - case Viewer_1.Alignment.BottomRight: - return "bottom-right"; - case Viewer_1.Alignment.Center: - return "center"; - case Viewer_1.Alignment.Left: - return "left"; - case Viewer_1.Alignment.Right: - return "right"; - case Viewer_1.Alignment.Top: - return "top"; - case Viewer_1.Alignment.TopLeft: - return "top-left"; - case Viewer_1.Alignment.TopRight: - return "top-right"; - default: - return null; - } + SequenceDOMRenderer.prototype._createTimelineControls = function (containerWidth, index, max) { + var _this = this; + if (this._mode !== Component_1.SequenceMode.Timeline) { + return vd.h("div.SequenceTimeline", []); + } + var positionInput = this._createPositionInput(index, max); + var closeIcon = vd.h("div.SequenceCloseIcon.SequenceIconVisible", []); + var closeButtonProperties = { + onclick: function () { + _this._mode = Component_1.SequenceMode.Default; + _this._notifyChanged$.next(_this); + }, + }; + var closeButton = vd.h("div.SequenceCloseButton", closeButtonProperties, [closeIcon]); + var top = Math.round(containerWidth / this._stepperDefaultWidth * this._defaultHeight + 10); + var playbackProperties = { style: { top: top + "px" } }; + return vd.h("div.SequenceTimeline", playbackProperties, [positionInput, closeButton]); }; - Popup.prototype._pixelToFloats = function (pointPixel, size, width, height) { - var floats = []; - if (pointPixel[1] < height) { - floats.push("bottom"); - } - else if (pointPixel[1] > size.height - height) { - floats.push("top"); - } - if (pointPixel[0] < width / 2) { - floats.push("right"); + SequenceDOMRenderer.prototype._getStepClassName = function (direction, key, highlightKey) { + var className = direction === Edge_1.EdgeDirection.Next ? + "SequenceStepNext" : + "SequenceStepPrev"; + if (key == null) { + className += "Disabled"; } - else if (pointPixel[0] > size.width - width / 2) { - floats.push("left"); + else { + if (highlightKey === key) { + className += "Highlight"; + } } - return floats; + return className; }; - Popup.prototype._pointFromRectPosition = function (rect, position) { - switch (position) { - case "bottom": - return [(rect[0] + rect[2]) / 2, rect[3]]; - case "bottom-left": - return [rect[0], rect[3]]; - case "bottom-right": - return [rect[2], rect[3]]; - case "center": - return [(rect[0] + rect[2]) / 2, (rect[1] + rect[3]) / 2]; - case "left": - return [rect[0], (rect[1] + rect[3]) / 2]; - case "right": - return [rect[2], (rect[1] + rect[3]) / 2]; - case "top": - return [(rect[0] + rect[2]) / 2, rect[1]]; - case "top-left": - return [rect[0], rect[1]]; - case "top-right": - return [rect[2], rect[1]]; - default: - return [(rect[0] + rect[2]) / 2, rect[3]]; - } + SequenceDOMRenderer.prototype._setChangingPosition = function (value) { + this._changingPosition = value; + this._notifyChangingPositionChanged$.next(value); }; - return Popup; + return SequenceDOMRenderer; }()); -exports.Popup = Popup; -exports.default = Popup; +exports.SequenceDOMRenderer = SequenceDOMRenderer; +exports.default = SequenceDOMRenderer; -},{"../../../Geo":229,"../../../Viewer":236,"rxjs/Subject":34}],278:[function(require,module,exports){ +},{"../../Component":290,"../../Edge":291,"../../Error":292,"rxjs/Observable":29,"rxjs/Subject":34,"virtual-dom":246}],348:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var SequenceMode; +(function (SequenceMode) { + SequenceMode[SequenceMode["Default"] = 0] = "Default"; + SequenceMode[SequenceMode["Playback"] = 1] = "Playback"; + SequenceMode[SequenceMode["Timeline"] = 2] = "Timeline"; +})(SequenceMode = exports.SequenceMode || (exports.SequenceMode = {})); +exports.default = SequenceMode; + +},{}],349:[function(require,module,exports){ +"use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); + +var path = require("path"); +var Shaders = /** @class */ (function () { + function Shaders() { + } + Shaders.equirectangular = { + fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n vec3 b = normalize(vRstq.xyz);\n float lat = -asin(b.y);\n float lon = atan(b.x, b.z);\n float x = (lon - phiShift) / phiLength + 0.5;\n float y = (lat - thetaShift) / thetaLength + 0.5;\n vec4 baseColor = texture2D(projectorTex, vec2(x, y));\n baseColor.a = opacity;\n gl_FragColor = baseColor;\n}", + vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n vRstq = projectorMat * vec4(position, 1.0);\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}", + }; + Shaders.equirectangularCurtain = { + fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float curtain;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n vec3 b = normalize(vRstq.xyz);\n float lat = -asin(b.y);\n float lon = atan(b.x, b.z);\n float x = (lon - phiShift) / phiLength + 0.5;\n float y = (lat - thetaShift) / thetaLength + 0.5;\n\n bool inverted = curtain < 0.5;\n\n float curtainMin = inverted ? curtain + 0.5 : curtain - 0.5;\n float curtainMax = curtain;\n\n bool insideCurtain = inverted ?\n x > curtainMin || x < curtainMax :\n x > curtainMin && x < curtainMax;\n\n vec4 baseColor;\n if (insideCurtain) {\n baseColor = texture2D(projectorTex, vec2(x, y));\n baseColor.a = opacity;\n } else {\n baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n }\n\n gl_FragColor = baseColor;\n}", + vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n vRstq = projectorMat * vec4(position, 1.0);\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}", + }; + Shaders.perspective = { + fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform vec4 bbox;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n float x = vRstq.x / vRstq.w;\n float y = vRstq.y / vRstq.w;\n\n vec4 baseColor = texture2D(projectorTex, vec2(x, y));\n baseColor.a = opacity;\n\n gl_FragColor = baseColor;\n}", + vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n vRstq = projectorMat * vec4(position, 1.0);\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}", + }; + Shaders.perspectiveCurtain = { + fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n float x = vRstq.x / vRstq.w;\n float y = vRstq.y / vRstq.w;\n\n vec4 baseColor;\n if (x < curtain || curtain >= 1.0) {\n baseColor = texture2D(projectorTex, vec2(x, y));\n baseColor.a = opacity;\n } else {\n baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n }\n\n gl_FragColor = baseColor;\n}\n", + vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n vRstq = projectorMat * vec4(position, 1.0);\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}", + }; + return Shaders; +}()); +exports.Shaders = Shaders; + +},{"path":22}],350:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -26417,488 +30003,1180 @@ var __extends = (this && this.__extends) || (function () { Object.defineProperty(exports, "__esModule", { value: true }); var Observable_1 = require("rxjs/Observable"); var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/observable/combineLatest"); -require("rxjs/add/observable/of"); -require("rxjs/add/operator/bufferCount"); -require("rxjs/add/operator/concat"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/finally"); -require("rxjs/add/operator/first"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/publishReplay"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/share"); -require("rxjs/add/operator/switchMap"); -require("rxjs/add/operator/takeUntil"); -require("rxjs/add/operator/withLatestFrom"); var Component_1 = require("../../Component"); -var Edge_1 = require("../../Edge"); +var Geo_1 = require("../../Geo"); +var State_1 = require("../../State"); +var Render_1 = require("../../Render"); +var Tiles_1 = require("../../Tiles"); +var Utils_1 = require("../../Utils"); /** - * @class SequenceComponent - * @classdesc Component showing navigation arrows for sequence directions - * as well as playing button. Exposes an API to start and stop play. + * @class SliderComponent + * + * @classdesc Component for comparing pairs of images. Renders + * a slider for adjusting the curtain of the first image. + * + * Deactivate the sequence, direction and image plane + * components when activating the slider component to avoid + * interfering UI elements. + * + * To retrive and use the marker component + * + * @example + * ``` + * var viewer = new Mapillary.Viewer( + * "", + * "", + * ""); + * + * viewer.deactivateComponent("imagePlane"); + * viewer.deactivateComponent("direction"); + * viewer.deactivateComponent("sequence"); + * + * viewer.activateComponent("slider"); + * + * var sliderComponent = viewer.getComponent("marker"); + * ``` */ -var SequenceComponent = (function (_super) { - __extends(SequenceComponent, _super); - function SequenceComponent(name, container, navigator) { +var SliderComponent = /** @class */ (function (_super) { + __extends(SliderComponent, _super); + function SliderComponent(name, container, navigator, viewportCoords) { var _this = _super.call(this, name, container, navigator) || this; - _this._nodesAhead = 5; - _this._configurationOperation$ = new Subject_1.Subject(); - _this._sequenceDOMRenderer = new Component_1.SequenceDOMRenderer(container.element); - _this._sequenceDOMInteraction = new Component_1.SequenceDOMInteraction(); - _this._containerWidth$ = new Subject_1.Subject(); - _this._hoveredKeySubject$ = new Subject_1.Subject(); - _this._hoveredKey$ = _this._hoveredKeySubject$.share(); - _this._edgeStatus$ = _this._navigator.stateService.currentNode$ - .switchMap(function (node) { - return node.sequenceEdges$; + _this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords(); + _this._domRenderer = new Component_1.SliderDOMRenderer(container); + _this._imageTileLoader = new Tiles_1.ImageTileLoader(Utils_1.Urls.tileScheme, Utils_1.Urls.tileDomain, Utils_1.Urls.origin); + _this._roiCalculator = new Tiles_1.RegionOfInterestCalculator(); + _this._spatial = new Geo_1.Spatial(); + _this._glRendererOperation$ = new Subject_1.Subject(); + _this._glRendererCreator$ = new Subject_1.Subject(); + _this._glRendererDisposer$ = new Subject_1.Subject(); + _this._glRenderer$ = _this._glRendererOperation$ + .scan(function (glRenderer, operation) { + return operation(glRenderer); + }, null) + .filter(function (glRenderer) { + return glRenderer != null; }) - .publishReplay(1) - .refCount(); + .distinctUntilChanged(undefined, function (glRenderer) { + return glRenderer.frameId; + }); + _this._glRendererCreator$ + .map(function () { + return function (glRenderer) { + if (glRenderer != null) { + throw new Error("Multiple slider states can not be created at the same time"); + } + return new Component_1.SliderGLRenderer(); + }; + }) + .subscribe(_this._glRendererOperation$); + _this._glRendererDisposer$ + .map(function () { + return function (glRenderer) { + glRenderer.dispose(); + return null; + }; + }) + .subscribe(_this._glRendererOperation$); return _this; } - Object.defineProperty(SequenceComponent.prototype, "hoveredKey$", { - /** - * Get hovered key observable. - * - * @description An observable emitting the key of the node for the direction - * arrow that is being hovered. When the mouse leaves a direction arrow null - * is emitted. - * - * @returns {Observable} - */ - get: function () { - return this._hoveredKey$; - }, - enumerable: true, - configurable: true - }); - /** - * Start playing. - * - * @fires PlayerComponent#playingchanged - */ - SequenceComponent.prototype.play = function () { - this.configure({ playing: true }); - }; - /** - * Stop playing. - * - * @fires PlayerComponent#playingchanged - */ - SequenceComponent.prototype.stop = function () { - this.configure({ playing: false }); - }; - /** - * Set the direction to follow when playing. - * - * @param {EdgeDirection} direction - The direction that will be followed when playing. - */ - SequenceComponent.prototype.setDirection = function (direction) { - this.configure({ direction: direction }); - }; /** - * Set highlight key. + * Set the initial position. * - * @description The arrow pointing towards the node corresponding to the - * highlight key will be highlighted. + * @description Configures the intial position of the slider. + * The inital position value will be used when the component + * is activated. * - * @param {string} highlightKey Key of node to be highlighted if existing. + * @param {number} initialPosition - Initial slider position. */ - SequenceComponent.prototype.setHighlightKey = function (highlightKey) { - this.configure({ highlightKey: highlightKey }); + SliderComponent.prototype.setInitialPosition = function (initialPosition) { + this.configure({ initialPosition: initialPosition }); }; /** - * Set max width of container element. - * - * @description Set max width of the container element holding - * the sequence navigation elements. If the min width is larger than the - * max width the min width value will be used. + * Set the image keys. * - * The container element is automatically resized when the resize - * method on the Viewer class is called. + * @description Configures the component to show the image + * planes for the supplied image keys. * - * @param {number} minWidth + * @param {ISliderKeys} keys - Slider keys object specifying + * the images to be shown in the foreground and the background. */ - SequenceComponent.prototype.setMaxWidth = function (maxWidth) { - this.configure({ maxWidth: maxWidth }); + SliderComponent.prototype.setKeys = function (keys) { + this.configure({ keys: keys }); }; /** - * Set min width of container element. - * - * @description Set min width of the container element holding - * the sequence navigation elements. If the min width is larger than the - * max width the min width value will be used. + * Set the slider mode. * - * The container element is automatically resized when the resize - * method on the Viewer class is called. + * @description Configures the mode for transitions between + * image pairs. * - * @param {number} minWidth + * @param {SliderMode} mode - Slider mode to be set. */ - SequenceComponent.prototype.setMinWidth = function (minWidth) { - this.configure({ minWidth: minWidth }); + SliderComponent.prototype.setSliderMode = function (mode) { + this.configure({ mode: mode }); }; /** - * Set the value indicating whether the sequence UI elements should be visible. + * Set the value controlling if the slider is visible. * - * @param {boolean} visible + * @param {boolean} sliderVisible - Value indicating if + * the slider should be visible or not. */ - SequenceComponent.prototype.setVisible = function (visible) { - this.configure({ visible: visible }); + SliderComponent.prototype.setSliderVisible = function (sliderVisible) { + this.configure({ sliderVisible: sliderVisible }); }; - /** @inheritdoc */ - SequenceComponent.prototype.resize = function () { + SliderComponent.prototype._activate = function () { var _this = this; - this._configuration$ + this._modeSubcription = this._domRenderer.mode$ + .subscribe(function (mode) { + _this.setSliderMode(mode); + }); + this._glRenderSubscription = this._glRenderer$ + .map(function (glRenderer) { + var renderHash = { + name: _this._name, + render: { + frameId: glRenderer.frameId, + needsRender: glRenderer.needsRender, + render: glRenderer.render.bind(glRenderer), + stage: Render_1.GLRenderStage.Background, + }, + }; + return renderHash; + }) + .subscribe(this._container.glRenderer.render$); + var position$ = this.configuration$ + .map(function (configuration) { + return configuration.initialPosition != null ? + configuration.initialPosition : 1; + }) .first() + .concat(this._domRenderer.position$); + var mode$ = this.configuration$ .map(function (configuration) { - return _this._sequenceDOMRenderer.getContainerWidth(_this._container.element, configuration); + return configuration.mode; }) - .subscribe(function (containerWidth) { - _this._containerWidth$.next(containerWidth); + .distinctUntilChanged(); + var motionless$ = this._navigator.stateService.currentState$ + .map(function (frame) { + return frame.state.motionless; + }) + .distinctUntilChanged(); + var fullPano$ = this._navigator.stateService.currentState$ + .map(function (frame) { + return frame.state.currentNode.fullPano; + }) + .distinctUntilChanged(); + var sliderVisible$ = Observable_1.Observable + .combineLatest(this._configuration$ + .map(function (configuration) { + return configuration.sliderVisible; + }), this._navigator.stateService.currentState$ + .map(function (frame) { + return !(frame.state.currentNode == null || + frame.state.previousNode == null || + (frame.state.currentNode.pano && !frame.state.currentNode.fullPano) || + (frame.state.previousNode.pano && !frame.state.previousNode.fullPano) || + (frame.state.currentNode.fullPano && !frame.state.previousNode.fullPano)); + }) + .distinctUntilChanged()) + .map(function (_a) { + var sliderVisible = _a[0], enabledState = _a[1]; + return sliderVisible && enabledState; + }) + .distinctUntilChanged(); + this._waitSubscription = Observable_1.Observable + .combineLatest(mode$, motionless$, fullPano$, sliderVisible$) + .withLatestFrom(this._navigator.stateService.state$) + .subscribe(function (_a) { + var _b = _a[0], mode = _b[0], motionless = _b[1], fullPano = _b[2], sliderVisible = _b[3], state = _a[1]; + var interactive = sliderVisible && + (motionless || mode === Component_1.SliderMode.Stationary || fullPano); + if (interactive && state !== State_1.State.WaitingInteractively) { + _this._navigator.stateService.waitInteractively(); + } + else if (!interactive && state !== State_1.State.Waiting) { + _this._navigator.stateService.wait(); + } + }); + this._moveSubscription = Observable_1.Observable + .combineLatest(position$, mode$, motionless$, fullPano$, sliderVisible$) + .subscribe(function (_a) { + var position = _a[0], mode = _a[1], motionless = _a[2], fullPano = _a[3], sliderVisible = _a[4]; + if (motionless || mode === Component_1.SliderMode.Stationary || fullPano) { + _this._navigator.stateService.moveTo(1); + } + else { + _this._navigator.stateService.moveTo(position); + } + }); + this._domRenderSubscription = Observable_1.Observable + .combineLatest(position$, mode$, motionless$, fullPano$, sliderVisible$, this._container.renderService.size$) + .map(function (_a) { + var position = _a[0], mode = _a[1], motionless = _a[2], fullPano = _a[3], sliderVisible = _a[4], size = _a[5]; + return { + name: _this._name, + vnode: _this._domRenderer.render(position, mode, motionless, fullPano, sliderVisible), + }; + }) + .subscribe(this._container.domRenderer.render$); + this._glRendererCreator$.next(null); + this._updateCurtainSubscription = Observable_1.Observable + .combineLatest(position$, fullPano$, sliderVisible$, this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$) + .map(function (_a) { + var position = _a[0], fullPano = _a[1], visible = _a[2], render = _a[3], transform = _a[4]; + if (!fullPano) { + return visible ? position : 1; + } + var basicMin = _this._viewportCoords.viewportToBasic(-1.15, 0, transform, render.perspective); + var basicMax = _this._viewportCoords.viewportToBasic(1.15, 0, transform, render.perspective); + var shiftedMax = basicMax[0] < basicMin[0] ? basicMax[0] + 1 : basicMax[0]; + var basicPosition = basicMin[0] + position * (shiftedMax - basicMin[0]); + return basicPosition > 1 ? basicPosition - 1 : basicPosition; + }) + .map(function (position) { + return function (glRenderer) { + glRenderer.updateCurtain(position); + return glRenderer; + }; + }) + .subscribe(this._glRendererOperation$); + this._stateSubscription = Observable_1.Observable + .combineLatest(this._navigator.stateService.currentState$, mode$) + .map(function (_a) { + var frame = _a[0], mode = _a[1]; + return function (glRenderer) { + glRenderer.update(frame, mode); + return glRenderer; + }; + }) + .subscribe(this._glRendererOperation$); + this._setKeysSubscription = this._configuration$ + .filter(function (configuration) { + return configuration.keys != null; + }) + .switchMap(function (configuration) { + return Observable_1.Observable + .zip(_this._catchCacheNode$(configuration.keys.background), _this._catchCacheNode$(configuration.keys.foreground)) + .map(function (nodes) { + return { background: nodes[0], foreground: nodes[1] }; + }) + .zip(_this._navigator.stateService.currentState$.first()) + .map(function (nf) { + return { nodes: nf[0], state: nf[1].state }; + }); + }) + .subscribe(function (co) { + if (co.state.currentNode != null && + co.state.previousNode != null && + co.state.currentNode.key === co.nodes.foreground.key && + co.state.previousNode.key === co.nodes.background.key) { + return; + } + if (co.state.currentNode.key === co.nodes.background.key) { + _this._navigator.stateService.setNodes([co.nodes.foreground]); + return; + } + if (co.state.currentNode.key === co.nodes.foreground.key && + co.state.trajectory.length === 1) { + _this._navigator.stateService.prependNodes([co.nodes.background]); + return; + } + _this._navigator.stateService.setNodes([co.nodes.background]); + _this._navigator.stateService.setNodes([co.nodes.foreground]); + }, function (e) { + console.error(e); + }); + var previousNode$ = this._navigator.stateService.currentState$ + .map(function (frame) { + return frame.state.previousNode; + }) + .filter(function (node) { + return node != null; + }) + .distinctUntilChanged(undefined, function (node) { + return node.key; + }); + var textureProvider$ = this._navigator.stateService.currentState$ + .distinctUntilChanged(undefined, function (frame) { + return frame.state.currentNode.key; + }) + .withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$) + .map(function (_a) { + var frame = _a[0], renderer = _a[1], size = _a[2]; + var state = frame.state; + var viewportSize = Math.max(size.width, size.height); + var currentNode = state.currentNode; + var currentTransform = state.currentTransform; + var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512; + return new Tiles_1.TextureProvider(currentNode.key, currentTransform.basicWidth, currentTransform.basicHeight, tileSize, currentNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer); + }) + .publishReplay(1) + .refCount(); + this._textureProviderSubscription = textureProvider$.subscribe(function () { }); + this._setTextureProviderSubscription = textureProvider$ + .map(function (provider) { + return function (renderer) { + renderer.setTextureProvider(provider.key, provider); + return renderer; + }; + }) + .subscribe(this._glRendererOperation$); + this._setTileSizeSubscription = this._container.renderService.size$ + .switchMap(function (size) { + return Observable_1.Observable + .combineLatest(textureProvider$, Observable_1.Observable.of(size)) + .first(); + }) + .subscribe(function (_a) { + var provider = _a[0], size = _a[1]; + var viewportSize = Math.max(size.width, size.height); + var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512; + provider.setTileSize(tileSize); + }); + this._abortTextureProviderSubscription = textureProvider$ + .pairwise() + .subscribe(function (pair) { + var previous = pair[0]; + previous.abort(); + }); + var roiTrigger$ = Observable_1.Observable + .combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.debounceTime(250)) + .map(function (_a) { + var camera = _a[0], size = _a[1]; + return [ + camera.camera.position.clone(), + camera.camera.lookat.clone(), + camera.zoom.valueOf(), + size.height.valueOf(), + size.width.valueOf() + ]; + }) + .pairwise() + .skipWhile(function (pls) { + return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0; + }) + .map(function (pls) { + var samePosition = pls[0][0].equals(pls[1][0]); + var sameLookat = pls[0][1].equals(pls[1][1]); + var sameZoom = pls[0][2] === pls[1][2]; + var sameHeight = pls[0][3] === pls[1][3]; + var sameWidth = pls[0][4] === pls[1][4]; + return samePosition && sameLookat && sameZoom && sameHeight && sameWidth; + }) + .distinctUntilChanged() + .filter(function (stalled) { + return stalled; + }) + .switchMap(function (stalled) { + return _this._container.renderService.renderCameraFrame$ + .first(); + }) + .withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$); + this._setRegionOfInterestSubscription = textureProvider$ + .switchMap(function (provider) { + return roiTrigger$ + .map(function (_a) { + var camera = _a[0], size = _a[1], transform = _a[2]; + return [ + _this._roiCalculator.computeRegionOfInterest(camera, size, transform), + provider, + ]; + }); + }) + .filter(function (args) { + return !args[1].disposed; + }) + .subscribe(function (args) { + var roi = args[0]; + var provider = args[1]; + provider.setRegionOfInterest(roi); + }); + var hasTexture$ = textureProvider$ + .switchMap(function (provider) { + return provider.hasTexture$; + }) + .startWith(false) + .publishReplay(1) + .refCount(); + this._hasTextureSubscription = hasTexture$.subscribe(function () { }); + var nodeImage$ = this._navigator.stateService.currentState$ + .filter(function (frame) { + return frame.state.nodesAhead === 0; + }) + .map(function (frame) { + return frame.state.currentNode; + }) + .distinctUntilChanged(undefined, function (node) { + return node.key; + }) + .debounceTime(1000) + .withLatestFrom(hasTexture$) + .filter(function (args) { + return !args[1]; + }) + .map(function (args) { + return args[0]; + }) + .filter(function (node) { + return node.pano ? + Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize : + Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize; + }) + .switchMap(function (node) { + var baseImageSize = node.pano ? + Utils_1.Settings.basePanoramaSize : + Utils_1.Settings.baseImageSize; + if (Math.max(node.image.width, node.image.height) > baseImageSize) { + return Observable_1.Observable.empty(); + } + var image$ = node + .cacheImage$(Utils_1.Settings.maxImageSize) + .map(function (n) { + return [n.image, n]; + }); + return image$ + .takeUntil(hasTexture$ + .filter(function (hasTexture) { + return hasTexture; + })) + .catch(function (error, caught) { + console.error("Failed to fetch high res image (" + node.key + ")", error); + return Observable_1.Observable.empty(); + }); + }) + .publish() + .refCount(); + this._updateBackgroundSubscription = nodeImage$ + .withLatestFrom(textureProvider$) + .subscribe(function (args) { + if (args[0][1].key !== args[1].key || + args[1].disposed) { + return; + } + args[1].updateBackground(args[0][0]); }); - }; - SequenceComponent.prototype._activate = function () { - var _this = this; - this._renderSubscription = Observable_1.Observable - .combineLatest(this._edgeStatus$, this._configuration$, this._containerWidth$) - .map(function (ec) { - var edgeStatus = ec[0]; - var configuration = ec[1]; - var containerWidth = ec[2]; - var vNode = _this._sequenceDOMRenderer - .render(edgeStatus, configuration, containerWidth, _this, _this._sequenceDOMInteraction, _this._navigator); - return { name: _this._name, vnode: vNode }; + this._updateTextureImageSubscription = nodeImage$ + .map(function (imn) { + return function (renderer) { + renderer.updateTextureImage(imn[0], imn[1]); + return renderer; + }; }) - .subscribe(this._container.domRenderer.render$); - this._containerWidthSubscription = this._configuration$ - .distinctUntilChanged(function (value1, value2) { - return value1[0] === value2[0] && value1[1] === value2[1]; - }, function (configuration) { - return [configuration.minWidth, configuration.maxWidth]; + .subscribe(this._glRendererOperation$); + var textureProviderPrev$ = this._navigator.stateService.currentState$ + .filter(function (frame) { + return !!frame.state.previousNode; }) - .map(function (configuration) { - return _this._sequenceDOMRenderer.getContainerWidth(_this._container.element, configuration); + .distinctUntilChanged(undefined, function (frame) { + return frame.state.previousNode.key; }) - .subscribe(this._containerWidth$); - this._configurationSubscription = this._configurationOperation$ - .scan(function (configuration, operation) { - return operation(configuration); - }, { playing: false }) - .finally(function () { - if (_this._playingSubscription != null) { - _this._navigator.stateService.cutNodes(); - _this._stop(); - } + .withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$) + .map(function (_a) { + var frame = _a[0], renderer = _a[1], size = _a[2]; + var state = frame.state; + var viewportSize = Math.max(size.width, size.height); + var previousNode = state.previousNode; + var previousTransform = state.previousTransform; + var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512; + return new Tiles_1.TextureProvider(previousNode.key, previousTransform.basicWidth, previousTransform.basicHeight, tileSize, previousNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer); }) - .subscribe(function () { }); - this._configuration$ - .map(function (newConfiguration) { - return function (configuration) { - if (newConfiguration.playing !== configuration.playing) { - _this._navigator.stateService.cutNodes(); - if (newConfiguration.playing) { - _this._play(); - } - else { - _this._stop(); - } - } - configuration.playing = newConfiguration.playing; - return configuration; + .publishReplay(1) + .refCount(); + this._textureProviderSubscriptionPrev = textureProviderPrev$.subscribe(function () { }); + this._setTextureProviderSubscriptionPrev = textureProviderPrev$ + .map(function (provider) { + return function (renderer) { + renderer.setTextureProviderPrev(provider.key, provider); + return renderer; }; }) - .subscribe(this._configurationOperation$); - this._stopSubscription = this._configuration$ - .switchMap(function (configuration) { - var edgeStatus$ = configuration.playing ? - _this._edgeStatus$ : - Observable_1.Observable.empty(); - var edgeDirection$ = Observable_1.Observable - .of(configuration.direction); + .subscribe(this._glRendererOperation$); + this._setTileSizeSubscriptionPrev = this._container.renderService.size$ + .switchMap(function (size) { return Observable_1.Observable - .combineLatest(edgeStatus$, edgeDirection$); + .combineLatest(textureProviderPrev$, Observable_1.Observable.of(size)) + .first(); }) - .map(function (ne) { - var edgeStatus = ne[0]; - var direction = ne[1]; - if (!edgeStatus.cached) { - return true; - } - for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) { - var edge = _a[_i]; - if (edge.data.direction === direction) { - return true; - } - } - return false; + .subscribe(function (_a) { + var provider = _a[0], size = _a[1]; + var viewportSize = Math.max(size.width, size.height); + var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512; + provider.setTileSize(tileSize); + }); + this._abortTextureProviderSubscriptionPrev = textureProviderPrev$ + .pairwise() + .subscribe(function (pair) { + var previous = pair[0]; + previous.abort(); + }); + var roiTriggerPrev$ = Observable_1.Observable + .combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.debounceTime(250)) + .map(function (_a) { + var camera = _a[0], size = _a[1]; + return [ + camera.camera.position.clone(), + camera.camera.lookat.clone(), + camera.zoom.valueOf(), + size.height.valueOf(), + size.width.valueOf() + ]; }) - .filter(function (hasEdge) { - return !hasEdge; + .pairwise() + .skipWhile(function (pls) { + return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0; }) - .map(function (hasEdge) { - return { playing: false }; + .map(function (pls) { + var samePosition = pls[0][0].equals(pls[1][0]); + var sameLookat = pls[0][1].equals(pls[1][1]); + var sameZoom = pls[0][2] === pls[1][2]; + var sameHeight = pls[0][3] === pls[1][3]; + var sameWidth = pls[0][4] === pls[1][4]; + return samePosition && sameLookat && sameZoom && sameHeight && sameWidth; }) - .subscribe(this._configurationSubject$); - this._hoveredKeySubscription = this._sequenceDOMInteraction.mouseEnterDirection$ - .switchMap(function (direction) { - return _this._edgeStatus$ - .map(function (edgeStatus) { - for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) { - var edge = _a[_i]; - if (edge.data.direction === direction) { - return edge.to; - } + .distinctUntilChanged() + .filter(function (stalled) { + return stalled; + }) + .switchMap(function (stalled) { + return _this._container.renderService.renderCameraFrame$ + .first(); + }) + .withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$); + this._setRegionOfInterestSubscriptionPrev = textureProviderPrev$ + .switchMap(function (provider) { + return roiTriggerPrev$ + .map(function (_a) { + var camera = _a[0], size = _a[1], transform = _a[2]; + return [ + _this._roiCalculator.computeRegionOfInterest(camera, size, transform), + provider, + ]; + }); + }) + .filter(function (args) { + return !args[1].disposed; + }) + .withLatestFrom(this._navigator.stateService.currentState$) + .subscribe(function (_a) { + var _b = _a[0], roi = _b[0], provider = _b[1], frame = _a[1]; + var shiftedRoi = null; + if (frame.state.previousNode.fullPano) { + if (frame.state.currentNode.fullPano) { + var currentViewingDirection = _this._spatial.viewingDirection(frame.state.currentNode.rotation); + var previousViewingDirection = _this._spatial.viewingDirection(frame.state.previousNode.rotation); + var directionDiff = _this._spatial.angleBetweenVector2(currentViewingDirection.x, currentViewingDirection.y, previousViewingDirection.x, previousViewingDirection.y); + var shift = directionDiff / (2 * Math.PI); + var bbox = { + maxX: _this._spatial.wrap(roi.bbox.maxX + shift, 0, 1), + maxY: roi.bbox.maxY, + minX: _this._spatial.wrap(roi.bbox.minX + shift, 0, 1), + minY: roi.bbox.minY, + }; + shiftedRoi = { + bbox: bbox, + pixelHeight: roi.pixelHeight, + pixelWidth: roi.pixelWidth, + }; } - return null; - }) - .takeUntil(_this._sequenceDOMInteraction.mouseLeaveDirection$) - .concat(Observable_1.Observable.of(null)); + else { + var currentViewingDirection = _this._spatial.viewingDirection(frame.state.currentNode.rotation); + var previousViewingDirection = _this._spatial.viewingDirection(frame.state.previousNode.rotation); + var directionDiff = _this._spatial.angleBetweenVector2(currentViewingDirection.x, currentViewingDirection.y, previousViewingDirection.x, previousViewingDirection.y); + var shiftX = directionDiff / (2 * Math.PI); + var a1 = _this._spatial.angleToPlane(currentViewingDirection.toArray(), [0, 0, 1]); + var a2 = _this._spatial.angleToPlane(previousViewingDirection.toArray(), [0, 0, 1]); + var shiftY = (a2 - a1) / (2 * Math.PI); + var currentTransform = frame.state.currentTransform; + var size = Math.max(currentTransform.basicWidth, currentTransform.basicHeight); + var hFov = size > 0 ? + 2 * Math.atan(0.5 * currentTransform.basicWidth / (size * currentTransform.focal)) : + Math.PI / 3; + var vFov = size > 0 ? + 2 * Math.atan(0.5 * currentTransform.basicHeight / (size * currentTransform.focal)) : + Math.PI / 3; + var spanningWidth = hFov / (2 * Math.PI); + var spanningHeight = vFov / Math.PI; + var basicWidth = (roi.bbox.maxX - roi.bbox.minX) * spanningWidth; + var basicHeight = (roi.bbox.maxY - roi.bbox.minY) * spanningHeight; + var pixelWidth = roi.pixelWidth * spanningWidth; + var pixelHeight = roi.pixelHeight * spanningHeight; + var zoomShiftX = (roi.bbox.minX + roi.bbox.maxX) / 2 - 0.5; + var zoomShiftY = (roi.bbox.minY + roi.bbox.maxY) / 2 - 0.5; + var minX = 0.5 + shiftX + spanningWidth * zoomShiftX - basicWidth / 2; + var maxX = 0.5 + shiftX + spanningWidth * zoomShiftX + basicWidth / 2; + var minY = 0.5 + shiftY + spanningHeight * zoomShiftY - basicHeight / 2; + var maxY = 0.5 + shiftY + spanningHeight * zoomShiftY + basicHeight / 2; + var bbox = { + maxX: _this._spatial.wrap(maxX, 0, 1), + maxY: maxY, + minX: _this._spatial.wrap(minX, 0, 1), + minY: minY, + }; + shiftedRoi = { + bbox: bbox, + pixelHeight: pixelHeight, + pixelWidth: pixelWidth, + }; + } + } + else { + var currentBasicAspect = frame.state.currentTransform.basicAspect; + var previousBasicAspect = frame.state.previousTransform.basicAspect; + var _c = _this._getBasicCorners(currentBasicAspect, previousBasicAspect), _d = _c[0], cornerMinX = _d[0], cornerMinY = _d[1], _e = _c[1], cornerMaxX = _e[0], cornerMaxY = _e[1]; + var basicWidth = cornerMaxX - cornerMinX; + var basicHeight = cornerMaxY - cornerMinY; + var pixelWidth = roi.pixelWidth / basicWidth; + var pixelHeight = roi.pixelHeight / basicHeight; + var minX = (basicWidth - 1) / (2 * basicWidth) + roi.bbox.minX / basicWidth; + var maxX = (basicWidth - 1) / (2 * basicWidth) + roi.bbox.maxX / basicWidth; + var minY = (basicHeight - 1) / (2 * basicHeight) + roi.bbox.minY / basicHeight; + var maxY = (basicHeight - 1) / (2 * basicHeight) + roi.bbox.maxY / basicHeight; + var bbox = { + maxX: maxX, + maxY: maxY, + minX: minX, + minY: minY, + }; + _this._clipBoundingBox(bbox); + shiftedRoi = { + bbox: bbox, + pixelHeight: pixelHeight, + pixelWidth: pixelWidth, + }; + } + provider.setRegionOfInterest(shiftedRoi); + }); + var hasTexturePrev$ = textureProviderPrev$ + .switchMap(function (provider) { + return provider.hasTexture$; }) - .distinctUntilChanged() - .subscribe(this._hoveredKeySubject$); - }; - SequenceComponent.prototype._deactivate = function () { - this._stopSubscription.unsubscribe(); - this._renderSubscription.unsubscribe(); - this._configurationSubscription.unsubscribe(); - this._containerWidthSubscription.unsubscribe(); - this._hoveredKeySubscription.unsubscribe(); - this.stop(); - }; - SequenceComponent.prototype._getDefaultConfiguration = function () { - return { - direction: Edge_1.EdgeDirection.Next, - maxWidth: 117, - minWidth: 70, - playing: false, - visible: true, - }; - }; - SequenceComponent.prototype._play = function () { - var _this = this; - this._playingSubscription = this._navigator.stateService.currentState$ + .startWith(false) + .publishReplay(1) + .refCount(); + this._hasTextureSubscriptionPrev = hasTexturePrev$.subscribe(function () { }); + var nodeImagePrev$ = this._navigator.stateService.currentState$ .filter(function (frame) { - return frame.state.nodesAhead < _this._nodesAhead; + return frame.state.nodesAhead === 0 && !!frame.state.previousNode; }) .map(function (frame) { - return frame.state.lastNode; + return frame.state.previousNode; }) - .distinctUntilChanged(undefined, function (lastNode) { - return lastNode.key; + .distinctUntilChanged(undefined, function (node) { + return node.key; }) - .withLatestFrom(this._configuration$, function (lastNode, configuration) { - return [lastNode, configuration.direction]; + .debounceTime(1000) + .withLatestFrom(hasTexturePrev$) + .filter(function (args) { + return !args[1]; }) - .switchMap(function (nd) { - return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(nd[1]) > -1 ? - nd[0].sequenceEdges$ : - nd[0].spatialEdges$) - .filter(function (status) { - return status.cached; - }) - .zip(Observable_1.Observable.of(nd[1]), function (status, direction) { - return [status, direction]; - }); + .map(function (args) { + return args[0]; }) - .map(function (ed) { - var direction = ed[1]; - for (var _i = 0, _a = ed[0].edges; _i < _a.length; _i++) { - var edge = _a[_i]; - if (edge.data.direction === direction) { - return edge.to; - } - } - return null; + .filter(function (node) { + return node.pano ? + Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize : + Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize; }) - .filter(function (key) { - return key != null; + .switchMap(function (node) { + var baseImageSize = node.pano ? + Utils_1.Settings.basePanoramaSize : + Utils_1.Settings.baseImageSize; + if (Math.max(node.image.width, node.image.height) > baseImageSize) { + return Observable_1.Observable.empty(); + } + var image$ = node + .cacheImage$(Utils_1.Settings.maxImageSize) + .map(function (n) { + return [n.image, n]; + }); + return image$ + .takeUntil(hasTexturePrev$ + .filter(function (hasTexture) { + return hasTexture; + })) + .catch(function (error, caught) { + console.error("Failed to fetch high res image (" + node.key + ")", error); + return Observable_1.Observable.empty(); + }); }) - .switchMap(function (key) { - return _this._navigator.graphService.cacheNode$(key); + .publish() + .refCount(); + this._updateBackgroundSubscriptionPrev = nodeImagePrev$ + .withLatestFrom(textureProviderPrev$) + .subscribe(function (args) { + if (args[0][1].key !== args[1].key || + args[1].disposed) { + return; + } + args[1].updateBackground(args[0][0]); + }); + this._updateTextureImageSubscriptionPrev = nodeImagePrev$ + .map(function (imn) { + return function (renderer) { + renderer.updateTextureImage(imn[0], imn[1]); + return renderer; + }; }) - .subscribe(function (node) { - _this._navigator.stateService.appendNodes([node]); - }, function (error) { - console.error(error); - _this.stop(); + .subscribe(this._glRendererOperation$); + }; + SliderComponent.prototype._deactivate = function () { + var _this = this; + this._waitSubscription.unsubscribe(); + this._navigator.stateService.state$ + .first() + .subscribe(function (state) { + if (state !== State_1.State.Traversing) { + _this._navigator.stateService.traverse(); + } }); - this._clearSubscription = this._navigator.stateService.currentNode$ - .bufferCount(1, 7) - .subscribe(function (nodes) { - _this._navigator.stateService.clearPriorNodes(); + this._glRendererDisposer$.next(null); + this._domRenderer.deactivate(); + this._modeSubcription.unsubscribe(); + this._setKeysSubscription.unsubscribe(); + this._stateSubscription.unsubscribe(); + this._glRenderSubscription.unsubscribe(); + this._domRenderSubscription.unsubscribe(); + this._moveSubscription.unsubscribe(); + this.configure({ keys: null }); + }; + SliderComponent.prototype._getDefaultConfiguration = function () { + return { + initialPosition: 1, + mode: Component_1.SliderMode.Motion, + sliderVisible: true, + }; + }; + SliderComponent.prototype._catchCacheNode$ = function (key) { + return this._navigator.graphService.cacheNode$(key) + .catch(function (error, caught) { + console.error("Failed to cache slider node (" + key + ")", error); + return Observable_1.Observable.empty(); }); - this.fire(SequenceComponent.playingchanged, true); }; - SequenceComponent.prototype._stop = function () { - this._playingSubscription.unsubscribe(); - this._playingSubscription = null; - this._clearSubscription.unsubscribe(); - this._clearSubscription = null; - this.fire(SequenceComponent.playingchanged, false); + SliderComponent.prototype._getBasicCorners = function (currentAspect, previousAspect) { + var offsetX; + var offsetY; + if (currentAspect > previousAspect) { + offsetX = 0.5; + offsetY = 0.5 * currentAspect / previousAspect; + } + else { + offsetX = 0.5 * previousAspect / currentAspect; + offsetY = 0.5; + } + return [[0.5 - offsetX, 0.5 - offsetY], [0.5 + offsetX, 0.5 + offsetY]]; }; - return SequenceComponent; + SliderComponent.prototype._clipBoundingBox = function (bbox) { + bbox.minX = Math.max(0, Math.min(1, bbox.minX)); + bbox.maxX = Math.max(0, Math.min(1, bbox.maxX)); + bbox.minY = Math.max(0, Math.min(1, bbox.minY)); + bbox.maxY = Math.max(0, Math.min(1, bbox.maxY)); + }; + SliderComponent.componentName = "slider"; + return SliderComponent; }(Component_1.Component)); -/** @inheritdoc */ -SequenceComponent.componentName = "sequence"; -/** - * Event fired when playing starts or stops. - * - * @event PlayerComponent#playingchanged - * @type {boolean} Indicates whether the player is playing. - */ -SequenceComponent.playingchanged = "playingchanged"; -exports.SequenceComponent = SequenceComponent; -Component_1.ComponentService.register(SequenceComponent); -exports.default = SequenceComponent; +exports.SliderComponent = SliderComponent; +Component_1.ComponentService.register(SliderComponent); +exports.default = SliderComponent; -},{"../../Component":226,"../../Edge":227,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/of":45,"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/concat":54,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/share":74,"rxjs/add/operator/switchMap":79,"rxjs/add/operator/takeUntil":81,"rxjs/add/operator/withLatestFrom":83}],279:[function(require,module,exports){ +},{"../../Component":290,"../../Geo":293,"../../Render":296,"../../State":297,"../../Tiles":299,"../../Utils":300,"rxjs/Observable":29,"rxjs/Subject":34}],351:[function(require,module,exports){ "use strict"; +/// Object.defineProperty(exports, "__esModule", { value: true }); +var vd = require("virtual-dom"); +var Observable_1 = require("rxjs/Observable"); var Subject_1 = require("rxjs/Subject"); -var SequenceDOMInteraction = (function () { - function SequenceDOMInteraction() { - this._mouseEnterDirection$ = new Subject_1.Subject(); - this._mouseLeaveDirection$ = new Subject_1.Subject(); +var Component_1 = require("../../Component"); +var SliderDOMRenderer = /** @class */ (function () { + function SliderDOMRenderer(container) { + this._container = container; + this._interacting = false; + this._notifyModeChanged$ = new Subject_1.Subject(); + this._notifyPositionChanged$ = new Subject_1.Subject(); + this._stopInteractionSubscription = null; } - Object.defineProperty(SequenceDOMInteraction.prototype, "mouseEnterDirection$", { + Object.defineProperty(SliderDOMRenderer.prototype, "mode$", { get: function () { - return this._mouseEnterDirection$; + return this._notifyModeChanged$; }, enumerable: true, configurable: true }); - Object.defineProperty(SequenceDOMInteraction.prototype, "mouseLeaveDirection$", { + Object.defineProperty(SliderDOMRenderer.prototype, "position$", { get: function () { - return this._mouseLeaveDirection$; + return this._notifyPositionChanged$; }, enumerable: true, configurable: true }); - return SequenceDOMInteraction; + SliderDOMRenderer.prototype.activate = function () { + var _this = this; + if (!!this._stopInteractionSubscription) { + return; + } + this._stopInteractionSubscription = Observable_1.Observable + .merge(this._container.mouseService.documentMouseUp$, this._container.touchService.touchEnd$ + .filter(function (touchEvent) { + return touchEvent.touches.length === 0; + })) + .subscribe(function (event) { + if (_this._interacting) { + _this._interacting = false; + } + }); + }; + SliderDOMRenderer.prototype.deactivate = function () { + if (!this._stopInteractionSubscription) { + return; + } + this._interacting = false; + this._stopInteractionSubscription.unsubscribe(); + this._stopInteractionSubscription = null; + }; + SliderDOMRenderer.prototype.render = function (position, mode, motionless, pano, visible) { + var children = []; + if (visible) { + children.push(vd.h("div.SliderBorder", [])); + var modeVisible = !(motionless || pano); + if (modeVisible) { + children.push(this._createModeButton(mode)); + } + children.push(this._createPositionInput(position, modeVisible)); + } + var boundingRect = this._container.domContainer.getBoundingClientRect(); + var width = Math.max(215, Math.min(400, boundingRect.width - 100)); + return vd.h("div.SliderContainer", { style: { width: width + "px" } }, children); + }; + SliderDOMRenderer.prototype._createModeButton = function (mode) { + var _this = this; + var properties = { + onclick: function () { + _this._notifyModeChanged$.next(mode === Component_1.SliderMode.Motion ? + Component_1.SliderMode.Stationary : + Component_1.SliderMode.Motion); + }, + }; + var className = mode === Component_1.SliderMode.Stationary ? + "SliderModeButtonPressed" : + "SliderModeButton"; + return vd.h("div." + className, properties, [vd.h("div.SliderModeIcon", [])]); + }; + SliderDOMRenderer.prototype._createPositionInput = function (position, modeVisible) { + var _this = this; + var onChange = function (e) { + _this._notifyPositionChanged$.next(Number(e.target.value) / 1000); + }; + var onStart = function (e) { + _this._interacting = true; + e.stopPropagation(); + }; + var onMove = function (e) { + if (_this._interacting) { + e.stopPropagation(); + } + }; + var onKeyDown = function (e) { + if (e.key === "ArrowDown" || e.key === "ArrowLeft" || + e.key === "ArrowRight" || e.key === "ArrowUp") { + e.preventDefault(); + } + }; + var boundingRect = this._container.domContainer.getBoundingClientRect(); + var width = Math.max(215, Math.min(400, boundingRect.width - 105)) - 68 + (modeVisible ? 0 : 36); + var positionInput = vd.h("input.SliderPosition", { + max: 1000, + min: 0, + onchange: onChange, + oninput: onChange, + onkeydown: onKeyDown, + onmousedown: onStart, + onmousemove: onMove, + ontouchmove: onMove, + ontouchstart: onStart, + style: { + width: width + "px", + }, + type: "range", + value: 1000 * position, + }, []); + return vd.h("div.SliderPositionContainer", [positionInput]); + }; + return SliderDOMRenderer; }()); -exports.SequenceDOMInteraction = SequenceDOMInteraction; -exports.default = SequenceDOMInteraction; +exports.SliderDOMRenderer = SliderDOMRenderer; +exports.default = SliderDOMRenderer; -},{"rxjs/Subject":34}],280:[function(require,module,exports){ +},{"../../Component":290,"rxjs/Observable":29,"rxjs/Subject":34,"virtual-dom":246}],352:[function(require,module,exports){ "use strict"; -/// Object.defineProperty(exports, "__esModule", { value: true }); -var vd = require("virtual-dom"); -var Edge_1 = require("../../Edge"); -var SequenceDOMRenderer = (function () { - function SequenceDOMRenderer(element) { - this._minThresholdWidth = 320; - this._maxThresholdWidth = 1480; - this._minThresholdHeight = 240; - this._maxThresholdHeight = 820; +var Component_1 = require("../../Component"); +var Geo_1 = require("../../Geo"); +var SliderGLRenderer = /** @class */ (function () { + function SliderGLRenderer() { + this._factory = new Component_1.MeshFactory(); + this._scene = new Component_1.MeshScene(); + this._spatial = new Geo_1.Spatial(); + this._currentKey = null; + this._previousKey = null; + this._disabled = false; + this._curtain = 1; + this._frameId = 0; + this._needsRender = false; + this._mode = null; + this._currentProviderDisposers = {}; + this._previousProviderDisposers = {}; } - SequenceDOMRenderer.prototype.render = function (edgeStatus, configuration, containerWidth, component, interaction, navigator) { - if (configuration.visible === false) { - return vd.h("div.SequenceContainer", {}, []); + Object.defineProperty(SliderGLRenderer.prototype, "disabled", { + get: function () { + return this._disabled; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SliderGLRenderer.prototype, "frameId", { + get: function () { + return this._frameId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SliderGLRenderer.prototype, "needsRender", { + get: function () { + return this._needsRender; + }, + enumerable: true, + configurable: true + }); + SliderGLRenderer.prototype.setTextureProvider = function (key, provider) { + this._setTextureProvider(key, this._currentKey, provider, this._currentProviderDisposers, this._updateTexture.bind(this)); + }; + SliderGLRenderer.prototype.setTextureProviderPrev = function (key, provider) { + this._setTextureProvider(key, this._previousKey, provider, this._previousProviderDisposers, this._updateTexturePrev.bind(this)); + }; + SliderGLRenderer.prototype.update = function (frame, mode) { + this._updateFrameId(frame.id); + this._updateImagePlanes(frame.state, mode); + }; + SliderGLRenderer.prototype.updateCurtain = function (curtain) { + if (this._curtain === curtain) { + return; } - var nextKey = null; - var prevKey = null; - for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) { - var edge = _a[_i]; - if (edge.data.direction === Edge_1.EdgeDirection.Next) { - nextKey = edge.to; + this._curtain = curtain; + this._updateCurtain(); + this._needsRender = true; + }; + SliderGLRenderer.prototype.updateTexture = function (image, node) { + var imagePlanes = node.key === this._currentKey ? + this._scene.imagePlanes : + node.key === this._previousKey ? + this._scene.imagePlanesOld : + []; + if (imagePlanes.length === 0) { + return; + } + this._needsRender = true; + for (var _i = 0, imagePlanes_1 = imagePlanes; _i < imagePlanes_1.length; _i++) { + var plane = imagePlanes_1[_i]; + var material = plane.material; + var texture = material.uniforms.projectorTex.value; + texture.image = image; + texture.needsUpdate = true; + } + }; + SliderGLRenderer.prototype.updateTextureImage = function (image, node) { + if (this._currentKey !== node.key) { + return; + } + this._needsRender = true; + for (var _i = 0, _a = this._scene.imagePlanes; _i < _a.length; _i++) { + var plane = _a[_i]; + var material = plane.material; + var texture = material.uniforms.projectorTex.value; + texture.image = image; + texture.needsUpdate = true; + } + }; + SliderGLRenderer.prototype.render = function (perspectiveCamera, renderer) { + if (!this.disabled) { + renderer.render(this._scene.sceneOld, perspectiveCamera); + } + renderer.render(this._scene.scene, perspectiveCamera); + this._needsRender = false; + }; + SliderGLRenderer.prototype.dispose = function () { + this._scene.clear(); + for (var key in this._currentProviderDisposers) { + if (!this._currentProviderDisposers.hasOwnProperty(key)) { + continue; } - if (edge.data.direction === Edge_1.EdgeDirection.Prev) { - prevKey = edge.to; + this._currentProviderDisposers[key](); + } + for (var key in this._previousProviderDisposers) { + if (!this._previousProviderDisposers.hasOwnProperty(key)) { + continue; } + this._previousProviderDisposers[key](); } - var playingButton = this._createPlayingButton(nextKey, prevKey, configuration, component); - var arrows = this._createSequenceArrows(nextKey, prevKey, configuration, interaction, navigator); - var containerProperties = { - oncontextmenu: function (event) { event.preventDefault(); }, - style: { height: (0.27 * containerWidth) + "px", width: containerWidth + "px" }, - }; - return vd.h("div.SequenceContainer", containerProperties, arrows.concat([playingButton])); + this._currentProviderDisposers = {}; + this._previousProviderDisposers = {}; }; - SequenceDOMRenderer.prototype.getContainerWidth = function (element, configuration) { - var elementWidth = element.offsetWidth; - var elementHeight = element.offsetHeight; - var minWidth = configuration.minWidth; - var maxWidth = configuration.maxWidth; - if (maxWidth < minWidth) { - maxWidth = minWidth; + SliderGLRenderer.prototype._getBasicCorners = function (currentAspect, previousAspect) { + var offsetX; + var offsetY; + if (currentAspect > previousAspect) { + offsetX = 0.5; + offsetY = 0.5 * currentAspect / previousAspect; } - var relativeWidth = (elementWidth - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth); - var relativeHeight = (elementHeight - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight); - var coeff = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight))); - return minWidth + coeff * (maxWidth - minWidth); + else { + offsetX = 0.5 * previousAspect / currentAspect; + offsetY = 0.5; + } + return [[0.5 - offsetX, 0.5 - offsetY], [0.5 + offsetX, 0.5 + offsetY]]; }; - SequenceDOMRenderer.prototype._createPlayingButton = function (nextKey, prevKey, configuration, component) { - var canPlay = configuration.direction === Edge_1.EdgeDirection.Next && nextKey != null || - configuration.direction === Edge_1.EdgeDirection.Prev && prevKey != null; - var onclick = configuration.playing ? - function (e) { component.stop(); } : - canPlay ? function (e) { component.play(); } : null; - var buttonProperties = { - onclick: onclick, - style: {}, - }; - var iconClass = configuration.playing ? - "Stop" : - canPlay ? "Play" : "PlayDisabled"; - var icon = vd.h("div.SequenceComponentIcon", { className: iconClass }, []); - var buttonClass = canPlay ? "SequencePlay" : "SequencePlayDisabled"; - return vd.h("div." + buttonClass, buttonProperties, [icon]); + SliderGLRenderer.prototype._setDisabled = function (state) { + this._disabled = state.currentNode == null || + state.previousNode == null || + (state.currentNode.pano && !state.currentNode.fullPano) || + (state.previousNode.pano && !state.previousNode.fullPano) || + (state.currentNode.fullPano && !state.previousNode.fullPano); }; - SequenceDOMRenderer.prototype._createSequenceArrows = function (nextKey, prevKey, configuration, interaction, navigator) { - var nextProperties = { - onclick: nextKey != null ? - function (e) { - navigator.moveDir$(Edge_1.EdgeDirection.Next) - .subscribe(function (node) { return; }, function (error) { console.error(error); }); - } : - null, - onmouseenter: function (e) { interaction.mouseEnterDirection$.next(Edge_1.EdgeDirection.Next); }, - onmouseleave: function (e) { interaction.mouseLeaveDirection$.next(Edge_1.EdgeDirection.Next); }, - style: {}, - }; - var prevProperties = { - onclick: prevKey != null ? - function (e) { - navigator.moveDir$(Edge_1.EdgeDirection.Prev) - .subscribe(function (node) { return; }, function (error) { console.error(error); }); - } : - null, - onmouseenter: function (e) { interaction.mouseEnterDirection$.next(Edge_1.EdgeDirection.Prev); }, - onmouseleave: function (e) { interaction.mouseLeaveDirection$.next(Edge_1.EdgeDirection.Prev); }, - style: {}, + SliderGLRenderer.prototype._setTextureProvider = function (key, originalKey, provider, providerDisposers, updateTexture) { + var _this = this; + if (key !== originalKey) { + return; + } + var createdSubscription = provider.textureCreated$ + .subscribe(updateTexture); + var updatedSubscription = provider.textureUpdated$ + .subscribe(function (updated) { + _this._needsRender = true; + }); + var dispose = function () { + createdSubscription.unsubscribe(); + updatedSubscription.unsubscribe(); + provider.dispose(); }; - var nextClass = this._getStepClassName(Edge_1.EdgeDirection.Next, nextKey, configuration.highlightKey); - var prevClass = this._getStepClassName(Edge_1.EdgeDirection.Prev, prevKey, configuration.highlightKey); - var nextIcon = vd.h("div.SequenceComponentIcon", []); - var prevIcon = vd.h("div.SequenceComponentIcon", []); - return [ - vd.h("div." + nextClass, nextProperties, [nextIcon]), - vd.h("div." + prevClass, prevProperties, [prevIcon]), - ]; + if (key in providerDisposers) { + var disposeProvider = providerDisposers[key]; + disposeProvider(); + delete providerDisposers[key]; + } + providerDisposers[key] = dispose; }; - SequenceDOMRenderer.prototype._getStepClassName = function (direction, key, highlightKey) { - var className = direction === Edge_1.EdgeDirection.Next ? - "SequenceStepNext" : - "SequenceStepPrev"; - if (key == null) { - className += "Disabled"; + SliderGLRenderer.prototype._updateCurtain = function () { + for (var _i = 0, _a = this._scene.imagePlanes; _i < _a.length; _i++) { + var plane = _a[_i]; + var shaderMaterial = plane.material; + if (!!shaderMaterial.uniforms.curtain) { + shaderMaterial.uniforms.curtain.value = this._curtain; + } + } + }; + SliderGLRenderer.prototype._updateFrameId = function (frameId) { + this._frameId = frameId; + }; + SliderGLRenderer.prototype._updateImagePlanes = function (state, mode) { + var currentChanged = state.currentNode != null && this._currentKey !== state.currentNode.key; + var previousChanged = state.previousNode != null && this._previousKey !== state.previousNode.key; + var modeChanged = this._mode !== mode; + if (!(currentChanged || previousChanged || modeChanged)) { + return; + } + this._setDisabled(state); + this._needsRender = true; + this._mode = mode; + var motionless = state.motionless || mode === Component_1.SliderMode.Stationary || state.currentNode.pano; + if (this.disabled || previousChanged) { + if (this._previousKey in this._previousProviderDisposers) { + this._previousProviderDisposers[this._previousKey](); + delete this._previousProviderDisposers[this._previousKey]; + } + } + if (this.disabled) { + this._scene.setImagePlanesOld([]); } else { - if (highlightKey === key) { - className += "Highlight"; + if (previousChanged || modeChanged) { + var previousNode = state.previousNode; + this._previousKey = previousNode.key; + var elements = state.currentTransform.rt.elements; + var translation = [elements[12], elements[13], elements[14]]; + var currentAspect = state.currentTransform.basicAspect; + var previousAspect = state.previousTransform.basicAspect; + var textureScale = currentAspect > previousAspect ? + [1, previousAspect / currentAspect] : + [currentAspect / previousAspect, 1]; + var rotation = state.currentNode.rotation; + var width = state.currentNode.width; + var height = state.currentNode.height; + if (previousNode.fullPano) { + rotation = state.previousNode.rotation; + translation = this._spatial + .rotate(this._spatial + .opticalCenter(state.currentNode.rotation, translation) + .toArray(), rotation) + .multiplyScalar(-1) + .toArray(); + width = state.previousNode.width; + height = state.previousNode.height; + } + var transform = new Geo_1.Transform(state.currentNode.orientation, width, height, state.currentNode.focal, state.currentNode.scale, previousNode.gpano, rotation, translation, previousNode.image, textureScale); + var mesh = undefined; + if (previousNode.fullPano) { + mesh = this._factory.createMesh(previousNode, motionless || state.currentNode.fullPano ? transform : state.previousTransform); + } + else { + if (motionless) { + var _a = this._getBasicCorners(currentAspect, previousAspect), _b = _a[0], basicX0 = _b[0], basicY0 = _b[1], _c = _a[1], basicX1 = _c[0], basicY1 = _c[1]; + mesh = this._factory.createFlatMesh(state.previousNode, transform, basicX0, basicX1, basicY0, basicY1); + } + else { + mesh = this._factory.createMesh(state.previousNode, state.previousTransform); + } + } + this._scene.setImagePlanesOld([mesh]); } } - return className; + if (currentChanged) { + if (this._currentKey in this._currentProviderDisposers) { + this._currentProviderDisposers[this._currentKey](); + delete this._currentProviderDisposers[this._currentKey]; + } + this._currentKey = state.currentNode.key; + var imagePlane = state.currentNode.pano && !state.currentNode.fullPano ? + this._factory.createMesh(state.currentNode, state.currentTransform) : + this._factory.createCurtainMesh(state.currentNode, state.currentTransform); + this._scene.setImagePlanes([imagePlane]); + this._updateCurtain(); + } }; - return SequenceDOMRenderer; + SliderGLRenderer.prototype._updateTexture = function (texture) { + this._needsRender = true; + for (var _i = 0, _a = this._scene.imagePlanes; _i < _a.length; _i++) { + var plane = _a[_i]; + var material = plane.material; + var oldTexture = material.uniforms.projectorTex.value; + material.uniforms.projectorTex.value = null; + oldTexture.dispose(); + material.uniforms.projectorTex.value = texture; + } + }; + SliderGLRenderer.prototype._updateTexturePrev = function (texture) { + this._needsRender = true; + for (var _i = 0, _a = this._scene.imagePlanesOld; _i < _a.length; _i++) { + var plane = _a[_i]; + var material = plane.material; + var oldTexture = material.uniforms.projectorTex.value; + material.uniforms.projectorTex.value = null; + oldTexture.dispose(); + material.uniforms.projectorTex.value = texture; + } + }; + return SliderGLRenderer; }()); -exports.SequenceDOMRenderer = SequenceDOMRenderer; -exports.default = SequenceDOMRenderer; +exports.SliderGLRenderer = SliderGLRenderer; +exports.default = SliderGLRenderer; -},{"../../Edge":227,"virtual-dom":182}],281:[function(require,module,exports){ +},{"../../Component":290,"../../Geo":293}],353:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GeometryTagError_1 = require("./error/GeometryTagError"); @@ -26918,7 +31196,7 @@ exports.TagComponent = TagComponent_1.TagComponent; var TagMode_1 = require("./TagMode"); exports.TagMode = TagMode_1.TagMode; -},{"./TagComponent":282,"./TagMode":285,"./error/GeometryTagError":289,"./geometry/PointGeometry":291,"./geometry/PolygonGeometry":292,"./geometry/RectGeometry":293,"./tag/OutlineTag":297,"./tag/SpotTag":300}],282:[function(require,module,exports){ +},{"./TagComponent":354,"./TagMode":357,"./error/GeometryTagError":361,"./geometry/PointGeometry":363,"./geometry/PolygonGeometry":364,"./geometry/RectGeometry":365,"./tag/OutlineTag":377,"./tag/SpotTag":380}],354:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -26932,31 +31210,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); +var when = require("when"); var Observable_1 = require("rxjs/Observable"); -var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/observable/combineLatest"); -require("rxjs/add/observable/empty"); -require("rxjs/add/observable/from"); -require("rxjs/add/observable/merge"); -require("rxjs/add/observable/of"); -require("rxjs/add/operator/combineLatest"); -require("rxjs/add/operator/concat"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/do"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/merge"); -require("rxjs/add/operator/mergeMap"); -require("rxjs/add/operator/publishReplay"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/share"); -require("rxjs/add/operator/skip"); -require("rxjs/add/operator/skipUntil"); -require("rxjs/add/operator/startWith"); -require("rxjs/add/operator/switchMap"); -require("rxjs/add/operator/take"); -require("rxjs/add/operator/takeUntil"); -require("rxjs/add/operator/withLatestFrom"); var Component_1 = require("../../Component"); var Geo_1 = require("../../Geo"); var Render_1 = require("../../Render"); @@ -26998,7 +31253,7 @@ var Render_1 = require("../../Render"); * var tagComponent = viewer.getComponent("tag"); * ``` */ -var TagComponent = (function (_super) { +var TagComponent = /** @class */ (function (_super) { __extends(TagComponent, _super); function TagComponent(name, container, navigator) { var _this = _super.call(this, name, container, navigator) || this; @@ -27007,6 +31262,14 @@ var TagComponent = (function (_super) { _this._tagSet = new Component_1.TagSet(); _this._tagCreator = new Component_1.TagCreator(_this, navigator); _this._viewportCoords = new Geo_1.ViewportCoords(); + _this._createHandlers = { + "CreatePoint": new Component_1.CreatePointHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator), + "CreatePolygon": new Component_1.CreatePolygonHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator), + "CreateRect": new Component_1.CreateRectHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator), + "CreateRectDrag": new Component_1.CreateRectDragHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator), + "Default": undefined, + }; + _this._editVertexHandler = new Component_1.EditVertexHandler(_this, container, navigator, _this._viewportCoords, _this._tagSet); _this._renderTags$ = _this._tagSet.changed$ .map(function (tagSet) { var tags = tagSet.getAll(); @@ -27045,35 +31308,6 @@ var TagComponent = (function (_super) { }); }) .share(); - _this._tagInterationInitiated$ = _this._renderTags$ - .switchMap(function (tags) { - return Observable_1.Observable - .from(tags) - .mergeMap(function (tag) { - return tag.interact$ - .map(function (interaction) { - return interaction.tag.id; - }); - }); - }) - .share(); - _this._tagInteractionAbort$ = Observable_1.Observable - .merge(_this._container.mouseService.documentMouseUp$) - .map(function (e) { }) - .share(); - _this._activeTag$ = _this._renderTags$ - .switchMap(function (tags) { - return Observable_1.Observable - .from(tags) - .mergeMap(function (tag) { - return tag.interact$; - }); - }) - .merge(_this._tagInteractionAbort$ - .map(function () { - return { offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: null }; - })) - .share(); _this._createGeometryChanged$ = _this._tagCreator.tag$ .switchMap(function (tag) { return tag != null ? @@ -27088,41 +31322,6 @@ var TagComponent = (function (_super) { Observable_1.Observable.empty(); }) .share(); - _this._tagCreated$ = _this._tagCreator.tag$ - .switchMap(function (tag) { - return tag != null ? - tag.created$ : - Observable_1.Observable.empty(); - }) - .share(); - _this._vertexGeometryCreated$ = _this._tagCreated$ - .map(function (tag) { - return tag.geometry; - }) - .share(); - _this._pointGeometryCreated$ = new Subject_1.Subject(); - _this._geometryCreated$ = Observable_1.Observable - .merge(_this._vertexGeometryCreated$, _this._pointGeometryCreated$) - .share(); - _this._basicClick$ = _this._container.mouseService.staticClick$ - .withLatestFrom(_this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$, function (event, renderCamera, transform) { - return [event, renderCamera, transform]; - }) - .map(function (ert) { - var event = ert[0]; - var camera = ert[1]; - var transform = ert[2]; - var basic = _this._mouseEventToBasic(event, _this._container.element, camera, transform); - return basic; - }) - .share(); - _this._validBasicClick$ = _this._basicClick$ - .filter(function (basic) { - var x = basic[0]; - var y = basic[1]; - return 0 <= x && x <= 1 && 0 <= y && y <= 1; - }) - .share(); _this._creatingConfiguration$ = _this._configuration$ .distinctUntilChanged(function (c1, c2) { return c1.mode === c2.mode; @@ -27134,12 +31333,6 @@ var TagComponent = (function (_super) { }) .publishReplay(1) .refCount(); - _this._creating$ = _this._creatingConfiguration$ - .map(function (configuration) { - return configuration.mode !== Component_1.TagMode.Default; - }) - .publishReplay(1) - .refCount(); _this._creatingConfiguration$ .subscribe(function (configuration) { _this.fire(TagComponent.modechanged, configuration.mode); @@ -27223,6 +31416,50 @@ var TagComponent = (function (_super) { return this._tagSet.getAllDeactivated(); } }; + /** + * Returns an array of tag ids for tags that contain the specified point. + * + * @description The pixel point must lie inside the polygon or rectangle + * of an added tag for the tag id to be returned. Tag ids for + * tags that do not have a fill will also be returned if the point is inside + * the geometry of the tag. Tags with point geometries can not be retrieved. + * + * No tag ids will be returned for panoramas. + * + * Notice that the pixelPoint argument requires x, y coordinates from pixel space. + * + * With this function, you can use the coordinates provided by mouse + * events to get information out of the tag component. + * + * If no tag at exist the pixel point, an empty array will be returned. + * + * @param {Array} pixelPoint - Pixel coordinates on the viewer element. + * @returns {Array} Ids of the tags that contain the specified pixel point. + * + * @example + * ``` + * tagComponent.getTagIdsAt([100, 100]) + * .then((tagIds) => { console.log(tagIds); }); + * ``` + */ + TagComponent.prototype.getTagIdsAt = function (pixelPoint) { + var _this = this; + return when.promise(function (resolve, reject) { + _this._container.renderService.renderCamera$ + .first() + .map(function (render) { + var viewport = _this._viewportCoords + .canvasToViewport(pixelPoint[0], pixelPoint[1], _this._container.element); + var ids = _this._tagScene.intersectObjects(viewport, render.perspective); + return ids; + }) + .subscribe(function (ids) { + resolve(ids); + }, function (error) { + reject(error); + }); + }); + }; /** * Check if a tag exist in the tag set. * @@ -27265,128 +31502,59 @@ var TagComponent = (function (_super) { }; TagComponent.prototype._activate = function () { var _this = this; - this._preventDefaultSubscription = this._activeTag$ - .switchMap(function (interaction) { - return interaction.tag != null ? - _this._container.mouseService.documentMouseMove$ : - Observable_1.Observable.empty(); + this._editVertexHandler.enable(); + var handlerGeometryCreated$ = Observable_1.Observable + .from(Object.keys(this._createHandlers)) + .map(function (key) { + return _this._createHandlers[key]; }) - .subscribe(function (event) { - event.preventDefault(); // prevent selection of content outside the viewer - }); - this._geometryCreatedEventSubscription = this._geometryCreated$ + .filter(function (handler) { + return !!handler; + }) + .mergeMap(function (handler) { + return handler.geometryCreated$; + }) + .share(); + this._fireGeometryCreatedSubscription = handlerGeometryCreated$ .subscribe(function (geometry) { _this.fire(TagComponent.geometrycreated, geometry); }); - this._tagsChangedEventSubscription = this._renderTags$ - .subscribe(function (tags) { - _this.fire(TagComponent.tagschanged, _this); - }); - var transformChanged$ = this.configuration$ - .switchMap(function (configuration) { - return configuration.mode !== Component_1.TagMode.Default ? - _this._navigator.stateService.currentTransform$ - .map(function (n) { return null; }) : - Observable_1.Observable.empty(); + this._fireCreateGeometryEventSubscription = this._tagCreator.tag$ + .skipWhile(function (tag) { + return tag == null; }) - .publishReplay(1) - .refCount(); - this._deleteCreatingSubscription = transformChanged$ - .skip(1) + .distinctUntilChanged() + .subscribe(function (tag) { + var eventType = tag != null ? + TagComponent.creategeometrystart : + TagComponent.creategeometryend; + _this.fire(eventType, _this); + }); + this._handlerStopCreateSubscription = handlerGeometryCreated$ .subscribe(function () { - _this._tagCreator.delete$.next(null); + _this.changeMode(Component_1.TagMode.Default); }); - var tagAborted$ = this._tagCreator.tag$ + this._handlerEnablerSubscription = this._creatingConfiguration$ + .subscribe(function (configuration) { + _this._disableCreateHandlers(); + var mode = Component_1.TagMode[configuration.mode]; + var handler = _this._createHandlers[mode]; + if (!!handler) { + handler.enable(); + } + }); + this._fireTagsChangedSubscription = this._renderTags$ + .subscribe(function (tags) { + _this.fire(TagComponent.tagschanged, _this); + }); + this._stopCreateSubscription = this._tagCreator.tag$ .switchMap(function (tag) { return tag != null ? tag.aborted$ .map(function (t) { return null; }) : Observable_1.Observable.empty(); - }); - var tagCreated$ = this._tagCreated$ - .map(function (t) { return null; }); - var pointGeometryCreated$ = this._pointGeometryCreated$ - .map(function (p) { return null; }); - this._stopCreateSubscription = Observable_1.Observable - .merge(tagAborted$, tagCreated$, pointGeometryCreated$) - .subscribe(function () { _this.changeMode(Component_1.TagMode.Default); }); - var creatingStarted$ = Observable_1.Observable - .combineLatest(this._creatingConfiguration$, transformChanged$) - .map(function (_a) { - var configuration = _a[0]; - return configuration; - }) - .publishReplay(1) - .refCount(); - this._createSubscription = creatingStarted$ - .switchMap(function (configuration) { - return configuration.mode === Component_1.TagMode.CreateRect || - configuration.mode === Component_1.TagMode.CreatePolygon ? - _this._validBasicClick$.take(1) : - Observable_1.Observable.empty(); - }) - .subscribe(this._tagCreator.create$); - this._createPointSubscription = creatingStarted$ - .switchMap(function (configuration) { - return configuration.mode === Component_1.TagMode.CreatePoint ? - _this._validBasicClick$.take(1) : - Observable_1.Observable.empty(); - }) - .map(function (basic) { - return new Component_1.PointGeometry(basic); - }) - .subscribe(this._pointGeometryCreated$); - var containerMouseMove$ = Observable_1.Observable - .merge(this._container.mouseService.mouseMove$, this._container.mouseService.domMouseMove$) - .share(); - this._setCreateVertexSubscription = Observable_1.Observable - .combineLatest(containerMouseMove$, this._tagCreator.tag$, this._container.renderService.renderCamera$) - .filter(function (etr) { - return etr[1] != null; - }) - .withLatestFrom(this._navigator.stateService.currentTransform$, function (etr, transform) { - return [etr[0], etr[1], etr[2], transform]; - }) - .subscribe(function (etrt) { - var event = etrt[0]; - var tag = etrt[1]; - var camera = etrt[2]; - var transform = etrt[3]; - var basic = _this._mouseEventToBasic(event, _this._container.element, camera, transform); - if (tag.geometry instanceof Component_1.RectGeometry) { - tag.geometry.setVertex2d(3, basic, transform); - } - else if (tag.geometry instanceof Component_1.PolygonGeometry) { - tag.geometry.setVertex2d(tag.geometry.polygon.length - 2, basic, transform); - } - }); - this._addPointSubscription = creatingStarted$ - .switchMap(function (configuration) { - return configuration.mode === Component_1.TagMode.CreateRect || configuration.mode === Component_1.TagMode.CreatePolygon ? - _this._basicClick$.skipUntil(_this._validBasicClick$).skip(1) : - Observable_1.Observable.empty(); - }) - .withLatestFrom(this._tagCreator.tag$, function (basic, tag) { - return [basic, tag]; }) - .subscribe(function (bt) { - var basic = bt[0]; - var tag = bt[1]; - tag.addPoint(basic); - }); - this._containerClassListSubscription = this._creating$ - .subscribe(function (creating) { - if (creating) { - _this._container.element.classList.add("component-tag-create"); - } - else { - _this._container.element.classList.remove("component-tag-create"); - } - }); - this._deleteCreatedSubscription = this._creating$ - .subscribe(function (creating) { - _this._tagCreator.delete$.next(null); - }); + .subscribe(function () { _this.changeMode(Component_1.TagMode.Default); }); this._setGLCreateTagSubscription = this._tagCreator.tag$ .subscribe(function (tag) { if (_this._tagScene.hasCreateTag()) { @@ -27400,60 +31568,6 @@ var TagComponent = (function (_super) { .subscribe(function (tag) { _this._tagScene.updateCreateTagObjects(tag); }); - this._claimMouseSubscription = this._tagInterationInitiated$ - .switchMap(function (id) { - return containerMouseMove$ - .takeUntil(_this._tagInteractionAbort$) - .take(1); - }) - .subscribe(function (e) { - _this._container.mouseService.claimMouse(_this._name, 1); - }); - this._mouseDragSubscription = this._activeTag$ - .withLatestFrom(containerMouseMove$, function (a, e) { - return [a, e]; - }) - .switchMap(function (args) { - var activeTag = args[0]; - var mouseMove = args[1]; - if (activeTag.operation === Component_1.TagOperation.None) { - return Observable_1.Observable.empty(); - } - var mouseDrag$ = Observable_1.Observable - .of(mouseMove) - .concat(_this._container.mouseService - .filtered$(_this._name, _this._container.mouseService.domMouseDrag$) - .filter(function (event) { - return _this._viewportCoords.insideElement(event, _this._container.element); - })); - return Observable_1.Observable - .combineLatest(mouseDrag$, _this._container.renderService.renderCamera$) - .withLatestFrom(Observable_1.Observable.of(activeTag), _this._navigator.stateService.currentTransform$, function (ec, a, t) { - return [ec[0], ec[1], a, t]; - }); - }) - .subscribe(function (args) { - var mouseEvent = args[0]; - var renderCamera = args[1]; - var activeTag = args[2]; - var transform = args[3]; - if (activeTag.operation === Component_1.TagOperation.None) { - return; - } - var basic = _this._mouseEventToBasic(mouseEvent, _this._container.element, renderCamera, transform, activeTag.offsetX, activeTag.offsetY); - if (activeTag.operation === Component_1.TagOperation.Centroid) { - activeTag.tag.geometry.setCentroid2d(basic, transform); - } - else if (activeTag.operation === Component_1.TagOperation.Vertex) { - var vertexGeometry = activeTag.tag.geometry; - vertexGeometry.setVertex2d(activeTag.vertexIndex, basic, transform); - } - }); - this._unclaimMouseSubscription = this._container.mouseService - .filtered$(this._name, this._container.mouseService.domMouseDragEnd$) - .subscribe(function (e) { - _this._container.mouseService.unclaimMouse(_this._name); - }); this._updateGLObjectsSubscription = this._renderTagGLChanged$ .subscribe(function (tag) { _this._tagScene.updateObjects(tag); @@ -27470,13 +31584,13 @@ var TagComponent = (function (_super) { vnode: _this._tagDomRenderer.clear(), }); }) - .combineLatest(this._container.renderService.renderCamera$, this._container.spriteService.spriteAtlas$, this._tagChanged$.startWith(null), this._tagCreator.tag$.merge(this._createGeometryChanged$).startWith(null), function (renderTags, rc, atlas, tag, ct) { - return [rc, atlas, renderTags, tag, ct]; + .combineLatest(this._container.renderService.renderCamera$, this._container.spriteService.spriteAtlas$, this._container.renderService.size$, this._tagChanged$.startWith(null), this._tagCreator.tag$.merge(this._createGeometryChanged$).startWith(null), function (renderTags, rc, atlas, size, tag, ct) { + return [rc, atlas, size, renderTags, tag, ct]; }) .map(function (args) { return { name: _this._name, - vnode: _this._tagDomRenderer.render(args[2], args[4], args[1], args[0].perspective), + vnode: _this._tagDomRenderer.render(args[3], args[5], args[1], args[0].perspective, args[2]), }; }) .subscribe(this._container.domRenderer.render$); @@ -27502,29 +31616,23 @@ var TagComponent = (function (_super) { }); }; TagComponent.prototype._deactivate = function () { + this._editVertexHandler.disable(); + this._disableCreateHandlers(); this._tagScene.clear(); this._tagSet.deactivate(); this._tagCreator.delete$.next(null); - this._claimMouseSubscription.unsubscribe(); - this._mouseDragSubscription.unsubscribe(); - this._unclaimMouseSubscription.unsubscribe(); this._updateGLObjectsSubscription.unsubscribe(); this._updateTagSceneSubscription.unsubscribe(); this._stopCreateSubscription.unsubscribe(); - this._deleteCreatingSubscription.unsubscribe(); - this._createSubscription.unsubscribe(); - this._createPointSubscription.unsubscribe(); - this._setCreateVertexSubscription.unsubscribe(); - this._addPointSubscription.unsubscribe(); - this._deleteCreatedSubscription.unsubscribe(); this._setGLCreateTagSubscription.unsubscribe(); this._createGLObjectsChangedSubscription.unsubscribe(); - this._preventDefaultSubscription.unsubscribe(); - this._containerClassListSubscription.unsubscribe(); this._domSubscription.unsubscribe(); this._glSubscription.unsubscribe(); - this._geometryCreatedEventSubscription.unsubscribe(); - this._tagsChangedEventSubscription.unsubscribe(); + this._fireCreateGeometryEventSubscription.unsubscribe(); + this._fireGeometryCreatedSubscription.unsubscribe(); + this._fireTagsChangedSubscription.unsubscribe(); + this._handlerStopCreateSubscription.unsubscribe(); + this._handlerEnablerSubscription.unsubscribe(); this._container.element.classList.remove("component-tag-create"); }; TagComponent.prototype._getDefaultConfiguration = function () { @@ -27533,104 +31641,141 @@ var TagComponent = (function (_super) { mode: Component_1.TagMode.Default, }; }; - TagComponent.prototype._mouseEventToBasic = function (event, element, camera, transform, offsetX, offsetY) { - offsetX = offsetX != null ? offsetX : 0; - offsetY = offsetY != null ? offsetY : 0; - var _a = this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1]; - var basic = this._viewportCoords.canvasToBasic(canvasX - offsetX, canvasY - offsetY, element, transform, camera.perspective); - return basic; + TagComponent.prototype._disableCreateHandlers = function () { + var createHandlers = this._createHandlers; + for (var key in createHandlers) { + if (!createHandlers.hasOwnProperty(key)) { + continue; + } + var handler = createHandlers[key]; + if (!!handler) { + handler.disable(); + } + } }; + /** @inheritdoc */ + TagComponent.componentName = "tag"; + /** + * Event fired when an interaction to create a geometry ends. + * + * @description A create interaction can by a geometry being created + * or by the creation being aborted. + * + * @event TagComponent#creategeometryend + * @type {TagComponent} Tag component. + * @example + * ``` + * tagComponent.on("creategeometryend", function(component) { + * console.log(component); + * }); + * ``` + */ + TagComponent.creategeometryend = "creategeometryend"; + /** + * Event fired when an interaction to create a geometry starts. + * + * @description A create interaction starts when the first vertex + * is created in the geometry. + * + * @event TagComponent#creategeometrystart + * @type {TagComponent} Tag component. + * @example + * ``` + * tagComponent.on("creategeometrystart", function(component) { + * console.log(component); + * }); + * ``` + */ + TagComponent.creategeometrystart = "creategeometrystart"; + /** + * Event fired when the create mode is changed. + * + * @event TagComponent#modechanged + * @type {TagMode} Tag mode + * @example + * ``` + * tagComponent.on("modechanged", function(mode) { + * console.log(mode); + * }); + * ``` + */ + TagComponent.modechanged = "modechanged"; + /** + * Event fired when a geometry has been created. + * + * @event TagComponent#geometrycreated + * @type {Geometry} Created geometry. + * @example + * ``` + * tagComponent.on("geometrycreated", function(geometry) { + * console.log(geometry); + * }); + * ``` + */ + TagComponent.geometrycreated = "geometrycreated"; + /** + * Event fired when the tags collection has changed. + * + * @event TagComponent#tagschanged + * @type {TagComponent} Tag component. + * @example + * ``` + * tagComponent.on("tagschanged", function(component) { + * console.log(component.getAll()); + * }); + * ``` + */ + TagComponent.tagschanged = "tagschanged"; return TagComponent; }(Component_1.Component)); -/** @inheritdoc */ -TagComponent.componentName = "tag"; -/** - * Event fired when the create mode is changed. - * - * @event TagComponent#modechanged - * @type {TagMode} Tag mode - * @example - * ``` - * tagComponent.on("modechanged", function(mode) { - * console.log(mode); - * }); - * ``` - */ -TagComponent.modechanged = "modechanged"; -/** - * Event fired when a geometry has been created. - * - * @event TagComponent#geometrycreated - * @type {Geometry} Created geometry. - * @example - * ``` - * tagComponent.on("geometrycreated", function(geometry) { - * console.log(geometry); - * }); - * ``` - */ -TagComponent.geometrycreated = "geometrycreated"; -/** - * Event fired when the tags collection has changed. - * - * @event TagComponent#tagschanged - * @type {TagComponent} Tag component. - * @example - * ``` - * tagComponent.on("tagschanged", function(component) { - * console.log(component.getAll()); - * }); - * ``` - */ -TagComponent.tagschanged = "tagschanged"; exports.TagComponent = TagComponent; Component_1.ComponentService.register(TagComponent); exports.default = TagComponent; -},{"../../Component":226,"../../Geo":229,"../../Render":232,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/empty":40,"rxjs/add/observable/from":41,"rxjs/add/observable/merge":44,"rxjs/add/observable/of":45,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/concat":54,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/share":74,"rxjs/add/operator/skip":75,"rxjs/add/operator/skipUntil":76,"rxjs/add/operator/startWith":78,"rxjs/add/operator/switchMap":79,"rxjs/add/operator/take":80,"rxjs/add/operator/takeUntil":81,"rxjs/add/operator/withLatestFrom":83}],283:[function(require,module,exports){ +},{"../../Component":290,"../../Geo":293,"../../Render":296,"rxjs/Observable":29,"when":287}],355:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/share"); -require("rxjs/add/operator/withLatestFrom"); var Component_1 = require("../../Component"); -var TagCreator = (function () { +var TagCreator = /** @class */ (function () { function TagCreator(component, navigator) { this._component = component; this._navigator = navigator; this._tagOperation$ = new Subject_1.Subject(); - this._create$ = new Subject_1.Subject(); + this._createPolygon$ = new Subject_1.Subject(); + this._createRect$ = new Subject_1.Subject(); this._delete$ = new Subject_1.Subject(); this._tag$ = this._tagOperation$ .scan(function (tag, operation) { return operation(tag); }, null) .share(); - this._create$ + this._createRect$ .withLatestFrom(this._component.configuration$, this._navigator.stateService.currentTransform$) .map(function (_a) { var coord = _a[0], conf = _a[1], transform = _a[2]; return function (tag) { - if (conf.mode === Component_1.TagMode.CreateRect) { - var geometry = new Component_1.RectGeometry([ - coord[0], - coord[1], - coord[0], - coord[1], - ]); - return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform); - } - else if (conf.mode === Component_1.TagMode.CreatePolygon) { - var geometry = new Component_1.PolygonGeometry([ - [coord[0], coord[1]], - [coord[0], coord[1]], - [coord[0], coord[1]], - ]); - return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform); - } - return null; + var geometry = new Component_1.RectGeometry([ + coord[0], + coord[1], + coord[0], + coord[1], + ]); + return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform); + }; + }) + .subscribe(this._tagOperation$); + this._createPolygon$ + .withLatestFrom(this._component.configuration$, this._navigator.stateService.currentTransform$) + .map(function (_a) { + var coord = _a[0], conf = _a[1], transform = _a[2]; + return function (tag) { + var geometry = new Component_1.PolygonGeometry([ + [coord[0], coord[1]], + [coord[0], coord[1]], + [coord[0], coord[1]], + ]); + return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform); }; }) .subscribe(this._tagOperation$); @@ -27642,9 +31787,16 @@ var TagCreator = (function () { }) .subscribe(this._tagOperation$); } - Object.defineProperty(TagCreator.prototype, "create$", { + Object.defineProperty(TagCreator.prototype, "createRect$", { get: function () { - return this._create$; + return this._createRect$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TagCreator.prototype, "createPolygon$", { + get: function () { + return this._createPolygon$; }, enumerable: true, configurable: true @@ -27668,25 +31820,22 @@ var TagCreator = (function () { exports.TagCreator = TagCreator; exports.default = TagCreator; -},{"../../Component":226,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":73,"rxjs/add/operator/share":74,"rxjs/add/operator/withLatestFrom":83}],284:[function(require,module,exports){ +},{"../../Component":290,"rxjs/Subject":34}],356:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); -var THREE = require("three"); var vd = require("virtual-dom"); -var TagDOMRenderer = (function () { +var TagDOMRenderer = /** @class */ (function () { function TagDOMRenderer() { } - TagDOMRenderer.prototype.render = function (tags, createTag, atlas, camera) { - var matrixWorldInverse = new THREE.Matrix4().getInverse(camera.matrixWorld); - var projectionMatrix = camera.projectionMatrix; + TagDOMRenderer.prototype.render = function (tags, createTag, atlas, camera, size) { var vNodes = []; for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) { var tag = tags_1[_i]; - vNodes = vNodes.concat(tag.getDOMObjects(atlas, matrixWorldInverse, projectionMatrix)); + vNodes = vNodes.concat(tag.getDOMObjects(atlas, camera, size)); } if (createTag != null) { - vNodes = vNodes.concat(createTag.getDOMObjects(matrixWorldInverse, projectionMatrix)); + vNodes = vNodes.concat(createTag.getDOMObjects(camera, size)); } return vd.h("div.TagContainer", {}, vNodes); }; @@ -27697,7 +31846,7 @@ var TagDOMRenderer = (function () { }()); exports.TagDOMRenderer = TagDOMRenderer; -},{"three":176,"virtual-dom":182}],285:[function(require,module,exports){ +},{"virtual-dom":246}],357:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -27724,10 +31873,17 @@ var TagMode; * Create a rect geometry through clicks. */ TagMode[TagMode["CreateRect"] = 3] = "CreateRect"; + /** + * Create a rect geometry through drag. + * + * @description Claims the mouse which results in mouse handlers like + * drag pan and scroll zoom becoming inactive. + */ + TagMode[TagMode["CreateRectDrag"] = 4] = "CreateRectDrag"; })(TagMode = exports.TagMode || (exports.TagMode = {})); exports.default = TagMode; -},{}],286:[function(require,module,exports){ +},{}],358:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var TagOperation; @@ -27738,16 +31894,19 @@ var TagOperation; })(TagOperation = exports.TagOperation || (exports.TagOperation = {})); exports.default = TagOperation; -},{}],287:[function(require,module,exports){ +},{}],359:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); -var TagScene = (function () { - function TagScene() { +var TagScene = /** @class */ (function () { + function TagScene(scene, raycaster) { this._createTag = null; this._needsRender = false; - this._scene = new THREE.Scene(); + this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster(); + this._scene = !!scene ? scene : new THREE.Scene(); + this._objectTags = {}; + this._retrievableObjects = []; this._tags = {}; } Object.defineProperty(TagScene.prototype, "needsRender", { @@ -27782,9 +31941,28 @@ var TagScene = (function () { } this._needsRender = false; }; + TagScene.prototype.get = function (id) { + return this.has(id) ? this._tags[id].tag : undefined; + }; + TagScene.prototype.has = function (id) { + return id in this._tags; + }; TagScene.prototype.hasCreateTag = function () { return this._createTag != null; }; + TagScene.prototype.intersectObjects = function (_a, camera) { + var viewportX = _a[0], viewportY = _a[1]; + this._raycaster.setFromCamera(new THREE.Vector2(viewportX, viewportY), camera); + var intersects = this._raycaster.intersectObjects(this._retrievableObjects); + var intersectedIds = []; + for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) { + var intersect = intersects_1[_i]; + if (intersect.object.uuid in this._objectTags) { + intersectedIds.push(this._objectTags[intersect.object.uuid]); + } + } + return intersectedIds; + }; TagScene.prototype.remove = function (ids) { for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) { var id = ids_1[_i]; @@ -27835,51 +32013,74 @@ var TagScene = (function () { }; TagScene.prototype.updateObjects = function (tag) { var id = tag.tag.id; - for (var _i = 0, _a = this._tags[id].objects; _i < _a.length; _i++) { - var object = _a[_i]; - this._scene.remove(object); + if (this._tags[id].tag !== tag) { + throw new Error("Tags do not have the same reference."); } + var tagObjects = this._tags[id]; + this._removeObjects(tagObjects); delete this._tags[id]; this._add(tag); this._needsRender = true; }; TagScene.prototype._add = function (tag) { var id = tag.tag.id; - var objects = tag.glObjects; - this._tags[id] = { tag: tag, objects: [] }; - for (var _i = 0, objects_1 = objects; _i < objects_1.length; _i++) { - var object = objects_1[_i]; - this._tags[id].objects.push(object); + var tagObjects = { tag: tag, objects: [], retrievableObjects: [] }; + this._tags[id] = tagObjects; + for (var _i = 0, _a = tag.getGLObjects(); _i < _a.length; _i++) { + var object = _a[_i]; + tagObjects.objects.push(object); this._scene.add(object); } + for (var _b = 0, _c = tag.getRetrievableObjects(); _b < _c.length; _b++) { + var retrievableObject = _c[_b]; + tagObjects.retrievableObjects.push(retrievableObject); + this._retrievableObjects.push(retrievableObject); + this._objectTags[retrievableObject.uuid] = tag.tag.id; + } }; TagScene.prototype._remove = function (id) { - for (var _i = 0, _a = this._tags[id].objects; _i < _a.length; _i++) { + var tagObjects = this._tags[id]; + this._removeObjects(tagObjects); + tagObjects.tag.dispose(); + delete this._tags[id]; + }; + TagScene.prototype._removeObjects = function (tagObjects) { + for (var _i = 0, _a = tagObjects.objects; _i < _a.length; _i++) { var object = _a[_i]; this._scene.remove(object); } - this._tags[id].tag.dispose(); - delete this._tags[id]; + for (var _b = 0, _c = tagObjects.retrievableObjects; _b < _c.length; _b++) { + var retrievableObject = _c[_b]; + var index = this._retrievableObjects.indexOf(retrievableObject); + if (index !== -1) { + this._retrievableObjects.splice(index, 1); + } + } }; return TagScene; }()); exports.TagScene = TagScene; exports.default = TagScene; -},{"three":176}],288:[function(require,module,exports){ +},{"three":240}],360:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/share"); var Component_1 = require("../../Component"); -var TagSet = (function () { +var TagSet = /** @class */ (function () { function TagSet() { + this._active = false; this._hash = {}; this._hashDeactivated = {}; this._notifyChanged$ = new Subject_1.Subject(); } + Object.defineProperty(TagSet.prototype, "active", { + get: function () { + return this._active; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(TagSet.prototype, "changed$", { get: function () { return this._notifyChanged$; @@ -27888,6 +32089,9 @@ var TagSet = (function () { configurable: true }); TagSet.prototype.activate = function (transform) { + if (this._active) { + return; + } for (var id in this._hashDeactivated) { if (!this._hashDeactivated.hasOwnProperty(id)) { continue; @@ -27896,9 +32100,13 @@ var TagSet = (function () { this._add(tag, transform); } this._hashDeactivated = {}; + this._active = true; this._notifyChanged$.next(this); }; TagSet.prototype.deactivate = function () { + if (!this._active) { + return; + } for (var id in this._hash) { if (!this._hash.hasOwnProperty(id)) { continue; @@ -27906,8 +32114,10 @@ var TagSet = (function () { this._hashDeactivated[id] = this._hash[id].tag; } this._hash = {}; + this._active = false; }; TagSet.prototype.add = function (tags, transform) { + this._assertActivationState(true); for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) { var tag = tags_1[_i]; this._add(tag, transform); @@ -27915,8 +32125,12 @@ var TagSet = (function () { this._notifyChanged$.next(this); }; TagSet.prototype.addDeactivated = function (tags) { + this._assertActivationState(false); for (var _i = 0, tags_2 = tags; _i < tags_2.length; _i++) { var tag = tags_2[_i]; + if (!(tag instanceof Component_1.OutlineTag || tag instanceof Component_1.SpotTag)) { + throw new Error("Tag type not supported"); + } this._hashDeactivated[tag.id] = tag; } }; @@ -27947,6 +32161,7 @@ var TagSet = (function () { return id in this._hashDeactivated; }; TagSet.prototype.remove = function (ids) { + this._assertActivationState(true); var hash = this._hash; for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) { var id = ids_1[_i]; @@ -27958,13 +32173,16 @@ var TagSet = (function () { this._notifyChanged$.next(this); }; TagSet.prototype.removeAll = function () { + this._assertActivationState(true); this._hash = {}; this._notifyChanged$.next(this); }; TagSet.prototype.removeAllDeactivated = function () { + this._assertActivationState(false); this._hashDeactivated = {}; }; TagSet.prototype.removeDeactivated = function (ids) { + this._assertActivationState(false); var hashDeactivated = this._hashDeactivated; for (var _i = 0, ids_2 = ids; _i < ids_2.length; _i++) { var id = ids_2[_i]; @@ -27985,12 +32203,17 @@ var TagSet = (function () { throw new Error("Tag type not supported"); } }; + TagSet.prototype._assertActivationState = function (should) { + if (should !== this._active) { + throw new Error("Tag set not in correct state for operation."); + } + }; return TagSet; }()); exports.TagSet = TagSet; exports.default = TagSet; -},{"../../Component":226,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":73,"rxjs/add/operator/share":74}],289:[function(require,module,exports){ +},{"../../Component":290,"rxjs/Subject":34}],361:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -28004,7 +32227,7 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var Error_1 = require("../../../Error"); -var GeometryTagError = (function (_super) { +var GeometryTagError = /** @class */ (function (_super) { __extends(GeometryTagError, _super); function GeometryTagError(message) { var _this = _super.call(this, message != null ? message : "The provided geometry value is incorrect") || this; @@ -28016,7 +32239,7 @@ var GeometryTagError = (function (_super) { exports.GeometryTagError = GeometryTagError; exports.default = Error_1.MapillaryError; -},{"../../../Error":228}],290:[function(require,module,exports){ +},{"../../../Error":292}],362:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Subject_1 = require("rxjs/Subject"); @@ -28025,7 +32248,7 @@ var Subject_1 = require("rxjs/Subject"); * @abstract * @classdesc Represents a geometry. */ -var Geometry = (function () { +var Geometry = /** @class */ (function () { /** * Create a geometry. * @@ -28055,7 +32278,7 @@ var Geometry = (function () { exports.Geometry = Geometry; exports.default = Geometry; -},{"rxjs/Subject":34}],291:[function(require,module,exports){ +},{"rxjs/Subject":34}],363:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -28080,7 +32303,7 @@ var Component_1 = require("../../../Component"); * var pointGeometry = new Mapillary.TagComponent.PointGeometry(basicPoint); * ``` */ -var PointGeometry = (function (_super) { +var PointGeometry = /** @class */ (function (_super) { __extends(PointGeometry, _super); /** * Create a point geometry. @@ -28112,6 +32335,15 @@ var PointGeometry = (function (_super) { enumerable: true, configurable: true }); + /** + * Get the 2D basic coordinates for the centroid of the point, i.e. the 2D + * basic coordinates of the point itself. + * + * @returns {Array} 2D basic coordinates representing the centroid. + */ + PointGeometry.prototype.getCentroid2d = function () { + return this._point.slice(); + }; /** * Get the 3D world coordinates for the centroid of the point, i.e. the 3D * world coordinates of the point itself. @@ -28141,7 +32373,7 @@ var PointGeometry = (function (_super) { }(Component_1.Geometry)); exports.PointGeometry = PointGeometry; -},{"../../../Component":226}],292:[function(require,module,exports){ +},{"../../../Component":290}],364:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -28167,7 +32399,7 @@ var Component_1 = require("../../../Component"); * var polygonGeometry = new Mapillary.TagComponent.PointGeometry(basicPolygon); * ``` */ -var PolygonGeometry = (function (_super) { +var PolygonGeometry = /** @class */ (function (_super) { __extends(PolygonGeometry, _super); /** * Create a polygon geometry. @@ -28259,6 +32491,18 @@ var PolygonGeometry = (function (_super) { this._polygon.splice(this._polygon.length - 1, 0, clamped); this._notifyChanged$.next(this); }; + /** + * Get the coordinates of a vertex from the polygon representation of the geometry. + * + * @description The first vertex represents the bottom-left corner with the rest of + * the vertices following in clockwise order. + * + * @param {number} index - Vertex index. + * @returns {Array} Array representing the 2D basic coordinates of the vertex. + */ + PolygonGeometry.prototype.getVertex2d = function (index) { + return this._polygon[index].slice(); + }; /** * Remove a vertex from the polygon. * @@ -28304,7 +32548,7 @@ var PolygonGeometry = (function (_super) { var maxX = Math.max.apply(Math, xs); var minY = Math.min.apply(Math, ys); var maxY = Math.max.apply(Math, ys); - var centroid = this._getCentroid2d(); + var centroid = this.getCentroid2d(); var minTranslationX = -minX; var maxTranslationX = 1 - maxX; var minTranslationY = -minY; @@ -28327,6 +32571,10 @@ var PolygonGeometry = (function (_super) { return transform.unprojectBasic(this._polygon[index], 200); }; /** @inheritdoc */ + PolygonGeometry.prototype.getVertices2d = function () { + return this._polygon.slice(); + }; + /** @inheritdoc */ PolygonGeometry.prototype.getVertices3d = function (transform) { return this._polygon .map(function (point) { @@ -28354,20 +32602,7 @@ var PolygonGeometry = (function (_super) { return holes3d; }; /** @inheritdoc */ - PolygonGeometry.prototype.getCentroid3d = function (transform) { - var centroid2d = this._getCentroid2d(); - return transform.unprojectBasic(centroid2d, 200); - }; - /** @inheritdoc */ - PolygonGeometry.prototype.getTriangles3d = function (transform) { - return this._triangulate(this._polygon, this.getPoints3d(transform), this._holes, this.getHoleVertices3d(transform)); - }; - /** @inheritdoc */ - PolygonGeometry.prototype.getPoleOfAccessibility3d = function (transform) { - var pole2d = this._getPoleOfInaccessibility2d(this._polygon.slice()); - return transform.unprojectBasic(pole2d, 200); - }; - PolygonGeometry.prototype._getCentroid2d = function () { + PolygonGeometry.prototype.getCentroid2d = function () { var polygon = this._polygon; var area = 0; var centroidX = 0; @@ -28387,12 +32622,30 @@ var PolygonGeometry = (function (_super) { centroidY /= 6 * area; return [centroidX, centroidY]; }; + /** @inheritdoc */ + PolygonGeometry.prototype.getCentroid3d = function (transform) { + var centroid2d = this.getCentroid2d(); + return transform.unprojectBasic(centroid2d, 200); + }; + /** @inheritdoc */ + PolygonGeometry.prototype.getTriangles3d = function (transform) { + return this._triangulate(this._polygon, this.getPoints3d(transform), this._holes, this.getHoleVertices3d(transform)); + }; + /** @inheritdoc */ + PolygonGeometry.prototype.getPoleOfAccessibility2d = function () { + return this._getPoleOfInaccessibility2d(this._polygon.slice()); + }; + /** @inheritdoc */ + PolygonGeometry.prototype.getPoleOfAccessibility3d = function (transform) { + var pole2d = this._getPoleOfInaccessibility2d(this._polygon.slice()); + return transform.unprojectBasic(pole2d, 200); + }; return PolygonGeometry; }(Component_1.VertexGeometry)); exports.PolygonGeometry = PolygonGeometry; exports.default = PolygonGeometry; -},{"../../../Component":226}],293:[function(require,module,exports){ +},{"../../../Component":290}],365:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -28417,7 +32670,7 @@ var Component_1 = require("../../../Component"); * var rectGeometry = new Mapillary.TagComponent.RectGeometry(basicRect); * ``` */ -var RectGeometry = (function (_super) { +var RectGeometry = /** @class */ (function (_super) { __extends(RectGeometry, _super); /** * Create a rectangle geometry. @@ -28439,15 +32692,42 @@ var RectGeometry = (function (_super) { throw new Component_1.GeometryTagError("Basic coordinates must be on the interval [0, 1]."); } } + _this._anchorIndex = undefined; _this._rect = rect.slice(0, 4); - if (_this._rect[0] > _this._rect[2]) { - _this._inverted = true; - } + _this._inverted = _this._rect[0] > _this._rect[2]; return _this; } + Object.defineProperty(RectGeometry.prototype, "anchorIndex", { + /** + * Get anchor index property. + * + * @returns {number} Index representing the current anchor property if + * achoring indexing has been initialized. If anchor indexing has not been + * initialized or has been terminated undefined will be returned. + */ + get: function () { + return this._anchorIndex; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RectGeometry.prototype, "inverted", { + /** + * Get inverted property. + * + * @returns {boolean} Boolean determining whether the rect geometry is + * inverted. For panoramas the rect geometrye may be inverted. + */ + get: function () { + return this._inverted; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(RectGeometry.prototype, "rect", { /** * Get rect property. + * * @returns {Array} Array representing the top-left and bottom-right * corners of the rectangle in basic coordinates. */ @@ -28457,6 +32737,225 @@ var RectGeometry = (function (_super) { enumerable: true, configurable: true }); + /** + * Initialize anchor indexing to enable setting opposite vertex. + * + * @param {number} [index] - The index of the vertex to use as anchor. + * + * @throws {Error} If anchor indexing has already been initialized. + * @throws {Error} If index is not valid (0 to 3). + */ + RectGeometry.prototype.initializeAnchorIndexing = function (index) { + if (this._anchorIndex !== undefined) { + throw new Error("Anchor indexing is already initialized."); + } + if (index < 0 || index > 3) { + throw new Error("Invalid anchor index: " + index + "."); + } + this._anchorIndex = index === undefined ? 0 : index; + }; + /** + * Terminate anchor indexing to disable setting pposite vertex. + */ + RectGeometry.prototype.terminateAnchorIndexing = function () { + this._anchorIndex = undefined; + }; + /** + * Set the value of the vertex opposite to the anchor in the polygon + * representation of the rectangle. + * + * @description Setting the opposite vertex may change the anchor index. + * + * @param {Array} opposite - The new value of the vertex opposite to the anchor. + * @param {Transform} transform - The transform of the node related to the rectangle. + * + * @throws {Error} When anchor indexing has not been initialized. + */ + RectGeometry.prototype.setOppositeVertex2d = function (opposite, transform) { + if (this._anchorIndex === undefined) { + throw new Error("Anchor indexing needs to be initialized."); + } + var changed = [ + Math.max(0, Math.min(1, opposite[0])), + Math.max(0, Math.min(1, opposite[1])), + ]; + var original = this._rect.slice(); + var anchor = this._anchorIndex === 0 ? [original[0], original[3]] : + this._anchorIndex === 1 ? [original[0], original[1]] : + this._anchorIndex === 2 ? [original[2], original[1]] : + [original[2], original[3]]; + if (transform.fullPano) { + var deltaX = this._anchorIndex < 2 ? + changed[0] - original[2] : + changed[0] - original[0]; + if (!this._inverted && this._anchorIndex < 2 && changed[0] < 0.25 && original[2] > 0.75 && deltaX < -0.5) { + // right side passes boundary rightward + this._inverted = true; + this._anchorIndex = anchor[1] > changed[1] ? 0 : 1; + } + else if (!this._inverted && this._anchorIndex >= 2 && changed[0] < 0.25 && original[2] > 0.75 && deltaX < -0.5) { + // left side passes right side and boundary rightward + this._inverted = true; + this._anchorIndex = anchor[1] > changed[1] ? 0 : 1; + } + else if (this._inverted && this._anchorIndex >= 2 && changed[0] < 0.25 && original[0] > 0.75 && deltaX < -0.5) { + this._inverted = false; + if (anchor[0] > changed[0]) { + // left side passes boundary rightward + this._anchorIndex = anchor[1] > changed[1] ? 3 : 2; + } + else { + // left side passes right side and boundary rightward + this._anchorIndex = anchor[1] > changed[1] ? 0 : 1; + } + } + else if (!this._inverted && this._anchorIndex >= 2 && changed[0] > 0.75 && original[0] < 0.25 && deltaX > 0.5) { + // left side passes boundary leftward + this._inverted = true; + this._anchorIndex = anchor[1] > changed[1] ? 3 : 2; + } + else if (!this._inverted && this._anchorIndex < 2 && changed[0] > 0.75 && original[0] < 0.25 && deltaX > 0.5) { + // right side passes left side and boundary leftward + this._inverted = true; + this._anchorIndex = anchor[1] > changed[1] ? 3 : 2; + } + else if (this._inverted && this._anchorIndex < 2 && changed[0] > 0.75 && original[2] < 0.25 && deltaX > 0.5) { + this._inverted = false; + if (anchor[0] > changed[0]) { + // right side passes boundary leftward + this._anchorIndex = anchor[1] > changed[1] ? 3 : 2; + } + else { + // right side passes left side and boundary leftward + this._anchorIndex = anchor[1] > changed[1] ? 0 : 1; + } + } + else if (this._inverted && this._anchorIndex < 2 && changed[0] > original[0]) { + // inverted and right side passes left side completing a loop + this._inverted = false; + this._anchorIndex = anchor[1] > changed[1] ? 0 : 1; + } + else if (this._inverted && this._anchorIndex >= 2 && changed[0] < original[2]) { + // inverted and left side passes right side completing a loop + this._inverted = false; + this._anchorIndex = anchor[1] > changed[1] ? 3 : 2; + } + else if (this._inverted) { + // if still inverted only top and bottom can switch + if (this._anchorIndex < 2) { + this._anchorIndex = anchor[1] > changed[1] ? 0 : 1; + } + else { + this._anchorIndex = anchor[1] > changed[1] ? 3 : 2; + } + } + else { + // if still not inverted treat as non full pano + if (anchor[0] <= changed[0] && anchor[1] > changed[1]) { + this._anchorIndex = 0; + } + else if (anchor[0] <= changed[0] && anchor[1] <= changed[1]) { + this._anchorIndex = 1; + } + else if (anchor[0] > changed[0] && anchor[1] <= changed[1]) { + this._anchorIndex = 2; + } + else { + this._anchorIndex = 3; + } + } + var rect = []; + if (this._anchorIndex === 0) { + rect[0] = anchor[0]; + rect[1] = changed[1]; + rect[2] = changed[0]; + rect[3] = anchor[1]; + } + else if (this._anchorIndex === 1) { + rect[0] = anchor[0]; + rect[1] = anchor[1]; + rect[2] = changed[0]; + rect[3] = changed[1]; + } + else if (this._anchorIndex === 2) { + rect[0] = changed[0]; + rect[1] = anchor[1]; + rect[2] = anchor[0]; + rect[3] = changed[1]; + } + else { + rect[0] = changed[0]; + rect[1] = changed[1]; + rect[2] = anchor[0]; + rect[3] = anchor[1]; + } + if (!this._inverted && rect[0] > rect[2] || + this._inverted && rect[0] < rect[2]) { + rect[0] = original[0]; + rect[2] = original[2]; + } + if (rect[1] > rect[3]) { + rect[1] = original[1]; + rect[3] = original[3]; + } + this._rect[0] = rect[0]; + this._rect[1] = rect[1]; + this._rect[2] = rect[2]; + this._rect[3] = rect[3]; + } + else { + if (anchor[0] <= changed[0] && anchor[1] > changed[1]) { + this._anchorIndex = 0; + } + else if (anchor[0] <= changed[0] && anchor[1] <= changed[1]) { + this._anchorIndex = 1; + } + else if (anchor[0] > changed[0] && anchor[1] <= changed[1]) { + this._anchorIndex = 2; + } + else { + this._anchorIndex = 3; + } + var rect = []; + if (this._anchorIndex === 0) { + rect[0] = anchor[0]; + rect[1] = changed[1]; + rect[2] = changed[0]; + rect[3] = anchor[1]; + } + else if (this._anchorIndex === 1) { + rect[0] = anchor[0]; + rect[1] = anchor[1]; + rect[2] = changed[0]; + rect[3] = changed[1]; + } + else if (this._anchorIndex === 2) { + rect[0] = changed[0]; + rect[1] = anchor[1]; + rect[2] = anchor[0]; + rect[3] = changed[1]; + } + else { + rect[0] = changed[0]; + rect[1] = changed[1]; + rect[2] = anchor[0]; + rect[3] = anchor[1]; + } + if (rect[0] > rect[2]) { + rect[0] = original[0]; + rect[2] = original[2]; + } + if (rect[1] > rect[3]) { + rect[1] = original[1]; + rect[3] = original[3]; + } + this._rect[0] = rect[0]; + this._rect[1] = rect[1]; + this._rect[2] = rect[2]; + this._rect[3] = rect[3]; + } + this._notifyChanged$.next(this); + }; /** * Set the value of a vertex in the polygon representation of the rectangle. * @@ -28498,12 +32997,12 @@ var RectGeometry = (function (_super) { rect[2] = changed[0]; rect[3] = changed[1]; } - if (transform.gpano) { - var passingBoundaryLeft = index < 2 && changed[0] > 0.75 && original[0] < 0.25 || + if (transform.fullPano) { + var passingBoundaryLeftward = index < 2 && changed[0] > 0.75 && original[0] < 0.25 || index >= 2 && this._inverted && changed[0] > 0.75 && original[2] < 0.25; - var passingBoundaryRight = index < 2 && this._inverted && changed[0] < 0.25 && original[0] > 0.75 || + var passingBoundaryRightward = index < 2 && this._inverted && changed[0] < 0.25 && original[0] > 0.75 || index >= 2 && changed[0] < 0.25 && original[2] > 0.75; - if (passingBoundaryLeft || passingBoundaryRight) { + if (passingBoundaryLeftward || passingBoundaryRightward) { this._inverted = !this._inverted; } else { @@ -28595,6 +33094,33 @@ var RectGeometry = (function (_super) { return transform.unprojectBasic(point, 200); }); }; + /** + * Get the coordinates of a vertex from the polygon representation of the geometry. + * + * @description The first vertex represents the bottom-left corner with the rest of + * the vertices following in clockwise order. The method shifts the right side + * coordinates of the rectangle by one unit to ensure that the vertices are ordered + * clockwise. + * + * @param {number} index - Vertex index. + * @returns {Array} Array representing the 2D basic coordinates of the vertex. + */ + RectGeometry.prototype.getVertex2d = function (index) { + return this._rectToVertices2d(this._rect)[index]; + }; + /** + * Get the coordinates of a vertex from the polygon representation of the geometry. + * + * @description The first vertex represents the bottom-left corner with the rest of + * the vertices following in clockwise order. The coordinates will not be shifted + * so they may not appear in clockwise order when layed out on the plane. + * + * @param {number} index - Vertex index. + * @returns {Array} Array representing the 2D basic coordinates of the vertex. + */ + RectGeometry.prototype.getNonAdjustedVertex2d = function (index) { + return this._rectToNonAdjustedVertices2d(this._rect)[index]; + }; /** * Get a vertex from the polygon representation of the 3D coordinates for the * vertices of the geometry. @@ -28610,6 +33136,18 @@ var RectGeometry = (function (_super) { RectGeometry.prototype.getVertex3d = function (index, transform) { return transform.unprojectBasic(this._rectToVertices2d(this._rect)[index], 200); }; + /** + * Get a polygon representation of the 2D basic coordinates for the vertices of the rectangle. + * + * @description The first vertex represents the bottom-left corner with the rest of + * the vertices following in clockwise order. + * + * @returns {Array>} Polygon array of 2D basic coordinates representing + * the rectangle vertices. + */ + RectGeometry.prototype.getVertices2d = function () { + return this._rectToVertices2d(this._rect); + }; /** * Get a polygon representation of the 3D coordinates for the vertices of the rectangle. * @@ -28627,15 +33165,24 @@ var RectGeometry = (function (_super) { }); }; /** @inheritdoc */ - RectGeometry.prototype.getCentroid3d = function (transform) { + RectGeometry.prototype.getCentroid2d = function () { var rect = this._rect; var x0 = rect[0]; var x1 = this._inverted ? rect[2] + 1 : rect[2]; var y0 = rect[1]; var y1 = rect[3]; - var centroidX = x0 + (x1 - x0) / 2; - var centroidY = y0 + (y1 - y0) / 2; - return transform.unprojectBasic([centroidX, centroidY], 200); + var centroidX = (x0 + x1) / 2; + var centroidY = (y0 + y1) / 2; + return [centroidX, centroidY]; + }; + /** @inheritdoc */ + RectGeometry.prototype.getCentroid3d = function (transform) { + var centroid2d = this.getCentroid2d(); + return transform.unprojectBasic(centroid2d, 200); + }; + /** @inheritdoc */ + RectGeometry.prototype.getPoleOfAccessibility2d = function () { + return this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect)); }; /** @inheritdoc */ RectGeometry.prototype.getPoleOfAccessibility3d = function (transform) { @@ -28696,9 +33243,12 @@ var RectGeometry = (function (_super) { }; /** * Convert the top-left, bottom-right representation of a rectangle to a polygon - * representation of the vertices starting at the bottom-right corner going + * representation of the vertices starting at the bottom-left corner going * clockwise. * + * @description The method shifts the right side coordinates of the rectangle + * by one unit to ensure that the vertices are ordered clockwise. + * * @param {Array} rect - Top-left, bottom-right representation of a * rectangle. * @returns {Array>} Polygon representation of the vertices of the @@ -28713,12 +33263,35 @@ var RectGeometry = (function (_super) { [rect[0], rect[3]], ]; }; + /** + * Convert the top-left, bottom-right representation of a rectangle to a polygon + * representation of the vertices starting at the bottom-left corner going + * clockwise. + * + * @description The first vertex represents the bottom-left corner with the rest of + * the vertices following in clockwise order. The coordinates will not be shifted + * to ensure that the vertices are ordered clockwise when layed out on the plane. + * + * @param {Array} rect - Top-left, bottom-right representation of a + * rectangle. + * @returns {Array>} Polygon representation of the vertices of the + * rectangle. + */ + RectGeometry.prototype._rectToNonAdjustedVertices2d = function (rect) { + return [ + [rect[0], rect[3]], + [rect[0], rect[1]], + [rect[2], rect[1]], + [rect[2], rect[3]], + [rect[0], rect[3]], + ]; + }; return RectGeometry; }(Component_1.VertexGeometry)); exports.RectGeometry = RectGeometry; exports.default = RectGeometry; -},{"../../../Component":226}],294:[function(require,module,exports){ +},{"../../../Component":290}],366:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -28740,7 +33313,7 @@ var Component_1 = require("../../../Component"); * @abstract * @classdesc Represents a vertex geometry. */ -var VertexGeometry = (function (_super) { +var VertexGeometry = /** @class */ (function (_super) { __extends(VertexGeometry, _super); /** * Create a vertex geometry. @@ -28800,7 +33373,566 @@ var VertexGeometry = (function (_super) { exports.VertexGeometry = VertexGeometry; exports.default = VertexGeometry; -},{"../../../Component":226,"@mapbox/polylabel":1,"earcut":8}],295:[function(require,module,exports){ +},{"../../../Component":290,"@mapbox/polylabel":1,"earcut":8}],367:[function(require,module,exports){ +"use strict"; +/// +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Subject_1 = require("rxjs/Subject"); +var Component_1 = require("../../../Component"); +var CreateHandlerBase = /** @class */ (function (_super) { + __extends(CreateHandlerBase, _super); + function CreateHandlerBase(component, container, navigator, viewportCoords, tagCreator) { + var _this = _super.call(this, component, container, navigator, viewportCoords) || this; + _this._tagCreator = tagCreator; + _this._geometryCreated$ = new Subject_1.Subject(); + return _this; + } + Object.defineProperty(CreateHandlerBase.prototype, "geometryCreated$", { + get: function () { + return this._geometryCreated$; + }, + enumerable: true, + configurable: true + }); + CreateHandlerBase.prototype._enable = function () { + this._enableCreate(); + this._container.element.classList.add("component-tag-create"); + }; + CreateHandlerBase.prototype._disable = function () { + this._container.element.classList.remove("component-tag-create"); + this._disableCreate(); + }; + CreateHandlerBase.prototype._validateBasic = function (basic) { + var x = basic[0]; + var y = basic[1]; + return 0 <= x && x <= 1 && 0 <= y && y <= 1; + }; + CreateHandlerBase.prototype._mouseEventToBasic$ = function (mouseEvent$) { + var _this = this; + return mouseEvent$ + .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$) + .map(function (_a) { + var event = _a[0], camera = _a[1], transform = _a[2]; + return _this._mouseEventToBasic(event, _this._container.element, camera, transform); + }); + }; + return CreateHandlerBase; +}(Component_1.TagHandlerBase)); +exports.CreateHandlerBase = CreateHandlerBase; +exports.default = CreateHandlerBase; + +},{"../../../Component":290,"rxjs/Subject":34}],368:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Component_1 = require("../../../Component"); +var CreatePointHandler = /** @class */ (function (_super) { + __extends(CreatePointHandler, _super); + function CreatePointHandler() { + return _super !== null && _super.apply(this, arguments) || this; + } + CreatePointHandler.prototype._enableCreate = function () { + this._container.mouseService.deferPixels(this._name, 4); + this._geometryCreatedSubscription = this._mouseEventToBasic$(this._container.mouseService.proximateClick$) + .filter(this._validateBasic) + .map(function (basic) { + return new Component_1.PointGeometry(basic); + }) + .subscribe(this._geometryCreated$); + }; + CreatePointHandler.prototype._disableCreate = function () { + this._container.mouseService.undeferPixels(this._name); + this._geometryCreatedSubscription.unsubscribe(); + }; + CreatePointHandler.prototype._getNameExtension = function () { + return "create-point"; + }; + return CreatePointHandler; +}(Component_1.CreateHandlerBase)); +exports.CreatePointHandler = CreatePointHandler; +exports.default = CreatePointHandler; + +},{"../../../Component":290}],369:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Component_1 = require("../../../Component"); +var CreatePolygonHandler = /** @class */ (function (_super) { + __extends(CreatePolygonHandler, _super); + function CreatePolygonHandler() { + return _super !== null && _super.apply(this, arguments) || this; + } + CreatePolygonHandler.prototype._addPoint = function (tag, basicPoint) { + tag.addPoint(basicPoint); + }; + Object.defineProperty(CreatePolygonHandler.prototype, "_create$", { + get: function () { + return this._tagCreator.createPolygon$; + }, + enumerable: true, + configurable: true + }); + CreatePolygonHandler.prototype._getNameExtension = function () { + return "create-polygon"; + }; + CreatePolygonHandler.prototype._setVertex2d = function (tag, basicPoint, transform) { + tag.geometry.setVertex2d(tag.geometry.polygon.length - 2, basicPoint, transform); + }; + return CreatePolygonHandler; +}(Component_1.CreateVertexHandler)); +exports.CreatePolygonHandler = CreatePolygonHandler; +exports.default = CreatePolygonHandler; + +},{"../../../Component":290}],370:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("rxjs/Observable"); +var Component_1 = require("../../../Component"); +var CreateRectDragHandler = /** @class */ (function (_super) { + __extends(CreateRectDragHandler, _super); + function CreateRectDragHandler() { + return _super !== null && _super.apply(this, arguments) || this; + } + CreateRectDragHandler.prototype._enableCreate = function () { + var _this = this; + this._container.mouseService.claimMouse(this._name, 2); + this._deleteSubscription = this._navigator.stateService.currentTransform$ + .map(function (transform) { return null; }) + .skip(1) + .subscribe(this._tagCreator.delete$); + this._createSubscription = this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseDragStart$)) + .filter(this._validateBasic) + .subscribe(this._tagCreator.createRect$); + this._initializeAnchorIndexingSubscription = this._tagCreator.tag$ + .filter(function (tag) { + return !!tag; + }) + .subscribe(function (tag) { + tag.geometry.initializeAnchorIndexing(); + }); + var basicMouse$ = Observable_1.Observable + .merge(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseMove$), this._container.mouseService.filtered$(this._name, this._container.mouseService.domMouseMove$)) + .combineLatest(this._container.renderService.renderCamera$) + .withLatestFrom(this._navigator.stateService.currentTransform$) + .map(function (_a) { + var _b = _a[0], event = _b[0], camera = _b[1], transform = _a[1]; + return _this._mouseEventToBasic(event, _this._container.element, camera, transform); + }); + this._setVertexSubscription = this._tagCreator.tag$ + .switchMap(function (tag) { + return !!tag ? + Observable_1.Observable + .combineLatest(Observable_1.Observable.of(tag), basicMouse$, _this._navigator.stateService.currentTransform$) : + Observable_1.Observable.empty(); + }) + .subscribe(function (_a) { + var tag = _a[0], basicPoint = _a[1], transform = _a[2]; + tag.geometry.setOppositeVertex2d(basicPoint, transform); + }); + var basicMouseDragEnd$ = this._container.mouseService.mouseDragEnd$ + .withLatestFrom(this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseDrag$)) + .filter(this._validateBasic), function (event, basicPoint) { + return basicPoint; + }) + .share(); + this._addPointSubscription = this._tagCreator.tag$ + .switchMap(function (tag) { + return !!tag ? + Observable_1.Observable + .combineLatest(Observable_1.Observable.of(tag), basicMouseDragEnd$) : + Observable_1.Observable.empty(); + }) + .subscribe(function (_a) { + var tag = _a[0], basicPoint = _a[1]; + var rectGeometry = tag.geometry; + if (!rectGeometry.validate(basicPoint)) { + basicPoint = rectGeometry.getNonAdjustedVertex2d(3); + } + tag.addPoint(basicPoint); + }); + this._geometryCreatedSubscription = this._tagCreator.tag$ + .switchMap(function (tag) { + return !!tag ? + tag.created$ + .map(function (t) { + return t.geometry; + }) : + Observable_1.Observable.empty(); + }) + .subscribe(this._geometryCreated$); + }; + CreateRectDragHandler.prototype._disableCreate = function () { + this._container.mouseService.unclaimMouse(this._name); + this._tagCreator.delete$.next(null); + this._addPointSubscription.unsubscribe(); + this._createSubscription.unsubscribe(); + this._deleteSubscription.unsubscribe(); + this._geometryCreatedSubscription.unsubscribe(); + this._initializeAnchorIndexingSubscription.unsubscribe(); + this._setVertexSubscription.unsubscribe(); + }; + CreateRectDragHandler.prototype._getNameExtension = function () { + return "create-rect-drag"; + }; + return CreateRectDragHandler; +}(Component_1.CreateHandlerBase)); +exports.CreateRectDragHandler = CreateRectDragHandler; +exports.default = CreateRectDragHandler; + +},{"../../../Component":290,"rxjs/Observable":29}],371:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Component_1 = require("../../../Component"); +var CreateRectHandler = /** @class */ (function (_super) { + __extends(CreateRectHandler, _super); + function CreateRectHandler() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(CreateRectHandler.prototype, "_create$", { + get: function () { + return this._tagCreator.createRect$; + }, + enumerable: true, + configurable: true + }); + CreateRectHandler.prototype._addPoint = function (tag, basicPoint) { + var rectGeometry = tag.geometry; + if (!rectGeometry.validate(basicPoint)) { + basicPoint = rectGeometry.getNonAdjustedVertex2d(3); + } + tag.addPoint(basicPoint); + }; + CreateRectHandler.prototype._enable = function () { + _super.prototype._enable.call(this); + this._initializeAnchorIndexingSubscription = this._tagCreator.tag$ + .filter(function (tag) { + return !!tag; + }) + .subscribe(function (tag) { + tag.geometry.initializeAnchorIndexing(); + }); + }; + CreateRectHandler.prototype._disable = function () { + _super.prototype._disable.call(this); + this._initializeAnchorIndexingSubscription.unsubscribe(); + }; + CreateRectHandler.prototype._getNameExtension = function () { + return "create-rect"; + }; + CreateRectHandler.prototype._setVertex2d = function (tag, basicPoint, transform) { + tag.geometry.setOppositeVertex2d(basicPoint, transform); + }; + return CreateRectHandler; +}(Component_1.CreateVertexHandler)); +exports.CreateRectHandler = CreateRectHandler; +exports.default = CreateRectHandler; + +},{"../../../Component":290}],372:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("rxjs/Observable"); +var Component_1 = require("../../../Component"); +var CreateVertexHandler = /** @class */ (function (_super) { + __extends(CreateVertexHandler, _super); + function CreateVertexHandler() { + return _super !== null && _super.apply(this, arguments) || this; + } + CreateVertexHandler.prototype._enableCreate = function () { + var _this = this; + this._container.mouseService.deferPixels(this._name, 4); + var transformChanged$ = this._navigator.stateService.currentTransform$ + .map(function (transform) { }) + .publishReplay(1) + .refCount(); + this._deleteSubscription = transformChanged$ + .skip(1) + .subscribe(this._tagCreator.delete$); + var basicClick$ = this._mouseEventToBasic$(this._container.mouseService.proximateClick$).share(); + this._createSubscription = transformChanged$ + .switchMap(function () { + return basicClick$ + .filter(_this._validateBasic) + .take(1); + }) + .subscribe(this._create$); + this._setVertexSubscription = this._tagCreator.tag$ + .switchMap(function (tag) { + return !!tag ? + Observable_1.Observable + .combineLatest(Observable_1.Observable.of(tag), Observable_1.Observable + .merge(_this._container.mouseService.mouseMove$, _this._container.mouseService.domMouseMove$), _this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$) : + Observable_1.Observable.empty(); + }) + .subscribe(function (_a) { + var tag = _a[0], event = _a[1], camera = _a[2], transform = _a[3]; + var basicPoint = _this._mouseEventToBasic(event, _this._container.element, camera, transform); + _this._setVertex2d(tag, basicPoint, transform); + }); + this._addPointSubscription = this._tagCreator.tag$ + .switchMap(function (tag) { + return !!tag ? + Observable_1.Observable + .combineLatest(Observable_1.Observable.of(tag), basicClick$) : + Observable_1.Observable.empty(); + }) + .subscribe(function (_a) { + var tag = _a[0], basicPoint = _a[1]; + _this._addPoint(tag, basicPoint); + }); + this._geometryCreateSubscription = this._tagCreator.tag$ + .switchMap(function (tag) { + return !!tag ? + tag.created$ + .map(function (t) { + return t.geometry; + }) : + Observable_1.Observable.empty(); + }) + .subscribe(this._geometryCreated$); + }; + CreateVertexHandler.prototype._disableCreate = function () { + this._container.mouseService.undeferPixels(this._name); + this._tagCreator.delete$.next(null); + this._addPointSubscription.unsubscribe(); + this._createSubscription.unsubscribe(); + this._deleteSubscription.unsubscribe(); + this._geometryCreateSubscription.unsubscribe(); + this._setVertexSubscription.unsubscribe(); + }; + return CreateVertexHandler; +}(Component_1.CreateHandlerBase)); +exports.CreateVertexHandler = CreateVertexHandler; +exports.default = CreateVertexHandler; + +},{"../../../Component":290,"rxjs/Observable":29}],373:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("rxjs/Observable"); +var Component_1 = require("../../../Component"); +var EditVertexHandler = /** @class */ (function (_super) { + __extends(EditVertexHandler, _super); + function EditVertexHandler(component, container, navigator, viewportCoords, tagSet) { + var _this = _super.call(this, component, container, navigator, viewportCoords) || this; + _this._tagSet = tagSet; + return _this; + } + EditVertexHandler.prototype._enable = function () { + var _this = this; + var interaction$ = this._tagSet.changed$ + .map(function (tagSet) { + return tagSet.getAll(); + }) + .switchMap(function (tags) { + return Observable_1.Observable + .from(tags) + .mergeMap(function (tag) { + return tag.interact$; + }); + }) + .switchMap(function (interaction) { + return Observable_1.Observable + .of(interaction) + .concat(_this._container.mouseService.documentMouseUp$ + .map(function () { + return { offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: null }; + }) + .first()); + }) + .share(); + var mouseMove$ = Observable_1.Observable + .merge(this._container.mouseService.mouseMove$, this._container.mouseService.domMouseMove$) + .share(); + this._claimMouseSubscription = interaction$ + .switchMap(function (interaction) { + return !!interaction.tag ? _this._container.mouseService.domMouseDragStart$ : Observable_1.Observable.empty(); + }) + .subscribe(function () { + _this._container.mouseService.claimMouse(_this._name, 3); + }); + this._cursorSubscription = interaction$ + .map(function (interaction) { + return interaction.cursor; + }) + .distinctUntilChanged() + .subscribe(function (cursor) { + var interactionCursors = ["crosshair", "move", "nesw-resize", "nwse-resize"]; + for (var _i = 0, interactionCursors_1 = interactionCursors; _i < interactionCursors_1.length; _i++) { + var interactionCursor = interactionCursors_1[_i]; + _this._container.element.classList.remove("component-tag-edit-" + interactionCursor); + } + if (!!cursor) { + _this._container.element.classList.add("component-tag-edit-" + cursor); + } + }); + this._unclaimMouseSubscription = this._container.mouseService + .filtered$(this._name, this._container.mouseService.domMouseDragEnd$) + .subscribe(function (e) { + _this._container.mouseService.unclaimMouse(_this._name); + }); + this._preventDefaultSubscription = interaction$ + .switchMap(function (interaction) { + return !!interaction.tag ? + _this._container.mouseService.documentMouseMove$ : + Observable_1.Observable.empty(); + }) + .subscribe(function (event) { + event.preventDefault(); // prevent selection of content outside the viewer + }); + this._updateGeometrySubscription = interaction$ + .withLatestFrom(mouseMove$) + .switchMap(function (_a) { + var interaction = _a[0], mouseMove = _a[1]; + if (interaction.operation === Component_1.TagOperation.None || !interaction.tag) { + return Observable_1.Observable.empty(); + } + var mouseDrag$ = Observable_1.Observable + .of(mouseMove) + .concat(_this._container.mouseService + .filtered$(_this._name, _this._container.mouseService.domMouseDrag$) + .filter(function (event) { + return _this._viewportCoords.insideElement(event, _this._container.element); + })); + return Observable_1.Observable + .combineLatest(mouseDrag$, _this._container.renderService.renderCamera$) + .withLatestFrom(Observable_1.Observable.of(interaction), _this._navigator.stateService.currentTransform$, function (_a, i, transform) { + var event = _a[0], render = _a[1]; + return [event, render, i, transform]; + }); + }) + .subscribe(function (_a) { + var mouseEvent = _a[0], renderCamera = _a[1], interaction = _a[2], transform = _a[3]; + var basic = _this._mouseEventToBasic(mouseEvent, _this._container.element, renderCamera, transform, interaction.offsetX, interaction.offsetY); + var geometry = interaction.tag.geometry; + if (interaction.operation === Component_1.TagOperation.Centroid) { + geometry.setCentroid2d(basic, transform); + } + else if (interaction.operation === Component_1.TagOperation.Vertex) { + geometry.setVertex2d(interaction.vertexIndex, basic, transform); + } + }); + }; + EditVertexHandler.prototype._disable = function () { + this._claimMouseSubscription.unsubscribe(); + this._cursorSubscription.unsubscribe(); + this._preventDefaultSubscription.unsubscribe(); + this._unclaimMouseSubscription.unsubscribe(); + this._updateGeometrySubscription.unsubscribe(); + }; + EditVertexHandler.prototype._getNameExtension = function () { + return "edit-vertex"; + }; + return EditVertexHandler; +}(Component_1.TagHandlerBase)); +exports.EditVertexHandler = EditVertexHandler; +exports.default = EditVertexHandler; + +},{"../../../Component":290,"rxjs/Observable":29}],374:[function(require,module,exports){ +"use strict"; +/// +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Component_1 = require("../../../Component"); +var TagHandlerBase = /** @class */ (function (_super) { + __extends(TagHandlerBase, _super); + function TagHandlerBase(component, container, navigator, viewportCoords) { + var _this = _super.call(this, component, container, navigator) || this; + _this._name = _this._component.name + "-" + _this._getNameExtension(); + _this._viewportCoords = viewportCoords; + return _this; + } + TagHandlerBase.prototype._getConfiguration = function (enable) { + return {}; + }; + TagHandlerBase.prototype._mouseEventToBasic = function (event, element, camera, transform, offsetX, offsetY) { + offsetX = offsetX != null ? offsetX : 0; + offsetY = offsetY != null ? offsetY : 0; + var _a = this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1]; + var basic = this._viewportCoords.canvasToBasic(canvasX - offsetX, canvasY - offsetY, element, transform, camera.perspective); + return basic; + }; + return TagHandlerBase; +}(Component_1.HandlerBase)); +exports.TagHandlerBase = TagHandlerBase; +exports.default = TagHandlerBase; + +},{"../../../Component":290}],375:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); @@ -28808,12 +33940,14 @@ var THREE = require("three"); var vd = require("virtual-dom"); var Subject_1 = require("rxjs/Subject"); var Component_1 = require("../../../Component"); -var OutlineCreateTag = (function () { - function OutlineCreateTag(geometry, options, transform) { +var Geo_1 = require("../../../Geo"); +var OutlineCreateTag = /** @class */ (function () { + function OutlineCreateTag(geometry, options, transform, viewportCoords) { var _this = this; this._geometry = geometry; this._options = { color: options.color == null ? 0xFFFFFF : options.color }; this._transform = transform; + this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords(); this._outline = this._createOutine(); this._glObjects = [this._outline]; this._aborted$ = new Subject_1.Subject(); @@ -28877,30 +34011,30 @@ var OutlineCreateTag = (function () { this._disposeOutline(); this._geometryChangedSubscription.unsubscribe(); }; - OutlineCreateTag.prototype.getDOMObjects = function (matrixWorldInverse, projectionMatrix) { + OutlineCreateTag.prototype.getDOMObjects = function (camera, size) { var _this = this; var vNodes = []; + var container = { + offsetHeight: size.height, offsetWidth: size.width, + }; var abort = function (e) { e.stopPropagation(); _this._aborted$.next(_this); }; if (this._geometry instanceof Component_1.RectGeometry) { - var topLeftPoint3d = this._geometry.getVertex3d(1, this._transform); - var topLeftCameraSpace = this._convertToCameraSpace(topLeftPoint3d, matrixWorldInverse); - if (topLeftCameraSpace.z < 0) { - var centerCanvas = this._projectToCanvas(topLeftCameraSpace, projectionMatrix); - var centerCss = centerCanvas.map(function (coord) { return (100 * coord) + "%"; }); + var anchorIndex = this._geometry.anchorIndex; + var vertexIndex = anchorIndex === undefined ? 1 : anchorIndex; + var _a = this._geometry.getVertex2d(vertexIndex), basicX = _a[0], basicY = _a[1]; + var canvasPoint = this._viewportCoords.basicToCanvasSafe(basicX, basicY, container, this._transform, camera); + if (canvasPoint != null) { + var background = this._colorToBackground(this._options.color); + var transform = this._canvasToTransform(canvasPoint); var pointProperties = { - style: { - background: "#" + ("000000" + this._options.color.toString(16)).substr(-6), - left: centerCss[0], - position: "absolute", - top: centerCss[1], - }, + style: { background: background, transform: transform }, }; var completerProperties = { onclick: abort, - style: { left: centerCss[0], position: "absolute", top: centerCss[1] }, + style: { transform: transform }, }; vNodes.push(vd.h("div.TagInteractor", completerProperties, [])); vNodes.push(vd.h("div.TagVertex", pointProperties, [])); @@ -28908,11 +34042,9 @@ var OutlineCreateTag = (function () { } else if (this._geometry instanceof Component_1.PolygonGeometry) { var polygonGeometry_1 = this._geometry; - var firstVertex3d = this._geometry.getVertex3d(0, this._transform); - var firstCameraSpace = this._convertToCameraSpace(firstVertex3d, matrixWorldInverse); - if (firstCameraSpace.z < 0) { - var centerCanvas = this._projectToCanvas(firstCameraSpace, projectionMatrix); - var centerCss = centerCanvas.map(function (coord) { return (100 * coord) + "%"; }); + var _b = polygonGeometry_1.getVertex2d(0), firstVertexBasicX = _b[0], firstVertexBasicY = _b[1]; + var firstVertexCanvas = this._viewportCoords.basicToCanvasSafe(firstVertexBasicX, firstVertexBasicY, container, this._transform, camera); + if (firstVertexCanvas != null) { var firstOnclick = polygonGeometry_1.polygon.length > 4 ? function (e) { e.stopPropagation(); @@ -28920,9 +34052,10 @@ var OutlineCreateTag = (function () { _this._created$.next(_this); } : abort; + var transform = this._canvasToTransform(firstVertexCanvas); var completerProperties = { onclick: firstOnclick, - style: { left: centerCss[0], position: "absolute", top: centerCss[1] }, + style: { transform: transform }, }; var firstClass = polygonGeometry_1.polygon.length > 4 ? "TagCompleter" : @@ -28930,36 +34063,33 @@ var OutlineCreateTag = (function () { vNodes.push(vd.h("div." + firstClass, completerProperties, [])); } if (polygonGeometry_1.polygon.length > 3) { - var lastVertex3d = this._geometry.getVertex3d(polygonGeometry_1.polygon.length - 3, this._transform); - var lastCameraSpace = this._convertToCameraSpace(lastVertex3d, matrixWorldInverse); - if (lastCameraSpace.z < 0) { - var centerCanvas = this._projectToCanvas(lastCameraSpace, projectionMatrix); - var centerCss = centerCanvas.map(function (coord) { return (100 * coord) + "%"; }); + var _c = polygonGeometry_1.getVertex2d(polygonGeometry_1.polygon.length - 3), lastVertexBasicX = _c[0], lastVertexBasicY = _c[1]; + var lastVertexCanvas = this._viewportCoords.basicToCanvasSafe(lastVertexBasicX, lastVertexBasicY, container, this._transform, camera); + if (lastVertexCanvas != null) { var remove = function (e) { e.stopPropagation(); polygonGeometry_1.removeVertex2d(polygonGeometry_1.polygon.length - 3); }; + var transform = this._canvasToTransform(lastVertexCanvas); var completerProperties = { onclick: remove, - style: { left: centerCss[0], position: "absolute", top: centerCss[1] }, + style: { transform: transform }, }; vNodes.push(vd.h("div.TagInteractor", completerProperties, [])); } } - var vertices3d = this._geometry.getVertices3d(this._transform); - vertices3d.splice(-2, 2); - for (var _i = 0, vertices3d_1 = vertices3d; _i < vertices3d_1.length; _i++) { - var vertex = vertices3d_1[_i]; - var vertexCameraSpace = this._convertToCameraSpace(vertex, matrixWorldInverse); - if (vertexCameraSpace.z < 0) { - var centerCanvas = this._projectToCanvas(vertexCameraSpace, projectionMatrix); - var centerCss = centerCanvas.map(function (coord) { return (100 * coord) + "%"; }); + var verticesBasic = polygonGeometry_1.polygon.slice(); + verticesBasic.splice(-2, 2); + for (var _i = 0, verticesBasic_1 = verticesBasic; _i < verticesBasic_1.length; _i++) { + var vertexBasic = verticesBasic_1[_i]; + var vertexCanvas = this._viewportCoords.basicToCanvasSafe(vertexBasic[0], vertexBasic[1], container, this._transform, camera); + if (vertexCanvas != null) { + var background = this._colorToBackground(this._options.color); + var transform = this._canvasToTransform(vertexCanvas); var pointProperties = { style: { - background: "#" + ("000000" + this._options.color.toString(16)).substr(-6), - left: centerCss[0], - position: "absolute", - top: centerCss[1], + background: background, + transform: transform, }, }; vNodes.push(vd.h("div.TagVertex", pointProperties, [])); @@ -28981,6 +34111,15 @@ var OutlineCreateTag = (function () { polygonGeometry.addVertex2d(point); } }; + OutlineCreateTag.prototype._canvasToTransform = function (canvas) { + var canvasX = Math.round(canvas[0]); + var canvasY = Math.round(canvas[1]); + var transform = "translate(-50%,-50%) translate(" + canvasX + "px," + canvasY + "px)"; + return transform; + }; + OutlineCreateTag.prototype._colorToBackground = function (color) { + return "#" + ("000000" + color.toString(16)).substr(-6); + }; OutlineCreateTag.prototype._createOutine = function () { var polygon3d = this._geometry.getPoints3d(this._transform); var positions = this._getLinePositions(polygon3d); @@ -29014,20 +34153,12 @@ var OutlineCreateTag = (function () { } return positions; }; - OutlineCreateTag.prototype._projectToCanvas = function (point, projectionMatrix) { - var projected = new THREE.Vector3(point.x, point.y, point.z) - .applyMatrix4(projectionMatrix); - return [(projected.x + 1) / 2, (-projected.y + 1) / 2]; - }; - OutlineCreateTag.prototype._convertToCameraSpace = function (point, matrixWorldInverse) { - return new THREE.Vector3(point[0], point[1], point[2]).applyMatrix4(matrixWorldInverse); - }; return OutlineCreateTag; }()); exports.OutlineCreateTag = OutlineCreateTag; exports.default = OutlineCreateTag; -},{"../../../Component":226,"rxjs/Subject":34,"three":176,"virtual-dom":182}],296:[function(require,module,exports){ +},{"../../../Component":290,"../../../Geo":293,"rxjs/Subject":34,"three":240,"virtual-dom":246}],376:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -29048,11 +34179,11 @@ var Component_1 = require("../../../Component"); * @class OutlineRenderTag * @classdesc Tag visualizing the properties of an OutlineTag. */ -var OutlineRenderTag = (function (_super) { +var OutlineRenderTag = /** @class */ (function (_super) { __extends(OutlineRenderTag, _super); function OutlineRenderTag(tag, transform) { var _this = _super.call(this, tag, transform) || this; - _this._fill = _this._tag.fillOpacity > 0 && !transform.gpano ? + _this._fill = !transform.gpano ? _this._createFill() : null; _this._holes = _this._tag.lineWidth >= 1 ? @@ -29061,7 +34192,6 @@ var OutlineRenderTag = (function (_super) { _this._outline = _this._tag.lineWidth >= 1 ? _this._createOutline() : null; - _this._glObjects = _this._createGLObjects(); _this._geometryChangedSubscription = _this._tag.geometry.changed$ .subscribe(function (geometry) { if (_this._fill != null) { @@ -29077,17 +34207,11 @@ var OutlineRenderTag = (function (_super) { _this._changedSubscription = _this._tag.changed$ .subscribe(function (changedTag) { var glObjectsChanged = false; - if (_this._fill == null) { - if (_this._tag.fillOpacity > 0 && !_this._transform.gpano) { - _this._fill = _this._createFill(); - glObjectsChanged = true; - } - } - else { - _this._updateFillMaterial(); + if (_this._fill != null) { + _this._updateFillMaterial(_this._fill.material); } if (_this._outline == null) { - if (_this._tag.lineWidth > 0) { + if (_this._tag.lineWidth >= 1) { _this._holes = _this._createHoles(); _this._outline = _this._createOutline(); glObjectsChanged = true; @@ -29098,7 +34222,6 @@ var OutlineRenderTag = (function (_super) { _this._updateOutlineMaterial(); } if (glObjectsChanged) { - _this._glObjects = _this._createGLObjects(); _this._glObjectsChanged$.next(_this); } }); @@ -29111,62 +34234,60 @@ var OutlineRenderTag = (function (_super) { this._changedSubscription.unsubscribe(); this._geometryChangedSubscription.unsubscribe(); }; - OutlineRenderTag.prototype.getDOMObjects = function (atlas, matrixWorldInverse, projectionMatrix) { + OutlineRenderTag.prototype.getDOMObjects = function (atlas, camera, size) { var _this = this; var vNodes = []; var isRect = this._tag.geometry instanceof Component_1.RectGeometry; var isPerspective = !this._transform.gpano; + var container = { + offsetHeight: size.height, offsetWidth: size.width, + }; if (this._tag.icon != null && (isRect || isPerspective)) { - var icon3d = this._tag.geometry instanceof Component_1.RectGeometry ? - this._tag.geometry.getVertex3d(this._tag.iconIndex, this._transform) : - this._tag.geometry.getPoleOfAccessibility3d(this._transform); - var iconCameraSpace = this._convertToCameraSpace(icon3d, matrixWorldInverse); - if (iconCameraSpace.z < 0) { + var _a = this._tag.geometry instanceof Component_1.RectGeometry ? + this._tag.geometry.getVertex2d(this._tag.iconIndex) : + this._tag.geometry.getPoleOfAccessibility2d(), iconBasicX = _a[0], iconBasicY = _a[1]; + var iconCanvas = this._viewportCoords.basicToCanvasSafe(iconBasicX, iconBasicY, container, this._transform, camera); + if (iconCanvas != null) { var interact = function (e) { _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag }); }; if (atlas.loaded) { var sprite = atlas.getDOMSprite(this._tag.icon, this._tag.iconFloat); + var iconCanvasX = Math.round(iconCanvas[0]); + var iconCanvasY = Math.round(iconCanvas[1]); + var transform = "translate(" + iconCanvasX + "px," + iconCanvasY + "px)"; var click = function (e) { e.stopPropagation(); _this._tag.click$.next(_this._tag); }; - var iconCanvas = this._projectToCanvas(iconCameraSpace, projectionMatrix); - var iconCss = iconCanvas.map(function (coord) { return (100 * coord) + "%"; }); var properties = { onclick: click, onmousedown: interact, - style: { - left: iconCss[0], - pointerEvents: "all", - position: "absolute", - top: iconCss[1], - }, + style: { transform: transform }, }; vNodes.push(vd.h("div.TagSymbol", properties, [sprite])); } } } else if (this._tag.text != null && (isRect || isPerspective)) { - var text3d = this._tag.geometry instanceof Component_1.RectGeometry ? - this._tag.geometry.getVertex3d(3, this._transform) : - this._tag.geometry.getPoleOfAccessibility3d(this._transform); - var textCameraSpace = this._convertToCameraSpace(text3d, matrixWorldInverse); - if (textCameraSpace.z < 0) { + var _b = this._tag.geometry instanceof Component_1.RectGeometry ? + this._tag.geometry.getVertex2d(3) : + this._tag.geometry.getPoleOfAccessibility2d(), textBasicX = _b[0], textBasicY = _b[1]; + var textCanvas = this._viewportCoords.basicToCanvasSafe(textBasicX, textBasicY, container, this._transform, camera); + if (textCanvas != null) { + var textCanvasX = Math.round(textCanvas[0]); + var textCanvasY = Math.round(textCanvas[1]); + var transform = this._tag.geometry instanceof Component_1.RectGeometry ? + "translate(" + textCanvasX + "px," + textCanvasY + "px)" : + "translate(-50%, -50%) translate(" + textCanvasX + "px," + textCanvasY + "px)"; var interact = function (e) { _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag }); }; - var labelCanvas = this._projectToCanvas(textCameraSpace, projectionMatrix); - var labelCss = labelCanvas.map(function (coord) { return (100 * coord) + "%"; }); var properties = { onmousedown: interact, style: { - color: "#" + ("000000" + this._tag.textColor.toString(16)).substr(-6), - left: labelCss[0], - pointerEvents: "all", - position: "absolute", - top: labelCss[1], - transform: this._tag.geometry instanceof Component_1.RectGeometry ? undefined : "translate(-50%, -50%)", + color: this._colorToCss(this._tag.textColor), + transform: transform, }, textContent: this._tag.text, }; @@ -29176,79 +34297,57 @@ var OutlineRenderTag = (function (_super) { if (!this._tag.editable) { return vNodes; } - var lineColor = "#" + ("000000" + this._tag.lineColor.toString(16)).substr(-6); + var lineColor = this._colorToCss(this._tag.lineColor); if (this._tag.geometry instanceof Component_1.RectGeometry) { - var centroid3d = this._tag.geometry.getCentroid3d(this._transform); - var centroidCameraSpace = this._convertToCameraSpace(centroid3d, matrixWorldInverse); - if (centroidCameraSpace.z < 0) { - var interact = this._interact(Component_1.TagOperation.Centroid); - var centerCanvas = this._projectToCanvas(centroidCameraSpace, projectionMatrix); - var centerCss = centerCanvas.map(function (coord) { return (100 * coord) + "%"; }); + var _c = this._tag.geometry.getCentroid2d(), centroidBasicX = _c[0], centroidBasicY = _c[1]; + var centroidCanvas = this._viewportCoords.basicToCanvasSafe(centroidBasicX, centroidBasicY, container, this._transform, camera); + if (centroidCanvas != null) { + var interact = this._interact(Component_1.TagOperation.Centroid, "move"); + var centroidCanvasX = Math.round(centroidCanvas[0]); + var centroidCanvasY = Math.round(centroidCanvas[1]); + var transform = "translate(-50%, -50%) translate(" + centroidCanvasX + "px," + centroidCanvasY + "px)"; var properties = { onmousedown: interact, - style: { background: lineColor, left: centerCss[0], position: "absolute", top: centerCss[1] }, + style: { background: lineColor, transform: transform }, }; vNodes.push(vd.h("div.TagMover", properties, [])); } } - var vertices3d = this._tag.geometry.getVertices3d(this._transform); - for (var i = 0; i < vertices3d.length - 1; i++) { - var isRectGeometry = this._tag.geometry instanceof Component_1.RectGeometry; - if (isRectGeometry && + var vertices2d = this._tag.geometry.getVertices2d(); + for (var i = 0; i < vertices2d.length - 1; i++) { + if (isRect && ((this._tag.icon != null && i === this._tag.iconIndex) || (this._tag.icon == null && this._tag.text != null && i === 3))) { continue; } - var vertexCameraSpace = this._convertToCameraSpace(vertices3d[i], matrixWorldInverse); - if (vertexCameraSpace.z > 0) { + var _d = vertices2d[i], vertexBasicX = _d[0], vertexBasicY = _d[1]; + var vertexCanvas = this._viewportCoords.basicToCanvasSafe(vertexBasicX, vertexBasicY, container, this._transform, camera); + if (vertexCanvas == null) { continue; } - var interact = this._interact(Component_1.TagOperation.Vertex, i); - var vertexCanvas = this._projectToCanvas(vertexCameraSpace, projectionMatrix); - var vertexCss = vertexCanvas.map(function (coord) { return (100 * coord) + "%"; }); + var cursor = isRect ? + i % 2 === 0 ? "nesw-resize" : "nwse-resize" : + "crosshair"; + var interact = this._interact(Component_1.TagOperation.Vertex, cursor, i); + var vertexCanvasX = Math.round(vertexCanvas[0]); + var vertexCanvasY = Math.round(vertexCanvas[1]); + var transform = "translate(-50%, -50%) translate(" + vertexCanvasX + "px," + vertexCanvasY + "px)"; var properties = { onmousedown: interact, - style: { - background: lineColor, - left: vertexCss[0], - position: "absolute", - top: vertexCss[1], - }, + style: { background: lineColor, transform: transform, cursor: cursor }, }; - if (isRectGeometry) { - properties.style.cursor = i % 2 === 0 ? "nesw-resize" : "nwse-resize"; - } vNodes.push(vd.h("div.TagResizer", properties, [])); if (!this._tag.indicateVertices) { continue; } var pointProperties = { - style: { - background: lineColor, - left: vertexCss[0], - position: "absolute", - top: vertexCss[1], - }, + style: { background: lineColor, transform: transform }, }; vNodes.push(vd.h("div.TagVertex", pointProperties, [])); } return vNodes; }; - OutlineRenderTag.prototype._createFill = function () { - var triangles = this._tag.geometry.getTriangles3d(this._transform); - var positions = new Float32Array(triangles); - var geometry = new THREE.BufferGeometry(); - geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3)); - geometry.computeBoundingSphere(); - var material = new THREE.MeshBasicMaterial({ - color: this._tag.fillColor, - opacity: this._tag.fillOpacity, - side: THREE.DoubleSide, - transparent: true, - }); - return new THREE.Mesh(geometry, material); - }; - OutlineRenderTag.prototype._createGLObjects = function () { + OutlineRenderTag.prototype.getGLObjects = function () { var glObjects = []; if (this._fill != null) { glObjects.push(this._fill); @@ -29262,6 +34361,22 @@ var OutlineRenderTag = (function (_super) { } return glObjects; }; + OutlineRenderTag.prototype.getRetrievableObjects = function () { + return this._fill != null ? [this._fill] : []; + }; + OutlineRenderTag.prototype._colorToCss = function (color) { + return "#" + ("000000" + color.toString(16)).substr(-6); + }; + OutlineRenderTag.prototype._createFill = function () { + var triangles = this._tag.geometry.getTriangles3d(this._transform); + var positions = new Float32Array(triangles); + var geometry = new THREE.BufferGeometry(); + geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3)); + geometry.computeBoundingSphere(); + var material = new THREE.MeshBasicMaterial({ side: THREE.DoubleSide, transparent: true }); + this._updateFillMaterial(material); + return new THREE.Mesh(geometry, material); + }; OutlineRenderTag.prototype._createHoles = function () { var holes = []; if (this._tag.geometry instanceof Component_1.PolygonGeometry) { @@ -29326,12 +34441,13 @@ var OutlineRenderTag = (function (_super) { } return positions; }; - OutlineRenderTag.prototype._interact = function (operation, vertexIndex) { + OutlineRenderTag.prototype._interact = function (operation, cursor, vertexIndex) { var _this = this; return function (e) { var offsetX = e.offsetX - e.target.offsetWidth / 2; var offsetY = e.offsetY - e.target.offsetHeight / 2; _this._interact$.next({ + cursor: cursor, offsetX: offsetX, offsetY: offsetY, operation: operation, @@ -29355,8 +34471,7 @@ var OutlineRenderTag = (function (_super) { } geometry.computeBoundingSphere(); }; - OutlineRenderTag.prototype._updateFillMaterial = function () { - var material = this._fill.material; + OutlineRenderTag.prototype._updateFillMaterial = function (material) { material.color = new THREE.Color(this._tag.fillColor); material.opacity = this._tag.fillOpacity; material.needsUpdate = true; @@ -29399,15 +34514,16 @@ var OutlineRenderTag = (function (_super) { OutlineRenderTag.prototype._updateLineBasicMaterial = function (material) { material.color = new THREE.Color(this._tag.lineColor); material.linewidth = Math.max(this._tag.lineWidth, 1); - material.opacity = this._tag.lineWidth >= 1 ? this._tag.lineOpacity : 0; - material.transparent = this._tag.lineWidth <= 0 || this._tag.lineOpacity < 1; + material.visible = this._tag.lineWidth >= 1 && this._tag.lineOpacity > 0; + material.opacity = this._tag.lineOpacity; + material.transparent = this._tag.lineOpacity < 1; material.needsUpdate = true; }; return OutlineRenderTag; }(Component_1.RenderTag)); exports.OutlineRenderTag = OutlineRenderTag; -},{"../../../Component":226,"three":176,"virtual-dom":182}],297:[function(require,module,exports){ +},{"../../../Component":290,"three":240,"virtual-dom":246}],377:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -29439,7 +34555,7 @@ var Viewer_1 = require("../../../Viewer"); * tagComponent.add([tag]); * ``` */ -var OutlineTag = (function (_super) { +var OutlineTag = /** @class */ (function (_super) { __extends(OutlineTag, _super); /** * Create an outline tag. @@ -29453,6 +34569,7 @@ var OutlineTag = (function (_super) { */ function OutlineTag(id, geometry, options) { var _this = _super.call(this, id, geometry) || this; + options = !!options ? options : {}; _this._editable = options.editable == null ? false : options.editable; _this._fillColor = options.fillColor == null ? 0xFFFFFF : options.fillColor; _this._fillOpacity = options.fillOpacity == null ? 0.0 : options.fillOpacity; @@ -29772,193 +34889,960 @@ var OutlineTag = (function (_super) { this._textColor = options.textColor == null ? this._textColor : options.textColor; this._notifyChanged$.next(this); }; + /** + * Event fired when the icon of the outline tag is clicked. + * + * @event OutlineTag#click + * @type {OutlineTag} The tag instance that was clicked. + */ + OutlineTag.click = "click"; return OutlineTag; }(Component_1.Tag)); -/** - * Event fired when the icon of the outline tag is clicked. - * - * @event OutlineTag#click - * @type {OutlineTag} The tag instance that was clicked. - */ -OutlineTag.click = "click"; exports.OutlineTag = OutlineTag; exports.default = OutlineTag; -},{"../../../Component":226,"../../../Viewer":236,"rxjs/Subject":34}],298:[function(require,module,exports){ +},{"../../../Component":290,"../../../Viewer":301,"rxjs/Subject":34}],378:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); -var THREE = require("three"); var Subject_1 = require("rxjs/Subject"); -var RenderTag = (function () { - function RenderTag(tag, transform) { +var Geo_1 = require("../../../Geo"); +var RenderTag = /** @class */ (function () { + function RenderTag(tag, transform, viewportCoords) { this._tag = tag; this._transform = transform; - this._glObjects = []; + this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords(); this._glObjectsChanged$ = new Subject_1.Subject(); this._interact$ = new Subject_1.Subject(); } - Object.defineProperty(RenderTag.prototype, "glObjects", { + Object.defineProperty(RenderTag.prototype, "glObjectsChanged$", { + get: function () { + return this._glObjectsChanged$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RenderTag.prototype, "interact$", { + get: function () { + return this._interact$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RenderTag.prototype, "tag", { + get: function () { + return this._tag; + }, + enumerable: true, + configurable: true + }); + return RenderTag; +}()); +exports.RenderTag = RenderTag; +exports.default = RenderTag; + +},{"../../../Geo":293,"rxjs/Subject":34}],379:[function(require,module,exports){ +"use strict"; +/// +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var vd = require("virtual-dom"); +var Component_1 = require("../../../Component"); +var Viewer_1 = require("../../../Viewer"); +/** + * @class SpotRenderTag + * @classdesc Tag visualizing the properties of a SpotTag. + */ +var SpotRenderTag = /** @class */ (function (_super) { + __extends(SpotRenderTag, _super); + function SpotRenderTag() { + return _super !== null && _super.apply(this, arguments) || this; + } + SpotRenderTag.prototype.dispose = function () { }; + SpotRenderTag.prototype.getDOMObjects = function (atlas, camera, size) { + var _this = this; + var tag = this._tag; + var container = { + offsetHeight: size.height, offsetWidth: size.width, + }; + var vNodes = []; + var _a = tag.geometry.getCentroid2d(), centroidBasicX = _a[0], centroidBasicY = _a[1]; + var centroidCanvas = this._viewportCoords.basicToCanvasSafe(centroidBasicX, centroidBasicY, container, this._transform, camera); + if (centroidCanvas != null) { + var interactNone = function (e) { + _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: tag }); + }; + var canvasX = Math.round(centroidCanvas[0]); + var canvasY = Math.round(centroidCanvas[1]); + if (tag.icon != null) { + if (atlas.loaded) { + var sprite = atlas.getDOMSprite(tag.icon, Viewer_1.Alignment.Bottom); + var iconTransform = "translate(" + canvasX + "px," + (canvasY + 8) + "px)"; + var properties = { + onmousedown: interactNone, + style: { + pointerEvents: "all", + transform: iconTransform, + }, + }; + vNodes.push(vd.h("div", properties, [sprite])); + } + } + else if (tag.text != null) { + var textTransform = "translate(-50%,0%) translate(" + canvasX + "px," + (canvasY + 8) + "px)"; + var properties = { + onmousedown: interactNone, + style: { + color: this._colorToCss(tag.textColor), + transform: textTransform, + }, + textContent: tag.text, + }; + vNodes.push(vd.h("span.TagSymbol", properties, [])); + } + var interact = this._interact(Component_1.TagOperation.Centroid, tag, "move"); + var background = this._colorToCss(tag.color); + var transform = "translate(-50%,-50%) translate(" + canvasX + "px," + canvasY + "px)"; + if (tag.editable) { + var interactorProperties = { + onmousedown: interact, + style: { + background: background, + transform: transform, + }, + }; + vNodes.push(vd.h("div.TagSpotInteractor", interactorProperties, [])); + } + var pointProperties = { + style: { + background: background, + transform: transform, + }, + }; + vNodes.push(vd.h("div.TagVertex", pointProperties, [])); + } + return vNodes; + }; + SpotRenderTag.prototype.getGLObjects = function () { return []; }; + SpotRenderTag.prototype.getRetrievableObjects = function () { return []; }; + SpotRenderTag.prototype._colorToCss = function (color) { + return "#" + ("000000" + color.toString(16)).substr(-6); + }; + SpotRenderTag.prototype._interact = function (operation, tag, cursor, vertexIndex) { + var _this = this; + return function (e) { + var offsetX = e.offsetX - e.target.offsetWidth / 2; + var offsetY = e.offsetY - e.target.offsetHeight / 2; + _this._interact$.next({ + cursor: cursor, + offsetX: offsetX, + offsetY: offsetY, + operation: operation, + tag: tag, + vertexIndex: vertexIndex, + }); + }; + }; + return SpotRenderTag; +}(Component_1.RenderTag)); +exports.SpotRenderTag = SpotRenderTag; + +},{"../../../Component":290,"../../../Viewer":301,"virtual-dom":246}],380:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Component_1 = require("../../../Component"); +/** + * @class SpotTag + * + * @classdesc Tag holding properties for visualizing the centroid of a geometry. + * + * @example + * ``` + * var geometry = new Mapillary.TagComponent.PointGeometry([0.3, 0.3]); + * var tag = new Mapillary.TagComponent.SpotTag( + * "id-1", + * geometry + * { editable: true, color: 0xff0000 }); + * + * tagComponent.add([tag]); + * ``` + */ +var SpotTag = /** @class */ (function (_super) { + __extends(SpotTag, _super); + /** + * Create a spot tag. + * + * @override + * @constructor + * @param {string} id + * @param {Geometry} geometry + * @param {IOutlineTagOptions} options - Options defining the visual appearance and + * behavior of the spot tag. + */ + function SpotTag(id, geometry, options) { + var _this = _super.call(this, id, geometry) || this; + options = !!options ? options : {}; + _this._color = options.color == null ? 0xFFFFFF : options.color; + _this._editable = options.editable == null ? false : options.editable; + _this._icon = options.icon === undefined ? null : options.icon; + _this._text = options.text === undefined ? null : options.text; + _this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor; + return _this; + } + Object.defineProperty(SpotTag.prototype, "color", { + /** + * Get color property. + * @returns {number} The color of the spot as a hexagonal number; + */ + get: function () { + return this._color; + }, + /** + * Set color property. + * @param {number} + * + * @fires Tag#changed + */ + set: function (value) { + this._color = value; + this._notifyChanged$.next(this); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SpotTag.prototype, "editable", { + /** + * Get editable property. + * @returns {boolean} Value indicating if tag is editable. + */ + get: function () { + return this._editable; + }, + /** + * Set editable property. + * @param {boolean} + * + * @fires Tag#changed + */ + set: function (value) { + this._editable = value; + this._notifyChanged$.next(this); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SpotTag.prototype, "icon", { + /** + * Get icon property. + * @returns {string} + */ + get: function () { + return this._icon; + }, + /** + * Set icon property. + * @param {string} + * + * @fires Tag#changed + */ + set: function (value) { + this._icon = value; + this._notifyChanged$.next(this); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SpotTag.prototype, "text", { + /** + * Get text property. + * @returns {string} + */ + get: function () { + return this._text; + }, + /** + * Set text property. + * @param {string} + * + * @fires Tag#changed + */ + set: function (value) { + this._text = value; + this._notifyChanged$.next(this); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SpotTag.prototype, "textColor", { + /** + * Get text color property. + * @returns {number} + */ + get: function () { + return this._textColor; + }, + /** + * Set text color property. + * @param {number} + * + * @fires Tag#changed + */ + set: function (value) { + this._textColor = value; + this._notifyChanged$.next(this); + }, + enumerable: true, + configurable: true + }); + /** + * Set options for tag. + * + * @description Sets all the option properties provided and keps + * the rest of the values as is. + * + * @param {ISpotTagOptions} options - Spot tag options + * + * @fires {Tag#changed} + */ + SpotTag.prototype.setOptions = function (options) { + this._color = options.color == null ? this._color : options.color; + this._editable = options.editable == null ? this._editable : options.editable; + this._icon = options.icon === undefined ? this._icon : options.icon; + this._text = options.text === undefined ? this._text : options.text; + this._textColor = options.textColor == null ? this._textColor : options.textColor; + this._notifyChanged$.next(this); + }; + return SpotTag; +}(Component_1.Tag)); +exports.SpotTag = SpotTag; +exports.default = SpotTag; + +},{"../../../Component":290}],381:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Subject_1 = require("rxjs/Subject"); +var Utils_1 = require("../../../Utils"); +/** + * @class Tag + * @abstract + * @classdesc Abstract class representing the basic functionality of for a tag. + */ +var Tag = /** @class */ (function (_super) { + __extends(Tag, _super); + /** + * Create a tag. + * + * @constructor + * @param {string} id + * @param {Geometry} geometry + */ + function Tag(id, geometry) { + var _this = _super.call(this) || this; + _this._id = id; + _this._geometry = geometry; + _this._notifyChanged$ = new Subject_1.Subject(); + _this._notifyChanged$ + .subscribe(function (t) { + _this.fire(Tag.changed, _this); + }); + _this._geometry.changed$ + .subscribe(function (g) { + _this.fire(Tag.geometrychanged, _this); + }); + return _this; + } + Object.defineProperty(Tag.prototype, "id", { /** - * Get the GL objects for rendering of the tag. - * @return {Array} + * Get id property. + * @returns {string} */ get: function () { - return this._glObjects; + return this._id; }, enumerable: true, configurable: true }); - Object.defineProperty(RenderTag.prototype, "glObjectsChanged$", { + Object.defineProperty(Tag.prototype, "geometry", { + /** + * Get geometry property. + * @returns {Geometry} The geometry of the tag. + */ get: function () { - return this._glObjectsChanged$; + return this._geometry; }, enumerable: true, configurable: true }); - Object.defineProperty(RenderTag.prototype, "interact$", { + Object.defineProperty(Tag.prototype, "changed$", { + /** + * Get changed observable. + * @returns {Observable} + * @ignore + */ get: function () { - return this._interact$; + return this._notifyChanged$; }, enumerable: true, configurable: true }); - Object.defineProperty(RenderTag.prototype, "tag", { + Object.defineProperty(Tag.prototype, "geometryChanged$", { + /** + * Get geometry changed observable. + * @returns {Observable} + * @ignore + */ get: function () { - return this._tag; + var _this = this; + return this._geometry.changed$ + .map(function (geometry) { + return _this; + }) + .share(); + }, + enumerable: true, + configurable: true + }); + /** + * Event fired when a property related to the visual appearance of the + * tag has changed. + * + * @event Tag#changed + * @type {Tag} The tag instance that has changed. + */ + Tag.changed = "changed"; + /** + * Event fired when the geometry of the tag has changed. + * + * @event Tag#geometrychanged + * @type {Tag} The tag instance whose geometry has changed. + */ + Tag.geometrychanged = "geometrychanged"; + return Tag; +}(Utils_1.EventEmitter)); +exports.Tag = Tag; +exports.default = Tag; + +},{"../../../Utils":300,"rxjs/Subject":34}],382:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var HandlerBase = /** @class */ (function () { + function HandlerBase(component, container, navigator) { + this._component = component; + this._container = container; + this._navigator = navigator; + this._enabled = false; + } + Object.defineProperty(HandlerBase.prototype, "isEnabled", { + /** + * Returns a Boolean indicating whether the interaction is enabled. + * + * @returns {boolean} `true` if the interaction is enabled. + */ + get: function () { + return this._enabled; }, enumerable: true, configurable: true }); - RenderTag.prototype._projectToCanvas = function (point3d, projectionMatrix) { - var projected = new THREE.Vector3(point3d.x, point3d.y, point3d.z) - .applyMatrix4(projectionMatrix); - return [(projected.x + 1) / 2, (-projected.y + 1) / 2]; + /** + * Enables the interaction. + * + * @example ```..enable();``` + */ + HandlerBase.prototype.enable = function () { + if (this._enabled || !this._component.activated) { + return; + } + this._enable(); + this._enabled = true; + this._component.configure(this._getConfiguration(true)); }; - RenderTag.prototype._convertToCameraSpace = function (point3d, matrixWorldInverse) { - return new THREE.Vector3(point3d[0], point3d[1], point3d[2]).applyMatrix4(matrixWorldInverse); + /** + * Disables the interaction. + * + * @example ```..disable();``` + */ + HandlerBase.prototype.disable = function () { + if (!this._enabled) { + return; + } + this._disable(); + this._enabled = false; + if (this._component.activated) { + this._component.configure(this._getConfiguration(false)); + } }; - return RenderTag; + return HandlerBase; }()); -exports.RenderTag = RenderTag; -exports.default = RenderTag; +exports.HandlerBase = HandlerBase; +exports.default = HandlerBase; -},{"rxjs/Subject":34,"three":176}],299:[function(require,module,exports){ +},{}],383:[function(require,module,exports){ "use strict"; -/// -var __extends = (this && this.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); +/// Object.defineProperty(exports, "__esModule", { value: true }); -var vd = require("virtual-dom"); -var Component_1 = require("../../../Component"); -var Viewer_1 = require("../../../Viewer"); -/** - * @class SpotRenderTag - * @classdesc Tag visualizing the properties of a SpotTag. - */ -var SpotRenderTag = (function (_super) { - __extends(SpotRenderTag, _super); - function SpotRenderTag() { - return _super !== null && _super.apply(this, arguments) || this; +var THREE = require("three"); +var Component_1 = require("../../Component"); +var MeshFactory = /** @class */ (function () { + function MeshFactory(imagePlaneDepth, imageSphereRadius) { + this._imagePlaneDepth = imagePlaneDepth != null ? imagePlaneDepth : 200; + this._imageSphereRadius = imageSphereRadius != null ? imageSphereRadius : 200; } - SpotRenderTag.prototype.dispose = function () { return; }; - SpotRenderTag.prototype.getDOMObjects = function (atlas, matrixWorldInverse, projectionMatrix) { - var _this = this; - var vNodes = []; - var centroid3d = this._tag.geometry.getCentroid3d(this._transform); - var centroidCameraSpace = this._convertToCameraSpace(centroid3d, matrixWorldInverse); - if (centroidCameraSpace.z < 0) { - var centroidCanvas = this._projectToCanvas(centroidCameraSpace, projectionMatrix); - var centroidCss = centroidCanvas.map(function (coord) { return (100 * coord) + "%"; }); - var interactNone = function (e) { - _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag }); - }; - if (this._tag.icon != null) { - if (atlas.loaded) { - var sprite = atlas.getDOMSprite(this._tag.icon, Viewer_1.Alignment.Bottom); - var properties = { - onmousedown: interactNone, - style: { - left: centroidCss[0], - pointerEvents: "all", - position: "absolute", - top: centroidCss[1], - transform: "translate(0, 8px)", - }, - }; - vNodes.push(vd.h("div", properties, [sprite])); - } - } - else if (this._tag.text != null) { - var properties = { - onmousedown: interactNone, - style: { - color: "#" + ("000000" + this._tag.textColor.toString(16)).substr(-6), - left: centroidCss[0], - pointerEvents: "all", - position: "absolute", - top: centroidCss[1], - transform: "translate(-50%, 8px)", - }, - textContent: this._tag.text, - }; - vNodes.push(vd.h("span.TagSymbol", properties, [])); - } - var interact = this._interact(Component_1.TagOperation.Centroid); - var background = "#" + ("000000" + this._tag.color.toString(16)).substr(-6); - if (this._tag.editable) { - var interactorProperties = { - onmousedown: interact, - style: { - background: background, - left: centroidCss[0], - pointerEvents: "all", - position: "absolute", - top: centroidCss[1], - }, - }; - vNodes.push(vd.h("div.TagSpotInteractor", interactorProperties, [])); - } - var pointProperties = { - style: { - background: background, - left: centroidCss[0], - position: "absolute", - top: centroidCss[1], + MeshFactory.prototype.createMesh = function (node, transform) { + var mesh = node.pano ? + this._createImageSphere(node, transform) : + this._createImagePlane(node, transform); + return mesh; + }; + MeshFactory.prototype.createScaledFlatMesh = function (node, transform, dx, dy) { + var texture = this._createTexture(node.image); + var materialParameters = this._createPlaneMaterialParameters(transform, texture); + var material = new THREE.ShaderMaterial(materialParameters); + var geometry = this._getFlatImagePlaneGeo(transform, dx, dy); + return new THREE.Mesh(geometry, material); + }; + MeshFactory.prototype.createFlatMesh = function (node, transform, basicX0, basicX1, basicY0, basicY1) { + var texture = this._createTexture(node.image); + var materialParameters = this._createPlaneMaterialParameters(transform, texture); + var material = new THREE.ShaderMaterial(materialParameters); + var geometry = this._getFlatImagePlaneGeoFromBasic(transform, basicX0, basicX1, basicY0, basicY1); + return new THREE.Mesh(geometry, material); + }; + MeshFactory.prototype.createCurtainMesh = function (node, transform) { + if (node.pano && !node.fullPano) { + throw new Error("Cropped panoramas cannot have curtain."); + } + return node.pano ? + this._createSphereCurtainMesh(node, transform) : + this._createCurtainMesh(node, transform); + }; + MeshFactory.prototype._createCurtainMesh = function (node, transform) { + var texture = this._createTexture(node.image); + var materialParameters = this._createCurtainPlaneMaterialParameters(transform, texture); + var material = new THREE.ShaderMaterial(materialParameters); + var geometry = this._useMesh(transform, node) ? + this._getImagePlaneGeo(transform, node) : + this._getRegularFlatImagePlaneGeo(transform); + return new THREE.Mesh(geometry, material); + }; + MeshFactory.prototype._createSphereCurtainMesh = function (node, transform) { + var texture = this._createTexture(node.image); + var materialParameters = this._createCurtainSphereMaterialParameters(transform, texture); + var material = new THREE.ShaderMaterial(materialParameters); + return this._useMesh(transform, node) ? + new THREE.Mesh(this._getImageSphereGeo(transform, node), material) : + new THREE.Mesh(this._getFlatImageSphereGeo(transform), material); + }; + MeshFactory.prototype._createImageSphere = function (node, transform) { + var texture = this._createTexture(node.image); + var materialParameters = this._createSphereMaterialParameters(transform, texture); + var material = new THREE.ShaderMaterial(materialParameters); + var mesh = this._useMesh(transform, node) ? + new THREE.Mesh(this._getImageSphereGeo(transform, node), material) : + new THREE.Mesh(this._getFlatImageSphereGeo(transform), material); + return mesh; + }; + MeshFactory.prototype._createImagePlane = function (node, transform) { + var texture = this._createTexture(node.image); + var materialParameters = this._createPlaneMaterialParameters(transform, texture); + var material = new THREE.ShaderMaterial(materialParameters); + var geometry = this._useMesh(transform, node) ? + this._getImagePlaneGeo(transform, node) : + this._getRegularFlatImagePlaneGeo(transform); + return new THREE.Mesh(geometry, material); + }; + MeshFactory.prototype._createSphereMaterialParameters = function (transform, texture) { + var gpano = transform.gpano; + var halfCroppedWidth = (gpano.FullPanoWidthPixels - gpano.CroppedAreaImageWidthPixels) / 2; + var phiShift = 2 * Math.PI * (gpano.CroppedAreaLeftPixels - halfCroppedWidth) / gpano.FullPanoWidthPixels; + var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels; + var halfCroppedHeight = (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels) / 2; + var thetaShift = Math.PI * (halfCroppedHeight - gpano.CroppedAreaTopPixels) / gpano.FullPanoHeightPixels; + var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels; + var materialParameters = { + depthWrite: false, + fragmentShader: Component_1.Shaders.equirectangular.fragment, + side: THREE.DoubleSide, + transparent: true, + uniforms: { + opacity: { + type: "f", + value: 1, }, - }; - vNodes.push(vd.h("div.TagVertex", pointProperties, [])); + phiLength: { + type: "f", + value: phiLength, + }, + phiShift: { + type: "f", + value: phiShift, + }, + projectorMat: { + type: "m4", + value: transform.rt, + }, + projectorTex: { + type: "t", + value: texture, + }, + thetaLength: { + type: "f", + value: thetaLength, + }, + thetaShift: { + type: "f", + value: thetaShift, + }, + }, + vertexShader: Component_1.Shaders.equirectangular.vertex, + }; + return materialParameters; + }; + MeshFactory.prototype._createCurtainSphereMaterialParameters = function (transform, texture) { + var gpano = transform.gpano; + var halfCroppedWidth = (gpano.FullPanoWidthPixels - gpano.CroppedAreaImageWidthPixels) / 2; + var phiShift = 2 * Math.PI * (gpano.CroppedAreaLeftPixels - halfCroppedWidth) / gpano.FullPanoWidthPixels; + var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels; + var halfCroppedHeight = (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels) / 2; + var thetaShift = Math.PI * (halfCroppedHeight - gpano.CroppedAreaTopPixels) / gpano.FullPanoHeightPixels; + var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels; + var materialParameters = { + depthWrite: false, + fragmentShader: Component_1.Shaders.equirectangularCurtain.fragment, + side: THREE.DoubleSide, + transparent: true, + uniforms: { + curtain: { + type: "f", + value: 1, + }, + opacity: { + type: "f", + value: 1, + }, + phiLength: { + type: "f", + value: phiLength, + }, + phiShift: { + type: "f", + value: phiShift, + }, + projectorMat: { + type: "m4", + value: transform.rt, + }, + projectorTex: { + type: "t", + value: texture, + }, + thetaLength: { + type: "f", + value: thetaLength, + }, + thetaShift: { + type: "f", + value: thetaShift, + }, + }, + vertexShader: Component_1.Shaders.equirectangularCurtain.vertex, + }; + return materialParameters; + }; + MeshFactory.prototype._createPlaneMaterialParameters = function (transform, texture) { + var materialParameters = { + depthWrite: false, + fragmentShader: Component_1.Shaders.perspective.fragment, + side: THREE.DoubleSide, + transparent: true, + uniforms: { + opacity: { + type: "f", + value: 1, + }, + projectorMat: { + type: "m4", + value: transform.projectorMatrix(), + }, + projectorTex: { + type: "t", + value: texture, + }, + }, + vertexShader: Component_1.Shaders.perspective.vertex, + }; + return materialParameters; + }; + MeshFactory.prototype._createCurtainPlaneMaterialParameters = function (transform, texture) { + var materialParameters = { + depthWrite: false, + fragmentShader: Component_1.Shaders.perspectiveCurtain.fragment, + side: THREE.DoubleSide, + transparent: true, + uniforms: { + curtain: { + type: "f", + value: 1, + }, + opacity: { + type: "f", + value: 1, + }, + projectorMat: { + type: "m4", + value: transform.projectorMatrix(), + }, + projectorTex: { + type: "t", + value: texture, + }, + }, + vertexShader: Component_1.Shaders.perspective.vertex, + }; + return materialParameters; + }; + MeshFactory.prototype._createTexture = function (image) { + var texture = new THREE.Texture(image); + texture.minFilter = THREE.LinearFilter; + texture.needsUpdate = true; + return texture; + }; + MeshFactory.prototype._useMesh = function (transform, node) { + return node.mesh.vertices.length && transform.hasValidScale; + }; + MeshFactory.prototype._getImageSphereGeo = function (transform, node) { + var t = new THREE.Matrix4().getInverse(transform.srt); + // push everything at least 5 meters in front of the camera + var minZ = 5.0 * transform.scale; + var maxZ = this._imageSphereRadius * transform.scale; + var vertices = node.mesh.vertices; + var numVertices = vertices.length / 3; + var positions = new Float32Array(vertices.length); + for (var i = 0; i < numVertices; ++i) { + var index = 3 * i; + var x = vertices[index + 0]; + var y = vertices[index + 1]; + var z = vertices[index + 2]; + var l = Math.sqrt(x * x + y * y + z * z); + var boundedL = Math.max(minZ, Math.min(l, maxZ)); + var factor = boundedL / l; + var p = new THREE.Vector3(x * factor, y * factor, z * factor); + p.applyMatrix4(t); + positions[index + 0] = p.x; + positions[index + 1] = p.y; + positions[index + 2] = p.z; + } + var faces = node.mesh.faces; + var indices = new Uint16Array(faces.length); + for (var i = 0; i < faces.length; ++i) { + indices[i] = faces[i]; + } + var geometry = new THREE.BufferGeometry(); + geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3)); + geometry.setIndex(new THREE.BufferAttribute(indices, 1)); + return geometry; + }; + MeshFactory.prototype._getImagePlaneGeo = function (transform, node) { + var t = new THREE.Matrix4().getInverse(transform.srt); + // push everything at least 5 meters in front of the camera + var minZ = 5.0 * transform.scale; + var maxZ = this._imagePlaneDepth * transform.scale; + var vertices = node.mesh.vertices; + var numVertices = vertices.length / 3; + var positions = new Float32Array(vertices.length); + for (var i = 0; i < numVertices; ++i) { + var index = 3 * i; + var x = vertices[index + 0]; + var y = vertices[index + 1]; + var z = vertices[index + 2]; + var boundedZ = Math.max(minZ, Math.min(z, maxZ)); + var factor = boundedZ / z; + var p = new THREE.Vector3(x * factor, y * factor, boundedZ); + p.applyMatrix4(t); + positions[index + 0] = p.x; + positions[index + 1] = p.y; + positions[index + 2] = p.z; + } + var faces = node.mesh.faces; + var indices = new Uint16Array(faces.length); + for (var i = 0; i < faces.length; ++i) { + indices[i] = faces[i]; + } + var geometry = new THREE.BufferGeometry(); + geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3)); + geometry.setIndex(new THREE.BufferAttribute(indices, 1)); + return geometry; + }; + MeshFactory.prototype._getFlatImageSphereGeo = function (transform) { + var gpano = transform.gpano; + var phiStart = 2 * Math.PI * gpano.CroppedAreaLeftPixels / gpano.FullPanoWidthPixels; + var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels; + var thetaStart = Math.PI * + (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels - gpano.CroppedAreaTopPixels) / + gpano.FullPanoHeightPixels; + var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels; + var geometry = new THREE.SphereGeometry(this._imageSphereRadius, 20, 40, phiStart - Math.PI / 2, phiLength, thetaStart, thetaLength); + geometry.applyMatrix(new THREE.Matrix4().getInverse(transform.rt)); + return geometry; + }; + MeshFactory.prototype._getRegularFlatImagePlaneGeo = function (transform) { + var width = transform.width; + var height = transform.height; + var size = Math.max(width, height); + var dx = width / 2.0 / size; + var dy = height / 2.0 / size; + return this._getFlatImagePlaneGeo(transform, dx, dy); + }; + MeshFactory.prototype._getFlatImagePlaneGeo = function (transform, dx, dy) { + var vertices = []; + vertices.push(transform.unprojectSfM([-dx, -dy], this._imagePlaneDepth)); + vertices.push(transform.unprojectSfM([dx, -dy], this._imagePlaneDepth)); + vertices.push(transform.unprojectSfM([dx, dy], this._imagePlaneDepth)); + vertices.push(transform.unprojectSfM([-dx, dy], this._imagePlaneDepth)); + return this._createFlatGeometry(vertices); + }; + MeshFactory.prototype._getFlatImagePlaneGeoFromBasic = function (transform, basicX0, basicX1, basicY0, basicY1) { + var vertices = []; + vertices.push(transform.unprojectBasic([basicX0, basicY0], this._imagePlaneDepth)); + vertices.push(transform.unprojectBasic([basicX1, basicY0], this._imagePlaneDepth)); + vertices.push(transform.unprojectBasic([basicX1, basicY1], this._imagePlaneDepth)); + vertices.push(transform.unprojectBasic([basicX0, basicY1], this._imagePlaneDepth)); + return this._createFlatGeometry(vertices); + }; + MeshFactory.prototype._createFlatGeometry = function (vertices) { + var positions = new Float32Array(12); + for (var i = 0; i < vertices.length; i++) { + var index = 3 * i; + positions[index + 0] = vertices[i][0]; + positions[index + 1] = vertices[i][1]; + positions[index + 2] = vertices[i][2]; + } + var indices = new Uint16Array(6); + indices[0] = 0; + indices[1] = 1; + indices[2] = 3; + indices[3] = 1; + indices[4] = 2; + indices[5] = 3; + var geometry = new THREE.BufferGeometry(); + geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3)); + geometry.setIndex(new THREE.BufferAttribute(indices, 1)); + return geometry; + }; + return MeshFactory; +}()); +exports.MeshFactory = MeshFactory; +exports.default = MeshFactory; + +},{"../../Component":290,"three":240}],384:[function(require,module,exports){ +"use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); +var THREE = require("three"); +var MeshScene = /** @class */ (function () { + function MeshScene() { + this.scene = new THREE.Scene(); + this.sceneOld = new THREE.Scene(); + this.imagePlanes = []; + this.imagePlanesOld = []; + } + MeshScene.prototype.updateImagePlanes = function (planes) { + this._dispose(this.imagePlanesOld, this.sceneOld); + for (var _i = 0, _a = this.imagePlanes; _i < _a.length; _i++) { + var plane = _a[_i]; + this.scene.remove(plane); + this.sceneOld.add(plane); + } + for (var _b = 0, planes_1 = planes; _b < planes_1.length; _b++) { + var plane = planes_1[_b]; + this.scene.add(plane); + } + this.imagePlanesOld = this.imagePlanes; + this.imagePlanes = planes; + }; + MeshScene.prototype.addImagePlanes = function (planes) { + for (var _i = 0, planes_2 = planes; _i < planes_2.length; _i++) { + var plane = planes_2[_i]; + this.scene.add(plane); + this.imagePlanes.push(plane); + } + }; + MeshScene.prototype.addImagePlanesOld = function (planes) { + for (var _i = 0, planes_3 = planes; _i < planes_3.length; _i++) { + var plane = planes_3[_i]; + this.sceneOld.add(plane); + this.imagePlanesOld.push(plane); + } + }; + MeshScene.prototype.setImagePlanes = function (planes) { + this._clear(); + this.addImagePlanes(planes); + }; + MeshScene.prototype.setImagePlanesOld = function (planes) { + this._clearOld(); + this.addImagePlanesOld(planes); + }; + MeshScene.prototype.clear = function () { + this._clear(); + this._clearOld(); + }; + MeshScene.prototype._clear = function () { + this._dispose(this.imagePlanes, this.scene); + this.imagePlanes.length = 0; + }; + MeshScene.prototype._clearOld = function () { + this._dispose(this.imagePlanesOld, this.sceneOld); + this.imagePlanesOld.length = 0; + }; + MeshScene.prototype._dispose = function (planes, scene) { + for (var _i = 0, planes_4 = planes; _i < planes_4.length; _i++) { + var plane = planes_4[_i]; + scene.remove(plane); + plane.geometry.dispose(); + plane.material.dispose(); + var texture = plane.material.uniforms.projectorTex.value; + if (texture != null) { + texture.dispose(); + } } - return vNodes; - }; - SpotRenderTag.prototype._interact = function (operation, vertexIndex) { - var _this = this; - return function (e) { - var offsetX = e.offsetX - e.target.offsetWidth / 2; - var offsetY = e.offsetY - e.target.offsetHeight / 2; - _this._interact$.next({ - offsetX: offsetX, - offsetY: offsetY, - operation: operation, - tag: _this._tag, - vertexIndex: vertexIndex, - }); - }; }; - return SpotRenderTag; -}(Component_1.RenderTag)); -exports.SpotRenderTag = SpotRenderTag; + return MeshScene; +}()); +exports.MeshScene = MeshScene; +exports.default = MeshScene; -},{"../../../Component":226,"../../../Viewer":236,"virtual-dom":182}],300:[function(require,module,exports){ +},{"three":240}],385:[function(require,module,exports){ "use strict"; +/// var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || @@ -29970,173 +35854,68 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Component_1 = require("../../../Component"); -/** - * @class SpotTag - * - * @classdesc Tag holding properties for visualizing the centroid of a geometry. - * - * @example - * ``` - * var geometry = new Mapillary.TagComponent.PointGeometry([0.3, 0.3]); - * var tag = new Mapillary.TagComponent.SpotTag( - * "id-1", - * geometry - * { editable: true, color: 0xff0000 }); - * - * tagComponent.add([tag]); - * ``` - */ -var SpotTag = (function (_super) { - __extends(SpotTag, _super); - /** - * Create a spot tag. - * - * @override - * @constructor - * @param {string} id - * @param {Geometry} geometry - * @param {IOutlineTagOptions} options - Options defining the visual appearance and - * behavior of the spot tag. - */ - function SpotTag(id, geometry, options) { - var _this = _super.call(this, id, geometry) || this; - _this._color = options.color == null ? 0xFFFFFF : options.color; - _this._editable = options.editable == null ? false : options.editable; - _this._icon = options.icon === undefined ? null : options.icon; - _this._text = options.text === undefined ? null : options.text; - _this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor; +var vd = require("virtual-dom"); +var Observable_1 = require("rxjs/Observable"); +var Subject_1 = require("rxjs/Subject"); +var Component_1 = require("../../Component"); +var Geo_1 = require("../../Geo"); +var State_1 = require("../../State"); +var ZoomComponent = /** @class */ (function (_super) { + __extends(ZoomComponent, _super); + function ZoomComponent(name, container, navigator) { + var _this = _super.call(this, name, container, navigator) || this; + _this._viewportCoords = new Geo_1.ViewportCoords(); + _this._zoomDelta$ = new Subject_1.Subject(); return _this; } - Object.defineProperty(SpotTag.prototype, "color", { - /** - * Get color property. - * @returns {number} The color of the spot as a hexagonal number; - */ - get: function () { - return this._color; - }, - /** - * Set color property. - * @param {number} - * - * @fires Tag#changed - */ - set: function (value) { - this._color = value; - this._notifyChanged$.next(this); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SpotTag.prototype, "editable", { - /** - * Get editable property. - * @returns {boolean} Value indicating if tag is editable. - */ - get: function () { - return this._editable; - }, - /** - * Set editable property. - * @param {boolean} - * - * @fires Tag#changed - */ - set: function (value) { - this._editable = value; - this._notifyChanged$.next(this); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SpotTag.prototype, "icon", { - /** - * Get icon property. - * @returns {string} - */ - get: function () { - return this._icon; - }, - /** - * Set icon property. - * @param {string} - * - * @fires Tag#changed - */ - set: function (value) { - this._icon = value; - this._notifyChanged$.next(this); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SpotTag.prototype, "text", { - /** - * Get text property. - * @returns {string} - */ - get: function () { - return this._text; - }, - /** - * Set text property. - * @param {string} - * - * @fires Tag#changed - */ - set: function (value) { - this._text = value; - this._notifyChanged$.next(this); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(SpotTag.prototype, "textColor", { - /** - * Get text color property. - * @returns {number} - */ - get: function () { - return this._textColor; - }, - /** - * Set text color property. - * @param {number} - * - * @fires Tag#changed - */ - set: function (value) { - this._textColor = value; - this._notifyChanged$.next(this); - }, - enumerable: true, - configurable: true - }); - /** - * Set options for tag. - * - * @description Sets all the option properties provided and keps - * the rest of the values as is. - * - * @param {ISpotTagOptions} options - Spot tag options - * - * @fires {Tag#changed} - */ - SpotTag.prototype.setOptions = function (options) { - this._color = options.color == null ? this._color : options.color; - this._editable = options.editable == null ? this._editable : options.editable; - this._icon = options.icon === undefined ? this._icon : options.icon; - this._text = options.text === undefined ? this._text : options.text; - this._textColor = options.textColor == null ? this._textColor : options.textColor; - this._notifyChanged$.next(this); + ZoomComponent.prototype._activate = function () { + var _this = this; + this._renderSubscription = Observable_1.Observable + .combineLatest(this._navigator.stateService.currentState$, this._navigator.stateService.state$) + .map(function (_a) { + var frame = _a[0], state = _a[1]; + return [frame.state.zoom, state]; + }) + .map(function (_a) { + var zoom = _a[0], state = _a[1]; + var zoomInIcon = vd.h("div.ZoomInIcon", []); + var zoomInButton = zoom >= 3 || state === State_1.State.Waiting ? + vd.h("div.ZoomInButtonDisabled", [zoomInIcon]) : + vd.h("div.ZoomInButton", { onclick: function () { _this._zoomDelta$.next(1); } }, [zoomInIcon]); + var zoomOutIcon = vd.h("div.ZoomOutIcon", []); + var zoomOutButton = zoom <= 0 || state === State_1.State.Waiting ? + vd.h("div.ZoomOutButtonDisabled", [zoomOutIcon]) : + vd.h("div.ZoomOutButton", { onclick: function () { _this._zoomDelta$.next(-1); } }, [zoomOutIcon]); + return { + name: _this._name, + vnode: vd.h("div.ZoomContainer", { oncontextmenu: function (event) { event.preventDefault(); } }, [zoomInButton, zoomOutButton]), + }; + }) + .subscribe(this._container.domRenderer.render$); + this._zoomSubscription = this._zoomDelta$ + .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$) + .subscribe(function (_a) { + var zoomDelta = _a[0], render = _a[1], transform = _a[2]; + var unprojected = _this._viewportCoords.unprojectFromViewport(0, 0, render.perspective); + var reference = transform.projectBasic(unprojected.toArray()); + _this._navigator.stateService.zoomIn(zoomDelta, reference); + }); }; - return SpotTag; -}(Component_1.Tag)); -exports.SpotTag = SpotTag; -exports.default = SpotTag; + ZoomComponent.prototype._deactivate = function () { + this._renderSubscription.unsubscribe(); + this._zoomSubscription.unsubscribe(); + }; + ZoomComponent.prototype._getDefaultConfiguration = function () { + return {}; + }; + ZoomComponent.componentName = "zoom"; + return ZoomComponent; +}(Component_1.Component)); +exports.ZoomComponent = ZoomComponent; +Component_1.ComponentService.register(ZoomComponent); +exports.default = ZoomComponent; -},{"../../../Component":226}],301:[function(require,module,exports){ +},{"../../Component":290,"../../Geo":293,"../../State":297,"rxjs/Observable":29,"rxjs/Subject":34,"virtual-dom":246}],386:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -30149,111 +35928,27 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/share"); -var Utils_1 = require("../../../Utils"); +var MapillaryError_1 = require("./MapillaryError"); /** - * @class Tag - * @abstract - * @classdesc Abstract class representing the basic functionality of for a tag. + * @class AbortMapillaryError + * + * @classdesc Error thrown when a move to request has been + * aborted before completing because of a subsequent request. */ -var Tag = (function (_super) { - __extends(Tag, _super); - /** - * Create a tag. - * - * @constructor - * @param {string} id - * @param {Geometry} geometry - */ - function Tag(id, geometry) { - var _this = _super.call(this) || this; - _this._id = id; - _this._geometry = geometry; - _this._notifyChanged$ = new Subject_1.Subject(); - _this._notifyChanged$ - .subscribe(function (t) { - _this.fire(Tag.changed, _this); - }); - _this._geometry.changed$ - .subscribe(function (g) { - _this.fire(Tag.geometrychanged, _this); - }); +var AbortMapillaryError = /** @class */ (function (_super) { + __extends(AbortMapillaryError, _super); + function AbortMapillaryError(message) { + var _this = _super.call(this, message != null ? message : "The request was aborted.") || this; + Object.setPrototypeOf(_this, AbortMapillaryError.prototype); + _this.name = "AbortMapillaryError"; return _this; } - Object.defineProperty(Tag.prototype, "id", { - /** - * Get id property. - * @returns {string} - */ - get: function () { - return this._id; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Tag.prototype, "geometry", { - /** - * Get geometry property. - * @returns {Geometry} The geometry of the tag. - */ - get: function () { - return this._geometry; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Tag.prototype, "changed$", { - /** - * Get changed observable. - * @returns {Observable} - * @ignore - */ - get: function () { - return this._notifyChanged$; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Tag.prototype, "geometryChanged$", { - /** - * Get geometry changed observable. - * @returns {Observable} - * @ignore - */ - get: function () { - var _this = this; - return this._geometry.changed$ - .map(function (geometry) { - return _this; - }) - .share(); - }, - enumerable: true, - configurable: true - }); - return Tag; -}(Utils_1.EventEmitter)); -/** - * Event fired when a property related to the visual appearance of the - * tag has changed. - * - * @event Tag#changed - * @type {Tag} The tag instance that has changed. - */ -Tag.changed = "changed"; -/** - * Event fired when the geometry of the tag has changed. - * - * @event Tag#geometrychanged - * @type {Tag} The tag instance whose geometry has changed. - */ -Tag.geometrychanged = "geometrychanged"; -exports.Tag = Tag; -exports.default = Tag; + return AbortMapillaryError; +}(MapillaryError_1.MapillaryError)); +exports.AbortMapillaryError = AbortMapillaryError; +exports.default = AbortMapillaryError; -},{"../../../Utils":235,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/share":74}],302:[function(require,module,exports){ +},{"./MapillaryError":389}],387:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -30267,10 +35962,11 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var MapillaryError_1 = require("./MapillaryError"); -var ArgumentMapillaryError = (function (_super) { +var ArgumentMapillaryError = /** @class */ (function (_super) { __extends(ArgumentMapillaryError, _super); function ArgumentMapillaryError(message) { var _this = _super.call(this, message != null ? message : "The argument is not valid.") || this; + Object.setPrototypeOf(_this, ArgumentMapillaryError.prototype); _this.name = "ArgumentMapillaryError"; return _this; } @@ -30279,7 +35975,7 @@ var ArgumentMapillaryError = (function (_super) { exports.ArgumentMapillaryError = ArgumentMapillaryError; exports.default = ArgumentMapillaryError; -},{"./MapillaryError":304}],303:[function(require,module,exports){ +},{"./MapillaryError":389}],388:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -30293,10 +35989,11 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var MapillaryError_1 = require("./MapillaryError"); -var GraphMapillaryError = (function (_super) { +var GraphMapillaryError = /** @class */ (function (_super) { __extends(GraphMapillaryError, _super); function GraphMapillaryError(message) { var _this = _super.call(this, message) || this; + Object.setPrototypeOf(_this, GraphMapillaryError.prototype); _this.name = "GraphMapillaryError"; return _this; } @@ -30305,7 +36002,7 @@ var GraphMapillaryError = (function (_super) { exports.GraphMapillaryError = GraphMapillaryError; exports.default = GraphMapillaryError; -},{"./MapillaryError":304}],304:[function(require,module,exports){ +},{"./MapillaryError":389}],389:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -30318,10 +36015,11 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var MapillaryError = (function (_super) { +var MapillaryError = /** @class */ (function (_super) { __extends(MapillaryError, _super); function MapillaryError(message) { var _this = _super.call(this, message) || this; + Object.setPrototypeOf(_this, MapillaryError.prototype); _this.name = "MapillaryError"; return _this; } @@ -30330,7 +36028,7 @@ var MapillaryError = (function (_super) { exports.MapillaryError = MapillaryError; exports.default = MapillaryError; -},{}],305:[function(require,module,exports){ +},{}],390:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); @@ -30340,7 +36038,7 @@ var THREE = require("three"); * * @classdesc Holds information about a camera. */ -var Camera = (function () { +var Camera = /** @class */ (function () { /** * Create a new camera instance. * @param {Transform} [transform] - Optional transform instance. @@ -30480,7 +36178,7 @@ var Camera = (function () { }()); exports.Camera = Camera; -},{"three":176}],306:[function(require,module,exports){ +},{"three":240}],391:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -30552,7 +36250,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); * WGS84 to ENU and ENU to WGS84 are two step conversions with ECEF calculated in * the first step for both conversions. */ -var GeoCoords = (function () { +var GeoCoords = /** @class */ (function () { function GeoCoords() { this._wgs84a = 6378137.0; this._wgs84b = 6356752.31424518; @@ -30704,7 +36402,7 @@ var GeoCoords = (function () { exports.GeoCoords = GeoCoords; exports.default = GeoCoords; -},{}],307:[function(require,module,exports){ +},{}],392:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); @@ -30714,7 +36412,7 @@ var THREE = require("three"); * * @classdesc Provides methods for scalar, vector and matrix calculations. */ -var Spatial = (function () { +var Spatial = /** @class */ (function () { function Spatial() { this._epsilon = 1e-9; } @@ -30887,8 +36585,9 @@ var Spatial = (function () { var R2 = this.rotationMatrix(rotation2); var R = R1T.multiply(R2); var elements = R.elements; - // from Tr(R) = 1 + 2*cos(theta) - var theta = Math.acos((elements[0] + elements[5] + elements[10] - 1) / 2); + // from Tr(R) = 1 + 2 * cos(theta) + var tr = elements[0] + elements[5] + elements[10]; + var theta = Math.acos(Math.max(Math.min((tr - 1) / 2, 1), -1)); return theta; }; /** @@ -30912,18 +36611,18 @@ var Spatial = (function () { * (latitude longitude pairs) in meters according to * the haversine formula. * - * @param {number} lat1 - Latitude of the first coordinate. - * @param {number} lon1 - Longitude of the first coordinate. - * @param {number} lat2 - Latitude of the second coordinate. - * @param {number} lon2 - Longitude of the second coordinate. - * @returns {number} Distance between lat lon positions. + * @param {number} lat1 - Latitude of the first coordinate in degrees. + * @param {number} lon1 - Longitude of the first coordinate in degrees. + * @param {number} lat2 - Latitude of the second coordinate in degrees. + * @param {number} lon2 - Longitude of the second coordinate in degrees. + * @returns {number} Distance between lat lon positions in meters. */ Spatial.prototype.distanceFromLatLon = function (lat1, lon1, lat2, lon2) { var r = 6371000; var dLat = this.degToRad(lat2 - lat1); var dLon = this.degToRad(lon2 - lon1); var hav = Math.sin(dLat / 2) * Math.sin(dLat / 2) + - Math.cos(lat1) * Math.cos(lat2) * + Math.cos(this.degToRad(lat1)) * Math.cos(this.degToRad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2); var d = 2 * r * Math.atan2(Math.sqrt(hav), Math.sqrt(1 - hav)); return d; @@ -30933,7 +36632,7 @@ var Spatial = (function () { exports.Spatial = Spatial; exports.default = Spatial; -},{"three":176}],308:[function(require,module,exports){ +},{"three":240}],393:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); @@ -30944,30 +36643,37 @@ var THREE = require("three"); * @classdesc Class used for calculating coordinate transformations * and projections. */ -var Transform = (function () { +var Transform = /** @class */ (function () { /** * Create a new transform instance. - * @param {Node} apiNavImIm - Node properties. - * @param {HTMLImageElement} image - Node image. - * @param {Array} translation - Node translation vector in three dimensions. - */ - function Transform(node, image, translation) { - this._orientation = this._getValue(node.orientation, 1); + * @param {number} orientation - Image orientation. + * @param {number} width - Image height. + * @param {number} height - Image width. + * @param {number} focal - Focal length. + * @param {number} scale - Atomic scale. + * @param {IGPano} gpano - Panorama properties. + * @param {Array} rotation - Rotation vector in three dimensions. + * @param {Array} translation - Translation vector in three dimensions. + * @param {HTMLImageElement} image - Image for fallback size calculations. + */ + function Transform(orientation, width, height, focal, scale, gpano, rotation, translation, image, textureScale) { + this._orientation = this._getValue(orientation, 1); var imageWidth = image != null ? image.width : 4; var imageHeight = image != null ? image.height : 3; var keepOrientation = this._orientation < 5; - this._width = this._getValue(node.width, keepOrientation ? imageWidth : imageHeight); - this._height = this._getValue(node.height, keepOrientation ? imageHeight : imageWidth); + this._width = this._getValue(width, keepOrientation ? imageWidth : imageHeight); + this._height = this._getValue(height, keepOrientation ? imageHeight : imageWidth); this._basicAspect = keepOrientation ? this._width / this._height : this._height / this._width; - this._basicWidth = keepOrientation ? node.width : node.height; - this._basicHeight = keepOrientation ? node.height : node.width; - this._focal = this._getValue(node.focal, 1); - this._scale = this._getValue(node.scale, 0); - this._gpano = node.gpano != null ? node.gpano : null; - this._rt = this._getRt(node.rotation, translation); + this._basicWidth = keepOrientation ? width : height; + this._basicHeight = keepOrientation ? height : width; + this._focal = this._getValue(focal, 1); + this._scale = this._getValue(scale, 0); + this._gpano = gpano != null ? gpano : null; + this._rt = this._getRt(rotation, translation); this._srt = this._getSrt(this._rt, this._scale); + this._textureScale = !!textureScale ? textureScale : [1, 1]; } Object.defineProperty(Transform.prototype, "basicAspect", { /** @@ -31443,8 +37149,10 @@ var Transform = (function () { */ Transform.prototype._normalizedToTextureMatrix = function () { var size = Math.max(this._width, this._height); - var w = size / this._width; - var h = size / this._height; + var scaleX = this._orientation < 5 ? this._textureScale[0] : this._textureScale[1]; + var scaleY = this._orientation < 5 ? this._textureScale[1] : this._textureScale[0]; + var w = size / this._width * scaleX; + var h = size / this._height * scaleY; switch (this._orientation) { case 1: return new THREE.Matrix4().set(w, 0, 0, 0.5, 0, -h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1); @@ -31462,7 +37170,7 @@ var Transform = (function () { }()); exports.Transform = Transform; -},{"three":176}],309:[function(require,module,exports){ +},{"three":240}],394:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); @@ -31476,7 +37184,7 @@ var THREE = require("three"); * Basic coordinates are 2D coordinates on the [0, 1] interval and * have the origin point, (0, 0), at the top left corner and the * maximum value, (1, 1), at the bottom right corner of the original - * photo. + * image. * * Viewport coordinates are 2D coordinates on the [-1, 1] interval and * have the origin point in the center. The bottom left corner point is @@ -31489,7 +37197,7 @@ var THREE = require("three"); * * 3D coordinates are in the topocentric world reference frame. */ -var ViewportCoords = (function () { +var ViewportCoords = /** @class */ (function () { function ViewportCoords() { this._unprojectDepth = 200; } @@ -31836,7 +37544,7 @@ var ViewportCoords = (function () { exports.ViewportCoords = ViewportCoords; exports.default = ViewportCoords; -},{"three":176}],310:[function(require,module,exports){ +},{"three":240}],395:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -31845,7 +37553,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); * @classdesc Represents a class for creating node filters. Implementation and * definitions based on https://github.com/mapbox/feature-filter. */ -var FilterCreator = (function () { +var FilterCreator = /** @class */ (function () { function FilterCreator() { } /** @@ -31924,18 +37632,13 @@ var FilterCreator = (function () { exports.FilterCreator = FilterCreator; exports.default = FilterCreator; -},{}],311:[function(require,module,exports){ +},{}],396:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var rbush = require("rbush"); +var Observable_1 = require("rxjs/Observable"); var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/observable/from"); -require("rxjs/add/operator/catch"); -require("rxjs/add/operator/do"); -require("rxjs/add/operator/finally"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/publish"); var Edge_1 = require("../Edge"); var Error_1 = require("../Error"); var Graph_1 = require("../Graph"); @@ -31944,7 +37647,7 @@ var Graph_1 = require("../Graph"); * * @classdesc Represents a graph of nodes with edges. */ -var Graph = (function () { +var Graph = /** @class */ (function () { /** * Create a new graph instance. * @@ -31959,10 +37662,12 @@ var Graph = (function () { this._apiV3 = apiV3; this._cachedNodes = {}; this._cachedNodeTiles = {}; + this._cachedSequenceNodes = {}; this._cachedSpatialEdges = {}; this._cachedTiles = {}; this._cachingFill$ = {}; this._cachingFull$ = {}; + this._cachingSequenceNodes$ = {}; this._cachingSequences$ = {}; this._cachingSpatialArea$ = {}; this._cachingTiles$ = {}; @@ -31977,6 +37682,7 @@ var Graph = (function () { { maxSequences: 50, maxUnusedNodes: 100, + maxUnusedPreStoredNodes: 30, maxUnusedTiles: 20, }; this._nodes = {}; @@ -32003,6 +37709,92 @@ var Graph = (function () { enumerable: true, configurable: true }); + /** + * Caches the full node data for all images within a bounding + * box. + * + * @description The node assets are not cached. + * + * @param {ILatLon} sw - South west corner of bounding box. + * @param {ILatLon} ne - North east corner of bounding box. + * @returns {Observable} Observable emitting the full + * nodes in the bounding box. + */ + Graph.prototype.cacheBoundingBox$ = function (sw, ne) { + var _this = this; + var cacheTiles$ = this._graphCalculator.encodeHsFromBoundingBox(sw, ne) + .filter(function (h) { + return !(h in _this._cachedTiles); + }) + .map(function (h) { + return h in _this._cachingTiles$ ? + _this._cachingTiles$[h] : + _this._cacheTile$(h); + }); + if (cacheTiles$.length === 0) { + cacheTiles$.push(Observable_1.Observable.of(this)); + } + return Observable_1.Observable + .from(cacheTiles$) + .mergeAll() + .last() + .mergeMap(function (graph) { + var nodes = _this._nodeIndex + .search({ + maxX: ne.lat, + maxY: ne.lon, + minX: sw.lat, + minY: sw.lon, + }) + .map(function (item) { + return item.node; + }); + var fullNodes = []; + var coreNodes = []; + for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) { + var node = nodes_1[_i]; + if (node.full) { + fullNodes.push(node); + } + else { + coreNodes.push(node.key); + } + } + var coreNodeBatches = []; + var batchSize = 200; + while (coreNodes.length > 0) { + coreNodeBatches.push(coreNodes.splice(0, batchSize)); + } + var fullNodes$ = Observable_1.Observable.of(fullNodes); + var fillNodes$ = coreNodeBatches + .map(function (batch) { + return _this._apiV3.imageByKeyFill$(batch) + .map(function (imageByKeyFill) { + var filledNodes = []; + for (var fillKey in imageByKeyFill) { + if (!imageByKeyFill.hasOwnProperty(fillKey)) { + continue; + } + if (_this.hasNode(fillKey)) { + var node = _this.getNode(fillKey); + if (!node.full) { + _this._makeFull(node, imageByKeyFill[fillKey]); + } + filledNodes.push(node); + } + } + return filledNodes; + }); + }); + return Observable_1.Observable + .merge(fullNodes$, Observable_1.Observable + .from(fillNodes$) + .mergeAll()); + }) + .reduce(function (acc, value) { + return acc.concat(value); + }); + }; /** * Retrieve and cache node fill properties. * @@ -32074,8 +37866,8 @@ var Graph = (function () { } } else { - if (fn.sequence == null || fn.sequence.key == null) { - throw new Error_1.GraphMapillaryError("Node has no sequence (" + key + ")."); + if (fn.sequence_key == null) { + throw new Error_1.GraphMapillaryError("Node has no sequence key (" + key + ")."); } var node = new Graph_1.Node(fn); _this._makeFull(node, fn); @@ -32148,6 +37940,85 @@ var Graph = (function () { var edges = this._edgeCalculator.computeSequenceEdges(node, sequence); node.cacheSequenceEdges(edges); }; + /** + * Retrieve and cache full nodes for all keys in a sequence. + * + * @param {string} sequenceKey - Key of sequence. + * @param {string} referenceNodeKey - Key of node to use as reference + * for optimized caching. + * @returns {Observable} Observable emitting the graph + * when the nodes of the sequence has been cached. + */ + Graph.prototype.cacheSequenceNodes$ = function (sequenceKey, referenceNodeKey) { + var _this = this; + if (!this.hasSequence(sequenceKey)) { + throw new Error_1.GraphMapillaryError("Cannot cache sequence nodes of sequence that does not exist in graph (" + sequenceKey + ")."); + } + if (this.hasSequenceNodes(sequenceKey)) { + throw new Error_1.GraphMapillaryError("Sequence nodes already cached (" + sequenceKey + ")."); + } + var sequence = this.getSequence(sequenceKey); + if (sequence.key in this._cachingSequenceNodes$) { + return this._cachingSequenceNodes$[sequence.key]; + } + var batches = []; + var keys = sequence.keys.slice(); + var referenceBatchSize = 50; + if (!!referenceNodeKey && keys.length > referenceBatchSize) { + var referenceIndex = keys.indexOf(referenceNodeKey); + var startIndex = Math.max(0, Math.min(referenceIndex - referenceBatchSize / 2, keys.length - referenceBatchSize)); + batches.push(keys.splice(startIndex, referenceBatchSize)); + } + var batchSize = 200; + while (keys.length > 0) { + batches.push(keys.splice(0, batchSize)); + } + var batchesToCache = batches.length; + var sequenceNodes$ = Observable_1.Observable + .from(batches) + .mergeMap(function (batch) { + return _this._apiV3.imageByKeyFull$(batch) + .do(function (imageByKeyFull) { + for (var fullKey in imageByKeyFull) { + if (!imageByKeyFull.hasOwnProperty(fullKey)) { + continue; + } + var fn = imageByKeyFull[fullKey]; + if (_this.hasNode(fullKey)) { + var node = _this.getNode(fn.key); + if (!node.full) { + _this._makeFull(node, fn); + } + } + else { + if (fn.sequence_key == null) { + console.warn("Sequence missing, discarding node (" + fn.key + ")"); + } + var node = new Graph_1.Node(fn); + _this._makeFull(node, fn); + var h = _this._graphCalculator.encodeH(node.originalLatLon, _this._tilePrecision); + _this._preStore(h, node); + _this._setNode(node); + } + } + batchesToCache--; + }) + .map(function (imageByKeyFull) { + return _this; + }); + }, 6) + .last() + .finally(function () { + delete _this._cachingSequenceNodes$[sequence.key]; + if (batchesToCache === 0) { + _this._cachedSequenceNodes[sequence.key] = true; + } + }) + .publish() + .refCount(); + this._cachingSequenceNodes$[sequence.key] = sequenceNodes$; + return sequenceNodes$; + }; /** * Retrieve and cache full nodes for a node spatial area. * @@ -32285,8 +38156,8 @@ var Graph = (function () { * Retrieve and cache geohash tiles for a node. * * @param {string} key - Key of node for which to retrieve tiles. - * @returns {Observable} Observable emitting the graph - * when the tiles required for the node has been cached. + * @returns {Array>} Array of observables emitting + * the graph for each tile required for the node has been cached. * @throws {GraphMapillaryError} When the operation is not valid on the * current graph. */ @@ -32314,73 +38185,9 @@ var Graph = (function () { nodeTiles.cache = []; var cacheTiles$ = []; var _loop_2 = function (h) { - var cacheTile$ = null; - if (h in this_2._cachingTiles$) { - cacheTile$ = this_2._cachingTiles$[h]; - } - else { - cacheTile$ = this_2._apiV3.imagesByH$([h]) - .do(function (imagesByH) { - var coreNodes = imagesByH[h]; - if (h in _this._cachedTiles) { - return; - } - _this._nodeIndexTiles[h] = []; - _this._cachedTiles[h] = { accessed: new Date().getTime(), nodes: [] }; - var hCache = _this._cachedTiles[h].nodes; - var preStored = _this._removeFromPreStore(h); - for (var index in coreNodes) { - if (!coreNodes.hasOwnProperty(index)) { - continue; - } - var coreNode = coreNodes[index]; - if (coreNode == null) { - break; - } - if (coreNode.sequence == null || - coreNode.sequence.key == null) { - console.warn("Sequence missing, discarding (" + coreNode.key + ")"); - continue; - } - if (preStored != null && coreNode.key in preStored) { - var node_1 = preStored[coreNode.key]; - delete preStored[coreNode.key]; - hCache.push(node_1); - var nodeIndexItem_1 = { - lat: node_1.latLon.lat, - lon: node_1.latLon.lon, - node: node_1, - }; - _this._nodeIndex.insert(nodeIndexItem_1); - _this._nodeIndexTiles[h].push(nodeIndexItem_1); - _this._nodeToTile[node_1.key] = h; - continue; - } - var node = new Graph_1.Node(coreNode); - hCache.push(node); - var nodeIndexItem = { - lat: node.latLon.lat, - lon: node.latLon.lon, - node: node, - }; - _this._nodeIndex.insert(nodeIndexItem); - _this._nodeIndexTiles[h].push(nodeIndexItem); - _this._nodeToTile[node.key] = h; - _this._setNode(node); - } - delete _this._cachingTiles$[h]; - }) - .map(function (imagesByH) { - return _this; - }) - .catch(function (error) { - delete _this._cachingTiles$[h]; - throw error; - }) - .publish() - .refCount(); - this_2._cachingTiles$[h] = cacheTile$; - } + var cacheTile$ = h in this_2._cachingTiles$ ? + this_2._cachingTiles$[h] : + this_2._cacheTile$(h); cacheTiles$.push(cacheTile$ .do(function (graph) { var index = nodeTiles.caching.indexOf(h); @@ -32474,6 +38281,16 @@ var Graph = (function () { Graph.prototype.isCachingSequence = function (sequenceKey) { return sequenceKey in this._cachingSequences$; }; + /** + * Get a value indicating if the graph is caching sequence nodes. + * + * @param {string} sequenceKey - Key of sequence. + * @returns {boolean} Value indicating if the sequence nodes are + * being cached. + */ + Graph.prototype.isCachingSequenceNodes = function (sequenceKey) { + return sequenceKey in this._cachingSequenceNodes$; + }; /** * Get a value indicating if the graph is caching the tiles * required for calculating spatial edges of a node. @@ -32540,6 +38357,16 @@ var Graph = (function () { } return hasSequence; }; + /** + * Get a value indicating if sequence nodes has been cached in the graph. + * + * @param {string} sequenceKey - Key of sequence. + * @returns {boolean} Value indicating if a sequence nodes has been + * cached in the graph. + */ + Graph.prototype.hasSequenceNodes = function (sequenceKey) { + return sequenceKey in this._cachedSequenceNodes; + }; /** * Get a value indicating if the graph has fully cached * all nodes in the spatial area of a node. @@ -32691,8 +38518,8 @@ var Graph = (function () { this._nodes = {}; this._nodeToTile = {}; this._preStored = {}; - for (var _c = 0, nodes_1 = nodes; _c < nodes_1.length; _c++) { - var node = nodes_1[_c]; + for (var _c = 0, nodes_2 = nodes; _c < nodes_2.length; _c++) { + var node = nodes_2[_c]; this._nodes[node.key] = node; var h = this._graphCalculator.encodeH(node.originalLatLon, this._tilePrecision); this._preStore(h, node); @@ -32724,12 +38551,15 @@ var Graph = (function () { * @param {Array} keepKeys - Keys of nodes to keep in * graph unrelated to last access. Tiles related to those keys * will also be kept in graph. + * @param {string} keepSequenceKey - Optional key of sequence + * for which the belonging nodes should not be disposed or + * removed from the graph. These nodes may still be uncached if + * not specified in keep keys param. */ - Graph.prototype.uncache = function (keepKeys) { + Graph.prototype.uncache = function (keepKeys, keepSequenceKey) { var keysInUse = {}; this._addNewKeys(keysInUse, this._cachingFull$); this._addNewKeys(keysInUse, this._cachingFill$); - this._addNewKeys(keysInUse, this._cachingTiles$); this._addNewKeys(keysInUse, this._cachingSpatialArea$); this._addNewKeys(keysInUse, this._requiredNodeTiles); this._addNewKeys(keysInUse, this._requiredSpatialArea); @@ -32771,8 +38601,43 @@ var Graph = (function () { }); for (var _b = 0, uncacheHs_1 = uncacheHs; _b < uncacheHs_1.length; _b++) { var uncacheH = uncacheHs_1[_b]; - this._uncacheTile(uncacheH); + this._uncacheTile(uncacheH, keepSequenceKey); + } + var potentialPreStored = []; + var nonCachedPreStored = []; + for (var h in this._preStored) { + if (!this._preStored.hasOwnProperty(h) || h in this._cachingTiles$) { + continue; + } + var prestoredNodes = this._preStored[h]; + for (var key in prestoredNodes) { + if (!prestoredNodes.hasOwnProperty(key) || key in keysInUse) { + continue; + } + if (prestoredNodes[key].sequenceKey === keepSequenceKey) { + continue; + } + if (key in this._cachedNodes) { + potentialPreStored.push([this._cachedNodes[key], h]); + } + else { + nonCachedPreStored.push([key, h]); + } + } } + var uncachePreStored = potentialPreStored + .sort(function (_a, _b) { + var na1 = _a[0], h1 = _a[1]; + var na2 = _b[0], h2 = _b[1]; + return na2.accessed - na1.accessed; + }) + .slice(this._configuration.maxUnusedPreStoredNodes) + .map(function (_a) { + var na = _a[0], h = _a[1]; + return [na.node.key, h]; + }); + this._uncachePreStored(nonCachedPreStored); + this._uncachePreStored(uncachePreStored); var potentialNodes = []; for (var key in this._cachedNodes) { if (!this._cachedNodes.hasOwnProperty(key) || key in keysInUse) { @@ -32800,7 +38665,8 @@ var Graph = (function () { var potentialSequences = []; for (var sequenceKey in this._sequences) { if (!this._sequences.hasOwnProperty(sequenceKey) || - sequenceKey in this._cachingSequences$) { + sequenceKey in this._cachingSequences$ || + sequenceKey === keepSequenceKey) { continue; } potentialSequences.push(this._sequences[sequenceKey]); @@ -32814,6 +38680,9 @@ var Graph = (function () { var sequenceAccess = uncacheSequences_1[_d]; var sequenceKey = sequenceAccess.sequence.key; delete this._sequences[sequenceKey]; + if (sequenceKey in this._cachedSequenceNodes) { + delete this._cachedSequenceNodes[sequenceKey]; + } sequenceAccess.sequence.dispose(); } }; @@ -32855,6 +38724,69 @@ var Graph = (function () { .refCount(); return this._cachingSequences$[sequenceKey]; }; + Graph.prototype._cacheTile$ = function (h) { + var _this = this; + this._cachingTiles$[h] = this._apiV3.imagesByH$([h]) + .do(function (imagesByH) { + var coreNodes = imagesByH[h]; + if (h in _this._cachedTiles) { + return; + } + _this._nodeIndexTiles[h] = []; + _this._cachedTiles[h] = { accessed: new Date().getTime(), nodes: [] }; + var hCache = _this._cachedTiles[h].nodes; + var preStored = _this._removeFromPreStore(h); + for (var index in coreNodes) { + if (!coreNodes.hasOwnProperty(index)) { + continue; + } + var coreNode = coreNodes[index]; + if (coreNode == null) { + break; + } + if (coreNode.sequence_key == null) { + console.warn("Sequence missing, discarding node (" + coreNode.key + ")"); + continue; + } + if (preStored != null && coreNode.key in preStored) { + var preStoredNode = preStored[coreNode.key]; + delete preStored[coreNode.key]; + hCache.push(preStoredNode); + var preStoredNodeIndexItem = { + lat: preStoredNode.latLon.lat, + lon: preStoredNode.latLon.lon, + node: preStoredNode, + }; + _this._nodeIndex.insert(preStoredNodeIndexItem); + _this._nodeIndexTiles[h].push(preStoredNodeIndexItem); + _this._nodeToTile[preStoredNode.key] = h; + continue; + } + var node = new Graph_1.Node(coreNode); + hCache.push(node); + var nodeIndexItem = { + lat: node.latLon.lat, + lon: node.latLon.lon, + node: node, + }; + _this._nodeIndex.insert(nodeIndexItem); + _this._nodeIndexTiles[h].push(nodeIndexItem); + _this._nodeToTile[node.key] = h; + _this._setNode(node); + } + delete _this._cachingTiles$[h]; + }) + .map(function (imagesByH) { + return _this; + }) + .catch(function (error) { + delete _this._cachingTiles$[h]; + throw error; + }) + .publish() + .refCount(); + return this._cachingTiles$[h]; + }; Graph.prototype._makeFull = function (node, fillNode) { if (fillNode.calt == null) { fillNode.calt = this._defaultAlt; @@ -32885,11 +38817,10 @@ var Graph = (function () { } this._nodes[key] = node; }; - Graph.prototype._uncacheTile = function (h) { + Graph.prototype._uncacheTile = function (h, keepSequenceKey) { for (var _i = 0, _a = this._cachedTiles[h].nodes; _i < _a.length; _i++) { var node = _a[_i]; var key = node.key; - delete this._nodes[key]; delete this._nodeToTile[key]; if (key in this._cachedNodes) { delete this._cachedNodes[key]; @@ -32900,7 +38831,17 @@ var Graph = (function () { if (key in this._cachedSpatialEdges) { delete this._cachedSpatialEdges[key]; } - node.dispose(); + if (node.sequenceKey === keepSequenceKey) { + this._preStore(h, node); + node.uncache(); + } + else { + delete this._nodes[key]; + if (node.sequenceKey in this._cachedSequenceNodes) { + delete this._cachedSequenceNodes[node.sequenceKey]; + } + node.dispose(); + } } for (var _b = 0, _c = this._nodeIndexTiles[h]; _b < _c.length; _b++) { var nodeIndexItem = _c[_b]; @@ -32909,6 +38850,33 @@ var Graph = (function () { delete this._nodeIndexTiles[h]; delete this._cachedTiles[h]; }; + Graph.prototype._uncachePreStored = function (preStored) { + var hs = {}; + for (var _i = 0, preStored_1 = preStored; _i < preStored_1.length; _i++) { + var _a = preStored_1[_i], key = _a[0], h = _a[1]; + if (key in this._nodes) { + delete this._nodes[key]; + } + if (key in this._cachedNodes) { + delete this._cachedNodes[key]; + } + var node = this._preStored[h][key]; + if (node.sequenceKey in this._cachedSequenceNodes) { + delete this._cachedSequenceNodes[node.sequenceKey]; + } + delete this._preStored[h][key]; + node.dispose(); + hs[h] = true; + } + for (var h in hs) { + if (!hs.hasOwnProperty(h)) { + continue; + } + if (Object.keys(this._preStored[h]).length === 0) { + delete this._preStored[h]; + } + } + }; Graph.prototype._updateCachedTileAccess = function (key, accessed) { if (key in this._nodeToTile) { this._cachedTiles[this._nodeToTile[key]].accessed = accessed; @@ -32924,32 +38892,33 @@ var Graph = (function () { exports.Graph = Graph; exports.default = Graph; -},{"../Edge":227,"../Error":228,"../Graph":230,"rbush":25,"rxjs/Subject":34,"rxjs/add/observable/from":41,"rxjs/add/operator/catch":52,"rxjs/add/operator/do":59,"rxjs/add/operator/finally":62,"rxjs/add/operator/map":65,"rxjs/add/operator/publish":71}],312:[function(require,module,exports){ +},{"../Edge":291,"../Error":292,"../Graph":294,"rbush":25,"rxjs/Observable":29,"rxjs/Subject":34}],397:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var geohash = require("latlon-geohash"); var THREE = require("three"); +var Error_1 = require("../Error"); var Geo_1 = require("../Geo"); -var GeoHashDirections = (function () { +var GeoHashDirections = /** @class */ (function () { function GeoHashDirections() { } + GeoHashDirections.n = "n"; + GeoHashDirections.nw = "nw"; + GeoHashDirections.w = "w"; + GeoHashDirections.sw = "sw"; + GeoHashDirections.s = "s"; + GeoHashDirections.se = "se"; + GeoHashDirections.e = "e"; + GeoHashDirections.ne = "ne"; return GeoHashDirections; }()); -GeoHashDirections.n = "n"; -GeoHashDirections.nw = "nw"; -GeoHashDirections.w = "w"; -GeoHashDirections.sw = "sw"; -GeoHashDirections.s = "s"; -GeoHashDirections.se = "se"; -GeoHashDirections.e = "e"; -GeoHashDirections.ne = "ne"; /** * @class GraphCalculator * * @classdesc Represents a calculator for graph entities. */ -var GraphCalculator = (function () { +var GraphCalculator = /** @class */ (function () { /** * Create a new graph calculator instance. * @@ -33026,6 +38995,32 @@ var GraphCalculator = (function () { } return hs; }; + /** + * Encode the minimum set of geohash tiles containing a bounding box. + * + * @description The current algorithm does expect the bounding box + * to be sufficiently small to be contained in an area with the size + * of maximally four tiles. Up to nine adjacent tiles may be returned. + * The method currently uses the largest side as the threshold leading to + * more tiles being returned than needed in edge cases. + * + * @param {ILatLon} sw - South west corner of bounding box. + * @param {ILatLon} ne - North east corner of bounding box. + * @param {number} precision - Precision of the encoding. + * + * @returns {string} The geohash tiles containing the bounding box. + */ + GraphCalculator.prototype.encodeHsFromBoundingBox = function (sw, ne, precision) { + if (precision === void 0) { precision = 7; } + if (ne.lat <= sw.lat || ne.lon <= sw.lon) { + throw new Error_1.GraphMapillaryError("North east needs to be top right of south west"); + } + var centerLat = (sw.lat + ne.lat) / 2; + var centerLon = (sw.lon + ne.lon) / 2; + var enu = this._geoCoords.geodeticToEnu(ne.lat, ne.lon, 0, centerLat, centerLon, 0); + var threshold = Math.max(enu[0], enu[1]); + return this.encodeHs({ lat: centerLat, lon: centerLon }, precision, threshold); + }; /** * Get the bounding box corners for a circle with radius of a threshold * with center in a geodetic position. @@ -33086,27 +39081,50 @@ var GraphCalculator = (function () { exports.GraphCalculator = GraphCalculator; exports.default = GraphCalculator; -},{"../Geo":229,"latlon-geohash":21,"three":176}],313:[function(require,module,exports){ +},{"../Error":292,"../Geo":293,"latlon-geohash":21,"three":240}],398:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Enumeration for graph modes. + * @enum {number} + * @readonly + * @description Modes for the retrieval and caching performed + * by the graph service on the graph. + */ +var GraphMode; +(function (GraphMode) { + /** + * Caching is performed on sequences only and sequence edges are + * calculated. Spatial tiles + * are not retrieved and spatial edges are not calculated when + * caching nodes. Complete sequences are being cached for requested + * nodes within the graph. + */ + GraphMode[GraphMode["Sequence"] = 0] = "Sequence"; + /** + * Caching is performed with emphasis on spatial data. Sequence edges + * as well as spatial edges are cached. Sequence data + * is still requested but complete sequences are not being cached + * for requested nodes. + * + * This is the initial mode of the graph service. + */ + GraphMode[GraphMode["Spatial"] = 1] = "Spatial"; +})(GraphMode = exports.GraphMode || (exports.GraphMode = {})); +exports.default = GraphMode; + +},{}],399:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Observable_1 = require("rxjs/Observable"); var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/operator/catch"); -require("rxjs/add/operator/concat"); -require("rxjs/add/operator/do"); -require("rxjs/add/operator/expand"); -require("rxjs/add/operator/finally"); -require("rxjs/add/operator/first"); -require("rxjs/add/operator/last"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/mergeMap"); -require("rxjs/add/operator/publishReplay"); +var Graph_1 = require("../Graph"); /** * @class GraphService * * @classdesc Represents a service for graph operations. */ -var GraphService = (function () { +var GraphService = /** @class */ (function () { /** * Create a new graph service instance. * @@ -33119,12 +39137,56 @@ var GraphService = (function () { .publishReplay(1) .refCount(); this._graph$.subscribe(function () { }); + this._graphMode = Graph_1.GraphMode.Spatial; + this._graphModeSubject$ = new Subject_1.Subject(); + this._graphMode$ = this._graphModeSubject$ + .startWith(this._graphMode) + .publishReplay(1) + .refCount(); + this._graphMode$.subscribe(function () { }); this._imageLoadingService = imageLoadingService; this._firstGraphSubjects$ = []; this._initializeCacheSubscriptions = []; this._sequenceSubscriptions = []; this._spatialSubscriptions = []; } + Object.defineProperty(GraphService.prototype, "graphMode$", { + /** + * Get graph mode observable. + * + * @description Emits the current graph mode. + * + * @returns {Observable} Observable + * emitting the current graph mode when it changes. + */ + get: function () { + return this._graphMode$; + }, + enumerable: true, + configurable: true + }); + /** + * Cache full nodes in a bounding box. + * + * @description When called, the full properties of + * the node are retrieved. The node cache is not initialized + * for any new nodes retrieved and the node assets are not + * retrieved, {@link cacheNode$} needs to be called for caching + * assets. + * + * @param {ILatLon} sw - South west corner of bounding box. + * @param {ILatLon} ne - North east corner of bounding box. + * @return {Observable>} Observable emitting a single item, + * the nodes of the bounding box, when they have all been retrieved. + * @throws {Error} Propagates any IO node caching errors to the caller. + */ + GraphService.prototype.cacheBoundingBox$ = function (sw, ne) { + return this._graph$ + .first() + .mergeMap(function (graph) { + return graph.cacheBoundingBox$(sw, ne); + }); + }; /** * Cache a node in the graph and retrieve it. * @@ -33198,13 +39260,16 @@ var GraphService = (function () { if (!initializeCacheSubscription.closed) { this._initializeCacheSubscriptions.push(initializeCacheSubscription); } - var sequenceSubscription = firstGraph$ + var graphSequence$ = firstGraph$ .mergeMap(function (graph) { if (graph.isCachingNodeSequence(key) || !graph.hasNodeSequence(key)) { return graph.cacheNodeSequence$(key); } return Observable_1.Observable.of(graph); }) + .publishReplay(1) + .refCount(); + var sequenceSubscription = graphSequence$ .do(function (graph) { if (!graph.getNode(key).sequenceEdges.cached) { graph.cacheSequenceEdges(key); @@ -33222,64 +39287,66 @@ var GraphService = (function () { if (!sequenceSubscription.closed) { this._sequenceSubscriptions.push(sequenceSubscription); } - var spatialSubscription = firstGraph$ - .expand(function (graph) { - if (graph.hasTiles(key)) { - return Observable_1.Observable.empty(); - } - return Observable_1.Observable - .from(graph.cacheTiles$(key)) - .mergeMap(function (graph$) { - return graph$ - .mergeMap(function (g) { - if (g.isCachingTiles(key)) { - return Observable_1.Observable.empty(); - } - return Observable_1.Observable.of(g); - }) - .catch(function (error, caught$) { - console.error("Failed to cache tile data (" + key + ").", error); + if (this._graphMode === Graph_1.GraphMode.Spatial) { + var spatialSubscription_1 = firstGraph$ + .expand(function (graph) { + if (graph.hasTiles(key)) { return Observable_1.Observable.empty(); + } + return Observable_1.Observable + .from(graph.cacheTiles$(key)) + .mergeMap(function (graph$) { + return graph$ + .mergeMap(function (g) { + if (g.isCachingTiles(key)) { + return Observable_1.Observable.empty(); + } + return Observable_1.Observable.of(g); + }) + .catch(function (error, caught$) { + console.error("Failed to cache tile data (" + key + ").", error); + return Observable_1.Observable.empty(); + }); }); - }); - }) - .last() - .mergeMap(function (graph) { - if (graph.hasSpatialArea(key)) { - return Observable_1.Observable.of(graph); - } - return Observable_1.Observable - .from(graph.cacheSpatialArea$(key)) - .mergeMap(function (graph$) { - return graph$ - .catch(function (error, caught$) { - console.error("Failed to cache spatial nodes (" + key + ").", error); - return Observable_1.Observable.empty(); + }) + .last() + .mergeMap(function (graph) { + if (graph.hasSpatialArea(key)) { + return Observable_1.Observable.of(graph); + } + return Observable_1.Observable + .from(graph.cacheSpatialArea$(key)) + .mergeMap(function (graph$) { + return graph$ + .catch(function (error, caught$) { + console.error("Failed to cache spatial nodes (" + key + ").", error); + return Observable_1.Observable.empty(); + }); }); + }) + .last() + .mergeMap(function (graph) { + return graph.hasNodeSequence(key) ? + Observable_1.Observable.of(graph) : + graph.cacheNodeSequence$(key); + }) + .do(function (graph) { + if (!graph.getNode(key).spatialEdges.cached) { + graph.cacheSpatialEdges(key); + } + }) + .finally(function () { + if (spatialSubscription_1 == null) { + return; + } + _this._removeFromArray(spatialSubscription_1, _this._spatialSubscriptions); + }) + .subscribe(function (graph) { return; }, function (error) { + console.error("Failed to cache spatial edges (" + key + ").", error); }); - }) - .last() - .mergeMap(function (graph) { - return graph.hasNodeSequence(key) ? - Observable_1.Observable.of(graph) : - graph.cacheNodeSequence$(key); - }) - .do(function (graph) { - if (!graph.getNode(key).spatialEdges.cached) { - graph.cacheSpatialEdges(key); - } - }) - .finally(function () { - if (spatialSubscription == null) { - return; + if (!spatialSubscription_1.closed) { + this._spatialSubscriptions.push(spatialSubscription_1); } - _this._removeFromArray(spatialSubscription, _this._spatialSubscriptions); - }) - .subscribe(function (graph) { return; }, function (error) { - console.error("Failed to cache spatial edges (" + key + ").", error); - }); - if (!spatialSubscription.closed) { - this._spatialSubscriptions.push(spatialSubscription); } return node$ .first(function (node) { @@ -33307,6 +39374,40 @@ var GraphService = (function () { return graph.getSequence(sequenceKey); }); }; + /** + * Cache a sequence and its nodes in the graph and retrieve the sequence. + * + * @description Caches a sequence and its assets are cached and + * retrieves all nodes belonging to the sequence. The node assets + * or edges will not be cached. + * + * @param {string} sequenceKey - Sequence key. + * @param {string} referenceNodeKey - Key of node to use as reference + * for optimized caching. + * @returns {Observable} Observable emitting a single item, + * the sequence, when it has been retrieved, its assets are cached and + * all nodes belonging to the sequence has been retrieved. + * @throws {Error} Propagates any IO node caching errors to the caller. + */ + GraphService.prototype.cacheSequenceNodes$ = function (sequenceKey, referenceNodeKey) { + return this._graph$ + .first() + .mergeMap(function (graph) { + if (graph.isCachingSequence(sequenceKey) || !graph.hasSequence(sequenceKey)) { + return graph.cacheSequence$(sequenceKey); + } + return Observable_1.Observable.of(graph); + }) + .mergeMap(function (graph) { + if (graph.isCachingSequenceNodes(sequenceKey) || !graph.hasSequenceNodes(sequenceKey)) { + return graph.cacheSequenceNodes$(sequenceKey, referenceNodeKey); + } + return Observable_1.Observable.of(graph); + }) + .map(function (graph) { + return graph.getSequence(sequenceKey); + }); + }; /** * Set a spatial edge filter on the graph. * @@ -33323,8 +39424,34 @@ var GraphService = (function () { .do(function (graph) { graph.resetSpatialEdges(); graph.setFilter(filter); + }) + .map(function (graph) { + return undefined; }); }; + /** + * Set the graph mode. + * + * @description If graph mode is set to spatial, caching + * is performed with emphasis on spatial edges. If graph + * mode is set to sequence no tile data is requested and + * no spatial edges are computed. + * + * When setting graph mode to sequence all spatial + * subscriptions are aborted. + * + * @param {GraphMode} mode - Graph mode to set. + */ + GraphService.prototype.setGraphMode = function (mode) { + if (this._graphMode === mode) { + return; + } + if (mode === Graph_1.GraphMode.Sequence) { + this._resetSubscriptions(this._spatialSubscriptions); + } + this._graphMode = mode; + this._graphModeSubject$.next(this._graphMode); + }; /** * Reset the graph. * @@ -33344,6 +39471,9 @@ var GraphService = (function () { .first() .do(function (graph) { graph.reset(keepKeys); + }) + .map(function (graph) { + return undefined; }); }; /** @@ -33354,14 +39484,21 @@ var GraphService = (function () { * related to those nodes. * * @param {Array} keepKeys - Keys of nodes to keep in graph. + * @param {string} keepSequenceKey - Optional key of sequence + * for which the belonging nodes should not be disposed or + * removed from the graph. These nodes may still be uncached if + * not specified in keep keys param. * @return {Observable} Observable emitting a single item, * the graph, when the graph has been uncached. */ - GraphService.prototype.uncache$ = function (keepKeys) { + GraphService.prototype.uncache$ = function (keepKeys, keepSequenceKey) { return this._graph$ .first() .do(function (graph) { - graph.uncache(keepKeys); + graph.uncache(keepKeys, keepSequenceKey); + }) + .map(function (graph) { + return undefined; }); }; GraphService.prototype._abortSubjects = function (subjects) { @@ -33391,19 +39528,38 @@ var GraphService = (function () { exports.GraphService = GraphService; exports.default = GraphService; -},{"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/operator/catch":52,"rxjs/add/operator/concat":54,"rxjs/add/operator/do":59,"rxjs/add/operator/expand":60,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/last":64,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72}],314:[function(require,module,exports){ +},{"../Graph":294,"rxjs/Observable":29,"rxjs/Subject":34}],400:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var Subject_1 = require("rxjs/Subject"); -var ImageLoadingService = (function () { +var ImageLoadingService = /** @class */ (function () { function ImageLoadingService() { this._loadnode$ = new Subject_1.Subject(); this._loadstatus$ = this._loadnode$ - .scan(function (nodes, node) { - nodes[node.key] = node.loadStatus; + .scan(function (_a, node) { + var nodes = _a[0]; + var changed = false; + if (node.loadStatus.total === 0 || node.loadStatus.loaded === node.loadStatus.total) { + if (node.key in nodes) { + delete nodes[node.key]; + changed = true; + } + } + else { + nodes[node.key] = node.loadStatus; + changed = true; + } + return [nodes, changed]; + }, [{}, false]) + .filter(function (_a) { + var nodes = _a[0], changed = _a[1]; + return changed; + }) + .map(function (_a) { + var nodes = _a[0]; return nodes; - }, {}) + }) .publishReplay(1) .refCount(); this._loadstatus$.subscribe(function () { }); @@ -33426,12 +39582,12 @@ var ImageLoadingService = (function () { }()); exports.ImageLoadingService = ImageLoadingService; -},{"rxjs/Subject":34}],315:[function(require,module,exports){ +},{"rxjs/Subject":34}],401:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var Pbf = require("pbf"); -var MeshReader = (function () { +var MeshReader = /** @class */ (function () { function MeshReader() { } MeshReader.read = function (buffer) { @@ -33450,11 +39606,9 @@ var MeshReader = (function () { }()); exports.MeshReader = MeshReader; -},{"pbf":23}],316:[function(require,module,exports){ +},{"pbf":23}],402:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -require("rxjs/add/observable/combineLatest"); -require("rxjs/add/operator/map"); /** * @class Node * @@ -33463,16 +39617,16 @@ require("rxjs/add/operator/map"); * Explanation of position and bearing properties: * * When images are uploaded they will have GPS information in the EXIF, this is what - * is called `originalLatLon`(@link Node#originalLatLon). + * is called `originalLatLon` {@link Node.originalLatLon}. * * When Structure from Motions has been run for a node a `computedLatLon` that * differs from the `originalLatLon` will be created. It is different because * GPS positions are not very exact and SfM aligns the camera positions according - * to the 3D reconstruction (@link Node#computedLatLon). + * to the 3D reconstruction {@link Node.computedLatLon}. * * At last there exist a `latLon` property which evaluates to * the `computedLatLon` from SfM if it exists but falls back - * to the `originalLatLon` from the EXIF GPS otherwise (@link Node#latlon). + * to the `originalLatLon` from the EXIF GPS otherwise {@link Node.latlon}. * * Everything that is done in in the Viewer is based on the SfM positions, * i.e. `computedLatLon`. That is why the smooth transitions go in the right @@ -33484,7 +39638,7 @@ require("rxjs/add/operator/map"); * The same concept as above also applies to the compass angle (or bearing) properties * `originalCa`, `computedCa` and `ca`. */ -var Node = (function () { +var Node = /** @class */ (function () { /** * Create a new node instance. * @@ -33562,6 +39716,22 @@ var Node = (function () { enumerable: true, configurable: true }); + Object.defineProperty(Node.prototype, "cameraUuid", { + /** + * Get camera uuid. + * + * @description Will be undefined if the camera uuid was not + * recorded in the image exif information. + * + * @returns {string} Universally unique id for camera used + * when capturing image. + */ + get: function () { + return this._fill.captured_with_camera_uuid; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(Node.prototype, "computedCA", { /** * Get computedCA. @@ -33679,6 +39849,19 @@ var Node = (function () { enumerable: true, configurable: true }); + Object.defineProperty(Node.prototype, "image$", { + /** + * Get image$. + * + * @returns {Observable} Observable emitting + * the cached image when it is updated. + */ + get: function () { + return this._cache.image$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(Node.prototype, "key", { /** * Get key. @@ -33780,6 +39963,20 @@ var Node = (function () { enumerable: true, configurable: true }); + Object.defineProperty(Node.prototype, "organizationKey", { + /** + * Get organizationKey. + * + * @returns {string} Unique key of the organization to which + * the node belongs. If the node does not belong to an + * organization the organization key will be undefined. + */ + get: function () { + return this._fill.organization_key; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(Node.prototype, "orientation", { /** * Get orientation. @@ -33832,12 +40029,29 @@ var Node = (function () { enumerable: true, configurable: true }); + Object.defineProperty(Node.prototype, "private", { + /** + * Get private. + * + * @returns {boolean} Value specifying if image is accessible to + * organization members only or to everyone. + */ + get: function () { + return this._fill.private; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(Node.prototype, "projectKey", { /** * Get projectKey. * * @returns {string} Unique key of the project to which - * the node belongs. + * the node belongs. If the node does not belong to a + * project the project key will be undefined. + * + * @deprecated This property will be deprecated in favor + * of the organization key and private properties. */ get: function () { return this._fill.project != null ? @@ -33883,7 +40097,7 @@ var Node = (function () { * the node belongs. */ get: function () { - return this._core.sequence.key; + return this._core.sequence_key; }, enumerable: true, configurable: true @@ -34093,14 +40307,12 @@ var Node = (function () { exports.Node = Node; exports.default = Node; -},{"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/map":65}],317:[function(require,module,exports){ +},{}],403:[function(require,module,exports){ (function (Buffer){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Subject_1 = require("rxjs/Subject"); var Observable_1 = require("rxjs/Observable"); -require("rxjs/add/observable/combineLatest"); -require("rxjs/add/operator/publishReplay"); var Graph_1 = require("../Graph"); var Utils_1 = require("../Utils"); /** @@ -34108,7 +40320,7 @@ var Utils_1 = require("../Utils"); * * @classdesc Represents the cached properties of a node. */ -var NodeCache = (function () { +var NodeCache = /** @class */ (function () { /** * Create a new node cache instance. */ @@ -34119,6 +40331,12 @@ var NodeCache = (function () { this._mesh = null; this._sequenceEdges = { cached: false, edges: [] }; this._spatialEdges = { cached: false, edges: [] }; + this._imageChanged$ = new Subject_1.Subject(); + this._image$ = this._imageChanged$ + .startWith(null) + .publishReplay(1) + .refCount(); + this._iamgeSubscription = this._image$.subscribe(); this._sequenceEdgesChanged$ = new Subject_1.Subject(); this._sequenceEdges$ = this._sequenceEdgesChanged$ .startWith(this._sequenceEdges) @@ -34148,6 +40366,19 @@ var NodeCache = (function () { enumerable: true, configurable: true }); + Object.defineProperty(NodeCache.prototype, "image$", { + /** + * Get image$. + * + * @returns {Observable} Observable emitting + * the cached image when it is updated. + */ + get: function () { + return this._image$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(NodeCache.prototype, "loadStatus", { /** * Get loadStatus. @@ -34268,6 +40499,13 @@ var NodeCache = (function () { }) .publishReplay(1) .refCount(); + this._cachingAssets$ + .first(function (nodeCache) { + return !!nodeCache._image; + }) + .subscribe(function (nodeCache) { + _this._imageChanged$.next(_this._image); + }, function (error) { }); return this._cachingAssets$; }; /** @@ -34285,7 +40523,7 @@ var NodeCache = (function () { if (this._image != null && imageSize <= Math.max(this._image.width, this._image.height)) { return Observable_1.Observable.of(this); } - return this._cacheImage$(key, imageSize) + var cacheImage$ = this._cacheImage$(key, imageSize) .first(function (status) { return status.object != null; }) @@ -34295,7 +40533,14 @@ var NodeCache = (function () { }) .map(function (imageStatus) { return _this; - }); + }) + .publishReplay(1) + .refCount(); + cacheImage$ + .subscribe(function (nodeCache) { + _this._imageChanged$.next(_this._image); + }, function (error) { }); + return cacheImage$; }; /** * Cache the sequence edges. @@ -34322,6 +40567,7 @@ var NodeCache = (function () { * all streams. */ NodeCache.prototype.dispose = function () { + this._iamgeSubscription.unsubscribe(); this._sequenceEdgesSubscription.unsubscribe(); this._spatialEdgesSubscription.unsubscribe(); this._disposeImage(); @@ -34330,6 +40576,7 @@ var NodeCache = (function () { this._loadStatus.total = 0; this._sequenceEdges = { cached: false, edges: [] }; this._spatialEdges = { cached: false, edges: [] }; + this._imageChanged$.next(null); this._sequenceEdgesChanged$.next(this._sequenceEdges); this._spatialEdgesChanged$.next(this._spatialEdges); this._disposed = true; @@ -34367,7 +40614,7 @@ var NodeCache = (function () { var _this = this; return Observable_1.Observable.create(function (subscriber) { var xmlHTTP = new XMLHttpRequest(); - xmlHTTP.open("GET", Utils_1.Urls.thumbnail(key, imageSize), true); + xmlHTTP.open("GET", Utils_1.Urls.thumbnail(key, imageSize, Utils_1.Urls.origin), true); xmlHTTP.responseType = "arraybuffer"; xmlHTTP.timeout = 15000; xmlHTTP.onload = function (pe) { @@ -34500,7 +40747,7 @@ exports.default = NodeCache; }).call(this,require("buffer").Buffer) -},{"../Graph":230,"../Utils":235,"buffer":7,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/publishReplay":72}],318:[function(require,module,exports){ +},{"../Graph":294,"../Utils":300,"buffer":7,"rxjs/Observable":29,"rxjs/Subject":34}],404:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); @@ -34510,7 +40757,7 @@ var _ = require("underscore"); * * @classdesc Represents a sequence of ordered nodes. */ -var Sequence = (function () { +var Sequence = /** @class */ (function () { /** * Create a new sequene instance. * @@ -34590,7 +40837,7 @@ var Sequence = (function () { exports.Sequence = Sequence; exports.default = Sequence; -},{"underscore":178}],319:[function(require,module,exports){ +},{"underscore":242}],405:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); @@ -34603,7 +40850,7 @@ var Geo_1 = require("../../Geo"); * * @classdesc Represents a class for calculating node edges. */ -var EdgeCalculator = (function () { +var EdgeCalculator = /** @class */ (function () { /** * Create a new edge calculator instance. * @@ -34667,6 +40914,7 @@ var EdgeCalculator = (function () { var sameUser = potential.userKey === node.userKey; var potentialEdge = { capturedAt: potential.capturedAt, + croppedPano: potential.pano && !potential.fullPano, directionChange: directionChange, distance: distance, fullPano: potential.fullPano, @@ -34746,8 +40994,7 @@ var EdgeCalculator = (function () { if (potentialEdge.sequenceKey == null) { continue; } - if (potentialEdge.sameSequence || - !potentialEdge.sameMergeCC) { + if (potentialEdge.sameSequence) { continue; } if (nodeFullPano) { @@ -34817,6 +41064,9 @@ var EdgeCalculator = (function () { /** * Computes the step edges for a perspective node. * + * @description Step edge targets can only be other perspective nodes. + * Returns an empty array for cropped and full panoramas. + * * @param {Node} node - Source node. * @param {Array} potentialEdges - Potential edges. * @param {string} prevKey - Key of previous node in sequence. @@ -34828,7 +41078,7 @@ var EdgeCalculator = (function () { throw new Error_1.ArgumentMapillaryError("Node has to be full."); } var edges = []; - if (node.fullPano) { + if (node.pano) { return edges; } for (var k in this._directions.steps) { @@ -34841,7 +41091,7 @@ var EdgeCalculator = (function () { var fallback = null; for (var _i = 0, potentialEdges_2 = potentialEdges; _i < potentialEdges_2.length; _i++) { var potential = potentialEdges_2[_i]; - if (potential.fullPano) { + if (potential.croppedPano || potential.fullPano) { continue; } if (Math.abs(potential.directionChange) > this._settings.stepMaxDirectionChange) { @@ -34891,6 +41141,9 @@ var EdgeCalculator = (function () { /** * Computes the turn edges for a perspective node. * + * @description Turn edge targets can only be other perspective images. + * Returns an empty array for cropped and full panoramas. + * * @param {Node} node - Source node. * @param {Array} potentialEdges - Potential edges. * @throws {ArgumentMapillaryError} If node is not full. @@ -34900,7 +41153,7 @@ var EdgeCalculator = (function () { throw new Error_1.ArgumentMapillaryError("Node has to be full."); } var edges = []; - if (node.fullPano) { + if (node.pano) { return edges; } for (var k in this._directions.turns) { @@ -34912,7 +41165,7 @@ var EdgeCalculator = (function () { var edge = null; for (var _i = 0, potentialEdges_3 = potentialEdges; _i < potentialEdges_3.length; _i++) { var potential = potentialEdges_3[_i]; - if (potential.fullPano) { + if (potential.croppedPano || potential.fullPano) { continue; } if (potential.distance > this._settings.turnMaxDistance) { @@ -34964,6 +41217,9 @@ var EdgeCalculator = (function () { /** * Computes the pano edges for a perspective node. * + * @description Perspective to pano edge targets can only be + * full pano nodes. Returns an empty array for cropped and full panoramas. + * * @param {Node} node - Source node. * @param {Array} potentialEdges - Potential edges. * @throws {ArgumentMapillaryError} If node is not full. @@ -34972,7 +41228,7 @@ var EdgeCalculator = (function () { if (!node.full) { throw new Error_1.ArgumentMapillaryError("Node has to be full."); } - if (node.fullPano) { + if (node.pano) { return []; } var lowestScore = Number.MAX_VALUE; @@ -35007,7 +41263,12 @@ var EdgeCalculator = (function () { ]; }; /** - * Computes the pano and step edges for a pano node. + * Computes the full pano and step edges for a full pano node. + * + * @description Pano to pano edge targets can only be + * full pano nodes. Pano to step edge targets can only be perspective + * nodes. + * Returns an empty array for cropped panoramas and perspective nodes. * * @param {Node} node - Source node. * @param {Array} potentialEdges - Potential edges. @@ -35035,6 +41296,9 @@ var EdgeCalculator = (function () { potentialPanos.push(potential); } else { + if (potential.croppedPano) { + continue; + } for (var k in this._directions.panos) { if (!this._directions.panos.hasOwnProperty(k)) { continue; @@ -35175,10 +41439,10 @@ var EdgeCalculator = (function () { exports.EdgeCalculator = EdgeCalculator; exports.default = EdgeCalculator; -},{"../../Edge":227,"../../Error":228,"../../Geo":229,"three":176}],320:[function(require,module,exports){ +},{"../../Edge":291,"../../Error":292,"../../Geo":293,"three":240}],406:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var EdgeCalculatorCoefficients = (function () { +var EdgeCalculatorCoefficients = /** @class */ (function () { function EdgeCalculatorCoefficients() { this.panoPreferredDistance = 2; this.panoMotion = 2; @@ -35201,11 +41465,11 @@ var EdgeCalculatorCoefficients = (function () { exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients; exports.default = EdgeCalculatorCoefficients; -},{}],321:[function(require,module,exports){ +},{}],407:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Edge_1 = require("../../Edge"); -var EdgeCalculatorDirections = (function () { +var EdgeCalculatorDirections = /** @class */ (function () { function EdgeCalculatorDirections() { this.steps = {}; this.turns = {}; @@ -35274,10 +41538,10 @@ var EdgeCalculatorDirections = (function () { }()); exports.EdgeCalculatorDirections = EdgeCalculatorDirections; -},{"../../Edge":227}],322:[function(require,module,exports){ +},{"../../Edge":291}],408:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var EdgeCalculatorSettings = (function () { +var EdgeCalculatorSettings = /** @class */ (function () { function EdgeCalculatorSettings() { this.panoMinDistance = 0.1; this.panoMaxDistance = 20; @@ -35311,7 +41575,7 @@ var EdgeCalculatorSettings = (function () { exports.EdgeCalculatorSettings = EdgeCalculatorSettings; exports.default = EdgeCalculatorSettings; -},{}],323:[function(require,module,exports){ +},{}],409:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -35369,21 +41633,15 @@ var EdgeDirection; EdgeDirection[EdgeDirection["Similar"] = 10] = "Similar"; })(EdgeDirection = exports.EdgeDirection || (exports.EdgeDirection = {})); -},{}],324:[function(require,module,exports){ +},{}],410:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var _ = require("underscore"); var vd = require("virtual-dom"); var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/operator/combineLatest"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/pluck"); -require("rxjs/add/operator/scan"); var Render_1 = require("../Render"); -var DOMRenderer = (function () { +var DOMRenderer = /** @class */ (function () { function DOMRenderer(element, renderService, currentFrame$) { this._adaptiveOperation$ = new Subject_1.Subject(); this._render$ = new Subject_1.Subject(); @@ -35557,7 +41815,7 @@ var DOMRenderer = (function () { exports.DOMRenderer = DOMRenderer; exports.default = DOMRenderer; -},{"../Render":232,"rxjs/Subject":34,"rxjs/add/operator/combineLatest":53,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/pluck":70,"rxjs/add/operator/scan":73,"underscore":178,"virtual-dom":182}],325:[function(require,module,exports){ +},{"../Render":296,"rxjs/Subject":34,"underscore":242,"virtual-dom":246}],411:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GLRenderStage; @@ -35567,26 +41825,17 @@ var GLRenderStage; })(GLRenderStage = exports.GLRenderStage || (exports.GLRenderStage = {})); exports.default = GLRenderStage; -},{}],326:[function(require,module,exports){ +},{}],412:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var Observable_1 = require("rxjs/Observable"); var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/observable/combineLatest"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/first"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/merge"); -require("rxjs/add/operator/mergeMap"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/share"); -require("rxjs/add/operator/startWith"); var Render_1 = require("../Render"); -var GLRenderer = (function () { - function GLRenderer(canvasContainer, renderService) { +var Utils_1 = require("../Utils"); +var GLRenderer = /** @class */ (function () { + function GLRenderer(canvasContainer, renderService, dom) { var _this = this; this._renderFrame$ = new Subject_1.Subject(); this._renderCameraOperation$ = new Subject_1.Subject(); @@ -35596,10 +41845,14 @@ var GLRenderer = (function () { this._rendererOperation$ = new Subject_1.Subject(); this._eraserOperation$ = new Subject_1.Subject(); this._renderService = renderService; + this._dom = !!dom ? dom : new Utils_1.DOM(); this._renderer$ = this._rendererOperation$ .scan(function (renderer, operation) { return operation(renderer); - }, { needsRender: false, renderer: null }); + }, { needsRender: false, renderer: null }) + .filter(function (renderer) { + return !!renderer.renderer; + }); this._renderCollection$ = this._renderOperation$ .scan(function (hashes, operation) { return operation(hashes); @@ -35704,14 +41957,16 @@ var GLRenderer = (function () { this._webGLRenderer$ = this._render$ .first() .map(function (hash) { + var canvas = _this._dom.createElement("canvas", "mapillary-js-canvas"); + canvas.style.position = "absolute"; + canvas.setAttribute("tabindex", "0"); + canvasContainer.appendChild(canvas); var element = renderService.element; - var webGLRenderer = new THREE.WebGLRenderer(); + var webGLRenderer = new THREE.WebGLRenderer({ canvas: canvas }); webGLRenderer.setPixelRatio(window.devicePixelRatio); webGLRenderer.setSize(element.offsetWidth, element.offsetHeight); webGLRenderer.setClearColor(new THREE.Color(0x202020), 1.0); webGLRenderer.autoClear = false; - webGLRenderer.domElement.style.position = "absolute"; - canvasContainer.appendChild(webGLRenderer.domElement); return webGLRenderer; }) .publishReplay(1) @@ -35815,14 +42070,14 @@ var GLRenderer = (function () { exports.GLRenderer = GLRenderer; exports.default = GLRenderer; -},{"../Render":232,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/scan":73,"rxjs/add/operator/share":74,"rxjs/add/operator/startWith":78,"three":176}],327:[function(require,module,exports){ +},{"../Render":296,"../Utils":300,"rxjs/Observable":29,"rxjs/Subject":34,"three":240}],413:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var Geo_1 = require("../Geo"); var Render_1 = require("../Render"); -var RenderCamera = (function () { +var RenderCamera = /** @class */ (function () { function RenderCamera(elementWidth, elementHeight, renderMode) { this.alpha = -1; this.zoom = 0; @@ -35903,7 +42158,6 @@ var RenderCamera = (function () { this._perspective.lookAt(camera.lookat); this._perspective.updateMatrix(); this._perspective.updateMatrixWorld(false); - this._perspective.matrixWorldInverse.getInverse(this._perspective.matrixWorld); this._changed = true; }; RenderCamera.prototype.updateRotation = function (camera) { @@ -35942,7 +42196,7 @@ var RenderCamera = (function () { exports.RenderCamera = RenderCamera; exports.default = RenderCamera; -},{"../Geo":229,"../Render":232,"three":176}],328:[function(require,module,exports){ +},{"../Geo":293,"../Render":296,"three":240}],414:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -35978,24 +42232,15 @@ var RenderMode; })(RenderMode = exports.RenderMode || (exports.RenderMode = {})); exports.default = RenderMode; -},{}],329:[function(require,module,exports){ +},{}],415:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var Subject_1 = require("rxjs/Subject"); var BehaviorSubject_1 = require("rxjs/BehaviorSubject"); -require("rxjs/add/observable/combineLatest"); -require("rxjs/add/operator/do"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/publishReplay"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/skip"); -require("rxjs/add/operator/startWith"); -require("rxjs/add/operator/withLatestFrom"); var Geo_1 = require("../Geo"); var Render_1 = require("../Render"); -var RenderService = (function () { +var RenderService = /** @class */ (function () { function RenderService(element, currentFrame$, renderMode) { var _this = this; this._element = element; @@ -36154,29 +42399,94 @@ var RenderService = (function () { exports.RenderService = RenderService; exports.default = RenderService; -},{"../Geo":229,"../Render":232,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/skip":75,"rxjs/add/operator/startWith":78,"rxjs/add/operator/withLatestFrom":83}],330:[function(require,module,exports){ +},{"../Geo":293,"../Render":296,"rxjs/BehaviorSubject":26,"rxjs/Subject":34}],416:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var RotationDelta = /** @class */ (function () { + function RotationDelta(phi, theta) { + this._phi = phi; + this._theta = theta; + } + Object.defineProperty(RotationDelta.prototype, "phi", { + get: function () { + return this._phi; + }, + set: function (value) { + this._phi = value; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RotationDelta.prototype, "theta", { + get: function () { + return this._theta; + }, + set: function (value) { + this._theta = value; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RotationDelta.prototype, "isZero", { + get: function () { + return this._phi === 0 && this._theta === 0; + }, + enumerable: true, + configurable: true + }); + RotationDelta.prototype.copy = function (delta) { + this._phi = delta.phi; + this._theta = delta.theta; + }; + RotationDelta.prototype.lerp = function (other, alpha) { + this._phi = (1 - alpha) * this._phi + alpha * other.phi; + this._theta = (1 - alpha) * this._theta + alpha * other.theta; + }; + RotationDelta.prototype.multiply = function (value) { + this._phi *= value; + this._theta *= value; + }; + RotationDelta.prototype.threshold = function (value) { + this._phi = Math.abs(this._phi) > value ? this._phi : 0; + this._theta = Math.abs(this._theta) > value ? this._theta : 0; + }; + RotationDelta.prototype.lengthSquared = function () { + return this._phi * this._phi + this._theta * this._theta; + }; + RotationDelta.prototype.reset = function () { + this._phi = 0; + this._theta = 0; + }; + return RotationDelta; +}()); +exports.RotationDelta = RotationDelta; +exports.default = RotationDelta; + +},{}],417:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var State; (function (State) { State[State["Traversing"] = 0] = "Traversing"; State[State["Waiting"] = 1] = "Waiting"; + State[State["WaitingInteractively"] = 2] = "WaitingInteractively"; })(State = exports.State || (exports.State = {})); exports.default = State; -},{}],331:[function(require,module,exports){ +},{}],418:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var State_1 = require("../State"); var Geo_1 = require("../Geo"); -var StateContext = (function () { - function StateContext() { +var StateContext = /** @class */ (function () { + function StateContext(transitionMode) { this._state = new State_1.TraversingState({ alpha: 1, camera: new Geo_1.Camera(), currentIndex: -1, reference: { alt: 0, lat: 0, lon: 0 }, trajectory: [], + transitionMode: transitionMode == null ? State_1.TransitionMode.Default : transitionMode, zoom: 0, }); } @@ -36186,6 +42496,9 @@ var StateContext = (function () { StateContext.prototype.wait = function () { this._state = this._state.wait(); }; + StateContext.prototype.waitInteractively = function () { + this._state = this._state.waitInteractively(); + }; Object.defineProperty(StateContext.prototype, "state", { get: function () { if (this._state instanceof State_1.TraversingState) { @@ -36194,6 +42507,9 @@ var StateContext = (function () { else if (this._state instanceof State_1.WaitingState) { return State_1.State.Waiting; } + else if (this._state instanceof State_1.InteractiveWaitingState) { + return State_1.State.WaitingInteractively; + } throw new Error("Invalid state"); }, enumerable: true, @@ -36339,6 +42655,9 @@ var StateContext = (function () { StateContext.prototype.rotateBasicUnbounded = function (basicRotation) { this._state.rotateBasicUnbounded(basicRotation); }; + StateContext.prototype.rotateBasicWithoutInertia = function (basicRotation) { + this._state.rotateBasicWithoutInertia(basicRotation); + }; StateContext.prototype.rotateToBasic = function (basic) { this._state.rotateToBasic(basic); }; @@ -36351,31 +42670,25 @@ var StateContext = (function () { StateContext.prototype.zoomIn = function (delta, reference) { this._state.zoomIn(delta, reference); }; + StateContext.prototype.setSpeed = function (speed) { + this._state.setSpeed(speed); + }; + StateContext.prototype.setTransitionMode = function (mode) { + this._state.setTransitionMode(mode); + }; return StateContext; -}()); -exports.StateContext = StateContext; - -},{"../Geo":229,"../State":233}],332:[function(require,module,exports){ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var BehaviorSubject_1 = require("rxjs/BehaviorSubject"); -var Subject_1 = require("rxjs/Subject"); -var AnimationFrame_1 = require("rxjs/util/AnimationFrame"); -require("rxjs/add/operator/bufferCount"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/do"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/first"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/pairwise"); -require("rxjs/add/operator/publishReplay"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/startWith"); -require("rxjs/add/operator/switchMap"); -require("rxjs/add/operator/withLatestFrom"); +}()); +exports.StateContext = StateContext; + +},{"../Geo":293,"../State":297}],419:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var BehaviorSubject_1 = require("rxjs/BehaviorSubject"); +var Subject_1 = require("rxjs/Subject"); +var AnimationFrame_1 = require("rxjs/util/AnimationFrame"); var State_1 = require("../State"); -var StateService = (function () { - function StateService() { +var StateService = /** @class */ (function () { + function StateService(transitionMode) { var _this = this; this._appendNode$ = new Subject_1.Subject(); this._start$ = new Subject_1.Subject(); @@ -36387,7 +42700,7 @@ var StateService = (function () { this._context$ = this._contextOperation$ .scan(function (context, operation) { return operation(context); - }, new State_1.StateContext()) + }, new State_1.StateContext(transitionMode)) .publishReplay(1) .refCount(); this._state$ = this._context$ @@ -36650,6 +42963,9 @@ var StateService = (function () { StateService.prototype.wait = function () { this._invokeContextOperation(function (context) { context.wait(); }); }; + StateService.prototype.waitInteractively = function () { + this._invokeContextOperation(function (context) { context.waitInteractively(); }); + }; StateService.prototype.appendNodes = function (nodes) { this._invokeContextOperation(function (context) { context.append(nodes); }); }; @@ -36683,6 +42999,10 @@ var StateService = (function () { this._inMotionOperation$.next(true); this._invokeContextOperation(function (context) { context.rotateBasicUnbounded(basicRotation); }); }; + StateService.prototype.rotateBasicWithoutInertia = function (basicRotation) { + this._inMotionOperation$.next(true); + this._invokeContextOperation(function (context) { context.rotateBasicWithoutInertia(basicRotation); }); + }; StateService.prototype.rotateToBasic = function (basic) { this._inMotionOperation$.next(true); this._invokeContextOperation(function (context) { context.rotateToBasic(basic); }); @@ -36723,6 +43043,12 @@ var StateService = (function () { this._inMotionOperation$.next(true); this._invokeContextOperation(function (context) { context.setCenter(center); }); }; + StateService.prototype.setSpeed = function (speed) { + this._invokeContextOperation(function (context) { context.setSpeed(speed); }); + }; + StateService.prototype.setTransitionMode = function (mode) { + this._invokeContextOperation(function (context) { context.setTransitionMode(mode); }); + }; StateService.prototype.setZoom = function (zoom) { this._inMotionOperation$.next(true); this._invokeContextOperation(function (context) { context.setZoom(zoom); }); @@ -36755,17 +43081,519 @@ var StateService = (function () { }()); exports.StateService = StateService; -},{"../State":233,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/do":59,"rxjs/add/operator/filter":61,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/pairwise":69,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/startWith":78,"rxjs/add/operator/switchMap":79,"rxjs/add/operator/withLatestFrom":83,"rxjs/util/AnimationFrame":157}],333:[function(require,module,exports){ +},{"../State":297,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/util/AnimationFrame":217}],420:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Enumeration for transition mode + * @enum {number} + * @readonly + * @description Modes for specifying how transitions + * between nodes are performed. + */ +var TransitionMode; +(function (TransitionMode) { + /** + * Default transitions. + * + * @description The viewer dynamically determines + * whether transitions should be performed with or + * without motion and blending for each transition + * based on the underlying data. + */ + TransitionMode[TransitionMode["Default"] = 0] = "Default"; + /** + * Instantaneous transitions. + * + * @description All transitions are performed + * without motion or blending. + */ + TransitionMode[TransitionMode["Instantaneous"] = 1] = "Instantaneous"; +})(TransitionMode = exports.TransitionMode || (exports.TransitionMode = {})); +exports.default = TransitionMode; + +},{}],421:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var THREE = require("three"); +var State_1 = require("../../State"); +var InteractiveStateBase = /** @class */ (function (_super) { + __extends(InteractiveStateBase, _super); + function InteractiveStateBase(state) { + var _this = _super.call(this, state) || this; + _this._animationSpeed = 1 / 40; + _this._rotationDelta = new State_1.RotationDelta(0, 0); + _this._requestedRotationDelta = null; + _this._basicRotation = [0, 0]; + _this._requestedBasicRotation = null; + _this._requestedBasicRotationUnbounded = null; + _this._rotationAcceleration = 0.86; + _this._rotationIncreaseAlpha = 0.97; + _this._rotationDecreaseAlpha = 0.9; + _this._rotationThreshold = 1e-3; + _this._unboundedRotationAlpha = 0.8; + _this._desiredZoom = state.zoom; + _this._minZoom = 0; + _this._maxZoom = 3; + _this._lookatDepth = 10; + _this._desiredLookat = null; + _this._desiredCenter = null; + return _this; + } + InteractiveStateBase.prototype.rotate = function (rotationDelta) { + if (this._currentNode == null) { + return; + } + this._desiredZoom = this._zoom; + this._desiredLookat = null; + this._requestedBasicRotation = null; + if (this._requestedRotationDelta != null) { + this._requestedRotationDelta.phi = this._requestedRotationDelta.phi + rotationDelta.phi; + this._requestedRotationDelta.theta = this._requestedRotationDelta.theta + rotationDelta.theta; + } + else { + this._requestedRotationDelta = new State_1.RotationDelta(rotationDelta.phi, rotationDelta.theta); + } + }; + InteractiveStateBase.prototype.rotateBasic = function (basicRotation) { + if (this._currentNode == null) { + return; + } + this._desiredZoom = this._zoom; + this._desiredLookat = null; + this._requestedRotationDelta = null; + if (this._requestedBasicRotation != null) { + this._requestedBasicRotation[0] += basicRotation[0]; + this._requestedBasicRotation[1] += basicRotation[1]; + var threshold = 0.05 / Math.pow(2, this._zoom); + this._requestedBasicRotation[0] = + this._spatial.clamp(this._requestedBasicRotation[0], -threshold, threshold); + this._requestedBasicRotation[1] = + this._spatial.clamp(this._requestedBasicRotation[1], -threshold, threshold); + } + else { + this._requestedBasicRotation = basicRotation.slice(); + } + }; + InteractiveStateBase.prototype.rotateBasicUnbounded = function (basicRotation) { + if (this._currentNode == null) { + return; + } + if (this._requestedBasicRotationUnbounded != null) { + this._requestedBasicRotationUnbounded[0] += basicRotation[0]; + this._requestedBasicRotationUnbounded[1] += basicRotation[1]; + } + else { + this._requestedBasicRotationUnbounded = basicRotation.slice(); + } + }; + InteractiveStateBase.prototype.rotateBasicWithoutInertia = function (basic) { + if (this._currentNode == null) { + return; + } + this._desiredZoom = this._zoom; + this._desiredLookat = null; + this._requestedRotationDelta = null; + this._requestedBasicRotation = null; + var threshold = 0.05 / Math.pow(2, this._zoom); + var basicRotation = basic.slice(); + basicRotation[0] = this._spatial.clamp(basicRotation[0], -threshold, threshold); + basicRotation[1] = this._spatial.clamp(basicRotation[1], -threshold, threshold); + this._applyRotationBasic(basicRotation); + }; + InteractiveStateBase.prototype.rotateToBasic = function (basic) { + if (this._currentNode == null) { + return; + } + this._desiredZoom = this._zoom; + this._desiredLookat = null; + basic[0] = this._spatial.clamp(basic[0], 0, 1); + basic[1] = this._spatial.clamp(basic[1], 0, 1); + var lookat = this.currentTransform.unprojectBasic(basic, this._lookatDepth); + this._currentCamera.lookat.fromArray(lookat); + }; + InteractiveStateBase.prototype.zoomIn = function (delta, reference) { + if (this._currentNode == null) { + return; + } + this._desiredZoom = Math.max(this._minZoom, Math.min(this._maxZoom, this._desiredZoom + delta)); + var currentCenter = this.currentTransform.projectBasic(this._currentCamera.lookat.toArray()); + var currentCenterX = currentCenter[0]; + var currentCenterY = currentCenter[1]; + var zoom0 = Math.pow(2, this._zoom); + var zoom1 = Math.pow(2, this._desiredZoom); + var refX = reference[0]; + var refY = reference[1]; + if (this.currentTransform.gpano != null && + this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) { + if (refX - currentCenterX > 0.5) { + refX = refX - 1; + } + else if (currentCenterX - refX > 0.5) { + refX = 1 + refX; + } + } + var newCenterX = refX - zoom0 / zoom1 * (refX - currentCenterX); + var newCenterY = refY - zoom0 / zoom1 * (refY - currentCenterY); + var gpano = this.currentTransform.gpano; + if (this._currentNode.fullPano) { + newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1); + newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0.05, 0.95); + } + else if (gpano != null && + this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) { + newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1); + newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0, 1); + } + else { + newCenterX = this._spatial.clamp(newCenterX, 0, 1); + newCenterY = this._spatial.clamp(newCenterY, 0, 1); + } + this._desiredLookat = new THREE.Vector3() + .fromArray(this.currentTransform.unprojectBasic([newCenterX, newCenterY], this._lookatDepth)); + }; + InteractiveStateBase.prototype.setCenter = function (center) { + this._desiredLookat = null; + this._requestedRotationDelta = null; + this._requestedBasicRotation = null; + this._desiredZoom = this._zoom; + var clamped = [ + this._spatial.clamp(center[0], 0, 1), + this._spatial.clamp(center[1], 0, 1), + ]; + if (this._currentNode == null) { + this._desiredCenter = clamped; + return; + } + this._desiredCenter = null; + var currentLookat = new THREE.Vector3() + .fromArray(this.currentTransform.unprojectBasic(clamped, this._lookatDepth)); + var previousTransform = this.previousTransform != null ? + this.previousTransform : + this.currentTransform; + var previousLookat = new THREE.Vector3() + .fromArray(previousTransform.unprojectBasic(clamped, this._lookatDepth)); + this._currentCamera.lookat.copy(currentLookat); + this._previousCamera.lookat.copy(previousLookat); + }; + InteractiveStateBase.prototype.setZoom = function (zoom) { + this._desiredLookat = null; + this._requestedRotationDelta = null; + this._requestedBasicRotation = null; + this._zoom = this._spatial.clamp(zoom, this._minZoom, this._maxZoom); + this._desiredZoom = this._zoom; + }; + InteractiveStateBase.prototype._applyRotation = function (camera) { + if (camera == null) { + return; + } + var q = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1)); + var qInverse = q.clone().inverse(); + var offset = new THREE.Vector3(); + offset.copy(camera.lookat).sub(camera.position); + offset.applyQuaternion(q); + var length = offset.length(); + var phi = Math.atan2(offset.y, offset.x); + phi += this._rotationDelta.phi; + var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z); + theta += this._rotationDelta.theta; + theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta)); + offset.x = Math.sin(theta) * Math.cos(phi); + offset.y = Math.sin(theta) * Math.sin(phi); + offset.z = Math.cos(theta); + offset.applyQuaternion(qInverse); + camera.lookat.copy(camera.position).add(offset.multiplyScalar(length)); + }; + InteractiveStateBase.prototype._applyRotationBasic = function (basicRotation) { + var currentNode = this._currentNode; + var previousNode = this._previousNode != null ? + this.previousNode : + this.currentNode; + var currentCamera = this._currentCamera; + var previousCamera = this._previousCamera; + var currentTransform = this.currentTransform; + var previousTransform = this.previousTransform != null ? + this.previousTransform : + this.currentTransform; + var currentBasic = currentTransform.projectBasic(currentCamera.lookat.toArray()); + var previousBasic = previousTransform.projectBasic(previousCamera.lookat.toArray()); + var currentGPano = currentTransform.gpano; + var previousGPano = previousTransform.gpano; + if (currentNode.fullPano) { + currentBasic[0] = this._spatial.wrap(currentBasic[0] + basicRotation[0], 0, 1); + currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0.05, 0.95); + } + else if (currentGPano != null && + currentTransform.gpano.CroppedAreaImageWidthPixels === currentTransform.gpano.FullPanoWidthPixels) { + currentBasic[0] = this._spatial.wrap(currentBasic[0] + basicRotation[0], 0, 1); + currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1); + } + else { + currentBasic[0] = this._spatial.clamp(currentBasic[0] + basicRotation[0], 0, 1); + currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1); + } + if (previousNode.fullPano) { + previousBasic[0] = this._spatial.wrap(previousBasic[0] + basicRotation[0], 0, 1); + previousBasic[1] = this._spatial.clamp(previousBasic[1] + basicRotation[1], 0.05, 0.95); + } + else if (previousGPano != null && + previousTransform.gpano.CroppedAreaImageWidthPixels === previousTransform.gpano.FullPanoWidthPixels) { + previousBasic[0] = this._spatial.wrap(previousBasic[0] + basicRotation[0], 0, 1); + previousBasic[1] = this._spatial.clamp(previousBasic[1] + basicRotation[1], 0, 1); + } + else { + previousBasic[0] = this._spatial.clamp(previousBasic[0] + basicRotation[0], 0, 1); + previousBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1); + } + var currentLookat = currentTransform.unprojectBasic(currentBasic, this._lookatDepth); + currentCamera.lookat.fromArray(currentLookat); + var previousLookat = previousTransform.unprojectBasic(previousBasic, this._lookatDepth); + previousCamera.lookat.fromArray(previousLookat); + }; + InteractiveStateBase.prototype._updateZoom = function (animationSpeed) { + var diff = this._desiredZoom - this._zoom; + var sign = diff > 0 ? 1 : diff < 0 ? -1 : 0; + if (diff === 0) { + return; + } + else if (Math.abs(diff) < 2e-3) { + this._zoom = this._desiredZoom; + if (this._desiredLookat != null) { + this._desiredLookat = null; + } + } + else { + this._zoom += sign * Math.max(Math.abs(5 * animationSpeed * diff), 2e-3); + } + }; + InteractiveStateBase.prototype._updateLookat = function (animationSpeed) { + if (this._desiredLookat === null) { + return; + } + var diff = this._desiredLookat.distanceToSquared(this._currentCamera.lookat); + if (Math.abs(diff) < 1e-6) { + this._currentCamera.lookat.copy(this._desiredLookat); + this._desiredLookat = null; + } + else { + this._currentCamera.lookat.lerp(this._desiredLookat, 5 * animationSpeed); + } + }; + InteractiveStateBase.prototype._updateRotation = function () { + if (this._requestedRotationDelta != null) { + var length_1 = this._rotationDelta.lengthSquared(); + var requestedLength = this._requestedRotationDelta.lengthSquared(); + if (requestedLength > length_1) { + this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationIncreaseAlpha); + } + else { + this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationDecreaseAlpha); + } + this._requestedRotationDelta = null; + return; + } + if (this._rotationDelta.isZero) { + return; + } + this._rotationDelta.multiply(this._rotationAcceleration); + this._rotationDelta.threshold(this._rotationThreshold); + }; + InteractiveStateBase.prototype._updateRotationBasic = function () { + if (this._requestedBasicRotation != null) { + var x = this._basicRotation[0]; + var y = this._basicRotation[1]; + var reqX = this._requestedBasicRotation[0]; + var reqY = this._requestedBasicRotation[1]; + if (Math.abs(reqX) > Math.abs(x)) { + this._basicRotation[0] = (1 - this._rotationIncreaseAlpha) * x + this._rotationIncreaseAlpha * reqX; + } + else { + this._basicRotation[0] = (1 - this._rotationDecreaseAlpha) * x + this._rotationDecreaseAlpha * reqX; + } + if (Math.abs(reqY) > Math.abs(y)) { + this._basicRotation[1] = (1 - this._rotationIncreaseAlpha) * y + this._rotationIncreaseAlpha * reqY; + } + else { + this._basicRotation[1] = (1 - this._rotationDecreaseAlpha) * y + this._rotationDecreaseAlpha * reqY; + } + this._requestedBasicRotation = null; + return; + } + if (this._requestedBasicRotationUnbounded != null) { + var reqX = this._requestedBasicRotationUnbounded[0]; + var reqY = this._requestedBasicRotationUnbounded[1]; + if (Math.abs(reqX) > 0) { + this._basicRotation[0] = (1 - this._unboundedRotationAlpha) * this._basicRotation[0] + this._unboundedRotationAlpha * reqX; + } + if (Math.abs(reqY) > 0) { + this._basicRotation[1] = (1 - this._unboundedRotationAlpha) * this._basicRotation[1] + this._unboundedRotationAlpha * reqY; + } + if (this._desiredLookat != null) { + var desiredBasicLookat = this.currentTransform.projectBasic(this._desiredLookat.toArray()); + desiredBasicLookat[0] += reqX; + desiredBasicLookat[1] += reqY; + this._desiredLookat = new THREE.Vector3() + .fromArray(this.currentTransform.unprojectBasic(desiredBasicLookat, this._lookatDepth)); + } + this._requestedBasicRotationUnbounded = null; + } + if (this._basicRotation[0] === 0 && this._basicRotation[1] === 0) { + return; + } + this._basicRotation[0] = this._rotationAcceleration * this._basicRotation[0]; + this._basicRotation[1] = this._rotationAcceleration * this._basicRotation[1]; + if (Math.abs(this._basicRotation[0]) < this._rotationThreshold / Math.pow(2, this._zoom) && + Math.abs(this._basicRotation[1]) < this._rotationThreshold / Math.pow(2, this._zoom)) { + this._basicRotation = [0, 0]; + } + }; + InteractiveStateBase.prototype._clearRotation = function () { + if (this._currentNode.fullPano) { + return; + } + if (this._requestedRotationDelta != null) { + this._requestedRotationDelta = null; + } + if (!this._rotationDelta.isZero) { + this._rotationDelta.reset(); + } + if (this._requestedBasicRotation != null) { + this._requestedBasicRotation = null; + } + if (this._basicRotation[0] > 0 || this._basicRotation[1] > 0) { + this._basicRotation = [0, 0]; + } + }; + InteractiveStateBase.prototype._setDesiredCenter = function () { + if (this._desiredCenter == null) { + return; + } + var lookatDirection = new THREE.Vector3() + .fromArray(this.currentTransform.unprojectBasic(this._desiredCenter, this._lookatDepth)) + .sub(this._currentCamera.position); + this._currentCamera.lookat.copy(this._currentCamera.position.clone().add(lookatDirection)); + this._previousCamera.lookat.copy(this._previousCamera.position.clone().add(lookatDirection)); + this._desiredCenter = null; + }; + InteractiveStateBase.prototype._setDesiredZoom = function () { + this._desiredZoom = + this._currentNode.fullPano || this._previousNode == null ? + this._zoom : 0; + }; + return InteractiveStateBase; +}(State_1.StateBase)); +exports.InteractiveStateBase = InteractiveStateBase; +exports.default = InteractiveStateBase; + +},{"../../State":297,"three":240}],422:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var State_1 = require("../../State"); +var InteractiveWaitingState = /** @class */ (function (_super) { + __extends(InteractiveWaitingState, _super); + function InteractiveWaitingState(state) { + var _this = _super.call(this, state) || this; + _this._adjustCameras(); + _this._motionless = _this._motionlessTransition(); + return _this; + } + InteractiveWaitingState.prototype.traverse = function () { + return new State_1.TraversingState(this); + }; + InteractiveWaitingState.prototype.wait = function () { + return new State_1.WaitingState(this); + }; + InteractiveWaitingState.prototype.waitInteractively = function () { + throw new Error("Not implemented"); + }; + InteractiveWaitingState.prototype.prepend = function (nodes) { + _super.prototype.prepend.call(this, nodes); + this._motionless = this._motionlessTransition(); + }; + InteractiveWaitingState.prototype.set = function (nodes) { + _super.prototype.set.call(this, nodes); + this._motionless = this._motionlessTransition(); + }; + InteractiveWaitingState.prototype.setSpeed = function (speed) { return; }; + InteractiveWaitingState.prototype.move = function (delta) { + this._alpha = Math.max(0, Math.min(1, this._alpha + delta)); + }; + InteractiveWaitingState.prototype.moveTo = function (position) { + this._alpha = Math.max(0, Math.min(1, position)); + }; + InteractiveWaitingState.prototype.update = function (fps) { + this._updateRotation(); + if (!this._rotationDelta.isZero) { + this._applyRotation(this._previousCamera); + this._applyRotation(this._currentCamera); + } + this._updateRotationBasic(); + if (this._basicRotation[0] !== 0 || this._basicRotation[1] !== 0) { + this._applyRotationBasic(this._basicRotation); + } + var animationSpeed = this._animationSpeed * (60 / fps); + this._updateZoom(animationSpeed); + this._updateLookat(animationSpeed); + this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha); + }; + InteractiveWaitingState.prototype._getAlpha = function () { + return this._motionless ? Math.round(this._alpha) : this._alpha; + }; + InteractiveWaitingState.prototype._setCurrentCamera = function () { + _super.prototype._setCurrentCamera.call(this); + this._adjustCameras(); + }; + InteractiveWaitingState.prototype._adjustCameras = function () { + if (this._previousNode == null) { + return; + } + if (this._currentNode.fullPano) { + var lookat = this._camera.lookat.clone().sub(this._camera.position); + this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position)); + } + if (this._previousNode.fullPano) { + var lookat = this._currentCamera.lookat.clone().sub(this._currentCamera.position); + this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position)); + } + }; + return InteractiveWaitingState; +}(State_1.InteractiveStateBase)); +exports.InteractiveWaitingState = InteractiveWaitingState; +exports.default = InteractiveWaitingState; + +},{"../../State":297}],423:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var Error_1 = require("../../Error"); var Geo_1 = require("../../Geo"); -var StateBase = (function () { +var State_1 = require("../../State"); +var StateBase = /** @class */ (function () { function StateBase(state) { this._spatial = new Geo_1.Spatial(); this._geoCoords = new Geo_1.GeoCoords(); this._referenceThreshold = 0.01; + this._transitionMode = state.transitionMode; this._reference = state.reference; this._alpha = state.alpha; this._camera = state.camera.clone(); @@ -36777,7 +43605,7 @@ var StateBase = (function () { for (var _i = 0, _a = this._trajectory; _i < _a.length; _i++) { var node = _a[_i]; var translation = this._nodeToTranslation(node); - var transform = new Geo_1.Transform(node, node.image, translation); + var transform = new Geo_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image); this._trajectoryTransforms.push(transform); this._trajectoryCameras.push(new Geo_1.Camera(transform)); } @@ -36880,6 +43708,13 @@ var StateBase = (function () { enumerable: true, configurable: true }); + Object.defineProperty(StateBase.prototype, "transitionMode", { + get: function () { + return this._transitionMode; + }, + enumerable: true, + configurable: true + }); StateBase.prototype.append = function (nodes) { if (nodes.length < 1) { throw Error("Trajectory can not be empty"); @@ -36953,6 +43788,9 @@ var StateBase = (function () { this.currentTransform.projectBasic(this._camera.lookat.toArray()) : [0.5, 0.5]; }; + StateBase.prototype.setTransitionMode = function (mode) { + this._transitionMode = mode; + }; StateBase.prototype._setCurrent = function () { this._setCurrentNode(); var referenceReset = this._setReference(this._currentNode); @@ -36969,10 +43807,10 @@ var StateBase = (function () { }; StateBase.prototype._motionlessTransition = function () { var nodesSet = this._currentNode != null && this._previousNode != null; - return nodesSet && !(this._currentNode.merged && + return nodesSet && (this._transitionMode === State_1.TransitionMode.Instantaneous || !(this._currentNode.merged && this._previousNode.merged && this._withinOriginalDistance() && - this._sameConnectedComponent()); + this._sameConnectedComponent())); }; StateBase.prototype._setReference = function (node) { // do not reset reference if node is within threshold distance @@ -37022,7 +43860,7 @@ var StateBase = (function () { throw new Error_1.ArgumentMapillaryError("Assets must be cached when node is added to trajectory"); } var translation = this._nodeToTranslation(node); - var transform = new Geo_1.Transform(node, node.image, translation); + var transform = new Geo_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image); this._trajectoryTransforms.push(transform); this._trajectoryCameras.push(new Geo_1.Camera(transform)); } @@ -37034,7 +43872,7 @@ var StateBase = (function () { throw new Error_1.ArgumentMapillaryError("Assets must be cached when added to trajectory"); } var translation = this._nodeToTranslation(node); - var transform = new Geo_1.Transform(node, node.image, translation); + var transform = new Geo_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image); this._trajectoryTransforms.unshift(transform); this._trajectoryCameras.unshift(new Geo_1.Camera(transform)); } @@ -37047,13 +43885,8 @@ var StateBase = (function () { StateBase.prototype._sameConnectedComponent = function () { var current = this._currentNode; var previous = this._previousNode; - if (!current || - !current.mergeCC || - !previous || - !previous.mergeCC) { - return true; - } - return current.mergeCC === previous.mergeCC; + return !!current && !!previous && + current.mergeCC === previous.mergeCC; }; StateBase.prototype._withinOriginalDistance = function () { var current = this._currentNode; @@ -37069,7 +43902,7 @@ var StateBase = (function () { }()); exports.StateBase = StateBase; -},{"../../Error":228,"../../Geo":229}],334:[function(require,module,exports){ +},{"../../Error":292,"../../Geo":293,"../../State":297}],424:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -37083,92 +43916,18 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var THREE = require("three"); var UnitBezier = require("@mapbox/unitbezier"); var State_1 = require("../../State"); -var RotationDelta = (function () { - function RotationDelta(phi, theta) { - this._phi = phi; - this._theta = theta; - } - Object.defineProperty(RotationDelta.prototype, "phi", { - get: function () { - return this._phi; - }, - set: function (value) { - this._phi = value; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(RotationDelta.prototype, "theta", { - get: function () { - return this._theta; - }, - set: function (value) { - this._theta = value; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(RotationDelta.prototype, "isZero", { - get: function () { - return this._phi === 0 && this._theta === 0; - }, - enumerable: true, - configurable: true - }); - RotationDelta.prototype.copy = function (delta) { - this._phi = delta.phi; - this._theta = delta.theta; - }; - RotationDelta.prototype.lerp = function (other, alpha) { - this._phi = (1 - alpha) * this._phi + alpha * other.phi; - this._theta = (1 - alpha) * this._theta + alpha * other.theta; - }; - RotationDelta.prototype.multiply = function (value) { - this._phi *= value; - this._theta *= value; - }; - RotationDelta.prototype.threshold = function (value) { - this._phi = Math.abs(this._phi) > value ? this._phi : 0; - this._theta = Math.abs(this._theta) > value ? this._theta : 0; - }; - RotationDelta.prototype.lengthSquared = function () { - return this._phi * this._phi + this._theta * this._theta; - }; - RotationDelta.prototype.reset = function () { - this._phi = 0; - this._theta = 0; - }; - return RotationDelta; -}()); -var TraversingState = (function (_super) { +var TraversingState = /** @class */ (function (_super) { __extends(TraversingState, _super); function TraversingState(state) { var _this = _super.call(this, state) || this; _this._adjustCameras(); _this._motionless = _this._motionlessTransition(); _this._baseAlpha = _this._alpha; - _this._animationSpeed = 0.025; + _this._speedCoefficient = 1; _this._unitBezier = new UnitBezier(0.74, 0.67, 0.38, 0.96); _this._useBezier = false; - _this._rotationDelta = new RotationDelta(0, 0); - _this._requestedRotationDelta = null; - _this._basicRotation = [0, 0]; - _this._requestedBasicRotation = null; - _this._requestedBasicRotationUnbounded = null; - _this._rotationAcceleration = 0.86; - _this._rotationIncreaseAlpha = 0.97; - _this._rotationDecreaseAlpha = 0.9; - _this._rotationThreshold = 1e-3; - _this._unboundedRotationAlpha = 0.8; - _this._desiredZoom = state.zoom; - _this._minZoom = 0; - _this._maxZoom = 3; - _this._lookatDepth = 10; - _this._desiredLookat = null; - _this._desiredCenter = null; return _this; } TraversingState.prototype.traverse = function () { @@ -37177,6 +43936,9 @@ var TraversingState = (function (_super) { TraversingState.prototype.wait = function () { return new State_1.WaitingState(this); }; + TraversingState.prototype.waitInteractively = function () { + return new State_1.InteractiveWaitingState(this); + }; TraversingState.prototype.append = function (nodes) { var emptyTrajectory = this._trajectory.length === 0; if (emptyTrajectory) { @@ -37216,134 +43978,8 @@ var TraversingState = (function (_super) { TraversingState.prototype.moveTo = function (delta) { throw new Error("Not implemented"); }; - TraversingState.prototype.rotate = function (rotationDelta) { - if (this._currentNode == null) { - return; - } - this._desiredZoom = this._zoom; - this._desiredLookat = null; - this._requestedBasicRotation = null; - if (this._requestedRotationDelta != null) { - this._requestedRotationDelta.phi = this._requestedRotationDelta.phi + rotationDelta.phi; - this._requestedRotationDelta.theta = this._requestedRotationDelta.theta + rotationDelta.theta; - } - else { - this._requestedRotationDelta = new RotationDelta(rotationDelta.phi, rotationDelta.theta); - } - }; - TraversingState.prototype.rotateBasic = function (basicRotation) { - if (this._currentNode == null) { - return; - } - this._desiredZoom = this._zoom; - this._desiredLookat = null; - this._requestedRotationDelta = null; - if (this._requestedBasicRotation != null) { - this._requestedBasicRotation[0] += basicRotation[0]; - this._requestedBasicRotation[1] += basicRotation[1]; - var threshold = 0.05 / Math.pow(2, this._zoom); - this._requestedBasicRotation[0] = - this._spatial.clamp(this._requestedBasicRotation[0], -threshold, threshold); - this._requestedBasicRotation[1] = - this._spatial.clamp(this._requestedBasicRotation[1], -threshold, threshold); - } - else { - this._requestedBasicRotation = basicRotation.slice(); - } - }; - TraversingState.prototype.rotateBasicUnbounded = function (basicRotation) { - if (this._currentNode == null) { - return; - } - if (this._requestedBasicRotationUnbounded != null) { - this._requestedBasicRotationUnbounded[0] += basicRotation[0]; - this._requestedBasicRotationUnbounded[1] += basicRotation[1]; - } - else { - this._requestedBasicRotationUnbounded = basicRotation.slice(); - } - }; - TraversingState.prototype.rotateToBasic = function (basic) { - if (this._currentNode == null) { - return; - } - this._desiredZoom = this._zoom; - this._desiredLookat = null; - basic[0] = this._spatial.clamp(basic[0], 0, 1); - basic[1] = this._spatial.clamp(basic[1], 0, 1); - var lookat = this.currentTransform.unprojectBasic(basic, this._lookatDepth); - this._currentCamera.lookat.fromArray(lookat); - }; - TraversingState.prototype.zoomIn = function (delta, reference) { - if (this._currentNode == null) { - return; - } - this._desiredZoom = Math.max(this._minZoom, Math.min(this._maxZoom, this._desiredZoom + delta)); - var currentCenter = this.currentTransform.projectBasic(this._currentCamera.lookat.toArray()); - var currentCenterX = currentCenter[0]; - var currentCenterY = currentCenter[1]; - var zoom0 = Math.pow(2, this._zoom); - var zoom1 = Math.pow(2, this._desiredZoom); - var refX = reference[0]; - var refY = reference[1]; - if (this.currentTransform.gpano != null && - this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) { - if (refX - currentCenterX > 0.5) { - refX = refX - 1; - } - else if (currentCenterX - refX > 0.5) { - refX = 1 + refX; - } - } - var newCenterX = refX - zoom0 / zoom1 * (refX - currentCenterX); - var newCenterY = refY - zoom0 / zoom1 * (refY - currentCenterY); - var gpano = this.currentTransform.gpano; - if (this._currentNode.fullPano) { - newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1); - newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0.05, 0.95); - } - else if (gpano != null && - this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) { - newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1); - newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0, 1); - } - else { - newCenterX = this._spatial.clamp(newCenterX, 0, 1); - newCenterY = this._spatial.clamp(newCenterY, 0, 1); - } - this._desiredLookat = new THREE.Vector3() - .fromArray(this.currentTransform.unprojectBasic([newCenterX, newCenterY], this._lookatDepth)); - }; - TraversingState.prototype.setCenter = function (center) { - this._desiredLookat = null; - this._requestedRotationDelta = null; - this._requestedBasicRotation = null; - this._desiredZoom = this._zoom; - var clamped = [ - this._spatial.clamp(center[0], 0, 1), - this._spatial.clamp(center[1], 0, 1), - ]; - if (this._currentNode == null) { - this._desiredCenter = clamped; - return; - } - this._desiredCenter = null; - var currentLookat = new THREE.Vector3() - .fromArray(this.currentTransform.unprojectBasic(clamped, this._lookatDepth)); - var previousTransform = this.previousTransform != null ? - this.previousTransform : - this.currentTransform; - var previousLookat = new THREE.Vector3() - .fromArray(previousTransform.unprojectBasic(clamped, this._lookatDepth)); - this._currentCamera.lookat.copy(currentLookat); - this._previousCamera.lookat.copy(previousLookat); - }; - TraversingState.prototype.setZoom = function (zoom) { - this._desiredLookat = null; - this._requestedRotationDelta = null; - this._requestedBasicRotation = null; - this._zoom = this._spatial.clamp(zoom, this._minZoom, this._maxZoom); - this._desiredZoom = this._zoom; + TraversingState.prototype.setSpeed = function (speed) { + this._speedCoefficient = this._spatial.clamp(speed, 0, 10); }; TraversingState.prototype.update = function (fps) { if (this._alpha === 1 && this._currentIndex + this._alpha < this._trajectory.length) { @@ -37357,7 +43993,7 @@ var TraversingState = (function (_super) { this._desiredLookat = null; } var animationSpeed = this._animationSpeed * (60 / fps); - this._baseAlpha = Math.min(1, this._baseAlpha + animationSpeed); + this._baseAlpha = Math.min(1, this._baseAlpha + this._speedCoefficient * animationSpeed); if (this._useBezier) { this._alpha = this._unitBezier.solve(this._baseAlpha); } @@ -37371,7 +44007,7 @@ var TraversingState = (function (_super) { } this._updateRotationBasic(); if (this._basicRotation[0] !== 0 || this._basicRotation[1] !== 0) { - this._applyRotationBasic(); + this._applyRotationBasic(this._basicRotation); } this._updateZoom(animationSpeed); this._updateLookat(animationSpeed); @@ -37399,208 +44035,12 @@ var TraversingState = (function (_super) { this._baseAlpha = 0; this._motionless = this._motionlessTransition(); }; - TraversingState.prototype._applyRotation = function (camera) { - if (camera == null) { - return; - } - var q = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1)); - var qInverse = q.clone().inverse(); - var offset = new THREE.Vector3(); - offset.copy(camera.lookat).sub(camera.position); - offset.applyQuaternion(q); - var length = offset.length(); - var phi = Math.atan2(offset.y, offset.x); - phi += this._rotationDelta.phi; - var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z); - theta += this._rotationDelta.theta; - theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta)); - offset.x = Math.sin(theta) * Math.cos(phi); - offset.y = Math.sin(theta) * Math.sin(phi); - offset.z = Math.cos(theta); - offset.applyQuaternion(qInverse); - camera.lookat.copy(camera.position).add(offset.multiplyScalar(length)); - }; - TraversingState.prototype._applyRotationBasic = function () { - var currentNode = this._currentNode; - var previousNode = this._previousNode != null ? - this.previousNode : - this.currentNode; - var currentCamera = this._currentCamera; - var previousCamera = this._previousCamera; - var currentTransform = this.currentTransform; - var previousTransform = this.previousTransform != null ? - this.previousTransform : - this.currentTransform; - var currentBasic = currentTransform.projectBasic(currentCamera.lookat.toArray()); - var previousBasic = previousTransform.projectBasic(previousCamera.lookat.toArray()); - var currentGPano = currentTransform.gpano; - var previousGPano = previousTransform.gpano; - if (currentNode.fullPano) { - currentBasic[0] = this._spatial.wrap(currentBasic[0] + this._basicRotation[0], 0, 1); - currentBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0.05, 0.95); - } - else if (currentGPano != null && - currentTransform.gpano.CroppedAreaImageWidthPixels === currentTransform.gpano.FullPanoWidthPixels) { - currentBasic[0] = this._spatial.wrap(currentBasic[0] + this._basicRotation[0], 0, 1); - currentBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0, 1); - } - else { - currentBasic[0] = this._spatial.clamp(currentBasic[0] + this._basicRotation[0], 0, 1); - currentBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0, 1); - } - if (previousNode.fullPano) { - previousBasic[0] = this._spatial.wrap(previousBasic[0] + this._basicRotation[0], 0, 1); - previousBasic[1] = this._spatial.clamp(previousBasic[1] + this._basicRotation[1], 0.05, 0.95); - } - else if (previousGPano != null && - previousTransform.gpano.CroppedAreaImageWidthPixels === previousTransform.gpano.FullPanoWidthPixels) { - previousBasic[0] = this._spatial.wrap(previousBasic[0] + this._basicRotation[0], 0, 1); - previousBasic[1] = this._spatial.clamp(previousBasic[1] + this._basicRotation[1], 0, 1); - } - else { - previousBasic[0] = this._spatial.clamp(previousBasic[0] + this._basicRotation[0], 0, 1); - previousBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0, 1); - } - var currentLookat = currentTransform.unprojectBasic(currentBasic, this._lookatDepth); - currentCamera.lookat.fromArray(currentLookat); - var previousLookat = previousTransform.unprojectBasic(previousBasic, this._lookatDepth); - previousCamera.lookat.fromArray(previousLookat); - }; - TraversingState.prototype._updateZoom = function (animationSpeed) { - var diff = this._desiredZoom - this._zoom; - var sign = diff > 0 ? 1 : diff < 0 ? -1 : 0; - if (diff === 0) { - return; - } - else if (Math.abs(diff) < 2e-3) { - this._zoom = this._desiredZoom; - if (this._desiredLookat != null) { - this._desiredLookat = null; - } - } - else { - this._zoom += sign * Math.max(Math.abs(5 * animationSpeed * diff), 2e-3); - } - }; - TraversingState.prototype._updateLookat = function (animationSpeed) { - if (this._desiredLookat === null) { - return; - } - var diff = this._desiredLookat.distanceToSquared(this._currentCamera.lookat); - if (Math.abs(diff) < 1e-6) { - this._currentCamera.lookat.copy(this._desiredLookat); - this._desiredLookat = null; - } - else { - this._currentCamera.lookat.lerp(this._desiredLookat, 5 * animationSpeed); - } - }; - TraversingState.prototype._updateRotation = function () { - if (this._requestedRotationDelta != null) { - var length_1 = this._rotationDelta.lengthSquared(); - var requestedLength = this._requestedRotationDelta.lengthSquared(); - if (requestedLength > length_1) { - this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationIncreaseAlpha); - } - else { - this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationDecreaseAlpha); - } - this._requestedRotationDelta = null; - return; - } - if (this._rotationDelta.isZero) { - return; - } - this._rotationDelta.multiply(this._rotationAcceleration); - this._rotationDelta.threshold(this._rotationThreshold); - }; - TraversingState.prototype._updateRotationBasic = function () { - if (this._requestedBasicRotation != null) { - var x = this._basicRotation[0]; - var y = this._basicRotation[1]; - var reqX = this._requestedBasicRotation[0]; - var reqY = this._requestedBasicRotation[1]; - if (Math.abs(reqX) > Math.abs(x)) { - this._basicRotation[0] = (1 - this._rotationIncreaseAlpha) * x + this._rotationIncreaseAlpha * reqX; - } - else { - this._basicRotation[0] = (1 - this._rotationDecreaseAlpha) * x + this._rotationDecreaseAlpha * reqX; - } - if (Math.abs(reqY) > Math.abs(y)) { - this._basicRotation[1] = (1 - this._rotationIncreaseAlpha) * y + this._rotationIncreaseAlpha * reqY; - } - else { - this._basicRotation[1] = (1 - this._rotationDecreaseAlpha) * y + this._rotationDecreaseAlpha * reqY; - } - this._requestedBasicRotation = null; - return; - } - if (this._requestedBasicRotationUnbounded != null) { - var reqX = this._requestedBasicRotationUnbounded[0]; - var reqY = this._requestedBasicRotationUnbounded[1]; - if (Math.abs(reqX) > 0) { - this._basicRotation[0] = (1 - this._unboundedRotationAlpha) * this._basicRotation[0] + this._unboundedRotationAlpha * reqX; - } - if (Math.abs(reqY) > 0) { - this._basicRotation[1] = (1 - this._unboundedRotationAlpha) * this._basicRotation[1] + this._unboundedRotationAlpha * reqY; - } - if (this._desiredLookat != null) { - var desiredBasicLookat = this.currentTransform.projectBasic(this._desiredLookat.toArray()); - desiredBasicLookat[0] += reqX; - desiredBasicLookat[1] += reqY; - this._desiredLookat = new THREE.Vector3() - .fromArray(this.currentTransform.unprojectBasic(desiredBasicLookat, this._lookatDepth)); - } - this._requestedBasicRotationUnbounded = null; - } - if (this._basicRotation[0] === 0 && this._basicRotation[1] === 0) { - return; - } - this._basicRotation[0] = this._rotationAcceleration * this._basicRotation[0]; - this._basicRotation[1] = this._rotationAcceleration * this._basicRotation[1]; - if (Math.abs(this._basicRotation[0]) < this._rotationThreshold / Math.pow(2, this._zoom) && - Math.abs(this._basicRotation[1]) < this._rotationThreshold / Math.pow(2, this._zoom)) { - this._basicRotation = [0, 0]; - } - }; - TraversingState.prototype._clearRotation = function () { - if (this._currentNode.fullPano) { - return; - } - if (this._requestedRotationDelta != null) { - this._requestedRotationDelta = null; - } - if (!this._rotationDelta.isZero) { - this._rotationDelta.reset(); - } - if (this._requestedBasicRotation != null) { - this._requestedBasicRotation = null; - } - if (this._basicRotation[0] > 0 || this._basicRotation[1] > 0) { - this._basicRotation = [0, 0]; - } - }; - TraversingState.prototype._setDesiredCenter = function () { - if (this._desiredCenter == null) { - return; - } - var lookatDirection = new THREE.Vector3() - .fromArray(this.currentTransform.unprojectBasic(this._desiredCenter, this._lookatDepth)) - .sub(this._currentCamera.position); - this._currentCamera.lookat.copy(this._currentCamera.position.clone().add(lookatDirection)); - this._previousCamera.lookat.copy(this._previousCamera.position.clone().add(lookatDirection)); - this._desiredCenter = null; - }; - TraversingState.prototype._setDesiredZoom = function () { - this._desiredZoom = - this._currentNode.fullPano || this._previousNode == null ? - this._zoom : 0; - }; return TraversingState; -}(State_1.StateBase)); +}(State_1.InteractiveStateBase)); exports.TraversingState = TraversingState; +exports.default = TraversingState; -},{"../../State":233,"@mapbox/unitbezier":2,"three":176}],335:[function(require,module,exports){ +},{"../../State":297,"@mapbox/unitbezier":2}],425:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -37614,10 +44054,11 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var State_1 = require("../../State"); -var WaitingState = (function (_super) { +var WaitingState = /** @class */ (function (_super) { __extends(WaitingState, _super); function WaitingState(state) { var _this = _super.call(this, state) || this; + _this._zoom = 0; _this._adjustCameras(); _this._motionless = _this._motionlessTransition(); return _this; @@ -37628,6 +44069,9 @@ var WaitingState = (function (_super) { WaitingState.prototype.wait = function () { throw new Error("Not implemented"); }; + WaitingState.prototype.waitInteractively = function () { + return new State_1.InteractiveWaitingState(this); + }; WaitingState.prototype.prepend = function (nodes) { _super.prototype.prepend.call(this, nodes); this._motionless = this._motionlessTransition(); @@ -37639,7 +44083,9 @@ var WaitingState = (function (_super) { WaitingState.prototype.rotate = function (delta) { return; }; WaitingState.prototype.rotateBasic = function (basicRotation) { return; }; WaitingState.prototype.rotateBasicUnbounded = function (basicRotation) { return; }; + WaitingState.prototype.rotateBasicWithoutInertia = function (basicRotation) { return; }; WaitingState.prototype.rotateToBasic = function (basic) { return; }; + WaitingState.prototype.setSpeed = function (speed) { return; }; WaitingState.prototype.zoomIn = function (delta, reference) { return; }; WaitingState.prototype.move = function (delta) { this._alpha = Math.max(0, Math.min(1, this._alpha + delta)); @@ -37675,8 +44121,9 @@ var WaitingState = (function (_super) { return WaitingState; }(State_1.StateBase)); exports.WaitingState = WaitingState; +exports.default = WaitingState; -},{"../../State":233}],336:[function(require,module,exports){ +},{"../../State":297}],426:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Observable_1 = require("rxjs/Observable"); @@ -37685,7 +44132,7 @@ var Observable_1 = require("rxjs/Observable"); * * @classdesc Represents a loader of image tiles. */ -var ImageTileLoader = (function () { +var ImageTileLoader = /** @class */ (function () { /** * Create a new node image tile loader instance. * @@ -37768,7 +44215,7 @@ var ImageTileLoader = (function () { exports.ImageTileLoader = ImageTileLoader; exports.default = ImageTileLoader; -},{"rxjs/Observable":29}],337:[function(require,module,exports){ +},{"rxjs/Observable":29}],427:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -37776,7 +44223,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); * * @classdesc Represents a store for image tiles. */ -var ImageTileStore = (function () { +var ImageTileStore = /** @class */ (function () { /** * Create a new node image tile store instance. */ @@ -37836,7 +44283,7 @@ var ImageTileStore = (function () { exports.ImageTileStore = ImageTileStore; exports.default = ImageTileStore; -},{}],338:[function(require,module,exports){ +},{}],428:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); @@ -37846,7 +44293,7 @@ var Geo_1 = require("../Geo"); * * @classdesc Represents a calculator for regions of interest. */ -var RegionOfInterestCalculator = (function () { +var RegionOfInterestCalculator = /** @class */ (function () { function RegionOfInterestCalculator() { this._viewportCoords = new Geo_1.ViewportCoords(); } @@ -37977,7 +44424,7 @@ var RegionOfInterestCalculator = (function () { exports.RegionOfInterestCalculator = RegionOfInterestCalculator; exports.default = RegionOfInterestCalculator; -},{"../Geo":229}],339:[function(require,module,exports){ +},{"../Geo":293}],429:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); @@ -37988,7 +44435,7 @@ var Subject_1 = require("rxjs/Subject"); * * @classdesc Represents a provider of textures. */ -var TextureProvider = (function () { +var TextureProvider = /** @class */ (function () { /** * Create a new node texture provider instance. * @@ -38164,7 +44611,7 @@ var TextureProvider = (function () { var width = 1 / this._roi.pixelWidth; var height = 1 / this._roi.pixelHeight; var size = Math.max(height, width); - var currentLevel = Math.max(0, Math.min(this._maxLevel, Math.round(Math.log(size) / Math.log(2) + 0.25))); + var currentLevel = Math.max(0, Math.min(this._maxLevel, Math.ceil(Math.log(size) / Math.log(2)))); if (currentLevel !== this._currentLevel) { this.abort(); this._currentLevel = currentLevel; @@ -38174,7 +44621,7 @@ var TextureProvider = (function () { this._renderedCurrentLevelTiles = {}; for (var _i = 0, _a = this._renderedTiles[this._currentLevel]; _i < _a.length; _i++) { var tile = _a[_i]; - this._renderedCurrentLevelTiles[this._tileKey(tile)] = true; + this._renderedCurrentLevelTiles[this._tileKey(this._tileSize, tile)] = true; } } var topLeft = this._getTileCoords([this._roi.bbox.minX, this._roi.bbox.minY]); @@ -38202,6 +44649,9 @@ var TextureProvider = (function () { } this._fetchTiles(tiles); }; + TextureProvider.prototype.setTileSize = function (tileSize) { + this._tileSize = tileSize; + }; /** * Update the image used as background for the texture. * @@ -38232,7 +44682,7 @@ var TextureProvider = (function () { var tile$ = getTile[0]; var abort = getTile[1]; this._abortFunctions.push(abort); - var tileKey = this._tileKey(tile); + var tileKey = this._tileKey(this._tileSize, tile); var subscription = tile$ .subscribe(function (image) { _this._renderToTarget(x, y, w, h, image); @@ -38264,7 +44714,7 @@ var TextureProvider = (function () { var tileSize = this._tileSize * Math.pow(2, this._maxLevel - this._currentLevel); for (var _i = 0, tiles_1 = tiles; _i < tiles_1.length; _i++) { var tile = tiles_1[_i]; - var tileKey = this._tileKey(tile); + var tileKey = this._tileKey(this._tileSize, tile); if (tileKey in this._renderedCurrentLevelTiles || tileKey in this._tileSubscriptions) { continue; @@ -38436,7 +44886,7 @@ var TextureProvider = (function () { } } this._renderedTiles[level].push(tile); - this._renderedCurrentLevelTiles[this._tileKey(tile)] = true; + this._renderedCurrentLevelTiles[this._tileKey(this._tileSize, tile)] = true; }; /** * Create a tile key from a tile coordinates. @@ -38444,20 +44894,50 @@ var TextureProvider = (function () { * @description Tile keys are used as a hash for * storing the tile in a dictionary. * + * @param {number} tileSize - The tile size. * @param {Arrary} tile - The tile coordinates. */ - TextureProvider.prototype._tileKey = function (tile) { - return tile[0] + "-" + tile[1]; + TextureProvider.prototype._tileKey = function (tileSize, tile) { + return tileSize + "-" + tile[0] + "-" + tile[1]; }; return TextureProvider; }()); exports.TextureProvider = TextureProvider; exports.default = TextureProvider; -},{"rxjs/Subject":34,"three":176}],340:[function(require,module,exports){ +},{"rxjs/Subject":34,"three":240}],430:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var DOM = /** @class */ (function () { + function DOM(doc) { + this._document = !!doc ? doc : document; + } + Object.defineProperty(DOM.prototype, "document", { + get: function () { + return this._document; + }, + enumerable: true, + configurable: true + }); + DOM.prototype.createElement = function (tagName, className, container) { + var element = this._document.createElement(tagName); + if (!!className) { + element.className = className; + } + if (!!container) { + container.appendChild(element); + } + return element; + }; + return DOM; +}()); +exports.DOM = DOM; +exports.default = DOM; + +},{}],431:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var EventEmitter = (function () { +var EventEmitter = /** @class */ (function () { function EventEmitter() { this._events = {}; } @@ -38513,11 +44993,11 @@ var EventEmitter = (function () { exports.EventEmitter = EventEmitter; exports.default = EventEmitter; -},{}],341:[function(require,module,exports){ +},{}],432:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Viewer_1 = require("../Viewer"); -var Settings = (function () { +var Settings = /** @class */ (function () { function Settings() { } Settings.setOptions = function (options) { @@ -38557,48 +45037,162 @@ var Settings = (function () { exports.Settings = Settings; exports.default = Settings; -},{"../Viewer":236}],342:[function(require,module,exports){ +},{"../Viewer":301}],433:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var Urls = (function () { +function isBrowser() { + return typeof window !== "undefined" && typeof document !== "undefined"; +} +exports.isBrowser = isBrowser; +function isArraySupported() { + return !!(Array.prototype && + Array.prototype.filter && + Array.prototype.indexOf && + Array.prototype.map && + Array.prototype.reverse); +} +exports.isArraySupported = isArraySupported; +function isFunctionSupported() { + return !!(Function.prototype && Function.prototype.bind); +} +exports.isFunctionSupported = isFunctionSupported; +function isJSONSupported() { + return "JSON" in window && "parse" in JSON && "stringify" in JSON; +} +exports.isJSONSupported = isJSONSupported; +function isObjectSupported() { + return !!(Object.keys && + Object.assign); +} +exports.isObjectSupported = isObjectSupported; +function isBlobSupported() { + return "Blob" in window && "URL" in window; +} +exports.isBlobSupported = isBlobSupported; +var isWebGLSupportedCache = undefined; +function isWebGLSupportedCached() { + if (isWebGLSupportedCache === undefined) { + isWebGLSupportedCache = isWebGLSupported(); + } + return isWebGLSupportedCache; +} +exports.isWebGLSupportedCached = isWebGLSupportedCached; +function isWebGLSupported() { + var webGLContextAttributes = { + alpha: false, + antialias: false, + depth: true, + failIfMajorPerformanceCaveat: false, + premultipliedAlpha: true, + preserveDrawingBuffer: false, + stencil: true, + }; + var canvas = document.createElement("canvas"); + var context = canvas.getContext("webgl", webGLContextAttributes) || + canvas.getContext("experimental-webgl", webGLContextAttributes); + if (!context) { + return false; + } + var requiredExtensions = [ + "OES_standard_derivatives", + ]; + var supportedExtensions = context.getSupportedExtensions(); + for (var _i = 0, requiredExtensions_1 = requiredExtensions; _i < requiredExtensions_1.length; _i++) { + var requiredExtension = requiredExtensions_1[_i]; + if (supportedExtensions.indexOf(requiredExtension) === -1) { + return false; + } + } + return true; +} +exports.isWebGLSupported = isWebGLSupported; + +},{}],434:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Urls = /** @class */ (function () { function Urls() { } - Object.defineProperty(Urls, "tileScheme", { + Object.defineProperty(Urls, "explore", { get: function () { - return "https"; + return Urls._scheme + "://" + Urls._exploreHost; }, enumerable: true, configurable: true }); - Object.defineProperty(Urls, "tileDomain", { + Object.defineProperty(Urls, "origin", { get: function () { - return "d2qb1440i7l50o.cloudfront.net"; + return Urls._origin; }, enumerable: true, configurable: true }); - Object.defineProperty(Urls, "origin", { + Object.defineProperty(Urls, "tileScheme", { get: function () { - return "mapillary.webgl"; + return Urls._scheme; }, enumerable: true, configurable: true }); - Urls.thumbnail = function (key, size) { - return "https://d1cuyjsrcm0gby.cloudfront.net/" + key + "/thumb-" + size + ".jpg?origin=" + this.origin; + Object.defineProperty(Urls, "tileDomain", { + get: function () { + return Urls._imageTileHost; + }, + enumerable: true, + configurable: true + }); + Urls.exporeImage = function (key) { + return Urls._scheme + "://" + Urls._exploreHost + "/app/?pKey=" + key + "&focus=photo"; + }; + Urls.exporeUser = function (username) { + return Urls._scheme + "://" + Urls._exploreHost + "/app/user/" + username; }; Urls.falcorModel = function (clientId) { - return "https://a.mapillary.com/v3/model.json?client_id=" + clientId; + return Urls._scheme + "://" + Urls._apiHost + "/v3/model.json?client_id=" + clientId; }; Urls.protoMesh = function (key) { - return "https://d1brzeo354iq2l.cloudfront.net/v2/mesh/" + key; + return Urls._scheme + "://" + Urls._meshHost + "/v2/mesh/" + key; + }; + Urls.thumbnail = function (key, size, origin) { + var query = !!origin ? "?origin=" + origin : ""; + return Urls._scheme + "://" + Urls._imageHost + "/" + key + "/thumb-" + size + ".jpg" + query; }; + Urls.setOptions = function (options) { + if (!options) { + return; + } + if (!!options.apiHost) { + Urls._apiHost = options.apiHost; + } + if (!!options.exploreHost) { + Urls._exploreHost = options.exploreHost; + } + if (!!options.imageHost) { + Urls._imageHost = options.imageHost; + } + if (!!options.imageTileHost) { + Urls._imageTileHost = options.imageTileHost; + } + if (!!options.meshHost) { + Urls._meshHost = options.meshHost; + } + if (!!options.scheme) { + Urls._scheme = options.scheme; + } + }; + Urls._apiHost = "a.mapillary.com"; + Urls._exploreHost = "www.mapillary.com"; + Urls._imageHost = "d1cuyjsrcm0gby.cloudfront.net"; + Urls._imageTileHost = "d2qb1440i7l50o.cloudfront.net"; + Urls._meshHost = "d1brzeo354iq2l.cloudfront.net"; + Urls._origin = "mapillary.webgl"; + Urls._scheme = "https"; return Urls; }()); exports.Urls = Urls; exports.default = Urls; -},{}],343:[function(require,module,exports){ +},{}],435:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -38647,15 +45241,12 @@ var Alignment; })(Alignment = exports.Alignment || (exports.Alignment = {})); exports.default = Alignment; -},{}],344:[function(require,module,exports){ +},{}],436:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -require("rxjs/add/operator/bufferCount"); -require("rxjs/add/operator/delay"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/switchMap"); -var CacheService = (function () { +var Observable_1 = require("rxjs/Observable"); +var Graph_1 = require("../Graph"); +var CacheService = /** @class */ (function () { function CacheService(graphService, stateService) { this._graphService = graphService; this._stateService = stateService; @@ -38678,15 +45269,44 @@ var CacheService = (function () { return frame.state.currentNode.key; }) .map(function (frame) { - return frame.state.trajectory + var trajectory = frame.state.trajectory; + var trajectoryKeys = trajectory .map(function (n) { return n.key; }); + var sequenceKey = trajectory[trajectory.length - 1].sequenceKey; + return [trajectoryKeys, sequenceKey]; }) .bufferCount(1, 5) - .switchMap(function (keepKeysBuffer) { - var keepKeys = keepKeysBuffer[0]; - return _this._graphService.uncache$(keepKeys); + .withLatestFrom(this._graphService.graphMode$) + .switchMap(function (_a) { + var keepBuffer = _a[0], graphMode = _a[1]; + var keepKeys = keepBuffer[0][0]; + var keepSequenceKey = graphMode === Graph_1.GraphMode.Sequence ? + keepBuffer[0][1] : undefined; + return _this._graphService.uncache$(keepKeys, keepSequenceKey); + }) + .subscribe(function () { }); + this._cacheNodeSubscription = this._graphService.graphMode$ + .skip(1) + .withLatestFrom(this._stateService.currentState$) + .switchMap(function (_a) { + var mode = _a[0], frame = _a[1]; + return mode === Graph_1.GraphMode.Sequence ? + _this._keyToEdges(frame.state.currentNode.key, function (node) { + return node.sequenceEdges$; + }) : + Observable_1.Observable + .from(frame.state.trajectory + .map(function (node) { + return node.key; + }) + .slice(frame.state.currentIndex)) + .mergeMap(function (key) { + return _this._keyToEdges(key, function (node) { + return node.spatialEdges$; + }); + }, 6); }) .subscribe(function () { }); this._started = true; @@ -38697,26 +45317,43 @@ var CacheService = (function () { } this._uncacheSubscription.unsubscribe(); this._uncacheSubscription = null; + this._cacheNodeSubscription.unsubscribe(); + this._cacheNodeSubscription = null; this._started = false; }; + CacheService.prototype._keyToEdges = function (key, nodeToEdgeMap) { + return this._graphService.cacheNode$(key) + .switchMap(nodeToEdgeMap) + .first(function (status) { + return status.cached; + }) + .timeout(15000) + .catch(function (error) { + console.error("Failed to cache edges (" + key + ").", error); + return Observable_1.Observable.empty(); + }); + }; return CacheService; }()); exports.CacheService = CacheService; exports.default = CacheService; -},{"rxjs/add/operator/bufferCount":50,"rxjs/add/operator/delay":56,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/switchMap":79}],345:[function(require,module,exports){ +},{"../Graph":294,"rxjs/Observable":29}],437:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Component_1 = require("../Component"); -var ComponentController = (function () { - function ComponentController(container, navigator, observer, key, options) { +var ComponentController = /** @class */ (function () { + function ComponentController(container, navigator, observer, key, options, componentService) { var _this = this; this._container = container; this._observer = observer; this._navigator = navigator; this._options = options != null ? options : {}; this._key = key; - this._componentService = new Component_1.ComponentService(this._container, this._navigator); + this._navigable = key == null; + this._componentService = !!componentService ? + componentService : + new Component_1.ComponentService(this._container, this._navigator); this._coverComponent = this._componentService.getCover(); this._initializeComponents(); if (key) { @@ -38731,13 +45368,21 @@ var ComponentController = (function () { .subscribe(function (k) { _this._key = k; _this._componentService.deactivateCover(); - _this._coverComponent.configure({ key: _this._key, loading: false, visible: false }); + _this._coverComponent.configure({ key: _this._key, state: Component_1.CoverState.Hidden }); _this._subscribeCoverComponent(); _this._navigator.stateService.start(); + _this._navigator.cacheService.start(); _this._observer.startEmit(); }); } } + Object.defineProperty(ComponentController.prototype, "navigable", { + get: function () { + return this._navigable; + }, + enumerable: true, + configurable: true + }); ComponentController.prototype.get = function (name) { return this._componentService.get(name); }; @@ -38745,13 +45390,13 @@ var ComponentController = (function () { this._componentService.activate(name); }; ComponentController.prototype.activateCover = function () { - this._coverComponent.configure({ loading: false, visible: true }); + this._coverComponent.configure({ state: Component_1.CoverState.Visible }); }; ComponentController.prototype.deactivate = function (name) { this._componentService.deactivate(name); }; ComponentController.prototype.deactivateCover = function () { - this._coverComponent.configure({ loading: true, visible: true }); + this._coverComponent.configure({ state: Component_1.CoverState.Loading }); }; ComponentController.prototype.resize = function () { this._componentService.resize(); @@ -38777,6 +45422,7 @@ var ComponentController = (function () { this._uTrue(options.mouse, "mouse"); this._uTrue(options.sequence, "sequence"); this._uTrue(options.stats, "stats"); + this._uTrue(options.zoom, "zoom"); }; ComponentController.prototype._initilizeCoverComponent = function () { var options = this._options; @@ -38788,32 +45434,48 @@ var ComponentController = (function () { this.deactivateCover(); } }; + ComponentController.prototype._setNavigable = function (navigable) { + if (this._navigable === navigable) { + return; + } + this._navigable = navigable; + this._observer.navigable$.next(navigable); + }; ComponentController.prototype._subscribeCoverComponent = function () { var _this = this; this._coverComponent.configuration$.subscribe(function (conf) { - if (conf.loading) { + if (conf.state === Component_1.CoverState.Loading) { _this._navigator.stateService.currentKey$ .first() .switchMap(function (key) { - return key == null || key !== conf.key ? + var keyChanged = key == null || key !== conf.key; + if (keyChanged) { + _this._setNavigable(false); + } + return keyChanged ? _this._navigator.moveToKey$(conf.key) : _this._navigator.stateService.currentNode$ .first(); }) .subscribe(function (node) { _this._navigator.stateService.start(); + _this._navigator.cacheService.start(); _this._observer.startEmit(); - _this._coverComponent.configure({ loading: false, visible: false }); + _this._coverComponent.configure({ state: Component_1.CoverState.Hidden }); _this._componentService.deactivateCover(); + _this._setNavigable(true); }, function (error) { console.error("Failed to deactivate cover.", error); - _this._coverComponent.configure({ loading: false, visible: true }); + _this._coverComponent.configure({ state: Component_1.CoverState.Visible }); }); } - else if (conf.visible) { + else if (conf.state === Component_1.CoverState.Visible) { _this._observer.stopEmit(); _this._navigator.stateService.stop(); + _this._navigator.cacheService.stop(); + _this._navigator.playService.stop(); _this._componentService.activateCover(); + _this._setNavigable(conf.key == null); } }); }; @@ -38855,29 +45517,28 @@ var ComponentController = (function () { }()); exports.ComponentController = ComponentController; -},{"../Component":226}],346:[function(require,module,exports){ +},{"../Component":290}],438:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Render_1 = require("../Render"); +var Utils_1 = require("../Utils"); var Viewer_1 = require("../Viewer"); -var Container = (function () { - function Container(id, stateService, options) { +var Container = /** @class */ (function () { + function Container(id, stateService, options, dom) { this.id = id; - this._container = document.getElementById(id); + this._dom = !!dom ? dom : new Utils_1.DOM(); + this._container = this._dom.document.getElementById(id); if (!this._container) { throw new Error("Container '" + id + "' not found."); } this._container.classList.add("mapillary-js"); - this._canvasContainer = document.createElement("div"); - this._canvasContainer.className = "mapillary-js-interactive"; - this._domContainer = document.createElement("div"); - this._domContainer.className = "mapillary-js-dom"; - this._container.appendChild(this._canvasContainer); - this._container.appendChild(this._domContainer); + this._canvasContainer = this._dom.createElement("div", "mapillary-js-interactive", this._container); + this._domContainer = this._dom.createElement("div", "mapillary-js-dom", this._container); this.renderService = new Render_1.RenderService(this._container, stateService.currentState$, options.renderMode); - this.glRenderer = new Render_1.GLRenderer(this._canvasContainer, this.renderService); + this.glRenderer = new Render_1.GLRenderer(this._canvasContainer, this.renderService, this._dom); this.domRenderer = new Render_1.DOMRenderer(this._domContainer, this.renderService, stateService.currentState$); - this.mouseService = new Viewer_1.MouseService(this._canvasContainer, this._domContainer); + this.keyboardService = new Viewer_1.KeyboardService(this._canvasContainer); + this.mouseService = new Viewer_1.MouseService(this._container, this._canvasContainer, this._domContainer, document); this.touchService = new Viewer_1.TouchService(this._canvasContainer, this._domContainer); this.spriteService = new Viewer_1.SpriteService(options.sprite); } @@ -38890,7 +45551,14 @@ var Container = (function () { }); Object.defineProperty(Container.prototype, "canvasContainer", { get: function () { - return this.canvasContainer; + return this._canvasContainer; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Container.prototype, "domContainer", { + get: function () { + return this._domContainer; }, enumerable: true, configurable: true @@ -38900,7 +45568,7 @@ var Container = (function () { exports.Container = Container; exports.default = Container; -},{"../Render":232,"../Viewer":236}],347:[function(require,module,exports){ +},{"../Render":296,"../Utils":300,"../Viewer":301}],439:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @@ -38929,19 +45597,33 @@ var ImageSize; ImageSize[ImageSize["Size2048"] = 2048] = "Size2048"; })(ImageSize = exports.ImageSize || (exports.ImageSize = {})); -},{}],348:[function(require,module,exports){ +},{}],440:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("rxjs/Observable"); +var KeyboardService = /** @class */ (function () { + function KeyboardService(canvasContainer) { + this._keyDown$ = Observable_1.Observable.fromEvent(canvasContainer, "keydown"); + } + Object.defineProperty(KeyboardService.prototype, "keyDown$", { + get: function () { + return this._keyDown$; + }, + enumerable: true, + configurable: true + }); + return KeyboardService; +}()); +exports.KeyboardService = KeyboardService; +exports.default = KeyboardService; + +},{"rxjs/Observable":29}],441:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var _ = require("underscore"); var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/operator/debounceTime"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/publishReplay"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/startWith"); -var LoadingService = (function () { +var LoadingService = /** @class */ (function () { function LoadingService() { this._loadersSubject$ = new Subject_1.Subject(); this._loaders$ = this._loadersSubject$ @@ -38988,37 +45670,54 @@ var LoadingService = (function () { exports.LoadingService = LoadingService; exports.default = LoadingService; -},{"rxjs/Subject":34,"rxjs/add/operator/debounceTime":55,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/startWith":78,"underscore":178}],349:[function(require,module,exports){ +},{"rxjs/Subject":34,"underscore":242}],442:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BehaviorSubject_1 = require("rxjs/BehaviorSubject"); var Observable_1 = require("rxjs/Observable"); var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/observable/fromEvent"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/merge"); -require("rxjs/add/operator/mergeMap"); -require("rxjs/add/operator/publishReplay"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/switchMap"); -require("rxjs/add/operator/withLatestFrom"); var Geo_1 = require("../Geo"); -var MouseService = (function () { - function MouseService(canvasContainer, domContainer, viewportCoords) { +var MouseService = /** @class */ (function () { + function MouseService(container, canvasContainer, domContainer, doc, viewportCoords) { var _this = this; - this._canvasContainer = canvasContainer; - this._domContainer = domContainer; - this._viewportCoords = viewportCoords != null ? viewportCoords : new Geo_1.ViewportCoords(); + viewportCoords = viewportCoords != null ? viewportCoords : new Geo_1.ViewportCoords(); this._activeSubject$ = new BehaviorSubject_1.BehaviorSubject(false); this._active$ = this._activeSubject$ .distinctUntilChanged() .publishReplay(1) .refCount(); this._claimMouse$ = new Subject_1.Subject(); - this._documentMouseMove$ = Observable_1.Observable.fromEvent(document, "mousemove"); - this._documentMouseUp$ = Observable_1.Observable.fromEvent(document, "mouseup"); + this._claimWheel$ = new Subject_1.Subject(); + this._deferPixelClaims$ = new Subject_1.Subject(); + this._deferPixels$ = this._deferPixelClaims$ + .scan(function (claims, claim) { + if (claim.deferPixels == null) { + delete claims[claim.name]; + } + else { + claims[claim.name] = claim.deferPixels; + } + return claims; + }, {}) + .map(function (claims) { + var deferPixelMax = -1; + for (var key in claims) { + if (!claims.hasOwnProperty(key)) { + continue; + } + var deferPixels = claims[key]; + if (deferPixels > deferPixelMax) { + deferPixelMax = deferPixels; + } + } + return deferPixelMax; + }) + .startWith(-1) + .publishReplay(1) + .refCount(); + this._deferPixels$.subscribe(function () { }); + this._documentMouseMove$ = Observable_1.Observable.fromEvent(doc, "mousemove"); + this._documentMouseUp$ = Observable_1.Observable.fromEvent(doc, "mouseup"); this._mouseDown$ = Observable_1.Observable.fromEvent(canvasContainer, "mousedown"); this._mouseLeave$ = Observable_1.Observable.fromEvent(canvasContainer, "mouseleave"); this._mouseMove$ = Observable_1.Observable.fromEvent(canvasContainer, "mousemove"); @@ -39027,24 +45726,33 @@ var MouseService = (function () { this._mouseOver$ = Observable_1.Observable.fromEvent(canvasContainer, "mouseover"); this._domMouseDown$ = Observable_1.Observable.fromEvent(domContainer, "mousedown"); this._domMouseMove$ = Observable_1.Observable.fromEvent(domContainer, "mousemove"); - Observable_1.Observable - .merge(this._domMouseDown$, this._domMouseMove$) - .subscribe(function (event) { - event.preventDefault(); - }); this._click$ = Observable_1.Observable.fromEvent(canvasContainer, "click"); - this._dblClick$ = Observable_1.Observable.fromEvent(canvasContainer, "dblclick"); - this._dblClick$ - .subscribe(function (event) { - event.preventDefault(); - }); this._contextMenu$ = Observable_1.Observable.fromEvent(canvasContainer, "contextmenu"); - this._contextMenu$ + this._dblClick$ = Observable_1.Observable + .merge(Observable_1.Observable.fromEvent(container, "click"), Observable_1.Observable.fromEvent(canvasContainer, "dblclick")) + .bufferCount(3, 1) + .filter(function (events) { + var event1 = events[0]; + var event2 = events[1]; + var event3 = events[2]; + return event1.type === "click" && + event2.type === "click" && + event3.type === "dblclick" && + event1.target.parentNode === canvasContainer && + event2.target.parentNode === canvasContainer; + }) + .map(function (events) { + return events[2]; + }) + .share(); + Observable_1.Observable + .merge(this._domMouseDown$, this._domMouseMove$, this._dblClick$, this._contextMenu$) .subscribe(function (event) { event.preventDefault(); }); this._mouseWheel$ = Observable_1.Observable - .merge(Observable_1.Observable.fromEvent(canvasContainer, "wheel"), Observable_1.Observable.fromEvent(domContainer, "wheel")); + .merge(Observable_1.Observable.fromEvent(canvasContainer, "wheel"), Observable_1.Observable.fromEvent(domContainer, "wheel")) + .share(); this._consistentContextMenu$ = Observable_1.Observable .merge(this._mouseDown$, this._mouseMove$, this._mouseOut$, this._mouseUp$, this._contextMenu$) .bufferCount(3, 1) @@ -39064,80 +45772,43 @@ var MouseService = (function () { return e.button === 0; })) .share(); - var leftButtonDown$ = this._mouseDown$ - .filter(function (e) { - return e.button === 0; - }) - .share(); - this._mouseDragStart$ = leftButtonDown$ - .mergeMap(function (e) { - return _this._documentMouseMove$ - .takeUntil(dragStop$) + var mouseDragInitiate$ = this._createMouseDragInitiate$(this._mouseDown$, dragStop$, true).share(); + this._mouseDragStart$ = this._createMouseDragStart$(mouseDragInitiate$).share(); + this._mouseDrag$ = this._createMouseDrag$(mouseDragInitiate$, dragStop$).share(); + this._mouseDragEnd$ = this._createMouseDragEnd$(this._mouseDragStart$, dragStop$).share(); + var domMouseDragInitiate$ = this._createMouseDragInitiate$(this._domMouseDown$, dragStop$, false).share(); + this._domMouseDragStart$ = this._createMouseDragStart$(domMouseDragInitiate$).share(); + this._domMouseDrag$ = this._createMouseDrag$(domMouseDragInitiate$, dragStop$).share(); + this._domMouseDragEnd$ = this._createMouseDragEnd$(this._domMouseDragStart$, dragStop$).share(); + this._proximateClick$ = this._mouseDown$ + .switchMap(function (mouseDown) { + return _this._click$ + .takeUntil(_this._createDeferredMouseMove$(mouseDown, _this._documentMouseMove$)) .take(1); - }); - this._mouseDrag$ = leftButtonDown$ - .mergeMap(function (e) { - return _this._documentMouseMove$ - .skip(1) - .takeUntil(dragStop$); - }); - this._mouseDragEnd$ = this._mouseDragStart$ - .mergeMap(function (e) { - return dragStop$.first(); - }); - var containerLeftButtonDown$ = this._domMouseDown$ - .filter(function (e) { - return e.button === 0; }) .share(); - this._domMouseDragStart$ = containerLeftButtonDown$ - .mergeMap(function (e) { - return _this._documentMouseMove$ - .takeUntil(dragStop$) - .take(1); - }); - this._domMouseDrag$ = containerLeftButtonDown$ - .mergeMap(function (e) { - return _this._documentMouseMove$ - .skip(1) - .takeUntil(dragStop$); - }); - this._domMouseDragEnd$ = this._domMouseDragStart$ - .mergeMap(function (e) { - return dragStop$.first(); - }); this._staticClick$ = this._mouseDown$ .switchMap(function (e) { return _this._click$ - .takeUntil(_this._mouseMove$) + .takeUntil(_this._documentMouseMove$) .take(1); - }); - this._mouseOwner$ = this._claimMouse$ - .scan(function (claims, mouseClaim) { - if (mouseClaim.zindex == null) { - delete claims[mouseClaim.name]; - } - else { - claims[mouseClaim.name] = mouseClaim.zindex; - } - return claims; - }, {}) - .map(function (claims) { - var owner = null; - var curZ = -1; - for (var name_1 in claims) { - if (claims.hasOwnProperty(name_1)) { - if (claims[name_1] > curZ) { - curZ = claims[name_1]; - owner = name_1; - } - } - } - return owner; }) + .share(); + this._mouseDragStart$.subscribe(); + this._mouseDrag$.subscribe(); + this._mouseDragEnd$.subscribe(); + this._domMouseDragStart$.subscribe(); + this._domMouseDrag$.subscribe(); + this._domMouseDragEnd$.subscribe(); + this._staticClick$.subscribe(); + this._mouseOwner$ = this._createOwner$(this._claimMouse$) + .publishReplay(1) + .refCount(); + this._wheelOwner$ = this._createOwner$(this._claimWheel$) .publishReplay(1) .refCount(); this._mouseOwner$.subscribe(function () { }); + this._wheelOwner$.subscribe(function () { }); } Object.defineProperty(MouseService.prototype, "active$", { get: function () { @@ -39300,6 +45971,13 @@ var MouseService = (function () { enumerable: true, configurable: true }); + Object.defineProperty(MouseService.prototype, "proximateClick$", { + get: function () { + return this._proximateClick$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(MouseService.prototype, "staticClick$", { get: function () { return this._staticClick$; @@ -39313,16 +45991,120 @@ var MouseService = (function () { MouseService.prototype.unclaimMouse = function (name) { this._claimMouse$.next({ name: name, zindex: null }); }; + MouseService.prototype.deferPixels = function (name, deferPixels) { + this._deferPixelClaims$.next({ name: name, deferPixels: deferPixels }); + }; + MouseService.prototype.undeferPixels = function (name) { + this._deferPixelClaims$.next({ name: name, deferPixels: null }); + }; + MouseService.prototype.claimWheel = function (name, zindex) { + this._claimWheel$.next({ name: name, zindex: zindex }); + }; + MouseService.prototype.unclaimWheel = function (name) { + this._claimWheel$.next({ name: name, zindex: null }); + }; MouseService.prototype.filtered$ = function (name, observable$) { - return observable$ - .withLatestFrom(this.mouseOwner$, function (event, owner) { - return [event, owner]; + return this._filtered(name, observable$, this._mouseOwner$); + }; + MouseService.prototype.filteredWheel$ = function (name, observable$) { + return this._filtered(name, observable$, this._wheelOwner$); + }; + MouseService.prototype._createDeferredMouseMove$ = function (origin, mouseMove$) { + return mouseMove$ + .map(function (mouseMove) { + var deltaX = mouseMove.clientX - origin.clientX; + var deltaY = mouseMove.clientY - origin.clientY; + return [mouseMove, Math.sqrt(deltaX * deltaX + deltaY * deltaY)]; }) - .filter(function (eo) { - return eo[1] === name; + .withLatestFrom(this._deferPixels$) + .filter(function (_a) { + var _b = _a[0], mouseMove = _b[0], delta = _b[1], deferPixels = _a[1]; + return delta > deferPixels; + }) + .map(function (_a) { + var _b = _a[0], mouseMove = _b[0], delta = _b[1], deferPixels = _a[1]; + return mouseMove; + }); + }; + MouseService.prototype._createMouseDrag$ = function (mouseDragStartInitiate$, stop$) { + var _this = this; + return mouseDragStartInitiate$ + .map(function (_a) { + var mouseDown = _a[0], mouseMove = _a[1]; + return mouseMove; + }) + .switchMap(function (mouseMove) { + return Observable_1.Observable + .of(mouseMove) + .concat(_this._documentMouseMove$) + .takeUntil(stop$); + }); + }; + MouseService.prototype._createMouseDragEnd$ = function (mouseDragStart$, stop$) { + return mouseDragStart$ + .switchMap(function (event) { + return stop$.first(); + }); + }; + MouseService.prototype._createMouseDragStart$ = function (mouseDragStartInitiate$) { + return mouseDragStartInitiate$ + .map(function (_a) { + var mouseDown = _a[0], mouseMove = _a[1]; + return mouseDown; + }); + }; + MouseService.prototype._createMouseDragInitiate$ = function (mouseDown$, stop$, defer) { + var _this = this; + return mouseDown$ + .filter(function (mouseDown) { + return mouseDown.button === 0; }) - .map(function (eo) { - return eo[0]; + .switchMap(function (mouseDown) { + return Observable_1.Observable + .combineLatest(Observable_1.Observable.of(mouseDown), defer ? + _this._createDeferredMouseMove$(mouseDown, _this._documentMouseMove$) : + _this._documentMouseMove$) + .takeUntil(stop$) + .take(1); + }); + }; + MouseService.prototype._createOwner$ = function (claim$) { + return claim$ + .scan(function (claims, claim) { + if (claim.zindex == null) { + delete claims[claim.name]; + } + else { + claims[claim.name] = claim.zindex; + } + return claims; + }, {}) + .map(function (claims) { + var owner = null; + var zIndexMax = -1; + for (var name_1 in claims) { + if (!claims.hasOwnProperty(name_1)) { + continue; + } + if (claims[name_1] > zIndexMax) { + zIndexMax = claims[name_1]; + owner = name_1; + } + } + return owner; + }) + .startWith(null); + }; + MouseService.prototype._filtered = function (name, observable$, owner$) { + return observable$ + .withLatestFrom(owner$) + .filter(function (_a) { + var item = _a[0], owner = _a[1]; + return owner === name; + }) + .map(function (_a) { + var item = _a[0], owner = _a[1]; + return item; }); }; return MouseService; @@ -39330,25 +46112,21 @@ var MouseService = (function () { exports.MouseService = MouseService; exports.default = MouseService; -},{"../Geo":229,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/fromEvent":42,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/mergeMap":68,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/switchMap":79,"rxjs/add/operator/withLatestFrom":83}],350:[function(require,module,exports){ +},{"../Geo":293,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/Subject":34}],443:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var BehaviorSubject_1 = require("rxjs/BehaviorSubject"); var Observable_1 = require("rxjs/Observable"); -require("rxjs/add/observable/throw"); -require("rxjs/add/operator/do"); -require("rxjs/add/operator/finally"); -require("rxjs/add/operator/first"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/mergeMap"); +var ReplaySubject_1 = require("rxjs/ReplaySubject"); var API_1 = require("../API"); var Graph_1 = require("../Graph"); var Edge_1 = require("../Edge"); +var Error_1 = require("../Error"); var State_1 = require("../State"); var Viewer_1 = require("../Viewer"); -var Navigator = (function () { - function Navigator(clientId, token, apiV3, graphService, imageLoadingService, loadingService, stateService, cacheService) { +var Navigator = /** @class */ (function () { + function Navigator(clientId, options, token, apiV3, graphService, imageLoadingService, loadingService, stateService, cacheService, playService) { this._apiV3 = apiV3 != null ? apiV3 : new API_1.APIv3(clientId, token); this._imageLoadingService = imageLoadingService != null ? imageLoadingService : new Graph_1.ImageLoadingService(); this._graphService = graphService != null ? @@ -39356,15 +46134,18 @@ var Navigator = (function () { new Graph_1.GraphService(new Graph_1.Graph(this.apiV3), this._imageLoadingService); this._loadingService = loadingService != null ? loadingService : new Viewer_1.LoadingService(); this._loadingName = "navigator"; - this._stateService = stateService != null ? stateService : new State_1.StateService(); + this._stateService = stateService != null ? stateService : new State_1.StateService(options.transitionMode); this._cacheService = cacheService != null ? cacheService : new Viewer_1.CacheService(this._graphService, this._stateService); - this._cacheService.start(); + this._playService = playService != null ? + playService : + new Viewer_1.PlayService(this._graphService, this._stateService); this._keyRequested$ = new BehaviorSubject_1.BehaviorSubject(null); this._movedToKey$ = new BehaviorSubject_1.BehaviorSubject(null); - this._dirRequested$ = new BehaviorSubject_1.BehaviorSubject(null); - this._latLonRequested$ = new BehaviorSubject_1.BehaviorSubject(null); + this._request$ = null; + this._requestSubscription = null; + this._nodeRequestSubscription = null; } Object.defineProperty(Navigator.prototype, "apiV3", { get: function () { @@ -39373,23 +46154,23 @@ var Navigator = (function () { enumerable: true, configurable: true }); - Object.defineProperty(Navigator.prototype, "graphService", { + Object.defineProperty(Navigator.prototype, "cacheService", { get: function () { - return this._graphService; + return this._cacheService; }, enumerable: true, configurable: true }); - Object.defineProperty(Navigator.prototype, "imageLoadingService", { + Object.defineProperty(Navigator.prototype, "graphService", { get: function () { - return this._imageLoadingService; + return this._graphService; }, enumerable: true, configurable: true }); - Object.defineProperty(Navigator.prototype, "keyRequested$", { + Object.defineProperty(Navigator.prototype, "imageLoadingService", { get: function () { - return this._keyRequested$; + return this._imageLoadingService; }, enumerable: true, configurable: true @@ -39408,6 +46189,13 @@ var Navigator = (function () { enumerable: true, configurable: true }); + Object.defineProperty(Navigator.prototype, "playService", { + get: function () { + return this._playService; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(Navigator.prototype, "stateService", { get: function () { return this._stateService; @@ -39416,23 +46204,16 @@ var Navigator = (function () { configurable: true }); Navigator.prototype.moveToKey$ = function (key) { - var _this = this; - this.loadingService.startLoading(this._loadingName); - this._keyRequested$.next(key); - return this._graphService.cacheNode$(key) - .do(function (node) { - _this.stateService.setNodes([node]); - _this._movedToKey$.next(node.key); - }) - .finally(function () { - _this.loadingService.stopLoading(_this._loadingName); - }); + this._abortRequest("to key " + key); + this._loadingService.startLoading(this._loadingName); + var node$ = this._moveToKey$(key); + return this._makeRequest$(node$); }; Navigator.prototype.moveDir$ = function (direction) { var _this = this; - this.loadingService.startLoading(this._loadingName); - this._dirRequested$.next(direction); - return this.stateService.currentNode$ + this._abortRequest("in dir " + Edge_1.EdgeDirection[direction]); + this._loadingService.startLoading(this._loadingName); + var node$ = this.stateService.currentNode$ .first() .mergeMap(function (node) { return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ? @@ -39451,26 +46232,28 @@ var Navigator = (function () { }) .mergeMap(function (directionKey) { if (directionKey == null) { - _this.loadingService.stopLoading(_this._loadingName); + _this._loadingService.stopLoading(_this._loadingName); return Observable_1.Observable .throw(new Error("Direction (" + direction + ") does not exist for current node.")); } - return _this.moveToKey$(directionKey); + return _this._moveToKey$(directionKey); }); + return this._makeRequest$(node$); }; Navigator.prototype.moveCloseTo$ = function (lat, lon) { var _this = this; - this.loadingService.startLoading(this._loadingName); - this._latLonRequested$.next({ lat: lat, lon: lon }); - return this.apiV3.imageCloseTo$(lat, lon) + this._abortRequest("to lat " + lat + ", lon " + lon); + this._loadingService.startLoading(this._loadingName); + var node$ = this.apiV3.imageCloseTo$(lat, lon) .mergeMap(function (fullNode) { if (fullNode == null) { - _this.loadingService.stopLoading(_this._loadingName); + _this._loadingService.stopLoading(_this._loadingName); return Observable_1.Observable .throw(new Error("No image found close to lat " + lat + ", lon " + lon + ".")); } - return _this.moveToKey$(fullNode.key); + return _this._moveToKey$(fullNode.key); }); + return this._makeRequest$(node$); }; Navigator.prototype.setFilter$ = function (filter) { var _this = this; @@ -39482,22 +46265,23 @@ var Navigator = (function () { return _this._trajectoryKeys$() .mergeMap(function (keys) { return _this._graphService.setFilter$(filter) - .mergeMap(function (graph) { + .mergeMap(function () { return _this._cacheKeys$(keys); }); }) .last(); } return _this._keyRequested$ + .first() .mergeMap(function (requestedKey) { if (requestedKey != null) { return _this._graphService.setFilter$(filter) - .mergeMap(function (graph) { + .mergeMap(function () { return _this._graphService.cacheNode$(requestedKey); }); } return _this._graphService.setFilter$(filter) - .map(function (graph) { + .map(function () { return undefined; }); }); @@ -39508,6 +46292,7 @@ var Navigator = (function () { }; Navigator.prototype.setToken$ = function (token) { var _this = this; + this._abortRequest("to set token"); this._stateService.clearNodes(); return this._movedToKey$ .first() @@ -39516,14 +46301,11 @@ var Navigator = (function () { }) .mergeMap(function (key) { return key == null ? - _this._graphService.reset$([]) - .map(function (graph) { - return undefined; - }) : + _this._graphService.reset$([]) : _this._trajectoryKeys$() .mergeMap(function (keys) { return _this._graphService.reset$(keys) - .mergeMap(function (graph) { + .mergeMap(function () { return _this._cacheKeys$(keys); }); }) @@ -39543,6 +46325,51 @@ var Navigator = (function () { .from(cacheNodes$) .mergeAll(); }; + Navigator.prototype._abortRequest = function (reason) { + if (this._requestSubscription != null) { + this._requestSubscription.unsubscribe(); + this._requestSubscription = null; + } + if (this._nodeRequestSubscription != null) { + this._nodeRequestSubscription.unsubscribe(); + this._nodeRequestSubscription = null; + } + if (this._request$ != null) { + if (!(this._request$.isStopped || this._request$.hasError)) { + this._request$.error(new Error_1.AbortMapillaryError("Request aborted by a subsequent request " + reason + ".")); + } + this._request$ = null; + } + }; + Navigator.prototype._makeRequest$ = function (node$) { + var _this = this; + var request$ = new ReplaySubject_1.ReplaySubject(1); + this._requestSubscription = request$ + .subscribe(undefined, function (e) { }); + this._request$ = request$; + this._nodeRequestSubscription = node$ + .subscribe(function (node) { + request$.next(node); + request$.complete(); + _this._request$ = null; + }, function (error) { + request$.error(error); + _this._request$ = null; + }); + return request$; + }; + Navigator.prototype._moveToKey$ = function (key) { + var _this = this; + this._keyRequested$.next(key); + return this._graphService.cacheNode$(key) + .do(function (node) { + _this._stateService.setNodes([node]); + _this._movedToKey$.next(node.key); + }) + .finally(function () { + _this._loadingService.stopLoading(_this._loadingName); + }); + }; Navigator.prototype._trajectoryKeys$ = function () { return this._stateService.currentState$ .first() @@ -39558,16 +46385,13 @@ var Navigator = (function () { exports.Navigator = Navigator; exports.default = Navigator; -},{"../API":225,"../Edge":227,"../Graph":230,"../State":233,"../Viewer":236,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/add/observable/throw":46,"rxjs/add/operator/do":59,"rxjs/add/operator/finally":62,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"rxjs/add/operator/mergeMap":68}],351:[function(require,module,exports){ +},{"../API":289,"../Edge":291,"../Error":292,"../Graph":294,"../State":297,"../Viewer":301,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/ReplaySubject":32}],444:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Observable_1 = require("rxjs/Observable"); -require("rxjs/add/observable/combineLatest"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/throttleTime"); +var Subject_1 = require("rxjs/Subject"); var Viewer_1 = require("../Viewer"); -var Observer = (function () { +var Observer = /** @class */ (function () { function Observer(eventEmitter, navigator, container) { var _this = this; this._container = container; @@ -39575,7 +46399,12 @@ var Observer = (function () { this._navigator = navigator; this._projection = new Viewer_1.Projection(); this._started = false; - // loading should always emit, also when cover is activated + this._navigable$ = new Subject_1.Subject(); + // navigable and loading should always emit, also when cover is activated. + this._navigable$ + .subscribe(function (navigable) { + _this._eventEmitter.fire(Viewer_1.Viewer.navigablechanged, navigable); + }); this._navigator.loadingService.loading$ .subscribe(function (loading) { _this._eventEmitter.fire(Viewer_1.Viewer.loadingchanged, loading); @@ -39588,6 +46417,13 @@ var Observer = (function () { enumerable: true, configurable: true }); + Object.defineProperty(Observer.prototype, "navigable$", { + get: function () { + return this._navigable$; + }, + enumerable: true, + configurable: true + }); Observer.prototype.projectBasic$ = function (basicPoint) { var _this = this; return Observable_1.Observable @@ -39638,7 +46474,7 @@ var Observer = (function () { } }); this._bearingSubscription = this._container.renderService.bearing$ - .throttleTime(100) + .auditTime(100) .distinctUntilChanged(function (b1, b2) { return Math.abs(b2 - b1) < 1; }) @@ -39719,13 +46555,388 @@ var Observer = (function () { exports.Observer = Observer; exports.default = Observer; -},{"../Viewer":236,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/throttleTime":82}],352:[function(require,module,exports){ +},{"../Viewer":301,"rxjs/Observable":29,"rxjs/Subject":34}],445:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("rxjs/Observable"); +var Subject_1 = require("rxjs/Subject"); +var Edge_1 = require("../Edge"); +var Graph_1 = require("../Graph"); +var PlayService = /** @class */ (function () { + function PlayService(graphService, stateService, graphCalculator) { + this._graphService = graphService; + this._stateService = stateService; + this._graphCalculator = !!graphCalculator ? graphCalculator : new Graph_1.GraphCalculator(); + this._directionSubject$ = new Subject_1.Subject(); + this._direction$ = this._directionSubject$ + .startWith(Edge_1.EdgeDirection.Next) + .publishReplay(1) + .refCount(); + this._direction$.subscribe(); + this._playing = false; + this._playingSubject$ = new Subject_1.Subject(); + this._playing$ = this._playingSubject$ + .startWith(this._playing) + .publishReplay(1) + .refCount(); + this._playing$.subscribe(); + this._speed = 0.5; + this._speedSubject$ = new Subject_1.Subject(); + this._speed$ = this._speedSubject$ + .startWith(this._speed) + .publishReplay(1) + .refCount(); + this._speed$.subscribe(); + this._nodesAhead = this._mapNodesAhead(this._mapSpeed(this._speed)); + this._bridging$ = null; + } + Object.defineProperty(PlayService.prototype, "playing", { + get: function () { + return this._playing; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(PlayService.prototype, "direction$", { + get: function () { + return this._direction$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(PlayService.prototype, "playing$", { + get: function () { + return this._playing$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(PlayService.prototype, "speed$", { + get: function () { + return this._speed$; + }, + enumerable: true, + configurable: true + }); + PlayService.prototype.play = function () { + var _this = this; + if (this._playing) { + return; + } + this._stateService.cutNodes(); + var stateSpeed = this._setSpeed(this._speed); + this._stateService.setSpeed(stateSpeed); + this._graphModeSubscription = this._speed$ + .map(function (speed) { + return speed > 0.54 ? Graph_1.GraphMode.Sequence : Graph_1.GraphMode.Spatial; + }) + .distinctUntilChanged() + .subscribe(function (mode) { + _this._graphService.setGraphMode(mode); + }); + this._cacheSubscription = this._stateService.currentNode$ + .map(function (node) { + return [node.sequenceKey, node.key]; + }) + .distinctUntilChanged(undefined, function (_a) { + var sequenceKey = _a[0], nodeKey = _a[1]; + return sequenceKey; + }) + .combineLatest(this._graphService.graphMode$, this._direction$) + .switchMap(function (_a) { + var _b = _a[0], sequenceKey = _b[0], nodeKey = _b[1], mode = _a[1], direction = _a[2]; + if (direction !== Edge_1.EdgeDirection.Next && direction !== Edge_1.EdgeDirection.Prev) { + return Observable_1.Observable.of([undefined, direction]); + } + var sequence$ = (mode === Graph_1.GraphMode.Sequence ? + _this._graphService.cacheSequenceNodes$(sequenceKey, nodeKey) : + _this._graphService.cacheSequence$(sequenceKey)) + .retry(3) + .catch(function (error) { + console.error(error); + return Observable_1.Observable.of(undefined); + }); + return Observable_1.Observable + .combineLatest(sequence$, Observable_1.Observable.of(direction)); + }) + .switchMap(function (_a) { + var sequence = _a[0], direction = _a[1]; + if (sequence === undefined) { + return Observable_1.Observable.empty(); + } + var sequenceKeys = sequence.keys.slice(); + if (direction === Edge_1.EdgeDirection.Prev) { + sequenceKeys.reverse(); + } + return _this._stateService.currentState$ + .map(function (frame) { + return [frame.state.trajectory[frame.state.trajectory.length - 1].key, frame.state.nodesAhead]; + }) + .scan(function (_a, _b) { + var lastRequestKey = _a[0], previousRequestKeys = _a[1]; + var lastTrajectoryKey = _b[0], nodesAhead = _b[1]; + if (lastRequestKey === undefined) { + lastRequestKey = lastTrajectoryKey; + } + var lastIndex = sequenceKeys.length - 1; + if (nodesAhead >= _this._nodesAhead || sequenceKeys[lastIndex] === lastRequestKey) { + return [lastRequestKey, []]; + } + var current = sequenceKeys.indexOf(lastTrajectoryKey); + var start = sequenceKeys.indexOf(lastRequestKey) + 1; + var end = Math.min(lastIndex, current + _this._nodesAhead - nodesAhead) + 1; + if (end <= start) { + return [lastRequestKey, []]; + } + return [sequenceKeys[end - 1], sequenceKeys.slice(start, end)]; + }, [undefined, []]) + .mergeMap(function (_a) { + var lastRequestKey = _a[0], newRequestKeys = _a[1]; + return Observable_1.Observable.from(newRequestKeys); + }); + }) + .mergeMap(function (key) { + return _this._graphService.cacheNode$(key) + .catch(function () { + return Observable_1.Observable.empty(); + }); + }, 6) + .subscribe(); + this._playingSubscription = this._stateService.currentState$ + .filter(function (frame) { + return frame.state.nodesAhead < _this._nodesAhead; + }) + .distinctUntilChanged(undefined, function (frame) { + return frame.state.lastNode.key; + }) + .map(function (frame) { + var lastNode = frame.state.lastNode; + var trajectory = frame.state.trajectory; + var increasingTime = undefined; + for (var i = trajectory.length - 2; i >= 0; i--) { + var node = trajectory[i]; + if (node.sequenceKey !== lastNode.sequenceKey) { + break; + } + if (node.capturedAt !== lastNode.capturedAt) { + increasingTime = node.capturedAt < lastNode.capturedAt; + break; + } + } + return [frame.state.lastNode, increasingTime]; + }) + .withLatestFrom(this._direction$) + .switchMap(function (_a) { + var _b = _a[0], node = _b[0], increasingTime = _b[1], direction = _a[1]; + return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ? + node.sequenceEdges$ : + node.spatialEdges$) + .first(function (status) { + return status.cached; + }) + .timeout(15000) + .zip(Observable_1.Observable.of(direction)) + .map(function (_a) { + var s = _a[0], d = _a[1]; + for (var _i = 0, _b = s.edges; _i < _b.length; _i++) { + var edge = _b[_i]; + if (edge.data.direction === d) { + return edge.to; + } + } + return null; + }) + .switchMap(function (key) { + return key != null ? + _this._graphService.cacheNode$(key) : + _this._bridge$(node, increasingTime) + .filter(function (n) { + return !!n; + }); + }); + }) + .subscribe(function (node) { + _this._stateService.appendNodes([node]); + }, function (error) { + console.error(error); + _this.stop(); + }); + this._clearSubscription = this._stateService.currentNode$ + .bufferCount(1, 10) + .subscribe(function (nodes) { + _this._stateService.clearPriorNodes(); + }); + this._setPlaying(true); + var currentLastNodes$ = this._stateService.currentState$ + .map(function (frame) { + return frame.state; + }) + .distinctUntilChanged(function (_a, _b) { + var kc1 = _a[0], kl1 = _a[1]; + var kc2 = _b[0], kl2 = _b[1]; + return kc1 === kc2 && kl1 === kl2; + }, function (state) { + return [state.currentNode.key, state.lastNode.key]; + }) + .filter(function (state) { + return state.currentNode.key === state.lastNode.key && + state.currentIndex === state.trajectory.length - 1; + }) + .map(function (state) { + return state.currentNode; + }); + this._stopSubscription = Observable_1.Observable + .combineLatest(currentLastNodes$, this._direction$) + .switchMap(function (_a) { + var node = _a[0], direction = _a[1]; + var edgeStatus$ = ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ? + node.sequenceEdges$ : + node.spatialEdges$) + .first(function (status) { + return status.cached; + }) + .timeout(15000) + .catch(function (error) { + console.error(error); + return Observable_1.Observable.of({ cached: false, edges: [] }); + }); + return Observable_1.Observable + .combineLatest(Observable_1.Observable.of(direction), edgeStatus$) + .map(function (_a) { + var d = _a[0], es = _a[1]; + for (var _i = 0, _b = es.edges; _i < _b.length; _i++) { + var edge = _b[_i]; + if (edge.data.direction === d) { + return true; + } + } + return false; + }); + }) + .mergeMap(function (hasEdge) { + if (hasEdge || !_this._bridging$) { + return Observable_1.Observable.of(hasEdge); + } + return _this._bridging$ + .map(function (node) { + return node != null; + }) + .catch(function (error) { + console.error(error); + return Observable_1.Observable.of(false); + }); + }) + .first(function (hasEdge) { + return !hasEdge; + }) + .subscribe(undefined, undefined, function () { _this.stop(); }); + if (this._stopSubscription.closed) { + this._stopSubscription = null; + } + }; + PlayService.prototype.setDirection = function (direction) { + this._directionSubject$.next(direction); + }; + PlayService.prototype.setSpeed = function (speed) { + speed = Math.max(0, Math.min(1, speed)); + if (speed === this._speed) { + return; + } + var stateSpeed = this._setSpeed(speed); + if (this._playing) { + this._stateService.setSpeed(stateSpeed); + } + this._speedSubject$.next(this._speed); + }; + PlayService.prototype.stop = function () { + if (!this._playing) { + return; + } + if (!!this._stopSubscription) { + if (!this._stopSubscription.closed) { + this._stopSubscription.unsubscribe(); + } + this._stopSubscription = null; + } + this._graphModeSubscription.unsubscribe(); + this._graphModeSubscription = null; + this._cacheSubscription.unsubscribe(); + this._cacheSubscription = null; + this._playingSubscription.unsubscribe(); + this._playingSubscription = null; + this._clearSubscription.unsubscribe(); + this._clearSubscription = null; + this._stateService.setSpeed(1); + this._stateService.cutNodes(); + this._graphService.setGraphMode(Graph_1.GraphMode.Spatial); + this._setPlaying(false); + }; + PlayService.prototype._bridge$ = function (node, increasingTime) { + var _this = this; + if (increasingTime === undefined) { + return Observable_1.Observable.of(null); + } + var boundingBox = this._graphCalculator.boundingBoxCorners(node.latLon, 25); + this._bridging$ = this._graphService.cacheBoundingBox$(boundingBox[0], boundingBox[1]) + .mergeMap(function (nodes) { + var nextNode = null; + for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) { + var n = nodes_1[_i]; + if (n.sequenceKey === node.sequenceKey || + !n.cameraUuid || + n.cameraUuid !== node.cameraUuid || + n.capturedAt === node.capturedAt || + n.capturedAt > node.capturedAt !== increasingTime) { + continue; + } + var delta = Math.abs(n.capturedAt - node.capturedAt); + if (delta > 15000) { + continue; + } + if (!nextNode || delta < Math.abs(nextNode.capturedAt - node.capturedAt)) { + nextNode = n; + } + } + return !!nextNode ? + _this._graphService.cacheNode$(nextNode.key) : + Observable_1.Observable.of(null); + }) + .finally(function () { + _this._bridging$ = null; + }) + .publish() + .refCount(); + return this._bridging$; + }; + PlayService.prototype._mapSpeed = function (speed) { + var x = 2 * speed - 1; + return Math.pow(10, x) - 0.2 * x; + }; + PlayService.prototype._mapNodesAhead = function (stateSpeed) { + return Math.round(Math.max(10, Math.min(50, 8 + 6 * stateSpeed))); + }; + PlayService.prototype._setPlaying = function (playing) { + this._playing = playing; + this._playingSubject$.next(playing); + }; + PlayService.prototype._setSpeed = function (speed) { + this._speed = speed; + var stateSpeed = this._mapSpeed(this._speed); + this._nodesAhead = this._mapNodesAhead(stateSpeed); + return stateSpeed; + }; + return PlayService; +}()); +exports.PlayService = PlayService; +exports.default = PlayService; + +},{"../Edge":291,"../Graph":294,"rxjs/Observable":29,"rxjs/Subject":34}],446:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var Geo_1 = require("../Geo"); -var Projection = (function () { +var Projection = /** @class */ (function () { function Projection(geoCoords, viewportCoords) { this._geoCoords = !!geoCoords ? geoCoords : new Geo_1.GeoCoords(); this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords(); @@ -39778,18 +46989,15 @@ var Projection = (function () { exports.Projection = Projection; exports.default = Projection; -},{"../Geo":229,"three":176}],353:[function(require,module,exports){ +},{"../Geo":293,"three":240}],447:[function(require,module,exports){ "use strict"; /// Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var vd = require("virtual-dom"); var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/operator/publishReplay"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/startWith"); var Viewer_1 = require("../Viewer"); -var SpriteAtlas = (function () { +var SpriteAtlas = /** @class */ (function () { function SpriteAtlas() { } Object.defineProperty(SpriteAtlas.prototype, "json", { @@ -39868,7 +47076,7 @@ var SpriteAtlas = (function () { break; case Viewer_1.Alignment.BottomRight: case Viewer_1.Alignment.Right: - case Viewer_1.Alignment.BottomRight: + case Viewer_1.Alignment.TopRight: default: break; } @@ -39913,7 +47121,7 @@ var SpriteAtlas = (function () { }; return SpriteAtlas; }()); -var SpriteService = (function () { +var SpriteService = /** @class */ (function () { function SpriteService(sprite) { var _this = this; this._retina = window.devicePixelRatio > 1; @@ -39977,24 +47185,15 @@ var SpriteService = (function () { exports.SpriteService = SpriteService; exports.default = SpriteService; -},{"../Viewer":236,"rxjs/Subject":34,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":73,"rxjs/add/operator/startWith":78,"three":176,"virtual-dom":182}],354:[function(require,module,exports){ +},{"../Viewer":301,"rxjs/Subject":34,"three":240,"virtual-dom":246}],448:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BehaviorSubject_1 = require("rxjs/BehaviorSubject"); var Observable_1 = require("rxjs/Observable"); var Subject_1 = require("rxjs/Subject"); -require("rxjs/add/observable/timer"); -require("rxjs/add/operator/bufferWhen"); -require("rxjs/add/operator/filter"); -require("rxjs/add/operator/map"); -require("rxjs/add/operator/merge"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/switchMap"); -var TouchService = (function () { +var TouchService = /** @class */ (function () { function TouchService(canvasContainer, domContainer) { var _this = this; - this._canvasContainer = canvasContainer; - this._domContainer = domContainer; this._activeSubject$ = new BehaviorSubject_1.BehaviorSubject(false); this._active$ = this._activeSubject$ .distinctUntilChanged() @@ -40252,7 +47451,7 @@ var TouchService = (function () { }()); exports.TouchService = TouchService; -},{"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/timer":47,"rxjs/add/operator/bufferWhen":51,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/merge":66,"rxjs/add/operator/scan":73,"rxjs/add/operator/switchMap":79}],355:[function(require,module,exports){ +},{"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/Subject":34}],449:[function(require,module,exports){ "use strict"; /// var __extends = (this && this.__extends) || (function () { @@ -40267,13 +47466,68 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var when = require("when"); +require("rxjs/add/observable/combineLatest"); +require("rxjs/add/observable/concat"); +require("rxjs/add/observable/defer"); +require("rxjs/add/observable/empty"); +require("rxjs/add/observable/merge"); +require("rxjs/add/observable/from"); +require("rxjs/add/observable/fromEvent"); +require("rxjs/add/observable/fromPromise"); +require("rxjs/add/observable/of"); +require("rxjs/add/observable/throw"); +require("rxjs/add/observable/timer"); +require("rxjs/add/observable/zip"); +require("rxjs/add/operator/auditTime"); +require("rxjs/add/operator/buffer"); +require("rxjs/add/operator/bufferCount"); +require("rxjs/add/operator/bufferWhen"); +require("rxjs/add/operator/catch"); +require("rxjs/add/operator/combineLatest"); +require("rxjs/add/operator/concat"); +require("rxjs/add/operator/count"); +require("rxjs/add/operator/debounceTime"); +require("rxjs/add/operator/delay"); +require("rxjs/add/operator/distinct"); +require("rxjs/add/operator/distinctUntilChanged"); +require("rxjs/add/operator/do"); +require("rxjs/add/operator/expand"); +require("rxjs/add/operator/filter"); +require("rxjs/add/operator/finally"); +require("rxjs/add/operator/first"); +require("rxjs/add/operator/last"); +require("rxjs/add/operator/map"); +require("rxjs/add/operator/merge"); +require("rxjs/add/operator/mergeMap"); +require("rxjs/add/operator/mergeAll"); +require("rxjs/add/operator/pairwise"); +require("rxjs/add/operator/pluck"); +require("rxjs/add/operator/publish"); +require("rxjs/add/operator/publishReplay"); +require("rxjs/add/operator/reduce"); +require("rxjs/add/operator/retry"); +require("rxjs/add/operator/sample"); +require("rxjs/add/operator/scan"); +require("rxjs/add/operator/share"); +require("rxjs/add/operator/skip"); +require("rxjs/add/operator/skipUntil"); +require("rxjs/add/operator/skipWhile"); +require("rxjs/add/operator/startWith"); +require("rxjs/add/operator/switchMap"); +require("rxjs/add/operator/take"); +require("rxjs/add/operator/takeUntil"); +require("rxjs/add/operator/takeWhile"); +require("rxjs/add/operator/timeout"); +require("rxjs/add/operator/withLatestFrom"); +require("rxjs/add/operator/zip"); +var Observable_1 = require("rxjs/Observable"); var Viewer_1 = require("../Viewer"); var Utils_1 = require("../Utils"); /** * @class Viewer * - * @classdesc The Viewer object represents the navigable photo viewer. - * Create a Viewer by specifying a container, client ID, photo key and + * @classdesc The Viewer object represents the navigable image viewer. + * Create a Viewer by specifying a container, client ID, image key and * other options. The viewer exposes methods and events for programmatic * interaction. * @@ -40318,37 +47572,92 @@ var Utils_1 = require("../Utils"); * zoomed independently of the size of the viewer container resulting in * different conversion results for different viewing directions. */ -var Viewer = (function (_super) { +var Viewer = /** @class */ (function (_super) { __extends(Viewer, _super); /** * Create a new viewer instance. * + * @description It is possible to initialize the viewer with or + * without a key. + * + * When you want to show a specific image in the viewer from + * the start you should initialize it with a key. + * + * When you do not know the first image key at implementation + * time, e.g. in a map-viewer application you should initialize + * the viewer without a key and call `moveToKey` instead. + * + * When initializing with a key the viewer is bound to that key + * until the node for that key has been successfully loaded. + * Also, a cover with the image of the key will be shown. + * If the data for that key can not be loaded because the key is + * faulty or other errors occur it is not possible to navigate + * to another key because the viewer is not navigable. The viewer + * becomes navigable when the data for the key has been loaded and + * the image is shown in the viewer. This way of initializing + * the viewer is mostly for embedding in blog posts and similar + * where one wants to show a specific image initially. + * + * If the viewer is initialized without a key (with null or + * undefined) it is not bound to any particular key and it is + * possible to move to any key with `viewer.moveToKey("")`. + * If the first move to a key fails it is possible to move to another + * key. The viewer will show a black background until a move + * succeeds. This way of intitializing is suited for a map-viewer + * application when the initial key is not known at implementation + * time. + * * @param {string} id - Required `id` of a DOM element which will * be transformed into the viewer. * @param {string} clientId - Required `Mapillary API ClientID`. Can * be obtained from https://www.mapillary.com/app/settings/developers. - * @param {string} [key] - Optional `photoId` to start from, can be any - * Mapillary photo, if null no image is loaded. - * @param {IViewerOptions} [options] - Optional configuration object - * specifing Viewer's initial setup. - * @param {string} [token] - Optional bearer token for API requests of + * @param {string} key - Optional `image-key` to start from. The key + * can be any Mapillary image. If a key is provided the viewer is + * bound to that key until it has been fully loaded. If null is provided + * no image is loaded at viewer initialization and the viewer is not + * bound to any particular key. Any image can then be navigated to + * with e.g. `viewer.moveToKey("")`. + * @param {IViewerOptions} options - Optional configuration object + * specifing Viewer's and the components' initial setup. + * @param {string} token - Optional bearer token for API requests of * protected resources. * * @example * ``` - * var viewer = new Mapillary.Viewer("", "", ""); + * var viewer = new Mapillary.Viewer("", "", ""); * ``` */ function Viewer(id, clientId, key, options, token) { var _this = _super.call(this) || this; options = options != null ? options : {}; Utils_1.Settings.setOptions(options); - _this._navigator = new Viewer_1.Navigator(clientId, token); + Utils_1.Urls.setOptions(options.url); + _this._navigator = new Viewer_1.Navigator(clientId, options, token); _this._container = new Viewer_1.Container(id, _this._navigator.stateService, options); _this._observer = new Viewer_1.Observer(_this, _this._navigator, _this._container); _this._componentController = new Viewer_1.ComponentController(_this._container, _this._navigator, _this._observer, key, options.component); return _this; } + Object.defineProperty(Viewer.prototype, "isNavigable", { + /** + * Return a boolean indicating if the viewer is in a navigable state. + * + * @description The navigable state indicates if the viewer supports + * moving, i.e. calling the {@link moveToKey}, {@link moveDir`} + * and {@link moveCloseTo} methods or changing the authentication state, + * i.e. calling {@link setAuthToken}. The viewer will not be in a navigable + * state if the cover is activated and the viewer has been supplied a key. + * When the cover is deactivated or the viewer is activated without being + * supplied a key it will be navigable. + * + * @returns {boolean} Boolean indicating whether the viewer is navigable. + */ + get: function () { + return this._componentController.navigable; + }, + enumerable: true, + configurable: true + }); /** * Activate a component. * @@ -40419,16 +47728,16 @@ var Viewer = (function (_super) { }); }; /** - * Get the basic coordinates of the current photo that is + * Get the basic coordinates of the current image that is * at the center of the viewport. * * @description Basic coordinates are 2D coordinates on the [0, 1] interval * and have the origin point, (0, 0), at the top left corner and the * maximum value, (1, 1), at the bottom right corner of the original - * photo. + * image. * * @returns {Promise} Promise to the basic coordinates - * of the current photo at the center for the viewport. + * of the current image at the center for the viewport. * * @example * ``` @@ -40469,7 +47778,7 @@ var Viewer = (function (_super) { return this._container.element; }; /** - * Get the photo's current zoom level. + * Get the image's current zoom level. * * @returns {Promise} Promise to the viewers's current * zoom level. @@ -40502,6 +47811,9 @@ var Viewer = (function (_super) { * @throws {Error} If no nodes exist close to provided latitude * longitude. * @throws {Error} Propagates any IO errors to the caller. + * @throws {Error} When viewer is not navigable. + * @throws {AbortMapillaryError} When a subsequent move request is made + * before the move close to call has completed. * * @example * ``` @@ -40511,9 +47823,11 @@ var Viewer = (function (_super) { * ``` */ Viewer.prototype.moveCloseTo = function (lat, lon) { - var _this = this; + var moveCloseTo$ = this.isNavigable ? + this._navigator.moveCloseTo$(lat, lon) : + Observable_1.Observable.throw(new Error("Calling moveCloseTo is not supported when viewer is not navigable.")); return when.promise(function (resolve, reject) { - _this._navigator.moveCloseTo$(lat, lon).subscribe(function (node) { + moveCloseTo$.subscribe(function (node) { resolve(node); }, function (error) { reject(error); @@ -40530,6 +47844,9 @@ var Viewer = (function (_super) { * @throws {Error} If the current node does not have the edge direction * or the edges has not yet been cached. * @throws {Error} Propagates any IO errors to the caller. + * @throws {Error} When viewer is not navigable. + * @throws {AbortMapillaryError} When a subsequent move request is made + * before the move dir call has completed. * * @example * ``` @@ -40539,9 +47856,11 @@ var Viewer = (function (_super) { * ``` */ Viewer.prototype.moveDir = function (dir) { - var _this = this; + var moveDir$ = this.isNavigable ? + this._navigator.moveDir$(dir) : + Observable_1.Observable.throw(new Error("Calling moveDir is not supported when viewer is not navigable.")); return when.promise(function (resolve, reject) { - _this._navigator.moveDir$(dir).subscribe(function (node) { + moveDir$.subscribe(function (node) { resolve(node); }, function (error) { reject(error); @@ -40549,11 +47868,14 @@ var Viewer = (function (_super) { }); }; /** - * Navigate to a given photo key. + * Navigate to a given image key. * - * @param {string} key - A valid Mapillary photo key. + * @param {string} key - A valid Mapillary image key. * @returns {Promise} Promise to the node that was navigated to. * @throws {Error} Propagates any IO errors to the caller. + * @throws {Error} When viewer is not navigable. + * @throws {AbortMapillaryError} When a subsequent move request is made + * before the move to key call has completed. * * @example * ``` @@ -40563,9 +47885,11 @@ var Viewer = (function (_super) { * ``` */ Viewer.prototype.moveToKey = function (key) { - var _this = this; + var moveToKey$ = this.isNavigable ? + this._navigator.moveToKey$(key) : + Observable_1.Observable.throw(new Error("Calling moveToKey is not supported when viewer is not navigable.")); return when.promise(function (resolve, reject) { - _this._navigator.moveToKey$(key).subscribe(function (node) { + moveToKey$.subscribe(function (node) { resolve(node); }, function (error) { reject(error); @@ -40580,7 +47904,7 @@ var Viewer = (function (_super) { * pixel point that lies in the visible area of the viewer container. * * @param {Array} basicPoint - Basic images coordinates to project. - * @returns {Promise} Promise to the pixel coordinates corresponding + * @returns {Promise>} Promise to the pixel coordinates corresponding * to the basic image point. * * @example @@ -40624,13 +47948,18 @@ var Viewer = (function (_super) { * viewer will make unauthenticated requests. * * Calling setAuthToken aborts all outstanding move requests. - * The promises of those move requests will be rejected and - * the rejections need to be caught. + * The promises of those move requests will be rejected with a + * {@link AbortMapillaryError} the rejections need to be caught. + * + * Calling setAuthToken also resets the complete viewer cache + * so it should not be called repeatedly. * * @param {string} [token] token - Bearer token. * @returns {Promise} Promise that resolves after token * is set. * + * @throws {Error} When viewer is not navigable. + * * @example * ``` * viewer.setAuthToken("") @@ -40638,9 +47967,11 @@ var Viewer = (function (_super) { * ``` */ Viewer.prototype.setAuthToken = function (token) { - var _this = this; + var setToken$ = this.isNavigable ? + this._navigator.setToken$(token) : + Observable_1.Observable.throw(new Error("Calling setAuthToken is not supported when viewer is not navigable.")); return when.promise(function (resolve, reject) { - _this._navigator.setToken$(token) + setToken$ .subscribe(function () { resolve(undefined); }, function (error) { @@ -40649,16 +47980,16 @@ var Viewer = (function (_super) { }); }; /** - * Set the basic coordinates of the current photo to be in the + * Set the basic coordinates of the current image to be in the * center of the viewport. * * @description Basic coordinates are 2D coordinates on the [0, 1] interval * and has the origin point, (0, 0), at the top left corner and the * maximum value, (1, 1), at the bottom right corner of the original - * photo. + * image. * * @param {number[]} The basic coordinates of the current - * photo to be at the center for the viewport. + * image to be at the center for the viewport. * * @example * ``` @@ -40698,8 +48029,9 @@ var Viewer = (function (_super) { * * `["all", f0, ..., fn]` logical `AND`: `f0 ∧ ... ∧ fn` * - * A key must be a string that identifies a node property name. A value must be - * a string, number, or boolean. Strictly-typed comparisons are used. The values + * A key must be a string that identifies a property name of a + * simple {@link Node} property. A value must be a string, number, or + * boolean. Strictly-typed comparisons are used. The values * `f0, ..., fn` of the combining filter must be filter expressions. * * Clear the filter by setting it to null or empty array. @@ -40737,13 +48069,26 @@ var Viewer = (function (_super) { this._container.renderService.renderMode$.next(renderMode); }; /** - * Set the photo's current zoom level. + * Set the viewer's transition mode. + * + * @param {TransitionMode} transitionMode - Transition mode. + * + * @example + * ``` + * viewer.setTransitionMode(Mapillary.TransitionMode.Instantaneous); + * ``` + */ + Viewer.prototype.setTransitionMode = function (transitionMode) { + this._navigator.stateService.setTransitionMode(transitionMode); + }; + /** + * Set the image's current zoom level. * * @description Possible zoom level values are on the [0, 3] interval. - * Zero means zooming out to fit the photo to the view whereas three + * Zero means zooming out to fit the image to the view whereas three * shows the highest level of detail. * - * @param {number} The photo's current zoom level. + * @param {number} The image's current zoom level. * * @example * ``` @@ -40810,105 +48155,124 @@ var Viewer = (function (_super) { }); }); }; + /** + * Fired when the viewing direction of the camera changes. + * + * @description Related to the computed compass angle + * ({@link Node.computedCa}) from SfM, not the original EXIF compass + * angle. + * + * @event + * @type {number} bearing - Value indicating the current bearing + * measured in degrees clockwise with respect to north. + */ + Viewer.bearingchanged = "bearingchanged"; + /** + * Fired when a pointing device (usually a mouse) is pressed and released at + * the same point in the viewer. + * @event + * @type {IViewerMouseEvent} event - Viewer mouse event data. + */ + Viewer.click = "click"; + /** + * Fired when the right button of the mouse is clicked within the viewer. + * @event + * @type {IViewerMouseEvent} event - Viewer mouse event data. + */ + Viewer.contextmenu = "contextmenu"; + /** + * Fired when a pointing device (usually a mouse) is clicked twice at + * the same point in the viewer. + * @event + * @type {IViewerMouseEvent} event - Viewer mouse event data. + */ + Viewer.dblclick = "dblclick"; + /** + * Fired when the viewer is loading more data. + * @event + * @type {boolean} loading - Boolean indicating whether the viewer is loading. + */ + Viewer.loadingchanged = "loadingchanged"; + /** + * Fired when a pointing device (usually a mouse) is pressed within the viewer. + * @event + * @type {IViewerMouseEvent} event - Viewer mouse event data. + */ + Viewer.mousedown = "mousedown"; + /** + * Fired when a pointing device (usually a mouse) is moved within the viewer. + * @description Will not fire when the mouse is actively used, e.g. for drag pan. + * @event + * @type {IViewerMouseEvent} event - Viewer mouse event data. + */ + Viewer.mousemove = "mousemove"; + /** + * Fired when a pointing device (usually a mouse) leaves the viewer's canvas. + * @event + * @type {IViewerMouseEvent} event - Viewer mouse event data. + */ + Viewer.mouseout = "mouseout"; + /** + * Fired when a pointing device (usually a mouse) is moved onto the viewer's canvas. + * @event + * @type {IViewerMouseEvent} event - Viewer mouse event data. + */ + Viewer.mouseover = "mouseover"; + /** + * Fired when a pointing device (usually a mouse) is released within the viewer. + * @event + * @type {IViewerMouseEvent} event - Viewer mouse event data. + */ + Viewer.mouseup = "mouseup"; + /** + * Fired when the viewer motion stops and it is in a fixed + * position with a fixed point of view. + * @event + */ + Viewer.moveend = "moveend"; + /** + * Fired when the motion from one view to another start, + * either by changing the position (e.g. when changing node) or + * when changing point of view (e.g. by interaction such as pan and zoom). + * @event + */ + Viewer.movestart = "movestart"; + /** + * Fired when the navigable state of the viewer changes. + * + * @description The navigable state indicates if the viewer supports + * moving, i.e. calling the `moveToKey`, `moveDir` and `moveCloseTo` + * methods. The viewer will not be in a navigable state if the cover + * is activated and the viewer has been supplied a key. When the cover + * is deactivated or activated without being supplied a key it will + * be navigable. + * + * @event + * @type {boolean} navigable - Boolean indicating whether the viewer is navigable. + */ + Viewer.navigablechanged = "navigablechanged"; + /** + * Fired every time the viewer navigates to a new node. + * @event + * @type {Node} node - Current node. + */ + Viewer.nodechanged = "nodechanged"; + /** + * Fired every time the sequence edges of the current node changes. + * @event + * @type {IEdgeStatus} status - The edge status object. + */ + Viewer.sequenceedgeschanged = "sequenceedgeschanged"; + /** + * Fired every time the spatial edges of the current node changes. + * @event + * @type {IEdgeStatus} status - The edge status object. + */ + Viewer.spatialedgeschanged = "spatialedgeschanged"; return Viewer; }(Utils_1.EventEmitter)); -/** - * Fired when the viewing direction of the camera changes. - * @event - * @type {number} bearing - Value indicating the current bearing - * measured in degrees clockwise with respect to north. - */ -Viewer.bearingchanged = "bearingchanged"; -/** - * Fired when a pointing device (usually a mouse) is pressed and released at - * the same point in the viewer. - * @event - * @type {IViewerMouseEvent} event - Viewer mouse event data. - */ -Viewer.click = "click"; -/** - * Fired when the right button of the mouse is clicked within the viewer. - * @event - * @type {IViewerMouseEvent} event - Viewer mouse event data. - */ -Viewer.contextmenu = "contextmenu"; -/** - * Fired when a pointing device (usually a mouse) is clicked twice at - * the same point in the viewer. - * @event - * @type {IViewerMouseEvent} event - Viewer mouse event data. - */ -Viewer.dblclick = "dblclick"; -/** - * Fired when the viewer is loading more data. - * @event - * @type {boolean} loading - Value indicating whether the viewer is loading. - */ -Viewer.loadingchanged = "loadingchanged"; -/** - * Fired when a pointing device (usually a mouse) is pressed within the viewer. - * @event - * @type {IViewerMouseEvent} event - Viewer mouse event data. - */ -Viewer.mousedown = "mousedown"; -/** - * Fired when a pointing device (usually a mouse) is moved within the viewer. - * @description Will not fire when the mouse is actively used, e.g. for drag pan. - * @event - * @type {IViewerMouseEvent} event - Viewer mouse event data. - */ -Viewer.mousemove = "mousemove"; -/** - * Fired when a pointing device (usually a mouse) leaves the viewer's canvas. - * @event - * @type {IViewerMouseEvent} event - Viewer mouse event data. - */ -Viewer.mouseout = "mouseout"; -/** - * Fired when a pointing device (usually a mouse) is moved onto the viewer's canvas. - * @event - * @type {IViewerMouseEvent} event - Viewer mouse event data. - */ -Viewer.mouseover = "mouseover"; -/** - * Fired when a pointing device (usually a mouse) is released within the viewer. - * @event - * @type {IViewerMouseEvent} event - Viewer mouse event data. - */ -Viewer.mouseup = "mouseup"; -/** - * Fired when the viewer motion stops and it is in a fixed - * position with a fixed point of view. - * @event - */ -Viewer.moveend = "moveend"; -/** - * Fired when the motion from one view to another start, - * either by changing the position (e.g. when changing node) or - * when changing point of view (e.g. by interaction such as pan and zoom). - * @event - */ -Viewer.movestart = "movestart"; -/** - * Fired every time the viewer navigates to a new node. - * @event - * @type {Node} node - Current node. - */ -Viewer.nodechanged = "nodechanged"; -/** - * Fired every time the sequence edges of the current node changes. - * @event - * @type {IEdgeStatus} status - The edge status object. - */ -Viewer.sequenceedgeschanged = "sequenceedgeschanged"; -/** - * Fired every time the spatial edges of the current node changes. - * @event - * @type {IEdgeStatus} status - The edge status object. - */ -Viewer.spatialedgeschanged = "spatialedgeschanged"; exports.Viewer = Viewer; -},{"../Utils":235,"../Viewer":236,"when":223}]},{},[231])(231) +},{"../Utils":300,"../Viewer":301,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/observable/concat":39,"rxjs/add/observable/defer":40,"rxjs/add/observable/empty":41,"rxjs/add/observable/from":42,"rxjs/add/observable/fromEvent":43,"rxjs/add/observable/fromPromise":44,"rxjs/add/observable/merge":45,"rxjs/add/observable/of":46,"rxjs/add/observable/throw":47,"rxjs/add/observable/timer":48,"rxjs/add/observable/zip":49,"rxjs/add/operator/auditTime":50,"rxjs/add/operator/buffer":51,"rxjs/add/operator/bufferCount":52,"rxjs/add/operator/bufferWhen":53,"rxjs/add/operator/catch":54,"rxjs/add/operator/combineLatest":55,"rxjs/add/operator/concat":56,"rxjs/add/operator/count":57,"rxjs/add/operator/debounceTime":58,"rxjs/add/operator/delay":59,"rxjs/add/operator/distinct":60,"rxjs/add/operator/distinctUntilChanged":61,"rxjs/add/operator/do":62,"rxjs/add/operator/expand":63,"rxjs/add/operator/filter":64,"rxjs/add/operator/finally":65,"rxjs/add/operator/first":66,"rxjs/add/operator/last":67,"rxjs/add/operator/map":68,"rxjs/add/operator/merge":69,"rxjs/add/operator/mergeAll":70,"rxjs/add/operator/mergeMap":71,"rxjs/add/operator/pairwise":72,"rxjs/add/operator/pluck":73,"rxjs/add/operator/publish":74,"rxjs/add/operator/publishReplay":75,"rxjs/add/operator/reduce":76,"rxjs/add/operator/retry":77,"rxjs/add/operator/sample":78,"rxjs/add/operator/scan":79,"rxjs/add/operator/share":80,"rxjs/add/operator/skip":81,"rxjs/add/operator/skipUntil":82,"rxjs/add/operator/skipWhile":83,"rxjs/add/operator/startWith":84,"rxjs/add/operator/switchMap":85,"rxjs/add/operator/take":86,"rxjs/add/operator/takeUntil":87,"rxjs/add/operator/takeWhile":88,"rxjs/add/operator/timeout":89,"rxjs/add/operator/withLatestFrom":90,"rxjs/add/operator/zip":91,"when":287}]},{},[295])(295) }); //# sourceMappingURL=mapillary.js.map