X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/6c3a31d06c8b8dab8b141c5ae54aaad55614b721..c3df2a5180fe3821d3e45a11932068ef064a8eb0:/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 bcc3d7325..6331a973f 100644 --- a/vendor/assets/iD/iD/mapillary-js/mapillary.js +++ b/vendor/assets/iD/iD/mapillary-js/mapillary.js @@ -1,4 +1,269 @@ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Mapillary = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o maxX) maxX = p[0]; + if (!i || p[1] > maxY) maxY = p[1]; + } + + var width = maxX - minX; + var height = maxY - minY; + var cellSize = Math.min(width, height); + var h = cellSize / 2; + + // a priority queue of cells in order of their "potential" (max distance to polygon) + var cellQueue = new Queue(null, compareMax); + + if (cellSize === 0) return [minX, minY]; + + // cover polygon with initial cells + for (var x = minX; x < maxX; x += cellSize) { + for (var y = minY; y < maxY; y += cellSize) { + cellQueue.push(new Cell(x + h, y + h, h, polygon)); + } + } + + // take centroid as the first best guess + var bestCell = getCentroidCell(polygon); + + // special case for rectangular polygons + var bboxCell = new Cell(minX + width / 2, minY + height / 2, 0, polygon); + if (bboxCell.d > bestCell.d) bestCell = bboxCell; + + var numProbes = cellQueue.length; + + while (cellQueue.length) { + // pick the most promising cell from the queue + var cell = cellQueue.pop(); + + // update the best cell if we found a better one + if (cell.d > bestCell.d) { + bestCell = cell; + if (debug) console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes); + } + + // do not drill down further if there's no chance of a better solution + if (cell.max - bestCell.d <= precision) continue; + + // split the cell into four cells + h = cell.h / 2; + cellQueue.push(new Cell(cell.x - h, cell.y - h, h, polygon)); + cellQueue.push(new Cell(cell.x + h, cell.y - h, h, polygon)); + cellQueue.push(new Cell(cell.x - h, cell.y + h, h, polygon)); + cellQueue.push(new Cell(cell.x + h, cell.y + h, h, polygon)); + numProbes += 4; + } + + if (debug) { + console.log('num probes: ' + numProbes); + console.log('best distance: ' + bestCell.d); + } + + return [bestCell.x, bestCell.y]; +} + +function compareMax(a, b) { + return b.max - a.max; +} + +function Cell(x, y, h, polygon) { + this.x = x; // cell center x + this.y = y; // cell center y + this.h = h; // half the cell size + this.d = pointToPolygonDist(x, y, polygon); // distance from cell center to polygon + this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell +} + +// signed distance from point to polygon outline (negative if point is outside) +function pointToPolygonDist(x, y, polygon) { + var inside = false; + var minDistSq = Infinity; + + for (var k = 0; k < polygon.length; k++) { + var ring = polygon[k]; + + for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) { + var a = ring[i]; + var b = ring[j]; + + if ((a[1] > y !== b[1] > y) && + (x < (b[0] - a[0]) * (y - a[1]) / (b[1] - a[1]) + a[0])) inside = !inside; + + minDistSq = Math.min(minDistSq, getSegDistSq(x, y, a, b)); + } + } + + return (inside ? 1 : -1) * Math.sqrt(minDistSq); +} + +// get polygon centroid +function getCentroidCell(polygon) { + var area = 0; + var x = 0; + var y = 0; + var points = polygon[0]; + + for (var i = 0, len = points.length, j = len - 1; i < len; j = i++) { + var a = points[i]; + var b = points[j]; + var f = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * f; + y += (a[1] + b[1]) * f; + area += f * 3; + } + if (area === 0) return new Cell(points[0][0], points[0][1], 0, polygon); + return new Cell(x / area, y / area, 0, polygon); +} + +// get squared distance from a point to a segment +function getSegDistSq(px, py, a, b) { + + var x = a[0]; + var y = a[1]; + var dx = b[0] - x; + var dy = b[1] - y; + + if (dx !== 0 || dy !== 0) { + + var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy); + + if (t > 1) { + x = b[0]; + y = b[1]; + + } else if (t > 0) { + x += dx * t; + y += dy * t; + } + } + + dx = px - x; + dy = py - y; + + return dx * dx + dy * dy; +} + +},{"tinyqueue":181}],2:[function(require,module,exports){ +/* + * Copyright (C) 2008 Apple Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Ported from Webkit + * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h + */ + +module.exports = UnitBezier; + +function UnitBezier(p1x, p1y, p2x, p2y) { + // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1). + this.cx = 3.0 * p1x; + this.bx = 3.0 * (p2x - p1x) - this.cx; + this.ax = 1.0 - this.cx - this.bx; + + this.cy = 3.0 * p1y; + this.by = 3.0 * (p2y - p1y) - this.cy; + this.ay = 1.0 - this.cy - this.by; + + this.p1x = p1x; + this.p1y = p2y; + this.p2x = p2x; + this.p2y = p2y; +} + +UnitBezier.prototype.sampleCurveX = function(t) { + // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule. + return ((this.ax * t + this.bx) * t + this.cx) * t; +}; + +UnitBezier.prototype.sampleCurveY = function(t) { + return ((this.ay * t + this.by) * t + this.cy) * t; +}; + +UnitBezier.prototype.sampleCurveDerivativeX = function(t) { + return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx; +}; + +UnitBezier.prototype.solveCurveX = function(x, epsilon) { + if (typeof epsilon === 'undefined') epsilon = 1e-6; + + var t0, t1, t2, x2, i; + + // First try a few iterations of Newton's method -- normally very fast. + for (t2 = x, i = 0; i < 8; i++) { + + x2 = this.sampleCurveX(t2) - x; + if (Math.abs(x2) < epsilon) return t2; + + var d2 = this.sampleCurveDerivativeX(t2); + if (Math.abs(d2) < 1e-6) break; + + t2 = t2 - x2 / d2; + } + + // Fall back to the bisection method for reliability. + t0 = 0.0; + t1 = 1.0; + t2 = x; + + if (t2 < t0) return t0; + if (t2 > t1) return t1; + + while (t0 < t1) { + + x2 = this.sampleCurveX(t2); + if (Math.abs(x2 - x) < epsilon) return t2; + + if (x > x2) { + t0 = t2; + } else { + t1 = t2; + } + + t2 = (t1 - t0) * 0.5 + t0; + } + + // Failure. + return t2; +}; + +UnitBezier.prototype.solve = function(x, epsilon) { + return this.sampleCurveY(this.solveCurveX(x, epsilon)); +}; + +},{}],3:[function(require,module,exports){ 'use strict' exports.byteLength = byteLength @@ -34,22 +299,22 @@ function placeHoldersCount (b64) { function byteLength (b64) { // base64 is 4/3 + up to two characters of the original data - return b64.length * 3 / 4 - placeHoldersCount(b64) + return (b64.length * 3 / 4) - placeHoldersCount(b64) } function toByteArray (b64) { - var i, j, l, tmp, placeHolders, arr + var i, l, tmp, placeHolders, arr var len = b64.length placeHolders = placeHoldersCount(b64) - arr = new Arr(len * 3 / 4 - placeHolders) + arr = new Arr((len * 3 / 4) - placeHolders) // if there are placeholders, only get up to the last complete 4 chars l = placeHolders > 0 ? len - 4 : len var L = 0 - for (i = 0, j = 0; i < l; i += 4, j += 3) { + for (i = 0; i < l; i += 4) { tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] arr[L++] = (tmp >> 16) & 0xFF arr[L++] = (tmp >> 8) & 0xFF @@ -114,9 +379,9 @@ function fromByteArray (uint8) { return parts.join('') } -},{}],2:[function(require,module,exports){ +},{}],4:[function(require,module,exports){ -},{}],3:[function(require,module,exports){ +},{}],5:[function(require,module,exports){ /*! * Cross-Browser Split 1.1.1 * Copyright 2007-2012 Steven Levithan @@ -224,7 +489,7 @@ module.exports = (function split(undef) { return self; })(); -},{}],4:[function(require,module,exports){ +},{}],6:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; @@ -395,6 +660,10 @@ process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } process.binding = function (name) { throw new Error('process.binding is not supported'); @@ -406,8 +675,7 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}],5:[function(require,module,exports){ -(function (global){ +},{}],7:[function(require,module,exports){ /*! * The buffer module from node.js, for the browser. * @@ -420,80 +688,57 @@ process.umask = function() { return 0; }; var base64 = require('base64-js') var ieee754 = require('ieee754') -var isArray = require('isarray') exports.Buffer = Buffer exports.SlowBuffer = SlowBuffer exports.INSPECT_MAX_BYTES = 50 +var K_MAX_LENGTH = 0x7fffffff +exports.kMaxLength = K_MAX_LENGTH + /** * If `Buffer.TYPED_ARRAY_SUPPORT`: * === true Use Uint8Array implementation (fastest) - * === false Use Object implementation (most compatible, even IE6) + * === false Print warning and recommend using `buffer` v4.x which has an Object + * implementation (most compatible, even IE6) * * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, * Opera 11.6+, iOS 4.2+. * - * Due to various browser bugs, sometimes the Object implementation will be used even - * when the browser supports typed arrays. - * - * Note: - * - * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, - * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. - * - * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. - * - * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of - * incorrect length in some situations. - - * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they - * get the Object implementation, which is slower but behaves correctly. + * We report that the browser does not support typed arrays if the are not subclassable + * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` + * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support + * for __proto__ and has a buggy typed array implementation. */ -Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined - ? global.TYPED_ARRAY_SUPPORT - : typedArraySupport() +Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport() -/* - * Export kMaxLength after typed array support is determined. - */ -exports.kMaxLength = kMaxLength() +if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && + typeof console.error === 'function') { + console.error( + 'This browser lacks typed array (Uint8Array) support which is required by ' + + '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.' + ) +} function typedArraySupport () { + // Can typed array instances can be augmented? try { var arr = new Uint8Array(1) arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} - return arr.foo() === 42 && // typed array instances can be augmented - typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` - arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` + return arr.foo() === 42 } catch (e) { return false } } -function kMaxLength () { - return Buffer.TYPED_ARRAY_SUPPORT - ? 0x7fffffff - : 0x3fffffff -} - -function createBuffer (that, length) { - if (kMaxLength() < length) { +function createBuffer (length) { + if (length > K_MAX_LENGTH) { throw new RangeError('Invalid typed array length') } - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = new Uint8Array(length) - that.__proto__ = Buffer.prototype - } else { - // Fallback: Return an object instance of the Buffer class - if (that === null) { - that = new Buffer(length) - } - that.length = length - } - - return that + // Return an augmented `Uint8Array` instance + var buf = new Uint8Array(length) + buf.__proto__ = Buffer.prototype + return buf } /** @@ -507,10 +752,6 @@ function createBuffer (that, length) { */ function Buffer (arg, encodingOrOffset, length) { - if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { - return new Buffer(arg, encodingOrOffset, length) - } - // Common case. if (typeof arg === 'number') { if (typeof encodingOrOffset === 'string') { @@ -518,33 +759,38 @@ function Buffer (arg, encodingOrOffset, length) { 'If encoding is specified then the first argument must be a string' ) } - return allocUnsafe(this, arg) + return allocUnsafe(arg) } - return from(this, arg, encodingOrOffset, length) + return from(arg, encodingOrOffset, length) } -Buffer.poolSize = 8192 // not used by this implementation - -// TODO: Legacy, not needed anymore. Remove in next major version. -Buffer._augment = function (arr) { - arr.__proto__ = Buffer.prototype - return arr +// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 +if (typeof Symbol !== 'undefined' && Symbol.species && + Buffer[Symbol.species] === Buffer) { + Object.defineProperty(Buffer, Symbol.species, { + value: null, + configurable: true, + enumerable: false, + writable: false + }) } -function from (that, value, encodingOrOffset, length) { +Buffer.poolSize = 8192 // not used by this implementation + +function from (value, encodingOrOffset, length) { if (typeof value === 'number') { throw new TypeError('"value" argument must not be a number') } - if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { - return fromArrayBuffer(that, value, encodingOrOffset, length) + if (value instanceof ArrayBuffer) { + return fromArrayBuffer(value, encodingOrOffset, length) } if (typeof value === 'string') { - return fromString(that, value, encodingOrOffset) + return fromString(value, encodingOrOffset) } - return fromObject(that, value) + return fromObject(value) } /** @@ -556,22 +802,14 @@ function from (that, value, encodingOrOffset, length) { * Buffer.from(arrayBuffer[, byteOffset[, length]]) **/ Buffer.from = function (value, encodingOrOffset, length) { - return from(null, value, encodingOrOffset, length) -} - -if (Buffer.TYPED_ARRAY_SUPPORT) { - Buffer.prototype.__proto__ = Uint8Array.prototype - Buffer.__proto__ = Uint8Array - if (typeof Symbol !== 'undefined' && Symbol.species && - Buffer[Symbol.species] === Buffer) { - // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 - Object.defineProperty(Buffer, Symbol.species, { - value: null, - configurable: true - }) - } + return from(value, encodingOrOffset, length) } +// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: +// https://github.com/feross/buffer/pull/148 +Buffer.prototype.__proto__ = Uint8Array.prototype +Buffer.__proto__ = Uint8Array + function assertSize (size) { if (typeof size !== 'number') { throw new TypeError('"size" argument must be a number') @@ -580,20 +818,20 @@ function assertSize (size) { } } -function alloc (that, size, fill, encoding) { +function alloc (size, fill, encoding) { assertSize(size) if (size <= 0) { - return createBuffer(that, size) + return createBuffer(size) } if (fill !== undefined) { // Only pay attention to encoding if it's a string. This // prevents accidentally sending in a number that would // be interpretted as a start offset. return typeof encoding === 'string' - ? createBuffer(that, size).fill(fill, encoding) - : createBuffer(that, size).fill(fill) + ? createBuffer(size).fill(fill, encoding) + : createBuffer(size).fill(fill) } - return createBuffer(that, size) + return createBuffer(size) } /** @@ -601,34 +839,28 @@ function alloc (that, size, fill, encoding) { * alloc(size[, fill[, encoding]]) **/ Buffer.alloc = function (size, fill, encoding) { - return alloc(null, size, fill, encoding) + return alloc(size, fill, encoding) } -function allocUnsafe (that, size) { +function allocUnsafe (size) { assertSize(size) - that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) - if (!Buffer.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < size; ++i) { - that[i] = 0 - } - } - return that + return createBuffer(size < 0 ? 0 : checked(size) | 0) } /** * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. * */ Buffer.allocUnsafe = function (size) { - return allocUnsafe(null, size) + return allocUnsafe(size) } /** * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. */ Buffer.allocUnsafeSlow = function (size) { - return allocUnsafe(null, size) + return allocUnsafe(size) } -function fromString (that, string, encoding) { +function fromString (string, encoding) { if (typeof encoding !== 'string' || encoding === '') { encoding = 'utf8' } @@ -638,32 +870,30 @@ function fromString (that, string, encoding) { } var length = byteLength(string, encoding) | 0 - that = createBuffer(that, length) + var buf = createBuffer(length) - var actual = that.write(string, encoding) + var actual = buf.write(string, encoding) if (actual !== length) { // Writing a hex string, for example, that contains invalid characters will // cause everything after the first invalid character to be ignored. (e.g. // 'abxxcd' will be treated as 'ab') - that = that.slice(0, actual) + buf = buf.slice(0, actual) } - return that + return buf } -function fromArrayLike (that, array) { +function fromArrayLike (array) { var length = array.length < 0 ? 0 : checked(array.length) | 0 - that = createBuffer(that, length) + var buf = createBuffer(length) for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 + buf[i] = array[i] & 255 } - return that + return buf } -function fromArrayBuffer (that, array, byteOffset, length) { - array.byteLength // this throws if `array` is not a valid ArrayBuffer - +function fromArrayBuffer (array, byteOffset, length) { if (byteOffset < 0 || array.byteLength < byteOffset) { throw new RangeError('\'offset\' is out of bounds') } @@ -672,49 +902,43 @@ function fromArrayBuffer (that, array, byteOffset, length) { throw new RangeError('\'length\' is out of bounds') } + var buf if (byteOffset === undefined && length === undefined) { - array = new Uint8Array(array) + buf = new Uint8Array(array) } else if (length === undefined) { - array = new Uint8Array(array, byteOffset) + buf = new Uint8Array(array, byteOffset) } else { - array = new Uint8Array(array, byteOffset, length) + buf = new Uint8Array(array, byteOffset, length) } - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = array - that.__proto__ = Buffer.prototype - } else { - // Fallback: Return an object instance of the Buffer class - that = fromArrayLike(that, array) - } - return that + // Return an augmented `Uint8Array` instance + buf.__proto__ = Buffer.prototype + return buf } -function fromObject (that, obj) { +function fromObject (obj) { if (Buffer.isBuffer(obj)) { var len = checked(obj.length) | 0 - that = createBuffer(that, len) + var buf = createBuffer(len) - if (that.length === 0) { - return that + if (buf.length === 0) { + return buf } - obj.copy(that, 0, 0, len) - return that + obj.copy(buf, 0, 0, len) + return buf } if (obj) { - if ((typeof ArrayBuffer !== 'undefined' && - obj.buffer instanceof ArrayBuffer) || 'length' in obj) { - if (typeof obj.length !== 'number' || isnan(obj.length)) { - return createBuffer(that, 0) + if (isArrayBufferView(obj) || 'length' in obj) { + if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { + return createBuffer(0) } - return fromArrayLike(that, obj) + return fromArrayLike(obj) } - if (obj.type === 'Buffer' && isArray(obj.data)) { - return fromArrayLike(that, obj.data) + if (obj.type === 'Buffer' && Array.isArray(obj.data)) { + return fromArrayLike(obj.data) } } @@ -722,11 +946,11 @@ function fromObject (that, obj) { } function checked (length) { - // Note: cannot use `length < kMaxLength()` here because that fails when + // Note: cannot use `length < K_MAX_LENGTH` here because that fails when // length is NaN (which is otherwise coerced to zero.) - if (length >= kMaxLength()) { + if (length >= K_MAX_LENGTH) { throw new RangeError('Attempt to allocate Buffer larger than maximum ' + - 'size: 0x' + kMaxLength().toString(16) + ' bytes') + 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes') } return length | 0 } @@ -739,7 +963,7 @@ function SlowBuffer (length) { } Buffer.isBuffer = function isBuffer (b) { - return !!(b != null && b._isBuffer) + return b != null && b._isBuffer === true } Buffer.compare = function compare (a, b) { @@ -785,7 +1009,7 @@ Buffer.isEncoding = function isEncoding (encoding) { } Buffer.concat = function concat (list, length) { - if (!isArray(list)) { + if (!Array.isArray(list)) { throw new TypeError('"list" argument must be an Array of Buffers') } @@ -818,8 +1042,7 @@ function byteLength (string, encoding) { if (Buffer.isBuffer(string)) { return string.length } - if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && - (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { + if (isArrayBufferView(string) || string instanceof ArrayBuffer) { return string.byteLength } if (typeof string !== 'string') { @@ -929,8 +1152,12 @@ function slowToString (encoding, start, end) { } } -// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect -// Buffer instances. +// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) +// to detect a Buffer instance. It's not possible to use `instanceof Buffer` +// reliably in a browserify context because there could be multiple different +// copies of the 'buffer' package in use. This method works even for Buffer +// instances that were created from another copy of the `buffer` package. +// See: https://github.com/feross/buffer/issues/154 Buffer.prototype._isBuffer = true function swap (b, n, m) { @@ -977,7 +1204,7 @@ Buffer.prototype.swap64 = function swap64 () { } Buffer.prototype.toString = function toString () { - var length = this.length | 0 + var length = this.length if (length === 0) return '' if (arguments.length === 0) return utf8Slice(this, 0, length) return slowToString.apply(this, arguments) @@ -1081,7 +1308,7 @@ function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { byteOffset = -0x80000000 } byteOffset = +byteOffset // Coerce to Number. - if (isNaN(byteOffset)) { + if (numberIsNaN(byteOffset)) { // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer byteOffset = dir ? 0 : (buffer.length - 1) } @@ -1110,8 +1337,7 @@ function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { return arrayIndexOf(buffer, val, byteOffset, encoding, dir) } else if (typeof val === 'number') { val = val & 0xFF // Search for a byte value [0-255] - if (Buffer.TYPED_ARRAY_SUPPORT && - typeof Uint8Array.prototype.indexOf === 'function') { + if (typeof Uint8Array.prototype.indexOf === 'function') { if (dir) { return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) } else { @@ -1213,7 +1439,7 @@ function hexWrite (buf, string, offset, length) { } for (var i = 0; i < length; ++i) { var parsed = parseInt(string.substr(i * 2, 2), 16) - if (isNaN(parsed)) return i + if (numberIsNaN(parsed)) return i buf[offset + i] = parsed } return i @@ -1252,15 +1478,14 @@ Buffer.prototype.write = function write (string, offset, length, encoding) { offset = 0 // Buffer#write(string, offset[, length][, encoding]) } else if (isFinite(offset)) { - offset = offset | 0 + offset = offset >>> 0 if (isFinite(length)) { - length = length | 0 + length = length >>> 0 if (encoding === undefined) encoding = 'utf8' } else { encoding = length length = undefined } - // legacy write(string, encoding, offset, length) - remove in v0.13 } else { throw new Error( 'Buffer.write(string, encoding, offset[, length]) is no longer supported' @@ -1459,7 +1684,7 @@ function utf16leSlice (buf, start, end) { var bytes = buf.slice(start, end) var res = '' for (var i = 0; i < bytes.length; i += 2) { - res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) + res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256)) } return res } @@ -1485,18 +1710,9 @@ Buffer.prototype.slice = function slice (start, end) { if (end < start) end = start - var newBuf - if (Buffer.TYPED_ARRAY_SUPPORT) { - newBuf = this.subarray(start, end) - newBuf.__proto__ = Buffer.prototype - } else { - var sliceLen = end - start - newBuf = new Buffer(sliceLen, undefined) - for (var i = 0; i < sliceLen; ++i) { - newBuf[i] = this[i + start] - } - } - + var newBuf = this.subarray(start, end) + // Return an augmented `Uint8Array` instance + newBuf.__proto__ = Buffer.prototype return newBuf } @@ -1509,8 +1725,8 @@ function checkOffset (offset, ext, length) { } Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 + offset = offset >>> 0 + byteLength = byteLength >>> 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] @@ -1524,8 +1740,8 @@ Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) } Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 + offset = offset >>> 0 + byteLength = byteLength >>> 0 if (!noAssert) { checkOffset(offset, byteLength, this.length) } @@ -1540,21 +1756,25 @@ Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) } Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + offset = offset >>> 0 if (!noAssert) checkOffset(offset, 1, this.length) return this[offset] } Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + offset = offset >>> 0 if (!noAssert) checkOffset(offset, 2, this.length) return this[offset] | (this[offset + 1] << 8) } Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + offset = offset >>> 0 if (!noAssert) checkOffset(offset, 2, this.length) return (this[offset] << 8) | this[offset + 1] } Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return ((this[offset]) | @@ -1564,6 +1784,7 @@ Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { } Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] * 0x1000000) + @@ -1573,8 +1794,8 @@ Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { } Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 + offset = offset >>> 0 + byteLength = byteLength >>> 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] @@ -1591,8 +1812,8 @@ Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { } Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 + offset = offset >>> 0 + byteLength = byteLength >>> 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var i = byteLength @@ -1609,24 +1830,28 @@ Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { } Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + offset = offset >>> 0 if (!noAssert) checkOffset(offset, 1, this.length) if (!(this[offset] & 0x80)) return (this[offset]) return ((0xff - this[offset] + 1) * -1) } Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + offset = offset >>> 0 if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset] | (this[offset + 1] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + offset = offset >>> 0 if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset + 1] | (this[offset] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset]) | @@ -1636,6 +1861,7 @@ Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { } Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] << 24) | @@ -1645,21 +1871,25 @@ Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { } Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, true, 23, 4) } Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + offset = offset >>> 0 if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, false, 23, 4) } Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + offset = offset >>> 0 if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, true, 52, 8) } Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + offset = offset >>> 0 if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, false, 52, 8) } @@ -1672,8 +1902,8 @@ function checkInt (buf, value, offset, ext, max, min) { Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { value = +value - offset = offset | 0 - byteLength = byteLength | 0 + offset = offset >>> 0 + byteLength = byteLength >>> 0 if (!noAssert) { var maxBytes = Math.pow(2, 8 * byteLength) - 1 checkInt(this, value, offset, byteLength, maxBytes, 0) @@ -1691,8 +1921,8 @@ Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { value = +value - offset = offset | 0 - byteLength = byteLength | 0 + offset = offset >>> 0 + byteLength = byteLength >>> 0 if (!noAssert) { var maxBytes = Math.pow(2, 8 * byteLength) - 1 checkInt(this, value, offset, byteLength, maxBytes, 0) @@ -1710,89 +1940,57 @@ Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { value = +value - offset = offset | 0 + offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) this[offset] = (value & 0xff) return offset + 1 } -function objectWriteUInt16 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { - buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> - (littleEndian ? i : 1 - i) * 8 - } -} - Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { value = +value - offset = offset | 0 + offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - } else { - objectWriteUInt16(this, value, offset, true) - } + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) return offset + 2 } Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { value = +value - offset = offset | 0 + offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8) - this[offset + 1] = (value & 0xff) - } else { - objectWriteUInt16(this, value, offset, false) - } + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) return offset + 2 } -function objectWriteUInt32 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffffffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { - buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff - } -} - Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { value = +value - offset = offset | 0 + offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset + 3] = (value >>> 24) - this[offset + 2] = (value >>> 16) - this[offset + 1] = (value >>> 8) - this[offset] = (value & 0xff) - } else { - objectWriteUInt32(this, value, offset, true) - } + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = (value & 0xff) return offset + 4 } Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { value = +value - offset = offset | 0 + offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = (value & 0xff) - } else { - objectWriteUInt32(this, value, offset, false) - } + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) return offset + 4 } Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { value = +value - offset = offset | 0 + offset = offset >>> 0 if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1) + var limit = Math.pow(2, (8 * byteLength) - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } @@ -1813,9 +2011,9 @@ Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, no Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { value = +value - offset = offset | 0 + offset = offset >>> 0 if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1) + var limit = Math.pow(2, (8 * byteLength) - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } @@ -1836,9 +2034,8 @@ Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, no Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { value = +value - offset = offset | 0 + offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) if (value < 0) value = 0xff + value + 1 this[offset] = (value & 0xff) return offset + 1 @@ -1846,58 +2043,42 @@ Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { value = +value - offset = offset | 0 + offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - } else { - objectWriteUInt16(this, value, offset, true) - } + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) return offset + 2 } Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { value = +value - offset = offset | 0 + offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8) - this[offset + 1] = (value & 0xff) - } else { - objectWriteUInt16(this, value, offset, false) - } + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) return offset + 2 } Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { value = +value - offset = offset | 0 + offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - this[offset + 2] = (value >>> 16) - this[offset + 3] = (value >>> 24) - } else { - objectWriteUInt32(this, value, offset, true) - } + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) return offset + 4 } Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { value = +value - offset = offset | 0 + offset = offset >>> 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (value < 0) value = 0xffffffff + value + 1 - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = (value & 0xff) - } else { - objectWriteUInt32(this, value, offset, false) - } + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) return offset + 4 } @@ -1907,6 +2088,8 @@ function checkIEEE754 (buf, value, offset, ext, max, min) { } function writeFloat (buf, value, offset, littleEndian, noAssert) { + value = +value + offset = offset >>> 0 if (!noAssert) { checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) } @@ -1923,6 +2106,8 @@ Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) } function writeDouble (buf, value, offset, littleEndian, noAssert) { + value = +value + offset = offset >>> 0 if (!noAssert) { checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) } @@ -1971,7 +2156,7 @@ Buffer.prototype.copy = function copy (target, targetStart, start, end) { for (i = len - 1; i >= 0; --i) { target[i + targetStart] = this[i + start] } - } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { + } else if (len < 1000) { // ascending copy from start for (i = 0; i < len; ++i) { target[i + targetStart] = this[i + start] @@ -2040,7 +2225,7 @@ Buffer.prototype.fill = function fill (val, start, end, encoding) { } else { var bytes = Buffer.isBuffer(val) ? val - : utf8ToBytes(new Buffer(val, encoding).toString()) + : new Buffer(val, encoding) var len = bytes.length for (i = 0; i < end - start; ++i) { this[i + start] = bytes[i % len] @@ -2053,11 +2238,11 @@ Buffer.prototype.fill = function fill (val, start, end, encoding) { // HELPER FUNCTIONS // ================ -var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g +var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g function base64clean (str) { // Node strips out invalid characters like \n and \t from the string, base64-js does not - str = stringtrim(str).replace(INVALID_BASE64_RE, '') + str = str.trim().replace(INVALID_BASE64_RE, '') // Node converts strings with length < 2 to '' if (str.length < 2) return '' // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not @@ -2067,11 +2252,6 @@ function base64clean (str) { return str } -function stringtrim (str) { - if (str.trim) return str.trim() - return str.replace(/^\s+|\s+$/g, '') -} - function toHex (n) { if (n < 16) return '0' + n.toString(16) return n.toString(16) @@ -2194,13 +2374,16 @@ function blitBuffer (src, dst, offset, length) { return i } -function isnan (val) { - return val !== val // eslint-disable-line no-self-compare +// Node 0.10 supports `ArrayBuffer` but lacks `ArrayBuffer.isView` +function isArrayBufferView (obj) { + return (typeof ArrayBuffer.isView === 'function') && ArrayBuffer.isView(obj) } -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +function numberIsNaN (obj) { + return obj !== obj // eslint-disable-line no-self-compare +} -},{"base64-js":1,"ieee754":15,"isarray":19}],6:[function(require,module,exports){ +},{"base64-js":3,"ieee754":17}],8:[function(require,module,exports){ 'use strict'; module.exports = earcut; @@ -2846,7 +3029,7 @@ earcut.flatten = function (data) { return result; }; -},{}],7:[function(require,module,exports){ +},{}],9:[function(require,module,exports){ 'use strict'; var OneVersionConstraint = require('individual/one-version'); @@ -2868,7 +3051,7 @@ function EvStore(elem) { return hash; } -},{"individual/one-version":17}],8:[function(require,module,exports){ +},{"individual/one-version":19}],10:[function(require,module,exports){ 'use strict'; var request = require('./request'); var buildQueryObject = require('./buildQueryObject'); @@ -2969,7 +3152,7 @@ XMLHttpSource['default'] = XMLHttpSource; // commonjs module.exports = XMLHttpSource; -},{"./buildQueryObject":9,"./request":12}],9:[function(require,module,exports){ +},{"./buildQueryObject":11,"./request":14}],11:[function(require,module,exports){ 'use strict'; module.exports = function buildQueryObject(url, method, queryData) { var qData = []; @@ -2998,7 +3181,7 @@ module.exports = function buildQueryObject(url, method, queryData) { return data; }; -},{}],10:[function(require,module,exports){ +},{}],12:[function(require,module,exports){ (function (global){ 'use strict'; // Get CORS support even for older IE @@ -3015,7 +3198,7 @@ module.exports = function getCORSRequest() { }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],11:[function(require,module,exports){ +},{}],13:[function(require,module,exports){ (function (global){ 'use strict'; module.exports = function getXMLHttpRequest() { @@ -3044,7 +3227,7 @@ module.exports = function getXMLHttpRequest() { }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],12:[function(require,module,exports){ +},{}],14:[function(require,module,exports){ 'use strict'; var getXMLHttpRequest = require('./getXMLHttpRequest'); var getCORSRequest = require('./getCORSRequest'); @@ -3267,7 +3450,7 @@ function onXhrError(observer, xhr, status, e) { module.exports = request; -},{"./getCORSRequest":10,"./getXMLHttpRequest":11}],13:[function(require,module,exports){ +},{"./getCORSRequest":12,"./getXMLHttpRequest":13}],15:[function(require,module,exports){ (function (global){ !function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.falcor=t()}}(function(){var t;return function e(t,n,r){function o(s,u){if(!n[s]){if(!t[s]){var a="function"==typeof require&&require;if(!u&&a)return a(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return o(n?n:e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s1&&!Array.isArray(r)||0===e&&!Array.isArray(r)&&"string"!==o||1===e&&!Array.isArray(r)&&!x(r))return new u(function(t){t.onError(new Error("Invalid argument"))})}return c.create(this,t)},r.prototype.invalidate=function(){var t,e=-1,n=arguments.length,r=arguments[n-1];for(t=new Array(n);++e0){var n=o.Observable.of(t);return t.get.apply(t,u)["catch"](o.Observable.empty()).concat(n).last().flatMap(function(){return r(e,a)}).filter(function(t){return t})}return o.Observable["return"](t)}if(s>0){var i=u.map(function(t){return a.concat(t)});return e.get.apply(e,i).concat(o.Observable.defer(function(){return r(e,a)})).last().filter(function(t){return t})}return o.Observable.empty()})}},{134:134,159:159}],6:[function(t,e,n){var r=t(134),o=t(13),i=t(8),s=t(118);e.exports=function(t){var e=r.fromPath(t);if(!Array.isArray(e))throw new Error("Model#derefSync must be called with an Array path.");var n=o(this,this._path.concat(e),!1),u=n.path,a=n.value,c=n.found;if(c&&void 0!==a&&(a.$type!==s||void 0!==a.value)){if(a.$type)throw new i;return this._clone({_path:u})}}},{118:118,13:13,134:134,8:8}],7:[function(t,e,n){function r(){this.message=r.message,this.stack=(new Error).stack}r.prototype=new Error,r.prototype.name="BoundJSONGraphModelError",r.message="It is not legal to use the JSON Graph format from a bound Model. JSON Graph format can only be used from a root model.",e.exports=r},{}],8:[function(t,e,n){function r(t,e){this.message=i,this.stack=(new Error).stack,this.boundPath=t,this.shortedPath=e}var o="InvalidModelError",i="The boundPath of the model is not valid since a value or error was found before the path end.";r.prototype=new Error,r.prototype.name=o,r.message=i,e.exports=r},{}],9:[function(t,e,n){function r(t){this.message="An exception was thrown when making a request.",this.stack=(new Error).stack,this.innerError=t}var o="InvalidSourceError";r.prototype=new Error,r.prototype.name=o,r.is=function(t){return t&&t.name===o},e.exports=r},{}],10:[function(t,e,n){function r(){this.message="The allowed number of retries have been exceeded.",this.stack=(new Error).stack}var o="MaxRetryExceededError";r.prototype=new Error,r.prototype.name=o,r.is=function(t){return t&&t.name===o},e.exports=r},{}],11:[function(t,e,n){function r(t,e,n,r,o,h,f){for(var l,d,v=n,y=o,b=r,m=0;;){if(0===m&&b[c]?(m=y.length,d=b[c]):(l=y[m++],d=v[l]),d){var g=d.$type,w=g&&d.value||d;if(m_;_++)x[_]=y[_];y=x}return[v,y]}var o=t(26),i=o.create,s=t(22),u=t(27),a=t(120),c=t(33),p=t(29).promote;e.exports=r},{120:120,22:22,26:26,27:27,29:29,33:33}],12:[function(t,e,n){var r=t(15),o=t(8),i=t(7);e.exports=function(t,e){return function(n,s,u){var a,c,p,h=u[0],f={values:u,optimizedPaths:[]},l=n._root.cache,d=n._path,v=l,y=d.length,b=[];if(y){if(e)return{criticalError:new i};if(v=r(n,d),v.$type)return{criticalError:new o(d,d)};for(a=[],c=0;y>c;++c)a[c]=d[c]}else a=[],y=0;for(c=0,p=s.length;p>c;c++)t(n,l,v,s[c],0,h,f,b,a,y,e);return f}}},{15:15,7:7,8:8}],13:[function(t,e,n){var r=t(17),o=t(8);e.exports=function(t,e,n){var i,s,u,a,c,p=e,h=e;for(i=t._boxed,n=t._materialized,s=t._treatErrorsAsValues,t._boxed=!0,t._materialized=void 0===n||n,t._treatErrorsAsValues=!0,u=r(t,p.concat(null),!0),t._boxed=i,t._materialized=n,t._treatErrorsAsValues=s,p=u.optimizedPath,a=u.shorted,c=u.found,u=u.value;p.length&&null===p[p.length-1];)p.pop();if(c&&a)throw new o(h,p);return{path:p,value:u,shorted:a,found:c}}},{17:17,8:8}],14:[function(t,e,n){function r(t){var e,n,r,o={},i=Object.keys(t);for(n=0,r=i.length;r>n;n++)e=i[n],s(e)||(o[e]=t[e]);return o}function o(t,e,n){Object.keys(t).filter(function(e){return!s(e)&&t[e]}).forEach(function(n){var s=t[n],u=e[n];if(u||(u=e[n]={}),s.$type){var a,c=s.value&&"object"==typeof s.value,p=!t[i];return a=c||p?r(s):s.value,void(e[n]=a)}o(s,u,n)})}var i=t(37),s=t(97);e.exports=function(t){var e={};return o(t,e),e}},{37:37,97:97}],15:[function(t,e,n){e.exports=function(t,e){for(var n=t._root.cache,r=-1,o=e.length;++rw;){if(p=e[w++],null!==p&&(x=_[p],b[b.length]=p),!x){S=void 0,m=!0,E=!1;break}if(f=x.$type,f===a&&void 0===x.value){S=void 0,E=!1,m=y>w;break}if(y>w){if(f===u){if(i(x)){C=!0,S=void 0,E=!1;break}if(l=r(t,v,v,x,x.value),d=l[0],!d){S=void 0,x=void 0,E=!1;break}f=d.$type,x=d,b=l[1].slice(0)}if(f)break}else S=x;_=x}if(y>w&&!C){for(h=w;y>h;++h)if(null!==e[w]){g=!0;break}for(g?(m=!0,S=void 0):S=x,h=w;y>h;++h)null!==e[h]&&(b[b.length]=e[h])}if(S&&f&&(i(S)?S=void 0:s(t,S)),S&&f===c&&!t._treatErrorsAsValues)throw{path:w===y?e:e.slice(0,w),value:S.value};return S&&t._boxed?S=Boolean(f)&&!n?o(S):S:!S&&t._materialized?S={$type:a}:S&&(S=S.value),{value:S,shorted:m,optimizedPath:b,found:E}}},{11:11,118:118,119:119,120:120,25:25,27:27,29:29}],18:[function(t,e,n){var r=t(46);e.exports=function(t,e){var n=t._getValueSync({_boxed:!0,_root:t._root,_treatErrorsAsValues:t._treatErrorsAsValues},e,!0).value,o=n&&n[r];return null==o?-1:o}},{46:46}],19:[function(t,e,n){var r=t(12),o=t(31),i=r(o,!1),s=r(o,!0);e.exports={getValueSync:t(17),getBoundValue:t(13),getWithPathsAsPathMap:i,getWithPathsAsJSONGraph:s}},{12:12,13:13,17:17,31:31}],20:[function(t,e,n){var r=t(29),o=t(25),i=r.promote;e.exports=function(t,e,n,r,s){var u=e.value;s.errors||(s.errors=[]),t._boxed&&(u=o(e)),s.errors.push({path:r.slice(0,n+1),value:u}),i(t,e)}},{25:25,29:29}],21:[function(t,e,n){function r(t,e,n,r,o,i,s){s.requestedMissingPaths.push(r.slice(0,n).concat(e)),s.optimizedMissingPaths.push(o.slice(0,i).concat(e))}var o=t(30),i=o.fastCopy;e.exports=function(t,e,n,o,s,u,a){var c;o.requestedMissingPaths||(o.requestedMissingPaths=[],o.optimizedMissingPaths=[]),c=ny;y++)g=f[y],w[g]||(w[g]={}),w=w[g];g=f[y],w[g]=E?{$type:u}:S,h&&n.paths.push(h.slice(0,r))}else if(0===r)n.json=S;else{for(w=n.json,w||(w=n.json={}),y=0;r-1>y;y++)m=h[y],w[m]||(w[m]={}),x=w,_=m,w=w[m];m=h[y],null!==m?w[m]=S:x[_]=S}}}},{118:118,119:119,120:120,25:25,29:29,37:37}],23:[function(t,e,n){var r=t(27),o=t(26),i=t(29),s=o.remove,u=i.splice,a=t(119),c=t(20),p=t(22),h=t(21),f=t(28),l=t(35);e.exports=function(t,e,n,o,i,d,v,y,b,m,g){var w=e&&e.$type,x=e&&void 0===e.value;return e&&w?void(r(e)?(e[l]||(u(t,e),s(e)),h(t,n,o,d,v,y,b)):w===a?(g&&(v[o]=null),m||t._treatErrorsAsValues?p(t,e,i,o,d,v,y,b,m,g):c(t,e,o,v,d)):(g&&(v[o]=null),(!x||x&&t._materialized)&&p(t,e,i,o,d,v,y,b,m,g))):void(f(t)?p(t,e,i,o,d,v,y,b,m,g):h(t,n,o,d,v,y,b))}},{119:119,20:20,21:21,22:22,26:26,27:27,28:28,29:29,35:35}],24:[function(t,e,n){var r=t(134);e.exports=function(t){var e=r.fromPath(t);if(Array.isArray(e)===!1)throw new Error("Model#getValueSync must be called with an Array path.");return this._path.length&&(e=this._path.concat(e)),this._syncCheck("getValueSync")&&this._getValueSync(this,e).value}},{134:134}],25:[function(t,e,n){var r=t(40);e.exports=function(t){var e,n,o,i=Object.keys(t);for(e={},n=0,o=i.length;o>n;n++){var s=i[n];s[0]!==r&&(e[s]=t[s])}return e}},{40:40}],26:[function(t,e,n){function r(t,e){var n=e[a]||0;e[i+n]=t,e[a]=n+1,t[u]=n,t[s]=e}function o(t){var e=t[s];if(e){for(var n=t[u],r=e[a];r>n;)e[i+n]=e[i+n+1],++n;e[a]=r-1,t[s]=void 0,t[u]=void 0}}var i=t(43),s=t(33),u=t(42),a=t(44);e.exports={create:r,remove:o}},{33:33,42:42,43:43,44:44}],27:[function(t,e,n){var r=t(106);e.exports=function(t){var e=void 0===t.$expires&&-1||t.$expires;return-1!==e&&1!==e&&(0===e||eo;r++,o++)i[r]=t[o];return i}function o(t,e){var n,r,o,i=[];for(n=0,r=t.length;r>n;n++)i[n]=t[n];for(o=0,r=e.length;r>o;o++)null!==e[o]&&(i[n++]=e[o]);return i}function i(t,e){var n,r,o,i=[];for(n=0,r=t.length;r>n;n++)i[n]=t[n];for(o=0,r=e.length;r>o;o++)i[n++]=e[o];return i}e.exports={fastCat:i,fastCatSkipNulls:o,fastCopy:r}},{}],31:[function(t,e,n){var r=t(11),o=t(23),i=t(27),s=t(143).iterateKeySet,u=t(120),a=t(29).promote;e.exports=function c(t,e,n,p,h,f,l,d,v,y,b,m){var g=m,w=v;if(!n||n&&n.$type||h===p.length)return void o(t,n,p,h,f,l,d,w,y,b,g);var x,_;x=p[h];var S="object"==typeof x,E=h+1,C=!1,A=x;if(S&&(C={},A=s(x,C)),void 0!==A||!C.done){var N=y+1;do{g=!1;var k;null===A?k=n:(k=n[A],w[y]=A,d[h]=A);var O=w,P=N;if(k){var j=k.$type,D=j&&k.value||k;if(E_;++_)O[_]=R[_]}}c(t,e,k,p,E,f,l,d,O,P,b,g),C&&!C.done&&(A=s(x,C))}while(C&&!C.done)}}},{11:11,120:120,143:143,23:23,27:27,29:29}],32:[function(t,e,n){"use strict";function r(t){return new r.Model(t)}"function"==typeof Promise?r.Promise=Promise:r.Promise=t(151),e.exports=r,r.Model=t(2)},{151:151,2:2}],33:[function(t,e,n){e.exports=t(40)+"context"},{40:40}],34:[function(t,e,n){e.exports=t(40)+"head"},{40:40}],35:[function(t,e,n){e.exports=t(40)+"invalidated"},{40:40}],36:[function(t,e,n){e.exports=t(40)+"key"},{40:40}],37:[function(t,e,n){e.exports="$modelCreated"},{}],38:[function(t,e,n){e.exports=t(40)+"next"},{40:40}],39:[function(t,e,n){e.exports=t(40)+"parent"},{40:40}],40:[function(t,e,n){e.exports=String.fromCharCode(30)},{}],41:[function(t,e,n){e.exports=t(40)+"prev"},{40:40}],42:[function(t,e,n){e.exports=t(40)+"ref-index"},{40:40}],43:[function(t,e,n){e.exports=t(40)+"ref"},{40:40}],44:[function(t,e,n){e.exports=t(40)+"refs-length"},{40:40}],45:[function(t,e,n){e.exports=t(40)+"tail"},{40:40}],46:[function(t,e,n){e.exports=t(40)+"version"},{40:40}],47:[function(t,e,n){function r(t,e,n,o,s,u,c,p,h,f){if(!_(t)&&!t.$type)for(var l in t)if(l[0]!==a&&"$"!==l[0]&&m(t,l)){var d=t[l],v=g(d)&&!d.$type,y=i(n,o,s,l,d,v,!1,u,c,p,h,f),w=y[0],x=y[1];w&&(v?r(d,e+1,n,x,w,u,c,p,h,f):A(w,x,l,p)&&C(x,b(w),p,u))}}function o(t,e,n,r,o,s,a,h){if(w(n))return S(n,o,s),[void 0,e];y(s,n);var d=n,v=n.value,b=e;if(n=n[p],null!=n)b=n[c]||e;else{var m=0,g=v.length-1;b=n=e;do{var x=v[m],E=g>m,C=i(e,b,n,x,t,E,!0,r,o,s,a,h);if(n=C[0],_(n))return C;b=C[1]}while(m++d,_=i(t,l,e,m,x,!0,n,r,o);if(e=_[0],g(e))return _;l=_[1]}while(d++=h){var x=t[s];for(b=x;d>=w&&b;)x=x[a],m=b.$size||0,d-=m,g===!0&&p(b,m,t,l),b=x;t[s]=t[a]=b,null==b?t[i]=t[u]=void 0:b[u]=void 0}}},{108:108,115:115,34:34,36:36,38:38,39:39,41:41,45:45}],50:[function(t,e,n){var r=t(121),o=t(34),i=t(45),s=t(38),u=t(41),a=t(100);e.exports=function(t,e){if(a(e)&&e.$expires!==r){var n=t[o],c=t[i],p=e[s],h=e[u];e!==n&&(null!=p&&"object"==typeof p&&(p[u]=h),null!=h&&"object"==typeof h&&(h[s]=p),p=n,null!=n&&"object"==typeof n&&(n[u]=e),t[o]=t[s]=n=e,n[s]=p,n[u]=void 0),null!=c&&e!==c||(t[i]=t[u]=c=h||e)}return e}},{100:100,121:121,34:34,38:38,41:41,45:45}],51:[function(t,e,n){var r=t(34),o=t(45),i=t(38),s=t(41);e.exports=function(t,e){var n=t[r],u=t[o],a=e[i],c=e[s];null!=a&&"object"==typeof a&&(a[s]=c),null!=c&&"object"==typeof c&&(c[i]=a),e===n&&(t[r]=t[i]=a),e===u&&(t[o]=t[s]=c),e[i]=e[s]=void 0,n=u=a=c=void 0}},{34:34,38:38,41:41,45:45}],52:[function(t,e,n){function r(t,e){var n=!1;return function(){if(!n&&!t._disposed){n=!0,t._callbacks[e]=null,t._optimizedPaths[e]=[],t._requestedPaths[e]=[];var r=--t._count;0!==r||t.sent||(t._disposable.dispose(),t.requestQueue.removeRequest(t))}}}function o(t){for(var e=[],n=-1,r=0,o=t.length;o>r;++r)for(var i=t[r],s=0,u=i.length;u>s;++s)e[++n]=i[s];return e}var i=t(59),s=t(60),u=0,a=t(57).GetRequest,c=t(76),p=t(78),h=t(119),f=[],l=function(t,e){this.sent=!1,this.scheduled=!1,this.requestQueue=e,this.id=++u,this.type=a,this._scheduler=t,this._pathMap={},this._optimizedPaths=[],this._requestedPaths=[],this._callbacks=[],this._count=0,this._disposable=null,this._collapsed=null,this._disposed=!1};l.prototype={batch:function(t,e,n){var o=this,i=o._optimizedPaths,u=o._requestedPaths,a=o._callbacks,c=i.length;return i[c]=e,u[c]=t,a[c]=n,++o._count,o.scheduled||(o.scheduled=!0,o._disposable=o._scheduler.schedule(function(){s(o,i,function(t,e){if(o.requestQueue.removeRequest(o),o._disposed=!0,o._count){o._merge(u,t,e);for(var n=0,r=a.length;r>n;++n){var i=a[n];i&&i(t,e)}}})})),r(o,c)},add:function(t,e,n){var o,s,u=this,a=i(t,e,u._pathMap);a?(s=a[2],o=a[1]):(s=t,o=e);var c=!1,p=!1;if(o.lengthi){if(null==c){if(e)return!1;c=u[a]=Object.create(null)}if(this.insertPath(t,e,c,i+1,s)===!1)return!1}else u[a]=(c||0)+1,this.length+=1;h.done||(a=f(p,h))}while(!h.done);return!0},r.prototype.removePath=function(t,e,n,r){var o=n||0,i=r||t.length-1,s=e||this.pathmaps[i+1];if(void 0===s||null===s)return!0;var u,a,c=0,p=t[o],h={};u=f(p,h);do if(a=s[u],void 0!==a&&null!==a){if(i>o){c+=this.removePath(t,a,o+1,i);var l=void 0;for(l in a)break;void 0===l&&delete s[u]}else a=s[u]=(a||1)-1,0===a&&delete s[u],c+=1,this.length-=1;h.done||(u=f(p,h))}while(!h.done);return c},r.prototype.getSourceObserver=function(t){var e=this;return i.create(function(n){n.jsonGraph=n.jsonGraph||n.jsong||n.values||n.value,n.index=e.index,t.onNext(n)},function(e){t.onError(e)},function(){t.onCompleted()})},r.prototype._subscribe=function(t){var e=this,n=this.queue;e.pending=!0;var r=!1,o=new a,i=u.create(function(){r||(r=!0,n&&n._remove(e))}),s=new c(o,i);try{o.setDisposable(this.model._source[this.method](this.getSourceArgs()).subscribe(this.getSourceObserver(t)))}catch(h){throw new p(h)}return s},e.exports=r},{143:143,159:159,9:9}],54:[function(t,e,n){function r(t,e){this.total=0,this.model=t,this.requests=[],this.scheduler=e}var o=t(58),i=t(40),s=t(90),u=t(100),a=t(143);r.prototype.set=function(t){return t.paths=a.collapse(t.paths),o.create(this.model,t)},r.prototype._remove=function(t){var e=this.requests,n=e.indexOf(t);-1!==n&&e.splice(n,1)},r.prototype.distributePaths=function(t,e,n){var r,o,i=this.model,s=-1,u=t.length,a=-1,c=e.length,p=[];t:for(;++s-1;){for(var h=r[n-1],f=o[n-1],l=a[n-1]||(a[n-1]=Object.keys(f));l.length>0;){var d=l.pop();if(d[0]!==i)if(h.hasOwnProperty(d)){var v=h[d],y=s(v),b=f[d],m=s(b);if(u(v)&&u(b)&&!y&&!m){r[n]=v,o[n]=b,n+=1;continue t}p>c&&(h[d]=b)}else h[d]=f[d]}n-=1}return t},e.exports=r},{100:100,143:143,40:40,58:58,90:90}],55:[function(t,e,n){function r(t,e){this.model=t,this.scheduler=e,this.requests=this._requests=[]}var o=t(54),i=t(56);r.prototype.get=i.prototype.get,r.prototype.removeRequest=i.prototype.removeRequest,r.prototype.set=o.prototype.set,r.prototype.call=o.prototype.call,e.exports=r},{54:54,56:56}],56:[function(t,e,n){function r(t,e){this.model=t,this.scheduler=e,this.requests=this._requests=[]}var o=t(57),i=t(52);r.prototype={setScheduler:function(t){this.scheduler=t},get:function(t,e,n){function r(){v||(--h,0===h&&n())}var s,u,a,c=this,p=[],h=0,f=c._requests,l=e,d=t,v=!1;for(s=0,u=f.length;u>s;++s)if(a=f[s],a.type===o.GetRequest){if(a.sent){var y=a.add(d,l,r);y[0]&&(d=y[1],l=y[2],p[p.length]=y[3],++h)}else a.batch(d,l,r),l=[],d=[],++h;if(!l.length)break}if(l.length){a=new i(c.scheduler,c),f[f.length]=a,++h;var b=a.batch(d,l,r);p[p.length]=b}return function(){if(!v&&0!==h){v=!0;for(var t=p.length,e=0;t>e;++e)p[e]()}}},removeRequest:function(t){for(var e=this._requests,n=e.length;--n>=0;)if(e[n].id===t.id){e.splice(n,1);break}}},e.exports=r},{52:52,57:57}],57:[function(t,e,n){e.exports={GetRequest:"GET"}},{}],58:[function(t,e,n){function r(){s.call(this)}var o=t(159),i=o.Observer,s=t(53),u=t(83),a=t(76),c=t(78),p=new Array(0);r.create=function(t,e){var n=new r;return n.model=t,n.jsonGraphEnvelope=e,n},r.prototype=Object.create(s.prototype),r.prototype.constructor=r,r.prototype.method="set",r.prototype.insertPath=function(){return!1},r.prototype.removePath=function(){return 0},r.prototype.getSourceArgs=function(){return this.jsonGraphEnvelope},r.prototype.getSourceObserver=function(t){var e=this.model,n=e._path,r=this.jsonGraphEnvelope.paths,o=e._root,h=o.errorSelector,f=o.comparator;return s.prototype.getSourceObserver.call(this,i.create(function(o){e._path=p;var i=a(e,[{paths:r,jsonGraph:o.jsonGraph}],null,h,f);o.paths=i[1],e._path=n,t.onNext(o)},function(o){e._path=p,c(e,u(r,function(t){return{path:t,value:o}}),null,h,f),e._path=n,t.onError(o)},function(){t.onCompleted()}))},e.exports=r},{159:159,53:53,76:76,78:78,83:83}],59:[function(t,e,n){var r=t(143).hasIntersection,o=t(84);e.exports=function(t,e,n){for(var i=[],s=[],u=[],a=-1,c=-1,p=!1,h=0,f=e.length;f>h;++h){var l=e[h],d=n[l.length];d&&r(d,l,0)?(!p&&h>0&&(s=o(t,0,h),i=o(e,0,h)),u[++a]=t[h],p=!0):p&&(i[++c]=l,s[c]=t[h])}return p?[u,i,s]:null}},{143:143,84:84}],60:[function(t,e,n){var r=t(143),o=r.toTree,i=r.toPaths;e.exports=function(t,e,n){if(0===t._count)return void t.requestQueue.removeRequest(t);t.sent=!0,t.scheduled=!1;for(var r=t._pathMap,s=Object.keys(e),u=0,a=s.length;a>u;++u)for(var c=e[u],p=0,h=c.length;h>p;++p){var f=c[p],l=f.length;if(r[l]){var d=r[l];d[d.length]=f}else r[l]=[f]}for(var v=Object.keys(r),y=0,b=v.length;b>y;++y){var m=v[y];r[m]=o(r[m])}var g,w=t._collasped=i(r);t.requestQueue.model._source.get(w).subscribe(function(t){g=t},function(t){n(t,g)},function(){n(null,g)})}},{143:143}],61:[function(t,e,n){function r(t){u.call(this,t||i)}function o(t){return s.Observable.defer(function(){return t})}function i(t){function e(t){function e(t,e){if(Boolean(e.invalidated))t.invalidations.push(t.localThisPath.concat(e.path));else{var n=e.path,r=e.value;Boolean(r)&&"object"==typeof r&&r.$type===f?t.references.push({path:i(n),value:e.value}):t.values.push({path:i(n),value:e.value})}return t}function n(t){var e=t.values.concat(t.references);return e.length>0?o(g.set.apply(g,e)._toJSONG()).map(function(e){return{results:t,envelope:e}}):u["return"]({results:t,envelope:{jsonGraph:{},paths:[]}})}function r(t){var e,n=t.envelope,r=t.results,c=r.values,p=r.references,h=r.invalidations,f=c.map(a).map(i),l=p.reduce(s,[]),d=b.map(i),v=l.concat(d);return e=v.length>0?o(m.get.apply(m,f.concat(v))._toJSONG()):u["return"](n),e.doAction(function(t){t.invalidated=h})}function s(t,e){var n=e.path;return t.push.apply(t,y.map(function(t){return n.concat(t)})),t}function a(t){return t.path}var c=t&&t.localFn;if("function"==typeof c){var p=t.model,h=p._path,l=c.apply(p,v).reduce(e,{values:[],references:[],invalidations:[],localThisPath:h}).flatMap(n).flatMap(r);return u["return"](l)}return u.empty()}function n(t){function e(t){var e=t.invalidated;return e&&e.length&&m.invalidate.apply(m,e),t}return t&&"object"==typeof t?s.Observable.defer(function(){ var e;try{e=t.call(x,v,y,b)}catch(n){e=u["throw"](new p(n))}return e}).map(e):u.empty()}function r(t){return o(g.set(t)).reduce(function(t){return t},null).map(function(){return{invalidated:t.invalidated,paths:t.paths.map(function(t){return t.slice(w.length)})}})}function i(t){return _.concat(t)}var c=this.args,l=this.model,d=h.fromPath(c[0]),v=c[1]||[],y=(c[2]||[]).map(h.fromPath),b=(c[3]||[]).map(h.fromPath),m=l._clone({_path:[]}),g=m.withoutDataSource(),w=l._path,x=w.concat(d),_=x.slice(0,-1),S=o(l.withoutDataSource().get(d)).map(function(t){for(var e=t.json,n=-1,r=d.length;e&&++n0){var p="_"+n+a+"AsJSON",h=e[p];h(e,c)}}return t.onCompleted(),s.empty}var i=t(159),s=i.Disposable,u=t(62);r.create=u.create,r.prototype=Object.create(u.prototype),r.prototype.method="invalidate",r.prototype.constructor=r,e.exports=r},{159:159,62:62}],64:[function(t,e,n){function r(t){this._subscribe=t}function o(t){var e=this.model,n=new this.type;return n.model=e,n.args=this.args,n.outputFormat=t.outputFormat||"AsPathMap",n.isProgressive=t.isProgressive||!1,n.subscribeCount=0,n.subscribeLimit=t.retryLimit||10,n.initialize().invokeSourceRequest(e).ensureCollect(e).subscribe(t)}var i=t(32),s=t(159)&&t(158),u=s.Observable,a=t(84),c=t(105),p={outputFormat:{value:"AsJSONG"}},h={isProgressive:{value:!0}};r.create=function(t,e){var n=new r(o);return n.args=e,n.type=this,n.model=t,n},r.prototype=Object.create(u.prototype),r.prototype.constructor=r,r.prototype._mixin=function(){var t=this,e=a(arguments);return new t.constructor(function(n){return t.subscribe(e.reduce(function(t,e){return Object.create(t,e)},n))})},r.prototype._toJSONG=function(){return this._mixin(p)},r.prototype.progressively=function(){return this._mixin(h)},r.prototype.subscribe=function(t,e,n){var r=t;r&&"object"==typeof r||(r={onNext:t||c,onError:e||c,onCompleted:n||c});var o=this._subscribe(r);switch(typeof o){case"function":return{dispose:o};case"object":return o||{dispose:c};default:return{dispose:c}}},r.prototype.then=function(t,e){var n=this;return new i.Promise(function(t,e){var r,o=!1;n.toArray().subscribe(function(t){r=t.length<=1?t[0]:t},function(t){o=!0,e(t)},function(){o===!1&&t(r)})}).then(t,e)},e.exports=r},{105:105,158:158,159:159,32:32,84:84}],65:[function(t,e,n){function r(t){l.call(this,t||o)}function o(t){return this.isCompleted?s.call(this,t):i.call(this,t)}function i(t){if(this.subscribeCount++>this.subscribeLimit)return t.onError("Loop kill switch thrown."),h.empty;for(var e=[],n=[],r=this.model,o=this.isMaster,i=r._root,c=this.outputFormat,p=i.errorSelector,f=this.method,l=this.groups,d=-1,y=l.length;++d0){var w="_"+f+m+c,x=r[w],_=x(r,g,null,p);n.push.apply(n,_[1]),"PathValues"===m?e.push.apply(e,g.map(u)):"JSONGs"===m?e.push.apply(e,v(g,a)):e.push.apply(e,_[0])}}return this.requestedPaths=e,o?(this.isCompleted=!0,s.call(this,t)):void t.onError({method:f,optimizedPaths:n,invokeSourceRequest:!0})}function s(t){var e=new f(this.model,this.requestedPaths);return"AsJSONG"===this.outputFormat&&(e=e._toJSONG()),this.isProgressive&&(e=e.progressively()),e.subscribe(t)}function u(t){return t.path}function a(t){return t.paths}var c=t(159),p=c.Observable,h=c.Disposable,f=t(67),l=t(62),d=t(9),v=t(82),y=new Array(0);r.create=l.create,r.prototype=Object.create(l.prototype),r.prototype.method="set",r.prototype.constructor=r,r.prototype.invokeSourceRequest=function(t){var e=this,n=this["catch"](function(r){var o;if(r&&r.invokeSourceRequest===!0){var i={},s=t._path,u=r.optimizedPaths;t._path=y,t._getPathValuesAsJSONG(t._materialize().withoutDataSource(),u,[i]),t._path=s,o=t._request.set(i)["do"](function(t){e.isCompleted=u.length===t.paths.length},function(){e.isCompleted=!0}).materialize().flatMap(function(t){if("C"===t.kind)return p.empty();if("E"===t.kind){var e=t.exception;if(d.is(e))return p["throw"](t.exception)}return n})}else o=p["throw"](r);return o});return new this.constructor(function(t){return n.subscribe(t)})},e.exports=r},{159:159,62:62,67:67,82:82,9:9}],66:[function(t,e,n){var r=function(t){this.disposed=!1,this.currentDisposable=t};r.prototype={dispose:function(){if(!this.disposed&&this.currentDisposable){this.disposed=!0;var t=this.currentDisposable;t.dispose?t.dispose():t()}}},e.exports=r},{}],67:[function(t,e,n){var r=t(64),o=t(68),i=t(69),s={dispose:function(){}},u=t(159).Observable,a=e.exports=function(t,e,n,r){this.model=t,this.currentRemainingPaths=e,this.isJSONGraph=n||!1,this.isProgressive=r||!1};a.prototype=Object.create(u.prototype),a.prototype.subscribe=r.prototype.subscribe,a.prototype.then=r.prototype.then,a.prototype._toJSONG=function(){return new a(this.model,this.currentRemainingPaths,!0,this.isProgressive)},a.prototype.progressively=function(){return new a(this.model,this.currentRemainingPaths,this.isJSONGraph,!0)},a.prototype._subscribe=function(t){var e=[{}],n=[],r=t.isJSONG=this.isJSONGraph,u=this.isProgressive,a=o(this.model,this.currentRemainingPaths,t,u,r,e,n);return a?i(this,this.model,a,t,e,n,1):s}},{159:159,64:64,68:68,69:69}],68:[function(t,e,n){var r=t(19),o=r.getWithPathsAsJSONGraph,i=r.getWithPathsAsPathMap;e.exports=function(t,e,n,r,s,u,a){var c;if(c=s?o(t,e,u):i(t,e,u),c.criticalError)return n.onError(c.criticalError),null;var p=c.hasValue,h=!c.requestedMissingPaths||!t._source,f=u[0].json||u[0].jsonGraph;if(c.errors)for(var l=c.errors,d=a.length,v=0,y=l.length;y>v;++v,++d)a[d]=l[v];if(p&&r||f&&h)try{++t._root.syncRefCount,n.onNext(u[0])}catch(b){throw b}finally{--t._root.syncRefCount}return h?(a.length?n.onError(a):n.onCompleted(),null):c}},{19:19}],69:[function(t,e,n){var r=t(68),o=t(10),i=t(30).fastCat,s=t(49),u=t(88),a=t(66),c=t(46);e.exports=function p(t,e,n,h,f,l,d){if(10===d)throw new o;var v=e._request,y=n.requestedMissingPaths,b=n.optimizedMissingPaths,m=new a,g=[],w=e._path;if(w.length)for(var x=0,_=y.length;_>x;++x)g[x]=i(w,y[x]);else g=y;var S=v.get(g,b,function(){var n=r(e,y,h,t.isProgressive,t.isJSONGraph,f,l);if(n)m.currentDisposable=p(t,e,n,h,f,l,d+1);else{var o=e._root,i=o.cache,a=i[c];s(o,o.expired,u(i),e._maxSize,e._collectRatio,a)}});return m.currentDisposable=S,m}},{10:10,30:30,46:46,49:49,66:66,68:68,88:88}],70:[function(t,e,n){var r=t(67);e.exports=function(t){return new r(this,t)}},{67:67}],71:[function(t,e,n){var r=t(134),o=t(64),i=t(72),s=t(116),u=t(67);e.exports=function(){var t=s(arguments,i,"get");if(t!==!0)return new o(function(e){e.onError(t)});var e=r.fromPathsOrPathValues(arguments);return new u(this,e)}},{116:116,134:134,64:64,67:67,72:72}],72:[function(t,e,n){e.exports={path:!0,pathSyntax:!0}},{}],73:[function(t,e,n){function r(){}var o=t(123),i=t(159),s=i.Disposable;r.prototype.schedule=function(t){return o(t),s.empty},r.prototype.scheduleWithState=function(t,e){var n=this;return o(function(){e(n,t)}),s.empty},e.exports=r},{123:123,159:159}],74:[function(t,e,n){function r(){}var o=t(159),i=o.Disposable;r.prototype.schedule=function(t){return t(),i.empty},r.prototype.scheduleWithState=function(t,e){return e(this,t),i.empty},e.exports=r},{159:159}],75:[function(t,e,n){function r(t){this.delay=t}var o=t(159),i=o.Disposable;r.prototype.schedule=function(t){var e=setTimeout(t,this.delay);return i.create(function(){void 0!==e&&(clearTimeout(e),e=void 0)})},r.prototype.scheduleWithState=function(t,e){var n=this,r=setTimeout(function(){e(n,t)},this.delay);return i.create(function(){void 0!==r&&(clearTimeout(r),r=void 0)})},e.exports=r},{159:159}],76:[function(t,e,n){function r(t,e,n,o,s,u,a,c,p,h,f,d,v,y,b,g,w){for(var x={},_=ex,k=i(t,E,e,n,C,r,A,N,!0,o,s,c,f,v,m,g);if(e=k[0],y(e))return s.index=x,k;E=k[1],r=k[2],C=k[3]}while(x++=x)break;h.index=_}}function o(t,e,n,r,o,s,u,c,f,v){var y=n.value;if(o.splice(0,o.length),o.push.apply(o,y),x(n))return o.index=y.length,E(n,u,c),[void 0,e];m(c,n);var b=n,g=e;if(n=n[h],null!=n)g=n[p]||e,o.index=y.length;else{var w=0,_=y.length-1;g=n=e;do{var C=y[w],A=_>w,N=i(e,g,n,C,t,A,!0,r,o,s,u,c,f,v);if(n=N[0],S(n))return o.index=w,N;g=N[1]}while(w++<_);if(o.index=w,b[h]!==n){var k=n[d]||0;n[d]=k+1,n[a+k]=b,b[h]=n,b[l]=k}}return[n,g]}function i(t,e,n,r,i,s,a,c,p,h,f,l,d,y){for(var b=n.$type;b===v;){var m=o(i,t,n,c,p,h,f,l,d,y);if(n=m[0],S(n))return m;e=m[1],b=n&&n.$type}if(void 0!==b)return[n,e];if(null==r){if(s)throw new Error("`null` is not allowed in branch key positions.");n&&(r=n[u])}else e=n,n=e[r];return n=A(e,n,r,i,s,a,c,p,h,f,l,d,y),[n,e]}function s(t){if(w(t)&&!t.$type){var e=[],n=0;b(t)&&(e[n++]="length");for(var r in t)r[0]!==c&&"$"!==r[0]&&g(t,r)&&(e[n++]=r);return e}}var u=t(36),a=t(43),c=t(40),p=t(39),h=t(33),f=t(46),l=t(42),d=t(44),v=t(120),y=t(13),b=Array.isArray,m=t(50),g=t(91),w=t(100),x=t(95),_=t(96),S=t(102),E=t(86),C=t(92),A=t(104);e.exports=function(t,e,n,o,i){for(var s=t._root,u=s,a=s.expired,c=C(),h=t._path,l=s.cache,d=h.length?y(t,h).value:l,v=d[p]||l,b=l[f],m=[],g=[],w=[],x=h.length,S=-1,E=e.length;++SS,N=i(e,_,n,C,t,A,!0,r,o,s,p,l,d,b);if(n=N[0],m(n))return o.index=S,N;_=N[1]}while(S++i&&(i=0),n>0&&i>n&&(i=n);for(var s=new Array(i);++oq)return}if(k&&j&&!O)return d(y(e,n,t,g,E),t,g);if(O||!j){if(O===s&&h(A)&&(n=A(m(w,g),n)),O&&e===n)null==e[o]&&(e=l(e,k,e.value),t=b(t,-e.$size,E,_),e=d(e,t,g,_));else{var R=!0;!k&&P||(R=a(n)-1);return t}},{39:39,43:43,44:44,46:46}],115:[function(t,e,n){var r=t(36),o=t(46),i=t(39),s=t(108),u=t(114);e.exports=function(t,e,n,a){var c=t;do{var p=c[i],h=c.$size=(c.$size||0)-e;0>=h&&null!=p?s(c,p,c[r],n):c[o]!==a&&u(c,a),c=p}while(c);return t}},{108:108,114:114,36:36,39:39,46:46}],116:[function(t,e,n){var r=Array.isArray,o=t(101),i=t(99),s=t(98),u=t(134);e.exports=function(t,e,n){for(var a=0,c=t.length;c>a;++a){var p=t[a],h=!1;if(r(p)&&e.path?h=!0:"string"==typeof p&&e.pathSyntax?h=!0:o(p)&&e.pathValue?(p.path=u.fromPath(p.path),h=!0):i(p)&&e.jsonGraph?h=!0:s(p)&&e.json?h=!0:"function"==typeof p&&a+1===c&&e.selector&&(h=!0),!h)return new Error("Unrecognized argument "+typeof p+" ["+String(p)+"] to Model#"+n)}return!0}},{101:101,134:134,98:98,99:99}],117:[function(t,e,n){var r=t(130),o=r.atom,i=t(106),s=t(122),u=t(37),a=50,c=t(85),p=Array.isArray,h=t(88),f=t(87);e.exports=function(t,e,n){var r=0,l=t,d=e;if(d?(l=c(l),r=h(l),l.$type=d):(l=o(n),d=l.$type,l[u]=!0),null==n)r=a+1;else if(null==r||0>=r)switch(typeof n){case"object":r=p(n)?a+n.length:a+1;break;case"string":r=a+n.length;break;default:r=a+1}var v=f(l);return"number"==typeof v&&s>v&&(l.$expires=i()+-1*v),l.$size=r,l}},{106:106,122:122,130:130,37:37,85:85,87:87,88:88}],118:[function(t,e,n){e.exports="atom"},{}],119:[function(t,e,n){e.exports="error"},{}],120:[function(t,e,n){e.exports="ref"},{}],121:[function(t,e,n){e.exports=1},{}],122:[function(t,e,n){e.exports=0},{}],123:[function(t,e,n){"use strict";function r(){if(a.length)throw a.shift()}function o(t){var e;e=u.length?u.pop():new i,e.task=t,s(e)}function i(){this.task=null}var s=t(124),u=[],a=[],c=s.makeRequestCallFromTimer(r);e.exports=o,i.prototype.call=function(){try{this.task.call()}catch(t){o.onerror?o.onerror(t):(a.push(t),c())}finally{this.task=null,u[u.length]=this}}},{124:124}],124:[function(t,e,n){(function(t){"use strict";function n(t){u.length||(s(),a=!0),u[u.length]=t}function r(){for(;cp){for(var e=0,n=u.length-c;n>e;e++)u[e]=u[e+c];u.length-=c,c=0}}u.length=0,c=0,a=!1}function o(t){var e=1,n=new h(t),r=document.createTextNode("");return n.observe(r,{characterData:!0}),function(){e=-e,r.data=e}}function i(t){return function(){function e(){clearTimeout(n),clearInterval(r),t()}var n=setTimeout(e,0),r=setInterval(e,50)}}e.exports=n;var s,u=[],a=!1,c=0,p=1024,h=t.MutationObserver||t.WebKitMutationObserver;s="function"==typeof h?o(r):i(r),n.requestFlush=s,n.makeRequestCallFromTimer=i}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],125:[function(t,e,n){"use strict";function r(t,e){var n;for(n in e)t[n]=e[n];return t}function o(t,e){if(this._jsongUrl=t,"number"==typeof e){var n={timeout:e};e=n}this._config=r({timeout:15e3,headers:{}},e||{})}var i=t(129),s=t(126);Array.isArray;o.prototype={constructor:o,buildQueryObject:s,get:function(t){var e="GET",n=this.buildQueryObject(this._jsongUrl,e,{paths:t,method:"get"}),o=r(n,this._config),s=this;return i(e,o,s)},set:function(t){var e="POST",n=this.buildQueryObject(this._jsongUrl,e,{jsonGraph:t,method:"set"}),o=r(n,this._config);o.headers["Content-Type"]="application/x-www-form-urlencoded";var s=this;return i(e,o,s)},call:function(t,e,n,o){e=e||[],n=n||[],o=o||[];var s="POST",u=[];u.push("method=call"),u.push("callPath="+encodeURIComponent(JSON.stringify(t))),u.push("arguments="+encodeURIComponent(JSON.stringify(e))),u.push("pathSuffixes="+encodeURIComponent(JSON.stringify(n))),u.push("paths="+encodeURIComponent(JSON.stringify(o)));var a=this.buildQueryObject(this._jsongUrl,s,u.join("&")),c=r(a,this._config);c.headers["Content-Type"]="application/x-www-form-urlencoded";var p=this;return i(s,c,p)}},o.XMLHttpSource=o,o["default"]=o,e.exports=o},{126:126,129:129}],126:[function(t,e,n){"use strict";e.exports=function(t,e,n){var r,o=[],i={url:t},s=-1!==t.indexOf("?"),u=s?"&":"?";return"string"==typeof n?o.push(n):(r=Object.keys(n),r.forEach(function(t){var e="object"==typeof n[t]?JSON.stringify(n[t]):n[t];o.push(t+"="+encodeURIComponent(e))})),"GET"===e?i.url+=u+o.join("&"):i.data=o.join("&"),i}},{}],127:[function(t,e,n){(function(t){"use strict";e.exports=function(){var e=new t.XMLHttpRequest;if("withCredentials"in e)return e;if(t.XDomainRequest)return new XDomainRequest;throw new Error("CORS is not supported by your browser")}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],128:[function(t,e,n){(function(t){"use strict";e.exports=function(){var e,n,r;if(t.XMLHttpRequest)return new t.XMLHttpRequest;try{for(n=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],r=0;3>r;r++)try{if(e=n[r],new t.ActiveXObject(e))break}catch(o){}return new t.ActiveXObject(e)}catch(o){throw new Error("XMLHttpRequest is not supported by your browser")}}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],129:[function(t,e,n){"use strict";function r(){}function o(t,e,n){return r.create(function(r){var o,i,h,f,l,d={method:t||"GET",crossDomain:!1,async:!0,headers:{},responseType:"json"};for(l in e)p.call(e,l)&&(d[l]=e[l]);d.crossDomain||d.headers["X-Requested-With"]||(d.headers["X-Requested-With"]="XMLHttpRequest"),null!=n.onBeforeRequest&&n.onBeforeRequest(d);try{o=d.crossDomain?c():a()}catch(v){r.onError(v)}try{d.user?o.open(d.method,d.url,d.async,d.user,d.password):o.open(d.method,d.url,d.async),o.timeout=d.timeout,o.withCredentials=d.withCredentials!==!1,h=d.headers;for(f in h)p.call(h,f)&&o.setRequestHeader(f,h[f]);if(d.responseType)try{o.responseType=d.responseType}catch(y){if("json"!==d.responseType)throw y}o.onreadystatechange=function(t){4===o.readyState&&(i||(i=!0,s(r,o,t)))},o.ontimeout=function(t){i||(i=!0,u(r,o,"timeout error",t))},o.send(d.data)}catch(y){r.onError(y)}return function(){i||4===o.readyState||(i=!0,o.abort())}})}function i(t,e,n){n||(n=new Error(e)),t.onError(n)}function s(t,e,n){var r,o;if(e&&t){o=e.responseType,r="response"in e?e.response:e.responseText;var s=1223===e.status?204:e.status;if(s>=200&&399>=s){try{"json"!==o&&(r=JSON.parse(r||"")),"string"==typeof r&&(r=JSON.parse(r||""))}catch(n){i(t,"invalid json",n)}return t.onNext(r),void t.onCompleted()}return 401===s||403===s||407===s?i(t,r):410===s?i(t,r):408===s||504===s?i(t,r):i(t,r||"Response code "+s)}}function u(t,e,n,r){i(t,n||e.statusText||"request error",r)}var a=t(128),c=t(127),p=Object.prototype.hasOwnProperty,h=function(){};r.create=function(t){var e=new r;return e.subscribe=function(e,n,r){var o,i;return o="function"==typeof e?{onNext:e,onError:n||h,onCompleted:r||h}:e,i=t(o),"function"==typeof i?{dispose:i}:i},e},e.exports=o},{127:127,128:128}],130:[function(t,e,n){function r(t,e,n){var r=Object.create(null);if(null!=n){for(var o in n)r[o]=n[o];return r.$type=t,r.value=e,r}return{$type:t,value:e}}var o=t(134);e.exports={ref:function(t,e){return r("ref",o.fromPath(t),e)},atom:function(t,e){return r("atom",t,e)},undefined:function(){return r("atom")},error:function(t,e){return r("error",t,e)},pathValue:function(t,e){return{path:o.fromPath(t),value:e}},pathInvalidation:function(t){return{path:o.fromPath(t),invalidated:!0}}}},{134:134}],131:[function(t,e,n){e.exports={integers:"integers",ranges:"ranges",keys:"keys"}},{}],132:[function(t,e,n){var r={token:"token",dotSeparator:".",commaSeparator:",",openingBracket:"[",closingBracket:"]",openingBrace:"{",closingBrace:"}",escape:"\\",space:" ",colon:":",quote:"quote",unknown:"unknown"};e.exports=r},{}],133:[function(t,e,n){e.exports={indexer:{nested:"Indexers cannot be nested.",needQuotes:"unquoted indexers must be numeric.",empty:"cannot have empty indexers.",leadingDot:"Indexers cannot have leading dots.",leadingComma:"Indexers cannot have leading comma.",requiresComma:"Indexers require commas between indexer args.",routedTokens:"Only one token can be used per indexer when specifying routed tokens."},range:{precedingNaN:"ranges must be preceded by numbers.",suceedingNaN:"ranges must be suceeded by numbers."},routed:{invalid:"Invalid routed token. only integers|ranges|keys are supported."},quote:{empty:"cannot have empty quoted keys.",illegalEscape:"Invalid escape character. Only quotes are escapable."},unexpectedToken:"Unexpected token.",invalidIdentifier:"Invalid Identifier.",invalidPath:"Please provide a valid path.",throwError:function(t,e,n){if(n)throw t+" -- "+e.parseString+" with next token: "+n;throw t+" -- "+e.parseString}}},{}],134:[function(t,e,n){var r=t(140),o=t(135),i=t(131),s=function(t,e){return o(new r(t,e))};e.exports=s,s.fromPathsOrPathValues=function(t,e){if(!t)return[];for(var n=[],r=0,o=t.length;o>r;r++)"string"==typeof t[r]?n[r]=s(t[r],e):"string"==typeof t[r].path?n[r]={path:s(t[r].path,e),value:t[r].value}:n[r]=t[r];return n},s.fromPath=function(t,e){return t?"string"==typeof t?s(t,e):t:[]},s.RoutedTokens=i},{131:131,135:135,140:140}],135:[function(t,e,n){var r=t(132),o=t(133),i=t(136);e.exports=function(t){for(var e=t.next(),n={},s=[];!e.done;){switch(e.type){case r.token:var u=+e.token[0];isNaN(u)||o.throwError(o.invalidIdentifier,t),s[s.length]=e.token;break;case r.dotSeparator:0===s.length&&o.throwError(o.unexpectedToken,t);break;case r.space:break;case r.openingBracket:i(t,e,n,s);break;default:o.throwError(o.unexpectedToken,t)}e=t.next()}return 0===s.length&&o.throwError(o.invalidPath,t),s}},{132:132,133:133,136:136}],136:[function(t,e,n){var r=t(132),o=t(133),i=o.indexer,s=t(138),u=t(137),a=t(139);e.exports=function(t,e,n,c){var p=t.next(),h=!1,f=1,l=!1;for(n.indexer=[];!p.done;){switch(p.type){case r.token:case r.quote:n.indexer.length===f&&o.throwError(i.requiresComma,t)}switch(p.type){case r.openingBrace:l=!0,a(t,p,n,c);break;case r.token:var d=+p.token;isNaN(d)&&o.throwError(i.needQuotes,t),n.indexer[n.indexer.length]=d;break;case r.dotSeparator:n.indexer.length||o.throwError(i.leadingDot,t),s(t,p,n,c); @@ -3276,27 +3459,29 @@ if(!this.isDisposed){this.isDisposed=!0;for(var t=this.disposables.length,e=new return new Sn(this)},qe.onErrorResumeNext=function(t){if(!t)throw new Error("Second observable is required");return En([this,t])};var En=We.onErrorResumeNext=function(){var t=[];if(Array.isArray(arguments[0]))t=arguments[0];else for(var e=0,n=arguments.length;n>e;e++)t.push(arguments[e]);return new qn(function(e){var n=0,r=new le,o=xe.scheduleRecursive(function(o){var i,s;nn;n++)e[n]=arguments[n];var r=e.pop(),o=this;return Array.isArray(e[0])&&(e=e[0]),new qn(function(t){for(var n=e.length,i=g(n,W),s=!1,u=new Array(n),a=new Array(n+1),c=0;n>c;c++)!function(n){var r=e[n],o=new fe;ut(r)&&(r=Xe(r)),o.setDisposable(r.subscribe(function(t){u[n]=t,i[n]=!0,s=i.every(nt)},function(e){t.onError(e)},et)),a[n]=o}(c);var p=new fe;return p.setDisposable(o.subscribe(function(e){var n=[e].concat(u);if(s){var o=x(r).apply(null,n);return o===ne?t.onError(o.e):void t.onNext(o)}},function(e){t.onError(e)},function(){t.onCompleted()})),a[n]=p,new ie(a)},this)},qe.zip=function(){if(Array.isArray(arguments[0]))return z.apply(this,arguments);for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=this,o=e.pop();return e.unshift(r),new qn(function(t){for(var n=e.length,i=g(n,G),s=g(n,W),u=new Array(n),a=0;n>a;a++)!function(n){var a=e[n],c=new fe;ut(a)&&(a=Xe(a)),c.setDisposable(a.subscribe(function(e){if(i[n].push(e),i.every(function(t){return t.length>0})){var u=i.map(function(t){return t.shift()}),a=x(o).apply(r,u);if(a===ne)return t.onError(a.e);t.onNext(a)}else s.filter(function(t,e){return e!==n}).every(nt)&&t.onCompleted()},function(e){t.onError(e)},function(){s[n]=!0,s.every(nt)&&t.onCompleted()})),u[n]=c}(a);return new ie(u)},r)},We.zip=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=e.shift();return r.zip.apply(r,e)},We.zipArray=function(){var t;if(Array.isArray(arguments[0]))t=arguments[0];else{var e=arguments.length;t=new Array(e);for(var n=0;e>n;n++)t[n]=arguments[n]}return new qn(function(e){for(var n=t.length,r=g(n,J),o=g(n,W),i=new Array(n),s=0;n>s;s++)!function(n){i[n]=new fe,i[n].setDisposable(t[n].subscribe(function(t){if(r[n].push(t),r.every(function(t){return t.length>0})){var i=r.map(function(t){return t.shift()});e.onNext(i)}else if(o.filter(function(t,e){return e!==n}).every(nt))return e.onCompleted()},function(t){e.onError(t)},function(){o[n]=!0,o.every(nt)&&e.onCompleted()}))}(s);return new ie(i)})},qe.asObservable=function(){var t=this;return new qn(function(e){return t.subscribe(e)},t)},qe.bufferWithCount=function(t,e){return"number"!=typeof e&&(e=t),this.windowWithCount(t,e).selectMany(function(t){return t.toArray()}).where(function(t){return t.length>0})},qe.dematerialize=function(){var t=this;return new qn(function(e){return t.subscribe(function(t){return t.accept(e)},function(t){e.onError(t)},function(){e.onCompleted()})},this)},qe.distinctUntilChanged=function(t,e){var n=this;return e||(e=ot),new qn(function(r){var o,i=!1;return n.subscribe(function(n){var s=n;if(t&&(s=x(t)(n),s===ne))return r.onError(s.e);if(i){var u=x(e)(o,s);if(u===ne)return r.onError(u.e)}i&&u||(i=!0,o=s,r.onNext(n))},function(t){r.onError(t)},function(){r.onCompleted()})},this)};var Nn=function(t){function e(e,n,r,o){this.source=e,this.t=!n||at(n)?De(n||et,r||et,o||et):n,t.call(this)}function n(t,e){this.o=t,this.t=e,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this.t))},n.prototype.onNext=function(t){if(!this.isStopped){var e=x(this.t.onNext).call(this.t,t);e===ne&&this.o.onError(e.e),this.o.onNext(t)}},n.prototype.onError=function(t){if(!this.isStopped){this.isStopped=!0;var e=x(this.t.onError).call(this.t,t);if(e===ne)return this.o.onError(e.e);this.o.onError(t)}},n.prototype.onCompleted=function(){if(!this.isStopped){this.isStopped=!0;var t=x(this.t.onCompleted).call(this.t);if(t===ne)return this.o.onError(t.e);this.o.onCompleted()}},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe["do"]=qe.tap=qe.doAction=function(t,e,n){return new Nn(this,t,e,n)},qe.doOnNext=qe.tapOnNext=function(t,e){return this.tap("undefined"!=typeof e?function(n){t.call(e,n)}:t)},qe.doOnError=qe.tapOnError=function(t,e){return this.tap(et,"undefined"!=typeof e?function(n){t.call(e,n)}:t)},qe.doOnCompleted=qe.tapOnCompleted=function(t,e){return this.tap(et,null,"undefined"!=typeof e?function(){t.call(e)}:t)},qe["finally"]=qe.ensure=function(t){var e=this;return new qn(function(n){var r;try{r=e.subscribe(n)}catch(o){throw t(),o}return ae(function(){try{r.dispose()}catch(e){throw e}finally{t()}})},this)},qe.finallyAction=function(t){return this.ensure(t)};var kn=function(t){function e(e){this.source=e,t.call(this)}function n(t){this.o=t,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t))},n.prototype.onNext=et,n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.observer.onError(t),!0)},e}(ze);qe.ignoreElements=function(){return new kn(this)},qe.materialize=function(){var t=this;return new qn(function(e){return t.subscribe(function(t){e.onNext(ke(t))},function(t){e.onNext(Oe(t)),e.onCompleted()},function(){e.onNext(Pe()),e.onCompleted()})},t)},qe.repeat=function(t){return Be(this,t).concat()},qe.retry=function(t){return Be(this,t).catchError()},qe.retryWhen=function(t){return Be(this).catchErrorWhen(t)};var On=function(t){function e(e,n,r,o){this.source=e,this.accumulator=n,this.hasSeed=r,this.seed=o,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new I(t,this))},e}(ze);I.prototype.onNext=function(t){if(!this.isStopped){!this.hasValue&&(this.hasValue=!0);try{this.hasAccumulation?this.accumulation=this.accumulator(this.accumulation,t):(this.accumulation=this.hasSeed?this.accumulator(this.seed,t):t,this.hasAccumulation=!0)}catch(e){return this.observer.onError(e)}this.observer.onNext(this.accumulation)}},I.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.observer.onError(t))},I.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,!this.hasValue&&this.hasSeed&&this.observer.onNext(this.seed),this.observer.onCompleted())},I.prototype.dispose=function(){this.isStopped=!0},I.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.observer.onError(t),!0)},qe.scan=function(){var t,e,n=!1;return 2===arguments.length?(n=!0,t=arguments[0],e=arguments[1]):e=arguments[0],new On(this,e,n,t)},qe.skipLast=function(t){if(0>t)throw new yt;var e=this;return new qn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&n.onNext(r.shift())},function(t){n.onError(t)},function(){n.onCompleted()})},e)},qe.startWith=function(){var t,e=0;arguments.length&&me(arguments[0])?(t=arguments[0],e=1):t=xe;for(var n=[],r=e,o=arguments.length;o>r;r++)n.push(arguments[r]);return Ue([on(n,t),this]).concat()},qe.takeLast=function(t){if(0>t)throw new yt;var e=this;return new qn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&r.shift()},function(t){n.onError(t)},function(){for(;r.length>0;)n.onNext(r.shift());n.onCompleted()})},e)},qe.takeLastBuffer=function(t){var e=this;return new qn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&r.shift()},function(t){n.onError(t)},function(){n.onNext(r),n.onCompleted()})},e)},qe.windowWithCount=function(t,e){var n=this;if(+t||(t=0),Math.abs(t)===1/0&&(t=0),0>=t)throw new yt;if(null==e&&(e=t),+e||(e=0),Math.abs(e)===1/0&&(e=0),0>=e)throw new yt;return new qn(function(r){function o(){var t=new Tn;a.push(t),r.onNext(ee(t,s))}var i=new fe,s=new de(i),u=0,a=[];return o(),i.setDisposable(n.subscribe(function(n){for(var r=0,i=a.length;i>r;r++)a[r].onNext(n);var s=u-t+1;s>=0&&s%e===0&&a.shift().onCompleted(),++u%e===0&&o()},function(t){for(;a.length>0;)a.shift().onError(t);r.onError(t)},function(){for(;a.length>0;)a.shift().onCompleted();r.onCompleted()})),s},n)},qe.selectConcat=qe.concatMap=function(t,e,n){return at(t)&&at(e)?this.concatMap(function(n,r){var o=t(n,r);return ut(o)&&(o=Xe(o)),(Et(o)||St(o))&&(o=nn(o)),o.map(function(t,o){return e(n,t,r,o)})}):at(t)?L(this,t,n):L(this,function(){return t})},qe.concatMapObserver=qe.selectConcatObserver=function(t,e,n,r){var o=this,i=At(t,r,2),s=At(e,r,1),u=At(n,r,0);return new qn(function(t){var e=0;return o.subscribe(function(n){var r;try{r=i(n,e++)}catch(o){return void t.onError(o)}ut(r)&&(r=Xe(r)),t.onNext(r)},function(e){var n;try{n=s(e)}catch(r){return void t.onError(r)}ut(n)&&(n=Xe(n)),t.onNext(n),t.onCompleted()},function(){var e;try{e=u()}catch(n){return void t.onError(n)}ut(e)&&(e=Xe(e)),t.onNext(e),t.onCompleted()})},this).concatAll()},qe.defaultIfEmpty=function(t){var e=this;return t===i&&(t=null),new qn(function(n){var r=!1;return e.subscribe(function(t){r=!0,n.onNext(t)},function(t){n.onError(t)},function(){!r&&n.onNext(t),n.onCompleted()})},e)},F.prototype.push=function(t){var e=-1===B(this.set,t,this.comparer);return e&&this.set.push(t),e},qe.distinct=function(t,e){var n=this;return e||(e=ot),new qn(function(r){var o=new F(e);return n.subscribe(function(e){var n=e;if(t)try{n=t(e)}catch(i){return void r.onError(i)}o.push(n)&&r.onNext(e)},function(t){r.onError(t)},function(){r.onCompleted()})},this)};var Pn=function(t){function e(e,n,r){this.source=e,this.selector=At(n,r,3),t.call(this)}function n(t,e){return function(n,r,o){return t.call(this,e.selector(n,r,o),r,o)}}function r(t,e,n){this.o=t,this.selector=e,this.source=n,this.i=0,this.isStopped=!1}return Zt(e,t),e.prototype.internalMap=function(t,r){return new e(this.source,n(t,this),r)},e.prototype.subscribeCore=function(t){return this.source.subscribe(new r(t,this.selector,this))},r.prototype.onNext=function(t){if(!this.isStopped){var e=x(this.selector)(t,this.i++,this.source);return e===ne?this.o.onError(e.e):void this.o.onNext(e)}},r.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.map=qe.select=function(t,e){var n="function"==typeof t?t:function(){return t};return this instanceof Pn?this.internalMap(n,e):new Pn(this,n,e)},qe.pluck=function(){var t=arguments,e=arguments.length;if(0===e)throw new Error("List of properties cannot be empty.");return this.map(function(n){for(var r=n,o=0;e>o;o++){var s=r[t[o]];if("undefined"==typeof s)return i;r=s}return r})},qe.flatMapObserver=qe.selectManyObserver=function(t,e,n,r){var o=this;return new qn(function(i){var s=0;return o.subscribe(function(e){var n;try{n=t.call(r,e,s++)}catch(o){return void i.onError(o)}ut(n)&&(n=Xe(n)),i.onNext(n)},function(t){var n;try{n=e.call(r,t)}catch(o){return void i.onError(o)}ut(n)&&(n=Xe(n)),i.onNext(n),i.onCompleted()},function(){var t;try{t=n.call(r)}catch(e){return void i.onError(e)}ut(t)&&(t=Xe(t)),i.onNext(t),i.onCompleted()})},o).mergeAll()},qe.selectMany=qe.flatMap=function(t,e,n){return at(t)&&at(e)?this.flatMap(function(n,r){var o=t(n,r);return ut(o)&&(o=Xe(o)),(Et(o)||St(o))&&(o=nn(o)),o.map(function(t,o){return e(n,t,r,o)})},n):at(t)?U(this,t,n):U(this,function(){return t})},qe.selectSwitch=qe.flatMapLatest=qe.switchMap=function(t,e){return this.select(t,e).switchLatest()};var jn=function(t){function e(e,n){this.source=e,this.skipCount=n,t.call(this)}function n(t,e){this.c=e,this.r=e,this.o=t,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this.skipCount))},n.prototype.onNext=function(t){this.isStopped||(this.r<=0?this.o.onNext(t):this.r--)},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.skip=function(t){if(0>t)throw new yt;return new jn(this,t)},qe.skipWhile=function(t,e){var n=this,r=At(t,e,3);return new qn(function(t){var e=0,o=!1;return n.subscribe(function(i){if(!o)try{o=!r(i,e++,n)}catch(s){return void t.onError(s)}o&&t.onNext(i)},function(e){t.onError(e)},function(){t.onCompleted()})},n)},qe.take=function(t,e){if(0>t)throw new yt;if(0===t)return Ye(e);var n=this;return new qn(function(e){var r=t;return n.subscribe(function(t){r-- >0&&(e.onNext(t),0>=r&&e.onCompleted())},function(t){e.onError(t)},function(){e.onCompleted()})},n)},qe.takeWhile=function(t,e){var n=this,r=At(t,e,3);return new qn(function(t){var e=0,o=!0;return n.subscribe(function(i){if(o){try{o=r(i,e++,n)}catch(s){return void t.onError(s)}o?t.onNext(i):t.onCompleted()}},function(e){t.onError(e)},function(){t.onCompleted()})},n)};var Dn=function(t){function e(e,n,r){this.source=e,this.predicate=At(n,r,3),t.call(this)}function n(t,e){return function(n,r,o){return e.predicate(n,r,o)&&t.call(this,n,r,o)}}function r(t,e,n){this.o=t,this.predicate=e,this.source=n,this.i=0,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new r(t,this.predicate,this))},e.prototype.internalFilter=function(t,r){return new e(this.source,n(t,this),r)},r.prototype.onNext=function(t){if(!this.isStopped){var e=x(this.predicate)(t,this.i++,this.source);return e===ne?this.o.onError(e.e):void(e&&this.o.onNext(t))}},r.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.filter=qe.where=function(t,e){return this instanceof Dn?this.internalFilter(t,e):new Dn(this,t,e)},qe.transduce=function(t){function e(t){return{"@@transducer/init":function(){return t},"@@transducer/step":function(t,e){return t.onNext(e)},"@@transducer/result":function(t){return t.onCompleted()}}}var n=this;return new qn(function(r){var o=t(e(r));return n.subscribe(function(t){try{o["@@transducer/step"](r,t)}catch(e){r.onError(e)}},function(t){r.onError(t)},function(){o["@@transducer/result"](r)})},n)};var qn=tt.AnonymousObservable=function(t){function e(t){return t&&at(t.dispose)?t:at(t)?ae(t):ce}function n(t,n){var r=n[0],o=n[1],i=x(o)(r);return i!==ne||r.fail(ne.e)?void r.setDisposable(e(i)):_(ne.e)}function r(e,r){function o(t){var r=new Rn(t),o=[r,e];return _e.scheduleRequired()?_e.scheduleWithState(o,n):n(null,o),r}this.source=r,t.call(this,o)}return Zt(r,t),r}(We),Rn=function(t){function e(e){t.call(this),this.observer=e,this.m=new fe}Zt(e,t);var n=e.prototype;return n.next=function(t){var e=x(this.observer.onNext).call(this.observer,t);e===ne&&(this.dispose(),_(e.e))},n.error=function(t){var e=x(this.observer.onError).call(this.observer,t);this.dispose(),e===ne&&_(e.e)},n.completed=function(){var t=x(this.observer.onCompleted).call(this.observer);this.dispose(),t===ne&&_(t.e)},n.setDisposable=function(t){this.m.setDisposable(t)},n.getDisposable=function(){return this.m.getDisposable()},n.dispose=function(){t.prototype.dispose.call(this),this.m.dispose()},e}(Re),Mn=function(t,e){this.subject=t,this.observer=e};Mn.prototype.dispose=function(){if(!this.subject.isDisposed&&null!==this.observer){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1),this.observer=null}};var Tn=tt.Subject=function(t){function e(t){return he(this),this.isStopped?this.hasError?(t.onError(this.error),ce):(t.onCompleted(),ce):(this.observers.push(t),new Mn(this,t))}function n(){t.call(this,e),this.isDisposed=!1,this.isStopped=!1,this.observers=[],this.hasError=!1}return Zt(n,t),te(n.prototype,je.prototype,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(he(this),!this.isStopped){this.isStopped=!0;for(var t=0,e=u(this.observers),n=e.length;n>t;t++)e[t].onCompleted();this.observers.length=0}},onError:function(t){if(he(this),!this.isStopped){this.isStopped=!0,this.error=t,this.hasError=!0;for(var e=0,n=u(this.observers),r=n.length;r>e;e++)n[e].onError(t);this.observers.length=0}},onNext:function(t){if(he(this),!this.isStopped)for(var e=0,n=u(this.observers),r=n.length;r>e;e++)n[e].onNext(t)},dispose:function(){this.isDisposed=!0,this.observers=null}}),n.create=function(t,e){return new Vn(t,e)},n}(We),Vn=(tt.AsyncSubject=function(t){function e(t){return he(this),this.isStopped?(this.hasError?t.onError(this.error):this.hasValue?(t.onNext(this.value),t.onCompleted()):t.onCompleted(),ce):(this.observers.push(t),new Mn(this,t))}function n(){t.call(this,e),this.isDisposed=!1,this.isStopped=!1,this.hasValue=!1,this.observers=[],this.hasError=!1}return Zt(n,t),te(n.prototype,je,{hasObservers:function(){return he(this),this.observers.length>0},onCompleted:function(){var t,e;if(he(this),!this.isStopped){this.isStopped=!0;var n=u(this.observers),e=n.length;if(this.hasValue)for(t=0;e>t;t++){var r=n[t];r.onNext(this.value),r.onCompleted()}else for(t=0;e>t;t++)n[t].onCompleted();this.observers.length=0}},onError:function(t){if(he(this),!this.isStopped){this.isStopped=!0,this.hasError=!0,this.error=t;for(var e=0,n=u(this.observers),r=n.length;r>e;e++)n[e].onError(t);this.observers.length=0}},onNext:function(t){he(this),this.isStopped||(this.value=t,this.hasValue=!0)},dispose:function(){this.isDisposed=!0,this.observers=null,this.exception=null,this.value=null}}),n}(We),tt.AnonymousSubject=function(t){function e(t){return this.observable.subscribe(t)}function n(n,r){this.observer=n,this.observable=r,t.call(this,e)}return Zt(n,t),te(n.prototype,je.prototype,{onCompleted:function(){this.observer.onCompleted()},onError:function(t){this.observer.onError(t)},onNext:function(t){this.observer.onNext(t)}}),n}(We));"function"==typeof t&&"object"==typeof t.amd&&t.amd?(X.Rx=tt,t(function(){return tt})):Q&&K?Y?(K.exports=tt).Rx=tt:Q.Rx=tt:X.Rx=tt;var $n=f()}).call(this)}).call(this,e(150),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{150:150}]},{},[1])(1)}); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],14:[function(require,module,exports){ +},{}],16:[function(require,module,exports){ (function (global){ var topLevel = typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : {} var minDoc = require('min-document'); +var doccy; + if (typeof document !== 'undefined') { - module.exports = document; + doccy = document; } else { - var doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4']; + doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4']; if (!doccy) { doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc; } - - module.exports = doccy; } +module.exports = doccy; + }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"min-document":2}],15:[function(require,module,exports){ +},{"min-document":4}],17:[function(require,module,exports){ exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = nBytes * 8 - mLen - 1 @@ -3382,7 +3567,7 @@ exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { buffer[offset + i - d] |= s * 128 } -},{}],16:[function(require,module,exports){ +},{}],18:[function(require,module,exports){ (function (global){ 'use strict'; @@ -3406,7 +3591,7 @@ function Individual(key, value) { }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],17:[function(require,module,exports){ +},{}],19:[function(require,module,exports){ 'use strict'; var Individual = require('./index.js'); @@ -3430,21 +3615,14 @@ function OneVersion(moduleName, version, defaultValue) { return Individual(key, defaultValue); } -},{"./index.js":16}],18:[function(require,module,exports){ +},{"./index.js":18}],20:[function(require,module,exports){ "use strict"; module.exports = function isObject(x) { return typeof x === "object" && x !== null; }; -},{}],19:[function(require,module,exports){ -var toString = {}.toString; - -module.exports = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; -}; - -},{}],20:[function(require,module,exports){ +},{}],21:[function(require,module,exports){ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* Geohash encoding/decoding and associated functions (c) Chris Veness 2014-2016 / MIT Licence */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ @@ -3690,7 +3868,7 @@ Geohash.neighbours = function(geohash) { /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ if (typeof module != 'undefined' && module.exports) module.exports = Geohash; // CommonJS, node.js -},{}],21:[function(require,module,exports){ +},{}],22:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // @@ -3919,7 +4097,7 @@ var substr = 'ab'.substr(-1) === 'b' }).call(this,require('_process')) -},{"_process":4}],22:[function(require,module,exports){ +},{"_process":6}],23:[function(require,module,exports){ 'use strict'; module.exports = Pbf; @@ -3927,7 +4105,7 @@ module.exports = Pbf; var ieee754 = require('ieee754'); function Pbf(buf) { - this.buf = ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0); + this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0); this.pos = 0; this.type = 0; this.length = this.buf.length; @@ -4539,7 +4717,7 @@ function writeUtf8(buf, str, pos) { return pos; } -},{"ieee754":15}],23:[function(require,module,exports){ +},{"ieee754":17}],24:[function(require,module,exports){ 'use strict'; module.exports = partialSort; @@ -4601,7 +4779,7 @@ function defaultCompare(a, b) { return a < b ? -1 : a > b ? 1 : 0; } -},{}],24:[function(require,module,exports){ +},{}],25:[function(require,module,exports){ 'use strict'; module.exports = rbush; @@ -5164,7 +5342,7 @@ function multiSelect(arr, left, right, n, compare) { } } -},{"quickselect":23}],25:[function(require,module,exports){ +},{"quickselect":24}],26:[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]; @@ -5214,7 +5392,7 @@ var BehaviorSubject = (function (_super) { }(Subject_1.Subject)); exports.BehaviorSubject = BehaviorSubject; -},{"./Subject":33,"./util/ObjectUnsubscribedError":145}],26:[function(require,module,exports){ +},{"./Subject":34,"./util/ObjectUnsubscribedError":164}],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]; @@ -5251,7 +5429,7 @@ var InnerSubscriber = (function (_super) { }(Subscriber_1.Subscriber)); exports.InnerSubscriber = InnerSubscriber; -},{"./Subscriber":35}],27:[function(require,module,exports){ +},{"./Subscriber":36}],28:[function(require,module,exports){ "use strict"; var Observable_1 = require('./Observable'); /** @@ -5269,10 +5447,10 @@ var Observable_1 = require('./Observable'); * @class Notification */ var Notification = (function () { - function Notification(kind, value, exception) { + function Notification(kind, value, error) { this.kind = kind; this.value = value; - this.exception = exception; + this.error = error; this.hasValue = kind === 'N'; } /** @@ -5285,7 +5463,7 @@ var Notification = (function () { case 'N': return observer.next && observer.next(this.value); case 'E': - return observer.error && observer.error(this.exception); + return observer.error && observer.error(this.error); case 'C': return observer.complete && observer.complete(); } @@ -5304,7 +5482,7 @@ var Notification = (function () { case 'N': return next && next(this.value); case 'E': - return error && error(this.exception); + return error && error(this.error); case 'C': return complete && complete(); } @@ -5337,7 +5515,7 @@ var Notification = (function () { case 'N': return Observable_1.Observable.of(this.value); case 'E': - return Observable_1.Observable.throw(this.exception); + return Observable_1.Observable.throw(this.error); case 'C': return Observable_1.Observable.empty(); } @@ -5354,12 +5532,12 @@ 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 * given error. - * @param {any} [err] The `error` exception. + * @param {any} [err] The `error` error. * @return {Notification} The "error" Notification representing the * argument. */ @@ -5371,7 +5549,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); @@ -5379,7 +5557,7 @@ var Notification = (function () { }()); exports.Notification = Notification; -},{"./Observable":28}],28:[function(require,module,exports){ +},{"./Observable":29}],29:[function(require,module,exports){ "use strict"; var root_1 = require('./util/root'); var toSubscriber_1 = require('./util/toSubscriber'); @@ -5418,24 +5596,127 @@ var Observable = (function () { return observable; }; /** - * Registers handlers for handling emitted values, error and completions from the observable, and - * executes the observable's subscriber function, which will take action to set up the underlying data stream - * @method subscribe - * @param {PartialObserver|Function} observerOrNext (optional) either an observer defining all functions to be called, - * or the first of three possible handlers, which is the handler for each value emitted from the observable. - * @param {Function} error (optional) a handler for a terminal event resulting from an error. If no error handler is provided, - * the error will be thrown as unhandled - * @param {Function} complete (optional) a handler for a terminal event resulting from successful completion. - * @return {ISubscription} a subscription reference to the registered handlers + * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit. + * + * 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 + * 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 + * thought. + * + * Apart from starting the execution of an Observable, this method allows you to listen for values + * that an Observable emits, as well as for when it completes or errors. You can achieve this in two + * following ways. + * + * The first way is creating an object that implements {@link Observer} interface. It should have methods + * defined by that interface, but note that it should be just a regular JavaScript object, which you can create + * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular do + * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also + * that your object does not have to implement all methods. If you find yourself creating a method that doesn't + * do anything, you can simply omit it. Note however, that if `error` method is not provided, all errors will + * be left uncaught. + * + * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods. + * This means you can provide three functions as arguments to `subscribe`, where first function is equivalent + * of a `next` method, second of an `error` method and third of a `complete` method. Just as in case of Observer, + * if you do not need to listen for something, you can omit a function, preferably by passing `undefined` or `null`, + * since `subscribe` recognizes these functions by where they were placed in function call. When it comes + * to `error` function, just as before, if not provided, errors emitted by an Observable will be thrown. + * + * Whatever style of calling `subscribe` you use, in both cases it returns a Subscription object. + * This object allows you to call `unsubscribe` on it, which in turn will stop work that an Observable does and will clean + * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback + * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable. + * + * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously. + * It is an Observable itself that decides when these functions will be called. For example {@link of} + * by default emits all its values synchronously. Always check documentation for how given Observable + * will behave when subscribed and if its default behavior can be modified with a {@link Scheduler}. + * + * @example Subscribe with an Observer + * const sumObserver = { + * sum: 0, + * next(value) { + * console.log('Adding: ' + value); + * this.sum = this.sum + value; + * }, + * error() { // We actually could just remote this method, + * }, // since we do not really care about errors right now. + * complete() { + * console.log('Sum equals: ' + this.sum); + * } + * }; + * + * Rx.Observable.of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes. + * .subscribe(sumObserver); + * + * // Logs: + * // "Adding: 1" + * // "Adding: 2" + * // "Adding: 3" + * // "Sum equals: 6" + * + * + * @example Subscribe with functions + * let sum = 0; + * + * Rx.Observable.of(1, 2, 3) + * .subscribe( + * function(value) { + * console.log('Adding: ' + value); + * sum = sum + value; + * }, + * undefined, + * function() { + * console.log('Sum equals: ' + sum); + * } + * ); + * + * // Logs: + * // "Adding: 1" + * // "Adding: 2" + * // "Adding: 3" + * // "Sum equals: 6" + * + * + * @example Cancel a subscription + * const subscription = Rx.Observable.interval(1000).subscribe( + * num => console.log(num), + * undefined, + * () => console.log('completed!') // Will not be called, even + * ); // when cancelling subscription + * + * + * setTimeout(() => { + * subscription.unsubscribe(); + * console.log('unsubscribed!'); + * }, 2500); + * + * // Logs: + * // 0 after 1s + * // 1 after 2s + * // "unsubscribed!" after 2,5s + * + * + * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called, + * or the first of three possible handlers, which is the handler for each value emitted from the subscribed + * Observable. + * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided, + * the error will be thrown as unhandled. + * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion. + * @return {ISubscription} a subscription reference to the registered handlers + * @method subscribe */ Observable.prototype.subscribe = function (observerOrNext, error, complete) { var operator = this.operator; var sink = toSubscriber_1.toSubscriber(observerOrNext, error, complete); if (operator) { - operator.call(sink, this); + operator.call(sink, this.source); } else { - sink.add(this._subscribe(sink)); + sink.add(this.source ? this._subscribe(sink) : this._trySubscribe(sink)); } if (sink.syncErrorThrowable) { sink.syncErrorThrowable = false; @@ -5445,6 +5726,16 @@ var Observable = (function () { } return sink; }; + Observable.prototype._trySubscribe = function (sink) { + try { + return this._subscribe(sink); + } + catch (err) { + sink.syncErrorThrown = true; + sink.syncErrorValue = err; + sink.error(err); + } + }; /** * @method forEach * @param {Function} next a handler for each value emitted by the observable @@ -5466,7 +5757,10 @@ var Observable = (function () { throw new Error('no Promise impl found'); } return new PromiseCtor(function (resolve, reject) { - var subscription = _this.subscribe(function (value) { + // Must be declared in a separate statement to avoid a RefernceError when + // accessing subscription below in the closure due to Temporal Dead Zone. + var subscription; + subscription = _this.subscribe(function (value) { if (subscription) { // if there is a subscription, then we can surmise // the next handling is asynchronous. Any errors thrown @@ -5500,7 +5794,7 @@ var Observable = (function () { * @method Symbol.observable * @return {Observable} this instance of the observable */ - Observable.prototype[observable_1.$$observable] = function () { + Observable.prototype[observable_1.observable] = function () { return this; }; // HACK: Since TypeScript inherits static properties too, we have to @@ -5520,7 +5814,7 @@ var Observable = (function () { }()); exports.Observable = Observable; -},{"./symbol/observable":141,"./util/root":153,"./util/toSubscriber":155}],29:[function(require,module,exports){ +},{"./symbol/observable":159,"./util/root":176,"./util/toSubscriber":178}],30:[function(require,module,exports){ "use strict"; exports.empty = { closed: true, @@ -5529,7 +5823,7 @@ exports.empty = { complete: function () { } }; -},{}],30:[function(require,module,exports){ +},{}],31:[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]; @@ -5560,7 +5854,7 @@ var OuterSubscriber = (function (_super) { }(Subscriber_1.Subscriber)); exports.OuterSubscriber = OuterSubscriber; -},{"./Subscriber":35}],31:[function(require,module,exports){ +},{"./Subscriber":36}],32:[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]; @@ -5569,7 +5863,10 @@ 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 ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError'); +var SubjectSubscription_1 = require('./SubjectSubscription'); /** * @class ReplaySubject */ @@ -5593,6 +5890,20 @@ var ReplaySubject = (function (_super) { ReplaySubject.prototype._subscribe = function (subscriber) { var _events = this._trimBufferThenGetEvents(); var scheduler = this.scheduler; + var subscription; + if (this.closed) { + throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError(); + } + else if (this.hasError) { + subscription = Subscription_1.Subscription.EMPTY; + } + else if (this.isStopped) { + subscription = Subscription_1.Subscription.EMPTY; + } + else { + this.observers.push(subscriber); + subscription = new SubjectSubscription_1.SubjectSubscription(this, subscriber); + } if (scheduler) { subscriber.add(subscriber = new observeOn_1.ObserveOnSubscriber(subscriber, scheduler)); } @@ -5600,7 +5911,13 @@ var ReplaySubject = (function (_super) { for (var i = 0; i < len && !subscriber.closed; i++) { subscriber.next(_events[i].value); } - return _super.prototype._subscribe.call(this, subscriber); + if (this.hasError) { + subscriber.error(this.thrownError); + } + else if (this.isStopped) { + subscriber.complete(); + } + return subscription; }; ReplaySubject.prototype._getNow = function () { return (this.scheduler || queue_1.queue).now(); @@ -5640,7 +5957,7 @@ var ReplayEvent = (function () { return ReplayEvent; }()); -},{"./Subject":33,"./operator/observeOn":118,"./scheduler/queue":139}],32:[function(require,module,exports){ +},{"./Subject":34,"./SubjectSubscription":35,"./Subscription":37,"./operator/observeOn":131,"./scheduler/queue":157,"./util/ObjectUnsubscribedError":164}],33:[function(require,module,exports){ "use strict"; /** * An execution context and a data structure to order tasks and schedule their @@ -5690,7 +6007,7 @@ var Scheduler = (function () { }()); exports.Scheduler = Scheduler; -},{}],33:[function(require,module,exports){ +},{}],34:[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]; @@ -5728,7 +6045,7 @@ var Subject = (function (_super) { this.hasError = false; this.thrownError = null; } - Subject.prototype[rxSubscriber_1.$$rxSubscriber] = function () { + Subject.prototype[rxSubscriber_1.rxSubscriber] = function () { return new SubjectSubscriber(this); }; Subject.prototype.lift = function (operator) { @@ -5782,6 +6099,14 @@ var Subject = (function (_super) { this.closed = true; this.observers = null; }; + Subject.prototype._trySubscribe = function (subscriber) { + if (this.closed) { + throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError(); + } + else { + return _super.prototype._trySubscribe.call(this, subscriber); + } + }; Subject.prototype._subscribe = function (subscriber) { if (this.closed) { throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError(); @@ -5851,7 +6176,7 @@ var AnonymousSubject = (function (_super) { }(Subject)); exports.AnonymousSubject = AnonymousSubject; -},{"./Observable":28,"./SubjectSubscription":34,"./Subscriber":35,"./Subscription":36,"./symbol/rxSubscriber":142,"./util/ObjectUnsubscribedError":145}],34:[function(require,module,exports){ +},{"./Observable":29,"./SubjectSubscription":35,"./Subscriber":36,"./Subscription":37,"./symbol/rxSubscriber":160,"./util/ObjectUnsubscribedError":164}],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]; @@ -5892,7 +6217,7 @@ var SubjectSubscription = (function (_super) { }(Subscription_1.Subscription)); exports.SubjectSubscription = SubjectSubscription; -},{"./Subscription":36}],35:[function(require,module,exports){ +},{"./Subscription":37}],36:[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]; @@ -5955,7 +6280,7 @@ var Subscriber = (function (_super) { break; } } - Subscriber.prototype[rxSubscriber_1.$$rxSubscriber] = function () { return this; }; + Subscriber.prototype[rxSubscriber_1.rxSubscriber] = function () { return this; }; /** * A static factory for a Subscriber, given a (potentially partial) definition * of an Observer. @@ -6027,6 +6352,17 @@ var Subscriber = (function (_super) { this.destination.complete(); this.unsubscribe(); }; + Subscriber.prototype._unsubscribeAndRecycle = function () { + var _a = this, _parent = _a._parent, _parents = _a._parents; + this._parent = null; + this._parents = null; + this.unsubscribe(); + this.closed = false; + this.isStopped = false; + this._parent = _parent; + this._parents = _parents; + return this; + }; return Subscriber; }(Subscription_1.Subscription)); exports.Subscriber = Subscriber; @@ -6037,23 +6373,25 @@ exports.Subscriber = Subscriber; */ var SafeSubscriber = (function (_super) { __extends(SafeSubscriber, _super); - function SafeSubscriber(_parent, observerOrNext, error, complete) { + function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) { _super.call(this); - this._parent = _parent; + this._parentSubscriber = _parentSubscriber; var next; var context = this; if (isFunction_1.isFunction(observerOrNext)) { next = observerOrNext; } else if (observerOrNext) { - context = observerOrNext; next = observerOrNext.next; error = observerOrNext.error; complete = observerOrNext.complete; - if (isFunction_1.isFunction(context.unsubscribe)) { - this.add(context.unsubscribe.bind(context)); + if (observerOrNext !== Observer_1.empty) { + context = Object.create(observerOrNext); + if (isFunction_1.isFunction(context.unsubscribe)) { + this.add(context.unsubscribe.bind(context)); + } + context.unsubscribe = this.unsubscribe.bind(this); } - context.unsubscribe = this.unsubscribe.bind(this); } this._context = context; this._next = next; @@ -6062,49 +6400,51 @@ var SafeSubscriber = (function (_super) { } SafeSubscriber.prototype.next = function (value) { if (!this.isStopped && this._next) { - var _parent = this._parent; - if (!_parent.syncErrorThrowable) { + var _parentSubscriber = this._parentSubscriber; + if (!_parentSubscriber.syncErrorThrowable) { this.__tryOrUnsub(this._next, value); } - else if (this.__tryOrSetError(_parent, this._next, value)) { + else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) { this.unsubscribe(); } } }; SafeSubscriber.prototype.error = function (err) { if (!this.isStopped) { - var _parent = this._parent; + var _parentSubscriber = this._parentSubscriber; if (this._error) { - if (!_parent.syncErrorThrowable) { + if (!_parentSubscriber.syncErrorThrowable) { this.__tryOrUnsub(this._error, err); this.unsubscribe(); } else { - this.__tryOrSetError(_parent, this._error, err); + this.__tryOrSetError(_parentSubscriber, this._error, err); this.unsubscribe(); } } - else if (!_parent.syncErrorThrowable) { + else if (!_parentSubscriber.syncErrorThrowable) { this.unsubscribe(); throw err; } else { - _parent.syncErrorValue = err; - _parent.syncErrorThrown = true; + _parentSubscriber.syncErrorValue = err; + _parentSubscriber.syncErrorThrown = true; this.unsubscribe(); } } }; SafeSubscriber.prototype.complete = function () { + var _this = this; if (!this.isStopped) { - var _parent = this._parent; + var _parentSubscriber = this._parentSubscriber; if (this._complete) { - if (!_parent.syncErrorThrowable) { - this.__tryOrUnsub(this._complete); + var wrappedComplete = function () { return _this._complete.call(_this._context); }; + if (!_parentSubscriber.syncErrorThrowable) { + this.__tryOrUnsub(wrappedComplete); this.unsubscribe(); } else { - this.__tryOrSetError(_parent, this._complete); + this.__tryOrSetError(_parentSubscriber, wrappedComplete); this.unsubscribe(); } } @@ -6134,15 +6474,15 @@ var SafeSubscriber = (function (_super) { return false; }; SafeSubscriber.prototype._unsubscribe = function () { - var _parent = this._parent; + var _parentSubscriber = this._parentSubscriber; this._context = null; - this._parent = null; - _parent.unsubscribe(); + this._parentSubscriber = null; + _parentSubscriber.unsubscribe(); }; return SafeSubscriber; }(Subscriber)); -},{"./Observer":29,"./Subscription":36,"./symbol/rxSubscriber":142,"./util/isFunction":149}],36:[function(require,module,exports){ +},{"./Observer":30,"./Subscription":37,"./symbol/rxSubscriber":160,"./util/isFunction":171}],37:[function(require,module,exports){ "use strict"; var isArray_1 = require('./util/isArray'); var isObject_1 = require('./util/isObject'); @@ -6173,6 +6513,9 @@ var Subscription = (function () { * @type {boolean} */ this.closed = false; + this._parent = null; + this._parents = null; + this._subscriptions = null; if (unsubscribe) { this._unsubscribe = unsubscribe; } @@ -6189,19 +6532,34 @@ var Subscription = (function () { if (this.closed) { return; } + var _a = this, _parent = _a._parent, _parents = _a._parents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions; this.closed = true; - var _a = this, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions; + this._parent = null; + this._parents = null; + // null out _subscriptions first so any child subscriptions that attempt + // to remove themselves from this subscription will noop this._subscriptions = null; + var index = -1; + var len = _parents ? _parents.length : 0; + // if this._parent is null, then so is this._parents, and we + // don't have to remove ourselves from any parent subscriptions. + while (_parent) { + _parent.remove(this); + // if this._parents is null or index >= len, + // then _parent is set to null, and the loop exits + _parent = ++index < len && _parents[index] || null; + } if (isFunction_1.isFunction(_unsubscribe)) { var trial = tryCatch_1.tryCatch(_unsubscribe).call(this); if (trial === errorObject_1.errorObject) { hasErrors = true; - (errors = errors || []).push(errorObject_1.errorObject.e); + errors = errors || (errorObject_1.errorObject.e instanceof UnsubscriptionError_1.UnsubscriptionError ? + flattenUnsubscriptionErrors(errorObject_1.errorObject.e.errors) : [errorObject_1.errorObject.e]); } } if (isArray_1.isArray(_subscriptions)) { - var index = -1; - var len = _subscriptions.length; + index = -1; + len = _subscriptions.length; while (++index < len) { var sub = _subscriptions[index]; if (isObject_1.isObject(sub)) { @@ -6211,7 +6569,7 @@ var Subscription = (function () { errors = errors || []; var err = errorObject_1.errorObject.e; if (err instanceof UnsubscriptionError_1.UnsubscriptionError) { - errors = errors.concat(err.errors); + errors = errors.concat(flattenUnsubscriptionErrors(err.errors)); } else { errors.push(err); @@ -6249,25 +6607,31 @@ var Subscription = (function () { if (teardown === this) { return this; } - var sub = teardown; + var subscription = teardown; switch (typeof teardown) { case 'function': - sub = new Subscription(teardown); + subscription = new Subscription(teardown); case 'object': - if (sub.closed || typeof sub.unsubscribe !== 'function') { - break; + if (subscription.closed || typeof subscription.unsubscribe !== 'function') { + return subscription; } else if (this.closed) { - sub.unsubscribe(); + subscription.unsubscribe(); + return subscription; } - else { - (this._subscriptions || (this._subscriptions = [])).push(sub); + else if (typeof subscription._addParent !== 'function' /* quack quack */) { + var tmp = subscription; + subscription = new Subscription(); + subscription._subscriptions = [tmp]; } break; default: throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.'); } - return sub; + var subscriptions = this._subscriptions || (this._subscriptions = []); + subscriptions.push(subscription); + subscription._addParent(this); + return subscription; }; /** * Removes a Subscription from the internal list of subscriptions that will @@ -6276,10 +6640,6 @@ var Subscription = (function () { * @return {void} */ Subscription.prototype.remove = function (subscription) { - // HACK: This might be redundant because of the logic in `add()` - if (subscription == null || (subscription === this) || (subscription === Subscription.EMPTY)) { - return; - } var subscriptions = this._subscriptions; if (subscriptions) { var subscriptionIndex = subscriptions.indexOf(subscription); @@ -6288,6 +6648,23 @@ var Subscription = (function () { } } }; + Subscription.prototype._addParent = function (parent) { + var _a = this, _parent = _a._parent, _parents = _a._parents; + if (!_parent || _parent === parent) { + // If we don't have a parent, or the new parent is the same as the + // current parent, then set this._parent to the new parent. + this._parent = parent; + } + else if (!_parents) { + // If there's already one parent, but not multiple, allocate an Array to + // store the rest of the parent Subscriptions. + this._parents = [parent]; + } + else if (_parents.indexOf(parent) === -1) { + // Only add the new parent to the _parents list if it's not already there. + _parents.push(parent); + } + }; Subscription.EMPTY = (function (empty) { empty.closed = true; return empty; @@ -6295,258 +6672,309 @@ var Subscription = (function () { return Subscription; }()); exports.Subscription = Subscription; +function flattenUnsubscriptionErrors(errors) { + return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError_1.UnsubscriptionError) ? err.errors : err); }, []); +} -},{"./util/UnsubscriptionError":146,"./util/errorObject":147,"./util/isArray":148,"./util/isFunction":149,"./util/isObject":150,"./util/tryCatch":156}],37:[function(require,module,exports){ +},{"./util/UnsubscriptionError":166,"./util/errorObject":167,"./util/isArray":168,"./util/isFunction":171,"./util/isObject":173,"./util/tryCatch":179}],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":28,"../../observable/combineLatest":90}],38:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/combineLatest":99}],39:[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":28,"../../observable/defer":91}],39:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/defer":100}],40:[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":28,"../../observable/empty":92}],40:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/empty":101}],41:[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":28,"../../observable/from":93}],41:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/from":102}],42:[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":28,"../../observable/fromEvent":94}],42:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/fromEvent":103}],43:[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":28,"../../observable/fromPromise":95}],43:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/fromPromise":104}],44:[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":28,"../../observable/merge":96}],44:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/merge":105}],45:[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":28,"../../observable/of":97}],45:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/of":106}],46:[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":28,"../../observable/throw":98}],46:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/throw":107}],47:[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":108}],48:[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":28,"../../observable/zip":99}],47:[function(require,module,exports){ +},{"../../Observable":29,"../../observable/zip":109}],49:[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":28,"../../operator/buffer":100}],48:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/buffer":110}],50:[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":111}],51:[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":112}],52:[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":28,"../../operator/catch":101}],49:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/catch":113}],53:[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":28,"../../operator/combineLatest":102}],50:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/combineLatest":114}],54:[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":28,"../../operator/concat":103}],51:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/concat":115}],55:[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":28,"../../operator/debounceTime":104}],52:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/debounceTime":116}],56:[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":117}],57:[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":28,"../../operator/distinct":105}],53:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/distinct":118}],58:[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":28,"../../operator/distinctUntilChanged":106}],54:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/distinctUntilChanged":119}],59:[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":28,"../../operator/do":107}],55:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/do":120}],60:[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":28,"../../operator/expand":108}],56:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/expand":121}],61:[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":28,"../../operator/filter":109}],57:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/filter":122}],62:[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":28,"../../operator/finally":110}],58:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/finally":123}],63:[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":28,"../../operator/first":111}],59:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/first":124}],64:[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":28,"../../operator/last":112}],60:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/last":125}],65:[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":28,"../../operator/map":113}],61:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/map":126}],66:[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":28,"../../operator/merge":114}],62:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/merge":127}],67:[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":28,"../../operator/mergeAll":115}],63:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/mergeAll":128}],68:[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":28,"../../operator/mergeMap":116}],64:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/mergeMap":129}],69:[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":28,"../../operator/pairwise":119}],65:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/pairwise":132}],70:[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":28,"../../operator/pluck":120}],66:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/pluck":133}],71:[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":28,"../../operator/publish":121}],67:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/publish":134}],72:[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":28,"../../operator/publishReplay":122}],68:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/publishReplay":135}],73:[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":136}],74:[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":28,"../../operator/scan":123}],69:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/scan":137}],75:[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":28,"../../operator/share":124}],70:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/share":138}],76:[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":28,"../../operator/skip":125}],71:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/skip":139}],77:[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":28,"../../operator/skipUntil":126}],72:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/skipUntil":140}],78:[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":141}],79:[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":28,"../../operator/startWith":127}],73:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/startWith":142}],80:[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":28,"../../operator/switchMap":128}],74:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/switchMap":143}],81:[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":28,"../../operator/take":129}],75:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/take":144}],82:[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":28,"../../operator/takeUntil":130}],76:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/takeUntil":145}],83:[function(require,module,exports){ +"use strict"; +var Observable_1 = require('../../Observable'); +var takeWhile_1 = require('../../operator/takeWhile'); +Observable_1.Observable.prototype.takeWhile = takeWhile_1.takeWhile; + +},{"../../Observable":29,"../../operator/takeWhile":146}],84:[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; + +},{"../../Observable":29,"../../operator/throttleTime":148}],85:[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":28,"../../operator/withLatestFrom":131}],77:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/withLatestFrom":149}],86:[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":28,"../../operator/zip":132}],78:[function(require,module,exports){ +},{"../../Observable":29,"../../operator/zip":150}],87:[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]; @@ -6617,7 +7045,7 @@ var ArrayLikeObservable = (function (_super) { }(Observable_1.Observable)); exports.ArrayLikeObservable = ArrayLikeObservable; -},{"../Observable":28,"./EmptyObservable":82,"./ScalarObservable":89}],79:[function(require,module,exports){ +},{"../Observable":29,"./EmptyObservable":91,"./ScalarObservable":97}],88:[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]; @@ -6659,8 +7087,8 @@ var ArrayObservable = (function (_super) { * This static operator is useful for creating a simple Observable that only * emits the arguments given, and the complete notification thereafter. It can * be used for composing with other Observables, such as with {@link concat}. - * By default, it uses a `null` Scheduler, which means the `next` - * notifications are sent synchronously, although with a different Scheduler + * By default, it uses a `null` IScheduler, which means the `next` + * notifications are sent synchronously, although with a different IScheduler * it is possible to determine when those notifications will be delivered. * * @example Emit 10, 20, 30, then 'a', 'b', 'c', then start ticking every second. @@ -6676,7 +7104,7 @@ var ArrayObservable = (function (_super) { * @see {@link throw} * * @param {...T} values Arguments that represent `next` values to be emitted. - * @param {Scheduler} [scheduler] A {@link Scheduler} to use for scheduling + * @param {Scheduler} [scheduler] A {@link IScheduler} to use for scheduling * the emissions of the `next` notifications. * @return {Observable} An Observable that emits each given input value. * @static true @@ -6740,7 +7168,7 @@ var ArrayObservable = (function (_super) { }(Observable_1.Observable)); exports.ArrayObservable = ArrayObservable; -},{"../Observable":28,"../util/isScheduler":152,"./EmptyObservable":82,"./ScalarObservable":89}],80:[function(require,module,exports){ +},{"../Observable":29,"../util/isScheduler":175,"./EmptyObservable":91,"./ScalarObservable":97}],89:[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]; @@ -6761,6 +7189,7 @@ var ConnectableObservable = (function (_super) { this.source = source; this.subjectFactory = subjectFactory; this._refCount = 0; + this._isComplete = false; } ConnectableObservable.prototype._subscribe = function (subscriber) { return this.getSubject().subscribe(subscriber); @@ -6775,6 +7204,7 @@ var ConnectableObservable = (function (_super) { ConnectableObservable.prototype.connect = function () { var connection = this._connection; if (!connection) { + this._isComplete = false; connection = this._connection = new Subscription_1.Subscription(); connection.add(this.source .subscribe(new ConnectableSubscriber(this.getSubject(), this))); @@ -6794,6 +7224,18 @@ var ConnectableObservable = (function (_super) { return ConnectableObservable; }(Observable_1.Observable)); exports.ConnectableObservable = ConnectableObservable; +var connectableProto = ConnectableObservable.prototype; +exports.connectableObservableDescriptor = { + operator: { value: null }, + _refCount: { value: 0, writable: true }, + _subject: { value: null, writable: true }, + _connection: { value: null, writable: true }, + _subscribe: { value: connectableProto._subscribe }, + _isComplete: { value: connectableProto._isComplete, writable: true }, + getSubject: { value: connectableProto.getSubject }, + connect: { value: connectableProto.connect }, + refCount: { value: connectableProto.refCount } +}; var ConnectableSubscriber = (function (_super) { __extends(ConnectableSubscriber, _super); function ConnectableSubscriber(destination, connectable) { @@ -6805,6 +7247,7 @@ var ConnectableSubscriber = (function (_super) { _super.prototype._error.call(this, err); }; ConnectableSubscriber.prototype._complete = function () { + this.connectable._isComplete = true; this._unsubscribe(); _super.prototype._complete.call(this); }; @@ -6831,7 +7274,7 @@ var RefCountOperator = (function () { var connectable = this.connectable; connectable._refCount++; var refCounter = new RefCountSubscriber(subscriber, connectable); - var subscription = source._subscribe(refCounter); + var subscription = source.subscribe(refCounter); if (!refCounter.closed) { refCounter.connection = connectable.connect(); } @@ -6866,7 +7309,7 @@ var RefCountSubscriber = (function (_super) { // 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 dowstream Observers synchronously unsubscribe, + // 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: @@ -6895,7 +7338,7 @@ var RefCountSubscriber = (function (_super) { return RefCountSubscriber; }(Subscriber_1.Subscriber)); -},{"../Observable":28,"../Subject":33,"../Subscriber":35,"../Subscription":36}],81:[function(require,module,exports){ +},{"../Observable":29,"../Subject":34,"../Subscriber":36,"../Subscription":37}],90:[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]; @@ -6944,9 +7387,15 @@ var DeferObservable = (function (_super) { * }); * clicksOrInterval.subscribe(x => console.log(x)); * + * // Results in the following behavior: + * // If the result of Math.random() is greater than 0.5 it will listen + * // for clicks anywhere on the "document"; when document is clicked it + * // will log a MouseEvent object to the console. If the result is less + * // than 0.5 it will emit ascending numbers, one every second(1000ms). + * * @see {@link create} * - * @param {function(): Observable|Promise} observableFactory The Observable + * @param {function(): SubscribableOrPromise} observableFactory The Observable * factory function to invoke for each Observer that subscribes to the output * Observable. May also return a Promise, which will be converted on the fly * to an Observable. @@ -6989,7 +7438,7 @@ var DeferSubscriber = (function (_super) { return DeferSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../Observable":28,"../OuterSubscriber":30,"../util/subscribeToResult":154}],82:[function(require,module,exports){ +},{"../Observable":29,"../OuterSubscriber":31,"../util/subscribeToResult":177}],91:[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]; @@ -7032,12 +7481,18 @@ var EmptyObservable = (function (_super) { * ); * result.subscribe(x => console.log(x)); * + * // Results in the following to the console: + * // x is equal to the count on the interval eg(0,1,2,3,...) + * // x will occur every 1000ms + * // if x % 2 is equal to 1 print abc + * // if x % 2 is not equal to 1 nothing will be output + * * @see {@link create} * @see {@link never} * @see {@link of} * @see {@link throw} * - * @param {Scheduler} [scheduler] A {@link Scheduler} to use for scheduling + * @param {Scheduler} [scheduler] A {@link IScheduler} to use for scheduling * the emission of the complete notification. * @return {Observable} An "empty" Observable: emits only the complete * notification. @@ -7065,7 +7520,7 @@ var EmptyObservable = (function (_super) { }(Observable_1.Observable)); exports.EmptyObservable = EmptyObservable; -},{"../Observable":28}],83:[function(require,module,exports){ +},{"../Observable":29}],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]; @@ -7102,7 +7557,7 @@ var ErrorObservable = (function (_super) { * var result = Rx.Observable.throw(new Error('oops!')).startWith(7); * result.subscribe(x => console.log(x), e => console.error(e)); * - * @example Map and flattens numbers to the sequence 'a', 'b', 'c', but throw an error for 13 + * @example Map and flatten numbers to the sequence 'a', 'b', 'c', but throw an error for 13 * var interval = Rx.Observable.interval(1000); * var result = interval.mergeMap(x => * x === 13 ? @@ -7117,7 +7572,7 @@ var ErrorObservable = (function (_super) { * @see {@link of} * * @param {any} error The particular Error to pass to the error notification. - * @param {Scheduler} [scheduler] A {@link Scheduler} to use for scheduling + * @param {Scheduler} [scheduler] A {@link IScheduler} to use for scheduling * the emission of the error notification. * @return {Observable} An error Observable: emits only the error notification * using the given error argument. @@ -7135,6 +7590,7 @@ var ErrorObservable = (function (_super) { ErrorObservable.prototype._subscribe = function (subscriber) { var error = this.error; var scheduler = this.scheduler; + subscriber.syncErrorThrowable = true; if (scheduler) { return scheduler.schedule(ErrorObservable.dispatch, 0, { error: error, subscriber: subscriber @@ -7148,7 +7604,7 @@ var ErrorObservable = (function (_super) { }(Observable_1.Observable)); exports.ErrorObservable = ErrorObservable; -},{"../Observable":28}],84:[function(require,module,exports){ +},{"../Observable":29}],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]; @@ -7160,17 +7616,18 @@ var tryCatch_1 = require('../util/tryCatch'); var isFunction_1 = require('../util/isFunction'); var errorObject_1 = require('../util/errorObject'); var Subscription_1 = require('../Subscription'); -function isNodeStyleEventEmmitter(sourceObj) { +var toString = Object.prototype.toString; +function isNodeStyleEventEmitter(sourceObj) { return !!sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function'; } function isJQueryStyleEventEmitter(sourceObj) { return !!sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function'; } function isNodeList(sourceObj) { - return !!sourceObj && sourceObj.toString() === '[object NodeList]'; + return !!sourceObj && toString.call(sourceObj) === '[object NodeList]'; } function isHTMLCollection(sourceObj) { - return !!sourceObj && sourceObj.toString() === '[object HTMLCollection]'; + return !!sourceObj && toString.call(sourceObj) === '[object HTMLCollection]'; } function isEventTarget(sourceObj) { return !!sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function'; @@ -7210,6 +7667,10 @@ var FromEventObservable = (function (_super) { * var clicks = Rx.Observable.fromEvent(document, 'click'); * clicks.subscribe(x => console.log(x)); * + * // Results in: + * // MouseEvent object logged to console everytime a click + * // occurs on the document. + * * @see {@link from} * @see {@link fromEventPattern} * @@ -7217,7 +7678,7 @@ var FromEventObservable = (function (_super) { * EventEmitter, NodeList or HTMLCollection to attach the event handler to. * @param {string} eventName The event name of interest, being emitted by the * `target`. - * @parm {EventListenerOptions} [options] Options to pass through to addEventListener + * @param {EventListenerOptions} [options] Options to pass through to addEventListener * @param {SelectorMethodSignature} [selector] An optional function to * post-process results. It takes the arguments from the event handler and * should return a single value. @@ -7250,11 +7711,14 @@ var FromEventObservable = (function (_super) { sourceObj.on(eventName, handler); unsubscribe = function () { return source_2.off(eventName, handler); }; } - else if (isNodeStyleEventEmmitter(sourceObj)) { + else if (isNodeStyleEventEmitter(sourceObj)) { var source_3 = sourceObj; sourceObj.addListener(eventName, handler); unsubscribe = function () { return source_3.removeListener(eventName, handler); }; } + else { + throw new TypeError('Invalid event target'); + } subscriber.add(new Subscription_1.Subscription(unsubscribe)); }; FromEventObservable.prototype._subscribe = function (subscriber) { @@ -7281,7 +7745,7 @@ var FromEventObservable = (function (_super) { }(Observable_1.Observable)); exports.FromEventObservable = FromEventObservable; -},{"../Observable":28,"../Subscription":36,"../util/errorObject":147,"../util/isFunction":149,"../util/tryCatch":156}],85:[function(require,module,exports){ +},{"../Observable":29,"../Subscription":37,"../util/errorObject":167,"../util/isFunction":171,"../util/tryCatch":179}],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]; @@ -7289,6 +7753,7 @@ var __extends = (this && this.__extends) || function (d, b) { d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var isArray_1 = require('../util/isArray'); +var isArrayLike_1 = require('../util/isArrayLike'); var isPromise_1 = require('../util/isPromise'); var PromiseObservable_1 = require('./PromiseObservable'); var IteratorObservable_1 = require('./IteratorObservable'); @@ -7298,7 +7763,6 @@ var iterator_1 = require('../symbol/iterator'); var Observable_1 = require('../Observable'); var observeOn_1 = require('../operator/observeOn'); var observable_1 = require('../symbol/observable'); -var isArrayLike = (function (x) { return x && typeof x.length === 'number'; }); /** * We need this JSDoc comment for affecting ESDoc. * @extends {Ignored} @@ -7332,6 +7796,9 @@ var FromObservable = (function (_super) { * var result = Rx.Observable.from(array); * result.subscribe(x => console.log(x)); * + * // Results in the following: + * // 10 20 30 + * * @example Convert an infinite iterable (from a generator) to an Observable * function* generateDoubles(seed) { * var i = seed; @@ -7345,6 +7812,9 @@ var FromObservable = (function (_super) { * var result = Rx.Observable.from(iterator).take(10); * result.subscribe(x => console.log(x)); * + * // Results in the following: + * // 3 6 12 24 48 96 192 384 768 1536 + * * @see {@link create} * @see {@link fromEvent} * @see {@link fromEventPattern} @@ -7363,7 +7833,7 @@ var FromObservable = (function (_super) { */ FromObservable.create = function (ish, scheduler) { if (ish != null) { - if (typeof ish[observable_1.$$observable] === 'function') { + if (typeof ish[observable_1.observable] === 'function') { if (ish instanceof Observable_1.Observable && !scheduler) { return ish; } @@ -7375,10 +7845,10 @@ var FromObservable = (function (_super) { else if (isPromise_1.isPromise(ish)) { return new PromiseObservable_1.PromiseObservable(ish, scheduler); } - else if (typeof ish[iterator_1.$$iterator] === 'function' || typeof ish === 'string') { + else if (typeof ish[iterator_1.iterator] === 'function' || typeof ish === 'string') { return new IteratorObservable_1.IteratorObservable(ish, scheduler); } - else if (isArrayLike(ish)) { + else if (isArrayLike_1.isArrayLike(ish)) { return new ArrayLikeObservable_1.ArrayLikeObservable(ish, scheduler); } } @@ -7388,17 +7858,17 @@ var FromObservable = (function (_super) { var ish = this.ish; var scheduler = this.scheduler; if (scheduler == null) { - return ish[observable_1.$$observable]().subscribe(subscriber); + return ish[observable_1.observable]().subscribe(subscriber); } else { - return ish[observable_1.$$observable]().subscribe(new observeOn_1.ObserveOnSubscriber(subscriber, scheduler, 0)); + return ish[observable_1.observable]().subscribe(new observeOn_1.ObserveOnSubscriber(subscriber, scheduler, 0)); } }; return FromObservable; }(Observable_1.Observable)); exports.FromObservable = FromObservable; -},{"../Observable":28,"../operator/observeOn":118,"../symbol/iterator":140,"../symbol/observable":141,"../util/isArray":148,"../util/isPromise":151,"./ArrayLikeObservable":78,"./ArrayObservable":79,"./IteratorObservable":86,"./PromiseObservable":88}],86:[function(require,module,exports){ +},{"../Observable":29,"../operator/observeOn":131,"../symbol/iterator":158,"../symbol/observable":159,"../util/isArray":168,"../util/isArrayLike":169,"../util/isPromise":174,"./ArrayLikeObservable":87,"./ArrayObservable":88,"./IteratorObservable":95,"./PromiseObservable":96}],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]; @@ -7440,6 +7910,9 @@ var IteratorObservable = (function (_super) { subscriber.next(result.value); state.index = index + 1; if (subscriber.closed) { + if (typeof iterator.return === 'function') { + iterator.return(); + } return; } this.schedule(state); @@ -7463,6 +7936,9 @@ var IteratorObservable = (function (_super) { subscriber.next(result.value); } if (subscriber.closed) { + if (typeof iterator.return === 'function') { + iterator.return(); + } break; } } while (true); @@ -7479,7 +7955,7 @@ var StringIterator = (function () { this.idx = idx; this.len = len; } - StringIterator.prototype[iterator_1.$$iterator] = function () { return (this); }; + StringIterator.prototype[iterator_1.iterator] = function () { return (this); }; StringIterator.prototype.next = function () { return this.idx < this.len ? { done: false, @@ -7499,7 +7975,7 @@ var ArrayIterator = (function () { this.idx = idx; this.len = len; } - ArrayIterator.prototype[iterator_1.$$iterator] = function () { return this; }; + ArrayIterator.prototype[iterator_1.iterator] = function () { return this; }; ArrayIterator.prototype.next = function () { return this.idx < this.len ? { done: false, @@ -7512,7 +7988,7 @@ var ArrayIterator = (function () { return ArrayIterator; }()); function getIterator(obj) { - var i = obj[iterator_1.$$iterator]; + var i = obj[iterator_1.iterator]; if (!i && typeof obj === 'string') { return new StringIterator(obj); } @@ -7522,7 +7998,7 @@ function getIterator(obj) { if (!i) { throw new TypeError('object is not iterable'); } - return obj[iterator_1.$$iterator](); + return obj[iterator_1.iterator](); } var maxSafeInteger = Math.pow(2, 53) - 1; function toLength(o) { @@ -7556,35 +8032,7 @@ function sign(value) { return valueAsNumber < 0 ? -1 : 1; } -},{"../Observable":28,"../symbol/iterator":140,"../util/root":153}],87:[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 Observable_1 = require('../Observable'); -var ConnectableObservable_1 = require('../observable/ConnectableObservable'); -var MulticastObservable = (function (_super) { - __extends(MulticastObservable, _super); - function MulticastObservable(source, subjectFactory, selector) { - _super.call(this); - this.source = source; - this.subjectFactory = subjectFactory; - this.selector = selector; - } - MulticastObservable.prototype._subscribe = function (subscriber) { - var _a = this, selector = _a.selector, source = _a.source; - var connectable = new ConnectableObservable_1.ConnectableObservable(source, this.subjectFactory); - var subscription = selector(connectable).subscribe(subscriber); - subscription.add(connectable.connect()); - return subscription; - }; - return MulticastObservable; -}(Observable_1.Observable)); -exports.MulticastObservable = MulticastObservable; - -},{"../Observable":28,"../observable/ConnectableObservable":80}],88:[function(require,module,exports){ +},{"../Observable":29,"../symbol/iterator":158,"../util/root":176}],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]; @@ -7623,8 +8071,8 @@ var PromiseObservable = (function (_super) { * @see {@link bindCallback} * @see {@link from} * - * @param {Promise} promise The promise to be converted. - * @param {Scheduler} [scheduler] An optional Scheduler to use for scheduling + * @param {PromiseLike} promise The promise to be converted. + * @param {Scheduler} [scheduler] An optional IScheduler to use for scheduling * the delivery of the resolved value (or the rejection). * @return {Observable} An Observable which wraps the Promise. * @static true @@ -7706,7 +8154,7 @@ function dispatchError(arg) { } } -},{"../Observable":28,"../util/root":153}],89:[function(require,module,exports){ +},{"../Observable":29,"../util/root":176}],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]; @@ -7765,7 +8213,115 @@ var ScalarObservable = (function (_super) { }(Observable_1.Observable)); exports.ScalarObservable = ScalarObservable; -},{"../Observable":28}],90:[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]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var isNumeric_1 = require('../util/isNumeric'); +var Observable_1 = require('../Observable'); +var async_1 = require('../scheduler/async'); +var isScheduler_1 = require('../util/isScheduler'); +var isDate_1 = require('../util/isDate'); +/** + * We need this JSDoc comment for affecting ESDoc. + * @extends {Ignored} + * @hide true + */ +var TimerObservable = (function (_super) { + __extends(TimerObservable, _super); + function TimerObservable(dueTime, period, scheduler) { + if (dueTime === void 0) { dueTime = 0; } + _super.call(this); + this.period = -1; + this.dueTime = 0; + if (isNumeric_1.isNumeric(period)) { + this.period = Number(period) < 1 && 1 || Number(period); + } + else if (isScheduler_1.isScheduler(period)) { + scheduler = period; + } + if (!isScheduler_1.isScheduler(scheduler)) { + scheduler = async_1.async; + } + this.scheduler = scheduler; + this.dueTime = isDate_1.isDate(dueTime) ? + (+dueTime - this.scheduler.now()) : + dueTime; + } + /** + * Creates an Observable that starts emitting after an `initialDelay` and + * emits ever increasing numbers after each `period` of time thereafter. + * + * Its like {@link interval}, but you can specify when + * should the emissions start. + * + * + * + * `timer` returns an Observable that emits an infinite sequence of ascending + * integers, with a constant interval of time, `period` of your choosing + * between those emissions. The first emission happens after the specified + * `initialDelay`. The initial delay may be a {@link Date}. By default, this + * operator uses the `async` IScheduler to provide a notion of time, but you + * may pass any IScheduler to it. If `period` is not specified, the output + * Observable emits only one value, `0`. Otherwise, it emits an infinite + * sequence. + * + * @example Emits ascending numbers, one every second (1000ms), starting after 3 seconds + * var numbers = Rx.Observable.timer(3000, 1000); + * numbers.subscribe(x => console.log(x)); + * + * @example Emits one number after five seconds + * var numbers = Rx.Observable.timer(5000); + * numbers.subscribe(x => console.log(x)); + * + * @see {@link interval} + * @see {@link delay} + * + * @param {number|Date} initialDelay The initial delay time to wait before + * emitting the first value of `0`. + * @param {number} [period] The period of time between emissions of the + * subsequent numbers. + * @param {Scheduler} [scheduler=async] The IScheduler to use for scheduling + * the emission of values, and providing a notion of "time". + * @return {Observable} An Observable that emits a `0` after the + * `initialDelay` and ever increasing numbers after each `period` of time + * thereafter. + * @static true + * @name timer + * @owner Observable + */ + TimerObservable.create = function (initialDelay, period, scheduler) { + if (initialDelay === void 0) { initialDelay = 0; } + return new TimerObservable(initialDelay, period, scheduler); + }; + TimerObservable.dispatch = function (state) { + var index = state.index, period = state.period, subscriber = state.subscriber; + var action = this; + subscriber.next(index); + if (subscriber.closed) { + return; + } + else if (period === -1) { + return subscriber.complete(); + } + state.index = index + 1; + action.schedule(state, period); + }; + TimerObservable.prototype._subscribe = function (subscriber) { + var index = 0; + var _a = this, period = _a.period, dueTime = _a.dueTime, scheduler = _a.scheduler; + return scheduler.schedule(TimerObservable.dispatch, dueTime, { + index: index, period: period, subscriber: subscriber + }); + }; + return TimerObservable; +}(Observable_1.Observable)); +exports.TimerObservable = TimerObservable; + +},{"../Observable":29,"../scheduler/async":156,"../util/isDate":170,"../util/isNumeric":172,"../util/isScheduler":175}],99:[function(require,module,exports){ "use strict"; var isScheduler_1 = require('../util/isScheduler'); var isArray_1 = require('../util/isArray'); @@ -7783,30 +8339,95 @@ var combineLatest_1 = require('../operator/combineLatest'); * * * `combineLatest` combines the values from all the 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. + * arguments. This is done by subscribing to each Observable in order and, + * whenever any Observable emits, collecting an array of the most recent + * values from each Observable. So if you pass `n` Observables to operator, + * returned Observable will always emit an array of `n` values, in order + * corresponding to order of passed Observables (value from the first Observable + * on the first place and so on). * - * @example Dynamically calculate the Body-Mass Index from an Observable of weight and one for height + * Static version of `combineLatest` accepts either an array of Observables + * or each Observable can be put directly as an argument. Note that array of + * Observables is good choice, if you don't know beforehand how many Observables + * you will combine. Passing empty array will result in Observable that + * completes immediately. + * + * To ensure output array has always the same length, `combineLatest` will + * actually wait for all input Observables to emit at least once, + * before it starts emitting results. This means if some Observable emits + * values before other Observables started emitting, all that values but last + * will be lost. On the other hand, is some Observable does not emit value but + * completes, resulting Observable will complete at the same moment without + * emitting anything, since it will be now impossible to include value from + * completed Observable in resulting array. Also, if some input Observable does + * not emit any value and never completes, `combineLatest` will also never emit + * and never complete, since, again, it will wait for all streams to emit some + * value. + * + * If at least one Observable was passed to `combineLatest` and all passed Observables + * emitted something, resulting Observable will complete when all combined + * streams complete. So even if some Observable completes, result of + * `combineLatest` will still emit values when other Observables do. In case + * of completed Observable, its value from now on will always be the last + * emitted value. On the other hand, if any Observable errors, `combineLatest` + * will error immediately as well, and all other Observables will be unsubscribed. + * + * `combineLatest` accepts as optional parameter `project` function, which takes + * as arguments all values that would normally be emitted by resulting Observable. + * `project` can return any kind of value, which will be then emitted by Observable + * instead of default array. Note that `project` does not take as argument that array + * of values, but values themselves. That means default `project` can be imagined + * as function that takes all its arguments and puts them into an array. + * + * + * @example Combine two timer Observables + * const firstTimer = Rx.Observable.timer(0, 1000); // emit 0, 1, 2... after every second, starting from now + * const secondTimer = Rx.Observable.timer(500, 1000); // emit 0, 1, 2... after every second, starting 0,5s from now + * const combinedTimers = Rx.Observable.combineLatest(firstTimer, secondTimer); + * combinedTimers.subscribe(value => console.log(value)); + * // Logs + * // [0, 0] after 0.5s + * // [1, 0] after 1s + * // [1, 1] after 1.5s + * // [2, 1] after 2s + * + * + * @example Combine an array of Observables + * const observables = [1, 5, 10].map( + * n => Rx.Observable.of(n).delay(n * 1000).startWith(0) // emit 0 and then emit n after n seconds + * ); + * const combined = Rx.Observable.combineLatest(observables); + * combined.subscribe(value => console.log(value)); + * // Logs + * // [0, 0, 0] immediately + * // [1, 0, 0] after 1s + * // [1, 5, 0] after 5s + * // [1, 5, 10] after 10s + * + * + * @example Use project function to dynamically calculate the Body-Mass Index * var weight = Rx.Observable.of(70, 72, 76, 79, 75); * var height = Rx.Observable.of(1.76, 1.77, 1.78); * var bmi = Rx.Observable.combineLatest(weight, 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 {Observable} observable1 An input Observable to combine with the - * source Observable. - * @param {Observable} observable2 An input Observable to combine with the - * source Observable. More than one input Observables may be given as argument. + * @param {ObservableInput} observable1 An input Observable to combine with other Observables. + * @param {ObservableInput} observable2 An input Observable to combine with other Observables. + * More than one input Observables may be given as arguments + * or an array of Observables may be given as the first argument. * @param {function} [project] An optional function to project the values from * the combined latest values into a new value on the output Observable. - * @param {Scheduler} [scheduler=null] The Scheduler to use for subscribing to + * @param {Scheduler} [scheduler=null] The IScheduler to use for subscribing to * each input 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 @@ -7837,52 +8458,57 @@ function combineLatest() { } exports.combineLatest = combineLatest; -},{"../operator/combineLatest":102,"../util/isArray":148,"../util/isScheduler":152,"./ArrayObservable":79}],91:[function(require,module,exports){ +},{"../operator/combineLatest":114,"../util/isArray":168,"../util/isScheduler":175,"./ArrayObservable":88}],100:[function(require,module,exports){ "use strict"; var DeferObservable_1 = require('./DeferObservable'); exports.defer = DeferObservable_1.DeferObservable.create; -},{"./DeferObservable":81}],92:[function(require,module,exports){ +},{"./DeferObservable":90}],101:[function(require,module,exports){ "use strict"; var EmptyObservable_1 = require('./EmptyObservable'); exports.empty = EmptyObservable_1.EmptyObservable.create; -},{"./EmptyObservable":82}],93:[function(require,module,exports){ +},{"./EmptyObservable":91}],102:[function(require,module,exports){ "use strict"; var FromObservable_1 = require('./FromObservable'); exports.from = FromObservable_1.FromObservable.create; -},{"./FromObservable":85}],94:[function(require,module,exports){ +},{"./FromObservable":94}],103:[function(require,module,exports){ "use strict"; var FromEventObservable_1 = require('./FromEventObservable'); exports.fromEvent = FromEventObservable_1.FromEventObservable.create; -},{"./FromEventObservable":84}],95:[function(require,module,exports){ +},{"./FromEventObservable":93}],104:[function(require,module,exports){ "use strict"; var PromiseObservable_1 = require('./PromiseObservable'); exports.fromPromise = PromiseObservable_1.PromiseObservable.create; -},{"./PromiseObservable":88}],96:[function(require,module,exports){ +},{"./PromiseObservable":96}],105:[function(require,module,exports){ "use strict"; var merge_1 = require('../operator/merge'); exports.merge = merge_1.mergeStatic; -},{"../operator/merge":114}],97:[function(require,module,exports){ +},{"../operator/merge":127}],106:[function(require,module,exports){ "use strict"; var ArrayObservable_1 = require('./ArrayObservable'); exports.of = ArrayObservable_1.ArrayObservable.of; -},{"./ArrayObservable":79}],98:[function(require,module,exports){ +},{"./ArrayObservable":88}],107:[function(require,module,exports){ "use strict"; var ErrorObservable_1 = require('./ErrorObservable'); exports._throw = ErrorObservable_1.ErrorObservable.create; -},{"./ErrorObservable":83}],99:[function(require,module,exports){ +},{"./ErrorObservable":92}],108:[function(require,module,exports){ +"use strict"; +var TimerObservable_1 = require('./TimerObservable'); +exports.timer = TimerObservable_1.TimerObservable.create; + +},{"./TimerObservable":98}],109:[function(require,module,exports){ "use strict"; var zip_1 = require('../operator/zip'); exports.zip = zip_1.zipStatic; -},{"../operator/zip":132}],100:[function(require,module,exports){ +},{"../operator/zip":150}],110:[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]; @@ -7932,7 +8558,7 @@ var BufferOperator = (function () { this.closingNotifier = closingNotifier; } BufferOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new BufferSubscriber(subscriber, this.closingNotifier)); + return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier)); }; return BufferOperator; }()); @@ -7959,77 +8585,392 @@ var BufferSubscriber = (function (_super) { return BufferSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],101:[function(require,module,exports){ +},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],111:[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 Subscriber_1 = require('../Subscriber'); /** - * Catches errors on the observable to be handled by returning a new observable or throwing an error. - * @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. - * @method catch + * Buffers the source Observable values until the size hits the maximum + * `bufferSize` given. + * + * Collects values from the past as an array, and emits + * that array only when its size reaches `bufferSize`. + * + * + * + * 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. + * + * @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)); + * + * @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 _catch(selector) { - var operator = new CatchOperator(selector); - var caught = this.lift(operator); - return (operator.caught = caught); -} -exports._catch = _catch; -var CatchOperator = (function () { - function CatchOperator(selector) { - this.selector = selector; +function bufferCount(bufferSize, startBufferEvery) { + if (startBufferEvery === void 0) { startBufferEvery = null; } + return this.lift(new BufferCountOperator(bufferSize, startBufferEvery)); +} +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; + } } - CatchOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new CatchSubscriber(subscriber, this.selector, this.caught)); + BufferCountOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery)); }; - return CatchOperator; + return BufferCountOperator; }()); /** * We need this JSDoc comment for affecting ESDoc. * @ignore * @extends {Ignored} */ -var CatchSubscriber = (function (_super) { - __extends(CatchSubscriber, _super); - function CatchSubscriber(destination, selector, caught) { +var BufferCountSubscriber = (function (_super) { + __extends(BufferCountSubscriber, _super); + function BufferCountSubscriber(destination, bufferSize) { _super.call(this, destination); - this.selector = selector; - this.caught = caught; + this.bufferSize = bufferSize; + this.buffer = []; } - // NOTE: overriding `error` instead of `_error` because we don't want - // to have this flag this subscriber as `isStopped`. - CatchSubscriber.prototype.error = function (err) { - if (!this.isStopped) { - var result = void 0; - try { - result = this.selector(err, this.caught); - } - catch (err) { - this.destination.error(err); - return; - } - this.unsubscribe(); - this.destination.remove(this); - subscribeToResult_1.subscribeToResult(this, result); + BufferCountSubscriber.prototype._next = function (value) { + var buffer = this.buffer; + buffer.push(value); + if (buffer.length == this.bufferSize) { + this.destination.next(buffer); + this.buffer = []; } }; - return CatchSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); - -},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],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]; - function __() { this.constructor = d; } + 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}],112:[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 this.lift(new BufferWhenOperator(closingSelector)); +} +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":167,"../util/subscribeToResult":177,"../util/tryCatch":179}],113:[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'); +/** + * Catches errors on the observable to be handled by returning a new observable or throwing an error. + * + * + * + * @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. + * @method catch + * @name catch + * @owner Observable + */ +function _catch(selector) { + var operator = new CatchOperator(selector); + var caught = this.lift(operator); + return (operator.caught = caught); +} +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":177}],114:[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'); @@ -8037,6 +8978,7 @@ 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. @@ -8061,11 +9003,16 @@ var none = {}; * 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 {Observable} other An input Observable to combine with the source + * @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. @@ -8087,19 +9034,18 @@ function combineLatest() { // 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]; + observables = observables[0].slice(); } observables.unshift(this); - return new ArrayObservable_1.ArrayObservable(observables).lift(new CombineLatestOperator(project)); + return this.lift.call(new ArrayObservable_1.ArrayObservable(observables), new CombineLatestOperator(project)); } exports.combineLatest = combineLatest; -/* tslint:enable:max-line-length */ var CombineLatestOperator = (function () { function CombineLatestOperator(project) { this.project = project; } CombineLatestOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new CombineLatestSubscriber(subscriber, this.project)); + return source.subscribe(new CombineLatestSubscriber(subscriber, this.project)); }; return CombineLatestOperator; }()); @@ -8173,11 +9119,13 @@ var CombineLatestSubscriber = (function (_super) { }(OuterSubscriber_1.OuterSubscriber)); exports.CombineLatestSubscriber = CombineLatestSubscriber; -},{"../OuterSubscriber":30,"../observable/ArrayObservable":79,"../util/isArray":148,"../util/subscribeToResult":154}],103:[function(require,module,exports){ +},{"../OuterSubscriber":31,"../observable/ArrayObservable":88,"../util/isArray":168,"../util/subscribeToResult":177}],115:[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'); +/* tslint:enable:max-line-length */ /** * Creates an output Observable which sequentially emits all values from every * given input Observable after the current Observable. @@ -8198,6 +9146,9 @@ var mergeAll_1 = require('./mergeAll'); * 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 Concatenate 3 Observables * var timer1 = Rx.Observable.interval(1000).take(10); * var timer2 = Rx.Observable.interval(2000).take(6); @@ -8205,13 +9156,19 @@ var mergeAll_1 = require('./mergeAll'); * var result = timer1.concat(timer2, timer3); * 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 + * * @see {@link concatAll} * @see {@link concatMap} * @see {@link concatMapTo} * - * @param {Observable} other An input Observable to concatenate after the source + * @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 Scheduler to schedule each + * @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. @@ -8223,22 +9180,46 @@ function concat() { for (var _i = 0; _i < arguments.length; _i++) { observables[_i - 0] = arguments[_i]; } - return concatStatic.apply(void 0, [this].concat(observables)); + return this.lift.call(concatStatic.apply(void 0, [this].concat(observables))); } exports.concat = concat; /* tslint:enable:max-line-length */ /** - * Creates an output Observable which sequentially emits all values from every - * given input Observable after the current Observable. + * 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. * * * - * Joins multiple Observables together by subscribing to them one at a time and - * merging their results into the output Observable. Will wait for each - * Observable to complete before moving on to the next. + * `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); @@ -8246,21 +9227,49 @@ exports.concat = concat; * var result = Rx.Observable.concat(timer, sequence); * result.subscribe(x => console.log(x)); * - * @example Concatenate 3 Observables + * // 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); + * 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 {Observable} input1 An input Observable to concatenate with others. - * @param {Observable} input2 An input Observable to concatenate with others. + * @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 Scheduler to schedule each + * @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. @@ -8278,11 +9287,14 @@ function concatStatic() { 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)); } exports.concatStatic = concatStatic; -},{"../observable/ArrayObservable":79,"../util/isScheduler":152,"./mergeAll":115}],104:[function(require,module,exports){ +},{"../Observable":29,"../observable/ArrayObservable":88,"../util/isScheduler":175,"./mergeAll":128}],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]; @@ -8311,7 +9323,7 @@ var async_1 = require('../scheduler/async'); * 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 Scheduler} for + * 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 @@ -8329,7 +9341,7 @@ var async_1 = require('../scheduler/async'); * 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 Scheduler} to use for + * @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 @@ -8348,7 +9360,7 @@ var DebounceTimeOperator = (function () { this.scheduler = scheduler; } DebounceTimeOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler)); + return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler)); }; return DebounceTimeOperator; }()); @@ -8399,106 +9411,310 @@ function dispatchNext(subscriber) { subscriber.debouncedNext(); } -},{"../Subscriber":35,"../scheduler/async":138}],105:[function(require,module,exports){ +},{"../Subscriber":36,"../scheduler/async":156}],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 OuterSubscriber_1 = require('../OuterSubscriber'); -var subscribeToResult_1 = require('../util/subscribeToResult'); +var async_1 = require('../scheduler/async'); +var isDate_1 = require('../util/isDate'); +var Subscriber_1 = require('../Subscriber'); +var Notification_1 = require('../Notification'); /** - * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from previous items. - * 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. - * As the internal HashSet of this operator grows larger and larger, care should be taken in the domain of inputs this operator may see. - * An optional parameter is also provided such that an Observable can be provided to queue the internal HashSet to flush the values it holds. - * @param {function} [compare] optional comparison function called to test if an item is distinct from previous items in the source. - * @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 + * Delays the emission of items from the source Observable by a given timeout or + * until a given Date. + * + * Time shifts each item by some specified amount of + * milliseconds. + * + * + * + * 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 */ -function distinct(compare, flushes) { - return this.lift(new DistinctOperator(compare, flushes)); +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)); } -exports.distinct = distinct; -var DistinctOperator = (function () { - function DistinctOperator(compare, flushes) { - this.compare = compare; - this.flushes = flushes; +exports.delay = delay; +var DelayOperator = (function () { + function DelayOperator(delay, scheduler) { + this.delay = delay; + this.scheduler = scheduler; } - DistinctOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new DistinctSubscriber(subscriber, this.compare, this.flushes)); + DelayOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler)); }; - return DistinctOperator; + return DelayOperator; }()); /** * We need this JSDoc comment for affecting ESDoc. * @ignore * @extends {Ignored} */ -var DistinctSubscriber = (function (_super) { - __extends(DistinctSubscriber, _super); - function DistinctSubscriber(destination, compare, flushes) { +var DelaySubscriber = (function (_super) { + __extends(DelaySubscriber, _super); + function DelaySubscriber(destination, delay, scheduler) { _super.call(this, destination); - this.values = []; - if (typeof compare === 'function') { - this.compare = compare; + 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 (flushes) { - this.add(subscribeToResult_1.subscribeToResult(this, flushes)); + if (queue.length > 0) { + var delay_1 = Math.max(0, queue[0].time - scheduler.now()); + this.schedule(state, delay_1); + } + else { + source.active = false; } - } - DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.values.length = 0; }; - DistinctSubscriber.prototype.notifyError = function (error, innerSub) { - this._error(error); + DelaySubscriber.prototype._schedule = function (scheduler) { + this.active = true; + this.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, { + source: this, destination: this.destination, scheduler: scheduler + })); }; - DistinctSubscriber.prototype._next = function (value) { - var found = false; - var values = this.values; - var len = values.length; - try { - for (var i = 0; i < len; i++) { - if (this.compare(values[i], value)) { - found = true; - return; - } - } - } - catch (err) { - this.destination.error(err); + DelaySubscriber.prototype.scheduleNotification = function (notification) { + if (this.errored === true) { return; } - this.values.push(value); - this.destination.next(value); + var scheduler = this.scheduler; + var message = new DelayMessage(scheduler.now() + this.delay, notification); + this.queue.push(message); + if (this.active === false) { + this._schedule(scheduler); + } }; - DistinctSubscriber.prototype.compare = function (x, y) { - return x === y; + DelaySubscriber.prototype._next = function (value) { + this.scheduleNotification(Notification_1.Notification.createNext(value)); }; - return DistinctSubscriber; -}(OuterSubscriber_1.OuterSubscriber)); -exports.DistinctSubscriber = DistinctSubscriber; + 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; +}()); -},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],106:[function(require,module,exports){ +},{"../Notification":28,"../Subscriber":36,"../scheduler/async":156,"../util/isDate":170}],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 tryCatch_1 = require('../util/tryCatch'); -var errorObject_1 = require('../util/errorObject'); -/** +var OuterSubscriber_1 = require('../OuterSubscriber'); +var subscribeToResult_1 = require('../util/subscribeToResult'); +var Set_1 = require('../util/Set'); +/** + * 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 + */ +function distinct(keySelector, flushes) { + return this.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":165,"../util/subscribeToResult":177}],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 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. - * @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. + * + * @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 */ @@ -8512,7 +9728,7 @@ var DistinctUntilChangedOperator = (function () { this.keySelector = keySelector; } DistinctUntilChangedOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector)); + return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector)); }; return DistinctUntilChangedOperator; }()); @@ -8561,7 +9777,7 @@ var DistinctUntilChangedSubscriber = (function (_super) { return DistinctUntilChangedSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":35,"../util/errorObject":147,"../util/tryCatch":156}],107:[function(require,module,exports){ +},{"../Subscriber":36,"../util/errorObject":167,"../util/tryCatch":179}],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]; @@ -8569,12 +9785,13 @@ var __extends = (this && this.__extends) || function (d, b) { 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. + * function, but returns an output which is identical to the source as long as errors don't occur. * * * @@ -8592,7 +9809,7 @@ var Subscriber_1 = require('../Subscriber'); * 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 every click to the clientX position of that click, while also logging the click event + * @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)) @@ -8623,7 +9840,7 @@ var DoOperator = (function () { this.complete = complete; } DoOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new DoSubscriber(subscriber, this.nextOrObserver, this.error, this.complete)); + return source.subscribe(new DoSubscriber(subscriber, this.nextOrObserver, this.error, this.complete)); }; return DoOperator; }()); @@ -8674,7 +9891,7 @@ var DoSubscriber = (function (_super) { return DoSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":35}],108:[function(require,module,exports){ +},{"../Subscriber":36}],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]; @@ -8685,6 +9902,7 @@ 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. @@ -8721,7 +9939,7 @@ var subscribeToResult_1 = require('../util/subscribeToResult'); * returns an Observable. * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input * Observables being subscribed to concurrently. - * @param {Scheduler} [scheduler=null] The Scheduler to use for subscribing to + * @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 @@ -8744,7 +9962,7 @@ var ExpandOperator = (function () { this.scheduler = scheduler; } ExpandOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler)); + return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler)); }; return ExpandOperator; }()); @@ -8825,7 +10043,7 @@ var ExpandSubscriber = (function (_super) { }(OuterSubscriber_1.OuterSubscriber)); exports.ExpandSubscriber = ExpandSubscriber; -},{"../OuterSubscriber":30,"../util/errorObject":147,"../util/subscribeToResult":154,"../util/tryCatch":156}],109:[function(require,module,exports){ +},{"../OuterSubscriber":31,"../util/errorObject":167,"../util/subscribeToResult":177,"../util/tryCatch":179}],122:[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]; @@ -8833,6 +10051,7 @@ var __extends = (this && this.__extends) || function (d, b) { 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. @@ -8853,7 +10072,6 @@ var Subscriber_1 = require('../Subscriber'); * clicksOnDivs.subscribe(x => console.log(x)); * * @see {@link distinct} - * @see {@link distinctKey} * @see {@link distinctUntilChanged} * @see {@link distinctUntilKeyChanged} * @see {@link ignoreElements} @@ -8883,7 +10101,7 @@ var FilterOperator = (function () { this.thisArg = thisArg; } FilterOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg)); + return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg)); }; return FilterOperator; }()); @@ -8919,7 +10137,7 @@ var FilterSubscriber = (function (_super) { return FilterSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":35}],110:[function(require,module,exports){ +},{"../Subscriber":36}],123:[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]; @@ -8931,8 +10149,8 @@ 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. + * @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 */ @@ -8945,7 +10163,7 @@ var FinallyOperator = (function () { this.callback = callback; } FinallyOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new FinallySubscriber(subscriber, this.callback)); + return source.subscribe(new FinallySubscriber(subscriber, this.callback)); }; return FinallyOperator; }()); @@ -8963,7 +10181,7 @@ var FinallySubscriber = (function (_super) { return FinallySubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":35,"../Subscription":36}],111:[function(require,module,exports){ +},{"../Subscriber":36,"../Subscription":37}],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]; @@ -9016,7 +10234,7 @@ var EmptyError_1 = require('../util/EmptyError'); * - `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 + * @return {Observable} An Observable of the first item that matches the * condition. * @method first * @owner Observable @@ -9033,7 +10251,7 @@ var FirstOperator = (function () { this.source = source; } FirstOperator.prototype.call = function (observer, source) { - return source._subscribe(new FirstSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source)); + return source.subscribe(new FirstSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source)); }; return FirstOperator; }()); @@ -9052,6 +10270,7 @@ var FirstSubscriber = (function (_super) { this.source = source; this.index = 0; this.hasCompleted = false; + this._emitted = false; } FirstSubscriber.prototype._next = function (value) { var index = this.index++; @@ -9095,9 +10314,12 @@ var FirstSubscriber = (function (_super) { }; FirstSubscriber.prototype._emitFinal = function (value) { var destination = this.destination; - destination.next(value); - destination.complete(); - this.hasCompleted = true; + if (!this._emitted) { + this._emitted = true; + destination.next(value); + destination.complete(); + this.hasCompleted = true; + } }; FirstSubscriber.prototype._complete = function () { var destination = this.destination; @@ -9112,7 +10334,7 @@ var FirstSubscriber = (function (_super) { return FirstSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":35,"../util/EmptyError":144}],112:[function(require,module,exports){ +},{"../Subscriber":36,"../util/EmptyError":163}],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]; @@ -9121,6 +10343,7 @@ var __extends = (this && this.__extends) || function (d, b) { }; 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 @@ -9131,8 +10354,8 @@ var EmptyError_1 = require('../util/EmptyError'); * * @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 + * @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 @@ -9150,7 +10373,7 @@ var LastOperator = (function () { this.source = source; } LastOperator.prototype.call = function (observer, source) { - return source._subscribe(new LastSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source)); + return source.subscribe(new LastSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source)); }; return LastOperator; }()); @@ -9231,7 +10454,7 @@ var LastSubscriber = (function (_super) { return LastSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":35,"../util/EmptyError":144}],113:[function(require,module,exports){ +},{"../Subscriber":36,"../util/EmptyError":163}],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]; @@ -9253,7 +10476,7 @@ var Subscriber_1 = require('../Subscriber'); * applies a projection to each value and emits that projection in the output * Observable. * - * @example Map every every click to the clientX position of that click + * @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)); @@ -9285,7 +10508,7 @@ var MapOperator = (function () { this.thisArg = thisArg; } MapOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new MapSubscriber(subscriber, this.project, this.thisArg)); + return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg)); }; return MapOperator; }()); @@ -9319,11 +10542,13 @@ var MapSubscriber = (function (_super) { return MapSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":35}],114:[function(require,module,exports){ +},{"../Subscriber":36}],127:[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 */ /** * Creates an output Observable which concurrently emits all values from every * given input Observable. @@ -9359,13 +10584,13 @@ var isScheduler_1 = require('../util/isScheduler'); * @see {@link mergeMapTo} * @see {@link mergeScan} * - * @param {Observable} other An input Observable to merge with the source + * @param {ObservableInput} other An input Observable to merge with the source * Observable. More than one input Observables may be given as argument. * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input * Observables being subscribed to concurrently. - * @param {Scheduler} [scheduler=null] The Scheduler to use for managing + * @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 + * @return {Observable} An Observable that emits items that are the result of * every input Observable. * @method merge * @owner Observable @@ -9375,8 +10600,7 @@ function merge() { for (var _i = 0; _i < arguments.length; _i++) { observables[_i - 0] = arguments[_i]; } - observables.unshift(this); - return mergeStatic.apply(this, observables); + return this.lift.call(mergeStatic.apply(void 0, [this].concat(observables))); } exports.merge = merge; /* tslint:enable:max-line-length */ @@ -9401,6 +10625,12 @@ exports.merge = merge; * 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); @@ -9409,16 +10639,24 @@ exports.merge = merge; * 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 {Observable} input1 An input Observable to merge with others. - * @param {Observable} input2 An input Observable to merge with others. + * @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 Scheduler to use for managing + * @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. @@ -9443,14 +10681,14 @@ function mergeStatic() { else if (typeof last === 'number') { concurrent = observables.pop(); } - if (observables.length === 1) { + 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/ArrayObservable":79,"../util/isScheduler":152,"./mergeAll":115}],115:[function(require,module,exports){ +},{"../Observable":29,"../observable/ArrayObservable":88,"../util/isScheduler":175,"./mergeAll":128}],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]; @@ -9513,7 +10751,7 @@ var MergeAllOperator = (function () { this.concurrent = concurrent; } MergeAllOperator.prototype.call = function (observer, source) { - return source._subscribe(new MergeAllSubscriber(observer, this.concurrent)); + return source.subscribe(new MergeAllSubscriber(observer, this.concurrent)); }; return MergeAllOperator; }()); @@ -9562,7 +10800,7 @@ var MergeAllSubscriber = (function (_super) { }(OuterSubscriber_1.OuterSubscriber)); exports.MergeAllSubscriber = MergeAllSubscriber; -},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],116:[function(require,module,exports){ +},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],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]; @@ -9571,6 +10809,7 @@ var __extends = (this && this.__extends) || function (d, b) { }; 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. @@ -9592,6 +10831,15 @@ var OuterSubscriber_1 = require('../OuterSubscriber'); * ); * 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} @@ -9600,7 +10848,7 @@ var OuterSubscriber_1 = require('../OuterSubscriber'); * @see {@link mergeScan} * @see {@link switchMap} * - * @param {function(value: T, ?index: number): Observable} project A function + * @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] @@ -9637,7 +10885,7 @@ var MergeMapOperator = (function () { this.concurrent = concurrent; } MergeMapOperator.prototype.call = function (observer, source) { - return source._subscribe(new MergeMapSubscriber(observer, this.project, this.resultSelector, this.concurrent)); + return source.subscribe(new MergeMapSubscriber(observer, this.project, this.resultSelector, this.concurrent)); }; return MergeMapOperator; }()); @@ -9724,24 +10972,24 @@ var MergeMapSubscriber = (function (_super) { }(OuterSubscriber_1.OuterSubscriber)); exports.MergeMapSubscriber = MergeMapSubscriber; -},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],117:[function(require,module,exports){ +},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],130:[function(require,module,exports){ "use strict"; -var MulticastObservable_1 = require('../observable/MulticastObservable'); 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} Factory function to create an intermediate subject through + * @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} Optional selector function that can use the multicasted source stream + * @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 + * @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 @@ -9757,13 +11005,32 @@ function multicast(subjectOrSubjectFactory, selector) { return subjectOrSubjectFactory; }; } - return !selector ? - new ConnectableObservable_1.ConnectableObservable(this, subjectFactory) : - new MulticastObservable_1.MulticastObservable(this, subjectFactory, selector); + 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; } 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":80,"../observable/MulticastObservable":87}],118:[function(require,module,exports){ +},{"../observable/ConnectableObservable":89}],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]; @@ -9773,11 +11040,48 @@ var __extends = (this && this.__extends) || function (d, b) { var Subscriber_1 = require('../Subscriber'); var Notification_1 = require('../Notification'); /** - * @see {@link Notification} * - * @param scheduler - * @param delay - * @return {Observable|WebSocketSubject|Observable} + * 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 */ @@ -9793,7 +11097,7 @@ var ObserveOnOperator = (function () { this.delay = delay; } ObserveOnOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay)); + return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay)); }; return ObserveOnOperator; }()); @@ -9814,6 +11118,7 @@ var ObserveOnSubscriber = (function (_super) { 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))); @@ -9839,7 +11144,7 @@ var ObserveOnMessage = (function () { }()); exports.ObserveOnMessage = ObserveOnMessage; -},{"../Notification":27,"../Subscriber":35}],119:[function(require,module,exports){ +},{"../Notification":28,"../Subscriber":36}],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]; @@ -9890,7 +11195,7 @@ var PairwiseOperator = (function () { function PairwiseOperator() { } PairwiseOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new PairwiseSubscriber(subscriber)); + return source.subscribe(new PairwiseSubscriber(subscriber)); }; return PairwiseOperator; }()); @@ -9917,7 +11222,7 @@ var PairwiseSubscriber = (function (_super) { return PairwiseSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":35}],120:[function(require,module,exports){ +},{"../Subscriber":36}],133:[function(require,module,exports){ "use strict"; var map_1 = require('./map'); /** @@ -9933,7 +11238,7 @@ var map_1 = require('./map'); * Observable. If a property can't be resolved, it will return `undefined` for * that value. * - * @example Map every every click to the tagName of the clicked target element + * @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)); @@ -9942,8 +11247,7 @@ var map_1 = require('./map'); * * @param {...string} properties The nested properties to pluck from each source * value (an object). - * @return {Observable} Returns a new Observable of property values from the - * source values. + * @return {Observable} A new Observable of property values from the source values. * @method pluck * @owner Observable */ @@ -9976,20 +11280,21 @@ function plucker(props, length) { return mapper; } -},{"./map":113}],121:[function(require,module,exports){ +},{"./map":126}],134:[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} Optional selector function which can use the multicasted source sequence as many times as needed, - * without causing multiple subscriptions to the source sequence. + * @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. + * @return A ConnectableObservable that upon connection causes the source Observable to emit items to its Observers. * @method publish * @owner Observable */ @@ -9999,7 +11304,7 @@ function publish(selector) { } exports.publish = publish; -},{"../Subject":33,"./multicast":117}],122:[function(require,module,exports){ +},{"../Subject":34,"./multicast":130}],135:[function(require,module,exports){ "use strict"; var ReplaySubject_1 = require('../ReplaySubject'); var multicast_1 = require('./multicast'); @@ -10018,7 +11323,96 @@ function publishReplay(bufferSize, windowTime, scheduler) { } exports.publishReplay = publishReplay; -},{"../ReplaySubject":31,"./multicast":117}],123:[function(require,module,exports){ +},{"../ReplaySubject":32,"./multicast":130}],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'); +/** + * 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 this.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":177}],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]; @@ -10026,6 +11420,7 @@ var __extends = (this && this.__extends) || function (d, b) { 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. @@ -10064,16 +11459,27 @@ var Subscriber_1 = require('../Subscriber'); * @owner Observable */ function scan(accumulator, seed) { - return this.lift(new ScanOperator(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 this.lift(new ScanOperator(accumulator, seed, hasSeed)); } exports.scan = scan; var ScanOperator = (function () { - function ScanOperator(accumulator, seed) { + 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)); + return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed)); }; return ScanOperator; }()); @@ -10084,27 +11490,26 @@ var ScanOperator = (function () { */ var ScanSubscriber = (function (_super) { __extends(ScanSubscriber, _super); - function ScanSubscriber(destination, accumulator, seed) { + function ScanSubscriber(destination, accumulator, _seed, hasSeed) { _super.call(this, destination); this.accumulator = accumulator; + this._seed = _seed; + this.hasSeed = hasSeed; this.index = 0; - this.accumulatorSet = false; - this.seed = seed; - this.accumulatorSet = typeof seed !== 'undefined'; } Object.defineProperty(ScanSubscriber.prototype, "seed", { get: function () { return this._seed; }, set: function (value) { - this.accumulatorSet = true; + this.hasSeed = true; this._seed = value; }, enumerable: true, configurable: true }); ScanSubscriber.prototype._next = function (value) { - if (!this.accumulatorSet) { + if (!this.hasSeed) { this.seed = value; this.destination.next(value); } @@ -10127,7 +11532,7 @@ var ScanSubscriber = (function (_super) { return ScanSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":35}],124:[function(require,module,exports){ +},{"../Subscriber":36}],138:[function(require,module,exports){ "use strict"; var multicast_1 = require('./multicast'); var Subject_1 = require('../Subject'); @@ -10142,7 +11547,7 @@ function shareSubjectFactory() { * * * - * @return {Observable} an Observable that upon connection causes the source Observable to emit items to its Observers + * @return {Observable} An Observable that upon connection causes the source Observable to emit items to its Observers. * @method share * @owner Observable */ @@ -10152,7 +11557,7 @@ function share() { exports.share = share; ; -},{"../Subject":33,"./multicast":117}],125:[function(require,module,exports){ +},{"../Subject":34,"./multicast":130}],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]; @@ -10161,18 +11566,18 @@ var __extends = (this && this.__extends) || function (d, b) { }; var Subscriber_1 = require('../Subscriber'); /** - * Returns an Observable that skips `n` items emitted by an Observable. + * Returns an Observable that skips the first `count` items emitted by the source Observable. * * * - * @param {Number} the `n` of times, items emitted by source Observable should be skipped. - * @return {Observable} an Observable that skips values 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(total) { - return this.lift(new SkipOperator(total)); +function skip(count) { + return this.lift(new SkipOperator(count)); } exports.skip = skip; var SkipOperator = (function () { @@ -10180,7 +11585,7 @@ var SkipOperator = (function () { this.total = total; } SkipOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new SkipSubscriber(subscriber, this.total)); + return source.subscribe(new SkipSubscriber(subscriber, this.total)); }; return SkipOperator; }()); @@ -10204,7 +11609,7 @@ var SkipSubscriber = (function (_super) { return SkipSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":35}],126:[function(require,module,exports){ +},{"../Subscriber":36}],140:[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]; @@ -10218,9 +11623,9 @@ var subscribeToResult_1 = require('../util/subscribeToResult'); * * * - * @param {Observable} the second Observable that has to emit an item before the source Observable's elements begin to + * @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 + * @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 @@ -10234,7 +11639,7 @@ var SkipUntilOperator = (function () { this.notifier = notifier; } SkipUntilOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new SkipUntilSubscriber(subscriber, this.notifier)); + return source.subscribe(new SkipUntilSubscriber(subscriber, this.notifier)); }; return SkipUntilOperator; }()); @@ -10276,21 +11681,91 @@ var SkipUntilSubscriber = (function (_super) { return SkipUntilSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],127:[function(require,module,exports){ +},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],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'); +/** + * 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 this.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}],142:[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'); +/* tslint:enable:max-line-length */ /** - * Returns an Observable that emits the items in a specified Iterable before it begins to emit items emitted by the - * source Observable. + * Returns an Observable that emits the items you specify as arguments before it begins to emit + * items emitted by the source Observable. * * * - * @param {Values} an Iterable that contains the items you want the modified Observable to emit first. - * @return {Observable} an Observable that emits the items in the specified Iterable and then emits the items + * @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 @@ -10320,7 +11795,7 @@ function startWith() { } exports.startWith = startWith; -},{"../observable/ArrayObservable":79,"../observable/EmptyObservable":82,"../observable/ScalarObservable":89,"../util/isScheduler":152,"./concat":103}],128:[function(require,module,exports){ +},{"../observable/ArrayObservable":88,"../observable/EmptyObservable":91,"../observable/ScalarObservable":97,"../util/isScheduler":175,"./concat":115}],143:[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]; @@ -10329,6 +11804,7 @@ var __extends = (this && this.__extends) || function (d, b) { }; 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. @@ -10358,7 +11834,7 @@ var subscribeToResult_1 = require('../util/subscribeToResult'); * @see {@link switch} * @see {@link switchMapTo} * - * @param {function(value: T, ?index: number): Observable} project A function + * @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] @@ -10386,7 +11862,7 @@ var SwitchMapOperator = (function () { this.resultSelector = resultSelector; } SwitchMapOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new SwitchMapSubscriber(subscriber, this.project, this.resultSelector)); + return source.subscribe(new SwitchMapSubscriber(subscriber, this.project, this.resultSelector)); }; return SwitchMapOperator; }()); @@ -10460,7 +11936,7 @@ var SwitchMapSubscriber = (function (_super) { return SwitchMapSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],129:[function(require,module,exports){ +},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],144:[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]; @@ -10520,7 +11996,7 @@ var TakeOperator = (function () { } } TakeOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new TakeSubscriber(subscriber, this.total)); + return source.subscribe(new TakeSubscriber(subscriber, this.total)); }; return TakeOperator; }()); @@ -10538,9 +12014,10 @@ var TakeSubscriber = (function (_super) { } TakeSubscriber.prototype._next = function (value) { var total = this.total; - if (++this.count <= total) { + var count = ++this.count; + if (count <= total) { this.destination.next(value); - if (this.count === total) { + if (count === total) { this.destination.complete(); this.unsubscribe(); } @@ -10549,7 +12026,7 @@ var TakeSubscriber = (function (_super) { return TakeSubscriber; }(Subscriber_1.Subscriber)); -},{"../Subscriber":35,"../observable/EmptyObservable":82,"../util/ArgumentOutOfRangeError":143}],130:[function(require,module,exports){ +},{"../Subscriber":36,"../observable/EmptyObservable":91,"../util/ArgumentOutOfRangeError":162}],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]; @@ -10600,7 +12077,7 @@ var TakeUntilOperator = (function () { this.notifier = notifier; } TakeUntilOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new TakeUntilSubscriber(subscriber, this.notifier)); + return source.subscribe(new TakeUntilSubscriber(subscriber, this.notifier)); }; return TakeUntilOperator; }()); @@ -10625,54 +12102,408 @@ var TakeUntilSubscriber = (function (_super) { return TakeUntilSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],131:[function(require,module,exports){ +},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],146:[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 Subscriber_1 = require('../Subscriber'); /** - * 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. + * 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. * - * 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. + * Takes values from the source only while they pass the + * condition given. When the first value does not satisfy, it completes. * - * + * * - * `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. + * `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 On every click event, emit an array with the latest timer event plus the click event + * @example Emit click events only while the clientX property is greater than 200 * var clicks = Rx.Observable.fromEvent(document, 'click'); - * var timer = Rx.Observable.interval(1000); - * var result = clicks.withLatestFrom(timer); + * var result = clicks.takeWhile(ev => ev.clientX > 200); * result.subscribe(x => console.log(x)); * - * @see {@link combineLatest} + * @see {@link take} + * @see {@link takeLast} + * @see {@link takeUntil} + * @see {@link skip} * - * @param {Observable} 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 {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 withLatestFrom() { +function takeWhile(predicate) { + return this.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}],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 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 + * process. + * + * It's like {@link throttleTime}, 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. + * + * @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)); + * result.subscribe(x => console.log(x)); + * + * @see {@link audit} + * @see {@link debounce} + * @see {@link delayWhen} + * @see {@link sample} + * @see {@link throttleTime} + * + * @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 + * @owner Observable + */ +function throttle(durationSelector, config) { + if (config === void 0) { config = exports.defaultThrottleConfig; } + return this.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); +} +exports.throttle = throttle; +var ThrottleOperator = (function () { + function ThrottleOperator(durationSelector, leading, trailing) { + 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)); + }; + return ThrottleOperator; +}()); +/** + * We need this JSDoc comment for affecting ESDoc + * @ignore + * @extends {Ignored} + */ +var ThrottleSubscriber = (function (_super) { + __extends(ThrottleSubscriber, _super); + function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) { + _super.call(this, destination); + this.destination = destination; + this.durationSelector = durationSelector; + this._leading = _leading; + this._trailing = _trailing; + this._hasTrailingValue = false; + } + ThrottleSubscriber.prototype._next = function (value) { + if (this.throttled) { + if (this._trailing) { + this._hasTrailingValue = true; + this._trailingValue = value; + } + } + 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; + } + } + } + }; + 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; + 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; + } + }; + ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this._sendTrailing(); + this._unsubscribe(); + }; + ThrottleSubscriber.prototype.notifyComplete = function () { + this._sendTrailing(); + this._unsubscribe(); + }; + return ThrottleSubscriber; +}(OuterSubscriber_1.OuterSubscriber)); + +},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],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 Subscriber_1 = require('../Subscriber'); +var async_1 = require('../scheduler/async'); +var throttle_1 = require('./throttle'); +/** + * 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. + * + * @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); + * result.subscribe(x => console.log(x)); + * + * @see {@link auditTime} + * @see {@link debounceTime} + * @see {@link delay} + * @see {@link sampleTime} + * @see {@link throttle} + * + * @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 {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 + * @owner Observable + */ +function throttleTime(duration, scheduler, config) { + 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(); +} + +},{"../Subscriber":36,"../scheduler/async":156,"./throttle":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 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]; @@ -10685,14 +12516,13 @@ function withLatestFrom() { return this.lift(new WithLatestFromOperator(observables, project)); } exports.withLatestFrom = withLatestFrom; -/* tslint:enable:max-line-length */ 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 source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project)); }; return WithLatestFromOperator; }()); @@ -10756,7 +12586,7 @@ var WithLatestFromSubscriber = (function (_super) { return WithLatestFromSubscriber; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":30,"../util/subscribeToResult":154}],132:[function(require,module,exports){ +},{"../OuterSubscriber":31,"../util/subscribeToResult":177}],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]; @@ -10769,6 +12599,7 @@ 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} @@ -10780,12 +12611,35 @@ function zipProto() { for (var _i = 0; _i < arguments.length; _i++) { observables[_i - 0] = arguments[_i]; } - observables.unshift(this); - return zipStatic.apply(this, observables); + 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. + * + * @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 @@ -10809,7 +12663,7 @@ var ZipOperator = (function () { this.project = project; } ZipOperator.prototype.call = function (subscriber, source) { - return source._subscribe(new ZipSubscriber(subscriber, this.project)); + return source.subscribe(new ZipSubscriber(subscriber, this.project)); }; return ZipOperator; }()); @@ -10824,7 +12678,6 @@ var ZipSubscriber = (function (_super) { function ZipSubscriber(destination, project, values) { if (values === void 0) { values = Object.create(null); } _super.call(this, destination); - this.index = 0; this.iterators = []; this.active = 0; this.project = (typeof project === 'function') ? project : null; @@ -10832,20 +12685,23 @@ var ZipSubscriber = (function (_super) { } ZipSubscriber.prototype._next = function (value) { var iterators = this.iterators; - var index = this.index++; 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 if (typeof value[iterator_1.iterator] === 'function') { + iterators.push(new StaticIterator(value[iterator_1.iterator]())); } else { - iterators.push(new ZipBufferIterator(this.destination, this, value, index)); + 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]; @@ -10940,7 +12796,7 @@ var StaticArrayIterator = (function () { this.length = 0; this.length = array.length; } - StaticArrayIterator.prototype[iterator_1.$$iterator] = function () { + StaticArrayIterator.prototype[iterator_1.iterator] = function () { return this; }; StaticArrayIterator.prototype.next = function (value) { @@ -10963,16 +12819,15 @@ var StaticArrayIterator = (function () { */ var ZipBufferIterator = (function (_super) { __extends(ZipBufferIterator, _super); - function ZipBufferIterator(destination, parent, observable, index) { + function ZipBufferIterator(destination, parent, observable) { _super.call(this, destination); this.parent = parent; this.observable = observable; - this.index = index; this.stillUnsubscribed = true; this.buffer = []; this.isComplete = false; } - ZipBufferIterator.prototype[iterator_1.$$iterator] = function () { + ZipBufferIterator.prototype[iterator_1.iterator] = function () { return this; }; // NOTE: there is actually a name collision here with Subscriber.next and Iterator.next @@ -11011,7 +12866,7 @@ var ZipBufferIterator = (function (_super) { return ZipBufferIterator; }(OuterSubscriber_1.OuterSubscriber)); -},{"../OuterSubscriber":30,"../Subscriber":35,"../observable/ArrayObservable":79,"../symbol/iterator":140,"../util/isArray":148,"../util/subscribeToResult":154}],133:[function(require,module,exports){ +},{"../OuterSubscriber":31,"../Subscriber":36,"../observable/ArrayObservable":88,"../symbol/iterator":158,"../util/isArray":168,"../util/subscribeToResult":177}],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]; @@ -11056,7 +12911,7 @@ var Action = (function (_super) { }(Subscription_1.Subscription)); exports.Action = Action; -},{"../Subscription":36}],134:[function(require,module,exports){ +},{"../Subscription":37}],152:[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]; @@ -11126,11 +12981,11 @@ var AsyncAction = (function (_super) { 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) { + if (delay !== null && this.delay === delay && this.pending === false) { return id; } // Otherwise, if the action's delay time is different from the current delay, - // clear the interval id + // or the action has been rescheduled before it's executed, clear the interval id return root_1.root.clearInterval(id) && undefined || undefined; }; /** @@ -11184,7 +13039,6 @@ var AsyncAction = (function (_super) { var actions = scheduler.actions; var index = actions.indexOf(this); this.work = null; - this.delay = null; this.state = null; this.pending = false; this.scheduler = null; @@ -11194,12 +13048,13 @@ var AsyncAction = (function (_super) { if (id != null) { this.id = this.recycleAsyncId(scheduler, id, null); } + this.delay = null; }; return AsyncAction; }(Action_1.Action)); exports.AsyncAction = AsyncAction; -},{"../util/root":153,"./Action":133}],135:[function(require,module,exports){ +},{"../util/root":176,"./Action":151}],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]; @@ -11251,7 +13106,7 @@ var AsyncScheduler = (function (_super) { }(Scheduler_1.Scheduler)); exports.AsyncScheduler = AsyncScheduler; -},{"../Scheduler":32}],136:[function(require,module,exports){ +},{"../Scheduler":33}],154:[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]; @@ -11288,8 +13143,10 @@ var QueueAction = (function (_super) { }; QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) { if (delay === void 0) { delay = 0; } - // If delay is greater than 0, enqueue as an async action. - if (delay !== null && 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. @@ -11299,7 +13156,7 @@ var QueueAction = (function (_super) { }(AsyncAction_1.AsyncAction)); exports.QueueAction = QueueAction; -},{"./AsyncAction":134}],137:[function(require,module,exports){ +},{"./AsyncAction":152}],155:[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]; @@ -11316,52 +13173,161 @@ var QueueScheduler = (function (_super) { }(AsyncScheduler_1.AsyncScheduler)); exports.QueueScheduler = QueueScheduler; -},{"./AsyncScheduler":135}],138:[function(require,module,exports){ +},{"./AsyncScheduler":153}],156:[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":134,"./AsyncScheduler":135}],139:[function(require,module,exports){ +},{"./AsyncAction":152,"./AsyncScheduler":153}],157:[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":136,"./QueueScheduler":137}],140:[function(require,module,exports){ +},{"./QueueAction":154,"./QueueScheduler":155}],158:[function(require,module,exports){ "use strict"; var root_1 = require('../util/root'); -var Symbol = root_1.root.Symbol; -if (typeof Symbol === 'function') { - if (Symbol.iterator) { - exports.$$iterator = Symbol.iterator; - } - else if (typeof Symbol.for === 'function') { - exports.$$iterator = Symbol.for('iterator'); - } -} -else { - if (root_1.root.Set && typeof new root_1.root.Set()['@@iterator'] === 'function') { - // Bug for mozilla version - exports.$$iterator = '@@iterator'; - } - else if (root_1.root.Map) { - // es6-shim specific logic - var keys = Object.getOwnPropertyNames(root_1.root.Map.prototype); - for (var i = 0; i < keys.length; ++i) { - var key = keys[i]; - if (key !== 'entries' && key !== 'size' && root_1.root.Map.prototype[key] === root_1.root.Map.prototype['entries']) { - exports.$$iterator = key; - break; - } +function symbolIteratorPonyfill(root) { + var Symbol = root.Symbol; + if (typeof Symbol === 'function') { + if (!Symbol.iterator) { + Symbol.iterator = Symbol('iterator polyfill'); } + return Symbol.iterator; } else { - exports.$$iterator = '@@iterator'; + // [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":153}],141:[function(require,module,exports){ +},{"../util/root":176}],159:[function(require,module,exports){ "use strict"; var root_1 = require('../util/root'); function getSymbolObservable(context) { @@ -11382,23 +13348,66 @@ function getSymbolObservable(context) { return $$observable; } exports.getSymbolObservable = getSymbolObservable; -exports.$$observable = getSymbolObservable(root_1.root); +exports.observable = getSymbolObservable(root_1.root); +/** + * @deprecated use observable instead + */ +exports.$$observable = exports.observable; -},{"../util/root":153}],142:[function(require,module,exports){ +},{"../util/root":176}],160:[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') ? +exports.rxSubscriber = (typeof Symbol === 'function' && typeof Symbol.for === 'function') ? Symbol.for('rxSubscriber') : '@@rxSubscriber'; +/** + * @deprecated use rxSubscriber instead + */ +exports.$$rxSubscriber = exports.rxSubscriber; -},{"../util/root":153}],143:[function(require,module,exports){ +},{"../util/root":176}],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 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":176}],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 __()); +}; +/** * 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. * @@ -11420,7 +13429,7 @@ var ArgumentOutOfRangeError = (function (_super) { }(Error)); exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError; -},{}],144:[function(require,module,exports){ +},{}],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]; @@ -11449,7 +13458,7 @@ var EmptyError = (function (_super) { }(Error)); exports.EmptyError = EmptyError; -},{}],145:[function(require,module,exports){ +},{}],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]; @@ -11477,7 +13486,41 @@ var ObjectUnsubscribedError = (function (_super) { }(Error)); exports.ObjectUnsubscribedError = ObjectUnsubscribedError; -},{}],146:[function(require,module,exports){ +},{}],165:[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":176}],166:[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]; @@ -11503,67 +13546,96 @@ var UnsubscriptionError = (function (_super) { }(Error)); exports.UnsubscriptionError = UnsubscriptionError; -},{}],147:[function(require,module,exports){ +},{}],167:[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: {} }; -},{}],148:[function(require,module,exports){ +},{}],168:[function(require,module,exports){ "use strict"; exports.isArray = Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); -},{}],149:[function(require,module,exports){ +},{}],169:[function(require,module,exports){ +"use strict"; +exports.isArrayLike = (function (x) { return x && typeof x.length === 'number'; }); + +},{}],170:[function(require,module,exports){ +"use strict"; +function isDate(value) { + return value instanceof Date && !isNaN(+value); +} +exports.isDate = isDate; + +},{}],171:[function(require,module,exports){ "use strict"; function isFunction(x) { return typeof x === 'function'; } exports.isFunction = isFunction; -},{}],150:[function(require,module,exports){ +},{}],172:[function(require,module,exports){ +"use strict"; +var isArray_1 = require('../util/isArray'); +function isNumeric(val) { + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + return !isArray_1.isArray(val) && (val - parseFloat(val) + 1) >= 0; +} +exports.isNumeric = isNumeric; +; + +},{"../util/isArray":168}],173:[function(require,module,exports){ "use strict"; function isObject(x) { return x != null && typeof x === 'object'; } exports.isObject = isObject; -},{}],151:[function(require,module,exports){ +},{}],174:[function(require,module,exports){ "use strict"; function isPromise(value) { return value && typeof value.subscribe !== 'function' && typeof value.then === 'function'; } exports.isPromise = isPromise; -},{}],152:[function(require,module,exports){ +},{}],175:[function(require,module,exports){ "use strict"; function isScheduler(value) { return value && typeof value.schedule === 'function'; } exports.isScheduler = isScheduler; -},{}],153:[function(require,module,exports){ +},{}],176:[function(require,module,exports){ (function (global){ "use strict"; -var objectTypes = { - 'boolean': false, - 'function': true, - 'object': true, - 'number': false, - 'string': false, - 'undefined': false -}; -exports.root = (objectTypes[typeof self] && self) || (objectTypes[typeof window] && window); -var freeGlobal = objectTypes[typeof global] && global; -if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) { - exports.root = freeGlobal; -} +// CommonJS / Node have global context exposed as "global" variable. +// We don't want to include the whole node.d.ts this this compilation unit so we'll just fake +// the global "global" var for now. +var __window = typeof window !== 'undefined' && window; +var __self = typeof self !== 'undefined' && typeof WorkerGlobalScope !== 'undefined' && + self instanceof WorkerGlobalScope && self; +var __global = typeof global !== 'undefined' && global; +var _root = __window || __global || __self; +exports.root = _root; +// Workaround Closure Compiler restriction: The body of a goog.module cannot use throw. +// This is needed when used with angular/tsickle which inserts a goog.module statement. +// Wrap in IIFE +(function () { + if (!_root) { + throw new Error('RxJS could not find any global context (window, self, global)'); + } +})(); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],154:[function(require,module,exports){ +},{}],177:[function(require,module,exports){ "use strict"; var root_1 = require('./root'); -var isArray_1 = require('./isArray'); +var isArrayLike_1 = require('./isArrayLike'); var isPromise_1 = require('./isPromise'); +var isObject_1 = require('./isObject'); var Observable_1 = require('../Observable'); var iterator_1 = require('../symbol/iterator'); var InnerSubscriber_1 = require('../InnerSubscriber'); @@ -11583,7 +13655,7 @@ function subscribeToResult(outerSubscriber, result, outerValue, outerIndex) { return result.subscribe(destination); } } - if (isArray_1.isArray(result)) { + else if (isArrayLike_1.isArrayLike(result)) { for (var i = 0, len = result.length; i < len && !destination.closed; i++) { destination.next(result[i]); } @@ -11604,8 +13676,8 @@ function subscribeToResult(outerSubscriber, result, outerValue, outerIndex) { }); return destination; } - else if (typeof result[iterator_1.$$iterator] === 'function') { - var iterator = result[iterator_1.$$iterator](); + else if (result && typeof result[iterator_1.iterator] === 'function') { + var iterator = result[iterator_1.iterator](); do { var item = iterator.next(); if (item.done) { @@ -11618,43 +13690,47 @@ function subscribeToResult(outerSubscriber, result, outerValue, outerIndex) { } } while (true); } - else if (typeof result[observable_1.$$observable] === 'function') { - var obs = result[observable_1.$$observable](); + else if (result && typeof result[observable_1.observable] === 'function') { + var obs = result[observable_1.observable](); if (typeof obs.subscribe !== 'function') { - destination.error(new Error('invalid observable')); + destination.error(new TypeError('Provided object does not correctly implement Symbol.observable')); } else { return obs.subscribe(new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex)); } } else { - destination.error(new TypeError('unknown type returned')); + var value = isObject_1.isObject(result) ? 'an invalid object' : "'" + result + "'"; + var msg = ("You provided " + value + " where a stream was expected.") + + ' You can provide an Observable, Promise, Array, or Iterable.'; + destination.error(new TypeError(msg)); } return null; } exports.subscribeToResult = subscribeToResult; -},{"../InnerSubscriber":26,"../Observable":28,"../symbol/iterator":140,"../symbol/observable":141,"./isArray":148,"./isPromise":151,"./root":153}],155:[function(require,module,exports){ +},{"../InnerSubscriber":27,"../Observable":29,"../symbol/iterator":158,"../symbol/observable":159,"./isArrayLike":169,"./isObject":173,"./isPromise":174,"./root":176}],178:[function(require,module,exports){ "use strict"; var Subscriber_1 = require('../Subscriber'); var rxSubscriber_1 = require('../symbol/rxSubscriber'); +var Observer_1 = require('../Observer'); function toSubscriber(nextOrObserver, error, complete) { if (nextOrObserver) { if (nextOrObserver instanceof Subscriber_1.Subscriber) { return nextOrObserver; } - if (nextOrObserver[rxSubscriber_1.$$rxSubscriber]) { - return nextOrObserver[rxSubscriber_1.$$rxSubscriber](); + if (nextOrObserver[rxSubscriber_1.rxSubscriber]) { + return nextOrObserver[rxSubscriber_1.rxSubscriber](); } } if (!nextOrObserver && !error && !complete) { - return new Subscriber_1.Subscriber(); + return new Subscriber_1.Subscriber(Observer_1.empty); } return new Subscriber_1.Subscriber(nextOrObserver, error, complete); } exports.toSubscriber = toSubscriber; -},{"../Subscriber":35,"../symbol/rxSubscriber":142}],156:[function(require,module,exports){ +},{"../Observer":30,"../Subscriber":36,"../symbol/rxSubscriber":160}],179:[function(require,module,exports){ "use strict"; var errorObject_1 = require('./errorObject'); var tryCatchTarget; @@ -11674,847 +13750,970 @@ function tryCatch(fn) { exports.tryCatch = tryCatch; ; -},{"./errorObject":147}],157:[function(require,module,exports){ +},{"./errorObject":167}],180:[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 B(a,b){this.x=a||0;this.y=b||0}function da(a,b,c,d,e,f,g,h,k,m){Object.defineProperty(this,"id",{value:ee++});this.uuid=T.generateUUID();this.sourceFile=this.name="";this.image=void 0!==a?a:da.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:da.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 B(0,0);this.repeat=new B(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=T.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 da(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 ba(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function q(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}function J(){this.elements=new Float32Array([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")); -y.compileShader(P);y.compileShader(R);y.attachShader(N,P);y.attachShader(N,R);y.linkProgram(N);M=N;u=y.getAttribLocation(M,"position");v=y.getAttribLocation(M,"uv");c=y.getUniformLocation(M,"uvOffset");d=y.getUniformLocation(M,"uvScale");e=y.getUniformLocation(M,"rotation");f=y.getUniformLocation(M,"scale");g=y.getUniformLocation(M,"color");h=y.getUniformLocation(M,"map");k=y.getUniformLocation(M,"opacity");m=y.getUniformLocation(M,"modelViewMatrix");w=y.getUniformLocation(M,"projectionMatrix");n= -y.getUniformLocation(M,"fogType");p=y.getUniformLocation(M,"fogDensity");r=y.getUniformLocation(M,"fogNear");x=y.getUniformLocation(M,"fogFar");l=y.getUniformLocation(M,"fogColor");D=y.getUniformLocation(M,"alphaTest");N=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");N.width=8;N.height=8;P=N.getContext("2d");P.fillStyle="white";P.fillRect(0,0,8,8);ca=new da(N);ca.needsUpdate=!0}y.useProgram(M);E.initAttributes();E.enableAttribute(u);E.enableAttribute(v);E.disableUnusedAttributes(); -E.disable(y.CULL_FACE);E.enable(y.BLEND);y.bindBuffer(y.ARRAY_BUFFER,H);y.vertexAttribPointer(u,2,y.FLOAT,!1,16,0);y.vertexAttribPointer(v,2,y.FLOAT,!1,16,8);y.bindBuffer(y.ELEMENT_ARRAY_BUFFER,F);y.uniformMatrix4fv(w,!1,Ka.projectionMatrix.elements);E.activeTexture(y.TEXTURE0);y.uniform1i(h,0);P=N=0;(R=q.fog)?(y.uniform3f(l,R.color.r,R.color.g,R.color.b),R&&R.isFog?(y.uniform1f(r,R.near),y.uniform1f(x,R.far),y.uniform1i(n,1),P=N=1):R&&R.isFogExp2&&(y.uniform1f(p,R.density),y.uniform1i(n,2),P=N=2)): -(y.uniform1i(n,0),P=N=0);for(var R=0,S=b.length;R/g,function(a,c){var d=X[c];if(void 0===d)throw Error("Can not resolve #include <"+c+">");return Cd(d)})}function ve(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 T.isPowerOfTwo(a.width)&&T.isPowerOfTwo(a.height)}function m(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function w(b){b=b.target;b.removeEventListener("dispose",w);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["delete"](b)}q.textures--}function n(b){b=b.target;b.removeEventListener("dispose",n);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&&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["delete"](b.texture);d["delete"](b)}q.textures--}function p(b,g){var m=d.get(b);if(0x;x++)l[x]=p||n?n?b.image[x].image:b.image[x]:h(b.image[x],e.maxCubemapSize);var t=k(l[0]),u=f(b.format),ja=f(b.type);r(a.TEXTURE_CUBE_MAP, -b,t);for(x=0;6>x;x++)if(p)for(var B,C=l[x].mipmaps,z=0,N=C.length;zm;m++)e.__webglFramebuffer[m]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(g){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);r(a.TEXTURE_CUBE_MAP,b.texture,h);for(m=0;6>m;m++)l(e.__webglFramebuffer[m],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+m);b.texture.generateMipmaps&&h&&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,h),l(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),b.texture.generateMipmaps&&h&&a.generateMipmap(a.TEXTURE_2D),c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=b&&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);p(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 xf(){var a={};return{get:function(b){b=b.uuid;var c=a[b];void 0===c&&(c={},a[b]=c);return c},"delete":function(b){delete a[b.uuid]},clear:function(){a={}}}}function yf(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=ia.maxTextures&&console.warn("WebGLRenderer: trying to use "+a+" texture units while this GPU supports only "+ia.maxTextures);da+=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);ua.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);ua.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?ua.setTextureCube(b,c):ua.setTextureCubeDynamic(b,c)}}();this.getCurrentRenderTarget=function(){return V};this.setRenderTarget=function(a){(V=a)&&void 0===ea.get(a).__webglFramebuffer&&ua.setupRenderTarget(a);var b=a&&a.isWebGLRenderTargetCube,c;a?(c=ea.get(a),c=b?c.__webglFramebuffer[a.activeCubeFace]:c.__webglFramebuffer,X.copy(a.scissor),fb=a.scissorTest,$a.copy(a.viewport)):(c=null,X.copy(ha).multiplyScalar(Qa),fb=la,$a.copy(fa).multiplyScalar(Qa));T!==c&&(A.bindFramebuffer(A.FRAMEBUFFER, -c),T=c);Y.scissor(X);Y.setScissorTest(fb);Y.viewport($a);b&&(b=ea.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=ea.get(a).__webglFramebuffer;if(g){var h=!1;g!==T&&(A.bindFramebuffer(A.FRAMEBUFFER, -g),h=!0);try{var k=a.texture,m=k.format,n=k.type;1023!==m&&u(m)!==A.getParameter(A.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===n||u(n)===A.getParameter(A.IMPLEMENTATION_COLOR_READ_TYPE)||1015===n&&(ka.get("OES_texture_float")||ka.get("WEBGL_color_buffer_float"))||1016===n&&ka.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,u(m),u(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,T)}}}}}function Ib(a,b){this.name="";this.color=new O(a);this.density=void 0!==b?b:2.5E-4}function Jb(a,b,c){this.name="";this.color= -new O(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function jb(){z.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function Ed(a,b,c,d,e){z.call(this);this.lensFlares=[];this.positionScreen=new q;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)}function kb(a){U.call(this);this.type="SpriteMaterial";this.color=new O(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}function qc(a){z.call(this); -this.type="Sprite";this.material=void 0!==a?a:new kb}function rc(){z.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function lb(a,b,c,d,e,f,g,h,k,m,w,n){da.call(this,null,f,g,h,k,m,d,e,w,n);this.image={data:a,width:b,height:c};this.magFilter=void 0!==k?k:1003;this.minFilter=void 0!==m?m:1003;this.flipY=this.generateMipmaps=!1;this.unpackAlignment=1}function bd(a,b,c){this.useVertexTexture=void 0!==c?c:!0;this.identityMatrix=new J;a=a||[];this.bones=a.slice(0); -this.useVertexTexture?(a=Math.sqrt(4*this.bones.length),a=T.nextPowerOfTwo(Math.ceil(a)),this.boneTextureHeight=this.boneTextureWidth=a=Math.max(a,4),this.boneMatrices=new Float32Array(this.boneTextureWidth*this.boneTextureHeight*4),this.boneTexture=new lb(this.boneMatrices,this.boneTextureWidth,this.boneTextureHeight,1023,1015)):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 bonInverses is the wrong length."), -this.boneInverses=[],b=0,a=this.bones.length;b=a.HAVE_CURRENT_DATA&&(w.needsUpdate=!0)}da.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1;var w=this;m()}function Lb(a,b,c,d,e,f,g,h,k,m,w,n){da.call(this,null,f,g,h,k,m,d,e,w,n);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function fd(a,b,c,d,e,f,g,h,k){da.call(this,a,b,c,d,e,f,g,h,k);this.needsUpdate=!0}function tc(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");da.call(this,null,d,e,f,g,h,m,c,k);this.image={width:a,height:b};this.type=void 0!==c?c:1012;this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!==h?h:1003;this.generateMipmaps=this.flipY=!1}function Mb(a){function b(a,b){return a-b}G.call(this);var c=[0,0],d={},e=["a","b","c"];if(a&&a.isGeometry){var f=a.vertices,g=a.faces,h=0,k=new Uint32Array(6*g.length); -a=0;for(var m=g.length;an;n++){c[0]=w[e[n]];c[1]=w[e[(n+1)%3]];c.sort(b);var p=c.toString();void 0===d[p]&&(k[2*h]=c[0],k[2*h+1]=c[1],d[p]=!0,h++)}c=new Float32Array(6*h);a=0;for(m=h;an;n++)d=f[k[2*a+n]],h=6*a+3*n,c[h+0]=d.x,c[h+1]=d.y,c[h+2]=d.z;this.addAttribute("position",new C(c,3))}else if(a&&a.isBufferGeometry){if(null!==a.index){m=a.index.array;f=a.attributes.position;e=a.groups;h=0;0===e.length&&a.addGroup(0,m.length);k=new Uint32Array(2*m.length); -g=0;for(w=e.length;gn;n++)c[0]=m[a+n],c[1]=m[a+(n+1)%3],c.sort(b),p=c.toString(),void 0===d[p]&&(k[2*h]=c[0],k[2*h+1]=c[1],d[p]=!0,h++)}c=new Float32Array(6*h);a=0;for(m=h;an;n++)h=6*a+3*n,d=k[2*a+n],c[h+0]=f.getX(d),c[h+1]=f.getY(d),c[h+2]=f.getZ(d)}else for(f=a.attributes.position.array,h=f.length/3,k=h/3,c=new Float32Array(6*h),a=0,m=k;an;n++)h=18*a+6*n,k=9*a+3*n,c[h+0]=f[k],c[h+1]=f[k+1], -c[h+2]=f[k+2],d=9*a+(n+1)%3*3,c[h+3]=f[d],c[h+4]=f[d+1],c[h+5]=f[d+2];this.addAttribute("position",new C(c,3))}}function Nb(a,b,c){G.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f,g,h,k,m,w=b+1;for(f=0;f<=c;f++)for(m=f/c,g=0;g<=b;g++)k=g/b,h=a(k,m),d.push(h.x,h.y,h.z),e.push(k,m);a=[];var n;for(f=0;fd&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}G.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 q,d=new q,g=new q,h=0;he&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute("position",ha(h,3));this.addAttribute("normal",ha(h.slice(),3));this.addAttribute("uv",ha(k,2));this.normalizeNormals();this.boundingSphere=new Ca(new q, -c)}function Ob(a,b){ua.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 vc(a,b){Q.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ob(a,b));this.mergeVertices()}function Pb(a,b){ua.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 wc(a,b){Q.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Pb(a,b));this.mergeVertices()}function Qb(a,b){var c=(1+Math.sqrt(5))/2;ua.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 xc(a,b){Q.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Qb(a,b));this.mergeVertices()}function Rb(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;ua.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 yc(a,b){Q.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Rb(a,b));this.mergeVertices()}function zc(a,b,c,d){Q.call(this);this.type="PolyhedronGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d}; -this.fromBufferGeometry(new ua(a,b,c,d));this.mergeVertices()}function Sb(a,b,c,d,e){function f(e){var f=a.getPointAt(e/b),m=g.normals[e];e=g.binormals[e];for(n=0;n<=d;n++){var w=n/d*Math.PI*2,l=Math.sin(w),w=-Math.cos(w);k.x=w*m.x+l*e.x;k.y=w*m.y+l*e.y;k.z=w*m.z+l*e.z;k.normalize();r.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;p.push(h.x,h.y,h.z)}}G.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 q,k=new q,m=new B,w,n,p=[],r=[],l=[],t=[];for(w=0;wp;p++){e[0]=n[g[p]];e[1]=n[g[(p+1)%3]];e.sort(c);var l=e.toString();void 0===f[l]?f[l]={vert1:e[0],vert2:e[1],face1:m,face2:void 0}:f[l].face2=m}e=[];for(l in f)if(g=f[l],void 0===g.face2||h[g.face1].normal.dot(h[g.face2].normal)<=d)m=k[g.vert1],e.push(m.x),e.push(m.y),e.push(m.z),m=k[g.vert2],e.push(m.x),e.push(m.y),e.push(m.z);this.addAttribute("position",new C(new Float32Array(e),3))}function Ua(a, -b,c,d,e,f,g,h){function k(c){var e,f,k,n=new B,p=new q,l=0,w=!0===c?a:b,I=!0===c?1:-1;f=u;for(e=1;e<=d;e++)x.setXYZ(u,0,y*I,0),t.setXYZ(u,0,I,0),n.x=.5,n.y=.5,D.setXY(u,n.x,n.y),u++;k=u;for(e=0;e<=d;e++){var z=e/d*h+g,C=Math.cos(z),z=Math.sin(z);p.x=w*z;p.y=y*I;p.z=w*C;x.setXYZ(u,p.x,p.y,p.z);t.setXYZ(u,0,I,0);n.x=.5*C+.5;n.y=.5*z*I+.5;D.setXY(u,n.x,n.y);u++}for(e=0;ethis.duration&&this.resetDuration();this.optimize()}function ud(a){this.manager=void 0!==a?a:Ga;this.textures={}}function Id(a){this.manager=void 0!==a?a:Ga}function wb(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}function Jd(a){"boolean"=== -typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!==a?a:Ga;this.withCredentials=!1}function xe(a){this.manager=void 0!==a?a:Ga;this.texturePath=""}function ia(){}function Sa(a,b){this.v1=a;this.v2=b}function Oc(){this.curves=[];this.autoClose=!1}function Va(a,b,c,d,e,f,g,h){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 xb(a){this.points= -void 0===a?[]:a}function yb(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d}function zb(a,b,c){this.v0=a;this.v1=b;this.v2=c}function Ab(){Pc.apply(this,arguments);this.holes=[]}function Pc(a){Oc.call(this);this.currentPoint=new B;a&&this.fromPoints(a)}function Kd(){this.subPaths=[];this.currentPath=null}function Ld(a){this.data=a}function ye(a){this.manager=void 0!==a?a:Ga}function Md(){void 0===Nd&&(Nd=new (window.AudioContext||window.webkitAudioContext));return Nd}function Od(a){this.manager= -void 0!==a?a:Ga}function ze(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new Ea;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new Ea;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1}function vd(a,b,c){z.call(this);this.type="CubeCamera";var d=new Ea(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new q(1,0,0));this.add(d);var e=new Ea(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new q(-1,0,0));this.add(e);var f=new Ea(90,1,a,b);f.up.set(0,0,1);f.lookAt(new q(0, -1,0));this.add(f);var g=new Ea(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new q(0,-1,0));this.add(g);var h=new Ea(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new q(0,0,1));this.add(h);var k=new Ea(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new q(0,0,-1));this.add(k);this.renderTarget=new Eb(c,c,{format:1022,magFilter:1006,minFilter:1006});this.updateCubeMap=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,p=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=p;c.activeCubeFace=5;a.render(b,k,c);a.setRenderTarget(null)}}function Pd(){z.call(this);this.type="AudioListener";this.context=Md();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function dc(a){z.call(this);this.type="Audio";this.context=a.context;this.source=this.context.createBufferSource(); -this.source.onended=this.onEnded.bind(this);this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function Qd(a){dc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function Rd(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 wd(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 fa(a,b,c){this.path=b;this.parsedPath=c||fa.parseTrackName(b);this.node=fa.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function Sd(a){this.uuid=T.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 Td(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 Ud(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Ae(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function Bb(){G.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function Vd(a,b,c,d){this.uuid=T.generateUUID();this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0=== -d}function ec(a,b){this.uuid=T.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.version=0}function fc(a,b,c){ec.call(this,a,b);this.meshPerAttribute=c||1}function gc(a,b,c){C.call(this,a,b);this.meshPerAttribute=c||1}function Wd(a,b,c,d){this.ray=new ab(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 Be(a,b){return a.distance-b.distance}function Xd(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 ha(b,3));b=new oa({fog:!1});this.cone=new la(a,b);this.add(this.cone);this.update()}function ic(a){this.bones=this.getBoneList(a);for(var b=new Q, -c=0;cd;d++)c.faces[d].color=this.colors[4>d?0:1];d=new Ma({vertexColors:1,wireframe:!0});this.lightSphere=new ya(c,d);this.add(this.lightSphere);this.update()}function Sc(a,b,c,d){b=b||1;c=new O(void 0!==c?c:4473924);d=new O(void 0!== -d?d:8947848);for(var e=b/2,f=2*a/b,g=[],h=[],k=0,m=0,l=-a;k<=b;k++,l+=f){g.push(-a,0,l,a,0,l);g.push(l,0,-a,l,0,a);var n=k===e?c:d;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3}a=new G;a.addAttribute("position",new ha(g,3));a.addAttribute("color",new ha(h,3));g=new oa({vertexColors:2});la.call(this,a,g)}function Tc(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16776960;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=c.faces.length:console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead."); -c=new G;b=new ha(6*b,3);c.addAttribute("position",b);la.call(this,c,new oa({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function lc(a,b){z.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;void 0===b&&(b=1);var c=new G;c.addAttribute("position",new ha([-b,b,0,b,b,0,b,-b,0,-b,-b,0,-b,b,0],3));var d=new oa({fog:!1});this.add(new Ta(c,d));c=new G;c.addAttribute("position",new ha([0,0,0,0,0,1],3));this.add(new Ta(c,d));this.update()} -function Uc(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.vertices.push(new q);d.colors.push(new O(b));void 0===f[a]&&(f[a]=[]);f[a].push(d.vertices.length-1)}var d=new Q,e=new oa({color:16777215,vertexColors:1}),f={};b("n1","n2",16755200);b("n2","n4",16755200);b("n4","n3",16755200);b("n3","n1",16755200);b("f1","f2",16755200);b("f2","f4",16755200);b("f4","f3",16755200);b("f3","f1",16755200);b("n1","f1",16755200);b("n2","f2",16755200);b("n3","f3",16755200);b("n4","f4",16755200);b("p","n1",16711680); -b("p","n2",16711680);b("p","n3",16711680);b("p","n4",16711680);b("u1","u2",43775);b("u2","u3",43775);b("u3","u1",43775);b("c","t",16777215);b("p","c",3355443);b("cn1","cn2",3355443);b("cn3","cn4",3355443);b("cf1","cf2",3355443);b("cf3","cf4",3355443);la.call(this,d,e);this.camera=a;this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=f;this.update()}function Vc(a,b){var c=void 0!==b?b:8947848;this.object=a;this.box= -new Ba;ya.call(this,new ob(1,1,1),new Ma({color:c,wireframe:!0}))}function Wc(a,b){void 0===b&&(b=16776960);var c=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),d=new Float32Array(24),e=new G;e.setIndex(new C(c,1));e.addAttribute("position",new C(d,3));la.call(this,e,new oa({color:b}));void 0!==a&&this.update(a)}function Cb(a,b,c,d,e,f){z.call(this);void 0===d&&(d=16776960);void 0===c&&(c=1);void 0===e&&(e=.2*c);void 0===f&&(f=.2*e);this.position.copy(b);this.line=new Ta(Ce,new oa({color:d})); -this.line.matrixAutoUpdate=!1;this.add(this.line);this.cone=new ya(De,new Ma({color:d}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);this.setDirection(a);this.setLength(c,e,f)}function xd(a){a=a||1;var b=new Float32Array([0,0,0,a,0,0,0,0,0,0,a,0,0,0,0,0,0,a]),c=new Float32Array([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1]);a=new G;a.addAttribute("position",new C(b,3));a.addAttribute("color",new C(c,3));b=new oa({vertexColors:2});la.call(this,a,b)}function Ee(a){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Please use THREE.CatmullRomCurve3."); -$d.call(this,a);this.type="catmullrom";this.closed=!0}function yd(a,b,c,d,e,f){Va.call(this,a,b,c,c,d,e,f)}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52));void 0===Math.sign&&(Math.sign=function(a){return 0>a?-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)},random16:function(){console.warn("THREE.Math.random16() has been deprecated. Use Math.random() instead.");return Math.random()},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* -T.DEG2RAD},radToDeg:function(a){return a*T.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}};B.prototype={constructor:B,isVector2:!0,get width(){return this.x},set width(a){this.x=a},get height(){return this.y},set height(a){this.y=a},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){isFinite(a)?(this.x*=a,this.y*=a):this.y=this.x=0;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,b;return function(c,d){void 0===a&&(a=new B,b=new B);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+=(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},fromAttribute:function(a,b,c){void 0===c&&(c=0);b=b*a.itemSize+c;this.x=a.array[b];this.y=a.array[b+ -1];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}};da.DEFAULT_IMAGE=void 0;da.DEFAULT_MAPPING=300;da.prototype={constructor:da,isTexture:!0,set needsUpdate(a){!0===a&&this.version++},clone:function(){return(new this.constructor).copy(this)},copy:function(a){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.4,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=T.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(da.prototype,sa.prototype);var ee=0;ga.prototype={constructor:ga,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){isFinite(a)? -(this.x*=a,this.y*=a,this.z*=a,this.w*=a):this.w=this.z=this.y=this.x=0;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,b;return function(c,d){void 0===a&&(a=new ga,b=new ga);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},fromAttribute:function(a,b,c){void 0===c&&(c=0);b=b*a.itemSize+c;this.x=a.array[b];this.y=a.array[b+1];this.z=a.array[b+2];this.w=a.array[b+3];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;ba.prototype={constructor:ba,get x(){return this._x}, -set x(a){this._x=a;this.onChangeCallback()},get y(){return this._y},set y(a){this._y=a;this.onChangeCallback()},get z(){return this._z},set z(a){this._z=a;this.onChangeCallback()},get w(){return this._w},set w(a){this._w=a;this.onChangeCallback()},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=Math.cos(a._x/2),d=Math.cos(a._y/2),e=Math.cos(a._z/2),f=Math.sin(a._x/2),g=Math.sin(a._y/2),h=Math.sin(a._z/2),k=a.order;"XYZ"===k?(this._x=f*d*e+c*g*h,this._y=c*g*e-f*d*h,this._z=c*d*h+f*g*e,this._w=c*d*e-f*g*h):"YXZ"===k?(this._x=f*d*e+c*g*h,this._y=c*g*e-f*d*h,this._z=c*d*h-f*g*e,this._w=c*d*e+f*g*h):"ZXY"===k?(this._x= -f*d*e-c*g*h,this._y=c*g*e+f*d*h,this._z=c*d*h+f*g*e,this._w=c*d*e-f*g*h):"ZYX"===k?(this._x=f*d*e-c*g*h,this._y=c*g*e+f*d*h,this._z=c*d*h-f*g*e,this._w=c*d*e+f*g*h):"YZX"===k?(this._x=f*d*e+c*g*h,this._y=c*g*e+f*d*h,this._z=c*d*h-f*g*e,this._w=c*d*e-f*g*h):"XZY"===k&&(this._x=f*d*e-c*g*h,this._y=c*g*e-f*d*h,this._z=c*d*h+f*g*e,this._w=c*d*e+f*g*h);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=.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,b;return function(c,d){void 0===a&&(a=new q);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=a;return this},onChangeCallback:function(){}};Object.assign(ba,{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 l=e[f+1],n=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==l||m!==n){f=1-g;var p=h*d+k*l+m*n+c*e,r=0<=p?1:-1,x=1-p*p;x>Number.EPSILON&&(x=Math.sqrt(x),p=Math.atan2(x,p*r),f=Math.sin(f*p)/x,g=Math.sin(g*p)/x);r*=g;h=h*f+d*r;k=k*f+l*r;m=m*f+n*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}});q.prototype={constructor:q,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){isFinite(a)?(this.x*=a,this.y*=a,this.z*=a):this.z=this.y=this.x=0;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;return function(b){!1===(b&&b.isEuler)&&console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");void 0===a&&(a=new ba);return this.applyQuaternion(a.setFromEuler(b))}}(), -applyAxisAngle:function(){var a;return function(b,c){void 0===a&&(a=new ba);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},applyProjection: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,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;return function(b){void 0===a&&(a=new J); -a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyProjection(a)}}(),unproject:function(){var a;return function(b){void 0===a&&(a=new J);a.multiplyMatrices(b.matrixWorld,a.getInverse(b.projectionMatrix));return this.applyProjection(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,b;return function(c, -d){void 0===a&&(a=new q,b=new q);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;return function(b){void 0===a&&(a=new q);a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a;return function(b){void 0=== -a&&(a=new q);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(T.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},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){if("number"===typeof a){console.warn("THREE.Vector3: setFromMatrixColumn now expects ( matrix, index )."); -var c=a;a=b;b=c}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},fromAttribute:function(a,b,c){void 0===c&&(c=0);b=b*a.itemSize+c;this.x=a.array[b];this.y=a.array[b+1];this.z=a.array[b+2];return this}};J.prototype={constructor:J,isMatrix4:!0, -set:function(a,b,c,d,e,f,g,h,k,m,l,n,p,r,x,t){var q=this.elements;q[0]=a;q[4]=b;q[8]=c;q[12]=d;q[1]=e;q[5]=f;q[9]=g;q[13]=h;q[2]=k;q[6]=m;q[10]=l;q[14]=n;q[3]=p;q[7]=r;q[11]=x;q[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){this.elements.set(a.elements);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;return function(b){void 0===a&&(a=new q);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,l=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=k+m*d;b[5]=a-l*d;b[9]=-c*g;b[2]=l-a*d;b[6]=m+k*d;b[10]=f*g}else"YXZ"=== -a.order?(a=g*h,k=g*e,m=d*h,l=d*e,b[0]=a+l*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]=l+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,k=g*e,m=d*h,l=d*e,b[0]=a-l*c,b[4]=-f*e,b[8]=m+k*c,b[1]=k+m*c,b[5]=f*h,b[9]=l-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,l=c*e,b[0]=g*h,b[4]=m*d-k,b[8]=a*d+l,b[1]=g*e,b[5]=l*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,l=c*d,b[0]=g*h,b[4]=l-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-l*e):"XZY"===a.order&&(a=f*g,k=f*d,m=c*g,l=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+l,b[5]=f*h,b[9]=k*e-m,b[2]=m*e-k,b[6]=c*h,b[10]=l*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,l=d*h,d=d*k,e=e*k,g=f*g,h=f*h,f=f*k;b[0]=1-(l+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+l);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,b,c;return function(d,e,f){void 0===a&&(a=new q,b=new q,c=new q);var g=this.elements;c.subVectors(d,e).normalize();0===c.lengthSq()&&(c.z=1);a.crossVectors(f,c).normalize();0===a.lengthSq()&&(c.z+=1E-4,a.crossVectors(f,c).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],l=c[5],n=c[9],p=c[13],r=c[2],x=c[6],t=c[10],q=c[14],u=c[3],v=c[7],I=c[11],c=c[15],y=d[0],E=d[4],H=d[8],F=d[12],M=d[1],B=d[5],K=d[9],z=d[13],C=d[2],G=d[6],J=d[10],N=d[14],P=d[3],R=d[7],S=d[11],d=d[15];e[0]=f*y+g*M+h*C+k*P;e[4]=f*E+g*B+h*G+k*R;e[8]=f*H+g*K+h*J+k*S;e[12]= -f*F+g*z+h*N+k*d;e[1]=m*y+l*M+n*C+p*P;e[5]=m*E+l*B+n*G+p*R;e[9]=m*H+l*K+n*J+p*S;e[13]=m*F+l*z+n*N+p*d;e[2]=r*y+x*M+t*C+q*P;e[6]=r*E+x*B+t*G+q*R;e[10]=r*H+x*K+t*J+q*S;e[14]=r*F+x*z+t*N+q*d;e[3]=u*y+v*M+I*C+c*P;e[7]=u*E+v*B+I*G+c*R;e[11]=u*H+v*K+I*J+c*S;e[15]=u*F+v*z+I*N+c*d;return this},multiplyToArray:function(a,b,c){var d=this.elements;this.multiplyMatrices(a,b);c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12]; -c[13]=d[13];c[14]=d[14];c[15]=d[15];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},applyToVector3Array:function(){var a;return function(b,c,d){void 0===a&&(a=new q);void 0===c&&(c=0);void 0===d&&(d=b.length);for(var e=0;ethis.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.elements.set(this.elements);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}}(),makeFrustum:function(a,b,c,d,e,f){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/(d-c); -g[9]=(d+c)/(d-c);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},makePerspective:function(a,b,c,d){a=c*Math.tan(T.DEG2RAD*a*.5);var e=-a;return this.makeFrustum(e*b,a*b,e,a,c,d)},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}};Xa.prototype=Object.create(da.prototype); -Xa.prototype.constructor=Xa;Xa.prototype.isCubeTexture=!0;Object.defineProperty(Xa.prototype,"images",{get:function(){return this.image},set:function(a){this.image=a}});var ie=new da,je=new Xa,fe=[],he=[];ne.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 zd=/([\w\d_]+)(\])?(\[|\.)?/g;Ya.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};Ya.prototype.set=function(a,b,c){var d=this.map[c]; -void 0!==d&&d.setValue(a,b[c],this.renderer)};Ya.prototype.setOptional=function(a,b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};Ya.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)}};Ya.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 La={merge:function(a){for(var b={},c=0;c 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t\t}\n\t\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}\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", +(function(l,xa){"object"===typeof exports&&"undefined"!==typeof module?xa(exports):"function"===typeof define&&define.amd?define(["exports"],xa):xa(l.THREE=l.THREE||{})})(this,function(l){function xa(){}function C(a,b){this.x=a||0;this.y=b||0}function ba(a,b,c,d,e,f,g,h,k,m){Object.defineProperty(this,"id",{value:hf++});this.uuid=Y.generateUUID();this.name="";this.image=void 0!==a?a:ba.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:ba.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 C(0,0);this.repeat=new C(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 fa(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function Cb(a,b,c){this.uuid=Y.generateUUID();this.width= +a;this.height=b;this.scissor=new fa(0,0,a,b);this.scissorTest=!1;this.viewport=new fa(0,0,a,b);c=c||{};void 0===c.minFilter&&(c.minFilter=1006);this.texture=new ba(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 Db(a,b,c){Cb.call(this,a,b,c);this.activeMipMapLevel= +this.activeCubeFace=0}function oa(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function n(a,b,c){this.x=a||0;this.y=b||0;this.z=c||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 ) {\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(M);w.attachShader(ka,P);w.attachShader(ka,M);w.linkProgram(ka);O=ka;x=w.getAttribLocation(O,"position");u=w.getAttribLocation(O,"uv");c=w.getUniformLocation(O,"uvOffset");d=w.getUniformLocation(O,"uvScale");e=w.getUniformLocation(O,"rotation");f=w.getUniformLocation(O,"scale");g=w.getUniformLocation(O,"color");h=w.getUniformLocation(O,"map");k=w.getUniformLocation(O,"opacity");m=w.getUniformLocation(O,"modelViewMatrix");q=w.getUniformLocation(O,"projectionMatrix"); +v=w.getUniformLocation(O,"fogType");p=w.getUniformLocation(O,"fogDensity");r=w.getUniformLocation(O,"fogNear");l=w.getUniformLocation(O,"fogFar");t=w.getUniformLocation(O,"fogColor");y=w.getUniformLocation(O,"alphaTest");ka=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");ka.width=8;ka.height=8;P=ka.getContext("2d");P.fillStyle="white";P.fillRect(0,0,8,8);aa=new ba(ka);aa.needsUpdate=!0}w.useProgram(O);I.initAttributes();I.enableAttribute(x);I.enableAttribute(u);I.disableUnusedAttributes(); +I.disable(w.CULL_FACE);I.enable(w.BLEND);w.bindBuffer(w.ARRAY_BUFFER,W);w.vertexAttribPointer(x,2,w.FLOAT,!1,16,0);w.vertexAttribPointer(u,2,w.FLOAT,!1,16,8);w.bindBuffer(w.ELEMENT_ARRAY_BUFFER,D);w.uniformMatrix4fv(q,!1,Ya.projectionMatrix.elements);I.activeTexture(w.TEXTURE0);w.uniform1i(h,0);P=ka=0;(M=n.fog)?(w.uniform3f(t,M.color.r,M.color.g,M.color.b),M.isFog?(w.uniform1f(r,M.near),w.uniform1f(l,M.far),w.uniform1i(v,1),P=ka=1):M.isFogExp2&&(w.uniform1f(p,M.density),w.uniform1i(v,2),P=ka=2)): +(w.uniform1i(v,0),P=ka=0);for(var M=0,V=b.length;Mb&&(b=a[c]);return b}function E(){Object.defineProperty(this, +"id",{value:Rd++});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 Gb(a,b,c,d,e,f){J.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};this.fromBufferGeometry(new ib(a,b,c,d,e,f));this.mergeVertices()}function ib(a,b,c,d,e,f){function g(a,b, +c,d,e,f,g,l,W,D,O){var aa=f/W,F=g/D,ja=f/2,T=g/2,C=l/2;g=W+1;var B=D+1,z=f=0,P,M,V=new n;for(M=0;M/gm,function(a,c){var d=X[c]; +if(void 0===d)throw Error("Can not resolve #include <"+c+">");return Ud(d)})}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){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(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 v(b){b=b.target;b.removeEventListener("dispose",v);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 p(b){b=b.target;b.removeEventListener("dispose",p);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,p){var q=d.get(b);if(0y;y++)n[y]=r||t?t?b.image[y].image:b.image[y]:h(b.image[y],e.maxCubemapSize);var x=k(n[0]),F=f(b.format),ja=f(b.type);l(a.TEXTURE_CUBE_MAP,b,x);for(y= +0;6>y;y++)if(r)for(var T,C=n[y].mipmaps,z=0,B=C.length;zv;v++)e.__webglFramebuffer[v]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);l(a.TEXTURE_CUBE_MAP,b.texture,q);for(v=0;6>v;v++)t(e.__webglFramebuffer[v],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+v);m(b.texture,q)&&a.generateMipmap(a.TEXTURE_CUBE_MAP);c.bindTexture(a.TEXTURE_CUBE_MAP, +null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),l(a.TEXTURE_2D,b.texture,q),t(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),m(b.texture,q)&&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(),n(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),n(e.__webglDepthbuffer, +b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture,f=k(b);m(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 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=ia.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+a+" texture units while this GPU supports only "+ +ia.maxTextures);X+=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);ra.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);ra.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?ra.setTextureCube(b,c):ra.setTextureCubeDynamic(b,c)}}();this.getRenderTarget=function(){return P};this.setRenderTarget=function(a){(P=a)&&void 0===ha.get(a).__webglFramebuffer&&ra.setupRenderTarget(a);var b=a&&a.isWebGLRenderTargetCube, +c;a?(c=ha.get(a),c=b?c.__webglFramebuffer[a.activeCubeFace]:c.__webglFramebuffer,J.copy(a.scissor),Z=a.scissorTest,U.copy(a.viewport)):(c=null,J.copy(ea).multiplyScalar(Q),Z=na,U.copy(hd).multiplyScalar(Q));M!==c&&(A.bindFramebuffer(A.FRAMEBUFFER,c),M=c);ga.scissor(J);ga.setScissorTest(Z);ga.viewport(U);b&&(b=ha.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(a&&a.isWebGLRenderTarget){var g=ha.get(a).__webglFramebuffer;if(g){var h=!1;g!==M&&(A.bindFramebuffer(A.FRAMEBUFFER,g),h=!0);try{var k=a.texture,m=k.format,q=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===q||y(q)===A.getParameter(A.IMPLEMENTATION_COLOR_READ_TYPE)||1015===q&&(ma.get("OES_texture_float")||ma.get("WEBGL_color_buffer_float"))|| +1016===q&&ma.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(q),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,M)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")}} +function Ib(a,b){this.name="";this.color=new G(a);this.density=void 0!==b?b:2.5E-4}function Jb(a,b,c){this.name="";this.color=new G(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function ld(){z.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function Yd(a,b,c,d,e){z.call(this);this.lensFlares=[];this.positionScreen=new n;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)}function bb(a){U.call(this);this.type="SpriteMaterial"; +this.color=new G(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}function xc(a){z.call(this);this.type="Sprite";this.material=void 0!==a?a:new bb}function yc(){z.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function zc(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&&(q.needsUpdate=!0)}ba.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1;var q=this;m()}function Lb(a,b, +c,d,e,f,g,h,k,m,q,v){ba.call(this,null,f,g,h,k,m,d,e,q,v);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function qd(a,b,c,d,e,f,g,h,k){ba.call(this,a,b,c,d,e,f,g,h,k);this.needsUpdate=!0}function Bc(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);ba.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 Mb(a){E.call(this);this.type="WireframeGeometry";var b=[],c,d,e,f,g=[0,0],h={},k,m,q=["a","b","c"];if(a&&a.isGeometry){var v=a.faces;c=0;for(e=v.length;cd;d++)k=p[q[d]],m=p[q[(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],q=a.vertices[c.index1],b.push(q.x,q.y,q.z),q=a.vertices[c.index2], +b.push(q.x,q.y,q.z)}else if(a&&a.isBufferGeometry){var r,q=new n;if(null!==a.index){v=a.attributes.position;p=a.index;r=a.groups;0===r.length&&(r=[{start:0,count:p.count,materialIndex:0}]);a=0;for(f=r.length;ad;d++)k=p.getX(c+d),m=p.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],q.fromBufferAttribute(v,c.index1),b.push(q.x,q.y,q.z),q.fromBufferAttribute(v, +c.index2),b.push(q.x,q.y,q.z)}else for(v=a.attributes.position,c=0,e=v.count/3;cd;d++)h=3*c+d,q.fromBufferAttribute(v,h),b.push(q.x,q.y,q.z),h=3*c+(d+1)%3,q.fromBufferAttribute(v,h),b.push(q.x,q.y,q.z)}this.addAttribute("position",new B(b,3))}function Cc(a,b,c){J.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Nb(a,b,c));this.mergeVertices()}function Nb(a,b,c){E.call(this);this.type="ParametricBufferGeometry";this.parameters= +{func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=new n,k=new n,m=new n,q=new n,v=new n,p,r,l=b+1;for(p=0;p<=c;p++){var t=p/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),q.subVectors(k,m)):(m=a(y+1E-5,t,m),q.subVectors(m,k));0<=t-1E-5?(m=a(y,t-1E-5,m),v.subVectors(k,m)):(m=a(y,t+1E-5,m),v.subVectors(m,k));h.crossVectors(q,v).normalize();f.push(h.x,h.y,h.z);g.push(y,t)}}for(p=0;pd&&1===a.x&&(k[b]=a.x-1);0===c.x&&0=== +c.z&&(k[b]=d/2/Math.PI+.5)}E.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 n,d=new n,g=new n,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 B(h,3));this.addAttribute("normal", +new B(h.slice(),3));this.addAttribute("uv",new B(k,2));0===d?this.computeVertexNormals():this.normalizeNormals()}function Ec(a,b){J.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ob(a,b));this.mergeVertices()}function Ob(a,b){za.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 Fc(a,b){J.call(this);this.type="OctahedronGeometry";this.parameters= +{radius:a,detail:b};this.fromBufferGeometry(new lb(a,b));this.mergeVertices()}function lb(a,b){za.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 Gc(a,b){J.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Pb(a,b));this.mergeVertices()}function Pb(a,b){var c=(1+Math.sqrt(5))/2;za.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 Hc(a,b){J.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Qb(a,b));this.mergeVertices()}function Qb(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;za.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 Ic(a, +b,c,d,e,f){J.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 Rb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Rb(a,b,c,d,e){function f(e){var f=a.getPointAt(e/b),m=g.normals[e];e=g.binormals[e];for(v=0;v<=d;v++){var q=v/d*Math.PI*2,l=Math.sin(q),q=-Math.cos(q); +k.x=q*m.x+l*e.x;k.y=q*m.y+l*e.y;k.z=q*m.z+l*e.z;k.normalize();r.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;p.push(h.x,h.y,h.z)}}E.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 n,k=new n,m=new C,q,v,p=[],r=[],l=[],t=[];for(q=0;qn;n++)g=l[k[n]],h=l[k[(n+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:v,face2:void 0}:f[g].face2=v;for(g in f)if(e=f[g],void 0===e.face2||m[e.face1].normal.dot(m[e.face2].normal)<=d)k=q[e.index1],c.push(k.x,k.y,k.z),k=q[e.index2],c.push(k.x,k.y,k.z);this.addAttribute("position", +new B(c,3))}function nb(a,b,c,d,e,f,g,h){J.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 Ua(a,b,c,d,e,f,g,h));this.mergeVertices()}function Ua(a,b,c,d,e,f,g,h){function k(c){var e,f,k,t=new C,D=new n,O=0,aa=!0===c?a:b,F=!0===c?1:-1;f=ca;for(e=1;e<=d;e++)v.push(0,y*F,0),p.push(0,F,0),l.push(.5,.5),ca++;k=ca;for(e=0;e<=d;e++){var B=e/d*h+g,z=Math.cos(B), +B=Math.sin(B);D.x=aa*B;D.y=y*F;D.z=aa*z;v.push(D.x,D.y,D.z);p.push(0,F,0);t.x=.5*z+.5;t.y=.5*B*F+.5;l.push(t.x,t.y);ca++}for(e=0;ethis.duration&&this.resetDuration();this.optimize()}function Gd(a){this.manager= +void 0!==a?a:va;this.textures={}}function be(a){this.manager=void 0!==a?a:va}function ec(){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:va;this.withCredentials=!1}function Pe(a){this.manager=void 0!==a?a:va;this.texturePath=""}function Qe(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 wb(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function xb(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 ua(){this.arcLengthDivisions=200}function Qa(a,b){this.arcLengthDivisions=200;this.v1=a;this.v2=b}function Vc(){this.arcLengthDivisions=200;this.curves=[];this.autoClose=!1}function Va(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 yb(a){this.arcLengthDivisions=200;this.points=void 0===a?[]:a}function fc(a,b,c,d){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c;this.v3=d}function gc(a,b,c){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c}function Wc(a){Vc.call(this);this.currentPoint=new C;a&&this.fromPoints(a)}function zb(){Wc.apply(this,arguments);this.holes=[]}function de(){this.subPaths=[];this.currentPath=null}function ee(a){this.data=a}function Re(a){this.manager= +void 0!==a?a:va}function fe(a){this.manager=void 0!==a?a:va}function Se(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new qa;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new qa;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1}function Hd(a,b,c){z.call(this);this.type="CubeCamera";var d=new qa(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new n(1,0,0));this.add(d);var e=new qa(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new n(-1,0,0));this.add(e); +var f=new qa(90,1,a,b);f.up.set(0,0,1);f.lookAt(new n(0,1,0));this.add(f);var g=new qa(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new n(0,-1,0));this.add(g);var h=new qa(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new n(0,0,1));this.add(h);var k=new qa(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new n(0,0,-1));this.add(k);this.renderTarget=new Db(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,p=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=p;c.activeCubeFace=5;a.render(b,k,c);a.setRenderTarget(null)}}function ge(){z.call(this);this.type="AudioListener";this.context=he.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter= +null}function hc(a){z.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 ie(a){hc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function je(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 ke(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 Te(a,b,c){c=c||ha.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function ha(a, +b,c){this.path=b;this.parsedPath=c||ha.parseTrackName(b);this.node=ha.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function Ue(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 Ve(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 We(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Id(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function le(){E.call(this);this.type="InstancedBufferGeometry"; +this.maxInstancedCount=void 0}function me(a,b,c,d){this.uuid=Y.generateUUID();this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function ic(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 ne(a,b,c){ic.call(this,a,b);this.meshPerAttribute=c||1}function oe(a,b,c){Z.call(this,a,b);this.meshPerAttribute=c||1}function Xe(a,b,c,d){this.ray= +new kb(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 Ye(a,b){return a.distance-b.distance}function pe(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 B(b,3));b=new ea({fog:!1});this.cone=new Q(a,b);this.add(this.cone);this.update()}function bf(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;ca.length&&console.warn("THREE.CatmullRomCurve3: Points array needs at least two entries.");this.points=a||[];this.closed=!1}function bd(a,b,c,d){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2= +c;this.v3=d}function cd(a,b,c){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c}function dd(a,b){this.arcLengthDivisions=200;this.v1=a;this.v2=b}function Md(a,b,c,d,e,f){Va.call(this,a,b,c,c,d,e,f)}function cf(a){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");La.call(this,a);this.type="catmullrom";this.closed=!0}function df(a){console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");La.call(this,a);this.type= +"catmullrom"}function se(a){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.");La.call(this,a);this.type="catmullrom"}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52));void 0===Number.isInteger&&(Number.isInteger=function(a){return"number"===typeof a&&isFinite(a)&&Math.floor(a)===a});void 0===Math.sign&&(Math.sign=function(a){return 0>a?-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(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)},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)},lengthManhattan: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},distanceToManhattan: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 hf=0;ba.DEFAULT_IMAGE=void 0;ba.DEFAULT_MAPPING=300;Object.defineProperty(ba.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(ba.prototype,xa.prototype,{constructor:ba,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(fa.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,b;return function(c,d){void 0===a&&(a=new fa,b=new fa);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)},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()||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(Cb.prototype,xa.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"})}});Db.prototype=Object.create(Cb.prototype); +Db.prototype.constructor=Db;Db.prototype.isWebGLRenderTargetCube=!0;Object.assign(oa,{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 q=e[f+1],l=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==q||m!==l){f=1-g;var p=h*d+k*q+m*l+c*e,r=0<=p?1:-1,n=1-p*p;n>Number.EPSILON&&(n=Math.sqrt(n),p=Math.atan2(n,p*r),f=Math.sin(f*p)/n,g=Math.sin(g*p)/n);r*=g;h=h*f+d*r;k=k*f+q*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(oa.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(oa.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,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=.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 n,b;return function(c,d){void 0===a&&(a=new n);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=a;return this},onChangeCallback:function(){}});Object.assign(n.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 oa;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 oa;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,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 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 n,b=new n;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)},lengthManhattan: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){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 n;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=new n;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){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(K.prototype, +{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,m,q,l,p,r,n,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]=q;y[14]=l;y[3]=p;y[7]=r;y[11]=n;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 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 n;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.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,q=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=k+m*d;b[5]=a-q*d;b[9]=-c*g;b[2]=q-a*d;b[6]=m+k*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,k=g*e,m=d*h,q=d*e,b[0]=a+q*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]=q+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,k=g*e,m=d*h,q=d*e,b[0]=a-q*c,b[4]=-f*e,b[8]=m+k*c,b[1]=k+m*c,b[5]=f*h,b[9]=q-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,q=c*e,b[0]=g*h,b[4]=m*d-k,b[8]=a* +d+q,b[1]=g*e,b[5]=q*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,q=c*d,b[0]=g*h,b[4]=q-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-q*e):"XZY"===a.order&&(a=f*g,k=f*d,m=c*g,q=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+q,b[5]=f*h,b[9]=k*e-m,b[2]=m*e-k,b[6]=c*h,b[10]=q*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,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]=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+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 n,b=new n,c=new n;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,e=this.elements,f=c[0],g=c[4],h=c[8],k=c[12],m=c[1],q=c[5],l=c[9], +p=c[13],r=c[2],n=c[6],t=c[10],y=c[14],x=c[3],u=c[7],H=c[11],c=c[15],w=d[0],I=d[4],W=d[8],D=d[12],O=d[1],B=d[5],F=d[9],C=d[13],z=d[2],E=d[6],G=d[10],K=d[14],P=d[3],M=d[7],V=d[11],d=d[15];e[0]=f*w+g*O+h*z+k*P;e[4]=f*I+g*B+h*E+k*M;e[8]=f*W+g*F+h*G+k*V;e[12]=f*D+g*C+h*K+k*d;e[1]=m*w+q*O+l*z+p*P;e[5]=m*I+q*B+l*E+p*M;e[9]=m*W+q*F+l*G+p*V;e[13]=m*D+q*C+l*K+p*d;e[2]=r*w+n*O+t*z+y*P;e[6]=r*I+n*B+t*E+y*M;e[10]=r*W+n*F+t*G+y*V;e[14]=r*D+n*C+t*K+y*d;e[3]=x*w+u*O+H*z+c*P;e[7]=x*I+u*B+H*E+c*M;e[11]=x*W+u*F+H*G+ +c*V;e[15]=x*D+u*C+H*K+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 n;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}});db.prototype=Object.create(ba.prototype); +db.prototype.constructor=db;db.prototype.isDataTexture=!0;Xa.prototype=Object.create(ba.prototype);Xa.prototype.constructor=Xa;Xa.prototype.isCubeTexture=!0;Object.defineProperty(Xa.prototype,"images",{get:function(){return this.image},set:function(a){this.image=a}});var Ce=new ba,De=new Xa,xe=[],ze=[],Be=new Float32Array(16),Ae=new Float32Array(9);He.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 Pd=/([\w\d_]+)(\])?(\[|\.)?/g; +eb.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};eb.prototype.setOptional=function(a,b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};eb.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)}};eb.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 lg={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(G.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 = 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 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}\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 return value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n return 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 return 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 return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n float maxComponent = max( max( value.r, value.g ), value.b );\n float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n return vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n float maxRGB = max( value.x, max( value.g, value.b ) );\n float M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n M = ceil( M * 255.0 ) / 255.0;\n return vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n float maxRGB = max( value.x, max( value.g, value.b ) );\n float D = max( maxRange / maxRGB, 1.0 );\n D = min( floor( D ) / 255.0, 1.0 );\n return 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 vec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n Xp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n vec4 vResult;\n vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n vResult.w = fract(Le);\n vResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n return 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 float Le = value.z * 255.0 + value.w;\n vec3 Xp_Y_XYZp;\n Xp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n return 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", -envmap_pars_fragment:"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntenstiy;\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", +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", +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:"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, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = asin( flipNormal * reflectVec.y ) * RECIPROCAL_PI + 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", +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_fragment:"#ifdef USE_FOG\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\n\t#else\n\t\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n\t#endif\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\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\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", -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\tif ( testLightInRange( lightDistance, pointLight.distance ) ) {\n\t\t\tdirectLight.color = pointLight.color;\n\t\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.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_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 ( all( bvec2( angleCos > spotLight.coneCos, testLightInRange( lightDistance, spotLight.distance ) ) ) ) {\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_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\t#include \n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = flipNormal * 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 = flipNormal * 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\t#include \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 = flipNormal * 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 = flipNormal * 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( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * 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 = flipNormal * 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\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\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", +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};\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}\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_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 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\t\t\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\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", -metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.r;\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", +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 return normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n return 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 return ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n return linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n return (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n return ( 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",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.r;\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", +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 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:"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 ) {\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", 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", -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 boneTextureWidth;\n\t\tuniform int boneTextureHeight;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureWidth ) );\n\t\t\tfloat y = floor( j / float( boneTextureWidth ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureWidth );\n\t\t\tfloat dy = 1.0 / float( boneTextureHeight );\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 return toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n return 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 color *= toneMappingExposure;\n return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n color = max( vec3( 0.0 ), color - 0.004 );\n return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\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\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:"#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", +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\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\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", +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:"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", 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 \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}\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 \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;\n\treflectedLight.directDiffuse = vec3( 0.0 );\n\treflectedLight.directSpecular = vec3( 0.0 );\n\treflectedLight.indirectDiffuse = diffuseColor.rgb;\n\treflectedLight.indirectSpecular = vec3( 0.0 );\n\t#include \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_vert:"#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}\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 \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}\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 \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}\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 \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}\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 \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", -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\nuniform float envMapIntensity;\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 \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}\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}\n", -normal_frag:"uniform float opacity;\nvarying vec3 vNormal;\n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( vNormal ), opacity );\n\t#include \n}\n",normal_vert:"varying vec3 vNormal;\n#include \n#include \n#include \n#include \nvoid main() {\n\tvNormal = normalize( normalMatrix * normal );\n\t#include \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_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_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\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\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 \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}\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"};O.prototype={constructor:O, -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=T.euclideanModulo(b,1);c=T.clamp(c,0,1);d=T.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+(cthis.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?!0:!1},getParameter:function(a,b){return(b||new B).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 B).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new B;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)}};U.prototype={constructor:U,isMaterial:!0,get needsUpdate(){return this._needsUpdate},set needsUpdate(a){!0===a&&this.update();this._needsUpdate=a},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.4,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);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);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);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g)},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?!0:!1},getParameter:function(a,b){return(b||new q).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;return function(b){void 0===a&&(a=new q);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 q).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new q;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new q;return function(b){b=b||new Ca;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 q,new q,new q,new q,new q,new q,new q,new q];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)}};Ca.prototype={constructor:Ca,set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a= -new Ba;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 q;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 Ba;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}};Ia.prototype={constructor:Ia,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){a=a.elements;this.set(a[0],a[3],a[6],a[1],a[4],a[7],a[2],a[5],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},applyToVector3Array:function(){var a;return function(b,c,d){void 0===a&&(a=new q);void 0===c&&(c=0);void 0===d&&(d=b.length);for(var e=0;ec;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}};va.prototype={constructor:va,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 q,b=new q;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 q).copy(this.normal).multiplyScalar(c)},intersectLine:function(){var a=new q;return function(b,c){var d=c||new q,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],n=c[9],p=c[10],r=c[11],q=c[12],t=c[13],D=c[14],c=c[15]; -b[0].setComponents(f-a,m-g,r-l,c-q).normalize();b[1].setComponents(f+a,m+g,r+l,c+q).normalize();b[2].setComponents(f+d,m+h,r+n,c+t).normalize();b[3].setComponents(f-d,m-h,r-n,c-t).normalize();b[4].setComponents(f-e,m-k,r-p,c-D).normalize();b[5].setComponents(f+e,m+k,r+p,c+D).normalize();return this},intersectsObject:function(){var a=new Ca;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 Ca;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}};ab.prototype={constructor:ab,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 q).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 q;return function(b){this.origin.copy(this.at(b,a));return this}}(),closestPointToPoint:function(a,b){var c=b||new q;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 q;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 q,b=new q,c=new q;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),n=c.lengthSq(),p=Math.abs(1-k*k),r;0=-r?e<=r?(h=1/p,d*=h,e*=h,k=d*(d+k*e+2*m)+e*(k*d+e+2*l)+n):(e=h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+n):(e=-h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+n):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 q;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a= -new q,b=new q,c=new q,d=new q;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";bb.prototype={constructor:bb,isEuler:!0,get x(){return this._x},set x(a){this._x=a;this.onChangeCallback()},get y(){return this._y},set y(a){this._y=a;this.onChangeCallback()},get z(){return this._z},set z(a){this._z=a;this.onChangeCallback()},get order(){return this._order}, -set order(a){this._order=a;this.onChangeCallback()},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=T.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],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(-m,e),this._z=Math.atan2(-f,a)):(this._x=Math.atan2(n,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(n,-1,1)),.99999>Math.abs(n)?(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(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(-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(n,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;return function(b,c,d){void 0===a&&(a=new J);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 ba;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 q(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}};Yc.prototype={constructor:Yc,set:function(a){this.mask=1<=b.x+b.y}}();wa.prototype={constructor:wa,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 q,b=new q;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 q).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return wa.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new va).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return wa.barycoordFromPoint(a,this.a,this.b,this.c,b)},containsPoint:function(a){return wa.containsPoint(a, -this.a,this.b,this.c)},closestPointToPoint:function(){var a,b,c,d;return function(e,f){void 0===a&&(a=new va,b=[new gb,new gb,new gb],c=new q,d=new q);var g=f||new q,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;k\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"},$a={basic:{uniforms:Ca.merge([R.common, +R.aomap,R.lightmap,R.fog]),vertexShader:X.meshbasic_vert,fragmentShader:X.meshbasic_frag},lambert:{uniforms:Ca.merge([R.common,R.aomap,R.lightmap,R.emissivemap,R.fog,R.lights,{emissive:{value:new G(0)}}]),vertexShader:X.meshlambert_vert,fragmentShader:X.meshlambert_frag},phong:{uniforms:Ca.merge([R.common,R.aomap,R.lightmap,R.emissivemap,R.bumpmap,R.normalmap,R.displacementmap,R.gradientmap,R.fog,R.lights,{emissive:{value:new G(0)},specular:{value:new G(1118481)},shininess:{value:30}}]),vertexShader:X.meshphong_vert, +fragmentShader:X.meshphong_frag},standard:{uniforms:Ca.merge([R.common,R.aomap,R.lightmap,R.emissivemap,R.bumpmap,R.normalmap,R.displacementmap,R.roughnessmap,R.metalnessmap,R.fog,R.lights,{emissive:{value:new G(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:X.meshphysical_vert,fragmentShader:X.meshphysical_frag},points:{uniforms:Ca.merge([R.points,R.fog]),vertexShader:X.points_vert,fragmentShader:X.points_frag},dashed:{uniforms:Ca.merge([R.common,R.fog,{scale:{value:1}, +dashSize:{value:1},totalSize:{value:2}}]),vertexShader:X.linedashed_vert,fragmentShader:X.linedashed_frag},depth:{uniforms:Ca.merge([R.common,R.displacementmap]),vertexShader:X.depth_vert,fragmentShader:X.depth_frag},normal:{uniforms:Ca.merge([R.common,R.bumpmap,R.normalmap,R.displacementmap,{opacity:{value:1}}]),vertexShader:X.normal_vert,fragmentShader:X.normal_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:X.cube_vert,fragmentShader:X.cube_frag},equirect:{uniforms:{tEquirect:{value:null}, +tFlip:{value:-1}},vertexShader:X.equirect_vert,fragmentShader:X.equirect_frag},distanceRGBA:{uniforms:{lightPos:{value:new n}},vertexShader:X.distanceRGBA_vert,fragmentShader:X.distanceRGBA_frag}};$a.physical={uniforms:Ca.merge([$a.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:X.meshphysical_vert,fragmentShader:X.meshphysical_frag};Object.assign(fd.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)}});var Jf=0;Object.assign(U.prototype,xa.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{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);q>f&&(f=q); +l>g&&(g=l)}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);q>f&&(f=q);l>g&&(g=l)}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 n).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.z< +this.min.z||a.min.z>this.max.z?!1:!0},intersectsSphere:function(){var a=new n;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 n).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new n;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new n;return function(b){b=b||new Ea;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 n,new n,new n,new n,new n,new n,new n,new n];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(Ea.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a= +new Ra;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 n;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 Ra;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(Ba.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 n;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(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 n,b=new n;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 n).copy(this.normal).multiplyScalar(c)},intersectLine:function(){var a=new n;return function(b,c){var d=c||new n,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],q=c[8],l=c[9],p=c[10],r=c[11],n=c[12],t=c[13],y=c[14],c=c[15];b[0].setComponents(f-a,m-g,r-q,c-n).normalize();b[1].setComponents(f+a,m+g,r+q,c+n).normalize();b[2].setComponents(f+d,m+h,r+l,c+t).normalize();b[3].setComponents(f-d,m-h,r-l,c-t).normalize();b[4].setComponents(f-e,m-k,r-p,c-y).normalize();b[5].setComponents(f+e, +m+k,r+p,c+y).normalize();return this},intersectsObject:function(){var a=new Ea;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 Ea;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}});ab.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");ab.DefaultOrder="XYZ";Object.defineProperties(ab.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(ab.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],q=e[2],l=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(l,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(-q,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(l,-1,1)),.99999>Math.abs(l)?(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(l,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(-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(l,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 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 oa;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 n(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(Qd.prototype,{set:function(a){this.mask=1<d;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;cb.far?null:{distance:c,point:u.clone(),object:a}}function c(c,d,e,f,m,l,n,w){g.fromArray(f,3*l);h.fromArray(f,3*n);k.fromArray(f, -3*w);if(c=b(c,d,e,g,h,k,D))m&&(p.fromArray(m,2*l),r.fromArray(m,2*n),x.fromArray(m,2*w),c.uv=a(D,g,h,k,p,r,x)),c.face=new ea(l,n,w,wa.normal(g,h,k)),c.faceIndex=l;return c}var d=new J,e=new ab,f=new Ca,g=new q,h=new q,k=new q,m=new q,l=new q,n=new q,p=new B,r=new B,x=new B,t=new q,D=new q,u=new q;return function(q,t){var u=this.geometry,E=this.material,H=this.matrixWorld;if(void 0!==E&&(null===u.boundingSphere&&u.computeBoundingSphere(),f.copy(u.boundingSphere),f.applyMatrix4(H),!1!==q.ray.intersectsSphere(f)&& -(d.getInverse(H),e.copy(q.ray).applyMatrix4(d),null===u.boundingBox||!1!==e.intersectsBox(u.boundingBox)))){var F,M;if(u&&u.isBufferGeometry){var B,K,E=u.index,H=u.attributes,u=H.position.array;void 0!==H.uv&&(F=H.uv.array);if(null!==E)for(var H=E.array,z=0,C=H.length;zthis.scale.x*this.scale.y/4||c.push({distance:Math.sqrt(d),point:this.position, -face:null,object:this})}}(),clone:function(){return(new this.constructor(this.material)).copy(this)}});rc.prototype=Object.assign(Object.create(z.prototype),{constructor:rc,copy:function(a){z.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,x=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&&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)}});la.prototype=Object.assign(Object.create(Ta.prototype), -{constructor:la,isLineSegments:!0});xa.prototype=Object.create(U.prototype);xa.prototype.constructor=xa;xa.prototype.isPointsMaterial=!0;xa.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;return this};Kb.prototype=Object.assign(Object.create(z.prototype),{constructor:Kb,isPoints:!0,raycast:function(){var a=new J,b=new ab,c=new Ca;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);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 q;if(h&&h.isBufferGeometry){var n=h.index,h=h.attributes.position.array;if(null!==n)for(var p=n.array,n=0,r=p.length;nc)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 n, -p,r,q,t,D,u,v;n=a[e[g]].x;p=a[e[g]].y;r=a[e[h]].x;q=a[e[h]].y;t=a[e[k]].x;D=a[e[k]].y;if(0>=(r-n)*(D-p)-(q-p)*(t-n))l=!1;else{var I,y,E,H,F,M,B,z,C,G;I=t-r;y=D-q;E=n-t;H=p-D;F=r-n;M=q-p;for(l=0;l=-Number.EPSILON&&z>=-Number.EPSILON&&B>=-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(0q||q>p)return[];k=m*l-k*n;if(0>k||k>p)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;cN){console.log("Infinite Loop! Holes left:"+m.length+", Probably Hole outside Shape!");break}for(n=z;nk;k++)l=m[k].x+":"+m[k].y,l=n[l],void 0!==l&&(m[k]=l);return p.concat()},isClockWise:function(a){return 0>ra.area(a)},b2:function(){return function(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}}(),b3:function(){return function(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}}()};za.prototype=Object.create(Q.prototype);za.prototype.constructor= -za;za.prototype.addShapeList=function(a,b){for(var c=a.length,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 B(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 B(d/f,e/f)}function e(a,b){var c,d;for(L=a.length;0<=--L;){c=L;d=L-1;0>d&&(d=a.length-1);var e,f=r+2*l;for(e=0;eMath.abs(b.y-c.y)?[new B(b.x,1-b.z),new B(c.x,1-c.z),new B(d.x,1-d.z),new B(e.x,1-e.z)]:[new B(b.y,1-b.z),new B(c.y,1-c.z),new B(d.y,1-d.z),new B(e.y, -1-e.z)]}};Dc.prototype=Object.create(za.prototype);Dc.prototype.constructor=Dc;mb.prototype=Object.create(G.prototype);mb.prototype.constructor=mb;Vb.prototype=Object.create(Q.prototype);Vb.prototype.constructor=Vb;Wb.prototype=Object.create(G.prototype);Wb.prototype.constructor=Wb;Ec.prototype=Object.create(Q.prototype);Ec.prototype.constructor=Ec;Fc.prototype=Object.create(Q.prototype);Fc.prototype.constructor=Fc;Xb.prototype=Object.create(G.prototype);Xb.prototype.constructor=Xb;Gc.prototype=Object.create(Q.prototype); -Gc.prototype.constructor=Gc;cb.prototype=Object.create(Q.prototype);cb.prototype.constructor=cb;cb.prototype.addShapeList=function(a,b){for(var c=0,d=a.length;cd?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 n;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 n,b=new n,c=new n;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),q=-c.dot(b),l=c.lengthSq(),p=Math.abs(1-k*k),r;0=-r?e<=r?(h=1/p,d*=h,e*=h,k=d*(d+k*e+2*m)+e*(k*d+e+2*q)+l):(e=h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*q)+l):(e=-h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*q)+l):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 n;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a= +new n,b=new n,c=new n,d=new n;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(Hb.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 n).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){return(a||new n).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){var c=b||new n;return this.delta(c).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new n,b=new n;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);var e=b.dot(b),e=b.dot(a)/e;d&&(e=Y.clamp(e,0,1));return e}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new n;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(Ta,{normal:function(){var a=new n;return function(b,c,d,e){e=e||new n;e.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0=b.x+b.y}}()});Object.assign(Ta.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 n,b=new n;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 n).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return Ta.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 Ta.barycoordFromPoint(a, +this.a,this.b,this.c,b)},containsPoint:function(a){return Ta.containsPoint(a,this.a,this.b,this.c)},closestPointToPoint:function(){var a=new Aa,b=[new Hb,new Hb,new Hb],c=new n,d=new n;return function(e,f){var g=f||new n,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;kb.far?null:{distance:c,point:x.clone(),object:a}}function c(c,d,e,f,m,q,l,n){g.fromBufferAttribute(f,q);h.fromBufferAttribute(f,l);k.fromBufferAttribute(f,n);if(c=b(c,d,e,g,h,k,y))m&&(p.fromBufferAttribute(m,q),r.fromBufferAttribute(m, +l),ca.fromBufferAttribute(m,n),c.uv=a(y,g,h,k,p,r,ca)),c.face=new Sa(q,l,n,Ta.normal(g,h,k)),c.faceIndex=q;return c}var d=new K,e=new kb,f=new Ea,g=new n,h=new n,k=new n,m=new n,q=new n,l=new n,p=new C,r=new C,ca=new C,t=new n,y=new n,x=new n;return function(n,t){var w=this.geometry,x=this.material,B=this.matrixWorld;if(void 0!==x&&(null===w.boundingSphere&&w.computeBoundingSphere(),f.copy(w.boundingSphere),f.applyMatrix4(B),!1!==n.ray.intersectsSphere(f)&&(d.getInverse(B),e.copy(n.ray).applyMatrix4(d), +null===w.boundingBox||!1!==e.intersectsBox(w.boundingBox)))){var D;if(w.isBufferGeometry){var O,C,x=w.index,F=w.attributes.position,B=w.attributes.uv,z,T;if(null!==x)for(z=0,T=x.count;zf||(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)}});yc.prototype=Object.assign(Object.create(z.prototype),{constructor:yc,copy:function(a){z.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),t=d.ray.origin.distanceTo(q),td.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else for(g=0,ca=r.length/3-1;gf||(q.applyMatrix4(this.matrixWorld), +t=d.ray.origin.distanceTo(q),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||(q.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(q),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)}});Q.prototype=Object.assign(Object.create(sa.prototype),{constructor:Q,isLineSegments:!0});od.prototype=Object.assign(Object.create(sa.prototype),{constructor:od,isLineLoop:!0});Fa.prototype=Object.create(U.prototype);Fa.prototype.constructor=Fa;Fa.prototype.isPointsMaterial=!0;Fa.prototype.copy=function(a){U.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;return this};Kb.prototype=Object.assign(Object.create(z.prototype), +{constructor:Kb,isPoints:!0,raycast:function(){var a=new K,b=new kb,c=new Ea;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),q=m*m,m=new n;if(h.isBufferGeometry){var l=h.index,h=h.attributes.position.array;if(null!==l)for(var p=l.array,l=0,r=p.length;lc)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 q;a:{var l,p,r,n,t,y,x,u;l=a[e[g]].x;p=a[e[g]].y;r=a[e[h]].x;n=a[e[h]].y;t=a[e[k]].x;y=a[e[k]].y;if(0>=(r-l)*(y-p)-(n-p)*(t-l))q=!1;else{var H,w,I,z,D,O,B,C,E,G;H=t-r;w=y-n;I=l-t;z=p-y;D=r-l;O=n-p;for(q=0;q=-Number.EPSILON&&C>=-Number.EPSILON&&B>=-Number.EPSILON)){q=!1;break a}q=!0}}if(q){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(0n||n>p)return[];k=m*q-k* +l;if(0>k||k>p)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;cK){console.log("Infinite Loop! Holes left:"+m.length+", Probably Hole outside Shape!");break}for(l=C;lk;k++)q=m[k].x+":"+m[k].y,q=l[q],void 0!==q&&(m[k]=q);return p.concat()},isClockWise:function(a){return 0>Ia.area(a)}};cb.prototype=Object.create(J.prototype);cb.prototype.constructor=cb;Ga.prototype=Object.create(E.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),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 C(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 C(d/f,e/f)}function e(a,b){var c,d;for(L=a.length;0<=--L;){c=L;d=L-1;0>d&&(d=a.length-1);var e,f=H+2*y;for(e=0;eMath.abs(g-k)?[new C(a,1-c),new C(h,1-d),new C(m,1-e),new C(n,1-b)]:[new C(g,1-c),new C(k,1-d),new C(l,1-e),new C(p,1-b)]}};Lc.prototype=Object.create(J.prototype);Lc.prototype.constructor=Lc;Ub.prototype=Object.create(Ga.prototype);Ub.prototype.constructor=Ub;Mc.prototype= +Object.create(J.prototype);Mc.prototype.constructor=Mc;mb.prototype=Object.create(E.prototype);mb.prototype.constructor=mb;Nc.prototype=Object.create(J.prototype);Nc.prototype.constructor=Nc;Vb.prototype=Object.create(E.prototype);Vb.prototype.constructor=Vb;Oc.prototype=Object.create(J.prototype);Oc.prototype.constructor=Oc;Wb.prototype=Object.create(E.prototype);Wb.prototype.constructor=Wb;Xb.prototype=Object.create(J.prototype);Xb.prototype.constructor=Xb;Yb.prototype=Object.create(E.prototype); +Yb.prototype.constructor=Yb;Zb.prototype=Object.create(E.prototype);Zb.prototype.constructor=Zb;nb.prototype=Object.create(J.prototype);nb.prototype.constructor=nb;Ua.prototype=Object.create(E.prototype);Ua.prototype.constructor=Ua;Pc.prototype=Object.create(nb.prototype);Pc.prototype.constructor=Pc;Qc.prototype=Object.create(Ua.prototype);Qc.prototype.constructor=Qc;Rc.prototype=Object.create(J.prototype);Rc.prototype.constructor=Rc;$b.prototype=Object.create(E.prototype);$b.prototype.constructor= +$b;var Ma=Object.freeze({WireframeGeometry:Mb,ParametricGeometry:Cc,ParametricBufferGeometry:Nb,TetrahedronGeometry:Ec,TetrahedronBufferGeometry:Ob,OctahedronGeometry:Fc,OctahedronBufferGeometry:lb,IcosahedronGeometry:Gc,IcosahedronBufferGeometry:Pb,DodecahedronGeometry:Hc,DodecahedronBufferGeometry:Qb,PolyhedronGeometry:Dc,PolyhedronBufferGeometry:za,TubeGeometry:Ic,TubeBufferGeometry:Rb,TorusKnotGeometry:Jc,TorusKnotBufferGeometry:Sb,TorusGeometry:Kc,TorusBufferGeometry:Tb,TextGeometry:Lc,TextBufferGeometry:Ub, +SphereGeometry:Mc,SphereBufferGeometry:mb,RingGeometry:Nc,RingBufferGeometry:Vb,PlaneGeometry:vc,PlaneBufferGeometry:jb,LatheGeometry:Oc,LatheBufferGeometry:Wb,ShapeGeometry:Xb,ShapeBufferGeometry:Yb,ExtrudeGeometry:cb,ExtrudeBufferGeometry:Ga,EdgesGeometry:Zb,ConeGeometry:Pc,ConeBufferGeometry:Qc,CylinderGeometry:nb,CylinderBufferGeometry:Ua,CircleGeometry:Rc,CircleBufferGeometry:$b,BoxGeometry:Gb,BoxBufferGeometry:ib});ac.prototype=Object.create(ra.prototype);ac.prototype.constructor=ac;ac.prototype.isShadowMaterial= +!0;bc.prototype=Object.create(ra.prototype);bc.prototype.constructor=bc;bc.prototype.isRawShaderMaterial=!0;Pa.prototype=Object.create(U.prototype);Pa.prototype.constructor=Pa;Pa.prototype.isMeshStandardMaterial=!0;Pa.prototype.copy=function(a){U.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};ob.prototype=Object.create(Pa.prototype);ob.prototype.constructor=ob;ob.prototype.isMeshPhysicalMaterial=!0;ob.prototype.copy=function(a){Pa.prototype.copy.call(this,a);this.defines={PHYSICAL:""};this.reflectivity= +a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};Ja.prototype=Object.create(U.prototype);Ja.prototype.constructor=Ja;Ja.prototype.isMeshPhongMaterial=!0;Ja.prototype.copy=function(a){U.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};pb.prototype=Object.create(Ja.prototype);pb.prototype.constructor=pb;pb.prototype.isMeshToonMaterial=!0;pb.prototype.copy=function(a){Ja.prototype.copy.call(this,a);this.gradientMap=a.gradientMap;return this};qb.prototype=Object.create(U.prototype);qb.prototype.constructor= +qb;qb.prototype.isMeshNormalMaterial=!0;qb.prototype.copy=function(a){U.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}; +rb.prototype=Object.create(U.prototype);rb.prototype.constructor=rb;rb.prototype.isMeshLambertMaterial=!0;rb.prototype.copy=function(a){U.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};sb.prototype=Object.create(U.prototype);sb.prototype.constructor=sb;sb.prototype.isLineDashedMaterial=!0;sb.prototype.copy=function(a){U.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 mg=Object.freeze({ShadowMaterial:ac,SpriteMaterial:bb,RawShaderMaterial:bc,ShaderMaterial:ra,PointsMaterial:Fa,MeshPhysicalMaterial:ob,MeshStandardMaterial:Pa,MeshPhongMaterial:Ja,MeshToonMaterial:pb,MeshNormalMaterial:qb,MeshLambertMaterial:rb,MeshDepthMaterial:Za,MeshBasicMaterial:ya,LineDashedMaterial:sb,LineBasicMaterial:ea,Material:U}),ed={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={}}},va=new Zd;Object.assign(Ka.prototype,{load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);var e=this,f=ed.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 n=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=ma.arraySlice(c,e,f),this.values=ma.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&&ma.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;gk.opacity&&(k.transparent=!0);c.setTextures(h);return c.parse(k)}}()};wb.Handlers={handlers:[],add:function(a,b){this.handlers.push(a,b)},get:function(a){for(var b=this.handlers,c=0,d=b.length;cg;g++)p=v[k++],u=D[2*p],p=D[2*p+1],u=new B(u,p),2!==g&&c.faceVertexUvs[d][h].push(u),0!==g&&c.faceVertexUvs[d][h+1].push(u);n&&(n=3*v[k++],r.normal.set(z[n++],z[n++],z[n]),t.normal.copy(r.normal));if(x)for(d=0;4>d;d++)n=3*v[k++],x=new q(z[n++],z[n++],z[n]),2!==d&&r.vertexNormals.push(x),0!==d&&t.vertexNormals.push(x);w&&(w=v[k++],w=y[w],r.color.setHex(w),t.color.setHex(w));if(b)for(d= -0;4>d;d++)w=v[k++],w=y[w],2!==d&&r.vertexColors.push(new O(w)),0!==d&&t.vertexColors.push(new O(w));c.faces.push(r);c.faces.push(t)}else{r=new ea;r.a=v[k++];r.b=v[k++];r.c=v[k++];h&&(h=v[k++],r.materialIndex=h);h=c.faces.length;if(d)for(d=0;dg;g++)p=v[k++],u=D[2*p],p=D[2*p+1],u=new B(u,p),c.faceVertexUvs[d][h].push(u);n&&(n=3*v[k++],r.normal.set(z[n++],z[n++],z[n]));if(x)for(d=0;3>d;d++)n=3*v[k++],x=new q(z[n++],z[n++],z[n]),r.vertexNormals.push(x); -w&&(w=v[k++],r.color.setHex(y[w]));if(b)for(d=0;3>d;d++)w=v[k++],r.vertexColors.push(new O(y[w]));c.faces.push(r)}})(d);(function(){var b=void 0!==a.influencesPerVertex?a.influencesPerVertex:2;if(a.skinWeights)for(var d=0,g=a.skinWeights.length;dk)g=d+1;else if(0b&&(b=0);1Number.EPSILON&&(g.normalize(),c=Math.acos(T.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(T.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.getLengths()},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:c+1],b=b[c>b.length-3?b.length-1:c+2],c=Xc.interpolate;return new B(c(d.x,e.x,f.x,b.x,a),c(d.y,e.y,f.y,b.y,a))};yb.prototype=Object.create(ia.prototype); -yb.prototype.constructor=yb;yb.prototype.getPoint=function(a){var b=ra.b3;return new B(b(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y))};yb.prototype.getTangent=function(a){var b=Xc.tangentCubicBezier;return(new B(b(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y))).normalize()};zb.prototype=Object.create(ia.prototype);zb.prototype.constructor=zb;zb.prototype.getPoint=function(a){var b=ra.b2;return new B(b(a,this.v0.x, -this.v1.x,this.v2.x),b(a,this.v0.y,this.v1.y,this.v2.y))};zb.prototype.getTangent=function(a){var b=Xc.tangentQuadraticBezier;return(new B(b(a,this.v0.x,this.v1.x,this.v2.x),b(a,this.v0.y,this.v1.y,this.v2.y))).normalize()};var de=Object.assign(Object.create(Oc.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=ra.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 q=!e(f[0].getPoints()),q=a?!q:q;k=[];var n=[],p=[],r=0,x;n[r]=void 0;p[r]=[];for(var t=0,D=f.length;td&&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,e){ba.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}}};fa.prototype={constructor:fa,getValue:function(a,b){this.bind();this.getValue(a,b)},setValue:function(a,b){this.bind();this.setValue(a,b)},bind:function(){var a= -this.node,b=this.parsedPath,c=b.objectName,d=b.propertyName,e=b.propertyIndex;a||(this.node=a=fa.findNode(this.rootNode,b.nodeName)||this.rootNode);this.getValue=this._getValue_unavailable;this.setValue=this._setValue_unavailable;if(a){if(c){var f=b.objectIndex;switch(c){case "materials":if(!a.material){console.error(" can not bind to material as node does not have a material",this);return}if(!a.material.materials){console.error(" can not bind to material.materials as node.material does not have a materials array", -this);return}a=a.material.materials;break;case "bones":if(!a.skeleton){console.error(" can not bind to bones as node does not have a skeleton",this);return}a=a.skeleton.bones;for(c=0;c=c){var n=c++,p=b[n];d[p.uuid]=q;b[q]=p;d[l]=n;b[n]=k;k=0;for(l=f;k!==l;++k){var p=e[k],r=p[q];p[q]=p[n];p[n]=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,q=e[l];if(void 0!== -q)if(delete e[l],q=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=ia.arraySlice(c,e,f),this.values=ia.arraySlice(this.values,e*d,f*d);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&&ia.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=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:ec.prototype.extractUrlBase(a),g=new Ka(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 J,d=a,e,f,g,h,k,m,l,v,p,r,z,t,y,x,u=d.faces;p=d.vertices;var B=d.normals,w=d.colors;m=d.scale;var I=0;if(void 0!==d.uvs){for(e=0;ef;f++)v=u[h++],x=y[2*v],v=y[2*v+1],x=new C(x,v),2!==f&&c.faceVertexUvs[e][g].push(x),0!==f&&c.faceVertexUvs[e][g+1].push(x);l&&(l=3*u[h++],r.normal.set(B[l++],B[l++],B[l]), +t.normal.copy(r.normal));if(z)for(e=0;4>e;e++)l=3*u[h++],z=new n(B[l++],B[l++],B[l]),2!==e&&r.vertexNormals.push(z),0!==e&&t.vertexNormals.push(z);m&&(m=u[h++],m=w[m],r.color.setHex(m),t.color.setHex(m));if(p)for(e=0;4>e;e++)m=u[h++],m=w[m],2!==e&&r.vertexColors.push(new G(m)),0!==e&&t.vertexColors.push(new G(m));c.faces.push(r);c.faces.push(t)}else{r=new Sa;r.a=u[h++];r.b=u[h++];r.c=u[h++];g&&(g=u[h++],r.materialIndex=g);g=c.faces.length;if(e)for(e=0;ef;f++)v=u[h++],x=y[2*v],v=y[2*v+1],x=new C(x,v),c.faceVertexUvs[e][g].push(x);l&&(l=3*u[h++],r.normal.set(B[l++],B[l++],B[l]));if(z)for(e=0;3>e;e++)l=3*u[h++],z=new n(B[l++],B[l++],B[l]),r.vertexNormals.push(z);m&&(m=u[h++],r.color.setHex(w[m]));if(p)for(e=0;3>e;e++)m=u[h++],r.vertexColors.push(new G(w[m]));c.faces.push(r)}d=a;h=void 0!==d.influencesPerVertex?d.influencesPerVertex:2;if(d.skinWeights)for(k=0,u=d.skinWeights.length;kk)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 C(Qe(c,d.x,e.x,f.x,b.x),Qe(c,d.y,e.y,f.y,b.y))};fc.prototype=Object.create(ua.prototype);fc.prototype.constructor=fc;fc.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2,e=this.v3;return new C(xb(a,b.x,c.x,d.x,e.x),xb(a,b.y,c.y,d.y,e.y))};gc.prototype=Object.create(ua.prototype); +gc.prototype.constructor=gc;gc.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2;return new C(wb(a,b.x,c.x,d.x),wb(a,b.y,c.y,d.y))};var te=Object.assign(Object.create(Vc.prototype),{fromPoints:function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;bNumber.EPSILON){if(0>m&&(g=b[f],k=-k,h=b[e],m=-m),!(a.yh.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=m*(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=Ia.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);var g,h,k,m=[];if(1===f.length)return h=f[0],k=new zb,k.curves=h.curves,m.push(k),m;var l=!e(f[0].getPoints()),l=a?!l:l;k=[];var n=[],p=[],r=0,z;n[r]=void 0;p[r]=[];for(var t=0,y=f.length;td&& +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){oa.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(Te.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(ha,{Composite:Te,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new ha.Composite(a,b,c):new ha(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=c){var n=c++,p=b[n];d[p.uuid]=l;b[l]=p;d[m]=n;b[n]=k;k=0;for(m=f;k!==m;++k){var p=e[k],r=p[l];p[l]=p[n];p[n]=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,n=e[l]; +if(void 0!==n)if(delete e[l],nb||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(Ud.prototype,sa.prototype,{clipAction:function(a,b){var c=b||this._root,d=c.uuid,e="string"===typeof a?Ha.findByName(c,a):a,c=null!==e?e.uuid:a,f=this._actionsByClip[c],g=null;if(void 0!==f){g=f.actionByRoot[d];if(void 0!==g)return g;g=f.knownActions[0];null===e&&(e=g._clip)}if(null===e)return null;e=new Td(this, -e,b);this._bindAction(e,g);this._addInactiveAction(e,c,d);return e},existingAction:function(a,b){var c=b||this._root,d=c.uuid,c="string"===typeof a?Ha.findByName(c,a):a,c=this._actionsByClip[c?c.uuid:a];return void 0!==c?c.actionByRoot[d]||null:null},stopAllAction:function(){for(var a=this._actions,b=this._nActiveActions,c=this._bindings,d=this._nActiveBindings,e=this._nActiveBindings=this._nActiveActions=0;e!==b;++e)a[e].reset();for(e=0;e!==d;++e)c[e].useCount=0;return this},update:function(a){a*= -this.timeScale;for(var b=this._actions,c=this._nActiveActions,d=this.time+=a,e=Math.sign(a),f=this._accuIndex^=1,g=0;g!==c;++g){var h=b[g];h.enabled&&h._update(d,a,e,f)}a=this._bindings;b=this._nActiveBindings;for(g=0;g!==b;++g)a[g].apply(f);return this},getRoot:function(){return this._root},uncacheClip:function(a){var b=this._actions;a=a.uuid;var c=this._actionsByClip,d=c[a];if(void 0!==d){for(var d=d.knownActions,e=0,f=d.length;e!==f;++e){var g=d[e];this._deactivateAction(g);var h=g._cacheIndex, -k=b[b.length-1];g._cacheIndex=null;g._byClipCacheIndex=null;k._cacheIndex=h;b[h]=k;b.pop();this._removeInactiveBindingsForAction(g)}delete c[a]}},uncacheRoot:function(a){a=a.uuid;var b=this._actionsByClip,c;for(c in b){var d=b[c].actionByRoot[a];void 0!==d&&(this._deactivateAction(d),this._removeInactiveAction(d))}c=this._bindingsByRootAndName[a];if(void 0!==c)for(var e in c)a=c[e],a.restoreOriginalState(),this._removeInactiveBinding(a)},uncacheAction:function(a,b){var c=this.existingAction(a,b); -null!==c&&(this._deactivateAction(c),this._removeInactiveAction(c))}});Object.assign(Ud.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 q=d[k],n=q.name,p=l[n];if(void 0===p){p=f[k];if(void 0!==p){null===p._cacheIndex&&(++p.referenceCount,this._addInactiveBinding(p,h,n));continue}p=new wd(fa.create(c,n,b&&b._propertyBindings[k].binding.parsedPath), -q.ValueTypeName,q.getValueSize());++p.referenceCount;this._addInactiveBinding(p,h,n)}f[k]=p;g[k].resultBuffer=p.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};na.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a])a.direction=1,a.directionBackwards=!1};na.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a])a.direction=-1,a.directionBackwards=!0};na.prototype.setAnimationFPS=function(a,b){var c= -this.animationsMap[a];c&&(c.fps=b,c.duration=(c.end-c.start)/c.fps)};na.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];c&&(c.duration=b,c.fps=(c.end-c.start)/c.duration)};na.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];c&&(c.weight=b)};na.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];c&&(c.time=b)};na.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};na.prototype.getAnimationDuration= -function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};na.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()")};na.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=!1};na.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+T.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}}};Qc.prototype=Object.create(z.prototype);Qc.prototype.constructor=Qc;Qc.prototype.isImmediateRenderObject=!0;Rc.prototype=Object.create(la.prototype);Rc.prototype.constructor=Rc;Rc.prototype.update=function(){var a=new q,b=new q,c=new Ia;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,q=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)};xd.prototype=Object.create(la.prototype);xd.prototype.constructor=xd;var $d=function(){function a(){}var b=new q,c=new a,d=new a,e=new a;a.prototype.init=function(a,b,c,d){this.c0=a;this.c1=c;this.c2=-3*a+3*b-2*c-d;this.c3=2*a-2*b+c+d};a.prototype.initNonuniformCatmullRom=function(a,b,c,d,e,l,n){this.init(b,c,((b-a)/e-(c-a)/ -(e+l)+(c-b)/l)*l,((c-b)/l-(d-b)/(l+n)+(d-c)/n)*l)};a.prototype.initCatmullRom=function(a,b,c,d,e){this.init(b,c,e*(c-a),e*(d-b))};a.prototype.calc=function(a){var b=a*a;return this.c0+this.c1*a+this.c2*b+this.c3*b*a};return ia.create(function(a){this.points=a||[];this.closed=!1},function(a){var g=this.points,h,k;k=g.length;2>k&&console.log("duh, you need at least 2 points");a*=k-(this.closed?0:1);h=Math.floor(a);a-=h;this.closed?h+=0h&&(h=1);1E-4>k&&(k=h);1E-4>p&&(p=h);c.initNonuniformCatmullRom(l.x,w.x,n.x,g.x,k, -h,p);d.initNonuniformCatmullRom(l.y,w.y,n.y,g.y,k,h,p);e.initNonuniformCatmullRom(l.z,w.z,n.z,g.z,k,h,p)}else"catmullrom"===this.type&&(k=void 0!==this.tension?this.tension:.5,c.initCatmullRom(l.x,w.x,n.x,g.x,k),d.initCatmullRom(l.y,w.y,n.y,g.y,k),e.initCatmullRom(l.z,w.z,n.z,g.z,k));return new q(c.calc(a),d.calc(a),e.calc(a))})}();Ee.prototype=Object.create($d.prototype);var Ef=ia.create(function(a){console.warn("THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3");this.points= -void 0===a?[]:a},function(a){var b=this.points;a*=b.length-1;var c=Math.floor(a);a-=c;var d=b[0==c?c:c-1],e=b[c],f=b[c>b.length-2?b.length-1:c+1],b=b[c>b.length-3?b.length-1:c+2],c=Xc.interpolate;return new q(c(d.x,e.x,f.x,b.x,a),c(d.y,e.y,f.y,b.y,a),c(d.z,e.z,f.z,b.z,a))}),Ff=ia.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b=ra.b3;return new q(b(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y),b(a,this.v0.z,this.v1.z,this.v2.z, -this.v3.z))}),Gf=ia.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b=ra.b2;return new q(b(a,this.v0.x,this.v1.x,this.v2.x),b(a,this.v0.y,this.v1.y,this.v2.y),b(a,this.v0.z,this.v1.z,this.v2.z))}),Hf=ia.create(function(a,b){this.v1=a;this.v2=b},function(a){if(1===a)return this.v2.clone();var b=new q;b.subVectors(this.v2,this.v1);b.multiplyScalar(a);b.add(this.v1);return b});yd.prototype=Object.create(Va.prototype);yd.prototype.constructor=yd;Object.assign(mc.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(Ba.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)}});Object.assign(gb.prototype,{center:function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");return this.getCenter(a)}});Object.assign(Ia.prototype,{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)}});Object.assign(J.prototype,{extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");return this.copyPosition(a)},setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().");return this.makeRotationFromQuaternion(a)},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead."); -return a.applyProjection(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(a){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(a){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(a){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(a){console.error("THREE.Matrix4: .rotateZ() has been removed.")}, -rotateByAxis:function(a,b){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")}});Object.assign(va.prototype,{isIntersectionLine:function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");return this.intersectsLine(a)}});Object.assign(ba.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(ab.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 za(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new cb(this,a)}});Object.assign(q.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)}});Object.assign(z.prototype,{getChildByName:function(a){console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().");return this.getObjectByName(a)},renderDepth:function(a){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(z.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(a){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}}); -Object.defineProperties(rc.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");return this.levels}}});Ea.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(pa.prototype,{onlyShadow:{set:function(a){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.");this.shadow.camera.right=a}},shadowCameraTop:{set:function(a){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top.");this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."); -this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near.");this.shadow.camera.near=a}},shadowCameraFar:{set:function(a){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far.");this.shadow.camera.far=a}},shadowCameraVisible:{set:function(a){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(a){console.warn("THREE.Light: .shadowBias is now .shadow.bias."); -this.shadow.bias=a}},shadowDarkness:{set:function(a){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(a){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.");this.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.");this.shadow.mapSize.height=a}}});Object.defineProperties(C.prototype,{length:{get:function(){console.warn("THREE.BufferAttribute: .length has been deprecated. Please use .count."); -return this.array.length}}});Object.assign(G.prototype,{addIndex:function(a){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");this.setIndex(a)},addDrawCall:function(a,b,c){void 0!==c&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.");console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup().");this.addGroup(a,b)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."); -this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")}});Object.defineProperties(G.prototype,{drawcalls:{get:function(){console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups.");return this.groups}},offsets:{get:function(){console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups.");return this.groups}}}); -Object.defineProperties(U.prototype,{wrapAround:{get:function(){console.warn("THREE."+this.type+": .wrapAround has been removed.")},set:function(a){console.warn("THREE."+this.type+": .wrapAround has been removed.")}},wrapRGB:{get:function(){console.warn("THREE."+this.type+": .wrapRGB has been removed.");return new O}}});Object.defineProperties(db.prototype,{metal:{get:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.");return!1},set:function(a){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}}); -Object.defineProperties(Fa.prototype,{derivatives:{get:function(){console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");return this.extensions.derivatives},set:function(a){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");this.extensions.derivatives=a}}});sa.prototype=Object.assign(Object.create({constructor:sa,apply:function(a){console.warn("THREE.EventDispatcher: .apply is deprecated, just inherit or Object.assign the prototype to mix-in."); -Object.assign(a,this)}}),sa.prototype);Object.defineProperties(Ae.prototype,{dynamic:{set:function(a){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.");return this}}});Object.assign(Dd.prototype,{supportsFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."); -return this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).");return this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' ).");return this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."); -return this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).");return this.extensions.get("WEBGL_compressed_texture_pvrtc")},supportsBlendMinMax:function(){console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).");return this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){return this.capabilities.vertexTextures}, -supportsInstancedArrays:function(){console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' ).");return this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(a){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().");this.setScissorTest(a)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")}, -addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")}});Object.defineProperties(Dd.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."); -this.shadowMap.type=a}},shadowMapCullFace:{get:function(){return this.shadowMap.cullFace},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.");this.shadowMap.cullFace=a}}});Object.defineProperties(pe.prototype,{cullFace:{get:function(){return this.renderReverseSided?2:1},set:function(a){a=1!==a;console.warn("WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to "+a+".");this.renderReverseSided=a}}});Object.defineProperties(Db.prototype, -{wrapS:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");return this.texture.wrapS},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");this.texture.wrapS=a}},wrapT:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");return this.texture.wrapT},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");this.texture.wrapT=a}},magFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."); -return this.texture.magFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");this.texture.magFilter=a}},minFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");return this.texture.minFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");this.texture.minFilter=a}},anisotropy:{get:function(){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."); -return this.texture.anisotropy},set:function(a){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");this.texture.anisotropy=a}},offset:{get:function(){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");return this.texture.offset},set:function(a){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");this.texture.offset=a}},repeat:{get:function(){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");return this.texture.repeat}, -set:function(a){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");this.texture.repeat=a}},format:{get:function(){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");return this.texture.format},set:function(a){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");this.texture.format=a}},type:{get:function(){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");return this.texture.type},set:function(a){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."); -this.texture.type=a}},generateMipmaps:{get:function(){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");return this.texture.generateMipmaps},set:function(a){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");this.texture.generateMipmaps=a}}});Object.assign(dc.prototype,{load:function(a){console.warn("THREE.Audio: .load has been deprecated. Please use THREE.AudioLoader.");var b=this;(new Od).load(a,function(a){b.setBuffer(a)}); -return this}});Object.assign(Rd.prototype,{getData:function(a){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");return this.getFrequencyData()}});l.WebGLRenderTargetCube=Eb;l.WebGLRenderTarget=Db;l.WebGLRenderer=Dd;l.ShaderLib=Gb;l.UniformsLib=W;l.UniformsUtils=La;l.ShaderChunk=X;l.FogExp2=Ib;l.Fog=Jb;l.Scene=jb;l.LensFlare=Ed;l.Sprite=qc;l.LOD=rc;l.SkinnedMesh=dd;l.Skeleton=bd;l.Bone=cd;l.Mesh=ya;l.LineSegments=la;l.Line=Ta;l.Points=Kb;l.Group=sc;l.VideoTexture=ed;l.DataTexture= -lb;l.CompressedTexture=Lb;l.CubeTexture=Xa;l.CanvasTexture=fd;l.DepthTexture=tc;l.TextureIdCount=function(){return ee++};l.Texture=da;l.MaterialIdCount=function(){return oe++};l.CompressedTextureLoader=we;l.BinaryTextureLoader=Gd;l.DataTextureLoader=Gd;l.CubeTextureLoader=Hd;l.TextureLoader=gd;l.ObjectLoader=xe;l.MaterialLoader=ud;l.BufferGeometryLoader=Id;l.DefaultLoadingManager=Ga;l.LoadingManager=Fd;l.JSONLoader=Jd;l.ImageLoader=Lc;l.FontLoader=ye;l.XHRLoader=Ja;l.Loader=wb;l.Cache=ce;l.AudioLoader= -Od;l.SpotLightShadow=id;l.SpotLight=jd;l.PointLight=kd;l.HemisphereLight=hd;l.DirectionalLightShadow=ld;l.DirectionalLight=md;l.AmbientLight=nd;l.LightShadow=tb;l.Light=pa;l.StereoCamera=ze;l.PerspectiveCamera=Ea;l.OrthographicCamera=Hb;l.CubeCamera=vd;l.Camera=Z;l.AudioListener=Pd;l.PositionalAudio=Qd;l.getAudioContext=Md;l.AudioAnalyser=Rd;l.Audio=dc;l.VectorKeyframeTrack=bc;l.StringKeyframeTrack=rd;l.QuaternionKeyframeTrack=Nc;l.NumberKeyframeTrack=cc;l.ColorKeyframeTrack=td;l.BooleanKeyframeTrack= -sd;l.PropertyMixer=wd;l.PropertyBinding=fa;l.KeyframeTrack=vb;l.AnimationUtils=ma;l.AnimationObjectGroup=Sd;l.AnimationMixer=Ud;l.AnimationClip=Ha;l.Uniform=Ae;l.InstancedBufferGeometry=Bb;l.BufferGeometry=G;l.GeometryIdCount=function(){return ad++};l.Geometry=Q;l.InterleavedBufferAttribute=Vd;l.InstancedInterleavedBuffer=fc;l.InterleavedBuffer=ec;l.InstancedBufferAttribute=gc;l.DynamicBufferAttribute=function(a,b){console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead."); -return(new C(a,b)).setDynamic(!0)};l.Float64Attribute=function(a,b){return new C(new Float64Array(a),b)};l.Float32Attribute=ha;l.Uint32Attribute=$c;l.Int32Attribute=function(a,b){return new C(new Int32Array(a),b)};l.Uint16Attribute=Zc;l.Int16Attribute=function(a,b){return new C(new Int16Array(a),b)};l.Uint8ClampedAttribute=function(a,b){return new C(new Uint8ClampedArray(a),b)};l.Uint8Attribute=function(a,b){return new C(new Uint8Array(a),b)};l.Int8Attribute=function(a,b){return new C(new Int8Array(a), -b)};l.BufferAttribute=C;l.Face3=ea;l.Object3DIdCount=function(){return qe++};l.Object3D=z;l.Raycaster=Wd;l.Layers=Yc;l.EventDispatcher=sa;l.Clock=Yd;l.QuaternionLinearInterpolant=qd;l.LinearInterpolant=Mc;l.DiscreteInterpolant=pd;l.CubicInterpolant=od;l.Interpolant=qa;l.Triangle=wa;l.Spline=function(a){function b(a,b,c,d,e,f,g){a=.5*(c-a);d=.5*(d-b);return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b}this.points=a;var c=[],d={x:0,y:0,z:0},e,f,g,h,k,l,w,n,p;this.initFromArray=function(a){this.points=[]; -for(var b=0;bthis.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1:f+2;l=this.points[c[0]];w=this.points[c[1]];n=this.points[c[2]];p=this.points[c[3]];h=g*g;k=g*h;d.x=b(l.x,w.x,n.x,p.x,g,h,k);d.y=b(l.y,w.y,n.y,p.y,g,h,k);d.z=b(l.z,w.z,n.z,p.z,g,h,k);return d};this.getControlPointsArray=function(){var a, -b,c=this.points.length,d=[];for(a=0;ab||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(We.prototype,xa.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 n=d[k],v=n.name,p=l[v];if(void 0=== +p){p=f[k];if(void 0!==p){null===p._cacheIndex&&(++p.referenceCount,this._addInactiveBinding(p,h,v));continue}p=new ke(ha.create(c,v,b&&b._propertyBindings[k].binding.parsedPath),n.ValueTypeName,n.getValueSize());++p.referenceCount;this._addInactiveBinding(p,h,v)}f[k]=p;g[k].resultBuffer=p.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};ta.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a])a.direction=1,a.directionBackwards=!1};ta.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a])a.direction=-1,a.directionBackwards=!0};ta.prototype.setAnimationFPS= +function(a,b){var c=this.animationsMap[a];c&&(c.fps=b,c.duration=(c.end-c.start)/c.fps)};ta.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];c&&(c.duration=b,c.fps=(c.end-c.start)/c.duration)};ta.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];c&&(c.weight=b)};ta.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];c&&(c.time=b)};ta.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};ta.prototype.getAnimationDuration= +function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};ta.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()")};ta.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=!1};ta.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}}};Xc.prototype=Object.create(z.prototype);Xc.prototype.constructor=Xc;Xc.prototype.isImmediateRenderObject=!0;Yc.prototype=Object.create(Q.prototype);Yc.prototype.constructor=Yc;Yc.prototype.update=function(){var a=new n,b=new n,c=new Ba;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,n=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))}}();Bb.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()};Bb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)};Ld.prototype=Object.create(Q.prototype);Ld.prototype.constructor=Ld;var Od=new n,ue=new re,ve=new re,we=new re;La.prototype=Object.create(ua.prototype);La.prototype.constructor= +La;La.prototype.getPoint=function(a){var b=this.points,c=b.length;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);ue.initNonuniformCatmullRom(e.x,f.x,g.x,b.x,c,d,h);ve.initNonuniformCatmullRom(e.y,f.y,g.y,b.y,c,d,h);we.initNonuniformCatmullRom(e.z,f.z,g.z,b.z,c,d,h)}else"catmullrom"===this.type&&(c=void 0!==this.tension?this.tension:.5,ue.initCatmullRom(e.x,f.x,g.x,b.x,c),ve.initCatmullRom(e.y,f.y,g.y,b.y,c),we.initCatmullRom(e.z,f.z,g.z,b.z,c));return new n(ue.calc(a), +ve.calc(a),we.calc(a))};bd.prototype=Object.create(ua.prototype);bd.prototype.constructor=bd;bd.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2,e=this.v3;return new n(xb(a,b.x,c.x,d.x,e.x),xb(a,b.y,c.y,d.y,e.y),xb(a,b.z,c.z,d.z,e.z))};cd.prototype=Object.create(ua.prototype);cd.prototype.constructor=cd;cd.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2;return new n(wb(a,b.x,c.x,d.x),wb(a,b.y,c.y,d.y),wb(a,b.z,c.z,d.z))};dd.prototype=Object.create(ua.prototype);dd.prototype.constructor= +dd;dd.prototype.getPoint=function(a){if(1===a)return this.v2.clone();var b=new n;b.subVectors(this.v2,this.v1);b.multiplyScalar(a);b.add(this.v1);return b};Md.prototype=Object.create(Va.prototype);Md.prototype.constructor=Md;ua.create=function(a,b){console.log("THREE.Curve.create() has been deprecated");a.prototype=Object.create(ua.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};cf.prototype=Object.create(La.prototype);df.prototype=Object.create(La.prototype);se.prototype=Object.create(La.prototype); +Object.assign(se.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.")}});Zc.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};kc.prototype.update= +function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")};Object.assign(fd.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(Ra.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(Ba.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.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},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(K.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 n);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.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},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)}});Aa.prototype.isIntersectionLine=function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");return this.intersectsLine(a)};oa.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(kb.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(zb.prototype,{extrude:function(a){console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");return new cb(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new Xb(this,a)}});Object.assign(C.prototype,{fromAttribute:function(a,b,c){console.error("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a, +b,c)}});Object.assign(n.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(fa.prototype,{fromAttribute:function(a,b,c){console.error("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)}});J.prototype.computeTangents=function(){console.warn("THREE.Geometry: .computeTangents() has been removed.")};Object.assign(z.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(z.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(yc.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");return this.levels}}});Object.defineProperty(zc.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}, +set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}});Object.defineProperty(ua.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}});qa.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(na.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."); +this.shadow.camera.right=a}},shadowCameraTop:{set:function(a){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top.");this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.");this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near.");this.shadow.camera.near=a}},shadowCameraFar:{set:function(a){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."); +this.shadow.camera.far=a}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(a){console.warn("THREE.Light: .shadowBias is now .shadow.bias.");this.shadow.bias=a}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(a){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."); +this.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.");this.shadow.mapSize.height=a}}});Object.defineProperties(Z.prototype,{length:{get:function(){console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead.");return this.array.length}}});Object.assign(E.prototype,{addIndex:function(a){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");this.setIndex(a)},addDrawCall:function(a, +b,c){void 0!==c&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.");console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup().");this.addGroup(a,b)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().");this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")}}); +Object.defineProperties(E.prototype,{drawcalls:{get:function(){console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups.");return this.groups}},offsets:{get:function(){console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups.");return this.groups}}});Object.defineProperties(Id.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."); +return this}}});Object.defineProperties(U.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},wrapRGB:{get:function(){console.warn("THREE.Material: .wrapRGB has been removed.");return new G}}});Object.defineProperties(Ja.prototype,{metal:{get:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.");return!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}}); +Object.defineProperties(ra.prototype,{derivatives:{get:function(){console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");return this.extensions.derivatives},set:function(a){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");this.extensions.derivatives=a}}});Object.assign(Xd.prototype,{getCurrentRenderTarget:function(){console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().");return this.getRenderTarget()}, +supportsFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' ).");return this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).");return this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."); +return this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' ).");return this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).");return this.extensions.get("WEBGL_compressed_texture_pvrtc")}, +supportsBlendMinMax:function(){console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).");return this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.");return this.capabilities.vertexTextures},supportsInstancedArrays:function(){console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."); +return this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(a){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().");this.setScissorTest(a)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")}}); +Object.defineProperties(Xd.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.");this.shadowMap.type=a}},shadowMapCullFace:{get:function(){return this.shadowMap.cullFace},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace."); +this.shadowMap.cullFace=a}}});Object.defineProperties(Ie.prototype,{cullFace:{get:function(){return this.renderReverseSided?2:1},set:function(a){a=1!==a;console.warn("WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to "+a+".");this.renderReverseSided=a}}});Object.defineProperties(Cb.prototype,{wrapS:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");return this.texture.wrapS},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."); +this.texture.wrapS=a}},wrapT:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");return this.texture.wrapT},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");this.texture.wrapT=a}},magFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");return this.texture.magFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");this.texture.magFilter= +a}},minFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");return this.texture.minFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");this.texture.minFilter=a}},anisotropy:{get:function(){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");return this.texture.anisotropy},set:function(a){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");this.texture.anisotropy= +a}},offset:{get:function(){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");return this.texture.offset},set:function(a){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");this.texture.offset=a}},repeat:{get:function(){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");return this.texture.repeat},set:function(a){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");this.texture.repeat=a}},format:{get:function(){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."); +return this.texture.format},set:function(a){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");this.texture.format=a}},type:{get:function(){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");return this.texture.type},set:function(a){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");this.texture.type=a}},generateMipmaps:{get:function(){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");return this.texture.generateMipmaps}, +set:function(a){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");this.texture.generateMipmaps=a}}});hc.prototype.load=function(a){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var b=this;(new fe).load(a,function(a){b.setBuffer(a)});return this};je.prototype.getData=function(){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");return this.getFrequencyData()};l.WebGLRenderTargetCube=Db;l.WebGLRenderTarget= +Cb;l.WebGLRenderer=Xd;l.ShaderLib=$a;l.UniformsLib=R;l.UniformsUtils=Ca;l.ShaderChunk=X;l.FogExp2=Ib;l.Fog=Jb;l.Scene=ld;l.LensFlare=Yd;l.Sprite=xc;l.LOD=yc;l.SkinnedMesh=nd;l.Skeleton=zc;l.Bone=md;l.Mesh=la;l.LineSegments=Q;l.LineLoop=od;l.Line=sa;l.Points=Kb;l.Group=Ac;l.VideoTexture=pd;l.DataTexture=db;l.CompressedTexture=Lb;l.CubeTexture=Xa;l.CanvasTexture=qd;l.DepthTexture=Bc;l.Texture=ba;l.CompressedTextureLoader=Oe;l.DataTextureLoader=$d;l.CubeTextureLoader=ae;l.TextureLoader=rd;l.ObjectLoader= +Pe;l.MaterialLoader=Gd;l.BufferGeometryLoader=be;l.DefaultLoadingManager=va;l.LoadingManager=Zd;l.JSONLoader=ce;l.ImageLoader=Sc;l.FontLoader=Re;l.FileLoader=Ka;l.Loader=ec;l.Cache=ed;l.AudioLoader=fe;l.SpotLightShadow=td;l.SpotLight=ud;l.PointLight=vd;l.RectAreaLight=zd;l.HemisphereLight=sd;l.DirectionalLightShadow=wd;l.DirectionalLight=xd;l.AmbientLight=yd;l.LightShadow=tb;l.Light=na;l.StereoCamera=Se;l.PerspectiveCamera=qa;l.OrthographicCamera=Fb;l.CubeCamera=Hd;l.ArrayCamera=kd;l.Camera=Na;l.AudioListener= +ge;l.PositionalAudio=ie;l.AudioContext=he;l.AudioAnalyser=je;l.Audio=hc;l.VectorKeyframeTrack=cc;l.StringKeyframeTrack=Dd;l.QuaternionKeyframeTrack=Uc;l.NumberKeyframeTrack=dc;l.ColorKeyframeTrack=Fd;l.BooleanKeyframeTrack=Ed;l.PropertyMixer=ke;l.PropertyBinding=ha;l.KeyframeTrack=vb;l.AnimationUtils=ia;l.AnimationObjectGroup=Ue;l.AnimationMixer=We;l.AnimationClip=Da;l.Uniform=Id;l.InstancedBufferGeometry=le;l.BufferGeometry=E;l.GeometryIdCount=function(){return Rd++};l.Geometry=J;l.InterleavedBufferAttribute= +me;l.InstancedInterleavedBuffer=ne;l.InterleavedBuffer=ic;l.InstancedBufferAttribute=oe;l.Face3=Sa;l.Object3D=z;l.Raycaster=Xe;l.Layers=Qd;l.EventDispatcher=xa;l.Clock=Ze;l.QuaternionLinearInterpolant=Cd;l.LinearInterpolant=Tc;l.DiscreteInterpolant=Bd;l.CubicInterpolant=Ad;l.Interpolant=wa;l.Triangle=Ta;l.Math=Y;l.Spherical=$e;l.Cylindrical=af;l.Plane=Aa;l.Frustum=gd;l.Sphere=Ea;l.Ray=kb;l.Matrix4=K;l.Matrix3=Ba;l.Box3=Ra;l.Box2=fd;l.Line3=Hb;l.Euler=ab;l.Vector4=fa;l.Vector3=n;l.Vector2=C;l.Quaternion= +oa;l.Color=G;l.MorphBlendMesh=ta;l.ImmediateRenderObject=Xc;l.VertexNormalsHelper=Yc;l.SpotLightHelper=jc;l.SkeletonHelper=kc;l.PointLightHelper=lc;l.RectAreaLightHelper=mc;l.HemisphereLightHelper=nc;l.GridHelper=Zc;l.PolarGridHelper=Jd;l.FaceNormalsHelper=$c;l.DirectionalLightHelper=oc;l.CameraHelper=ad;l.BoxHelper=Ab;l.ArrowHelper=Bb;l.AxisHelper=Ld;l.CatmullRomCurve3=La;l.CubicBezierCurve3=bd;l.QuadraticBezierCurve3=cd;l.LineCurve3=dd;l.ArcCurve=Md;l.EllipseCurve=Va;l.SplineCurve=yb;l.CubicBezierCurve= +fc;l.QuadraticBezierCurve=gc;l.LineCurve=Qa;l.Shape=zb;l.Path=Wc;l.ShapePath=de;l.Font=ee;l.CurvePath=Vc;l.Curve=ua;l.ShapeUtils=Ia;l.SceneUtils={createMultiMaterialObject:function(a,b){for(var c=new Ac,d=0,e=b.length;d 0) { + for (var i = (this.length >> 1); i >= 0; i--) this._down(i); + } +} + +function defaultCompare(a, b) { + return a < b ? -1 : a > b ? 1 : 0; +} + +TinyQueue.prototype = { + + push: function (item) { + this.data.push(item); + this.length++; + this._up(this.length - 1); + }, + + pop: function () { + if (this.length === 0) return undefined; + var top = this.data[0]; + this.length--; + if (this.length > 0) { + this.data[0] = this.data[this.length]; + this._down(0); + } + this.data.pop(); + return top; + }, + + peek: function () { + return this.data[0]; + }, + + _up: function (pos) { + var data = this.data; + var compare = this.compare; + var item = data[pos]; + + while (pos > 0) { + var parent = (pos - 1) >> 1; + var current = data[parent]; + if (compare(item, current) >= 0) break; + data[pos] = current; + pos = parent; + } + + data[pos] = item; + }, + + _down: function (pos) { + var data = this.data; + var compare = this.compare; + var len = this.length; + var halfLen = len >> 1; + var item = data[pos]; + + while (pos < halfLen) { + var left = (pos << 1) + 1; + var right = left + 1; + var best = data[left]; + + if (right < len && compare(data[right], best) < 0) { + left = right; + best = data[right]; + } + if (compare(best, item) >= 0) break; + + data[pos] = best; + pos = left; + } + + data[pos] = item; + } +}; + +},{}],182:[function(require,module,exports){ // Underscore.js 1.8.3 // http://underscorejs.org // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors @@ -14064,129 +16263,22 @@ this.domElement=document.createElementNS("http://www.w3.org/1999/xhtml","canvas" } }.call(this)); -},{}],159:[function(require,module,exports){ -/* - * Copyright (C) 2008 Apple Inc. All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Ported from Webkit - * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h - */ - -module.exports = UnitBezier; - -function UnitBezier(p1x, p1y, p2x, p2y) { - // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1). - this.cx = 3.0 * p1x; - this.bx = 3.0 * (p2x - p1x) - this.cx; - this.ax = 1.0 - this.cx - this.bx; - - this.cy = 3.0 * p1y; - this.by = 3.0 * (p2y - p1y) - this.cy; - this.ay = 1.0 - this.cy - this.by; - - this.p1x = p1x; - this.p1y = p2y; - this.p2x = p2x; - this.p2y = p2y; -} - -UnitBezier.prototype.sampleCurveX = function(t) { - // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule. - return ((this.ax * t + this.bx) * t + this.cx) * t; -}; - -UnitBezier.prototype.sampleCurveY = function(t) { - return ((this.ay * t + this.by) * t + this.cy) * t; -}; - -UnitBezier.prototype.sampleCurveDerivativeX = function(t) { - return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx; -}; - -UnitBezier.prototype.solveCurveX = function(x, epsilon) { - if (typeof epsilon === 'undefined') epsilon = 1e-6; - - var t0, t1, t2, x2, i; - - // First try a few iterations of Newton's method -- normally very fast. - for (t2 = x, i = 0; i < 8; i++) { - - x2 = this.sampleCurveX(t2) - x; - if (Math.abs(x2) < epsilon) return t2; - - var d2 = this.sampleCurveDerivativeX(t2); - if (Math.abs(d2) < 1e-6) break; - - t2 = t2 - x2 / d2; - } - - // Fall back to the bisection method for reliability. - t0 = 0.0; - t1 = 1.0; - t2 = x; - - if (t2 < t0) return t0; - if (t2 > t1) return t1; - - while (t0 < t1) { - - x2 = this.sampleCurveX(t2); - if (Math.abs(x2 - x) < epsilon) return t2; - - if (x > x2) { - t0 = t2; - } else { - t1 = t2; - } - - t2 = (t1 - t0) * 0.5 + t0; - } - - // Failure. - return t2; -}; - -UnitBezier.prototype.solve = function(x, epsilon) { - return this.sampleCurveY(this.solveCurveX(x, epsilon)); -}; - -},{}],160:[function(require,module,exports){ +},{}],183:[function(require,module,exports){ var createElement = require("./vdom/create-element.js") module.exports = createElement -},{"./vdom/create-element.js":166}],161:[function(require,module,exports){ +},{"./vdom/create-element.js":189}],184:[function(require,module,exports){ var diff = require("./vtree/diff.js") module.exports = diff -},{"./vtree/diff.js":186}],162:[function(require,module,exports){ +},{"./vtree/diff.js":209}],185:[function(require,module,exports){ var h = require("./virtual-hyperscript/index.js") module.exports = h -},{"./virtual-hyperscript/index.js":173}],163:[function(require,module,exports){ +},{"./virtual-hyperscript/index.js":196}],186:[function(require,module,exports){ var diff = require("./diff.js") var patch = require("./patch.js") var h = require("./h.js") @@ -14203,12 +16295,12 @@ module.exports = { VText: VText } -},{"./create-element.js":160,"./diff.js":161,"./h.js":162,"./patch.js":164,"./vnode/vnode.js":182,"./vnode/vtext.js":184}],164:[function(require,module,exports){ +},{"./create-element.js":183,"./diff.js":184,"./h.js":185,"./patch.js":187,"./vnode/vnode.js":205,"./vnode/vtext.js":207}],187:[function(require,module,exports){ var patch = require("./vdom/patch.js") module.exports = patch -},{"./vdom/patch.js":169}],165:[function(require,module,exports){ +},{"./vdom/patch.js":192}],188:[function(require,module,exports){ var isObject = require("is-object") var isHook = require("../vnode/is-vhook.js") @@ -14307,7 +16399,7 @@ function getPrototype(value) { } } -},{"../vnode/is-vhook.js":177,"is-object":18}],166:[function(require,module,exports){ +},{"../vnode/is-vhook.js":200,"is-object":20}],189:[function(require,module,exports){ var document = require("global/document") var applyProperties = require("./apply-properties") @@ -14355,7 +16447,7 @@ function createElement(vnode, opts) { return node } -},{"../vnode/handle-thunk.js":175,"../vnode/is-vnode.js":178,"../vnode/is-vtext.js":179,"../vnode/is-widget.js":180,"./apply-properties":165,"global/document":14}],167:[function(require,module,exports){ +},{"../vnode/handle-thunk.js":198,"../vnode/is-vnode.js":201,"../vnode/is-vtext.js":202,"../vnode/is-widget.js":203,"./apply-properties":188,"global/document":16}],190:[function(require,module,exports){ // Maps a virtual DOM tree onto a real DOM tree in an efficient manner. // We don't want to read all of the DOM nodes in the tree so we use // the in-order tree indexing to eliminate recursion down certain branches. @@ -14442,7 +16534,7 @@ function ascending(a, b) { return a > b ? 1 : -1 } -},{}],168:[function(require,module,exports){ +},{}],191:[function(require,module,exports){ var applyProperties = require("./apply-properties") var isWidget = require("../vnode/is-widget.js") @@ -14595,7 +16687,7 @@ function replaceRoot(oldRoot, newRoot) { return newRoot; } -},{"../vnode/is-widget.js":180,"../vnode/vpatch.js":183,"./apply-properties":165,"./update-widget":170}],169:[function(require,module,exports){ +},{"../vnode/is-widget.js":203,"../vnode/vpatch.js":206,"./apply-properties":188,"./update-widget":193}],192:[function(require,module,exports){ var document = require("global/document") var isArray = require("x-is-array") @@ -14677,7 +16769,7 @@ function patchIndices(patches) { return indices } -},{"./create-element":166,"./dom-index":167,"./patch-op":168,"global/document":14,"x-is-array":205}],170:[function(require,module,exports){ +},{"./create-element":189,"./dom-index":190,"./patch-op":191,"global/document":16,"x-is-array":228}],193:[function(require,module,exports){ var isWidget = require("../vnode/is-widget.js") module.exports = updateWidget @@ -14694,7 +16786,7 @@ function updateWidget(a, b) { return false } -},{"../vnode/is-widget.js":180}],171:[function(require,module,exports){ +},{"../vnode/is-widget.js":203}],194:[function(require,module,exports){ 'use strict'; var EvStore = require('ev-store'); @@ -14723,7 +16815,7 @@ EvHook.prototype.unhook = function(node, propertyName) { es[propName] = undefined; }; -},{"ev-store":7}],172:[function(require,module,exports){ +},{"ev-store":9}],195:[function(require,module,exports){ 'use strict'; module.exports = SoftSetHook; @@ -14742,7 +16834,7 @@ SoftSetHook.prototype.hook = function (node, propertyName) { } }; -},{}],173:[function(require,module,exports){ +},{}],196:[function(require,module,exports){ 'use strict'; var isArray = require('x-is-array'); @@ -14881,7 +16973,7 @@ function errorString(obj) { } } -},{"../vnode/is-thunk":176,"../vnode/is-vhook":177,"../vnode/is-vnode":178,"../vnode/is-vtext":179,"../vnode/is-widget":180,"../vnode/vnode.js":182,"../vnode/vtext.js":184,"./hooks/ev-hook.js":171,"./hooks/soft-set-hook.js":172,"./parse-tag.js":174,"x-is-array":205}],174:[function(require,module,exports){ +},{"../vnode/is-thunk":199,"../vnode/is-vhook":200,"../vnode/is-vnode":201,"../vnode/is-vtext":202,"../vnode/is-widget":203,"../vnode/vnode.js":205,"../vnode/vtext.js":207,"./hooks/ev-hook.js":194,"./hooks/soft-set-hook.js":195,"./parse-tag.js":197,"x-is-array":228}],197:[function(require,module,exports){ 'use strict'; var split = require('browser-split'); @@ -14937,7 +17029,7 @@ function parseTag(tag, props) { return props.namespace ? tagName : tagName.toUpperCase(); } -},{"browser-split":3}],175:[function(require,module,exports){ +},{"browser-split":5}],198:[function(require,module,exports){ var isVNode = require("./is-vnode") var isVText = require("./is-vtext") var isWidget = require("./is-widget") @@ -14979,14 +17071,14 @@ function renderThunk(thunk, previous) { return renderedThunk } -},{"./is-thunk":176,"./is-vnode":178,"./is-vtext":179,"./is-widget":180}],176:[function(require,module,exports){ +},{"./is-thunk":199,"./is-vnode":201,"./is-vtext":202,"./is-widget":203}],199:[function(require,module,exports){ module.exports = isThunk function isThunk(t) { return t && t.type === "Thunk" } -},{}],177:[function(require,module,exports){ +},{}],200:[function(require,module,exports){ module.exports = isHook function isHook(hook) { @@ -14995,7 +17087,7 @@ function isHook(hook) { typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook")) } -},{}],178:[function(require,module,exports){ +},{}],201:[function(require,module,exports){ var version = require("./version") module.exports = isVirtualNode @@ -15004,7 +17096,7 @@ function isVirtualNode(x) { return x && x.type === "VirtualNode" && x.version === version } -},{"./version":181}],179:[function(require,module,exports){ +},{"./version":204}],202:[function(require,module,exports){ var version = require("./version") module.exports = isVirtualText @@ -15013,17 +17105,17 @@ function isVirtualText(x) { return x && x.type === "VirtualText" && x.version === version } -},{"./version":181}],180:[function(require,module,exports){ +},{"./version":204}],203:[function(require,module,exports){ module.exports = isWidget function isWidget(w) { return w && w.type === "Widget" } -},{}],181:[function(require,module,exports){ +},{}],204:[function(require,module,exports){ module.exports = "2" -},{}],182:[function(require,module,exports){ +},{}],205:[function(require,module,exports){ var version = require("./version") var isVNode = require("./is-vnode") var isWidget = require("./is-widget") @@ -15097,7 +17189,7 @@ function VirtualNode(tagName, properties, children, key, namespace) { VirtualNode.prototype.version = version VirtualNode.prototype.type = "VirtualNode" -},{"./is-thunk":176,"./is-vhook":177,"./is-vnode":178,"./is-widget":180,"./version":181}],183:[function(require,module,exports){ +},{"./is-thunk":199,"./is-vhook":200,"./is-vnode":201,"./is-widget":203,"./version":204}],206:[function(require,module,exports){ var version = require("./version") VirtualPatch.NONE = 0 @@ -15121,7 +17213,7 @@ function VirtualPatch(type, vNode, patch) { VirtualPatch.prototype.version = version VirtualPatch.prototype.type = "VirtualPatch" -},{"./version":181}],184:[function(require,module,exports){ +},{"./version":204}],207:[function(require,module,exports){ var version = require("./version") module.exports = VirtualText @@ -15133,7 +17225,7 @@ function VirtualText(text) { VirtualText.prototype.version = version VirtualText.prototype.type = "VirtualText" -},{"./version":181}],185:[function(require,module,exports){ +},{"./version":204}],208:[function(require,module,exports){ var isObject = require("is-object") var isHook = require("../vnode/is-vhook") @@ -15193,7 +17285,7 @@ function getPrototype(value) { } } -},{"../vnode/is-vhook":177,"is-object":18}],186:[function(require,module,exports){ +},{"../vnode/is-vhook":200,"is-object":20}],209:[function(require,module,exports){ var isArray = require("x-is-array") var VPatch = require("../vnode/vpatch") @@ -15622,7 +17714,7 @@ function appendPatch(apply, patch) { } } -},{"../vnode/handle-thunk":175,"../vnode/is-thunk":176,"../vnode/is-vnode":178,"../vnode/is-vtext":179,"../vnode/is-widget":180,"../vnode/vpatch":183,"./diff-props":185,"x-is-array":205}],187:[function(require,module,exports){ +},{"../vnode/handle-thunk":198,"../vnode/is-thunk":199,"../vnode/is-vnode":201,"../vnode/is-vtext":202,"../vnode/is-widget":203,"../vnode/vpatch":206,"./diff-props":208,"x-is-array":228}],210:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -15641,7 +17733,7 @@ define(function (require) { }); })(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); }); -},{"./Scheduler":188,"./env":200,"./makePromise":202}],188:[function(require,module,exports){ +},{"./Scheduler":211,"./env":223,"./makePromise":225}],211:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -15723,7 +17815,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],189:[function(require,module,exports){ +},{}],212:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -15751,7 +17843,7 @@ define(function() { return TimeoutError; }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],190:[function(require,module,exports){ +},{}],213:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -15808,7 +17900,7 @@ define(function() { -},{}],191:[function(require,module,exports){ +},{}],214:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -16050,13 +18142,23 @@ define(function(require) { } function settleOne(p) { - var h = Promise._handler(p); - if(h.state() === 0) { + // Optimize the case where we get an already-resolved when.js promise + // by extracting its state: + var handler; + if (p instanceof Promise) { + // This is our own Promise type and we can reach its handler internals: + handler = p._handler.join(); + } + if((handler && handler.state() === 0) || !handler) { + // Either still pending, or not a Promise at all: return toPromise(p).then(state.fulfilled, state.rejected); } - h._unreport(); - return state.inspect(h); + // The promise is our own, but it is already resolved. Take a shortcut. + // Since we're not actually handling the resolution, we need to disable + // rejection reporting. + handler._unreport(); + return state.inspect(handler); } /** @@ -16099,7 +18201,7 @@ define(function(require) { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); -},{"../apply":190,"../state":203}],192:[function(require,module,exports){ +},{"../apply":213,"../state":226}],215:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -16261,7 +18363,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],193:[function(require,module,exports){ +},{}],216:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -16290,7 +18392,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],194:[function(require,module,exports){ +},{}],217:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -16312,7 +18414,7 @@ define(function(require) { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); -},{"../state":203}],195:[function(require,module,exports){ +},{"../state":226}],218:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -16379,7 +18481,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],196:[function(require,module,exports){ +},{}],219:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -16405,7 +18507,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],197:[function(require,module,exports){ +},{}],220:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -16485,7 +18587,7 @@ define(function(require) { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); -},{"../TimeoutError":189,"../env":200}],198:[function(require,module,exports){ +},{"../TimeoutError":212,"../env":223}],221:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -16573,7 +18675,7 @@ define(function(require) { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); -},{"../env":200,"../format":201}],199:[function(require,module,exports){ +},{"../env":223,"../format":224}],222:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -16613,7 +18715,7 @@ define(function() { }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],200:[function(require,module,exports){ +},{}],223:[function(require,module,exports){ (function (process){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ @@ -16664,8 +18766,8 @@ define(function(require) { } function hasMutationObserver () { - return (typeof MutationObserver === 'function' && MutationObserver) || - (typeof WebKitMutationObserver === 'function' && WebKitMutationObserver); + return (typeof MutationObserver !== 'undefined' && MutationObserver) || + (typeof WebKitMutationObserver !== 'undefined' && WebKitMutationObserver); } function initMutationObserver(MutationObserver) { @@ -16691,7 +18793,7 @@ define(function(require) { }).call(this,require('_process')) -},{"_process":4}],201:[function(require,module,exports){ +},{"_process":6}],224:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -16749,7 +18851,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],202:[function(require,module,exports){ +},{}],225:[function(require,module,exports){ (function (process){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ @@ -17635,6 +19737,28 @@ define(function() { function noop() {} + function hasCustomEvent() { + if(typeof CustomEvent === 'function') { + try { + var ev = new CustomEvent('unhandledRejection'); + return ev instanceof CustomEvent; + } catch (ignoredException) {} + } + return false; + } + + function hasInternetExplorerCustomEvent() { + if(typeof document !== 'undefined' && typeof document.createEvent === 'function') { + try { + // Try to create one event to make sure it's supported + var ev = document.createEvent('CustomEvent'); + ev.initCustomEvent('eventType', false, true, {}); + return true; + } catch (ignoredException) {} + } + return false; + } + function initEmitRejection() { /*global process, self, CustomEvent*/ if(typeof process !== 'undefined' && process !== null @@ -17648,15 +19772,9 @@ define(function() { ? process.emit(type, rejection.value, rejection) : process.emit(type, rejection); }; - } else if(typeof self !== 'undefined' && typeof CustomEvent === 'function') { - return (function(noop, self, CustomEvent) { - var hasCustomEvent = false; - try { - var ev = new CustomEvent('unhandledRejection'); - hasCustomEvent = ev instanceof CustomEvent; - } catch (e) {} - - return !hasCustomEvent ? noop : function(type, rejection) { + } else if(typeof self !== 'undefined' && hasCustomEvent()) { + return (function (self, CustomEvent) { + return function (type, rejection) { var ev = new CustomEvent(type, { detail: { reason: rejection.value, @@ -17668,7 +19786,19 @@ define(function() { return !self.dispatchEvent(ev); }; - }(noop, self, CustomEvent)); + }(self, CustomEvent)); + } else if(typeof self !== 'undefined' && hasInternetExplorerCustomEvent()) { + return (function(self, document) { + return function(type, rejection) { + var ev = document.createEvent('CustomEvent'); + ev.initCustomEvent(type, false, true, { + reason: rejection.value, + key: rejection + }); + + return !self.dispatchEvent(ev); + }; + }(self, document)); } return noop; @@ -17681,7 +19811,7 @@ define(function() { }).call(this,require('_process')) -},{"_process":4}],203:[function(require,module,exports){ +},{"_process":6}],226:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ @@ -17718,7 +19848,7 @@ define(function() { }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); -},{}],204:[function(require,module,exports){ +},{}],227:[function(require,module,exports){ /** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @@ -17948,7 +20078,7 @@ define(function (require) { }); })(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); }); -},{"./lib/Promise":187,"./lib/TimeoutError":189,"./lib/apply":190,"./lib/decorators/array":191,"./lib/decorators/flow":192,"./lib/decorators/fold":193,"./lib/decorators/inspect":194,"./lib/decorators/iterate":195,"./lib/decorators/progress":196,"./lib/decorators/timed":197,"./lib/decorators/unhandledRejection":198,"./lib/decorators/with":199}],205:[function(require,module,exports){ +},{"./lib/Promise":210,"./lib/TimeoutError":212,"./lib/apply":213,"./lib/decorators/array":214,"./lib/decorators/flow":215,"./lib/decorators/fold":216,"./lib/decorators/inspect":217,"./lib/decorators/iterate":218,"./lib/decorators/progress":219,"./lib/decorators/timed":220,"./lib/decorators/unhandledRejection":221,"./lib/decorators/with":222}],228:[function(require,module,exports){ var nativeIsArray = Array.isArray var toString = Object.prototype.toString @@ -17958,17 +20088,26 @@ function isArray(obj) { return toString.call(obj) === "[object Array]" } -},{}],206:[function(require,module,exports){ +},{}],229:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var APIv3_1 = require("./api/APIv3"); exports.APIv3 = APIv3_1.APIv3; +var ModelCreator_1 = require("./api/ModelCreator"); +exports.ModelCreator = ModelCreator_1.ModelCreator; -},{"./api/APIv3":217}],207:[function(require,module,exports){ +},{"./api/APIv3":242,"./api/ModelCreator":243}],230:[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 AttributionComponent_1 = require("./component/AttributionComponent"); exports.AttributionComponent = AttributionComponent_1.AttributionComponent; var BackgroundComponent_1 = require("./component/BackgroundComponent"); @@ -17989,16 +20128,40 @@ 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 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"); +var Marker_1 = require("./component/marker/marker/Marker"); exports.Marker = Marker_1.Marker; var MarkerComponent_1 = require("./component/marker/MarkerComponent"); exports.MarkerComponent = MarkerComponent_1.MarkerComponent; -var MouseComponent_1 = require("./component/MouseComponent"); +var MarkerScene_1 = require("./component/marker/MarkerScene"); +exports.MarkerScene = MarkerScene_1.MarkerScene; +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 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"); +exports.DoubleClickZoomHandler = DoubleClickZoomHandler_1.DoubleClickZoomHandler; +var ScrollZoomHandler_1 = require("./component/mouse/ScrollZoomHandler"); +exports.ScrollZoomHandler = ScrollZoomHandler_1.ScrollZoomHandler; +var TouchZoomHandler_1 = require("./component/mouse/TouchZoomHandler"); +exports.TouchZoomHandler = TouchZoomHandler_1.TouchZoomHandler; +var Popup_1 = require("./component/popup/popup/Popup"); +exports.Popup = Popup_1.Popup; +var PopupComponent_1 = require("./component/popup/PopupComponent"); +exports.PopupComponent = PopupComponent_1.PopupComponent; var NavigationComponent_1 = require("./component/NavigationComponent"); exports.NavigationComponent = NavigationComponent_1.NavigationComponent; var RouteComponent_1 = require("./component/RouteComponent"); @@ -18019,16 +20182,32 @@ 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 SimpleMarker_1 = require("./component/marker/SimpleMarker"); +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"); exports.SliderComponent = SliderComponent_1.SliderComponent; 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 Alignment_1 = require("./component/tag/tag/Alignment"); -exports.Alignment = Alignment_1.Alignment; var OutlineTag_1 = require("./component/tag/tag/OutlineTag"); exports.OutlineTag = OutlineTag_1.OutlineTag; var RenderTag_1 = require("./component/tag/tag/RenderTag"); @@ -18047,10 +20226,12 @@ var TagCreator_1 = require("./component/tag/TagCreator"); exports.TagCreator = TagCreator_1.TagCreator; var TagDOMRenderer_1 = require("./component/tag/TagDOMRenderer"); exports.TagDOMRenderer = TagDOMRenderer_1.TagDOMRenderer; -var TagGLRenderer_1 = require("./component/tag/TagGLRenderer"); -exports.TagGLRenderer = TagGLRenderer_1.TagGLRenderer; +var TagMode_1 = require("./component/tag/TagMode"); +exports.TagMode = TagMode_1.TagMode; var TagOperation_1 = require("./component/tag/TagOperation"); exports.TagOperation = TagOperation_1.TagOperation; +var TagScene_1 = require("./component/tag/TagScene"); +exports.TagScene = TagScene_1.TagScene; var TagSet_1 = require("./component/tag/TagSet"); exports.TagSet = TagSet_1.TagSet; var Geometry_1 = require("./component/tag/geometry/Geometry"); @@ -18065,9 +20246,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; +__export(require("./component/interfaces/interfaces")); -},{"./component/AttributionComponent":218,"./component/BackgroundComponent":219,"./component/BearingComponent":220,"./component/CacheComponent":221,"./component/Component":222,"./component/ComponentService":223,"./component/CoverComponent":224,"./component/DebugComponent":225,"./component/ImageComponent":226,"./component/KeyboardComponent":227,"./component/LoadingComponent":228,"./component/MouseComponent":229,"./component/NavigationComponent":230,"./component/RouteComponent":231,"./component/StatsComponent":232,"./component/direction/DirectionComponent":233,"./component/direction/DirectionDOMCalculator":234,"./component/direction/DirectionDOMRenderer":235,"./component/imageplane/ImagePlaneComponent":236,"./component/imageplane/ImagePlaneFactory":237,"./component/imageplane/ImagePlaneGLRenderer":238,"./component/imageplane/ImagePlaneScene":239,"./component/imageplane/ImagePlaneShaders":240,"./component/imageplane/SliderComponent":241,"./component/marker/Marker":242,"./component/marker/MarkerComponent":243,"./component/marker/SimpleMarker":244,"./component/sequence/SequenceComponent":245,"./component/sequence/SequenceDOMInteraction":246,"./component/sequence/SequenceDOMRenderer":247,"./component/tag/TagComponent":249,"./component/tag/TagCreator":250,"./component/tag/TagDOMRenderer":251,"./component/tag/TagGLRenderer":252,"./component/tag/TagOperation":253,"./component/tag/TagSet":254,"./component/tag/error/GeometryTagError":255,"./component/tag/geometry/Geometry":256,"./component/tag/geometry/PointGeometry":257,"./component/tag/geometry/PolygonGeometry":258,"./component/tag/geometry/RectGeometry":259,"./component/tag/geometry/VertexGeometry":260,"./component/tag/tag/Alignment":261,"./component/tag/tag/OutlineCreateTag":262,"./component/tag/tag/OutlineRenderTag":263,"./component/tag/tag/OutlineTag":264,"./component/tag/tag/RenderTag":265,"./component/tag/tag/SpotRenderTag":266,"./component/tag/tag/SpotTag":267,"./component/tag/tag/Tag":268}],208:[function(require,module,exports){ +},{"./component/AttributionComponent":244,"./component/BackgroundComponent":245,"./component/BearingComponent":246,"./component/CacheComponent":247,"./component/Component":248,"./component/ComponentService":249,"./component/CoverComponent":250,"./component/DebugComponent":251,"./component/ImageComponent":252,"./component/LoadingComponent":253,"./component/NavigationComponent":254,"./component/RouteComponent":255,"./component/StatsComponent":256,"./component/direction/DirectionComponent":257,"./component/direction/DirectionDOMCalculator":258,"./component/direction/DirectionDOMRenderer":259,"./component/imageplane/ImagePlaneComponent":260,"./component/imageplane/ImagePlaneFactory":261,"./component/imageplane/ImagePlaneGLRenderer":262,"./component/imageplane/ImagePlaneScene":263,"./component/imageplane/ImagePlaneShaders":264,"./component/imageplane/SliderComponent":265,"./component/interfaces/interfaces":267,"./component/keyboard/KeySequenceNavigationHandler":268,"./component/keyboard/KeySpatialNavigationHandler":269,"./component/keyboard/KeyZoomHandler":270,"./component/keyboard/KeyboardComponent":271,"./component/marker/MarkerComponent":273,"./component/marker/MarkerScene":274,"./component/marker/MarkerSet":275,"./component/marker/marker/CircleMarker":276,"./component/marker/marker/Marker":277,"./component/marker/marker/SimpleMarker":278,"./component/mouse/BounceHandler":279,"./component/mouse/DoubleClickZoomHandler":280,"./component/mouse/DragPanHandler":281,"./component/mouse/MouseComponent":282,"./component/mouse/ScrollZoomHandler":283,"./component/mouse/TouchZoomHandler":284,"./component/popup/PopupComponent":286,"./component/popup/popup/Popup":287,"./component/sequence/SequenceComponent":288,"./component/sequence/SequenceDOMInteraction":289,"./component/sequence/SequenceDOMRenderer":290,"./component/tag/TagComponent":292,"./component/tag/TagCreator":293,"./component/tag/TagDOMRenderer":294,"./component/tag/TagMode":295,"./component/tag/TagOperation":296,"./component/tag/TagScene":297,"./component/tag/TagSet":298,"./component/tag/error/GeometryTagError":299,"./component/tag/geometry/Geometry":300,"./component/tag/geometry/PointGeometry":301,"./component/tag/geometry/PolygonGeometry":302,"./component/tag/geometry/RectGeometry":303,"./component/tag/geometry/VertexGeometry":304,"./component/tag/handlers/CreateHandlerBase":305,"./component/tag/handlers/CreatePointHandler":306,"./component/tag/handlers/CreatePolygonHandler":307,"./component/tag/handlers/CreateRectDragHandler":308,"./component/tag/handlers/CreateRectHandler":309,"./component/tag/handlers/CreateVertexHandler":310,"./component/tag/handlers/EditVertexHandler":311,"./component/tag/handlers/TagHandlerBase":312,"./component/tag/tag/OutlineCreateTag":313,"./component/tag/tag/OutlineRenderTag":314,"./component/tag/tag/OutlineTag":315,"./component/tag/tag/RenderTag":316,"./component/tag/tag/SpotRenderTag":317,"./component/tag/tag/SpotTag":318,"./component/tag/tag/Tag":319,"./component/utils/HandlerBase":320}],231:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var EdgeDirection_1 = require("./graph/edge/EdgeDirection"); exports.EdgeDirection = EdgeDirection_1.EdgeDirection; var EdgeCalculatorSettings_1 = require("./graph/edge/EdgeCalculatorSettings"); @@ -18079,44 +20262,41 @@ exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients_1.EdgeCalculator var EdgeCalculator_1 = require("./graph/edge/EdgeCalculator"); exports.EdgeCalculator = EdgeCalculator_1.EdgeCalculator; -},{"./graph/edge/EdgeCalculator":289,"./graph/edge/EdgeCalculatorCoefficients":290,"./graph/edge/EdgeCalculatorDirections":291,"./graph/edge/EdgeCalculatorSettings":292,"./graph/edge/EdgeDirection":293}],209:[function(require,module,exports){ +},{"./graph/edge/EdgeCalculator":338,"./graph/edge/EdgeCalculatorCoefficients":339,"./graph/edge/EdgeCalculatorDirections":340,"./graph/edge/EdgeCalculatorSettings":341,"./graph/edge/EdgeDirection":342}],232:[function(require,module,exports){ "use strict"; -var MapillaryError_1 = require("./error/MapillaryError"); -exports.MapillaryError = MapillaryError_1.MapillaryError; +Object.defineProperty(exports, "__esModule", { value: true }); var ArgumentMapillaryError_1 = require("./error/ArgumentMapillaryError"); exports.ArgumentMapillaryError = ArgumentMapillaryError_1.ArgumentMapillaryError; var GraphMapillaryError_1 = require("./error/GraphMapillaryError"); exports.GraphMapillaryError = GraphMapillaryError_1.GraphMapillaryError; -var MoveTypeMapillaryError_1 = require("./error/MoveTypeMapillaryError"); -exports.MoveTypeMapillaryError = MoveTypeMapillaryError_1.MoveTypeMapillaryError; -var NotImplementedMapillaryError_1 = require("./error/NotImplementedMapillaryError"); -exports.NotImplementedMapillaryError = NotImplementedMapillaryError_1.NotImplementedMapillaryError; -var ParameterMapillaryError_1 = require("./error/ParameterMapillaryError"); -exports.ParameterMapillaryError = ParameterMapillaryError_1.ParameterMapillaryError; -var InitializationMapillaryError_1 = require("./error/InitializationMapillaryError"); -exports.InitializationMapillaryError = InitializationMapillaryError_1.InitializationMapillaryError; +var MapillaryError_1 = require("./error/MapillaryError"); +exports.MapillaryError = MapillaryError_1.MapillaryError; -},{"./error/ArgumentMapillaryError":269,"./error/GraphMapillaryError":270,"./error/InitializationMapillaryError":271,"./error/MapillaryError":272,"./error/MoveTypeMapillaryError":273,"./error/NotImplementedMapillaryError":274,"./error/ParameterMapillaryError":275}],210:[function(require,module,exports){ +},{"./error/ArgumentMapillaryError":321,"./error/GraphMapillaryError":322,"./error/MapillaryError":323}],233:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var Camera_1 = require("./geo/Camera"); exports.Camera = Camera_1.Camera; var GeoCoords_1 = require("./geo/GeoCoords"); exports.GeoCoords = GeoCoords_1.GeoCoords; +var ViewportCoords_1 = require("./geo/ViewportCoords"); +exports.ViewportCoords = ViewportCoords_1.ViewportCoords; var Spatial_1 = require("./geo/Spatial"); exports.Spatial = Spatial_1.Spatial; var Transform_1 = require("./geo/Transform"); exports.Transform = Transform_1.Transform; -},{"./geo/Camera":276,"./geo/GeoCoords":277,"./geo/Spatial":278,"./geo/Transform":279}],211:[function(require,module,exports){ +},{"./geo/Camera":324,"./geo/GeoCoords":325,"./geo/Spatial":326,"./geo/Transform":327,"./geo/ViewportCoords":328}],234:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var FilterCreator_1 = require("./graph/FilterCreator"); +exports.FilterCreator = FilterCreator_1.FilterCreator; var Graph_1 = require("./graph/Graph"); exports.Graph = Graph_1.Graph; var GraphCalculator_1 = require("./graph/GraphCalculator"); exports.GraphCalculator = GraphCalculator_1.GraphCalculator; var GraphService_1 = require("./graph/GraphService"); exports.GraphService = GraphService_1.GraphService; -var ImageLoader_1 = require("./graph/ImageLoader"); -exports.ImageLoader = ImageLoader_1.ImageLoader; var ImageLoadingService_1 = require("./graph/ImageLoadingService"); exports.ImageLoadingService = ImageLoadingService_1.ImageLoadingService; var MeshReader_1 = require("./graph/MeshReader"); @@ -18128,24 +20308,35 @@ exports.NodeCache = NodeCache_1.NodeCache; var Sequence_1 = require("./graph/Sequence"); exports.Sequence = Sequence_1.Sequence; -},{"./graph/Graph":280,"./graph/GraphCalculator":281,"./graph/GraphService":282,"./graph/ImageLoader":283,"./graph/ImageLoadingService":284,"./graph/MeshReader":285,"./graph/Node":286,"./graph/NodeCache":287,"./graph/Sequence":288}],212:[function(require,module,exports){ +},{"./graph/FilterCreator":329,"./graph/Graph":330,"./graph/GraphCalculator":331,"./graph/GraphService":332,"./graph/ImageLoadingService":333,"./graph/MeshReader":334,"./graph/Node":335,"./graph/NodeCache":336,"./graph/Sequence":337}],235:[function(require,module,exports){ +"use strict"; /** * MapillaryJS is a WebGL JavaScript library for exploring street level imagery * @name Mapillary */ -"use strict"; +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 Render_1 = require("./Render"); exports.RenderMode = Render_1.RenderMode; var Viewer_1 = require("./Viewer"); +exports.Alignment = Viewer_1.Alignment; exports.ImageSize = Viewer_1.ImageSize; exports.Viewer = Viewer_1.Viewer; var TagComponent = require("./component/tag/Tag"); exports.TagComponent = TagComponent; +var MarkerComponent = require("./component/marker/Marker"); +exports.MarkerComponent = MarkerComponent; +var PopupComponent = require("./component/popup/Popup"); +exports.PopupComponent = PopupComponent; -},{"./Edge":208,"./Render":213,"./Viewer":216,"./component/tag/Tag":248}],213:[function(require,module,exports){ +},{"./Edge":231,"./Render":236,"./Support":238,"./Viewer":241,"./component/marker/Marker":272,"./component/popup/Popup":285,"./component/tag/Tag":291}],236:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var DOMRenderer_1 = require("./render/DOMRenderer"); exports.DOMRenderer = DOMRenderer_1.DOMRenderer; var GLRenderer_1 = require("./render/GLRenderer"); @@ -18159,80 +20350,149 @@ exports.RenderMode = RenderMode_1.RenderMode; var RenderService_1 = require("./render/RenderService"); exports.RenderService = RenderService_1.RenderService; -},{"./render/DOMRenderer":294,"./render/GLRenderStage":295,"./render/GLRenderer":296,"./render/RenderCamera":297,"./render/RenderMode":298,"./render/RenderService":299}],214:[function(require,module,exports){ +},{"./render/DOMRenderer":343,"./render/GLRenderStage":344,"./render/GLRenderer":345,"./render/RenderCamera":346,"./render/RenderMode":347,"./render/RenderService":348}],237:[function(require,module,exports){ "use strict"; -var FrameGenerator_1 = require("./state/FrameGenerator"); -exports.FrameGenerator = FrameGenerator_1.FrameGenerator; -var StateService_1 = require("./state/StateService"); -exports.StateService = StateService_1.StateService; -var StateContext_1 = require("./state/StateContext"); -exports.StateContext = StateContext_1.StateContext; +Object.defineProperty(exports, "__esModule", { value: true }); var State_1 = require("./state/State"); exports.State = State_1.State; var StateBase_1 = require("./state/states/StateBase"); exports.StateBase = StateBase_1.StateBase; +var StateContext_1 = require("./state/StateContext"); +exports.StateContext = StateContext_1.StateContext; +var StateService_1 = require("./state/StateService"); +exports.StateService = StateService_1.StateService; 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/FrameGenerator":300,"./state/State":301,"./state/StateContext":302,"./state/StateService":303,"./state/states/StateBase":304,"./state/states/TraversingState":305,"./state/states/WaitingState":306}],215:[function(require,module,exports){ +},{"./state/State":349,"./state/StateContext":350,"./state/StateService":351,"./state/states/StateBase":352,"./state/states/TraversingState":353,"./state/states/WaitingState":354}],238:[function(require,module,exports){ "use strict"; -var EventEmitter_1 = require("./utils/EventEmitter"); -exports.EventEmitter = EventEmitter_1.EventEmitter; -var Settings_1 = require("./utils/Settings"); -exports.Settings = Settings_1.Settings; -var Urls_1 = require("./utils/Urls"); -exports.Urls = Urls_1.Urls; - -},{"./utils/EventEmitter":307,"./utils/Settings":308,"./utils/Urls":309}],216:[function(require,module,exports){ -"use strict"; -var Container_1 = require("./viewer/Container"); -exports.Container = Container_1.Container; -var EventLauncher_1 = require("./viewer/EventLauncher"); -exports.EventLauncher = EventLauncher_1.EventLauncher; -var ImageSize_1 = require("./viewer/ImageSize"); -exports.ImageSize = ImageSize_1.ImageSize; -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; +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.isArraySupported() && + support.isFunctionSupported() && + support.isJSONSupported() && + support.isObjectSupported(); +} +exports.isFallbackSupported = isFallbackSupported; + +},{"./utils/Support":362}],239:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var ImageTileLoader_1 = require("./tiles/ImageTileLoader"); +exports.ImageTileLoader = ImageTileLoader_1.ImageTileLoader; +var ImageTileStore_1 = require("./tiles/ImageTileStore"); +exports.ImageTileStore = ImageTileStore_1.ImageTileStore; +var TextureProvider_1 = require("./tiles/TextureProvider"); +exports.TextureProvider = TextureProvider_1.TextureProvider; +var RegionOfInterestCalculator_1 = require("./tiles/RegionOfInterestCalculator"); +exports.RegionOfInterestCalculator = RegionOfInterestCalculator_1.RegionOfInterestCalculator; + +},{"./tiles/ImageTileLoader":355,"./tiles/ImageTileStore":356,"./tiles/RegionOfInterestCalculator":357,"./tiles/TextureProvider":358}],240:[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/DOM":359,"./utils/EventEmitter":360,"./utils/Settings":361,"./utils/Support":362,"./utils/Urls":363}],241:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Alignment_1 = require("./viewer/Alignment"); +exports.Alignment = Alignment_1.Alignment; +var CacheService_1 = require("./viewer/CacheService"); +exports.CacheService = CacheService_1.CacheService; var ComponentController_1 = require("./viewer/ComponentController"); exports.ComponentController = ComponentController_1.ComponentController; -var SpriteAlignment_1 = require("./viewer/SpriteAlignment"); -exports.SpriteAlignment = SpriteAlignment_1.SpriteAlignment; +var Container_1 = require("./viewer/Container"); +exports.Container = Container_1.Container; +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 Projection_1 = require("./viewer/Projection"); +exports.Projection = Projection_1.Projection; var SpriteService_1 = require("./viewer/SpriteService"); exports.SpriteService = SpriteService_1.SpriteService; var TouchService_1 = require("./viewer/TouchService"); exports.TouchService = TouchService_1.TouchService; -exports.TouchMove = TouchService_1.TouchMove; var Viewer_1 = require("./viewer/Viewer"); exports.Viewer = Viewer_1.Viewer; -},{"./viewer/ComponentController":310,"./viewer/Container":311,"./viewer/EventLauncher":312,"./viewer/ImageSize":313,"./viewer/LoadingService":314,"./viewer/MouseService":315,"./viewer/Navigator":316,"./viewer/SpriteAlignment":317,"./viewer/SpriteService":318,"./viewer/TouchService":319,"./viewer/Viewer":320}],217:[function(require,module,exports){ -/// +},{"./viewer/Alignment":364,"./viewer/CacheService":365,"./viewer/ComponentController":366,"./viewer/Container":367,"./viewer/ImageSize":368,"./viewer/KeyboardService":369,"./viewer/LoadingService":370,"./viewer/MouseService":371,"./viewer/Navigator":372,"./viewer/Observer":373,"./viewer/Projection":374,"./viewer/SpriteService":375,"./viewer/TouchService":376,"./viewer/Viewer":377}],242:[function(require,module,exports){ "use strict"; -var falcor = require("falcor"); -var HttpDataSource = require("falcor-http-datasource"); +/// +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 Utils_1 = require("../Utils"); +var API_1 = require("../API"); +/** + * @class APIv3 + * + * @classdesc Provides methods for access of API v3. + */ var APIv3 = (function () { - function APIv3(clientId, model) { + /** + * Create a new api v3 instance. + * + * @param {number} clientId - Client id for API requests. + * @param {number} [token] - Optional bearer token for API requests of + * protected resources. + * @param {ModelCreator} [creator] - Optional model creator instance. + */ + function APIv3(clientId, token, creator) { this._clientId = clientId; - this._model = model != null ? - model : - new falcor.Model({ - source: new HttpDataSource(Utils_1.Urls.falcorModel(clientId), { - crossDomain: true, - withCredentials: false, - }), - }); + this._modelCreator = creator != null ? creator : new API_1.ModelCreator(); + this._model = this._modelCreator.createModel(clientId, token); this._pageCount = 999; this._pathImageByKey = "imageByKey"; this._pathImageCloseTo = "imageCloseTo"; @@ -18248,6 +20508,7 @@ var APIv3 = (function () { this._propertiesFill = [ "captured_at", "user", + "project", ]; this._propertiesKey = [ "key", @@ -18273,14 +20534,20 @@ var APIv3 = (function () { "username", ]; } - ; APIv3.prototype.imageByKeyFill$ = function (keys) { return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([ this._pathImageByKey, keys, - this._propertiesKey.concat(this._propertiesFill).concat(this._propertiesSpatial), - this._propertiesKey.concat(this._propertiesUser)])) + this._propertiesKey + .concat(this._propertiesFill) + .concat(this._propertiesSpatial), + this._propertiesKey + .concat(this._propertiesUser) + ])) .map(function (value) { + if (!value) { + throw new Error("Images (" + keys.join(", ") + ") could not be found."); + } return value.json.imageByKey; }), this._pathImageByKey, keys); }; @@ -18288,9 +20555,17 @@ var APIv3 = (function () { return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([ this._pathImageByKey, keys, - this._propertiesKey.concat(this._propertiesCore).concat(this._propertiesFill).concat(this._propertiesSpatial), - this._propertiesKey.concat(this._propertiesUser)])) + this._propertiesKey + .concat(this._propertiesCore) + .concat(this._propertiesFill) + .concat(this._propertiesSpatial), + this._propertiesKey + .concat(this._propertiesUser) + ])) .map(function (value) { + if (!value) { + throw new Error("Images (" + keys.join(", ") + ") could not be found."); + } return value.json.imageByKey; }), this._pathImageByKey, keys); }; @@ -18299,8 +20574,13 @@ var APIv3 = (function () { return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([ this._pathImageCloseTo, [lonLat], - this._propertiesKey.concat(this._propertiesCore).concat(this._propertiesFill).concat(this._propertiesSpatial), - this._propertiesKey.concat(this._propertiesUser)])) + this._propertiesKey + .concat(this._propertiesCore) + .concat(this._propertiesFill) + .concat(this._propertiesSpatial), + this._propertiesKey + .concat(this._propertiesUser) + ])) .map(function (value) { return value != null ? value.json.imageCloseTo[lonLat] : null; }), this._pathImageCloseTo, [lonLat]); @@ -18311,8 +20591,10 @@ var APIv3 = (function () { this._pathImagesByH, hs, { from: 0, to: this._pageCount }, - this._propertiesKey.concat(this._propertiesCore), - this._propertiesKey])) + this._propertiesKey + .concat(this._propertiesCore), + this._propertiesKey + ])) .map(function (value) { if (value == null) { value = { json: { imagesByH: {} } }; @@ -18339,11 +20621,18 @@ var APIv3 = (function () { APIv3.prototype.invalidateSequenceByKey = function (sKeys) { this._invalidateGet(this._pathSequenceByKey, sKeys); }; + APIv3.prototype.setToken = function (token) { + this._model.invalidate([]); + this._model = null; + this._model = this._modelCreator.createModel(this._clientId, token); + }; APIv3.prototype.sequenceByKey$ = function (sequenceKeys) { return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([ this._pathSequenceByKey, sequenceKeys, - this._propertiesKey.concat(this._propertiesSequence)])) + this._propertiesKey + .concat(this._propertiesSequence) + ])) .map(function (value) { return value.json.sequenceByKey; }), this._pathSequenceByKey, sequenceKeys); @@ -18386,23 +20675,72 @@ var APIv3 = (function () { return APIv3; }()); exports.APIv3 = APIv3; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = APIv3; -},{"../Utils":215,"falcor":13,"falcor-http-datasource":8,"rxjs/Observable":28,"rxjs/add/observable/defer":38,"rxjs/add/observable/fromPromise":42,"rxjs/add/operator/catch":48,"rxjs/add/operator/map":60}],218:[function(require,module,exports){ +},{"../API":229,"rxjs/Observable":29,"rxjs/add/observable/defer":39,"rxjs/add/observable/fromPromise":43,"rxjs/add/operator/catch":52,"rxjs/add/operator/map":65}],243:[function(require,module,exports){ +"use strict"; /// +Object.defineProperty(exports, "__esModule", { value: true }); +var falcor = require("falcor"); +var HttpDataSource = require("falcor-http-datasource"); +var Utils_1 = require("../Utils"); +/** + * @class ModelCreator + * + * @classdesc Creates API models. + */ +var ModelCreator = (function () { + function ModelCreator() { + } + /** + * Creates a Falcor model. + * + * @description Max cache size will be set to 16 MB. Authorization + * header will be added if bearer token is supplied. + * + * @param {number} clientId - Client id for API requests. + * @param {number} [token] - Optional bearer token for API requests of + * protected resources. + * @returns {falcor.Model} Falcor model for HTTP requests. + */ + ModelCreator.prototype.createModel = function (clientId, token) { + var configuration = { + crossDomain: true, + withCredentials: false, + }; + if (token != null) { + configuration.headers = { "Authorization": "Bearer " + token }; + } + return new falcor.Model({ + maxSize: 16 * 1024 * 1024, + source: new HttpDataSource(Utils_1.Urls.falcorModel(clientId), configuration), + }); + }; + return ModelCreator; +}()); +exports.ModelCreator = ModelCreator; +exports.default = ModelCreator; + +},{"../Utils":240,"falcor":15,"falcor-http-datasource":10}],244:[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 __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 AttributionComponent = (function (_super) { __extends(AttributionComponent, _super); function AttributionComponent(name, container, navigator) { - _super.call(this, name, container, navigator); + return _super.call(this, name, container, navigator) || this; } AttributionComponent.prototype._activate = function () { var _this = this; @@ -18436,23 +20774,28 @@ var AttributionComponent = (function (_super) { }(Component_1.Component)); exports.AttributionComponent = AttributionComponent; Component_1.ComponentService.register(AttributionComponent); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = AttributionComponent; -},{"../Component":207,"virtual-dom":163}],219:[function(require,module,exports){ -/// +},{"../Component":230,"virtual-dom":186}],245:[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 __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 BackgroundComponent = (function (_super) { __extends(BackgroundComponent, _super); function BackgroundComponent(name, container, navigator) { - _super.call(this, name, container, navigator); + return _super.call(this, name, container, navigator) || this; } BackgroundComponent.prototype._activate = function () { this._container.domRenderer.render$ @@ -18475,34 +20818,92 @@ var BackgroundComponent = (function (_super) { }(Component_1.Component)); exports.BackgroundComponent = BackgroundComponent; Component_1.ComponentService.register(BackgroundComponent); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = BackgroundComponent; -},{"../Component":207,"virtual-dom":163}],220:[function(require,module,exports){ -/// +},{"../Component":230,"virtual-dom":186}],246:[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 __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 Observable_1 = require("rxjs/Observable"); var Component_1 = require("../Component"); +var Geo_1 = require("../Geo"); var BearingComponent = (function (_super) { __extends(BearingComponent, _super); function BearingComponent(name, container, navigator) { - _super.call(this, 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; + return _this; } BearingComponent.prototype._activate = function () { var _this = this; - this._renderSubscription = this._navigator.stateService.currentNode$ - .map(function (node) { - return node.fullPano; + 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]; }) - .map(function (pano) { + .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); + var hFov = rc.perspective.aspect === Number.POSITIVE_INFINITY ? + Math.PI : + Math.atan(rc.perspective.aspect * Math.tan(0.5 * vFov)) * 2; + return [_this._spatial.azimuthalToBearing(rc.rotation.phi), hFov]; + }) + .distinctUntilChanged(function (a1, a2) { + 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); return { name: _this._name, - vnode: pano ? vd.h("div.BearingIndicator", {}, []) : vd.h("div", {}, []), + vnode: vd.h("div.BearingIndicator", {}, [ + background, + north, + compass, + ]), }; }) .subscribe(this._container.domRenderer.render$); @@ -18513,29 +20914,89 @@ var BearingComponent = (function (_super) { BearingComponent.prototype._getDefaultConfiguration = function () { return {}; }; + BearingComponent.prototype._createCircleSectorCompass = function (nodeSector, 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, + }, []); + var svg = vd.h("svg", { + attributes: { viewBox: "0 0 2 2" }, + namespace: this._svgNamespace, + style: { + bottom: "4px", + height: "48px", + left: "4px", + position: "absolute", + width: "48px", + }, + }, [group, centerCircle]); + return svg; + }; + BearingComponent.prototype._createCircleSector = function (bearing, 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 arcEnd = arcStart + fov; + var startX = Math.cos(arcStart); + var startY = Math.sin(arcStart); + var endX = Math.cos(arcEnd); + var endY = Math.sin(arcEnd); + var largeArc = fov >= Math.PI ? 1 : 0; + var description = "M 0 0 " + startX + " " + startY + " A 1 1 0 " + largeArc + " 1 " + endX + " " + endY; + return vd.h("path", { + attributes: { d: description, fill: fill }, + namespace: this._svgNamespace, + }, []); + }; BearingComponent.componentName = "bearing"; return BearingComponent; }(Component_1.Component)); exports.BearingComponent = BearingComponent; Component_1.ComponentService.register(BearingComponent); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = BearingComponent; -},{"../Component":207,"virtual-dom":163}],221:[function(require,module,exports){ +},{"../Component":230,"../Geo":233,"rxjs/Observable":29,"virtual-dom":186}],247:[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 __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/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"); @@ -18544,7 +21005,7 @@ var Component_1 = require("../Component"); var CacheComponent = (function (_super) { __extends(CacheComponent, _super); function CacheComponent(name, container, navigator) { - _super.call(this, name, container, navigator); + return _super.call(this, name, container, navigator) || this; } /** * Set the cache depth. @@ -18559,41 +21020,74 @@ var CacheComponent = (function (_super) { }; CacheComponent.prototype._activate = function () { var _this = this; - this._cacheSubscription = Observable_1.Observable - .combineLatest(this._navigator.stateService.currentNode$, this._configuration$) + this._sequenceSubscription = Observable_1.Observable + .combineLatest(this._navigator.stateService.currentNode$ + .switchMap(function (node) { + return node.sequenceEdges$; + }) + .filter(function (status) { + return status.cached; + }), this._configuration$) .switchMap(function (nc) { - var node = nc[0]; + var status = nc[0]; var configuration = nc[1]; - var depth = configuration.depth; - var sequenceDepth = Math.max(0, Math.min(4, depth.sequence)); + var sequenceDepth = Math.max(0, Math.min(4, configuration.depth.sequence)); + var next$ = _this._cache$(status.edges, Edge_1.EdgeDirection.Next, sequenceDepth); + var prev$ = _this._cache$(status.edges, Edge_1.EdgeDirection.Prev, sequenceDepth); + return Observable_1.Observable + .merge(next$, prev$) + .catch(function (error, caught) { + console.error("Failed to cache sequence edges.", error); + return Observable_1.Observable.empty(); + }); + }) + .subscribe(function () { }); + this._spatialSubscription = this._navigator.stateService.currentNode$ + .switchMap(function (node) { + return Observable_1.Observable + .combineLatest(Observable_1.Observable.of(node), node.spatialEdges$ + .filter(function (status) { + return status.cached; + })); + }) + .combineLatest(this._configuration$, function (ns, configuration) { + return [ns[0], ns[1], configuration]; + }) + .switchMap(function (args) { + var node = args[0]; + var edges = args[1].edges; + var depth = args[2].depth; var panoDepth = Math.max(0, Math.min(2, depth.pano)); var stepDepth = node.pano ? 0 : Math.max(0, Math.min(3, depth.step)); var turnDepth = node.pano ? 0 : Math.max(0, Math.min(1, depth.turn)); - var next$ = _this._cache$(node, Edge_1.EdgeDirection.Next, sequenceDepth); - var prev$ = _this._cache$(node, Edge_1.EdgeDirection.Prev, sequenceDepth); - var pano$ = _this._cache$(node, Edge_1.EdgeDirection.Pano, panoDepth); - var forward$ = _this._cache$(node, Edge_1.EdgeDirection.StepForward, stepDepth); - var backward$ = _this._cache$(node, Edge_1.EdgeDirection.StepBackward, stepDepth); - var left$ = _this._cache$(node, Edge_1.EdgeDirection.StepLeft, stepDepth); - var right$ = _this._cache$(node, Edge_1.EdgeDirection.StepRight, stepDepth); - var turnLeft$ = _this._cache$(node, Edge_1.EdgeDirection.TurnLeft, turnDepth); - var turnRight$ = _this._cache$(node, Edge_1.EdgeDirection.TurnRight, turnDepth); - var turnU$ = _this._cache$(node, Edge_1.EdgeDirection.TurnU, turnDepth); + var pano$ = _this._cache$(edges, Edge_1.EdgeDirection.Pano, panoDepth); + var forward$ = _this._cache$(edges, Edge_1.EdgeDirection.StepForward, stepDepth); + var backward$ = _this._cache$(edges, Edge_1.EdgeDirection.StepBackward, stepDepth); + var left$ = _this._cache$(edges, Edge_1.EdgeDirection.StepLeft, stepDepth); + var right$ = _this._cache$(edges, Edge_1.EdgeDirection.StepRight, stepDepth); + var turnLeft$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnLeft, turnDepth); + var turnRight$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnRight, turnDepth); + var turnU$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnU, turnDepth); return Observable_1.Observable - .merge(next$, prev$, forward$, backward$, left$, right$, pano$, turnLeft$, turnRight$, turnU$); + .merge(forward$, backward$, left$, right$, pano$, turnLeft$, turnRight$, turnU$) + .catch(function (error, caught) { + console.error("Failed to cache spatial edges.", error); + return Observable_1.Observable.empty(); + }); }) - .subscribe(function (n) { return; }, function (e) { console.error(e); }); + .subscribe(function () { }); }; CacheComponent.prototype._deactivate = function () { - this._cacheSubscription.unsubscribe(); + this._sequenceSubscription.unsubscribe(); + this._spatialSubscription.unsubscribe(); }; CacheComponent.prototype._getDefaultConfiguration = function () { return { depth: { pano: 1, sequence: 2, step: 1, turn: 0 } }; }; - CacheComponent.prototype._cache$ = function (node, direction, depth) { + CacheComponent.prototype._cache$ = function (edges, direction, depth) { var _this = this; return Observable_1.Observable - .zip(this._nodeToEdges$(node, direction), Observable_1.Observable.of(depth)) + .zip(Observable_1.Observable.of(edges), Observable_1.Observable.of(depth)) .expand(function (ed) { var es = ed[0]; var d = ed[1]; @@ -18632,16 +21126,21 @@ var CacheComponent = (function (_super) { }(Component_1.Component)); exports.CacheComponent = CacheComponent; Component_1.ComponentService.register(CacheComponent); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = CacheComponent; -},{"../Component":207,"../Edge":208,"rxjs/Observable":28,"rxjs/add/observable/combineLatest":37,"rxjs/add/observable/merge":43,"rxjs/add/observable/of":44,"rxjs/add/observable/zip":46,"rxjs/add/operator/distinct":52,"rxjs/add/operator/expand":55,"rxjs/add/operator/map":60,"rxjs/add/operator/mergeAll":62,"rxjs/add/operator/skip":70,"rxjs/add/operator/switchMap":73}],222:[function(require,module,exports){ +},{"../Component":230,"../Edge":231,"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":76,"rxjs/add/operator/switchMap":80}],248:[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 __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 BehaviorSubject_1 = require("rxjs/BehaviorSubject"); var Subject_1 = require("rxjs/Subject"); require("rxjs/add/operator/publishReplay"); @@ -18651,16 +21150,16 @@ var Utils_1 = require("../Utils"); var Component = (function (_super) { __extends(Component, _super); function Component(name, container, navigator) { - _super.call(this); - this._activated$ = new BehaviorSubject_1.BehaviorSubject(false); - this._configurationSubject$ = new Subject_1.Subject(); - this._activated = false; - this._container = container; - this._name = name; - this._navigator = navigator; - this._configuration$ = - this._configurationSubject$ - .startWith(this.defaultConfiguration) + var _this = _super.call(this) || this; + _this._activated$ = new BehaviorSubject_1.BehaviorSubject(false); + _this._configurationSubject$ = new Subject_1.Subject(); + _this._activated = false; + _this._container = container; + _this._name = name; + _this._navigator = navigator; + _this._configuration$ = + _this._configurationSubject$ + .startWith(_this.defaultConfiguration) .scan(function (conf, newConf) { for (var key in newConf) { if (newConf.hasOwnProperty(key)) { @@ -18671,7 +21170,8 @@ var Component = (function (_super) { }) .publishReplay(1) .refCount(); - this._configuration$.subscribe(); + _this._configuration$.subscribe(function () { }); + return _this; } Object.defineProperty(Component.prototype, "activated", { get: function () { @@ -18706,6 +21206,13 @@ var Component = (function (_super) { enumerable: true, configurable: true }); + Object.defineProperty(Component.prototype, "name", { + get: function () { + return this._name; + }, + enumerable: true, + configurable: true + }); Component.prototype.activate = function (conf) { if (this._activated) { return; @@ -18713,11 +21220,10 @@ var Component = (function (_super) { if (conf !== undefined) { this._configurationSubject$.next(conf); } - this._activate(); this._activated = true; + this._activate(); this._activated$.next(true); }; - ; Component.prototype.configure = function (conf) { this._configurationSubject$.next(conf); }; @@ -18725,13 +21231,12 @@ var Component = (function (_super) { if (!this._activated) { return; } + this._activated = false; this._deactivate(); this._container.domRenderer.clear(this._name); this._container.glRenderer.clear(this._name); - this._activated = false; this._activated$.next(false); }; - ; /** * Detect the viewer's new width and height and resize the component's * rendered elements accordingly if applicable. @@ -18744,12 +21249,12 @@ var Component = (function (_super) { return Component; }(Utils_1.EventEmitter)); exports.Component = Component; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Component; -},{"../Utils":215,"rxjs/BehaviorSubject":25,"rxjs/Subject":33,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/startWith":72}],223:[function(require,module,exports){ -/// +},{"../Utils":240,"rxjs/BehaviorSubject":26,"rxjs/Subject":34,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/startWith":79}],249:[function(require,module,exports){ "use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); var _ = require("underscore"); var Error_1 = require("../Error"); var ComponentService = (function () { @@ -18776,6 +21281,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; @@ -18834,24 +21346,29 @@ var ComponentService = (function () { }; ComponentService.prototype._checkName = function (name) { if (!(name in this._components)) { - throw new Error_1.ParameterMapillaryError("Component does not exist: " + name); + throw new Error_1.ArgumentMapillaryError("Component does not exist: " + name); } }; ComponentService.registeredComponents = {}; return ComponentService; }()); exports.ComponentService = ComponentService; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = ComponentService; -},{"../Error":209,"underscore":158}],224:[function(require,module,exports){ -/// +},{"../Error":232,"underscore":182}],250:[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 __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"); require("rxjs/add/operator/filter"); require("rxjs/add/operator/map"); @@ -18860,7 +21377,7 @@ var Component_1 = require("../Component"); var CoverComponent = (function (_super) { __extends(CoverComponent, _super); function CoverComponent(name, container, navigator) { - _super.call(this, name, container, navigator); + return _super.call(this, name, container, navigator) || this; } CoverComponent.prototype._activate = function () { var _this = this; @@ -18868,10 +21385,14 @@ var CoverComponent = (function (_super) { .withLatestFrom(this._configuration$, function (node, configuration) { return [node, configuration]; }) - .filter(function (nc) { - return nc[0].key !== nc[1].key; + .filter(function (_a) { + var node = _a[0], configuration = _a[1]; + return node.key !== configuration.key; + }) + .map(function (_a) { + var node = _a[0], configuration = _a[1]; + return node; }) - .map(function (nc) { return nc[0]; }) .map(function (node) { return { key: node.key, src: node.image.src }; }) @@ -18881,7 +21402,7 @@ var CoverComponent = (function (_super) { if (!conf.key) { return { name: _this._name, vnode: vd.h("div", []) }; } - if (!conf.visible) { + if (conf.state === Component_1.CoverState.Hidden) { return { name: _this._name, vnode: vd.h("div.Cover.CoverDone", [_this._getCoverBackgroundVNode(conf)]) }; } return { name: _this._name, vnode: _this._getCoverButtonVNode(conf) }; @@ -18893,14 +21414,14 @@ var CoverComponent = (function (_super) { this._keyDisposable.unsubscribe(); }; CoverComponent.prototype._getDefaultConfiguration = function () { - return { "loading": false, "visible": true }; + return { state: Component_1.CoverState.Visible }; }; CoverComponent.prototype._getCoverButtonVNode = function (conf) { var _this = this; - var cover = conf.loading ? "div.Cover.CoverLoading" : "div.Cover"; + var cover = conf.state === Component_1.CoverState.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("button.CoverButton", { onclick: function () { _this.configure({ state: Component_1.CoverState.Loading }); } }, ["Explore"]), vd.h("a.CoverLogo", { href: "https://www.mapillary.com", target: "_blank" }, []), ]); }; @@ -18910,7 +21431,7 @@ var CoverComponent = (function (_super) { "url(https://d1cuyjsrcm0gby.cloudfront.net/" + conf.key + "/thumb-640.jpg)"; var properties = { style: { backgroundImage: 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", {}, [])); @@ -18921,17 +21442,22 @@ var CoverComponent = (function (_super) { }(Component_1.Component)); exports.CoverComponent = CoverComponent; Component_1.ComponentService.registerCover(CoverComponent); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = CoverComponent; -},{"../Component":207,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/withLatestFrom":76,"virtual-dom":163}],225:[function(require,module,exports){ -/// +},{"../Component":230,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/withLatestFrom":85,"virtual-dom":186}],251:[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 __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 _ = require("underscore"); var vd = require("virtual-dom"); var BehaviorSubject_1 = require("rxjs/BehaviorSubject"); @@ -18940,9 +21466,10 @@ var Component_1 = require("../Component"); var DebugComponent = (function (_super) { __extends(DebugComponent, _super); function DebugComponent(name, container, navigator) { - _super.call(this, name, container, navigator); - this._open$ = new BehaviorSubject_1.BehaviorSubject(false); - this._displaying = false; + var _this = _super.call(this, name, container, navigator) || this; + _this._open$ = new BehaviorSubject_1.BehaviorSubject(false); + _this._displaying = false; + return _this; } DebugComponent.prototype._activate = function () { var _this = this; @@ -19029,46 +21556,65 @@ var DebugComponent = (function (_super) { }(Component_1.Component)); exports.DebugComponent = DebugComponent; Component_1.ComponentService.register(DebugComponent); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = DebugComponent; -},{"../Component":207,"rxjs/BehaviorSubject":25,"rxjs/add/operator/combineLatest":49,"underscore":158,"virtual-dom":163}],226:[function(require,module,exports){ -/// +},{"../Component":230,"rxjs/BehaviorSubject":26,"rxjs/add/operator/combineLatest":53,"underscore":182,"virtual-dom":186}],252:[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 __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 Observable_1 = require("rxjs/Observable"); require("rxjs/add/operator/combineLatest"); var Component_1 = require("../Component"); +var Utils_1 = require("../Utils"); var ImageComponent = (function (_super) { __extends(ImageComponent, _super); - function ImageComponent(name, container, navigator) { - _super.call(this, name, container, navigator); - this._canvasId = container.id + "-" + this._name; + 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, []) }); }; @@ -19083,219 +21629,22 @@ var ImageComponent = (function (_super) { }(Component_1.Component)); exports.ImageComponent = ImageComponent; Component_1.ComponentService.register(ImageComponent); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = ImageComponent; -},{"../Component":207,"rxjs/add/operator/combineLatest":49,"virtual-dom":163}],227:[function(require,module,exports){ +},{"../Component":230,"../Utils":240,"rxjs/Observable":29,"rxjs/add/operator/combineLatest":53,"virtual-dom":186}],253:[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 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) { - _super.call(this, name, container, navigator); - 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, - ]; - } - 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; - } - } +/// +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 __()); }; - KeyboardComponent.componentName = "keyboard"; - return KeyboardComponent; -}(Component_1.Component)); -exports.KeyboardComponent = KeyboardComponent; -Component_1.ComponentService.register(KeyboardComponent); +})(); Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = KeyboardComponent; - -},{"../Component":207,"../Edge":208,"../Geo":210,"rxjs/Observable":28,"rxjs/add/observable/fromEvent":41,"rxjs/add/operator/withLatestFrom":76}],228:[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 _ = require("underscore"); var vd = require("virtual-dom"); require("rxjs/add/operator/combineLatest"); @@ -19303,7 +21652,7 @@ var Component_1 = require("../Component"); var LoadingComponent = (function (_super) { __extends(LoadingComponent, _super); function LoadingComponent(name, container, navigator) { - _super.call(this, name, container, navigator); + return _super.call(this, name, container, navigator) || this; } LoadingComponent.prototype._activate = function () { var _this = this; @@ -19353,304 +21702,128 @@ var LoadingComponent = (function (_super) { }(Component_1.Component)); exports.LoadingComponent = LoadingComponent; Component_1.ComponentService.register(LoadingComponent); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = LoadingComponent; -},{"../Component":207,"rxjs/add/operator/combineLatest":49,"underscore":158,"virtual-dom":163}],229:[function(require,module,exports){ -/// +},{"../Component":230,"rxjs/add/operator/combineLatest":53,"underscore":182,"virtual-dom":186}],254:[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 THREE = require("three"); +/// +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 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"); +require("rxjs/add/operator/first"); +var Edge_1 = require("../Edge"); var Component_1 = require("../Component"); -var Geo_1 = require("../Geo"); /** - * @class MouseComponent - * @classdesc Component handling mouse and touch events for camera movement. + * @class NavigationComponent + * + * @classdesc Fallback navigation component for environments without WebGL support. + * + * Replaces the functionality in the Direction and Sequence components. */ -var MouseComponent = (function (_super) { - __extends(MouseComponent, _super); - function MouseComponent(name, container, navigator) { - _super.call(this, name, container, navigator); - this._spatial = new Geo_1.Spatial(); +var NavigationComponent = (function (_super) { + __extends(NavigationComponent, _super); + function NavigationComponent(name, container, navigator) { + var _this = _super.call(this, name, container, navigator) || this; + _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; } - MouseComponent.prototype._activate = function () { + NavigationComponent.prototype._activate = function () { var _this = this; - var draggingStarted$ = this._container.mouseService - .filtered$(this._name, this._container.mouseService.mouseDragStart$) - .map(function (event) { - return true; - }); - var draggingStopped$ = this._container.mouseService - .filtered$(this._name, this._container.mouseService.mouseDragEnd$) - .map(function (event) { - return false; - }); - var dragging$ = Observable_1.Observable - .merge(draggingStarted$, draggingStopped$) - .startWith(false) - .share(); - this._activeSubscription = dragging$ - .subscribe(this._container.mouseService.activate$); - this._cursorSubscription = dragging$ - .map(function (dragging) { - var className = dragging ? "MouseContainerGrabbing" : "MouseContainerGrab"; - var vNode = vd.h("div." + className, {}, []); - return { name: _this._name, vnode: vNode }; - }) - .subscribe(this._container.domRenderer.render$); - var mouseMovement$ = this._container.mouseService - .filtered$(this._name, this._container.mouseService.mouseDrag$) - .map(function (e) { - return { - clientX: e.clientX, - clientY: e.clientY, - movementX: e.movementX, - movementY: e.movementY, - }; - }); - var touchMovement$ = this._container.touchService.singleTouchMove$ - .map(function (touch) { - return { - clientX: touch.clientX, - clientY: touch.clientY, - movementX: touch.movementX, - movementY: touch.movementY, - }; - }); - this._movementSubscription = Observable_1.Observable - .merge(mouseMovement$, touchMovement$) - .withLatestFrom(this._navigator.stateService.currentState$, function (m, f) { - return [m, f]; - }) - .filter(function (args) { - var state = args[1].state; - return state.currentNode.fullPano || state.nodesAhead < 1; - }) - .map(function (args) { - return args[0]; + 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); + }); }) - .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, this._navigator.stateService.currentCamera$, function (m, r, t, c) { - return [m, r, t, c]; + .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]) }; }) - .map(function (args) { - var movement = args[0]; - var render = args[1]; - var transform = args[2]; - var camera = args[3].clone(); - var element = _this._container.element; - var offsetWidth = element.offsetWidth; - var offsetHeight = element.offsetHeight; - var clientRect = element.getBoundingClientRect(); - var canvasX = movement.clientX - clientRect.left; - var canvasY = movement.clientY - clientRect.top; - var currentDirection = _this._unproject(canvasX, canvasY, offsetWidth, offsetHeight, render.perspective) - .sub(render.perspective.position); - var directionX = _this._unproject(canvasX - movement.movementX, canvasY, offsetWidth, offsetHeight, render.perspective) - .sub(render.perspective.position); - var directionY = _this._unproject(canvasX, canvasY - movement.movementY, offsetWidth, offsetHeight, render.perspective) - .sub(render.perspective.position); - var deltaPhi = (movement.movementX > 0 ? 1 : -1) * directionX.angleTo(currentDirection); - var deltaTheta = (movement.movementY > 0 ? -1 : 1) * directionY.angleTo(currentDirection); - var upQuaternion = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1)); - var upQuaternionInverse = upQuaternion.clone().inverse(); - var offset = new THREE.Vector3(); - offset.copy(camera.lookat).sub(camera.position); - offset.applyQuaternion(upQuaternion); - var length = offset.length(); - var phi = Math.atan2(offset.y, offset.x); - phi += deltaPhi; - var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z); - theta += deltaTheta; - theta = Math.max(0.01, Math.min(Math.PI - 0.01, theta)); - offset.x = Math.sin(theta) * Math.cos(phi); - offset.y = Math.sin(theta) * Math.sin(phi); - offset.z = Math.cos(theta); - offset.applyQuaternion(upQuaternionInverse); - var lookat = new THREE.Vector3().copy(camera.position).add(offset.multiplyScalar(length)); - var basic = transform.projectBasic(lookat.toArray()); - var original = transform.projectBasic(camera.lookat.toArray()); - var x = basic[0] - original[0]; - var y = basic[1] - original[1]; - if (Math.abs(x) > 1) { - x = 0; - } - else if (x > 0.5) { - x = x - 1; + .subscribe(this._container.domRenderer.render$); + }; + NavigationComponent.prototype._deactivate = function () { + this._renderSubscription.unsubscribe(); + }; + NavigationComponent.prototype._getDefaultConfiguration = function () { + return { sequence: true, spatial: true }; + }; + NavigationComponent.prototype._createArrowRow = function (arrowNames, edgeDirections) { + var arrows = []; + for (var arrowName in arrowNames) { + if (!(arrowNames.hasOwnProperty(arrowName))) { + continue; } - else if (x < -0.5) { - x = x + 1; + var direction = Edge_1.EdgeDirection[arrowName]; + if (edgeDirections.indexOf(direction) !== -1) { + arrows.push(this._createVNode(direction, arrowNames[arrowName], "visible")); } - return [x, y]; - }) - .subscribe(function (basicRotation) { - _this._navigator.stateService.rotateBasic(basicRotation); - }); - this._mouseWheelSubscription = this._container.mouseService - .filtered$(this._name, this._container.mouseService.mouseWheel$) - .withLatestFrom(this._navigator.stateService.currentState$, function (w, f) { - return [w, f]; - }) - .filter(function (args) { - var state = args[1].state; - return state.currentNode.fullPano || state.nodesAhead < 1; - }) - .map(function (args) { - return args[0]; - }) - .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, function (w, r, t) { - return [w, r, t]; - }) - .subscribe(function (args) { - var event = args[0]; - var render = args[1]; - var transform = args[2]; - var element = _this._container.element; - var offsetWidth = element.offsetWidth; - var offsetHeight = element.offsetHeight; - var clientRect = element.getBoundingClientRect(); - var canvasX = event.clientX - clientRect.left; - var canvasY = event.clientY - clientRect.top; - var unprojected = _this._unproject(canvasX, canvasY, offsetWidth, offsetHeight, render.perspective); - var reference = transform.projectBasic(unprojected.toArray()); - var deltaY = event.deltaY; - if (event.deltaMode === 1) { - deltaY = 40 * deltaY; + else { + arrows.push(this._createVNode(direction, arrowNames[arrowName], "hidden")); } - else if (event.deltaMode === 2) { - deltaY = 800 * deltaY; - } - var zoom = -3 * deltaY / offsetHeight; - _this._navigator.stateService.zoomIn(zoom, reference); - }); - this._pinchSubscription = this._container.touchService.pinch$ - .withLatestFrom(this._navigator.stateService.currentState$, function (p, f) { - return [p, f]; - }) - .filter(function (args) { - var state = args[1].state; - return state.currentNode.fullPano || state.nodesAhead < 1; - }) - .map(function (args) { - return args[0]; - }) - .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, function (p, r, t) { - return [p, r, t]; - }) - .subscribe(function (args) { - var pinch = args[0]; - var render = args[1]; - var transform = args[2]; - var element = _this._container.element; - var offsetWidth = element.offsetWidth; - var offsetHeight = element.offsetHeight; - var clientRect = element.getBoundingClientRect(); - var unprojected = _this._unproject(pinch.centerClientX - clientRect.left, pinch.centerClientY - clientRect.top, offsetWidth, offsetHeight, render.perspective); - var reference = transform.projectBasic(unprojected.toArray()); - var zoom = 3 * pinch.distanceChange / Math.min(offsetHeight, offsetWidth); - _this._navigator.stateService.zoomIn(zoom, reference); - }); - this._container.mouseService.claimMouse(this._name, 0); - }; - MouseComponent.prototype._deactivate = function () { - this._container.mouseService.unclaimMouse(this._name); - this._activeSubscription.unsubscribe(); - this._cursorSubscription.unsubscribe(); - this._movementSubscription.unsubscribe(); - this._mouseWheelSubscription.unsubscribe(); - this._pinchSubscription.unsubscribe(); - }; - MouseComponent.prototype._getDefaultConfiguration = function () { - return {}; - }; - MouseComponent.prototype._unproject = function (canvasX, canvasY, offsetWidth, offsetHeight, perspectiveCamera) { - var projectedX = 2 * canvasX / offsetWidth - 1; - var projectedY = 1 - 2 * canvasY / offsetHeight; - return new THREE.Vector3(projectedX, projectedY, 1).unproject(perspectiveCamera); - }; - /** @inheritdoc */ - MouseComponent.componentName = "mouse"; - return MouseComponent; -}(Component_1.Component)); -exports.MouseComponent = MouseComponent; -Component_1.ComponentService.register(MouseComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = MouseComponent; - -},{"../Component":207,"../Geo":210,"rxjs/Observable":28,"rxjs/add/observable/merge":43,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/withLatestFrom":76,"three":157,"virtual-dom":163}],230:[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 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 Component_1 = require("../Component"); -var NavigationComponent = (function (_super) { - __extends(NavigationComponent, _super); - function NavigationComponent(name, container, navigator) { - _super.call(this, name, container, navigator); - 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"; - } - 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); - }); - }) - .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) }; - }) - .subscribe(this._container.domRenderer.render$); - }; - NavigationComponent.prototype._deactivate = function () { - this._renderSubscription.unsubscribe(); - }; - NavigationComponent.prototype._getDefaultConfiguration = function () { - return {}; + } + return arrows; }; - NavigationComponent.prototype._createVNode = function (direction, name) { + 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); }); }, + style: { + visibility: visibility, + }, }, []); }; NavigationComponent.componentName = "navigation"; @@ -19658,17 +21831,22 @@ var NavigationComponent = (function (_super) { }(Component_1.Component)); exports.NavigationComponent = NavigationComponent; Component_1.ComponentService.register(NavigationComponent); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = NavigationComponent; -},{"../Component":207,"../Edge":208,"rxjs/Observable":28,"rxjs/add/operator/first":58,"rxjs/add/operator/map":60,"virtual-dom":163}],231:[function(require,module,exports){ -/// +},{"../Component":230,"../Edge":231,"rxjs/Observable":29,"rxjs/add/operator/first":63,"rxjs/add/operator/map":65,"virtual-dom":186}],255:[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 __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 _ = require("underscore"); var vd = require("virtual-dom"); var Observable_1 = require("rxjs/Observable"); @@ -19703,7 +21881,7 @@ var RouteTrack = (function () { var RouteComponent = (function (_super) { __extends(RouteComponent, _super); function RouteComponent(name, container, navigator) { - _super.call(this, name, container, navigator); + return _super.call(this, name, container, navigator) || this; } RouteComponent.prototype._activate = function () { var _this = this; @@ -19718,8 +21896,8 @@ var RouteComponent = (function (_super) { var _routeTrack$; _routeTrack$ = this.configuration$.mergeMap(function (conf) { return Observable_1.Observable.from(conf.paths); - }).distinct(function (p1, p2) { - return p1.sequenceKey === p2.sequenceKey; + }).distinct(function (p) { + return p.sequenceKey; }).mergeMap(function (path) { return _this._navigator.apiV3.sequenceByKey$([path.sequenceKey]) .map(function (sequenceByKey) { @@ -19873,16 +22051,21 @@ var RouteComponent = (function (_super) { }(Component_1.Component)); exports.RouteComponent = RouteComponent; Component_1.ComponentService.register(RouteComponent); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = RouteComponent; -},{"../Component":207,"rxjs/Observable":28,"rxjs/add/observable/fromPromise":42,"rxjs/add/observable/of":44,"rxjs/add/operator/combineLatest":49,"rxjs/add/operator/distinct":52,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/mergeMap":63,"rxjs/add/operator/pluck":65,"rxjs/add/operator/scan":68,"underscore":158,"virtual-dom":163}],232:[function(require,module,exports){ +},{"../Component":230,"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":74,"underscore":182,"virtual-dom":186}],256:[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 __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/operator/buffer"); require("rxjs/add/operator/debounceTime"); @@ -19893,7 +22076,7 @@ var Component_1 = require("../Component"); var StatsComponent = (function (_super) { __extends(StatsComponent, _super); function StatsComponent(name, container, navigator) { - _super.call(this, name, container, navigator); + return _super.call(this, name, container, navigator) || this; } StatsComponent.prototype._activate = function () { var _this = this; @@ -19917,7 +22100,7 @@ var StatsComponent = (function (_super) { return Observable_1.Observable.empty(); }); }) - .subscribe(); + .subscribe(function () { }); this._imageSubscription = this._navigator.stateService.currentNode$ .map(function (node) { return node.key; @@ -19944,7 +22127,7 @@ var StatsComponent = (function (_super) { return Observable_1.Observable.empty(); }); }) - .subscribe(); + .subscribe(function () { }); }; StatsComponent.prototype._deactivate = function () { this._sequenceSubscription.unsubscribe(); @@ -19958,17 +22141,22 @@ var StatsComponent = (function (_super) { }(Component_1.Component)); exports.StatsComponent = StatsComponent; Component_1.ComponentService.register(StatsComponent); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = StatsComponent; -},{"../Component":207,"rxjs/Observable":28,"rxjs/add/operator/buffer":47,"rxjs/add/operator/debounceTime":51,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/scan":68}],233:[function(require,module,exports){ -/// +},{"../Component":230,"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":74}],257:[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 __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 Observable_1 = require("rxjs/Observable"); var Subject_1 = require("rxjs/Subject"); @@ -19985,11 +22173,14 @@ var Component_1 = require("../../Component"); */ var DirectionComponent = (function (_super) { __extends(DirectionComponent, _super); - function DirectionComponent(name, container, navigator) { - _super.call(this, name, container, navigator); - this._renderer = new Component_1.DirectionDOMRenderer(this.defaultConfiguration, container.element); - this._hoveredKeySubject$ = new Subject_1.Subject(); - this._hoveredKey$ = this._hoveredKeySubject$.share(); + function DirectionComponent(name, container, navigator, directionDOMRenderer) { + var _this = _super.call(this, name, container, navigator) || this; + _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; } Object.defineProperty(DirectionComponent.prototype, "hoveredKey$", { /** @@ -20065,21 +22256,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) { @@ -20136,11 +22327,11 @@ var DirectionComponent = (function (_super) { }(Component_1.Component)); exports.DirectionComponent = DirectionComponent; Component_1.ComponentService.register(DirectionComponent); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = DirectionComponent; -},{"../../Component":207,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/do":54,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/share":69,"virtual-dom":163}],234:[function(require,module,exports){ +},{"../../Component":230,"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":75,"virtual-dom":186}],258:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var Geo_1 = require("../../Geo"); /** * @class DirectionDOMCalculator @@ -20375,12 +22566,12 @@ var DirectionDOMCalculator = (function () { return DirectionDOMCalculator; }()); exports.DirectionDOMCalculator = DirectionDOMCalculator; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = DirectionDOMCalculator; -},{"../../Geo":210}],235:[function(require,module,exports){ -/// +},{"../../Geo":233}],259:[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"); @@ -20475,9 +22666,7 @@ var DirectionDOMRenderer = (function () { * @param {RenderCamera} renderCamera */ DirectionDOMRenderer.prototype.setRenderCamera = function (renderCamera) { - var camera = renderCamera.camera; - var direction = this._directionFromCamera(camera); - var rotation = this._getRotation(direction, camera.up); + var rotation = renderCamera.rotation; if (Math.abs(rotation.phi - this._rotation.phi) < this._epsilon) { return; } @@ -20564,16 +22753,6 @@ var DirectionDOMRenderer = (function () { } } }; - DirectionDOMRenderer.prototype._directionFromCamera = function (camera) { - return camera.lookat.clone().sub(camera.position); - }; - DirectionDOMRenderer.prototype._getRotation = function (direction, up) { - var upProjection = direction.clone().dot(up); - var planeProjection = direction.clone().sub(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 }; - }; DirectionDOMRenderer.prototype._createPanoArrows = function (navigator, rotation) { var arrows = []; for (var _i = 0, _a = this._panoEdges; _i < _a.length; _i++) { @@ -20738,52 +22917,68 @@ var DirectionDOMRenderer = (function () { var transform = this._isEdge ? "rotateX(60deg)" : "perspective(" + this._calculator.containerWidthCss + ") rotateX(60deg)"; - var perspectiveStyle = { - bottom: this._calculator.containerBottomCss, - height: this._calculator.containerHeightCss, - left: this._calculator.containerLeftCss, - marginLeft: this._calculator.containerMarginCss, - transform: transform, - width: this._calculator.containerWidthCss, + var properties = { + oncontextmenu: function (event) { event.preventDefault(); }, + style: { + bottom: this._calculator.containerBottomCss, + height: this._calculator.containerHeightCss, + left: this._calculator.containerLeftCss, + marginLeft: this._calculator.containerMarginCss, + transform: transform, + width: this._calculator.containerWidthCss, + }, }; - return vd.h("div.DirectionsPerspective", { style: perspectiveStyle }, turns.concat(steps)); + return vd.h("div.DirectionsPerspective", properties, turns.concat(steps)); }; return DirectionDOMRenderer; }()); exports.DirectionDOMRenderer = DirectionDOMRenderer; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = DirectionDOMRenderer; -},{"../../Component":207,"../../Edge":208,"../../Geo":210,"virtual-dom":163}],236:[function(require,module,exports){ +},{"../../Component":230,"../../Edge":231,"../../Geo":233,"virtual-dom":186}],260:[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 __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"); -require("rxjs/add/observable/combineLatest"); -require("rxjs/add/observable/of"); +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 Graph_1 = require("../../Graph"); +var Tiles_1 = require("../../Tiles"); var Utils_1 = require("../../Utils"); var ImagePlaneComponent = (function (_super) { __extends(ImagePlaneComponent, _super); function ImagePlaneComponent(name, container, navigator) { - _super.call(this, name, container, navigator); - this._rendererOperation$ = new Subject_1.Subject(); - this._rendererCreator$ = new Subject_1.Subject(); - this._rendererDisposer$ = new Subject_1.Subject(); - this._renderer$ = this._rendererOperation$ + var _this = _super.call(this, name, container, navigator) || this; + _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._rendererOperation$ = new Subject_1.Subject(); + _this._rendererCreator$ = new Subject_1.Subject(); + _this._rendererDisposer$ = new Subject_1.Subject(); + _this._renderer$ = _this._rendererOperation$ .scan(function (renderer, operation) { return operation(renderer); }, null) @@ -20793,7 +22988,7 @@ var ImagePlaneComponent = (function (_super) { .distinctUntilChanged(undefined, function (renderer) { return renderer.frameId; }); - this._rendererCreator$ + _this._rendererCreator$ .map(function () { return function (renderer) { if (renderer != null) { @@ -20802,15 +22997,16 @@ var ImagePlaneComponent = (function (_super) { return new Component_1.ImagePlaneGLRenderer(); }; }) - .subscribe(this._rendererOperation$); - this._rendererDisposer$ + .subscribe(_this._rendererOperation$); + _this._rendererDisposer$ .map(function () { return function (renderer) { renderer.dispose(); return null; }; }) - .subscribe(this._rendererOperation$); + .subscribe(_this._rendererOperation$); + return _this; } ImagePlaneComponent.prototype._activate = function () { var _this = this; @@ -20838,59 +23034,167 @@ var ImagePlaneComponent = (function (_super) { }; }) .subscribe(this._rendererOperation$); - this._nodeSubscription = Observable_1.Observable - .combineLatest(this._navigator.stateService.currentNode$, this._configuration$) + var textureProvider$ = this._navigator.stateService.currentState$ + .distinctUntilChanged(undefined, function (frame) { + return frame.state.currentNode.key; + }) + .combineLatest(this._configuration$) + .filter(function (args) { + return args[1].imageTiling === true; + }) + .map(function (args) { + return args[0]; + }) + .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._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$ = 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.currentNode$ .debounceTime(1000) - .withLatestFrom(this._navigator.stateService.currentTransform$, function (nc, t) { - return [nc[0], nc[1], t]; - }) - .map(function (params) { - var node = params[0]; - var configuration = params[1]; - var transform = params[2]; - var imageSize = Utils_1.Settings.maxImageSize; - if (node.pano) { - if (configuration.maxPanoramaResolution === "high") { - imageSize = Math.max(imageSize, Math.min(4096, Math.max(transform.width, transform.height))); - } - else if (configuration.maxPanoramaResolution === "full") { - imageSize = Math.max(imageSize, transform.width, transform.height); - } - } - return [node, imageSize]; + .withLatestFrom(hasTexture$) + .filter(function (args) { + return !args[1]; + }) + .map(function (args) { + return args[0]; }) - .filter(function (params) { - var node = params[0]; - var imageSize = params[1]; + .filter(function (node) { return node.pano ? - imageSize > Utils_1.Settings.basePanoramaSize : - imageSize > Utils_1.Settings.baseImageSize; - }) - .switchMap(function (params) { - var node = params[0]; - var imageSize = params[1]; - var image$ = node.pano && imageSize > Utils_1.Settings.maxImageSize ? - Graph_1.ImageLoader.loadDynamic(node.key, imageSize) : - Graph_1.ImageLoader.loadThumbnail(node.key, imageSize); + 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$ - .filter(function (statusObject) { - return statusObject.object != null; - }) - .first() - .map(function (statusObject) { - return statusObject.object; - }) - .zip(Observable_1.Observable.of(node), function (i, n) { - return [i, n]; - }) + .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]); + }); + this._updateTextureImageSubscription = nodeImage$ .map(function (imn) { return function (renderer) { - renderer.updateTexture(imn[0], imn[1]); + renderer.updateTextureImage(imn[0], imn[1]); return renderer; }; }) @@ -20898,24 +23202,31 @@ var ImagePlaneComponent = (function (_super) { }; ImagePlaneComponent.prototype._deactivate = function () { this._rendererDisposer$.next(null); + this._abortTextureProviderSubscription.unsubscribe(); + this._hasTextureSubscription.unsubscribe(); this._rendererSubscription.unsubscribe(); + this._setRegionOfInterestSubscription.unsubscribe(); + this._setTextureProviderSubscription.unsubscribe(); + this._setTileSizeSubscription.unsubscribe(); this._stateSubscription.unsubscribe(); - this._nodeSubscription.unsubscribe(); + this._textureProviderSubscription.unsubscribe(); + this._updateBackgroundSubscription.unsubscribe(); + this._updateTextureImageSubscription.unsubscribe(); }; ImagePlaneComponent.prototype._getDefaultConfiguration = function () { - return { maxPanoramaResolution: "auto" }; + return { imageTiling: false }; }; ImagePlaneComponent.componentName = "imagePlane"; return ImagePlaneComponent; }(Component_1.Component)); exports.ImagePlaneComponent = ImagePlaneComponent; Component_1.ComponentService.register(ImagePlaneComponent); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = ImagePlaneComponent; -},{"../../Component":207,"../../Graph":211,"../../Render":213,"../../Utils":215,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/observable/of":44,"rxjs/add/operator/debounceTime":51,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/scan":68,"rxjs/add/operator/switchMap":73,"rxjs/add/operator/withLatestFrom":76}],237:[function(require,module,exports){ -/// +},{"../../Component":230,"../../Render":236,"../../Tiles":239,"../../Utils":240,"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":74,"rxjs/add/operator/skipWhile":78,"rxjs/add/operator/startWith":79,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/takeUntil":82,"rxjs/add/operator/withLatestFrom":85}],261:[function(require,module,exports){ "use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var Component_1 = require("../../Component"); var ImagePlaneFactory = (function () { @@ -21029,9 +23340,7 @@ var ImagePlaneFactory = (function () { return texture; }; ImagePlaneFactory.prototype._useMesh = function (transform, node) { - return node.mesh.vertices.length && - transform.scale > 1e-2 && - transform.scale < 50; + return node.mesh.vertices.length && transform.hasValidScale; }; ImagePlaneFactory.prototype._getImageSphereGeo = function (transform, node) { var t = new THREE.Matrix4().getInverse(transform.srt); @@ -21141,12 +23450,12 @@ var ImagePlaneFactory = (function () { return ImagePlaneFactory; }()); exports.ImagePlaneFactory = ImagePlaneFactory; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = ImagePlaneFactory; -},{"../../Component":207,"three":157}],238:[function(require,module,exports){ -/// +},{"../../Component":230,"three":180}],262:[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 () { @@ -21160,6 +23469,7 @@ var ImagePlaneGLRenderer = (function () { this._epsilon = 0.000001; this._currentKey = null; this._previousKey = null; + this._providerDisposers = {}; this._frameId = 0; this._needsRender = false; } @@ -21177,13 +23487,52 @@ var ImagePlaneGLRenderer = (function () { enumerable: true, configurable: true }); + ImagePlaneGLRenderer.prototype.indicateNeedsRender = function () { + this._needsRender = true; + }; ImagePlaneGLRenderer.prototype.updateFrame = function (frame) { this._updateFrameId(frame.id); this._needsRender = this._updateAlpha(frame.state.alpha) || this._needsRender; this._needsRender = this._updateAlphaOld(frame.state.alpha) || this._needsRender; this._needsRender = this._updateImagePlanes(frame.state) || this._needsRender; }; - ImagePlaneGLRenderer.prototype.updateTexture = function (image, node) { + ImagePlaneGLRenderer.prototype.setTextureProvider = function (key, provider) { + var _this = this; + if (key !== this._currentKey) { + return; + } + var createdSubscription = provider.textureCreated$ + .subscribe(function (texture) { + _this._updateTexture(texture); + }); + var updatedSubscription = provider.textureUpdated$ + .subscribe(function (updated) { + _this._needsRender = true; + }); + var dispose = function () { + createdSubscription.unsubscribe(); + updatedSubscription.unsubscribe(); + provider.dispose(); + }; + if (key in this._providerDisposers) { + var disposeProvider = this._providerDisposers[key]; + disposeProvider(); + delete this._providerDisposers[key]; + } + this._providerDisposers[key] = dispose; + }; + ImagePlaneGLRenderer.prototype._updateTexture = function (texture) { + this._needsRender = true; + for (var _i = 0, _a = this._imagePlaneScene.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; + } + }; + ImagePlaneGLRenderer.prototype.updateTextureImage = function (image, node) { if (this._currentKey !== node.key) { return; } @@ -21241,14 +23590,23 @@ var ImagePlaneGLRenderer = (function () { if (state.currentNode == null || state.currentNode.key === this._currentKey) { return false; } - this._previousKey = state.previousNode != null ? state.previousNode.key : null; - if (this._previousKey != null) { - if (this._previousKey !== this._currentKey) { + var previousKey = state.previousNode != null ? state.previousNode.key : null; + var currentKey = state.currentNode.key; + if (this._previousKey !== previousKey && + this._previousKey !== currentKey && + this._previousKey in this._providerDisposers) { + var disposeProvider = this._providerDisposers[this._previousKey]; + disposeProvider(); + delete this._providerDisposers[this._previousKey]; + } + if (previousKey != null) { + if (previousKey !== this._currentKey && previousKey !== this._previousKey) { var previousMesh = this._imagePlaneFactory.createMesh(state.previousNode, state.previousTransform); this._imagePlaneScene.updateImagePlanes([previousMesh]); } + this._previousKey = previousKey; } - this._currentKey = state.currentNode.key; + this._currentKey = currentKey; var currentMesh = this._imagePlaneFactory.createMesh(state.currentNode, state.currentTransform); this._imagePlaneScene.updateImagePlanes([currentMesh]); this._alphaOld = 1; @@ -21257,12 +23615,12 @@ var ImagePlaneGLRenderer = (function () { return ImagePlaneGLRenderer; }()); exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = ImagePlaneGLRenderer; -},{"../../Component":207,"../../Geo":210}],239:[function(require,module,exports){ -/// +},{"../../Component":230,"../../Geo":233}],263:[function(require,module,exports){ "use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var ImagePlaneScene = (function () { function ImagePlaneScene() { @@ -21334,12 +23692,12 @@ var ImagePlaneScene = (function () { return ImagePlaneScene; }()); exports.ImagePlaneScene = ImagePlaneScene; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = ImagePlaneScene; -},{"three":157}],240:[function(require,module,exports){ -/// +},{"three":180}],264:[function(require,module,exports){ "use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); var path = require("path"); var ImagePlaneShaders = (function () { @@ -21357,15 +23715,20 @@ var ImagePlaneShaders = (function () { }()); exports.ImagePlaneShaders = ImagePlaneShaders; -},{"path":21}],241:[function(require,module,exports){ -/// +},{"path":22}],265:[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 vd = require("virtual-dom"); +/// +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"); require("rxjs/add/observable/combineLatest"); @@ -21382,7 +23745,6 @@ require("rxjs/add/operator/scan"); require("rxjs/add/operator/switchMap"); require("rxjs/add/operator/withLatestFrom"); require("rxjs/add/operator/zip"); -var Graph_1 = require("../../Graph"); var State_1 = require("../../State"); var Render_1 = require("../../Render"); var Utils_1 = require("../../Utils"); @@ -21397,7 +23759,6 @@ var SliderState = (function () { this._frameId = 0; this._glNeedsRender = false; this._domNeedsRender = true; - this._motionless = false; this._curtain = 1; } Object.defineProperty(SliderState.prototype, "frameId", { @@ -21443,7 +23804,6 @@ var SliderState = (function () { get: function () { return this._currentKey == null || this._previousKey == null || - this._motionless || this._currentPano; }, enumerable: true, @@ -21452,9 +23812,9 @@ var SliderState = (function () { 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; - this._domNeedsRender = needsRender || this._domNeedsRender; }; SliderState.prototype.updateTexture = function (image, node) { var imagePlanes = node.key === this._currentKey ? @@ -21500,7 +23860,6 @@ var SliderState = (function () { if (state.previousNode != null && this._previousKey !== state.previousNode.key) { needsRender = true; this._previousKey = state.previousNode.key; - this._motionless = state.motionless; this._imagePlaneScene.setImagePlanesOld([ this._imagePlaneFactory.createMesh(state.previousNode, state.previousTransform), ]); @@ -21509,7 +23868,6 @@ var SliderState = (function () { needsRender = true; this._currentKey = state.currentNode.key; this._currentPano = state.currentNode.pano; - this._motionless = state.motionless; this._imagePlaneScene.setImagePlanes([ this._imagePlaneFactory.createMesh(state.currentNode, state.currentTransform), ]); @@ -21544,12 +23902,13 @@ var SliderComponent = (function (_super) { * Create a new slider component instance. * @class SliderComponent */ - function SliderComponent(name, container, navigator) { - _super.call(this, name, container, navigator); - this._sliderStateOperation$ = new Subject_1.Subject(); - this._sliderStateCreator$ = new Subject_1.Subject(); - this._sliderStateDisposer$ = new Subject_1.Subject(); - this._sliderState$ = this._sliderStateOperation$ + function SliderComponent(name, container, navigator, dom) { + var _this = _super.call(this, name, container, navigator) || this; + _this._dom = !!dom ? dom : new Utils_1.DOM(); + _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) @@ -21559,7 +23918,7 @@ var SliderComponent = (function (_super) { .distinctUntilChanged(undefined, function (sliderState) { return sliderState.frameId; }); - this._sliderStateCreator$ + _this._sliderStateCreator$ .map(function () { return function (sliderState) { if (sliderState != null) { @@ -21568,15 +23927,16 @@ var SliderComponent = (function (_super) { return new SliderState(); }; }) - .subscribe(this._sliderStateOperation$); - this._sliderStateDisposer$ + .subscribe(_this._sliderStateOperation$); + _this._sliderStateDisposer$ .map(function () { return function (sliderState) { sliderState.dispose(); return null; }; }) - .subscribe(this._sliderStateOperation$); + .subscribe(_this._sliderStateOperation$); + return _this; } /** * Set the image keys. @@ -21608,16 +23968,29 @@ var SliderComponent = (function (_super) { }; SliderComponent.prototype._activate = function () { var _this = this; - this._container.mouseService.preventDefaultMouseDown$.next(false); - this._container.touchService.preventDefaultTouchMove$.next(false); + this._sliderContainer = this._dom.createElement("div", "mapillary-js-slider-container", this._container.element); + this._sliderWrapper = this._dom.createElement("div", "SliderWrapper", this._sliderContainer); + this._sliderControl = this._dom.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 (stateConfig) { - if (stateConfig[0] === State_1.State.Traversing) { + .subscribe(function (_a) { + var state = _a[0], configuration = _a[1]; + if (state === State_1.State.Traversing) { _this._navigator.stateService.wait(); - var position = stateConfig[1].initialPosition; - _this._navigator.stateService.moveTo(position != null ? position : 1); + var position = configuration.initialPosition != null ? configuration.initialPosition : 1; + _this._sliderControl.value = (1000 * position).toString(); + _this._navigator.stateService.moveTo(position); } }); this._glRenderSubscription = this._sliderState$ @@ -21639,41 +24012,11 @@ var SliderComponent = (function (_super) { .filter(function (sliderState) { return sliderState.domNeedsRender; }) - .map(function (sliderState) { - var sliderInput = vd.h("input.SliderControl", { - max: 1000, - min: 0, - type: "range", - value: 1000 * sliderState.curtain, - }, []); - var vNode = sliderState.disabled || !sliderState.sliderVisible ? - null : - vd.h("div.SliderWrapper", {}, [sliderInput]); - var hash = { - name: _this._name, - vnode: vNode, - }; + .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(); - return hash; - }) - .subscribe(this._container.domRenderer.render$); - this._elementSubscription = this._container.domRenderer.element$ - .map(function (e) { - var nodeList = e.getElementsByClassName("SliderControl"); - var slider = nodeList.length > 0 ? nodeList[0] : null; - return slider; - }) - .filter(function (input) { - return input != null; - }) - .switchMap(function (input) { - return Observable_1.Observable.fromEvent(input, "input"); - }) - .map(function (e) { - return Number(e.target.value) / 1000; - }) - .subscribe(function (curtain) { - _this._navigator.stateService.moveTo(curtain); }); this._sliderStateCreator$.next(null); this._stateSubscription = this._navigator.stateService.currentState$ @@ -21730,7 +24073,7 @@ var SliderComponent = (function (_super) { _this._navigator.stateService.setNodes([co.nodes.background]); _this._navigator.stateService.setNodes([co.nodes.foreground]); }, function (e) { - console.log(e); + console.error(e); }); var previousNode$ = this._navigator.stateService.currentState$ .map(function (frame) { @@ -21750,25 +24093,25 @@ var SliderComponent = (function (_super) { Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize; }) .mergeMap(function (node) { - return Graph_1.ImageLoader.loadThumbnail(node.key, Utils_1.Settings.maxImageSize) - .filter(function (statusObject) { - return statusObject.object != null; - }) - .first() - .map(function (statusObject) { - return statusObject.object; - }) - .zip(Observable_1.Observable.of(node), function (t, n) { - return [t, n]; + 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(); + } + 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 (imn) { + .map(function (_a) { + var element = _a[0], node = _a[1]; return function (sliderState) { - sliderState.updateTexture(imn[0], imn[1]); + sliderState.updateTexture(element, node); return sliderState; }; }) @@ -21776,8 +24119,6 @@ var SliderComponent = (function (_super) { }; SliderComponent.prototype._deactivate = function () { var _this = this; - this._container.mouseService.preventDefaultMouseDown$.next(true); - this._container.touchService.preventDefaultTouchMove$.next(true); this._navigator.stateService.state$ .first() .subscribe(function (state) { @@ -21788,12 +24129,18 @@ var SliderComponent = (function (_super) { this._sliderStateDisposer$.next(null); this._setKeysSubscription.unsubscribe(); this._setSliderVisibleSubscription.unsubscribe(); - this._elementSubscription.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 {}; @@ -21801,7 +24148,7 @@ var SliderComponent = (function (_super) { SliderComponent.prototype._catchCacheNode$ = function (key) { return this._navigator.graphService.cacheNode$(key) .catch(function (error, caught) { - console.log("Failed to cache slider node (" + key + ")", error); + console.error("Failed to cache slider node (" + key + ")", error); return Observable_1.Observable.empty(); }); }; @@ -21810,299 +24157,1436 @@ var SliderComponent = (function (_super) { }(Component_1.Component)); exports.SliderComponent = SliderComponent; Component_1.ComponentService.register(SliderComponent); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = SliderComponent; -},{"../../Component":207,"../../Graph":211,"../../Render":213,"../../State":214,"../../Utils":215,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/observable/fromEvent":41,"rxjs/add/observable/of":44,"rxjs/add/observable/zip":46,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/filter":56,"rxjs/add/operator/first":58,"rxjs/add/operator/map":60,"rxjs/add/operator/merge":61,"rxjs/add/operator/mergeMap":63,"rxjs/add/operator/scan":68,"rxjs/add/operator/switchMap":73,"rxjs/add/operator/withLatestFrom":76,"rxjs/add/operator/zip":77,"virtual-dom":163}],242:[function(require,module,exports){ +},{"../../Component":230,"../../Render":236,"../../State":237,"../../Utils":240,"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":74,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/withLatestFrom":85,"rxjs/add/operator/zip":86}],266:[function(require,module,exports){ "use strict"; -var Marker = (function () { - function Marker(latLonAlt, markerOptions) { - this.visibleInKeys = []; - this._id = markerOptions.id; - this._latLonAlt = latLonAlt; - this._markerOptions = markerOptions; - this._type = markerOptions.type; +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 = {})); + +},{}],267:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var ICoverConfiguration_1 = require("./ICoverConfiguration"); +exports.CoverState = ICoverConfiguration_1.CoverState; + +},{"./ICoverConfiguration":266}],268:[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 }); +require("rxjs/add/operator/switchMap"); +require("rxjs/add/operator/withLatestFrom"); +var Component_1 = require("../../Component"); +var Edge_1 = require("../../Edge"); +/** + * The `KeySequenceNavigationHandler` allows the user 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 = (function (_super) { + __extends(KeySequenceNavigationHandler, _super); + function KeySequenceNavigationHandler() { + return _super !== null && _super.apply(this, arguments) || this; } - Object.defineProperty(Marker.prototype, "id", { + 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(function (n) { return; }, function (e) { console.error(e); }); + return; + } + } + }); + }; + KeySequenceNavigationHandler.prototype._disable = function () { + this._keyDownSubscription.unsubscribe(); + }; + KeySequenceNavigationHandler.prototype._getConfiguration = function (enable) { + return { keySequenceNavigation: enable }; + }; + return KeySequenceNavigationHandler; +}(Component_1.HandlerBase)); +exports.KeySequenceNavigationHandler = KeySequenceNavigationHandler; +exports.default = KeySequenceNavigationHandler; + +},{"../../Component":230,"../../Edge":231,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/withLatestFrom":85}],269:[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 }); +require("rxjs/add/operator/switchMap"); +require("rxjs/add/operator/withLatestFrom"); +var Component_1 = require("../../Component"); +var Edge_1 = require("../../Edge"); +/** + * The `KeySpatialNavigationHandler` allows the user 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 = (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; + } + } + }; + KeySpatialNavigationHandler.prototype._moveToKey = function (key) { + this._navigator.moveToKey$(key) + .subscribe(function (n) { }, function (e) { console.error(e); }); + }; + 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":230,"../../Edge":231,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/withLatestFrom":85}],270:[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 }); +require("rxjs/add/operator/withLatestFrom"); +var Component_1 = require("../../Component"); +/** + * The `KeyZoomHandler` allows the user 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 = (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; + } + 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; + +},{"../../Component":230,"rxjs/add/operator/withLatestFrom":85}],271:[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 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 = (function (_super) { + __extends(KeyboardComponent, _super); + function KeyboardComponent(name, container, navigator) { + var _this = _super.call(this, name, container, navigator) || this; + _this._keyZoomHandler = new Component_1.KeyZoomHandler(_this, container, navigator, new Geo_1.ViewportCoords()); + _this._keySequenceNavigationHandler = new Component_1.KeySequenceNavigationHandler(_this, container, navigator); + _this._keySpatialNavigationHandler = new Component_1.KeySpatialNavigationHandler(_this, container, navigator, new Geo_1.Spatial()); + return _this; + } + Object.defineProperty(KeyboardComponent.prototype, "keyZoom", { + /** + * Get key zoom. + * + * @returns {KeyZoomHandler} The key zoom handler. + */ get: function () { - return this._id; + return this._keyZoomHandler; }, enumerable: true, configurable: true }); - Object.defineProperty(Marker.prototype, "type", { + Object.defineProperty(KeyboardComponent.prototype, "keySequenceNavigation", { + /** + * Get key sequence navigation. + * + * @returns {KeySequenceNavigationHandler} The key sequence navigation handler. + */ get: function () { - return this._type; + return this._keySequenceNavigationHandler; }, enumerable: true, configurable: true }); - Object.defineProperty(Marker.prototype, "latLonAlt", { + Object.defineProperty(KeyboardComponent.prototype, "keySpatialNavigation", { + /** + * Get spatial. + * + * @returns {KeySpatialNavigationHandler} The spatial handler. + */ get: function () { - return this._latLonAlt; + return this._keySpatialNavigationHandler; }, enumerable: true, configurable: true }); - return Marker; -}()); -exports.Marker = Marker; + KeyboardComponent.prototype._activate = function () { + var _this = this; + this._configurationSubscription = this._configuration$ + .subscribe(function (configuration) { + if (configuration.keyZoom) { + _this._keyZoomHandler.enable(); + } + else { + _this._keyZoomHandler.disable(); + } + if (configuration.keySequenceNavigation) { + _this._keySequenceNavigationHandler.enable(); + } + else { + _this._keySequenceNavigationHandler.disable(); + } + if (configuration.keySpatialNavigation) { + _this._keySpatialNavigationHandler.enable(); + } + else { + _this._keySpatialNavigationHandler.disable(); + } + }); + }; + KeyboardComponent.prototype._deactivate = function () { + this._configurationSubscription.unsubscribe(); + }; + KeyboardComponent.prototype._getDefaultConfiguration = function () { + return { keySequenceNavigation: true, keySpatialNavigation: true, keyZoom: true }; + }; + KeyboardComponent.componentName = "keyboard"; + return KeyboardComponent; +}(Component_1.Component)); +exports.KeyboardComponent = KeyboardComponent; +Component_1.ComponentService.register(KeyboardComponent); +exports.default = KeyboardComponent; + +},{"../../Component":230,"../../Geo":233}],272:[function(require,module,exports){ +"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Marker; +var MarkerComponent_1 = require("./MarkerComponent"); +exports.MarkerComponent = MarkerComponent_1.MarkerComponent; +var SimpleMarker_1 = require("./marker/SimpleMarker"); +exports.SimpleMarker = SimpleMarker_1.SimpleMarker; +var CircleMarker_1 = require("./marker/CircleMarker"); +exports.CircleMarker = CircleMarker_1.CircleMarker; -},{}],243:[function(require,module,exports){ -/// +},{"./MarkerComponent":273,"./marker/CircleMarker":276,"./marker/SimpleMarker":278}],273:[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 _ = require("underscore"); +/// +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 rbush = require("rbush"); +var when = require("when"); 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/map"); -require("rxjs/add/operator/publishReplay"); -require("rxjs/add/operator/scan"); -require("rxjs/add/operator/switchMap"); var Component_1 = require("../../Component"); var Render_1 = require("../../Render"); +var Graph_1 = require("../../Graph"); var Geo_1 = require("../../Geo"); -var MarkerSet = (function () { - function MarkerSet() { - this._create$ = new Subject_1.Subject(); - this._remove$ = new Subject_1.Subject(); - this._update$ = new Subject_1.Subject(); - // markers list stream is the result of applying marker updates. - this._markers$ = this._update$ - .scan(function (markers, operation) { - return operation(markers); - }, { hash: {}, spatial: rbush(16, [".lon", ".lat", ".lon", ".lat"]) }) - .map(function (markers) { - return markers.spatial; - }) - .publishReplay(1) - .refCount(); - // creation stream generate creation updates from given markers. - this._create$ - .map(function (marker) { - return function (markers) { - if (markers.hash[marker.id]) { - markers.spatial.remove(markers.hash[marker.id]); - } - var rbushObj = { - id: marker.id, - lat: marker.latLonAlt.lat, - lon: marker.latLonAlt.lon, - marker: marker, - }; - markers.spatial.insert(rbushObj); - markers.hash[marker.id] = rbushObj; - return markers; - }; - }) - .subscribe(this._update$); - // remove stream generates remove updates from given markers - this._remove$ - .map(function (id) { - return function (markers) { - var rbushObj = markers.hash[id]; - markers.spatial.remove(rbushObj); - delete markers.hash[id]; - return markers; - }; - }) - .subscribe(this._update$); - } - MarkerSet.prototype.addMarker = function (marker) { - this._create$.next(marker); - }; - MarkerSet.prototype.removeMarker = function (id) { - this._remove$.next(id); - }; - Object.defineProperty(MarkerSet.prototype, "markers$", { - get: function () { - return this._markers$; - }, - enumerable: true, - configurable: true - }); - return MarkerSet; -}()); -exports.MarkerSet = MarkerSet; +/** + * @class MarkerComponent + * + * @classdesc Component for showing and editing 3D marker objects. + * + * The `add` method is used for adding new markers or replacing + * markers already in the set. + * + * If a marker already in the set has the same + * id as one of the markers added, the old marker will be removed and + * the added marker will take its place. + * + * It is not possible to update markers in the set by updating any properties + * directly on the marker object. Markers need to be replaced by + * re-adding them for updates to geographic position or configuration + * to be reflected. + * + * Markers added to the marker component can be either interactive + * or non-interactive. Different marker types define their behavior. + * Markers with interaction support can be configured with options + * to respond to dragging inside the viewer and be detected when + * retrieving markers from pixel points with the `getMarkerIdAt` method. + * + * To retrive and use the marker component + * + * @example + * ``` + * var viewer = new Mapillary.Viewer( + * "", + * "", + * "", + * { component: { marker: true } }); + * + * var markerComponent = viewer.getComponent("marker"); + * ``` + */ var MarkerComponent = (function (_super) { __extends(MarkerComponent, _super); function MarkerComponent(name, container, navigator) { - _super.call(this, name, container, navigator); + var _this = _super.call(this, name, container, navigator) || this; + _this._relativeGroundAltitude = -2; + _this._geoCoords = new Geo_1.GeoCoords(); + _this._graphCalculator = new Graph_1.GraphCalculator(); + _this._markerScene = new Component_1.MarkerScene(); + _this._markerSet = new Component_1.MarkerSet(); + _this._viewportCoords = new Geo_1.ViewportCoords(); + return _this; } + /** + * Add markers to the marker set or replace markers in the marker set. + * + * @description If a marker already in the set has the same + * id as one of the markers added, the old marker will be removed + * the added marker will take its place. + * + * Any marker inside the visible bounding bbox + * will be initialized and placed in the viewer. + * + * @param {Array} markers - Markers to add. + * + * @example ```markerComponent.add([marker1, marker2]);``` + */ + MarkerComponent.prototype.add = function (markers) { + this._markerSet.add(markers); + }; + /** + * Returns the marker in the marker set with the specified id, or + * undefined if the id matches no marker. + * + * @param {string} markerId - Id of the marker. + * + * @example ```var marker = markerComponent.get("markerId");``` + * + */ + MarkerComponent.prototype.get = function (markerId) { + return this._markerSet.get(markerId); + }; + /** + * Returns an array of all markers. + * + * @example ```var markers = markerComponent.getAll();``` + */ + MarkerComponent.prototype.getAll = function () { + return this._markerSet.getAll(); + }; + /** + * Returns the id of the interactive marker closest to the current camera + * position at the specified point. + * + * @description 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 marker component. + * + * If no interactive geometry of an interactive marker exist at the pixel + * point, `null` will be returned. + * + * @param {Array} pixelPoint - Pixel coordinates on the viewer element. + * @returns {string} Id of the interactive marker closest to the camera. If no + * interactive marker exist at the pixel point, `null` will be returned. + * + * @example + * ``` + * markerComponent.getMarkerIdAt([100, 100]) + * .then((markerId) => { console.log(markerId); }); + * ``` + */ + MarkerComponent.prototype.getMarkerIdAt = 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 id = _this._markerScene.intersectObjects(viewport, render.perspective); + return id; + }) + .subscribe(function (id) { + resolve(id); + }, function (error) { + reject(error); + }); + }); + }; + /** + * Check if a marker exist in the marker set. + * + * @param {string} markerId - Id of the marker. + * + * @example ```var markerExists = markerComponent.has("markerId");``` + */ + MarkerComponent.prototype.has = function (markerId) { + return this._markerSet.has(markerId); + }; + /** + * Remove markers with the specified ids from the marker set. + * + * @param {Array} markerIds - Ids for markers to remove. + * + * @example ```markerComponent.remove(["id-1", "id-2"]);``` + */ + MarkerComponent.prototype.remove = function (markerIds) { + this._markerSet.remove(markerIds); + }; + /** + * Remove all markers from the marker set. + * + * @example ```markerComponent.removeAll();``` + */ + MarkerComponent.prototype.removeAll = function () { + this._markerSet.removeAll(); + }; MarkerComponent.prototype._activate = function () { var _this = this; - this._scene = new THREE.Scene(); - this._markerSet = new MarkerSet(); - this._markerObjects = {}; - this._disposable = Observable_1.Observable - .combineLatest([ - this._navigator.stateService.currentState$, - this._markerSet.markers$, - ], function (frame, markers) { - return { frame: frame, markers: markers }; + var groundAltitude$ = this._navigator.stateService.currentState$ + .map(function (frame) { + return frame.state.camera.position.z + _this._relativeGroundAltitude; }) - .distinctUntilChanged(undefined, function (args) { - return args.frame.id; + .distinctUntilChanged(function (a1, a2) { + return Math.abs(a1 - a2) < 0.01; }) - .map(function (args) { - return _this._renderHash(args); + .publishReplay(1) + .refCount(); + var geoInitiated$ = Observable_1.Observable + .combineLatest(groundAltitude$, this._navigator.stateService.reference$) + .first() + .map(function () { }) + .publishReplay(1) + .refCount(); + var clampedConfiguration$ = this._configuration$ + .map(function (configuration) { + return { visibleBBoxSize: Math.max(1, Math.min(200, configuration.visibleBBoxSize)) }; + }); + var currentlatLon$ = this._navigator.stateService.currentNode$ + .map(function (node) { return node.latLon; }) + .publishReplay(1) + .refCount(); + var visibleBBox$ = Observable_1.Observable + .combineLatest(clampedConfiguration$, currentlatLon$) + .map(function (_a) { + var configuration = _a[0], latLon = _a[1]; + return _this._graphCalculator + .boundingBoxCorners(latLon, configuration.visibleBBoxSize / 2); + }) + .publishReplay(1) + .refCount(); + var visibleMarkers$ = Observable_1.Observable + .combineLatest(Observable_1.Observable + .of(this._markerSet) + .concat(this._markerSet.changed$), visibleBBox$) + .map(function (_a) { + var set = _a[0], bbox = _a[1]; + return set.search(bbox); + }); + this._setChangedSubscription = geoInitiated$ + .switchMap(function () { + return visibleMarkers$ + .withLatestFrom(_this._navigator.stateService.reference$, groundAltitude$); + }) + .subscribe(function (_a) { + var markers = _a[0], reference = _a[1], alt = _a[2]; + var geoCoords = _this._geoCoords; + var markerScene = _this._markerScene; + var sceneMarkers = markerScene.markers; + var markersToRemove = Object.assign({}, sceneMarkers); + for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) { + var marker = markers_1[_i]; + if (marker.id in sceneMarkers) { + delete markersToRemove[marker.id]; + } + else { + var point3d = geoCoords + .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt); + markerScene.add(marker, point3d); + } + } + for (var id in markersToRemove) { + if (!markersToRemove.hasOwnProperty(id)) { + continue; + } + markerScene.remove(id); + } + }); + this._markersUpdatedSubscription = geoInitiated$ + .switchMap(function () { + return _this._markerSet.updated$ + .withLatestFrom(visibleBBox$, _this._navigator.stateService.reference$, groundAltitude$); + }) + .subscribe(function (_a) { + var markers = _a[0], _b = _a[1], sw = _b[0], ne = _b[1], reference = _a[2], alt = _a[3]; + var geoCoords = _this._geoCoords; + var markerScene = _this._markerScene; + for (var _i = 0, markers_2 = markers; _i < markers_2.length; _i++) { + var marker = markers_2[_i]; + var exists = markerScene.has(marker.id); + var visible = marker.latLon.lat > sw.lat && + marker.latLon.lat < ne.lat && + marker.latLon.lon > sw.lon && + marker.latLon.lon < ne.lon; + if (visible) { + var point3d = geoCoords + .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt); + markerScene.add(marker, point3d); + } + else if (!visible && exists) { + markerScene.remove(marker.id); + } + } + }); + this._referenceSubscription = this._navigator.stateService.reference$ + .skip(1) + .withLatestFrom(groundAltitude$) + .subscribe(function (_a) { + var reference = _a[0], alt = _a[1]; + var geoCoords = _this._geoCoords; + var markerScene = _this._markerScene; + for (var _i = 0, _b = markerScene.getAll(); _i < _b.length; _i++) { + var marker = _b[_i]; + var point3d = geoCoords + .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt); + markerScene.update(marker.id, point3d); + } + }); + this._adjustHeightSubscription = groundAltitude$ + .skip(1) + .withLatestFrom(this._navigator.stateService.reference$, currentlatLon$) + .subscribe(function (_a) { + var alt = _a[0], reference = _a[1], latLon = _a[2]; + var geoCoords = _this._geoCoords; + var markerScene = _this._markerScene; + var position = geoCoords + .geodeticToEnu(latLon.lat, latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt); + for (var _i = 0, _b = markerScene.getAll(); _i < _b.length; _i++) { + var marker = _b[_i]; + var point3d = geoCoords + .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt); + var distanceX = point3d[0] - position[0]; + var distanceY = point3d[1] - position[1]; + var groundDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY); + if (groundDistance > 50) { + continue; + } + markerScene.lerpAltitude(marker.id, alt, Math.min(1, Math.max(0, 1.2 - 1.2 * groundDistance / 50))); + } + }); + this._renderSubscription = this._navigator.stateService.currentState$ + .map(function (frame) { + var scene = _this._markerScene; + return { + name: _this._name, + render: { + frameId: frame.id, + needsRender: scene.needsRender, + render: scene.render.bind(scene), + stage: Render_1.GLRenderStage.Foreground, + }, + }; }) .subscribe(this._container.glRenderer.render$); + var hoveredMarkerId$ = Observable_1.Observable + .combineLatest(this._container.renderService.renderCamera$, this._container.mouseService.mouseMove$) + .map(function (_a) { + var render = _a[0], event = _a[1]; + var element = _this._container.element; + var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1]; + var viewport = _this._viewportCoords.canvasToViewport(canvasX, canvasY, element); + var markerId = _this._markerScene.intersectObjects(viewport, render.perspective); + return markerId; + }) + .publishReplay(1) + .refCount(); + var draggingStarted$ = this._container.mouseService + .filtered$(this._name, this._container.mouseService.mouseDragStart$) + .map(function (event) { + return true; + }); + var draggingStopped$ = this._container.mouseService + .filtered$(this._name, this._container.mouseService.mouseDragEnd$) + .map(function (event) { + return false; + }); + var filteredDragging$ = Observable_1.Observable + .merge(draggingStarted$, draggingStopped$) + .startWith(false); + this._dragEventSubscription = draggingStarted$ + .withLatestFrom(hoveredMarkerId$) + .merge(Observable_1.Observable + .combineLatest(draggingStopped$, Observable_1.Observable.of(null))) + .startWith([false, null]) + .pairwise() + .subscribe(function (_a) { + var previous = _a[0], current = _a[1]; + var dragging = current[0]; + var eventType = dragging ? MarkerComponent.dragstart : MarkerComponent.dragend; + var id = dragging ? current[1] : previous[1]; + var marker = _this._markerScene.get(id); + 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$.distinctUntilChanged(), mouseDown$, filteredDragging$) + .map(function (_a) { + var active = _a[0], markerId = _a[1], mouseDown = _a[2], filteredDragging = _a[3]; + return (!active && markerId != null && mouseDown) || filteredDragging; + }) + .distinctUntilChanged() + .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 + .filtered$(this._name, this._container.mouseService.mouseDragStart$) + .withLatestFrom(hoveredMarkerId$, this._container.renderService.renderCamera$) + .map(function (_a) { + var e = _a[0], id = _a[1], r = _a[2]; + var marker = _this._markerScene.get(id); + var element = _this._container.element; + var _b = _this._viewportCoords.projectToCanvas(marker.geometry.position.toArray(), element, r.perspective), groundCanvasX = _b[0], groundCanvasY = _b[1]; + var _c = _this._viewportCoords.canvasPosition(e, element), canvasX = _c[0], canvasY = _c[1]; + var offset = [canvasX - groundCanvasX, canvasY - groundCanvasY]; + return [marker, offset, r]; + }) + .publishReplay(1) + .refCount(); + this._updateMarkerSubscription = this._container.mouseService + .filtered$(this._name, this._container.mouseService.mouseDrag$) + .withLatestFrom(offset$, this._navigator.stateService.reference$, clampedConfiguration$) + .subscribe(function (_a) { + var event = _a[0], _b = _a[1], marker = _b[0], offset = _b[1], render = _b[2], reference = _a[2], configuration = _a[3]; + if (!_this._markerScene.has(marker.id)) { + return; + } + var element = _this._container.element; + var _c = _this._viewportCoords.canvasPosition(event, element), canvasX = _c[0], canvasY = _c[1]; + var groundX = canvasX - offset[0]; + var groundY = canvasY - offset[1]; + var _d = _this._viewportCoords + .canvasToViewport(groundX, groundY, element), viewportX = _d[0], viewportY = _d[1]; + var direction = new THREE.Vector3(viewportX, viewportY, 1) + .unproject(render.perspective) + .sub(render.perspective.position) + .normalize(); + var distance = Math.min(_this._relativeGroundAltitude / direction.z, configuration.visibleBBoxSize / 2 - 0.1); + if (distance < 0) { + return; + } + var intersection = direction + .clone() + .multiplyScalar(distance) + .add(render.perspective.position); + intersection.z = render.perspective.position.z + _this._relativeGroundAltitude; + var _e = _this._geoCoords + .enuToGeodetic(intersection.x, intersection.y, intersection.z, reference.lat, reference.lon, reference.alt), lat = _e[0], lon = _e[1]; + _this._markerScene.update(marker.id, intersection.toArray(), { lat: lat, lon: lon }); + _this._markerSet.update(marker); + var markerEvent = { marker: marker, target: _this, type: MarkerComponent.changed }; + _this.fire(MarkerComponent.changed, markerEvent); + }); }; MarkerComponent.prototype._deactivate = function () { - // release memory - this._disposeScene(); - this._disposable.unsubscribe(); + this._adjustHeightSubscription.unsubscribe(); + this._dragEventSubscription.unsubscribe(); + this._markersUpdatedSubscription.unsubscribe(); + this._mouseClaimSubscription.unsubscribe(); + this._referenceSubscription.unsubscribe(); + this._renderSubscription.unsubscribe(); + this._setChangedSubscription.unsubscribe(); + this._updateMarkerSubscription.unsubscribe(); + this._markerScene.clear(); }; MarkerComponent.prototype._getDefaultConfiguration = function () { - return {}; - }; - MarkerComponent.prototype.createMarker = function (latLonAlt, markerOptions) { - if (markerOptions.type === "marker") { - return new Component_1.SimpleMarker(latLonAlt, markerOptions); - } - return null; + return { visibleBBoxSize: 100 }; }; - MarkerComponent.prototype.addMarker = function (marker) { - this._markerSet.addMarker(marker); - }; - Object.defineProperty(MarkerComponent.prototype, "markers$", { + 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)); +exports.MarkerComponent = MarkerComponent; +Component_1.ComponentService.register(MarkerComponent); +exports.default = MarkerComponent; + +},{"../../Component":230,"../../Geo":233,"../../Graph":234,"../../Render":236,"rxjs/Observable":29,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"three":180,"when":227}],274:[function(require,module,exports){ +"use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); +var THREE = require("three"); +var MarkerScene = (function () { + function MarkerScene(scene, raycaster) { + this._needsRender = false; + this._interactiveObjects = []; + this._markers = {}; + this._objectMarkers = {}; + this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster(); + this._scene = !!scene ? scene : new THREE.Scene(); + } + Object.defineProperty(MarkerScene.prototype, "markers", { get: function () { - return this._markerSet.markers$; + return this._markers; }, enumerable: true, configurable: true }); - MarkerComponent.prototype.removeMarker = function (id) { - this._markerSet.removeMarker(id); - }; - MarkerComponent.prototype._renderHash = function (args) { - // determine if render is needed while updating scene - // specific properies. - var needsRender = this._updateScene(args); - // return render hash with render function and - // render in foreground. - return { - name: this._name, - render: { - frameId: args.frame.id, - needsRender: needsRender, - render: this._render.bind(this), - stage: Render_1.GLRenderStage.Foreground, - }, - }; - }; - MarkerComponent.prototype._updateScene = function (args) { - if (!args.frame || - !args.markers || - !args.frame.state.currentNode) { - return false; + Object.defineProperty(MarkerScene.prototype, "needsRender", { + get: function () { + return this._needsRender; + }, + enumerable: true, + configurable: true + }); + MarkerScene.prototype.add = function (marker, position) { + if (marker.id in this._markers) { + this._dispose(marker.id); + } + marker.createGeometry(position); + this._scene.add(marker.geometry); + this._markers[marker.id] = marker; + for (var _i = 0, _a = marker.getInteractiveObjects(); _i < _a.length; _i++) { + var interactiveObject = _a[_i]; + this._interactiveObjects.push(interactiveObject); + this._objectMarkers[interactiveObject.uuid] = marker.id; } - var needRender = false; - var oldObjects = this._markerObjects; - var node = args.frame.state.currentNode; - this._markerObjects = {}; - var boxWidth = 0.001; - var minLon = node.latLon.lon - boxWidth / 2; - var minLat = node.latLon.lat - boxWidth / 2; - var maxLon = node.latLon.lon + boxWidth / 2; - var maxLat = node.latLon.lat + boxWidth / 2; - var markers = _.map(args.markers.search({ maxX: maxLon, maxY: maxLat, minX: minLon, minY: minLat }), function (item) { - return item.marker; - }).filter(function (marker) { - return marker.visibleInKeys.length === 0 || _.contains(marker.visibleInKeys, node.key); - }); - for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) { - var marker = markers_1[_i]; - if (marker.id in oldObjects) { - this._markerObjects[marker.id] = oldObjects[marker.id]; - delete oldObjects[marker.id]; - } - else { - var reference = args.frame.state.reference; - var p = (new Geo_1.GeoCoords).geodeticToEnu(marker.latLonAlt.lat, marker.latLonAlt.lon, marker.latLonAlt.alt, reference.lat, reference.lon, reference.alt); - var o = marker.createGeometry(); - o.position.set(p[0], p[1], p[2]); - this._scene.add(o); - this._markerObjects[marker.id] = o; - needRender = true; + this._needsRender = true; + }; + MarkerScene.prototype.clear = function () { + for (var id in this._markers) { + if (!this._markers.hasOwnProperty) { + continue; } + this._dispose(id); } - for (var i in oldObjects) { - if (oldObjects.hasOwnProperty(i)) { - this._disposeObject(oldObjects[i]); - needRender = true; + this._needsRender = true; + }; + MarkerScene.prototype.get = function (id) { + return this._markers[id]; + }; + MarkerScene.prototype.getAll = function () { + var _this = this; + return Object + .keys(this._markers) + .map(function (id) { return _this._markers[id]; }); + }; + MarkerScene.prototype.has = function (id) { + return id in this._markers; + }; + MarkerScene.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._interactiveObjects); + for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) { + var intersect = intersects_1[_i]; + if (intersect.object.uuid in this._objectMarkers) { + return this._objectMarkers[intersect.object.uuid]; } } - return needRender; + return null; + }; + MarkerScene.prototype.lerpAltitude = function (id, alt, alpha) { + if (!(id in this._markers)) { + return; + } + this._markers[id].lerpAltitude(alt, alpha); + this._needsRender = true; + }; + MarkerScene.prototype.remove = function (id) { + if (!(id in this._markers)) { + return; + } + this._dispose(id); + this._needsRender = true; }; - MarkerComponent.prototype._render = function (perspectiveCamera, renderer) { + MarkerScene.prototype.render = function (perspectiveCamera, renderer) { renderer.render(this._scene, perspectiveCamera); + this._needsRender = false; }; - MarkerComponent.prototype._disposeObject = function (object) { - this._scene.remove(object); - for (var i = 0; i < object.children.length; ++i) { - var c = object.children[i]; - c.geometry.dispose(); - c.material.dispose(); + MarkerScene.prototype.update = function (id, position, latLon) { + if (!(id in this._markers)) { + return; } + var marker = this._markers[id]; + marker.updatePosition(position, latLon); + this._needsRender = true; }; - MarkerComponent.prototype._disposeScene = function () { - for (var i in this._markerObjects) { - if (this._markerObjects.hasOwnProperty(i)) { - this._disposeObject(this._markerObjects[i]); + MarkerScene.prototype._dispose = function (id) { + var marker = this._markers[id]; + this._scene.remove(marker.geometry); + for (var _i = 0, _a = marker.getInteractiveObjects(); _i < _a.length; _i++) { + var interactiveObject = _a[_i]; + var index = this._interactiveObjects.indexOf(interactiveObject); + if (index !== -1) { + this._interactiveObjects.splice(index, 1); } + else { + console.warn("Object does not exist (" + interactiveObject.id + ") for " + id); + } + delete this._objectMarkers[interactiveObject.uuid]; } - this._markerObjects = {}; + marker.disposeGeometry(); + delete this._markers[id]; }; - MarkerComponent.componentName = "marker"; - return MarkerComponent; -}(Component_1.Component)); -exports.MarkerComponent = MarkerComponent; -Component_1.ComponentService.register(MarkerComponent); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = MarkerComponent; + return MarkerScene; +}()); +exports.MarkerScene = MarkerScene; +exports.default = MarkerScene; -},{"../../Component":207,"../../Geo":210,"../../Render":213,"rbush":24,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/switchMap":73,"three":157,"underscore":158}],244:[function(require,module,exports){ +},{"three":180}],275:[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 THREE = require("three"); -var Component_1 = require("../../Component"); -var SimpleMarker = (function (_super) { - __extends(SimpleMarker, _super); - function SimpleMarker(latLonAlt, markerOptions) { - _super.call(this, latLonAlt, markerOptions); - this._circleToRayAngle = 2.0; - this._simpleMarkerStyle = markerOptions.style; - } - SimpleMarker.prototype.createGeometry = function () { - var radius = 2; - var cone = new THREE.Mesh(this._markerGeometry(radius, 16, 8), new THREE.MeshBasicMaterial({ - color: this._stringToRBG(this._simpleMarkerStyle.color), - depthWrite: false, - opacity: this._simpleMarkerStyle.opacity, - shading: THREE.SmoothShading, - transparent: true, - })); - var ball = new THREE.Mesh(new THREE.SphereGeometry(radius / 2, 16, 8), new THREE.MeshBasicMaterial({ - color: this._stringToRBG(this._simpleMarkerStyle.ballColor), - depthWrite: false, - opacity: this._simpleMarkerStyle.ballOpacity, +/// +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 () { + function MarkerSet() { + this._hash = {}; + this._index = rbush(16, [".lon", ".lat", ".lon", ".lat"]); + this._indexChanged$ = new Subject_1.Subject(); + this._updated$ = new Subject_1.Subject(); + } + Object.defineProperty(MarkerSet.prototype, "changed$", { + get: function () { + return this._indexChanged$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MarkerSet.prototype, "updated$", { + get: function () { + return this._updated$; + }, + enumerable: true, + configurable: true + }); + MarkerSet.prototype.add = function (markers) { + var updated = []; + var hash = this._hash; + var index = this._index; + for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) { + var marker = markers_1[_i]; + var id = marker.id; + if (id in hash) { + index.remove(hash[id]); + updated.push(marker); + } + var item = { + lat: marker.latLon.lat, + lon: marker.latLon.lon, + marker: marker, + }; + hash[id] = item; + index.insert(item); + } + if (updated.length > 0) { + this._updated$.next(updated); + } + if (markers.length > updated.length) { + this._indexChanged$.next(this); + } + }; + MarkerSet.prototype.has = function (id) { + return id in this._hash; + }; + MarkerSet.prototype.get = function (id) { + return this.has(id) ? this._hash[id].marker : undefined; + }; + MarkerSet.prototype.getAll = function () { + return this._index + .all() + .map(function (indexItem) { + return indexItem.marker; + }); + }; + MarkerSet.prototype.remove = function (ids) { + var hash = this._hash; + var index = this._index; + var changed = false; + for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) { + var id = ids_1[_i]; + if (!(id in hash)) { + continue; + } + var item = hash[id]; + index.remove(item); + delete hash[id]; + changed = true; + } + if (changed) { + this._indexChanged$.next(this); + } + }; + MarkerSet.prototype.removeAll = function () { + this._hash = {}; + this._index.clear(); + this._indexChanged$.next(this); + }; + MarkerSet.prototype.search = function (_a) { + var sw = _a[0], ne = _a[1]; + return this._index + .search({ maxX: ne.lon, maxY: ne.lat, minX: sw.lon, minY: sw.lat }) + .map(function (indexItem) { + return indexItem.marker; + }); + }; + MarkerSet.prototype.update = function (marker) { + var hash = this._hash; + var index = this._index; + var id = marker.id; + if (!(id in hash)) { + return; + } + index.remove(hash[id]); + var item = { + lat: marker.latLon.lat, + lon: marker.latLon.lon, + marker: marker, + }; + hash[id] = item; + index.insert(item); + }; + return MarkerSet; +}()); +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":74}],276:[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 Component_1 = require("../../../Component"); +/** + * @class CircleMarker + * + * @classdesc Non-interactive marker with a flat circle shape. The circle + * marker can not be configured to be interactive. + * + * Circle marker properties can not be updated after creation. + * + * To create and add one `CircleMarker` with default configuration + * and one with configuration use + * + * @example + * ``` + * var defaultMarker = new Mapillary.MarkerComponent.CircleMarker( + * "id-1", + * { lat: 0, lon: 0, }); + * + * var configuredMarker = new Mapillary.MarkerComponent.CircleMarker( + * "id-2", + * { lat: 0, lon: 0, }, + * { + * color: "#0Ff", + * opacity: 0.3, + * radius: 0.7, + * }); + * + * markerComponent.add([defaultMarker, configuredMarker]); + * ``` + */ +var CircleMarker = (function (_super) { + __extends(CircleMarker, _super); + function CircleMarker(id, latLon, options) { + var _this = _super.call(this, id, latLon) || this; + options = !!options ? options : {}; + _this._color = options.color != null ? options.color : 0xffffff; + _this._opacity = options.opacity != null ? options.opacity : 0.4; + _this._radius = options.radius != null ? options.radius : 1; + return _this; + } + CircleMarker.prototype._createGeometry = function (position) { + var circle = new THREE.Mesh(new THREE.CircleGeometry(this._radius, 16), new THREE.MeshBasicMaterial({ + color: this._color, + opacity: this._opacity, + transparent: true, + })); + circle.up.fromArray([0, 0, 1]); + circle.renderOrder = -1; + var group = new THREE.Object3D(); + group.add(circle); + group.position.fromArray(position); + this._geometry = group; + }; + CircleMarker.prototype._disposeGeometry = function () { + for (var _i = 0, _a = this._geometry.children; _i < _a.length; _i++) { + var mesh = _a[_i]; + mesh.geometry.dispose(); + mesh.material.dispose(); + } + }; + CircleMarker.prototype._getInteractiveObjects = function () { + return []; + }; + return CircleMarker; +}(Component_1.Marker)); +exports.CircleMarker = CircleMarker; +exports.default = CircleMarker; + +},{"../../../Component":230,"three":180}],277:[function(require,module,exports){ +"use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * @class Marker + * + * @classdesc Represents an abstract marker class that should be extended + * by marker implementations used in the marker component. + */ +var Marker = (function () { + function Marker(id, latLon) { + this._id = id; + this._latLon = latLon; + } + Object.defineProperty(Marker.prototype, "id", { + /** + * Get id. + * @returns {string} The id of the marker. + */ + get: function () { + return this._id; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Marker.prototype, "geometry", { + get: function () { + return this._geometry; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Marker.prototype, "latLon", { + /** + * Get lat lon. + * @returns {ILatLon} The geographic coordinates of the marker. + */ + get: function () { + return this._latLon; + }, + enumerable: true, + configurable: true + }); + Marker.prototype.createGeometry = function (position) { + if (!!this._geometry) { + return; + } + this._createGeometry(position); + // update matrix world if raycasting occurs before first render + this._geometry.updateMatrixWorld(true); + }; + Marker.prototype.disposeGeometry = function () { + if (!this._geometry) { + return; + } + this._disposeGeometry(); + this._geometry = undefined; + }; + Marker.prototype.getInteractiveObjects = function () { + if (!this._geometry) { + return []; + } + return this._getInteractiveObjects(); + }; + Marker.prototype.lerpAltitude = function (alt, alpha) { + if (!this._geometry) { + return; + } + this._geometry.position.z = (1 - alpha) * this._geometry.position.z + alpha * alt; + }; + Marker.prototype.updatePosition = function (position, latLon) { + if (!!latLon) { + this._latLon.lat = latLon.lat; + this._latLon.lon = latLon.lon; + } + if (!this._geometry) { + return; + } + this._geometry.position.fromArray(position); + this._geometry.updateMatrixWorld(true); + }; + return Marker; +}()); +exports.Marker = Marker; +exports.default = Marker; + +},{}],278:[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 Component_1 = require("../../../Component"); +/** + * @class SimpleMarker + * + * @classdesc Interactive marker with ice cream shape. The sphere + * inside the ice cream can be configured to be interactive. + * + * Simple marker properties can not be updated after creation. + * + * To create and add one `SimpleMarker` with default configuration + * (non-interactive) and one interactive with configuration use + * + * @example + * ``` + * var defaultMarker = new Mapillary.MarkerComponent.SimpleMarker( + * "id-1", + * { lat: 0, lon: 0, }); + * + * var interactiveMarker = new Mapillary.MarkerComponent.SimpleMarker( + * "id-2", + * { lat: 0, lon: 0, }, + * { + * ballColor: "#00f", + * ballOpacity: 0.5, + * color: "#00f", + * interactive: true, + * opacity: 0.3, + * radius: 0.7, + * }); + * + * markerComponent.add([defaultMarker, interactiveMarker]); + * ``` + */ +var SimpleMarker = (function (_super) { + __extends(SimpleMarker, _super); + function SimpleMarker(id, latLon, options) { + var _this = _super.call(this, id, latLon) || this; + options = !!options ? options : {}; + _this._ballColor = options.ballColor != null ? options.ballColor : 0xff0000; + _this._ballOpacity = options.ballOpacity != null ? options.ballOpacity : 0.8; + _this._circleToRayAngle = 2; + _this._color = options.color != null ? options.color : 0xff0000; + _this._interactive = !!options.interactive; + _this._opacity = options.opacity != null ? options.opacity : 0.4; + _this._radius = options.radius != null ? options.radius : 1; + return _this; + } + SimpleMarker.prototype._createGeometry = function (position) { + var radius = this._radius; + 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, })); @@ -22110,7 +25594,18 @@ var SimpleMarker = (function (_super) { var group = new THREE.Object3D(); group.add(ball); group.add(cone); - return group; + group.position.fromArray(position); + this._geometry = group; + }; + SimpleMarker.prototype._disposeGeometry = function () { + for (var _i = 0, _a = this._geometry.children; _i < _a.length; _i++) { + var mesh = _a[_i]; + mesh.geometry.dispose(); + mesh.material.dispose(); + } + }; + SimpleMarker.prototype._getInteractiveObjects = function () { + return this._interactive ? [this._geometry.children[0]] : []; }; SimpleMarker.prototype._markerHeight = function (radius) { var t = Math.tan(Math.PI - this._circleToRayAngle); @@ -22162,107 +25657,1528 @@ var SimpleMarker = (function (_super) { geometry.boundingSphere = new THREE.Sphere(new THREE.Vector3(), radius + height); return geometry; }; - SimpleMarker.prototype._stringToRBG = function (str) { - var ret = 0; - for (var i = 0; i < str.length; i++) { - ret = str.charCodeAt(i) + ((ret << 5) - ret); - } - return ret; - }; return SimpleMarker; }(Component_1.Marker)); exports.SimpleMarker = SimpleMarker; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = SimpleMarker; -},{"../../Component":207,"three":157}],245:[function(require,module,exports){ -/// +},{"../../../Component":230,"three":180}],279:[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 __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"); -require("rxjs/add/observable/combineLatest"); -require("rxjs/add/observable/of"); -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"); /** - * @class SequenceComponent - * @classdesc Component showing navigation arrows for sequence directions - * as well as playing button. Exposes an API to start and stop play. + * The `BounceHandler` ensures that the viewer bounces back to the image + * when drag panning outside of the image edge. */ -var SequenceComponent = (function (_super) { - __extends(SequenceComponent, _super); - function SequenceComponent(name, container, navigator) { - _super.call(this, name, container, navigator); - 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$; +var BounceHandler = (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]; }) - .publishReplay(1) - .refCount(); - } - 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 }); + .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]); + }); }; - /** - * Stop playing. - * - * @fires PlayerComponent#playingchanged - */ - SequenceComponent.prototype.stop = function () { - this.configure({ playing: false }); + BounceHandler.prototype._disable = function () { + this._bounceSubscription.unsubscribe(); }; - /** - * 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 }); + BounceHandler.prototype._getConfiguration = function (enable) { + return {}; + }; + return BounceHandler; +}(Component_1.HandlerBase)); +exports.BounceHandler = BounceHandler; +exports.default = BounceHandler; + +},{"../../Component":230,"rxjs/Observable":29}],280:[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 `DoubleClickZoomHandler` allows the user to zoom the viewer photo at a point by double clicking. + * + * @example + * ``` + * var mouseComponent = viewer.getComponent("mouse"); + * + * mouseComponent.doubleClickZoom.disable(); + * mouseComponent.doubleClickZoom.enable(); + * + * var isEnabled = mouseComponent.doubleClickZoom.isEnabled; + * ``` + */ +var DoubleClickZoomHandler = (function (_super) { + __extends(DoubleClickZoomHandler, _super); + 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; + this._zoomSubscription = Observable_1.Observable + .merge(this._container.mouseService + .filtered$(this._component.name, this._container.mouseService.dblClick$), this._container.touchService.doubleTap$ + .map(function (e) { + var touch = e.touches[0]; + return { clientX: touch.clientX, clientY: touch.clientY, shiftKey: e.shiftKey }; + })) + .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$) + .subscribe(function (_a) { + var event = _a[0], render = _a[1], transform = _a[2]; + var element = _this._container.element; + var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1]; + var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective); + var reference = transform.projectBasic(unprojected.toArray()); + var delta = !!event.shiftKey ? -1 : 1; + _this._navigator.stateService.zoomIn(delta, reference); + }); + }; + DoubleClickZoomHandler.prototype._disable = function () { + this._zoomSubscription.unsubscribe(); + }; + DoubleClickZoomHandler.prototype._getConfiguration = function (enable) { + return { doubleClickZoom: enable }; + }; + return DoubleClickZoomHandler; +}(Component_1.HandlerBase)); +exports.DoubleClickZoomHandler = DoubleClickZoomHandler; +exports.default = DoubleClickZoomHandler; + +},{"../../Component":230,"rxjs/Observable":29}],281:[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 Observable_1 = require("rxjs/Observable"); +require("rxjs/add/operator/concat"); +require("rxjs/add/operator/sample"); +require("rxjs/add/operator/takeWhile"); +var Component_1 = require("../../Component"); +/** + * The `DragPanHandler` allows the user to pan the viewer photo by clicking and dragging the cursor. + * + * @example + * ``` + * var mouseComponent = viewer.getComponent("mouse"); + * + * mouseComponent.dragPan.disable(); + * mouseComponent.dragPan.enable(); + * + * var isEnabled = mouseComponent.dragPan.isEnabled; + * ``` + */ +var DragPanHandler = (function (_super) { + __extends(DragPanHandler, _super); + function DragPanHandler(component, container, navigator, viewportCoords, spatial) { + 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; + } + DragPanHandler.prototype._enable = function () { + var _this = this; + var draggingStarted$ = this._container.mouseService + .filtered$(this._component.name, this._container.mouseService.mouseDragStart$) + .map(function (event) { + return true; + }); + var draggingStopped$ = this._container.mouseService + .filtered$(this._component.name, this._container.mouseService.mouseDragEnd$) + .map(function (event) { + return false; + }); + this._activeMouseSubscription = Observable_1.Observable + .merge(draggingStarted$, draggingStopped$) + .subscribe(this._container.mouseService.activate$); + this._preventDefaultSubscription = Observable_1.Observable + .merge(draggingStarted$, draggingStopped$) + .switchMap(function (dragging) { + return dragging ? + _this._container.mouseService.documentMouseMove$ : + Observable_1.Observable.empty(); + }) + .merge(this._container.touchService.touchMove$) + .subscribe(function (event) { + event.preventDefault(); // prevent selection of content outside the viewer + }); + var touchMovingStarted$ = this._container.touchService.singleTouchDragStart$ + .map(function (event) { + return true; + }); + var touchMovingStopped$ = this._container.touchService.singleTouchDragEnd$ + .map(function (event) { + return false; + }); + this._activeTouchSubscription = Observable_1.Observable + .merge(touchMovingStarted$, touchMovingStopped$) + .subscribe(this._container.touchService.activate$); + var basicRotation$ = this._navigator.stateService.currentState$ + .map(function (frame) { + return frame.state.currentNode.fullPano || frame.state.nodesAhead < 1; + }) + .distinctUntilChanged() + .switchMap(function (enable) { + if (!enable) { + return Observable_1.Observable.empty(); + } + 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; + }); + var singleTouchDrag$ = Observable_1.Observable + .merge(_this._container.touchService.singleTouchDragStart$, _this._container.touchService.singleTouchDrag$, _this._container.touchService.singleTouchDragEnd$.map(function (t) { return null; })) + .map(function (event) { + return event != null && event.touches.length > 0 ? + event.touches[0] : null; + }) + .pairwise() + .filter(function (pair) { + return pair[0] != null && pair[1] != null; + }); + return Observable_1.Observable + .merge(mouseDrag$, singleTouchDrag$); + }) + .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, this._navigator.stateService.currentCamera$) + .map(function (_a) { + var events = _a[0], render = _a[1], transform = _a[2], c = _a[3]; + var camera = c.clone(); + var previousEvent = events[0]; + var event = events[1]; + var movementX = event.clientX - previousEvent.clientX; + var movementY = event.clientY - previousEvent.clientY; + var element = _this._container.element; + var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1]; + var currentDirection = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective) + .sub(render.perspective.position); + var directionX = _this._viewportCoords.unprojectFromCanvas(canvasX - movementX, canvasY, element, render.perspective) + .sub(render.perspective.position); + var directionY = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY - movementY, element, render.perspective) + .sub(render.perspective.position); + var deltaPhi = (movementX > 0 ? 1 : -1) * directionX.angleTo(currentDirection); + var deltaTheta = (movementY > 0 ? -1 : 1) * directionY.angleTo(currentDirection); + var upQuaternion = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1)); + var upQuaternionInverse = upQuaternion.clone().inverse(); + var offset = new THREE.Vector3(); + offset.copy(camera.lookat).sub(camera.position); + offset.applyQuaternion(upQuaternion); + var length = offset.length(); + var phi = Math.atan2(offset.y, offset.x); + phi += deltaPhi; + var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z); + theta += deltaTheta; + theta = Math.max(0.01, Math.min(Math.PI - 0.01, theta)); + offset.x = Math.sin(theta) * Math.cos(phi); + offset.y = Math.sin(theta) * Math.sin(phi); + offset.z = Math.cos(theta); + offset.applyQuaternion(upQuaternionInverse); + var lookat = new THREE.Vector3().copy(camera.position).add(offset.multiplyScalar(length)); + var basic = transform.projectBasic(lookat.toArray()); + var original = transform.projectBasic(camera.lookat.toArray()); + var x = basic[0] - original[0]; + var y = basic[1] - original[1]; + if (Math.abs(x) > 1) { + x = 0; + } + else if (x > 0.5) { + x = x - 1; + } + else if (x < -0.5) { + x = x + 1; + } + var rotationThreshold = _this._basicRotationThreshold; + x = _this._spatial.clamp(x, -rotationThreshold, rotationThreshold); + y = _this._spatial.clamp(y, -rotationThreshold, rotationThreshold); + if (transform.fullPano) { + return [x, y]; + } + var pixelDistances = _this._viewportCoords.getPixelDistances(_this._container.element, transform, render.perspective); + var coeff = _this._forceCoeff; + if (pixelDistances[0] > 0 && y < 0 && basic[1] < 0.5) { + y /= Math.max(1, coeff * pixelDistances[0]); + } + if (pixelDistances[1] > 0 && x > 0 && basic[0] > 0.5) { + x /= Math.max(1, coeff * pixelDistances[1]); + } + if (pixelDistances[2] > 0 && y > 0 && basic[1] > 0.5) { + y /= Math.max(1, coeff * pixelDistances[2]); + } + if (pixelDistances[3] > 0 && x < 0 && basic[0] < 0.5) { + 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); + }); + }; + DragPanHandler.prototype._disable = function () { + this._activeMouseSubscription.unsubscribe(); + 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.HandlerBase)); +exports.DragPanHandler = DragPanHandler; +exports.default = DragPanHandler; + +},{"../../Component":230,"rxjs/Observable":29,"rxjs/add/operator/concat":54,"rxjs/add/operator/sample":73,"rxjs/add/operator/takeWhile":83,"three":180}],282:[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 }); +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. + */ +var MouseComponent = (function (_super) { + __extends(MouseComponent, _super); + function MouseComponent(name, container, navigator) { + var _this = _super.call(this, name, container, navigator) || this; + 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); + _this._touchZoomHandler = new Component_1.TouchZoomHandler(_this, container, navigator, viewportCoords); + return _this; + } + Object.defineProperty(MouseComponent.prototype, "doubleClickZoom", { + /** + * Get double click zoom. + * + * @returns {DoubleClickZoomHandler} The double click zoom handler. + */ + get: function () { + return this._doubleClickZoomHandler; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseComponent.prototype, "dragPan", { + /** + * Get drag pan. + * + * @returns {DragPanHandler} The drag pan handler. + */ + get: function () { + return this._dragPanHandler; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseComponent.prototype, "scrollZoom", { + /** + * Get scroll zoom. + * + * @returns {ScrollZoomHandler} The scroll zoom handler. + */ + get: function () { + return this._scrollZoomHandler; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseComponent.prototype, "touchZoom", { + /** + * Get touch zoom. + * + * @returns {TouchZoomHandler} The touch zoom handler. + */ + get: function () { + return this._touchZoomHandler; + }, + enumerable: true, + configurable: true + }); + MouseComponent.prototype._activate = function () { + var _this = this; + this._bounceHandler.enable(); + this._configurationSubscription = this._configuration$ + .subscribe(function (configuration) { + if (configuration.doubleClickZoom) { + _this._doubleClickZoomHandler.enable(); + } + else { + _this._doubleClickZoomHandler.disable(); + } + if (configuration.dragPan) { + _this._dragPanHandler.enable(); + } + else { + _this._dragPanHandler.disable(); + } + if (configuration.scrollZoom) { + _this._scrollZoomHandler.enable(); + } + else { + _this._scrollZoomHandler.disable(); + } + if (configuration.touchZoom) { + _this._touchZoomHandler.enable(); + } + else { + _this._touchZoomHandler.disable(); + } + }); + this._container.mouseService.claimMouse(this._name, 0); + }; + MouseComponent.prototype._deactivate = function () { + this._container.mouseService.unclaimMouse(this._name); + 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 }; + }; + /** @inheritdoc */ + MouseComponent.componentName = "mouse"; + return MouseComponent; +}(Component_1.Component)); +exports.MouseComponent = MouseComponent; +Component_1.ComponentService.register(MouseComponent); +exports.default = MouseComponent; + +},{"../../Component":230,"../../Geo":233,"rxjs/add/observable/merge":44,"rxjs/add/operator/filter":61,"rxjs/add/operator/map":65,"rxjs/add/operator/withLatestFrom":85}],283:[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"); +/** + * The `ScrollZoomHandler` allows the user to zoom the viewer photo by scrolling. + * + * @example + * ``` + * var mouseComponent = viewer.getComponent("mouse"); + * + * mouseComponent.scrollZoom.disable(); + * mouseComponent.scrollZoom.enable(); + * + * var isEnabled = mouseComponent.scrollZoom.isEnabled; + * ``` + */ +var ScrollZoomHandler = (function (_super) { + __extends(ScrollZoomHandler, _super); + 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 + .filteredWheel$(this._component.name, this._container.mouseService.mouseWheel$) + .withLatestFrom(this._navigator.stateService.currentState$, function (w, f) { + return [w, f]; + }) + .filter(function (args) { + var state = args[1].state; + return state.currentNode.fullPano || state.nodesAhead < 1; + }) + .map(function (args) { + return args[0]; + }) + .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, function (w, r, t) { + return [w, r, t]; + }) + .subscribe(function (args) { + var event = args[0]; + var render = args[1]; + var transform = args[2]; + var element = _this._container.element; + var _a = _this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1]; + var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective); + var reference = transform.projectBasic(unprojected.toArray()); + var deltaY = event.deltaY; + if (event.deltaMode === 1) { + deltaY = 40 * deltaY; + } + else if (event.deltaMode === 2) { + deltaY = 800 * deltaY; + } + var canvasSize = _this._viewportCoords.containerToCanvas(element); + var zoom = -3 * deltaY / canvasSize[1]; + _this._navigator.stateService.zoomIn(zoom, reference); + }); + }; + ScrollZoomHandler.prototype._disable = function () { + this._container.mouseService.unclaimWheel(this._component.name); + this._preventDefaultSubscription.unsubscribe(); + this._zoomSubscription.unsubscribe(); + this._preventDefaultSubscription = null; + this._zoomSubscription = null; + }; + ScrollZoomHandler.prototype._getConfiguration = function (enable) { + return { scrollZoom: enable }; + }; + return ScrollZoomHandler; +}(Component_1.HandlerBase)); +exports.ScrollZoomHandler = ScrollZoomHandler; +exports.default = ScrollZoomHandler; + +},{"../../Component":230}],284:[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 `TouchZoomHandler` allows the user to zoom the viewer photo by pinching on a touchscreen. + * + * @example + * ``` + * var mouseComponent = viewer.getComponent("mouse"); + * + * mouseComponent.touchZoom.disable(); + * mouseComponent.touchZoom.enable(); + * + * var isEnabled = mouseComponent.touchZoom.isEnabled; + * ``` + */ +var TouchZoomHandler = (function (_super) { + __extends(TouchZoomHandler, _super); + 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; + this._preventDefaultSubscription = this._container.touchService.pinch$ + .subscribe(function (pinch) { + pinch.originalEvent.preventDefault(); + }); + var pinchStarted$ = this._container.touchService.pinchStart$ + .map(function (event) { + return true; + }); + var pinchStopped$ = this._container.touchService.pinchEnd$ + .map(function (event) { + return false; + }); + this._activeSubscription = Observable_1.Observable + .merge(pinchStarted$, pinchStopped$) + .subscribe(this._container.touchService.activate$); + this._zoomSubscription = this._container.touchService.pinch$ + .withLatestFrom(this._navigator.stateService.currentState$) + .filter(function (args) { + var state = args[1].state; + return state.currentNode.fullPano || state.nodesAhead < 1; + }) + .map(function (args) { + return args[0]; + }) + .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$) + .subscribe(function (_a) { + var pinch = _a[0], render = _a[1], transform = _a[2]; + var element = _this._container.element; + var _b = _this._viewportCoords.canvasPosition(pinch, element), canvasX = _b[0], canvasY = _b[1]; + var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective); + var reference = transform.projectBasic(unprojected.toArray()); + var _c = _this._viewportCoords.containerToCanvas(element), canvasWidth = _c[0], canvasHeight = _c[1]; + var zoom = 3 * pinch.distanceChange / Math.min(canvasWidth, canvasHeight); + _this._navigator.stateService.zoomIn(zoom, reference); + }); + }; + TouchZoomHandler.prototype._disable = function () { + this._activeSubscription.unsubscribe(); + this._preventDefaultSubscription.unsubscribe(); + this._zoomSubscription.unsubscribe(); + this._preventDefaultSubscription = null; + this._zoomSubscription = null; + }; + TouchZoomHandler.prototype._getConfiguration = function (enable) { + return { touchZoom: enable }; + }; + return TouchZoomHandler; +}(Component_1.HandlerBase)); +exports.TouchZoomHandler = TouchZoomHandler; +exports.default = TouchZoomHandler; + +},{"../../Component":230,"rxjs/Observable":29}],285:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Popup_1 = require("./popup/Popup"); +exports.Popup = Popup_1.Popup; +var PopupComponent_1 = require("./PopupComponent"); +exports.PopupComponent = PopupComponent_1.PopupComponent; + +},{"./PopupComponent":286,"./popup/Popup":287}],286:[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 Utils_1 = require("../../Utils"); +/** + * @class PopupComponent + * + * @classdesc Component for showing HTML popup objects. + * + * The `add` method is used for adding new popups. Popups are removed by reference. + * + * It is not possible to update popups in the set by updating any properties + * directly on the popup object. Popups need to be replaced by + * removing them and creating new ones with relevant changed properties and + * adding those instead. + * + * Popups are only relevant to a single image because they are based on + * 2D basic image coordinates. Popups related to a certain image should + * be removed when the viewer is moved to another node. + * + * To retrive and use the popup component + * + * @example + * ``` + * var viewer = new Mapillary.Viewer( + * "", + * "", + * "", + * { component: { popup: true } }); + * + * var popupComponent = viewer.getComponent("popup"); + * ``` + */ +var PopupComponent = (function (_super) { + __extends(PopupComponent, _super); + 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(); + return _this; + } + /** + * Add popups to the popups set. + * + * @description Adding a new popup never replaces an old one + * because they are stored by reference. Adding an already + * existing popup has no effect. + * + * @param {Array} popups - Popups to add. + * + * @example ```popupComponent.add([popup1, popup2]);``` + */ + PopupComponent.prototype.add = function (popups) { + for (var _i = 0, popups_1 = popups; _i < popups_1.length; _i++) { + var popup = popups_1[_i]; + if (this._popups.indexOf(popup) !== -1) { + continue; + } + this._popups.push(popup); + if (this._activated) { + popup.setParentContainer(this._popupContainer); + } + } + this._added$.next(popups); + this._popups$.next(this._popups); + }; + /** + * Returns an array of all popups. + * + * @example ```var popups = popupComponent.getAll();``` + */ + PopupComponent.prototype.getAll = function () { + return this._popups.slice(); + }; + /** + * Remove popups based on reference from the popup set. + * + * @param {Array} popups - Popups to remove. + * + * @example ```popupComponent.remove([popup1, popup2]);``` + */ + PopupComponent.prototype.remove = function (popups) { + for (var _i = 0, popups_2 = popups; _i < popups_2.length; _i++) { + var popup = popups_2[_i]; + this._remove(popup); + } + this._popups$.next(this._popups); + }; + /** + * Remove all popups from the popup set. + * + * @example ```popupComponent.removeAll();``` + */ + PopupComponent.prototype.removeAll = function () { + for (var _i = 0, _a = this._popups.slice(); _i < _a.length; _i++) { + var popup = _a[_i]; + this._remove(popup); + } + this._popups$.next(this._popups); + }; + PopupComponent.prototype._activate = function () { + var _this = this; + 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); + } + this._updateAllSubscription = Observable_1.Observable + .combineLatest(this._container.renderService.renderCamera$, this._container.renderService.size$, this._navigator.stateService.currentTransform$) + .subscribe(function (_a) { + var renderCamera = _a[0], size = _a[1], transform = _a[2]; + for (var _i = 0, _b = _this._popups; _i < _b.length; _i++) { + var popup = _b[_i]; + popup.update(renderCamera, size, transform); + } + }); + var changed$ = this._popups$ + .startWith(this._popups) + .switchMap(function (popups) { + return Observable_1.Observable + .from(popups) + .mergeMap(function (popup) { + return popup.changed$; + }); + }) + .map(function (popup) { + return [popup]; + }); + this._updateAddedChangedSubscription = this._added$ + .merge(changed$) + .withLatestFrom(this._container.renderService.renderCamera$, this._container.renderService.size$, this._navigator.stateService.currentTransform$) + .subscribe(function (_a) { + var popups = _a[0], renderCamera = _a[1], size = _a[2], transform = _a[3]; + for (var _i = 0, popups_3 = popups; _i < popups_3.length; _i++) { + var popup = popups_3[_i]; + popup.update(renderCamera, size, transform); + } + }); + }; + PopupComponent.prototype._deactivate = function () { + this._updateAllSubscription.unsubscribe(); + this._updateAddedChangedSubscription.unsubscribe(); + for (var _i = 0, _a = this._popups; _i < _a.length; _i++) { + var popup = _a[_i]; + popup.remove(); + } + this._container.element.removeChild(this._popupContainer); + delete this._popupContainer; + }; + PopupComponent.prototype._getDefaultConfiguration = function () { + return {}; + }; + PopupComponent.prototype._remove = function (popup) { + var index = this._popups.indexOf(popup); + if (index === -1) { + return; + } + var removed = this._popups.splice(index, 1)[0]; + if (this._activated) { + removed.remove(); + } + }; + PopupComponent.componentName = "popup"; + return PopupComponent; +}(Component_1.Component)); +exports.PopupComponent = PopupComponent; +Component_1.ComponentService.register(PopupComponent); +exports.default = PopupComponent; + +},{"../../Component":230,"../../Utils":240,"rxjs/Observable":29,"rxjs/Subject":34}],287:[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 + * + * @classdesc Popup instance for rendering custom HTML content + * on top of images. Popups are based on 2D basic image coordinates + * (see the {@link Viewer} class documentation for more information about coordinate + * systems) and a certain popup is therefore only relevant to a single image. + * Popups related to a certain image should be removed when moving + * to another image. + * + * A popup must have both its content and its point or rect set to be + * rendered. Popup options can not be updated after creation but the + * basic point or rect as well as its content can be changed by calling + * the appropriate methods. + * + * To create and add one `Popup` with default configuration + * (tooltip visuals and automatic float) and one with specific options + * use + * + * @example + * ``` + * var defaultSpan = document.createElement('span'); + * defaultSpan.innerHTML = 'hello default'; + * + * var defaultPopup = new Mapillary.PopupComponent.Popup(); + * defaultPopup.setDOMContent(defaultSpan); + * defaultPopup.setBasicPoint([0.3, 0.3]); + * + * var cleanSpan = document.createElement('span'); + * cleanSpan.innerHTML = 'hello clean'; + * + * var cleanPopup = new Mapillary.PopupComponent.Popup({ + * clean: true, + * float: Mapillary.Alignment.Top, + * offset: 10, + * opacity: 0.7, + * }); + * + * cleanPopup.setDOMContent(cleanSpan); + * cleanPopup.setBasicPoint([0.6, 0.6]); + * + * popupComponent.add([defaultPopup, cleanPopup]); + * ``` + * + * @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, 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(); + } + Object.defineProperty(Popup.prototype, "changed$", { + /** + * @ignore + * + * @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); + 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 classList_1 = this._container.classList; + 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_1.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%)", + }; + var classList = this._container.classList; + 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 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 staticCoeff = appliedPosition != null && appliedPosition === automaticPosition ? 1 : 0.7; + var floats = this._pixelToFloats(offsetedPosition, size, width / staticCoeff, height / (2 * staticCoeff)); + 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 = staticCoeff * visibleX * visibleY; + if (visibleArea > largestVisibleArea[0]) { + largestVisibleArea[0] = visibleArea; + largestVisibleArea[1] = pointPixel; + largestVisibleArea[2] = automaticPosition; + } + } + if (largestVisibleArea[0] > 0) { + return [largestVisibleArea[1], largestVisibleArea[2]]; + } + } + 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 : "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) { + 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]]; + } + }; + return Popup; +}()); +exports.Popup = Popup; +exports.default = Popup; + +},{"../../../Geo":233,"../../../Utils":240,"../../../Viewer":241,"rxjs/Subject":34}],288:[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"); +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"); +/** + * @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 = (function (_super) { + __extends(SequenceComponent, _super); + function SequenceComponent(name, container, navigator) { + 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$; + }) + .publishReplay(1) + .refCount(); + 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. @@ -22358,7 +27274,7 @@ var SequenceComponent = (function (_super) { _this._stop(); } }) - .subscribe(); + .subscribe(function () { }); this._configuration$ .map(function (newConfiguration) { return function (configuration) { @@ -22490,11 +27406,18 @@ var SequenceComponent = (function (_super) { console.error(error); _this.stop(); }); + this._clearSubscription = this._navigator.stateService.currentNode$ + .bufferCount(1, 7) + .subscribe(function (nodes) { + _this._navigator.stateService.clearPriorNodes(); + }); 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); }; /** @inheritdoc */ @@ -22510,11 +27433,11 @@ var SequenceComponent = (function (_super) { }(Component_1.Component)); exports.SequenceComponent = SequenceComponent; Component_1.ComponentService.register(SequenceComponent); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = SequenceComponent; -},{"../../Component":207,"../../Edge":208,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/observable/of":44,"rxjs/add/operator/concat":50,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/filter":56,"rxjs/add/operator/finally":57,"rxjs/add/operator/first":58,"rxjs/add/operator/map":60,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/share":69,"rxjs/add/operator/switchMap":73,"rxjs/add/operator/takeUntil":75,"rxjs/add/operator/withLatestFrom":76}],246:[function(require,module,exports){ +},{"../../Component":230,"../../Edge":231,"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":74,"rxjs/add/operator/share":75,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/takeUntil":82,"rxjs/add/operator/withLatestFrom":85}],289:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var Subject_1 = require("rxjs/Subject"); var SequenceDOMInteraction = (function () { function SequenceDOMInteraction() { @@ -22538,12 +27461,12 @@ var SequenceDOMInteraction = (function () { return SequenceDOMInteraction; }()); exports.SequenceDOMInteraction = SequenceDOMInteraction; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = SequenceDOMInteraction; -},{"rxjs/Subject":33}],247:[function(require,module,exports){ -/// +},{"rxjs/Subject":34}],290:[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 () { @@ -22571,6 +27494,7 @@ var SequenceDOMRenderer = (function () { 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])); @@ -22654,11 +27578,11 @@ var SequenceDOMRenderer = (function () { return SequenceDOMRenderer; }()); exports.SequenceDOMRenderer = SequenceDOMRenderer; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = SequenceDOMRenderer; -},{"../../Edge":208,"virtual-dom":163}],248:[function(require,module,exports){ +},{"../../Edge":231,"virtual-dom":186}],291:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var GeometryTagError_1 = require("./error/GeometryTagError"); exports.GeometryTagError = GeometryTagError_1.GeometryTagError; var PointGeometry_1 = require("./geometry/PointGeometry"); @@ -22671,22 +27595,27 @@ var OutlineTag_1 = require("./tag/OutlineTag"); exports.OutlineTag = OutlineTag_1.OutlineTag; var SpotTag_1 = require("./tag/SpotTag"); exports.SpotTag = SpotTag_1.SpotTag; -var Alignment_1 = require("./tag/Alignment"); -exports.Alignment = Alignment_1.Alignment; var TagComponent_1 = require("./TagComponent"); exports.TagComponent = TagComponent_1.TagComponent; +var TagMode_1 = require("./TagMode"); +exports.TagMode = TagMode_1.TagMode; -},{"./TagComponent":249,"./error/GeometryTagError":255,"./geometry/PointGeometry":257,"./geometry/PolygonGeometry":258,"./geometry/RectGeometry":259,"./tag/Alignment":261,"./tag/OutlineTag":264,"./tag/SpotTag":267}],249:[function(require,module,exports){ -/// +},{"./TagComponent":292,"./TagMode":295,"./error/GeometryTagError":299,"./geometry/PointGeometry":301,"./geometry/PolygonGeometry":302,"./geometry/RectGeometry":303,"./tag/OutlineTag":315,"./tag/SpotTag":318}],292:[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 THREE = require("three"); +/// +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 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"); @@ -22711,68 +27640,93 @@ 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"); /** * @class TagComponent - * @classdesc Component for showing and editing tags with different geometries. + * + * @classdesc Component for showing and editing tags with different + * geometries composed from 2D basic image coordinates (see the + * {@link Viewer} class documentation for more information about coordinate + * systems). + * + * The `add` method is used for adding new tags or replacing + * tags already in the set. Tags are removed by id. + * + * If a tag already in the set has the same + * id as one of the tags added, the old tag will be removed and + * the added tag will take its place. + * + * The tag component mode can be set to either be non interactive or + * to be in creating mode of a certain geometry type. + * + * The tag properties can be updated at any time and the change will + * be visibile immediately. + * + * Tags are only relevant to a single image because they are based on + * 2D basic image coordinates. Tags related to a certain image should + * be removed when the viewer is moved to another node. + * + * To retrive and use the tag component + * + * @example + * ``` + * var viewer = new Mapillary.Viewer( + * "", + * "", + * "", + * { component: { tag: true } }); + * + * var tagComponent = viewer.getComponent("tag"); + * ``` */ var TagComponent = (function (_super) { __extends(TagComponent, _super); function TagComponent(name, container, navigator) { - var _this = this; - _super.call(this, name, container, navigator); - this._tagDomRenderer = new Component_1.TagDOMRenderer(); - this._tagSet = new Component_1.TagSet(); - this._tagCreator = new Component_1.TagCreator(); - this._tagGlRendererOperation$ = new Subject_1.Subject(); - this._tagGlRenderer$ = this._tagGlRendererOperation$ - .startWith(function (renderer) { - return renderer; - }) - .scan(function (renderer, operation) { - return operation(renderer); - }, new Component_1.TagGLRenderer()); - this._tags$ = this._tagSet.tagData$ - .map(function (tagData) { - var tags = []; + var _this = _super.call(this, name, container, navigator) || this; + _this._tagDomRenderer = new Component_1.TagDOMRenderer(); + _this._tagScene = new Component_1.TagScene(); + _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(); // ensure that tags are always rendered in the same order // to avoid hover tracking problems on first resize. - for (var _i = 0, _a = Object.keys(tagData).sort(); _i < _a.length; _i++) { - var key = _a[_i]; - tags.push(tagData[key]); - } - return tags; - }) - .share(); - this._renderTags$ = this.tags$ - .withLatestFrom(this._navigator.stateService.currentTransform$) - .map(function (args) { - var tags = args[0]; - var transform = args[1]; - var renderTags = tags - .map(function (tag) { - if (tag instanceof Component_1.OutlineTag) { - return new Component_1.OutlineRenderTag(tag, transform); + tags.sort(function (t1, t2) { + var id1 = t1.tag.id; + var id2 = t2.tag.id; + if (id1 < id2) { + return -1; } - else if (tag instanceof Component_1.SpotTag) { - return new Component_1.SpotRenderTag(tag, transform); + if (id1 > id2) { + return 1; } - throw new Error("Tag type not supported"); + return 0; }); - return renderTags; + return tags; }) .share(); - this._tagChanged$ = this._tags$ + _this._tagChanged$ = _this._renderTags$ .switchMap(function (tags) { return Observable_1.Observable .from(tags) .mergeMap(function (tag) { return Observable_1.Observable - .merge(tag.changed$, tag.geometryChanged$); + .merge(tag.tag.changed$, tag.tag.geometryChanged$); }); }) .share(); - this._renderTagGLChanged$ = this._renderTags$ + _this._renderTagGLChanged$ = _this._renderTags$ .switchMap(function (tags) { return Observable_1.Observable .from(tags) @@ -22781,348 +27735,274 @@ 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.mouseUp$, this._container.mouseService.mouseLeave$) - .map(function (e) { - return; - }) - .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$ + _this._createGeometryChanged$ = _this._tagCreator.tag$ .switchMap(function (tag) { return tag != null ? tag.geometryChanged$ : Observable_1.Observable.empty(); }) .share(); - this._tagCreated$ = this._tagCreator.tag$ + _this._createGLObjectsChanged$ = _this._tagCreator.tag$ .switchMap(function (tag) { return tag != null ? - tag.created$ : + tag.glObjectsChanged$ : 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$ + _this._creatingConfiguration$ = _this._configuration$ .distinctUntilChanged(function (c1, c2) { - return c1.creating === c2.creating && c1.createType === c2.createType; + return c1.mode === c2.mode; }, function (configuration) { return { createColor: configuration.createColor, - createType: configuration.createType, - creating: configuration.creating, + mode: configuration.mode, }; }) .publishReplay(1) .refCount(); - this._creating$ = this._creatingConfiguration$ - .map(function (configuration) { - return configuration.creating; - }) - .publishReplay(1) - .refCount(); - this._creating$ - .subscribe(function (creating) { - _this.fire(TagComponent.creatingchanged, creating); + _this._creatingConfiguration$ + .subscribe(function (configuration) { + _this.fire(TagComponent.modechanged, configuration.mode); }); + return _this; } - Object.defineProperty(TagComponent.prototype, "tags$", { - /** - * Get tags observable. - * - * @description An observable emitting every time the items in the - * tag array changes. - * - * @returns {Observable} - */ - get: function () { - return this._tags$; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(TagComponent.prototype, "geometryCreated$", { - /** - * Get geometry created observable. - * - * @description An observable emitting every time a geometry - * has been created. - * - * @returns {Observable} - */ - get: function () { - return this._geometryCreated$; - }, - enumerable: true, - configurable: true - }); /** - * Set the tags to display. + * Add tags to the tag set or replace tags in the tag set. + * + * @description If a tag already in the set has the same + * id as one of the tags added, the old tag will be removed + * the added tag will take its place. + * + * @param {Array} tags - Tags to add. + * + * @example ```tagComponent.add([tag1, tag2]);``` + */ + TagComponent.prototype.add = function (tags) { + var _this = this; + if (this._activated) { + this._navigator.stateService.currentTransform$ + .first() + .subscribe(function (transform) { + _this._tagSet.add(tags, transform); + var renderTags = tags + .map(function (tag) { + return _this._tagSet.get(tag.id); + }); + _this._tagScene.add(renderTags); + }); + } + else { + this._tagSet.addDeactivated(tags); + } + }; + /** + * Change the current tag mode. + * + * @description Change the tag mode to one of the create modes for creating new geometries. + * + * @param {TagMode} mode - New tag mode. + * + * @fires TagComponent#modechanged + * + * @example ```tagComponent.changeMode(Mapillary.TagComponent.TagMode.CreateRect);``` + */ + TagComponent.prototype.changeMode = function (mode) { + this.configure({ mode: mode }); + }; + /** + * Returns the tag in the tag set with the specified id, or + * undefined if the id matches no tag. + * + * @param {string} tagId - Id of the tag. + * + * @example ```var tag = tagComponent.get("tagId");``` + */ + TagComponent.prototype.get = function (tagId) { + if (this._activated) { + var renderTag = this._tagSet.get(tagId); + return renderTag !== undefined ? renderTag.tag : undefined; + } + else { + return this._tagSet.getDeactivated(tagId); + } + }; + /** + * Returns an array of all tags. + * + * @example ```var tags = tagComponent.getAll();``` + */ + TagComponent.prototype.getAll = function () { + if (this.activated) { + return this._tagSet + .getAll() + .map(function (renderTag) { + return renderTag.tag; + }); + } + else { + 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. + * + * @param {string} tagId - Id of the tag. * - * @param {Tag[]} tags - The tags. + * @example ```var tagExists = tagComponent.has("tagId");``` */ - TagComponent.prototype.setTags = function (tags) { - this._tagSet.set$.next(tags); + TagComponent.prototype.has = function (tagId) { + return this._activated ? this._tagSet.has(tagId) : this._tagSet.hasDeactivated(tagId); }; /** - * Configure the component to enter create mode for - * creating a geometry of a certain type. + * Remove tags with the specified ids from the tag set. * - * @description Supported geometry types are: rect + * @param {Array} tagIds - Ids for tags to remove. * - * @param {string} geometryType - String specifying the geometry type. + * @example ```tagComponent.remove(["id-1", "id-2"]);``` */ - TagComponent.prototype.startCreate = function (geometryType) { - this.configure({ createType: geometryType, creating: true }); + TagComponent.prototype.remove = function (tagIds) { + if (this._activated) { + this._tagSet.remove(tagIds); + this._tagScene.remove(tagIds); + } + else { + this._tagSet.removeDeactivated(tagIds); + } }; /** - * Configure the component to leave create mode. + * Remove all tags from the tag set. * - * @description A non completed geometry will be removed. + * @example ```tagComponent.removeAll();``` */ - TagComponent.prototype.stopCreate = function () { - this.configure({ createType: null, creating: false }); + TagComponent.prototype.removeAll = function () { + if (this._activated) { + this._tagSet.removeAll(); + this._tagScene.removeAll(); + } + else { + this._tagSet.removeAllDeactivated(); + } }; TagComponent.prototype._activate = function () { var _this = this; - this._geometryCreatedEventSubscription = this._geometryCreated$ + this._editVertexHandler.enable(); + var handlerGeometryCreated$ = Observable_1.Observable + .from(Object.keys(this._createHandlers)) + .map(function (key) { + return _this._createHandlers[key]; + }) + .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._tags$ - .subscribe(function (tags) { - _this.fire(TagComponent.tagschanged, tags); + this._fireCreateGeometryEventSubscription = this._tagCreator.tag$ + .skipWhile(function (tag) { + return tag == null; + }) + .distinctUntilChanged() + .subscribe(function (tag) { + var eventType = tag != null ? + TagComponent.creategeometrystart : + TagComponent.creategeometryend; + _this.fire(eventType, _this); }); - var nodeChanged$ = this.configuration$ - .switchMap(function (configuration) { - return configuration.creating ? - _this._navigator.stateService.currentNode$ - .skip(1) - .take(1) - .map(function (n) { return null; }) : - Observable_1.Observable.empty(); + this._handlerStopCreateSubscription = handlerGeometryCreated$ + .subscribe(function () { + _this.changeMode(Component_1.TagMode.Default); + }); + 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(); + } }); - var tagAborted$ = this._tagCreator.tag$ + 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(nodeChanged$, tagAborted$, tagCreated$, pointGeometryCreated$) - .subscribe(function () { _this.stopCreate(); }); - this._creatorConfigurationSubscription = this._configuration$ - .subscribe(this._tagCreator.configuration$); - this._createSubscription = this._creatingConfiguration$ - .switchMap(function (configuration) { - return configuration.creating && - configuration.createType === "rect" || - configuration.createType === "polygon" ? - _this._validBasicClick$.take(1) : - Observable_1.Observable.empty(); - }) - .subscribe(this._tagCreator.create$); - this._createPointSubscription = this._creatingConfiguration$ - .switchMap(function (configuration) { - return configuration.creating && - configuration.createType === "point" ? - _this._validBasicClick$.take(1) : - Observable_1.Observable.empty(); }) - .map(function (basic) { - return new Component_1.PointGeometry(basic); - }) - .subscribe(this._pointGeometryCreated$); - this._setCreateVertexSubscription = Observable_1.Observable - .combineLatest(this._container.mouseService.mouseMove$, 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); + .subscribe(function () { _this.changeMode(Component_1.TagMode.Default); }); + this._setGLCreateTagSubscription = this._tagCreator.tag$ + .subscribe(function (tag) { + if (_this._tagScene.hasCreateTag()) { + _this._tagScene.removeCreateTag(); } - else if (tag.geometry instanceof Component_1.PolygonGeometry) { - tag.geometry.setVertex2d(tag.geometry.polygon.length - 2, basic, transform); + if (tag != null) { + _this._tagScene.addCreateTag(tag); } }); - this._addPointSubscription = this._creatingConfiguration$ - .switchMap(function (configuration) { - var createType = configuration.createType; - return configuration.creating && - (createType === "rect" || createType === "polygon") ? - _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._deleteCreatedSubscription = this._creating$ - .subscribe(function (creating) { - _this._tagCreator.delete$.next(null); - }); - this._setGLCreateTagSubscription = Observable_1.Observable - .merge(this._tagCreator.tag$, this._createGeometryChanged$) - .withLatestFrom(this._navigator.stateService.currentTransform$, function (tag, transform) { - return [tag, transform]; - }) - .map(function (tt) { - return function (renderer) { - var tag = tt[0]; - var transform = tt[1]; - if (tag == null) { - renderer.removeCreateTag(); - } - else { - renderer.setCreateTag(tag, transform); - } - return renderer; - }; - }) - .subscribe(this._tagGlRendererOperation$); - this._claimMouseSubscription = this._tagInterationInitiated$ - .switchMap(function (id) { - return _this._container.mouseService.mouseMove$ - .takeUntil(_this._tagInteractionAbort$) - .take(1); - }) - .subscribe(function (e) { - _this._container.mouseService.claimMouse(_this._name, 1); + this._createGLObjectsChangedSubscription = this._createGLObjectsChanged$ + .subscribe(function (tag) { + _this._tagScene.updateCreateTagObjects(tag); }); - this._mouseDragSubscription = this._activeTag$ - .withLatestFrom(this._container.mouseService.mouseMove$, 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.mouseDrag$)); - 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._updateGLObjectsSubscription = this._renderTagGLChanged$ + .subscribe(function (tag) { + _this._tagScene.updateObjects(tag); }); - this._unclaimMouseSubscription = this._container.mouseService - .filtered$(this._name, this._container.mouseService.mouseDragEnd$) - .subscribe(function (e) { - _this._container.mouseService.unclaimMouse(_this._name); + this._updateTagSceneSubscription = this._tagChanged$ + .subscribe(function (tag) { + _this._tagScene.update(); }); - this._setTagsSubscription = this._renderTags$ - .map(function (tags) { - return function (renderer) { - renderer.setTags(tags); - return renderer; - }; - }) - .subscribe(this._tagGlRendererOperation$); - this._updateGLTagSubscription = this._renderTagGLChanged$ - .map(function (tag) { - return function (renderer) { - renderer.updateTag(tag); - return renderer; - }; - }) - .subscribe(this._tagGlRendererOperation$); - this._setNeedsRenderSubscription = this._tagChanged$ - .map(function (tag) { - return function (renderer) { - renderer.setNeedsRender(); - return renderer; - }; - }) - .subscribe(this._tagGlRendererOperation$); this._domSubscription = this._renderTags$ .startWith([]) .do(function (tags) { @@ -23131,115 +28011,157 @@ 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), this._configuration$, function (renderTags, rc, atlas, tag, ct, c) { - return [rc, atlas, renderTags, tag, ct, c]; - }) - .withLatestFrom(this._navigator.stateService.currentTransform$, function (args, transform) { - return [args[0], args[1], args[2], args[3], args[4], args[5], transform]; + .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, args[6], args[5]), + vnode: _this._tagDomRenderer.render(args[3], args[5], args[1], args[0].perspective, args[2]), }; }) .subscribe(this._container.domRenderer.render$); this._glSubscription = this._navigator.stateService.currentState$ - .withLatestFrom(this._tagGlRenderer$, function (frame, renderer) { - return [frame, renderer]; - }) - .map(function (fr) { - var frame = fr[0]; - var renderer = fr[1]; + .map(function (frame) { + var tagScene = _this._tagScene; return { name: _this._name, render: { frameId: frame.id, - needsRender: renderer.needsRender, - render: renderer.render.bind(renderer), + needsRender: tagScene.needsRender, + render: tagScene.render.bind(tagScene), stage: Render_1.GLRenderStage.Foreground, }, }; }) .subscribe(this._container.glRenderer.render$); + this._navigator.stateService.currentTransform$ + .first() + .subscribe(function (transform) { + _this._tagSet.activate(transform); + _this._tagScene.add(_this._tagSet.getAll()); + }); }; TagComponent.prototype._deactivate = function () { - this._tagGlRendererOperation$ - .next(function (renderer) { - renderer.dispose(); - return renderer; - }); - this._tagSet.set$.next([]); + 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._setTagsSubscription.unsubscribe(); - this._updateGLTagSubscription.unsubscribe(); - this._setNeedsRenderSubscription.unsubscribe(); + this._updateGLObjectsSubscription.unsubscribe(); + this._updateTagSceneSubscription.unsubscribe(); this._stopCreateSubscription.unsubscribe(); - this._creatorConfigurationSubscription.unsubscribe(); - this._createSubscription.unsubscribe(); - this._createPointSubscription.unsubscribe(); - this._setCreateVertexSubscription.unsubscribe(); - this._addPointSubscription.unsubscribe(); - this._deleteCreatedSubscription.unsubscribe(); this._setGLCreateTagSubscription.unsubscribe(); + this._createGLObjectsChangedSubscription.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 () { return { createColor: 0xFFFFFF, - creating: false, + 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 clientRect = element.getBoundingClientRect(); - var canvasX = event.clientX - clientRect.left - offsetX; - var canvasY = event.clientY - clientRect.top - offsetY; - var projectedX = 2 * canvasX / element.offsetWidth - 1; - var projectedY = 1 - 2 * canvasY / element.offsetHeight; - var unprojected = new THREE.Vector3(projectedX, projectedY, 1).unproject(camera.perspective); - var basic = transform.projectBasic(unprojected.toArray()); - 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 creation starts and stops. + * 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#creatingchanged - * @type {boolean} Indicates whether the component is creating a tag. + * @event TagComponent#modechanged + * @type {TagMode} Tag mode + * @example + * ``` + * tagComponent.on("modechanged", function(mode) { + * console.log(mode); + * }); + * ``` */ - TagComponent.creatingchanged = "creatingchanged"; + 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 {Array} Current array of tags. + * @type {TagComponent} Tag component. + * @example + * ``` + * tagComponent.on("tagschanged", function(component) { + * console.log(component.getAll()); + * }); + * ``` */ TagComponent.tagschanged = "tagschanged"; return TagComponent; }(Component_1.Component)); exports.TagComponent = TagComponent; Component_1.ComponentService.register(TagComponent); -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = TagComponent; -},{"../../Component":207,"../../Render":213,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/observable/empty":39,"rxjs/add/observable/from":40,"rxjs/add/observable/merge":43,"rxjs/add/observable/of":44,"rxjs/add/operator/combineLatest":49,"rxjs/add/operator/concat":50,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/do":54,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/merge":61,"rxjs/add/operator/mergeMap":63,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/share":69,"rxjs/add/operator/skip":70,"rxjs/add/operator/skipUntil":71,"rxjs/add/operator/startWith":72,"rxjs/add/operator/switchMap":73,"rxjs/add/operator/take":74,"rxjs/add/operator/takeUntil":75,"rxjs/add/operator/withLatestFrom":76,"three":157}],250:[function(require,module,exports){ +},{"../../Component":230,"../../Geo":233,"../../Render":236,"rxjs/Observable":29,"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":74,"rxjs/add/operator/share":75,"rxjs/add/operator/skip":76,"rxjs/add/operator/skipUntil":77,"rxjs/add/operator/startWith":79,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/take":81,"rxjs/add/operator/takeUntil":82,"rxjs/add/operator/withLatestFrom":85,"when":227}],293:[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"); @@ -23247,42 +28169,44 @@ require("rxjs/add/operator/share"); require("rxjs/add/operator/withLatestFrom"); var Component_1 = require("../../Component"); var TagCreator = (function () { - function TagCreator() { + 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._configuration$ = new Subject_1.Subject(); this._tag$ = this._tagOperation$ .scan(function (tag, operation) { return operation(tag); }, null) .share(); - this._create$ - .withLatestFrom(this._configuration$, function (coordinate, type) { - return [coordinate, type]; + 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) { + var geometry = new Component_1.RectGeometry([ + coord[0], + coord[1], + coord[0], + coord[1], + ]); + return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform); + }; }) - .map(function (ct) { + .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 coordinate = ct[0]; - var configuration = ct[1]; - if (configuration.createType === "rect") { - var geometry = new Component_1.RectGeometry([ - coordinate[0], - coordinate[1], - coordinate[0], - coordinate[1], - ]); - return new Component_1.OutlineCreateTag(geometry, { color: configuration.createColor }); - } - else if (configuration.createType === "polygon") { - var geometry = new Component_1.PolygonGeometry([ - [coordinate[0], coordinate[1]], - [coordinate[0], coordinate[1]], - [coordinate[0], coordinate[1]], - ]); - return new Component_1.OutlineCreateTag(geometry, { color: configuration.createColor }); - } - return null; + 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$); @@ -23294,23 +28218,23 @@ 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, "delete$", { + Object.defineProperty(TagCreator.prototype, "createPolygon$", { get: function () { - return this._delete$; + return this._createPolygon$; }, enumerable: true, configurable: true }); - Object.defineProperty(TagCreator.prototype, "configuration$", { + Object.defineProperty(TagCreator.prototype, "delete$", { get: function () { - return this._configuration$; + return this._delete$; }, enumerable: true, configurable: true @@ -23325,34 +28249,26 @@ var TagCreator = (function () { return TagCreator; }()); exports.TagCreator = TagCreator; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = TagCreator; -},{"../../Component":207,"rxjs/Subject":33,"rxjs/add/operator/map":60,"rxjs/add/operator/scan":68,"rxjs/add/operator/share":69,"rxjs/add/operator/withLatestFrom":76}],251:[function(require,module,exports){ -/// +},{"../../Component":230,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":74,"rxjs/add/operator/share":75,"rxjs/add/operator/withLatestFrom":85}],294:[function(require,module,exports){ "use strict"; -var THREE = require("three"); +/// +Object.defineProperty(exports, "__esModule", { value: true }); var vd = require("virtual-dom"); var TagDOMRenderer = (function () { function TagDOMRenderer() { } - TagDOMRenderer.prototype.render = function (tags, createTag, atlas, camera, transform, configuration) { - 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(transform, matrixWorldInverse, projectionMatrix)); + vNodes = vNodes.concat(createTag.getDOMObjects(camera, size)); } - var properties = { - style: { - "pointer-events": configuration.creating ? "all" : "none", - }, - }; - return vd.h("div.TagContainer", properties, vNodes); + return vd.h("div.TagContainer", {}, vNodes); }; TagDOMRenderer.prototype.clear = function () { return vd.h("div", {}, []); @@ -23361,184 +28277,405 @@ var TagDOMRenderer = (function () { }()); exports.TagDOMRenderer = TagDOMRenderer; -},{"three":157,"virtual-dom":163}],252:[function(require,module,exports){ -/// +},{"virtual-dom":186}],295:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Enumeration for tag modes + * @enum {number} + * @readonly + * @description Modes for the interaction in the tag component. + */ +var TagMode; +(function (TagMode) { + /** + * Disables creating tags. + */ + TagMode[TagMode["Default"] = 0] = "Default"; + /** + * Create a point geometry through a click. + */ + TagMode[TagMode["CreatePoint"] = 1] = "CreatePoint"; + /** + * Create a polygon geometry through clicks. + */ + TagMode[TagMode["CreatePolygon"] = 2] = "CreatePolygon"; + /** + * 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; + +},{}],296:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var TagOperation; +(function (TagOperation) { + TagOperation[TagOperation["None"] = 0] = "None"; + TagOperation[TagOperation["Centroid"] = 1] = "Centroid"; + TagOperation[TagOperation["Vertex"] = 2] = "Vertex"; +})(TagOperation = exports.TagOperation || (exports.TagOperation = {})); +exports.default = TagOperation; + +},{}],297:[function(require,module,exports){ "use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); -var TagGLRenderer = (function () { - function TagGLRenderer() { - this._scene = new THREE.Scene(); - this._tags = {}; +var TagScene = (function () { + function TagScene(scene, raycaster) { this._createTag = null; this._needsRender = false; + this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster(); + this._scene = !!scene ? scene : new THREE.Scene(); + this._objectTags = {}; + this._retrievableObjects = []; + this._tags = {}; } - Object.defineProperty(TagGLRenderer.prototype, "needsRender", { + Object.defineProperty(TagScene.prototype, "needsRender", { get: function () { return this._needsRender; - }, - enumerable: true, - configurable: true - }); - TagGLRenderer.prototype.render = function (perspectiveCamera, renderer) { - renderer.render(this._scene, perspectiveCamera); - this._needsRender = false; - }; - TagGLRenderer.prototype.setCreateTag = function (tag, transform) { - this._disposeCreateTag(); - this._addCreateTag(tag, transform); - this._needsRender = true; - }; - TagGLRenderer.prototype.removeCreateTag = function () { - this._disposeCreateTag(); - this._needsRender = true; - }; - TagGLRenderer.prototype.setTags = function (tags) { - this._disposeTags(); + }, + enumerable: true, + configurable: true + }); + TagScene.prototype.add = function (tags) { for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) { var tag = tags_1[_i]; - this._addTag(tag); + if (tag.tag.id in this._tags) { + this._remove(tag.tag.id); + } + this._add(tag); } this._needsRender = true; }; - TagGLRenderer.prototype.updateTag = function (tag) { - for (var _i = 0, _a = this._tags[tag.tag.id][1]; _i < _a.length; _i++) { - var object3d = _a[_i]; - this._scene.remove(object3d); + TagScene.prototype.addCreateTag = function (tag) { + for (var _i = 0, _a = tag.glObjects; _i < _a.length; _i++) { + var object = _a[_i]; + this._scene.add(object); } - this._addTag(tag); - }; - TagGLRenderer.prototype.setNeedsRender = function () { + this._createTag = { tag: tag, objects: tag.glObjects }; this._needsRender = true; }; - TagGLRenderer.prototype.dispose = function () { - this._disposeTags(); - this._disposeCreateTag(); + TagScene.prototype.clear = function () { + for (var _i = 0, _a = Object.keys(this._tags); _i < _a.length; _i++) { + var id = _a[_i]; + this._remove(id); + } this._needsRender = false; }; - TagGLRenderer.prototype._addTag = function (tag) { - var objects = tag.glObjects; - this._tags[tag.tag.id] = [tag, []]; - for (var _i = 0, objects_1 = objects; _i < objects_1.length; _i++) { - var object = objects_1[_i]; - this._tags[tag.tag.id][1].push(object); - this._scene.add(object); + 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; }; - TagGLRenderer.prototype._addCreateTag = function (tag, transform) { - var object = tag.getGLObject(transform); - this._createTag = object; - this._scene.add(object); + TagScene.prototype.remove = function (ids) { + for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) { + var id = ids_1[_i]; + this._remove(id); + } + this._needsRender = true; }; - TagGLRenderer.prototype._disposeTags = function () { + TagScene.prototype.removeAll = function () { for (var _i = 0, _a = Object.keys(this._tags); _i < _a.length; _i++) { var id = _a[_i]; - for (var _b = 0, _c = this._tags[id][1]; _b < _c.length; _b++) { - var object = _c[_b]; - this._scene.remove(object); - } - this._tags[id][0].dispose(); - delete this._tags[id]; + this._remove(id); } + this._needsRender = true; }; - TagGLRenderer.prototype._disposeCreateTag = function () { + TagScene.prototype.removeCreateTag = function () { if (this._createTag == null) { return; } - var mesh = this._createTag; - this._scene.remove(mesh); - mesh.geometry.dispose(); - mesh.material.dispose(); + for (var _i = 0, _a = this._createTag.objects; _i < _a.length; _i++) { + var object = _a[_i]; + this._scene.remove(object); + } + this._createTag.tag.dispose(); this._createTag = null; + this._needsRender = true; + }; + TagScene.prototype.render = function (perspectiveCamera, renderer) { + renderer.render(this._scene, perspectiveCamera); + this._needsRender = false; + }; + TagScene.prototype.update = function () { + this._needsRender = true; + }; + TagScene.prototype.updateCreateTagObjects = function (tag) { + if (this._createTag.tag !== tag) { + throw new Error("Create tags do not have the same reference."); + } + for (var _i = 0, _a = this._createTag.objects; _i < _a.length; _i++) { + var object = _a[_i]; + this._scene.remove(object); + } + for (var _b = 0, _c = tag.glObjects; _b < _c.length; _b++) { + var object = _c[_b]; + this._scene.add(object); + } + this._createTag.objects = tag.glObjects; + this._needsRender = true; }; - return TagGLRenderer; + TagScene.prototype.updateObjects = function (tag) { + var id = tag.tag.id; + 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 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) { + 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); + } + 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.TagGLRenderer = TagGLRenderer; +exports.TagScene = TagScene; +exports.default = TagScene; -},{"three":157}],253:[function(require,module,exports){ +},{"three":180}],298:[function(require,module,exports){ "use strict"; -(function (TagOperation) { - TagOperation[TagOperation["None"] = 0] = "None"; - TagOperation[TagOperation["Centroid"] = 1] = "Centroid"; - TagOperation[TagOperation["Vertex"] = 2] = "Vertex"; -})(exports.TagOperation || (exports.TagOperation = {})); -var TagOperation = exports.TagOperation; Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = TagOperation; - -},{}],254:[function(require,module,exports){ -"use strict"; 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 () { function TagSet() { - this._tagDataOperation$ = new Subject_1.Subject(); - this._set$ = new Subject_1.Subject(); - this._tagData$ = this._tagDataOperation$ - .scan(function (tagData, operation) { - return operation(tagData); - }, {}) - .share(); - this._set$ - .map(function (tags) { - return function (tagData) { - for (var _i = 0, _a = Object.keys(tagData); _i < _a.length; _i++) { - var key = _a[_i]; - delete tagData[key]; - } - for (var _b = 0, tags_1 = tags; _b < tags_1.length; _b++) { - var tag = tags_1[_b]; - tagData[tag.id] = tag; - } - return tagData; - }; - }) - .subscribe(this._tagDataOperation$); + this._active = false; + this._hash = {}; + this._hashDeactivated = {}; + this._notifyChanged$ = new Subject_1.Subject(); } - Object.defineProperty(TagSet.prototype, "tagData$", { + Object.defineProperty(TagSet.prototype, "active", { get: function () { - return this._tagData$; + return this._active; }, enumerable: true, configurable: true }); - Object.defineProperty(TagSet.prototype, "set$", { + Object.defineProperty(TagSet.prototype, "changed$", { get: function () { - return this._set$; + return this._notifyChanged$; }, enumerable: true, configurable: true }); + TagSet.prototype.activate = function (transform) { + if (this._active) { + return; + } + for (var id in this._hashDeactivated) { + if (!this._hashDeactivated.hasOwnProperty(id)) { + continue; + } + var tag = this._hashDeactivated[id]; + 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; + } + 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); + } + 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; + } + }; + TagSet.prototype.get = function (id) { + return this.has(id) ? this._hash[id] : undefined; + }; + TagSet.prototype.getAll = function () { + var hash = this._hash; + return Object.keys(hash) + .map(function (id) { + return hash[id]; + }); + }; + TagSet.prototype.getAllDeactivated = function () { + var hashDeactivated = this._hashDeactivated; + return Object.keys(hashDeactivated) + .map(function (id) { + return hashDeactivated[id]; + }); + }; + TagSet.prototype.getDeactivated = function (id) { + return this.hasDeactivated(id) ? this._hashDeactivated[id] : undefined; + }; + TagSet.prototype.has = function (id) { + return id in this._hash; + }; + TagSet.prototype.hasDeactivated = function (id) { + 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]; + if (!(id in hash)) { + continue; + } + delete hash[id]; + } + 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]; + if (!(id in hashDeactivated)) { + continue; + } + delete hashDeactivated[id]; + } + }; + TagSet.prototype._add = function (tag, transform) { + if (tag instanceof Component_1.OutlineTag) { + this._hash[tag.id] = new Component_1.OutlineRenderTag(tag, transform); + } + else if (tag instanceof Component_1.SpotTag) { + this._hash[tag.id] = new Component_1.SpotRenderTag(tag, transform); + } + else { + 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; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = TagSet; -},{"rxjs/Subject":33,"rxjs/add/operator/map":60,"rxjs/add/operator/scan":68,"rxjs/add/operator/share":69}],255:[function(require,module,exports){ +},{"../../Component":230,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/scan":74,"rxjs/add/operator/share":75}],299:[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 __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 Error_1 = require("../../../Error"); var GeometryTagError = (function (_super) { __extends(GeometryTagError, _super); function GeometryTagError(message) { - _super.call(this); - this.name = "GeometryTagError"; - this.message = message != null ? message : "The provided geometry value is incorrect"; + var _this = _super.call(this, message != null ? message : "The provided geometry value is incorrect") || this; + _this.name = "GeometryTagError"; + return _this; } return GeometryTagError; }(Error_1.MapillaryError)); exports.GeometryTagError = GeometryTagError; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Error_1.MapillaryError; -},{"../../../Error":209}],256:[function(require,module,exports){ +},{"../../../Error":232}],300:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var Subject_1 = require("rxjs/Subject"); /** * @class Geometry @@ -23562,6 +28699,7 @@ var Geometry = (function () { * has changed. * * @returns {Observable} Observable emitting the geometry instance. + * @ignore */ get: function () { return this._notifyChanged$; @@ -23572,20 +28710,32 @@ var Geometry = (function () { return Geometry; }()); exports.Geometry = Geometry; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Geometry; -},{"rxjs/Subject":33}],257:[function(require,module,exports){ +},{"rxjs/Subject":34}],301:[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 __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 PointGeometry - * @classdesc Represents a point geometry in the basic coordinate system. + * + * @classdesc Represents a point geometry in the 2D basic image coordinate system. + * + * @example + * ``` + * var basicPoint = [0.5, 0.7]; + * var pointGeometry = new Mapillary.TagComponent.PointGeometry(basicPoint); + * ``` */ var PointGeometry = (function (_super) { __extends(PointGeometry, _super); @@ -23599,13 +28749,14 @@ var PointGeometry = (function (_super) { * @throws {GeometryTagError} Point coordinates must be valid basic coordinates. */ function PointGeometry(point) { - _super.call(this); + var _this = _super.call(this) || this; var x = point[0]; var y = point[1]; if (x < 0 || x > 1 || y < 0 || y > 1) { throw new Component_1.GeometryTagError("Basic coordinates must be on the interval [0, 1]."); } - this._point = point.slice(); + _this._point = point.slice(); + return _this; } Object.defineProperty(PointGeometry.prototype, "point", { /** @@ -23618,6 +28769,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. @@ -23647,17 +28807,31 @@ var PointGeometry = (function (_super) { }(Component_1.Geometry)); exports.PointGeometry = PointGeometry; -},{"../../../Component":207}],258:[function(require,module,exports){ +},{"../../../Component":230}],302:[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 __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 PolygonGeometry - * @classdesc Represents a polygon geometry in the basic coordinate system. + * + * @classdesc Represents a polygon geometry in the 2D basic image coordinate system. + * All polygons and holes provided to the constructor needs to be closed. + * + * @example + * ``` + * var basicPolygon = [[0.5, 0.3], [0.7, 0.3], [0.6, 0.5], [0.5, 0.3]]; + * var polygonGeometry = new Mapillary.TagComponent.PointGeometry(basicPolygon); + * ``` */ var PolygonGeometry = (function (_super) { __extends(PolygonGeometry, _super); @@ -23672,7 +28846,7 @@ var PolygonGeometry = (function (_super) { * @throws {GeometryTagError} Polygon coordinates must be valid basic coordinates. */ function PolygonGeometry(polygon, holes) { - _super.call(this); + var _this = _super.call(this) || this; var polygonLength = polygon.length; if (polygonLength < 3) { throw new Component_1.GeometryTagError("A polygon must have three or more positions."); @@ -23681,18 +28855,18 @@ var PolygonGeometry = (function (_super) { polygon[0][1] !== polygon[polygonLength - 1][1]) { throw new Component_1.GeometryTagError("First and last positions must be equivalent."); } - this._polygon = []; + _this._polygon = []; for (var _i = 0, polygon_1 = polygon; _i < polygon_1.length; _i++) { var vertex = polygon_1[_i]; if (vertex[0] < 0 || vertex[0] > 1 || vertex[1] < 0 || vertex[1] > 1) { throw new Component_1.GeometryTagError("Basic coordinates of polygon must be on the interval [0, 1]."); } - this._polygon.push(vertex.slice()); + _this._polygon.push(vertex.slice()); } - this._holes = []; + _this._holes = []; if (holes == null) { - return; + return _this; } for (var i = 0; i < holes.length; i++) { var hole = holes[i]; @@ -23704,16 +28878,17 @@ var PolygonGeometry = (function (_super) { hole[0][1] !== hole[holeLength - 1][1]) { throw new Component_1.GeometryTagError("First and last positions of hole must be equivalent."); } - this._holes.push([]); + _this._holes.push([]); for (var _a = 0, hole_1 = hole; _a < hole_1.length; _a++) { var vertex = hole_1[_a]; if (vertex[0] < 0 || vertex[0] > 1 || vertex[1] < 0 || vertex[1] > 1) { throw new Component_1.GeometryTagError("Basic coordinates of hole must be on the interval [0, 1]."); } - this._holes[i].push(vertex.slice()); + _this._holes[i].push(vertex.slice()); } } + return _this; } Object.defineProperty(PolygonGeometry.prototype, "polygon", { /** @@ -23750,6 +28925,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. * @@ -23795,7 +28982,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; @@ -23818,6 +29005,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) { @@ -23845,15 +29036,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)); - }; - PolygonGeometry.prototype._getCentroid2d = function () { + PolygonGeometry.prototype.getCentroid2d = function () { var polygon = this._polygon; var area = 0; var centroidX = 0; @@ -23873,23 +29056,53 @@ 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; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = PolygonGeometry; -},{"../../../Component":207}],259:[function(require,module,exports){ +},{"../../../Component":230}],303:[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 __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 RectGeometry - * @classdesc Represents a rectangle geometry in the basic coordinate system. + * + * @classdesc Represents a rectangle geometry in the 2D basic image coordinate system. + * + * @example + * ``` + * var basicRect = [0.5, 0.3, 0.7, 0.4]; + * var rectGeometry = new Mapillary.TagComponent.RectGeometry(basicRect); + * ``` */ var RectGeometry = (function (_super) { __extends(RectGeometry, _super); @@ -23903,7 +29116,7 @@ var RectGeometry = (function (_super) { * @throws {GeometryTagError} Rectangle coordinates must be valid basic coordinates. */ function RectGeometry(rect) { - _super.call(this); + var _this = _super.call(this) || this; if (rect[1] > rect[3]) { throw new Component_1.GeometryTagError("Basic Y coordinates values can not be inverted."); } @@ -23913,23 +29126,270 @@ var RectGeometry = (function (_super) { throw new Component_1.GeometryTagError("Basic coordinates must be on the interval [0, 1]."); } } - this._rect = rect.slice(0, 4); - if (this._rect[0] > this._rect[2]) { - this._inverted = true; + _this._anchorIndex = undefined; + _this._rect = rect.slice(0, 4); + _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. + */ + get: function () { + return this._rect; + }, + 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]; } - } - 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. - */ - get: function () { - return this._rect; - }, - enumerable: true, - configurable: true - }); + this._notifyChanged$.next(this); + }; /** * Set the value of a vertex in the polygon representation of the rectangle. * @@ -23971,12 +29431,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 { @@ -24068,6 +29528,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. @@ -24083,6 +29570,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. * @@ -24100,7 +29599,7 @@ 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]; @@ -24108,7 +29607,21 @@ var RectGeometry = (function (_super) { var y1 = rect[3]; var centroidX = x0 + (x1 - x0) / 2; var centroidY = y0 + (y1 - y0) / 2; - return transform.unprojectBasic([centroidX, centroidY], 200); + 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) { + var pole2d = this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect)); + return transform.unprojectBasic(pole2d, 200); }; /** @inheritdoc */ RectGeometry.prototype.getTriangles3d = function (transform) { @@ -24164,9 +29677,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 @@ -24181,98 +29697,703 @@ var RectGeometry = (function (_super) { [rect[0], rect[3]], ]; }; - return RectGeometry; -}(Component_1.VertexGeometry)); -exports.RectGeometry = RectGeometry; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = RectGeometry; + /** + * 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":230}],304:[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 earcut = require("earcut"); +var polylabel = require("@mapbox/polylabel"); +var Component_1 = require("../../../Component"); +/** + * @class VertexGeometry + * @abstract + * @classdesc Represents a vertex geometry. + */ +var VertexGeometry = (function (_super) { + __extends(VertexGeometry, _super); + /** + * Create a vertex geometry. + * + * @constructor + */ + function VertexGeometry() { + return _super.call(this) || this; + } + /** + * Finds the polygon pole of inaccessibility, the most distant internal + * point from the polygon outline. + * + * @param {Array>} points2d - 2d points of outline to triangulate. + * @returns {Array} Point of inaccessibility. + * @ignore + */ + VertexGeometry.prototype._getPoleOfInaccessibility2d = function (points2d) { + var pole2d = polylabel([points2d], 3e-2); + return pole2d; + }; + /** + * Triangulates a 2d polygon and returns the triangle + * representation as a flattened array of 3d points. + * + * @param {Array>} points2d - 2d points of outline to triangulate. + * @param {Array>} points3d - 3d points of outline corresponding to the 2d points. + * @param {Array>>} [holes2d] - 2d points of holes to triangulate. + * @param {Array>>} [holes3d] - 3d points of holes corresponding to the 2d points. + * @returns {Array} Flattened array of 3d points ordered based on the triangles. + * @ignore + */ + VertexGeometry.prototype._triangulate = function (points2d, points3d, holes2d, holes3d) { + var data = [points2d.slice(0, -1)]; + for (var _i = 0, _a = holes2d != null ? holes2d : []; _i < _a.length; _i++) { + var hole2d = _a[_i]; + data.push(hole2d.slice(0, -1)); + } + var points = points3d.slice(0, -1); + for (var _b = 0, _c = holes3d != null ? holes3d : []; _b < _c.length; _b++) { + var hole3d = _c[_b]; + points = points.concat(hole3d.slice(0, -1)); + } + var flattened = earcut.flatten(data); + var indices = earcut(flattened.vertices, flattened.holes, flattened.dimensions); + var triangles = []; + for (var i = 0; i < indices.length; ++i) { + var point = points[indices[i]]; + triangles.push(point[0]); + triangles.push(point[1]); + triangles.push(point[2]); + } + return triangles; + }; + return VertexGeometry; +}(Component_1.Geometry)); +exports.VertexGeometry = VertexGeometry; +exports.default = VertexGeometry; + +},{"../../../Component":230,"@mapbox/polylabel":1,"earcut":8}],305:[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 = (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":230,"rxjs/Subject":34}],306:[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 = (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":230}],307:[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 = (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":230}],308:[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 = (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":207}],260:[function(require,module,exports){ -/// +},{"../../../Component":230,"rxjs/Observable":29}],309:[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 earcut = require("earcut"); +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 VertexGeometry - * @abstract - * @classdesc Represents a vertex geometry. - */ -var VertexGeometry = (function (_super) { - __extends(VertexGeometry, _super); - /** - * Create a vertex geometry. - * - * @constructor - */ - function VertexGeometry() { - _super.call(this); +var CreateRectHandler = (function (_super) { + __extends(CreateRectHandler, _super); + function CreateRectHandler() { + return _super !== null && _super.apply(this, arguments) || this; } - /** - * Triangulates a 2d polygon and returns the triangle - * representation as a flattened array of 3d points. - * - * @param {Array>} points2d - 2d points of outline to triangulate. - * @param {Array>} points3d - 3d points of outline corresponding to the 2d points. - * @param {Array>>} [holes2d] - 2d points of holes to triangulate. - * @param {Array>>} [holes3d] - 3d points of holes corresponding to the 2d points. - * @returns {Array} Flattened array of 3d points ordered based on the triangles. - */ - VertexGeometry.prototype._triangulate = function (points2d, points3d, holes2d, holes3d) { - var data = [points2d.slice(0, -1)]; - for (var _i = 0, _a = holes2d != null ? holes2d : []; _i < _a.length; _i++) { - var hole2d = _a[_i]; - data.push(hole2d.slice(0, -1)); - } - var points = points3d.slice(0, -1); - for (var _b = 0, _c = holes3d != null ? holes3d : []; _b < _c.length; _b++) { - var hole3d = _c[_b]; - points = points.concat(hole3d.slice(0, -1)); - } - var flattened = earcut.flatten(data); - var indices = earcut(flattened.vertices, flattened.holes, flattened.dimensions); - var triangles = []; - for (var i = 0; i < indices.length; ++i) { - var point = points[indices[i]]; - triangles.push(point[0]); - triangles.push(point[1]); - triangles.push(point[2]); - } - return triangles; + 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(); + }); }; - return VertexGeometry; -}(Component_1.Geometry)); -exports.VertexGeometry = VertexGeometry; + 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":230}],310:[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 }); -exports.default = VertexGeometry; +var Observable_1 = require("rxjs/Observable"); +var Component_1 = require("../../../Component"); +var CreateVertexHandler = (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":207,"earcut":6}],261:[function(require,module,exports){ +},{"../../../Component":230,"rxjs/Observable":29}],311:[function(require,module,exports){ "use strict"; -(function (Alignment) { - Alignment[Alignment["Center"] = 0] = "Center"; - Alignment[Alignment["Outer"] = 1] = "Outer"; -})(exports.Alignment || (exports.Alignment = {})); -var Alignment = exports.Alignment; +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 }); -exports.default = Alignment; +var Observable_1 = require("rxjs/Observable"); +var Component_1 = require("../../../Component"); +var EditVertexHandler = (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; -},{}],262:[function(require,module,exports){ +},{"../../../Component":230,"rxjs/Observable":29}],312:[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 = (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":230}],313:[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"); var Component_1 = require("../../../Component"); +var Geo_1 = require("../../../Geo"); var OutlineCreateTag = (function () { - function OutlineCreateTag(geometry, options) { + function OutlineCreateTag(geometry, options, transform, viewportCoords) { + var _this = this; this._geometry = geometry; this._options = { color: options.color == null ? 0xFFFFFF : options.color }; - this._created$ = new Subject_1.Subject(); + 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(); + this._created$ = new Subject_1.Subject(); + this._glObjectsChanged$ = new Subject_1.Subject(); + this._geometryChangedSubscription = this._geometry.changed$ + .subscribe(function (vertexGeometry) { + _this._disposeOutline(); + _this._outline = _this._createOutine(); + _this._glObjects = [_this._outline]; + _this._glObjectsChanged$.next(_this); + }); } Object.defineProperty(OutlineCreateTag.prototype, "geometry", { get: function () { @@ -24281,9 +30402,9 @@ var OutlineCreateTag = (function () { enumerable: true, configurable: true }); - Object.defineProperty(OutlineCreateTag.prototype, "created$", { + Object.defineProperty(OutlineCreateTag.prototype, "glObjects", { get: function () { - return this._created$; + return this._glObjects; }, enumerable: true, configurable: true @@ -24295,6 +30416,20 @@ var OutlineCreateTag = (function () { enumerable: true, configurable: true }); + Object.defineProperty(OutlineCreateTag.prototype, "created$", { + get: function () { + return this._created$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(OutlineCreateTag.prototype, "glObjectsChanged$", { + get: function () { + return this._glObjectsChanged$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(OutlineCreateTag.prototype, "geometryChanged$", { get: function () { var _this = this; @@ -24306,41 +30441,34 @@ var OutlineCreateTag = (function () { enumerable: true, configurable: true }); - OutlineCreateTag.prototype.getGLObject = function (transform) { - var polygon3d = this._geometry.getPoints3d(transform); - var positions = this._getPositions(polygon3d); - var geometry = new THREE.BufferGeometry(); - geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3)); - var material = new THREE.LineBasicMaterial({ - color: this._options.color, - linewidth: 1, - }); - return new THREE.Line(geometry, material); + OutlineCreateTag.prototype.dispose = function () { + this._disposeOutline(); + this._geometryChangedSubscription.unsubscribe(); }; - OutlineCreateTag.prototype.getDOMObjects = function (transform, 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, 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, [])); @@ -24348,11 +30476,9 @@ var OutlineCreateTag = (function () { } else if (this._geometry instanceof Component_1.PolygonGeometry) { var polygonGeometry_1 = this._geometry; - var firstVertex3d = this._geometry.getVertex3d(0, 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(); @@ -24360,9 +30486,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" : @@ -24370,36 +30497,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, 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(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, [])); @@ -24421,7 +30545,37 @@ var OutlineCreateTag = (function () { polygonGeometry.addVertex2d(point); } }; - OutlineCreateTag.prototype._getPositions = function (polygon3d) { + 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); + var geometry = new THREE.BufferGeometry(); + geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3)); + var material = new THREE.LineBasicMaterial({ + color: this._options.color, + linewidth: 1, + }); + return new THREE.Line(geometry, material); + }; + OutlineCreateTag.prototype._disposeOutline = function () { + if (this._outline == null) { + return; + } + var line = this._outline; + line.geometry.dispose(); + line.material.dispose(); + this._outline = null; + this._glObjects = []; + }; + OutlineCreateTag.prototype._getLinePositions = function (polygon3d) { var length = polygon3d.length; var positions = new Float32Array(length * 3); for (var i = 0; i < length; ++i) { @@ -24433,32 +30587,28 @@ var OutlineCreateTag = (function () { } return positions; }; - OutlineCreateTag.prototype._projectToCanvas = function (point, projectionMatrix) { - var projected = new THREE.Vector3(point.x, point.y, point.z) - .applyProjection(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; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = OutlineCreateTag; -},{"../../../Component":207,"rxjs/Subject":33,"three":157,"virtual-dom":163}],263:[function(require,module,exports){ -/// +},{"../../../Component":230,"../../../Geo":233,"rxjs/Subject":34,"three":180,"virtual-dom":186}],314:[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 __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 vd = require("virtual-dom"); var Component_1 = require("../../../Component"); -var Viewer_1 = require("../../../Viewer"); /** * @class OutlineRenderTag * @classdesc Tag visualizing the properties of an OutlineTag. @@ -24466,19 +30616,17 @@ var Viewer_1 = require("../../../Viewer"); var OutlineRenderTag = (function (_super) { __extends(OutlineRenderTag, _super); function OutlineRenderTag(tag, transform) { - var _this = this; - _super.call(this, tag, transform); - this._fill = this._tag.fillOpacity > 0 && !transform.gpano ? - this._createFill() : + var _this = _super.call(this, tag, transform) || this; + _this._fill = !transform.gpano ? + _this._createFill() : null; - this._holes = this._tag.lineWidth >= 1 ? - this._createHoles() : + _this._holes = _this._tag.lineWidth >= 1 ? + _this._createHoles() : []; - this._outline = this._tag.lineWidth >= 1 ? - this._createOutline() : + _this._outline = _this._tag.lineWidth >= 1 ? + _this._createOutline() : null; - this._glObjects = this._createGLObjects(); - this._tag.geometry.changed$ + _this._geometryChangedSubscription = _this._tag.geometry.changed$ .subscribe(function (geometry) { if (_this._fill != null) { _this._updateFillGeometry(); @@ -24490,20 +30638,14 @@ var OutlineRenderTag = (function (_super) { _this._updateOulineGeometry(); } }); - this._tag.changed$ + _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; @@ -24514,150 +30656,132 @@ var OutlineRenderTag = (function (_super) { _this._updateOutlineMaterial(); } if (glObjectsChanged) { - _this._glObjects = _this._createGLObjects(); _this._glObjectsChanged$.next(_this); } }); + return _this; } OutlineRenderTag.prototype.dispose = function () { this._disposeFill(); this._disposeHoles(); this._disposeOutline(); + 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 = []; - if (this._tag.geometry instanceof Component_1.RectGeometry) { - if (this._tag.icon != null) { - var iconVertex = this._tag.geometry.getVertex3d(this._tag.iconIndex, this._transform); - var iconCameraSpace = this._convertToCameraSpace(iconVertex, matrixWorldInverse); - if (iconCameraSpace.z < 0) { - var interact = function (e) { - _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag }); - }; - if (atlas.loaded) { - var spriteAlignments = this._getSpriteAlignment(this._tag.iconIndex, this._tag.iconAlignment); - var sprite = atlas.getDOMSprite(this._tag.icon, spriteAlignments[0], spriteAlignments[1]); - 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], - }, - }; - vNodes.push(vd.h("div.TagSymbol", properties, [sprite])); - } - } - } - else if (this._tag.text != null) { - var textVertex = this._tag.geometry.getVertex3d(3, this._transform); - var textCameraSpace = this._convertToCameraSpace(textVertex, matrixWorldInverse); - if (textCameraSpace.z < 0) { - var interact = function (e) { - _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag }); + 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 _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 labelCanvas = this._projectToCanvas(textCameraSpace, projectionMatrix); - var labelCss = labelCanvas.map(function (coord) { return (100 * coord) + "%"; }); var properties = { + onclick: click, onmousedown: interact, - style: { - color: "#" + ("000000" + this._tag.textColor.toString(16)).substr(-6), - left: labelCss[0], - pointerEvents: "all", - position: "absolute", - top: labelCss[1], - }, - textContent: this._tag.text, + style: { transform: transform }, }; - vNodes.push(vd.h("span.TagSymbol", properties, [])); + vNodes.push(vd.h("div.TagSymbol", properties, [sprite])); } } } + else if (this._tag.text != null && (isRect || isPerspective)) { + 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 properties = { + onmousedown: interact, + style: { + color: this._colorToCss(this._tag.textColor), + transform: transform, + }, + textContent: this._tag.text, + }; + vNodes.push(vd.h("span.TagSymbol", properties, [])); + } + } 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); @@ -24671,6 +30795,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) { @@ -24689,11 +30829,11 @@ var OutlineRenderTag = (function (_super) { var geometry = new THREE.BufferGeometry(); geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3)); geometry.computeBoundingSphere(); - var material = new THREE.LineBasicMaterial({ - color: this._tag.lineColor, - linewidth: this._tag.lineWidth, - }); - return new THREE.Line(geometry, material); + var material = new THREE.LineBasicMaterial(); + this._updateLineBasicMaterial(material); + var line = new THREE.Line(geometry, material); + line.renderOrder = 1; + return line; }; OutlineRenderTag.prototype._createOutline = function () { var points3d = this._tag.geometry.getPoints3d(this._transform); @@ -24735,39 +30875,13 @@ var OutlineRenderTag = (function (_super) { } return positions; }; - OutlineRenderTag.prototype._getSpriteAlignment = function (index, alignment) { - var horizontalAlignment = Viewer_1.SpriteAlignment.Center; - var verticalAlignment = Viewer_1.SpriteAlignment.Center; - if (alignment === Component_1.Alignment.Outer) { - switch (index) { - case 0: - horizontalAlignment = Viewer_1.SpriteAlignment.End; - verticalAlignment = Viewer_1.SpriteAlignment.Start; - break; - case 1: - horizontalAlignment = Viewer_1.SpriteAlignment.End; - verticalAlignment = Viewer_1.SpriteAlignment.End; - break; - case 2: - horizontalAlignment = Viewer_1.SpriteAlignment.Start; - verticalAlignment = Viewer_1.SpriteAlignment.End; - break; - case 3: - horizontalAlignment = Viewer_1.SpriteAlignment.Start; - verticalAlignment = Viewer_1.SpriteAlignment.Start; - break; - default: - break; - } - } - return [horizontalAlignment, verticalAlignment]; - }; - 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, @@ -24791,8 +30905,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; @@ -24835,26 +30948,46 @@ 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 ? 1 : 0; - material.transparent = this._tag.lineWidth <= 0; + 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":207,"../../../Viewer":216,"three":157,"virtual-dom":163}],264:[function(require,module,exports){ +},{"../../../Component":230,"three":180,"virtual-dom":186}],315:[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 __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 Viewer_1 = require("../../../Viewer"); /** * @class OutlineTag + * * @classdesc Tag holding properties for visualizing a geometry outline. + * + * @example + * ``` + * var geometry = new Mapillary.TagComponent.RectGeometry([0.3, 0.3, 0.5, 0.4]); + * var tag = new Mapillary.TagComponent.OutlineTag( + * "id-1", + * geometry + * { editable: true, lineColor: 0xff0000 }); + * + * tagComponent.add([tag]); + * ``` */ var OutlineTag = (function (_super) { __extends(OutlineTag, _super); @@ -24863,30 +30996,32 @@ var OutlineTag = (function (_super) { * * @override * @constructor - * @param {string} id - * @param {Geometry} geometry + * @param {string} id - Unique identifier of the tag. + * @param {VertexGeometry} geometry - Geometry defining vertices of tag. * @param {IOutlineTagOptions} options - Options defining the visual appearance and * behavior of the outline tag. */ function OutlineTag(id, geometry, options) { - var _this = this; - _super.call(this, id, geometry); - 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; - this._icon = options.icon === undefined ? null : options.icon; - this._iconAlignment = options.iconAlignment == null ? Component_1.Alignment.Outer : options.iconAlignment; - this._iconIndex = options.iconIndex == null ? 3 : options.iconIndex; - this._indicateVertices = options.indicateVertices == null ? true : options.indicateVertices; - this._lineColor = options.lineColor == null ? 0xFFFFFF : options.lineColor; - this._lineWidth = options.lineWidth == null ? 1 : options.lineWidth; - this._text = options.text === undefined ? null : options.text; - this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor; - this._click$ = new Subject_1.Subject(); - this._click$ + 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; + _this._icon = options.icon === undefined ? null : options.icon; + _this._iconFloat = options.iconFloat == null ? Viewer_1.Alignment.Center : options.iconFloat; + _this._iconIndex = options.iconIndex == null ? 3 : options.iconIndex; + _this._indicateVertices = options.indicateVertices == null ? true : options.indicateVertices; + _this._lineColor = options.lineColor == null ? 0xFFFFFF : options.lineColor; + _this._lineOpacity = options.lineOpacity == null ? 1 : options.lineOpacity; + _this._lineWidth = options.lineWidth == null ? 1 : options.lineWidth; + _this._text = options.text === undefined ? null : options.text; + _this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor; + _this._click$ = new Subject_1.Subject(); + _this._click$ .subscribe(function (t) { _this.fire(OutlineTag.click, _this); }); + return _this; } Object.defineProperty(OutlineTag.prototype, "click$", { /** @@ -24967,6 +31102,7 @@ var OutlineTag = (function (_super) { configurable: true }); Object.defineProperty(OutlineTag.prototype, "geometry", { + /** @inheritdoc */ get: function () { return this._geometry; }, @@ -24994,22 +31130,22 @@ var OutlineTag = (function (_super) { enumerable: true, configurable: true }); - Object.defineProperty(OutlineTag.prototype, "iconAlignment", { + Object.defineProperty(OutlineTag.prototype, "iconFloat", { /** - * Get icon alignment property. + * Get icon float property. * @returns {Alignment} */ get: function () { - return this._iconAlignment; + return this._iconFloat; }, /** - * Set icon alignment property. + * Set icon float property. * @param {Alignment} * * @fires Tag#changed */ set: function (value) { - this._iconAlignment = value; + this._iconFloat = value; this._notifyChanged$.next(this); }, enumerable: true, @@ -25079,6 +31215,27 @@ var OutlineTag = (function (_super) { enumerable: true, configurable: true }); + Object.defineProperty(OutlineTag.prototype, "lineOpacity", { + /** + * Get line opacity property. + * @returns {number} + */ + get: function () { + return this._lineOpacity; + }, + /** + * Set line opacity property. + * @param {number} + * + * @fires Tag#changed + */ + set: function (value) { + this._lineOpacity = value; + this._notifyChanged$.next(this); + }, + enumerable: true, + configurable: true + }); Object.defineProperty(OutlineTag.prototype, "lineWidth", { /** * Get line width property. @@ -25145,7 +31302,7 @@ var OutlineTag = (function (_super) { /** * Set options for tag. * - * @description Sets all the option properties provided and keps + * @description Sets all the option properties provided and keeps * the rest of the values as is. * * @param {IOutlineTagOptions} options - Outline tag options @@ -25155,7 +31312,7 @@ var OutlineTag = (function (_super) { OutlineTag.prototype.setOptions = function (options) { this._editable = options.editable == null ? this._editable : options.editable; this._icon = options.icon === undefined ? this._icon : options.icon; - this._iconAlignment = options.iconAlignment == null ? this._iconAlignment : options.iconAlignment; + this._iconFloat = options.iconFloat == null ? this._iconFloat : options.iconFloat; this._iconIndex = options.iconIndex == null ? this._iconIndex : options.iconIndex; this._indicateVertices = options.indicateVertices == null ? this._indicateVertices : options.indicateVertices; this._lineColor = options.lineColor == null ? this._lineColor : options.lineColor; @@ -25176,33 +31333,22 @@ var OutlineTag = (function (_super) { return OutlineTag; }(Component_1.Tag)); exports.OutlineTag = OutlineTag; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = OutlineTag; -},{"../../../Component":207,"rxjs/Subject":33}],265:[function(require,module,exports){ -/// +},{"../../../Component":230,"../../../Viewer":241,"rxjs/Subject":34}],316:[function(require,module,exports){ "use strict"; -var THREE = require("three"); +/// +Object.defineProperty(exports, "__esModule", { value: true }); var Subject_1 = require("rxjs/Subject"); +var Geo_1 = require("../../../Geo"); var RenderTag = (function () { - function RenderTag(tag, transform) { + 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", { - /** - * Get the GL objects for rendering of the tag. - * @return {Array} - */ - get: function () { - return this._glObjects; - }, - enumerable: true, - configurable: true - }); Object.defineProperty(RenderTag.prototype, "glObjectsChanged$", { get: function () { return this._glObjectsChanged$; @@ -25224,28 +31370,25 @@ var RenderTag = (function () { enumerable: true, configurable: true }); - RenderTag.prototype._projectToCanvas = function (point3d, projectionMatrix) { - var projected = new THREE.Vector3(point3d.x, point3d.y, point3d.z) - .applyProjection(projectionMatrix); - return [(projected.x + 1) / 2, (-projected.y + 1) / 2]; - }; - RenderTag.prototype._convertToCameraSpace = function (point3d, matrixWorldInverse) { - return new THREE.Vector3(point3d[0], point3d[1], point3d[2]).applyMatrix4(matrixWorldInverse); - }; return RenderTag; }()); exports.RenderTag = RenderTag; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = RenderTag; -},{"rxjs/Subject":33,"three":157}],266:[function(require,module,exports){ -/// +},{"../../../Geo":233,"rxjs/Subject":34}],317:[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 __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"); @@ -25256,62 +31399,59 @@ var Viewer_1 = require("../../../Viewer"); var SpotRenderTag = (function (_super) { __extends(SpotRenderTag, _super); function SpotRenderTag() { - _super.apply(this, arguments); + return _super !== null && _super.apply(this, arguments) || this; } - SpotRenderTag.prototype.dispose = function () { return; }; - SpotRenderTag.prototype.getDOMObjects = function (atlas, matrixWorldInverse, projectionMatrix) { + 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 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 _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: _this._tag }); + _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: tag }); }; - if (this._tag.icon != null) { + var canvasX = Math.round(centroidCanvas[0]); + var canvasY = Math.round(centroidCanvas[1]); + if (tag.icon != null) { if (atlas.loaded) { - var sprite = atlas.getDOMSprite(this._tag.icon, Viewer_1.SpriteAlignment.Center, Viewer_1.SpriteAlignment.End); + var sprite = atlas.getDOMSprite(tag.icon, Viewer_1.Alignment.Bottom); + var transform_1 = "translate(" + canvasX + "px," + (canvasY + 8) + "px)"; var properties = { onmousedown: interactNone, style: { - bottom: 100 * (1 - centroidCanvas[1]) + "%", - left: centroidCss[0], pointerEvents: "all", - position: "absolute", - transform: "translate(0px, -8px)", + transform: transform_1, }, }; vNodes.push(vd.h("div", properties, [sprite])); } } - else if (this._tag.text != null) { + else if (tag.text != null) { + var transform_2 = "translate(-50%,0%) translate(" + canvasX + "px," + (canvasY + 8) + "px)"; var properties = { onmousedown: interactNone, style: { - bottom: 100 * (1 - centroidCanvas[1]) + "%", - color: "#" + ("000000" + this._tag.textColor.toString(16)).substr(-6), - left: centroidCss[0], - pointerEvents: "all", - position: "absolute", - transform: "translate(-50%, -7px)", + color: this._colorToCss(tag.textColor), + transform: transform_2, }, - textContent: this._tag.text, + textContent: 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 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, - left: centroidCss[0], - pointerEvents: "all", - position: "absolute", - top: centroidCss[1], + transform: transform, }, }; vNodes.push(vd.h("div.TagSpotInteractor", interactorProperties, [])); @@ -25319,25 +31459,29 @@ var SpotRenderTag = (function (_super) { var pointProperties = { style: { background: background, - left: centroidCss[0], - position: "absolute", - top: centroidCss[1], + transform: transform, }, }; vNodes.push(vd.h("div.TagVertex", pointProperties, [])); } return vNodes; }; - SpotRenderTag.prototype._interact = function (operation, vertexIndex) { + 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: _this._tag, + tag: tag, vertexIndex: vertexIndex, }); }; @@ -25346,17 +31490,35 @@ var SpotRenderTag = (function (_super) { }(Component_1.RenderTag)); exports.SpotRenderTag = SpotRenderTag; -},{"../../../Component":207,"../../../Viewer":216,"virtual-dom":163}],267:[function(require,module,exports){ +},{"../../../Component":230,"../../../Viewer":241,"virtual-dom":186}],318:[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 __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 = (function (_super) { __extends(SpotTag, _super); @@ -25371,12 +31533,14 @@ var SpotTag = (function (_super) { * behavior of the spot tag. */ function SpotTag(id, geometry, options) { - _super.call(this, id, geometry); - 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 _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", { /** @@ -25504,16 +31668,21 @@ var SpotTag = (function (_super) { return SpotTag; }(Component_1.Tag)); exports.SpotTag = SpotTag; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = SpotTag; -},{"../../../Component":207}],268:[function(require,module,exports){ +},{"../../../Component":230}],319:[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 __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"); require("rxjs/add/operator/map"); require("rxjs/add/operator/share"); @@ -25533,19 +31702,19 @@ var Tag = (function (_super) { * @param {Geometry} geometry */ function Tag(id, geometry) { - var _this = this; - _super.call(this); - this._id = id; - this._geometry = geometry; - this._notifyChanged$ = new Subject_1.Subject(); - this._notifyChanged$ + 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$ + _this._geometry.changed$ .subscribe(function (g) { _this.fire(Tag.geometrychanged, _this); }); + return _this; } Object.defineProperty(Tag.prototype, "id", { /** @@ -25561,7 +31730,7 @@ var Tag = (function (_super) { Object.defineProperty(Tag.prototype, "geometry", { /** * Get geometry property. - * @returns {Geometry} + * @returns {Geometry} The geometry of the tag. */ get: function () { return this._geometry; @@ -25573,6 +31742,7 @@ var Tag = (function (_super) { /** * Get changed observable. * @returns {Observable} + * @ignore */ get: function () { return this._notifyChanged$; @@ -25584,6 +31754,7 @@ var Tag = (function (_super) { /** * Get geometry changed observable. * @returns {Observable} + * @ignore */ get: function () { var _this = this; @@ -25614,158 +31785,144 @@ var Tag = (function (_super) { return Tag; }(Utils_1.EventEmitter)); exports.Tag = Tag; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Tag; -},{"../../../Utils":215,"rxjs/Subject":33,"rxjs/add/operator/map":60,"rxjs/add/operator/share":69}],269:[function(require,module,exports){ +},{"../../../Utils":240,"rxjs/Subject":34,"rxjs/add/operator/map":65,"rxjs/add/operator/share":75}],320:[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 __()); -}; +Object.defineProperty(exports, "__esModule", { value: true }); +var HandlerBase = (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 + }); + /** + * 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)); + }; + /** + * 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 HandlerBase; +}()); +exports.HandlerBase = HandlerBase; +exports.default = HandlerBase; + +},{}],321:[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 MapillaryError_1 = require("./MapillaryError"); var ArgumentMapillaryError = (function (_super) { __extends(ArgumentMapillaryError, _super); function ArgumentMapillaryError(message) { - _super.call(this); - this.name = "ArgumentMapillaryError"; - this.message = message != null ? message : "The argument is not valid."; + var _this = _super.call(this, message != null ? message : "The argument is not valid.") || this; + _this.name = "ArgumentMapillaryError"; + return _this; } return ArgumentMapillaryError; }(MapillaryError_1.MapillaryError)); exports.ArgumentMapillaryError = ArgumentMapillaryError; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = ArgumentMapillaryError; -},{"./MapillaryError":272}],270:[function(require,module,exports){ +},{"./MapillaryError":323}],322:[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 __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 MapillaryError_1 = require("./MapillaryError"); var GraphMapillaryError = (function (_super) { __extends(GraphMapillaryError, _super); function GraphMapillaryError(message) { - _super.call(this); - this.name = "GraphMapillaryError"; - this.message = message; + var _this = _super.call(this, message) || this; + _this.name = "GraphMapillaryError"; + return _this; } return GraphMapillaryError; }(MapillaryError_1.MapillaryError)); exports.GraphMapillaryError = GraphMapillaryError; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = GraphMapillaryError; -},{"./MapillaryError":272}],271:[function(require,module,exports){ +},{"./MapillaryError":323}],323:[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 MapillaryError_1 = require("./MapillaryError"); -var InitializationMapillaryError = (function (_super) { - __extends(InitializationMapillaryError, _super); - function InitializationMapillaryError() { - _super.call(this); - this.name = "InitializationMapillaryError"; - this.message = "Could not initialize"; - } - return InitializationMapillaryError; -}(MapillaryError_1.MapillaryError)); -exports.InitializationMapillaryError = InitializationMapillaryError; +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 }); -exports.default = InitializationMapillaryError; - -},{"./MapillaryError":272}],272:[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 MapillaryError = (function (_super) { __extends(MapillaryError, _super); - function MapillaryError() { - _super.call(this); - // fixme ERROR have not loaded correct props - // this.stack = (new Error()).stack; - } - return MapillaryError; -}(Error)); -exports.MapillaryError = MapillaryError; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = MapillaryError; - -},{}],273:[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 MapillaryError_1 = require("./MapillaryError"); -var MoveTypeMapillaryError = (function (_super) { - __extends(MoveTypeMapillaryError, _super); - function MoveTypeMapillaryError() { - _super.call(this); - this.name = "MoveTypeMapillaryError"; - this.message = "The type of ui you use does not support this move"; - } - return MoveTypeMapillaryError; -}(MapillaryError_1.MapillaryError)); -exports.MoveTypeMapillaryError = MoveTypeMapillaryError; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = MoveTypeMapillaryError; - -},{"./MapillaryError":272}],274:[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 MapillaryError_1 = require("./MapillaryError"); -var NotImplementedMapillaryError = (function (_super) { - __extends(NotImplementedMapillaryError, _super); - function NotImplementedMapillaryError() { - _super.call(this); - this.name = "NotImplementedMapillaryError"; - this.message = "This function has not yet been implemented"; - } - return NotImplementedMapillaryError; -}(MapillaryError_1.MapillaryError)); -exports.NotImplementedMapillaryError = NotImplementedMapillaryError; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = NotImplementedMapillaryError; - -},{"./MapillaryError":272}],275:[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 MapillaryError_1 = require("./MapillaryError"); -var ParameterMapillaryError = (function (_super) { - __extends(ParameterMapillaryError, _super); - function ParameterMapillaryError(message) { - _super.call(this); - this.name = "ParameterMapillaryError"; - this.message = message != null ? message : "The function was not called with correct parameters"; - } - return ParameterMapillaryError; -}(MapillaryError_1.MapillaryError)); -exports.ParameterMapillaryError = ParameterMapillaryError; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = ParameterMapillaryError; + function MapillaryError(message) { + var _this = _super.call(this, message) || this; + _this.name = "MapillaryError"; + return _this; + } + return MapillaryError; +}(Error)); +exports.MapillaryError = MapillaryError; +exports.default = MapillaryError; -},{"./MapillaryError":272}],276:[function(require,module,exports){ -/// +},{}],324:[function(require,module,exports){ "use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); /** * @class Camera @@ -25894,20 +32051,27 @@ var Camera = (function () { /** * Get the focal length based on the transform. * - * @description Returns 0.5 focal length if transform has gpano - * information. + * @description Returns the focal length of the transform if gpano info is not available. + * Returns a focal length corresponding to a vertical fov clamped to [45, 90] degrees based on + * the gpano information if available. * * @returns {number} Focal length. */ Camera.prototype._getFocal = function (transform) { - return transform.gpano == null ? transform.focal : 0.5; + if (transform.gpano == null) { + return transform.focal; + } + var vFov = Math.PI * transform.gpano.CroppedAreaImageHeightPixels / transform.gpano.FullPanoHeightPixels; + var focal = 0.5 / Math.tan(vFov / 2); + return Math.min(1 / (2 * (Math.sqrt(2) - 1)), Math.max(0.5, focal)); }; return Camera; }()); exports.Camera = Camera; -},{"three":157}],277:[function(require,module,exports){ +},{"three":180}],325:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /** * @class GeoCoords * @@ -26127,12 +32291,12 @@ var GeoCoords = (function () { return GeoCoords; }()); exports.GeoCoords = GeoCoords; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = GeoCoords; -},{}],278:[function(require,module,exports){ -/// +},{}],326:[function(require,module,exports){ "use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); /** * @class Spatial @@ -26143,10 +32307,21 @@ var Spatial = (function () { function Spatial() { this._epsilon = 1e-9; } + /** + * Converts azimuthal phi rotation (counter-clockwise with origin on X-axis) to + * bearing (clockwise with origin at north or Y-axis). + * + * @param {number} phi - Azimuthal phi angle in radians. + * @returns {number} Bearing in radians. + */ + Spatial.prototype.azimuthalToBearing = function (phi) { + return -phi + Math.PI / 2; + }; /** * Converts degrees to radians. * - * @param {number} deg Degrees. + * @param {number} deg - Degrees. + * @returns {number} Radians. */ Spatial.prototype.degToRad = function (deg) { return Math.PI * deg / 180; @@ -26154,7 +32329,8 @@ var Spatial = (function () { /** * Converts radians to degrees. * - * @param {number} rad Radians. + * @param {number} rad - Radians. + * @returns {number} Degrees. */ Spatial.prototype.radToDeg = function (rad) { return 180 * rad / Math.PI; @@ -26162,19 +32338,23 @@ var Spatial = (function () { /** * Creates a rotation matrix from an angle-axis vector. * - * @param {Array} angleAxis Angle-axis representation of a rotation. + * @param {Array} angleAxis - Angle-axis representation of a rotation. + * @returns {THREE.Matrix4} Rotation matrix. */ Spatial.prototype.rotationMatrix = function (angleAxis) { var axis = new THREE.Vector3(angleAxis[0], angleAxis[1], angleAxis[2]); var angle = axis.length(); - axis.normalize(); + if (angle > 0) { + axis.normalize(); + } return new THREE.Matrix4().makeRotationAxis(axis, angle); }; /** * Rotates a vector according to a angle-axis rotation vector. * - * @param {Array} vector Vector to rotate. - * @param {Array} angleAxis Angle-axis representation of a rotation. + * @param {Array} vector - Vector to rotate. + * @param {Array} angleAxis - Angle-axis representation of a rotation. + * @returns {THREE.Vector3} Rotated vector. */ Spatial.prototype.rotate = function (vector, angleAxis) { var v = new THREE.Vector3(vector[0], vector[1], vector[2]); @@ -26187,8 +32367,9 @@ var Spatial = (function () { * on the angle-axis representation and a translation vector * according to C = -R^T t. * - * @param {Array} rotation Angle-axis representation of a rotation. - * @param {Array} translation Translation vector. + * @param {Array} rotation - Angle-axis representation of a rotation. + * @param {Array} translation - Translation vector. + * @returns {THREE.Vector3} Optical center. */ Spatial.prototype.opticalCenter = function (rotation, translation) { var angleAxis = [-rotation[0], -rotation[1], -rotation[2]]; @@ -26199,7 +32380,8 @@ var Spatial = (function () { * Calculates the viewing direction from a rotation vector * on the angle-axis representation. * - * @param {number[]} rotation Angle-axis representation of a rotation. + * @param {number[]} rotation - Angle-axis representation of a rotation. + * @returns {THREE.Vector3} Viewing direction. */ Spatial.prototype.viewingDirection = function (rotation) { var angleAxis = [-rotation[0], -rotation[1], -rotation[2]]; @@ -26208,11 +32390,10 @@ var Spatial = (function () { /** * Wrap a number on the interval [min, max]. * - * @param {number} value Value to wrap. - * @param {number} min Lower endpoint of interval. - * @param {number} max Upper endpoint of interval. - * - * @returs {number} The wrapped number. + * @param {number} value - Value to wrap. + * @param {number} min - Lower endpoint of interval. + * @param {number} max - Upper endpoint of interval. + * @returns {number} The wrapped number. */ Spatial.prototype.wrap = function (value, min, max) { if (max < min) { @@ -26232,9 +32413,8 @@ var Spatial = (function () { /** * Wrap an angle on the interval [-Pi, Pi]. * - * @param {number} angle Value to wrap. - * - * @returs {number} The wrapped angle. + * @param {number} angle - Value to wrap. + * @returns {number} Wrapped angle. */ Spatial.prototype.wrapAngle = function (angle) { return this.wrap(angle, -Math.PI, Math.PI); @@ -26243,11 +32423,10 @@ var Spatial = (function () { * Limit the value to the interval [min, max] by changing the value to * the nearest available one when it is outside the interval. * - * @param {number} value Value to clamp. - * @param {number} min Minimum of the interval. - * @param {number} max Maximum of the interval. - * - * @returns {number} The clamped value. + * @param {number} value - Value to clamp. + * @param {number} min - Minimum of the interval. + * @param {number} max - Maximum of the interval. + * @returns {number} Clamped value. */ Spatial.prototype.clamp = function (value, min, max) { if (value < min) { @@ -26262,10 +32441,11 @@ var Spatial = (function () { * Calculates the counter-clockwise angle from the first * vector (x1, y1)^T to the second (x2, y2)^T. * - * @param {number} x1 X-value of first vector. - * @param {number} y1 Y-value of first vector. - * @param {number} x2 X-value of second vector. - * @param {number} y2 Y-value of second vector. + * @param {number} x1 - X coordinate of first vector. + * @param {number} y1 - Y coordinate of first vector. + * @param {number} x2 - X coordinate of second vector. + * @param {number} y2 - Y coordinate of second vector. + * @returns {number} Counter clockwise angle between the vectors. */ Spatial.prototype.angleBetweenVector2 = function (x1, y1, x2, y2) { var angle = Math.atan2(y2, x2) - Math.atan2(y1, x1); @@ -26275,8 +32455,9 @@ var Spatial = (function () { * Calculates the minimum (absolute) angle change for rotation * from one angle to another on the [-Pi, Pi] interval. * - * @param {number} angle1 The origin angle. - * @param {number} angle2 The destination angle. + * @param {number} angle1 - Start angle. + * @param {number} angle2 - Destination angle. + * @returns {number} Absolute angle change between angles. */ Spatial.prototype.angleDifference = function (angle1, angle2) { var angle = angle2 - angle1; @@ -26286,8 +32467,9 @@ var Spatial = (function () { * Calculates the relative rotation angle between two * angle-axis vectors. * - * @param {number} rotation1 First angle-axis vector. - * @param {number} rotation2 Second angle-axis vector. + * @param {number} rotation1 - First angle-axis vector. + * @param {number} rotation2 - Second angle-axis vector. + * @returns {number} Relative rotation angle. */ Spatial.prototype.relativeRotationAngle = function (rotation1, rotation2) { var R1T = this.rotationMatrix([-rotation1[0], -rotation1[1], -rotation1[2]]); @@ -26301,8 +32483,9 @@ var Spatial = (function () { /** * Calculates the angle from a vector to a plane. * - * @param {Array} vector The vector. - * @param {Array} planeNormal Normal of the plane. + * @param {Array} vector - The vector. + * @param {Array} planeNormal - Normal of the plane. + * @returns {number} Angle from between plane and vector. */ Spatial.prototype.angleToPlane = function (vector, planeNormal) { var v = new THREE.Vector3().fromArray(vector); @@ -26318,10 +32501,11 @@ var Spatial = (function () { * (latitude longitude pairs) in meters according to * the haversine formula. * - * @param {number} lat1 The latitude of the first coordinate. - * @param {number} lon1 The longitude of the first coordinate. - * @param {number} lat2 The latitude of the second coordinate. - * @param {number} lon2 The longitude of the second coordinate. + * @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. */ Spatial.prototype.distanceFromLatLon = function (lat1, lon1, lat2, lon2) { var r = 6371000; @@ -26336,12 +32520,12 @@ var Spatial = (function () { return Spatial; }()); exports.Spatial = Spatial; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Spatial; -},{"three":157}],279:[function(require,module,exports){ -/// +},{"three":180}],327:[function(require,module,exports){ "use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); /** * @class Transform @@ -26366,6 +32550,8 @@ var Transform = (function () { 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; @@ -26383,6 +32569,38 @@ var Transform = (function () { enumerable: true, configurable: true }); + Object.defineProperty(Transform.prototype, "basicHeight", { + /** + * Get basic height. + * + * @description Does not fall back to node image height but + * uses original value from API so can be faulty. + * + * @returns {number} The height of the basic version image + * (adjusted for orientation). + */ + get: function () { + return this._basicHeight; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Transform.prototype, "basicWidth", { + /** + * Get basic width. + * + * @description Does not fall back to node image width but + * uses original value from API so can be faulty. + * + * @returns {number} The width of the basic version image + * (adjusted for orientation). + */ + get: function () { + return this._basicWidth; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(Transform.prototype, "focal", { /** * Get focal. @@ -26394,6 +32612,23 @@ var Transform = (function () { enumerable: true, configurable: true }); + Object.defineProperty(Transform.prototype, "fullPano", { + /** + * Get fullPano. + * + * @returns {boolean} Value indicating whether the node is a complete + * 360 panorama. + */ + get: function () { + return this._gpano != null && + this._gpano.CroppedAreaLeftPixels === 0 && + this._gpano.CroppedAreaTopPixels === 0 && + this._gpano.CroppedAreaImageWidthPixels === this._gpano.FullPanoWidthPixels && + this._gpano.CroppedAreaImageHeightPixels === this._gpano.FullPanoHeightPixels; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(Transform.prototype, "gpano", { /** * Get gpano. @@ -26408,6 +32643,10 @@ var Transform = (function () { Object.defineProperty(Transform.prototype, "height", { /** * Get height. + * + * @description Falls back to the node image height if + * the API data is faulty. + * * @returns {number} The orientation adjusted image height. */ get: function () { @@ -26460,9 +32699,24 @@ var Transform = (function () { enumerable: true, configurable: true }); + Object.defineProperty(Transform.prototype, "hasValidScale", { + /** + * Get has valid scale. + * @returns {boolean} Value indicating if the scale of the transform is valid. + */ + get: function () { + return this._scale > 1e-2 && this._scale < 50; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(Transform.prototype, "width", { /** * Get width. + * + * @description Falls back to the node image width if + * the API data is faulty. + * * @returns {number} The orientation adjusted image width. */ get: function () { @@ -26621,10 +32875,18 @@ var Transform = (function () { ]; } else { - return [ - bearing[0] * this._focal / bearing[2], - bearing[1] * this._focal / bearing[2], - ]; + if (bearing[2] > 0) { + return [ + bearing[0] * this._focal / bearing[2], + bearing[1] * this._focal / bearing[2], + ]; + } + else { + return [ + bearing[0] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, + bearing[1] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, + ]; + } } }; /** @@ -26737,7 +32999,9 @@ var Transform = (function () { Transform.prototype._getRt = function (rotation, translation) { var axis = new THREE.Vector3(rotation[0], rotation[1], rotation[2]); var angle = axis.length(); - axis.normalize(); + if (angle > 0) { + axis.normalize(); + } var rt = new THREE.Matrix4(); rt.makeRotationAxis(axis, angle); rt.setPosition(new THREE.Vector3(translation[0], translation[1], translation[2])); @@ -26787,9 +33051,473 @@ var Transform = (function () { }()); exports.Transform = Transform; -},{"three":157}],280:[function(require,module,exports){ +},{"three":180}],328:[function(require,module,exports){ +"use strict"; /// +Object.defineProperty(exports, "__esModule", { value: true }); +var THREE = require("three"); +/** + * @class ViewportCoords + * + * @classdesc Provides methods for calculating 2D coordinate conversions + * as well as 3D projection and unprojection. + * + * 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. + * + * Viewport coordinates are 2D coordinates on the [-1, 1] interval and + * have the origin point in the center. The bottom left corner point is + * (-1, -1) and the top right corner point is (1, 1). + * + * Canvas coordiantes are 2D pixel coordinates on the [0, canvasWidth] and + * [0, canvasHeight] intervals. The origin point (0, 0) is in the top left + * corner and the maximum value is (canvasWidth, canvasHeight) is in the + * bottom right corner. + * + * 3D coordinates are in the topocentric world reference frame. + */ +var ViewportCoords = (function () { + function ViewportCoords() { + this._unprojectDepth = 200; + } + /** + * Convert basic coordinates to canvas coordinates. + * + * @description Transform origin and camera position needs to be the + * equal for reliable return value. + * + * @param {number} basicX - Basic X coordinate. + * @param {number} basicY - Basic Y coordinate. + * @param {HTMLElement} container - The viewer container. + * @param {Transform} transform - Transform of the node to unproject from. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} 2D canvas coordinates. + */ + ViewportCoords.prototype.basicToCanvas = function (basicX, basicY, container, transform, camera) { + var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth); + var canvas = this.projectToCanvas(point3d, container, camera); + return canvas; + }; + /** + * Convert basic coordinates to canvas coordinates safely. If 3D point is + * behind camera null will be returned. + * + * @description Transform origin and camera position needs to be the + * equal for reliable return value. + * + * @param {number} basicX - Basic X coordinate. + * @param {number} basicY - Basic Y coordinate. + * @param {HTMLElement} container - The viewer container. + * @param {Transform} transform - Transform of the node to unproject from. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} 2D canvas coordinates if the basic point represents a 3D point + * in front of the camera, otherwise null. + */ + ViewportCoords.prototype.basicToCanvasSafe = function (basicX, basicY, container, transform, camera) { + var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth); + var pointCamera = this.worldToCamera(point3d, camera); + if (pointCamera[2] > 0) { + return null; + } + var _a = this.cameraToViewport(pointCamera, camera), viewportX = _a[0], viewportY = _a[1]; + var canvas = this.viewportToCanvas(viewportX, viewportY, container); + return canvas; + }; + /** + * Convert basic coordinates to viewport coordinates. + * + * @description Transform origin and camera position needs to be the + * equal for reliable return value. + * + * @param {number} basicX - Basic X coordinate. + * @param {number} basicY - Basic Y coordinate. + * @param {Transform} transform - Transform of the node to unproject from. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} 2D viewport coordinates. + */ + ViewportCoords.prototype.basicToViewport = function (basicX, basicY, transform, camera) { + var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth); + var viewport = this.projectToViewport(point3d, camera); + return viewport; + }; + /** + * Convert camera 3D coordinates to viewport coordinates. + * + * @param {number} pointCamera - 3D point in camera coordinate system. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} 2D viewport coordinates. + */ + ViewportCoords.prototype.cameraToViewport = function (pointCamera, camera) { + var viewport = new THREE.Vector3().fromArray(pointCamera) + .applyMatrix4(camera.projectionMatrix); + return [viewport.x, viewport.y]; + }; + /** + * Get canvas pixel position from event. + * + * @param {Event} event - Event containing clientX and clientY properties. + * @param {HTMLElement} element - HTML element. + * @returns {Array} 2D canvas coordinates. + */ + ViewportCoords.prototype.canvasPosition = function (event, element) { + var clientRect = element.getBoundingClientRect(); + var canvasX = event.clientX - clientRect.left - element.clientLeft; + var canvasY = event.clientY - clientRect.top - element.clientTop; + return [canvasX, canvasY]; + }; + /** + * Convert canvas coordinates to basic coordinates. + * + * @description Transform origin and camera position needs to be the + * equal for reliable return value. + * + * @param {number} canvasX - Canvas X coordinate. + * @param {number} canvasY - Canvas Y coordinate. + * @param {HTMLElement} container - The viewer container. + * @param {Transform} transform - Transform of the node to unproject from. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} 2D basic coordinates. + */ + ViewportCoords.prototype.canvasToBasic = function (canvasX, canvasY, container, transform, camera) { + var point3d = this.unprojectFromCanvas(canvasX, canvasY, container, camera) + .toArray(); + var basic = transform.projectBasic(point3d); + return basic; + }; + /** + * Convert canvas coordinates to viewport coordinates. + * + * @param {number} canvasX - Canvas X coordinate. + * @param {number} canvasY - Canvas Y coordinate. + * @param {HTMLElement} container - The viewer container. + * @returns {Array} 2D viewport coordinates. + */ + ViewportCoords.prototype.canvasToViewport = function (canvasX, canvasY, container) { + var _a = this.containerToCanvas(container), canvasWidth = _a[0], canvasHeight = _a[1]; + var viewportX = 2 * canvasX / canvasWidth - 1; + var viewportY = 1 - 2 * canvasY / canvasHeight; + return [viewportX, viewportY]; + }; + /** + * Determines the width and height of the container in canvas coordinates. + * + * @param {HTMLElement} container - The viewer container. + * @returns {Array} 2D canvas coordinates. + */ + ViewportCoords.prototype.containerToCanvas = function (container) { + return [container.offsetWidth, container.offsetHeight]; + }; + /** + * Determine basic distances from image to canvas corners. + * + * @description Transform origin and camera position needs to be the + * equal for reliable return value. + * + * Determines the smallest basic distance for every side of the canvas. + * + * @param {Transform} transform - Transform of the node to unproject from. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} Array of basic distances as [top, right, bottom, left]. + */ + ViewportCoords.prototype.getBasicDistances = function (transform, camera) { + var topLeftBasic = this.viewportToBasic(-1, 1, transform, camera); + var topRightBasic = this.viewportToBasic(1, 1, transform, camera); + var bottomRightBasic = this.viewportToBasic(1, -1, transform, camera); + var bottomLeftBasic = this.viewportToBasic(-1, -1, transform, camera); + var topBasicDistance = 0; + var rightBasicDistance = 0; + var bottomBasicDistance = 0; + var leftBasicDistance = 0; + if (topLeftBasic[1] < 0 && topRightBasic[1] < 0) { + topBasicDistance = topLeftBasic[1] > topRightBasic[1] ? + -topLeftBasic[1] : + -topRightBasic[1]; + } + if (topRightBasic[0] > 1 && bottomRightBasic[0] > 1) { + rightBasicDistance = topRightBasic[0] < bottomRightBasic[0] ? + topRightBasic[0] - 1 : + bottomRightBasic[0] - 1; + } + if (bottomRightBasic[1] > 1 && bottomLeftBasic[1] > 1) { + bottomBasicDistance = bottomRightBasic[1] < bottomLeftBasic[1] ? + bottomRightBasic[1] - 1 : + bottomLeftBasic[1] - 1; + } + if (bottomLeftBasic[0] < 0 && topLeftBasic[0] < 0) { + leftBasicDistance = bottomLeftBasic[0] > topLeftBasic[0] ? + -bottomLeftBasic[0] : + -topLeftBasic[0]; + } + return [topBasicDistance, rightBasicDistance, bottomBasicDistance, leftBasicDistance]; + }; + /** + * Determine pixel distances from image to canvas corners. + * + * @description Transform origin and camera position needs to be the + * equal for reliable return value. + * + * Determines the smallest pixel distance for every side of the canvas. + * + * @param {HTMLElement} container - The viewer container. + * @param {Transform} transform - Transform of the node to unproject from. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} Array of pixel distances as [top, right, bottom, left]. + */ + ViewportCoords.prototype.getPixelDistances = function (container, transform, camera) { + var topLeftBasic = this.viewportToBasic(-1, 1, transform, camera); + var topRightBasic = this.viewportToBasic(1, 1, transform, camera); + var bottomRightBasic = this.viewportToBasic(1, -1, transform, camera); + var bottomLeftBasic = this.viewportToBasic(-1, -1, transform, camera); + var topPixelDistance = 0; + var rightPixelDistance = 0; + var bottomPixelDistance = 0; + var leftPixelDistance = 0; + var _a = this.containerToCanvas(container), canvasWidth = _a[0], canvasHeight = _a[1]; + if (topLeftBasic[1] < 0 && topRightBasic[1] < 0) { + var basicX = topLeftBasic[1] > topRightBasic[1] ? + topLeftBasic[0] : + topRightBasic[0]; + var canvas = this.basicToCanvas(basicX, 0, container, transform, camera); + topPixelDistance = canvas[1] > 0 ? canvas[1] : 0; + } + if (topRightBasic[0] > 1 && bottomRightBasic[0] > 1) { + var basicY = topRightBasic[0] < bottomRightBasic[0] ? + topRightBasic[1] : + bottomRightBasic[1]; + var canvas = this.basicToCanvas(1, basicY, container, transform, camera); + rightPixelDistance = canvas[0] < canvasWidth ? canvasWidth - canvas[0] : 0; + } + if (bottomRightBasic[1] > 1 && bottomLeftBasic[1] > 1) { + var basicX = bottomRightBasic[1] < bottomLeftBasic[1] ? + bottomRightBasic[0] : + bottomLeftBasic[0]; + var canvas = this.basicToCanvas(basicX, 1, container, transform, camera); + bottomPixelDistance = canvas[1] < canvasHeight ? canvasHeight - canvas[1] : 0; + } + if (bottomLeftBasic[0] < 0 && topLeftBasic[0] < 0) { + var basicY = bottomLeftBasic[0] > topLeftBasic[0] ? + bottomLeftBasic[1] : + topLeftBasic[1]; + var canvas = this.basicToCanvas(0, basicY, container, transform, camera); + leftPixelDistance = canvas[0] > 0 ? canvas[0] : 0; + } + return [topPixelDistance, rightPixelDistance, bottomPixelDistance, leftPixelDistance]; + }; + /** + * Determine if an event occured inside an element. + * + * @param {Event} event - Event containing clientX and clientY properties. + * @param {HTMLElement} element - HTML element. + * @returns {boolean} Value indicating if the event occured inside the element or not. + */ + ViewportCoords.prototype.insideElement = function (event, element) { + var clientRect = element.getBoundingClientRect(); + var minX = clientRect.left + element.clientLeft; + var maxX = minX + element.clientWidth; + var minY = clientRect.top + element.clientTop; + var maxY = minY + element.clientHeight; + return event.clientX > minX && + event.clientX < maxX && + event.clientY > minY && + event.clientY < maxY; + }; + /** + * Project 3D world coordinates to canvas coordinates. + * + * @param {Array} point3D - 3D world coordinates. + * @param {HTMLElement} container - The viewer container. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} 2D canvas coordinates. + */ + ViewportCoords.prototype.projectToCanvas = function (point3d, container, camera) { + var viewport = this.projectToViewport(point3d, camera); + var canvas = this.viewportToCanvas(viewport[0], viewport[1], container); + return canvas; + }; + /** + * Project 3D world coordinates to viewport coordinates. + * + * @param {Array} point3D - 3D world coordinates. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} 2D viewport coordinates. + */ + ViewportCoords.prototype.projectToViewport = function (point3d, camera) { + var viewport = new THREE.Vector3(point3d[0], point3d[1], point3d[2]) + .project(camera); + return [viewport.x, viewport.y]; + }; + /** + * Uproject canvas coordinates to 3D world coordinates. + * + * @param {number} canvasX - Canvas X coordinate. + * @param {number} canvasY - Canvas Y coordinate. + * @param {HTMLElement} container - The viewer container. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} 3D world coordinates. + */ + ViewportCoords.prototype.unprojectFromCanvas = function (canvasX, canvasY, container, camera) { + var viewport = this.canvasToViewport(canvasX, canvasY, container); + var point3d = this.unprojectFromViewport(viewport[0], viewport[1], camera); + return point3d; + }; + /** + * Unproject viewport coordinates to 3D world coordinates. + * + * @param {number} viewportX - Viewport X coordinate. + * @param {number} viewportY - Viewport Y coordinate. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} 3D world coordinates. + */ + ViewportCoords.prototype.unprojectFromViewport = function (viewportX, viewportY, camera) { + var point3d = new THREE.Vector3(viewportX, viewportY, 1) + .unproject(camera); + return point3d; + }; + /** + * Convert viewport coordinates to basic coordinates. + * + * @description Transform origin and camera position needs to be the + * equal for reliable return value. + * + * @param {number} viewportX - Viewport X coordinate. + * @param {number} viewportY - Viewport Y coordinate. + * @param {Transform} transform - Transform of the node to unproject from. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} 2D basic coordinates. + */ + ViewportCoords.prototype.viewportToBasic = function (viewportX, viewportY, transform, camera) { + var point3d = new THREE.Vector3(viewportX, viewportY, 1) + .unproject(camera) + .toArray(); + var basic = transform.projectBasic(point3d); + return basic; + }; + /** + * Convert viewport coordinates to canvas coordinates. + * + * @param {number} viewportX - Viewport X coordinate. + * @param {number} viewportY - Viewport Y coordinate. + * @param {HTMLElement} container - The viewer container. + * @returns {Array} 2D canvas coordinates. + */ + ViewportCoords.prototype.viewportToCanvas = function (viewportX, viewportY, container) { + var _a = this.containerToCanvas(container), canvasWidth = _a[0], canvasHeight = _a[1]; + var canvasX = canvasWidth * (viewportX + 1) / 2; + var canvasY = -canvasHeight * (viewportY - 1) / 2; + return [canvasX, canvasY]; + }; + /** + * Convert 3D world coordinates to 3D camera coordinates. + * + * @param {number} point3D - 3D point in world coordinate system. + * @param {THREE.Camera} camera - Camera used in rendering. + * @returns {Array} 3D camera coordinates. + */ + ViewportCoords.prototype.worldToCamera = function (point3d, camera) { + var pointCamera = new THREE.Vector3(point3d[0], point3d[1], point3d[2]) + .applyMatrix4(camera.matrixWorldInverse); + return pointCamera.toArray(); + }; + return ViewportCoords; +}()); +exports.ViewportCoords = ViewportCoords; +exports.default = ViewportCoords; + +},{"three":180}],329:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * @class Filter + * + * @classdesc Represents a class for creating node filters. Implementation and + * definitions based on https://github.com/mapbox/feature-filter. + */ +var FilterCreator = (function () { + function FilterCreator() { + } + /** + * Create a filter from a filter expression. + * + * @description The following filters are supported: + * + * Comparison + * `==` + * `!=` + * `<` + * `<=` + * `>` + * `>=` + * + * Set membership + * `in` + * `!in` + * + * Combining + * `all` + * + * @param {FilterExpression} filter - Comparison, set membership or combinding filter + * expression. + * @returns {FilterFunction} Function taking a node and returning a boolean that + * indicates whether the node passed the test or not. + */ + FilterCreator.prototype.createFilter = function (filter) { + return new Function("node", "return " + this._compile(filter) + ";"); + }; + FilterCreator.prototype._compile = function (filter) { + if (filter == null || filter.length <= 1) { + return "true"; + } + var operator = filter[0]; + var operation = operator === "==" ? this._compileComparisonOp("===", filter[1], filter[2], false) : + operator === "!=" ? this._compileComparisonOp("!==", filter[1], filter[2], false) : + operator === ">" || + operator === ">=" || + operator === "<" || + operator === "<=" ? this._compileComparisonOp(operator, filter[1], filter[2], true) : + operator === "in" ? + this._compileInOp(filter[1], filter.slice(2)) : + operator === "!in" ? + this._compileNegation(this._compileInOp(filter[1], filter.slice(2))) : + operator === "all" ? this._compileLogicalOp(filter.slice(1), "&&") : + "true"; + return "(" + operation + ")"; + }; + FilterCreator.prototype._compare = function (a, b) { + return a < b ? -1 : a > b ? 1 : 0; + }; + FilterCreator.prototype._compileComparisonOp = function (operator, property, value, checkType) { + var left = this._compilePropertyReference(property); + var right = JSON.stringify(value); + return (checkType ? "typeof " + left + "===typeof " + right + "&&" : "") + left + operator + right; + }; + FilterCreator.prototype._compileInOp = function (property, values) { + var compare = this._compare; + var left = JSON.stringify(values.sort(compare)); + var right = this._compilePropertyReference(property); + return left + ".indexOf(" + right + ")!==-1"; + }; + FilterCreator.prototype._compileLogicalOp = function (filters, operator) { + var compile = this._compile.bind(this); + return filters.map(compile).join(operator); + }; + FilterCreator.prototype._compileNegation = function (expression) { + return "!(" + expression + ")"; + }; + FilterCreator.prototype._compilePropertyReference = function (property) { + return "node[" + JSON.stringify(property) + "]"; + }; + return FilterCreator; +}()); +exports.FilterCreator = FilterCreator; +exports.default = FilterCreator; + +},{}],330:[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/observable/from"); require("rxjs/add/operator/catch"); @@ -26797,7 +33525,6 @@ require("rxjs/add/operator/do"); require("rxjs/add/operator/finally"); require("rxjs/add/operator/map"); require("rxjs/add/operator/publish"); -var rbush = require("rbush"); var Edge_1 = require("../Edge"); var Error_1 = require("../Error"); var Graph_1 = require("../Graph"); @@ -26814,8 +33541,10 @@ var Graph = (function () { * @param {rbush.RBush} [nodeIndex] - Node index for fast spatial retreival. * @param {GraphCalculator} [graphCalculator] - Instance for graph calculations. * @param {EdgeCalculator} [edgeCalculator] - Instance for edge calculations. + * @param {FilterCreator} [filterCreator] - Instance for filter creation. + * @param {IGraphConfiguration} [configuration] - Configuration struct. */ - function Graph(apiV3, nodeIndex, graphCalculator, edgeCalculator) { + function Graph(apiV3, nodeIndex, graphCalculator, edgeCalculator, filterCreator, configuration) { this._apiV3 = apiV3; this._cachedNodes = {}; this._cachedNodeTiles = {}; @@ -26829,9 +33558,20 @@ var Graph = (function () { this._changed$ = new Subject_1.Subject(); this._defaultAlt = 2; this._edgeCalculator = edgeCalculator != null ? edgeCalculator : new Edge_1.EdgeCalculator(); + this._filterCreator = filterCreator != null ? filterCreator : new Graph_1.FilterCreator(); + this._filter = this._filterCreator.createFilter(undefined); this._graphCalculator = graphCalculator != null ? graphCalculator : new Graph_1.GraphCalculator(); + this._configuration = configuration != null ? + configuration : + { + maxSequences: 50, + maxUnusedNodes: 100, + maxUnusedTiles: 20, + }; this._nodes = {}; - this._nodeIndex = nodeIndex != null ? nodeIndex : rbush(16, [".lon", ".lat", ".lon", ".lat"]); + this._nodeIndex = nodeIndex != null ? nodeIndex : rbush(16, [".lat", ".lon", ".lat", ".lon"]); + this._nodeIndexTiles = {}; + this._nodeToTile = {}; this._preStored = {}; this._requiredNodeTiles = {}; this._requiredSpatialArea = {}; @@ -26993,7 +33733,7 @@ var Graph = (function () { if (!(node.sequenceKey in this._sequences)) { throw new Error_1.GraphMapillaryError("Sequence is not cached (" + key + "), (" + node.sequenceKey + ")"); } - var sequence = this._sequences[node.sequenceKey]; + var sequence = this._sequences[node.sequenceKey].sequence; var edges = this._edgeCalculator.computeSequenceEdges(node, sequence); node.cacheSequenceEdges(edges); }; @@ -27030,7 +33770,7 @@ var Graph = (function () { } var batchesToCache = batches.length; var spatialNodes$ = []; - var _loop_1 = function(batch) { + var _loop_1 = function (batch) { var spatialNodeBatch$ = this_1._apiV3.imageByKeyFill$(batch) .do(function (imageByKeyFill) { for (var fillKey in imageByKeyFill) { @@ -27097,17 +33837,27 @@ var Graph = (function () { throw new Error_1.GraphMapillaryError("Spatial edges already cached (" + key + ")."); } var node = this.getNode(key); - var sequence = this._sequences[node.sequenceKey]; + var sequence = this._sequences[node.sequenceKey].sequence; var fallbackKeys = []; - var nextKey = sequence.findNextKey(node.key); var prevKey = sequence.findPrevKey(node.key); + if (prevKey != null) { + fallbackKeys.push(prevKey); + } + var nextKey = sequence.findNextKey(node.key); + if (nextKey != null) { + fallbackKeys.push(nextKey); + } var allSpatialNodes = this._requiredSpatialArea[key].all; var potentialNodes = []; + var filter = this._filter; for (var spatialNodeKey in allSpatialNodes) { if (!allSpatialNodes.hasOwnProperty(spatialNodeKey)) { continue; } - potentialNodes.push(allSpatialNodes[spatialNodeKey]); + var spatialNode = allSpatialNodes[spatialNodeKey]; + if (filter(spatialNode)) { + potentialNodes.push(spatialNode); + } } var potentialEdges = this._edgeCalculator.getPotentialEdges(node, potentialNodes, fallbackKeys); var edges = this._edgeCalculator.computeStepEdges(node, potentialEdges, prevKey, nextKey); @@ -27118,6 +33868,7 @@ var Graph = (function () { node.cacheSpatialEdges(edges); this._cachedSpatialEdges[key] = node; delete this._requiredSpatialArea[key]; + delete this._cachedNodeTiles[key]; }; /** * Retrieve and cache geohash tiles for a node. @@ -27133,6 +33884,9 @@ var Graph = (function () { if (key in this._cachedNodeTiles) { throw new Error_1.GraphMapillaryError("Tiles already cached (" + key + ")."); } + if (key in this._cachedSpatialEdges) { + throw new Error_1.GraphMapillaryError("Spatial edges already cached so tiles considered cached (" + key + ")."); + } if (!(key in this._requiredNodeTiles)) { throw new Error_1.GraphMapillaryError("Tiles have not been determined (" + key + ")."); } @@ -27148,7 +33902,7 @@ var Graph = (function () { nodeTiles.caching = this._requiredNodeTiles[key].caching.concat(hs); nodeTiles.cache = []; var cacheTiles$ = []; - var _loop_2 = function(h) { + var _loop_2 = function (h) { var cacheTile$ = null; if (h in this_2._cachingTiles$) { cacheTile$ = this_2._cachingTiles$[h]; @@ -27160,8 +33914,9 @@ var Graph = (function () { if (h in _this._cachedTiles) { return; } - _this._cachedTiles[h] = []; - var hCache = _this._cachedTiles[h]; + _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)) { @@ -27180,12 +33935,26 @@ var Graph = (function () { var node_1 = preStored[coreNode.key]; delete preStored[coreNode.key]; hCache.push(node_1); - _this._nodeIndex.insert({ lat: node_1.latLon.lat, lon: node_1.latLon.lon, node: 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); - _this._nodeIndex.insert({ lat: node.latLon.lat, lon: node.latLon.lon, node: 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]; @@ -27251,7 +34020,9 @@ var Graph = (function () { } var node = this.getNode(key); node.initializeCache(new Graph_1.NodeCache()); - this._cachedNodes[key] = node; + var accessed = new Date().getTime(); + this._cachedNodes[key] = { accessed: accessed, node: node }; + this._updateCachedTileAccess(key, accessed); }; /** * Get a value indicating if the graph is fill caching a node. @@ -27323,6 +34094,9 @@ var Graph = (function () { * @returns {boolean} Value indicating if a node exist in the graph. */ Graph.prototype.hasNode = function (key) { + var accessed = new Date().getTime(); + this._updateCachedNodeAccess(key, accessed); + this._updateCachedTileAccess(key, accessed); return key in this._nodes; }; /** @@ -27334,7 +34108,12 @@ var Graph = (function () { */ Graph.prototype.hasNodeSequence = function (key) { var node = this.getNode(key); - return node.sequenceKey in this._sequences; + var sequenceKey = node.sequenceKey; + var hasNodeSequence = sequenceKey in this._sequences; + if (hasNodeSequence) { + this._sequences[sequenceKey].accessed = new Date().getTime(); + } + return hasNodeSequence; }; /** * Get a value indicating if a sequence exist in the graph. @@ -27344,7 +34123,11 @@ var Graph = (function () { * in the graph. */ Graph.prototype.hasSequence = function (sequenceKey) { - return sequenceKey in this._sequences; + var hasSequence = sequenceKey in this._sequences; + if (hasSequence) { + this._sequences[sequenceKey].accessed = new Date().getTime(); + } + return hasSequence; }; /** * Get a value indicating if the graph has fully cached @@ -27367,10 +34150,10 @@ var Graph = (function () { var node = this.getNode(key); var bbox = this._graphCalculator.boundingBoxCorners(node.latLon, this._tileThreshold); var spatialItems = this._nodeIndex.search({ - maxX: bbox[1].lon, - maxY: bbox[1].lat, - minX: bbox[0].lon, - minY: bbox[0].lat, + maxX: bbox[1].lat, + maxY: bbox[1].lon, + minX: bbox[0].lat, + minY: bbox[0].lon, }); var spatialNodes = { all: {}, @@ -27401,23 +34184,28 @@ var Graph = (function () { if (key in this._cachedNodeTiles) { return true; } + if (key in this._cachedSpatialEdges) { + return true; + } if (!this.hasNode(key)) { throw new Error_1.GraphMapillaryError("Node does not exist in graph (" + key + ")."); } + var nodeTiles = { cache: [], caching: [] }; if (!(key in this._requiredNodeTiles)) { var node = this.getNode(key); - var cache = this._graphCalculator + nodeTiles.cache = this._graphCalculator .encodeHs(node.latLon, this._tilePrecision, this._tileThreshold) .filter(function (h) { return !(h in _this._cachedTiles); }); - this._requiredNodeTiles[key] = { - cache: cache, - caching: [], - }; + if (nodeTiles.cache.length > 0) { + this._requiredNodeTiles[key] = nodeTiles; + } } - return this._requiredNodeTiles[key].cache.length === 0 && - this._requiredNodeTiles[key].caching.length === 0; + else { + nodeTiles = this._requiredNodeTiles[key]; + } + return nodeTiles.cache.length === 0 && nodeTiles.caching.length === 0; }; /** * Get a node. @@ -27426,6 +34214,9 @@ var Graph = (function () { * @returns {Node} Retrieved node. */ Graph.prototype.getNode = function (key) { + var accessed = new Date().getTime(); + this._updateCachedNodeAccess(key, accessed); + this._updateCachedTileAccess(key, accessed); return this._nodes[key]; }; /** @@ -27434,24 +34225,195 @@ var Graph = (function () { * @param {string} sequenceKey - Key of sequence. * @returns {Node} Retrieved sequence. */ - Graph.prototype.getSequence = function (sequenceKey) { - return this._sequences[sequenceKey]; + Graph.prototype.getSequence = function (sequenceKey) { + var sequenceAccess = this._sequences[sequenceKey]; + sequenceAccess.accessed = new Date().getTime(); + return sequenceAccess.sequence; + }; + /** + * Reset all spatial edges of the graph nodes. + */ + Graph.prototype.resetSpatialEdges = function () { + var cachedKeys = Object.keys(this._cachedSpatialEdges); + for (var _i = 0, cachedKeys_1 = cachedKeys; _i < cachedKeys_1.length; _i++) { + var cachedKey = cachedKeys_1[_i]; + var node = this._cachedSpatialEdges[cachedKey]; + node.resetSpatialEdges(); + delete this._cachedSpatialEdges[cachedKey]; + } + }; + /** + * Reset the complete graph but keep the nodes corresponding + * to the supplied keys. All other nodes will be disposed. + * + * @param {Array} keepKeys - Keys for nodes to keep + * in graph after reset. + */ + Graph.prototype.reset = function (keepKeys) { + var nodes = []; + for (var _i = 0, keepKeys_1 = keepKeys; _i < keepKeys_1.length; _i++) { + var key = keepKeys_1[_i]; + if (!this.hasNode(key)) { + throw new Error("Node does not exist " + key); + } + var node = this.getNode(key); + node.resetSequenceEdges(); + node.resetSpatialEdges(); + nodes.push(node); + } + for (var _a = 0, _b = Object.keys(this._cachedNodes); _a < _b.length; _a++) { + var cachedKey = _b[_a]; + if (keepKeys.indexOf(cachedKey) !== -1) { + continue; + } + this._cachedNodes[cachedKey].node.dispose(); + delete this._cachedNodes[cachedKey]; + } + this._cachedNodeTiles = {}; + this._cachedSpatialEdges = {}; + this._cachedTiles = {}; + this._cachingFill$ = {}; + this._cachingFull$ = {}; + this._cachingSequences$ = {}; + this._cachingSpatialArea$ = {}; + this._cachingTiles$ = {}; + this._nodes = {}; + this._nodeToTile = {}; + this._preStored = {}; + for (var _c = 0, nodes_1 = nodes; _c < nodes_1.length; _c++) { + var node = nodes_1[_c]; + this._nodes[node.key] = node; + var h = this._graphCalculator.encodeH(node.originalLatLon, this._tilePrecision); + this._preStore(h, node); + } + this._requiredNodeTiles = {}; + this._requiredSpatialArea = {}; + this._sequences = {}; + this._nodeIndexTiles = {}; + this._nodeIndex.clear(); + }; + /** + * Set the spatial node filter. + * + * @param {FilterExpression} filter - Filter expression to be applied + * when calculating spatial edges. + */ + Graph.prototype.setFilter = function (filter) { + this._filter = this._filterCreator.createFilter(filter); }; /** - * Reset all spatial edges of the graph nodes. + * Uncache the graph according to the graph configuration. + * + * @description Uncaches unused tiles, unused nodes and + * sequences according to the numbers specified in the + * graph configuration. Sequences does not have a direct + * reference to either tiles or nodes and may be uncached + * even if they are related to the nodes that should be kept. + * + * @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. */ - Graph.prototype.reset = function () { - var spatialNodeKeys = Object.keys(this._requiredSpatialArea); - for (var _i = 0, spatialNodeKeys_1 = spatialNodeKeys; _i < spatialNodeKeys_1.length; _i++) { - var spatialNodeKey = spatialNodeKeys_1[_i]; - delete this._requiredSpatialArea[spatialNodeKey]; + Graph.prototype.uncache = function (keepKeys) { + 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); + for (var _i = 0, keepKeys_2 = keepKeys; _i < keepKeys_2.length; _i++) { + var key = keepKeys_2[_i]; + if (key in keysInUse) { + continue; + } + keysInUse[key] = true; } - var cachedKeys = Object.keys(this._cachedSpatialEdges); - for (var _a = 0, cachedKeys_1 = cachedKeys; _a < cachedKeys_1.length; _a++) { - var cachedKey = cachedKeys_1[_a]; - var node = this._cachedSpatialEdges[cachedKey]; - node.resetSpatialEdges(); - delete this._cachedSpatialEdges[cachedKey]; + var keepHs = {}; + for (var key in keysInUse) { + if (!keysInUse.hasOwnProperty(key)) { + continue; + } + var node = this._nodes[key]; + var nodeHs = this._graphCalculator.encodeHs(node.latLon); + for (var _a = 0, nodeHs_1 = nodeHs; _a < nodeHs_1.length; _a++) { + var nodeH = nodeHs_1[_a]; + if (!(nodeH in keepHs)) { + keepHs[nodeH] = true; + } + } + } + var potentialHs = []; + for (var h in this._cachedTiles) { + if (!this._cachedTiles.hasOwnProperty(h) || h in keepHs) { + continue; + } + potentialHs.push([h, this._cachedTiles[h]]); + } + var uncacheHs = potentialHs + .sort(function (h1, h2) { + return h2[1].accessed - h1[1].accessed; + }) + .slice(this._configuration.maxUnusedTiles) + .map(function (h) { + return h[0]; + }); + for (var _b = 0, uncacheHs_1 = uncacheHs; _b < uncacheHs_1.length; _b++) { + var uncacheH = uncacheHs_1[_b]; + this._uncacheTile(uncacheH); + } + var potentialNodes = []; + for (var key in this._cachedNodes) { + if (!this._cachedNodes.hasOwnProperty(key) || key in keysInUse) { + continue; + } + potentialNodes.push(this._cachedNodes[key]); + } + var uncacheNodes = potentialNodes + .sort(function (n1, n2) { + return n2.accessed - n1.accessed; + }) + .slice(this._configuration.maxUnusedNodes); + for (var _c = 0, uncacheNodes_1 = uncacheNodes; _c < uncacheNodes_1.length; _c++) { + var nodeAccess = uncacheNodes_1[_c]; + nodeAccess.node.uncache(); + var key = nodeAccess.node.key; + delete this._cachedNodes[key]; + if (key in this._cachedNodeTiles) { + delete this._cachedNodeTiles[key]; + } + if (key in this._cachedSpatialEdges) { + delete this._cachedSpatialEdges[key]; + } + } + var potentialSequences = []; + for (var sequenceKey in this._sequences) { + if (!this._sequences.hasOwnProperty(sequenceKey) || + sequenceKey in this._cachingSequences$) { + continue; + } + potentialSequences.push(this._sequences[sequenceKey]); + } + var uncacheSequences = potentialSequences + .sort(function (s1, s2) { + return s2.accessed - s1.accessed; + }) + .slice(this._configuration.maxSequences); + for (var _d = 0, uncacheSequences_1 = uncacheSequences; _d < uncacheSequences_1.length; _d++) { + var sequenceAccess = uncacheSequences_1[_d]; + var sequenceKey = sequenceAccess.sequence.key; + delete this._sequences[sequenceKey]; + sequenceAccess.sequence.dispose(); + } + }; + Graph.prototype._addNewKeys = function (keys, dict) { + for (var key in dict) { + if (!dict.hasOwnProperty(key) || !this.hasNode(key)) { + continue; + } + if (!(key in keys)) { + keys[key] = true; + } } }; Graph.prototype._cacheSequence$ = function (sequenceKey) { @@ -27462,7 +34424,10 @@ var Graph = (function () { this._cachingSequences$[sequenceKey] = this._apiV3.sequenceByKey$([sequenceKey]) .do(function (sequenceByKey) { if (!(sequenceKey in _this._sequences)) { - _this._sequences[sequenceKey] = new Graph_1.Sequence(sequenceByKey[sequenceKey]); + _this._sequences[sequenceKey] = { + accessed: new Date().getTime(), + sequence: new Graph_1.Sequence(sequenceByKey[sequenceKey]), + }; } delete _this._cachingSequences$[sequenceKey]; }) @@ -27509,15 +34474,49 @@ var Graph = (function () { } this._nodes[key] = node; }; + Graph.prototype._uncacheTile = function (h) { + 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]; + } + if (key in this._cachedNodeTiles) { + delete this._cachedNodeTiles[key]; + } + if (key in this._cachedSpatialEdges) { + delete this._cachedSpatialEdges[key]; + } + node.dispose(); + } + for (var _b = 0, _c = this._nodeIndexTiles[h]; _b < _c.length; _b++) { + var nodeIndexItem = _c[_b]; + this._nodeIndex.remove(nodeIndexItem); + } + delete this._nodeIndexTiles[h]; + delete this._cachedTiles[h]; + }; + Graph.prototype._updateCachedTileAccess = function (key, accessed) { + if (key in this._nodeToTile) { + this._cachedTiles[this._nodeToTile[key]].accessed = accessed; + } + }; + Graph.prototype._updateCachedNodeAccess = function (key, accessed) { + if (key in this._cachedNodes) { + this._cachedNodes[key].accessed = accessed; + } + }; return Graph; }()); exports.Graph = Graph; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Graph; -},{"../Edge":208,"../Error":209,"../Graph":211,"rbush":24,"rxjs/Subject":33,"rxjs/add/observable/from":40,"rxjs/add/operator/catch":48,"rxjs/add/operator/do":54,"rxjs/add/operator/finally":57,"rxjs/add/operator/map":60,"rxjs/add/operator/publish":66}],281:[function(require,module,exports){ -/// +},{"../Edge":231,"../Error":232,"../Graph":234,"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}],331:[function(require,module,exports){ "use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); var geohash = require("latlon-geohash"); var THREE = require("three"); var Geo_1 = require("../Geo"); @@ -27534,14 +34533,42 @@ var GeoHashDirections = (function () { GeoHashDirections.ne = "ne"; return GeoHashDirections; }()); +/** + * @class GraphCalculator + * + * @classdesc Represents a calculator for graph entities. + */ var GraphCalculator = (function () { + /** + * Create a new graph calculator instance. + * + * @param {GeoCoords} geoCoords - Geo coords instance. + */ function GraphCalculator(geoCoords) { this._geoCoords = geoCoords != null ? geoCoords : new Geo_1.GeoCoords(); } + /** + * Encode the geohash tile for geodetic coordinates. + * + * @param {ILatLon} latlon - Latitude and longitude to encode. + * @param {number} precision - Precision of the encoding. + * + * @returns {string} The geohash tile for the lat, lon and precision. + */ GraphCalculator.prototype.encodeH = function (latLon, precision) { if (precision === void 0) { precision = 7; } return geohash.encode(latLon.lat, latLon.lon, precision); }; + /** + * Encode the geohash tiles within a threshold from a position + * using Manhattan distance. + * + * @param {ILatLon} latlon - Latitude and longitude to encode. + * @param {number} precision - Precision of the encoding. + * @param {number} threshold - Threshold of the encoding in meters. + * + * @returns {string} The geohash tiles reachable within the threshold. + */ GraphCalculator.prototype.encodeHs = function (latLon, precision, threshold) { if (precision === void 0) { precision = 7; } if (threshold === void 0) { threshold = 20; } @@ -27588,6 +34615,16 @@ var GraphCalculator = (function () { } return hs; }; + /** + * Get the bounding box corners for a circle with radius of a threshold + * with center in a geodetic position. + * + * @param {ILatLon} latlon - Latitude and longitude to encode. + * @param {number} threshold - Threshold distance from the position in meters. + * + * @returns {Array} The south west and north east corners of the + * bounding box. + */ GraphCalculator.prototype.boundingBoxCorners = function (latLon, threshold) { var bl = this._geoCoords.enuToGeodetic(-threshold, -threshold, 0, latLon.lat, latLon.lon, 0); var tr = this._geoCoords.enuToGeodetic(threshold, threshold, 0, latLon.lat, latLon.lon, 0); @@ -27596,6 +34633,14 @@ var GraphCalculator = (function () { { lat: tr[0], lon: tr[1] }, ]; }; + /** + * Convert a compass angle to an angle axis rotation vector. + * + * @param {number} compassAngle - The compass angle in degrees. + * @param {number} orientation - The orientation of the original image. + * + * @returns {Array} Angle axis rotation vector. + */ GraphCalculator.prototype.rotationFromCompass = function (compassAngle, orientation) { var x = 0; var y = 0; @@ -27628,12 +34673,13 @@ var GraphCalculator = (function () { return GraphCalculator; }()); exports.GraphCalculator = GraphCalculator; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = GraphCalculator; -},{"../Geo":210,"latlon-geohash":20,"three":157}],282:[function(require,module,exports){ +},{"../Geo":233,"latlon-geohash":21,"three":180}],332:[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"); @@ -27661,8 +34707,11 @@ var GraphService = (function () { .concat(graph.changed$) .publishReplay(1) .refCount(); - this._graph$.subscribe(); + this._graph$.subscribe(function () { }); this._imageLoadingService = imageLoadingService; + this._firstGraphSubjects$ = []; + this._initializeCacheSubscriptions = []; + this._sequenceSubscriptions = []; this._spatialSubscriptions = []; } /** @@ -27685,22 +34734,9 @@ var GraphService = (function () { */ GraphService.prototype.cacheNode$ = function (key) { var _this = this; - var firstGraph$ = this._graph$ - .first() - .mergeMap(function (graph) { - if (graph.isCachingFull(key) || !graph.hasNode(key)) { - return graph.cacheFull$(key); - } - if (graph.isCachingFill(key) || !graph.getNode(key).full) { - return graph.cacheFill$(key); - } - return Observable_1.Observable.of(graph); - }) - .do(function (graph) { - if (!graph.hasInitializedCache(key)) { - graph.initializeCache(key); - } - }) + var firstGraphSubject$ = new Subject_1.Subject(); + this._firstGraphSubjects$.push(firstGraphSubject$); + var firstGraph$ = firstGraphSubject$ .publishReplay(1) .refCount(); var node$ = firstGraph$ @@ -27719,7 +34755,39 @@ var GraphService = (function () { }, function (error) { console.error("Failed to cache node (" + key + ")", error); }); - firstGraph$ + var initializeCacheSubscription = this._graph$ + .first() + .mergeMap(function (graph) { + if (graph.isCachingFull(key) || !graph.hasNode(key)) { + return graph.cacheFull$(key); + } + if (graph.isCachingFill(key) || !graph.getNode(key).full) { + return graph.cacheFill$(key); + } + return Observable_1.Observable.of(graph); + }) + .do(function (graph) { + if (!graph.hasInitializedCache(key)) { + graph.initializeCache(key); + } + }) + .finally(function () { + if (initializeCacheSubscription == null) { + return; + } + _this._removeFromArray(initializeCacheSubscription, _this._initializeCacheSubscriptions); + _this._removeFromArray(firstGraphSubject$, _this._firstGraphSubjects$); + }) + .subscribe(function (graph) { + firstGraphSubject$.next(graph); + firstGraphSubject$.complete(); + }, function (error) { + firstGraphSubject$.error(error); + }); + if (!initializeCacheSubscription.closed) { + this._initializeCacheSubscriptions.push(initializeCacheSubscription); + } + var sequenceSubscription = firstGraph$ .mergeMap(function (graph) { if (graph.isCachingNodeSequence(key) || !graph.hasNodeSequence(key)) { return graph.cacheNodeSequence$(key); @@ -27730,10 +34798,19 @@ var GraphService = (function () { if (!graph.getNode(key).sequenceEdges.cached) { graph.cacheSequenceEdges(key); } + }) + .finally(function () { + if (sequenceSubscription == null) { + return; + } + _this._removeFromArray(sequenceSubscription, _this._sequenceSubscriptions); }) .subscribe(function (graph) { return; }, function (error) { console.error("Failed to cache sequence edges (" + key + ").", error); }); + if (!sequenceSubscription.closed) { + this._sequenceSubscriptions.push(sequenceSubscription); + } var spatialSubscription = firstGraph$ .expand(function (graph) { if (graph.hasTiles(key)) { @@ -27785,7 +34862,7 @@ var GraphService = (function () { if (spatialSubscription == null) { return; } - _this._removeSpatialSubscription(spatialSubscription); + _this._removeFromArray(spatialSubscription, _this._spatialSubscriptions); }) .subscribe(function (graph) { return; }, function (error) { console.error("Failed to cache spatial edges (" + key + ").", error); @@ -27820,101 +34897,93 @@ var GraphService = (function () { }); }; /** - * Reset the spatial edges of all cached nodes and recaches the - * spatial edges of the provided node. + * Set a spatial edge filter on the graph. * - * @param {string} key - Key of the node to cache edges for after reset. - * @returns {Observable} Observable emitting a single item, - * the node, when it has been retrieved and its assets are cached after - * the spatial reset. - * @throws {Error} Propagates any IO node caching errors to the caller. + * @description Resets the spatial edges of all cached nodes. + * + * @param {FilterExpression} filter - Filter expression to be applied. + * @return {Observable} Observable emitting a single item, + * the graph, when the spatial edges have been reset. */ - GraphService.prototype.reset$ = function (key) { - var _this = this; - this._resetSpatialSubscriptions(); + GraphService.prototype.setFilter$ = function (filter) { + this._resetSubscriptions(this._spatialSubscriptions); return this._graph$ .first() .do(function (graph) { - graph.reset(); - }) - .mergeMap(function (graph) { - return _this.cacheNode$(key); + graph.resetSpatialEdges(); + graph.setFilter(filter); + }); + }; + /** + * Reset the graph. + * + * @description Resets the graph but keeps the nodes of the + * supplied keys. + * + * @param {Array} keepKeys - Keys of nodes to keep in graph. + * @return {Observable} Observable emitting a single item, + * the graph, when it has been reset. + */ + GraphService.prototype.reset$ = function (keepKeys) { + this._abortSubjects(this._firstGraphSubjects$); + this._resetSubscriptions(this._initializeCacheSubscriptions); + this._resetSubscriptions(this._sequenceSubscriptions); + this._resetSubscriptions(this._spatialSubscriptions); + return this._graph$ + .first() + .do(function (graph) { + graph.reset(keepKeys); + }); + }; + /** + * Uncache the graph. + * + * @description Uncaches the graph by removing tiles, nodes and + * sequences. Keeps the nodes of the supplied keys and the tiles + * related to those nodes. + * + * @param {Array} keepKeys - Keys of nodes to keep in graph. + * @return {Observable} Observable emitting a single item, + * the graph, when the graph has been uncached. + */ + GraphService.prototype.uncache$ = function (keepKeys) { + return this._graph$ + .first() + .do(function (graph) { + graph.uncache(keepKeys); }); }; - GraphService.prototype._removeSpatialSubscription = function (spatialSubscription) { - var index = this._spatialSubscriptions.indexOf(spatialSubscription); - if (index > -1) { - this._spatialSubscriptions.splice(index, 1); + GraphService.prototype._abortSubjects = function (subjects) { + for (var _i = 0, _a = subjects.slice(); _i < _a.length; _i++) { + var subject = _a[_i]; + this._removeFromArray(subject, subjects); + subject.error(new Error("Cache node request was aborted.")); + } + }; + GraphService.prototype._removeFromArray = function (object, objects) { + var index = objects.indexOf(object); + if (index !== -1) { + objects.splice(index, 1); } }; - GraphService.prototype._resetSpatialSubscriptions = function () { - for (var _i = 0, _a = this._spatialSubscriptions; _i < _a.length; _i++) { + GraphService.prototype._resetSubscriptions = function (subscriptions) { + for (var _i = 0, _a = subscriptions.slice(); _i < _a.length; _i++) { var subscription = _a[_i]; + this._removeFromArray(subscription, subscriptions); if (!subscription.closed) { subscription.unsubscribe(); } } - this._spatialSubscriptions = []; }; return GraphService; }()); exports.GraphService = GraphService; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = GraphService; -},{"rxjs/Observable":28,"rxjs/add/operator/catch":48,"rxjs/add/operator/concat":50,"rxjs/add/operator/do":54,"rxjs/add/operator/expand":55,"rxjs/add/operator/finally":57,"rxjs/add/operator/first":58,"rxjs/add/operator/last":59,"rxjs/add/operator/map":60,"rxjs/add/operator/mergeMap":63,"rxjs/add/operator/publishReplay":67}],283:[function(require,module,exports){ +},{"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}],333:[function(require,module,exports){ "use strict"; -var Observable_1 = require("rxjs/Observable"); -var Utils_1 = require("../Utils"); -var ImageLoader = (function () { - function ImageLoader() { - } - ImageLoader.loadThumbnail = function (key, imageSize) { - return this._load(key, imageSize, Utils_1.Urls.thumbnail); - }; - ImageLoader.loadDynamic = function (key, imageSize) { - return this._load(key, imageSize, Utils_1.Urls.dynamicImage); - }; - ImageLoader._load = function (key, size, getUrl) { - return Observable_1.Observable.create(function (subscriber) { - var image = new Image(); - image.crossOrigin = "Anonymous"; - var xmlHTTP = new XMLHttpRequest(); - xmlHTTP.open("GET", getUrl(key, size), true); - xmlHTTP.responseType = "arraybuffer"; - xmlHTTP.onload = function (pe) { - if (xmlHTTP.status !== 200) { - subscriber.error(new Error("Failed to fetch image (" + key + "). Status: " + xmlHTTP.status + ", " + xmlHTTP.statusText)); - return; - } - image.onload = function (e) { - subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: image }); - subscriber.complete(); - }; - image.onerror = function (error) { - subscriber.error(new Error("Failed to load image (" + key + ")")); - }; - var blob = new Blob([xmlHTTP.response]); - image.src = window.URL.createObjectURL(blob); - }; - xmlHTTP.onprogress = function (pe) { - subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: null }); - }; - xmlHTTP.onerror = function (error) { - subscriber.error(new Error("Failed to fetch image (" + key + ")")); - }; - xmlHTTP.send(null); - }); - }; - return ImageLoader; -}()); -exports.ImageLoader = ImageLoader; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = ImageLoader; - -},{"../Utils":215,"rxjs/Observable":28}],284:[function(require,module,exports){ /// -"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var Subject_1 = require("rxjs/Subject"); var ImageLoadingService = (function () { function ImageLoadingService() { @@ -27926,7 +34995,7 @@ var ImageLoadingService = (function () { }, {}) .publishReplay(1) .refCount(); - this._loadstatus$.subscribe(); + this._loadstatus$.subscribe(function () { }); } Object.defineProperty(ImageLoadingService.prototype, "loadnode$", { get: function () { @@ -27946,9 +35015,10 @@ var ImageLoadingService = (function () { }()); exports.ImageLoadingService = ImageLoadingService; -},{"rxjs/Subject":33}],285:[function(require,module,exports){ -/// +},{"rxjs/Subject":34}],334:[function(require,module,exports){ "use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); var Pbf = require("pbf"); var MeshReader = (function () { function MeshReader() { @@ -27969,19 +35039,47 @@ var MeshReader = (function () { }()); exports.MeshReader = MeshReader; -},{"pbf":22}],286:[function(require,module,exports){ +},{"pbf":23}],335:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); require("rxjs/add/observable/combineLatest"); require("rxjs/add/operator/map"); /** * @class Node * * @classdesc Represents a node in the navigation graph. + * + * 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). + * + * 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). + * + * 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). + * + * 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 + * direction (nd not in strange directions because of bad GPS). + * + * E.g. when placing a marker in the Viewer it is relative to the SfM + * position i.e. the `computedLatLon`. + * + * The same concept as above also applies to the compass angle (or bearing) properties + * `originalCa`, `computedCa` and `ca`. */ var Node = (function () { /** * Create a new node instance. * + * @description Nodes are always created internally by the library. + * Nodes can not be added to the library through any API method. + * * @param {ICoreNode} coreNode - Raw core node data. */ function Node(core) { @@ -28323,6 +35421,21 @@ var Node = (function () { enumerable: true, configurable: true }); + Object.defineProperty(Node.prototype, "projectKey", { + /** + * Get projectKey. + * + * @returns {string} Unique key of the project to which + * the node belongs. + */ + get: function () { + return this._fill.project != null ? + this._fill.project.key : + null; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(Node.prototype, "rotation", { /** * Get rotation. @@ -28471,6 +35584,13 @@ var Node = (function () { return _this; }); }; + Node.prototype.cacheImage$ = function (imageSize) { + var _this = this; + return this._cache.cacheImage$(this.key, imageSize) + .map(function (cache) { + return _this; + }); + }; /** * Cache the sequence edges. * @@ -28534,21 +35654,38 @@ var Node = (function () { } this._fill = fill; }; + /** + * Reset the sequence edges. + */ + Node.prototype.resetSequenceEdges = function () { + this._cache.resetSequenceEdges(); + }; /** * Reset the spatial edges. */ Node.prototype.resetSpatialEdges = function () { this._cache.resetSpatialEdges(); }; + /** + * Clears the image and mesh assets, aborts + * any outstanding requests and resets edges. + */ + Node.prototype.uncache = function () { + if (this._cache == null) { + return; + } + this._cache.dispose(); + this._cache = null; + }; return Node; }()); exports.Node = Node; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Node; -},{"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/map":60}],287:[function(require,module,exports){ +},{"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/map":65}],336:[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"); @@ -28565,6 +35702,7 @@ var NodeCache = (function () { * Create a new node cache instance. */ function NodeCache() { + this._disposed = false; this._image = null; this._loadStatus = { loaded: 0, total: 0 }; this._mesh = null; @@ -28575,13 +35713,13 @@ var NodeCache = (function () { .startWith(this._sequenceEdges) .publishReplay(1) .refCount(); - this._sequenceEdgesSubscription = this._sequenceEdges$.subscribe(); + this._sequenceEdgesSubscription = this._sequenceEdges$.subscribe(function () { }); this._spatialEdgesChanged$ = new Subject_1.Subject(); this._spatialEdges$ = this._spatialEdgesChanged$ .startWith(this._spatialEdges) .publishReplay(1) .refCount(); - this._spatialEdgesSubscription = this._spatialEdges$.subscribe(); + this._spatialEdgesSubscription = this._spatialEdges$.subscribe(function () { }); this._cachingAssets$ = null; } Object.defineProperty(NodeCache.prototype, "image", { @@ -28686,16 +35824,20 @@ var NodeCache = (function () { * @param {string} key - Key of the node to cache. * @param {boolean} pano - Value indicating whether node is a panorama. * @param {boolean} merged - Value indicating whether node is merged. - * @returns {Observable} Observable emitting this node whenever the - * load status has changed and when the mesh or image has been fully loaded. + * @returns {Observable} Observable emitting this node + * cache whenever the load status has changed and when the mesh or image + * has been fully loaded. */ NodeCache.prototype.cacheAssets$ = function (key, pano, merged) { var _this = this; if (this._cachingAssets$ != null) { return this._cachingAssets$; } + var imageSize = pano ? + Utils_1.Settings.basePanoramaSize : + Utils_1.Settings.baseImageSize; this._cachingAssets$ = Observable_1.Observable - .combineLatest(this._cacheImage(key, pano), this._cacheMesh(key, merged), function (imageStatus, meshStatus) { + .combineLatest(this._cacheImage$(key, imageSize), this._cacheMesh$(key, merged), function (imageStatus, meshStatus) { _this._loadStatus.loaded = 0; _this._loadStatus.total = 0; if (meshStatus) { @@ -28717,6 +35859,33 @@ var NodeCache = (function () { .refCount(); return this._cachingAssets$; }; + /** + * Cache an image with a higher resolution than the current one. + * + * @param {string} key - Key of the node to cache. + * @param {ImageSize} imageSize - The size to cache. + * @returns {Observable} Observable emitting a single item, + * the node cache, when the image has been cached. If supplied image + * size is not larger than the current image size the node cache is + * returned immediately. + */ + NodeCache.prototype.cacheImage$ = function (key, imageSize) { + var _this = this; + if (this._image != null && imageSize <= Math.max(this._image.width, this._image.height)) { + return Observable_1.Observable.of(this); + } + return this._cacheImage$(key, imageSize) + .first(function (status) { + return status.object != null; + }) + .do(function (status) { + _this._disposeImage(); + _this._image = status.object; + }) + .map(function (imageStatus) { + return _this; + }); + }; /** * Cache the sequence edges. * @@ -28744,13 +35913,28 @@ var NodeCache = (function () { NodeCache.prototype.dispose = function () { this._sequenceEdgesSubscription.unsubscribe(); this._spatialEdgesSubscription.unsubscribe(); - this._image = null; + this._disposeImage(); this._mesh = null; - this._loadStatus = { loaded: 0, total: 0 }; + this._loadStatus.loaded = 0; + this._loadStatus.total = 0; this._sequenceEdges = { cached: false, edges: [] }; this._spatialEdges = { cached: false, edges: [] }; this._sequenceEdgesChanged$.next(this._sequenceEdges); this._spatialEdgesChanged$.next(this._spatialEdges); + this._disposed = true; + if (this._imageRequest != null) { + this._imageRequest.abort(); + } + if (this._meshRequest != null) { + this._meshRequest.abort(); + } + }; + /** + * Reset the sequence edges. + */ + NodeCache.prototype.resetSequenceEdges = function () { + this._sequenceEdges = { cached: false, edges: [] }; + this._sequenceEdgesChanged$.next(this._sequenceEdges); }; /** * Reset the spatial edges. @@ -28768,11 +35952,59 @@ var NodeCache = (function () { * emitting a load status object every time the load status changes * and completes when the image is fully loaded. */ - NodeCache.prototype._cacheImage = function (key, pano) { - var imageSize = pano ? - Utils_1.Settings.basePanoramaSize : - Utils_1.Settings.baseImageSize; - return Graph_1.ImageLoader.loadThumbnail(key, imageSize); + NodeCache.prototype._cacheImage$ = function (key, imageSize) { + 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.responseType = "arraybuffer"; + xmlHTTP.timeout = 15000; + xmlHTTP.onload = function (pe) { + if (xmlHTTP.status !== 200) { + _this._imageRequest = null; + subscriber.error(new Error("Failed to fetch image (" + key + "). Status: " + xmlHTTP.status + ", " + xmlHTTP.statusText)); + return; + } + var image = new Image(); + image.crossOrigin = "Anonymous"; + image.onload = function (e) { + _this._imageRequest = null; + if (_this._disposed) { + window.URL.revokeObjectURL(image.src); + subscriber.error(new Error("Image load was aborted (" + key + ")")); + return; + } + subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: image }); + subscriber.complete(); + }; + image.onerror = function (error) { + _this._imageRequest = null; + subscriber.error(new Error("Failed to load image (" + key + ")")); + }; + var blob = new Blob([xmlHTTP.response]); + image.src = window.URL.createObjectURL(blob); + }; + xmlHTTP.onprogress = function (pe) { + if (_this._disposed) { + return; + } + subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: null }); + }; + xmlHTTP.onerror = function (error) { + _this._imageRequest = null; + subscriber.error(new Error("Failed to fetch image (" + key + ")")); + }; + xmlHTTP.ontimeout = function (e) { + _this._imageRequest = null; + subscriber.error(new Error("Image request timed out (" + key + ")")); + }; + xmlHTTP.onabort = function (event) { + _this._imageRequest = null; + subscriber.error(new Error("Image request was aborted (" + key + ")")); + }; + _this._imageRequest = xmlHTTP; + xmlHTTP.send(null); + }); }; /** * Cache the mesh. @@ -28783,7 +36015,7 @@ var NodeCache = (function () { * a load status object every time the load status changes and completes * when the mesh is fully loaded. */ - NodeCache.prototype._cacheMesh = function (key, merged) { + NodeCache.prototype._cacheMesh$ = function (key, merged) { var _this = this; return Observable_1.Observable.create(function (subscriber) { if (!merged) { @@ -28794,7 +36026,12 @@ var NodeCache = (function () { var xmlHTTP = new XMLHttpRequest(); xmlHTTP.open("GET", Utils_1.Urls.protoMesh(key), true); xmlHTTP.responseType = "arraybuffer"; + xmlHTTP.timeout = 15000; xmlHTTP.onload = function (pe) { + _this._meshRequest = null; + if (_this._disposed) { + return; + } var mesh = xmlHTTP.status === 200 ? Graph_1.MeshReader.read(new Buffer(xmlHTTP.response)) : { faces: [], vertices: [] }; @@ -28802,13 +36039,28 @@ var NodeCache = (function () { subscriber.complete(); }; xmlHTTP.onprogress = function (pe) { + if (_this._disposed) { + return; + } subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: null }); }; xmlHTTP.onerror = function (e) { + _this._meshRequest = null; console.error("Failed to cache mesh (" + key + ")"); subscriber.next(_this._createEmptyMeshLoadStatus()); subscriber.complete(); }; + xmlHTTP.ontimeout = function (e) { + _this._meshRequest = null; + console.error("Mesh request timed out (" + key + ")"); + subscriber.next(_this._createEmptyMeshLoadStatus()); + subscriber.complete(); + }; + xmlHTTP.onabort = function (e) { + _this._meshRequest = null; + subscriber.error(new Error("Mesh request was aborted (" + key + ")")); + }; + _this._meshRequest = xmlHTTP; xmlHTTP.send(null); }); }; @@ -28824,17 +36076,23 @@ var NodeCache = (function () { object: { faces: [], vertices: [] }, }; }; + NodeCache.prototype._disposeImage = function () { + if (this._image != null) { + window.URL.revokeObjectURL(this._image.src); + } + this._image = null; + }; return NodeCache; }()); exports.NodeCache = NodeCache; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = NodeCache; }).call(this,require("buffer").Buffer) -},{"../Graph":211,"../Utils":215,"buffer":5,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/publishReplay":67}],288:[function(require,module,exports){ -/// +},{"../Graph":234,"../Utils":240,"buffer":7,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/publishReplay":72}],337:[function(require,module,exports){ "use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); var _ = require("underscore"); /** * @class Sequence @@ -28875,6 +36133,15 @@ var Sequence = (function () { enumerable: true, configurable: true }); + /** + * Dispose the sequence. + * + * @description Disposes all cached assets. + */ + Sequence.prototype.dispose = function () { + this._key = null; + this._keys = null; + }; /** * Find the next node key in the sequence with respect to * the provided node key. @@ -28910,12 +36177,12 @@ var Sequence = (function () { return Sequence; }()); exports.Sequence = Sequence; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Sequence; -},{"underscore":158}],289:[function(require,module,exports){ -/// +},{"underscore":182}],338:[function(require,module,exports){ "use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); var THREE = require("three"); var Edge_1 = require("../../Edge"); var Error_1 = require("../../Error"); @@ -28989,6 +36256,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, @@ -29139,6 +36407,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. @@ -29150,7 +36421,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) { @@ -29163,7 +36434,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) { @@ -29213,6 +36484,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. @@ -29222,7 +36496,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) { @@ -29234,7 +36508,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) { @@ -29286,6 +36560,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. @@ -29294,7 +36571,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; @@ -29329,7 +36606,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. @@ -29357,6 +36639,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; @@ -29495,11 +36780,11 @@ var EdgeCalculator = (function () { return EdgeCalculator; }()); exports.EdgeCalculator = EdgeCalculator; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = EdgeCalculator; -},{"../../Edge":208,"../../Error":209,"../../Geo":210,"three":157}],290:[function(require,module,exports){ +},{"../../Edge":231,"../../Error":232,"../../Geo":233,"three":180}],339:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var EdgeCalculatorCoefficients = (function () { function EdgeCalculatorCoefficients() { this.panoPreferredDistance = 2; @@ -29521,11 +36806,11 @@ var EdgeCalculatorCoefficients = (function () { return EdgeCalculatorCoefficients; }()); exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = EdgeCalculatorCoefficients; -},{}],291:[function(require,module,exports){ +},{}],340:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var Edge_1 = require("../../Edge"); var EdgeCalculatorDirections = (function () { function EdgeCalculatorDirections() { @@ -29596,8 +36881,9 @@ var EdgeCalculatorDirections = (function () { }()); exports.EdgeCalculatorDirections = EdgeCalculatorDirections; -},{"../../Edge":208}],292:[function(require,module,exports){ +},{"../../Edge":231}],341:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var EdgeCalculatorSettings = (function () { function EdgeCalculatorSettings() { this.panoMinDistance = 0.1; @@ -29630,11 +36916,11 @@ var EdgeCalculatorSettings = (function () { return EdgeCalculatorSettings; }()); exports.EdgeCalculatorSettings = EdgeCalculatorSettings; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = EdgeCalculatorSettings; -},{}],293:[function(require,module,exports){ +},{}],342:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /** * Enumeration for edge directions * @enum {number} @@ -29642,6 +36928,7 @@ exports.default = EdgeCalculatorSettings; * @description Directions for edges in node graph describing * sequence, spatial and node type relations between nodes. */ +var EdgeDirection; (function (EdgeDirection) { /** * Next node in the sequence. @@ -29687,13 +36974,12 @@ exports.default = EdgeCalculatorSettings; * Looking in roughly the same direction at rougly the same position. */ EdgeDirection[EdgeDirection["Similar"] = 10] = "Similar"; -})(exports.EdgeDirection || (exports.EdgeDirection = {})); -var EdgeDirection = exports.EdgeDirection; -; +})(EdgeDirection = exports.EdgeDirection || (exports.EdgeDirection = {})); -},{}],294:[function(require,module,exports){ -/// +},{}],343:[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"); @@ -29790,10 +37076,10 @@ var DOMRenderer = (function () { style: { bottom: offset.bottom + "px", left: offset.left + "px", + "pointer-events": "none", position: "absolute", right: offset.right + "px", top: offset.top + "px", - zIndex: -1, }, }; return { @@ -29829,7 +37115,7 @@ var DOMRenderer = (function () { }, rootNode) .publishReplay(1) .refCount(); - this._element$.subscribe(); + this._element$.subscribe(function () { }); this._renderService.size$ .map(function (size) { return function (adaptive) { @@ -29876,22 +37162,22 @@ var DOMRenderer = (function () { return DOMRenderer; }()); exports.DOMRenderer = DOMRenderer; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = DOMRenderer; -},{"../Render":213,"rxjs/Subject":33,"rxjs/add/operator/combineLatest":49,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/pluck":65,"rxjs/add/operator/scan":68,"underscore":158,"virtual-dom":163}],295:[function(require,module,exports){ +},{"../Render":236,"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":74,"underscore":182,"virtual-dom":186}],344:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var GLRenderStage; (function (GLRenderStage) { GLRenderStage[GLRenderStage["Background"] = 0] = "Background"; GLRenderStage[GLRenderStage["Foreground"] = 1] = "Foreground"; -})(exports.GLRenderStage || (exports.GLRenderStage = {})); -var GLRenderStage = exports.GLRenderStage; -Object.defineProperty(exports, "__esModule", { value: true }); +})(GLRenderStage = exports.GLRenderStage || (exports.GLRenderStage = {})); exports.default = GLRenderStage; -},{}],296:[function(require,module,exports){ -/// +},{}],345:[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"); @@ -29906,8 +37192,9 @@ require("rxjs/add/operator/scan"); require("rxjs/add/operator/share"); require("rxjs/add/operator/startWith"); var Render_1 = require("../Render"); +var Utils_1 = require("../Utils"); var GLRenderer = (function () { - function GLRenderer(renderService) { + function GLRenderer(canvasContainer, renderService, dom) { var _this = this; this._renderFrame$ = new Subject_1.Subject(); this._renderCameraOperation$ = new Subject_1.Subject(); @@ -29917,6 +37204,7 @@ 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); @@ -29981,7 +37269,6 @@ var GLRenderer = (function () { } } var renderer = co.renderer.renderer; - renderer.autoClear = false; renderer.clear(); for (var _b = 0, backgroundRenders_1 = backgroundRenders; _b < backgroundRenders_1.length; _b++) { var render = backgroundRenders_1[_b]; @@ -30023,18 +37310,28 @@ var GLRenderer = (function () { Observable_1.Observable .merge(renderHash$, clearHash$) .subscribe(this._renderOperation$); - var createRenderer$ = this._render$ + 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({ canvas: canvas }); + webGLRenderer.setPixelRatio(window.devicePixelRatio); + webGLRenderer.setSize(element.offsetWidth, element.offsetHeight); + webGLRenderer.setClearColor(new THREE.Color(0x202020), 1.0); + webGLRenderer.autoClear = false; + return webGLRenderer; + }) + .publishReplay(1) + .refCount(); + this._webGLRenderer$.subscribe(function () { }); + var createRenderer$ = this._webGLRenderer$ + .first() + .map(function (webGLRenderer) { return function (renderer) { - var webGLRenderer = new THREE.WebGLRenderer(); - var element = renderService.element; - webGLRenderer.setSize(element.offsetWidth, element.offsetHeight); - webGLRenderer.setClearColor(new THREE.Color(0x202020), 1.0); - webGLRenderer.sortObjects = false; - webGLRenderer.domElement.style.width = "100%"; - webGLRenderer.domElement.style.height = "100%"; - element.appendChild(webGLRenderer.domElement); renderer.needsRender = true; renderer.renderer = webGLRenderer; return renderer; @@ -30094,6 +37391,13 @@ var GLRenderer = (function () { enumerable: true, configurable: true }); + Object.defineProperty(GLRenderer.prototype, "webGLRenderer$", { + get: function () { + return this._webGLRenderer$; + }, + enumerable: true, + configurable: true + }); GLRenderer.prototype.clear = function (name) { this._clear$.next(name); }; @@ -30120,17 +37424,17 @@ var GLRenderer = (function () { return GLRenderer; }()); exports.GLRenderer = GLRenderer; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = GLRenderer; -},{"../Render":213,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/filter":56,"rxjs/add/operator/first":58,"rxjs/add/operator/map":60,"rxjs/add/operator/merge":61,"rxjs/add/operator/mergeMap":63,"rxjs/add/operator/scan":68,"rxjs/add/operator/share":69,"rxjs/add/operator/startWith":72,"three":157}],297:[function(require,module,exports){ -/// +},{"../Render":236,"../Utils":240,"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":74,"rxjs/add/operator/share":75,"rxjs/add/operator/startWith":79,"three":180}],346:[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 () { - function RenderCamera(perspectiveCameraAspect, renderMode) { + function RenderCamera(elementWidth, elementHeight, renderMode) { this.alpha = -1; this.zoom = 0; this._frameId = -1; @@ -30141,16 +37445,13 @@ var RenderCamera = (function () { this.previousAspect = 1; this.previousPano = false; this.renderMode = renderMode; + this._spatial = new Geo_1.Spatial(); this._camera = new Geo_1.Camera(); + var perspectiveCameraAspect = this._getPerspectiveCameraAspect(elementWidth, elementHeight); this._perspective = new THREE.PerspectiveCamera(50, perspectiveCameraAspect, 0.4, 10000); + this._perspective.matrixAutoUpdate = false; + this._rotation = { phi: 0, theta: 0 }; } - Object.defineProperty(RenderCamera.prototype, "perspective", { - get: function () { - return this._perspective; - }, - enumerable: true, - configurable: true - }); Object.defineProperty(RenderCamera.prototype, "camera", { get: function () { return this._camera; @@ -30179,6 +37480,25 @@ var RenderCamera = (function () { enumerable: true, configurable: true }); + Object.defineProperty(RenderCamera.prototype, "perspective", { + get: function () { + return this._perspective; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RenderCamera.prototype, "rotation", { + get: function () { + return this._rotation; + }, + enumerable: true, + configurable: true + }); + RenderCamera.prototype.updateAspect = function (elementWidth, elementHeight) { + var perspectiveCameraAspect = this._getPerspectiveCameraAspect(elementWidth, elementHeight); + this._perspective.aspect = perspectiveCameraAspect; + this._changed = true; + }; RenderCamera.prototype.updateProjection = function () { var currentAspect = this._getAspect(this.currentAspect, this.currentPano, this.perspective.aspect); var previousAspect = this._getAspect(this.previousAspect, this.previousPano, this.perspective.aspect); @@ -30192,8 +37512,13 @@ var RenderCamera = (function () { this._perspective.up.copy(camera.up); this._perspective.position.copy(camera.position); this._perspective.lookAt(camera.lookat); + this._perspective.updateMatrix(); + this._perspective.updateMatrixWorld(false); this._changed = true; }; + RenderCamera.prototype.updateRotation = function (camera) { + this._rotation = this._getRotation(camera); + }; RenderCamera.prototype._getVerticalFov = function (aspect, focal, zoom) { return 2 * Math.atan(0.5 / (Math.pow(2, zoom) * aspect * focal)) * 180 / Math.PI; }; @@ -30210,14 +37535,26 @@ var RenderCamera = (function () { coeff * nodeAspect; return aspect; }; + RenderCamera.prototype._getPerspectiveCameraAspect = function (elementWidth, elementHeight) { + return elementWidth === 0 ? 0 : elementWidth / elementHeight; + }; + RenderCamera.prototype._getRotation = function (camera) { + var direction = camera.lookat.clone().sub(camera.position); + var up = camera.up.clone(); + var upProjection = direction.clone().dot(up); + var planeProjection = direction.clone().sub(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 RenderCamera; }()); exports.RenderCamera = RenderCamera; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = RenderCamera; -},{"../Geo":210,"../Render":213,"three":157}],298:[function(require,module,exports){ +},{"../Geo":233,"../Render":236,"three":180}],347:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); /** * Enumeration for render mode * @enum {number} @@ -30226,6 +37563,7 @@ exports.default = RenderCamera; * in the viewer. All modes preserves the original aspect * ratio of the images. */ +var RenderMode; (function (RenderMode) { /** * Displays all content within the viewer. @@ -30247,14 +37585,13 @@ exports.default = RenderCamera; * between the image and the viewer. */ RenderMode[RenderMode["Fill"] = 1] = "Fill"; -})(exports.RenderMode || (exports.RenderMode = {})); -var RenderMode = exports.RenderMode; -Object.defineProperty(exports, "__esModule", { value: true }); +})(RenderMode = exports.RenderMode || (exports.RenderMode = {})); exports.default = RenderMode; -},{}],299:[function(require,module,exports){ -/// +},{}],348:[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"); @@ -30266,12 +37603,14 @@ 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 () { function RenderService(element, currentFrame$, renderMode) { var _this = this; this._element = element; this._currentFrame$ = currentFrame$; + this._spatial = new Geo_1.Spatial(); renderMode = renderMode != null ? renderMode : Render_1.RenderMode.Fill; this._resize$ = new Subject_1.Subject(); this._renderCameraOperation$ = new Subject_1.Subject(); @@ -30292,7 +37631,7 @@ var RenderService = (function () { }) .scan(function (rc, operation) { return operation(rc); - }, new Render_1.RenderCamera(this._element.offsetWidth / this._element.offsetHeight, renderMode)) + }, new Render_1.RenderCamera(this._element.offsetWidth, this._element.offsetHeight, renderMode)) .publishReplay(1) .refCount(); this._renderCameraFrame$ = this._currentFrame$ @@ -30305,7 +37644,7 @@ var RenderService = (function () { var camera = frame.state.camera; if (rc.alpha !== frame.state.alpha || rc.zoom !== frame.state.zoom || - rc.camera.diff(camera) > 1e-5) { + rc.camera.diff(camera) > 1e-9) { var currentTransform = frame.state.currentTransform; var previousTransform = frame.state.previousTransform != null ? frame.state.previousTransform : @@ -30321,6 +37660,7 @@ var RenderService = (function () { rc.zoom = frame.state.zoom; rc.camera.copy(camera); rc.updatePerspective(camera); + rc.updateRotation(camera); rc.updateProjection(); } rc.frameId = frame.id; @@ -30336,11 +37676,18 @@ var RenderService = (function () { }) .publishReplay(1) .refCount(); + this._bearing$ = this._renderCamera$ + .map(function (renderCamera) { + var bearing = _this._spatial.radToDeg(_this._spatial.azimuthalToBearing(renderCamera.rotation.phi)); + return _this._spatial.wrap(bearing, 0, 360); + }) + .publishReplay(1) + .refCount(); this._size$ .skip(1) .map(function (size) { return function (rc) { - rc.perspective.aspect = size.width / size.height; + rc.updateAspect(size.width, size.height); rc.updateProjection(); return rc; }; @@ -30356,10 +37703,20 @@ var RenderService = (function () { }; }) .subscribe(this._renderCameraOperation$); - this._renderCameraHolder$.subscribe(); - this._size$.subscribe(); - this._renderMode$.subscribe(); - } + this._bearing$.subscribe(function () { }); + this._renderCameraHolder$.subscribe(function () { }); + this._size$.subscribe(function () { }); + this._renderMode$.subscribe(function () { }); + this._renderCamera$.subscribe(function () { }); + this._renderCameraFrame$.subscribe(function () { }); + } + Object.defineProperty(RenderService.prototype, "bearing$", { + get: function () { + return this._bearing$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(RenderService.prototype, "element", { get: function () { return this._element; @@ -30405,63 +37762,21 @@ var RenderService = (function () { return RenderService; }()); exports.RenderService = RenderService; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = RenderService; -},{"../Render":213,"rxjs/BehaviorSubject":25,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/do":54,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/skip":70,"rxjs/add/operator/startWith":72,"rxjs/add/operator/withLatestFrom":76}],300:[function(require,module,exports){ -/// -"use strict"; -var FrameGenerator = (function () { - function FrameGenerator() { - if (window.requestAnimationFrame) { - this._requestAnimationFrame = window.requestAnimationFrame; - this._cancelAnimationFrame = window.cancelAnimationFrame; - } - else if (window.mozRequestAnimationFrame) { - this._requestAnimationFrame = window.mozRequestAnimationFrame; - this._cancelAnimationFrame = window.mozCancelAnimationFrame; - } - else if (window.webkitRequestAnimationFrame) { - this._requestAnimationFrame = window.webkitRequestAnimationFrame; - this._cancelAnimationFrame = window.webkitCancelAnimationFrame; - } - else if (window.msRequestAnimationFrame) { - this._requestAnimationFrame = window.msRequestAnimationFrame; - this._cancelAnimationFrame = window.msCancelRequestAnimationFrame; - } - else if (window.oRequestAnimationFrame) { - this._requestAnimationFrame = window.oRequestAnimationFrame; - this._cancelAnimationFrame = window.oCancelAnimationFrame; - } - else { - this._requestAnimationFrame = function (callback) { - return window.setTimeout(callback, 1000 / 60); - }; - this._cancelAnimationFrame = window.clearTimeout; - } - } - FrameGenerator.prototype.requestAnimationFrame = function (callback) { - return this._requestAnimationFrame.call(window, callback); - }; - FrameGenerator.prototype.cancelAnimationFrame = function (id) { - this._cancelAnimationFrame.call(window, id); - }; - return FrameGenerator; -}()); -exports.FrameGenerator = FrameGenerator; - -},{}],301:[function(require,module,exports){ +},{"../Geo":233,"../Render":236,"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":74,"rxjs/add/operator/skip":76,"rxjs/add/operator/startWith":79,"rxjs/add/operator/withLatestFrom":85}],349:[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"; -})(exports.State || (exports.State = {})); -var State = exports.State; -Object.defineProperty(exports, "__esModule", { value: true }); +})(State = exports.State || (exports.State = {})); exports.default = State; -},{}],302:[function(require,module,exports){ +},{}],350:[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 () { @@ -30613,6 +37928,12 @@ var StateContext = (function () { StateContext.prototype.remove = function (n) { this._state.remove(n); }; + StateContext.prototype.clear = function () { + this._state.clear(); + }; + StateContext.prototype.clearPrior = function () { + this._state.clearPrior(); + }; StateContext.prototype.cut = function () { this._state.cut(); }; @@ -30625,6 +37946,12 @@ var StateContext = (function () { StateContext.prototype.rotateBasic = function (basicRotation) { this._state.rotateBasic(basicRotation); }; + 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); }; @@ -30641,10 +37968,13 @@ var StateContext = (function () { }()); exports.StateContext = StateContext; -},{"../Geo":210,"../State":214}],303:[function(require,module,exports){ +},{"../Geo":233,"../State":237}],351:[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"); @@ -30683,10 +38013,8 @@ var StateService = (function () { this._fps$ = this._start$ .switchMap(function () { return _this._frame$ - .filter(function (frameId) { - return frameId % _this._fpsSampleRate === 0; - }) - .map(function (frameId) { + .bufferCount(1, _this._fpsSampleRate) + .map(function (frameIds) { return new Date().getTime(); }) .pairwise() @@ -30720,7 +38048,14 @@ var StateService = (function () { .publishReplay(1) .refCount(); var nodeChangedSubject$ = new Subject_1.Subject(); - nodeChanged$.subscribe(nodeChangedSubject$); + nodeChanged$ + .subscribe(nodeChangedSubject$); + this._currentKey$ = new BehaviorSubject_1.BehaviorSubject(null); + nodeChangedSubject$ + .map(function (f) { + return f.state.currentNode.key; + }) + .subscribe(this._currentKey$); this._currentNode$ = nodeChangedSubject$ .map(function (f) { return f.state.currentNode; @@ -30764,13 +38099,13 @@ var StateService = (function () { }; }) .subscribe(this._contextOperation$); - this._movingOperation$ = new Subject_1.Subject(); + this._inMotionOperation$ = new Subject_1.Subject(); nodeChanged$ .map(function (frame) { return true; }) - .subscribe(this._movingOperation$); - this._movingOperation$ + .subscribe(this._inMotionOperation$); + this._inMotionOperation$ .distinctUntilChanged() .filter(function (moving) { return moving; @@ -30795,19 +38130,54 @@ var StateService = (function () { return !changed; }); }) - .subscribe(this._movingOperation$); - this._moving$ = this._movingOperation$ + .subscribe(this._inMotionOperation$); + this._inMotion$ = this._inMotionOperation$ .distinctUntilChanged() - .share(); - this._state$.subscribe(); - this._currentNode$.subscribe(); - this._currentCamera$.subscribe(); - this._currentTransform$.subscribe(); - this._reference$.subscribe(); - this._currentNodeExternal$.subscribe(); - this._lastState$.subscribe(); + .publishReplay(1) + .refCount(); + this._inTranslationOperation$ = new Subject_1.Subject(); + nodeChanged$ + .map(function (frame) { + return true; + }) + .subscribe(this._inTranslationOperation$); + this._inTranslationOperation$ + .distinctUntilChanged() + .filter(function (inTranslation) { + return inTranslation; + }) + .switchMap(function (inTranslation) { + return _this._currentState$ + .filter(function (frame) { + return frame.state.nodesAhead === 0; + }) + .map(function (frame) { + return frame.state.camera.position.clone(); + }) + .pairwise() + .map(function (pair) { + return pair[0].distanceToSquared(pair[1]) !== 0; + }) + .first(function (changed) { + return !changed; + }); + }) + .subscribe(this._inTranslationOperation$); + this._inTranslation$ = this._inTranslationOperation$ + .distinctUntilChanged() + .publishReplay(1) + .refCount(); + this._state$.subscribe(function () { }); + this._currentNode$.subscribe(function () { }); + this._currentCamera$.subscribe(function () { }); + this._currentTransform$.subscribe(function () { }); + this._reference$.subscribe(function () { }); + this._currentNodeExternal$.subscribe(function () { }); + this._lastState$.subscribe(function () { }); + this._inMotion$.subscribe(function () { }); + this._inTranslation$.subscribe(function () { }); this._frameId = null; - this._frameGenerator = new State_1.FrameGenerator(); + this._frameGenerator = new AnimationFrame_1.RequestAnimationFrameDefinition(window); } Object.defineProperty(StateService.prototype, "currentState$", { get: function () { @@ -30823,6 +38193,13 @@ var StateService = (function () { enumerable: true, configurable: true }); + Object.defineProperty(StateService.prototype, "currentKey$", { + get: function () { + return this._currentKey$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(StateService.prototype, "currentNodeExternal$", { get: function () { return this._currentNodeExternal$; @@ -30858,9 +38235,16 @@ var StateService = (function () { enumerable: true, configurable: true }); - Object.defineProperty(StateService.prototype, "moving$", { + Object.defineProperty(StateService.prototype, "inMotion$", { + get: function () { + return this._inMotion$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(StateService.prototype, "inTranslation$", { get: function () { - return this._moving$; + return this._inTranslation$; }, enumerable: true, configurable: true @@ -30873,7 +38257,7 @@ var StateService = (function () { configurable: true }); StateService.prototype.traverse = function () { - this._movingOperation$.next(true); + this._inMotionOperation$.next(true); this._invokeContextOperation(function (context) { context.traverse(); }); }; StateService.prototype.wait = function () { @@ -30888,6 +38272,12 @@ var StateService = (function () { StateService.prototype.removeNodes = function (n) { this._invokeContextOperation(function (context) { context.remove(n); }); }; + StateService.prototype.clearNodes = function () { + this._invokeContextOperation(function (context) { context.clear(); }); + }; + StateService.prototype.clearPriorNodes = function () { + this._invokeContextOperation(function (context) { context.clearPrior(); }); + }; StateService.prototype.cutNodes = function () { this._invokeContextOperation(function (context) { context.cut(); }); }; @@ -30895,23 +38285,31 @@ var StateService = (function () { this._invokeContextOperation(function (context) { context.set(nodes); }); }; StateService.prototype.rotate = function (delta) { - this._movingOperation$.next(true); + this._inMotionOperation$.next(true); this._invokeContextOperation(function (context) { context.rotate(delta); }); }; StateService.prototype.rotateBasic = function (basicRotation) { - this._movingOperation$.next(true); + this._inMotionOperation$.next(true); this._invokeContextOperation(function (context) { context.rotateBasic(basicRotation); }); }; + StateService.prototype.rotateBasicUnbounded = function (basicRotation) { + 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._movingOperation$.next(true); + this._inMotionOperation$.next(true); this._invokeContextOperation(function (context) { context.rotateToBasic(basic); }); }; StateService.prototype.move = function (delta) { - this._movingOperation$.next(true); + this._inMotionOperation$.next(true); this._invokeContextOperation(function (context) { context.move(delta); }); }; StateService.prototype.moveTo = function (position) { - this._movingOperation$.next(true); + this._inMotionOperation$.next(true); this._invokeContextOperation(function (context) { context.moveTo(position); }); }; /** @@ -30921,7 +38319,7 @@ var StateService = (function () { * @parameter {Array} reference - Reference point in basic coordinates. */ StateService.prototype.zoomIn = function (delta, reference) { - this._movingOperation$.next(true); + this._inMotionOperation$.next(true); this._invokeContextOperation(function (context) { context.zoomIn(delta, reference); }); }; StateService.prototype.getCenter = function () { @@ -30939,11 +38337,11 @@ var StateService = (function () { }); }; StateService.prototype.setCenter = function (center) { - this._movingOperation$.next(true); + this._inMotionOperation$.next(true); this._invokeContextOperation(function (context) { context.setCenter(center); }); }; StateService.prototype.setZoom = function (zoom) { - this._movingOperation$.next(true); + this._inMotionOperation$.next(true); this._invokeContextOperation(function (context) { context.setZoom(zoom); }); }; StateService.prototype.start = function () { @@ -30974,9 +38372,10 @@ var StateService = (function () { }()); exports.StateService = StateService; -},{"../State":214,"rxjs/BehaviorSubject":25,"rxjs/Subject":33,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/do":54,"rxjs/add/operator/filter":56,"rxjs/add/operator/first":58,"rxjs/add/operator/map":60,"rxjs/add/operator/pairwise":64,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/startWith":72,"rxjs/add/operator/switchMap":73,"rxjs/add/operator/withLatestFrom":76}],304:[function(require,module,exports){ -/// +},{"../State":237,"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":74,"rxjs/add/operator/startWith":79,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/withLatestFrom":85,"rxjs/util/AnimationFrame":161}],352:[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 () { @@ -31130,14 +38529,26 @@ var StateBase = (function () { if (n < 0) { throw Error("n must be a positive integer"); } - var length = this._trajectory.length; - if (length - (this._currentIndex + 1) < n) { - throw Error("Current node can not be removed"); + if (this._currentIndex - 1 < n) { + throw Error("Current and previous nodes can not be removed"); } for (var i = 0; i < n; i++) { - this._trajectory.pop(); - this._trajectoryTransforms.pop(); - this._trajectoryCameras.pop(); + this._trajectory.shift(); + this._trajectoryTransforms.shift(); + this._trajectoryCameras.shift(); + this._currentIndex--; + } + this._setCurrentNode(); + }; + StateBase.prototype.clearPrior = function () { + if (this._currentIndex > 0) { + this.remove(this._currentIndex - 1); + } + }; + StateBase.prototype.clear = function () { + this.cut(); + if (this._currentIndex > 0) { + this.remove(this._currentIndex - 1); } }; StateBase.prototype.cut = function () { @@ -31205,7 +38616,7 @@ var StateBase = (function () { }; StateBase.prototype._setTrajectory = function (nodes) { if (nodes.length < 1) { - throw new Error_1.ParameterMapillaryError("Trajectory can not be empty"); + throw new Error_1.ArgumentMapillaryError("Trajectory can not be empty"); } if (this._currentNode != null) { this._trajectory = [this._currentNode].concat(nodes); @@ -31225,7 +38636,7 @@ var StateBase = (function () { for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) { var node = nodes_1[_i]; if (!node.assetsCached) { - throw new Error_1.ParameterMapillaryError("Assets must be cached when node is added to trajectory"); + 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); @@ -31237,7 +38648,7 @@ var StateBase = (function () { for (var _i = 0, _a = nodes.reverse(); _i < _a.length; _i++) { var node = _a[_i]; if (!node.assetsCached) { - throw new Error_1.ParameterMapillaryError("Node must be loaded when added to trajectory"); + 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); @@ -31275,16 +38686,22 @@ var StateBase = (function () { }()); exports.StateBase = StateBase; -},{"../../Error":209,"../../Geo":210}],305:[function(require,module,exports){ -/// +},{"../../Error":232,"../../Geo":233}],353:[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 __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 UnitBezier = require("unitbezier"); +var UnitBezier = require("@mapbox/unitbezier"); var State_1 = require("../../State"); var RotationDelta = (function () { function RotationDelta(phi, theta) { @@ -31346,26 +38763,30 @@ var RotationDelta = (function () { var TraversingState = (function (_super) { __extends(TraversingState, _super); function TraversingState(state) { - _super.call(this, state); - this._motionless = this._motionlessTransition(); - this._baseAlpha = this._alpha; - this._animationSpeed = 0.025; - 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._rotationAcceleration = 0.86; - this._rotationIncreaseAlpha = 0.97; - this._rotationDecreaseAlpha = 0.9; - this._rotationThreshold = 0.001; - this._desiredZoom = state.zoom; - this._minZoom = 0; - this._maxZoom = 3; - this._lookatDepth = 10; - this._desiredLookat = null; - this._desiredCenter = null; + var _this = _super.call(this, state) || this; + _this._adjustCameras(); + _this._motionless = _this._motionlessTransition(); + _this._baseAlpha = _this._alpha; + _this._animationSpeed = 0.025; + _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 () { throw new Error("Not implemented"); @@ -31424,23 +38845,54 @@ var TraversingState = (function (_super) { this._requestedRotationDelta.theta = this._requestedRotationDelta.theta + rotationDelta.theta; } else { - this._requestedRotationDelta = new RotationDelta(rotationDelta.phi, rotationDelta.theta); + 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.rotateBasic = function (basicRotation) { + TraversingState.prototype.rotateBasicWithoutInertia = function (basic) { 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]; - } - else { - this._requestedBasicRotation = basicRotation.slice(); - } + 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); }; TraversingState.prototype.rotateToBasic = function (basic) { if (this._currentNode == null) { @@ -31550,7 +39002,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); @@ -31561,12 +39013,16 @@ var TraversingState = (function (_super) { }; TraversingState.prototype._setCurrentCamera = function () { _super.prototype._setCurrentCamera.call(this); - if (this._previousNode != null) { - var lookat = this._camera.lookat.clone().sub(this._camera.position); - this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position)); - if (this._currentNode.fullPano) { - this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position)); - } + this._adjustCameras(); + }; + TraversingState.prototype._adjustCameras = function () { + if (this._previousNode == null) { + return; + } + var lookat = this._camera.lookat.clone().sub(this._camera.position); + this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position)); + if (this._currentNode.fullPano) { + this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position)); } }; TraversingState.prototype._resetTransition = function () { @@ -31595,7 +39051,7 @@ var TraversingState = (function (_super) { offset.applyQuaternion(qInverse); camera.lookat.copy(camera.position).add(offset.multiplyScalar(length)); }; - TraversingState.prototype._applyRotationBasic = function () { + TraversingState.prototype._applyRotationBasic = function (basicRotation) { var currentNode = this._currentNode; var previousNode = this._previousNode != null ? this.previousNode : @@ -31611,30 +39067,30 @@ var TraversingState = (function (_super) { 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); + 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] + this._basicRotation[0], 0, 1); - currentBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0, 1); + 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] + this._basicRotation[0], 0, 1); - currentBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0, 1); + 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] + this._basicRotation[0], 0, 1); - previousBasic[1] = this._spatial.clamp(previousBasic[1] + this._basicRotation[1], 0.05, 0.95); + 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] + this._basicRotation[0], 0, 1); - previousBasic[1] = this._spatial.clamp(previousBasic[1] + this._basicRotation[1], 0, 1); + 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] + this._basicRotation[0], 0, 1); - previousBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0, 1); + 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); @@ -31643,180 +39099,1030 @@ var TraversingState = (function (_super) { }; 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) < 0.0001) { - this._zoom = this._desiredZoom; + 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)); +exports.TraversingState = TraversingState; + +},{"../../State":237,"@mapbox/unitbezier":2,"three":180}],354:[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 WaitingState = (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; + } + WaitingState.prototype.traverse = function () { + return new State_1.TraversingState(this); + }; + WaitingState.prototype.wait = function () { + throw new Error("Not implemented"); + }; + WaitingState.prototype.prepend = function (nodes) { + _super.prototype.prepend.call(this, nodes); + this._motionless = this._motionlessTransition(); + }; + WaitingState.prototype.set = function (nodes) { + _super.prototype.set.call(this, nodes); + this._motionless = this._motionlessTransition(); + }; + 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.zoomIn = function (delta, reference) { return; }; + WaitingState.prototype.move = function (delta) { + this._alpha = Math.max(0, Math.min(1, this._alpha + delta)); + }; + WaitingState.prototype.moveTo = function (position) { + this._alpha = Math.max(0, Math.min(1, position)); + }; + WaitingState.prototype.update = function (fps) { + this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha); + }; + WaitingState.prototype.setCenter = function (center) { return; }; + WaitingState.prototype.setZoom = function (zoom) { return; }; + WaitingState.prototype._getAlpha = function () { + return this._motionless ? Math.round(this._alpha) : this._alpha; + }; + WaitingState.prototype._setCurrentCamera = function () { + _super.prototype._setCurrentCamera.call(this); + this._adjustCameras(); + }; + WaitingState.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 WaitingState; +}(State_1.StateBase)); +exports.WaitingState = WaitingState; + +},{"../../State":237}],355:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("rxjs/Observable"); +/** + * @class ImageTileLoader + * + * @classdesc Represents a loader of image tiles. + */ +var ImageTileLoader = (function () { + /** + * Create a new node image tile loader instance. + * + * @param {string} scheme - The URI scheme. + * @param {string} host - The URI host. + * @param {string} [origin] - The origin query param. + */ + function ImageTileLoader(scheme, host, origin) { + this._scheme = scheme; + this._host = host; + this._origin = origin != null ? "?origin=" + origin : ""; + } + /** + * Retrieve an image tile. + * + * @description Retrieve an image tile by specifying the area + * as well as the scaled size. + * + * @param {string} identifier - The identifier of the image. + * @param {number} x - The top left x pixel coordinate for the tile + * in the original image. + * @param {number} y - The top left y pixel coordinate for the tile + * in the original image. + * @param {number} w - The pixel width of the tile in the original image. + * @param {number} h - The pixel height of the tile in the original image. + * @param {number} scaledW - The scaled width of the returned tile. + * @param {number} scaledH - The scaled height of the returned tile. + */ + ImageTileLoader.prototype.getTile = function (identifier, x, y, w, h, scaledW, scaledH) { + var characteristics = "/" + identifier + "/" + x + "," + y + "," + w + "," + h + "/" + scaledW + "," + scaledH + "/0/default.jpg"; + var url = this._scheme + + "://" + + this._host + + characteristics + + this._origin; + var xmlHTTP = null; + return [Observable_1.Observable.create(function (subscriber) { + xmlHTTP = new XMLHttpRequest(); + xmlHTTP.open("GET", url, true); + xmlHTTP.responseType = "arraybuffer"; + xmlHTTP.timeout = 15000; + xmlHTTP.onload = function (event) { + if (xmlHTTP.status !== 200) { + subscriber.error(new Error("Failed to fetch tile (" + identifier + ": " + x + "," + y + "," + w + "," + h + "). " + + ("Status: " + xmlHTTP.status + ", " + xmlHTTP.statusText))); + return; + } + var image = new Image(); + image.crossOrigin = "Anonymous"; + image.onload = function (e) { + subscriber.next(image); + subscriber.complete(); + }; + image.onerror = function (error) { + subscriber.error(new Error("Failed to load tile image (" + identifier + ": " + x + "," + y + "," + w + "," + h + ")")); + }; + var blob = new Blob([xmlHTTP.response]); + image.src = window.URL.createObjectURL(blob); + }; + xmlHTTP.onerror = function (error) { + subscriber.error(new Error("Failed to fetch tile (" + identifier + ": " + x + "," + y + "," + w + "," + h + ")")); + }; + xmlHTTP.ontimeout = function (error) { + subscriber.error(new Error("Tile request timed out (" + identifier + ": " + x + "," + y + "," + w + "," + h + ")")); + }; + xmlHTTP.onabort = function (event) { + subscriber.error(new Error("Tile request was aborted (" + identifier + ": " + x + "," + y + "," + w + "," + h + ")")); + }; + xmlHTTP.send(null); + }), + function () { + if (xmlHTTP != null) { + xmlHTTP.abort(); + } + }, + ]; + }; + return ImageTileLoader; +}()); +exports.ImageTileLoader = ImageTileLoader; +exports.default = ImageTileLoader; + +},{"rxjs/Observable":29}],356:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * @class ImageTileStore + * + * @classdesc Represents a store for image tiles. + */ +var ImageTileStore = (function () { + /** + * Create a new node image tile store instance. + */ + function ImageTileStore() { + this._images = {}; + } + /** + * Add an image tile to the store. + * + * @param {HTMLImageElement} image - The image tile. + * @param {string} key - The identifier for the tile. + * @param {number} level - The level of the tile. + */ + ImageTileStore.prototype.addImage = function (image, key, level) { + if (!(level in this._images)) { + this._images[level] = {}; + } + this._images[level][key] = image; + }; + /** + * Dispose the store. + * + * @description Disposes all cached assets. + */ + ImageTileStore.prototype.dispose = function () { + for (var _i = 0, _a = Object.keys(this._images); _i < _a.length; _i++) { + var level = _a[_i]; + var levelImages = this._images[level]; + for (var _b = 0, _c = Object.keys(levelImages); _b < _c.length; _b++) { + var key = _c[_b]; + window.URL.revokeObjectURL(levelImages[key].src); + delete levelImages[key]; + } + delete this._images[level]; + } + }; + /** + * Get an image tile from the store. + * + * @param {string} key - The identifier for the tile. + * @param {number} level - The level of the tile. + */ + ImageTileStore.prototype.getImage = function (key, level) { + return this._images[level][key]; + }; + /** + * Check if an image tile exist in the store. + * + * @param {string} key - The identifier for the tile. + * @param {number} level - The level of the tile. + */ + ImageTileStore.prototype.hasImage = function (key, level) { + return level in this._images && key in this._images[level]; + }; + return ImageTileStore; +}()); +exports.ImageTileStore = ImageTileStore; +exports.default = ImageTileStore; + +},{}],357:[function(require,module,exports){ +"use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); +var Geo_1 = require("../Geo"); +/** + * @class RegionOfInterestCalculator + * + * @classdesc Represents a calculator for regions of interest. + */ +var RegionOfInterestCalculator = (function () { + function RegionOfInterestCalculator() { + this._viewportCoords = new Geo_1.ViewportCoords(); + } + /** + * Compute a region of interest based on the current render camera + * and the viewport size. + * + * @param {RenderCamera} renderCamera - Render camera used for unprojections. + * @param {ISize} size - Viewport size in pixels. + * @param {Transform} transform - Transform used for projections. + * + * @returns {IRegionOfInterest} A region of interest. + */ + RegionOfInterestCalculator.prototype.computeRegionOfInterest = function (renderCamera, size, transform) { + var viewportBoundaryPoints = this._viewportBoundaryPoints(4); + var bbox = this._viewportPointsBoundingBox(viewportBoundaryPoints, renderCamera, transform); + this._clipBoundingBox(bbox); + var viewportPixelWidth = 2 / size.width; + var viewportPixelHeight = 2 / size.height; + var centralViewportPixel = [ + [-0.5 * viewportPixelWidth, 0.5 * viewportPixelHeight], + [0.5 * viewportPixelWidth, 0.5 * viewportPixelHeight], + [0.5 * viewportPixelWidth, -0.5 * viewportPixelHeight], + [-0.5 * viewportPixelWidth, -0.5 * viewportPixelHeight], + ]; + var cpbox = this._viewportPointsBoundingBox(centralViewportPixel, renderCamera, transform); + return { + bbox: bbox, + pixelHeight: cpbox.maxY - cpbox.minY, + pixelWidth: cpbox.maxX - cpbox.minX + (cpbox.minX < cpbox.maxX ? 0 : 1), + }; + }; + RegionOfInterestCalculator.prototype._viewportBoundaryPoints = function (pointsPerSide) { + var points = []; + var os = [[-1, 1], [1, 1], [1, -1], [-1, -1]]; + var ds = [[2, 0], [0, -2], [-2, 0], [0, 2]]; + for (var side = 0; side < 4; ++side) { + var o = os[side]; + var d = ds[side]; + for (var i = 0; i < pointsPerSide; ++i) { + points.push([o[0] + d[0] * i / pointsPerSide, + o[1] + d[1] * i / pointsPerSide]); + } + } + return points; + }; + RegionOfInterestCalculator.prototype._viewportPointsBoundingBox = function (viewportPoints, renderCamera, transform) { + var _this = this; + var basicPoints = viewportPoints + .map(function (point) { + return _this._viewportCoords + .viewportToBasic(point[0], point[1], transform, renderCamera.perspective); + }); + if (transform.gpano != null) { + return this._boundingBoxPano(basicPoints); } else { - this._zoom += 5 * animationSpeed * diff; + return this._boundingBox(basicPoints); } }; - TraversingState.prototype._updateLookat = function (animationSpeed) { - if (this._desiredLookat === null) { - return; - } - var diff = this._desiredLookat.distanceToSquared(this._currentCamera.lookat); - if (Math.abs(diff) < 0.00001) { - this._currentCamera.lookat.copy(this._desiredLookat); - this._desiredLookat = null; - } - else { - this._currentCamera.lookat.lerp(this._desiredLookat, 5 * animationSpeed); + RegionOfInterestCalculator.prototype._boundingBox = function (points) { + var bbox = { + maxX: Number.NEGATIVE_INFINITY, + maxY: Number.NEGATIVE_INFINITY, + minX: Number.POSITIVE_INFINITY, + minY: Number.POSITIVE_INFINITY, + }; + for (var i = 0; i < points.length; ++i) { + bbox.minX = Math.min(bbox.minX, points[i][0]); + bbox.maxX = Math.max(bbox.maxX, points[i][0]); + bbox.minY = Math.min(bbox.minY, points[i][1]); + bbox.maxY = Math.max(bbox.maxY, points[i][1]); } + return bbox; }; - 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); + RegionOfInterestCalculator.prototype._boundingBoxPano = function (points) { + var _this = this; + var xs = []; + var ys = []; + for (var i = 0; i < points.length; ++i) { + xs.push(points[i][0]); + ys.push(points[i][1]); + } + xs.sort(function (a, b) { return _this._sign(a - b); }); + ys.sort(function (a, b) { return _this._sign(a - b); }); + var intervalX = this._intervalPano(xs); + return { + maxX: intervalX[1], + maxY: ys[ys.length - 1], + minX: intervalX[0], + minY: ys[0], + }; + }; + /** + * Find the max interval between consecutive numbers. + * Assumes numbers are between 0 and 1, sorted and that + * x is equivalent to x + 1. + */ + RegionOfInterestCalculator.prototype._intervalPano = function (xs) { + var maxdx = 0; + var maxi = -1; + for (var i = 0; i < xs.length - 1; ++i) { + var dx = xs[i + 1] - xs[i]; + if (dx > maxdx) { + maxdx = dx; + maxi = i; } - this._requestedRotationDelta = null; - return; } - if (this._rotationDelta.isZero) { - return; + var loopdx = xs[0] + 1 - xs[xs.length - 1]; + if (loopdx > maxdx) { + return [xs[0], xs[xs.length - 1]]; + } + else { + return [xs[maxi + 1], xs[maxi]]; } - 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 lengthSquared = x * x + y * y; - var reqX = this._requestedBasicRotation[0]; - var reqY = this._requestedBasicRotation[1]; - var reqLengthSquared = reqX * reqX + reqY * reqY; - if (reqLengthSquared > lengthSquared) { - this._basicRotation[0] = (1 - this._rotationIncreaseAlpha) * x + this._rotationIncreaseAlpha * reqX; - this._basicRotation[1] = (1 - this._rotationIncreaseAlpha) * y + this._rotationIncreaseAlpha * reqY; - } - else { - this._basicRotation[0] = (1 - this._rotationDecreaseAlpha) * x + this._rotationDecreaseAlpha * reqX; - this._basicRotation[1] = (1 - this._rotationDecreaseAlpha) * y + this._rotationDecreaseAlpha * reqY; + RegionOfInterestCalculator.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)); + }; + RegionOfInterestCalculator.prototype._sign = function (n) { + return n > 0 ? 1 : n < 0 ? -1 : 0; + }; + return RegionOfInterestCalculator; +}()); +exports.RegionOfInterestCalculator = RegionOfInterestCalculator; +exports.default = RegionOfInterestCalculator; + +},{"../Geo":233}],358:[function(require,module,exports){ +"use strict"; +/// +Object.defineProperty(exports, "__esModule", { value: true }); +var THREE = require("three"); +var Subject_1 = require("rxjs/Subject"); +/** + * @class TextureProvider + * + * @classdesc Represents a provider of textures. + */ +var TextureProvider = (function () { + /** + * Create a new node texture provider instance. + * + * @param {string} key - The identifier of the image for which to request tiles. + * @param {number} width - The full width of the original image. + * @param {number} height - The full height of the original image. + * @param {number} tileSize - The size used when requesting tiles. + * @param {HTMLImageElement} background - Image to use as background. + * @param {ImageTileLoader} imageTileLoader - Loader for retrieving tiles. + * @param {ImageTileStore} imageTileStore - Store for saving tiles. + * @param {THREE.WebGLRenderer} renderer - Renderer used for rendering tiles to texture. + */ + function TextureProvider(key, width, height, tileSize, background, imageTileLoader, imageTileStore, renderer) { + this._disposed = false; + this._key = key; + if (width <= 0 || height <= 0) { + console.warn("Original image size (" + width + ", " + height + ") is invalid (" + key + "). Tiles will not be loaded."); + } + this._width = width; + this._height = height; + this._maxLevel = Math.ceil(Math.log(Math.max(height, width)) / Math.log(2)); + this._currentLevel = -1; + this._tileSize = tileSize; + this._updated$ = new Subject_1.Subject(); + this._createdSubject$ = new Subject_1.Subject(); + this._created$ = this._createdSubject$ + .publishReplay(1) + .refCount(); + this._createdSubscription = this._created$.subscribe(function () { }); + this._hasSubject$ = new Subject_1.Subject(); + this._has$ = this._hasSubject$ + .startWith(false) + .publishReplay(1) + .refCount(); + this._hasSubscription = this._has$.subscribe(function () { }); + this._abortFunctions = []; + this._tileSubscriptions = {}; + this._renderedCurrentLevelTiles = {}; + this._renderedTiles = {}; + this._background = background; + this._camera = null; + this._imageTileLoader = imageTileLoader; + this._imageTileStore = imageTileStore; + this._renderer = renderer; + this._renderTarget = null; + this._roi = null; + } + Object.defineProperty(TextureProvider.prototype, "disposed", { + /** + * Get disposed. + * + * @returns {boolean} Value indicating whether provider has + * been disposed. + */ + get: function () { + return this._disposed; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureProvider.prototype, "hasTexture$", { + /** + * Get hasTexture$. + * + * @returns {Observable} Observable emitting + * values indicating when the existance of a texture + * changes. + */ + get: function () { + return this._has$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureProvider.prototype, "key", { + /** + * Get key. + * + * @returns {boolean} The identifier of the image for + * which to render textures. + */ + get: function () { + return this._key; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureProvider.prototype, "textureUpdated$", { + /** + * Get textureUpdated$. + * + * @returns {Observable} Observable emitting + * values when an existing texture has been updated. + */ + get: function () { + return this._updated$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureProvider.prototype, "textureCreated$", { + /** + * Get textureCreated$. + * + * @returns {Observable} Observable emitting + * values when a new texture has been created. + */ + get: function () { + return this._created$; + }, + enumerable: true, + configurable: true + }); + /** + * Abort all outstanding image tile requests. + */ + TextureProvider.prototype.abort = function () { + for (var key in this._tileSubscriptions) { + if (!this._tileSubscriptions.hasOwnProperty(key)) { + continue; } - this._requestedBasicRotation = null; - return; + this._tileSubscriptions[key].unsubscribe(); } - 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]; + this._tileSubscriptions = {}; + for (var _i = 0, _a = this._abortFunctions; _i < _a.length; _i++) { + var abort = _a[_i]; + abort(); } + this._abortFunctions = []; }; - TraversingState.prototype._clearRotation = function () { - if (this._currentNode.fullPano) { + /** + * Dispose the provider. + * + * @description Disposes all cached assets and + * aborts all outstanding image tile requests. + */ + TextureProvider.prototype.dispose = function () { + if (this._disposed) { + console.warn("Texture already disposed (" + this._key + ")"); 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]; - } + this.abort(); + if (this._renderTarget != null) { + this._renderTarget.dispose(); + this._renderTarget = null; + } + this._imageTileStore.dispose(); + this._imageTileStore = null; + this._background = null; + this._camera = null; + this._imageTileLoader = null; + this._renderer = null; + this._roi = null; + this._createdSubscription.unsubscribe(); + this._hasSubscription.unsubscribe(); + this._disposed = true; }; - TraversingState.prototype._setDesiredCenter = function () { - if (this._desiredCenter == null) { + /** + * Set the region of interest. + * + * @description When the region of interest is set the + * the tile level is determined and tiles for the region + * are fetched from the store or the loader and renderedLevel + * to the texture. + * + * @param {IRegionOfInterest} roi - Spatial edges to cache. + */ + TextureProvider.prototype.setRegionOfInterest = function (roi) { + if (this._width <= 0 || this._height <= 0) { 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; + this._roi = roi; + 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.ceil(Math.log(size) / Math.log(2)))); + if (currentLevel !== this._currentLevel) { + this.abort(); + this._currentLevel = currentLevel; + if (!(this._currentLevel in this._renderedTiles)) { + this._renderedTiles[this._currentLevel] = []; + } + this._renderedCurrentLevelTiles = {}; + for (var _i = 0, _a = this._renderedTiles[this._currentLevel]; _i < _a.length; _i++) { + var tile = _a[_i]; + this._renderedCurrentLevelTiles[this._tileKey(this._tileSize, tile)] = true; + } + } + var topLeft = this._getTileCoords([this._roi.bbox.minX, this._roi.bbox.minY]); + var bottomRight = this._getTileCoords([this._roi.bbox.maxX, this._roi.bbox.maxY]); + var tiles = this._getTiles(topLeft, bottomRight); + if (this._camera == null) { + this._camera = new THREE.OrthographicCamera(-this._width / 2, this._width / 2, this._height / 2, -this._height / 2, -1, 1); + this._camera.position.z = 1; + var gl = this._renderer.getContext(); + var maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); + var backgroundSize = Math.max(this._width, this._height); + var scale = maxTextureSize > backgroundSize ? 1 : maxTextureSize / backgroundSize; + var targetWidth = Math.floor(scale * this._width); + var targetHeight = Math.floor(scale * this._height); + this._renderTarget = new THREE.WebGLRenderTarget(targetWidth, targetHeight, { + depthBuffer: false, + format: THREE.RGBFormat, + magFilter: THREE.LinearFilter, + minFilter: THREE.LinearFilter, + stencilBuffer: false, + }); + this._renderToTarget(0, 0, this._width, this._height, this._background); + this._createdSubject$.next(this._renderTarget.texture); + this._hasSubject$.next(true); + } + this._fetchTiles(tiles); }; - TraversingState.prototype._setDesiredZoom = function () { - this._desiredZoom = - this._currentNode.fullPano || this._previousNode == null ? - this._zoom : 0; + TextureProvider.prototype.setTileSize = function (tileSize) { + this._tileSize = tileSize; }; - return TraversingState; -}(State_1.StateBase)); -exports.TraversingState = TraversingState; - -},{"../../State":214,"three":157,"unitbezier":159}],306:[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 State_1 = require("../../State"); -var WaitingState = (function (_super) { - __extends(WaitingState, _super); - function WaitingState(state) { - _super.call(this, state); - this._motionless = this._motionlessTransition(); - } - WaitingState.prototype.traverse = function () { - return new State_1.TraversingState(this); + /** + * Update the image used as background for the texture. + * + * @param {HTMLImageElement} background - The background image. + */ + TextureProvider.prototype.updateBackground = function (background) { + this._background = background; }; - WaitingState.prototype.wait = function () { - throw new Error("Not implemented"); + /** + * Retrieve an image tile. + * + * @description Retrieve an image tile and render it to the + * texture. Add the tile to the store and emit to the updated + * observable. + * + * @param {Array} tile - The tile coordinates. + * @param {number} level - The tile level. + * @param {number} x - The top left x pixel coordinate of the tile. + * @param {number} y - The top left y pixel coordinate of the tile. + * @param {number} w - The pixel width of the tile. + * @param {number} h - The pixel height of the tile. + * @param {number} scaledW - The scaled width of the returned tile. + * @param {number} scaledH - The scaled height of the returned tile. + */ + TextureProvider.prototype._fetchTile = function (tile, level, x, y, w, h, scaledX, scaledY) { + var _this = this; + var getTile = this._imageTileLoader.getTile(this._key, x, y, w, h, scaledX, scaledY); + var tile$ = getTile[0]; + var abort = getTile[1]; + this._abortFunctions.push(abort); + var tileKey = this._tileKey(this._tileSize, tile); + var subscription = tile$ + .subscribe(function (image) { + _this._renderToTarget(x, y, w, h, image); + _this._removeFromDictionary(tileKey, _this._tileSubscriptions); + _this._removeFromArray(abort, _this._abortFunctions); + _this._setTileRendered(tile, _this._currentLevel); + _this._imageTileStore.addImage(image, tileKey, level); + _this._updated$.next(true); + }, function (error) { + _this._removeFromDictionary(tileKey, _this._tileSubscriptions); + _this._removeFromArray(abort, _this._abortFunctions); + console.error(error); + }); + if (!subscription.closed) { + this._tileSubscriptions[tileKey] = subscription; + } }; - WaitingState.prototype.prepend = function (nodes) { - _super.prototype.prepend.call(this, nodes); - this._motionless = this._motionlessTransition(); + /** + * Retrieve image tiles. + * + * @description Retrieve a image tiles and render them to the + * texture. Retrieve from store if it exists, otherwise Retrieve + * from loader. + * + * @param {Array>} tiles - Array of tile coordinates to + * retrieve. + */ + TextureProvider.prototype._fetchTiles = function (tiles) { + 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(this._tileSize, tile); + if (tileKey in this._renderedCurrentLevelTiles || + tileKey in this._tileSubscriptions) { + continue; + } + var tileX = tileSize * tile[0]; + var tileY = tileSize * tile[1]; + var tileWidth = tileX + tileSize > this._width ? this._width - tileX : tileSize; + var tileHeight = tileY + tileSize > this._height ? this._height - tileY : tileSize; + if (this._imageTileStore.hasImage(tileKey, this._currentLevel)) { + this._renderToTarget(tileX, tileY, tileWidth, tileHeight, this._imageTileStore.getImage(tileKey, this._currentLevel)); + this._setTileRendered(tile, this._currentLevel); + this._updated$.next(true); + continue; + } + var scaledX = Math.floor(tileWidth / tileSize * this._tileSize); + var scaledY = Math.floor(tileHeight / tileSize * this._tileSize); + this._fetchTile(tile, this._currentLevel, tileX, tileY, tileWidth, tileHeight, scaledX, scaledY); + } }; - WaitingState.prototype.set = function (nodes) { - _super.prototype.set.call(this, nodes); - this._motionless = this._motionlessTransition(); + /** + * Get tile coordinates for a point using the current level. + * + * @param {Array} point - Point in basic coordinates. + * + * @returns {Array} x and y tile coodinates. + */ + TextureProvider.prototype._getTileCoords = function (point) { + var tileSize = this._tileSize * Math.pow(2, this._maxLevel - this._currentLevel); + var maxX = Math.ceil(this._width / tileSize) - 1; + var maxY = Math.ceil(this._height / tileSize) - 1; + return [ + Math.min(Math.floor(this._width * point[0] / tileSize), maxX), + Math.min(Math.floor(this._height * point[1] / tileSize), maxY), + ]; }; - WaitingState.prototype.rotate = function (delta) { return; }; - WaitingState.prototype.rotateBasic = function (basicRotation) { return; }; - WaitingState.prototype.rotateToBasic = function (basic) { return; }; - WaitingState.prototype.zoomIn = function (delta, reference) { return; }; - WaitingState.prototype.move = function (delta) { - this._alpha = Math.max(0, Math.min(1, this._alpha + delta)); + /** + * Get tile coordinates for all tiles contained in a bounding + * box. + * + * @param {Array} topLeft - Top left tile coordinate of bounding box. + * @param {Array} bottomRight - Bottom right tile coordinate of bounding box. + * + * @returns {Array>} Array of x, y tile coodinates. + */ + TextureProvider.prototype._getTiles = function (topLeft, bottomRight) { + var xs = []; + if (topLeft[0] > bottomRight[0]) { + var tileSize = this._tileSize * Math.pow(2, this._maxLevel - this._currentLevel); + var maxX = Math.ceil(this._width / tileSize) - 1; + for (var x = topLeft[0]; x <= maxX; x++) { + xs.push(x); + } + for (var x = 0; x <= bottomRight[0]; x++) { + xs.push(x); + } + } + else { + for (var x = topLeft[0]; x <= bottomRight[0]; x++) { + xs.push(x); + } + } + var tiles = []; + for (var _i = 0, xs_1 = xs; _i < xs_1.length; _i++) { + var x = xs_1[_i]; + for (var y = topLeft[1]; y <= bottomRight[1]; y++) { + tiles.push([x, y]); + } + } + return tiles; }; - WaitingState.prototype.moveTo = function (position) { - this._alpha = Math.max(0, Math.min(1, position)); + /** + * Remove an item from an array if it exists in array. + * + * @param {T} item - Item to remove. + * @param {Array} array - Array from which item should be removed. + */ + TextureProvider.prototype._removeFromArray = function (item, array) { + var index = array.indexOf(item); + if (index !== -1) { + array.splice(index, 1); + } }; - WaitingState.prototype.update = function (fps) { - this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha); + /** + * Remove an item from a dictionary. + * + * @param {string} key - Key of the item to remove. + * @param {Object} dict - Dictionary from which item should be removed. + */ + TextureProvider.prototype._removeFromDictionary = function (key, dict) { + if (key in dict) { + delete dict[key]; + } }; - WaitingState.prototype.setCenter = function (center) { return; }; - WaitingState.prototype.setZoom = function (zoom) { return; }; - WaitingState.prototype._getAlpha = function () { - return this._motionless ? Math.ceil(this._alpha) : this._alpha; + /** + * Render an image tile to the target texture. + * + * @param {number} x - The top left x pixel coordinate of the tile. + * @param {number} y - The top left y pixel coordinate of the tile. + * @param {number} w - The pixel width of the tile. + * @param {number} h - The pixel height of the tile. + * @param {HTMLImageElement} background - The image tile to render. + */ + TextureProvider.prototype._renderToTarget = function (x, y, w, h, image) { + var texture = new THREE.Texture(image); + texture.minFilter = THREE.LinearFilter; + texture.needsUpdate = true; + var geometry = new THREE.PlaneGeometry(w, h); + var material = new THREE.MeshBasicMaterial({ map: texture, side: THREE.FrontSide }); + var mesh = new THREE.Mesh(geometry, material); + mesh.position.x = -this._width / 2 + x + w / 2; + mesh.position.y = this._height / 2 - y - h / 2; + var scene = new THREE.Scene(); + scene.add(mesh); + this._renderer.render(scene, this._camera, this._renderTarget); + this._renderer.setRenderTarget(undefined); + scene.remove(mesh); + geometry.dispose(); + material.dispose(); + texture.dispose(); }; - ; - WaitingState.prototype._setCurrentCamera = function () { - _super.prototype._setCurrentCamera.call(this); - if (this._previousNode != null) { - var lookat = this._camera.lookat.clone().sub(this._camera.position); - if (this._previousNode.pano) { - var lookat_1 = this._camera.lookat.clone().sub(this._camera.position); - this._currentCamera.lookat.copy(lookat_1.clone().add(this._currentCamera.position)); + /** + * Mark a tile as rendered. + * + * @description Clears tiles marked as rendered in other + * levels of the tile pyramid if they were rendered on + * top of or below the tile. + * + * @param {Arrary} tile - The tile coordinates. + * @param {number} level - Tile level of the tile coordinates. + */ + TextureProvider.prototype._setTileRendered = function (tile, level) { + var otherLevels = Object.keys(this._renderedTiles) + .map(function (key) { + return parseInt(key, 10); + }) + .filter(function (renderedLevel) { + return renderedLevel !== level; + }); + for (var _i = 0, otherLevels_1 = otherLevels; _i < otherLevels_1.length; _i++) { + var otherLevel = otherLevels_1[_i]; + var scale = Math.pow(2, otherLevel - level); + if (otherLevel < level) { + var x = Math.floor(scale * tile[0]); + var y = Math.floor(scale * tile[1]); + for (var _a = 0, _b = this._renderedTiles[otherLevel].slice(); _a < _b.length; _a++) { + var otherTile = _b[_a]; + if (otherTile[0] === x && otherTile[1] === y) { + var index = this._renderedTiles[otherLevel].indexOf(otherTile); + this._renderedTiles[otherLevel].splice(index, 1); + } + } } - if (this._currentNode.pano) { - this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position)); + else { + var startX = scale * tile[0]; + var endX = startX + scale - 1; + var startY = scale * tile[1]; + var endY = startY + scale - 1; + for (var _c = 0, _d = this._renderedTiles[otherLevel].slice(); _c < _d.length; _c++) { + var otherTile = _d[_c]; + if (otherTile[0] >= startX && otherTile[0] <= endX && + otherTile[1] >= startY && otherTile[1] <= endY) { + var index = this._renderedTiles[otherLevel].indexOf(otherTile); + this._renderedTiles[otherLevel].splice(index, 1); + } + } + } + if (this._renderedTiles[otherLevel].length === 0) { + delete this._renderedTiles[otherLevel]; } } + this._renderedTiles[level].push(tile); + this._renderedCurrentLevelTiles[this._tileKey(this._tileSize, tile)] = true; }; - return WaitingState; -}(State_1.StateBase)); -exports.WaitingState = WaitingState; + /** + * Create a tile key from a tile coordinates. + * + * @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 (tileSize, tile) { + return tileSize + "-" + tile[0] + "-" + tile[1]; + }; + return TextureProvider; +}()); +exports.TextureProvider = TextureProvider; +exports.default = TextureProvider; + +},{"rxjs/Subject":34,"three":180}],359:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var DOM = (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; -},{"../../State":214}],307:[function(require,module,exports){ +},{}],360:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var EventEmitter = (function () { function EventEmitter() { this._events = {}; @@ -31871,11 +40177,11 @@ var EventEmitter = (function () { return EventEmitter; }()); exports.EventEmitter = EventEmitter; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = EventEmitter; -},{}],308:[function(require,module,exports){ +},{}],361:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var Viewer_1 = require("../Viewer"); var Settings = (function () { function Settings() { @@ -31915,19 +40221,102 @@ var Settings = (function () { return Settings; }()); exports.Settings = Settings; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Settings; -},{"../Viewer":216}],309:[function(require,module,exports){ +},{"../Viewer":241}],362:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +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); +} +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; +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; + +},{}],363:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var Urls = (function () { function Urls() { } - Urls.dynamicImage = function (key, size) { - return "https://d2qb1440i7l50o.cloudfront.net/" + key + "/full/!" + size + "," + size + "/0/default.jpg?origin=mapillary.webgl"; - }; + Object.defineProperty(Urls, "tileScheme", { + get: function () { + return "https"; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Urls, "tileDomain", { + get: function () { + return "d2qb1440i7l50o.cloudfront.net"; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Urls, "origin", { + get: function () { + return "mapillary.webgl"; + }, + enumerable: true, + configurable: true + }); Urls.thumbnail = function (key, size) { - return "https://d1cuyjsrcm0gby.cloudfront.net/" + key + "/thumb-" + size + ".jpg?origin=mapillary.webgl"; + return "https://d1cuyjsrcm0gby.cloudfront.net/" + key + "/thumb-" + size + ".jpg?origin=" + this.origin; }; Urls.falcorModel = function (clientId) { return "https://a.mapillary.com/v3/model.json?client_id=" + clientId; @@ -31938,20 +40327,130 @@ var Urls = (function () { return Urls; }()); exports.Urls = Urls; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Urls; -},{}],310:[function(require,module,exports){ +},{}],364:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Enumeration for alignments + * @enum {number} + * @readonly + */ +var Alignment; +(function (Alignment) { + /** + * Align to bottom + */ + Alignment[Alignment["Bottom"] = 0] = "Bottom"; + /** + * Align to bottom left + */ + Alignment[Alignment["BottomLeft"] = 1] = "BottomLeft"; + /** + * Align to bottom right + */ + Alignment[Alignment["BottomRight"] = 2] = "BottomRight"; + /** + * Align to center + */ + Alignment[Alignment["Center"] = 3] = "Center"; + /** + * Align to left + */ + Alignment[Alignment["Left"] = 4] = "Left"; + /** + * Align to right + */ + Alignment[Alignment["Right"] = 5] = "Right"; + /** + * Align to top + */ + Alignment[Alignment["Top"] = 6] = "Top"; + /** + * Align to top left + */ + Alignment[Alignment["TopLeft"] = 7] = "TopLeft"; + /** + * Align to top right + */ + Alignment[Alignment["TopRight"] = 8] = "TopRight"; +})(Alignment = exports.Alignment || (exports.Alignment = {})); +exports.default = Alignment; + +},{}],365:[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 () { + function CacheService(graphService, stateService) { + this._graphService = graphService; + this._stateService = stateService; + this._started = false; + } + Object.defineProperty(CacheService.prototype, "started", { + get: function () { + return this._started; + }, + enumerable: true, + configurable: true + }); + CacheService.prototype.start = function () { + var _this = this; + if (this._started) { + return; + } + this._uncacheSubscription = this._stateService.currentState$ + .distinctUntilChanged(undefined, function (frame) { + return frame.state.currentNode.key; + }) + .map(function (frame) { + return frame.state.trajectory + .map(function (n) { + return n.key; + }); + }) + .bufferCount(1, 5) + .switchMap(function (keepKeysBuffer) { + var keepKeys = keepKeysBuffer[0]; + return _this._graphService.uncache$(keepKeys); + }) + .subscribe(function () { }); + this._started = true; + }; + CacheService.prototype.stop = function () { + if (!this._started) { + return; + } + this._uncacheSubscription.unsubscribe(); + this._uncacheSubscription = null; + this._started = false; + }; + 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":80}],366:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); var Component_1 = require("../Component"); var ComponentController = (function () { - function ComponentController(container, navigator, key, options) { + 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) { @@ -31960,16 +40459,26 @@ var ComponentController = (function () { } else { this._navigator.movedToKey$ - .first() - .subscribe(function (movedToKey) { - _this._key = movedToKey; + .first(function (k) { + return k != null; + }) + .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._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); }; @@ -31977,13 +40486,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(); @@ -31995,9 +40504,9 @@ var ComponentController = (function () { this._uFalse(options.image, "image"); this._uFalse(options.marker, "marker"); this._uFalse(options.navigation, "navigation"); + this._uFalse(options.popup, "popup"); this._uFalse(options.route, "route"); this._uFalse(options.slider, "slider"); - this._uFalse(options.stats, "stats"); this._uFalse(options.tag, "tag"); this._uTrue(options.attribution, "attribution"); this._uTrue(options.bearing, "bearing"); @@ -32008,6 +40517,7 @@ var ComponentController = (function () { this._uTrue(options.loading, "loading"); this._uTrue(options.mouse, "mouse"); this._uTrue(options.sequence, "sequence"); + this._uTrue(options.stats, "stats"); }; ComponentController.prototype._initilizeCoverComponent = function () { var options = this._options; @@ -32019,23 +40529,45 @@ 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) { - _this._navigator.moveToKey$(conf.key) + if (conf.state === Component_1.CoverState.Loading) { + _this._navigator.stateService.currentKey$ + .first() + .switchMap(function (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._coverComponent.configure({ loading: false, visible: false }); + _this._observer.startEmit(); + _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._componentService.activateCover(); + _this._setNavigable(conf.key == null); } }); }; @@ -32077,96 +40609,60 @@ var ComponentController = (function () { }()); exports.ComponentController = ComponentController; -},{"../Component":207}],311:[function(require,module,exports){ +},{"../Component":230}],367:[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) { + function Container(id, stateService, options, dom) { this.id = id; - this.element = document.getElementById(id); - this.element.classList.add("mapillary-js"); - this.renderService = new Render_1.RenderService(this.element, stateService.currentState$, options.renderMode); - this.glRenderer = new Render_1.GLRenderer(this.renderService); - this.domRenderer = new Render_1.DOMRenderer(this.element, this.renderService, stateService.currentState$); - this.mouseService = new Viewer_1.MouseService(this.element); - this.touchService = new Viewer_1.TouchService(this.element); + 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 = 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._dom); + this.domRenderer = new Render_1.DOMRenderer(this._domContainer, this.renderService, stateService.currentState$); + 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); } + Object.defineProperty(Container.prototype, "element", { + get: function () { + return this._container; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Container.prototype, "canvasContainer", { + get: function () { + return this._canvasContainer; + }, + enumerable: true, + configurable: true + }); return Container; }()); exports.Container = Container; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Container; -},{"../Render":213,"../Viewer":216}],312:[function(require,module,exports){ +},{"../Render":236,"../Utils":240,"../Viewer":241}],368:[function(require,module,exports){ "use strict"; -var Observable_1 = require("rxjs/Observable"); -require("rxjs/add/observable/combineLatest"); -require("rxjs/add/operator/distinctUntilChanged"); -require("rxjs/add/operator/map"); -var Viewer_1 = require("../Viewer"); -var EventLauncher = (function () { - function EventLauncher(eventEmitter, navigator, container) { - var _this = this; - this._container = container; - this._eventEmitter = eventEmitter; - this._navigator = navigator; - this._loadingSubscription = this._navigator.loadingService.loading$ - .subscribe(function (loading) { - _this._eventEmitter.fire(Viewer_1.Viewer.loadingchanged, loading); - }); - this._currentNodeSubscription = this._navigator.stateService.currentNodeExternal$ - .subscribe(function (node) { - _this._eventEmitter.fire(Viewer_1.Viewer.nodechanged, node); - }); - this._sequenceEdgesSubscription = this._navigator.stateService.currentNodeExternal$ - .switchMap(function (node) { - return node.sequenceEdges$; - }) - .subscribe(function (status) { - _this._eventEmitter.fire(Viewer_1.Viewer.sequenceedgeschanged, status); - }); - this._spatialEdgesSubscription = this._navigator.stateService.currentNodeExternal$ - .switchMap(function (node) { - return node.spatialEdges$; - }) - .subscribe(function (status) { - _this._eventEmitter.fire(Viewer_1.Viewer.spatialedgeschanged, status); - }); - Observable_1.Observable - .combineLatest(this._navigator.stateService.moving$, this._container.mouseService.active$) - .map(function (values) { - return values[0] || values[1]; - }) - .distinctUntilChanged() - .subscribe(function (started) { - if (started) { - _this._eventEmitter.fire(Viewer_1.Viewer.movestart, null); - } - else { - _this._eventEmitter.fire(Viewer_1.Viewer.moveend, null); - } - }); - } - EventLauncher.prototype.dispose = function () { - this._loadingSubscription.unsubscribe(); - this._currentNodeSubscription.unsubscribe(); - }; - return EventLauncher; -}()); -exports.EventLauncher = EventLauncher; Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = EventLauncher; - -},{"../Viewer":216,"rxjs/Observable":28,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/map":60}],313:[function(require,module,exports){ -"use strict"; /** * Enumeration for image sizes * @enum {number} * @readonly * @description Image sizes in pixels for the long side of the image. */ +var ImageSize; (function (ImageSize) { /** * 320 pixels image size @@ -32184,12 +40680,32 @@ exports.default = EventLauncher; * 2048 pixels image size */ ImageSize[ImageSize["Size2048"] = 2048] = "Size2048"; -})(exports.ImageSize || (exports.ImageSize = {})); -var ImageSize = exports.ImageSize; +})(ImageSize = exports.ImageSize || (exports.ImageSize = {})); -},{}],314:[function(require,module,exports){ -/// +},{}],369:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Observable_1 = require("rxjs/Observable"); +var KeyboardService = (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}],370:[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"); @@ -32243,12 +40759,11 @@ var LoadingService = (function () { return LoadingService; }()); exports.LoadingService = LoadingService; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = LoadingService; -},{"rxjs/Subject":33,"rxjs/add/operator/debounceTime":51,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/map":60,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/startWith":72,"underscore":158}],315:[function(require,module,exports){ -/// +},{"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":74,"rxjs/add/operator/startWith":79,"underscore":182}],371:[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"); @@ -32262,121 +40777,141 @@ 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(element) { + function MouseService(container, canvasContainer, domContainer, doc, viewportCoords) { var _this = this; - this._element = element; + this._canvasContainer = canvasContainer; + this._domContainer = domContainer; + this._viewportCoords = viewportCoords != null ? viewportCoords : new Geo_1.ViewportCoords(); this._activeSubject$ = new BehaviorSubject_1.BehaviorSubject(false); this._active$ = this._activeSubject$ .distinctUntilChanged() .publishReplay(1) .refCount(); - this._preventMouseDownOperation$ = new Subject_1.Subject(); - this._preventMouseDown$ = new Subject_1.Subject(); - this._mouseMoveOperation$ = new Subject_1.Subject(); this._claimMouse$ = new Subject_1.Subject(); - this._mouseDown$ = Observable_1.Observable.fromEvent(element, "mousedown"); - this._mouseLeave$ = Observable_1.Observable.fromEvent(element, "mouseleave"); - this._mouseUp$ = Observable_1.Observable.fromEvent(element, "mouseup"); - this._mouseOver$ = Observable_1.Observable.fromEvent(element, "mouseover"); - this._click$ = Observable_1.Observable.fromEvent(element, "click"); - this._mouseWheel$ = Observable_1.Observable.fromEvent(element, "wheel"); - this._mouseWheel$ + 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"); + this._mouseUp$ = Observable_1.Observable.fromEvent(canvasContainer, "mouseup"); + this._mouseOut$ = Observable_1.Observable.fromEvent(canvasContainer, "mouseout"); + this._mouseOver$ = Observable_1.Observable.fromEvent(canvasContainer, "mouseover"); + this._domMouseDown$ = Observable_1.Observable.fromEvent(domContainer, "mousedown"); + this._domMouseMove$ = Observable_1.Observable.fromEvent(domContainer, "mousemove"); + this._click$ = Observable_1.Observable.fromEvent(canvasContainer, "click"); + this._contextMenu$ = Observable_1.Observable.fromEvent(canvasContainer, "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._preventMouseDownOperation$ - .scan(function (prevent, operation) { - return operation(prevent); - }, true) - .subscribe(); - this._preventMouseDown$ - .map(function (prevent) { - return function (previous) { - return prevent; - }; - }) - .subscribe(this._preventMouseDownOperation$); - this._mouseDown$ - .map(function (e) { - return function (prevent) { - if (prevent) { - e.preventDefault(); - } - return prevent; - }; + this._mouseWheel$ = Observable_1.Observable + .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) + .filter(function (events) { + // fire context menu on mouse up both on mac and windows + return events[0].type === "mousedown" && + events[1].type === "contextmenu" && + events[2].type === "mouseup"; }) - .subscribe(this._preventMouseDownOperation$); - this._mouseMove$ = this._mouseMoveOperation$ - .scan(function (e, operation) { - return operation(e); - }, null); - Observable_1.Observable - .fromEvent(element, "mousemove") - .map(function (e) { - return function (previous) { - if (previous == null) { - previous = e; - } - if (e.movementX == null) { - e.movementX = e.clientX - previous.clientX; - } - if (e.movementY == null) { - e.movementY = e.clientY - previous.clientY; - } - return e; - }; + .map(function (events) { + return events[1]; }) - .subscribe(this._mouseMoveOperation$); + .share(); var dragStop$ = Observable_1.Observable - .merge(this._mouseLeave$, this._mouseUp$); - this._mouseDragStart$ = this._mouseDown$ - .mergeMap(function (e) { - return _this._mouseMove$ - .takeUntil(dragStop$) + .merge(Observable_1.Observable.fromEvent(window, "blur"), this._documentMouseUp$ + .filter(function (e) { + return e.button === 0; + })) + .share(); + 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$ = this._mouseDown$ - .mergeMap(function (e) { - return _this._mouseMove$ - .skip(1) - .takeUntil(dragStop$); - }); - this._mouseDragEnd$ = this._mouseDragStart$ - .mergeMap(function (e) { - return dragStop$.first(); - }); + }) + .share(); 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 () { @@ -32392,6 +40927,55 @@ var MouseService = (function () { enumerable: true, configurable: true }); + Object.defineProperty(MouseService.prototype, "documentMouseMove$", { + get: function () { + return this._documentMouseMove$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseService.prototype, "documentMouseUp$", { + get: function () { + return this._documentMouseUp$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseService.prototype, "domMouseDragStart$", { + get: function () { + return this._domMouseDragStart$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseService.prototype, "domMouseDrag$", { + get: function () { + return this._domMouseDrag$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseService.prototype, "domMouseDragEnd$", { + get: function () { + return this._domMouseDragEnd$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseService.prototype, "domMouseDown$", { + get: function () { + return this._domMouseDown$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseService.prototype, "domMouseMove$", { + get: function () { + return this._domMouseMove$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(MouseService.prototype, "mouseOwner$", { get: function () { return this._mouseOwner$; @@ -32420,6 +41004,20 @@ var MouseService = (function () { enumerable: true, configurable: true }); + Object.defineProperty(MouseService.prototype, "mouseOut$", { + get: function () { + return this._mouseOut$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseService.prototype, "mouseOver$", { + get: function () { + return this._mouseOver$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(MouseService.prototype, "mouseUp$", { get: function () { return this._mouseUp$; @@ -32434,6 +41032,20 @@ var MouseService = (function () { enumerable: true, configurable: true }); + Object.defineProperty(MouseService.prototype, "dblClick$", { + get: function () { + return this._dblClick$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MouseService.prototype, "contextMenu$", { + get: function () { + return this._consistentContextMenu$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(MouseService.prototype, "mouseWheel$", { get: function () { return this._mouseWheel$; @@ -32462,16 +41074,16 @@ var MouseService = (function () { enumerable: true, configurable: true }); - Object.defineProperty(MouseService.prototype, "staticClick$", { + Object.defineProperty(MouseService.prototype, "proximateClick$", { get: function () { - return this._staticClick$; + return this._proximateClick$; }, enumerable: true, configurable: true }); - Object.defineProperty(MouseService.prototype, "preventDefaultMouseDown$", { + Object.defineProperty(MouseService.prototype, "staticClick$", { get: function () { - return this._preventMouseDown$; + return this._staticClick$; }, enumerable: true, configurable: true @@ -32482,30 +41094,134 @@ 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)]; + }) + .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; + }) + .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; }) - .filter(function (eo) { - return eo[1] === name; + .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 (eo) { - return eo[0]; + .map(function (_a) { + var item = _a[0], owner = _a[1]; + return item; }); }; return MouseService; }()); exports.MouseService = MouseService; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = MouseService; -},{"rxjs/BehaviorSubject":25,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/fromEvent":41,"rxjs/add/operator/distinctUntilChanged":53,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/merge":61,"rxjs/add/operator/mergeMap":63,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/switchMap":73,"rxjs/add/operator/withLatestFrom":76}],316:[function(require,module,exports){ -/// +},{"../Geo":233,"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":74,"rxjs/add/operator/switchMap":80,"rxjs/add/operator/withLatestFrom":85}],372:[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"); +var ReplaySubject_1 = require("rxjs/ReplaySubject"); require("rxjs/add/observable/throw"); require("rxjs/add/operator/do"); require("rxjs/add/operator/finally"); @@ -32518,8 +41234,8 @@ var Edge_1 = require("../Edge"); var State_1 = require("../State"); var Viewer_1 = require("../Viewer"); var Navigator = (function () { - function Navigator(clientId, apiV3, graphService, imageLoadingService, loadingService, stateService) { - this._apiV3 = apiV3 != null ? apiV3 : new API_1.APIv3(clientId); + function Navigator(clientId, token, apiV3, graphService, imageLoadingService, loadingService, stateService, cacheService) { + this._apiV3 = apiV3 != null ? apiV3 : new API_1.APIv3(clientId, token); this._imageLoadingService = imageLoadingService != null ? imageLoadingService : new Graph_1.ImageLoadingService(); this._graphService = graphService != null ? graphService : @@ -32527,10 +41243,15 @@ var Navigator = (function () { this._loadingService = loadingService != null ? loadingService : new Viewer_1.LoadingService(); this._loadingName = "navigator"; this._stateService = stateService != null ? stateService : new State_1.StateService(); + this._cacheService = cacheService != null ? + cacheService : + new Viewer_1.CacheService(this._graphService, this._stateService); + this._cacheService.start(); this._keyRequested$ = new BehaviorSubject_1.BehaviorSubject(null); - this._movedToKey$ = new Subject_1.Subject(); - this._dirRequested$ = new BehaviorSubject_1.BehaviorSubject(null); - this._latLonRequested$ = new BehaviorSubject_1.BehaviorSubject(null); + this._movedToKey$ = new BehaviorSubject_1.BehaviorSubject(null); + this._request$ = null; + this._requestSubscription = null; + this._nodeRequestSubscription = null; } Object.defineProperty(Navigator.prototype, "apiV3", { get: function () { @@ -32553,13 +41274,6 @@ var Navigator = (function () { enumerable: true, configurable: true }); - Object.defineProperty(Navigator.prototype, "keyRequested$", { - get: function () { - return this._keyRequested$; - }, - enumerable: true, - configurable: true - }); Object.defineProperty(Navigator.prototype, "loadingService", { get: function () { return this._loadingService; @@ -32582,82 +41296,422 @@ var Navigator = (function () { configurable: true }); Navigator.prototype.moveToKey$ = function (key) { + 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._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 ? + node.sequenceEdges$ : + node.spatialEdges$) + .first() + .map(function (status) { + for (var _i = 0, _a = status.edges; _i < _a.length; _i++) { + var edge = _a[_i]; + if (edge.data.direction === direction) { + return edge.to; + } + } + return null; + }); + }) + .mergeMap(function (directionKey) { + if (directionKey == null) { + _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._makeRequest$(node$); + }; + Navigator.prototype.moveCloseTo$ = function (lat, lon) { + var _this = this; + 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); + return Observable_1.Observable + .throw(new Error("No image found close to lat " + lat + ", lon " + lon + ".")); + } + return _this._moveToKey$(fullNode.key); + }); + return this._makeRequest$(node$); + }; + Navigator.prototype.setFilter$ = function (filter) { + var _this = this; + this._stateService.clearNodes(); + return this._movedToKey$ + .first() + .mergeMap(function (key) { + if (key != null) { + return _this._trajectoryKeys$() + .mergeMap(function (keys) { + return _this._graphService.setFilter$(filter) + .mergeMap(function (graph) { + return _this._cacheKeys$(keys); + }); + }) + .last(); + } + return _this._keyRequested$ + .first() + .mergeMap(function (requestedKey) { + if (requestedKey != null) { + return _this._graphService.setFilter$(filter) + .mergeMap(function (graph) { + return _this._graphService.cacheNode$(requestedKey); + }); + } + return _this._graphService.setFilter$(filter) + .map(function (graph) { + return undefined; + }); + }); + }) + .map(function (node) { + return undefined; + }); + }; + Navigator.prototype.setToken$ = function (token) { + var _this = this; + this._abortRequest("to set token"); + this._stateService.clearNodes(); + return this._movedToKey$ + .first() + .do(function (key) { + _this._apiV3.setToken(token); + }) + .mergeMap(function (key) { + return key == null ? + _this._graphService.reset$([]) + .map(function (graph) { + return undefined; + }) : + _this._trajectoryKeys$() + .mergeMap(function (keys) { + return _this._graphService.reset$(keys) + .mergeMap(function (graph) { + return _this._cacheKeys$(keys); + }); + }) + .last() + .map(function (node) { + return undefined; + }); + }); + }; + Navigator.prototype._cacheKeys$ = function (keys) { + var _this = this; + var cacheNodes$ = keys + .map(function (key) { + return _this._graphService.cacheNode$(key); + }); + return Observable_1.Observable + .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) { + this._request$.error(new Error("Request aborted by a subsequent request " + reason + ".")); + this._request$ = null; + } + }; + Navigator.prototype._makeRequest$ = function (node$) { + var _this = this; + this._request$ = new ReplaySubject_1.ReplaySubject(1); + this._requestSubscription = this._request$ + .subscribe(undefined, function (e) { }); + this._nodeRequestSubscription = node$ + .subscribe(function (node) { + _this._request$.next(node); + _this._request$.complete(); + }, function (error) { + _this._request$.error(error); + }); + return this._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() + .map(function (frame) { + return frame.state.trajectory + .map(function (node) { + return node.key; + }); + }); + }; + return Navigator; +}()); +exports.Navigator = Navigator; +exports.default = Navigator; + +},{"../API":229,"../Edge":231,"../Graph":234,"../State":237,"../Viewer":241,"rxjs/BehaviorSubject":26,"rxjs/Observable":29,"rxjs/ReplaySubject":32,"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}],373:[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/observable/combineLatest"); +require("rxjs/add/operator/distinctUntilChanged"); +require("rxjs/add/operator/map"); +require("rxjs/add/operator/throttleTime"); +var Viewer_1 = require("../Viewer"); +var Observer = (function () { + function Observer(eventEmitter, navigator, container) { + var _this = this; + this._container = container; + this._eventEmitter = eventEmitter; + this._navigator = navigator; + this._projection = new Viewer_1.Projection(); + this._started = false; + 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); + }); + } + Object.defineProperty(Observer.prototype, "started", { + get: function () { + return this._started; + }, + 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 + .combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$) + .first() + .map(function (_a) { + var render = _a[0], transform = _a[1]; + var canvasPoint = _this._projection.basicToCanvas(basicPoint, _this._container.element, render, transform); + return [Math.round(canvasPoint[0]), Math.round(canvasPoint[1])]; + }); + }; + Observer.prototype.startEmit = function () { 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); + if (this._started) { + return; + } + this._started = true; + this._currentNodeSubscription = this._navigator.stateService.currentNodeExternal$ + .subscribe(function (node) { + _this._eventEmitter.fire(Viewer_1.Viewer.nodechanged, node); + }); + this._sequenceEdgesSubscription = this._navigator.stateService.currentNodeExternal$ + .switchMap(function (node) { + return node.sequenceEdges$; }) - .finally(function () { - _this.loadingService.stopLoading(_this._loadingName); + .subscribe(function (status) { + _this._eventEmitter.fire(Viewer_1.Viewer.sequenceedgeschanged, status); + }); + this._spatialEdgesSubscription = this._navigator.stateService.currentNodeExternal$ + .switchMap(function (node) { + return node.spatialEdges$; + }) + .subscribe(function (status) { + _this._eventEmitter.fire(Viewer_1.Viewer.spatialedgeschanged, status); + }); + this._moveSubscription = Observable_1.Observable + .combineLatest(this._navigator.stateService.inMotion$, this._container.mouseService.active$, this._container.touchService.active$) + .map(function (values) { + return values[0] || values[1] || values[2]; + }) + .distinctUntilChanged() + .subscribe(function (started) { + if (started) { + _this._eventEmitter.fire(Viewer_1.Viewer.movestart, null); + } + else { + _this._eventEmitter.fire(Viewer_1.Viewer.moveend, null); + } + }); + this._bearingSubscription = this._container.renderService.bearing$ + .throttleTime(100) + .distinctUntilChanged(function (b1, b2) { + return Math.abs(b2 - b1) < 1; + }) + .subscribe(function (bearing) { + _this._eventEmitter.fire(Viewer_1.Viewer.bearingchanged, bearing); + }); + var mouseMove$ = this._container.mouseService.active$ + .switchMap(function (active) { + return active ? + Observable_1.Observable.empty() : + _this._container.mouseService.mouseMove$; + }); + this._viewerMouseEventSubscription = Observable_1.Observable + .merge(this._mapMouseEvent$(Viewer_1.Viewer.click, this._container.mouseService.staticClick$), this._mapMouseEvent$(Viewer_1.Viewer.contextmenu, this._container.mouseService.contextMenu$), this._mapMouseEvent$(Viewer_1.Viewer.dblclick, this._container.mouseService.dblClick$), this._mapMouseEvent$(Viewer_1.Viewer.mousedown, this._container.mouseService.mouseDown$), this._mapMouseEvent$(Viewer_1.Viewer.mousemove, mouseMove$), this._mapMouseEvent$(Viewer_1.Viewer.mouseout, this._container.mouseService.mouseOut$), this._mapMouseEvent$(Viewer_1.Viewer.mouseover, this._container.mouseService.mouseOver$), this._mapMouseEvent$(Viewer_1.Viewer.mouseup, this._container.mouseService.mouseUp$)) + .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.reference$, this._navigator.stateService.currentTransform$) + .map(function (_a) { + var _b = _a[0], type = _b[0], event = _b[1], render = _a[1], reference = _a[2], transform = _a[3]; + var unprojection = _this._projection.eventToUnprojection(event, _this._container.element, render, reference, transform); + return { + basicPoint: unprojection.basicPoint, + latLon: unprojection.latLon, + originalEvent: event, + pixelPoint: unprojection.pixelPoint, + target: _this._eventEmitter, + type: type, + }; + }) + .subscribe(function (event) { + _this._eventEmitter.fire(event.type, event); }); }; - Navigator.prototype.moveDir$ = function (direction) { + Observer.prototype.stopEmit = function () { + if (!this.started) { + return; + } + this._started = false; + this._bearingSubscription.unsubscribe(); + this._currentNodeSubscription.unsubscribe(); + this._moveSubscription.unsubscribe(); + this._sequenceEdgesSubscription.unsubscribe(); + this._spatialEdgesSubscription.unsubscribe(); + this._viewerMouseEventSubscription.unsubscribe(); + this._bearingSubscription = null; + this._currentNodeSubscription = null; + this._moveSubscription = null; + this._sequenceEdgesSubscription = null; + this._spatialEdgesSubscription = null; + this._viewerMouseEventSubscription = null; + }; + Observer.prototype.unproject$ = function (canvasPoint) { var _this = this; - this.loadingService.startLoading(this._loadingName); - this._dirRequested$.next(direction); - return this.stateService.currentNode$ + return Observable_1.Observable + .combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.reference$, this._navigator.stateService.currentTransform$) .first() - .mergeMap(function (node) { - return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ? - node.sequenceEdges$ : - node.spatialEdges$) - .first() - .map(function (status) { - for (var _i = 0, _a = status.edges; _i < _a.length; _i++) { - var edge = _a[_i]; - if (edge.data.direction === direction) { - return edge.to; - } - } - return null; - }); - }) - .mergeMap(function (directionKey) { - if (directionKey == null) { - _this.loadingService.stopLoading(_this._loadingName); - return Observable_1.Observable - .throw(new Error("Direction (" + direction + ") does not exist for current node.")); - } - return _this.moveToKey$(directionKey); + .map(function (_a) { + var render = _a[0], reference = _a[1], transform = _a[2]; + var unprojection = _this._projection.canvasToUnprojection(canvasPoint, _this._container.element, render, reference, transform); + return unprojection.latLon; }); }; - Navigator.prototype.moveCloseTo$ = function (lat, lon) { + Observer.prototype.unprojectBasic$ = function (canvasPoint) { var _this = this; - this.loadingService.startLoading(this._loadingName); - this._latLonRequested$.next({ lat: lat, lon: lon }); - return this.apiV3.imageCloseTo$(lat, lon) - .mergeMap(function (fullNode) { - if (fullNode == null) { - _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 Observable_1.Observable + .combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$) + .first() + .map(function (_a) { + var render = _a[0], transform = _a[1]; + return _this._projection.canvasToBasic(canvasPoint, _this._container.element, render, transform); }); }; - return Navigator; + Observer.prototype._mapMouseEvent$ = function (type, mouseEvent$) { + return mouseEvent$.map(function (event) { + return [type, event]; + }); + }; + return Observer; }()); -exports.Navigator = Navigator; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = Navigator; +exports.Observer = Observer; +exports.default = Observer; -},{"../API":206,"../Edge":208,"../Graph":211,"../State":214,"../Viewer":216,"rxjs/BehaviorSubject":25,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/throw":45,"rxjs/add/operator/do":54,"rxjs/add/operator/finally":57,"rxjs/add/operator/first":58,"rxjs/add/operator/map":60,"rxjs/add/operator/mergeMap":63}],317:[function(require,module,exports){ +},{"../Viewer":241,"rxjs/Observable":29,"rxjs/Subject":34,"rxjs/add/observable/combineLatest":38,"rxjs/add/operator/distinctUntilChanged":58,"rxjs/add/operator/map":65,"rxjs/add/operator/throttleTime":84}],374:[function(require,module,exports){ "use strict"; -(function (SpriteAlignment) { - SpriteAlignment[SpriteAlignment["Center"] = 0] = "Center"; - SpriteAlignment[SpriteAlignment["Start"] = 1] = "Start"; - SpriteAlignment[SpriteAlignment["End"] = 2] = "End"; -})(exports.SpriteAlignment || (exports.SpriteAlignment = {})); -var SpriteAlignment = exports.SpriteAlignment; +/// Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = SpriteAlignment; +var THREE = require("three"); +var Geo_1 = require("../Geo"); +var Projection = (function () { + function Projection(geoCoords, viewportCoords) { + this._geoCoords = !!geoCoords ? geoCoords : new Geo_1.GeoCoords(); + this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords(); + } + Projection.prototype.basicToCanvas = function (basicPoint, container, render, transform) { + return this._viewportCoords + .basicToCanvas(basicPoint[0], basicPoint[1], container, transform, render.perspective); + }; + Projection.prototype.canvasToBasic = function (canvasPoint, container, render, transform) { + var basicPoint = this._viewportCoords + .canvasToBasic(canvasPoint[0], canvasPoint[1], container, transform, render.perspective); + if (basicPoint[0] < 0 || basicPoint[0] > 1 || basicPoint[1] < 0 || basicPoint[1] > 1) { + basicPoint = null; + } + return basicPoint; + }; + Projection.prototype.eventToUnprojection = function (event, container, render, reference, transform) { + var pixelPoint = this._viewportCoords.canvasPosition(event, container); + return this.canvasToUnprojection(pixelPoint, container, render, reference, transform); + }; + Projection.prototype.canvasToUnprojection = function (canvasPoint, container, render, reference, transform) { + var canvasX = canvasPoint[0]; + var canvasY = canvasPoint[1]; + var _a = this._viewportCoords.canvasToViewport(canvasX, canvasY, container), viewportX = _a[0], viewportY = _a[1]; + var point3d = new THREE.Vector3(viewportX, viewportY, 1) + .unproject(render.perspective); + var basicPoint = transform.projectBasic(point3d.toArray()); + if (basicPoint[0] < 0 || basicPoint[0] > 1 || basicPoint[1] < 0 || basicPoint[1] > 1) { + basicPoint = null; + } + var direction3d = point3d.clone().sub(render.camera.position).normalize(); + var dist = -2 / direction3d.z; + var latLon = null; + if (dist > 0 && dist < 100 && !!basicPoint) { + var point = direction3d.clone().multiplyScalar(dist).add(render.camera.position); + var latLonArray = this._geoCoords + .enuToGeodetic(point.x, point.y, point.z, reference.lat, reference.lon, reference.alt) + .slice(0, 2); + latLon = { lat: latLonArray[0], lon: latLonArray[1] }; + } + var unprojection = { + basicPoint: basicPoint, + latLon: latLon, + pixelPoint: [canvasX, canvasY], + }; + return unprojection; + }; + return Projection; +}()); +exports.Projection = Projection; +exports.default = Projection; -},{}],318:[function(require,module,exports){ -/// +},{"../Geo":233,"three":180}],375:[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"); @@ -32711,15 +41765,12 @@ var SpriteAtlas = (function () { var material = new THREE.SpriteMaterial({ map: texture }); return new THREE.Sprite(material); }; - SpriteAtlas.prototype.getDOMSprite = function (name, horizontalAlign, verticalAlign) { + SpriteAtlas.prototype.getDOMSprite = function (name, float) { if (!this.loaded) { throw new Error("Sprites cannot be retrieved before the atlas is loaded."); } - if (horizontalAlign == null) { - horizontalAlign = Viewer_1.SpriteAlignment.Start; - } - if (verticalAlign == null) { - verticalAlign = Viewer_1.SpriteAlignment.Start; + if (float == null) { + float = Viewer_1.Alignment.Center; } var definition = this._json[name]; if (!definition) { @@ -32734,27 +41785,37 @@ var SpriteAtlas = (function () { var top = -definition.y; var height = this._image.height; var width = this._image.width; - switch (horizontalAlign) { - case Viewer_1.SpriteAlignment.Center: + switch (float) { + case Viewer_1.Alignment.Bottom: + case Viewer_1.Alignment.Center: + case Viewer_1.Alignment.Top: left -= definition.width / 2; break; - case Viewer_1.SpriteAlignment.End: + case Viewer_1.Alignment.BottomLeft: + case Viewer_1.Alignment.Left: + case Viewer_1.Alignment.TopLeft: left -= definition.width; break; - case Viewer_1.SpriteAlignment.Start: - break; + case Viewer_1.Alignment.BottomRight: + case Viewer_1.Alignment.Right: + case Viewer_1.Alignment.BottomRight: default: break; } - switch (verticalAlign) { - case Viewer_1.SpriteAlignment.Center: + switch (float) { + case Viewer_1.Alignment.Center: + case Viewer_1.Alignment.Left: + case Viewer_1.Alignment.Right: top -= definition.height / 2; break; - case Viewer_1.SpriteAlignment.End: + case Viewer_1.Alignment.Top: + case Viewer_1.Alignment.TopLeft: + case Viewer_1.Alignment.TopRight: top -= definition.height; break; - case Viewer_1.SpriteAlignment.Start: - break; + case Viewer_1.Alignment.Bottom: + case Viewer_1.Alignment.BottomLeft: + case Viewer_1.Alignment.BottomRight: default: break; } @@ -32796,7 +41857,7 @@ var SpriteService = (function () { }, new SpriteAtlas()) .publishReplay(1) .refCount(); - this._spriteAtlas$.subscribe(); + this._spriteAtlas$.subscribe(function () { }); if (sprite == null) { return; } @@ -32844,89 +41905,71 @@ var SpriteService = (function () { return SpriteService; }()); exports.SpriteService = SpriteService; -Object.defineProperty(exports, "__esModule", { value: true }); exports.default = SpriteService; -},{"../Viewer":216,"rxjs/Subject":33,"rxjs/add/operator/publishReplay":67,"rxjs/add/operator/scan":68,"rxjs/add/operator/startWith":72,"three":157,"virtual-dom":163}],319:[function(require,module,exports){ -/// +},{"../Viewer":241,"rxjs/Subject":34,"rxjs/add/operator/publishReplay":72,"rxjs/add/operator/scan":74,"rxjs/add/operator/startWith":79,"three":180,"virtual-dom":186}],376:[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 TouchMove = (function () { - function TouchMove(touch) { - this.movementX = 0; - this.movementY = 0; - if (touch == null) { - return; - } - this.identifier = touch.identifier; - this.clientX = touch.clientX; - this.clientY = touch.clientY; - this.pageX = touch.pageX; - this.pageY = touch.pageY; - this.screenX = touch.screenX; - this.screenY = touch.screenY; - this.target = touch.target; - } - return TouchMove; -}()); -exports.TouchMove = TouchMove; var TouchService = (function () { - function TouchService(element) { + function TouchService(canvasContainer, domContainer) { var _this = this; - this._element = element; - this._touchStart$ = Observable_1.Observable.fromEvent(element, "touchstart"); - this._touchMove$ = Observable_1.Observable.fromEvent(element, "touchmove"); - this._touchEnd$ = Observable_1.Observable.fromEvent(element, "touchend"); - this._touchCancel$ = Observable_1.Observable.fromEvent(element, "touchcancel"); - this._preventTouchMoveOperation$ = new Subject_1.Subject(); - this._preventTouchMove$ = new Subject_1.Subject(); - this._preventTouchMoveOperation$ - .scan(function (prevent, operation) { - return operation(prevent); - }, true) - .subscribe(); - this._preventTouchMove$ - .map(function (prevent) { - return function (previous) { - return prevent; - }; + this._canvasContainer = canvasContainer; + this._domContainer = domContainer; + this._activeSubject$ = new BehaviorSubject_1.BehaviorSubject(false); + this._active$ = this._activeSubject$ + .distinctUntilChanged() + .publishReplay(1) + .refCount(); + Observable_1.Observable.fromEvent(domContainer, "touchmove") + .subscribe(function (event) { + event.preventDefault(); + }); + this._touchStart$ = Observable_1.Observable.fromEvent(canvasContainer, "touchstart"); + this._touchMove$ = Observable_1.Observable.fromEvent(canvasContainer, "touchmove"); + this._touchEnd$ = Observable_1.Observable.fromEvent(canvasContainer, "touchend"); + this._touchCancel$ = Observable_1.Observable.fromEvent(canvasContainer, "touchcancel"); + var tapStart$ = this._touchStart$ + .filter(function (te) { + return te.touches.length === 1 && te.targetTouches.length === 1; }) - .subscribe(this._preventTouchMoveOperation$); - this._touchMove$ - .map(function (te) { - return function (prevent) { - if (prevent) { - te.preventDefault(); - } - return prevent; - }; + .share(); + this._doubleTap$ = tapStart$ + .bufferWhen(function () { + return tapStart$ + .first() + .switchMap(function (event) { + return Observable_1.Observable + .timer(300) + .merge(tapStart$) + .take(1); + }); }) - .subscribe(this._preventTouchMoveOperation$); - this._singleTouchMoveOperation$ = new Subject_1.Subject(); - this._singleTouchMove$ = this._singleTouchMoveOperation$ - .scan(function (touch, operation) { - return operation(touch); - }, new TouchMove()); - this._touchMove$ + .filter(function (events) { + return events.length === 2; + }) + .map(function (events) { + return events[events.length - 1]; + }) + .share(); + this._doubleTap$ + .subscribe(function (event) { + event.preventDefault(); + }); + this._singleTouchMove$ = this._touchMove$ .filter(function (te) { return te.touches.length === 1 && te.targetTouches.length === 1; }) - .map(function (te) { - return function (previous) { - var touch = te.touches[0]; - var current = new TouchMove(touch); - current.movementX = touch.pageX - previous.pageX; - current.movementY = touch.pageY - previous.pageY; - return current; - }; - }) - .subscribe(this._singleTouchMoveOperation$); + .share(); var singleTouchStart$ = Observable_1.Observable .merge(this._touchStart$, this._touchEnd$, this._touchCancel$) .filter(function (te) { @@ -32942,7 +41985,19 @@ var TouchService = (function () { .filter(function (te) { return te.touches.length === 0; }); - this._singleTouch$ = singleTouchStart$ + this._singleTouchDragStart$ = singleTouchStart$ + .mergeMap(function (e) { + return _this._singleTouchMove$ + .takeUntil(Observable_1.Observable.merge(touchStop$, multipleTouchStart$)) + .take(1); + }); + this._singleTouchDragEnd$ = singleTouchStart$ + .mergeMap(function (e) { + return Observable_1.Observable + .merge(touchStop$, multipleTouchStart$) + .first(); + }); + this._singleTouchDrag$ = singleTouchStart$ .switchMap(function (te) { return _this._singleTouchMove$ .skip(1) @@ -32951,11 +42006,11 @@ var TouchService = (function () { }); var touchesChanged$ = Observable_1.Observable .merge(this._touchStart$, this._touchEnd$, this._touchCancel$); - var pinchStart$ = touchesChanged$ + this._pinchStart$ = touchesChanged$ .filter(function (te) { return te.touches.length === 2 && te.targetTouches.length === 2; }); - var pinchStop$ = touchesChanged$ + this._pinchEnd$ = touchesChanged$ .filter(function (te) { return te.touches.length !== 2 || te.targetTouches.length !== 2; }); @@ -32964,18 +42019,19 @@ var TouchService = (function () { .scan(function (pinch, operation) { return operation(pinch); }, { - centerClientX: 0, - centerClientY: 0, - centerPageX: 0, - centerPageY: 0, - centerScreenX: 0, - centerScreenY: 0, changeX: 0, changeY: 0, + clientX: 0, + clientY: 0, distance: 0, distanceChange: 0, distanceX: 0, distanceY: 0, + originalEvent: null, + pageX: 0, + pageY: 0, + screenX: 0, + screenY: 0, touch1: null, touch2: null, }); @@ -33004,18 +42060,19 @@ var TouchService = (function () { var changeX = distanceX - previous.distanceX; var changeY = distanceY - previous.distanceY; var current = { - centerClientX: centerClientX, - centerClientY: centerClientY, - centerPageX: centerPageX, - centerPageY: centerPageY, - centerScreenX: centerScreenX, - centerScreenY: centerScreenY, changeX: changeX, changeY: changeY, + clientX: centerClientX, + clientY: centerClientY, distance: distance, distanceChange: distanceChange, distanceX: distanceX, distanceY: distanceY, + originalEvent: te, + pageX: centerPageX, + pageY: centerPageY, + screenX: centerScreenX, + screenY: centerScreenY, touch1: touch1, touch2: touch2, }; @@ -33023,13 +42080,34 @@ var TouchService = (function () { }; }) .subscribe(this._pinchOperation$); - this._pinchChange$ = pinchStart$ + this._pinchChange$ = this._pinchStart$ .switchMap(function (te) { return _this._pinch$ .skip(1) - .takeUntil(pinchStop$); + .takeUntil(_this._pinchEnd$); }); } + Object.defineProperty(TouchService.prototype, "active$", { + get: function () { + return this._active$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TouchService.prototype, "activate$", { + get: function () { + return this._activeSubject$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TouchService.prototype, "doubleTap$", { + get: function () { + return this._doubleTap$; + }, + enumerable: true, + configurable: true + }); Object.defineProperty(TouchService.prototype, "touchStart$", { get: function () { return this._touchStart$; @@ -33058,9 +42136,23 @@ var TouchService = (function () { enumerable: true, configurable: true }); - Object.defineProperty(TouchService.prototype, "singleTouchMove$", { + Object.defineProperty(TouchService.prototype, "singleTouchDragStart$", { + get: function () { + return this._singleTouchDragStart$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TouchService.prototype, "singleTouchDrag$", { + get: function () { + return this._singleTouchDrag$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TouchService.prototype, "singleTouchDragEnd$", { get: function () { - return this._singleTouch$; + return this._singleTouchDragEnd$; }, enumerable: true, configurable: true @@ -33072,9 +42164,16 @@ var TouchService = (function () { enumerable: true, configurable: true }); - Object.defineProperty(TouchService.prototype, "preventDefaultTouchMove$", { + Object.defineProperty(TouchService.prototype, "pinchStart$", { + get: function () { + return this._pinchStart$; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TouchService.prototype, "pinchEnd$", { get: function () { - return this._preventTouchMove$; + return this._pinchEnd$; }, enumerable: true, configurable: true @@ -33083,15 +42182,22 @@ var TouchService = (function () { }()); exports.TouchService = TouchService; -},{"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/operator/filter":56,"rxjs/add/operator/map":60,"rxjs/add/operator/merge":61,"rxjs/add/operator/scan":68,"rxjs/add/operator/switchMap":73}],320:[function(require,module,exports){ -/// +},{"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":74,"rxjs/add/operator/switchMap":80}],377:[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 __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 when = require("when"); +var Observable_1 = require("rxjs/Observable"); var Viewer_1 = require("../Viewer"); var Utils_1 = require("../Utils"); /** @@ -33101,41 +42207,266 @@ var Utils_1 = require("../Utils"); * Create a Viewer by specifying a container, client ID, photo key and * other options. The viewer exposes methods and events for programmatic * interaction. + * + * The viewer works with a few different coordinate systems. + * + * Container pixel coordinates + * + * Pixel coordinates are coordinates on the viewer container. The origin is + * in the top left corner of the container. The axes are + * directed according to the following for a viewer container with a width + * of 640 pixels and height of 480 pixels. + * + * ``` + * (0,0) (640, 0) + * +------------------------> + * | + * | + * | + * v + + * (0, 480) (640, 480) + * ``` + * + * Basic image coordinates + * + * Basic image coordinates represents points in the original image adjusted for + * orientation. They range from 0 to 1 on both axes. The origin is in the top left + * corner of the image and the axes are directed + * according to the following for all image types. + * + * ``` + * (0,0) (1, 0) + * +------------------------> + * | + * | + * | + * v + + * (0, 1) (1, 1) + * ``` + * + * For every camera viewing direction it is possible to convert between these + * two coordinate systems for the current node. The image can be panned and + * zoomed independently of the size of the viewer container resulting in + * different conversion results for different viewing directions. */ var Viewer = (function (_super) { __extends(Viewer, _super); /** - * Create a new viewer instance. + * Create a new viewer instance. + * + * @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 + * protected resources. + * + * @example + * ``` + * 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); + _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 `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. + * + * @returns {boolean} Boolean indicating whether the viewer is navigable. + */ + get: function () { + return this._componentController.navigable; + }, + enumerable: true, + configurable: true + }); + /** + * Activate a component. + * + * @param {string} name - Name of the component which will become active. + * + * @example + * ``` + * viewer.activateComponent("marker"); + * ``` + */ + Viewer.prototype.activateComponent = function (name) { + this._componentController.activate(name); + }; + /** + * Activate the cover (deactivates all other components). + */ + Viewer.prototype.activateCover = function () { + this._componentController.activateCover(); + }; + /** + * Deactivate a component. + * + * @param {string} name - Name of component which become inactive. + * + * @example + * ``` + * viewer.deactivateComponent("mouse"); + * ``` + */ + Viewer.prototype.deactivateComponent = function (name) { + this._componentController.deactivate(name); + }; + /** + * Deactivate the cover (activates all components marked as active). + */ + Viewer.prototype.deactivateCover = function () { + this._componentController.deactivateCover(); + }; + /** + * Get the bearing of the current viewer camera. + * + * @description The bearing depends on how the camera + * is currently rotated and does not correspond + * to the compass angle of the current node if the view + * has been panned. + * + * Bearing is measured in degrees clockwise with respect to + * north. + * + * @returns {Promise} Promise to the bearing + * of the current viewer camera. + * + * @example + * ``` + * viewer.getBearing().then((b) => { console.log(b); }); + * ``` + */ + Viewer.prototype.getBearing = function () { + var _this = this; + return when.promise(function (resolve, reject) { + _this._container.renderService.bearing$ + .first() + .subscribe(function (bearing) { + resolve(bearing); + }, function (error) { + reject(error); + }); + }); + }; + /** + * Get the basic coordinates of the current photo that is + * at the center of the viewport. * - * @param {string} id - required `id` of an 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. + * @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. + * + * @returns {Promise} Promise to the basic coordinates + * of the current photo at the center for the viewport. + * + * @example + * ``` + * viewer.getCenter().then((c) => { console.log(c); }); + * ``` */ - function Viewer(id, clientId, key, options) { - _super.call(this); - options = options != null ? options : {}; - Utils_1.Settings.setOptions(options); - this._navigator = new Viewer_1.Navigator(clientId); - this._container = new Viewer_1.Container(id, this._navigator.stateService, options); - this._eventLauncher = new Viewer_1.EventLauncher(this, this._navigator, this._container); - this._componentController = new Viewer_1.ComponentController(this._container, this._navigator, key, options.component); - } + Viewer.prototype.getCenter = function () { + var _this = this; + return when.promise(function (resolve, reject) { + _this._navigator.stateService.getCenter() + .subscribe(function (center) { + resolve(center); + }, function (error) { + reject(error); + }); + }); + }; /** - * Navigate to a given photo key. + * Get a component. * - * @param {string} key - A valid Mapillary photo key. + * @param {string} name - Name of component. + * @returns {Component} The requested component. + * + * @example + * ``` + * var mouseComponent = viewer.getComponent("mouse"); + * ``` + */ + Viewer.prototype.getComponent = function (name) { + return this._componentController.get(name); + }; + /** + * Returns the viewer's containing HTML element. + * + * @returns {HTMLElement} The viewer's container. + */ + Viewer.prototype.getContainer = function () { + return this._container.element; + }; + /** + * Get the photo's current zoom level. + * + * @returns {Promise} Promise to the viewers's current + * zoom level. + * + * @example + * ``` + * viewer.getZoom().then((z) => { console.log(z); }); + * ``` + */ + Viewer.prototype.getZoom = function () { + var _this = this; + return when.promise(function (resolve, reject) { + _this._navigator.stateService.getZoom() + .subscribe(function (zoom) { + resolve(zoom); + }, function (error) { + reject(error); + }); + }); + }; + /** + * Move close to given latitude and longitude. + * + * @description Because the method propagates IO errors, these potential errors + * need to be handled by the method caller (see example). + * + * @param {Number} lat - Latitude, in degrees. + * @param {Number} lon - Longitude, in degrees. * @returns {Promise} Promise to the node that was navigated to. + * @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. + * + * @example + * ``` + * viewer.moveCloseTo(0, 0).then( + * (n) => { console.log(n); }, + * (e) => { console.error(e); }); + * ``` */ - Viewer.prototype.moveToKey = function (key) { - var _this = this; + Viewer.prototype.moveCloseTo = function (lat, lon) { + 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.moveToKey$(key).subscribe(function (node) { + moveCloseTo$.subscribe(function (node) { resolve(node); }, function (error) { reject(error); @@ -33152,13 +42483,21 @@ 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. * - * @example `viewer.moveDir(Mapillary.EdgeDirection.Next);` + * @example + * ``` + * viewer.moveDir(Mapillary.EdgeDirection.Next).then( + * (n) => { console.log(n); }, + * (e) => { console.error(e); }); + * ``` */ 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); @@ -33166,167 +42505,365 @@ var Viewer = (function (_super) { }); }; /** - * Move close to given latitude and longitude. + * Navigate to a given photo key. * - * @param {Number} lat - Latitude, in degrees. - * @param {Number} lon - Longitude, in degrees. + * @param {string} key - A valid Mapillary photo key. * @returns {Promise} Promise to the node that was navigated to. - * @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. + * + * @example + * ``` + * viewer.moveToKey("").then( + * (n) => { console.log(n); }, + * (e) => { console.error(e); }); + * ``` */ - Viewer.prototype.moveCloseTo = function (lat, lon) { - var _this = this; + Viewer.prototype.moveToKey = function (key) { + 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.moveCloseTo$(lat, lon).subscribe(function (node) { + moveToKey$.subscribe(function (node) { resolve(node); }, function (error) { reject(error); }); }); }; + /** + * Project basic image coordinates for the current node to canvas pixel + * coordinates. + * + * @description The basic image coordinates may not always correspond to a + * 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 + * to the basic image point. + * + * @example + * ``` + * viewer.projectFromBasic([0.3, 0.7]) + * .then((pixelPoint) => { console.log(pixelPoint); }); + * ``` + */ + Viewer.prototype.projectFromBasic = function (basicPoint) { + var _this = this; + return when.promise(function (resolve, reject) { + _this._observer.projectBasic$(basicPoint) + .subscribe(function (pixelPoint) { + resolve(pixelPoint); + }, function (error) { + reject(error); + }); + }); + }; /** * Detect the viewer's new width and height and resize it. * * @description The components will also detect the viewer's * new size and resize their rendered elements if needed. + * + * @example + * ``` + * viewer.resize(); + * ``` */ Viewer.prototype.resize = function () { this._container.renderService.resize$.next(null); this._componentController.resize(); }; /** - * Set the viewer's render mode. + * Set a bearer token for authenticated API requests of + * protected resources. * - * @param {RenderMode} renderMode - Render mode. + * @description When the supplied token is null or undefined, + * any previously set bearer token will be cleared and the + * viewer will make unauthenticated requests. * - * @example `viewer.setRenderMode(Mapillary.RenderMode.Letterbox);` - */ - Viewer.prototype.setRenderMode = function (renderMode) { - this._container.renderService.renderMode$.next(renderMode); - }; - /** - * Activate a component. + * Calling setAuthToken aborts all outstanding move requests. + * The promises of those move requests will be rejected and + * the rejections need to be caught. * - * @param {string} name - Name of the component which will become active. + * @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("") + * .then(() => { console.log("token set"); }); + * ``` */ - Viewer.prototype.activateComponent = function (name) { - this._componentController.activate(name); + Viewer.prototype.setAuthToken = function (token) { + 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) { + setToken$ + .subscribe(function () { + resolve(undefined); + }, function (error) { + reject(error); + }); + }); }; /** - * Deactivate a component. + * Set the basic coordinates of the current photo to be in the + * center of the viewport. * - * @param {string} name - Name of component which become inactive. + * @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. + * + * @param {number[]} The basic coordinates of the current + * photo to be at the center for the viewport. + * + * @example + * ``` + * viewer.setCenter([0.5, 0.5]); + * ``` */ - Viewer.prototype.deactivateComponent = function (name) { - this._componentController.deactivate(name); + Viewer.prototype.setCenter = function (center) { + this._navigator.stateService.setCenter(center); }; /** - * Get a component. + * Set the filter selecting nodes to use when calculating + * the spatial edges. * - * @param {string} name - Name of component. - * @returns {Component} The requested component. + * @description The following filter types are supported: + * + * Comparison + * + * `["==", key, value]` equality: `node[key] = value` + * + * `["!=", key, value]` inequality: `node[key] ≠ value` + * + * `["<", key, value]` less than: `node[key] < value` + * + * `["<=", key, value]` less than or equal: `node[key] ≤ value` + * + * `[">", key, value]` greater than: `node[key] > value` + * + * `[">=", key, value]` greater than or equal: `node[key] ≥ value` + * + * Set membership + * + * `["in", key, v0, ..., vn]` set inclusion: `node[key] ∈ {v0, ..., vn}` + * + * `["!in", key, v0, ..., vn]` set exclusion: `node[key] ∉ {v0, ..., vn}` + * + * Combining + * + * `["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 + * `f0, ..., fn` of the combining filter must be filter expressions. + * + * Clear the filter by setting it to null or empty array. + * + * @param {FilterExpression} filter - The filter expression. + * @returns {Promise} Promise that resolves after filter is applied. + * + * @example + * ``` + * viewer.setFilter(["==", "sequenceKey", ""]); + * ``` */ - Viewer.prototype.getComponent = function (name) { - return this._componentController.get(name); + Viewer.prototype.setFilter = function (filter) { + var _this = this; + return when.promise(function (resolve, reject) { + _this._navigator.setFilter$(filter) + .subscribe(function () { + resolve(undefined); + }, function (error) { + reject(error); + }); + }); }; /** - * Activate the cover (deactivates all other components). + * Set the viewer's render mode. + * + * @param {RenderMode} renderMode - Render mode. + * + * @example + * ``` + * viewer.setRenderMode(Mapillary.RenderMode.Letterbox); + * ``` */ - Viewer.prototype.activateCover = function () { - this._componentController.activateCover(); + Viewer.prototype.setRenderMode = function (renderMode) { + this._container.renderService.renderMode$.next(renderMode); }; /** - * Deactivate the cover (activates all components marked as active). + * Set the photo'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 + * shows the highest level of detail. + * + * @param {number} The photo's current zoom level. + * + * @example + * ``` + * viewer.setZoom(2); + * ``` */ - Viewer.prototype.deactivateCover = function () { - this._componentController.deactivateCover(); + Viewer.prototype.setZoom = function (zoom) { + this._navigator.stateService.setZoom(zoom); }; /** - * Get the basic coordinates of the current photo that is - * at the center of the viewport. + * Unproject canvas pixel coordinates to an ILatLon representing geographical + * coordinates. * - * @description Basic coordinates are 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. + * @description The pixel point may not always correspond to geographical + * coordinates. In the case of no correspondence the returned value will + * be `null`. * - * @returns {Promise} Promise to the basic coordinates - * of the current photo at the center for the viewport. + * @param {Array} pixelPoint - Pixel coordinates to unproject. + * @returns {Promise} Promise to the latLon corresponding to the pixel point. + * + * @example + * ``` + * viewer.unproject([100, 100]) + * .then((latLon) => { console.log(latLon); }); + * ``` */ - Viewer.prototype.getCenter = function () { + Viewer.prototype.unproject = function (pixelPoint) { var _this = this; return when.promise(function (resolve, reject) { - _this._navigator.stateService.getCenter() - .subscribe(function (center) { - resolve(center); + _this._observer.unproject$(pixelPoint) + .subscribe(function (latLon) { + resolve(latLon); }, function (error) { reject(error); }); }); }; /** - * Get the photo's current zoom level. + * Unproject canvas pixel coordinates to basic image coordinates for the + * current node. * - * @returns {Promise} Promise to the viewers's current - * zoom level. + * @description The pixel point may not always correspond to basic image + * coordinates. In the case of no correspondence the returned value will + * be `null`. + * + * @param {Array} pixelPoint - Pixel coordinates to unproject. + * @returns {Promise} Promise to the basic coordinates corresponding + * to the pixel point. + * + * @example + * ``` + * viewer.unprojectToBasic([100, 100]) + * .then((basicPoint) => { console.log(basicPoint); }); + * ``` */ - Viewer.prototype.getZoom = function () { + Viewer.prototype.unprojectToBasic = function (pixelPoint) { var _this = this; return when.promise(function (resolve, reject) { - _this._navigator.stateService.getZoom() - .subscribe(function (zoom) { - resolve(zoom); + _this._observer.unprojectBasic$(pixelPoint) + .subscribe(function (basicPoint) { + resolve(basicPoint); }, function (error) { reject(error); }); }); }; /** - * Set the basic coordinates of the current photo to be in the - * center of the viewport. - * - * @description Basic coordinates are 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. - * - * @param {number[]} The basic coordinates of the current - * photo to be at the center for the viewport. + * 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.prototype.setCenter = function (center) { - this._navigator.stateService.setCenter(center); - }; + Viewer.bearingchanged = "bearingchanged"; /** - * Set the photo'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 - * shows the highest level of detail. - * - * @param {number} The photo's current zoom level. + * 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.prototype.setZoom = function (zoom) { - this._navigator.stateService.setZoom(zoom); - }; + 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. + * @type {boolean} loading - Boolean indicating whether the viewer is loading. */ Viewer.loadingchanged = "loadingchanged"; /** - * Fired when the viewer starts transitioning from one view to another, - * either by changing the node or by interaction such as pan and zoom. + * Fired when a pointing device (usually a mouse) is pressed within the viewer. * @event + * @type {IViewerMouseEvent} event - Viewer mouse event data. */ - Viewer.movestart = "movestart"; + 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 the viewer finishes transitioning and is in a fixed + * 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 @@ -33349,6 +42886,6 @@ var Viewer = (function (_super) { }(Utils_1.EventEmitter)); exports.Viewer = Viewer; -},{"../Utils":215,"../Viewer":216,"when":204}]},{},[212])(212) +},{"../Utils":240,"../Viewer":241,"rxjs/Observable":29,"when":227}]},{},[235])(235) }); //# sourceMappingURL=mapillary.js.map