"use strict"; var THREE = { REVISION: "71" }; "object" == typeof module && (module.exports = THREE), void 0 === Math.sign && (Math.sign = function(e) { return 0 > e ? -1 : e > 0 ? 1 : +e }), THREE.log = function() { console.log.apply(console, arguments) }, THREE.warn = function() { console.warn.apply(console, arguments) }, THREE.error = function() { console.error.apply(console, arguments) }, THREE.MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }, THREE.CullFaceNone = 0, THREE.CullFaceBack = 1, THREE.CullFaceFront = 2, THREE.CullFaceFrontBack = 3, THREE.FrontFaceDirectionCW = 0, THREE.FrontFaceDirectionCCW = 1, THREE.BasicShadowMap = 0, THREE.PCFShadowMap = 1, THREE.PCFSoftShadowMap = 2, THREE.FrontSide = 0, THREE.BackSide = 1, THREE.DoubleSide = 2, THREE.NoShading = 0, THREE.FlatShading = 1, THREE.SmoothShading = 2, THREE.NoColors = 0, THREE.FaceColors = 1, THREE.VertexColors = 2, THREE.NoBlending = 0, THREE.NormalBlending = 1, THREE.AdditiveBlending = 2, THREE.SubtractiveBlending = 3, THREE.MultiplyBlending = 4, THREE.CustomBlending = 5, THREE.AddEquation = 100, THREE.SubtractEquation = 101, THREE.ReverseSubtractEquation = 102, THREE.MinEquation = 103, THREE.MaxEquation = 104, THREE.ZeroFactor = 200, THREE.OneFactor = 201, THREE.SrcColorFactor = 202, THREE.OneMinusSrcColorFactor = 203, THREE.SrcAlphaFactor = 204, THREE.OneMinusSrcAlphaFactor = 205, THREE.DstAlphaFactor = 206, THREE.OneMinusDstAlphaFactor = 207, THREE.DstColorFactor = 208, THREE.OneMinusDstColorFactor = 209, THREE.SrcAlphaSaturateFactor = 210, THREE.MultiplyOperation = 0, THREE.MixOperation = 1, THREE.AddOperation = 2, THREE.UVMapping = 300, THREE.CubeReflectionMapping = 301, THREE.CubeRefractionMapping = 302, THREE.EquirectangularReflectionMapping = 303, THREE.EquirectangularRefractionMapping = 304, THREE.SphericalReflectionMapping = 305, THREE.RepeatWrapping = 1e3, THREE.ClampToEdgeWrapping = 1001, THREE.MirroredRepeatWrapping = 1002, THREE.NearestFilter = 1003, THREE.NearestMipMapNearestFilter = 1004, THREE.NearestMipMapLinearFilter = 1005, THREE.LinearFilter = 1006, THREE.LinearMipMapNearestFilter = 1007, THREE.LinearMipMapLinearFilter = 1008, THREE.UnsignedByteType = 1009, THREE.ByteType = 1010, THREE.ShortType = 1011, THREE.UnsignedShortType = 1012, THREE.IntType = 1013, THREE.UnsignedIntType = 1014, THREE.FloatType = 1015, THREE.HalfFloatType = 1025, THREE.UnsignedShort4444Type = 1016, THREE.UnsignedShort5551Type = 1017, THREE.UnsignedShort565Type = 1018, THREE.AlphaFormat = 1019, THREE.RGBFormat = 1020, THREE.RGBAFormat = 1021, THREE.LuminanceFormat = 1022, THREE.LuminanceAlphaFormat = 1023, THREE.RGBEFormat = THREE.RGBAFormat, THREE.RGB_S3TC_DXT1_Format = 2001, THREE.RGBA_S3TC_DXT1_Format = 2002, THREE.RGBA_S3TC_DXT3_Format = 2003, THREE.RGBA_S3TC_DXT5_Format = 2004, THREE.RGB_PVRTC_4BPPV1_Format = 2100, THREE.RGB_PVRTC_2BPPV1_Format = 2101, THREE.RGBA_PVRTC_4BPPV1_Format = 2102, THREE.RGBA_PVRTC_2BPPV1_Format = 2103, THREE.Projector = function() { THREE.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js."), this.projectVector = function(e, t) { THREE.warn("THREE.Projector: .projectVector() is now vector.project()."), e.project(t) }, this.unprojectVector = function(e, t) { THREE.warn("THREE.Projector: .unprojectVector() is now vector.unproject()."), e.unproject(t) }, this.pickingRay = function(e, t) { THREE.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().") } }, THREE.CanvasRenderer = function() { THREE.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js"), this.domElement = document.createElement("canvas"), this.clear = function() {}, this.render = function() {}, this.setClearColor = function() {}, this.setSize = function() {} }, THREE.Color = function(e) { return 3 === arguments.length ? this.setRGB(arguments[0], arguments[1], arguments[2]) : this.set(e) }, THREE.Color.prototype = { constructor: THREE.Color, r: 1, g: 1, b: 1, set: function(e) { return e instanceof THREE.Color ? this.copy(e) : "number" == typeof e ? this.setHex(e) : "string" == typeof e && this.setStyle(e), this }, setHex: function(e) { return e = Math.floor(e), this.r = (e >> 16 & 255) / 255, this.g = (e >> 8 & 255) / 255, this.b = (255 & e) / 255, this }, setRGB: function(e, t, r) { return this.r = e, this.g = t, this.b = r, this }, setHSL: function(e, t, r) { if (0 === t) this.r = this.g = this.b = r; else { var i = function(e, t, r) { return 0 > r && (r += 1), r > 1 && (r -= 1), 1 / 6 > r ? e + 6 * (t - e) * r : .5 > r ? t : 2 / 3 > r ? e + 6 * (t - e) * (2 / 3 - r) : e }; t = .5 >= r ? r * (1 + t) : r + t - r * t, r = 2 * r - t, this.r = i(r, t, e + 1 / 3), this.g = i(r, t, e), this.b = i(r, t, e - 1 / 3) } return this }, setStyle: function(e) { return /^rgb\((\d+), ?(\d+), ?(\d+)\)$/i.test(e) ? (e = /^rgb\((\d+), ?(\d+), ?(\d+)\)$/i.exec(e), this.r = Math.min(255, parseInt(e[1], 10)) / 255, this.g = Math.min(255, parseInt(e[2], 10)) / 255, this.b = Math.min(255, parseInt(e[3], 10)) / 255, this) : /^rgb\((\d+)\%, ?(\d+)\%, ?(\d+)\%\)$/i.test(e) ? (e = /^rgb\((\d+)\%, ?(\d+)\%, ?(\d+)\%\)$/i.exec(e), this.r = Math.min(100, parseInt(e[1], 10)) / 100, this.g = Math.min(100, parseInt(e[2], 10)) / 100, this.b = Math.min(100, parseInt(e[3], 10)) / 100, this) : /^\#([0-9a-f]{6})$/i.test(e) ? (e = /^\#([0-9a-f]{6})$/i.exec(e), this.setHex(parseInt(e[1], 16)), this) : /^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.test(e) ? (e = /^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(e), this.setHex(parseInt(e[1] + e[1] + e[2] + e[2] + e[3] + e[3], 16)), this) : /^(\w+)$/i.test(e) ? (this.setHex(THREE.ColorKeywords[e]), this) : void 0 }, copy: function(e) { return this.r = e.r, this.g = e.g, this.b = e.b, this }, copyGammaToLinear: function(e, t) { return void 0 === t && (t = 2), this.r = Math.pow(e.r, t), this.g = Math.pow(e.g, t), this.b = Math.pow(e.b, t), this }, copyLinearToGamma: function(e, t) { void 0 === t && (t = 2); var r = t > 0 ? 1 / t : 1; return this.r = Math.pow(e.r, r), this.g = Math.pow(e.g, r), this.b = Math.pow(e.b, r), this }, convertGammaToLinear: function() { var e = this.r, t = this.g, r = this.b; return this.r = e * e, this.g = t * t, this.b = r * r, this }, convertLinearToGamma: function() { return this.r = Math.sqrt(this.r), this.g = Math.sqrt(this.g), this.b = Math.sqrt(this.b), this }, getHex: function() { return 255 * this.r << 16 ^ 255 * this.g << 8 ^ 255 * this.b << 0 }, getHexString: function() { return ("000000" + this.getHex().toString(16)).slice(-6) }, getHSL: function(e) { e = e || { h: 0, s: 0, l: 0 }; var t, r = this.r, i = this.g, n = this.b, o = Math.max(r, i, n), a = Math.min(r, i, n), s = (a + o) / 2; if (a === o) a = t = 0; else { var h = o - a, a = .5 >= s ? h / (o + a) : h / (2 - o - a); switch (o) { case r: t = (i - n) / h + (n > i ? 6 : 0); break; case i: t = (n - r) / h + 2; break; case n: t = (r - i) / h + 4 } t /= 6 } return e.h = t, e.s = a, e.l = s, e }, getStyle: function() { return "rgb(" + (255 * this.r | 0) + "," + (255 * this.g | 0) + "," + (255 * this.b | 0) + ")" }, offsetHSL: function(e, t, r) { var i = this.getHSL(); return i.h += e, i.s += t, i.l += r, this.setHSL(i.h, i.s, i.l), this }, add: function(e) { return this.r += e.r, this.g += e.g, this.b += e.b, this }, addColors: function(e, t) { return this.r = e.r + t.r, this.g = e.g + t.g, this.b = e.b + t.b, this }, addScalar: function(e) { return this.r += e, this.g += e, this.b += e, this }, multiply: function(e) { return this.r *= e.r, this.g *= e.g, this.b *= e.b, this }, multiplyScalar: function(e) { return this.r *= e, this.g *= e, this.b *= e, this }, lerp: function(e, t) { return this.r += (e.r - this.r) * t, this.g += (e.g - this.g) * t, this.b += (e.b - this.b) * t, this }, equals: function(e) { return e.r === this.r && e.g === this.g && e.b === this.b }, fromArray: function(e) { return this.r = e[0], this.g = e[1], this.b = e[2], this }, toArray: function(e, t) { return void 0 === e && (e = []), void 0 === t && (t = 0), e[t] = this.r, e[t + 1] = this.g, e[t + 2] = this.b, e }, clone: function() { return (new THREE.Color).setRGB(this.r, this.g, this.b) } }, THREE.ColorKeywords = { 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 }, THREE.Quaternion = function(e, t, r, i) { this._x = e || 0, this._y = t || 0, this._z = r || 0, this._w = void 0 !== i ? i : 1 }, THREE.Quaternion.prototype = { constructor: THREE.Quaternion, _x: 0, _y: 0, _z: 0, _w: 0, get x() { return this._x }, set x(e) { this._x = e, this.onChangeCallback() }, get y() { return this._y }, set y(e) { this._y = e, this.onChangeCallback() }, get z() { return this._z }, set z(e) { this._z = e, this.onChangeCallback() }, get w() { return this._w }, set w(e) { this._w = e, this.onChangeCallback() }, set: function(e, t, r, i) { return this._x = e, this._y = t, this._z = r, this._w = i, this.onChangeCallback(), this }, copy: function(e) { return this._x = e.x, this._y = e.y, this._z = e.z, this._w = e.w, this.onChangeCallback(), this }, setFromEuler: function(e, t) { if (!1 == e instanceof THREE.Euler) throw Error("THREE.Quaternion: .setFromEuler() now expects a Euler rotation rather than a Vector3 and order."); var r = Math.cos(e._x / 2), i = Math.cos(e._y / 2), n = Math.cos(e._z / 2), o = Math.sin(e._x / 2), a = Math.sin(e._y / 2), s = Math.sin(e._z / 2); return "XYZ" === e.order ? (this._x = o * i * n + r * a * s, this._y = r * a * n - o * i * s, this._z = r * i * s + o * a * n, this._w = r * i * n - o * a * s) : "YXZ" === e.order ? (this._x = o * i * n + r * a * s, this._y = r * a * n - o * i * s, this._z = r * i * s - o * a * n, this._w = r * i * n + o * a * s) : "ZXY" === e.order ? (this._x = o * i * n - r * a * s, this._y = r * a * n + o * i * s, this._z = r * i * s + o * a * n, this._w = r * i * n - o * a * s) : "ZYX" === e.order ? (this._x = o * i * n - r * a * s, this._y = r * a * n + o * i * s, this._z = r * i * s - o * a * n, this._w = r * i * n + o * a * s) : "YZX" === e.order ? (this._x = o * i * n + r * a * s, this._y = r * a * n + o * i * s, this._z = r * i * s - o * a * n, this._w = r * i * n - o * a * s) : "XZY" === e.order && (this._x = o * i * n - r * a * s, this._y = r * a * n - o * i * s, this._z = r * i * s + o * a * n, this._w = r * i * n + o * a * s), !1 !== t && this.onChangeCallback(), this }, setFromAxisAngle: function(e, t) { var r = t / 2, i = Math.sin(r); return this._x = e.x * i, this._y = e.y * i, this._z = e.z * i, this._w = Math.cos(r), this.onChangeCallback(), this }, setFromRotationMatrix: function(e) { var t = e.elements, r = t[0]; e = t[4]; var i = t[8], n = t[1], o = t[5], a = t[9], s = t[2], h = t[6], t = t[10], l = r + o + t; return l > 0 ? (r = .5 / Math.sqrt(l + 1), this._w = .25 / r, this._x = (h - a) * r, this._y = (i - s) * r, this._z = (n - e) * r) : r > o && r > t ? (r = 2 * Math.sqrt(1 + r - o - t), this._w = (h - a) / r, this._x = .25 * r, this._y = (e + n) / r, this._z = (i + s) / r) : o > t ? (r = 2 * Math.sqrt(1 + o - r - t), this._w = (i - s) / r, this._x = (e + n) / r, this._y = .25 * r, this._z = (a + h) / r) : (r = 2 * Math.sqrt(1 + t - r - o), this._w = (n - e) / r, this._x = (i + s) / r, this._y = (a + h) / r, this._z = .25 * r), this.onChangeCallback(), this }, setFromUnitVectors: function() { var e, t; return function(r, i) { return void 0 === e && (e = new THREE.Vector3), t = r.dot(i) + 1, 1e-6 > t ? (t = 0, Math.abs(r.x) > Math.abs(r.z) ? e.set(-r.y, r.x, 0) : e.set(0, -r.z, r.y)) : e.crossVectors(r, i), this._x = e.x, this._y = e.y, this._z = e.z, this._w = t, this.normalize(), this } }(), inverse: function() { return this.conjugate().normalize(), this }, conjugate: function() { return this._x *= -1, this._y *= -1, this._z *= -1, this.onChangeCallback(), this }, dot: function(e) { return this._x * e._x + this._y * e._y + this._z * e._z + this._w * e._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 e = this.length(); return 0 === e ? (this._z = this._y = this._x = 0, this._w = 1) : (e = 1 / e, this._x *= e, this._y *= e, this._z *= e, this._w *= e), this.onChangeCallback(), this }, multiply: function(e, t) { return void 0 !== t ? (THREE.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."), this.multiplyQuaternions(e, t)) : this.multiplyQuaternions(this, e) }, multiplyQuaternions: function(e, t) { var r = e._x, i = e._y, n = e._z, o = e._w, a = t._x, s = t._y, h = t._z, l = t._w; return this._x = r * l + o * a + i * h - n * s, this._y = i * l + o * s + n * a - r * h, this._z = n * l + o * h + r * s - i * a, this._w = o * l - r * a - i * s - n * h, this.onChangeCallback(), this }, multiplyVector3: function(e) { return THREE.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."), e.applyQuaternion(this) }, slerp: function(e, t) { if (0 === t) return this; if (1 === t) return this.copy(e); var r = this._x, i = this._y, n = this._z, o = this._w, a = o * e._w + r * e._x + i * e._y + n * e._z; if (0 > a ? (this._w = -e._w, this._x = -e._x, this._y = -e._y, this._z = -e._z, a = -a) : this.copy(e), a >= 1) return this._w = o, this._x = r, this._y = i, this._z = n, this; var s = Math.acos(a), h = Math.sqrt(1 - a * a); return .001 > Math.abs(h) ? (this._w = .5 * (o + this._w), this._x = .5 * (r + this._x), this._y = .5 * (i + this._y), this._z = .5 * (n + this._z), this) : (a = Math.sin((1 - t) * s) / h, s = Math.sin(t * s) / h, this._w = o * a + this._w * s, this._x = r * a + this._x * s, this._y = i * a + this._y * s, this._z = n * a + this._z * s, this.onChangeCallback(), this) }, equals: function(e) { return e._x === this._x && e._y === this._y && e._z === this._z && e._w === this._w }, fromArray: function(e, t) { return void 0 === t && (t = 0), this._x = e[t], this._y = e[t + 1], this._z = e[t + 2], this._w = e[t + 3], this.onChangeCallback(), this }, toArray: function(e, t) { return void 0 === e && (e = []), void 0 === t && (t = 0), e[t] = this._x, e[t + 1] = this._y, e[t + 2] = this._z, e[t + 3] = this._w, e }, onChange: function(e) { return this.onChangeCallback = e, this }, onChangeCallback: function() {}, clone: function() { return new THREE.Quaternion(this._x, this._y, this._z, this._w) } }, THREE.Quaternion.slerp = function(e, t, r, i) { return r.copy(e).slerp(t, i) }, THREE.Vector2 = function(e, t) { this.x = e || 0, this.y = t || 0 }, THREE.Vector2.prototype = { constructor: THREE.Vector2, set: function(e, t) { return this.x = e, this.y = t, this }, setX: function(e) { return this.x = e, this }, setY: function(e) { return this.y = e, this }, setComponent: function(e, t) { switch (e) { case 0: this.x = t; break; case 1: this.y = t; break; default: throw Error("index is out of range: " + e) } }, getComponent: function(e) { switch (e) { case 0: return this.x; case 1: return this.y; default: throw Error("index is out of range: " + e) } }, copy: function(e) { return this.x = e.x, this.y = e.y, this }, add: function(e, t) { return void 0 !== t ? (THREE.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."), this.addVectors(e, t)) : (this.x += e.x, this.y += e.y, this) }, addScalar: function(e) { return this.x += e, this.y += e, this }, addVectors: function(e, t) { return this.x = e.x + t.x, this.y = e.y + t.y, this }, sub: function(e, t) { return void 0 !== t ? (THREE.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), this.subVectors(e, t)) : (this.x -= e.x, this.y -= e.y, this) }, subScalar: function(e) { return this.x -= e, this.y -= e, this }, subVectors: function(e, t) { return this.x = e.x - t.x, this.y = e.y - t.y, this }, multiply: function(e) { return this.x *= e.x, this.y *= e.y, this }, multiplyScalar: function(e) { return this.x *= e, this.y *= e, this }, divide: function(e) { return this.x /= e.x, this.y /= e.y, this }, divideScalar: function(e) { return 0 !== e ? (e = 1 / e, this.x *= e, this.y *= e) : this.y = this.x = 0, this }, min: function(e) { return this.x > e.x && (this.x = e.x), this.y > e.y && (this.y = e.y), this }, max: function(e) { return this.x < e.x && (this.x = e.x), this.y < e.y && (this.y = e.y), this }, clamp: function(e, t) { return this.x < e.x ? this.x = e.x : this.x > t.x && (this.x = t.x), this.y < e.y ? this.y = e.y : this.y > t.y && (this.y = t.y), this }, clampScalar: function() { var e, t; return function(r, i) { return void 0 === e && (e = new THREE.Vector2, t = new THREE.Vector2), e.set(r, r), t.set(i, i), this.clamp(e, t) } }(), floor: function() { return this.x = Math.floor(this.x), this.y = Math.floor(this.y), this }, ceil: function() { return this.x = Math.ceil(this.x), this.y = Math.ceil(this.y), this }, round: function() { return this.x = Math.round(this.x), this.y = Math.round(this.y), this }, roundToZero: function() { return 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 }, negate: function() { return this.x = -this.x, this.y = -this.y, this }, dot: function(e) { return this.x * e.x + this.y * e.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) }, normalize: function() { return this.divideScalar(this.length()) }, distanceTo: function(e) { return Math.sqrt(this.distanceToSquared(e)) }, distanceToSquared: function(e) { var t = this.x - e.x; return e = this.y - e.y, t * t + e * e }, setLength: function(e) { var t = this.length(); return 0 !== t && e !== t && this.multiplyScalar(e / t), this }, lerp: function(e, t) { return this.x += (e.x - this.x) * t, this.y += (e.y - this.y) * t, this }, lerpVectors: function(e, t, r) { return this.subVectors(t, e).multiplyScalar(r).add(e), this }, equals: function(e) { return e.x === this.x && e.y === this.y }, fromArray: function(e, t) { return void 0 === t && (t = 0), this.x = e[t], this.y = e[t + 1], this }, toArray: function(e, t) { return void 0 === e && (e = []), void 0 === t && (t = 0), e[t] = this.x, e[t + 1] = this.y, e }, fromAttribute: function(e, t, r) { return void 0 === r && (r = 0), t = t * e.itemSize + r, this.x = e.array[t], this.y = e.array[t + 1], this }, clone: function() { return new THREE.Vector2(this.x, this.y) } }, THREE.Vector3 = function(e, t, r) { this.x = e || 0, this.y = t || 0, this.z = r || 0 }, THREE.Vector3.prototype = { constructor: THREE.Vector3, set: function(e, t, r) { return this.x = e, this.y = t, this.z = r, this }, setX: function(e) { return this.x = e, this }, setY: function(e) { return this.y = e, this }, setZ: function(e) { return this.z = e, this }, setComponent: function(e, t) { switch (e) { case 0: this.x = t; break; case 1: this.y = t; break; case 2: this.z = t; break; default: throw Error("index is out of range: " + e) } }, getComponent: function(e) { switch (e) { case 0: return this.x; case 1: return this.y; case 2: return this.z; default: throw Error("index is out of range: " + e) } }, copy: function(e) { return this.x = e.x, this.y = e.y, this.z = e.z, this }, add: function(e, t) { return void 0 !== t ? (THREE.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."), this.addVectors(e, t)) : (this.x += e.x, this.y += e.y, this.z += e.z, this) }, addScalar: function(e) { return this.x += e, this.y += e, this.z += e, this }, addVectors: function(e, t) { return this.x = e.x + t.x, this.y = e.y + t.y, this.z = e.z + t.z, this }, sub: function(e, t) { return void 0 !== t ? (THREE.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), this.subVectors(e, t)) : (this.x -= e.x, this.y -= e.y, this.z -= e.z, this) }, subScalar: function(e) { return this.x -= e, this.y -= e, this.z -= e, this }, subVectors: function(e, t) { return this.x = e.x - t.x, this.y = e.y - t.y, this.z = e.z - t.z, this }, multiply: function(e, t) { return void 0 !== t ? (THREE.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."), this.multiplyVectors(e, t)) : (this.x *= e.x, this.y *= e.y, this.z *= e.z, this) }, multiplyScalar: function(e) { return this.x *= e, this.y *= e, this.z *= e, this }, multiplyVectors: function(e, t) { return this.x = e.x * t.x, this.y = e.y * t.y, this.z = e.z * t.z, this }, applyEuler: function() { var e; return function(t) { return !1 == t instanceof THREE.Euler && THREE.error("THREE.Vector3: .applyEuler() now expects a Euler rotation rather than a Vector3 and order."), void 0 === e && (e = new THREE.Quaternion), this.applyQuaternion(e.setFromEuler(t)), this } }(), applyAxisAngle: function() { var e; return function(t, r) { return void 0 === e && (e = new THREE.Quaternion), this.applyQuaternion(e.setFromAxisAngle(t, r)), this } }(), applyMatrix3: function(e) { var t = this.x, r = this.y, i = this.z; return e = e.elements, this.x = e[0] * t + e[3] * r + e[6] * i, this.y = e[1] * t + e[4] * r + e[7] * i, this.z = e[2] * t + e[5] * r + e[8] * i, this }, applyMatrix4: function(e) { var t = this.x, r = this.y, i = this.z; return e = e.elements, this.x = e[0] * t + e[4] * r + e[8] * i + e[12], this.y = e[1] * t + e[5] * r + e[9] * i + e[13], this.z = e[2] * t + e[6] * r + e[10] * i + e[14], this }, applyProjection: function(e) { var t = this.x, r = this.y, i = this.z; e = e.elements; var n = 1 / (e[3] * t + e[7] * r + e[11] * i + e[15]); return this.x = (e[0] * t + e[4] * r + e[8] * i + e[12]) * n, this.y = (e[1] * t + e[5] * r + e[9] * i + e[13]) * n, this.z = (e[2] * t + e[6] * r + e[10] * i + e[14]) * n, this }, applyQuaternion: function(e) { var t = this.x, r = this.y, i = this.z, n = e.x, o = e.y, a = e.z; e = e.w; var s = e * t + o * i - a * r, h = e * r + a * t - n * i, l = e * i + n * r - o * t, t = -n * t - o * r - a * i; return this.x = s * e + t * -n + h * -a - l * -o, this.y = h * e + t * -o + l * -n - s * -a, this.z = l * e + t * -a + s * -o - h * -n, this }, project: function() { var e; return function(t) { return void 0 === e && (e = new THREE.Matrix4), e.multiplyMatrices(t.projectionMatrix, e.getInverse(t.matrixWorld)), this.applyProjection(e) } }(), unproject: function() { var e; return function(t) { return void 0 === e && (e = new THREE.Matrix4), e.multiplyMatrices(t.matrixWorld, e.getInverse(t.projectionMatrix)), this.applyProjection(e) } }(), transformDirection: function(e) { var t = this.x, r = this.y, i = this.z; return e = e.elements, this.x = e[0] * t + e[4] * r + e[8] * i, this.y = e[1] * t + e[5] * r + e[9] * i, this.z = e[2] * t + e[6] * r + e[10] * i, this.normalize(), this }, divide: function(e) { return this.x /= e.x, this.y /= e.y, this.z /= e.z, this }, divideScalar: function(e) { return 0 !== e ? (e = 1 / e, this.x *= e, this.y *= e, this.z *= e) : this.z = this.y = this.x = 0, this }, min: function(e) { return this.x > e.x && (this.x = e.x), this.y > e.y && (this.y = e.y), this.z > e.z && (this.z = e.z), this }, max: function(e) { return this.x < e.x && (this.x = e.x), this.y < e.y && (this.y = e.y), this.z < e.z && (this.z = e.z), this }, clamp: function(e, t) { return this.x < e.x ? this.x = e.x : this.x > t.x && (this.x = t.x), this.y < e.y ? this.y = e.y : this.y > t.y && (this.y = t.y), this.z < e.z ? this.z = e.z : this.z > t.z && (this.z = t.z), this }, clampScalar: function() { var e, t; return function(r, i) { return void 0 === e && (e = new THREE.Vector3, t = new THREE.Vector3), e.set(r, r, r), t.set(i, i, i), this.clamp(e, t) } }(), floor: function() { return this.x = Math.floor(this.x), this.y = Math.floor(this.y), this.z = Math.floor(this.z), this }, ceil: function() { return this.x = Math.ceil(this.x), this.y = Math.ceil(this.y), this.z = Math.ceil(this.z), this }, round: function() { return this.x = Math.round(this.x), this.y = Math.round(this.y), this.z = Math.round(this.z), this }, roundToZero: function() { return 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 }, negate: function() { return this.x = -this.x, this.y = -this.y, this.z = -this.z, this }, dot: function(e) { return this.x * e.x + this.y * e.y + this.z * e.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(e) { var t = this.length(); return 0 !== t && e !== t && this.multiplyScalar(e / t), this }, lerp: function(e, t) { return this.x += (e.x - this.x) * t, this.y += (e.y - this.y) * t, this.z += (e.z - this.z) * t, this }, lerpVectors: function(e, t, r) { return this.subVectors(t, e).multiplyScalar(r).add(e), this }, cross: function(e, t) { if (void 0 !== t) return THREE.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."), this.crossVectors(e, t); var r = this.x, i = this.y, n = this.z; return this.x = i * e.z - n * e.y, this.y = n * e.x - r * e.z, this.z = r * e.y - i * e.x, this }, crossVectors: function(e, t) { var r = e.x, i = e.y, n = e.z, o = t.x, a = t.y, s = t.z; return this.x = i * s - n * a, this.y = n * o - r * s, this.z = r * a - i * o, this }, projectOnVector: function() { var e, t; return function(r) { return void 0 === e && (e = new THREE.Vector3), e.copy(r).normalize(), t = this.dot(e), this.copy(e).multiplyScalar(t) } }(), projectOnPlane: function() { var e; return function(t) { return void 0 === e && (e = new THREE.Vector3), e.copy(this).projectOnVector(t), this.sub(e) } }(), reflect: function() { var e; return function(t) { return void 0 === e && (e = new THREE.Vector3), this.sub(e.copy(t).multiplyScalar(2 * this.dot(t))) } }(), angleTo: function(e) { return e = this.dot(e) / (this.length() * e.length()), Math.acos(THREE.Math.clamp(e, -1, 1)) }, distanceTo: function(e) { return Math.sqrt(this.distanceToSquared(e)) }, distanceToSquared: function(e) { var t = this.x - e.x, r = this.y - e.y; return e = this.z - e.z, t * t + r * r + e * e }, setEulerFromRotationMatrix: function(e, t) { THREE.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.") }, setEulerFromQuaternion: function(e, t) { THREE.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.") }, getPositionFromMatrix: function(e) { return THREE.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."), this.setFromMatrixPosition(e) }, getScaleFromMatrix: function(e) { return THREE.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."), this.setFromMatrixScale(e) }, getColumnFromMatrix: function(e, t) { return THREE.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."), this.setFromMatrixColumn(e, t) }, setFromMatrixPosition: function(e) { return this.x = e.elements[12], this.y = e.elements[13], this.z = e.elements[14], this }, setFromMatrixScale: function(e) { var t = this.set(e.elements[0], e.elements[1], e.elements[2]).length(), r = this.set(e.elements[4], e.elements[5], e.elements[6]).length(); return e = this.set(e.elements[8], e.elements[9], e.elements[10]).length(), this.x = t, this.y = r, this.z = e, this }, setFromMatrixColumn: function(e, t) { var r = 4 * e, i = t.elements; return this.x = i[r], this.y = i[r + 1], this.z = i[r + 2], this }, equals: function(e) { return e.x === this.x && e.y === this.y && e.z === this.z }, fromArray: function(e, t) { return void 0 === t && (t = 0), this.x = e[t], this.y = e[t + 1], this.z = e[t + 2], this }, toArray: function(e, t) { return void 0 === e && (e = []), void 0 === t && (t = 0), e[t] = this.x, e[t + 1] = this.y, e[t + 2] = this.z, e }, fromAttribute: function(e, t, r) { return void 0 === r && (r = 0), t = t * e.itemSize + r, this.x = e.array[t], this.y = e.array[t + 1], this.z = e.array[t + 2], this }, clone: function() { return new THREE.Vector3(this.x, this.y, this.z) } }, THREE.Vector4 = function(e, t, r, i) { this.x = e || 0, this.y = t || 0, this.z = r || 0, this.w = void 0 !== i ? i : 1 }, THREE.Vector4.prototype = { constructor: THREE.Vector4, set: function(e, t, r, i) { return this.x = e, this.y = t, this.z = r, this.w = i, this }, setX: function(e) { return this.x = e, this }, setY: function(e) { return this.y = e, this }, setZ: function(e) { return this.z = e, this }, setW: function(e) { return this.w = e, this }, setComponent: function(e, t) { switch (e) { case 0: this.x = t; break; case 1: this.y = t; break; case 2: this.z = t; break; case 3: this.w = t; break; default: throw Error("index is out of range: " + e) } }, getComponent: function(e) { switch (e) { 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: " + e) } }, copy: function(e) { return this.x = e.x, this.y = e.y, this.z = e.z, this.w = void 0 !== e.w ? e.w : 1, this }, add: function(e, t) { return void 0 !== t ? (THREE.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."), this.addVectors(e, t)) : (this.x += e.x, this.y += e.y, this.z += e.z, this.w += e.w, this) }, addScalar: function(e) { return this.x += e, this.y += e, this.z += e, this.w += e, this }, addVectors: function(e, t) { return this.x = e.x + t.x, this.y = e.y + t.y, this.z = e.z + t.z, this.w = e.w + t.w, this }, sub: function(e, t) { return void 0 !== t ? (THREE.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), this.subVectors(e, t)) : (this.x -= e.x, this.y -= e.y, this.z -= e.z, this.w -= e.w, this) }, subScalar: function(e) { return this.x -= e, this.y -= e, this.z -= e, this.w -= e, this }, subVectors: function(e, t) { return this.x = e.x - t.x, this.y = e.y - t.y, this.z = e.z - t.z, this.w = e.w - t.w, this }, multiplyScalar: function(e) { return this.x *= e, this.y *= e, this.z *= e, this.w *= e, this }, applyMatrix4: function(e) { var t = this.x, r = this.y, i = this.z, n = this.w; return e = e.elements, this.x = e[0] * t + e[4] * r + e[8] * i + e[12] * n, this.y = e[1] * t + e[5] * r + e[9] * i + e[13] * n, this.z = e[2] * t + e[6] * r + e[10] * i + e[14] * n, this.w = e[3] * t + e[7] * r + e[11] * i + e[15] * n, this }, divideScalar: function(e) { return 0 !== e ? (e = 1 / e, this.x *= e, this.y *= e, this.z *= e, this.w *= e) : (this.z = this.y = this.x = 0, this.w = 1), this }, setAxisAngleFromQuaternion: function(e) { this.w = 2 * Math.acos(e.w); var t = Math.sqrt(1 - e.w * e.w); return 1e-4 > t ? (this.x = 1, this.z = this.y = 0) : (this.x = e.x / t, this.y = e.y / t, this.z = e.z / t), this }, setAxisAngleFromRotationMatrix: function(e) { var t, r, i; e = e.elements; var n = e[0]; i = e[4]; var o = e[8], a = e[1], s = e[5], h = e[9]; r = e[2], t = e[6]; var l = e[10]; return .01 > Math.abs(i - a) && .01 > Math.abs(o - r) && .01 > Math.abs(h - t) ? .1 > Math.abs(i + a) && .1 > Math.abs(o + r) && .1 > Math.abs(h + t) && .1 > Math.abs(n + s + l - 3) ? (this.set(1, 0, 0, 0), this) : (e = Math.PI, n = (n + 1) / 2, s = (s + 1) / 2, l = (l + 1) / 2, i = (i + a) / 4, o = (o + r) / 4, h = (h + t) / 4, n > s && n > l ? .01 > n ? (t = 0, i = r = .707106781) : (t = Math.sqrt(n), r = i / t, i = o / t) : s > l ? .01 > s ? (t = .707106781, r = 0, i = .707106781) : (r = Math.sqrt(s), t = i / r, i = h / r) : .01 > l ? (r = t = .707106781, i = 0) : (i = Math.sqrt(l), t = o / i, r = h / i), this.set(t, r, i, e), this) : (e = Math.sqrt((t - h) * (t - h) + (o - r) * (o - r) + (a - i) * (a - i)), .001 > Math.abs(e) && (e = 1), this.x = (t - h) / e, this.y = (o - r) / e, this.z = (a - i) / e, this.w = Math.acos((n + s + l - 1) / 2), this) }, min: function(e) { return this.x > e.x && (this.x = e.x), this.y > e.y && (this.y = e.y), this.z > e.z && (this.z = e.z), this.w > e.w && (this.w = e.w), this }, max: function(e) { return this.x < e.x && (this.x = e.x), this.y < e.y && (this.y = e.y), this.z < e.z && (this.z = e.z), this.w < e.w && (this.w = e.w), this }, clamp: function(e, t) { return this.x < e.x ? this.x = e.x : this.x > t.x && (this.x = t.x), this.y < e.y ? this.y = e.y : this.y > t.y && (this.y = t.y), this.z < e.z ? this.z = e.z : this.z > t.z && (this.z = t.z), this.w < e.w ? this.w = e.w : this.w > t.w && (this.w = t.w), this }, clampScalar: function() { var e, t; return function(r, i) { return void 0 === e && (e = new THREE.Vector4, t = new THREE.Vector4), e.set(r, r, r, r), t.set(i, i, i, i), this.clamp(e, t) } }(), floor: function() { return this.x = Math.floor(this.x), this.y = Math.floor(this.y), this.z = Math.floor(this.z), this.w = Math.floor(this.w), this }, ceil: function() { return this.x = Math.ceil(this.x), this.y = Math.ceil(this.y), this.z = Math.ceil(this.z), this.w = Math.ceil(this.w), this }, round: function() { return this.x = Math.round(this.x), this.y = Math.round(this.y), this.z = Math.round(this.z), this.w = Math.round(this.w), this }, roundToZero: function() { return 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), this }, negate: function() { return this.x = -this.x, this.y = -this.y, this.z = -this.z, this.w = -this.w, this }, dot: function(e) { return this.x * e.x + this.y * e.y + this.z * e.z + this.w * e.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(e) { var t = this.length(); return 0 !== t && e !== t && this.multiplyScalar(e / t), this }, lerp: function(e, t) { return this.x += (e.x - this.x) * t, this.y += (e.y - this.y) * t, this.z += (e.z - this.z) * t, this.w += (e.w - this.w) * t, this }, lerpVectors: function(e, t, r) { return this.subVectors(t, e).multiplyScalar(r).add(e), this }, equals: function(e) { return e.x === this.x && e.y === this.y && e.z === this.z && e.w === this.w }, fromArray: function(e, t) { return void 0 === t && (t = 0), this.x = e[t], this.y = e[t + 1], this.z = e[t + 2], this.w = e[t + 3], this }, toArray: function(e, t) { return void 0 === e && (e = []), void 0 === t && (t = 0), e[t] = this.x, e[t + 1] = this.y, e[t + 2] = this.z, e[t + 3] = this.w, e }, fromAttribute: function(e, t, r) { return void 0 === r && (r = 0), t = t * e.itemSize + r, this.x = e.array[t], this.y = e.array[t + 1], this.z = e.array[t + 2], this.w = e.array[t + 3], this }, clone: function() { return new THREE.Vector4(this.x, this.y, this.z, this.w) } }, THREE.Euler = function(e, t, r, i) { this._x = e || 0, this._y = t || 0, this._z = r || 0, this._order = i || THREE.Euler.DefaultOrder }, THREE.Euler.RotationOrders = "XYZ YZX ZXY XZY YXZ ZYX".split(" "), THREE.Euler.DefaultOrder = "XYZ", THREE.Euler.prototype = { constructor: THREE.Euler, _x: 0, _y: 0, _z: 0, _order: THREE.Euler.DefaultOrder, get x() { return this._x }, set x(e) { this._x = e, this.onChangeCallback() }, get y() { return this._y }, set y(e) { this._y = e, this.onChangeCallback() }, get z() { return this._z }, set z(e) { this._z = e, this.onChangeCallback() }, get order() { return this._order }, set order(e) { this._order = e, this.onChangeCallback() }, set: function(e, t, r, i) { return this._x = e, this._y = t, this._z = r, this._order = i || this._order, this.onChangeCallback(), this }, copy: function(e) { return this._x = e._x, this._y = e._y, this._z = e._z, this._order = e._order, this.onChangeCallback(), this }, setFromRotationMatrix: function(e, t, r) { var i = THREE.Math.clamp, n = e.elements; e = n[0]; var o = n[4], a = n[8], s = n[1], h = n[5], l = n[9], c = n[2], u = n[6], n = n[10]; return t = t || this._order, "XYZ" === t ? (this._y = Math.asin(i(a, -1, 1)), .99999 > Math.abs(a) ? (this._x = Math.atan2(-l, n), this._z = Math.atan2(-o, e)) : (this._x = Math.atan2(u, h), this._z = 0)) : "YXZ" === t ? (this._x = Math.asin(-i(l, -1, 1)), .99999 > Math.abs(l) ? (this._y = Math.atan2(a, n), this._z = Math.atan2(s, h)) : (this._y = Math.atan2(-c, e), this._z = 0)) : "ZXY" === t ? (this._x = Math.asin(i(u, -1, 1)), .99999 > Math.abs(u) ? (this._y = Math.atan2(-c, n), this._z = Math.atan2(-o, h)) : (this._y = 0, this._z = Math.atan2(s, e))) : "ZYX" === t ? (this._y = Math.asin(-i(c, -1, 1)), .99999 > Math.abs(c) ? (this._x = Math.atan2(u, n), this._z = Math.atan2(s, e)) : (this._x = 0, this._z = Math.atan2(-o, h))) : "YZX" === t ? (this._z = Math.asin(i(s, -1, 1)), .99999 > Math.abs(s) ? (this._x = Math.atan2(-l, h), this._y = Math.atan2(-c, e)) : (this._x = 0, this._y = Math.atan2(a, n))) : "XZY" === t ? (this._z = Math.asin(-i(o, -1, 1)), .99999 > Math.abs(o) ? (this._x = Math.atan2(u, h), this._y = Math.atan2(a, e)) : (this._x = Math.atan2(-l, n), this._y = 0)) : THREE.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: " + t), this._order = t, !1 !== r && this.onChangeCallback(), this }, setFromQuaternion: function() { var e; return function(t, r, i) { return void 0 === e && (e = new THREE.Matrix4), e.makeRotationFromQuaternion(t), this.setFromRotationMatrix(e, r, i), this } }(), setFromVector3: function(e, t) { return this.set(e.x, e.y, e.z, t || this._order) }, reorder: function() { var e = new THREE.Quaternion; return function(t) { e.setFromEuler(this), this.setFromQuaternion(e, t) } }(), equals: function(e) { return e._x === this._x && e._y === this._y && e._z === this._z && e._order === this._order }, fromArray: function(e) { return this._x = e[0], this._y = e[1], this._z = e[2], void 0 !== e[3] && (this._order = e[3]), this.onChangeCallback(), this }, toArray: function(e, t) { return void 0 === e && (e = []), void 0 === t && (t = 0), e[t] = this._x, e[t + 1] = this._y, e[t + 2] = this._z, e[t + 3] = this._order, e }, toVector3: function(e) { return e ? e.set(this._x, this._y, this._z) : new THREE.Vector3(this._x, this._y, this._z) }, onChange: function(e) { return this.onChangeCallback = e, this }, onChangeCallback: function() {}, clone: function() { return new THREE.Euler(this._x, this._y, this._z, this._order) } }, THREE.Line3 = function(e, t) { this.start = void 0 !== e ? e : new THREE.Vector3, this.end = void 0 !== t ? t : new THREE.Vector3 }, THREE.Line3.prototype = { constructor: THREE.Line3, set: function(e, t) { return this.start.copy(e), this.end.copy(t), this }, copy: function(e) { return this.start.copy(e.start), this.end.copy(e.end), this }, center: function(e) { return (e || new THREE.Vector3).addVectors(this.start, this.end).multiplyScalar(.5) }, delta: function(e) { return (e || new THREE.Vector3).subVectors(this.end, this.start) }, distanceSq: function() { return this.start.distanceToSquared(this.end) }, distance: function() { return this.start.distanceTo(this.end) }, at: function(e, t) { var r = t || new THREE.Vector3; return this.delta(r).multiplyScalar(e).add(this.start) }, closestPointToPointParameter: function() { var e = new THREE.Vector3, t = new THREE.Vector3; return function(r, i) { e.subVectors(r, this.start), t.subVectors(this.end, this.start); var n = t.dot(t), n = t.dot(e) / n; return i && (n = THREE.Math.clamp(n, 0, 1)), n } }(), closestPointToPoint: function(e, t, r) { return e = this.closestPointToPointParameter(e, t), r = r || new THREE.Vector3, this.delta(r).multiplyScalar(e).add(this.start) }, applyMatrix4: function(e) { return this.start.applyMatrix4(e), this.end.applyMatrix4(e), this }, equals: function(e) { return e.start.equals(this.start) && e.end.equals(this.end) }, clone: function() { return (new THREE.Line3).copy(this) } }, THREE.Box2 = function(e, t) { this.min = void 0 !== e ? e : new THREE.Vector2(1 / 0, 1 / 0), this.max = void 0 !== t ? t : new THREE.Vector2(-(1 / 0), -(1 / 0)) }, THREE.Box2.prototype = { constructor: THREE.Box2, set: function(e, t) { return this.min.copy(e), this.max.copy(t), this }, setFromPoints: function(e) { this.makeEmpty(); for (var t = 0, r = e.length; r > t; t++) this.expandByPoint(e[t]); return this }, setFromCenterAndSize: function() { var e = new THREE.Vector2; return function(t, r) { var i = e.copy(r).multiplyScalar(.5); return this.min.copy(t).sub(i), this.max.copy(t).add(i), this } }(), copy: function(e) { return this.min.copy(e.min), this.max.copy(e.max), this }, makeEmpty: function() { return this.min.x = this.min.y = 1 / 0, this.max.x = this.max.y = -(1 / 0), this }, empty: function() { return this.max.x < this.min.x || this.max.y < this.min.y }, center: function(e) { return (e || new THREE.Vector2).addVectors(this.min, this.max).multiplyScalar(.5) }, size: function(e) { return (e || new THREE.Vector2).subVectors(this.max, this.min) }, expandByPoint: function(e) { return this.min.min(e), this.max.max(e), this }, expandByVector: function(e) { return this.min.sub(e), this.max.add(e), this }, expandByScalar: function(e) { return this.min.addScalar(-e), this.max.addScalar(e), this }, containsPoint: function(e) { return e.x < this.min.x || e.x > this.max.x || e.y < this.min.y || e.y > this.max.y ? !1 : !0 }, containsBox: function(e) { return this.min.x <= e.min.x && e.max.x <= this.max.x && this.min.y <= e.min.y && e.max.y <= this.max.y ? !0 : !1 }, getParameter: function(e, t) { return (t || new THREE.Vector2).set((e.x - this.min.x) / (this.max.x - this.min.x), (e.y - this.min.y) / (this.max.y - this.min.y)) }, isIntersectionBox: function(e) { return e.max.x < this.min.x || e.min.x > this.max.x || e.max.y < this.min.y || e.min.y > this.max.y ? !1 : !0 }, clampPoint: function(e, t) { return (t || new THREE.Vector2).copy(e).clamp(this.min, this.max) }, distanceToPoint: function() { var e = new THREE.Vector2; return function(t) { return e.copy(t).clamp(this.min, this.max).sub(t).length() } }(), intersect: function(e) { return this.min.max(e.min), this.max.min(e.max), this }, union: function(e) { return this.min.min(e.min), this.max.max(e.max), this }, translate: function(e) { return this.min.add(e), this.max.add(e), this }, equals: function(e) { return e.min.equals(this.min) && e.max.equals(this.max) }, clone: function() { return (new THREE.Box2).copy(this) } }, THREE.Box3 = function(e, t) { this.min = void 0 !== e ? e : new THREE.Vector3(1 / 0, 1 / 0, 1 / 0), this.max = void 0 !== t ? t : new THREE.Vector3(-(1 / 0), -(1 / 0), -(1 / 0)) }, THREE.Box3.prototype = { constructor: THREE.Box3, set: function(e, t) { return this.min.copy(e), this.max.copy(t), this }, setFromPoints: function(e) { this.makeEmpty(); for (var t = 0, r = e.length; r > t; t++) this.expandByPoint(e[t]); return this }, setFromCenterAndSize: function() { var e = new THREE.Vector3; return function(t, r) { var i = e.copy(r).multiplyScalar(.5); return this.min.copy(t).sub(i), this.max.copy(t).add(i), this } }(), setFromObject: function() { var e = new THREE.Vector3; return function(t) { var r = this; return t.updateMatrixWorld(!0), this.makeEmpty(), t.traverse(function(t) { var i = t.geometry; if (void 0 !== i) if (i instanceof THREE.Geometry) for (var n = i.vertices, i = 0, o = n.length; o > i; i++) e.copy(n[i]), e.applyMatrix4(t.matrixWorld), r.expandByPoint(e); else if (i instanceof THREE.BufferGeometry && void 0 !== i.attributes.position) for (n = i.attributes.position.array, i = 0, o = n.length; o > i; i += 3) e.set(n[i], n[i + 1], n[i + 2]), e.applyMatrix4(t.matrixWorld), r.expandByPoint(e) }), this } }(), copy: function(e) { return this.min.copy(e.min), this.max.copy(e.max), this }, makeEmpty: function() { return this.min.x = this.min.y = this.min.z = 1 / 0, this.max.x = this.max.y = this.max.z = -(1 / 0), this }, empty: function() { return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z }, center: function(e) { return (e || new THREE.Vector3).addVectors(this.min, this.max).multiplyScalar(.5) }, size: function(e) { return (e || new THREE.Vector3).subVectors(this.max, this.min) }, expandByPoint: function(e) { return this.min.min(e), this.max.max(e), this }, expandByVector: function(e) { return this.min.sub(e), this.max.add(e), this }, expandByScalar: function(e) { return this.min.addScalar(-e), this.max.addScalar(e), this }, containsPoint: function(e) { return e.x < this.min.x || e.x > this.max.x || e.y < this.min.y || e.y > this.max.y || e.z < this.min.z || e.z > this.max.z ? !1 : !0 }, containsBox: function(e) { return this.min.x <= e.min.x && e.max.x <= this.max.x && this.min.y <= e.min.y && e.max.y <= this.max.y && this.min.z <= e.min.z && e.max.z <= this.max.z ? !0 : !1 }, getParameter: function(e, t) { return (t || new THREE.Vector3).set((e.x - this.min.x) / (this.max.x - this.min.x), (e.y - this.min.y) / (this.max.y - this.min.y), (e.z - this.min.z) / (this.max.z - this.min.z)) }, isIntersectionBox: function(e) { return e.max.x < this.min.x || e.min.x > this.max.x || e.max.y < this.min.y || e.min.y > this.max.y || e.max.z < this.min.z || e.min.z > this.max.z ? !1 : !0 }, clampPoint: function(e, t) { return (t || new THREE.Vector3).copy(e).clamp(this.min, this.max) }, distanceToPoint: function() { var e = new THREE.Vector3; return function(t) { return e.copy(t).clamp(this.min, this.max).sub(t).length() } }(), getBoundingSphere: function() { var e = new THREE.Vector3; return function(t) { return t = t || new THREE.Sphere, t.center = this.center(), t.radius = .5 * this.size(e).length(), t } }(), intersect: function(e) { return this.min.max(e.min), this.max.min(e.max), this }, union: function(e) { return this.min.min(e.min), this.max.max(e.max), this }, applyMatrix4: function() { var e = [new THREE.Vector3, new THREE.Vector3, new THREE.Vector3, new THREE.Vector3, new THREE.Vector3, new THREE.Vector3, new THREE.Vector3, new THREE.Vector3]; return function(t) { return e[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(t), e[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(t), e[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(t), e[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(t), e[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(t), e[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(t), e[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(t), e[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(t), this.makeEmpty(), this.setFromPoints(e), this } }(), translate: function(e) { return this.min.add(e), this.max.add(e), this }, equals: function(e) { return e.min.equals(this.min) && e.max.equals(this.max) }, clone: function() { return (new THREE.Box3).copy(this) } }, THREE.Matrix3 = function() { this.elements = new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]), 0 < arguments.length && THREE.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.") }, THREE.Matrix3.prototype = { constructor: THREE.Matrix3, set: function(e, t, r, i, n, o, a, s, h) { var l = this.elements; return l[0] = e, l[3] = t, l[6] = r, l[1] = i, l[4] = n, l[7] = o, l[2] = a, l[5] = s, l[8] = h, this }, identity: function() { return this.set(1, 0, 0, 0, 1, 0, 0, 0, 1), this }, copy: function(e) { return e = e.elements, this.set(e[0], e[3], e[6], e[1], e[4], e[7], e[2], e[5], e[8]), this }, multiplyVector3: function(e) { return THREE.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."), e.applyMatrix3(this) }, multiplyVector3Array: function(e) { return THREE.warn("THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead."), this.applyToVector3Array(e) }, applyToVector3Array: function() { var e = new THREE.Vector3; return function(t, r, i) { void 0 === r && (r = 0), void 0 === i && (i = t.length); for (var n = 0; i > n; n += 3, r += 3) e.x = t[r], e.y = t[r + 1], e.z = t[r + 2], e.applyMatrix3(this), t[r] = e.x, t[r + 1] = e.y, t[r + 2] = e.z; return t } }(), multiplyScalar: function(e) { var t = this.elements; return t[0] *= e, t[3] *= e, t[6] *= e, t[1] *= e, t[4] *= e, t[7] *= e, t[2] *= e, t[5] *= e, t[8] *= e, this }, determinant: function() { var e = this.elements, t = e[0], r = e[1], i = e[2], n = e[3], o = e[4], a = e[5], s = e[6], h = e[7], e = e[8]; return t * o * e - t * a * h - r * n * e + r * a * s + i * n * h - i * o * s }, getInverse: function(e, t) { var r = e.elements, i = this.elements; if (i[0] = r[10] * r[5] - r[6] * r[9], i[1] = -r[10] * r[1] + r[2] * r[9], i[2] = r[6] * r[1] - r[2] * r[5], i[3] = -r[10] * r[4] + r[6] * r[8], i[4] = r[10] * r[0] - r[2] * r[8], i[5] = -r[6] * r[0] + r[2] * r[4], i[6] = r[9] * r[4] - r[5] * r[8], i[7] = -r[9] * r[0] + r[1] * r[8], i[8] = r[5] * r[0] - r[1] * r[4], r = r[0] * i[0] + r[1] * i[3] + r[2] * i[6], 0 === r) { if (t) throw Error("Matrix3.getInverse(): can't invert matrix, determinant is 0"); return THREE.warn("Matrix3.getInverse(): can't invert matrix, determinant is 0"), this.identity(), this } return this.multiplyScalar(1 / r), this }, transpose: function() { var e, t = this.elements; return e = t[1], t[1] = t[3], t[3] = e, e = t[2], t[2] = t[6], t[6] = e, e = t[5], t[5] = t[7], t[7] = e, this }, flattenToArrayOffset: function(e, t) { var r = this.elements; return e[t] = r[0], e[t + 1] = r[1], e[t + 2] = r[2], e[t + 3] = r[3], e[t + 4] = r[4], e[t + 5] = r[5], e[t + 6] = r[6], e[t + 7] = r[7], e[t + 8] = r[8], e }, getNormalMatrix: function(e) { return this.getInverse(e).transpose(), this }, transposeIntoArray: function(e) { var t = this.elements; return e[0] = t[0], e[1] = t[3], e[2] = t[6], e[3] = t[1], e[4] = t[4], e[5] = t[7], e[6] = t[2], e[7] = t[5], e[8] = t[8], this }, fromArray: function(e) { return this.elements.set(e), this }, toArray: function() { var e = this.elements; return [e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8]] }, clone: function() { return (new THREE.Matrix3).fromArray(this.elements) } }, THREE.Matrix4 = function() { this.elements = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]), 0 < arguments.length && THREE.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.") }, THREE.Matrix4.prototype = { constructor: THREE.Matrix4, set: function(e, t, r, i, n, o, a, s, h, l, c, u, E, p, d, f) { var m = this.elements; return m[0] = e, m[4] = t, m[8] = r, m[12] = i, m[1] = n, m[5] = o, m[9] = a, m[13] = s, m[2] = h, m[6] = l, m[10] = c, m[14] = u, m[3] = E, m[7] = p, m[11] = d, m[15] = f, this }, identity: function() { return this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), this }, copy: function(e) { return this.elements.set(e.elements), this }, extractPosition: function(e) { return THREE.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."), this.copyPosition(e) }, copyPosition: function(e) { var t = this.elements; return e = e.elements, t[12] = e[12], t[13] = e[13], t[14] = e[14], this }, extractBasis: function(e, t, r) { var i = this.elements; return e.set(i[0], i[1], i[2]), t.set(i[4], i[5], i[6]), r.set(i[8], i[9], i[10]), this }, makeBasis: function(e, t, r) { return this.set(e.x, t.x, r.x, 0, e.y, t.y, r.y, 0, e.z, t.z, r.z, 0, 0, 0, 0, 1), this }, extractRotation: function() { var e = new THREE.Vector3; return function(t) { var r = this.elements; t = t.elements; var i = 1 / e.set(t[0], t[1], t[2]).length(), n = 1 / e.set(t[4], t[5], t[6]).length(), o = 1 / e.set(t[8], t[9], t[10]).length(); return r[0] = t[0] * i, r[1] = t[1] * i, r[2] = t[2] * i, r[4] = t[4] * n, r[5] = t[5] * n, r[6] = t[6] * n, r[8] = t[8] * o, r[9] = t[9] * o, r[10] = t[10] * o, this } }(), makeRotationFromEuler: function(e) {!1 == e instanceof THREE.Euler && THREE.error("THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order."); var t = this.elements, r = e.x, i = e.y, n = e.z, o = Math.cos(r), r = Math.sin(r), a = Math.cos(i), i = Math.sin(i), s = Math.cos(n), n = Math.sin(n); if ("XYZ" === e.order) { e = o * s; var h = o * n, l = r * s, c = r * n; t[0] = a * s, t[4] = -a * n, t[8] = i, t[1] = h + l * i, t[5] = e - c * i, t[9] = -r * a, t[2] = c - e * i, t[6] = l + h * i, t[10] = o * a } else "YXZ" === e.order ? (e = a * s, h = a * n, l = i * s, c = i * n, t[0] = e + c * r, t[4] = l * r - h, t[8] = o * i, t[1] = o * n, t[5] = o * s, t[9] = -r, t[2] = h * r - l, t[6] = c + e * r, t[10] = o * a) : "ZXY" === e.order ? (e = a * s, h = a * n, l = i * s, c = i * n, t[0] = e - c * r, t[4] = -o * n, t[8] = l + h * r, t[1] = h + l * r, t[5] = o * s, t[9] = c - e * r, t[2] = -o * i, t[6] = r, t[10] = o * a) : "ZYX" === e.order ? (e = o * s, h = o * n, l = r * s, c = r * n, t[0] = a * s, t[4] = l * i - h, t[8] = e * i + c, t[1] = a * n, t[5] = c * i + e, t[9] = h * i - l, t[2] = -i, t[6] = r * a, t[10] = o * a) : "YZX" === e.order ? (e = o * a, h = o * i, l = r * a, c = r * i, t[0] = a * s, t[4] = c - e * n, t[8] = l * n + h, t[1] = n, t[5] = o * s, t[9] = -r * s, t[2] = -i * s, t[6] = h * n + l, t[10] = e - c * n) : "XZY" === e.order && (e = o * a, h = o * i, l = r * a, c = r * i, t[0] = a * s, t[4] = -n, t[8] = i * s, t[1] = e * n + c, t[5] = o * s, t[9] = h * n - l, t[2] = l * n - h, t[6] = r * s, t[10] = c * n + e); return t[3] = 0, t[7] = 0, t[11] = 0, t[12] = 0, t[13] = 0, t[14] = 0, t[15] = 1, this }, setRotationFromQuaternion: function(e) { return THREE.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."), this.makeRotationFromQuaternion(e) }, makeRotationFromQuaternion: function(e) { var t = this.elements, r = e.x, i = e.y, n = e.z, o = e.w, a = r + r, s = i + i, h = n + n; e = r * a; var l = r * s, r = r * h, c = i * s, i = i * h, n = n * h, a = o * a, s = o * s, o = o * h; return t[0] = 1 - (c + n), t[4] = l - o, t[8] = r + s, t[1] = l + o, t[5] = 1 - (e + n), t[9] = i - a, t[2] = r - s, t[6] = i + a, t[10] = 1 - (e + c), t[3] = 0, t[7] = 0, t[11] = 0, t[12] = 0, t[13] = 0, t[14] = 0, t[15] = 1, this }, lookAt: function() { var e = new THREE.Vector3, t = new THREE.Vector3, r = new THREE.Vector3; return function(i, n, o) { var a = this.elements; return r.subVectors(i, n).normalize(), 0 === r.length() && (r.z = 1), e.crossVectors(o, r).normalize(), 0 === e.length() && (r.x += 1e-4, e.crossVectors(o, r).normalize()), t.crossVectors(r, e), a[0] = e.x, a[4] = t.x, a[8] = r.x, a[1] = e.y, a[5] = t.y, a[9] = r.y, a[2] = e.z, a[6] = t.z, a[10] = r.z, this } }(), multiply: function(e, t) { return void 0 !== t ? (THREE.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."), this.multiplyMatrices(e, t)) : this.multiplyMatrices(this, e) }, multiplyMatrices: function(e, t) { var r = e.elements, i = t.elements, n = this.elements, o = r[0], a = r[4], s = r[8], h = r[12], l = r[1], c = r[5], u = r[9], E = r[13], p = r[2], d = r[6], f = r[10], m = r[14], T = r[3], g = r[7], R = r[11], r = r[15], y = i[0], v = i[4], H = i[8], x = i[12], b = i[1], w = i[5], _ = i[9], M = i[13], S = i[2], C = i[6], A = i[10], L = i[14], P = i[3], F = i[7], B = i[11], i = i[15]; return n[0] = o * y + a * b + s * S + h * P, n[4] = o * v + a * w + s * C + h * F, n[8] = o * H + a * _ + s * A + h * B, n[12] = o * x + a * M + s * L + h * i, n[1] = l * y + c * b + u * S + E * P, n[5] = l * v + c * w + u * C + E * F, n[9] = l * H + c * _ + u * A + E * B, n[13] = l * x + c * M + u * L + E * i, n[2] = p * y + d * b + f * S + m * P, n[6] = p * v + d * w + f * C + m * F, n[10] = p * H + d * _ + f * A + m * B, n[14] = p * x + d * M + f * L + m * i, n[3] = T * y + g * b + R * S + r * P, n[7] = T * v + g * w + R * C + r * F, n[11] = T * H + g * _ + R * A + r * B, n[15] = T * x + g * M + R * L + r * i, this }, multiplyToArray: function(e, t, r) { var i = this.elements; return this.multiplyMatrices(e, t), r[0] = i[0], r[1] = i[1], r[2] = i[2], r[3] = i[3], r[4] = i[4], r[5] = i[5], r[6] = i[6], r[7] = i[7], r[8] = i[8], r[9] = i[9], r[10] = i[10], r[11] = i[11], r[12] = i[12], r[13] = i[13], r[14] = i[14], r[15] = i[15], this }, multiplyScalar: function(e) { var t = this.elements; return t[0] *= e, t[4] *= e, t[8] *= e, t[12] *= e, t[1] *= e, t[5] *= e, t[9] *= e, t[13] *= e, t[2] *= e, t[6] *= e, t[10] *= e, t[14] *= e, t[3] *= e, t[7] *= e, t[11] *= e, t[15] *= e, this }, multiplyVector3: function(e) { return THREE.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead."), e.applyProjection(this) }, multiplyVector4: function(e) { return THREE.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."), e.applyMatrix4(this) }, multiplyVector3Array: function(e) { return THREE.warn("THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead."), this.applyToVector3Array(e) }, applyToVector3Array: function() { var e = new THREE.Vector3; return function(t, r, i) { void 0 === r && (r = 0), void 0 === i && (i = t.length); for (var n = 0; i > n; n += 3, r += 3) e.x = t[r], e.y = t[r + 1], e.z = t[r + 2], e.applyMatrix4(this), t[r] = e.x, t[r + 1] = e.y, t[r + 2] = e.z; return t } }(), rotateAxis: function(e) { THREE.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."), e.transformDirection(this) }, crossVector: function(e) { return THREE.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."), e.applyMatrix4(this) }, determinant: function() { var e = this.elements, t = e[0], r = e[4], i = e[8], n = e[12], o = e[1], a = e[5], s = e[9], h = e[13], l = e[2], c = e[6], u = e[10], E = e[14]; return e[3] * (+n * s * c - i * h * c - n * a * u + r * h * u + i * a * E - r * s * E) + e[7] * (+t * s * E - t * h * u + n * o * u - i * o * E + i * h * l - n * s * l) + e[11] * (+t * h * c - t * a * E - n * o * c + r * o * E + n * a * l - r * h * l) + e[15] * (-i * a * l - t * s * c + t * a * u + i * o * c - r * o * u + r * s * l) }, transpose: function() { var e, t = this.elements; return e = t[1], t[1] = t[4], t[4] = e, e = t[2], t[2] = t[8], t[8] = e, e = t[6], t[6] = t[9], t[9] = e, e = t[3], t[3] = t[12], t[12] = e, e = t[7], t[7] = t[13], t[13] = e, e = t[11], t[11] = t[14], t[14] = e, this }, flattenToArrayOffset: function(e, t) { var r = this.elements; return e[t] = r[0], e[t + 1] = r[1], e[t + 2] = r[2], e[t + 3] = r[3], e[t + 4] = r[4], e[t + 5] = r[5], e[t + 6] = r[6], e[t + 7] = r[7], e[t + 8] = r[8], e[t + 9] = r[9], e[t + 10] = r[10], e[t + 11] = r[11], e[t + 12] = r[12], e[t + 13] = r[13], e[t + 14] = r[14], e[t + 15] = r[15], e }, getPosition: function() { var e = new THREE.Vector3; return function() { THREE.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."); var t = this.elements; return e.set(t[12], t[13], t[14]) } }(), setPosition: function(e) { var t = this.elements; return t[12] = e.x, t[13] = e.y, t[14] = e.z, this }, getInverse: function(e, t) { var r = this.elements, i = e.elements, n = i[0], o = i[4], a = i[8], s = i[12], h = i[1], l = i[5], c = i[9], u = i[13], E = i[2], p = i[6], d = i[10], f = i[14], m = i[3], T = i[7], g = i[11], i = i[15]; if (r[0] = c * f * T - u * d * T + u * p * g - l * f * g - c * p * i + l * d * i, r[4] = s * d * T - a * f * T - s * p * g + o * f * g + a * p * i - o * d * i, r[8] = a * u * T - s * c * T + s * l * g - o * u * g - a * l * i + o * c * i, r[12] = s * c * p - a * u * p - s * l * d + o * u * d + a * l * f - o * c * f, r[1] = u * d * m - c * f * m - u * E * g + h * f * g + c * E * i - h * d * i, r[5] = a * f * m - s * d * m + s * E * g - n * f * g - a * E * i + n * d * i, r[9] = s * c * m - a * u * m - s * h * g + n * u * g + a * h * i - n * c * i, r[13] = a * u * E - s * c * E + s * h * d - n * u * d - a * h * f + n * c * f, r[2] = l * f * m - u * p * m + u * E * T - h * f * T - l * E * i + h * p * i, r[6] = s * p * m - o * f * m - s * E * T + n * f * T + o * E * i - n * p * i, r[10] = o * u * m - s * l * m + s * h * T - n * u * T - o * h * i + n * l * i, r[14] = s * l * E - o * u * E - s * h * p + n * u * p + o * h * f - n * l * f, r[3] = c * p * m - l * d * m - c * E * T + h * d * T + l * E * g - h * p * g, r[7] = o * d * m - a * p * m + a * E * T - n * d * T - o * E * g + n * p * g, r[11] = a * l * m - o * c * m - a * h * T + n * c * T + o * h * g - n * l * g, r[15] = o * c * E - a * l * E + a * h * p - n * c * p - o * h * d + n * l * d, r = n * r[0] + h * r[4] + E * r[8] + m * r[12], 0 == r) { if (t) throw Error("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0"); return THREE.warn("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0"), this.identity(), this } return this.multiplyScalar(1 / r), this }, translate: function(e) { THREE.error("THREE.Matrix4: .translate() has been removed.") }, rotateX: function(e) { THREE.error("THREE.Matrix4: .rotateX() has been removed.") }, rotateY: function(e) { THREE.error("THREE.Matrix4: .rotateY() has been removed.") }, rotateZ: function(e) { THREE.error("THREE.Matrix4: .rotateZ() has been removed.") }, rotateByAxis: function(e, t) { THREE.error("THREE.Matrix4: .rotateByAxis() has been removed.") }, scale: function(e) { var t = this.elements, r = e.x, i = e.y; return e = e.z, t[0] *= r, t[4] *= i, t[8] *= e, t[1] *= r, t[5] *= i, t[9] *= e, t[2] *= r, t[6] *= i, t[10] *= e, t[3] *= r, t[7] *= i, t[11] *= e, this }, getMaxScaleOnAxis: function() { var e = this.elements; return Math.sqrt(Math.max(e[0] * e[0] + e[1] * e[1] + e[2] * e[2], Math.max(e[4] * e[4] + e[5] * e[5] + e[6] * e[6], e[8] * e[8] + e[9] * e[9] + e[10] * e[10]))) }, makeTranslation: function(e, t, r) { return this.set(1, 0, 0, e, 0, 1, 0, t, 0, 0, 1, r, 0, 0, 0, 1), this }, makeRotationX: function(e) { var t = Math.cos(e); return e = Math.sin(e), this.set(1, 0, 0, 0, 0, t, -e, 0, 0, e, t, 0, 0, 0, 0, 1), this }, makeRotationY: function(e) { var t = Math.cos(e); return e = Math.sin(e), this.set(t, 0, e, 0, 0, 1, 0, 0, -e, 0, t, 0, 0, 0, 0, 1), this }, makeRotationZ: function(e) { var t = Math.cos(e); return e = Math.sin(e), this.set(t, -e, 0, 0, e, t, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), this }, makeRotationAxis: function(e, t) { var r = Math.cos(t), i = Math.sin(t), n = 1 - r, o = e.x, a = e.y, s = e.z, h = n * o, l = n * a; return this.set(h * o + r, h * a - i * s, h * s + i * a, 0, h * a + i * s, l * a + r, l * s - i * o, 0, h * s - i * a, l * s + i * o, n * s * s + r, 0, 0, 0, 0, 1), this }, makeScale: function(e, t, r) { return this.set(e, 0, 0, 0, 0, t, 0, 0, 0, 0, r, 0, 0, 0, 0, 1), this }, compose: function(e, t, r) { return this.makeRotationFromQuaternion(t), this.scale(r), this.setPosition(e), this }, decompose: function() { var e = new THREE.Vector3, t = new THREE.Matrix4; return function(r, i, n) { var o = this.elements, a = e.set(o[0], o[1], o[2]).length(), s = e.set(o[4], o[5], o[6]).length(), h = e.set(o[8], o[9], o[10]).length(); 0 > this.determinant() && (a = -a), r.x = o[12], r.y = o[13], r.z = o[14], t.elements.set(this.elements), r = 1 / a; var o = 1 / s, l = 1 / h; return t.elements[0] *= r, t.elements[1] *= r, t.elements[2] *= r, t.elements[4] *= o, t.elements[5] *= o, t.elements[6] *= o, t.elements[8] *= l, t.elements[9] *= l, t.elements[10] *= l, i.setFromRotationMatrix(t), n.x = a, n.y = s, n.z = h, this } }(), makeFrustum: function(e, t, r, i, n, o) { var a = this.elements; return a[0] = 2 * n / (t - e), a[4] = 0, a[8] = (t + e) / (t - e), a[12] = 0, a[1] = 0, a[5] = 2 * n / (i - r), a[9] = (i + r) / (i - r), a[13] = 0, a[2] = 0, a[6] = 0, a[10] = -(o + n) / (o - n), a[14] = -2 * o * n / (o - n), a[3] = 0, a[7] = 0, a[11] = -1, a[15] = 0, this }, makePerspective: function(e, t, r, i) { e = r * Math.tan(THREE.Math.degToRad(.5 * e)); var n = -e; return this.makeFrustum(n * t, e * t, n, e, r, i) }, makeOrthographic: function(e, t, r, i, n, o) { var a = this.elements, s = t - e, h = r - i, l = o - n; return a[0] = 2 / s, a[4] = 0, a[8] = 0, a[12] = -((t + e) / s), a[1] = 0, a[5] = 2 / h, a[9] = 0, a[13] = -((r + i) / h), a[2] = 0, a[6] = 0, a[10] = -2 / l, a[14] = -((o + n) / l), a[3] = 0, a[7] = 0, a[11] = 0, a[15] = 1, this }, fromArray: function(e) { return this.elements.set(e), this }, toArray: function() { var e = this.elements; return [e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8], e[9], e[10], e[11], e[12], e[13], e[14], e[15]] }, clone: function() { return (new THREE.Matrix4).fromArray(this.elements) } }, THREE.Ray = function(e, t) { this.origin = void 0 !== e ? e : new THREE.Vector3, this.direction = void 0 !== t ? t : new THREE.Vector3 }, THREE.Ray.prototype = { constructor: THREE.Ray, set: function(e, t) { return this.origin.copy(e), this.direction.copy(t), this }, copy: function(e) { return this.origin.copy(e.origin), this.direction.copy(e.direction), this }, at: function(e, t) { return (t || new THREE.Vector3).copy(this.direction).multiplyScalar(e).add(this.origin) }, recast: function() { var e = new THREE.Vector3; return function(t) { return this.origin.copy(this.at(t, e)), this } }(), closestPointToPoint: function(e, t) { var r = t || new THREE.Vector3; r.subVectors(e, this.origin); var i = r.dot(this.direction); return 0 > i ? r.copy(this.origin) : r.copy(this.direction).multiplyScalar(i).add(this.origin) }, distanceToPoint: function() { var e = new THREE.Vector3; return function(t) { var r = e.subVectors(t, this.origin).dot(this.direction); return 0 > r ? this.origin.distanceTo(t) : (e.copy(this.direction).multiplyScalar(r).add(this.origin), e.distanceTo(t)) } }(), distanceSqToSegment: function() { var e = new THREE.Vector3, t = new THREE.Vector3, r = new THREE.Vector3; return function(i, n, o, a) { e.copy(i).add(n).multiplyScalar(.5), t.copy(n).sub(i).normalize(), r.copy(this.origin).sub(e); var s, h = .5 * i.distanceTo(n), l = -this.direction.dot(t), c = r.dot(this.direction), u = -r.dot(t), E = r.lengthSq(), p = Math.abs(1 - l * l); return p > 0 ? (i = l * u - c, n = l * c - u, s = h * p, i >= 0 ? n >= -s ? s >= n ? (h = 1 / p, i *= h, n *= h, l = i * (i + l * n + 2 * c) + n * (l * i + n + 2 * u) + E) : (n = h, i = Math.max(0, -(l * n + c)), l = -i * i + n * (n + 2 * u) + E) : (n = -h, i = Math.max(0, -(l * n + c)), l = -i * i + n * (n + 2 * u) + E) : -s >= n ? (i = Math.max(0, -(-l * h + c)), n = i > 0 ? -h : Math.min(Math.max(-h, -u), h), l = -i * i + n * (n + 2 * u) + E) : s >= n ? (i = 0, n = Math.min(Math.max(-h, -u), h), l = n * (n + 2 * u) + E) : (i = Math.max(0, -(l * h + c)), n = i > 0 ? h : Math.min(Math.max(-h, -u), h), l = -i * i + n * (n + 2 * u) + E)) : (n = l > 0 ? -h : h, i = Math.max(0, -(l * n + c)), l = -i * i + n * (n + 2 * u) + E), o && o.copy(this.direction).multiplyScalar(i).add(this.origin), a && a.copy(t).multiplyScalar(n).add(e), l } }(), isIntersectionSphere: function(e) { return this.distanceToPoint(e.center) <= e.radius }, intersectSphere: function() { var e = new THREE.Vector3; return function(t, r) { e.subVectors(t.center, this.origin); var i = e.dot(this.direction), n = e.dot(e) - i * i, o = t.radius * t.radius; return n > o ? null : (o = Math.sqrt(o - n), n = i - o, i += o, 0 > n && 0 > i ? null : 0 > n ? this.at(i, r) : this.at(n, r)) } }(), isIntersectionPlane: function(e) { var t = e.distanceToPoint(this.origin); return 0 === t || 0 > e.normal.dot(this.direction) * t ? !0 : !1 }, distanceToPlane: function(e) { var t = e.normal.dot(this.direction); return 0 == t ? 0 == e.distanceToPoint(this.origin) ? 0 : null : (e = -(this.origin.dot(e.normal) + e.constant) / t, e >= 0 ? e : null) }, intersectPlane: function(e, t) { var r = this.distanceToPlane(e); return null === r ? null : this.at(r, t) }, isIntersectionBox: function() { var e = new THREE.Vector3; return function(t) { return null !== this.intersectBox(t, e) } }(), intersectBox: function(e, t) { var r, i, n, o, a; i = 1 / this.direction.x, o = 1 / this.direction.y, a = 1 / this.direction.z; var s = this.origin; return i >= 0 ? (r = (e.min.x - s.x) * i, i *= e.max.x - s.x) : (r = (e.max.x - s.x) * i, i *= e.min.x - s.x), o >= 0 ? (n = (e.min.y - s.y) * o, o *= e.max.y - s.y) : (n = (e.max.y - s.y) * o, o *= e.min.y - s.y), r > o || n > i ? null : ((n > r || r !== r) && (r = n), (i > o || i !== i) && (i = o), a >= 0 ? (n = (e.min.z - s.z) * a, a *= e.max.z - s.z) : (n = (e.max.z - s.z) * a, a *= e.min.z - s.z), r > a || n > i ? null : ((n > r || r !== r) && (r = n), (i > a || i !== i) && (i = a), 0 > i ? null : this.at(r >= 0 ? r : i, t))) }, intersectTriangle: function() { var e = new THREE.Vector3, t = new THREE.Vector3, r = new THREE.Vector3, i = new THREE.Vector3; return function(n, o, a, s, h) { if (t.subVectors(o, n), r.subVectors(a, n), i.crossVectors(t, r), o = this.direction.dot(i), o > 0) { if (s) return null; s = 1 } else { if (!(0 > o)) return null; s = -1, o = -o } return e.subVectors(this.origin, n), n = s * this.direction.dot(r.crossVectors(e, r)), 0 > n ? null : (a = s * this.direction.dot(t.cross(e)), 0 > a || n + a > o ? null : (n = -s * e.dot(i), 0 > n ? null : this.at(n / o, h))) } }(), applyMatrix4: function(e) { return this.direction.add(this.origin).applyMatrix4(e), this.origin.applyMatrix4(e), this.direction.sub(this.origin), this.direction.normalize(), this }, equals: function(e) { return e.origin.equals(this.origin) && e.direction.equals(this.direction) }, clone: function() { return (new THREE.Ray).copy(this) } }, THREE.Sphere = function(e, t) { this.center = void 0 !== e ? e : new THREE.Vector3, this.radius = void 0 !== t ? t : 0 }, THREE.Sphere.prototype = { constructor: THREE.Sphere, set: function(e, t) { return this.center.copy(e), this.radius = t, this }, setFromPoints: function() { var e = new THREE.Box3; return function(t, r) { var i = this.center; void 0 !== r ? i.copy(r) : e.setFromPoints(t).center(i); for (var n = 0, o = 0, a = t.length; a > o; o++) n = Math.max(n, i.distanceToSquared(t[o])); return this.radius = Math.sqrt(n), this } }(), copy: function(e) { return this.center.copy(e.center), this.radius = e.radius, this }, empty: function() { return 0 >= this.radius }, containsPoint: function(e) { return e.distanceToSquared(this.center) <= this.radius * this.radius }, distanceToPoint: function(e) { return e.distanceTo(this.center) - this.radius }, intersectsSphere: function(e) { var t = this.radius + e.radius; return e.center.distanceToSquared(this.center) <= t * t }, clampPoint: function(e, t) { var r = this.center.distanceToSquared(e), i = t || new THREE.Vector3; return i.copy(e), r > this.radius * this.radius && (i.sub(this.center).normalize(), i.multiplyScalar(this.radius).add(this.center)), i }, getBoundingBox: function(e) { return e = e || new THREE.Box3, e.set(this.center, this.center), e.expandByScalar(this.radius), e }, applyMatrix4: function(e) { return this.center.applyMatrix4(e), this.radius *= e.getMaxScaleOnAxis(), this }, translate: function(e) { return this.center.add(e), this }, equals: function(e) { return e.center.equals(this.center) && e.radius === this.radius }, clone: function() { return (new THREE.Sphere).copy(this) } }, THREE.Frustum = function(e, t, r, i, n, o) { this.planes = [void 0 !== e ? e : new THREE.Plane, void 0 !== t ? t : new THREE.Plane, void 0 !== r ? r : new THREE.Plane, void 0 !== i ? i : new THREE.Plane, void 0 !== n ? n : new THREE.Plane, void 0 !== o ? o : new THREE.Plane] }, THREE.Frustum.prototype = { constructor: THREE.Frustum, set: function(e, t, r, i, n, o) { var a = this.planes; return a[0].copy(e), a[1].copy(t), a[2].copy(r), a[3].copy(i), a[4].copy(n), a[5].copy(o), this }, copy: function(e) { for (var t = this.planes, r = 0; 6 > r; r++) t[r].copy(e.planes[r]); return this }, setFromMatrix: function(e) { var t = this.planes, r = e.elements; e = r[0]; var i = r[1], n = r[2], o = r[3], a = r[4], s = r[5], h = r[6], l = r[7], c = r[8], u = r[9], E = r[10], p = r[11], d = r[12], f = r[13], m = r[14], r = r[15]; return t[0].setComponents(o - e, l - a, p - c, r - d).normalize(), t[1].setComponents(o + e, l + a, p + c, r + d).normalize(), t[2].setComponents(o + i, l + s, p + u, r + f).normalize(), t[3].setComponents(o - i, l - s, p - u, r - f).normalize(), t[4].setComponents(o - n, l - h, p - E, r - m).normalize(), t[5].setComponents(o + n, l + h, p + E, r + m).normalize(), this }, intersectsObject: function() { var e = new THREE.Sphere; return function(t) { var r = t.geometry; return null === r.boundingSphere && r.computeBoundingSphere(), e.copy(r.boundingSphere), e.applyMatrix4(t.matrixWorld), this.intersectsSphere(e) } }(), intersectsSphere: function(e) { var t = this.planes, r = e.center; e = -e.radius; for (var i = 0; 6 > i; i++) if (t[i].distanceToPoint(r) < e) return !1; return !0 }, intersectsBox: function() { var e = new THREE.Vector3, t = new THREE.Vector3; return function(r) { for (var i = this.planes, n = 0; 6 > n; n++) { var o = i[n]; e.x = 0 < o.normal.x ? r.min.x : r.max.x, t.x = 0 < o.normal.x ? r.max.x : r.min.x, e.y = 0 < o.normal.y ? r.min.y : r.max.y, t.y = 0 < o.normal.y ? r.max.y : r.min.y, e.z = 0 < o.normal.z ? r.min.z : r.max.z, t.z = 0 < o.normal.z ? r.max.z : r.min.z; var a = o.distanceToPoint(e), o = o.distanceToPoint(t); if (0 > a && 0 > o) return !1 } return !0 } }(), containsPoint: function(e) { for (var t = this.planes, r = 0; 6 > r; r++) if (0 > t[r].distanceToPoint(e)) return !1; return !0 }, clone: function() { return (new THREE.Frustum).copy(this) } }, THREE.Plane = function(e, t) { this.normal = void 0 !== e ? e : new THREE.Vector3(1, 0, 0), this.constant = void 0 !== t ? t : 0 }, THREE.Plane.prototype = { constructor: THREE.Plane, set: function(e, t) { return this.normal.copy(e), this.constant = t, this }, setComponents: function(e, t, r, i) { return this.normal.set(e, t, r), this.constant = i, this }, setFromNormalAndCoplanarPoint: function(e, t) { return this.normal.copy(e), this.constant = -t.dot(this.normal), this }, setFromCoplanarPoints: function() { var e = new THREE.Vector3, t = new THREE.Vector3; return function(r, i, n) { return i = e.subVectors(n, i).cross(t.subVectors(r, i)).normalize(), this.setFromNormalAndCoplanarPoint(i, r), this } }(), copy: function(e) { return this.normal.copy(e.normal), this.constant = e.constant, this }, normalize: function() { var e = 1 / this.normal.length(); return this.normal.multiplyScalar(e), this.constant *= e, this }, negate: function() { return this.constant *= -1, this.normal.negate(), this }, distanceToPoint: function(e) { return this.normal.dot(e) + this.constant }, distanceToSphere: function(e) { return this.distanceToPoint(e.center) - e.radius }, projectPoint: function(e, t) { return this.orthoPoint(e, t).sub(e).negate() }, orthoPoint: function(e, t) { var r = this.distanceToPoint(e); return (t || new THREE.Vector3).copy(this.normal).multiplyScalar(r) }, isIntersectionLine: function(e) { var t = this.distanceToPoint(e.start); return e = this.distanceToPoint(e.end), 0 > t && e > 0 || 0 > e && t > 0 }, intersectLine: function() { var e = new THREE.Vector3; return function(t, r) { var i = r || new THREE.Vector3, n = t.delta(e), o = this.normal.dot(n); return 0 != o ? (o = -(t.start.dot(this.normal) + this.constant) / o, 0 > o || o > 1 ? void 0 : i.copy(n).multiplyScalar(o).add(t.start)) : 0 == this.distanceToPoint(t.start) ? i.copy(t.start) : void 0 } }(), coplanarPoint: function(e) { return (e || new THREE.Vector3).copy(this.normal).multiplyScalar(-this.constant) }, applyMatrix4: function() { var e = new THREE.Vector3, t = new THREE.Vector3, r = new THREE.Matrix3; return function(i, n) { var o = n || r.getNormalMatrix(i), o = e.copy(this.normal).applyMatrix3(o), a = this.coplanarPoint(t); return a.applyMatrix4(i), this.setFromNormalAndCoplanarPoint(o, a), this } }(), translate: function(e) { return this.constant -= e.dot(this.normal), this }, equals: function(e) { return e.normal.equals(this.normal) && e.constant == this.constant }, clone: function() { return (new THREE.Plane).copy(this) } }, THREE.Math = { generateUUID: function() { var e, t = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""), r = Array(36), i = 0; return function() { for (var n = 0; 36 > n; n++) 8 == n || 13 == n || 18 == n || 23 == n ? r[n] = "-" : 14 == n ? r[n] = "4" : (2 >= i && (i = 33554432 + 16777216 * Math.random() | 0), e = 15 & i, i >>= 4, r[n] = t[19 == n ? 3 & e | 8 : e]); return r.join("") } }(), clamp: function(e, t, r) { return t > e ? t : e > r ? r : e }, clampBottom: function(e, t) { return t > e ? t : e }, mapLinear: function(e, t, r, i, n) { return i + (e - t) * (n - i) / (r - t) }, smoothstep: function(e, t, r) { return t >= e ? 0 : e >= r ? 1 : (e = (e - t) / (r - t), e * e * (3 - 2 * e)) }, smootherstep: function(e, t, r) { return t >= e ? 0 : e >= r ? 1 : (e = (e - t) / (r - t), e * e * e * (e * (6 * e - 15) + 10)) }, random16: function() { return (65280 * Math.random() + 255 * Math.random()) / 65535 }, randInt: function(e, t) { return Math.floor(this.randFloat(e, t)) }, randFloat: function(e, t) { return e + Math.random() * (t - e) }, randFloatSpread: function(e) { return e * (.5 - Math.random()) }, degToRad: function() { var e = Math.PI / 180; return function(t) { return t * e } }(), radToDeg: function() { var e = 180 / Math.PI; return function(t) { return t * e } }(), isPowerOfTwo: function(e) { return 0 === (e & e - 1) && 0 !== e }, nextPowerOfTwo: function(e) { return e--, e |= e >> 1, e |= e >> 2, e |= e >> 4, e |= e >> 8, e |= e >> 16, e++, e } }, THREE.Spline = function(e) { function t(e, t, r, i, n, o, a) { return e = .5 * (r - e), i = .5 * (i - t), (2 * (t - r) + e + i) * a + (-3 * (t - r) - 2 * e - i) * o + e * n + t } this.points = e; var r, i, n, o, a, s, h, l, c, u = [], E = { x: 0, y: 0, z: 0 }; this.initFromArray = function(e) { this.points = []; for (var t = 0; t < e.length; t++) this.points[t] = { x: e[t][0], y: e[t][1], z: e[t][2] } }, this.getPoint = function(e) { return r = (this.points.length - 1) * e, i = Math.floor(r), n = r - i, u[0] = 0 === i ? i : i - 1, u[1] = i, u[2] = i > this.points.length - 2 ? this.points.length - 1 : i + 1, u[3] = i > this.points.length - 3 ? this.points.length - 1 : i + 2, s = this.points[u[0]], h = this.points[u[1]], l = this.points[u[2]], c = this.points[u[3]], o = n * n, a = n * o, E.x = t(s.x, h.x, l.x, c.x, n, o, a), E.y = t(s.y, h.y, l.y, c.y, n, o, a), E.z = t(s.z, h.z, l.z, c.z, n, o, a), E }, this.getControlPointsArray = function() { var e, t, r = this.points.length, i = []; for (e = 0; r > e; e++) t = this.points[e], i[e] = [t.x, t.y, t.z]; return i }, this.getLength = function(e) { var t, r, i, n = t = t = 0, o = new THREE.Vector3, a = new THREE.Vector3, s = [], h = 0; for (s[0] = 0, e || (e = 100), r = this.points.length * e, o.copy(this.points[0]), e = 1; r > e; e++) t = e / r, i = this.getPoint(t), a.copy(i), h += a.distanceTo(o), o.copy(i), t *= this.points.length - 1, t = Math.floor(t), t != n && (s[t] = h, n = t); return s[s.length] = h, { chunks: s, total: h } }, this.reparametrizeByArcLength = function(e) { var t, r, i, n, o, a, s = [], h = new THREE.Vector3, l = this.getLength(); for (s.push(h.copy(this.points[0]).clone()), t = 1; t < this.points.length; t++) { for (r = l.chunks[t] - l.chunks[t - 1], a = Math.ceil(e * r / l.total), n = (t - 1) / (this.points.length - 1), o = t / (this.points.length - 1), r = 1; a - 1 > r; r++) i = n + 1 / a * r * (o - n), i = this.getPoint(i), s.push(h.copy(i).clone()); s.push(h.copy(this.points[t]).clone()) } this.points = s } }, THREE.Triangle = function(e, t, r) { this.a = void 0 !== e ? e : new THREE.Vector3, this.b = void 0 !== t ? t : new THREE.Vector3, this.c = void 0 !== r ? r : new THREE.Vector3 }, THREE.Triangle.normal = function() { var e = new THREE.Vector3; return function(t, r, i, n) { return n = n || new THREE.Vector3, n.subVectors(i, r), e.subVectors(t, r), n.cross(e), t = n.lengthSq(), t > 0 ? n.multiplyScalar(1 / Math.sqrt(t)) : n.set(0, 0, 0) } }(), THREE.Triangle.barycoordFromPoint = function() { var e = new THREE.Vector3, t = new THREE.Vector3, r = new THREE.Vector3; return function(i, n, o, a, s) { e.subVectors(a, n), t.subVectors(o, n), r.subVectors(i, n), i = e.dot(e), n = e.dot(t), o = e.dot(r); var h = t.dot(t); a = t.dot(r); var l = i * h - n * n; return s = s || new THREE.Vector3, 0 == l ? s.set(-2, -1, -1) : (l = 1 / l, h = (h * o - n * a) * l, i = (i * a - n * o) * l, s.set(1 - h - i, i, h)) } }(), THREE.Triangle.containsPoint = function() { var e = new THREE.Vector3; return function(t, r, i, n) { return t = THREE.Triangle.barycoordFromPoint(t, r, i, n, e), 0 <= t.x && 0 <= t.y && 1 >= t.x + t.y } }(), THREE.Triangle.prototype = { constructor: THREE.Triangle, set: function(e, t, r) { return this.a.copy(e), this.b.copy(t), this.c.copy(r), this }, setFromPointsAndIndices: function(e, t, r, i) { return this.a.copy(e[t]), this.b.copy(e[r]), this.c.copy(e[i]), this }, copy: function(e) { return this.a.copy(e.a), this.b.copy(e.b), this.c.copy(e.c), this }, area: function() { var e = new THREE.Vector3, t = new THREE.Vector3; return function() { return e.subVectors(this.c, this.b), t.subVectors(this.a, this.b), .5 * e.cross(t).length() } }(), midpoint: function(e) { return (e || new THREE.Vector3).addVectors(this.a, this.b).add(this.c).multiplyScalar(1 / 3) }, normal: function(e) { return THREE.Triangle.normal(this.a, this.b, this.c, e) }, plane: function(e) { return (e || new THREE.Plane).setFromCoplanarPoints(this.a, this.b, this.c) }, barycoordFromPoint: function(e, t) { return THREE.Triangle.barycoordFromPoint(e, this.a, this.b, this.c, t) }, containsPoint: function(e) { return THREE.Triangle.containsPoint(e, this.a, this.b, this.c) }, equals: function(e) { return e.a.equals(this.a) && e.b.equals(this.b) && e.c.equals(this.c) }, clone: function() { return (new THREE.Triangle).copy(this) } }, THREE.Clock = function(e) { this.autoStart = void 0 !== e ? e : !0, this.elapsedTime = this.oldTime = this.startTime = 0, this.running = !1 }, THREE.Clock.prototype = { constructor: THREE.Clock, start: function() { this.oldTime = this.startTime = void 0 !== self.performance && void 0 !== self.performance.now ? self.performance.now() : Date.now(), this.running = !0 }, stop: function() { this.getElapsedTime(), this.running = !1 }, getElapsedTime: function() { return this.getDelta(), this.elapsedTime }, getDelta: function() { var e = 0; if (this.autoStart && !this.running && this.start(), this.running) { var t = void 0 !== self.performance && void 0 !== self.performance.now ? self.performance.now() : Date.now(), e = .001 * (t - this.oldTime); this.oldTime = t, this.elapsedTime += e } return e } }, THREE.EventDispatcher = function() {}, THREE.EventDispatcher.prototype = { constructor: THREE.EventDispatcher, apply: function(e) { e.addEventListener = THREE.EventDispatcher.prototype.addEventListener, e.hasEventListener = THREE.EventDispatcher.prototype.hasEventListener, e.removeEventListener = THREE.EventDispatcher.prototype.removeEventListener, e.dispatchEvent = THREE.EventDispatcher.prototype.dispatchEvent }, addEventListener: function(e, t) { void 0 === this._listeners && (this._listeners = {}); var r = this._listeners; void 0 === r[e] && (r[e] = []), -1 === r[e].indexOf(t) && r[e].push(t) }, hasEventListener: function(e, t) { if (void 0 === this._listeners) return !1; var r = this._listeners; return void 0 !== r[e] && -1 !== r[e].indexOf(t) ? !0 : !1 }, removeEventListener: function(e, t) { if (void 0 !== this._listeners) { var r = this._listeners[e]; if (void 0 !== r) { var i = r.indexOf(t); - 1 !== i && r.splice(i, 1) } } }, dispatchEvent: function(e) { if (void 0 !== this._listeners) { var t = this._listeners[e.type]; if (void 0 !== t) { e.target = this; for (var r = [], i = t.length, n = 0; i > n; n++) r[n] = t[n]; for (n = 0; i > n; n++) r[n].call(this, e) } } } }, function(e) { e.Raycaster = function(t, r, i, n) { this.ray = new e.Ray(t, r), this.near = i || 0, this.far = n || 1 / 0, this.params = { Sprite: {}, Mesh: {}, PointCloud: { threshold: 1 }, LOD: {}, Line: {} } }; var t = function(e, t) { return e.distance - t.distance }, r = function(e, t, i, n) { if (e.raycast(t, i), !0 === n) { e = e.children, n = 0; for (var o = e.length; o > n; n++) r(e[n], t, i, !0) } }; e.Raycaster.prototype = { constructor: e.Raycaster, precision: 1e-4, linePrecision: 1, set: function(e, t) { this.ray.set(e, t) }, setFromCamera: function(t, r) { r instanceof e.PerspectiveCamera ? (this.ray.origin.copy(r.position), this.ray.direction.set(t.x, t.y, .5).unproject(r).sub(r.position).normalize()) : r instanceof e.OrthographicCamera ? (this.ray.origin.set(t.x, t.y, -1).unproject(r), this.ray.direction.set(0, 0, -1).transformDirection(r.matrixWorld)) : e.error("THREE.Raycaster: Unsupported camera type.") }, intersectObject: function(e, i) { var n = []; return r(e, this, n, i), n.sort(t), n }, intersectObjects: function(i, n) { var o = []; if (!1 == i instanceof Array) return e.warn("THREE.Raycaster.intersectObjects: objects is not an Array."), o; for (var a = 0, s = i.length; s > a; a++) r(i[a], this, o, n); return o.sort(t), o } } }(THREE), THREE.Object3D = function() { Object.defineProperty(this, "id", { value: THREE.Object3DIdCount++ }), this.uuid = THREE.Math.generateUUID(), this.name = "", this.type = "Object3D", this.parent = void 0, this.children = [], this.up = THREE.Object3D.DefaultUp.clone(); var e = new THREE.Vector3, t = new THREE.Euler, r = new THREE.Quaternion, i = new THREE.Vector3(1, 1, 1); t.onChange(function() { r.setFromEuler(t, !1) }), r.onChange(function() { t.setFromQuaternion(r, void 0, !1) }), Object.defineProperties(this, { position: { enumerable: !0, value: e }, rotation: { enumerable: !0, value: t }, quaternion: { enumerable: !0, value: r }, scale: { enumerable: !0, value: i } }), this.rotationAutoUpdate = !0, this.matrix = new THREE.Matrix4, this.matrixWorld = new THREE.Matrix4, this.matrixAutoUpdate = !0, this.matrixWorldNeedsUpdate = !1, this.visible = !0, this.receiveShadow = this.castShadow = !1, this.frustumCulled = !0, this.renderOrder = 0, this.userData = {} }, THREE.Object3D.DefaultUp = new THREE.Vector3(0, 1, 0), THREE.Object3D.prototype = { constructor: THREE.Object3D, get eulerOrder() { return THREE.warn("THREE.Object3D: .eulerOrder has been moved to .rotation.order."), this.rotation.order }, set eulerOrder(e) { THREE.warn("THREE.Object3D: .eulerOrder has been moved to .rotation.order."), this.rotation.order = e }, get useQuaternion() { THREE.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.") }, set useQuaternion(e) { THREE.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.") }, applyMatrix: function(e) { this.matrix.multiplyMatrices(e, this.matrix), this.matrix.decompose(this.position, this.quaternion, this.scale) }, setRotationFromAxisAngle: function(e, t) { this.quaternion.setFromAxisAngle(e, t) }, setRotationFromEuler: function(e) { this.quaternion.setFromEuler(e, !0) }, setRotationFromMatrix: function(e) { this.quaternion.setFromRotationMatrix(e) }, setRotationFromQuaternion: function(e) { this.quaternion.copy(e) }, rotateOnAxis: function() { var e = new THREE.Quaternion; return function(t, r) { return e.setFromAxisAngle(t, r), this.quaternion.multiply(e), this } }(), rotateX: function() { var e = new THREE.Vector3(1, 0, 0); return function(t) { return this.rotateOnAxis(e, t) } }(), rotateY: function() { var e = new THREE.Vector3(0, 1, 0); return function(t) { return this.rotateOnAxis(e, t) } }(), rotateZ: function() { var e = new THREE.Vector3(0, 0, 1); return function(t) { return this.rotateOnAxis(e, t) } }(), translateOnAxis: function() { var e = new THREE.Vector3; return function(t, r) { return e.copy(t).applyQuaternion(this.quaternion), this.position.add(e.multiplyScalar(r)), this } }(), translate: function(e, t) { return THREE.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."), this.translateOnAxis(t, e) }, translateX: function() { var e = new THREE.Vector3(1, 0, 0); return function(t) { return this.translateOnAxis(e, t) } }(), translateY: function() { var e = new THREE.Vector3(0, 1, 0); return function(t) { return this.translateOnAxis(e, t) } }(), translateZ: function() { var e = new THREE.Vector3(0, 0, 1); return function(t) { return this.translateOnAxis(e, t) } }(), localToWorld: function(e) { return e.applyMatrix4(this.matrixWorld) }, worldToLocal: function() { var e = new THREE.Matrix4; return function(t) { return t.applyMatrix4(e.getInverse(this.matrixWorld)) } }(), lookAt: function() { var e = new THREE.Matrix4; return function(t) { e.lookAt(t, this.position, this.up), this.quaternion.setFromRotationMatrix(e) } }(), add: function(e) { if (1 < arguments.length) { for (var t = 0; t < arguments.length; t++) this.add(arguments[t]); return this } return e === this ? (THREE.error("THREE.Object3D.add: object can't be added as a child of itself.", e), this) : (e instanceof THREE.Object3D ? (void 0 !== e.parent && e.parent.remove(e), e.parent = this, e.dispatchEvent({ type: "added" }), this.children.push(e)) : THREE.error("THREE.Object3D.add: object not an instance of THREE.Object3D.", e), this) }, remove: function(e) { if (1 < arguments.length) for (var t = 0; t < arguments.length; t++) this.remove(arguments[t]); t = this.children.indexOf(e), -1 !== t && (e.parent = void 0, e.dispatchEvent({ type: "removed" }), this.children.splice(t, 1)) }, getChildByName: function(e) { return THREE.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."), this.getObjectByName(e) }, getObjectById: function(e) { return this.getObjectByProperty("id", e) }, getObjectByName: function(e) { return this.getObjectByProperty("name", e) }, getObjectByProperty: function(e, t) { if (this[e] === t) return this; for (var r = 0, i = this.children.length; i > r; r++) { var n = this.children[r].getObjectByProperty(e, t); if (void 0 !== n) return n } }, getWorldPosition: function(e) { return e = e || new THREE.Vector3, this.updateMatrixWorld(!0), e.setFromMatrixPosition(this.matrixWorld) }, getWorldQuaternion: function() { var e = new THREE.Vector3, t = new THREE.Vector3; return function(r) { return r = r || new THREE.Quaternion, this.updateMatrixWorld(!0), this.matrixWorld.decompose(e, r, t), r } }(), getWorldRotation: function() { var e = new THREE.Quaternion; return function(t) { return t = t || new THREE.Euler, this.getWorldQuaternion(e), t.setFromQuaternion(e, this.rotation.order, !1) } }(), getWorldScale: function() { var e = new THREE.Vector3, t = new THREE.Quaternion; return function(r) { return r = r || new THREE.Vector3, this.updateMatrixWorld(!0), this.matrixWorld.decompose(e, t, r), r } }(), getWorldDirection: function() { var e = new THREE.Quaternion; return function(t) { return t = t || new THREE.Vector3, this.getWorldQuaternion(e), t.set(0, 0, 1).applyQuaternion(e) } }(), raycast: function() {}, traverse: function(e) { e(this); for (var t = 0, r = this.children.length; r > t; t++) this.children[t].traverse(e) }, traverseVisible: function(e) { if (!1 !== this.visible) { e(this); for (var t = 0, r = this.children.length; r > t; t++) this.children[t].traverseVisible(e) } }, traverseAncestors: function(e) { this.parent && (e(this.parent), this.parent.traverseAncestors(e)) }, updateMatrix: function() { this.matrix.compose(this.position, this.quaternion, this.scale), this.matrixWorldNeedsUpdate = !0 }, updateMatrixWorld: function(e) {!0 === this.matrixAutoUpdate && this.updateMatrix(), (!0 === this.matrixWorldNeedsUpdate || !0 === e) && (void 0 === this.parent ? this.matrixWorld.copy(this.matrix) : this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix), this.matrixWorldNeedsUpdate = !1, e = !0); for (var t = 0, r = this.children.length; r > t; t++) this.children[t].updateMatrixWorld(e) }, toJSON: function() { var e = { metadata: { version: 4.3, type: "Object", generator: "ObjectExporter" } }, t = {}, r = {}, i = function(t) { if (void 0 === e.materials && (e.materials = []), void 0 === r[t.uuid]) { var i = t.toJSON(); delete i.metadata, r[t.uuid] = i, e.materials.push(i) } return t.uuid }, n = function(r) { var o = {}; if (o.uuid = r.uuid, o.type = r.type, "" !== r.name && (o.name = r.name), "{}" !== JSON.stringify(r.userData) && (o.userData = r.userData), !0 !== r.visible && (o.visible = r.visible), r instanceof THREE.PerspectiveCamera) o.fov = r.fov, o.aspect = r.aspect, o.near = r.near, o.far = r.far; else if (r instanceof THREE.OrthographicCamera) o.left = r.left, o.right = r.right, o.top = r.top, o.bottom = r.bottom, o.near = r.near, o.far = r.far; else if (r instanceof THREE.AmbientLight) o.color = r.color.getHex(); else if (r instanceof THREE.DirectionalLight) o.color = r.color.getHex(), o.intensity = r.intensity; else if (r instanceof THREE.PointLight) o.color = r.color.getHex(), o.intensity = r.intensity, o.distance = r.distance, o.decay = r.decay; else if (r instanceof THREE.SpotLight) o.color = r.color.getHex(), o.intensity = r.intensity, o.distance = r.distance, o.angle = r.angle, o.exponent = r.exponent, o.decay = r.decay; else if (r instanceof THREE.HemisphereLight) o.color = r.color.getHex(), o.groundColor = r.groundColor.getHex(); else if (r instanceof THREE.Mesh || r instanceof THREE.Line || r instanceof THREE.PointCloud) { var a = r.geometry; if (void 0 === e.geometries && (e.geometries = []), void 0 === t[a.uuid]) { var s = a.toJSON(); delete s.metadata, t[a.uuid] = s, e.geometries.push(s) } o.geometry = a.uuid, o.material = i(r.material), r instanceof THREE.Line && (o.mode = r.mode) } else r instanceof THREE.Sprite && (o.material = i(r.material)); if (o.matrix = r.matrix.toArray(), 0 < r.children.length) for (o.children = [], a = 0; a < r.children.length; a++) o.children.push(n(r.children[a])); return o }; return e.object = n(this), e }, clone: function(e, t) { if (void 0 === e && (e = new THREE.Object3D), void 0 === t && (t = !0), e.name = this.name, e.up.copy(this.up), e.position.copy(this.position), e.quaternion.copy(this.quaternion), e.scale.copy(this.scale), e.rotationAutoUpdate = this.rotationAutoUpdate, e.matrix.copy(this.matrix), e.matrixWorld.copy(this.matrixWorld), e.matrixAutoUpdate = this.matrixAutoUpdate, e.matrixWorldNeedsUpdate = this.matrixWorldNeedsUpdate, e.visible = this.visible, e.castShadow = this.castShadow, e.receiveShadow = this.receiveShadow, e.frustumCulled = this.frustumCulled, e.userData = JSON.parse(JSON.stringify(this.userData)), !0 === t) for (var r = 0; r < this.children.length; r++) e.add(this.children[r].clone()); return e } }, THREE.EventDispatcher.prototype.apply(THREE.Object3D.prototype), THREE.Object3DIdCount = 0, THREE.Face3 = function(e, t, r, i, n, o) { this.a = e, this.b = t, this.c = r, this.normal = i instanceof THREE.Vector3 ? i : new THREE.Vector3, this.vertexNormals = i instanceof Array ? i : [], this.color = n instanceof THREE.Color ? n : new THREE.Color, this.vertexColors = n instanceof Array ? n : [], this.vertexTangents = [], this.materialIndex = void 0 !== o ? o : 0 }, THREE.Face3.prototype = { constructor: THREE.Face3, clone: function() { var e = new THREE.Face3(this.a, this.b, this.c); e.normal.copy(this.normal), e.color.copy(this.color), e.materialIndex = this.materialIndex; for (var t = 0, r = this.vertexNormals.length; r > t; t++) e.vertexNormals[t] = this.vertexNormals[t].clone(); for (t = 0, r = this.vertexColors.length; r > t; t++) e.vertexColors[t] = this.vertexColors[t].clone(); for (t = 0, r = this.vertexTangents.length; r > t; t++) e.vertexTangents[t] = this.vertexTangents[t].clone(); return e } }, THREE.Face4 = function(e, t, r, i, n, o, a) { return THREE.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead."), new THREE.Face3(e, t, r, n, o, a) }, THREE.BufferAttribute = function(e, t) { this.array = e, this.itemSize = t, this.needsUpdate = !1 }, THREE.BufferAttribute.prototype = { constructor: THREE.BufferAttribute, get length() { return this.array.length }, copyAt: function(e, t, r) { e *= this.itemSize, r *= t.itemSize; for (var i = 0, n = this.itemSize; n > i; i++) this.array[e + i] = t.array[r + i]; return this }, set: function(e, t) { return void 0 === t && (t = 0), this.array.set(e, t), this }, setX: function(e, t) { return this.array[e * this.itemSize] = t, this }, setY: function(e, t) { return this.array[e * this.itemSize + 1] = t, this }, setZ: function(e, t) { return this.array[e * this.itemSize + 2] = t, this }, setXY: function(e, t, r) { return e *= this.itemSize, this.array[e] = t, this.array[e + 1] = r, this }, setXYZ: function(e, t, r, i) { return e *= this.itemSize, this.array[e] = t, this.array[e + 1] = r, this.array[e + 2] = i, this }, setXYZW: function(e, t, r, i, n) { return e *= this.itemSize, this.array[e] = t, this.array[e + 1] = r, this.array[e + 2] = i, this.array[e + 3] = n, this }, clone: function() { return new THREE.BufferAttribute(new this.array.constructor(this.array), this.itemSize) } }, THREE.Int8Attribute = function(e, t) { return THREE.warn("THREE.Int8Attribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead."), new THREE.BufferAttribute(e, t) }, THREE.Uint8Attribute = function(e, t) { return THREE.warn("THREE.Uint8Attribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead."), new THREE.BufferAttribute(e, t) }, THREE.Uint8ClampedAttribute = function(e, t) { return THREE.warn("THREE.Uint8ClampedAttribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead."), new THREE.BufferAttribute(e, t) }, THREE.Int16Attribute = function(e, t) { return THREE.warn("THREE.Int16Attribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead."), new THREE.BufferAttribute(e, t) }, THREE.Uint16Attribute = function(e, t) { return THREE.warn("THREE.Uint16Attribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead."), new THREE.BufferAttribute(e, t) }, THREE.Int32Attribute = function(e, t) { return THREE.warn("THREE.Int32Attribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead."), new THREE.BufferAttribute(e, t) }, THREE.Uint32Attribute = function(e, t) { return THREE.warn("THREE.Uint32Attribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead."), new THREE.BufferAttribute(e, t) }, THREE.Float32Attribute = function(e, t) { return THREE.warn("THREE.Float32Attribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead."), new THREE.BufferAttribute(e, t) }, THREE.Float64Attribute = function(e, t) { return THREE.warn("THREE.Float64Attribute has been removed. Use THREE.BufferAttribute( array, itemSize ) instead."), new THREE.BufferAttribute(e, t) }, THREE.DynamicBufferAttribute = function(e, t) { THREE.BufferAttribute.call(this, e, t), this.updateRange = { offset: 0, count: -1 } }, THREE.DynamicBufferAttribute.prototype = Object.create(THREE.BufferAttribute.prototype), THREE.DynamicBufferAttribute.prototype.constructor = THREE.DynamicBufferAttribute, THREE.DynamicBufferAttribute.prototype.clone = function() { return new THREE.DynamicBufferAttribute(new this.array.constructor(this.array), this.itemSize) }, THREE.BufferGeometry = function() { Object.defineProperty(this, "id", { value: THREE.GeometryIdCount++ }), this.uuid = THREE.Math.generateUUID(), this.name = "", this.type = "BufferGeometry", this.attributes = {}, this.attributesKeys = [], this.offsets = this.drawcalls = [], this.boundingSphere = this.boundingBox = null }, THREE.BufferGeometry.prototype = { constructor: THREE.BufferGeometry, addAttribute: function(e, t, r) {!1 == t instanceof THREE.BufferAttribute ? (THREE.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."), this.attributes[e] = { array: t, itemSize: r }) : (this.attributes[e] = t, this.attributesKeys = Object.keys(this.attributes)) }, getAttribute: function(e) { return this.attributes[e] }, addDrawCall: function(e, t, r) { this.drawcalls.push({ start: e, count: t, index: void 0 !== r ? r : 0 }) }, applyMatrix: function(e) { var t = this.attributes.position; void 0 !== t && (e.applyToVector3Array(t.array), t.needsUpdate = !0), t = this.attributes.normal, void 0 !== t && ((new THREE.Matrix3).getNormalMatrix(e).applyToVector3Array(t.array), t.needsUpdate = !0), null !== this.boundingBox && this.computeBoundingBox(), null !== this.boundingSphere && this.computeBoundingSphere() }, center: function() { this.computeBoundingBox(); var e = this.boundingBox.center().negate(); return this.applyMatrix((new THREE.Matrix4).setPosition(e)), e }, fromGeometry: function(e, t) { t = t || { vertexColors: THREE.NoColors }; var r = e.vertices, i = e.faces, n = e.faceVertexUvs, o = t.vertexColors, a = 0 < n[0].length, s = 3 == i[0].vertexNormals.length, h = new Float32Array(9 * i.length); this.addAttribute("position", new THREE.BufferAttribute(h, 3)); var l = new Float32Array(9 * i.length); if (this.addAttribute("normal", new THREE.BufferAttribute(l, 3)), o !== THREE.NoColors) { var c = new Float32Array(9 * i.length); this.addAttribute("color", new THREE.BufferAttribute(c, 3)) } if (!0 === a) { var u = new Float32Array(6 * i.length); this.addAttribute("uv", new THREE.BufferAttribute(u, 2)) } for (var E = 0, p = 0, d = 0; E < i.length; E++, p += 6, d += 9) { var f = i[E], m = r[f.a], T = r[f.b], g = r[f.c]; h[d] = m.x, h[d + 1] = m.y, h[d + 2] = m.z, h[d + 3] = T.x, h[d + 4] = T.y, h[d + 5] = T.z, h[d + 6] = g.x, h[d + 7] = g.y, h[d + 8] = g.z, !0 === s ? (m = f.vertexNormals[0], T = f.vertexNormals[1], g = f.vertexNormals[2], l[d] = m.x, l[d + 1] = m.y, l[d + 2] = m.z, l[d + 3] = T.x, l[d + 4] = T.y, l[d + 5] = T.z, l[d + 6] = g.x, l[d + 7] = g.y, l[d + 8] = g.z) : (m = f.normal, l[d] = m.x, l[d + 1] = m.y, l[d + 2] = m.z, l[d + 3] = m.x, l[d + 4] = m.y, l[d + 5] = m.z, l[d + 6] = m.x, l[d + 7] = m.y, l[d + 8] = m.z), o === THREE.FaceColors ? (f = f.color, c[d] = f.r, c[d + 1] = f.g, c[d + 2] = f.b, c[d + 3] = f.r, c[d + 4] = f.g, c[d + 5] = f.b, c[d + 6] = f.r, c[d + 7] = f.g, c[d + 8] = f.b) : o === THREE.VertexColors && (m = f.vertexColors[0], T = f.vertexColors[1], f = f.vertexColors[2], c[d] = m.r, c[d + 1] = m.g, c[d + 2] = m.b, c[d + 3] = T.r, c[d + 4] = T.g, c[d + 5] = T.b, c[d + 6] = f.r, c[d + 7] = f.g, c[d + 8] = f.b), !0 === a && (f = n[0][E][0], m = n[0][E][1], T = n[0][E][2], u[p] = f.x, u[p + 1] = f.y, u[p + 2] = m.x, u[p + 3] = m.y, u[p + 4] = T.x, u[p + 5] = T.y) } return this.computeBoundingSphere(), this }, computeBoundingBox: function() { var e = new THREE.Vector3; return function() { null === this.boundingBox && (this.boundingBox = new THREE.Box3); var t = this.attributes.position.array; if (t) { var r = this.boundingBox; r.makeEmpty(); for (var i = 0, n = t.length; n > i; i += 3) e.set(t[i], t[i + 1], t[i + 2]), r.expandByPoint(e) }(void 0 === t || 0 === t.length) && (this.boundingBox.min.set(0, 0, 0), this.boundingBox.max.set(0, 0, 0)), (isNaN(this.boundingBox.min.x) || isNaN(this.boundingBox.min.y) || isNaN(this.boundingBox.min.z)) && THREE.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.') } }(), computeBoundingSphere: function() { var e = new THREE.Box3, t = new THREE.Vector3; return function() { null === this.boundingSphere && (this.boundingSphere = new THREE.Sphere); var r = this.attributes.position.array; if (r) { e.makeEmpty(); for (var i = this.boundingSphere.center, n = 0, o = r.length; o > n; n += 3) t.set(r[n], r[n + 1], r[n + 2]), e.expandByPoint(t); e.center(i); for (var a = 0, n = 0, o = r.length; o > n; n += 3) t.set(r[n], r[n + 1], r[n + 2]), a = Math.max(a, i.distanceToSquared(t)); this.boundingSphere.radius = Math.sqrt(a), isNaN(this.boundingSphere.radius) && THREE.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.') } } }(), computeFaceNormals: function() {}, computeVertexNormals: function() { var e = this.attributes; if (e.position) { var t = e.position.array; if (void 0 === e.normal) this.addAttribute("normal", new THREE.BufferAttribute(new Float32Array(t.length), 3)); else for (var r = e.normal.array, i = 0, n = r.length; n > i; i++) r[i] = 0; var o, a, s, r = e.normal.array, h = new THREE.Vector3, l = new THREE.Vector3, c = new THREE.Vector3, u = new THREE.Vector3, E = new THREE.Vector3; if (e.index) for (var p = e.index.array, d = 0 < this.offsets.length ? this.offsets : [{ start: 0, count: p.length, index: 0 }], f = 0, m = d.length; m > f; ++f) { n = d[f].start, o = d[f].count; for (var T = d[f].index, i = n, n = n + o; n > i; i += 3) o = 3 * (T + p[i]), a = 3 * (T + p[i + 1]), s = 3 * (T + p[i + 2]), h.fromArray(t, o), l.fromArray(t, a), c.fromArray(t, s), u.subVectors(c, l), E.subVectors(h, l), u.cross(E), r[o] += u.x, r[o + 1] += u.y, r[o + 2] += u.z, r[a] += u.x, r[a + 1] += u.y, r[a + 2] += u.z, r[s] += u.x, r[s + 1] += u.y, r[s + 2] += u.z } else for (i = 0, n = t.length; n > i; i += 9) h.fromArray(t, i), l.fromArray(t, i + 3), c.fromArray(t, i + 6), u.subVectors(c, l), E.subVectors(h, l), u.cross(E), r[i] = u.x, r[i + 1] = u.y, r[i + 2] = u.z, r[i + 3] = u.x, r[i + 4] = u.y, r[i + 5] = u.z, r[i + 6] = u.x, r[i + 7] = u.y, r[i + 8] = u.z; this.normalizeNormals(), e.normal.needsUpdate = !0 } }, computeTangents: function() { function e(e, t, r) { M.fromArray(i, 3 * e), S.fromArray(i, 3 * t), C.fromArray(i, 3 * r), A.fromArray(o, 2 * e), L.fromArray(o, 2 * t), P.fromArray(o, 2 * r), u = S.x - M.x, E = C.x - M.x, p = S.y - M.y, d = C.y - M.y, f = S.z - M.z, m = C.z - M.z, T = L.x - A.x, g = P.x - A.x, R = L.y - A.y, y = P.y - A.y, v = 1 / (T * y - g * R), F.set((y * u - R * E) * v, (y * p - R * d) * v, (y * f - R * m) * v), B.set((T * E - g * u) * v, (T * d - g * p) * v, (T * m - g * f) * v), h[e].add(F), h[t].add(F), h[r].add(F), l[e].add(B), l[t].add(B), l[r].add(B) } function t(e) { G.fromArray(n, 3 * e), I.copy(G), z = h[e], N.copy(z), N.sub(G.multiplyScalar(G.dot(z))).normalize(), O.crossVectors(I, z), k = O.dot(l[e]), V = 0 > k ? -1 : 1, s[4 * e] = N.x, s[4 * e + 1] = N.y, s[4 * e + 2] = N.z, s[4 * e + 3] = V } if (void 0 === this.attributes.index || void 0 === this.attributes.position || void 0 === this.attributes.normal || void 0 === this.attributes.uv) THREE.warn("THREE.BufferGeometry: Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()"); else { var r = this.attributes.index.array, i = this.attributes.position.array, n = this.attributes.normal.array, o = this.attributes.uv.array, a = i.length / 3; void 0 === this.attributes.tangent && this.addAttribute("tangent", new THREE.BufferAttribute(new Float32Array(4 * a), 4)); for (var s = this.attributes.tangent.array, h = [], l = [], c = 0; a > c; c++) h[c] = new THREE.Vector3, l[c] = new THREE.Vector3; var u, E, p, d, f, m, T, g, R, y, v, H, x, b, w, _, M = new THREE.Vector3, S = new THREE.Vector3, C = new THREE.Vector3, A = new THREE.Vector2, L = new THREE.Vector2, P = new THREE.Vector2, F = new THREE.Vector3, B = new THREE.Vector3; 0 === this.drawcalls.length && this.addDrawCall(0, r.length, 0); var U = this.drawcalls, c = 0; for (x = U.length; x > c; ++c) { H = U[c].start, b = U[c].count; var D = U[c].index, a = H; for (H += b; H > a; a += 3) b = D + r[a], w = D + r[a + 1], _ = D + r[a + 2], e(b, w, _) } var V, z, k, N = new THREE.Vector3, O = new THREE.Vector3, G = new THREE.Vector3, I = new THREE.Vector3, c = 0; for (x = U.length; x > c; ++c) for (H = U[c].start, b = U[c].count, D = U[c].index, a = H, H += b; H > a; a += 3) b = D + r[a], w = D + r[a + 1], _ = D + r[a + 2], t(b), t(w), t(_) } }, computeOffsets: function(e) { void 0 === e && (e = 65535); for (var t = this.attributes.index.array, r = this.attributes.position.array, i = t.length / 3, n = new Uint16Array(t.length), o = 0, a = 0, s = [{ start: 0, count: 0, index: 0 }], h = s[0], l = 0, c = 0, u = new Int32Array(6), E = new Int32Array(r.length), p = new Int32Array(r.length), d = 0; d < r.length; d++) E[d] = -1, p[d] = -1; for (r = 0; i > r; r++) { for (var f = c = 0; 3 > f; f++) d = t[3 * r + f], -1 == E[d] ? (u[2 * f] = d, u[2 * f + 1] = -1, c++) : E[d] < h.index ? (u[2 * f] = d, u[2 * f + 1] = -1, l++) : (u[2 * f] = d, u[2 * f + 1] = E[d]); if (a + c > h.index + e) for (h = { start: o, count: 0, index: a }, s.push(h), c = 0; 6 > c; c += 2) f = u[c + 1], f > -1 && f < h.index && (u[c + 1] = -1); for (c = 0; 6 > c; c += 2) d = u[c], f = u[c + 1], -1 === f && (f = a++), E[d] = f, p[f] = d, n[o++] = f - h.index, h.count++ } return this.reorderBuffers(n, p, a), this.drawcalls = this.offsets = s }, merge: function(e, t) { if (!1 != e instanceof THREE.BufferGeometry) { void 0 === t && (t = 0); var r, i = this.attributes; for (r in i) if (void 0 !== e.attributes[r]) for (var n = i[r].array, o = e.attributes[r], a = o.array, s = 0, o = o.itemSize * t; s < a.length; s++, o++) n[o] = a[s]; return this } THREE.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.", e) }, normalizeNormals: function() { for (var e, t, r, i = this.attributes.normal.array, n = 0, o = i.length; o > n; n += 3) e = i[n], t = i[n + 1], r = i[n + 2], e = 1 / Math.sqrt(e * e + t * t + r * r), i[n] *= e, i[n + 1] *= e, i[n + 2] *= e }, reorderBuffers: function(e, t, r) { var i, n = {}; for (i in this.attributes) "index" != i && (n[i] = new this.attributes[i].array.constructor(this.attributes[i].itemSize * r)); for (var o = 0; r > o; o++) { var a = t[o]; for (i in this.attributes) if ("index" != i) for (var s = this.attributes[i].array, h = this.attributes[i].itemSize, l = n[i], c = 0; h > c; c++) l[o * h + c] = s[a * h + c] } this.attributes.index.array = e; for (i in this.attributes) "index" != i && (this.attributes[i].array = n[i], this.attributes[i].numItems = this.attributes[i].itemSize * r) }, toJSON: function() { var e, t = { metadata: { version: 4, type: "BufferGeometry", generator: "BufferGeometryExporter" }, uuid: this.uuid, type: this.type, data: { attributes: {} } }, r = this.attributes, i = this.offsets, n = this.boundingSphere; for (e in r) { var o = r[e], a = Array.prototype.slice.call(o.array); t.data.attributes[e] = { itemSize: o.itemSize, type: o.array.constructor.name, array: a } } return 0 < i.length && (t.data.offsets = JSON.parse(JSON.stringify(i))), null !== n && (t.data.boundingSphere = { center: n.center.toArray(), radius: n.radius }), t }, clone: function() { var e, t = new THREE.BufferGeometry; for (e in this.attributes) t.addAttribute(e, this.attributes[e].clone()); e = 0; for (var r = this.offsets.length; r > e; e++) { var i = this.offsets[e]; t.offsets.push({ start: i.start, index: i.index, count: i.count }) } return t }, dispose: function() { this.dispatchEvent({ type: "dispose" }) } }, THREE.EventDispatcher.prototype.apply(THREE.BufferGeometry.prototype), THREE.Geometry = function() { Object.defineProperty(this, "id", { value: THREE.GeometryIdCount++ }), this.uuid = THREE.Math.generateUUID(), this.name = "", this.type = "Geometry", this.vertices = [], this.colors = [], this.faces = [], this.faceVertexUvs = [ [] ], this.morphTargets = [], this.morphColors = [], this.morphNormals = [], this.skinWeights = [], this.skinIndices = [], this.lineDistances = [], this.boundingSphere = this.boundingBox = null, this.hasTangents = !1, this.dynamic = !0, this.groupsNeedUpdate = this.lineDistancesNeedUpdate = this.colorsNeedUpdate = this.tangentsNeedUpdate = this.normalsNeedUpdate = this.uvsNeedUpdate = this.elementsNeedUpdate = this.verticesNeedUpdate = !1 }, THREE.Geometry.prototype = { constructor: THREE.Geometry, applyMatrix: function(e) { for (var t = (new THREE.Matrix3).getNormalMatrix(e), r = 0, i = this.vertices.length; i > r; r++) this.vertices[r].applyMatrix4(e); for (r = 0, i = this.faces.length; i > r; r++) { e = this.faces[r], e.normal.applyMatrix3(t).normalize(); for (var n = 0, o = e.vertexNormals.length; o > n; n++) e.vertexNormals[n].applyMatrix3(t).normalize() } null !== this.boundingBox && this.computeBoundingBox(), null !== this.boundingSphere && this.computeBoundingSphere(), this.normalsNeedUpdate = this.verticesNeedUpdate = !0 }, fromBufferGeometry: function(e) { for (var t = this, r = e.attributes, i = r.position.array, n = void 0 !== r.index ? r.index.array : void 0, o = void 0 !== r.normal ? r.normal.array : void 0, a = void 0 !== r.color ? r.color.array : void 0, s = void 0 !== r.uv ? r.uv.array : void 0, h = [], l = [], c = r = 0; r < i.length; r += 3, c += 2) t.vertices.push(new THREE.Vector3(i[r], i[r + 1], i[r + 2])), void 0 !== o && h.push(new THREE.Vector3(o[r], o[r + 1], o[r + 2])), void 0 !== a && t.colors.push(new THREE.Color(a[r], a[r + 1], a[r + 2])), void 0 !== s && l.push(new THREE.Vector2(s[c], s[c + 1])); var u = function(e, r, i) { var n = void 0 !== o ? [h[e].clone(), h[r].clone(), h[i].clone()] : [], c = void 0 !== a ? [t.colors[e].clone(), t.colors[r].clone(), t.colors[i].clone()] : []; t.faces.push(new THREE.Face3(e, r, i, n, c)), void 0 !== s && t.faceVertexUvs[0].push([l[e].clone(), l[r].clone(), l[i].clone()]) }; if (void 0 !== n) if (i = e.drawcalls, 0 < i.length) for (r = 0; r < i.length; r++) for (var c = i[r], E = c.start, p = c.count, d = c.index, c = E, E = E + p; E > c; c += 3) u(d + n[c], d + n[c + 1], d + n[c + 2]); else for (r = 0; r < n.length; r += 3) u(n[r], n[r + 1], n[r + 2]); else for (r = 0; r < i.length / 3; r += 3) u(r, r + 1, r + 2); return this.computeFaceNormals(), null !== e.boundingBox && (this.boundingBox = e.boundingBox.clone()), null !== e.boundingSphere && (this.boundingSphere = e.boundingSphere.clone()), this }, center: function() { this.computeBoundingBox(); var e = this.boundingBox.center().negate(); return this.applyMatrix((new THREE.Matrix4).setPosition(e)), e }, computeFaceNormals: function() { for (var e = new THREE.Vector3, t = new THREE.Vector3, r = 0, i = this.faces.length; i > r; r++) { var n = this.faces[r], o = this.vertices[n.a], a = this.vertices[n.b]; e.subVectors(this.vertices[n.c], a), t.subVectors(o, a), e.cross(t), e.normalize(), n.normal.copy(e) } }, computeVertexNormals: function(e) { var t, r, i; for (i = Array(this.vertices.length), t = 0, r = this.vertices.length; r > t; t++) i[t] = new THREE.Vector3; if (e) { var n, o, a, s = new THREE.Vector3, h = new THREE.Vector3; for (e = 0, t = this.faces.length; t > e; e++) r = this.faces[e], n = this.vertices[r.a], o = this.vertices[r.b], a = this.vertices[r.c], s.subVectors(a, o), h.subVectors(n, o), s.cross(h), i[r.a].add(s), i[r.b].add(s), i[r.c].add(s) } else for (e = 0, t = this.faces.length; t > e; e++) r = this.faces[e], i[r.a].add(r.normal), i[r.b].add(r.normal), i[r.c].add(r.normal); for (t = 0, r = this.vertices.length; r > t; t++) i[t].normalize(); for (e = 0, t = this.faces.length; t > e; e++) r = this.faces[e], r.vertexNormals[0] = i[r.a].clone(), r.vertexNormals[1] = i[r.b].clone(), r.vertexNormals[2] = i[r.c].clone() }, computeMorphNormals: function() { var e, t, r, i, n; for (r = 0, i = this.faces.length; i > r; r++) for (n = this.faces[r], n.__originalFaceNormal ? n.__originalFaceNormal.copy(n.normal) : n.__originalFaceNormal = n.normal.clone(), n.__originalVertexNormals || (n.__originalVertexNormals = []), e = 0, t = n.vertexNormals.length; t > e; e++) n.__originalVertexNormals[e] ? n.__originalVertexNormals[e].copy(n.vertexNormals[e]) : n.__originalVertexNormals[e] = n.vertexNormals[e].clone(); var o = new THREE.Geometry; for (o.faces = this.faces, e = 0, t = this.morphTargets.length; t > e; e++) { if (!this.morphNormals[e]) { this.morphNormals[e] = {}, this.morphNormals[e].faceNormals = [], this.morphNormals[e].vertexNormals = [], n = this.morphNormals[e].faceNormals; var a, s, h = this.morphNormals[e].vertexNormals; for (r = 0, i = this.faces.length; i > r; r++) a = new THREE.Vector3, s = { a: new THREE.Vector3, b: new THREE.Vector3, c: new THREE.Vector3 }, n.push(a), h.push(s) } for (h = this.morphNormals[e], o.vertices = this.morphTargets[e].vertices, o.computeFaceNormals(), o.computeVertexNormals(), r = 0, i = this.faces.length; i > r; r++) n = this.faces[r], a = h.faceNormals[r], s = h.vertexNormals[r], a.copy(n.normal), s.a.copy(n.vertexNormals[0]), s.b.copy(n.vertexNormals[1]), s.c.copy(n.vertexNormals[2]) } for (r = 0, i = this.faces.length; i > r; r++) n = this.faces[r], n.normal = n.__originalFaceNormal, n.vertexNormals = n.__originalVertexNormals }, computeTangents: function() { var e, t, r, i, n, o, a, s, h, l, c, u, E, p, d, f, m, T = [], g = []; r = new THREE.Vector3; var R = new THREE.Vector3, y = new THREE.Vector3, v = new THREE.Vector3, H = new THREE.Vector3; for (e = 0, t = this.vertices.length; t > e; e++) T[e] = new THREE.Vector3, g[e] = new THREE.Vector3; for (e = 0, t = this.faces.length; t > e; e++) n = this.faces[e], o = this.faceVertexUvs[0][e], i = n.a, m = n.b, n = n.c, a = this.vertices[i], s = this.vertices[m], h = this.vertices[n], l = o[0], c = o[1], u = o[2], o = s.x - a.x, E = h.x - a.x, p = s.y - a.y, d = h.y - a.y, s = s.z - a.z, a = h.z - a.z, h = c.x - l.x, f = u.x - l.x, c = c.y - l.y, l = u.y - l.y, u = 1 / (h * l - f * c), r.set((l * o - c * E) * u, (l * p - c * d) * u, (l * s - c * a) * u), R.set((h * E - f * o) * u, (h * d - f * p) * u, (h * a - f * s) * u), T[i].add(r), T[m].add(r), T[n].add(r), g[i].add(R), g[m].add(R), g[n].add(R); for (R = ["a", "b", "c", "d"], e = 0, t = this.faces.length; t > e; e++) for (n = this.faces[e], r = 0; r < Math.min(n.vertexNormals.length, 3); r++) H.copy(n.vertexNormals[r]), i = n[R[r]], m = T[i], y.copy(m), y.sub(H.multiplyScalar(H.dot(m))).normalize(), v.crossVectors(n.vertexNormals[r], m), i = v.dot(g[i]), i = 0 > i ? -1 : 1, n.vertexTangents[r] = new THREE.Vector4(y.x, y.y, y.z, i); this.hasTangents = !0 }, computeLineDistances: function() { for (var e = 0, t = this.vertices, r = 0, i = t.length; i > r; r++) r > 0 && (e += t[r].distanceTo(t[r - 1])), this.lineDistances[r] = e }, computeBoundingBox: function() { null === this.boundingBox && (this.boundingBox = new THREE.Box3), this.boundingBox.setFromPoints(this.vertices) }, computeBoundingSphere: function() { null === this.boundingSphere && (this.boundingSphere = new THREE.Sphere), this.boundingSphere.setFromPoints(this.vertices) }, merge: function(e, t, r) { if (!1 == e instanceof THREE.Geometry) THREE.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.", e); else { var i, n = this.vertices.length, o = this.vertices, a = e.vertices, s = this.faces, h = e.faces, l = this.faceVertexUvs[0]; e = e.faceVertexUvs[0], void 0 === r && (r = 0), void 0 !== t && (i = (new THREE.Matrix3).getNormalMatrix(t)); for (var c = 0, u = a.length; u > c; c++) { var E = a[c].clone(); void 0 !== t && E.applyMatrix4(t), o.push(E) } for (c = 0, u = h.length; u > c; c++) { var p, a = h[c], d = a.vertexNormals, f = a.vertexColors, E = new THREE.Face3(a.a + n, a.b + n, a.c + n); for (E.normal.copy(a.normal), void 0 !== i && E.normal.applyMatrix3(i).normalize(), t = 0, o = d.length; o > t; t++) p = d[t].clone(), void 0 !== i && p.applyMatrix3(i).normalize(), E.vertexNormals.push(p); for (E.color.copy(a.color), t = 0, o = f.length; o > t; t++) p = f[t], E.vertexColors.push(p.clone()); E.materialIndex = a.materialIndex + r, s.push(E) } for (c = 0, u = e.length; u > c; c++) if (r = e[c], i = [], void 0 !== r) { for (t = 0, o = r.length; o > t; t++) i.push(r[t].clone()); l.push(i) } } }, mergeMesh: function(e) {!1 == e instanceof THREE.Mesh ? THREE.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.", e) : (e.matrixAutoUpdate && e.updateMatrix(), this.merge(e.geometry, e.matrix)) }, mergeVertices: function() { var e, t, r, i = {}, n = [], o = [], a = Math.pow(10, 4); for (t = 0, r = this.vertices.length; r > t; t++) e = this.vertices[t], e = Math.round(e.x * a) + "_" + Math.round(e.y * a) + "_" + Math.round(e.z * a), void 0 === i[e] ? (i[e] = t, n.push(this.vertices[t]), o[t] = n.length - 1) : o[t] = o[i[e]]; for (i = [], t = 0, r = this.faces.length; r > t; t++) for (a = this.faces[t], a.a = o[a.a], a.b = o[a.b], a.c = o[a.c], a = [a.a, a.b, a.c], e = 0; 3 > e; e++) if (a[e] == a[(e + 1) % 3]) { i.push(t); break } for (t = i.length - 1; t >= 0; t--) for (a = i[t], this.faces.splice(a, 1), o = 0, r = this.faceVertexUvs.length; r > o; o++) this.faceVertexUvs[o].splice(a, 1); return t = this.vertices.length - n.length, this.vertices = n, t }, toJSON: function() { function e(e, t, r) { return r ? e | 1 << t : e & ~(1 << t) } function t(e) { var t = e.x.toString() + e.y.toString() + e.z.toString(); return void 0 !== l[t] ? l[t] : (l[t] = h.length / 3, h.push(e.x, e.y, e.z), l[t]) } function r(e) { var t = e.r.toString() + e.g.toString() + e.b.toString(); return void 0 !== u[t] ? u[t] : (u[t] = c.length, c.push(e.getHex()), u[t]) } function i(e) { var t = e.x.toString() + e.y.toString(); return void 0 !== p[t] ? p[t] : (p[t] = E.length / 2, E.push(e.x, e.y), p[t]) } var n = { metadata: { version: 4, type: "BufferGeometry", generator: "BufferGeometryExporter" }, uuid: this.uuid, type: this.type }; if ("" !== this.name && (n.name = this.name), void 0 !== this.parameters) { var o, a = this.parameters; for (o in a) void 0 !== a[o] && (n[o] = a[o]); return n } for (a = [], o = 0; o < this.vertices.length; o++) { var s = this.vertices[o]; a.push(s.x, s.y, s.z) } var s = [], h = [], l = {}, c = [], u = {}, E = [], p = {}; for (o = 0; o < this.faces.length; o++) { var d = this.faces[o], f = void 0 !== this.faceVertexUvs[0][o], m = 0 < d.normal.length(), T = 0 < d.vertexNormals.length, g = 1 !== d.color.r || 1 !== d.color.g || 1 !== d.color.b, R = 0 < d.vertexColors.length, y = 0, y = e(y, 0, 0), y = e(y, 1, !1), y = e(y, 2, !1), y = e(y, 3, f), y = e(y, 4, m), y = e(y, 5, T), y = e(y, 6, g), y = e(y, 7, R); s.push(y), s.push(d.a, d.b, d.c), f && (f = this.faceVertexUvs[0][o], s.push(i(f[0]), i(f[1]), i(f[2]))), m && s.push(t(d.normal)), T && (m = d.vertexNormals, s.push(t(m[0]), t(m[1]), t(m[2]))), g && s.push(r(d.color)), R && (d = d.vertexColors, s.push(r(d[0]), r(d[1]), r(d[2]))) } return n.data = {}, n.data.vertices = a, n.data.normals = h, 0 < c.length && (n.data.colors = c), 0 < E.length && (n.data.uvs = [E]), n.data.faces = s, n }, clone: function() { for (var e = new THREE.Geometry, t = this.vertices, r = 0, i = t.length; i > r; r++) e.vertices.push(t[r].clone()); for (t = this.faces, r = 0, i = t.length; i > r; r++) e.faces.push(t[r].clone()); for (r = 0, i = this.faceVertexUvs.length; i > r; r++) { t = this.faceVertexUvs[r], void 0 === e.faceVertexUvs[r] && (e.faceVertexUvs[r] = []); for (var n = 0, o = t.length; o > n; n++) { for (var a = t[n], s = [], h = 0, l = a.length; l > h; h++) s.push(a[h].clone()); e.faceVertexUvs[r].push(s) } } return e }, dispose: function() { this.dispatchEvent({ type: "dispose" }) } }, THREE.EventDispatcher.prototype.apply(THREE.Geometry.prototype), THREE.GeometryIdCount = 0, THREE.Camera = function() { THREE.Object3D.call(this), this.type = "Camera", this.matrixWorldInverse = new THREE.Matrix4, this.projectionMatrix = new THREE.Matrix4 }, THREE.Camera.prototype = Object.create(THREE.Object3D.prototype), THREE.Camera.prototype.constructor = THREE.Camera, THREE.Camera.prototype.getWorldDirection = function() { var e = new THREE.Quaternion; return function(t) { return t = t || new THREE.Vector3, this.getWorldQuaternion(e), t.set(0, 0, -1).applyQuaternion(e) } }(), THREE.Camera.prototype.lookAt = function() { var e = new THREE.Matrix4; return function(t) { e.lookAt(this.position, t, this.up), this.quaternion.setFromRotationMatrix(e) } }(), THREE.Camera.prototype.clone = function(e) { return void 0 === e && (e = new THREE.Camera), THREE.Object3D.prototype.clone.call(this, e), e.matrixWorldInverse.copy(this.matrixWorldInverse), e.projectionMatrix.copy(this.projectionMatrix), e }, THREE.CubeCamera = function(e, t, r) { THREE.Object3D.call(this), this.type = "CubeCamera"; var i = new THREE.PerspectiveCamera(90, 1, e, t); i.up.set(0, -1, 0), i.lookAt(new THREE.Vector3(1, 0, 0)), this.add(i); var n = new THREE.PerspectiveCamera(90, 1, e, t); n.up.set(0, -1, 0), n.lookAt(new THREE.Vector3(-1, 0, 0)), this.add(n); var o = new THREE.PerspectiveCamera(90, 1, e, t); o.up.set(0, 0, 1), o.lookAt(new THREE.Vector3(0, 1, 0)), this.add(o); var a = new THREE.PerspectiveCamera(90, 1, e, t); a.up.set(0, 0, -1), a.lookAt(new THREE.Vector3(0, -1, 0)), this.add(a); var s = new THREE.PerspectiveCamera(90, 1, e, t); s.up.set(0, -1, 0), s.lookAt(new THREE.Vector3(0, 0, 1)), this.add(s); var h = new THREE.PerspectiveCamera(90, 1, e, t); h.up.set(0, -1, 0), h.lookAt(new THREE.Vector3(0, 0, -1)), this.add(h), this.renderTarget = new THREE.WebGLRenderTargetCube(r, r, { format: THREE.RGBFormat, magFilter: THREE.LinearFilter, minFilter: THREE.LinearFilter }), this.updateCubeMap = function(e, t) { var r = this.renderTarget, l = r.generateMipmaps; r.generateMipmaps = !1, r.activeCubeFace = 0, e.render(t, i, r), r.activeCubeFace = 1, e.render(t, n, r), r.activeCubeFace = 2, e.render(t, o, r), r.activeCubeFace = 3, e.render(t, a, r), r.activeCubeFace = 4, e.render(t, s, r), r.generateMipmaps = l, r.activeCubeFace = 5, e.render(t, h, r) } }, THREE.CubeCamera.prototype = Object.create(THREE.Object3D.prototype), THREE.CubeCamera.prototype.constructor = THREE.CubeCamera, THREE.OrthographicCamera = function(e, t, r, i, n, o) { THREE.Camera.call(this), this.type = "OrthographicCamera", this.zoom = 1, this.left = e, this.right = t, this.top = r, this.bottom = i, this.near = void 0 !== n ? n : .1, this.far = void 0 !== o ? o : 2e3, this.updateProjectionMatrix() }, THREE.OrthographicCamera.prototype = Object.create(THREE.Camera.prototype), THREE.OrthographicCamera.prototype.constructor = THREE.OrthographicCamera, THREE.OrthographicCamera.prototype.updateProjectionMatrix = function() { var e = (this.right - this.left) / (2 * this.zoom), t = (this.top - this.bottom) / (2 * this.zoom), r = (this.right + this.left) / 2, i = (this.top + this.bottom) / 2; this.projectionMatrix.makeOrthographic(r - e, r + e, i + t, i - t, this.near, this.far) }, THREE.OrthographicCamera.prototype.clone = function() { var e = new THREE.OrthographicCamera; return THREE.Camera.prototype.clone.call(this, e), e.zoom = this.zoom, e.left = this.left, e.right = this.right, e.top = this.top, e.bottom = this.bottom, e.near = this.near, e.far = this.far, e.projectionMatrix.copy(this.projectionMatrix), e }, THREE.PerspectiveCamera = function(e, t, r, i) { THREE.Camera.call(this), this.type = "PerspectiveCamera", this.zoom = 1, this.fov = void 0 !== e ? e : 50, this.aspect = void 0 !== t ? t : 1, this.near = void 0 !== r ? r : .1, this.far = void 0 !== i ? i : 2e3, this.updateProjectionMatrix() }, THREE.PerspectiveCamera.prototype = Object.create(THREE.Camera.prototype), THREE.PerspectiveCamera.prototype.constructor = THREE.PerspectiveCamera, THREE.PerspectiveCamera.prototype.setLens = function(e, t) { void 0 === t && (t = 24), this.fov = 2 * THREE.Math.radToDeg(Math.atan(t / (2 * e))), this.updateProjectionMatrix() }, THREE.PerspectiveCamera.prototype.setViewOffset = function(e, t, r, i, n, o) { this.fullWidth = e, this.fullHeight = t, this.x = r, this.y = i, this.width = n, this.height = o, this.updateProjectionMatrix() }, THREE.PerspectiveCamera.prototype.updateProjectionMatrix = function() { var e = THREE.Math.radToDeg(2 * Math.atan(Math.tan(.5 * THREE.Math.degToRad(this.fov)) / this.zoom)); if (this.fullWidth) { var t = this.fullWidth / this.fullHeight, e = Math.tan(THREE.Math.degToRad(.5 * e)) * this.near, r = -e, i = t * r, t = Math.abs(t * e - i), r = Math.abs(e - r); this.projectionMatrix.makeFrustum(i + this.x * t / this.fullWidth, i + (this.x + this.width) * t / this.fullWidth, e - (this.y + this.height) * r / this.fullHeight, e - this.y * r / this.fullHeight, this.near, this.far) } else this.projectionMatrix.makePerspective(e, this.aspect, this.near, this.far) }, THREE.PerspectiveCamera.prototype.clone = function() { var e = new THREE.PerspectiveCamera; return THREE.Camera.prototype.clone.call(this, e), e.zoom = this.zoom, e.fov = this.fov, e.aspect = this.aspect, e.near = this.near, e.far = this.far, e.projectionMatrix.copy(this.projectionMatrix), e }, THREE.Light = function(e) { THREE.Object3D.call(this), this.type = "Light", this.color = new THREE.Color(e) }, THREE.Light.prototype = Object.create(THREE.Object3D.prototype), THREE.Light.prototype.constructor = THREE.Light, THREE.Light.prototype.clone = function(e) { return void 0 === e && (e = new THREE.Light), THREE.Object3D.prototype.clone.call(this, e), e.color.copy(this.color), e }, THREE.AmbientLight = function(e) { THREE.Light.call(this, e), this.type = "AmbientLight" }, THREE.AmbientLight.prototype = Object.create(THREE.Light.prototype), THREE.AmbientLight.prototype.constructor = THREE.AmbientLight, THREE.AmbientLight.prototype.clone = function() { var e = new THREE.AmbientLight; return THREE.Light.prototype.clone.call(this, e), e }, THREE.AreaLight = function(e, t) { THREE.Light.call(this, e), this.type = "AreaLight", this.normal = new THREE.Vector3(0, -1, 0), this.right = new THREE.Vector3(1, 0, 0), this.intensity = void 0 !== t ? t : 1, this.height = this.width = 1, this.constantAttenuation = 1.5, this.linearAttenuation = .5, this.quadraticAttenuation = .1 }, THREE.AreaLight.prototype = Object.create(THREE.Light.prototype), THREE.AreaLight.prototype.constructor = THREE.AreaLight, THREE.DirectionalLight = function(e, t) { THREE.Light.call(this, e), this.type = "DirectionalLight", this.position.set(0, 1, 0), this.target = new THREE.Object3D, this.intensity = void 0 !== t ? t : 1, this.onlyShadow = this.castShadow = !1, this.shadowCameraNear = 50, this.shadowCameraFar = 5e3, this.shadowCameraLeft = -500, this.shadowCameraTop = this.shadowCameraRight = 500, this.shadowCameraBottom = -500, this.shadowCameraVisible = !1, this.shadowBias = 0, this.shadowDarkness = .5, this.shadowMapHeight = this.shadowMapWidth = 512, this.shadowCascade = !1, this.shadowCascadeOffset = new THREE.Vector3(0, 0, -1e3), this.shadowCascadeCount = 2, this.shadowCascadeBias = [0, 0, 0], this.shadowCascadeWidth = [512, 512, 512], this.shadowCascadeHeight = [512, 512, 512], this.shadowCascadeNearZ = [-1, .99, .998], this.shadowCascadeFarZ = [.99, .998, 1], this.shadowCascadeArray = [], this.shadowMatrix = this.shadowCamera = this.shadowMapSize = this.shadowMap = null }, THREE.DirectionalLight.prototype = Object.create(THREE.Light.prototype), THREE.DirectionalLight.prototype.constructor = THREE.DirectionalLight, THREE.DirectionalLight.prototype.clone = function() { var e = new THREE.DirectionalLight; return THREE.Light.prototype.clone.call(this, e), e.target = this.target.clone(), e.intensity = this.intensity, e.castShadow = this.castShadow, e.onlyShadow = this.onlyShadow, e.shadowCameraNear = this.shadowCameraNear, e.shadowCameraFar = this.shadowCameraFar, e.shadowCameraLeft = this.shadowCameraLeft, e.shadowCameraRight = this.shadowCameraRight, e.shadowCameraTop = this.shadowCameraTop, e.shadowCameraBottom = this.shadowCameraBottom, e.shadowCameraVisible = this.shadowCameraVisible, e.shadowBias = this.shadowBias, e.shadowDarkness = this.shadowDarkness, e.shadowMapWidth = this.shadowMapWidth, e.shadowMapHeight = this.shadowMapHeight, e.shadowCascade = this.shadowCascade, e.shadowCascadeOffset.copy(this.shadowCascadeOffset), e.shadowCascadeCount = this.shadowCascadeCount, e.shadowCascadeBias = this.shadowCascadeBias.slice(0), e.shadowCascadeWidth = this.shadowCascadeWidth.slice(0), e.shadowCascadeHeight = this.shadowCascadeHeight.slice(0), e.shadowCascadeNearZ = this.shadowCascadeNearZ.slice(0), e.shadowCascadeFarZ = this.shadowCascadeFarZ.slice(0), e }, THREE.HemisphereLight = function(e, t, r) { THREE.Light.call(this, e), this.type = "HemisphereLight", this.position.set(0, 100, 0), this.groundColor = new THREE.Color(t), this.intensity = void 0 !== r ? r : 1 }, THREE.HemisphereLight.prototype = Object.create(THREE.Light.prototype), THREE.HemisphereLight.prototype.constructor = THREE.HemisphereLight, THREE.HemisphereLight.prototype.clone = function() { var e = new THREE.HemisphereLight; return THREE.Light.prototype.clone.call(this, e), e.groundColor.copy(this.groundColor), e.intensity = this.intensity, e }, THREE.PointLight = function(e, t, r, i) { THREE.Light.call(this, e), this.type = "PointLight", this.intensity = void 0 !== t ? t : 1, this.distance = void 0 !== r ? r : 0, this.decay = void 0 !== i ? i : 1 }, THREE.PointLight.prototype = Object.create(THREE.Light.prototype), THREE.PointLight.prototype.constructor = THREE.PointLight, THREE.PointLight.prototype.clone = function() { var e = new THREE.PointLight; return THREE.Light.prototype.clone.call(this, e), e.intensity = this.intensity, e.distance = this.distance, e.decay = this.decay, e }, THREE.SpotLight = function(e, t, r, i, n, o) { THREE.Light.call(this, e), this.type = "SpotLight", this.position.set(0, 1, 0), this.target = new THREE.Object3D, this.intensity = void 0 !== t ? t : 1, this.distance = void 0 !== r ? r : 0, this.angle = void 0 !== i ? i : Math.PI / 3, this.exponent = void 0 !== n ? n : 10, this.decay = void 0 !== o ? o : 1, this.onlyShadow = this.castShadow = !1, this.shadowCameraNear = 50, this.shadowCameraFar = 5e3, this.shadowCameraFov = 50, this.shadowCameraVisible = !1, this.shadowBias = 0, this.shadowDarkness = .5, this.shadowMapHeight = this.shadowMapWidth = 512, this.shadowMatrix = this.shadowCamera = this.shadowMapSize = this.shadowMap = null }, THREE.SpotLight.prototype = Object.create(THREE.Light.prototype), THREE.SpotLight.prototype.constructor = THREE.SpotLight, THREE.SpotLight.prototype.clone = function() { var e = new THREE.SpotLight; return THREE.Light.prototype.clone.call(this, e), e.target = this.target.clone(), e.intensity = this.intensity, e.distance = this.distance, e.angle = this.angle, e.exponent = this.exponent, e.decay = this.decay, e.castShadow = this.castShadow, e.onlyShadow = this.onlyShadow, e.shadowCameraNear = this.shadowCameraNear, e.shadowCameraFar = this.shadowCameraFar, e.shadowCameraFov = this.shadowCameraFov, e.shadowCameraVisible = this.shadowCameraVisible, e.shadowBias = this.shadowBias, e.shadowDarkness = this.shadowDarkness, e.shadowMapWidth = this.shadowMapWidth, e.shadowMapHeight = this.shadowMapHeight, e }, THREE.Cache = { files: {}, add: function(e, t) { this.files[e] = t }, get: function(e) { return this.files[e] }, remove: function(e) { delete this.files[e] }, clear: function() { this.files = {} } }, THREE.Loader = function(e) { this.statusDomElement = (this.showStatus = e) ? THREE.Loader.prototype.addStatusElement() : null, this.imageLoader = new THREE.ImageLoader, this.onLoadStart = function() {}, this.onLoadProgress = function() {}, this.onLoadComplete = function() {} }, THREE.Loader.prototype = { constructor: THREE.Loader, crossOrigin: void 0, addStatusElement: function() { var e = document.createElement("div"); return e.style.position = "absolute", e.style.right = "0px", e.style.top = "0px", e.style.fontSize = "0.8em", e.style.textAlign = "left", e.style.background = "rgba(0,0,0,0.25)", e.style.color = "#fff", e.style.width = "120px", e.style.padding = "0.5em 0.5em 0.5em 0.5em", e.style.zIndex = 1e3, e.innerHTML = "Loading ...", e }, updateProgress: function(e) { var t = "Loaded ", t = e.total ? t + ((100 * e.loaded / e.total).toFixed(0) + "%") : t + ((e.loaded / 1024).toFixed(2) + " KB"); this.statusDomElement.innerHTML = t }, extractUrlBase: function(e) { return e = e.split("/"), 1 === e.length ? "./" : (e.pop(), e.join("/") + "/") }, initMaterials: function(e, t) { for (var r = [], i = 0; i < e.length; ++i) r[i] = this.createMaterial(e[i], t); return r }, needsTangents: function(e) { for (var t = 0, r = e.length; r > t; t++) if (e[t] instanceof THREE.ShaderMaterial) return !0; return !1 }, createMaterial: function(e, t) { function r(e) { return e = Math.log(e) / Math.LN2, Math.pow(2, Math.round(e)) } function i(e, i, n, a, s, h, l) { var c, u = t + n, E = THREE.Loader.Handlers.get(u); null !== E ? c = E.load(u) : (c = new THREE.Texture, E = o.imageLoader, E.crossOrigin = o.crossOrigin, E.load(u, function(e) { if (!1 === THREE.Math.isPowerOfTwo(e.width) || !1 === THREE.Math.isPowerOfTwo(e.height)) { var t = r(e.width), i = r(e.height), n = document.createElement("canvas"); n.width = t, n.height = i, n.getContext("2d").drawImage(e, 0, 0, t, i), c.image = n } else c.image = e; c.needsUpdate = !0 })), c.sourceFile = n, a && (c.repeat.set(a[0], a[1]), 1 !== a[0] && (c.wrapS = THREE.RepeatWrapping), 1 !== a[1] && (c.wrapT = THREE.RepeatWrapping)), s && c.offset.set(s[0], s[1]), h && (n = { repeat: THREE.RepeatWrapping, mirror: THREE.MirroredRepeatWrapping }, void 0 !== n[h[0]] && (c.wrapS = n[h[0]]), void 0 !== n[h[1]] && (c.wrapT = n[h[1]])), l && (c.anisotropy = l), e[i] = c } function n(e) { return (255 * e[0] << 16) + (255 * e[1] << 8) + 255 * e[2] } var o = this, a = "MeshLambertMaterial", s = { color: 15658734, opacity: 1, map: null, lightMap: null, normalMap: null, bumpMap: null, wireframe: !1 }; if (e.shading) { var h = e.shading.toLowerCase(); "phong" === h ? a = "MeshPhongMaterial" : "basic" === h && (a = "MeshBasicMaterial") } return void 0 !== e.blending && void 0 !== THREE[e.blending] && (s.blending = THREE[e.blending]), void 0 !== e.transparent && (s.transparent = e.transparent), void 0 !== e.opacity && 1 > e.opacity && (s.transparent = !0), void 0 !== e.depthTest && (s.depthTest = e.depthTest), void 0 !== e.depthWrite && (s.depthWrite = e.depthWrite), void 0 !== e.visible && (s.visible = e.visible), void 0 !== e.flipSided && (s.side = THREE.BackSide), void 0 !== e.doubleSided && (s.side = THREE.DoubleSide), void 0 !== e.wireframe && (s.wireframe = e.wireframe), void 0 !== e.vertexColors && ("face" === e.vertexColors ? s.vertexColors = THREE.FaceColors : e.vertexColors && (s.vertexColors = THREE.VertexColors)), e.colorDiffuse ? s.color = n(e.colorDiffuse) : e.DbgColor && (s.color = e.DbgColor), e.colorSpecular && (s.specular = n(e.colorSpecular)), e.colorEmissive && (s.emissive = n(e.colorEmissive)), void 0 !== e.transparency && (console.warn("THREE.Loader: transparency has been renamed to opacity"), e.opacity = e.transparency), void 0 !== e.opacity && (s.opacity = e.opacity), e.specularCoef && (s.shininess = e.specularCoef), e.mapDiffuse && t && i(s, "map", e.mapDiffuse, e.mapDiffuseRepeat, e.mapDiffuseOffset, e.mapDiffuseWrap, e.mapDiffuseAnisotropy), e.mapLight && t && i(s, "lightMap", e.mapLight, e.mapLightRepeat, e.mapLightOffset, e.mapLightWrap, e.mapLightAnisotropy), e.mapBump && t && i(s, "bumpMap", e.mapBump, e.mapBumpRepeat, e.mapBumpOffset, e.mapBumpWrap, e.mapBumpAnisotropy), e.mapNormal && t && i(s, "normalMap", e.mapNormal, e.mapNormalRepeat, e.mapNormalOffset, e.mapNormalWrap, e.mapNormalAnisotropy), e.mapSpecular && t && i(s, "specularMap", e.mapSpecular, e.mapSpecularRepeat, e.mapSpecularOffset, e.mapSpecularWrap, e.mapSpecularAnisotropy), e.mapAlpha && t && i(s, "alphaMap", e.mapAlpha, e.mapAlphaRepeat, e.mapAlphaOffset, e.mapAlphaWrap, e.mapAlphaAnisotropy), e.mapBumpScale && (s.bumpScale = e.mapBumpScale), e.mapNormalFactor && (s.normalScale = new THREE.Vector2(e.mapNormalFactor, e.mapNormalFactor)), a = new THREE[a](s), void 0 !== e.DbgName && (a.name = e.DbgName), a } }, THREE.Loader.Handlers = { handlers: [], add: function(e, t) { this.handlers.push(e, t) }, get: function(e) { for (var t = 0, r = this.handlers.length; r > t; t += 2) { var i = this.handlers[t + 1]; if (this.handlers[t].test(e)) return i } return null } }, THREE.XHRLoader = function(e) { this.manager = void 0 !== e ? e : THREE.DefaultLoadingManager }, THREE.XHRLoader.prototype = { constructor: THREE.XHRLoader, load: function(e, t, r, i) { var n = this, o = THREE.Cache.get(e); void 0 !== o ? t && t(o) : (o = new XMLHttpRequest, o.open("GET", e, !0), o.addEventListener("load", function(r) { THREE.Cache.add(e, this.response), t && t(this.response), n.manager.itemEnd(e) }, !1), void 0 !== r && o.addEventListener("progress", function(e) { r(e) }, !1), void 0 !== i && o.addEventListener("error", function(e) { i(e) }, !1), void 0 !== this.crossOrigin && (o.crossOrigin = this.crossOrigin), void 0 !== this.responseType && (o.responseType = this.responseType), o.send(null), n.manager.itemStart(e)) }, setResponseType: function(e) { this.responseType = e }, setCrossOrigin: function(e) { this.crossOrigin = e } }, THREE.ImageLoader = function(e) { this.manager = void 0 !== e ? e : THREE.DefaultLoadingManager }, THREE.ImageLoader.prototype = { constructor: THREE.ImageLoader, load: function(e, t, r, i) { var n = this, o = THREE.Cache.get(e); return void 0 === o ? (o = document.createElement("img"), o.addEventListener("load", function(r) { THREE.Cache.add(e, this), t && t(this), n.manager.itemEnd(e) }, !1), void 0 !== r && o.addEventListener("progress", function(e) { r(e) }, !1), void 0 !== i && o.addEventListener("error", function(e) { i(e) }, !1), void 0 !== this.crossOrigin && (o.crossOrigin = this.crossOrigin), o.src = e, n.manager.itemStart(e), o) : void t(o) }, setCrossOrigin: function(e) { this.crossOrigin = e } }, THREE.JSONLoader = function(e) { THREE.Loader.call(this, e), this.withCredentials = !1 }, THREE.JSONLoader.prototype = Object.create(THREE.Loader.prototype), THREE.JSONLoader.prototype.constructor = THREE.JSONLoader, THREE.JSONLoader.prototype.load = function(e, t, r) { r = r && "string" == typeof r ? r : this.extractUrlBase(e), this.onLoadStart(), this.loadAjaxJSON(this, e, t, r) }, THREE.JSONLoader.prototype.loadAjaxJSON = function(e, t, r, i, n) { var o = new XMLHttpRequest, a = 0; o.onreadystatechange = function() { if (o.readyState === o.DONE) if (200 === o.status || 0 === o.status) { if (o.responseText) { var s = JSON.parse(o.responseText), h = s.metadata; if (void 0 !== h) { if ("object" === h.type) return void THREE.error("THREE.JSONLoader: " + t + " should be loaded with THREE.ObjectLoader instead."); if ("scene" === h.type) return void THREE.error("THREE.JSONLoader: " + t + " seems to be a Scene. Use THREE.SceneLoader instead.") } s = e.parse(s, i), r(s.geometry, s.materials) } else THREE.error("THREE.JSONLoader: " + t + " seems to be unreachable or the file is empty."); e.onLoadComplete() } else THREE.error("THREE.JSONLoader: Couldn't load " + t + " (" + o.status + ")"); else o.readyState === o.LOADING ? n && (0 === a && (a = o.getResponseHeader("Content-Length")), n({ total: a, loaded: o.responseText.length })) : o.readyState === o.HEADERS_RECEIVED && void 0 !== n && (a = o.getResponseHeader("Content-Length")) }, o.open("GET", t, !0), o.withCredentials = this.withCredentials, o.send(null) }, THREE.JSONLoader.prototype.parse = function(e, t) { var r = new THREE.Geometry, i = void 0 !== e.scale ? 1 / e.scale : 1; return function(t) { var i, n, o, a, s, h, l, c, u, E, p, d, f, m = e.faces; h = e.vertices; var T = e.normals, g = e.colors, R = 0; if (void 0 !== e.uvs) { for (i = 0; i < e.uvs.length; i++) e.uvs[i].length && R++; for (i = 0; R > i; i++) r.faceVertexUvs[i] = [] } for (a = 0, s = h.length; s > a;) i = new THREE.Vector3, i.x = h[a++] * t, i.y = h[a++] * t, i.z = h[a++] * t, r.vertices.push(i); for (a = 0, s = m.length; s > a;) if (t = m[a++], u = 1 & t, o = 2 & t, i = 8 & t, l = 16 & t, E = 32 & t, h = 64 & t, t &= 128, u) { if (u = new THREE.Face3, u.a = m[a], u.b = m[a + 1], u.c = m[a + 3], p = new THREE.Face3, p.a = m[a + 1], p.b = m[a + 2], p.c = m[a + 3], a += 4, o && (o = m[a++], u.materialIndex = o, p.materialIndex = o), o = r.faces.length, i) for (i = 0; R > i; i++) for (d = e.uvs[i], r.faceVertexUvs[i][o] = [], r.faceVertexUvs[i][o + 1] = [], n = 0; 4 > n; n++) c = m[a++], f = d[2 * c], c = d[2 * c + 1], f = new THREE.Vector2(f, c), 2 !== n && r.faceVertexUvs[i][o].push(f), 0 !== n && r.faceVertexUvs[i][o + 1].push(f); if (l && (l = 3 * m[a++], u.normal.set(T[l++], T[l++], T[l]), p.normal.copy(u.normal)), E) for (i = 0; 4 > i; i++) l = 3 * m[a++], E = new THREE.Vector3(T[l++], T[l++], T[l]), 2 !== i && u.vertexNormals.push(E), 0 !== i && p.vertexNormals.push(E); if (h && (h = m[a++], h = g[h], u.color.setHex(h), p.color.setHex(h)), t) for (i = 0; 4 > i; i++) h = m[a++], h = g[h], 2 !== i && u.vertexColors.push(new THREE.Color(h)), 0 !== i && p.vertexColors.push(new THREE.Color(h)); r.faces.push(u), r.faces.push(p) } else { if (u = new THREE.Face3, u.a = m[a++], u.b = m[a++], u.c = m[a++], o && (o = m[a++], u.materialIndex = o), o = r.faces.length, i) for (i = 0; R > i; i++) for (d = e.uvs[i], r.faceVertexUvs[i][o] = [], n = 0; 3 > n; n++) c = m[a++], f = d[2 * c], c = d[2 * c + 1], f = new THREE.Vector2(f, c), r.faceVertexUvs[i][o].push(f); if (l && (l = 3 * m[a++], u.normal.set(T[l++], T[l++], T[l])), E) for (i = 0; 3 > i; i++) l = 3 * m[a++], E = new THREE.Vector3(T[l++], T[l++], T[l]), u.vertexNormals.push(E); if (h && (h = m[a++], u.color.setHex(g[h])), t) for (i = 0; 3 > i; i++) h = m[a++], u.vertexColors.push(new THREE.Color(g[h])); r.faces.push(u) } }(i), function() { var t = void 0 !== e.influencesPerVertex ? e.influencesPerVertex : 2; if (e.skinWeights) for (var i = 0, n = e.skinWeights.length; n > i; i += t) r.skinWeights.push(new THREE.Vector4(e.skinWeights[i], t > 1 ? e.skinWeights[i + 1] : 0, t > 2 ? e.skinWeights[i + 2] : 0, t > 3 ? e.skinWeights[i + 3] : 0)); if (e.skinIndices) for (i = 0, n = e.skinIndices.length; n > i; i += t) r.skinIndices.push(new THREE.Vector4(e.skinIndices[i], t > 1 ? e.skinIndices[i + 1] : 0, t > 2 ? e.skinIndices[i + 2] : 0, t > 3 ? e.skinIndices[i + 3] : 0)); r.bones = e.bones, r.bones && 0 < r.bones.length && (r.skinWeights.length !== r.skinIndices.length || r.skinIndices.length !== r.vertices.length) && THREE.warn("THREE.JSONLoader: When skinning, number of vertices (" + r.vertices.length + "), skinIndices (" + r.skinIndices.length + "), and skinWeights (" + r.skinWeights.length + ") should match."), r.animation = e.animation, r.animations = e.animations }(), function(t) { if (void 0 !== e.morphTargets) { var i, n, o, a, s, h; for (i = 0, n = e.morphTargets.length; n > i; i++) for (r.morphTargets[i] = {}, r.morphTargets[i].name = e.morphTargets[i].name, r.morphTargets[i].vertices = [], s = r.morphTargets[i].vertices, h = e.morphTargets[i].vertices, o = 0, a = h.length; a > o; o += 3) { var l = new THREE.Vector3; l.x = h[o] * t, l.y = h[o + 1] * t, l.z = h[o + 2] * t, s.push(l) } } if (void 0 !== e.morphColors) for (i = 0, n = e.morphColors.length; n > i; i++) for (r.morphColors[i] = {}, r.morphColors[i].name = e.morphColors[i].name, r.morphColors[i].colors = [], a = r.morphColors[i].colors, s = e.morphColors[i].colors, t = 0, o = s.length; o > t; t += 3) h = new THREE.Color(16755200), h.setRGB(s[t], s[t + 1], s[t + 2]), a.push(h) }(i), r.computeFaceNormals(), r.computeBoundingSphere(), void 0 === e.materials || 0 === e.materials.length ? { geometry: r } : (i = this.initMaterials(e.materials, t), this.needsTangents(i) && r.computeTangents(), { geometry: r, materials: i }) }, THREE.LoadingManager = function(e, t, r) { var i = this, n = 0, o = 0; this.onLoad = e, this.onProgress = t, this.onError = r, this.itemStart = function(e) { o++ }, this.itemEnd = function(e) { n++, void 0 !== i.onProgress && i.onProgress(e, n, o), n === o && void 0 !== i.onLoad && i.onLoad() } }, THREE.DefaultLoadingManager = new THREE.LoadingManager, THREE.BufferGeometryLoader = function(e) { this.manager = void 0 !== e ? e : THREE.DefaultLoadingManager }, THREE.BufferGeometryLoader.prototype = { constructor: THREE.BufferGeometryLoader, load: function(e, t, r, i) { var n = this, o = new THREE.XHRLoader(n.manager); o.setCrossOrigin(this.crossOrigin), o.load(e, function(e) { t(n.parse(JSON.parse(e))) }, r, i) }, setCrossOrigin: function(e) { this.crossOrigin = e }, parse: function(e) { var t, r = new THREE.BufferGeometry, i = e.data.attributes; for (t in i) { var n = i[t], o = new self[n.type](n.array); r.addAttribute(t, new THREE.BufferAttribute(o, n.itemSize)) } return i = e.data.offsets, void 0 !== i && (r.offsets = JSON.parse(JSON.stringify(i))), e = e.data.boundingSphere, void 0 !== e && (i = new THREE.Vector3, void 0 !== e.center && i.fromArray(e.center), r.boundingSphere = new THREE.Sphere(i, e.radius)), r } }, THREE.MaterialLoader = function(e) { this.manager = void 0 !== e ? e : THREE.DefaultLoadingManager }, THREE.MaterialLoader.prototype = { constructor: THREE.MaterialLoader, load: function(e, t, r, i) { var n = this, o = new THREE.XHRLoader(n.manager); o.setCrossOrigin(this.crossOrigin), o.load(e, function(e) { t(n.parse(JSON.parse(e))) }, r, i) }, setCrossOrigin: function(e) { this.crossOrigin = e }, parse: function(e) { var t = new THREE[e.type]; if (void 0 !== e.color && t.color.setHex(e.color), void 0 !== e.emissive && t.emissive.setHex(e.emissive), void 0 !== e.specular && t.specular.setHex(e.specular), void 0 !== e.shininess && (t.shininess = e.shininess), void 0 !== e.uniforms && (t.uniforms = e.uniforms), void 0 !== e.vertexShader && (t.vertexShader = e.vertexShader), void 0 !== e.fragmentShader && (t.fragmentShader = e.fragmentShader), void 0 !== e.vertexColors && (t.vertexColors = e.vertexColors), void 0 !== e.shading && (t.shading = e.shading), void 0 !== e.blending && (t.blending = e.blending), void 0 !== e.side && (t.side = e.side), void 0 !== e.opacity && (t.opacity = e.opacity), void 0 !== e.transparent && (t.transparent = e.transparent), void 0 !== e.wireframe && (t.wireframe = e.wireframe), void 0 !== e.size && (t.size = e.size), void 0 !== e.sizeAttenuation && (t.sizeAttenuation = e.sizeAttenuation), void 0 !== e.materials) for (var r = 0, i = e.materials.length; i > r; r++) t.materials.push(this.parse(e.materials[r])); return t } }, THREE.ObjectLoader = function(e) { this.manager = void 0 !== e ? e : THREE.DefaultLoadingManager, this.texturePath = "" }, THREE.ObjectLoader.prototype = { constructor: THREE.ObjectLoader, load: function(e, t, r, i) { "" === this.texturePath && (this.texturePath = e.substring(0, e.lastIndexOf("/") + 1)); var n = this, o = new THREE.XHRLoader(n.manager); o.setCrossOrigin(this.crossOrigin), o.load(e, function(e) { n.parse(JSON.parse(e), t) }, r, i) }, setTexturePath: function(e) { this.texturePath = e }, setCrossOrigin: function(e) { this.crossOrigin = e }, parse: function(e, t) { var r = this.parseGeometries(e.geometries), i = this.parseImages(e.images, function() { void 0 !== t && t(n) }), i = this.parseTextures(e.textures, i), i = this.parseMaterials(e.materials, i), n = this.parseObject(e.object, r, i); return void 0 !== e.images && 0 !== e.images.length || void 0 === t || t(n), n }, parseGeometries: function(e) { var t = {}; if (void 0 !== e) for (var r = new THREE.JSONLoader, i = new THREE.BufferGeometryLoader, n = 0, o = e.length; o > n; n++) { var a, s = e[n]; switch (s.type) { case "PlaneGeometry": case "PlaneBufferGeometry": a = new THREE[s.type](s.width, s.height, s.widthSegments, s.heightSegments); break; case "BoxGeometry": case "CubeGeometry": a = new THREE.BoxGeometry(s.width, s.height, s.depth, s.widthSegments, s.heightSegments, s.depthSegments); break; case "CircleGeometry": a = new THREE.CircleGeometry(s.radius, s.segments); break; case "CylinderGeometry": a = new THREE.CylinderGeometry(s.radiusTop, s.radiusBottom, s.height, s.radialSegments, s.heightSegments, s.openEnded); break; case "SphereGeometry": a = new THREE.SphereGeometry(s.radius, s.widthSegments, s.heightSegments, s.phiStart, s.phiLength, s.thetaStart, s.thetaLength); break; case "IcosahedronGeometry": a = new THREE.IcosahedronGeometry(s.radius, s.detail); break; case "TorusGeometry": a = new THREE.TorusGeometry(s.radius, s.tube, s.radialSegments, s.tubularSegments, s.arc); break; case "TorusKnotGeometry": a = new THREE.TorusKnotGeometry(s.radius, s.tube, s.radialSegments, s.tubularSegments, s.p, s.q, s.heightScale); break; case "BufferGeometry": a = i.parse(s); break; case "Geometry": a = r.parse(s.data).geometry } a.uuid = s.uuid, void 0 !== s.name && (a.name = s.name), t[s.uuid] = a } return t }, parseMaterials: function(e, t) { var r = {}; if (void 0 !== e) for (var i = function(e) { return void 0 === t[e] && THREE.warn("THREE.ObjectLoader: Undefined texture", e), t[e] }, n = new THREE.MaterialLoader, o = 0, a = e.length; a > o; o++) { var s = e[o], h = n.parse(s); h.uuid = s.uuid, void 0 !== s.name && (h.name = s.name), void 0 !== s.map && (h.map = i(s.map)), void 0 !== s.bumpMap && (h.bumpMap = i(s.bumpMap), s.bumpScale && (h.bumpScale = new THREE.Vector2(s.bumpScale, s.bumpScale))), void 0 !== s.alphaMap && (h.alphaMap = i(s.alphaMap)), void 0 !== s.envMap && (h.envMap = i(s.envMap)), void 0 !== s.normalMap && (h.normalMap = i(s.normalMap), s.normalScale && (h.normalScale = new THREE.Vector2(s.normalScale, s.normalScale))), void 0 !== s.lightMap && (h.lightMap = i(s.lightMap)), void 0 !== s.specularMap && (h.specularMap = i(s.specularMap)), r[s.uuid] = h } return r }, parseImages: function(e, t) { var r = this, i = {}; if (void 0 !== e && 0 < e.length) { var n = new THREE.LoadingManager(t), o = new THREE.ImageLoader(n); o.setCrossOrigin(this.crossOrigin); for (var n = function(e) { return r.manager.itemStart(e), o.load(e, function() { r.manager.itemEnd(e) }) }, a = 0, s = e.length; s > a; a++) { var h = e[a], l = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(h.url) ? h.url : r.texturePath + h.url; i[h.uuid] = n(l) } } return i }, parseTextures: function(e, t) { var r = {}; if (void 0 !== e) for (var i = 0, n = e.length; n > i; i++) { var o = e[i]; void 0 === o.image && THREE.warn('THREE.ObjectLoader: No "image" speficied for', o.uuid), void 0 === t[o.image] && THREE.warn("THREE.ObjectLoader: Undefined image", o.image); var a = new THREE.Texture(t[o.image]); a.needsUpdate = !0, a.uuid = o.uuid, void 0 !== o.name && (a.name = o.name), void 0 !== o.repeat && (a.repeat = new THREE.Vector2(o.repeat[0], o.repeat[1])), void 0 !== o.minFilter && (a.minFilter = THREE[o.minFilter]), void 0 !== o.magFilter && (a.magFilter = THREE[o.magFilter]), void 0 !== o.anisotropy && (a.anisotropy = o.anisotropy), o.wrap instanceof Array && (a.wrapS = THREE[o.wrap[0]], a.wrapT = THREE[o.wrap[1]]), r[o.uuid] = a } return r }, parseObject: function() { var e = new THREE.Matrix4; return function(t, r, i) { var n; n = function(e) { return void 0 === r[e] && THREE.warn("THREE.ObjectLoader: Undefined geometry", e), r[e] }; var o = function(e) { return void 0 === i[e] && THREE.warn("THREE.ObjectLoader: Undefined material", e), i[e] }; switch (t.type) { case "Scene": n = new THREE.Scene; break; case "PerspectiveCamera": n = new THREE.PerspectiveCamera(t.fov, t.aspect, t.near, t.far); break; case "OrthographicCamera": n = new THREE.OrthographicCamera(t.left, t.right, t.top, t.bottom, t.near, t.far); break; case "AmbientLight": n = new THREE.AmbientLight(t.color); break; case "DirectionalLight": n = new THREE.DirectionalLight(t.color, t.intensity); break; case "PointLight": n = new THREE.PointLight(t.color, t.intensity, t.distance, t.decay); break; case "SpotLight": n = new THREE.SpotLight(t.color, t.intensity, t.distance, t.angle, t.exponent, t.decay); break; case "HemisphereLight": n = new THREE.HemisphereLight(t.color, t.groundColor, t.intensity); break; case "Mesh": n = new THREE.Mesh(n(t.geometry), o(t.material)); break; case "Line": n = new THREE.Line(n(t.geometry), o(t.material), t.mode); break; case "PointCloud": n = new THREE.PointCloud(n(t.geometry), o(t.material)); break; case "Sprite": n = new THREE.Sprite(o(t.material)); break; case "Group": n = new THREE.Group; break; default: n = new THREE.Object3D } if (n.uuid = t.uuid, void 0 !== t.name && (n.name = t.name), void 0 !== t.matrix ? (e.fromArray(t.matrix), e.decompose(n.position, n.quaternion, n.scale)) : (void 0 !== t.position && n.position.fromArray(t.position), void 0 !== t.rotation && n.rotation.fromArray(t.rotation), void 0 !== t.scale && n.scale.fromArray(t.scale)), void 0 !== t.visible && (n.visible = t.visible), void 0 !== t.userData && (n.userData = t.userData), void 0 !== t.children) for (var a in t.children) n.add(this.parseObject(t.children[a], r, i)); return n } }() }, THREE.TextureLoader = function(e) { this.manager = void 0 !== e ? e : THREE.DefaultLoadingManager }, THREE.TextureLoader.prototype = { constructor: THREE.TextureLoader, load: function(e, t, r, i) { var n = new THREE.ImageLoader(this.manager); n.setCrossOrigin(this.crossOrigin), n.load(e, function(e) { e = new THREE.Texture(e), e.needsUpdate = !0, void 0 !== t && t(e) }, r, i) }, setCrossOrigin: function(e) { this.crossOrigin = e } }, THREE.DataTextureLoader = THREE.BinaryTextureLoader = function() { this._parser = null }, THREE.BinaryTextureLoader.prototype = { constructor: THREE.BinaryTextureLoader, load: function(e, t, r, i) { var n = this, o = new THREE.DataTexture, a = new THREE.XHRLoader; return a.setResponseType("arraybuffer"), a.load(e, function(e) { (e = n._parser(e)) && (void 0 !== e.image ? o.image = e.image : void 0 !== e.data && (o.image.width = e.width, o.image.height = e.height, o.image.data = e.data), o.wrapS = void 0 !== e.wrapS ? e.wrapS : THREE.ClampToEdgeWrapping, o.wrapT = void 0 !== e.wrapT ? e.wrapT : THREE.ClampToEdgeWrapping, o.magFilter = void 0 !== e.magFilter ? e.magFilter : THREE.LinearFilter, o.minFilter = void 0 !== e.minFilter ? e.minFilter : THREE.LinearMipMapLinearFilter, o.anisotropy = void 0 !== e.anisotropy ? e.anisotropy : 1, void 0 !== e.format && (o.format = e.format), void 0 !== e.type && (o.type = e.type), void 0 !== e.mipmaps && (o.mipmaps = e.mipmaps), 1 === e.mipmapCount && (o.minFilter = THREE.LinearFilter), o.needsUpdate = !0, t && t(o, e)) }, r, i), o } }, THREE.CompressedTextureLoader = function() { this._parser = null }, THREE.CompressedTextureLoader.prototype = { constructor: THREE.CompressedTextureLoader, load: function(e, t, r) { var i = this, n = [], o = new THREE.CompressedTexture; o.image = n; var a = new THREE.XHRLoader; if (a.setResponseType("arraybuffer"), e instanceof Array) { var s = 0; r = function(r) { a.load(e[r], function(e) { e = i._parser(e, !0), n[r] = { width: e.width, height: e.height, format: e.format, mipmaps: e.mipmaps }, s += 1, 6 === s && (1 == e.mipmapCount && (o.minFilter = THREE.LinearFilter), o.format = e.format, o.needsUpdate = !0, t && t(o)) }) }; for (var h = 0, l = e.length; l > h; ++h) r(h) } else a.load(e, function(e) { if (e = i._parser(e, !0), e.isCubemap) for (var r = e.mipmaps.length / e.mipmapCount, a = 0; r > a; a++) { n[a] = { mipmaps: [] }; for (var s = 0; s < e.mipmapCount; s++) n[a].mipmaps.push(e.mipmaps[a * e.mipmapCount + s]), n[a].format = e.format, n[a].width = e.width, n[a].height = e.height } else o.image.width = e.width, o.image.height = e.height, o.mipmaps = e.mipmaps; 1 === e.mipmapCount && (o.minFilter = THREE.LinearFilter), o.format = e.format, o.needsUpdate = !0, t && t(o) }); return o } }, THREE.Material = function() { Object.defineProperty(this, "id", { value: THREE.MaterialIdCount++ }), this.uuid = THREE.Math.generateUUID(), this.name = "", this.type = "Material", this.side = THREE.FrontSide, this.opacity = 1, this.transparent = !1, this.blending = THREE.NormalBlending, this.blendSrc = THREE.SrcAlphaFactor, this.blendDst = THREE.OneMinusSrcAlphaFactor, this.blendEquation = THREE.AddEquation, this.blendEquationAlpha = this.blendDstAlpha = this.blendSrcAlpha = null, this.colorWrite = this.depthWrite = this.depthTest = !0, this.polygonOffset = !1, this.overdraw = this.alphaTest = this.polygonOffsetUnits = this.polygonOffsetFactor = 0, this._needsUpdate = this.visible = !0 }, THREE.Material.prototype = { constructor: THREE.Material, get needsUpdate() { return this._needsUpdate }, set needsUpdate(e) {!0 === e && this.update(), this._needsUpdate = e }, setValues: function(e) { if (void 0 !== e) for (var t in e) { var r = e[t]; if (void 0 === r) THREE.warn("THREE.Material: '" + t + "' parameter is undefined."); else if (t in this) { var i = this[t]; i instanceof THREE.Color ? i.set(r) : i instanceof THREE.Vector3 && r instanceof THREE.Vector3 ? i.copy(r) : this[t] = "overdraw" == t ? Number(r) : r } } }, toJSON: function() { var e = { metadata: { version: 4.2, type: "material", generator: "MaterialExporter" }, uuid: this.uuid, type: this.type }; return "" !== this.name && (e.name = this.name), this instanceof THREE.MeshBasicMaterial ? (e.color = this.color.getHex(), this.vertexColors !== THREE.NoColors && (e.vertexColors = this.vertexColors), this.blending !== THREE.NormalBlending && (e.blending = this.blending), this.side !== THREE.FrontSide && (e.side = this.side)) : this instanceof THREE.MeshLambertMaterial ? (e.color = this.color.getHex(), e.emissive = this.emissive.getHex(), this.vertexColors !== THREE.NoColors && (e.vertexColors = this.vertexColors), this.shading !== THREE.SmoothShading && (e.shading = this.shading), this.blending !== THREE.NormalBlending && (e.blending = this.blending), this.side !== THREE.FrontSide && (e.side = this.side)) : this instanceof THREE.MeshPhongMaterial ? (e.color = this.color.getHex(), e.emissive = this.emissive.getHex(), e.specular = this.specular.getHex(), e.shininess = this.shininess, this.vertexColors !== THREE.NoColors && (e.vertexColors = this.vertexColors), this.shading !== THREE.SmoothShading && (e.shading = this.shading), this.blending !== THREE.NormalBlending && (e.blending = this.blending), this.side !== THREE.FrontSide && (e.side = this.side)) : this instanceof THREE.MeshNormalMaterial ? (this.blending !== THREE.NormalBlending && (e.blending = this.blending), this.side !== THREE.FrontSide && (e.side = this.side)) : this instanceof THREE.MeshDepthMaterial ? (this.blending !== THREE.NormalBlending && (e.blending = this.blending), this.side !== THREE.FrontSide && (e.side = this.side)) : this instanceof THREE.PointCloudMaterial ? (e.size = this.size, e.sizeAttenuation = this.sizeAttenuation, e.color = this.color.getHex(), this.vertexColors !== THREE.NoColors && (e.vertexColors = this.vertexColors), this.blending !== THREE.NormalBlending && (e.blending = this.blending)) : this instanceof THREE.ShaderMaterial ? (e.uniforms = this.uniforms, e.vertexShader = this.vertexShader, e.fragmentShader = this.fragmentShader) : this instanceof THREE.SpriteMaterial && (e.color = this.color.getHex()), 1 > this.opacity && (e.opacity = this.opacity), !1 !== this.transparent && (e.transparent = this.transparent), !1 !== this.wireframe && (e.wireframe = this.wireframe), e }, clone: function(e) { return void 0 === e && (e = new THREE.Material), e.name = this.name, e.side = this.side, e.opacity = this.opacity, e.transparent = this.transparent, e.blending = this.blending, e.blendSrc = this.blendSrc, e.blendDst = this.blendDst, e.blendEquation = this.blendEquation, e.blendSrcAlpha = this.blendSrcAlpha, e.blendDstAlpha = this.blendDstAlpha, e.blendEquationAlpha = this.blendEquationAlpha, e.depthTest = this.depthTest, e.depthWrite = this.depthWrite, e.polygonOffset = this.polygonOffset, e.polygonOffsetFactor = this.polygonOffsetFactor, e.polygonOffsetUnits = this.polygonOffsetUnits, e.alphaTest = this.alphaTest, e.overdraw = this.overdraw, e.visible = this.visible, e }, update: function() { this.dispatchEvent({ type: "update" }) }, dispose: function() { this.dispatchEvent({ type: "dispose" }) } }, THREE.EventDispatcher.prototype.apply(THREE.Material.prototype), THREE.MaterialIdCount = 0, THREE.LineBasicMaterial = function(e) { THREE.Material.call(this), this.type = "LineBasicMaterial", this.color = new THREE.Color(16777215), this.linewidth = 1, this.linejoin = this.linecap = "round", this.vertexColors = THREE.NoColors, this.fog = !0, this.setValues(e) }, THREE.LineBasicMaterial.prototype = Object.create(THREE.Material.prototype), THREE.LineBasicMaterial.prototype.constructor = THREE.LineBasicMaterial, THREE.LineBasicMaterial.prototype.clone = function() { var e = new THREE.LineBasicMaterial; return THREE.Material.prototype.clone.call(this, e), e.color.copy(this.color), e.linewidth = this.linewidth, e.linecap = this.linecap, e.linejoin = this.linejoin, e.vertexColors = this.vertexColors, e.fog = this.fog, e }, THREE.LineDashedMaterial = function(e) { THREE.Material.call(this), this.type = "LineDashedMaterial", this.color = new THREE.Color(16777215), this.scale = this.linewidth = 1, this.dashSize = 3, this.gapSize = 1, this.vertexColors = !1, this.fog = !0, this.setValues(e) }, THREE.LineDashedMaterial.prototype = Object.create(THREE.Material.prototype), THREE.LineDashedMaterial.prototype.constructor = THREE.LineDashedMaterial, THREE.LineDashedMaterial.prototype.clone = function() { var e = new THREE.LineDashedMaterial; return THREE.Material.prototype.clone.call(this, e), e.color.copy(this.color), e.linewidth = this.linewidth, e.scale = this.scale, e.dashSize = this.dashSize, e.gapSize = this.gapSize, e.vertexColors = this.vertexColors, e.fog = this.fog, e }, THREE.MeshBasicMaterial = function(e) { THREE.Material.call(this), this.type = "MeshBasicMaterial", this.color = new THREE.Color(16777215), this.envMap = this.alphaMap = this.specularMap = this.lightMap = this.map = null, this.combine = THREE.MultiplyOperation, this.reflectivity = 1, this.refractionRatio = .98, this.fog = !0, this.shading = THREE.SmoothShading, this.wireframe = !1, this.wireframeLinewidth = 1, this.wireframeLinejoin = this.wireframeLinecap = "round", this.vertexColors = THREE.NoColors, this.morphTargets = this.skinning = !1, this.setValues(e) }, THREE.MeshBasicMaterial.prototype = Object.create(THREE.Material.prototype), THREE.MeshBasicMaterial.prototype.constructor = THREE.MeshBasicMaterial, THREE.MeshBasicMaterial.prototype.clone = function() { var e = new THREE.MeshBasicMaterial; return THREE.Material.prototype.clone.call(this, e), e.color.copy(this.color), e.map = this.map, e.lightMap = this.lightMap, e.specularMap = this.specularMap, e.alphaMap = this.alphaMap, e.envMap = this.envMap, e.combine = this.combine, e.reflectivity = this.reflectivity, e.refractionRatio = this.refractionRatio, e.fog = this.fog, e.shading = this.shading, e.wireframe = this.wireframe, e.wireframeLinewidth = this.wireframeLinewidth, e.wireframeLinecap = this.wireframeLinecap, e.wireframeLinejoin = this.wireframeLinejoin, e.vertexColors = this.vertexColors, e.skinning = this.skinning, e.morphTargets = this.morphTargets, e }, THREE.MeshLambertMaterial = function(e) { THREE.Material.call(this), this.type = "MeshLambertMaterial", this.color = new THREE.Color(16777215), this.emissive = new THREE.Color(0), this.wrapAround = !1, this.wrapRGB = new THREE.Vector3(1, 1, 1), this.envMap = this.alphaMap = this.specularMap = this.lightMap = this.map = null, this.combine = THREE.MultiplyOperation, this.reflectivity = 1, this.refractionRatio = .98, this.fog = !0, this.shading = THREE.SmoothShading, this.wireframe = !1, this.wireframeLinewidth = 1, this.wireframeLinejoin = this.wireframeLinecap = "round", this.vertexColors = THREE.NoColors, this.morphNormals = this.morphTargets = this.skinning = !1, this.setValues(e) }, THREE.MeshLambertMaterial.prototype = Object.create(THREE.Material.prototype), THREE.MeshLambertMaterial.prototype.constructor = THREE.MeshLambertMaterial, THREE.MeshLambertMaterial.prototype.clone = function() { var e = new THREE.MeshLambertMaterial; return THREE.Material.prototype.clone.call(this, e), e.color.copy(this.color), e.emissive.copy(this.emissive), e.wrapAround = this.wrapAround, e.wrapRGB.copy(this.wrapRGB), e.map = this.map, e.lightMap = this.lightMap, e.specularMap = this.specularMap, e.alphaMap = this.alphaMap, e.envMap = this.envMap, e.combine = this.combine, e.reflectivity = this.reflectivity, e.refractionRatio = this.refractionRatio, e.fog = this.fog, e.shading = this.shading, e.wireframe = this.wireframe, e.wireframeLinewidth = this.wireframeLinewidth, e.wireframeLinecap = this.wireframeLinecap, e.wireframeLinejoin = this.wireframeLinejoin, e.vertexColors = this.vertexColors, e.skinning = this.skinning, e.morphTargets = this.morphTargets, e.morphNormals = this.morphNormals, e }, THREE.MeshPhongMaterial = function(e) { THREE.Material.call(this), this.type = "MeshPhongMaterial", this.color = new THREE.Color(16777215), this.emissive = new THREE.Color(0), this.specular = new THREE.Color(1118481), this.shininess = 30, this.wrapAround = this.metal = !1, this.wrapRGB = new THREE.Vector3(1, 1, 1), this.bumpMap = this.lightMap = this.map = null, this.bumpScale = 1, this.normalMap = null, this.normalScale = new THREE.Vector2(1, 1), this.envMap = this.alphaMap = this.specularMap = null, this.combine = THREE.MultiplyOperation, this.reflectivity = 1, this.refractionRatio = .98, this.fog = !0, this.shading = THREE.SmoothShading, this.wireframe = !1, this.wireframeLinewidth = 1, this.wireframeLinejoin = this.wireframeLinecap = "round", this.vertexColors = THREE.NoColors, this.morphNormals = this.morphTargets = this.skinning = !1, this.setValues(e) }, THREE.MeshPhongMaterial.prototype = Object.create(THREE.Material.prototype), THREE.MeshPhongMaterial.prototype.constructor = THREE.MeshPhongMaterial, THREE.MeshPhongMaterial.prototype.clone = function() { var e = new THREE.MeshPhongMaterial; return THREE.Material.prototype.clone.call(this, e), e.color.copy(this.color), e.emissive.copy(this.emissive), e.specular.copy(this.specular), e.shininess = this.shininess, e.metal = this.metal, e.wrapAround = this.wrapAround, e.wrapRGB.copy(this.wrapRGB), e.map = this.map, e.lightMap = this.lightMap, e.bumpMap = this.bumpMap, e.bumpScale = this.bumpScale, e.normalMap = this.normalMap, e.normalScale.copy(this.normalScale), e.specularMap = this.specularMap, e.alphaMap = this.alphaMap, e.envMap = this.envMap, e.combine = this.combine, e.reflectivity = this.reflectivity, e.refractionRatio = this.refractionRatio, e.fog = this.fog, e.shading = this.shading, e.wireframe = this.wireframe, e.wireframeLinewidth = this.wireframeLinewidth, e.wireframeLinecap = this.wireframeLinecap, e.wireframeLinejoin = this.wireframeLinejoin, e.vertexColors = this.vertexColors, e.skinning = this.skinning, e.morphTargets = this.morphTargets, e.morphNormals = this.morphNormals, e }, THREE.MeshDepthMaterial = function(e) { THREE.Material.call(this), this.type = "MeshDepthMaterial", this.wireframe = this.morphTargets = !1, this.wireframeLinewidth = 1, this.setValues(e) }, THREE.MeshDepthMaterial.prototype = Object.create(THREE.Material.prototype), THREE.MeshDepthMaterial.prototype.constructor = THREE.MeshDepthMaterial, THREE.MeshDepthMaterial.prototype.clone = function() { var e = new THREE.MeshDepthMaterial; return THREE.Material.prototype.clone.call(this, e), e.wireframe = this.wireframe, e.wireframeLinewidth = this.wireframeLinewidth, e }, THREE.MeshNormalMaterial = function(e) { THREE.Material.call(this, e), this.type = "MeshNormalMaterial", this.wireframe = !1, this.wireframeLinewidth = 1, this.morphTargets = !1, this.setValues(e) }, THREE.MeshNormalMaterial.prototype = Object.create(THREE.Material.prototype), THREE.MeshNormalMaterial.prototype.constructor = THREE.MeshNormalMaterial, THREE.MeshNormalMaterial.prototype.clone = function() { var e = new THREE.MeshNormalMaterial; return THREE.Material.prototype.clone.call(this, e), e.wireframe = this.wireframe, e.wireframeLinewidth = this.wireframeLinewidth, e }, THREE.MeshFaceMaterial = function(e) { this.uuid = THREE.Math.generateUUID(), this.type = "MeshFaceMaterial", this.materials = e instanceof Array ? e : [] }, THREE.MeshFaceMaterial.prototype = { constructor: THREE.MeshFaceMaterial, toJSON: function() { for (var e = { metadata: { version: 4.2, type: "material", generator: "MaterialExporter" }, uuid: this.uuid, type: this.type, materials: [] }, t = 0, r = this.materials.length; r > t; t++) e.materials.push(this.materials[t].toJSON()); return e }, clone: function() { for (var e = new THREE.MeshFaceMaterial, t = 0; t < this.materials.length; t++) e.materials.push(this.materials[t].clone()); return e } }, THREE.PointCloudMaterial = function(e) { THREE.Material.call(this), this.type = "PointCloudMaterial", this.color = new THREE.Color(16777215), this.map = null, this.size = 1, this.sizeAttenuation = !0, this.vertexColors = THREE.NoColors, this.fog = !0, this.setValues(e) }, THREE.PointCloudMaterial.prototype = Object.create(THREE.Material.prototype), THREE.PointCloudMaterial.prototype.constructor = THREE.PointCloudMaterial, THREE.PointCloudMaterial.prototype.clone = function() { var e = new THREE.PointCloudMaterial; return THREE.Material.prototype.clone.call(this, e), e.color.copy(this.color), e.map = this.map, e.size = this.size, e.sizeAttenuation = this.sizeAttenuation, e.vertexColors = this.vertexColors, e.fog = this.fog, e }, THREE.ParticleBasicMaterial = function(e) { return THREE.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointCloudMaterial."), new THREE.PointCloudMaterial(e) }, THREE.ParticleSystemMaterial = function(e) { return THREE.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointCloudMaterial."), new THREE.PointCloudMaterial(e) }, THREE.ShaderMaterial = function(e) { THREE.Material.call(this), this.type = "ShaderMaterial", this.defines = {}, this.uniforms = {}, this.attributes = null, this.vertexShader = "void main() {\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}", this.fragmentShader = "void main() {\n gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}", this.shading = THREE.SmoothShading, this.linewidth = 1, this.wireframe = !1, this.wireframeLinewidth = 1, this.lights = this.fog = !1, this.vertexColors = THREE.NoColors, this.morphNormals = this.morphTargets = this.skinning = !1, this.defaultAttributeValues = { color: [1, 1, 1], uv: [0, 0], uv2: [0, 0] }, this.index0AttributeName = void 0, this.setValues(e) }, THREE.ShaderMaterial.prototype = Object.create(THREE.Material.prototype), THREE.ShaderMaterial.prototype.constructor = THREE.ShaderMaterial, THREE.ShaderMaterial.prototype.clone = function() { var e = new THREE.ShaderMaterial; return THREE.Material.prototype.clone.call(this, e), e.fragmentShader = this.fragmentShader, e.vertexShader = this.vertexShader, e.uniforms = THREE.UniformsUtils.clone(this.uniforms), e.attributes = this.attributes, e.defines = this.defines, e.shading = this.shading, e.wireframe = this.wireframe, e.wireframeLinewidth = this.wireframeLinewidth, e.fog = this.fog, e.lights = this.lights, e.vertexColors = this.vertexColors, e.skinning = this.skinning, e.morphTargets = this.morphTargets, e.morphNormals = this.morphNormals, e }, THREE.RawShaderMaterial = function(e) { THREE.ShaderMaterial.call(this, e), this.type = "RawShaderMaterial" }, THREE.RawShaderMaterial.prototype = Object.create(THREE.ShaderMaterial.prototype), THREE.RawShaderMaterial.prototype.constructor = THREE.RawShaderMaterial, THREE.RawShaderMaterial.prototype.clone = function() { var e = new THREE.RawShaderMaterial; return THREE.ShaderMaterial.prototype.clone.call(this, e), e }, THREE.SpriteMaterial = function(e) { THREE.Material.call(this), this.type = "SpriteMaterial", this.color = new THREE.Color(16777215), this.map = null, this.rotation = 0, this.fog = !1, this.setValues(e) }, THREE.SpriteMaterial.prototype = Object.create(THREE.Material.prototype), THREE.SpriteMaterial.prototype.constructor = THREE.SpriteMaterial, THREE.SpriteMaterial.prototype.clone = function() { var e = new THREE.SpriteMaterial; return THREE.Material.prototype.clone.call(this, e), e.color.copy(this.color), e.map = this.map, e.rotation = this.rotation, e.fog = this.fog, e }, THREE.Texture = function(e, t, r, i, n, o, a, s, h) { Object.defineProperty(this, "id", { value: THREE.TextureIdCount++ }), this.uuid = THREE.Math.generateUUID(), this.sourceFile = this.name = "", this.image = void 0 !== e ? e : THREE.Texture.DEFAULT_IMAGE, this.mipmaps = [], this.mapping = void 0 !== t ? t : THREE.Texture.DEFAULT_MAPPING, this.wrapS = void 0 !== r ? r : THREE.ClampToEdgeWrapping, this.wrapT = void 0 !== i ? i : THREE.ClampToEdgeWrapping, this.magFilter = void 0 !== n ? n : THREE.LinearFilter, this.minFilter = void 0 !== o ? o : THREE.LinearMipMapLinearFilter, this.anisotropy = void 0 !== h ? h : 1, this.format = void 0 !== a ? a : THREE.RGBAFormat, this.type = void 0 !== s ? s : THREE.UnsignedByteType, this.offset = new THREE.Vector2(0, 0), this.repeat = new THREE.Vector2(1, 1), this.generateMipmaps = !0, this.premultiplyAlpha = !1, this.flipY = !0, this.unpackAlignment = 4, this._needsUpdate = !1, this.onUpdate = null }, THREE.Texture.DEFAULT_IMAGE = void 0, THREE.Texture.DEFAULT_MAPPING = THREE.UVMapping, THREE.Texture.prototype = { constructor: THREE.Texture, get needsUpdate() { return this._needsUpdate }, set needsUpdate(e) {!0 === e && this.update(), this._needsUpdate = e }, clone: function(e) { return void 0 === e && (e = new THREE.Texture), e.image = this.image, e.mipmaps = this.mipmaps.slice(0), e.mapping = this.mapping, e.wrapS = this.wrapS, e.wrapT = this.wrapT, e.magFilter = this.magFilter, e.minFilter = this.minFilter, e.anisotropy = this.anisotropy, e.format = this.format, e.type = this.type, e.offset.copy(this.offset), e.repeat.copy(this.repeat), e.generateMipmaps = this.generateMipmaps, e.premultiplyAlpha = this.premultiplyAlpha, e.flipY = this.flipY, e.unpackAlignment = this.unpackAlignment, e }, update: function() { this.dispatchEvent({ type: "update" }) }, dispose: function() { this.dispatchEvent({ type: "dispose" }) } }, THREE.EventDispatcher.prototype.apply(THREE.Texture.prototype), THREE.TextureIdCount = 0, THREE.CubeTexture = function(e, t, r, i, n, o, a, s, h) { t = void 0 !== t ? t : THREE.CubeReflectionMapping, THREE.Texture.call(this, e, t, r, i, n, o, a, s, h), this.images = e }, THREE.CubeTexture.prototype = Object.create(THREE.Texture.prototype), THREE.CubeTexture.prototype.constructor = THREE.CubeTexture, THREE.CubeTexture.clone = function(e) { return void 0 === e && (e = new THREE.CubeTexture), THREE.Texture.prototype.clone.call(this, e), e.images = this.images, e }, THREE.CompressedTexture = function(e, t, r, i, n, o, a, s, h, l, c) { THREE.Texture.call(this, null, o, a, s, h, l, i, n, c), this.image = { width: t, height: r }, this.mipmaps = e, this.generateMipmaps = this.flipY = !1 }, THREE.CompressedTexture.prototype = Object.create(THREE.Texture.prototype), THREE.CompressedTexture.prototype.constructor = THREE.CompressedTexture, THREE.CompressedTexture.prototype.clone = function() { var e = new THREE.CompressedTexture; return THREE.Texture.prototype.clone.call(this, e), e }, THREE.DataTexture = function(e, t, r, i, n, o, a, s, h, l, c) { THREE.Texture.call(this, null, o, a, s, h, l, i, n, c), this.image = { data: e, width: t, height: r } }, THREE.DataTexture.prototype = Object.create(THREE.Texture.prototype), THREE.DataTexture.prototype.constructor = THREE.DataTexture, THREE.DataTexture.prototype.clone = function() { var e = new THREE.DataTexture; return THREE.Texture.prototype.clone.call(this, e), e }, THREE.VideoTexture = function(e, t, r, i, n, o, a, s, h) { THREE.Texture.call(this, e, t, r, i, n, o, a, s, h), this.generateMipmaps = !1; var l = this, c = function() { requestAnimationFrame(c), e.readyState === e.HAVE_ENOUGH_DATA && (l.needsUpdate = !0) }; c() }, THREE.VideoTexture.prototype = Object.create(THREE.Texture.prototype), THREE.VideoTexture.prototype.constructor = THREE.VideoTexture, THREE.Group = function() { THREE.Object3D.call(this), this.type = "Group" }, THREE.Group.prototype = Object.create(THREE.Object3D.prototype), THREE.Group.prototype.constructor = THREE.Group, THREE.PointCloud = function(e, t) { THREE.Object3D.call(this), this.type = "PointCloud", this.geometry = void 0 !== e ? e : new THREE.Geometry, this.material = void 0 !== t ? t : new THREE.PointCloudMaterial({ color: 16777215 * Math.random() }) }, THREE.PointCloud.prototype = Object.create(THREE.Object3D.prototype), THREE.PointCloud.prototype.constructor = THREE.PointCloud, THREE.PointCloud.prototype.raycast = function() { var e = new THREE.Matrix4, t = new THREE.Ray; return function(r, i) { var n = this, o = n.geometry, a = r.params.PointCloud.threshold; if (e.getInverse(this.matrixWorld), t.copy(r.ray).applyMatrix4(e), null === o.boundingBox || !1 !== t.isIntersectionBox(o.boundingBox)) { var s = a / ((this.scale.x + this.scale.y + this.scale.z) / 3), h = new THREE.Vector3, a = function(e, o) { var a = t.distanceToPoint(e); if (s > a) { var h = t.closestPointToPoint(e); h.applyMatrix4(n.matrixWorld); var l = r.ray.origin.distanceTo(h); i.push({ distance: l, distanceToRay: a, point: h.clone(), index: o, face: null, object: n }) } }; if (o instanceof THREE.BufferGeometry) { var l = o.attributes, c = l.position.array; if (void 0 !== l.index) { var l = l.index.array, u = o.offsets; 0 === u.length && (u = [{ start: 0, count: l.length, index: 0 }]); for (var E = 0, p = u.length; p > E; ++E) for (var d = u[E].start, f = u[E].index, o = d, d = d + u[E].count; d > o; o++) { var m = f + l[o]; h.fromArray(c, 3 * m), a(h, m) } } else for (l = c.length / 3, o = 0; l > o; o++) h.set(c[3 * o], c[3 * o + 1], c[3 * o + 2]), a(h, o) } else for (h = this.geometry.vertices, o = 0; o < h.length; o++) a(h[o], o) } } }(), THREE.PointCloud.prototype.clone = function(e) { return void 0 === e && (e = new THREE.PointCloud(this.geometry, this.material)), THREE.Object3D.prototype.clone.call(this, e), e }, THREE.ParticleSystem = function(e, t) { return THREE.warn("THREE.ParticleSystem has been renamed to THREE.PointCloud."), new THREE.PointCloud(e, t) }, THREE.Line = function(e, t, r) { THREE.Object3D.call(this), this.type = "Line", this.geometry = void 0 !== e ? e : new THREE.Geometry, this.material = void 0 !== t ? t : new THREE.LineBasicMaterial({ color: 16777215 * Math.random() }), this.mode = void 0 !== r ? r : THREE.LineStrip }, THREE.LineStrip = 0, THREE.LinePieces = 1, THREE.Line.prototype = Object.create(THREE.Object3D.prototype), THREE.Line.prototype.constructor = THREE.Line, THREE.Line.prototype.raycast = function() { var e = new THREE.Matrix4, t = new THREE.Ray, r = new THREE.Sphere; return function(i, n) { var o = i.linePrecision, o = o * o, a = this.geometry; if (null === a.boundingSphere && a.computeBoundingSphere(), r.copy(a.boundingSphere), r.applyMatrix4(this.matrixWorld), !1 !== i.ray.isIntersectionSphere(r)) { e.getInverse(this.matrixWorld), t.copy(i.ray).applyMatrix4(e); var s = new THREE.Vector3, h = new THREE.Vector3, l = new THREE.Vector3, c = new THREE.Vector3, u = this.mode === THREE.LineStrip ? 1 : 2; if (a instanceof THREE.BufferGeometry) { var E = a.attributes; if (void 0 !== E.index) { var p = E.index.array, E = E.position.array, d = a.offsets; 0 === d.length && (d = [{ start: 0, count: p.length, index: 0 }]); for (var f = 0; f < d.length; f++) for (var m = d[f].start, T = d[f].count, g = d[f].index, a = m; m + T - 1 > a; a += u) { var R = g + p[a + 1]; s.fromArray(E, 3 * (g + p[a])), h.fromArray(E, 3 * R), R = t.distanceSqToSegment(s, h, c, l), R > o || (R = t.origin.distanceTo(c), R < i.near || R > i.far || n.push({ distance: R, point: l.clone().applyMatrix4(this.matrixWorld), index: a, offsetIndex: f, face: null, faceIndex: null, object: this })) } } else for (E = E.position.array, a = 0; a < E.length / 3 - 1; a += u) s.fromArray(E, 3 * a), h.fromArray(E, 3 * a + 3), R = t.distanceSqToSegment(s, h, c, l), R > o || (R = t.origin.distanceTo(c), R < i.near || R > i.far || n.push({ distance: R, point: l.clone().applyMatrix4(this.matrixWorld), index: a, face: null, faceIndex: null, object: this })) } else if (a instanceof THREE.Geometry) for (s = a.vertices, h = s.length, a = 0; h - 1 > a; a += u) R = t.distanceSqToSegment(s[a], s[a + 1], c, l), R > o || (R = t.origin.distanceTo(c), R < i.near || R > i.far || n.push({ distance: R, point: l.clone().applyMatrix4(this.matrixWorld), index: a, face: null, faceIndex: null, object: this })) } } }(), THREE.Line.prototype.clone = function(e) { return void 0 === e && (e = new THREE.Line(this.geometry, this.material, this.mode)), THREE.Object3D.prototype.clone.call(this, e), e }, THREE.Mesh = function(e, t) { THREE.Object3D.call(this), this.type = "Mesh", this.geometry = void 0 !== e ? e : new THREE.Geometry, this.material = void 0 !== t ? t : new THREE.MeshBasicMaterial({ color: 16777215 * Math.random() }), this.updateMorphTargets() }, THREE.Mesh.prototype = Object.create(THREE.Object3D.prototype), THREE.Mesh.prototype.constructor = THREE.Mesh, THREE.Mesh.prototype.updateMorphTargets = function() { if (void 0 !== this.geometry.morphTargets && 0 < this.geometry.morphTargets.length) { this.morphTargetBase = -1, this.morphTargetForcedOrder = [], this.morphTargetInfluences = [], this.morphTargetDictionary = {}; for (var e = 0, t = this.geometry.morphTargets.length; t > e; e++) this.morphTargetInfluences.push(0), this.morphTargetDictionary[this.geometry.morphTargets[e].name] = e } }, THREE.Mesh.prototype.getMorphTargetIndexByName = function(e) { return void 0 !== this.morphTargetDictionary[e] ? this.morphTargetDictionary[e] : (THREE.warn("THREE.Mesh.getMorphTargetIndexByName: morph target " + e + " does not exist. Returning 0."), 0) }, THREE.Mesh.prototype.raycast = function() { var e = new THREE.Matrix4, t = new THREE.Ray, r = new THREE.Sphere, i = new THREE.Vector3, n = new THREE.Vector3, o = new THREE.Vector3; return function(a, s) { var h = this.geometry; if (null === h.boundingSphere && h.computeBoundingSphere(), r.copy(h.boundingSphere), r.applyMatrix4(this.matrixWorld), !1 !== a.ray.isIntersectionSphere(r) && (e.getInverse(this.matrixWorld), t.copy(a.ray).applyMatrix4(e), null === h.boundingBox || !1 !== t.isIntersectionBox(h.boundingBox))) if (h instanceof THREE.BufferGeometry) { var l = this.material; if (void 0 !== l) { var c, u, E = h.attributes, p = a.precision; if (void 0 !== E.index) { var d = E.index.array, f = E.position.array, m = h.offsets; 0 === m.length && (m = [{ start: 0, count: d.length, index: 0 }]); for (var T = 0, g = m.length; g > T; ++T) for (var E = m[T].start, R = m[T].index, h = E, y = E + m[T].count; y > h; h += 3) { E = R + d[h], c = R + d[h + 1], u = R + d[h + 2], i.fromArray(f, 3 * E), n.fromArray(f, 3 * c), o.fromArray(f, 3 * u); var v = l.side === THREE.BackSide ? t.intersectTriangle(o, n, i, !0) : t.intersectTriangle(i, n, o, l.side !== THREE.DoubleSide); if (null !== v) { v.applyMatrix4(this.matrixWorld); var H = a.ray.origin.distanceTo(v); p > H || H < a.near || H > a.far || s.push({ distance: H, point: v, face: new THREE.Face3(E, c, u, THREE.Triangle.normal(i, n, o)), faceIndex: null, object: this }) } } } else for (f = E.position.array, d = h = 0, y = f.length; y > h; h += 3, d += 9) E = h, c = h + 1, u = h + 2, i.fromArray(f, d), n.fromArray(f, d + 3), o.fromArray(f, d + 6), v = l.side === THREE.BackSide ? t.intersectTriangle(o, n, i, !0) : t.intersectTriangle(i, n, o, l.side !== THREE.DoubleSide), null !== v && (v.applyMatrix4(this.matrixWorld), H = a.ray.origin.distanceTo(v), p > H || H < a.near || H > a.far || s.push({ distance: H, point: v, face: new THREE.Face3(E, c, u, THREE.Triangle.normal(i, n, o)), faceIndex: null, object: this })) } } else if (h instanceof THREE.Geometry) for (d = this.material instanceof THREE.MeshFaceMaterial, f = !0 === d ? this.material.materials : null, p = a.precision, m = h.vertices, T = 0, g = h.faces.length; g > T; T++) if (R = h.faces[T], l = !0 === d ? f[R.materialIndex] : this.material, void 0 !== l) { if (E = m[R.a], c = m[R.b], u = m[R.c], !0 === l.morphTargets) { v = h.morphTargets, H = this.morphTargetInfluences, i.set(0, 0, 0), n.set(0, 0, 0), o.set(0, 0, 0); for (var y = 0, x = v.length; x > y; y++) { var b = H[y]; if (0 !== b) { var w = v[y].vertices; i.x += (w[R.a].x - E.x) * b, i.y += (w[R.a].y - E.y) * b, i.z += (w[R.a].z - E.z) * b, n.x += (w[R.b].x - c.x) * b, n.y += (w[R.b].y - c.y) * b, n.z += (w[R.b].z - c.z) * b, o.x += (w[R.c].x - u.x) * b, o.y += (w[R.c].y - u.y) * b, o.z += (w[R.c].z - u.z) * b } } i.add(E), n.add(c), o.add(u), E = i, c = n, u = o } v = l.side === THREE.BackSide ? t.intersectTriangle(u, c, E, !0) : t.intersectTriangle(E, c, u, l.side !== THREE.DoubleSide), null !== v && (v.applyMatrix4(this.matrixWorld), H = a.ray.origin.distanceTo(v), p > H || H < a.near || H > a.far || s.push({ distance: H, point: v, face: R, faceIndex: T, object: this })) } } }(), THREE.Mesh.prototype.clone = function(e, t) { return void 0 === e && (e = new THREE.Mesh(this.geometry, this.material)), THREE.Object3D.prototype.clone.call(this, e, t), e }, THREE.Bone = function(e) { THREE.Object3D.call(this), this.type = "Bone", this.skin = e }, THREE.Bone.prototype = Object.create(THREE.Object3D.prototype), THREE.Bone.prototype.constructor = THREE.Bone, THREE.Skeleton = function(e, t, r) { if (this.useVertexTexture = void 0 !== r ? r : !0, this.identityMatrix = new THREE.Matrix4, e = e || [], this.bones = e.slice(0), this.useVertexTexture ? (this.boneTextureHeight = this.boneTextureWidth = e = 256 < this.bones.length ? 64 : 64 < this.bones.length ? 32 : 16 < this.bones.length ? 16 : 8, this.boneMatrices = new Float32Array(this.boneTextureWidth * this.boneTextureHeight * 4), this.boneTexture = new THREE.DataTexture(this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, THREE.RGBAFormat, THREE.FloatType), this.boneTexture.minFilter = THREE.NearestFilter, this.boneTexture.magFilter = THREE.NearestFilter, this.boneTexture.generateMipmaps = !1, this.boneTexture.flipY = !1) : this.boneMatrices = new Float32Array(16 * this.bones.length), void 0 === t) this.calculateInverses(); else if (this.bones.length === t.length) this.boneInverses = t.slice(0); else for (THREE.warn("THREE.Skeleton bonInverses is the wrong length."), this.boneInverses = [], t = 0, e = this.bones.length; e > t; t++) this.boneInverses.push(new THREE.Matrix4) }, THREE.Skeleton.prototype.calculateInverses = function() { this.boneInverses = []; for (var e = 0, t = this.bones.length; t > e; e++) { var r = new THREE.Matrix4; this.bones[e] && r.getInverse(this.bones[e].matrixWorld), this.boneInverses.push(r) } }, THREE.Skeleton.prototype.pose = function() { for (var e, t = 0, r = this.bones.length; r > t; t++)(e = this.bones[t]) && e.matrixWorld.getInverse(this.boneInverses[t]); for (t = 0, r = this.bones.length; r > t; t++)(e = this.bones[t]) && (e.parent ? (e.matrix.getInverse(e.parent.matrixWorld), e.matrix.multiply(e.matrixWorld)) : e.matrix.copy(e.matrixWorld), e.matrix.decompose(e.position, e.quaternion, e.scale)) }, THREE.Skeleton.prototype.update = function() { var e = new THREE.Matrix4; return function() { for (var t = 0, r = this.bones.length; r > t; t++) e.multiplyMatrices(this.bones[t] ? this.bones[t].matrixWorld : this.identityMatrix, this.boneInverses[t]), e.flattenToArrayOffset(this.boneMatrices, 16 * t); this.useVertexTexture && (this.boneTexture.needsUpdate = !0) } }(), THREE.SkinnedMesh = function(e, t, r) { if (THREE.Mesh.call(this, e, t), this.type = "SkinnedMesh", this.bindMode = "attached", this.bindMatrix = new THREE.Matrix4, this.bindMatrixInverse = new THREE.Matrix4, e = [], this.geometry && void 0 !== this.geometry.bones) { for (var i, n, o, a, s = 0, h = this.geometry.bones.length; h > s; ++s) i = this.geometry.bones[s], n = i.pos, o = i.rotq, a = i.scl, t = new THREE.Bone(this), e.push(t), t.name = i.name, t.position.set(n[0], n[1], n[2]), t.quaternion.set(o[0], o[1], o[2], o[3]), void 0 !== a ? t.scale.set(a[0], a[1], a[2]) : t.scale.set(1, 1, 1); for (s = 0, h = this.geometry.bones.length; h > s; ++s) i = this.geometry.bones[s], -1 !== i.parent ? e[i.parent].add(e[s]) : this.add(e[s]) } this.normalizeSkinWeights(), this.updateMatrixWorld(!0), this.bind(new THREE.Skeleton(e, void 0, r)) }, THREE.SkinnedMesh.prototype = Object.create(THREE.Mesh.prototype), THREE.SkinnedMesh.prototype.constructor = THREE.SkinnedMesh, THREE.SkinnedMesh.prototype.bind = function(e, t) { this.skeleton = e, void 0 === t && (this.updateMatrixWorld(!0), t = this.matrixWorld), this.bindMatrix.copy(t), this.bindMatrixInverse.getInverse(t) }, THREE.SkinnedMesh.prototype.pose = function() { this.skeleton.pose() }, THREE.SkinnedMesh.prototype.normalizeSkinWeights = function() { if (this.geometry instanceof THREE.Geometry) for (var e = 0; e < this.geometry.skinIndices.length; e++) { var t = this.geometry.skinWeights[e], r = 1 / t.lengthManhattan(); 1 / 0 !== r ? t.multiplyScalar(r) : t.set(1) } }, THREE.SkinnedMesh.prototype.updateMatrixWorld = function(e) { THREE.Mesh.prototype.updateMatrixWorld.call(this, !0), "attached" === this.bindMode ? this.bindMatrixInverse.getInverse(this.matrixWorld) : "detached" === this.bindMode ? this.bindMatrixInverse.getInverse(this.bindMatrix) : THREE.warn("THREE.SkinnedMesh unreckognized bindMode: " + this.bindMode) }, THREE.SkinnedMesh.prototype.clone = function(e) { return void 0 === e && (e = new THREE.SkinnedMesh(this.geometry, this.material, this.useVertexTexture)), THREE.Mesh.prototype.clone.call(this, e), e }, THREE.MorphAnimMesh = function(e, t) { THREE.Mesh.call(this, e, t), this.type = "MorphAnimMesh", this.duration = 1e3, this.mirroredLoop = !1, this.currentKeyframe = this.lastKeyframe = this.time = 0, this.direction = 1, this.directionBackwards = !1, this.setFrameRange(0, this.geometry.morphTargets.length - 1) }, THREE.MorphAnimMesh.prototype = Object.create(THREE.Mesh.prototype), THREE.MorphAnimMesh.prototype.constructor = THREE.MorphAnimMesh, THREE.MorphAnimMesh.prototype.setFrameRange = function(e, t) { this.startKeyframe = e, this.endKeyframe = t, this.length = this.endKeyframe - this.startKeyframe + 1 }, THREE.MorphAnimMesh.prototype.setDirectionForward = function() { this.direction = 1, this.directionBackwards = !1 }, THREE.MorphAnimMesh.prototype.setDirectionBackward = function() { this.direction = -1, this.directionBackwards = !0 }, THREE.MorphAnimMesh.prototype.parseAnimations = function() { var e = this.geometry; e.animations || (e.animations = {}); for (var t, r = e.animations, i = /([a-z]+)_?(\d+)/, n = 0, o = e.morphTargets.length; o > n; n++) { var a = e.morphTargets[n].name.match(i); if (a && 1 < a.length) { a = a[1], r[a] || (r[a] = { start: 1 / 0, end: -(1 / 0) }); var s = r[a]; n < s.start && (s.start = n), n > s.end && (s.end = n), t || (t = a) } } e.firstAnimation = t }, THREE.MorphAnimMesh.prototype.setAnimationLabel = function(e, t, r) { this.geometry.animations || (this.geometry.animations = {}), this.geometry.animations[e] = { start: t, end: r } }, THREE.MorphAnimMesh.prototype.playAnimation = function(e, t) { var r = this.geometry.animations[e]; r ? (this.setFrameRange(r.start, r.end), this.duration = (r.end - r.start) / t * 1e3, this.time = 0) : THREE.warn("THREE.MorphAnimMesh: animation[" + e + "] undefined in .playAnimation()") }, THREE.MorphAnimMesh.prototype.updateAnimation = function(e) { var t = this.duration / this.length; this.time += this.direction * e, this.mirroredLoop ? (this.time > this.duration || 0 > this.time) && (this.direction *= -1, this.time > this.duration && (this.time = this.duration, this.directionBackwards = !0), 0 > this.time && (this.time = 0, this.directionBackwards = !1)) : (this.time %= this.duration, 0 > this.time && (this.time += this.duration)), e = this.startKeyframe + THREE.Math.clamp(Math.floor(this.time / t), 0, this.length - 1), e !== this.currentKeyframe && (this.morphTargetInfluences[this.lastKeyframe] = 0, this.morphTargetInfluences[this.currentKeyframe] = 1, this.morphTargetInfluences[e] = 0, this.lastKeyframe = this.currentKeyframe, this.currentKeyframe = e), t = this.time % t / t, this.directionBackwards && (t = 1 - t), this.morphTargetInfluences[this.currentKeyframe] = t, this.morphTargetInfluences[this.lastKeyframe] = 1 - t }, THREE.MorphAnimMesh.prototype.interpolateTargets = function(e, t, r) { for (var i = this.morphTargetInfluences, n = 0, o = i.length; o > n; n++) i[n] = 0; e > -1 && (i[e] = 1 - r), t > -1 && (i[t] = r) }, THREE.MorphAnimMesh.prototype.clone = function(e) { return void 0 === e && (e = new THREE.MorphAnimMesh(this.geometry, this.material)), e.duration = this.duration, e.mirroredLoop = this.mirroredLoop, e.time = this.time, e.lastKeyframe = this.lastKeyframe, e.currentKeyframe = this.currentKeyframe, e.direction = this.direction, e.directionBackwards = this.directionBackwards, THREE.Mesh.prototype.clone.call(this, e), e }, THREE.LOD = function() { THREE.Object3D.call(this), this.objects = [] }, THREE.LOD.prototype = Object.create(THREE.Object3D.prototype), THREE.LOD.prototype.constructor = THREE.LOD, THREE.LOD.prototype.addLevel = function(e, t) { void 0 === t && (t = 0), t = Math.abs(t); for (var r = 0; r < this.objects.length && !(t < this.objects[r].distance); r++); this.objects.splice(r, 0, { distance: t, object: e }), this.add(e) }, THREE.LOD.prototype.getObjectForDistance = function(e) { for (var t = 1, r = this.objects.length; r > t && !(e < this.objects[t].distance); t++); return this.objects[t - 1].object }, THREE.LOD.prototype.raycast = function() { var e = new THREE.Vector3; return function(t, r) { e.setFromMatrixPosition(this.matrixWorld); var i = t.ray.origin.distanceTo(e); this.getObjectForDistance(i).raycast(t, r) } }(), THREE.LOD.prototype.update = function() { var e = new THREE.Vector3, t = new THREE.Vector3; return function(r) { if (1 < this.objects.length) { e.setFromMatrixPosition(r.matrixWorld), t.setFromMatrixPosition(this.matrixWorld), r = e.distanceTo(t), this.objects[0].object.visible = !0; for (var i = 1, n = this.objects.length; n > i && r >= this.objects[i].distance; i++) this.objects[i - 1].object.visible = !1, this.objects[i].object.visible = !0; for (; n > i; i++) this.objects[i].object.visible = !1 } } }(), THREE.LOD.prototype.clone = function(e) { void 0 === e && (e = new THREE.LOD), THREE.Object3D.prototype.clone.call(this, e); for (var t = 0, r = this.objects.length; r > t; t++) { var i = this.objects[t].object.clone(); i.visible = 0 === t, e.addLevel(i, this.objects[t].distance) } return e }, THREE.Sprite = function() { var e = new Uint16Array([0, 1, 2, 0, 2, 3]), t = new Float32Array([-.5, -.5, 0, .5, -.5, 0, .5, .5, 0, -.5, .5, 0]), r = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]), i = new THREE.BufferGeometry; return i.addAttribute("index", new THREE.BufferAttribute(e, 1)), i.addAttribute("position", new THREE.BufferAttribute(t, 3)), i.addAttribute("uv", new THREE.BufferAttribute(r, 2)), function(e) { THREE.Object3D.call(this), this.type = "Sprite", this.geometry = i, this.material = void 0 !== e ? e : new THREE.SpriteMaterial } }(), THREE.Sprite.prototype = Object.create(THREE.Object3D.prototype), THREE.Sprite.prototype.constructor = THREE.Sprite, THREE.Sprite.prototype.raycast = function() { var e = new THREE.Vector3; return function(t, r) { e.setFromMatrixPosition(this.matrixWorld); var i = t.ray.distanceToPoint(e); i > this.scale.x || r.push({ distance: i, point: this.position, face: null, object: this }) } }(), THREE.Sprite.prototype.clone = function(e) { return void 0 === e && (e = new THREE.Sprite(this.material)), THREE.Object3D.prototype.clone.call(this, e), e }, THREE.Particle = THREE.Sprite, THREE.LensFlare = function(e, t, r, i, n) { THREE.Object3D.call(this), this.lensFlares = [], this.positionScreen = new THREE.Vector3, this.customUpdateCallback = void 0, void 0 !== e && this.add(e, t, r, i, n) }, THREE.LensFlare.prototype = Object.create(THREE.Object3D.prototype), THREE.LensFlare.prototype.constructor = THREE.LensFlare, THREE.LensFlare.prototype.add = function(e, t, r, i, n, o) { void 0 === t && (t = -1), void 0 === r && (r = 0), void 0 === o && (o = 1), void 0 === n && (n = new THREE.Color(16777215)), void 0 === i && (i = THREE.NormalBlending), r = Math.min(r, Math.max(0, r)), this.lensFlares.push({ texture: e, size: t, distance: r, x: 0, y: 0, z: 0, scale: 1, rotation: 1, opacity: o, color: n, blending: i }) }, THREE.LensFlare.prototype.updateLensFlares = function() { var e, t, r = this.lensFlares.length, i = 2 * -this.positionScreen.x, n = 2 * -this.positionScreen.y; for (e = 0; r > e; e++) t = this.lensFlares[e], t.x = this.positionScreen.x + i * t.distance, t.y = this.positionScreen.y + n * t.distance, t.wantedRotation = t.x * Math.PI * .25, t.rotation += .25 * (t.wantedRotation - t.rotation) }, THREE.Scene = function() { THREE.Object3D.call(this), this.type = "Scene", this.overrideMaterial = this.fog = null, this.autoUpdate = !0 }, THREE.Scene.prototype = Object.create(THREE.Object3D.prototype), THREE.Scene.prototype.constructor = THREE.Scene, THREE.Scene.prototype.clone = function(e) { return void 0 === e && (e = new THREE.Scene), THREE.Object3D.prototype.clone.call(this, e), null !== this.fog && (e.fog = this.fog.clone()), null !== this.overrideMaterial && (e.overrideMaterial = this.overrideMaterial.clone()), e.autoUpdate = this.autoUpdate, e.matrixAutoUpdate = this.matrixAutoUpdate, e }, THREE.Fog = function(e, t, r) { this.name = "", this.color = new THREE.Color(e), this.near = void 0 !== t ? t : 1, this.far = void 0 !== r ? r : 1e3 }, THREE.Fog.prototype.clone = function() { return new THREE.Fog(this.color.getHex(), this.near, this.far) }, THREE.FogExp2 = function(e, t) { this.name = "", this.color = new THREE.Color(e), this.density = void 0 !== t ? t : 25e-5 }, THREE.FogExp2.prototype.clone = function() { return new THREE.FogExp2(this.color.getHex(), this.density) }, THREE.ShaderChunk = {}, THREE.ShaderChunk.common = "#define PI 3.14159\n#define PI2 6.28318\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n\nfloat square( in float a ) { return a*a; }\nvec2 square( in vec2 a ) { return vec2( a.x*a.x, a.y*a.y ); }\nvec3 square( in vec3 a ) { return vec3( a.x*a.x, a.y*a.y, a.z*a.z ); }\nvec4 square( in vec4 a ) { return vec4( a.x*a.x, a.y*a.y, a.z*a.z, a.w*a.w ); }\nfloat saturate( in float a ) { return clamp( a, 0.0, 1.0 ); }\nvec2 saturate( in vec2 a ) { return clamp( a, 0.0, 1.0 ); }\nvec3 saturate( in vec3 a ) { return clamp( a, 0.0, 1.0 ); }\nvec4 saturate( in vec4 a ) { return clamp( a, 0.0, 1.0 ); }\nfloat average( in float a ) { return a; }\nfloat average( in vec2 a ) { return ( a.x + a.y) * 0.5; }\nfloat average( in vec3 a ) { return ( a.x + a.y + a.z) / 3.0; }\nfloat average( in vec4 a ) { return ( a.x + a.y + a.z + a.w) * 0.25; }\nfloat whiteCompliment( in float a ) { return saturate( 1.0 - a ); }\nvec2 whiteCompliment( in vec2 a ) { return saturate( vec2(1.0) - a ); }\nvec3 whiteCompliment( in vec3 a ) { return saturate( vec3(1.0) - a ); }\nvec4 whiteCompliment( in vec4 a ) { return saturate( vec4(1.0) - a ); }\nvec3 transformDirection( in vec3 normal, in mat4 matrix ) {\n return normalize( ( matrix * vec4( normal, 0.0 ) ).xyz );\n}\n// http://en.wikibooks.org/wiki/GLSL_Programming/Applying_Matrix_Transformations\nvec3 inverseTransformDirection( in vec3 normal, in mat4 matrix ) {\n return normalize( ( vec4( normal, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal) {\n float distance = dot( planeNormal, point-pointOnPlane );\n return point - distance * planeNormal;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n return sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n return pointOnLine + lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) );\n}\nfloat calcLightAttenuation( float lightDistance, float cutoffDistance, float decayExponent ) {\n if ( decayExponent > 0.0 ) {\n return pow( saturate( 1.0 - lightDistance / cutoffDistance ), decayExponent );\n }\n return 1.0;\n}\n\nvec3 inputToLinear( in vec3 a ) {\n#ifdef GAMMA_INPUT\n return pow( a, vec3( float( GAMMA_FACTOR ) ) );\n#else\n return a;\n#endif\n}\nvec3 linearToOutput( in vec3 a ) {\n#ifdef GAMMA_OUTPUT\n return pow( a, vec3( 1.0 / float( GAMMA_FACTOR ) ) );\n#else\n return a;\n#endif\n}\n", THREE.ShaderChunk.alphatest_fragment = "#ifdef ALPHATEST\n\n if ( diffuseColor.a < ALPHATEST ) discard;\n\n#endif\n", THREE.ShaderChunk.lights_lambert_vertex = "vLightFront = vec3( 0.0 );\n\n#ifdef DOUBLE_SIDED\n\n vLightBack = vec3( 0.0 );\n\n#endif\n\ntransformedNormal = normalize( transformedNormal );\n\n#if MAX_DIR_LIGHTS > 0\n\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\n\n vec3 dirVector = transformDirection( directionalLightDirection[ i ], viewMatrix );\n\n float dotProduct = dot( transformedNormal, dirVector );\n vec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\n\n #ifdef DOUBLE_SIDED\n\n vec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n\n #ifdef WRAP_AROUND\n\n vec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n\n #endif\n\n #endif\n\n #ifdef WRAP_AROUND\n\n vec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\n directionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\n\n #ifdef DOUBLE_SIDED\n\n directionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\n\n #endif\n\n #endif\n\n vLightFront += directionalLightColor[ i ] * directionalLightWeighting;\n\n #ifdef DOUBLE_SIDED\n\n vLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\n\n #endif\n\n}\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n for( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n\n vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\n vec3 lVector = lPosition.xyz - mvPosition.xyz;\n\n float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[ i ] );\n\n lVector = normalize( lVector );\n float dotProduct = dot( transformedNormal, lVector );\n\n vec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\n\n #ifdef DOUBLE_SIDED\n\n vec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n\n #ifdef WRAP_AROUND\n\n vec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n\n #endif\n\n #endif\n\n #ifdef WRAP_AROUND\n\n vec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\n pointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\n\n #ifdef DOUBLE_SIDED\n\n pointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\n\n #endif\n\n #endif\n\n vLightFront += pointLightColor[ i ] * pointLightWeighting * attenuation;\n\n #ifdef DOUBLE_SIDED\n\n vLightBack += pointLightColor[ i ] * pointLightWeightingBack * attenuation;\n\n #endif\n\n }\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n for( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n\n vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\n vec3 lVector = lPosition.xyz - mvPosition.xyz;\n\n float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - worldPosition.xyz ) );\n\n if ( spotEffect > spotLightAngleCos[ i ] ) {\n\n spotEffect = max( pow( max( spotEffect, 0.0 ), spotLightExponent[ i ] ), 0.0 );\n\n float attenuation = calcLightAttenuation( length( lVector ), spotLightDistance[ i ], spotLightDecay[ i ] );\n\n lVector = normalize( lVector );\n\n float dotProduct = dot( transformedNormal, lVector );\n vec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\n\n #ifdef DOUBLE_SIDED\n\n vec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n\n #ifdef WRAP_AROUND\n\n vec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n\n #endif\n\n #endif\n\n #ifdef WRAP_AROUND\n\n vec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\n spotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\n\n #ifdef DOUBLE_SIDED\n\n spotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\n\n #endif\n\n #endif\n\n vLightFront += spotLightColor[ i ] * spotLightWeighting * attenuation * spotEffect;\n\n #ifdef DOUBLE_SIDED\n\n vLightBack += spotLightColor[ i ] * spotLightWeightingBack * attenuation * spotEffect;\n\n #endif\n\n }\n\n }\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\n\n vec3 lVector = transformDirection( hemisphereLightDirection[ i ], viewMatrix );\n\n float dotProduct = dot( transformedNormal, lVector );\n\n float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\n float hemiDiffuseWeightBack = -0.5 * dotProduct + 0.5;\n\n vLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n\n #ifdef DOUBLE_SIDED\n\n vLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );\n\n #endif\n\n }\n\n#endif\n\nvLightFront += ambientLightColor;\n\n#ifdef DOUBLE_SIDED\n\n vLightBack += ambientLightColor;\n\n#endif\n", THREE.ShaderChunk.map_particle_pars_fragment = "#ifdef USE_MAP\n\n uniform vec4 offsetRepeat;\n uniform sampler2D map;\n\n#endif\n", THREE.ShaderChunk.default_vertex = "#ifdef USE_SKINNING\n\n vec4 mvPosition = modelViewMatrix * skinned;\n\n#elif defined( USE_MORPHTARGETS )\n\n vec4 mvPosition = modelViewMatrix * vec4( morphed, 1.0 );\n\n#else\n\n vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\n#endif\n\ngl_Position = projectionMatrix * mvPosition;\n", THREE.ShaderChunk.map_pars_fragment = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP )\n\n varying vec2 vUv;\n\n#endif\n\n#ifdef USE_MAP\n\n uniform sampler2D map;\n\n#endif", THREE.ShaderChunk.skinnormal_vertex = "#ifdef USE_SKINNING\n\n mat4 skinMatrix = mat4( 0.0 );\n skinMatrix += skinWeight.x * boneMatX;\n skinMatrix += skinWeight.y * boneMatY;\n skinMatrix += skinWeight.z * boneMatZ;\n skinMatrix += skinWeight.w * boneMatW;\n skinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\n #ifdef USE_MORPHNORMALS\n\n vec4 skinnedNormal = skinMatrix * vec4( morphedNormal, 0.0 );\n\n #else\n\n vec4 skinnedNormal = skinMatrix * vec4( normal, 0.0 );\n\n #endif\n\n#endif\n", THREE.ShaderChunk.logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n varying float vFragDepth;\n\n #endif\n\n uniform float logDepthBufFC;\n\n#endif", THREE.ShaderChunk.lightmap_pars_vertex = "#ifdef USE_LIGHTMAP\n\n varying vec2 vUv2;\n\n#endif", THREE.ShaderChunk.lights_phong_fragment = "#ifndef FLAT_SHADED\n\n vec3 normal = normalize( vNormal );\n\n #ifdef DOUBLE_SIDED\n\n normal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\n\n #endif\n\n#else\n\n vec3 fdx = dFdx( vViewPosition );\n vec3 fdy = dFdy( vViewPosition );\n vec3 normal = normalize( cross( fdx, fdy ) );\n\n#endif\n\nvec3 viewPosition = normalize( vViewPosition );\n\n#ifdef USE_NORMALMAP\n\n normal = perturbNormal2Arb( -vViewPosition, normal );\n\n#elif defined( USE_BUMPMAP )\n\n normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n\n#endif\n\nvec3 totalDiffuseLight = vec3( 0.0 );\nvec3 totalSpecularLight = vec3( 0.0 );\n\n#if MAX_POINT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n\n vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\n vec3 lVector = lPosition.xyz + vViewPosition.xyz;\n\n float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[ i ] );\n\n lVector = normalize( lVector );\n\n // diffuse\n\n float dotProduct = dot( normal, lVector );\n\n #ifdef WRAP_AROUND\n\n float pointDiffuseWeightFull = max( dotProduct, 0.0 );\n float pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\n\n vec3 pointDiffuseWeight = mix( vec3( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\n\n #else\n\n float pointDiffuseWeight = max( dotProduct, 0.0 );\n\n #endif\n\n totalDiffuseLight += pointLightColor[ i ] * pointDiffuseWeight * attenuation;\n\n // specular\n\n vec3 pointHalfVector = normalize( lVector + viewPosition );\n float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\n float pointSpecularWeight = specularStrength * max( pow( pointDotNormalHalf, shininess ), 0.0 );\n\n float specularNormalization = ( shininess + 2.0 ) / 8.0;\n\n vec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, pointHalfVector ), 0.0 ), 5.0 );\n totalSpecularLight += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * attenuation * specularNormalization;\n\n }\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n\n vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\n vec3 lVector = lPosition.xyz + vViewPosition.xyz;\n\n float attenuation = calcLightAttenuation( length( lVector ), spotLightDistance[ i ], spotLightDecay[ i ] );\n\n lVector = normalize( lVector );\n\n float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\n\n if ( spotEffect > spotLightAngleCos[ i ] ) {\n\n spotEffect = max( pow( max( spotEffect, 0.0 ), spotLightExponent[ i ] ), 0.0 );\n\n // diffuse\n\n float dotProduct = dot( normal, lVector );\n\n #ifdef WRAP_AROUND\n\n float spotDiffuseWeightFull = max( dotProduct, 0.0 );\n float spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\n\n vec3 spotDiffuseWeight = mix( vec3( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\n\n #else\n\n float spotDiffuseWeight = max( dotProduct, 0.0 );\n\n #endif\n\n totalDiffuseLight += spotLightColor[ i ] * spotDiffuseWeight * attenuation * spotEffect;\n\n // specular\n\n vec3 spotHalfVector = normalize( lVector + viewPosition );\n float spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\n float spotSpecularWeight = specularStrength * max( pow( spotDotNormalHalf, shininess ), 0.0 );\n\n float specularNormalization = ( shininess + 2.0 ) / 8.0;\n\n vec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, spotHalfVector ), 0.0 ), 5.0 );\n totalSpecularLight += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * attenuation * specularNormalization * spotEffect;\n\n }\n\n }\n\n#endif\n\n#if MAX_DIR_LIGHTS > 0\n\n for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\n\n vec3 dirVector = transformDirection( directionalLightDirection[ i ], viewMatrix );\n\n // diffuse\n\n float dotProduct = dot( normal, dirVector );\n\n #ifdef WRAP_AROUND\n\n float dirDiffuseWeightFull = max( dotProduct, 0.0 );\n float dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\n\n vec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\n\n #else\n\n float dirDiffuseWeight = max( dotProduct, 0.0 );\n\n #endif\n\n totalDiffuseLight += directionalLightColor[ i ] * dirDiffuseWeight;\n\n // specular\n\n vec3 dirHalfVector = normalize( dirVector + viewPosition );\n float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\n float dirSpecularWeight = specularStrength * max( pow( dirDotNormalHalf, shininess ), 0.0 );\n\n /*\n // fresnel term from skin shader\n const float F0 = 0.128;\n\n float base = 1.0 - dot( viewPosition, dirHalfVector );\n float exponential = pow( base, 5.0 );\n\n float fresnel = exponential + F0 * ( 1.0 - exponential );\n */\n\n /*\n // fresnel term from fresnel shader\n const float mFresnelBias = 0.08;\n const float mFresnelScale = 0.3;\n const float mFresnelPower = 5.0;\n\n float fresnel = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( -viewPosition ), normal ), mFresnelPower );\n */\n\n float specularNormalization = ( shininess + 2.0 ) / 8.0;\n\n // dirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization * fresnel;\n\n vec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( dirVector, dirHalfVector ), 0.0 ), 5.0 );\n totalSpecularLight += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\n\n\n }\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\n\n vec3 lVector = transformDirection( hemisphereLightDirection[ i ], viewMatrix );\n\n // diffuse\n\n float dotProduct = dot( normal, lVector );\n float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\n\n vec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n\n totalDiffuseLight += hemiColor;\n\n // specular (sky light)\n\n vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\n float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\n float hemiSpecularWeightSky = specularStrength * max( pow( max( hemiDotNormalHalfSky, 0.0 ), shininess ), 0.0 );\n\n // specular (ground light)\n\n vec3 lVectorGround = -lVector;\n\n vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\n float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\n float hemiSpecularWeightGround = specularStrength * max( pow( max( hemiDotNormalHalfGround, 0.0 ), shininess ), 0.0 );\n\n float dotProductGround = dot( normal, lVectorGround );\n\n float specularNormalization = ( shininess + 2.0 ) / 8.0;\n\n vec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, hemiHalfVectorSky ), 0.0 ), 5.0 );\n vec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 0.0 ), 5.0 );\n totalSpecularLight += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\n\n }\n\n#endif\n\n#ifdef METAL\n\n outgoingLight += diffuseColor.rgb * ( totalDiffuseLight + ambientLightColor ) * specular + totalSpecularLight + emissive;\n\n#else\n\n outgoingLight += diffuseColor.rgb * ( totalDiffuseLight + ambientLightColor ) + totalSpecularLight + emissive;\n\n#endif\n", THREE.ShaderChunk.fog_pars_fragment = "#ifdef USE_FOG\n\n uniform vec3 fogColor;\n\n #ifdef FOG_EXP2\n\n uniform float fogDensity;\n\n #else\n\n uniform float fogNear;\n uniform float fogFar;\n #endif\n\n#endif", THREE.ShaderChunk.morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\n vec3 morphedNormal = vec3( 0.0 );\n\n morphedNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n morphedNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n morphedNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n morphedNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n\n morphedNormal += normal;\n\n#endif", THREE.ShaderChunk.envmap_pars_fragment = "#ifdef USE_ENVMAP\n\n uniform float reflectivity;\n #ifdef ENVMAP_TYPE_CUBE\n uniform samplerCube envMap;\n #else\n uniform sampler2D envMap;\n #endif\n uniform float flipEnvMap;\n\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n uniform float refractionRatio;\n\n #else\n\n varying vec3 vReflect;\n\n #endif\n\n#endif\n", THREE.ShaderChunk.logdepthbuf_fragment = "#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\n gl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n\n#endif", THREE.ShaderChunk.normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\n uniform sampler2D normalMap;\n uniform vec2 normalScale;\n\n // Per-Pixel Tangent Space Normal Mapping\n // http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html\n\n vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\n vec3 q0 = dFdx( eye_pos.xyz );\n vec3 q1 = dFdy( eye_pos.xyz );\n vec2 st0 = dFdx( vUv.st );\n vec2 st1 = dFdy( vUv.st );\n\n vec3 S = normalize( q0 * st1.t - q1 * st0.t );\n vec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n vec3 N = normalize( surf_norm );\n\n vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n mapN.xy = normalScale * mapN.xy;\n mat3 tsn = mat3( S, T, N );\n return normalize( tsn * mapN );\n\n }\n\n#endif\n", THREE.ShaderChunk.lights_phong_pars_vertex = "#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP ) || defined( USE_ENVMAP )\n\n varying vec3 vWorldPosition;\n\n#endif\n", THREE.ShaderChunk.lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\n varying vec2 vUv2;\n uniform sampler2D lightMap;\n\n#endif", THREE.ShaderChunk.shadowmap_vertex = "#ifdef USE_SHADOWMAP\n\n for( int i = 0; i < MAX_SHADOWS; i ++ ) {\n\n vShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\n\n }\n\n#endif", THREE.ShaderChunk.lights_phong_vertex = "#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP ) || defined( USE_ENVMAP )\n\n vWorldPosition = worldPosition.xyz;\n\n#endif", THREE.ShaderChunk.map_fragment = "#ifdef USE_MAP\n\n vec4 texelColor = texture2D( map, vUv );\n\n texelColor.xyz = inputToLinear( texelColor.xyz );\n\n diffuseColor *= texelColor;\n\n#endif", THREE.ShaderChunk.lightmap_vertex = "#ifdef USE_LIGHTMAP\n\n vUv2 = uv2;\n\n#endif", THREE.ShaderChunk.map_particle_fragment = "#ifdef USE_MAP\n\n diffuseColor *= texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\n#endif\n", THREE.ShaderChunk.color_pars_fragment = "#ifdef USE_COLOR\n\n varying vec3 vColor;\n\n#endif\n", THREE.ShaderChunk.color_vertex = "#ifdef USE_COLOR\n\n vColor.xyz = inputToLinear( color.xyz );\n\n#endif", THREE.ShaderChunk.skinning_vertex = "#ifdef USE_SKINNING\n\n #ifdef USE_MORPHTARGETS\n\n vec4 skinVertex = bindMatrix * vec4( morphed, 1.0 );\n\n #else\n\n vec4 skinVertex = bindMatrix * vec4( position, 1.0 );\n\n #endif\n\n vec4 skinned = vec4( 0.0 );\n skinned += boneMatX * skinVertex * skinWeight.x;\n skinned += boneMatY * skinVertex * skinWeight.y;\n skinned += boneMatZ * skinVertex * skinWeight.z;\n skinned += boneMatW * skinVertex * skinWeight.w;\n skinned = bindMatrixInverse * skinned;\n\n#endif\n", THREE.ShaderChunk.envmap_pars_vertex = "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP ) && ! defined( PHONG )\n\n varying vec3 vReflect;\n\n uniform float refractionRatio;\n\n#endif\n", THREE.ShaderChunk.linear_to_gamma_fragment = "\n outgoingLight = linearToOutput( outgoingLight );\n", THREE.ShaderChunk.color_pars_vertex = "#ifdef USE_COLOR\n\n varying vec3 vColor;\n\n#endif", THREE.ShaderChunk.lights_lambert_pars_vertex = "uniform vec3 ambientLightColor;\n\n#if MAX_DIR_LIGHTS > 0\n\n uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\n uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n uniform float pointLightDecay[ MAX_POINT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\n uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDecay[ MAX_SPOT_LIGHTS ];\n\n#endif\n\n#ifdef WRAP_AROUND\n\n uniform vec3 wrapRGB;\n\n#endif\n", THREE.ShaderChunk.map_pars_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP )\n\n varying vec2 vUv;\n uniform vec4 offsetRepeat;\n\n#endif\n", THREE.ShaderChunk.envmap_fragment = "#ifdef USE_ENVMAP\n\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\n // Transforming Normal Vectors with the Inverse Transformation\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n #ifdef ENVMAP_MODE_REFLECTION\n\n vec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\n #else\n\n vec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\n #endif\n\n #else\n\n vec3 reflectVec = vReflect;\n\n #endif\n\n #ifdef DOUBLE_SIDED\n float flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\n #else\n float flipNormal = 1.0;\n #endif\n\n #ifdef ENVMAP_TYPE_CUBE\n vec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\n #elif defined( ENVMAP_TYPE_EQUIREC )\n vec2 sampleUV;\n sampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n sampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n vec4 envColor = texture2D( envMap, sampleUV );\n\n #elif defined( ENVMAP_TYPE_SPHERE )\n vec3 reflectView = flipNormal * normalize((viewMatrix * vec4( reflectVec, 0.0 )).xyz + vec3(0.0,0.0,1.0));\n vec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n #endif\n\n envColor.xyz = inputToLinear( envColor.xyz );\n\n #ifdef ENVMAP_BLENDING_MULTIPLY\n\n outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\n #elif defined( ENVMAP_BLENDING_MIX )\n\n outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\n #elif defined( ENVMAP_BLENDING_ADD )\n\n outgoingLight += envColor.xyz * specularStrength * reflectivity;\n\n #endif\n\n#endif\n", THREE.ShaderChunk.specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\n uniform sampler2D specularMap;\n\n#endif", THREE.ShaderChunk.logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\n gl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n vFragDepth = 1.0 + gl_Position.w;\n\n#else\n\n gl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\n #endif\n\n#endif", THREE.ShaderChunk.morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n\n #ifndef USE_MORPHNORMALS\n\n uniform float morphTargetInfluences[ 8 ];\n\n #else\n\n uniform float morphTargetInfluences[ 4 ];\n\n #endif\n\n#endif", THREE.ShaderChunk.specularmap_fragment = "float specularStrength;\n\n#ifdef USE_SPECULARMAP\n\n vec4 texelSpecular = texture2D( specularMap, vUv );\n specularStrength = texelSpecular.r;\n\n#else\n\n specularStrength = 1.0;\n\n#endif", THREE.ShaderChunk.fog_fragment = "#ifdef USE_FOG\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n float depth = gl_FragDepthEXT / gl_FragCoord.w;\n\n #else\n\n float depth = gl_FragCoord.z / gl_FragCoord.w;\n\n #endif\n\n #ifdef FOG_EXP2\n\n float fogFactor = exp2( - square( fogDensity ) * square( depth ) * LOG2 );\n fogFactor = whiteCompliment( fogFactor );\n\n #else\n\n float fogFactor = smoothstep( fogNear, fogFar, depth );\n\n #endif\n \n outgoingLight = mix( outgoingLight, fogColor, fogFactor );\n\n#endif", THREE.ShaderChunk.bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\n uniform sampler2D bumpMap;\n uniform float bumpScale;\n\n // Derivative maps - bump mapping unparametrized surfaces by Morten Mikkelsen\n // http://mmikkelsen3d.blogspot.sk/2011/07/derivative-maps.html\n\n // Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)\n\n vec2 dHdxy_fwd() {\n\n vec2 dSTdx = dFdx( vUv );\n vec2 dSTdy = dFdy( vUv );\n\n float Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n float dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n float dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\n return vec2( dBx, dBy );\n\n }\n\n vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\n vec3 vSigmaX = dFdx( surf_pos );\n vec3 vSigmaY = dFdy( surf_pos );\n vec3 vN = surf_norm; // normalized\n\n vec3 R1 = cross( vSigmaY, vN );\n vec3 R2 = cross( vN, vSigmaX );\n\n float fDet = dot( vSigmaX, R1 );\n\n vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n return normalize( abs( fDet ) * surf_norm - vGrad );\n\n }\n\n#endif\n", THREE.ShaderChunk.defaultnormal_vertex = "#ifdef USE_SKINNING\n\n vec3 objectNormal = skinnedNormal.xyz;\n\n#elif defined( USE_MORPHNORMALS )\n\n vec3 objectNormal = morphedNormal;\n\n#else\n\n vec3 objectNormal = normal;\n\n#endif\n\n#ifdef FLIP_SIDED\n\n objectNormal = -objectNormal;\n\n#endif\n\nvec3 transformedNormal = normalMatrix * objectNormal;\n", THREE.ShaderChunk.lights_phong_pars_fragment = "uniform vec3 ambientLightColor;\n\n#if MAX_DIR_LIGHTS > 0\n\n uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\n uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\n uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n\n uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n uniform float pointLightDecay[ MAX_POINT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\n uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\n uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\n uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n uniform float spotLightDecay[ MAX_SPOT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP ) || defined( USE_ENVMAP )\n\n varying vec3 vWorldPosition;\n\n#endif\n\n#ifdef WRAP_AROUND\n\n uniform vec3 wrapRGB;\n\n#endif\n\nvarying vec3 vViewPosition;\n\n#ifndef FLAT_SHADED\n\n varying vec3 vNormal;\n\n#endif\n", THREE.ShaderChunk.skinbase_vertex = "#ifdef USE_SKINNING\n\n mat4 boneMatX = getBoneMatrix( skinIndex.x );\n mat4 boneMatY = getBoneMatrix( skinIndex.y );\n mat4 boneMatZ = getBoneMatrix( skinIndex.z );\n mat4 boneMatW = getBoneMatrix( skinIndex.w );\n\n#endif", THREE.ShaderChunk.map_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP )\n\n vUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n\n#endif", THREE.ShaderChunk.lightmap_fragment = "#ifdef USE_LIGHTMAP\n\n outgoingLight *= diffuseColor.xyz * texture2D( lightMap, vUv2 ).xyz;\n\n#endif", THREE.ShaderChunk.shadowmap_pars_vertex = "#ifdef USE_SHADOWMAP\n\n varying vec4 vShadowCoord[ MAX_SHADOWS ];\n uniform mat4 shadowMatrix[ MAX_SHADOWS ];\n\n#endif", THREE.ShaderChunk.color_fragment = "#ifdef USE_COLOR\n\n diffuseColor.rgb *= vColor;\n\n#endif", THREE.ShaderChunk.morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n\n vec3 morphed = vec3( 0.0 );\n morphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n morphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n morphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n morphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\n #ifndef USE_MORPHNORMALS\n\n morphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n morphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n morphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n morphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\n #endif\n\n morphed += position;\n\n#endif", THREE.ShaderChunk.envmap_vertex = "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP ) && ! defined( PHONG )\n\n vec3 worldNormal = transformDirection( objectNormal, modelMatrix );\n\n vec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\n #ifdef ENVMAP_MODE_REFLECTION\n\n vReflect = reflect( cameraToVertex, worldNormal );\n\n #else\n\n vReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\n #endif\n\n#endif\n", THREE.ShaderChunk.shadowmap_fragment = "#ifdef USE_SHADOWMAP\n\n #ifdef SHADOWMAP_DEBUG\n\n vec3 frustumColors[3];\n frustumColors[0] = vec3( 1.0, 0.5, 0.0 );\n frustumColors[1] = vec3( 0.0, 1.0, 0.8 );\n frustumColors[2] = vec3( 0.0, 0.5, 1.0 );\n\n #endif\n\n #ifdef SHADOWMAP_CASCADE\n\n int inFrustumCount = 0;\n\n #endif\n\n float fDepth;\n vec3 shadowColor = vec3( 1.0 );\n\n for( int i = 0; i < MAX_SHADOWS; i ++ ) {\n\n vec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\n\n // if ( something && something ) breaks ATI OpenGL shader compiler\n // if ( all( something, something ) ) using this instead\n\n bvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n bool inFrustum = all( inFrustumVec );\n\n // don't shadow pixels outside of light frustum\n // use just first frustum (for cascades)\n // don't shadow pixels behind far plane of light frustum\n\n #ifdef SHADOWMAP_CASCADE\n\n inFrustumCount += int( inFrustum );\n bvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\n\n #else\n\n bvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\n #endif\n\n bool frustumTest = all( frustumTestVec );\n\n if ( frustumTest ) {\n\n shadowCoord.z += shadowBias[ i ];\n\n #if defined( SHADOWMAP_TYPE_PCF )\n\n // Percentage-close filtering\n // (9 pixel kernel)\n // http://fabiensanglard.net/shadowmappingPCF/\n\n float shadow = 0.0;\n\n /*\n // nested loops breaks shader compiler / validator on some ATI cards when using OpenGL\n // must enroll loop manually\n\n for ( float y = -1.25; y <= 1.25; y += 1.25 )\n for ( float x = -1.25; x <= 1.25; x += 1.25 ) {\n\n vec4 rgbaDepth = texture2D( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );\n\n // doesn't seem to produce any noticeable visual difference compared to simple texture2D lookup\n //vec4 rgbaDepth = texture2DProj( shadowMap[ i ], vec4( vShadowCoord[ i ].w * ( vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy ), 0.05, vShadowCoord[ i ].w ) );\n\n float fDepth = unpackDepth( rgbaDepth );\n\n if ( fDepth < shadowCoord.z )\n shadow += 1.0;\n\n }\n\n shadow /= 9.0;\n\n */\n\n const float shadowDelta = 1.0 / 9.0;\n\n float xPixelOffset = 1.0 / shadowMapSize[ i ].x;\n float yPixelOffset = 1.0 / shadowMapSize[ i ].y;\n\n float dx0 = -1.25 * xPixelOffset;\n float dy0 = -1.25 * yPixelOffset;\n float dx1 = 1.25 * xPixelOffset;\n float dy1 = 1.25 * yPixelOffset;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\n if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\n if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\n\n shadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\n\n #elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\n // Percentage-close filtering\n // (9 pixel kernel)\n // http://fabiensanglard.net/shadowmappingPCF/\n\n float shadow = 0.0;\n\n float xPixelOffset = 1.0 / shadowMapSize[ i ].x;\n float yPixelOffset = 1.0 / shadowMapSize[ i ].y;\n\n float dx0 = -1.0 * xPixelOffset;\n float dy0 = -1.0 * yPixelOffset;\n float dx1 = 1.0 * xPixelOffset;\n float dy1 = 1.0 * yPixelOffset;\n\n mat3 shadowKernel;\n mat3 depthKernel;\n\n depthKernel[0][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\n depthKernel[0][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\n depthKernel[0][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\n depthKernel[1][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\n depthKernel[1][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\n depthKernel[1][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\n depthKernel[2][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\n depthKernel[2][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\n depthKernel[2][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\n\n vec3 shadowZ = vec3( shadowCoord.z );\n shadowKernel[0] = vec3(lessThan(depthKernel[0], shadowZ ));\n shadowKernel[0] *= vec3(0.25);\n\n shadowKernel[1] = vec3(lessThan(depthKernel[1], shadowZ ));\n shadowKernel[1] *= vec3(0.25);\n\n shadowKernel[2] = vec3(lessThan(depthKernel[2], shadowZ ));\n shadowKernel[2] *= vec3(0.25);\n\n vec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[i].xy );\n\n shadowKernel[0] = mix( shadowKernel[1], shadowKernel[0], fractionalCoord.x );\n shadowKernel[1] = mix( shadowKernel[2], shadowKernel[1], fractionalCoord.x );\n\n vec4 shadowValues;\n shadowValues.x = mix( shadowKernel[0][1], shadowKernel[0][0], fractionalCoord.y );\n shadowValues.y = mix( shadowKernel[0][2], shadowKernel[0][1], fractionalCoord.y );\n shadowValues.z = mix( shadowKernel[1][1], shadowKernel[1][0], fractionalCoord.y );\n shadowValues.w = mix( shadowKernel[1][2], shadowKernel[1][1], fractionalCoord.y );\n\n shadow = dot( shadowValues, vec4( 1.0 ) );\n\n shadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\n\n #else\n\n vec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\n float fDepth = unpackDepth( rgbaDepth );\n\n if ( fDepth < shadowCoord.z )\n\n // spot with multiple shadows is darker\n\n shadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\n\n // spot with multiple shadows has the same color as single shadow spot\n\n // shadowColor = min( shadowColor, vec3( shadowDarkness[ i ] ) );\n\n #endif\n\n }\n\n\n #ifdef SHADOWMAP_DEBUG\n\n #ifdef SHADOWMAP_CASCADE\n\n if ( inFrustum && inFrustumCount == 1 ) outgoingLight *= frustumColors[ i ];\n\n #else\n\n if ( inFrustum ) outgoingLight *= frustumColors[ i ];\n\n #endif\n\n #endif\n\n }\n\n // NOTE: I am unsure if this is correct in linear space. -bhouston, Dec 29, 2014\n shadowColor = inputToLinear( shadowColor );\n\n outgoingLight = outgoingLight * shadowColor;\n\n#endif\n", THREE.ShaderChunk.worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\n #ifdef USE_SKINNING\n\n vec4 worldPosition = modelMatrix * skinned;\n\n #elif defined( USE_MORPHTARGETS )\n\n vec4 worldPosition = modelMatrix * vec4( morphed, 1.0 );\n\n #else\n\n vec4 worldPosition = modelMatrix * vec4( position, 1.0 );\n\n #endif\n\n#endif\n", THREE.ShaderChunk.shadowmap_pars_fragment = "#ifdef USE_SHADOWMAP\n\n uniform sampler2D shadowMap[ MAX_SHADOWS ];\n uniform vec2 shadowMapSize[ MAX_SHADOWS ];\n\n uniform float shadowDarkness[ MAX_SHADOWS ];\n uniform float shadowBias[ MAX_SHADOWS ];\n\n varying vec4 vShadowCoord[ MAX_SHADOWS ];\n\n float unpackDepth( const in vec4 rgba_depth ) {\n\n const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\n float depth = dot( rgba_depth, bit_shift );\n return depth;\n\n }\n\n#endif", THREE.ShaderChunk.skinning_pars_vertex = "#ifdef USE_SKINNING\n\n uniform mat4 bindMatrix;\n uniform mat4 bindMatrixInverse;\n\n #ifdef BONE_TEXTURE\n\n uniform sampler2D boneTexture;\n uniform int boneTextureWidth;\n uniform int boneTextureHeight;\n\n mat4 getBoneMatrix( const in float i ) {\n\n float j = i * 4.0;\n float x = mod( j, float( boneTextureWidth ) );\n float y = floor( j / float( boneTextureWidth ) );\n\n float dx = 1.0 / float( boneTextureWidth );\n float dy = 1.0 / float( boneTextureHeight );\n\n y = dy * ( y + 0.5 );\n\n vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\n mat4 bone = mat4( v1, v2, v3, v4 );\n\n return bone;\n\n }\n\n #else\n\n uniform mat4 boneGlobalMatrices[ MAX_BONES ];\n\n mat4 getBoneMatrix( const in float i ) {\n\n mat4 bone = boneGlobalMatrices[ int(i) ];\n return bone;\n\n }\n\n #endif\n\n#endif\n", THREE.ShaderChunk.logdepthbuf_pars_fragment = "#ifdef USE_LOGDEPTHBUF\n\n uniform float logDepthBufFC;\n\n #ifdef USE_LOGDEPTHBUF_EXT\n\n #extension GL_EXT_frag_depth : enable\n varying float vFragDepth;\n\n #endif\n\n#endif", THREE.ShaderChunk.alphamap_fragment = "#ifdef USE_ALPHAMAP\n\n diffuseColor.a *= texture2D( alphaMap, vUv ).g;\n\n#endif\n", THREE.ShaderChunk.alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\n uniform sampler2D alphaMap;\n\n#endif\n", THREE.UniformsUtils = { merge: function(e) { for (var t = {}, r = 0; r < e.length; r++) { var i, n = this.clone(e[r]); for (i in n) t[i] = n[i] } return t }, clone: function(e) { var t, r = {}; for (t in e) { r[t] = {}; for (var i in e[t]) { var n = e[t][i]; r[t][i] = n instanceof THREE.Color || n instanceof THREE.Vector2 || n instanceof THREE.Vector3 || n instanceof THREE.Vector4 || n instanceof THREE.Matrix4 || n instanceof THREE.Texture ? n.clone() : n instanceof Array ? n.slice() : n } } return r } }, THREE.UniformsLib = { common: { diffuse: { type: "c", value: new THREE.Color(15658734) }, opacity: { type: "f", value: 1 }, map: { type: "t", value: null }, offsetRepeat: { type: "v4", value: new THREE.Vector4(0, 0, 1, 1) }, lightMap: { type: "t", value: null }, specularMap: { type: "t", value: null }, alphaMap: { type: "t", value: null }, envMap: { type: "t", value: null }, flipEnvMap: { type: "f", value: -1 }, reflectivity: { type: "f", value: 1 }, refractionRatio: { type: "f", value: .98 }, morphTargetInfluences: { type: "f", value: 0 } }, bump: { bumpMap: { type: "t", value: null }, bumpScale: { type: "f", value: 1 } }, normalmap: { normalMap: { type: "t", value: null }, normalScale: { type: "v2", value: new THREE.Vector2(1, 1) } }, fog: { fogDensity: { type: "f", value: 25e-5 }, fogNear: { type: "f", value: 1 }, fogFar: { type: "f", value: 2e3 }, fogColor: { type: "c", value: new THREE.Color(16777215) } }, lights: { ambientLightColor: { type: "fv", value: [] }, directionalLightDirection: { type: "fv", value: [] }, directionalLightColor: { type: "fv", value: [] }, hemisphereLightDirection: { type: "fv", value: [] }, hemisphereLightSkyColor: { type: "fv", value: [] }, hemisphereLightGroundColor: { type: "fv", value: [] }, pointLightColor: { type: "fv", value: [] }, pointLightPosition: { type: "fv", value: [] }, pointLightDistance: { type: "fv1", value: [] }, pointLightDecay: { type: "fv1", value: [] }, spotLightColor: { type: "fv", value: [] }, spotLightPosition: { type: "fv", value: [] }, spotLightDirection: { type: "fv", value: [] }, spotLightDistance: { type: "fv1", value: [] }, spotLightAngleCos: { type: "fv1", value: [] }, spotLightExponent: { type: "fv1", value: [] }, spotLightDecay: { type: "fv1", value: [] } }, particle: { psColor: { type: "c", value: new THREE.Color(15658734) }, opacity: { type: "f", value: 1 }, size: { type: "f", value: 1 }, scale: { type: "f", value: 1 }, map: { type: "t", value: null }, offsetRepeat: { type: "v4", value: new THREE.Vector4(0, 0, 1, 1) }, fogDensity: { type: "f", value: 25e-5 }, fogNear: { type: "f", value: 1 }, fogFar: { type: "f", value: 2e3 }, fogColor: { type: "c", value: new THREE.Color(16777215) } }, shadowmap: { shadowMap: { type: "tv", value: [] }, shadowMapSize: { type: "v2v", value: [] }, shadowBias: { type: "fv1", value: [] }, shadowDarkness: { type: "fv1", value: [] }, shadowMatrix: { type: "m4v", value: [] } } }, THREE.ShaderLib = { basic: { uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common, THREE.UniformsLib.fog, THREE.UniformsLib.shadowmap]), vertexShader: [THREE.ShaderChunk.common, THREE.ShaderChunk.map_pars_vertex, THREE.ShaderChunk.lightmap_pars_vertex, THREE.ShaderChunk.envmap_pars_vertex, THREE.ShaderChunk.color_pars_vertex, THREE.ShaderChunk.morphtarget_pars_vertex, THREE.ShaderChunk.skinning_pars_vertex, THREE.ShaderChunk.shadowmap_pars_vertex, THREE.ShaderChunk.logdepthbuf_pars_vertex, "void main() {", THREE.ShaderChunk.map_vertex, THREE.ShaderChunk.lightmap_vertex, THREE.ShaderChunk.color_vertex, THREE.ShaderChunk.skinbase_vertex, " #ifdef USE_ENVMAP", THREE.ShaderChunk.morphnormal_vertex, THREE.ShaderChunk.skinnormal_vertex, THREE.ShaderChunk.defaultnormal_vertex, " #endif", THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.skinning_vertex, THREE.ShaderChunk.default_vertex, THREE.ShaderChunk.logdepthbuf_vertex, THREE.ShaderChunk.worldpos_vertex, THREE.ShaderChunk.envmap_vertex, THREE.ShaderChunk.shadowmap_vertex, "}"].join("\n"), fragmentShader: ["uniform vec3 diffuse;\nuniform float opacity;", THREE.ShaderChunk.common, THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk.map_pars_fragment, THREE.ShaderChunk.alphamap_pars_fragment, THREE.ShaderChunk.lightmap_pars_fragment, THREE.ShaderChunk.envmap_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, THREE.ShaderChunk.shadowmap_pars_fragment, THREE.ShaderChunk.specularmap_pars_fragment, THREE.ShaderChunk.logdepthbuf_pars_fragment, "void main() {\n vec3 outgoingLight = vec3( 0.0 );\n vec4 diffuseColor = vec4( diffuse, opacity );", THREE.ShaderChunk.logdepthbuf_fragment, THREE.ShaderChunk.map_fragment, THREE.ShaderChunk.color_fragment, THREE.ShaderChunk.alphamap_fragment, THREE.ShaderChunk.alphatest_fragment, THREE.ShaderChunk.specularmap_fragment, " outgoingLight = diffuseColor.rgb;", THREE.ShaderChunk.lightmap_fragment, THREE.ShaderChunk.envmap_fragment, THREE.ShaderChunk.shadowmap_fragment, THREE.ShaderChunk.linear_to_gamma_fragment, THREE.ShaderChunk.fog_fragment, " gl_FragColor = vec4( outgoingLight, diffuseColor.a );\n}"].join("\n") }, lambert: { uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common, THREE.UniformsLib.fog, THREE.UniformsLib.lights, THREE.UniformsLib.shadowmap, { emissive: { type: "c", value: new THREE.Color(0) }, wrapRGB: { type: "v3", value: new THREE.Vector3(1, 1, 1) } }]), vertexShader: ["#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n varying vec3 vLightBack;\n#endif", THREE.ShaderChunk.common, THREE.ShaderChunk.map_pars_vertex, THREE.ShaderChunk.lightmap_pars_vertex, THREE.ShaderChunk.envmap_pars_vertex, THREE.ShaderChunk.lights_lambert_pars_vertex, THREE.ShaderChunk.color_pars_vertex, THREE.ShaderChunk.morphtarget_pars_vertex, THREE.ShaderChunk.skinning_pars_vertex, THREE.ShaderChunk.shadowmap_pars_vertex, THREE.ShaderChunk.logdepthbuf_pars_vertex, "void main() {", THREE.ShaderChunk.map_vertex, THREE.ShaderChunk.lightmap_vertex, THREE.ShaderChunk.color_vertex, THREE.ShaderChunk.morphnormal_vertex, THREE.ShaderChunk.skinbase_vertex, THREE.ShaderChunk.skinnormal_vertex, THREE.ShaderChunk.defaultnormal_vertex, THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.skinning_vertex, THREE.ShaderChunk.default_vertex, THREE.ShaderChunk.logdepthbuf_vertex, THREE.ShaderChunk.worldpos_vertex, THREE.ShaderChunk.envmap_vertex, THREE.ShaderChunk.lights_lambert_vertex, THREE.ShaderChunk.shadowmap_vertex, "}"].join("\n"), fragmentShader: ["uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n varying vec3 vLightBack;\n#endif", THREE.ShaderChunk.common, THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk.map_pars_fragment, THREE.ShaderChunk.alphamap_pars_fragment, THREE.ShaderChunk.lightmap_pars_fragment, THREE.ShaderChunk.envmap_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, THREE.ShaderChunk.shadowmap_pars_fragment, THREE.ShaderChunk.specularmap_pars_fragment, THREE.ShaderChunk.logdepthbuf_pars_fragment, "void main() {\n vec3 outgoingLight = vec3( 0.0 );\n vec4 diffuseColor = vec4( diffuse, opacity );", THREE.ShaderChunk.logdepthbuf_fragment, THREE.ShaderChunk.map_fragment, THREE.ShaderChunk.color_fragment, THREE.ShaderChunk.alphamap_fragment, THREE.ShaderChunk.alphatest_fragment, THREE.ShaderChunk.specularmap_fragment, " #ifdef DOUBLE_SIDED\n if ( gl_FrontFacing )\n outgoingLight += diffuseColor.rgb * vLightFront + emissive;\n else\n outgoingLight += diffuseColor.rgb * vLightBack + emissive;\n #else\n outgoingLight += diffuseColor.rgb * vLightFront + emissive;\n #endif", THREE.ShaderChunk.lightmap_fragment, THREE.ShaderChunk.envmap_fragment, THREE.ShaderChunk.shadowmap_fragment, THREE.ShaderChunk.linear_to_gamma_fragment, THREE.ShaderChunk.fog_fragment, " gl_FragColor = vec4( outgoingLight, diffuseColor.a );\n}"].join("\n") }, phong: { uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common, THREE.UniformsLib.bump, THREE.UniformsLib.normalmap, THREE.UniformsLib.fog, THREE.UniformsLib.lights, THREE.UniformsLib.shadowmap, { emissive: { type: "c", value: new THREE.Color(0) }, specular: { type: "c", value: new THREE.Color(1118481) }, shininess: { type: "f", value: 30 }, wrapRGB: { type: "v3", value: new THREE.Vector3(1, 1, 1) } }]), vertexShader: ["#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n varying vec3 vNormal;\n#endif", THREE.ShaderChunk.common, THREE.ShaderChunk.map_pars_vertex, THREE.ShaderChunk.lightmap_pars_vertex, THREE.ShaderChunk.envmap_pars_vertex, THREE.ShaderChunk.lights_phong_pars_vertex, THREE.ShaderChunk.color_pars_vertex, THREE.ShaderChunk.morphtarget_pars_vertex, THREE.ShaderChunk.skinning_pars_vertex, THREE.ShaderChunk.shadowmap_pars_vertex, THREE.ShaderChunk.logdepthbuf_pars_vertex, "void main() {", THREE.ShaderChunk.map_vertex, THREE.ShaderChunk.lightmap_vertex, THREE.ShaderChunk.color_vertex, THREE.ShaderChunk.morphnormal_vertex, THREE.ShaderChunk.skinbase_vertex, THREE.ShaderChunk.skinnormal_vertex, THREE.ShaderChunk.defaultnormal_vertex, "#ifndef FLAT_SHADED\n vNormal = normalize( transformedNormal );\n#endif", THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.skinning_vertex, THREE.ShaderChunk.default_vertex, THREE.ShaderChunk.logdepthbuf_vertex, " vViewPosition = -mvPosition.xyz;", THREE.ShaderChunk.worldpos_vertex, THREE.ShaderChunk.envmap_vertex, THREE.ShaderChunk.lights_phong_vertex, THREE.ShaderChunk.shadowmap_vertex, "}"].join("\n"), fragmentShader: ["#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;", THREE.ShaderChunk.common, THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk.map_pars_fragment, THREE.ShaderChunk.alphamap_pars_fragment, THREE.ShaderChunk.lightmap_pars_fragment, THREE.ShaderChunk.envmap_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, THREE.ShaderChunk.lights_phong_pars_fragment, THREE.ShaderChunk.shadowmap_pars_fragment, THREE.ShaderChunk.bumpmap_pars_fragment, THREE.ShaderChunk.normalmap_pars_fragment, THREE.ShaderChunk.specularmap_pars_fragment, THREE.ShaderChunk.logdepthbuf_pars_fragment, "void main() {\n vec3 outgoingLight = vec3( 0.0 );\n vec4 diffuseColor = vec4( diffuse, opacity );", THREE.ShaderChunk.logdepthbuf_fragment, THREE.ShaderChunk.map_fragment, THREE.ShaderChunk.color_fragment, THREE.ShaderChunk.alphamap_fragment, THREE.ShaderChunk.alphatest_fragment, THREE.ShaderChunk.specularmap_fragment, THREE.ShaderChunk.lights_phong_fragment, THREE.ShaderChunk.lightmap_fragment, THREE.ShaderChunk.envmap_fragment, THREE.ShaderChunk.shadowmap_fragment, THREE.ShaderChunk.linear_to_gamma_fragment, THREE.ShaderChunk.fog_fragment, " gl_FragColor = vec4( outgoingLight, diffuseColor.a );\n}"].join("\n") }, particle_basic: { uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.particle, THREE.UniformsLib.shadowmap]), vertexShader: ["uniform float size;\nuniform float scale;", THREE.ShaderChunk.common, THREE.ShaderChunk.color_pars_vertex, THREE.ShaderChunk.shadowmap_pars_vertex, THREE.ShaderChunk.logdepthbuf_pars_vertex, "void main() {", THREE.ShaderChunk.color_vertex, " vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n #ifdef USE_SIZEATTENUATION\n gl_PointSize = size * ( scale / length( mvPosition.xyz ) );\n #else\n gl_PointSize = size;\n #endif\n gl_Position = projectionMatrix * mvPosition;", THREE.ShaderChunk.logdepthbuf_vertex, THREE.ShaderChunk.worldpos_vertex, THREE.ShaderChunk.shadowmap_vertex, "}"].join("\n"), fragmentShader: ["uniform vec3 psColor;\nuniform float opacity;", THREE.ShaderChunk.common, THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk.map_particle_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, THREE.ShaderChunk.shadowmap_pars_fragment, THREE.ShaderChunk.logdepthbuf_pars_fragment, "void main() {\n vec3 outgoingLight = vec3( 0.0 );\n vec4 diffuseColor = vec4( psColor, opacity );", THREE.ShaderChunk.logdepthbuf_fragment, THREE.ShaderChunk.map_particle_fragment, THREE.ShaderChunk.color_fragment, THREE.ShaderChunk.alphatest_fragment, " outgoingLight = diffuseColor.rgb;", THREE.ShaderChunk.shadowmap_fragment, THREE.ShaderChunk.fog_fragment, " gl_FragColor = vec4( outgoingLight, diffuseColor.a );\n}"].join("\n") }, dashed: { uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common, THREE.UniformsLib.fog, { scale: { type: "f", value: 1 }, dashSize: { type: "f", value: 1 }, totalSize: { type: "f", value: 2 } }]), vertexShader: ["uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;", THREE.ShaderChunk.common, THREE.ShaderChunk.color_pars_vertex, THREE.ShaderChunk.logdepthbuf_pars_vertex, "void main() {", THREE.ShaderChunk.color_vertex, " vLineDistance = scale * lineDistance;\n vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n gl_Position = projectionMatrix * mvPosition;", THREE.ShaderChunk.logdepthbuf_vertex, "}"].join("\n"), fragmentShader: ["uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;", THREE.ShaderChunk.common, THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, THREE.ShaderChunk.logdepthbuf_pars_fragment, "void main() {\n if ( mod( vLineDistance, totalSize ) > dashSize ) {\n discard;\n }\n vec3 outgoingLight = vec3( 0.0 );\n vec4 diffuseColor = vec4( diffuse, opacity );", THREE.ShaderChunk.logdepthbuf_fragment, THREE.ShaderChunk.color_fragment, " outgoingLight = diffuseColor.rgb;", THREE.ShaderChunk.fog_fragment, " gl_FragColor = vec4( outgoingLight, diffuseColor.a );\n}"].join("\n") }, depth: { uniforms: { mNear: { type: "f", value: 1 }, mFar: { type: "f", value: 2e3 }, opacity: { type: "f", value: 1 } }, vertexShader: [THREE.ShaderChunk.common, THREE.ShaderChunk.morphtarget_pars_vertex, THREE.ShaderChunk.logdepthbuf_pars_vertex, "void main() {", THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.default_vertex, THREE.ShaderChunk.logdepthbuf_vertex, "}"].join("\n"), fragmentShader: ["uniform float mNear;\nuniform float mFar;\nuniform float opacity;", THREE.ShaderChunk.common, THREE.ShaderChunk.logdepthbuf_pars_fragment, "void main() {", THREE.ShaderChunk.logdepthbuf_fragment, " #ifdef USE_LOGDEPTHBUF_EXT\n float depth = gl_FragDepthEXT / gl_FragCoord.w;\n #else\n float depth = gl_FragCoord.z / gl_FragCoord.w;\n #endif\n float color = 1.0 - smoothstep( mNear, mFar, depth );\n gl_FragColor = vec4( vec3( color ), opacity );\n}"].join("\n") }, normal: { uniforms: { opacity: { type: "f", value: 1 } }, vertexShader: ["varying vec3 vNormal;", THREE.ShaderChunk.common, THREE.ShaderChunk.morphtarget_pars_vertex, THREE.ShaderChunk.logdepthbuf_pars_vertex, "void main() {\n vNormal = normalize( normalMatrix * normal );", THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.default_vertex, THREE.ShaderChunk.logdepthbuf_vertex, "}"].join("\n"), fragmentShader: ["uniform float opacity;\nvarying vec3 vNormal;", THREE.ShaderChunk.common, THREE.ShaderChunk.logdepthbuf_pars_fragment, "void main() {\n gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );", THREE.ShaderChunk.logdepthbuf_fragment, "}"].join("\n") }, cube: { uniforms: { tCube: { type: "t", value: null }, tFlip: { type: "f", value: -1 } }, vertexShader: ["varying vec3 vWorldPosition;", THREE.ShaderChunk.common, THREE.ShaderChunk.logdepthbuf_pars_vertex, "void main() {\n vWorldPosition = transformDirection( position, modelMatrix );\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", THREE.ShaderChunk.logdepthbuf_vertex, "}"].join("\n"), fragmentShader: ["uniform samplerCube tCube;\nuniform float tFlip;\nvarying vec3 vWorldPosition;", THREE.ShaderChunk.common, THREE.ShaderChunk.logdepthbuf_pars_fragment, "void main() {\n gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );", THREE.ShaderChunk.logdepthbuf_fragment, "}"].join("\n") }, equirect: { uniforms: { tEquirect: { type: "t", value: null }, tFlip: { type: "f", value: -1 } }, vertexShader: ["varying vec3 vWorldPosition;", THREE.ShaderChunk.common, THREE.ShaderChunk.logdepthbuf_pars_vertex, "void main() {\n vWorldPosition = transformDirection( position, modelMatrix );\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", THREE.ShaderChunk.logdepthbuf_vertex, "}"].join("\n"), fragmentShader: ["uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;", THREE.ShaderChunk.common, THREE.ShaderChunk.logdepthbuf_pars_fragment, "void main() {\nvec3 direction = normalize( vWorldPosition );\nvec2 sampleUV;\nsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\nsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\ngl_FragColor = texture2D( tEquirect, sampleUV );", THREE.ShaderChunk.logdepthbuf_fragment, "}"].join("\n") }, depthRGBA: { uniforms: {}, vertexShader: [THREE.ShaderChunk.common, THREE.ShaderChunk.morphtarget_pars_vertex, THREE.ShaderChunk.skinning_pars_vertex, THREE.ShaderChunk.logdepthbuf_pars_vertex, "void main() {", THREE.ShaderChunk.skinbase_vertex, THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.skinning_vertex, THREE.ShaderChunk.default_vertex, THREE.ShaderChunk.logdepthbuf_vertex, "}"].join("\n"), fragmentShader: [THREE.ShaderChunk.common, THREE.ShaderChunk.logdepthbuf_pars_fragment, "vec4 pack_depth( const in float depth ) {\n const vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\n const vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\n vec4 res = mod( depth * bit_shift * vec4( 255 ), vec4( 256 ) ) / vec4( 255 );\n res -= res.xxyz * bit_mask;\n return res;\n}\nvoid main() {", THREE.ShaderChunk.logdepthbuf_fragment, " #ifdef USE_LOGDEPTHBUF_EXT\n gl_FragData[ 0 ] = pack_depth( gl_FragDepthEXT );\n #else\n gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\n #endif\n}"].join("\n") } }, THREE.WebGLRenderer = function(e) { function t(e) { var t = e.geometry; e = e.material; var r = t.vertices.length; if (e.attributes) { void 0 === t.__webglCustomAttributesList && (t.__webglCustomAttributesList = []); for (var i in e.attributes) { var n = e.attributes[i]; if (!n.__webglInitialized || n.createUniqueBuffers) { n.__webglInitialized = !0; var o = 1; "v2" === n.type ? o = 2 : "v3" === n.type ? o = 3 : "v4" === n.type ? o = 4 : "c" === n.type && (o = 3), n.size = o, n.array = new Float32Array(r * o), n.buffer = Y.createBuffer(), n.buffer.belongsToAttribute = i, n.needsUpdate = !0 } t.__webglCustomAttributesList.push(n) } } } function r(e, t) { return e.material instanceof THREE.MeshFaceMaterial ? e.material.materials[t.materialIndex] : e.material } function i(e, t, r, i) { r = r.attributes; var n = t.attributes; t = t.attributesKeys; for (var o = 0, a = t.length; a > o; o++) { var s = t[o], h = n[s]; if (h >= 0) { var l = r[s]; void 0 !== l ? (s = l.itemSize, Y.bindBuffer(Y.ARRAY_BUFFER, l.buffer), Te.enableAttribute(h), Y.vertexAttribPointer(h, s, Y.FLOAT, !1, 0, i * s * 4)) : void 0 !== e.defaultAttributeValues && (2 === e.defaultAttributeValues[s].length ? Y.vertexAttrib2fv(h, e.defaultAttributeValues[s]) : 3 === e.defaultAttributeValues[s].length && Y.vertexAttrib3fv(h, e.defaultAttributeValues[s])) } } Te.disableUnusedAttributes() } function n(e, t) { return e.object.renderOrder !== t.object.renderOrder ? e.object.renderOrder - t.object.renderOrder : e.material.id !== t.material.id ? e.material.id - t.material.id : e.z !== t.z ? e.z - t.z : e.id - t.id } function o(e, t) { return e.object.renderOrder !== t.object.renderOrder ? e.object.renderOrder - t.object.renderOrder : e.z !== t.z ? t.z - e.z : e.id - t.id } function a(e, t) { return t[0] - e[0] } function s(e) { if (!1 !== e.visible) { if (!(e instanceof THREE.Scene || e instanceof THREE.Group)) { void 0 === e.__webglInit && (e.__webglInit = !0, e._modelViewMatrix = new THREE.Matrix4, e._normalMatrix = new THREE.Matrix3, e.addEventListener("removed", ze)); var r = e.geometry; if (void 0 !== r && void 0 === r.__webglInit) if (r.__webglInit = !0, r.addEventListener("dispose", ke), r instanceof THREE.BufferGeometry) K.info.memory.geometries++; else if (e instanceof THREE.Mesh) u(e, r); else if (e instanceof THREE.Line) { if (void 0 === r.__webglVertexBuffer) { r.__webglVertexBuffer = Y.createBuffer(), r.__webglColorBuffer = Y.createBuffer(), r.__webglLineDistanceBuffer = Y.createBuffer(), K.info.memory.geometries++; var i = r.vertices.length; r.__vertexArray = new Float32Array(3 * i), r.__colorArray = new Float32Array(3 * i), r.__lineDistanceArray = new Float32Array(1 * i), r.__webglLineCount = i, t(e), r.verticesNeedUpdate = !0, r.colorsNeedUpdate = !0, r.lineDistancesNeedUpdate = !0 } } else e instanceof THREE.PointCloud && void 0 === r.__webglVertexBuffer && (r.__webglVertexBuffer = Y.createBuffer(), r.__webglColorBuffer = Y.createBuffer(), K.info.memory.geometries++, i = r.vertices.length, r.__vertexArray = new Float32Array(3 * i), r.__colorArray = new Float32Array(3 * i), r.__webglParticleCount = i, t(e), r.verticesNeedUpdate = !0, r.colorsNeedUpdate = !0); if (void 0 === e.__webglActive) if (e.__webglActive = !0, e instanceof THREE.Mesh) { if (r instanceof THREE.BufferGeometry) E(G, r, e); else if (r instanceof THREE.Geometry) for (var r = je[r.id], i = 0, n = r.length; n > i; i++) E(G, r[i], e) } else e instanceof THREE.Line || e instanceof THREE.PointCloud ? E(G, r, e) : (e instanceof THREE.ImmediateRenderObject || e.immediateRenderCallback) && I.push({ id: null, object: e, opaque: null, transparent: null, z: 0 }); if (e instanceof THREE.Light) O.push(e); else if (e instanceof THREE.Sprite) X.push(e); else if (e instanceof THREE.LensFlare) q.push(e); else if ((r = G[e.id]) && (!1 === e.frustumCulled || !0 === le.intersectsObject(e))) for (i = 0, n = r.length; n > i; i++) { var o = r[i], a = o, h = a.object, l = a.buffer, c = h.geometry, h = h.material; h instanceof THREE.MeshFaceMaterial ? (h = h.materials[c instanceof THREE.BufferGeometry ? 0 : l.materialIndex], a.material = h, h.transparent ? j.push(a) : W.push(a)) : h && (a.material = h, h.transparent ? j.push(a) : W.push(a)), o.render = !0, !0 === K.sortObjects && (ue.setFromMatrixPosition(e.matrixWorld), ue.applyProjection(ce), o.z = ue.z) } } for (i = 0, n = e.children.length; n > i; i++) s(e.children[i]) } } function h(e, t, r, i, n) { for (var o, a = 0, s = e.length; s > a; a++) { o = e[a]; var h = o.object, l = o.buffer; if (y(h, t), n) o = n; else { if (o = o.material, !o) continue; m(o) } K.setMaterialFaces(o), l instanceof THREE.BufferGeometry ? K.renderBufferDirect(t, r, i, o, l, h) : K.renderBuffer(t, r, i, o, l, h) } } function l(e, t, r, i, n, o) { for (var a, s = 0, h = e.length; h > s; s++) { a = e[s]; var l = a.object; if (l.visible) { if (o) a = o; else { if (a = a[t], !a) continue; m(a) } K.renderImmediateObject(r, i, n, a, l) } } } function c(e) { var t = e.object.material; t.transparent ? (e.transparent = t, e.opaque = null) : (e.opaque = t, e.transparent = null) } function u(e, t) { var i = e.material, n = !1; if (void 0 === je[t.id] || !0 === t.groupsNeedUpdate) { delete G[e.id]; for (var o, a, s = je, h = t.id, i = i instanceof THREE.MeshFaceMaterial, l = ge.get("OES_element_index_uint") ? 4294967296 : 65535, n = {}, c = t.morphTargets.length, u = t.morphNormals.length, p = {}, d = [], f = 0, m = t.faces.length; m > f; f++) { o = t.faces[f]; var T = i ? o.materialIndex : 0; T in n || (n[T] = { hash: T, counter: 0 }), o = n[T].hash + "_" + n[T].counter, o in p || (a = { id: Xe++, faces3: [], materialIndex: T, vertices: 0, numMorphTargets: c, numMorphNormals: u }, p[o] = a, d.push(a)), p[o].vertices + 3 > l && (n[T].counter += 1, o = n[T].hash + "_" + n[T].counter, o in p || (a = { id: Xe++, faces3: [], materialIndex: T, vertices: 0, numMorphTargets: c, numMorphNormals: u }, p[o] = a, d.push(a))), p[o].faces3.push(f), p[o].vertices += 3 } s[h] = d, t.groupsNeedUpdate = !1 } for (s = je[t.id], h = 0, i = s.length; i > h; h++) { if (l = s[h], void 0 === l.__webglVertexBuffer) { if (n = l, n.__webglVertexBuffer = Y.createBuffer(), n.__webglNormalBuffer = Y.createBuffer(), n.__webglTangentBuffer = Y.createBuffer(), n.__webglColorBuffer = Y.createBuffer(), n.__webglUVBuffer = Y.createBuffer(), n.__webglUV2Buffer = Y.createBuffer(), n.__webglSkinIndicesBuffer = Y.createBuffer(), n.__webglSkinWeightsBuffer = Y.createBuffer(), n.__webglFaceBuffer = Y.createBuffer(), n.__webglLineBuffer = Y.createBuffer(), u = n.numMorphTargets) for (n.__webglMorphTargetsBuffers = [], c = 0; u > c; c++) n.__webglMorphTargetsBuffers.push(Y.createBuffer()); if (u = n.numMorphNormals) for (n.__webglMorphNormalsBuffers = [], c = 0; u > c; c++) n.__webglMorphNormalsBuffers.push(Y.createBuffer()); if (K.info.memory.geometries++, n = l, f = e, m = f.geometry, u = n.faces3, c = 3 * u.length, p = 1 * u.length, d = 3 * u.length, u = r(f, n), n.__vertexArray = new Float32Array(3 * c), n.__normalArray = new Float32Array(3 * c), n.__colorArray = new Float32Array(3 * c), n.__uvArray = new Float32Array(2 * c), 1 < m.faceVertexUvs.length && (n.__uv2Array = new Float32Array(2 * c)), m.hasTangents && (n.__tangentArray = new Float32Array(4 * c)), f.geometry.skinWeights.length && f.geometry.skinIndices.length && (n.__skinIndexArray = new Float32Array(4 * c), n.__skinWeightArray = new Float32Array(4 * c)), f = null !== ge.get("OES_element_index_uint") && p > 21845 ? Uint32Array : Uint16Array, n.__typeArray = f, n.__faceArray = new f(3 * p), n.__lineArray = new f(2 * d), m = n.numMorphTargets) for (n.__morphTargetsArrays = [], f = 0; m > f; f++) n.__morphTargetsArrays.push(new Float32Array(3 * c)); if (m = n.numMorphNormals) for (n.__morphNormalsArrays = [], f = 0; m > f; f++) n.__morphNormalsArrays.push(new Float32Array(3 * c)); if (n.__webglFaceCount = 3 * p, n.__webglLineCount = 2 * d, u.attributes) for (p in void 0 === n.__webglCustomAttributesList && (n.__webglCustomAttributesList = []), p = void 0, u.attributes) { var g, d = u.attributes[p], f = {}; for (g in d) f[g] = d[g]; (!f.__webglInitialized || f.createUniqueBuffers) && (f.__webglInitialized = !0, m = 1, "v2" === f.type ? m = 2 : "v3" === f.type ? m = 3 : "v4" === f.type ? m = 4 : "c" === f.type && (m = 3), f.size = m, f.array = new Float32Array(c * m), f.buffer = Y.createBuffer(), f.buffer.belongsToAttribute = p, d.needsUpdate = !0, f.__original = d), n.__webglCustomAttributesList.push(f) } n.__inittedArrays = !0, t.verticesNeedUpdate = !0, t.morphTargetsNeedUpdate = !0, t.elementsNeedUpdate = !0, t.uvsNeedUpdate = !0, t.normalsNeedUpdate = !0, t.tangentsNeedUpdate = !0, n = t.colorsNeedUpdate = !0 } else n = !1; (n || void 0 === e.__webglActive) && E(G, l, e) } e.__webglActive = !0 } function E(e, t, r) { var i = r.id; e[i] = e[i] || [], e[i].push({ id: i, buffer: t, object: r, material: null, z: 0 }) } function p(e) { var t = e.geometry; if (t instanceof THREE.BufferGeometry) for (var i = t.attributes, n = t.attributesKeys, o = 0, a = n.length; a > o; o++) { var s = n[o], h = i[s], l = "index" === s ? Y.ELEMENT_ARRAY_BUFFER : Y.ARRAY_BUFFER; void 0 === h.buffer ? (h.buffer = Y.createBuffer(), Y.bindBuffer(l, h.buffer), Y.bufferData(l, h.array, h instanceof THREE.DynamicBufferAttribute ? Y.DYNAMIC_DRAW : Y.STATIC_DRAW), h.needsUpdate = !1) : !0 === h.needsUpdate && (Y.bindBuffer(l, h.buffer), void 0 === h.updateRange || -1 === h.updateRange.count ? Y.bufferSubData(l, 0, h.array) : 0 === h.updateRange.count ? console.error("THREE.WebGLRenderer.updateObject: using updateRange for THREE.DynamicBufferAttribute and marked as needsUpdate but count is 0, ensure you are using set methods or updating manually.") : (Y.bufferSubData(l, h.updateRange.offset * h.array.BYTES_PER_ELEMENT, h.array.subarray(h.updateRange.offset, h.updateRange.offset + h.updateRange.count)), h.updateRange.count = 0), h.needsUpdate = !1) } else if (e instanceof THREE.Mesh) {!0 === t.groupsNeedUpdate && u(e, t); for (var c = je[t.id], o = 0, E = c.length; E > o; o++) { var p = c[o], m = r(e, p), T = m.attributes && d(m); if (t.verticesNeedUpdate || t.morphTargetsNeedUpdate || t.elementsNeedUpdate || t.uvsNeedUpdate || t.normalsNeedUpdate || t.colorsNeedUpdate || t.tangentsNeedUpdate || T) { var g = p, R = e, y = Y.DYNAMIC_DRAW, v = !t.dynamic, H = m; if (g.__inittedArrays) { var x = !1 == H instanceof THREE.MeshPhongMaterial && H.shading === THREE.FlatShading, b = void 0, w = void 0, _ = void 0, M = void 0, S = void 0, C = void 0, A = void 0, L = void 0, P = void 0, F = void 0, B = void 0, U = void 0, D = void 0, V = void 0, z = void 0, k = void 0, N = void 0, O = void 0, G = void 0, I = void 0, W = void 0, j = void 0, X = void 0, q = void 0, K = void 0, Q = void 0, Z = void 0, J = void 0, $ = void 0, ee = void 0, te = void 0, re = void 0, ie = void 0, ne = void 0, oe = void 0, ae = void 0, se = void 0, he = void 0, le = void 0, ce = void 0, ue = 0, Ee = 0, pe = 0, de = 0, fe = 0, me = 0, Te = 0, ge = 0, Re = 0, ye = 0, ve = 0, He = 0, xe = void 0, be = g.__vertexArray, we = g.__uvArray, _e = g.__uv2Array, Me = g.__normalArray, Se = g.__tangentArray, Ce = g.__colorArray, Ae = g.__skinIndexArray, Le = g.__skinWeightArray, Pe = g.__morphTargetsArrays, Fe = g.__morphNormalsArrays, Be = g.__webglCustomAttributesList, Ue = void 0, De = g.__faceArray, Ve = g.__lineArray, ze = R.geometry, ke = ze.elementsNeedUpdate, Ne = ze.uvsNeedUpdate, Oe = ze.normalsNeedUpdate, Ge = ze.tangentsNeedUpdate, Ie = ze.colorsNeedUpdate, We = ze.morphTargetsNeedUpdate, Xe = ze.vertices, qe = g.faces3, Ye = ze.faces, Ke = ze.faceVertexUvs[0], Qe = ze.faceVertexUvs[1], Ze = ze.skinIndices, Je = ze.skinWeights, $e = ze.morphTargets, et = ze.morphNormals; if (ze.verticesNeedUpdate) { for (b = 0, w = qe.length; w > b; b++) M = Ye[qe[b]], U = Xe[M.a], D = Xe[M.b], V = Xe[M.c], be[Ee] = U.x, be[Ee + 1] = U.y, be[Ee + 2] = U.z, be[Ee + 3] = D.x, be[Ee + 4] = D.y, be[Ee + 5] = D.z, be[Ee + 6] = V.x, be[Ee + 7] = V.y, be[Ee + 8] = V.z, Ee += 9; Y.bindBuffer(Y.ARRAY_BUFFER, g.__webglVertexBuffer), Y.bufferData(Y.ARRAY_BUFFER, be, y) } if (We) for (oe = 0, ae = $e.length; ae > oe; oe++) { for (b = ve = 0, w = qe.length; w > b; b++) le = qe[b], M = Ye[le], U = $e[oe].vertices[M.a], D = $e[oe].vertices[M.b], V = $e[oe].vertices[M.c], se = Pe[oe], se[ve] = U.x, se[ve + 1] = U.y, se[ve + 2] = U.z, se[ve + 3] = D.x, se[ve + 4] = D.y, se[ve + 5] = D.z, se[ve + 6] = V.x, se[ve + 7] = V.y, se[ve + 8] = V.z, H.morphNormals && (x ? I = G = O = et[oe].faceNormals[le] : (ce = et[oe].vertexNormals[le], O = ce.a, G = ce.b, I = ce.c), he = Fe[oe], he[ve] = O.x, he[ve + 1] = O.y, he[ve + 2] = O.z, he[ve + 3] = G.x, he[ve + 4] = G.y, he[ve + 5] = G.z, he[ve + 6] = I.x, he[ve + 7] = I.y, he[ve + 8] = I.z), ve += 9; Y.bindBuffer(Y.ARRAY_BUFFER, g.__webglMorphTargetsBuffers[oe]), Y.bufferData(Y.ARRAY_BUFFER, Pe[oe], y), H.morphNormals && (Y.bindBuffer(Y.ARRAY_BUFFER, g.__webglMorphNormalsBuffers[oe]), Y.bufferData(Y.ARRAY_BUFFER, Fe[oe], y)) } if (Je.length) { for (b = 0, w = qe.length; w > b; b++) M = Ye[qe[b]], q = Je[M.a], K = Je[M.b], Q = Je[M.c], Le[ye] = q.x, Le[ye + 1] = q.y, Le[ye + 2] = q.z, Le[ye + 3] = q.w, Le[ye + 4] = K.x, Le[ye + 5] = K.y, Le[ye + 6] = K.z, Le[ye + 7] = K.w, Le[ye + 8] = Q.x, Le[ye + 9] = Q.y, Le[ye + 10] = Q.z, Le[ye + 11] = Q.w, Z = Ze[M.a], J = Ze[M.b], $ = Ze[M.c], Ae[ye] = Z.x, Ae[ye + 1] = Z.y, Ae[ye + 2] = Z.z, Ae[ye + 3] = Z.w, Ae[ye + 4] = J.x, Ae[ye + 5] = J.y, Ae[ye + 6] = J.z, Ae[ye + 7] = J.w, Ae[ye + 8] = $.x, Ae[ye + 9] = $.y, Ae[ye + 10] = $.z, Ae[ye + 11] = $.w, ye += 12; ye > 0 && (Y.bindBuffer(Y.ARRAY_BUFFER, g.__webglSkinIndicesBuffer), Y.bufferData(Y.ARRAY_BUFFER, Ae, y), Y.bindBuffer(Y.ARRAY_BUFFER, g.__webglSkinWeightsBuffer), Y.bufferData(Y.ARRAY_BUFFER, Le, y)) } if (Ie) { for (b = 0, w = qe.length; w > b; b++) M = Ye[qe[b]], A = M.vertexColors, L = M.color, 3 === A.length && H.vertexColors === THREE.VertexColors ? (W = A[0], j = A[1], X = A[2]) : X = j = W = L, Ce[Re] = W.r, Ce[Re + 1] = W.g, Ce[Re + 2] = W.b, Ce[Re + 3] = j.r, Ce[Re + 4] = j.g, Ce[Re + 5] = j.b, Ce[Re + 6] = X.r, Ce[Re + 7] = X.g, Ce[Re + 8] = X.b, Re += 9; Re > 0 && (Y.bindBuffer(Y.ARRAY_BUFFER, g.__webglColorBuffer), Y.bufferData(Y.ARRAY_BUFFER, Ce, y)) } if (Ge && ze.hasTangents) { for (b = 0, w = qe.length; w > b; b++) M = Ye[qe[b]], P = M.vertexTangents, z = P[0], k = P[1], N = P[2], Se[Te] = z.x, Se[Te + 1] = z.y, Se[Te + 2] = z.z, Se[Te + 3] = z.w, Se[Te + 4] = k.x, Se[Te + 5] = k.y, Se[Te + 6] = k.z, Se[Te + 7] = k.w, Se[Te + 8] = N.x, Se[Te + 9] = N.y, Se[Te + 10] = N.z, Se[Te + 11] = N.w, Te += 12; Y.bindBuffer(Y.ARRAY_BUFFER, g.__webglTangentBuffer), Y.bufferData(Y.ARRAY_BUFFER, Se, y) } if (Oe) { for (b = 0, w = qe.length; w > b; b++) if (M = Ye[qe[b]], S = M.vertexNormals, C = M.normal, 3 === S.length && !1 === x) for (ee = 0; 3 > ee; ee++) re = S[ee], Me[me] = re.x, Me[me + 1] = re.y, Me[me + 2] = re.z, me += 3; else for (ee = 0; 3 > ee; ee++) Me[me] = C.x, Me[me + 1] = C.y, Me[me + 2] = C.z, me += 3; Y.bindBuffer(Y.ARRAY_BUFFER, g.__webglNormalBuffer), Y.bufferData(Y.ARRAY_BUFFER, Me, y) } if (Ne && Ke) { for (b = 0, w = qe.length; w > b; b++) if (_ = qe[b], F = Ke[_], void 0 !== F) for (ee = 0; 3 > ee; ee++) ie = F[ee], we[pe] = ie.x, we[pe + 1] = ie.y, pe += 2; pe > 0 && (Y.bindBuffer(Y.ARRAY_BUFFER, g.__webglUVBuffer), Y.bufferData(Y.ARRAY_BUFFER, we, y)) } if (Ne && Qe) { for (b = 0, w = qe.length; w > b; b++) if (_ = qe[b], B = Qe[_], void 0 !== B) for (ee = 0; 3 > ee; ee++) ne = B[ee], _e[de] = ne.x, _e[de + 1] = ne.y, de += 2; de > 0 && (Y.bindBuffer(Y.ARRAY_BUFFER, g.__webglUV2Buffer), Y.bufferData(Y.ARRAY_BUFFER, _e, y)) } if (ke) { for (b = 0, w = qe.length; w > b; b++) De[fe] = ue, De[fe + 1] = ue + 1, De[fe + 2] = ue + 2, fe += 3, Ve[ge] = ue, Ve[ge + 1] = ue + 1, Ve[ge + 2] = ue, Ve[ge + 3] = ue + 2, Ve[ge + 4] = ue + 1, Ve[ge + 5] = ue + 2, ge += 6, ue += 3; Y.bindBuffer(Y.ELEMENT_ARRAY_BUFFER, g.__webglFaceBuffer), Y.bufferData(Y.ELEMENT_ARRAY_BUFFER, De, y), Y.bindBuffer(Y.ELEMENT_ARRAY_BUFFER, g.__webglLineBuffer), Y.bufferData(Y.ELEMENT_ARRAY_BUFFER, Ve, y) } if (Be) for (ee = 0, te = Be.length; te > ee; ee++) if (Ue = Be[ee], Ue.__original.needsUpdate) { if (He = 0, 1 === Ue.size) { if (void 0 === Ue.boundTo || "vertices" === Ue.boundTo) for (b = 0, w = qe.length; w > b; b++) M = Ye[qe[b]], Ue.array[He] = Ue.value[M.a], Ue.array[He + 1] = Ue.value[M.b], Ue.array[He + 2] = Ue.value[M.c], He += 3; else if ("faces" === Ue.boundTo) for (b = 0, w = qe.length; w > b; b++) xe = Ue.value[qe[b]], Ue.array[He] = xe, Ue.array[He + 1] = xe, Ue.array[He + 2] = xe, He += 3 } else if (2 === Ue.size) { if (void 0 === Ue.boundTo || "vertices" === Ue.boundTo) for (b = 0, w = qe.length; w > b; b++) M = Ye[qe[b]], U = Ue.value[M.a], D = Ue.value[M.b], V = Ue.value[M.c], Ue.array[He] = U.x, Ue.array[He + 1] = U.y, Ue.array[He + 2] = D.x, Ue.array[He + 3] = D.y, Ue.array[He + 4] = V.x, Ue.array[He + 5] = V.y, He += 6; else if ("faces" === Ue.boundTo) for (b = 0, w = qe.length; w > b; b++) V = D = U = xe = Ue.value[qe[b]], Ue.array[He] = U.x, Ue.array[He + 1] = U.y, Ue.array[He + 2] = D.x, Ue.array[He + 3] = D.y, Ue.array[He + 4] = V.x, Ue.array[He + 5] = V.y, He += 6 } else if (3 === Ue.size) { var tt; if (tt = "c" === Ue.type ? ["r", "g", "b"] : ["x", "y", "z"], void 0 === Ue.boundTo || "vertices" === Ue.boundTo) for (b = 0, w = qe.length; w > b; b++) M = Ye[qe[b]], U = Ue.value[M.a], D = Ue.value[M.b], V = Ue.value[M.c], Ue.array[He] = U[tt[0]], Ue.array[He + 1] = U[tt[1]], Ue.array[He + 2] = U[tt[2]], Ue.array[He + 3] = D[tt[0]], Ue.array[He + 4] = D[tt[1]], Ue.array[He + 5] = D[tt[2]], Ue.array[He + 6] = V[tt[0]], Ue.array[He + 7] = V[tt[1]], Ue.array[He + 8] = V[tt[2]], He += 9; else if ("faces" === Ue.boundTo) for (b = 0, w = qe.length; w > b; b++) V = D = U = xe = Ue.value[qe[b]], Ue.array[He] = U[tt[0]], Ue.array[He + 1] = U[tt[1]], Ue.array[He + 2] = U[tt[2]], Ue.array[He + 3] = D[tt[0]], Ue.array[He + 4] = D[tt[1]], Ue.array[He + 5] = D[tt[2]], Ue.array[He + 6] = V[tt[0]], Ue.array[He + 7] = V[tt[1]], Ue.array[He + 8] = V[tt[2]], He += 9; else if ("faceVertices" === Ue.boundTo) for (b = 0, w = qe.length; w > b; b++) xe = Ue.value[qe[b]], U = xe[0], D = xe[1], V = xe[2], Ue.array[He] = U[tt[0]], Ue.array[He + 1] = U[tt[1]], Ue.array[He + 2] = U[tt[2]], Ue.array[He + 3] = D[tt[0]], Ue.array[He + 4] = D[tt[1]], Ue.array[He + 5] = D[tt[2]], Ue.array[He + 6] = V[tt[0]], Ue.array[He + 7] = V[tt[1]], Ue.array[He + 8] = V[tt[2]], He += 9 } else if (4 === Ue.size) if (void 0 === Ue.boundTo || "vertices" === Ue.boundTo) for (b = 0, w = qe.length; w > b; b++) M = Ye[qe[b]], U = Ue.value[M.a], D = Ue.value[M.b], V = Ue.value[M.c], Ue.array[He] = U.x, Ue.array[He + 1] = U.y, Ue.array[He + 2] = U.z, Ue.array[He + 3] = U.w, Ue.array[He + 4] = D.x, Ue.array[He + 5] = D.y, Ue.array[He + 6] = D.z, Ue.array[He + 7] = D.w, Ue.array[He + 8] = V.x, Ue.array[He + 9] = V.y, Ue.array[He + 10] = V.z, Ue.array[He + 11] = V.w, He += 12; else if ("faces" === Ue.boundTo) for (b = 0, w = qe.length; w > b; b++) V = D = U = xe = Ue.value[qe[b]], Ue.array[He] = U.x, Ue.array[He + 1] = U.y, Ue.array[He + 2] = U.z, Ue.array[He + 3] = U.w, Ue.array[He + 4] = D.x, Ue.array[He + 5] = D.y, Ue.array[He + 6] = D.z, Ue.array[He + 7] = D.w, Ue.array[He + 8] = V.x, Ue.array[He + 9] = V.y, Ue.array[He + 10] = V.z, Ue.array[He + 11] = V.w, He += 12; else if ("faceVertices" === Ue.boundTo) for (b = 0, w = qe.length; w > b; b++) xe = Ue.value[qe[b]], U = xe[0], D = xe[1], V = xe[2], Ue.array[He] = U.x, Ue.array[He + 1] = U.y, Ue.array[He + 2] = U.z, Ue.array[He + 3] = U.w, Ue.array[He + 4] = D.x, Ue.array[He + 5] = D.y, Ue.array[He + 6] = D.z, Ue.array[He + 7] = D.w, Ue.array[He + 8] = V.x, Ue.array[He + 9] = V.y, Ue.array[He + 10] = V.z, Ue.array[He + 11] = V.w, He += 12; Y.bindBuffer(Y.ARRAY_BUFFER, Ue.buffer), Y.bufferData(Y.ARRAY_BUFFER, Ue.array, y) } v && (delete g.__inittedArrays, delete g.__colorArray, delete g.__normalArray, delete g.__tangentArray, delete g.__uvArray, delete g.__uv2Array, delete g.__faceArray, delete g.__vertexArray, delete g.__lineArray, delete g.__skinIndexArray, delete g.__skinWeightArray) } } } t.verticesNeedUpdate = !1, t.morphTargetsNeedUpdate = !1, t.elementsNeedUpdate = !1, t.uvsNeedUpdate = !1, t.normalsNeedUpdate = !1, t.colorsNeedUpdate = !1, t.tangentsNeedUpdate = !1, m.attributes && f(m) } else if (e instanceof THREE.Line) { if (m = r(e, t), T = m.attributes && d(m), t.verticesNeedUpdate || t.colorsNeedUpdate || t.lineDistancesNeedUpdate || T) { var rt, it, nt, ot, at, st, ht, lt, ct, ut, Et, pt, dt = Y.DYNAMIC_DRAW, ft = t.vertices, mt = t.colors, Tt = t.lineDistances, gt = ft.length, Rt = mt.length, yt = Tt.length, vt = t.__vertexArray, Ht = t.__colorArray, xt = t.__lineDistanceArray, bt = t.colorsNeedUpdate, wt = t.lineDistancesNeedUpdate, _t = t.__webglCustomAttributesList; if (t.verticesNeedUpdate) { for (rt = 0; gt > rt; rt++) ot = ft[rt], at = 3 * rt, vt[at] = ot.x, vt[at + 1] = ot.y, vt[at + 2] = ot.z; Y.bindBuffer(Y.ARRAY_BUFFER, t.__webglVertexBuffer), Y.bufferData(Y.ARRAY_BUFFER, vt, dt) } if (bt) { for (it = 0; Rt > it; it++) st = mt[it], at = 3 * it, Ht[at] = st.r, Ht[at + 1] = st.g, Ht[at + 2] = st.b; Y.bindBuffer(Y.ARRAY_BUFFER, t.__webglColorBuffer), Y.bufferData(Y.ARRAY_BUFFER, Ht, dt) } if (wt) { for (nt = 0; yt > nt; nt++) xt[nt] = Tt[nt]; Y.bindBuffer(Y.ARRAY_BUFFER, t.__webglLineDistanceBuffer), Y.bufferData(Y.ARRAY_BUFFER, xt, dt) } if (_t) for (ht = 0, lt = _t.length; lt > ht; ht++) if (pt = _t[ht], pt.needsUpdate && (void 0 === pt.boundTo || "vertices" === pt.boundTo)) { if (at = 0, ut = pt.value.length, 1 === pt.size) for (ct = 0; ut > ct; ct++) pt.array[ct] = pt.value[ct]; else if (2 === pt.size) for (ct = 0; ut > ct; ct++) Et = pt.value[ct], pt.array[at] = Et.x, pt.array[at + 1] = Et.y, at += 2; else if (3 === pt.size) if ("c" === pt.type) for (ct = 0; ut > ct; ct++) Et = pt.value[ct], pt.array[at] = Et.r, pt.array[at + 1] = Et.g, pt.array[at + 2] = Et.b, at += 3; else for (ct = 0; ut > ct; ct++) Et = pt.value[ct], pt.array[at] = Et.x, pt.array[at + 1] = Et.y, pt.array[at + 2] = Et.z, at += 3; else if (4 === pt.size) for (ct = 0; ut > ct; ct++) Et = pt.value[ct], pt.array[at] = Et.x, pt.array[at + 1] = Et.y, pt.array[at + 2] = Et.z, pt.array[at + 3] = Et.w, at += 4; Y.bindBuffer(Y.ARRAY_BUFFER, pt.buffer), Y.bufferData(Y.ARRAY_BUFFER, pt.array, dt), pt.needsUpdate = !1 } } t.verticesNeedUpdate = !1, t.colorsNeedUpdate = !1, t.lineDistancesNeedUpdate = !1, m.attributes && f(m) } else if (e instanceof THREE.PointCloud) { if (m = r(e, t), T = m.attributes && d(m), t.verticesNeedUpdate || t.colorsNeedUpdate || T) { var Mt, St, Ct, At, Lt, Pt, Ft, Bt, Ut, Dt, Vt, zt = Y.DYNAMIC_DRAW, kt = t.vertices, Nt = kt.length, Ot = t.colors, Gt = Ot.length, It = t.__vertexArray, Wt = t.__colorArray, jt = t.colorsNeedUpdate, Xt = t.__webglCustomAttributesList; if (t.verticesNeedUpdate) { for (Mt = 0; Nt > Mt; Mt++) Ct = kt[Mt], At = 3 * Mt, It[At] = Ct.x, It[At + 1] = Ct.y, It[At + 2] = Ct.z; Y.bindBuffer(Y.ARRAY_BUFFER, t.__webglVertexBuffer), Y.bufferData(Y.ARRAY_BUFFER, It, zt) } if (jt) { for (St = 0; Gt > St; St++) Lt = Ot[St], At = 3 * St, Wt[At] = Lt.r, Wt[At + 1] = Lt.g, Wt[At + 2] = Lt.b; Y.bindBuffer(Y.ARRAY_BUFFER, t.__webglColorBuffer), Y.bufferData(Y.ARRAY_BUFFER, Wt, zt) } if (Xt) for (Pt = 0, Ft = Xt.length; Ft > Pt; Pt++) { if (Vt = Xt[Pt], Vt.needsUpdate && (void 0 === Vt.boundTo || "vertices" === Vt.boundTo)) if (Ut = Vt.value.length, At = 0, 1 === Vt.size) for (Bt = 0; Ut > Bt; Bt++) Vt.array[Bt] = Vt.value[Bt]; else if (2 === Vt.size) for (Bt = 0; Ut > Bt; Bt++) Dt = Vt.value[Bt], Vt.array[At] = Dt.x, Vt.array[At + 1] = Dt.y, At += 2; else if (3 === Vt.size) if ("c" === Vt.type) for (Bt = 0; Ut > Bt; Bt++) Dt = Vt.value[Bt], Vt.array[At] = Dt.r, Vt.array[At + 1] = Dt.g, Vt.array[At + 2] = Dt.b, At += 3; else for (Bt = 0; Ut > Bt; Bt++) Dt = Vt.value[Bt], Vt.array[At] = Dt.x, Vt.array[At + 1] = Dt.y, Vt.array[At + 2] = Dt.z, At += 3; else if (4 === Vt.size) for (Bt = 0; Ut > Bt; Bt++) Dt = Vt.value[Bt], Vt.array[At] = Dt.x, Vt.array[At + 1] = Dt.y, Vt.array[At + 2] = Dt.z, Vt.array[At + 3] = Dt.w, At += 4; Y.bindBuffer(Y.ARRAY_BUFFER, Vt.buffer), Y.bufferData(Y.ARRAY_BUFFER, Vt.array, zt), Vt.needsUpdate = !1 } } t.verticesNeedUpdate = !1, t.colorsNeedUpdate = !1, m.attributes && f(m) } } function d(e) { for (var t in e.attributes) if (e.attributes[t].needsUpdate) return !0; return !1 } function f(e) { for (var t in e.attributes) e.attributes[t].needsUpdate = !1 } function m(e) {!0 === e.transparent ? Te.setBlending(e.blending, e.blendEquation, e.blendSrc, e.blendDst, e.blendEquationAlpha, e.blendSrcAlpha, e.blendDstAlpha) : Te.setBlending(THREE.NoBlending), Te.setDepthTest(e.depthTest), Te.setDepthWrite(e.depthWrite), Te.setColorWrite(e.colorWrite), Te.setPolygonOffset(e.polygonOffset, e.polygonOffsetFactor, e.polygonOffsetUnits) } function T(e, t, r, i, n) { var o, a, s, h; if (re = 0, i.needsUpdate) { i.program && We(i), i.addEventListener("dispose", Ge); var l = qe[i.type]; if (l) { var c = THREE.ShaderLib[l]; i.__webglShader = { uniforms: THREE.UniformsUtils.clone(c.uniforms), vertexShader: c.vertexShader, fragmentShader: c.fragmentShader } } else i.__webglShader = { uniforms: i.uniforms, vertexShader: i.vertexShader, fragmentShader: i.fragmentShader }; for (var u = 0, E = 0, p = 0, d = 0, f = 0, m = t.length; m > f; f++) { var T = t[f]; T.onlyShadow || !1 === T.visible || (T instanceof THREE.DirectionalLight && u++, T instanceof THREE.PointLight && E++, T instanceof THREE.SpotLight && p++, T instanceof THREE.HemisphereLight && d++) } o = u, a = E, s = p, h = d; for (var y, b = 0, w = 0, _ = t.length; _ > w; w++) { var C = t[w]; C.castShadow && (C instanceof THREE.SpotLight && b++, C instanceof THREE.DirectionalLight && !C.shadowCascade && b++) } y = b; var A; if (Me && n && n.skeleton && n.skeleton.useVertexTexture) A = 1024; else { var P = Y.getParameter(Y.MAX_VERTEX_UNIFORM_VECTORS), F = Math.floor((P - 20) / 4); void 0 !== n && n instanceof THREE.SkinnedMesh && (F = Math.min(n.skeleton.bones.length, F), F < n.skeleton.bones.length && THREE.warn("WebGLRenderer: too many bones - " + n.skeleton.bones.length + ", this GPU supports just " + F + " (try OpenGL instead of ANGLE)")), A = F } var B = { precision: L, supportsVertexTextures: _e, map: !!i.map, envMap: !!i.envMap, envMapMode: i.envMap && i.envMap.mapping, lightMap: !!i.lightMap, bumpMap: !!i.bumpMap, normalMap: !!i.normalMap, specularMap: !!i.specularMap, alphaMap: !!i.alphaMap, combine: i.combine, vertexColors: i.vertexColors, fog: r, useFog: i.fog, fogExp: r instanceof THREE.FogExp2, flatShading: i.shading === THREE.FlatShading, sizeAttenuation: i.sizeAttenuation, logarithmicDepthBuffer: z, skinning: i.skinning, maxBones: A, useVertexTexture: Me && n && n.skeleton && n.skeleton.useVertexTexture, morphTargets: i.morphTargets, morphNormals: i.morphNormals, maxMorphTargets: K.maxMorphTargets, maxMorphNormals: K.maxMorphNormals, maxDirLights: o, maxPointLights: a, maxSpotLights: s, maxHemiLights: h, maxShadows: y, shadowMapEnabled: K.shadowMapEnabled && n.receiveShadow && y > 0, shadowMapType: K.shadowMapType, shadowMapDebug: K.shadowMapDebug, shadowMapCascade: K.shadowMapCascade, alphaTest: i.alphaTest, metal: i.metal, wrapAround: i.wrapAround, doubleSided: i.side === THREE.DoubleSide, flipSided: i.side === THREE.BackSide }, U = []; if (l ? U.push(l) : (U.push(i.fragmentShader), U.push(i.vertexShader)), void 0 !== i.defines) for (var D in i.defines) U.push(D), U.push(i.defines[D]); for (D in B) U.push(D), U.push(B[D]); for (var V, k = U.join(), N = 0, O = Q.length; O > N; N++) { var G = Q[N]; if (G.code === k) { V = G, V.usedTimes++; break } } void 0 === V && (V = new THREE.WebGLProgram(K, k, i, B), Q.push(V), K.info.memory.programs = Q.length), i.program = V; var I = V.attributes; if (i.morphTargets) { i.numSupportedMorphTargets = 0; for (var W, j = "morphTarget", X = 0; X < K.maxMorphTargets; X++) W = j + X, 0 <= I[W] && i.numSupportedMorphTargets++ } if (i.morphNormals) for (i.numSupportedMorphNormals = 0, j = "morphNormal", X = 0; X < K.maxMorphNormals; X++) W = j + X, 0 <= I[W] && i.numSupportedMorphNormals++; i.uniformsList = []; for (var q in i.__webglShader.uniforms) { var J = i.program.uniforms[q]; J && i.uniformsList.push([i.__webglShader.uniforms[q], J]) } i.needsUpdate = !1 } i.morphTargets && !n.__webglMorphTargetInfluences && (n.__webglMorphTargetInfluences = new Float32Array(K.maxMorphTargets)); var ee = !1, ie = !1, ne = !1, oe = i.program, ae = oe.uniforms, se = i.__webglShader.uniforms; if (oe.id !== Z && (Y.useProgram(oe.program), Z = oe.id, ne = ie = ee = !0), i.id !== $ && (-1 === $ && (ne = !0), $ = i.id, ie = !0), (ee || e !== te) && (Y.uniformMatrix4fv(ae.projectionMatrix, !1, e.projectionMatrix.elements), z && Y.uniform1f(ae.logDepthBufFC, 2 / (Math.log(e.far + 1) / Math.LN2)), e !== te && (te = e), (i instanceof THREE.ShaderMaterial || i instanceof THREE.MeshPhongMaterial || i.envMap) && null !== ae.cameraPosition && (ue.setFromMatrixPosition(e.matrixWorld), Y.uniform3f(ae.cameraPosition, ue.x, ue.y, ue.z)), (i instanceof THREE.MeshPhongMaterial || i instanceof THREE.MeshLambertMaterial || i instanceof THREE.MeshBasicMaterial || i instanceof THREE.ShaderMaterial || i.skinning) && null !== ae.viewMatrix && Y.uniformMatrix4fv(ae.viewMatrix, !1, e.matrixWorldInverse.elements)), i.skinning) if (n.bindMatrix && null !== ae.bindMatrix && Y.uniformMatrix4fv(ae.bindMatrix, !1, n.bindMatrix.elements), n.bindMatrixInverse && null !== ae.bindMatrixInverse && Y.uniformMatrix4fv(ae.bindMatrixInverse, !1, n.bindMatrixInverse.elements), Me && n.skeleton && n.skeleton.useVertexTexture) { if (null !== ae.boneTexture) { var he = R(); Y.uniform1i(ae.boneTexture, he), K.setTexture(n.skeleton.boneTexture, he) } null !== ae.boneTextureWidth && Y.uniform1i(ae.boneTextureWidth, n.skeleton.boneTextureWidth), null !== ae.boneTextureHeight && Y.uniform1i(ae.boneTextureHeight, n.skeleton.boneTextureHeight) } else n.skeleton && n.skeleton.boneMatrices && null !== ae.boneGlobalMatrices && Y.uniformMatrix4fv(ae.boneGlobalMatrices, !1, n.skeleton.boneMatrices); if (ie) { if (r && i.fog && (se.fogColor.value = r.color, r instanceof THREE.Fog ? (se.fogNear.value = r.near, se.fogFar.value = r.far) : r instanceof THREE.FogExp2 && (se.fogDensity.value = r.density)), i instanceof THREE.MeshPhongMaterial || i instanceof THREE.MeshLambertMaterial || i.lights) { if (pe) { var le, ce, fe, me, Te, ge, Re, ye, ne = !0, ve = 0, He = 0, xe = 0, be = de, Se = be.directional.colors, Ce = be.directional.positions, Ae = be.point.colors, Le = be.point.positions, Fe = be.point.distances, Be = be.point.decays, Ue = be.spot.colors, De = be.spot.positions, Ve = be.spot.distances, ze = be.spot.directions, ke = be.spot.anglesCos, Oe = be.spot.exponents, Ie = be.spot.decays, je = be.hemi.skyColors, Xe = be.hemi.groundColors, Ye = be.hemi.positions, Ke = 0, Qe = 0, Ze = 0, Je = 0, $e = 0, et = 0, tt = 0, rt = 0, it = 0, nt = 0, ot = 0, at = 0; for (le = 0, ce = t.length; ce > le; le++) fe = t[le], fe.onlyShadow || (me = fe.color, Re = fe.intensity, ye = fe.distance, fe instanceof THREE.AmbientLight ? fe.visible && (ve += me.r, He += me.g, xe += me.b) : fe instanceof THREE.DirectionalLight ? ($e += 1, fe.visible && (Ee.setFromMatrixPosition(fe.matrixWorld), ue.setFromMatrixPosition(fe.target.matrixWorld), Ee.sub(ue), Ee.normalize(), it = 3 * Ke, Ce[it] = Ee.x, Ce[it + 1] = Ee.y, Ce[it + 2] = Ee.z, v(Se, it, me, Re), Ke += 1)) : fe instanceof THREE.PointLight ? (et += 1, fe.visible && (nt = 3 * Qe, v(Ae, nt, me, Re), ue.setFromMatrixPosition(fe.matrixWorld), Le[nt] = ue.x, Le[nt + 1] = ue.y, Le[nt + 2] = ue.z, Fe[Qe] = ye, Be[Qe] = 0 === fe.distance ? 0 : fe.decay, Qe += 1)) : fe instanceof THREE.SpotLight ? (tt += 1, fe.visible && (ot = 3 * Ze, v(Ue, ot, me, Re), Ee.setFromMatrixPosition(fe.matrixWorld), De[ot] = Ee.x, De[ot + 1] = Ee.y, De[ot + 2] = Ee.z, Ve[Ze] = ye, ue.setFromMatrixPosition(fe.target.matrixWorld), Ee.sub(ue), Ee.normalize(), ze[ot] = Ee.x, ze[ot + 1] = Ee.y, ze[ot + 2] = Ee.z, ke[Ze] = Math.cos(fe.angle), Oe[Ze] = fe.exponent, Ie[Ze] = 0 === fe.distance ? 0 : fe.decay, Ze += 1)) : fe instanceof THREE.HemisphereLight && (rt += 1, fe.visible && (Ee.setFromMatrixPosition(fe.matrixWorld), Ee.normalize(), at = 3 * Je, Ye[at] = Ee.x, Ye[at + 1] = Ee.y, Ye[at + 2] = Ee.z, Te = fe.color, ge = fe.groundColor, v(je, at, Te, Re), v(Xe, at, ge, Re), Je += 1))); for (le = 3 * Ke, ce = Math.max(Se.length, 3 * $e); ce > le; le++) Se[le] = 0; for (le = 3 * Qe, ce = Math.max(Ae.length, 3 * et); ce > le; le++) Ae[le] = 0; for (le = 3 * Ze, ce = Math.max(Ue.length, 3 * tt); ce > le; le++) Ue[le] = 0; for (le = 3 * Je, ce = Math.max(je.length, 3 * rt); ce > le; le++) je[le] = 0; for (le = 3 * Je, ce = Math.max(Xe.length, 3 * rt); ce > le; le++) Xe[le] = 0; be.directional.length = Ke, be.point.length = Qe, be.spot.length = Ze, be.hemi.length = Je, be.ambient[0] = ve, be.ambient[1] = He, be.ambient[2] = xe, pe = !1 } if (ne) { var st = de; se.ambientLightColor.value = st.ambient, se.directionalLightColor.value = st.directional.colors, se.directionalLightDirection.value = st.directional.positions, se.pointLightColor.value = st.point.colors, se.pointLightPosition.value = st.point.positions, se.pointLightDistance.value = st.point.distances, se.pointLightDecay.value = st.point.decays, se.spotLightColor.value = st.spot.colors, se.spotLightPosition.value = st.spot.positions, se.spotLightDistance.value = st.spot.distances, se.spotLightDirection.value = st.spot.directions, se.spotLightAngleCos.value = st.spot.anglesCos, se.spotLightExponent.value = st.spot.exponents, se.spotLightDecay.value = st.spot.decays, se.hemisphereLightSkyColor.value = st.hemi.skyColors, se.hemisphereLightGroundColor.value = st.hemi.groundColors, se.hemisphereLightDirection.value = st.hemi.positions, g(se, !0) } else g(se, !1) } if (i instanceof THREE.MeshBasicMaterial || i instanceof THREE.MeshLambertMaterial || i instanceof THREE.MeshPhongMaterial) { se.opacity.value = i.opacity, se.diffuse.value = i.color, se.map.value = i.map, se.lightMap.value = i.lightMap, se.specularMap.value = i.specularMap, se.alphaMap.value = i.alphaMap, i.bumpMap && (se.bumpMap.value = i.bumpMap, se.bumpScale.value = i.bumpScale), i.normalMap && (se.normalMap.value = i.normalMap, se.normalScale.value.copy(i.normalScale)); var ht; if (i.map ? ht = i.map : i.specularMap ? ht = i.specularMap : i.normalMap ? ht = i.normalMap : i.bumpMap ? ht = i.bumpMap : i.alphaMap && (ht = i.alphaMap), void 0 !== ht) { var lt = ht.offset, ct = ht.repeat; se.offsetRepeat.value.set(lt.x, lt.y, ct.x, ct.y) } se.envMap.value = i.envMap, se.flipEnvMap.value = i.envMap instanceof THREE.WebGLRenderTargetCube ? 1 : -1, se.reflectivity.value = i.reflectivity, se.refractionRatio.value = i.refractionRatio } if (i instanceof THREE.LineBasicMaterial) se.diffuse.value = i.color, se.opacity.value = i.opacity; else if (i instanceof THREE.LineDashedMaterial) se.diffuse.value = i.color, se.opacity.value = i.opacity, se.dashSize.value = i.dashSize, se.totalSize.value = i.dashSize + i.gapSize, se.scale.value = i.scale; else if (i instanceof THREE.PointCloudMaterial) { if (se.psColor.value = i.color, se.opacity.value = i.opacity, se.size.value = i.size, se.scale.value = S.height / 2, se.map.value = i.map, null !== i.map) { var ut = i.map.offset, Et = i.map.repeat; se.offsetRepeat.value.set(ut.x, ut.y, Et.x, Et.y) } } else i instanceof THREE.MeshPhongMaterial ? (se.shininess.value = i.shininess, se.emissive.value = i.emissive, se.specular.value = i.specular, i.wrapAround && se.wrapRGB.value.copy(i.wrapRGB)) : i instanceof THREE.MeshLambertMaterial ? (se.emissive.value = i.emissive, i.wrapAround && se.wrapRGB.value.copy(i.wrapRGB)) : i instanceof THREE.MeshDepthMaterial ? (se.mNear.value = e.near, se.mFar.value = e.far, se.opacity.value = i.opacity) : i instanceof THREE.MeshNormalMaterial && (se.opacity.value = i.opacity); if (n.receiveShadow && !i._shadowPass && se.shadowMatrix) for (var pt = 0, dt = 0, ft = t.length; ft > dt; dt++) { var mt = t[dt]; mt.castShadow && (mt instanceof THREE.SpotLight || mt instanceof THREE.DirectionalLight && !mt.shadowCascade) && (se.shadowMap.value[pt] = mt.shadowMap, se.shadowMapSize.value[pt] = mt.shadowMapSize, se.shadowMatrix.value[pt] = mt.shadowMatrix, se.shadowDarkness.value[pt] = mt.shadowDarkness, se.shadowBias.value[pt] = mt.shadowBias, pt++) } for (var Tt, gt, Rt, yt = i.uniformsList, vt = 0, Ht = yt.length; Ht > vt; vt++) { var xt = yt[vt][0]; if (!1 !== xt.needsUpdate) { var bt = xt.type, wt = xt.value, _t = yt[vt][1]; switch (bt) { case "1i": Y.uniform1i(_t, wt); break; case "1f": Y.uniform1f(_t, wt); break; case "2f": Y.uniform2f(_t, wt[0], wt[1]); break; case "3f": Y.uniform3f(_t, wt[0], wt[1], wt[2]); break; case "4f": Y.uniform4f(_t, wt[0], wt[1], wt[2], wt[3]); break; case "1iv": Y.uniform1iv(_t, wt); break; case "3iv": Y.uniform3iv(_t, wt); break; case "1fv": Y.uniform1fv(_t, wt); break; case "2fv": Y.uniform2fv(_t, wt); break; case "3fv": Y.uniform3fv(_t, wt); break; case "4fv": Y.uniform4fv(_t, wt); break; case "Matrix3fv": Y.uniformMatrix3fv(_t, !1, wt); break; case "Matrix4fv": Y.uniformMatrix4fv(_t, !1, wt); break; case "i": Y.uniform1i(_t, wt); break; case "f": Y.uniform1f(_t, wt); break; case "v2": Y.uniform2f(_t, wt.x, wt.y); break; case "v3": Y.uniform3f(_t, wt.x, wt.y, wt.z); break; case "v4": Y.uniform4f(_t, wt.x, wt.y, wt.z, wt.w); break; case "c": Y.uniform3f(_t, wt.r, wt.g, wt.b); break; case "iv1": Y.uniform1iv(_t, wt); break; case "iv": Y.uniform3iv(_t, wt); break; case "fv1": Y.uniform1fv(_t, wt); break; case "fv": Y.uniform3fv(_t, wt); break; case "v2v": void 0 === xt._array && (xt._array = new Float32Array(2 * wt.length)); for (var Mt = 0, St = wt.length; St > Mt; Mt++) Rt = 2 * Mt, xt._array[Rt] = wt[Mt].x, xt._array[Rt + 1] = wt[Mt].y; Y.uniform2fv(_t, xt._array); break; case "v3v": for (void 0 === xt._array && (xt._array = new Float32Array(3 * wt.length)), Mt = 0, St = wt.length; St > Mt; Mt++) Rt = 3 * Mt, xt._array[Rt] = wt[Mt].x, xt._array[Rt + 1] = wt[Mt].y, xt._array[Rt + 2] = wt[Mt].z; Y.uniform3fv(_t, xt._array); break; case "v4v": for (void 0 === xt._array && (xt._array = new Float32Array(4 * wt.length)), Mt = 0, St = wt.length; St > Mt; Mt++) Rt = 4 * Mt, xt._array[Rt] = wt[Mt].x, xt._array[Rt + 1] = wt[Mt].y, xt._array[Rt + 2] = wt[Mt].z, xt._array[Rt + 3] = wt[Mt].w; Y.uniform4fv(_t, xt._array); break; case "m3": Y.uniformMatrix3fv(_t, !1, wt.elements); break; case "m3v": for (void 0 === xt._array && (xt._array = new Float32Array(9 * wt.length)), Mt = 0, St = wt.length; St > Mt; Mt++) wt[Mt].flattenToArrayOffset(xt._array, 9 * Mt); Y.uniformMatrix3fv(_t, !1, xt._array); break; case "m4": Y.uniformMatrix4fv(_t, !1, wt.elements); break; case "m4v": for (void 0 === xt._array && (xt._array = new Float32Array(16 * wt.length)), Mt = 0, St = wt.length; St > Mt; Mt++) wt[Mt].flattenToArrayOffset(xt._array, 16 * Mt); Y.uniformMatrix4fv(_t, !1, xt._array); break; case "t": if (Tt = wt, gt = R(), Y.uniform1i(_t, gt), !Tt) continue; if (Tt instanceof THREE.CubeTexture || Tt.image instanceof Array && 6 === Tt.image.length) { var Ct = Tt, At = gt; if (6 === Ct.image.length) if (Ct.needsUpdate) { Ct.image.__webglTextureCube || (Ct.addEventListener("dispose", Ne), Ct.image.__webglTextureCube = Y.createTexture(), K.info.memory.textures++), Y.activeTexture(Y.TEXTURE0 + At), Y.bindTexture(Y.TEXTURE_CUBE_MAP, Ct.image.__webglTextureCube), Y.pixelStorei(Y.UNPACK_FLIP_Y_WEBGL, Ct.flipY); for (var Lt = Ct instanceof THREE.CompressedTexture, Pt = Ct.image[0] instanceof THREE.DataTexture, Ft = [], Bt = 0; 6 > Bt; Bt++) Ft[Bt] = !K.autoScaleCubemaps || Lt || Pt ? Pt ? Ct.image[Bt].image : Ct.image[Bt] : x(Ct.image[Bt], we); var Ut = Ft[0], Dt = THREE.Math.isPowerOfTwo(Ut.width) && THREE.Math.isPowerOfTwo(Ut.height), Vt = M(Ct.format), zt = M(Ct.type); for (H(Y.TEXTURE_CUBE_MAP, Ct, Dt), Bt = 0; 6 > Bt; Bt++) if (Lt) for (var kt, Nt = Ft[Bt].mipmaps, Ot = 0, Gt = Nt.length; Gt > Ot; Ot++) kt = Nt[Ot], Ct.format !== THREE.RGBAFormat && Ct.format !== THREE.RGBFormat ? -1 < Pe().indexOf(Vt) ? Y.compressedTexImage2D(Y.TEXTURE_CUBE_MAP_POSITIVE_X + Bt, Ot, Vt, kt.width, kt.height, 0, kt.data) : THREE.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setCubeTexture()") : Y.texImage2D(Y.TEXTURE_CUBE_MAP_POSITIVE_X + Bt, Ot, Vt, kt.width, kt.height, 0, Vt, zt, kt.data); else Pt ? Y.texImage2D(Y.TEXTURE_CUBE_MAP_POSITIVE_X + Bt, 0, Vt, Ft[Bt].width, Ft[Bt].height, 0, Vt, zt, Ft[Bt].data) : Y.texImage2D(Y.TEXTURE_CUBE_MAP_POSITIVE_X + Bt, 0, Vt, Vt, zt, Ft[Bt]); Ct.generateMipmaps && Dt && Y.generateMipmap(Y.TEXTURE_CUBE_MAP), Ct.needsUpdate = !1, Ct.onUpdate && Ct.onUpdate() } else Y.activeTexture(Y.TEXTURE0 + At), Y.bindTexture(Y.TEXTURE_CUBE_MAP, Ct.image.__webglTextureCube) } else if (Tt instanceof THREE.WebGLRenderTargetCube) { var It = Tt; Y.activeTexture(Y.TEXTURE0 + gt), Y.bindTexture(Y.TEXTURE_CUBE_MAP, It.__webglTexture) } else K.setTexture(Tt, gt); break; case "tv": for (void 0 === xt._array && (xt._array = []), Mt = 0, St = xt.value.length; St > Mt; Mt++) xt._array[Mt] = R(); for (Y.uniform1iv(_t, xt._array), Mt = 0, St = xt.value.length; St > Mt; Mt++) Tt = xt.value[Mt], gt = xt._array[Mt], Tt && K.setTexture(Tt, gt); break; default: THREE.warn("THREE.WebGLRenderer: Unknown uniform type: " + bt) } } } } return Y.uniformMatrix4fv(ae.modelViewMatrix, !1, n._modelViewMatrix.elements), ae.normalMatrix && Y.uniformMatrix3fv(ae.normalMatrix, !1, n._normalMatrix.elements), null !== ae.modelMatrix && Y.uniformMatrix4fv(ae.modelMatrix, !1, n.matrixWorld.elements), oe } function g(e, t) { e.ambientLightColor.needsUpdate = t, e.directionalLightColor.needsUpdate = t, e.directionalLightDirection.needsUpdate = t, e.pointLightColor.needsUpdate = t, e.pointLightPosition.needsUpdate = t, e.pointLightDistance.needsUpdate = t, e.pointLightDecay.needsUpdate = t, e.spotLightColor.needsUpdate = t, e.spotLightPosition.needsUpdate = t, e.spotLightDistance.needsUpdate = t, e.spotLightDirection.needsUpdate = t, e.spotLightAngleCos.needsUpdate = t, e.spotLightExponent.needsUpdate = t, e.spotLightDecay.needsUpdate = t, e.hemisphereLightSkyColor.needsUpdate = t, e.hemisphereLightGroundColor.needsUpdate = t, e.hemisphereLightDirection.needsUpdate = t } function R() { var e = re; return e >= He && THREE.warn("WebGLRenderer: trying to use " + e + " texture units while this GPU supports only " + He), re += 1, e } function y(e, t) { e._modelViewMatrix.multiplyMatrices(t.matrixWorldInverse, e.matrixWorld), e._normalMatrix.getNormalMatrix(e._modelViewMatrix) } function v(e, t, r, i) { e[t] = r.r * i, e[t + 1] = r.g * i, e[t + 2] = r.b * i } function H(e, t, r) { r ? (Y.texParameteri(e, Y.TEXTURE_WRAP_S, M(t.wrapS)), Y.texParameteri(e, Y.TEXTURE_WRAP_T, M(t.wrapT)), Y.texParameteri(e, Y.TEXTURE_MAG_FILTER, M(t.magFilter)), Y.texParameteri(e, Y.TEXTURE_MIN_FILTER, M(t.minFilter))) : (Y.texParameteri(e, Y.TEXTURE_WRAP_S, Y.CLAMP_TO_EDGE), Y.texParameteri(e, Y.TEXTURE_WRAP_T, Y.CLAMP_TO_EDGE), t.wrapS === THREE.ClampToEdgeWrapping && t.wrapT === THREE.ClampToEdgeWrapping || THREE.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping. ( " + t.sourceFile + " )"), Y.texParameteri(e, Y.TEXTURE_MAG_FILTER, _(t.magFilter)), Y.texParameteri(e, Y.TEXTURE_MIN_FILTER, _(t.minFilter)), t.minFilter !== THREE.NearestFilter && t.minFilter !== THREE.LinearFilter && THREE.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter. ( " + t.sourceFile + " )")), (r = ge.get("EXT_texture_filter_anisotropic")) && t.type !== THREE.FloatType && t.type !== THREE.HalfFloatType && (1 < t.anisotropy || t.__currentAnisotropy) && (Y.texParameterf(e, r.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(t.anisotropy, K.getMaxAnisotropy())), t.__currentAnisotropy = t.anisotropy) } function x(e, t) { if (e.width > t || e.height > t) { var r = t / Math.max(e.width, e.height), i = document.createElement("canvas"); return i.width = Math.floor(e.width * r), i.height = Math.floor(e.height * r), i.getContext("2d").drawImage(e, 0, 0, e.width, e.height, 0, 0, i.width, i.height), THREE.warn("THREE.WebGLRenderer: image is too big (" + e.width + "x" + e.height + "). Resized to " + i.width + "x" + i.height, e), i } return e } function b(e, t) { Y.bindRenderbuffer(Y.RENDERBUFFER, e), t.depthBuffer && !t.stencilBuffer ? (Y.renderbufferStorage(Y.RENDERBUFFER, Y.DEPTH_COMPONENT16, t.width, t.height), Y.framebufferRenderbuffer(Y.FRAMEBUFFER, Y.DEPTH_ATTACHMENT, Y.RENDERBUFFER, e)) : t.depthBuffer && t.stencilBuffer ? (Y.renderbufferStorage(Y.RENDERBUFFER, Y.DEPTH_STENCIL, t.width, t.height), Y.framebufferRenderbuffer(Y.FRAMEBUFFER, Y.DEPTH_STENCIL_ATTACHMENT, Y.RENDERBUFFER, e)) : Y.renderbufferStorage(Y.RENDERBUFFER, Y.RGBA4, t.width, t.height) } function w(e) { e instanceof THREE.WebGLRenderTargetCube ? (Y.bindTexture(Y.TEXTURE_CUBE_MAP, e.__webglTexture), Y.generateMipmap(Y.TEXTURE_CUBE_MAP), Y.bindTexture(Y.TEXTURE_CUBE_MAP, null)) : (Y.bindTexture(Y.TEXTURE_2D, e.__webglTexture), Y.generateMipmap(Y.TEXTURE_2D), Y.bindTexture(Y.TEXTURE_2D, null)) } function _(e) { return e === THREE.NearestFilter || e === THREE.NearestMipMapNearestFilter || e === THREE.NearestMipMapLinearFilter ? Y.NEAREST : Y.LINEAR } function M(e) { var t; if (e === THREE.RepeatWrapping) return Y.REPEAT; if (e === THREE.ClampToEdgeWrapping) return Y.CLAMP_TO_EDGE; if (e === THREE.MirroredRepeatWrapping) return Y.MIRRORED_REPEAT; if (e === THREE.NearestFilter) return Y.NEAREST; if (e === THREE.NearestMipMapNearestFilter) return Y.NEAREST_MIPMAP_NEAREST; if (e === THREE.NearestMipMapLinearFilter) return Y.NEAREST_MIPMAP_LINEAR; if (e === THREE.LinearFilter) return Y.LINEAR; if (e === THREE.LinearMipMapNearestFilter) return Y.LINEAR_MIPMAP_NEAREST; if (e === THREE.LinearMipMapLinearFilter) return Y.LINEAR_MIPMAP_LINEAR; if (e === THREE.UnsignedByteType) return Y.UNSIGNED_BYTE; if (e === THREE.UnsignedShort4444Type) return Y.UNSIGNED_SHORT_4_4_4_4; if (e === THREE.UnsignedShort5551Type) return Y.UNSIGNED_SHORT_5_5_5_1; if (e === THREE.UnsignedShort565Type) return Y.UNSIGNED_SHORT_5_6_5; if (e === THREE.ByteType) return Y.BYTE; if (e === THREE.ShortType) return Y.SHORT; if (e === THREE.UnsignedShortType) return Y.UNSIGNED_SHORT; if (e === THREE.IntType) return Y.INT; if (e === THREE.UnsignedIntType) return Y.UNSIGNED_INT; if (e === THREE.FloatType) return Y.FLOAT; if (t = ge.get("OES_texture_half_float"), null !== t && e === THREE.HalfFloatType) return t.HALF_FLOAT_OES; if (e === THREE.AlphaFormat) return Y.ALPHA; if (e === THREE.RGBFormat) return Y.RGB; if (e === THREE.RGBAFormat) return Y.RGBA; if (e === THREE.LuminanceFormat) return Y.LUMINANCE; if (e === THREE.LuminanceAlphaFormat) return Y.LUMINANCE_ALPHA; if (e === THREE.AddEquation) return Y.FUNC_ADD; if (e === THREE.SubtractEquation) return Y.FUNC_SUBTRACT; if (e === THREE.ReverseSubtractEquation) return Y.FUNC_REVERSE_SUBTRACT; if (e === THREE.ZeroFactor) return Y.ZERO; if (e === THREE.OneFactor) return Y.ONE; if (e === THREE.SrcColorFactor) return Y.SRC_COLOR; if (e === THREE.OneMinusSrcColorFactor) return Y.ONE_MINUS_SRC_COLOR; if (e === THREE.SrcAlphaFactor) return Y.SRC_ALPHA; if (e === THREE.OneMinusSrcAlphaFactor) return Y.ONE_MINUS_SRC_ALPHA; if (e === THREE.DstAlphaFactor) return Y.DST_ALPHA; if (e === THREE.OneMinusDstAlphaFactor) return Y.ONE_MINUS_DST_ALPHA; if (e === THREE.DstColorFactor) return Y.DST_COLOR; if (e === THREE.OneMinusDstColorFactor) return Y.ONE_MINUS_DST_COLOR; if (e === THREE.SrcAlphaSaturateFactor) return Y.SRC_ALPHA_SATURATE; if (t = ge.get("WEBGL_compressed_texture_s3tc"), null !== t) { if (e === THREE.RGB_S3TC_DXT1_Format) return t.COMPRESSED_RGB_S3TC_DXT1_EXT; if (e === THREE.RGBA_S3TC_DXT1_Format) return t.COMPRESSED_RGBA_S3TC_DXT1_EXT; if (e === THREE.RGBA_S3TC_DXT3_Format) return t.COMPRESSED_RGBA_S3TC_DXT3_EXT; if (e === THREE.RGBA_S3TC_DXT5_Format) return t.COMPRESSED_RGBA_S3TC_DXT5_EXT } if (t = ge.get("WEBGL_compressed_texture_pvrtc"), null !== t) { if (e === THREE.RGB_PVRTC_4BPPV1_Format) return t.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; if (e === THREE.RGB_PVRTC_2BPPV1_Format) return t.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; if (e === THREE.RGBA_PVRTC_4BPPV1_Format) return t.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; if (e === THREE.RGBA_PVRTC_2BPPV1_Format) return t.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG } if (t = ge.get("EXT_blend_minmax"), null !== t) { if (e === THREE.MinEquation) return t.MIN_EXT; if (e === THREE.MaxEquation) return t.MAX_EXT } return 0 } console.log("THREE.WebGLRenderer", THREE.REVISION), e = e || {}; var S = void 0 !== e.canvas ? e.canvas : document.createElement("canvas"), C = void 0 !== e.context ? e.context : null, A = 1, L = void 0 !== e.precision ? e.precision : "highp", P = void 0 !== e.alpha ? e.alpha : !1, F = void 0 !== e.depth ? e.depth : !0, B = void 0 !== e.stencil ? e.stencil : !0, U = void 0 !== e.antialias ? e.antialias : !1, D = void 0 !== e.premultipliedAlpha ? e.premultipliedAlpha : !0, V = void 0 !== e.preserveDrawingBuffer ? e.preserveDrawingBuffer : !1, z = void 0 !== e.logarithmicDepthBuffer ? e.logarithmicDepthBuffer : !1, k = new THREE.Color(0), N = 0, O = [], G = {}, I = [], W = [], j = [], X = [], q = []; this.domElement = S, this.context = null, this.sortObjects = this.autoClearStencil = this.autoClearDepth = this.autoClearColor = this.autoClear = !0, this.gammaFactor = 2, this.shadowMapEnabled = this.gammaOutput = this.gammaInput = !1, this.shadowMapType = THREE.PCFShadowMap, this.shadowMapCullFace = THREE.CullFaceFront, this.shadowMapCascade = this.shadowMapDebug = !1, this.maxMorphTargets = 8, this.maxMorphNormals = 4, this.autoScaleCubemaps = !0, this.info = { memory: { programs: 0, geometries: 0, textures: 0 }, render: { calls: 0, vertices: 0, faces: 0, points: 0 } }; var Y, K = this, Q = [], Z = null, J = null, $ = -1, ee = "", te = null, re = 0, ie = 0, ne = 0, oe = S.width, ae = S.height, se = 0, he = 0, le = new THREE.Frustum, ce = new THREE.Matrix4, ue = new THREE.Vector3, Ee = new THREE.Vector3, pe = !0, de = { ambient: [0, 0, 0], directional: { length: 0, colors: [], positions: [] }, point: { length: 0, colors: [], positions: [], distances: [], decays: [] }, spot: { length: 0, colors: [], positions: [], distances: [], directions: [], anglesCos: [], exponents: [], decays: [] }, hemi: { length: 0, skyColors: [], groundColors: [], positions: [] } }; try { var fe = { alpha: P, depth: F, stencil: B, antialias: U, premultipliedAlpha: D, preserveDrawingBuffer: V }; if (Y = C || S.getContext("webgl", fe) || S.getContext("experimental-webgl", fe), null === Y) { if (null !== S.getContext("webgl")) throw "Error creating WebGL context with your selected attributes."; throw "Error creating WebGL context." } S.addEventListener("webglcontextlost", function(e) { e.preventDefault(), ve(), ye(), G = {} }, !1) } catch (me) { THREE.error("THREE.WebGLRenderer: " + me) } var Te = new THREE.WebGLState(Y, M); void 0 === Y.getShaderPrecisionFormat && (Y.getShaderPrecisionFormat = function() { return { rangeMin: 1, rangeMax: 1, precision: 1 } }); var ge = new THREE.WebGLExtensions(Y); ge.get("OES_texture_float"), ge.get("OES_texture_float_linear"), ge.get("OES_texture_half_float"), ge.get("OES_texture_half_float_linear"), ge.get("OES_standard_derivatives"), z && ge.get("EXT_frag_depth"); var Re = function(e, t, r, i) {!0 === D && (e *= i, t *= i, r *= i), Y.clearColor(e, t, r, i) }, ye = function() { Y.clearColor(0, 0, 0, 1), Y.clearDepth(1), Y.clearStencil(0), Y.enable(Y.DEPTH_TEST), Y.depthFunc(Y.LEQUAL), Y.frontFace(Y.CCW), Y.cullFace(Y.BACK), Y.enable(Y.CULL_FACE), Y.enable(Y.BLEND), Y.blendEquation(Y.FUNC_ADD), Y.blendFunc(Y.SRC_ALPHA, Y.ONE_MINUS_SRC_ALPHA), Y.viewport(ie, ne, oe, ae), Re(k.r, k.g, k.b, N) }, ve = function() { te = Z = null, ee = "", $ = -1, pe = !0, Te.reset() }; ye(), this.context = Y, this.state = Te; var He = Y.getParameter(Y.MAX_TEXTURE_IMAGE_UNITS), xe = Y.getParameter(Y.MAX_VERTEX_TEXTURE_IMAGE_UNITS), be = Y.getParameter(Y.MAX_TEXTURE_SIZE), we = Y.getParameter(Y.MAX_CUBE_MAP_TEXTURE_SIZE), _e = xe > 0, Me = _e && ge.get("OES_texture_float"), Se = Y.getShaderPrecisionFormat(Y.VERTEX_SHADER, Y.HIGH_FLOAT), Ce = Y.getShaderPrecisionFormat(Y.VERTEX_SHADER, Y.MEDIUM_FLOAT), Ae = Y.getShaderPrecisionFormat(Y.FRAGMENT_SHADER, Y.HIGH_FLOAT), Le = Y.getShaderPrecisionFormat(Y.FRAGMENT_SHADER, Y.MEDIUM_FLOAT), Pe = function() { var e; return function() { if (void 0 !== e) return e; if (e = [], ge.get("WEBGL_compressed_texture_pvrtc") || ge.get("WEBGL_compressed_texture_s3tc")) for (var t = Y.getParameter(Y.COMPRESSED_TEXTURE_FORMATS), r = 0; r < t.length; r++) e.push(t[r]); return e } }(), Fe = 0 < Se.precision && 0 < Ae.precision, Be = 0 < Ce.precision && 0 < Le.precision; "highp" !== L || Fe || (Be ? (L = "mediump", THREE.warn("THREE.WebGLRenderer: highp not supported, using mediump.")) : (L = "lowp", THREE.warn("THREE.WebGLRenderer: highp and mediump not supported, using lowp."))), "mediump" !== L || Be || (L = "lowp", THREE.warn("THREE.WebGLRenderer: mediump not supported, using lowp.")); var Ue = new THREE.ShadowMapPlugin(this, O, G, I), De = new THREE.SpritePlugin(this, X), Ve = new THREE.LensFlarePlugin(this, q); this.getContext = function() { return Y }, this.forceContextLoss = function() { ge.get("WEBGL_lose_context").loseContext() }, this.supportsVertexTextures = function() { return _e }, this.supportsFloatTextures = function() { return ge.get("OES_texture_float") }, this.supportsHalfFloatTextures = function() { return ge.get("OES_texture_half_float") }, this.supportsStandardDerivatives = function() { return ge.get("OES_standard_derivatives") }, this.supportsCompressedTextureS3TC = function() { return ge.get("WEBGL_compressed_texture_s3tc") }, this.supportsCompressedTexturePVRTC = function() { return ge.get("WEBGL_compressed_texture_pvrtc") }, this.supportsBlendMinMax = function() { return ge.get("EXT_blend_minmax") }, this.getMaxAnisotropy = function() { var e; return function() { if (void 0 !== e) return e; var t = ge.get("EXT_texture_filter_anisotropic"); return e = null !== t ? Y.getParameter(t.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0 } }(), this.getPrecision = function() { return L }, this.getPixelRatio = function() { return A }, this.setPixelRatio = function(e) { A = e }, this.setSize = function(e, t, r) { S.width = e * A, S.height = t * A, !1 !== r && (S.style.width = e + "px", S.style.height = t + "px"), this.setViewport(0, 0, e, t) }, this.setViewport = function(e, t, r, i) { ie = e * A, ne = t * A, oe = r * A, ae = i * A, Y.viewport(ie, ne, oe, ae) }, this.setScissor = function(e, t, r, i) { Y.scissor(e * A, t * A, r * A, i * A) }, this.enableScissorTest = function(e) { e ? Y.enable(Y.SCISSOR_TEST) : Y.disable(Y.SCISSOR_TEST) }, this.getClearColor = function() { return k }, this.setClearColor = function(e, t) { k.set(e), N = void 0 !== t ? t : 1, Re(k.r, k.g, k.b, N) }, this.getClearAlpha = function() { return N }, this.setClearAlpha = function(e) { N = e, Re(k.r, k.g, k.b, N) }, this.clear = function(e, t, r) { var i = 0; (void 0 === e || e) && (i |= Y.COLOR_BUFFER_BIT), (void 0 === t || t) && (i |= Y.DEPTH_BUFFER_BIT), (void 0 === r || r) && (i |= Y.STENCIL_BUFFER_BIT), Y.clear(i) }, this.clearColor = function() { Y.clear(Y.COLOR_BUFFER_BIT) }, this.clearDepth = function() { Y.clear(Y.DEPTH_BUFFER_BIT) }, this.clearStencil = function() { Y.clear(Y.STENCIL_BUFFER_BIT) }, this.clearTarget = function(e, t, r, i) { this.setRenderTarget(e), this.clear(t, r, i) }, this.resetGLState = ve; var ze = function(e) { e.target.traverse(function(e) { if (e.removeEventListener("remove", ze), e instanceof THREE.Mesh || e instanceof THREE.PointCloud || e instanceof THREE.Line) delete G[e.id]; else if (e instanceof THREE.ImmediateRenderObject || e.immediateRenderCallback) for (var t = I, r = t.length - 1; r >= 0; r--) t[r].object === e && t.splice(r, 1); delete e.__webglInit, delete e._modelViewMatrix, delete e._normalMatrix, delete e.__webglActive }) }, ke = function(e) { if (e = e.target, e.removeEventListener("dispose", ke), delete e.__webglInit, e instanceof THREE.BufferGeometry) { for (var t in e.attributes) { var r = e.attributes[t]; void 0 !== r.buffer && (Y.deleteBuffer(r.buffer), delete r.buffer) } K.info.memory.geometries-- } else if (t = je[e.id], void 0 !== t) { for (var r = 0, i = t.length; i > r; r++) { var n = t[r]; if (void 0 !== n.numMorphTargets) { for (var o = 0, a = n.numMorphTargets; a > o; o++) Y.deleteBuffer(n.__webglMorphTargetsBuffers[o]); delete n.__webglMorphTargetsBuffers } if (void 0 !== n.numMorphNormals) { for (o = 0, a = n.numMorphNormals; a > o; o++) Y.deleteBuffer(n.__webglMorphNormalsBuffers[o]); delete n.__webglMorphNormalsBuffers } Ie(n) } delete je[e.id] } else Ie(e); ee = "" }, Ne = function(e) { e = e.target, e.removeEventListener("dispose", Ne), e.image && e.image.__webglTextureCube ? (Y.deleteTexture(e.image.__webglTextureCube), delete e.image.__webglTextureCube) : void 0 !== e.__webglInit && (Y.deleteTexture(e.__webglTexture), delete e.__webglTexture, delete e.__webglInit), K.info.memory.textures-- }, Oe = function(e) { if (e = e.target, e.removeEventListener("dispose", Oe), e && void 0 !== e.__webglTexture) { if (Y.deleteTexture(e.__webglTexture), delete e.__webglTexture, e instanceof THREE.WebGLRenderTargetCube) for (var t = 0; 6 > t; t++) Y.deleteFramebuffer(e.__webglFramebuffer[t]), Y.deleteRenderbuffer(e.__webglRenderbuffer[t]); else Y.deleteFramebuffer(e.__webglFramebuffer), Y.deleteRenderbuffer(e.__webglRenderbuffer); delete e.__webglFramebuffer, delete e.__webglRenderbuffer } K.info.memory.textures-- }, Ge = function(e) { e = e.target, e.removeEventListener("dispose", Ge), We(e) }, Ie = function(e) { for (var t = "__webglVertexBuffer __webglNormalBuffer __webglTangentBuffer __webglColorBuffer __webglUVBuffer __webglUV2Buffer __webglSkinIndicesBuffer __webglSkinWeightsBuffer __webglFaceBuffer __webglLineBuffer __webglLineDistanceBuffer".split(" "), r = 0, i = t.length; i > r; r++) { var n = t[r]; void 0 !== e[n] && (Y.deleteBuffer(e[n]), delete e[n]) } if (void 0 !== e.__webglCustomAttributesList) { for (n in e.__webglCustomAttributesList) Y.deleteBuffer(e.__webglCustomAttributesList[n].buffer); delete e.__webglCustomAttributesList } K.info.memory.geometries-- }, We = function(e) { var t = e.program.program; if (void 0 !== t) { e.program = void 0; var r, i, n = !1; for (e = 0, r = Q.length; r > e; e++) if (i = Q[e], i.program === t) { i.usedTimes--, 0 === i.usedTimes && (n = !0); break } if (!0 === n) { for (n = [], e = 0, r = Q.length; r > e; e++) i = Q[e], i.program !== t && n.push(i); Q = n, Y.deleteProgram(t), K.info.memory.programs-- } } }; this.renderBufferImmediate = function(e, t, r) { if (Te.initAttributes(), e.hasPositions && !e.__webglVertexBuffer && (e.__webglVertexBuffer = Y.createBuffer()), e.hasNormals && !e.__webglNormalBuffer && (e.__webglNormalBuffer = Y.createBuffer()), e.hasUvs && !e.__webglUvBuffer && (e.__webglUvBuffer = Y.createBuffer()), e.hasColors && !e.__webglColorBuffer && (e.__webglColorBuffer = Y.createBuffer()), e.hasPositions && (Y.bindBuffer(Y.ARRAY_BUFFER, e.__webglVertexBuffer), Y.bufferData(Y.ARRAY_BUFFER, e.positionArray, Y.DYNAMIC_DRAW), Te.enableAttribute(t.attributes.position), Y.vertexAttribPointer(t.attributes.position, 3, Y.FLOAT, !1, 0, 0)), e.hasNormals) { if (Y.bindBuffer(Y.ARRAY_BUFFER, e.__webglNormalBuffer), !1 == r instanceof THREE.MeshPhongMaterial && r.shading === THREE.FlatShading) { var i, n, o, a, s, h, l, c, u, E, p, d = 3 * e.count; for (p = 0; d > p; p += 9) E = e.normalArray, i = E[p], n = E[p + 1], o = E[p + 2], a = E[p + 3], h = E[p + 4], c = E[p + 5], s = E[p + 6], l = E[p + 7], u = E[p + 8], i = (i + a + s) / 3, n = (n + h + l) / 3, o = (o + c + u) / 3, E[p] = i, E[p + 1] = n, E[p + 2] = o, E[p + 3] = i, E[p + 4] = n, E[p + 5] = o, E[p + 6] = i, E[p + 7] = n, E[p + 8] = o } Y.bufferData(Y.ARRAY_BUFFER, e.normalArray, Y.DYNAMIC_DRAW), Te.enableAttribute(t.attributes.normal), Y.vertexAttribPointer(t.attributes.normal, 3, Y.FLOAT, !1, 0, 0) } e.hasUvs && r.map && (Y.bindBuffer(Y.ARRAY_BUFFER, e.__webglUvBuffer), Y.bufferData(Y.ARRAY_BUFFER, e.uvArray, Y.DYNAMIC_DRAW), Te.enableAttribute(t.attributes.uv), Y.vertexAttribPointer(t.attributes.uv, 2, Y.FLOAT, !1, 0, 0)), e.hasColors && r.vertexColors !== THREE.NoColors && (Y.bindBuffer(Y.ARRAY_BUFFER, e.__webglColorBuffer), Y.bufferData(Y.ARRAY_BUFFER, e.colorArray, Y.DYNAMIC_DRAW), Te.enableAttribute(t.attributes.color), Y.vertexAttribPointer(t.attributes.color, 3, Y.FLOAT, !1, 0, 0)), Te.disableUnusedAttributes(), Y.drawArrays(Y.TRIANGLES, 0, e.count), e.count = 0 }, this.renderBufferDirect = function(e, t, r, n, o, a) { if (!1 !== n.visible) if (p(a), e = T(e, t, r, n, a), t = !1, r = "direct_" + o.id + "_" + e.id + "_" + (n.wireframe ? 1 : 0), r !== ee && (ee = r, t = !0), t && Te.initAttributes(), a instanceof THREE.Mesh) { a = !0 === n.wireframe ? Y.LINES : Y.TRIANGLES; var s = o.attributes.index; if (s) { var h, l; if (s.array instanceof Uint32Array && ge.get("OES_element_index_uint") ? (h = Y.UNSIGNED_INT, l = 4) : (h = Y.UNSIGNED_SHORT, l = 2), r = o.offsets, 0 === r.length) t && (i(n, e, o, 0), Y.bindBuffer(Y.ELEMENT_ARRAY_BUFFER, s.buffer)), Y.drawElements(a, s.array.length, h, 0), K.info.render.calls++, K.info.render.vertices += s.array.length, K.info.render.faces += s.array.length / 3; else { t = !0; for (var c = 0, u = r.length; u > c; c++) { var E = r[c].index; t && (i(n, e, o, E), Y.bindBuffer(Y.ELEMENT_ARRAY_BUFFER, s.buffer)), Y.drawElements(a, r[c].count, h, r[c].start * l), K.info.render.calls++, K.info.render.vertices += r[c].count, K.info.render.faces += r[c].count / 3 } } } else t && i(n, e, o, 0), n = o.attributes.position, Y.drawArrays(a, 0, n.array.length / n.itemSize), K.info.render.calls++, K.info.render.vertices += n.array.length / n.itemSize, K.info.render.faces += n.array.length / (3 * n.itemSize) } else if (a instanceof THREE.PointCloud) if (a = Y.POINTS, s = o.attributes.index) if (s.array instanceof Uint32Array && ge.get("OES_element_index_uint") ? (h = Y.UNSIGNED_INT, l = 4) : (h = Y.UNSIGNED_SHORT, l = 2), r = o.offsets, 0 === r.length) t && (i(n, e, o, 0), Y.bindBuffer(Y.ELEMENT_ARRAY_BUFFER, s.buffer)), Y.drawElements(a, s.array.length, h, 0), K.info.render.calls++, K.info.render.points += s.array.length; else for (1 < r.length && (t = !0), c = 0, u = r.length; u > c; c++) E = r[c].index, t && (i(n, e, o, E), Y.bindBuffer(Y.ELEMENT_ARRAY_BUFFER, s.buffer)), Y.drawElements(a, r[c].count, h, r[c].start * l), K.info.render.calls++, K.info.render.points += r[c].count; else if (t && i(n, e, o, 0), n = o.attributes.position, r = o.offsets, 0 === r.length) Y.drawArrays(a, 0, n.array.length / 3), K.info.render.calls++, K.info.render.points += n.array.length / 3; else for (c = 0, u = r.length; u > c; c++) Y.drawArrays(a, r[c].index, r[c].count), K.info.render.calls++, K.info.render.points += r[c].count; else if (a instanceof THREE.Line) if (a = a.mode === THREE.LineStrip ? Y.LINE_STRIP : Y.LINES, Te.setLineWidth(n.linewidth * A), s = o.attributes.index) if (s.array instanceof Uint32Array ? (h = Y.UNSIGNED_INT, l = 4) : (h = Y.UNSIGNED_SHORT, l = 2), r = o.offsets, 0 === r.length) t && (i(n, e, o, 0), Y.bindBuffer(Y.ELEMENT_ARRAY_BUFFER, s.buffer)), Y.drawElements(a, s.array.length, h, 0), K.info.render.calls++, K.info.render.vertices += s.array.length; else for (1 < r.length && (t = !0), c = 0, u = r.length; u > c; c++) E = r[c].index, t && (i(n, e, o, E), Y.bindBuffer(Y.ELEMENT_ARRAY_BUFFER, s.buffer)), Y.drawElements(a, r[c].count, h, r[c].start * l), K.info.render.calls++, K.info.render.vertices += r[c].count; else if (t && i(n, e, o, 0), n = o.attributes.position, r = o.offsets, 0 === r.length) Y.drawArrays(a, 0, n.array.length / 3), K.info.render.calls++, K.info.render.vertices += n.array.length / 3; else for (c = 0, u = r.length; u > c; c++) Y.drawArrays(a, r[c].index, r[c].count), K.info.render.calls++, K.info.render.vertices += r[c].count }, this.renderBuffer = function(e, t, r, i, n, o) { if (!1 !== i.visible) { if (p(o), r = T(e, t, r, i, o), t = r.attributes, e = !1, r = n.id + "_" + r.id + "_" + (i.wireframe ? 1 : 0), r !== ee && (ee = r, e = !0), e && Te.initAttributes(), !i.morphTargets && 0 <= t.position) e && (Y.bindBuffer(Y.ARRAY_BUFFER, n.__webglVertexBuffer), Te.enableAttribute(t.position), Y.vertexAttribPointer(t.position, 3, Y.FLOAT, !1, 0, 0)); else if (o.morphTargetBase) { if (r = i.program.attributes, -1 !== o.morphTargetBase && 0 <= r.position ? (Y.bindBuffer(Y.ARRAY_BUFFER, n.__webglMorphTargetsBuffers[o.morphTargetBase]), Te.enableAttribute(r.position), Y.vertexAttribPointer(r.position, 3, Y.FLOAT, !1, 0, 0)) : 0 <= r.position && (Y.bindBuffer(Y.ARRAY_BUFFER, n.__webglVertexBuffer), Te.enableAttribute(r.position), Y.vertexAttribPointer(r.position, 3, Y.FLOAT, !1, 0, 0)), o.morphTargetForcedOrder.length) for (var s, h = 0, l = o.morphTargetForcedOrder, c = o.morphTargetInfluences; h < i.numSupportedMorphTargets && h < l.length;) s = r["morphTarget" + h], s >= 0 && (Y.bindBuffer(Y.ARRAY_BUFFER, n.__webglMorphTargetsBuffers[l[h]]), Te.enableAttribute(s), Y.vertexAttribPointer(s, 3, Y.FLOAT, !1, 0, 0)), s = r["morphNormal" + h], s >= 0 && i.morphNormals && (Y.bindBuffer(Y.ARRAY_BUFFER, n.__webglMorphNormalsBuffers[l[h]]), Te.enableAttribute(s), Y.vertexAttribPointer(s, 3, Y.FLOAT, !1, 0, 0)), o.__webglMorphTargetInfluences[h] = c[l[h]], h++; else { for (l = [], c = o.morphTargetInfluences, h = o.geometry.morphTargets, c.length > h.length && (console.warn("THREE.WebGLRenderer: Influences array is bigger than morphTargets array."), c.length = h.length), h = 0, s = c.length; s > h; h++) l.push([c[h], h]); l.length > i.numSupportedMorphTargets ? (l.sort(a), l.length = i.numSupportedMorphTargets) : l.length > i.numSupportedMorphNormals ? l.sort(a) : 0 === l.length && l.push([0, 0]); for (var h = 0, u = i.numSupportedMorphTargets; u > h; h++) if (l[h]) { var E = l[h][1]; s = r["morphTarget" + h], s >= 0 && (Y.bindBuffer(Y.ARRAY_BUFFER, n.__webglMorphTargetsBuffers[E]), Te.enableAttribute(s), Y.vertexAttribPointer(s, 3, Y.FLOAT, !1, 0, 0)), s = r["morphNormal" + h], s >= 0 && i.morphNormals && (Y.bindBuffer(Y.ARRAY_BUFFER, n.__webglMorphNormalsBuffers[E]), Te.enableAttribute(s), Y.vertexAttribPointer(s, 3, Y.FLOAT, !1, 0, 0)), o.__webglMorphTargetInfluences[h] = c[E] } else o.__webglMorphTargetInfluences[h] = 0 } null !== i.program.uniforms.morphTargetInfluences && Y.uniform1fv(i.program.uniforms.morphTargetInfluences, o.__webglMorphTargetInfluences) } if (e) { if (n.__webglCustomAttributesList) for (r = 0, c = n.__webglCustomAttributesList.length; c > r; r++) l = n.__webglCustomAttributesList[r], 0 <= t[l.buffer.belongsToAttribute] && (Y.bindBuffer(Y.ARRAY_BUFFER, l.buffer), Te.enableAttribute(t[l.buffer.belongsToAttribute]), Y.vertexAttribPointer(t[l.buffer.belongsToAttribute], l.size, Y.FLOAT, !1, 0, 0)); 0 <= t.color && (0 < o.geometry.colors.length || 0 < o.geometry.faces.length ? (Y.bindBuffer(Y.ARRAY_BUFFER, n.__webglColorBuffer), Te.enableAttribute(t.color), Y.vertexAttribPointer(t.color, 3, Y.FLOAT, !1, 0, 0)) : void 0 !== i.defaultAttributeValues && Y.vertexAttrib3fv(t.color, i.defaultAttributeValues.color)), 0 <= t.normal && (Y.bindBuffer(Y.ARRAY_BUFFER, n.__webglNormalBuffer), Te.enableAttribute(t.normal), Y.vertexAttribPointer(t.normal, 3, Y.FLOAT, !1, 0, 0)), 0 <= t.tangent && (Y.bindBuffer(Y.ARRAY_BUFFER, n.__webglTangentBuffer), Te.enableAttribute(t.tangent), Y.vertexAttribPointer(t.tangent, 4, Y.FLOAT, !1, 0, 0)), 0 <= t.uv && (o.geometry.faceVertexUvs[0] ? (Y.bindBuffer(Y.ARRAY_BUFFER, n.__webglUVBuffer), Te.enableAttribute(t.uv), Y.vertexAttribPointer(t.uv, 2, Y.FLOAT, !1, 0, 0)) : void 0 !== i.defaultAttributeValues && Y.vertexAttrib2fv(t.uv, i.defaultAttributeValues.uv)), 0 <= t.uv2 && (o.geometry.faceVertexUvs[1] ? (Y.bindBuffer(Y.ARRAY_BUFFER, n.__webglUV2Buffer), Te.enableAttribute(t.uv2), Y.vertexAttribPointer(t.uv2, 2, Y.FLOAT, !1, 0, 0)) : void 0 !== i.defaultAttributeValues && Y.vertexAttrib2fv(t.uv2, i.defaultAttributeValues.uv2)), i.skinning && 0 <= t.skinIndex && 0 <= t.skinWeight && (Y.bindBuffer(Y.ARRAY_BUFFER, n.__webglSkinIndicesBuffer), Te.enableAttribute(t.skinIndex), Y.vertexAttribPointer(t.skinIndex, 4, Y.FLOAT, !1, 0, 0), Y.bindBuffer(Y.ARRAY_BUFFER, n.__webglSkinWeightsBuffer), Te.enableAttribute(t.skinWeight), Y.vertexAttribPointer(t.skinWeight, 4, Y.FLOAT, !1, 0, 0)), 0 <= t.lineDistance && (Y.bindBuffer(Y.ARRAY_BUFFER, n.__webglLineDistanceBuffer), Te.enableAttribute(t.lineDistance), Y.vertexAttribPointer(t.lineDistance, 1, Y.FLOAT, !1, 0, 0)) } Te.disableUnusedAttributes(), o instanceof THREE.Mesh ? (o = n.__typeArray === Uint32Array ? Y.UNSIGNED_INT : Y.UNSIGNED_SHORT, i.wireframe ? (Te.setLineWidth(i.wireframeLinewidth * A), e && Y.bindBuffer(Y.ELEMENT_ARRAY_BUFFER, n.__webglLineBuffer), Y.drawElements(Y.LINES, n.__webglLineCount, o, 0)) : (e && Y.bindBuffer(Y.ELEMENT_ARRAY_BUFFER, n.__webglFaceBuffer), Y.drawElements(Y.TRIANGLES, n.__webglFaceCount, o, 0)), K.info.render.calls++, K.info.render.vertices += n.__webglFaceCount, K.info.render.faces += n.__webglFaceCount / 3) : o instanceof THREE.Line ? (o = o.mode === THREE.LineStrip ? Y.LINE_STRIP : Y.LINES, Te.setLineWidth(i.linewidth * A), Y.drawArrays(o, 0, n.__webglLineCount), K.info.render.calls++) : o instanceof THREE.PointCloud && (Y.drawArrays(Y.POINTS, 0, n.__webglParticleCount), K.info.render.calls++, K.info.render.points += n.__webglParticleCount) } }, this.render = function(e, t, r, i) { if (!1 == t instanceof THREE.Camera) THREE.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera."); else { var a = e.fog; ee = "", $ = -1, te = null, pe = !0, !0 === e.autoUpdate && e.updateMatrixWorld(), void 0 === t.parent && t.updateMatrixWorld(), e.traverse(function(e) { e instanceof THREE.SkinnedMesh && e.skeleton.update() }), t.matrixWorldInverse.getInverse(t.matrixWorld), ce.multiplyMatrices(t.projectionMatrix, t.matrixWorldInverse), le.setFromMatrix(ce), O.length = 0, W.length = 0, j.length = 0, X.length = 0, q.length = 0, s(e), !0 === K.sortObjects && (W.sort(n), j.sort(o)), Ue.render(e, t), K.info.render.calls = 0, K.info.render.vertices = 0, K.info.render.faces = 0, K.info.render.points = 0, this.setRenderTarget(r), (this.autoClear || i) && this.clear(this.autoClearColor, this.autoClearDepth, this.autoClearStencil), i = 0; for (var u = I.length; u > i; i++) { var E = I[i], p = E.object; p.visible && (y(p, t), c(E)) } e.overrideMaterial ? (i = e.overrideMaterial, m(i), h(W, t, O, a, i), h(j, t, O, a, i), l(I, "", t, O, a, i)) : (Te.setBlending(THREE.NoBlending), h(W, t, O, a, null), l(I, "opaque", t, O, a, null), h(j, t, O, a, null), l(I, "transparent", t, O, a, null)), De.render(e, t), Ve.render(e, t, se, he), r && r.generateMipmaps && r.minFilter !== THREE.NearestFilter && r.minFilter !== THREE.LinearFilter && w(r), Te.setDepthTest(!0), Te.setDepthWrite(!0), Te.setColorWrite(!0) } }, this.renderImmediateObject = function(e, t, r, i, n) { var o = T(e, t, r, i, n); ee = "", K.setMaterialFaces(i), n.immediateRenderCallback ? n.immediateRenderCallback(o, Y, le) : n.render(function(e) { K.renderBufferImmediate(e, o, i) }) }; var je = {}, Xe = 0, qe = { MeshDepthMaterial: "depth", MeshNormalMaterial: "normal", MeshBasicMaterial: "basic", MeshLambertMaterial: "lambert", MeshPhongMaterial: "phong", LineBasicMaterial: "basic", LineDashedMaterial: "dashed", PointCloudMaterial: "particle_basic" }; this.setFaceCulling = function(e, t) { e === THREE.CullFaceNone ? Y.disable(Y.CULL_FACE) : (t === THREE.FrontFaceDirectionCW ? Y.frontFace(Y.CW) : Y.frontFace(Y.CCW), e === THREE.CullFaceBack ? Y.cullFace(Y.BACK) : e === THREE.CullFaceFront ? Y.cullFace(Y.FRONT) : Y.cullFace(Y.FRONT_AND_BACK), Y.enable(Y.CULL_FACE)) }, this.setMaterialFaces = function(e) { Te.setDoubleSided(e.side === THREE.DoubleSide), Te.setFlipSided(e.side === THREE.BackSide) }, this.uploadTexture = function(e) { void 0 === e.__webglInit && (e.__webglInit = !0, e.addEventListener("dispose", Ne), e.__webglTexture = Y.createTexture(), K.info.memory.textures++), Y.bindTexture(Y.TEXTURE_2D, e.__webglTexture), Y.pixelStorei(Y.UNPACK_FLIP_Y_WEBGL, e.flipY), Y.pixelStorei(Y.UNPACK_PREMULTIPLY_ALPHA_WEBGL, e.premultiplyAlpha), Y.pixelStorei(Y.UNPACK_ALIGNMENT, e.unpackAlignment), e.image = x(e.image, be); var t = e.image, r = THREE.Math.isPowerOfTwo(t.width) && THREE.Math.isPowerOfTwo(t.height), i = M(e.format), n = M(e.type); H(Y.TEXTURE_2D, e, r); var o = e.mipmaps; if (e instanceof THREE.DataTexture) if (0 < o.length && r) { for (var a = 0, s = o.length; s > a; a++) t = o[a], Y.texImage2D(Y.TEXTURE_2D, a, i, t.width, t.height, 0, i, n, t.data); e.generateMipmaps = !1 } else Y.texImage2D(Y.TEXTURE_2D, 0, i, t.width, t.height, 0, i, n, t.data); else if (e instanceof THREE.CompressedTexture) for (a = 0, s = o.length; s > a; a++) t = o[a], e.format !== THREE.RGBAFormat && e.format !== THREE.RGBFormat ? -1 < Pe().indexOf(i) ? Y.compressedTexImage2D(Y.TEXTURE_2D, a, i, t.width, t.height, 0, t.data) : THREE.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()") : Y.texImage2D(Y.TEXTURE_2D, a, i, t.width, t.height, 0, i, n, t.data); else if (0 < o.length && r) { for (a = 0, s = o.length; s > a; a++) t = o[a], Y.texImage2D(Y.TEXTURE_2D, a, i, i, n, t); e.generateMipmaps = !1 } else Y.texImage2D(Y.TEXTURE_2D, 0, i, i, n, e.image); e.generateMipmaps && r && Y.generateMipmap(Y.TEXTURE_2D), e.needsUpdate = !1, e.onUpdate && e.onUpdate() }, this.setTexture = function(e, t) { Y.activeTexture(Y.TEXTURE0 + t), e.needsUpdate ? K.uploadTexture(e) : Y.bindTexture(Y.TEXTURE_2D, e.__webglTexture) }, this.setRenderTarget = function(e) { var t = e instanceof THREE.WebGLRenderTargetCube; if (e && void 0 === e.__webglFramebuffer) { void 0 === e.depthBuffer && (e.depthBuffer = !0), void 0 === e.stencilBuffer && (e.stencilBuffer = !0), e.addEventListener("dispose", Oe), e.__webglTexture = Y.createTexture(), K.info.memory.textures++; var r = THREE.Math.isPowerOfTwo(e.width) && THREE.Math.isPowerOfTwo(e.height), i = M(e.format), n = M(e.type); if (t) { e.__webglFramebuffer = [], e.__webglRenderbuffer = [], Y.bindTexture(Y.TEXTURE_CUBE_MAP, e.__webglTexture), H(Y.TEXTURE_CUBE_MAP, e, r); for (var o = 0; 6 > o; o++) { e.__webglFramebuffer[o] = Y.createFramebuffer(), e.__webglRenderbuffer[o] = Y.createRenderbuffer(), Y.texImage2D(Y.TEXTURE_CUBE_MAP_POSITIVE_X + o, 0, i, e.width, e.height, 0, i, n, null); var a = e, s = Y.TEXTURE_CUBE_MAP_POSITIVE_X + o; Y.bindFramebuffer(Y.FRAMEBUFFER, e.__webglFramebuffer[o]), Y.framebufferTexture2D(Y.FRAMEBUFFER, Y.COLOR_ATTACHMENT0, s, a.__webglTexture, 0), b(e.__webglRenderbuffer[o], e) } r && Y.generateMipmap(Y.TEXTURE_CUBE_MAP) } else e.__webglFramebuffer = Y.createFramebuffer(), e.__webglRenderbuffer = e.shareDepthFrom ? e.shareDepthFrom.__webglRenderbuffer : Y.createRenderbuffer(), Y.bindTexture(Y.TEXTURE_2D, e.__webglTexture), H(Y.TEXTURE_2D, e, r), Y.texImage2D(Y.TEXTURE_2D, 0, i, e.width, e.height, 0, i, n, null), i = Y.TEXTURE_2D, Y.bindFramebuffer(Y.FRAMEBUFFER, e.__webglFramebuffer), Y.framebufferTexture2D(Y.FRAMEBUFFER, Y.COLOR_ATTACHMENT0, i, e.__webglTexture, 0), e.shareDepthFrom ? e.depthBuffer && !e.stencilBuffer ? Y.framebufferRenderbuffer(Y.FRAMEBUFFER, Y.DEPTH_ATTACHMENT, Y.RENDERBUFFER, e.__webglRenderbuffer) : e.depthBuffer && e.stencilBuffer && Y.framebufferRenderbuffer(Y.FRAMEBUFFER, Y.DEPTH_STENCIL_ATTACHMENT, Y.RENDERBUFFER, e.__webglRenderbuffer) : b(e.__webglRenderbuffer, e), r && Y.generateMipmap(Y.TEXTURE_2D); t ? Y.bindTexture(Y.TEXTURE_CUBE_MAP, null) : Y.bindTexture(Y.TEXTURE_2D, null), Y.bindRenderbuffer(Y.RENDERBUFFER, null), Y.bindFramebuffer(Y.FRAMEBUFFER, null) } e ? (t = t ? e.__webglFramebuffer[e.activeCubeFace] : e.__webglFramebuffer, r = e.width, e = e.height, n = i = 0) : (t = null, r = oe, e = ae, i = ie, n = ne), t !== J && (Y.bindFramebuffer(Y.FRAMEBUFFER, t), Y.viewport(i, n, r, e), J = t), se = r, he = e }, this.readRenderTargetPixels = function(e, t, r, i, n, o) { if (e instanceof THREE.WebGLRenderTarget) { if (e.__webglFramebuffer) if (e.format !== THREE.RGBAFormat) console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA format. readPixels can read only RGBA format."); else { var a = !1; e.__webglFramebuffer !== J && (Y.bindFramebuffer(Y.FRAMEBUFFER, e.__webglFramebuffer), a = !0), Y.checkFramebufferStatus(Y.FRAMEBUFFER) === Y.FRAMEBUFFER_COMPLETE ? Y.readPixels(t, r, i, n, Y.RGBA, Y.UNSIGNED_BYTE, o) : console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."), a && Y.bindFramebuffer(Y.FRAMEBUFFER, J) } } else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.") }, this.initMaterial = function() { THREE.warn("THREE.WebGLRenderer: .initMaterial() has been removed.") }, this.addPrePlugin = function() { THREE.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.") }, this.addPostPlugin = function() { THREE.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.") }, this.updateShadowMap = function() { THREE.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.") } }, THREE.WebGLRenderTarget = function(e, t, r) { this.width = e, this.height = t, r = r || {}, this.wrapS = void 0 !== r.wrapS ? r.wrapS : THREE.ClampToEdgeWrapping, this.wrapT = void 0 !== r.wrapT ? r.wrapT : THREE.ClampToEdgeWrapping, this.magFilter = void 0 !== r.magFilter ? r.magFilter : THREE.LinearFilter, this.minFilter = void 0 !== r.minFilter ? r.minFilter : THREE.LinearMipMapLinearFilter, this.anisotropy = void 0 !== r.anisotropy ? r.anisotropy : 1, this.offset = new THREE.Vector2(0, 0), this.repeat = new THREE.Vector2(1, 1), this.format = void 0 !== r.format ? r.format : THREE.RGBAFormat, this.type = void 0 !== r.type ? r.type : THREE.UnsignedByteType, this.depthBuffer = void 0 !== r.depthBuffer ? r.depthBuffer : !0, this.stencilBuffer = void 0 !== r.stencilBuffer ? r.stencilBuffer : !0, this.generateMipmaps = !0, this.shareDepthFrom = void 0 !== r.shareDepthFrom ? r.shareDepthFrom : null }, THREE.WebGLRenderTarget.prototype = { constructor: THREE.WebGLRenderTarget, setSize: function(e, t) { this.width = e, this.height = t }, clone: function() { var e = new THREE.WebGLRenderTarget(this.width, this.height); return e.wrapS = this.wrapS, e.wrapT = this.wrapT, e.magFilter = this.magFilter, e.minFilter = this.minFilter, e.anisotropy = this.anisotropy, e.offset.copy(this.offset), e.repeat.copy(this.repeat), e.format = this.format, e.type = this.type, e.depthBuffer = this.depthBuffer, e.stencilBuffer = this.stencilBuffer, e.generateMipmaps = this.generateMipmaps, e.shareDepthFrom = this.shareDepthFrom, e }, dispose: function() { this.dispatchEvent({ type: "dispose" }) } }, THREE.EventDispatcher.prototype.apply(THREE.WebGLRenderTarget.prototype), THREE.WebGLRenderTargetCube = function(e, t, r) { THREE.WebGLRenderTarget.call(this, e, t, r), this.activeCubeFace = 0 }, THREE.WebGLRenderTargetCube.prototype = Object.create(THREE.WebGLRenderTarget.prototype), THREE.WebGLRenderTargetCube.prototype.constructor = THREE.WebGLRenderTargetCube, THREE.WebGLExtensions = function(e) { var t = {}; this.get = function(r) { if (void 0 !== t[r]) return t[r]; var i; switch (r) { case "EXT_texture_filter_anisotropic": i = e.getExtension("EXT_texture_filter_anisotropic") || e.getExtension("MOZ_EXT_texture_filter_anisotropic") || e.getExtension("WEBKIT_EXT_texture_filter_anisotropic"); break; case "WEBGL_compressed_texture_s3tc": i = e.getExtension("WEBGL_compressed_texture_s3tc") || e.getExtension("MOZ_WEBGL_compressed_texture_s3tc") || e.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc"); break; case "WEBGL_compressed_texture_pvrtc": i = e.getExtension("WEBGL_compressed_texture_pvrtc") || e.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"); break; default: i = e.getExtension(r) } return null === i && THREE.warn("THREE.WebGLRenderer: " + r + " extension not supported."), t[r] = i } }, THREE.WebGLProgram = function() { var e = 0; return function(t, r, i, n) { var o = t.context, a = i.defines, s = i.__webglShader.uniforms, h = i.attributes, l = i.__webglShader.vertexShader, c = i.__webglShader.fragmentShader, u = i.index0AttributeName; void 0 === u && !0 === n.morphTargets && (u = "position"); var E = "SHADOWMAP_TYPE_BASIC"; n.shadowMapType === THREE.PCFShadowMap ? E = "SHADOWMAP_TYPE_PCF" : n.shadowMapType === THREE.PCFSoftShadowMap && (E = "SHADOWMAP_TYPE_PCF_SOFT"); var p = "ENVMAP_TYPE_CUBE", d = "ENVMAP_MODE_REFLECTION", f = "ENVMAP_BLENDING_MULTIPLY"; if (n.envMap) { switch (i.envMap.mapping) { case THREE.CubeReflectionMapping: case THREE.CubeRefractionMapping: p = "ENVMAP_TYPE_CUBE"; break; case THREE.EquirectangularReflectionMapping: case THREE.EquirectangularRefractionMapping: p = "ENVMAP_TYPE_EQUIREC"; break; case THREE.SphericalReflectionMapping: p = "ENVMAP_TYPE_SPHERE" } switch (i.envMap.mapping) { case THREE.CubeRefractionMapping: case THREE.EquirectangularRefractionMapping: d = "ENVMAP_MODE_REFRACTION" } switch (i.combine) { case THREE.MultiplyOperation: f = "ENVMAP_BLENDING_MULTIPLY"; break; case THREE.MixOperation: f = "ENVMAP_BLENDING_MIX"; break; case THREE.AddOperation: f = "ENVMAP_BLENDING_ADD" } } var m, T, g = 0 < t.gammaFactor ? t.gammaFactor : 1; m = []; for (var R in a) T = a[R], !1 !== T && (T = "#define " + R + " " + T, m.push(T)); m = m.join("\n"), a = o.createProgram(), i instanceof THREE.RawShaderMaterial ? t = i = "" : (i = ["precision " + n.precision + " float;", "precision " + n.precision + " int;", m, n.supportsVertexTextures ? "#define VERTEX_TEXTURES" : "", t.gammaInput ? "#define GAMMA_INPUT" : "", t.gammaOutput ? "#define GAMMA_OUTPUT" : "", "#define GAMMA_FACTOR " + g, "#define MAX_DIR_LIGHTS " + n.maxDirLights, "#define MAX_POINT_LIGHTS " + n.maxPointLights, "#define MAX_SPOT_LIGHTS " + n.maxSpotLights, "#define MAX_HEMI_LIGHTS " + n.maxHemiLights, "#define MAX_SHADOWS " + n.maxShadows, "#define MAX_BONES " + n.maxBones, n.map ? "#define USE_MAP" : "", n.envMap ? "#define USE_ENVMAP" : "", n.envMap ? "#define " + d : "", n.lightMap ? "#define USE_LIGHTMAP" : "", n.bumpMap ? "#define USE_BUMPMAP" : "", n.normalMap ? "#define USE_NORMALMAP" : "", n.specularMap ? "#define USE_SPECULARMAP" : "", n.alphaMap ? "#define USE_ALPHAMAP" : "", n.vertexColors ? "#define USE_COLOR" : "", n.flatShading ? "#define FLAT_SHADED" : "", n.skinning ? "#define USE_SKINNING" : "", n.useVertexTexture ? "#define BONE_TEXTURE" : "", n.morphTargets ? "#define USE_MORPHTARGETS" : "", n.morphNormals ? "#define USE_MORPHNORMALS" : "", n.wrapAround ? "#define WRAP_AROUND" : "", n.doubleSided ? "#define DOUBLE_SIDED" : "", n.flipSided ? "#define FLIP_SIDED" : "", n.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", n.shadowMapEnabled ? "#define " + E : "", n.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "", n.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "", n.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "", n.logarithmicDepthBuffer ? "#define USE_LOGDEPTHBUF" : "", "uniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\n#ifdef USE_COLOR\n attribute vec3 color;\n#endif\n#ifdef USE_MORPHTARGETS\n attribute vec3 morphTarget0;\n attribute vec3 morphTarget1;\n attribute vec3 morphTarget2;\n attribute vec3 morphTarget3;\n #ifdef USE_MORPHNORMALS\n attribute vec3 morphNormal0;\n attribute vec3 morphNormal1;\n attribute vec3 morphNormal2;\n attribute vec3 morphNormal3;\n #else\n attribute vec3 morphTarget4;\n attribute vec3 morphTarget5;\n attribute vec3 morphTarget6;\n attribute vec3 morphTarget7;\n #endif\n#endif\n#ifdef USE_SKINNING\n attribute vec4 skinIndex;\n attribute vec4 skinWeight;\n#endif\n"].join("\n"), t = ["precision " + n.precision + " float;", "precision " + n.precision + " int;", n.bumpMap || n.normalMap || n.flatShading ? "#extension GL_OES_standard_derivatives : enable" : "", m, "#define MAX_DIR_LIGHTS " + n.maxDirLights, "#define MAX_POINT_LIGHTS " + n.maxPointLights, "#define MAX_SPOT_LIGHTS " + n.maxSpotLights, "#define MAX_HEMI_LIGHTS " + n.maxHemiLights, "#define MAX_SHADOWS " + n.maxShadows, n.alphaTest ? "#define ALPHATEST " + n.alphaTest : "", t.gammaInput ? "#define GAMMA_INPUT" : "", t.gammaOutput ? "#define GAMMA_OUTPUT" : "", "#define GAMMA_FACTOR " + g, n.useFog && n.fog ? "#define USE_FOG" : "", n.useFog && n.fogExp ? "#define FOG_EXP2" : "", n.map ? "#define USE_MAP" : "", n.envMap ? "#define USE_ENVMAP" : "", n.envMap ? "#define " + p : "", n.envMap ? "#define " + d : "", n.envMap ? "#define " + f : "", n.lightMap ? "#define USE_LIGHTMAP" : "", n.bumpMap ? "#define USE_BUMPMAP" : "", n.normalMap ? "#define USE_NORMALMAP" : "", n.specularMap ? "#define USE_SPECULARMAP" : "", n.alphaMap ? "#define USE_ALPHAMAP" : "", n.vertexColors ? "#define USE_COLOR" : "", n.flatShading ? "#define FLAT_SHADED" : "", n.metal ? "#define METAL" : "", n.wrapAround ? "#define WRAP_AROUND" : "", n.doubleSided ? "#define DOUBLE_SIDED" : "", n.flipSided ? "#define FLIP_SIDED" : "", n.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", n.shadowMapEnabled ? "#define " + E : "", n.shadowMapDebug ? "#define SHADOWMAP_DEBUG" : "", n.shadowMapCascade ? "#define SHADOWMAP_CASCADE" : "", n.logarithmicDepthBuffer ? "#define USE_LOGDEPTHBUF" : "", "uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n")), l = new THREE.WebGLShader(o, o.VERTEX_SHADER, i + l), c = new THREE.WebGLShader(o, o.FRAGMENT_SHADER, t + c), o.attachShader(a, l), o.attachShader(a, c), void 0 !== u && o.bindAttribLocation(a, 0, u), o.linkProgram(a), u = o.getProgramInfoLog(a), !1 === o.getProgramParameter(a, o.LINK_STATUS) && THREE.error("THREE.WebGLProgram: shader error: " + o.getError(), "gl.VALIDATE_STATUS", o.getProgramParameter(a, o.VALIDATE_STATUS), "gl.getPRogramInfoLog", u), "" !== u && THREE.warn("THREE.WebGLProgram: gl.getProgramInfoLog()" + u), o.deleteShader(l), o.deleteShader(c), u = "viewMatrix modelViewMatrix projectionMatrix normalMatrix modelMatrix cameraPosition morphTargetInfluences bindMatrix bindMatrixInverse".split(" "), n.useVertexTexture ? (u.push("boneTexture"), u.push("boneTextureWidth"), u.push("boneTextureHeight")) : u.push("boneGlobalMatrices"), n.logarithmicDepthBuffer && u.push("logDepthBufFC"); for (var y in s) u.push(y); for (s = u, y = {}, u = 0, t = s.length; t > u; u++) E = s[u], y[E] = o.getUniformLocation(a, E); for (this.uniforms = y, u = "position normal uv uv2 tangent color skinIndex skinWeight lineDistance".split(" "), s = 0; s < n.maxMorphTargets; s++) u.push("morphTarget" + s); for (s = 0; s < n.maxMorphNormals; s++) u.push("morphNormal" + s); for (var v in h) u.push(v); for (n = u, h = {}, v = 0, s = n.length; s > v; v++) y = n[v], h[y] = o.getAttribLocation(a, y); return this.attributes = h, this.attributesKeys = Object.keys(this.attributes), this.id = e++, this.code = r, this.usedTimes = 1, this.program = a, this.vertexShader = l, this.fragmentShader = c, this } }(), THREE.WebGLShader = function() { var e = function(e) { e = e.split("\n"); for (var t = 0; t < e.length; t++) e[t] = t + 1 + ": " + e[t]; return e.join("\n") }; return function(t, r, i) { return r = t.createShader(r), t.shaderSource(r, i), t.compileShader(r), !1 === t.getShaderParameter(r, t.COMPILE_STATUS) && THREE.error("THREE.WebGLShader: Shader couldn't compile."), "" !== t.getShaderInfoLog(r) && THREE.warn("THREE.WebGLShader: gl.getShaderInfoLog()", t.getShaderInfoLog(r), e(i)), r } }(), THREE.WebGLState = function(e, t) { var r = new Uint8Array(16), i = new Uint8Array(16), n = null, o = null, a = null, s = null, h = null, l = null, c = null, u = null, E = null, p = null, d = null, f = null, m = null, T = null, g = null, R = null; this.initAttributes = function() { for (var e = 0, t = r.length; t > e; e++) r[e] = 0 }, this.enableAttribute = function(t) { r[t] = 1, 0 === i[t] && (e.enableVertexAttribArray(t), i[t] = 1) }, this.disableUnusedAttributes = function() { for (var t = 0, n = i.length; n > t; t++) i[t] !== r[t] && (e.disableVertexAttribArray(t), i[t] = 0) }, this.setBlending = function(r, i, u, E, p, d, f) { r !== n && (r === THREE.NoBlending ? e.disable(e.BLEND) : r === THREE.AdditiveBlending ? (e.enable(e.BLEND), e.blendEquation(e.FUNC_ADD), e.blendFunc(e.SRC_ALPHA, e.ONE)) : r === THREE.SubtractiveBlending ? (e.enable(e.BLEND), e.blendEquation(e.FUNC_ADD), e.blendFunc(e.ZERO, e.ONE_MINUS_SRC_COLOR)) : r === THREE.MultiplyBlending ? (e.enable(e.BLEND), e.blendEquation(e.FUNC_ADD), e.blendFunc(e.ZERO, e.SRC_COLOR)) : r === THREE.CustomBlending ? e.enable(e.BLEND) : (e.enable(e.BLEND), e.blendEquationSeparate(e.FUNC_ADD, e.FUNC_ADD), e.blendFuncSeparate(e.SRC_ALPHA, e.ONE_MINUS_SRC_ALPHA, e.ONE, e.ONE_MINUS_SRC_ALPHA)), n = r), r === THREE.CustomBlending ? (p = p || i, d = d || u, f = f || E, (i !== o || p !== h) && (e.blendEquationSeparate(t(i), t(p)), o = i, h = p), (u !== a || E !== s || d !== l || f !== c) && (e.blendFuncSeparate(t(u), t(E), t(d), t(f)), a = u, s = E, l = d, c = f)) : c = l = h = s = a = o = null }, this.setDepthTest = function(t) { u !== t && (t ? e.enable(e.DEPTH_TEST) : e.disable(e.DEPTH_TEST), u = t) }, this.setDepthWrite = function(t) { E !== t && (e.depthMask(t), E = t) }, this.setColorWrite = function(t) { p !== t && (e.colorMask(t, t, t, t), p = t) }, this.setDoubleSided = function(t) { d !== t && (t ? e.disable(e.CULL_FACE) : e.enable(e.CULL_FACE), d = t) }, this.setFlipSided = function(t) { f !== t && (t ? e.frontFace(e.CW) : e.frontFace(e.CCW), f = t) }, this.setLineWidth = function(t) { t !== m && (e.lineWidth(t), m = t) }, this.setPolygonOffset = function(t, r, i) { T !== t && (t ? e.enable(e.POLYGON_OFFSET_FILL) : e.disable(e.POLYGON_OFFSET_FILL), T = t), !t || g === r && R === i || (e.polygonOffset(r, i), g = r, R = i) }, this.reset = function() { for (var e = 0; e < i.length; e++) i[e] = 0; f = d = p = E = u = n = null } }, THREE.LensFlarePlugin = function(e, t) { var r, i, n, o, a, s, h, l, c, u, E, p, d, f, m, T, g = e.context; this.render = function(R, y, v, H) { if (0 !== t.length) { R = new THREE.Vector3; var x = H / v, b = .5 * v, w = .5 * H, _ = 16 / H, M = new THREE.Vector2(_ * x, _), S = new THREE.Vector3(1, 1, 0), C = new THREE.Vector2(1, 1); if (void 0 === d) { var _ = new Float32Array([-1, -1, 0, 0, 1, -1, 1, 0, 1, 1, 1, 1, -1, 1, 0, 1]), A = new Uint16Array([0, 1, 2, 0, 2, 3]); E = g.createBuffer(), p = g.createBuffer(), g.bindBuffer(g.ARRAY_BUFFER, E), g.bufferData(g.ARRAY_BUFFER, _, g.STATIC_DRAW), g.bindBuffer(g.ELEMENT_ARRAY_BUFFER, p), g.bufferData(g.ELEMENT_ARRAY_BUFFER, A, g.STATIC_DRAW), m = g.createTexture(), T = g.createTexture(), g.bindTexture(g.TEXTURE_2D, m), g.texImage2D(g.TEXTURE_2D, 0, g.RGB, 16, 16, 0, g.RGB, g.UNSIGNED_BYTE, null), g.texParameteri(g.TEXTURE_2D, g.TEXTURE_WRAP_S, g.CLAMP_TO_EDGE), g.texParameteri(g.TEXTURE_2D, g.TEXTURE_WRAP_T, g.CLAMP_TO_EDGE), g.texParameteri(g.TEXTURE_2D, g.TEXTURE_MAG_FILTER, g.NEAREST), g.texParameteri(g.TEXTURE_2D, g.TEXTURE_MIN_FILTER, g.NEAREST), g.bindTexture(g.TEXTURE_2D, T), g.texImage2D(g.TEXTURE_2D, 0, g.RGBA, 16, 16, 0, g.RGBA, g.UNSIGNED_BYTE, null), g.texParameteri(g.TEXTURE_2D, g.TEXTURE_WRAP_S, g.CLAMP_TO_EDGE), g.texParameteri(g.TEXTURE_2D, g.TEXTURE_WRAP_T, g.CLAMP_TO_EDGE), g.texParameteri(g.TEXTURE_2D, g.TEXTURE_MAG_FILTER, g.NEAREST), g.texParameteri(g.TEXTURE_2D, g.TEXTURE_MIN_FILTER, g.NEAREST); var _ = (f = 0 < g.getParameter(g.MAX_VERTEX_TEXTURE_IMAGE_UNITS)) ? { vertexShader: "uniform lowp int renderType;\nuniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nuniform sampler2D occlusionMap;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nvUV = uv;\nvec2 pos = position;\nif( renderType == 2 ) {\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\nvVisibility = visibility.r / 9.0;\nvVisibility *= 1.0 - visibility.g / 9.0;\nvVisibility *= visibility.b / 9.0;\nvVisibility *= 1.0 - visibility.a / 9.0;\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}", fragmentShader: "uniform lowp int renderType;\nuniform sampler2D map;\nuniform float opacity;\nuniform vec3 color;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nif( renderType == 0 ) {\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\n} else if( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nvec4 texture = texture2D( map, vUV );\ntexture.a *= opacity * vVisibility;\ngl_FragColor = texture;\ngl_FragColor.rgb *= color;\n}\n}" } : { vertexShader: "uniform lowp int renderType;\nuniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvoid main() {\nvUV = uv;\nvec2 pos = position;\nif( renderType == 2 ) {\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}", fragmentShader: "precision mediump float;\nuniform lowp int renderType;\nuniform sampler2D map;\nuniform sampler2D occlusionMap;\nuniform float opacity;\nuniform vec3 color;\nvarying vec2 vUV;\nvoid main() {\nif( renderType == 0 ) {\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\n} else if( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a;\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a;\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a;\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;\nvisibility = ( 1.0 - visibility / 4.0 );\nvec4 texture = texture2D( map, vUV );\ntexture.a *= opacity * visibility;\ngl_FragColor = texture;\ngl_FragColor.rgb *= color;\n}\n}" }, A = g.createProgram(), L = g.createShader(g.FRAGMENT_SHADER), P = g.createShader(g.VERTEX_SHADER), F = "precision " + e.getPrecision() + " float;\n"; g.shaderSource(L, F + _.fragmentShader), g.shaderSource(P, F + _.vertexShader), g.compileShader(L), g.compileShader(P), g.attachShader(A, L), g.attachShader(A, P), g.linkProgram(A), d = A, c = g.getAttribLocation(d, "position"), u = g.getAttribLocation(d, "uv"), r = g.getUniformLocation(d, "renderType"), i = g.getUniformLocation(d, "map"), n = g.getUniformLocation(d, "occlusionMap"), o = g.getUniformLocation(d, "opacity"), a = g.getUniformLocation(d, "color"), s = g.getUniformLocation(d, "scale"), h = g.getUniformLocation(d, "rotation"), l = g.getUniformLocation(d, "screenPosition") } for (g.useProgram(d), g.enableVertexAttribArray(c), g.enableVertexAttribArray(u), g.uniform1i(n, 0), g.uniform1i(i, 1), g.bindBuffer(g.ARRAY_BUFFER, E), g.vertexAttribPointer(c, 2, g.FLOAT, !1, 16, 0), g.vertexAttribPointer(u, 2, g.FLOAT, !1, 16, 8), g.bindBuffer(g.ELEMENT_ARRAY_BUFFER, p), g.disable(g.CULL_FACE), g.depthMask(!1), A = 0, L = t.length; L > A; A++) if (_ = 16 / H, M.set(_ * x, _), P = t[A], R.set(P.matrixWorld.elements[12], P.matrixWorld.elements[13], P.matrixWorld.elements[14]), R.applyMatrix4(y.matrixWorldInverse), R.applyProjection(y.projectionMatrix), S.copy(R), C.x = S.x * b + b, C.y = S.y * w + w, f || 0 < C.x && C.x < v && 0 < C.y && C.y < H) { g.activeTexture(g.TEXTURE1), g.bindTexture(g.TEXTURE_2D, m), g.copyTexImage2D(g.TEXTURE_2D, 0, g.RGB, C.x - 8, C.y - 8, 16, 16, 0), g.uniform1i(r, 0), g.uniform2f(s, M.x, M.y), g.uniform3f(l, S.x, S.y, S.z), g.disable(g.BLEND), g.enable(g.DEPTH_TEST), g.drawElements(g.TRIANGLES, 6, g.UNSIGNED_SHORT, 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, T), g.copyTexImage2D(g.TEXTURE_2D, 0, g.RGBA, C.x - 8, C.y - 8, 16, 16, 0), g.uniform1i(r, 1), g.disable(g.DEPTH_TEST), g.activeTexture(g.TEXTURE1), g.bindTexture(g.TEXTURE_2D, m), g.drawElements(g.TRIANGLES, 6, g.UNSIGNED_SHORT, 0), P.positionScreen.copy(S), P.customUpdateCallback ? P.customUpdateCallback(P) : P.updateLensFlares(), g.uniform1i(r, 2), g.enable(g.BLEND); for (var F = 0, B = P.lensFlares.length; B > F; F++) { var U = P.lensFlares[F]; .001 < U.opacity && .001 < U.scale && (S.x = U.x, S.y = U.y, S.z = U.z, _ = U.size * U.scale / H, M.x = _ * x, M.y = _, g.uniform3f(l, S.x, S.y, S.z), g.uniform2f(s, M.x, M.y), g.uniform1f(h, U.rotation), g.uniform1f(o, U.opacity), g.uniform3f(a, U.color.r, U.color.g, U.color.b), e.state.setBlending(U.blending, U.blendEquation, U.blendSrc, U.blendDst), e.setTexture(U.texture, 1), g.drawElements(g.TRIANGLES, 6, g.UNSIGNED_SHORT, 0)) } } g.enable(g.CULL_FACE), g.enable(g.DEPTH_TEST), g.depthMask(!0), e.resetGLState() } } }, THREE.ShadowMapPlugin = function(e, t, r, i) { function n(e, t, i) { if (t.visible) { var o = r[t.id]; if (o && t.castShadow && (!1 === t.frustumCulled || !0 === c.intersectsObject(t))) for (var a = 0, s = o.length; s > a; a++) { var h = o[a]; t._modelViewMatrix.multiplyMatrices(i.matrixWorldInverse, t.matrixWorld), f.push(h) } for (a = 0, s = t.children.length; s > a; a++) n(e, t.children[a], i) } } var o, a, s, h, l = e.context, c = new THREE.Frustum, u = new THREE.Matrix4, E = new THREE.Vector3, p = new THREE.Vector3, d = new THREE.Vector3, f = [], m = THREE.ShaderLib.depthRGBA, T = THREE.UniformsUtils.clone(m.uniforms); o = new THREE.ShaderMaterial({ uniforms: T, vertexShader: m.vertexShader, fragmentShader: m.fragmentShader }), a = new THREE.ShaderMaterial({ uniforms: T, vertexShader: m.vertexShader, fragmentShader: m.fragmentShader, morphTargets: !0 }), s = new THREE.ShaderMaterial({ uniforms: T, vertexShader: m.vertexShader, fragmentShader: m.fragmentShader, skinning: !0 }), h = new THREE.ShaderMaterial({ uniforms: T, vertexShader: m.vertexShader, fragmentShader: m.fragmentShader, morphTargets: !0, skinning: !0 }), o._shadowPass = !0, a._shadowPass = !0, s._shadowPass = !0, h._shadowPass = !0, this.render = function(r, m) { if (!1 !== e.shadowMapEnabled) { var T, g, R, y, v, H, x, b, w = []; for (y = 0, l.clearColor(1, 1, 1, 1), l.disable(l.BLEND), l.enable(l.CULL_FACE), l.frontFace(l.CCW), e.shadowMapCullFace === THREE.CullFaceFront ? l.cullFace(l.FRONT) : l.cullFace(l.BACK), e.state.setDepthTest(!0), T = 0, g = t.length; g > T; T++) if (R = t[T], R.castShadow) if (R instanceof THREE.DirectionalLight && R.shadowCascade) for (v = 0; v < R.shadowCascadeCount; v++) { var _; if (R.shadowCascadeArray[v]) _ = R.shadowCascadeArray[v]; else { x = R; var M = v; _ = new THREE.DirectionalLight, _.isVirtual = !0, _.onlyShadow = !0, _.castShadow = !0, _.shadowCameraNear = x.shadowCameraNear, _.shadowCameraFar = x.shadowCameraFar, _.shadowCameraLeft = x.shadowCameraLeft, _.shadowCameraRight = x.shadowCameraRight, _.shadowCameraBottom = x.shadowCameraBottom, _.shadowCameraTop = x.shadowCameraTop, _.shadowCameraVisible = x.shadowCameraVisible, _.shadowDarkness = x.shadowDarkness, _.shadowBias = x.shadowCascadeBias[M], _.shadowMapWidth = x.shadowCascadeWidth[M], _.shadowMapHeight = x.shadowCascadeHeight[M], _.pointsWorld = [], _.pointsFrustum = [], b = _.pointsWorld, H = _.pointsFrustum; for (var S = 0; 8 > S; S++) b[S] = new THREE.Vector3, H[S] = new THREE.Vector3; b = x.shadowCascadeNearZ[M], x = x.shadowCascadeFarZ[M], H[0].set(-1, -1, b), H[1].set(1, -1, b), H[2].set(-1, 1, b), H[3].set(1, 1, b), H[4].set(-1, -1, x), H[5].set(1, -1, x), H[6].set(-1, 1, x), H[7].set(1, 1, x), _.originalCamera = m, H = new THREE.Gyroscope, H.position.copy(R.shadowCascadeOffset), H.add(_), H.add(_.target), m.add(H), R.shadowCascadeArray[v] = _ } M = R, b = v, x = M.shadowCascadeArray[b], x.position.copy(M.position), x.target.position.copy(M.target.position), x.lookAt(x.target), x.shadowCameraVisible = M.shadowCameraVisible, x.shadowDarkness = M.shadowDarkness, x.shadowBias = M.shadowCascadeBias[b], H = M.shadowCascadeNearZ[b], M = M.shadowCascadeFarZ[b], x = x.pointsFrustum, x[0].z = H, x[1].z = H, x[2].z = H, x[3].z = H, x[4].z = M, x[5].z = M, x[6].z = M, x[7].z = M, w[y] = _, y++ } else w[y] = R, y++; for (T = 0, g = w.length; g > T; T++) { if (R = w[T], R.shadowMap || (v = THREE.LinearFilter, e.shadowMapType === THREE.PCFSoftShadowMap && (v = THREE.NearestFilter), R.shadowMap = new THREE.WebGLRenderTarget(R.shadowMapWidth, R.shadowMapHeight, { minFilter: v, magFilter: v, format: THREE.RGBAFormat }), R.shadowMapSize = new THREE.Vector2(R.shadowMapWidth, R.shadowMapHeight), R.shadowMatrix = new THREE.Matrix4), !R.shadowCamera) { if (R instanceof THREE.SpotLight) R.shadowCamera = new THREE.PerspectiveCamera(R.shadowCameraFov, R.shadowMapWidth / R.shadowMapHeight, R.shadowCameraNear, R.shadowCameraFar); else { if (!(R instanceof THREE.DirectionalLight)) { THREE.error("THREE.ShadowMapPlugin: Unsupported light type for shadow", R); continue } R.shadowCamera = new THREE.OrthographicCamera(R.shadowCameraLeft, R.shadowCameraRight, R.shadowCameraTop, R.shadowCameraBottom, R.shadowCameraNear, R.shadowCameraFar) } r.add(R.shadowCamera), !0 === r.autoUpdate && r.updateMatrixWorld() } if (R.shadowCameraVisible && !R.cameraHelper && (R.cameraHelper = new THREE.CameraHelper(R.shadowCamera), r.add(R.cameraHelper)), R.isVirtual && _.originalCamera == m) { for (v = m, y = R.shadowCamera, H = R.pointsFrustum, x = R.pointsWorld, E.set(1 / 0, 1 / 0, 1 / 0), p.set(-(1 / 0), -(1 / 0), -(1 / 0)), M = 0; 8 > M; M++) b = x[M], b.copy(H[M]), b.unproject(v), b.applyMatrix4(y.matrixWorldInverse), b.x < E.x && (E.x = b.x), b.x > p.x && (p.x = b.x), b.y < E.y && (E.y = b.y), b.y > p.y && (p.y = b.y), b.z < E.z && (E.z = b.z), b.z > p.z && (p.z = b.z); y.left = E.x, y.right = p.x, y.top = p.y, y.bottom = E.y, y.updateProjectionMatrix() } for (y = R.shadowMap, H = R.shadowMatrix, v = R.shadowCamera, v.position.setFromMatrixPosition(R.matrixWorld), d.setFromMatrixPosition(R.target.matrixWorld), v.lookAt(d), v.updateMatrixWorld(), v.matrixWorldInverse.getInverse(v.matrixWorld), R.cameraHelper && (R.cameraHelper.visible = R.shadowCameraVisible), R.shadowCameraVisible && R.cameraHelper.update(), H.set(.5, 0, 0, .5, 0, .5, 0, .5, 0, 0, .5, .5, 0, 0, 0, 1), H.multiply(v.projectionMatrix), H.multiply(v.matrixWorldInverse), u.multiplyMatrices(v.projectionMatrix, v.matrixWorldInverse), c.setFromMatrix(u), e.setRenderTarget(y), e.clear(), f.length = 0, n(r, r, v), R = 0, y = f.length; y > R; R++) x = f[R], H = x.object, x = x.buffer, M = H.material instanceof THREE.MeshFaceMaterial ? H.material.materials[0] : H.material, b = void 0 !== H.geometry.morphTargets && 0 < H.geometry.morphTargets.length && M.morphTargets, S = H instanceof THREE.SkinnedMesh && M.skinning, b = H.customDepthMaterial ? H.customDepthMaterial : S ? b ? h : s : b ? a : o, e.setMaterialFaces(M), x instanceof THREE.BufferGeometry ? e.renderBufferDirect(v, t, null, b, x, H) : e.renderBuffer(v, t, null, b, x, H); for (R = 0, y = i.length; y > R; R++) x = i[R], H = x.object, H.visible && H.castShadow && (H._modelViewMatrix.multiplyMatrices(v.matrixWorldInverse, H.matrixWorld), e.renderImmediateObject(v, t, null, o, H)) } T = e.getClearColor(), g = e.getClearAlpha(), l.clearColor(T.r, T.g, T.b, g), l.enable(l.BLEND), e.shadowMapCullFace === THREE.CullFaceFront && l.cullFace(l.BACK), e.resetGLState() } } }, THREE.SpritePlugin = function(e, t) { function r(e, t) { return e.z !== t.z ? t.z - e.z : t.id - e.id } var i, n, o, a, s, h, l, c, u, E, p, d, f, m, T, g, R, y, v, H, x, b = e.context, w = new THREE.Vector3, _ = new THREE.Quaternion, M = new THREE.Vector3; this.render = function(S, C) { if (0 !== t.length) { if (void 0 === H) { var A = new Float32Array([-.5, -.5, 0, 0, .5, -.5, 1, 0, .5, .5, 1, 1, -.5, .5, 0, 1]), L = new Uint16Array([0, 1, 2, 0, 2, 3]); y = b.createBuffer(), v = b.createBuffer(), b.bindBuffer(b.ARRAY_BUFFER, y), b.bufferData(b.ARRAY_BUFFER, A, b.STATIC_DRAW), b.bindBuffer(b.ELEMENT_ARRAY_BUFFER, v), b.bufferData(b.ELEMENT_ARRAY_BUFFER, L, b.STATIC_DRAW); var A = b.createProgram(), L = b.createShader(b.VERTEX_SHADER), P = b.createShader(b.FRAGMENT_SHADER); b.shaderSource(L, ["precision " + e.getPrecision() + " float;", "uniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 uvOffset;\nuniform vec2 uvScale;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvoid main() {\nvUV = uvOffset + uv * uvScale;\nvec2 alignedPosition = position * scale;\nvec2 rotatedPosition;\nrotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\nrotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\nvec4 finalPosition;\nfinalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\nfinalPosition.xy += rotatedPosition;\nfinalPosition = projectionMatrix * finalPosition;\ngl_Position = finalPosition;\n}"].join("\n")), b.shaderSource(P, ["precision " + e.getPrecision() + " float;", "uniform vec3 color;\nuniform sampler2D map;\nuniform float opacity;\nuniform int fogType;\nuniform vec3 fogColor;\nuniform float fogDensity;\nuniform float fogNear;\nuniform float fogFar;\nuniform float alphaTest;\nvarying vec2 vUV;\nvoid main() {\nvec4 texture = texture2D( map, vUV );\nif ( texture.a < alphaTest ) discard;\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\nif ( fogType > 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;\nfloat fogFactor = 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")), b.compileShader(L), b.compileShader(P), b.attachShader(A, L), b.attachShader(A, P), b.linkProgram(A), H = A, g = b.getAttribLocation(H, "position"), R = b.getAttribLocation(H, "uv"), i = b.getUniformLocation(H, "uvOffset"), n = b.getUniformLocation(H, "uvScale"), o = b.getUniformLocation(H, "rotation"), a = b.getUniformLocation(H, "scale"), s = b.getUniformLocation(H, "color"), h = b.getUniformLocation(H, "map"), l = b.getUniformLocation(H, "opacity"), c = b.getUniformLocation(H, "modelViewMatrix"), u = b.getUniformLocation(H, "projectionMatrix"), E = b.getUniformLocation(H, "fogType"), p = b.getUniformLocation(H, "fogDensity"), d = b.getUniformLocation(H, "fogNear"), f = b.getUniformLocation(H, "fogFar"), m = b.getUniformLocation(H, "fogColor"), T = b.getUniformLocation(H, "alphaTest"), A = document.createElement("canvas"), A.width = 8, A.height = 8, L = A.getContext("2d"), L.fillStyle = "white", L.fillRect(0, 0, 8, 8), x = new THREE.Texture(A), x.needsUpdate = !0 } b.useProgram(H), b.enableVertexAttribArray(g), b.enableVertexAttribArray(R), b.disable(b.CULL_FACE), b.enable(b.BLEND), b.bindBuffer(b.ARRAY_BUFFER, y), b.vertexAttribPointer(g, 2, b.FLOAT, !1, 16, 0), b.vertexAttribPointer(R, 2, b.FLOAT, !1, 16, 8), b.bindBuffer(b.ELEMENT_ARRAY_BUFFER, v), b.uniformMatrix4fv(u, !1, C.projectionMatrix.elements), b.activeTexture(b.TEXTURE0), b.uniform1i(h, 0), L = A = 0, (P = S.fog) ? (b.uniform3f(m, P.color.r, P.color.g, P.color.b), P instanceof THREE.Fog ? (b.uniform1f(d, P.near), b.uniform1f(f, P.far), b.uniform1i(E, 1), L = A = 1) : P instanceof THREE.FogExp2 && (b.uniform1f(p, P.density), b.uniform1i(E, 2), L = A = 2)) : (b.uniform1i(E, 0), L = A = 0); for (var P = 0, F = t.length; F > P; P++) { var B = t[P]; B._modelViewMatrix.multiplyMatrices(C.matrixWorldInverse, B.matrixWorld), B.z = -B._modelViewMatrix.elements[14] } t.sort(r); for (var U = [], P = 0, F = t.length; F > P; P++) { var B = t[P], D = B.material; b.uniform1f(T, D.alphaTest), b.uniformMatrix4fv(c, !1, B._modelViewMatrix.elements), B.matrixWorld.decompose(w, _, M), U[0] = M.x, U[1] = M.y, B = 0, S.fog && D.fog && (B = L), A !== B && (b.uniform1i(E, B), A = B), null !== D.map ? (b.uniform2f(i, D.map.offset.x, D.map.offset.y), b.uniform2f(n, D.map.repeat.x, D.map.repeat.y)) : (b.uniform2f(i, 0, 0), b.uniform2f(n, 1, 1)), b.uniform1f(l, D.opacity), b.uniform3f(s, D.color.r, D.color.g, D.color.b), b.uniform1f(o, D.rotation), b.uniform2fv(a, U), e.state.setBlending(D.blending, D.blendEquation, D.blendSrc, D.blendDst), e.state.setDepthTest(D.depthTest), e.state.setDepthWrite(D.depthWrite), D.map && D.map.image && D.map.image.width ? e.setTexture(D.map, 0) : e.setTexture(x, 0), b.drawElements(b.TRIANGLES, 6, b.UNSIGNED_SHORT, 0) } b.enable(b.CULL_FACE), e.resetGLState() } } }, THREE.GeometryUtils = { merge: function(e, t, r) { THREE.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead."); var i; t instanceof THREE.Mesh && (t.matrixAutoUpdate && t.updateMatrix(), i = t.matrix, t = t.geometry), e.merge(t, i, r) }, center: function(e) { return THREE.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead."), e.center() } }, THREE.ImageUtils = { crossOrigin: void 0, loadTexture: function(e, t, r, i) { var n = new THREE.ImageLoader; n.crossOrigin = this.crossOrigin; var o = new THREE.Texture(void 0, t); return n.load(e, function(e) { o.image = e, o.needsUpdate = !0, r && r(o) }, void 0, function(e) { i && i(e) }), o.sourceFile = e, o }, loadTextureCube: function(e, t, r, i) { var n = new THREE.ImageLoader; n.crossOrigin = this.crossOrigin; var o = new THREE.CubeTexture([], t); o.flipY = !1; var a = 0; t = function(t) { n.load(e[t], function(e) { o.images[t] = e, a += 1, 6 === a && (o.needsUpdate = !0, r && r(o)) }, void 0, i) }; for (var s = 0, h = e.length; h > s; ++s) t(s); return o }, loadCompressedTexture: function() { THREE.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.") }, loadCompressedTextureCube: function() { THREE.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.") }, getNormalMap: function(e, t) { var r = function(e) { var t = Math.sqrt(e[0] * e[0] + e[1] * e[1] + e[2] * e[2]); return [e[0] / t, e[1] / t, e[2] / t] }; t |= 1; var i = e.width, n = e.height, o = document.createElement("canvas"); o.width = i, o.height = n; var a = o.getContext("2d"); a.drawImage(e, 0, 0); for (var s = a.getImageData(0, 0, i, n).data, h = a.createImageData(i, n), l = h.data, c = 0; i > c; c++) for (var u = 0; n > u; u++) { var E = 0 > u - 1 ? 0 : u - 1, p = u + 1 > n - 1 ? n - 1 : u + 1, d = 0 > c - 1 ? 0 : c - 1, f = c + 1 > i - 1 ? i - 1 : c + 1, m = [], T = [0, 0, s[4 * (u * i + c)] / 255 * t]; for (m.push([-1, 0, s[4 * (u * i + d)] / 255 * t]), m.push([-1, -1, s[4 * (E * i + d)] / 255 * t]), m.push([0, -1, s[4 * (E * i + c)] / 255 * t]), m.push([1, -1, s[4 * (E * i + f)] / 255 * t]), m.push([1, 0, s[4 * (u * i + f)] / 255 * t]), m.push([1, 1, s[4 * (p * i + f)] / 255 * t]), m.push([0, 1, s[4 * (p * i + c)] / 255 * t]), m.push([-1, 1, s[4 * (p * i + d)] / 255 * t]), E = [], d = m.length, p = 0; d > p; p++) { var f = m[p], g = m[(p + 1) % d], f = [f[0] - T[0], f[1] - T[1], f[2] - T[2]], g = [g[0] - T[0], g[1] - T[1], g[2] - T[2]]; E.push(r([f[1] * g[2] - f[2] * g[1], f[2] * g[0] - f[0] * g[2], f[0] * g[1] - f[1] * g[0]])) } for (m = [0, 0, 0], p = 0; p < E.length; p++) m[0] += E[p][0], m[1] += E[p][1], m[2] += E[p][2]; m[0] /= E.length, m[1] /= E.length, m[2] /= E.length, T = 4 * (u * i + c), l[T] = (m[0] + 1) / 2 * 255 | 0, l[T + 1] = (m[1] + 1) / 2 * 255 | 0, l[T + 2] = 255 * m[2] | 0, l[T + 3] = 255 } return a.putImageData(h, 0, 0), o }, generateDataTexture: function(e, t, r) { var i = e * t, n = new Uint8Array(3 * i), o = Math.floor(255 * r.r), a = Math.floor(255 * r.g); r = Math.floor(255 * r.b); for (var s = 0; i > s; s++) n[3 * s] = o, n[3 * s + 1] = a, n[3 * s + 2] = r; return e = new THREE.DataTexture(n, e, t, THREE.RGBFormat), e.needsUpdate = !0, e } }, THREE.SceneUtils = { createMultiMaterialObject: function(e, t) { for (var r = new THREE.Object3D, i = 0, n = t.length; n > i; i++) r.add(new THREE.Mesh(e, t[i])); return r }, detach: function(e, t, r) { e.applyMatrix(t.matrixWorld), t.remove(e), r.add(e) }, attach: function(e, t, r) { var i = new THREE.Matrix4; i.getInverse(r.matrixWorld), e.applyMatrix(i), t.remove(e), r.add(e) } }, THREE.FontUtils = { faces: {}, face: "helvetiker", weight: "normal", style: "normal", size: 150, divisions: 10, getFace: function() { try { return this.faces[this.face][this.weight][this.style] } catch (e) { throw "The font " + this.face + " with " + this.weight + " weight and " + this.style + " style is missing." } }, loadFace: function(e) { var t = e.familyName.toLowerCase(); return this.faces[t] = this.faces[t] || {}, this.faces[t][e.cssFontWeight] = this.faces[t][e.cssFontWeight] || {}, this.faces[t][e.cssFontWeight][e.cssFontStyle] = e, this.faces[t][e.cssFontWeight][e.cssFontStyle] = e }, drawText: function(e) { var t = this.getFace(), r = this.size / t.resolution, i = 0, n = String(e).split(""), o = n.length, a = []; for (e = 0; o > e; e++) { var s = new THREE.Path, s = this.extractGlyphPoints(n[e], t, r, i, s), i = i + s.offset; a.push(s.path) } return { paths: a, offset: i / 2 } }, extractGlyphPoints: function(e, t, r, i, n) { var o, a, s, h, l, c, u, E, p, d, f, m = [], T = t.glyphs[e] || t.glyphs["?"]; if (T) { if (T.o) for (t = T._cachedOutline || (T._cachedOutline = T.o.split(" ")), h = t.length, e = 0; h > e;) switch (s = t[e++]) { case "m": s = t[e++] * r + i, l = t[e++] * r, n.moveTo(s, l); break; case "l": s = t[e++] * r + i, l = t[e++] * r, n.lineTo(s, l); break; case "q": if (s = t[e++] * r + i, l = t[e++] * r, E = t[e++] * r + i, p = t[e++] * r, n.quadraticCurveTo(E, p, s, l), o = m[m.length - 1]) for (c = o.x, u = o.y, o = 1, a = this.divisions; a >= o; o++) { var g = o / a; THREE.Shape.Utils.b2(g, c, E, s), THREE.Shape.Utils.b2(g, u, p, l) } break; case "b": if (s = t[e++] * r + i, l = t[e++] * r, E = t[e++] * r + i, p = t[e++] * r, d = t[e++] * r + i, f = t[e++] * r, n.bezierCurveTo(E, p, d, f, s, l), o = m[m.length - 1]) for (c = o.x, u = o.y, o = 1, a = this.divisions; a >= o; o++) g = o / a, THREE.Shape.Utils.b3(g, c, E, d, s), THREE.Shape.Utils.b3(g, u, p, f, l) } return { offset: T.ha * r, path: n } } } }, THREE.FontUtils.generateShapes = function(e, t) { t = t || {}; var r = void 0 !== t.curveSegments ? t.curveSegments : 4, i = void 0 !== t.font ? t.font : "helvetiker", n = void 0 !== t.weight ? t.weight : "normal", o = void 0 !== t.style ? t.style : "normal"; for (THREE.FontUtils.size = void 0 !== t.size ? t.size : 100, THREE.FontUtils.divisions = r, THREE.FontUtils.face = i, THREE.FontUtils.weight = n, THREE.FontUtils.style = o, r = THREE.FontUtils.drawText(e).paths, i = [], n = 0, o = r.length; o > n; n++) Array.prototype.push.apply(i, r[n].toShapes()); return i }, function(e) { var t = function(e) { for (var t = e.length, r = 0, i = t - 1, n = 0; t > n; i = n++) r += e[i].x * e[n].y - e[n].x * e[i].y; return .5 * r }; return e.Triangulate = function(e, r) { var i = e.length; if (3 > i) return null; var n, o, a, s = [], h = [], l = []; if (0 < t(e)) for (o = 0; i > o; o++) h[o] = o; else for (o = 0; i > o; o++) h[o] = i - 1 - o; var c = 2 * i; for (o = i - 1; i > 2;) { if (0 >= c--) { THREE.warn("THREE.FontUtils: Warning, unable to triangulate polygon! in Triangulate.process()"); break } n = o, n >= i && (n = 0), o = n + 1, o >= i && (o = 0), a = o + 1, a >= i && (a = 0); var u; e: { var E = u = void 0, p = void 0, d = void 0, f = void 0, m = void 0, T = void 0, g = void 0, R = void 0, E = e[h[n]].x, p = e[h[n]].y, d = e[h[o]].x, f = e[h[o]].y, m = e[h[a]].x, T = e[h[a]].y; if (1e-10 > (d - E) * (T - p) - (f - p) * (m - E)) u = !1; else { var y = void 0, v = void 0, H = void 0, x = void 0, b = void 0, w = void 0, _ = void 0, M = void 0, S = void 0, C = void 0, S = M = _ = R = g = void 0, y = m - d, v = T - f, H = E - m, x = p - T, b = d - E, w = f - p; for (u = 0; i > u; u++) if (g = e[h[u]].x, R = e[h[u]].y, !(g === E && R === p || g === d && R === f || g === m && R === T) && (_ = g - E, M = R - p, S = g - d, C = R - f, g -= m, R -= T, S = y * C - v * S, _ = b * M - w * _, M = H * R - x * g, S >= -1e-10 && M >= -1e-10 && _ >= -1e-10)) { u = !1; break e } u = !0 } } if (u) { for (s.push([e[h[n]], e[h[o]], e[h[a]]]), l.push([h[n], h[o], h[a]]), n = o, a = o + 1; i > a; n++, a++) h[n] = h[a]; i--, c = 2 * i } } return r ? l : s }, e.Triangulate.area = t, e }(THREE.FontUtils), self._typeface_js = { faces: THREE.FontUtils.faces, loadFace: THREE.FontUtils.loadFace }, THREE.typeface_js = self._typeface_js, THREE.Audio = function(e) { THREE.Object3D.call(this), this.type = "Audio", this.context = e.context, this.source = this.context.createBufferSource(), this.source.onended = this.onEnded.bind(this), this.gain = this.context.createGain(), this.gain.connect(this.context.destination), this.panner = this.context.createPanner(), this.panner.connect(this.gain), this.autoplay = !1, this.startTime = 0, this.isPlaying = !1 }, THREE.Audio.prototype = Object.create(THREE.Object3D.prototype), THREE.Audio.prototype.constructor = THREE.Audio, THREE.Audio.prototype.load = function(e) { var t = this, r = new XMLHttpRequest; return r.open("GET", e, !0), r.responseType = "arraybuffer", r.onload = function(e) { t.context.decodeAudioData(this.response, function(e) { t.source.buffer = e, t.autoplay && t.play() }) }, r.send(), this }, THREE.Audio.prototype.play = function() { if (!0 === this.isPlaying) THREE.warn("THREE.Audio: Audio is already playing."); else { var e = this.context.createBufferSource(); e.buffer = this.source.buffer, e.loop = this.source.loop, e.onended = this.source.onended, e.connect(this.panner), e.start(0, this.startTime), this.isPlaying = !0, this.source = e } }, THREE.Audio.prototype.pause = function() { this.source.stop(), this.startTime = this.context.currentTime }, THREE.Audio.prototype.stop = function() { this.source.stop(), this.startTime = 0 }, THREE.Audio.prototype.onEnded = function() { this.isPlaying = !1 }, THREE.Audio.prototype.setLoop = function(e) { this.source.loop = e }, THREE.Audio.prototype.setRefDistance = function(e) { this.panner.refDistance = e }, THREE.Audio.prototype.setRolloffFactor = function(e) { this.panner.rolloffFactor = e }, THREE.Audio.prototype.setVolume = function(e) { this.gain.gain.value = e }, THREE.Audio.prototype.updateMatrixWorld = function() { var e = new THREE.Vector3; return function(t) { THREE.Object3D.prototype.updateMatrixWorld.call(this, t), e.setFromMatrixPosition(this.matrixWorld), this.panner.setPosition(e.x, e.y, e.z) } }(), THREE.AudioListener = function() { THREE.Object3D.call(this), this.type = "AudioListener", this.context = new(window.AudioContext || window.webkitAudioContext) }, THREE.AudioListener.prototype = Object.create(THREE.Object3D.prototype), THREE.AudioListener.prototype.constructor = THREE.AudioListener, THREE.AudioListener.prototype.updateMatrixWorld = function() { var e = new THREE.Vector3, t = new THREE.Quaternion, r = new THREE.Vector3, i = new THREE.Vector3, n = new THREE.Vector3, o = new THREE.Vector3; return function(a) { THREE.Object3D.prototype.updateMatrixWorld.call(this, a), a = this.context.listener; var s = this.up; this.matrixWorld.decompose(e, t, r), i.set(0, 0, -1).applyQuaternion(t), n.subVectors(e, o), a.setPosition(e.x, e.y, e.z), a.setOrientation(i.x, i.y, i.z, s.x, s.y, s.z), a.setVelocity(n.x, n.y, n.z), o.copy(e) } }(), THREE.Curve = function() {}, THREE.Curve.prototype.getPoint = function(e) { return THREE.warn("THREE.Curve: Warning, getPoint() not implemented!"), null }, THREE.Curve.prototype.getPointAt = function(e) { return e = this.getUtoTmapping(e), this.getPoint(e) }, THREE.Curve.prototype.getPoints = function(e) { e || (e = 5); var t, r = []; for (t = 0; e >= t; t++) r.push(this.getPoint(t / e)); return r }, THREE.Curve.prototype.getSpacedPoints = function(e) { e || (e = 5); var t, r = []; for (t = 0; e >= t; t++) r.push(this.getPointAt(t / e)); return r }, THREE.Curve.prototype.getLength = function() { var e = this.getLengths(); return e[e.length - 1] }, THREE.Curve.prototype.getLengths = function(e) { if (e || (e = this.__arcLengthDivisions ? this.__arcLengthDivisions : 200), this.cacheArcLengths && this.cacheArcLengths.length == e + 1 && !this.needsUpdate) return this.cacheArcLengths; this.needsUpdate = !1; var t, r, i = [], n = this.getPoint(0), o = 0; for (i.push(0), r = 1; e >= r; r++) t = this.getPoint(r / e), o += t.distanceTo(n), i.push(o), n = t; return this.cacheArcLengths = i }, THREE.Curve.prototype.updateArcLengths = function() { this.needsUpdate = !0, this.getLengths() }, THREE.Curve.prototype.getUtoTmapping = function(e, t) { var r, i = this.getLengths(), n = 0, o = i.length; r = t ? t : e * i[o - 1]; for (var a, s = 0, h = o - 1; h >= s;) if (n = Math.floor(s + (h - s) / 2), a = i[n] - r, 0 > a) s = n + 1; else { if (!(a > 0)) { h = n; break } h = n - 1 } return n = h, i[n] == r ? n / (o - 1) : (s = i[n], i = (n + (r - s) / (i[n + 1] - s)) / (o - 1)) }, THREE.Curve.prototype.getTangent = function(e) { var t = e - 1e-4; return e += 1e-4, 0 > t && (t = 0), e > 1 && (e = 1), t = this.getPoint(t), this.getPoint(e).clone().sub(t).normalize() }, THREE.Curve.prototype.getTangentAt = function(e) { return e = this.getUtoTmapping(e), this.getTangent(e) }, THREE.Curve.Utils = { tangentQuadraticBezier: function(e, t, r, i) { return 2 * (1 - e) * (r - t) + 2 * e * (i - r) }, tangentCubicBezier: function(e, t, r, i, n) { return -3 * t * (1 - e) * (1 - e) + 3 * r * (1 - e) * (1 - e) - 6 * e * r * (1 - e) + 6 * e * i * (1 - e) - 3 * e * e * i + 3 * e * e * n }, tangentSpline: function(e, t, r, i, n) { return 6 * e * e - 6 * e + (3 * e * e - 4 * e + 1) + (-6 * e * e + 6 * e) + (3 * e * e - 2 * e) }, interpolate: function(e, t, r, i, n) { e = .5 * (r - e), i = .5 * (i - t); var o = n * n; return (2 * t - 2 * r + e + i) * n * o + (-3 * t + 3 * r - 2 * e - i) * o + e * n + t } }, THREE.Curve.create = function(e, t) { return e.prototype = Object.create(THREE.Curve.prototype), e.prototype.constructor = e, e.prototype.getPoint = t, e }, THREE.CurvePath = function() { this.curves = [], this.bends = [], this.autoClose = !1 }, THREE.CurvePath.prototype = Object.create(THREE.Curve.prototype), THREE.CurvePath.prototype.constructor = THREE.CurvePath, THREE.CurvePath.prototype.add = function(e) { this.curves.push(e) }, THREE.CurvePath.prototype.checkConnection = function() {}, THREE.CurvePath.prototype.closePath = function() { var e = this.curves[0].getPoint(0), t = this.curves[this.curves.length - 1].getPoint(1); e.equals(t) || this.curves.push(new THREE.LineCurve(t, e)) }, THREE.CurvePath.prototype.getPoint = function(e) { var t = e * this.getLength(), r = this.getCurveLengths(); for (e = 0; e < r.length;) { if (r[e] >= t) return t = r[e] - t, e = this.curves[e], t = 1 - t / e.getLength(), e.getPointAt(t); e++ } return null }, THREE.CurvePath.prototype.getLength = function() { var e = this.getCurveLengths(); return e[e.length - 1] }, THREE.CurvePath.prototype.getCurveLengths = function() { if (this.cacheLengths && this.cacheLengths.length == this.curves.length) return this.cacheLengths; var e, t = [], r = 0, i = this.curves.length; for (e = 0; i > e; e++) r += this.curves[e].getLength(), t.push(r); return this.cacheLengths = t }, THREE.CurvePath.prototype.getBoundingBox = function() { var e, t, r, i, n, o, a = this.getPoints(); e = t = Number.NEGATIVE_INFINITY, i = n = Number.POSITIVE_INFINITY; var s, h, l, c, u = a[0] instanceof THREE.Vector3; for (c = u ? new THREE.Vector3 : new THREE.Vector2, h = 0, l = a.length; l > h; h++) s = a[h], s.x > e ? e = s.x : s.x < i && (i = s.x), s.y > t ? t = s.y : s.y < n && (n = s.y), u && (s.z > r ? r = s.z : s.z < o && (o = s.z)), c.add(s); return a = { minX: i, minY: n, maxX: e, maxY: t }, u && (a.maxZ = r, a.minZ = o), a }, THREE.CurvePath.prototype.createPointsGeometry = function(e) { return e = this.getPoints(e, !0), this.createGeometry(e) }, THREE.CurvePath.prototype.createSpacedPointsGeometry = function(e) { return e = this.getSpacedPoints(e, !0), this.createGeometry(e) }, THREE.CurvePath.prototype.createGeometry = function(e) { for (var t = new THREE.Geometry, r = 0; r < e.length; r++) t.vertices.push(new THREE.Vector3(e[r].x, e[r].y, e[r].z || 0)); return t }, THREE.CurvePath.prototype.addWrapPath = function(e) { this.bends.push(e) }, THREE.CurvePath.prototype.getTransformedPoints = function(e, t) { var r, i, n = this.getPoints(e); for (t || (t = this.bends), r = 0, i = t.length; i > r; r++) n = this.getWrapPoints(n, t[r]); return n }, THREE.CurvePath.prototype.getTransformedSpacedPoints = function(e, t) { var r, i, n = this.getSpacedPoints(e); for (t || (t = this.bends), r = 0, i = t.length; i > r; r++) n = this.getWrapPoints(n, t[r]); return n }, THREE.CurvePath.prototype.getWrapPoints = function(e, t) { var r, i, n, o, a, s, h = this.getBoundingBox(); for (r = 0, i = e.length; i > r; r++) n = e[r], o = n.x, a = n.y, s = o / h.maxX, s = t.getUtoTmapping(s, o), o = t.getPoint(s), s = t.getTangent(s), s.set(-s.y, s.x).multiplyScalar(a), n.x = o.x + s.x, n.y = o.y + s.y; return e }, THREE.Gyroscope = function() { THREE.Object3D.call(this) }, THREE.Gyroscope.prototype = Object.create(THREE.Object3D.prototype), THREE.Gyroscope.prototype.constructor = THREE.Gyroscope, THREE.Gyroscope.prototype.updateMatrixWorld = function() { var e = new THREE.Vector3, t = new THREE.Quaternion, r = new THREE.Vector3, i = new THREE.Vector3, n = new THREE.Quaternion, o = new THREE.Vector3; return function(a) { this.matrixAutoUpdate && this.updateMatrix(), (this.matrixWorldNeedsUpdate || a) && (this.parent ? (this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix), this.matrixWorld.decompose(i, n, o), this.matrix.decompose(e, t, r), this.matrixWorld.compose(i, t, o)) : this.matrixWorld.copy(this.matrix), this.matrixWorldNeedsUpdate = !1, a = !0); for (var s = 0, h = this.children.length; h > s; s++) this.children[s].updateMatrixWorld(a) } }(), THREE.Path = function(e) { THREE.CurvePath.call(this), this.actions = [], e && this.fromPoints(e) }, THREE.Path.prototype = Object.create(THREE.CurvePath.prototype), THREE.Path.prototype.constructor = THREE.Path, THREE.PathActions = { MOVE_TO: "moveTo", LINE_TO: "lineTo", QUADRATIC_CURVE_TO: "quadraticCurveTo", BEZIER_CURVE_TO: "bezierCurveTo", CSPLINE_THRU: "splineThru", ARC: "arc", ELLIPSE: "ellipse" }, THREE.Path.prototype.fromPoints = function(e) { this.moveTo(e[0].x, e[0].y); for (var t = 1, r = e.length; r > t; t++) this.lineTo(e[t].x, e[t].y) }, THREE.Path.prototype.moveTo = function(e, t) { var r = Array.prototype.slice.call(arguments); this.actions.push({ action: THREE.PathActions.MOVE_TO, args: r }) }, THREE.Path.prototype.lineTo = function(e, t) { var r = Array.prototype.slice.call(arguments), i = this.actions[this.actions.length - 1].args, i = new THREE.LineCurve(new THREE.Vector2(i[i.length - 2], i[i.length - 1]), new THREE.Vector2(e, t)); this.curves.push(i), this.actions.push({ action: THREE.PathActions.LINE_TO, args: r }) }, THREE.Path.prototype.quadraticCurveTo = function(e, t, r, i) { var n = Array.prototype.slice.call(arguments), o = this.actions[this.actions.length - 1].args, o = new THREE.QuadraticBezierCurve(new THREE.Vector2(o[o.length - 2], o[o.length - 1]), new THREE.Vector2(e, t), new THREE.Vector2(r, i)); this.curves.push(o), this.actions.push({ action: THREE.PathActions.QUADRATIC_CURVE_TO, args: n }) }, THREE.Path.prototype.bezierCurveTo = function(e, t, r, i, n, o) { var a = Array.prototype.slice.call(arguments), s = this.actions[this.actions.length - 1].args, s = new THREE.CubicBezierCurve(new THREE.Vector2(s[s.length - 2], s[s.length - 1]), new THREE.Vector2(e, t), new THREE.Vector2(r, i), new THREE.Vector2(n, o)); this.curves.push(s), this.actions.push({ action: THREE.PathActions.BEZIER_CURVE_TO, args: a }) }, THREE.Path.prototype.splineThru = function(e) { var t = Array.prototype.slice.call(arguments), r = this.actions[this.actions.length - 1].args, r = [new THREE.Vector2(r[r.length - 2], r[r.length - 1])]; Array.prototype.push.apply(r, e), r = new THREE.SplineCurve(r), this.curves.push(r), this.actions.push({ action: THREE.PathActions.CSPLINE_THRU, args: t }) }, THREE.Path.prototype.arc = function(e, t, r, i, n, o) { var a = this.actions[this.actions.length - 1].args; this.absarc(e + a[a.length - 2], t + a[a.length - 1], r, i, n, o) }, THREE.Path.prototype.absarc = function(e, t, r, i, n, o) { this.absellipse(e, t, r, r, i, n, o) }, THREE.Path.prototype.ellipse = function(e, t, r, i, n, o, a) { var s = this.actions[this.actions.length - 1].args; this.absellipse(e + s[s.length - 2], t + s[s.length - 1], r, i, n, o, a) }, THREE.Path.prototype.absellipse = function(e, t, r, i, n, o, a) { var s = Array.prototype.slice.call(arguments), h = new THREE.EllipseCurve(e, t, r, i, n, o, a); this.curves.push(h), h = h.getPoint(1), s.push(h.x), s.push(h.y), this.actions.push({ action: THREE.PathActions.ELLIPSE, args: s }) }, THREE.Path.prototype.getSpacedPoints = function(e, t) { e || (e = 40); for (var r = [], i = 0; e > i; i++) r.push(this.getPoint(i / e)); return r }, THREE.Path.prototype.getPoints = function(e, t) { if (this.useSpacedPoints) return console.log("tata"), this.getSpacedPoints(e, t); e = e || 12; var r, i, n, o, a, s, h, l, c, u, E, p, d, f = []; for (r = 0, i = this.actions.length; i > r; r++) switch (n = this.actions[r], o = n.action, n = n.args, o) { case THREE.PathActions.MOVE_TO: f.push(new THREE.Vector2(n[0], n[1])); break; case THREE.PathActions.LINE_TO: f.push(new THREE.Vector2(n[0], n[1])); break; case THREE.PathActions.QUADRATIC_CURVE_TO: for (a = n[2], s = n[3], c = n[0], u = n[1], 0 < f.length ? (o = f[f.length - 1], E = o.x, p = o.y) : (o = this.actions[r - 1].args, E = o[o.length - 2], p = o[o.length - 1]), n = 1; e >= n; n++) d = n / e, o = THREE.Shape.Utils.b2(d, E, c, a), d = THREE.Shape.Utils.b2(d, p, u, s), f.push(new THREE.Vector2(o, d)); break; case THREE.PathActions.BEZIER_CURVE_TO: for (a = n[4], s = n[5], c = n[0], u = n[1], h = n[2], l = n[3], 0 < f.length ? (o = f[f.length - 1], E = o.x, p = o.y) : (o = this.actions[r - 1].args, E = o[o.length - 2], p = o[o.length - 1]), n = 1; e >= n; n++) d = n / e, o = THREE.Shape.Utils.b3(d, E, c, h, a), d = THREE.Shape.Utils.b3(d, p, u, l, s), f.push(new THREE.Vector2(o, d)); break; case THREE.PathActions.CSPLINE_THRU: for (o = this.actions[r - 1].args, d = [new THREE.Vector2(o[o.length - 2], o[o.length - 1])], o = e * n[0].length, d = d.concat(n[0]), d = new THREE.SplineCurve(d), n = 1; o >= n; n++) f.push(d.getPointAt(n / o)); break; case THREE.PathActions.ARC: for (a = n[0], s = n[1], u = n[2], h = n[3], o = n[4], c = !!n[5], E = o - h, p = 2 * e, n = 1; p >= n; n++) d = n / p, c || (d = 1 - d), d = h + d * E, o = a + u * Math.cos(d), d = s + u * Math.sin(d), f.push(new THREE.Vector2(o, d)); break; case THREE.PathActions.ELLIPSE: for (a = n[0], s = n[1], u = n[2], l = n[3], h = n[4], o = n[5], c = !!n[6], E = o - h, p = 2 * e, n = 1; p >= n; n++) d = n / p, c || (d = 1 - d), d = h + d * E, o = a + u * Math.cos(d), d = s + l * Math.sin(d), f.push(new THREE.Vector2(o, d)) } return r = f[f.length - 1], 1e-10 > Math.abs(r.x - f[0].x) && 1e-10 > Math.abs(r.y - f[0].y) && f.splice(f.length - 1, 1), t && f.push(f[0]), f }, THREE.Path.prototype.toShapes = function(e, t) { function r(e) { for (var t = [], r = 0, i = e.length; i > r; r++) { var n = e[r], o = new THREE.Shape; o.actions = n.actions, o.curves = n.curves, t.push(o) } return t } function i(e, t) { for (var r = t.length, i = !1, n = r - 1, o = 0; r > o; n = o++) { var a = t[n], s = t[o], h = s.x - a.x, l = s.y - a.y; if (1e-10 < Math.abs(l)) { if (0 > l && (a = t[o], h = -h, s = t[n], l = -l), !(e.y < a.y || e.y > s.y)) if (e.y == a.y) { if (e.x == a.x) return !0 } else { if (n = l * (e.x - a.x) - h * (e.y - a.y), 0 == n) return !0; 0 > n || (i = !i) } } else if (e.y == a.y && (s.x <= e.x && e.x <= a.x || a.x <= e.x && e.x <= s.x)) return !0 } return i } var n = function(e) { var t, r, i, n, o = [], a = new THREE.Path; for (t = 0, r = e.length; r > t; t++) i = e[t], n = i.args, i = i.action, i == THREE.PathActions.MOVE_TO && 0 != a.actions.length && (o.push(a), a = new THREE.Path), a[i].apply(a, n); return 0 != a.actions.length && o.push(a), o }(this.actions); if (0 == n.length) return []; if (!0 === t) return r(n); var o, a, s, h = []; if (1 == n.length) return a = n[0], s = new THREE.Shape, s.actions = a.actions, s.curves = a.curves, h.push(s), h; var l = !THREE.Shape.Utils.isClockWise(n[0].getPoints()), l = e ? !l : l; s = []; var c, u = [], E = [], p = 0; u[p] = void 0, E[p] = []; var d, f; for (d = 0, f = n.length; f > d; d++) a = n[d], c = a.getPoints(), o = THREE.Shape.Utils.isClockWise(c), (o = e ? !o : o) ? (!l && u[p] && p++, u[p] = { s: new THREE.Shape, p: c }, u[p].s.actions = a.actions, u[p].s.curves = a.curves, l && p++, E[p] = []) : E[p].push({ h: a, p: c[0] }); if (!u[0]) return r(n); if (1 < u.length) { for (d = !1, f = [], a = 0, n = u.length; n > a; a++) s[a] = []; for (a = 0, n = u.length; n > a; a++) for (o = E[a], l = 0; l < o.length; l++) { p = o[l], c = !0; for (var m = 0; m < u.length; m++) i(p.p, u[m].p) && (a != m && f.push({ froms: a, tos: m, hole: l }), c ? (c = !1, s[m].push(p)) : d = !0); c && s[a].push(p) } 0 < f.length && (d || (E = s)) } for (d = 0, f = u.length; f > d; d++) for (s = u[d].s, h.push(s), a = E[d], n = 0, o = a.length; o > n; n++) s.holes.push(a[n].h); return h }, THREE.Shape = function() { THREE.Path.apply(this, arguments), this.holes = [] }, THREE.Shape.prototype = Object.create(THREE.Path.prototype), THREE.Shape.prototype.constructor = THREE.Shape, THREE.Shape.prototype.extrude = function(e) { return new THREE.ExtrudeGeometry(this, e) }, THREE.Shape.prototype.makeGeometry = function(e) { return new THREE.ShapeGeometry(this, e) }, THREE.Shape.prototype.getPointsHoles = function(e) { var t, r = this.holes.length, i = []; for (t = 0; r > t; t++) i[t] = this.holes[t].getTransformedPoints(e, this.bends); return i }, THREE.Shape.prototype.getSpacedPointsHoles = function(e) { var t, r = this.holes.length, i = []; for (t = 0; r > t; t++) i[t] = this.holes[t].getTransformedSpacedPoints(e, this.bends); return i }, THREE.Shape.prototype.extractAllPoints = function(e) { return { shape: this.getTransformedPoints(e), holes: this.getPointsHoles(e) } }, THREE.Shape.prototype.extractPoints = function(e) { return this.useSpacedPoints ? this.extractAllSpacedPoints(e) : this.extractAllPoints(e) }, THREE.Shape.prototype.extractAllSpacedPoints = function(e) { return { shape: this.getTransformedSpacedPoints(e), holes: this.getSpacedPointsHoles(e) } }, THREE.Shape.Utils = { triangulateShape: function(e, t) { function r(e, t, r) { return e.x != t.x ? e.x < t.x ? e.x <= r.x && r.x <= t.x : t.x <= r.x && r.x <= e.x : e.y < t.y ? e.y <= r.y && r.y <= t.y : t.y <= r.y && r.y <= e.y } function i(e, t, i, n, o) { var a = t.x - e.x, s = t.y - e.y, h = n.x - i.x, l = n.y - i.y, c = e.x - i.x, u = e.y - i.y, E = s * h - a * l, p = s * c - a * u; if (1e-10 < Math.abs(E)) { if (E > 0) { if (0 > p || p > E) return []; if (h = l * c - h * u, 0 > h || h > E) return [] } else { if (p > 0 || E > p) return []; if (h = l * c - h * u, h > 0 || E > h) return [] } return 0 == h ? !o || 0 != p && p != E ? [e] : [] : h == E ? !o || 0 != p && p != E ? [t] : [] : 0 == p ? [i] : p == E ? [n] : (o = h / E, [{ x: e.x + o * a, y: e.y + o * s }]) } return 0 != p || l * c != h * u ? [] : (s = 0 == a && 0 == s, h = 0 == h && 0 == l, s && h ? e.x != i.x || e.y != i.y ? [] : [e] : s ? r(i, n, e) ? [e] : [] : h ? r(e, t, i) ? [i] : [] : (0 != a ? (e.x < t.x ? (a = e, h = e.x, s = t, e = t.x) : (a = t, h = t.x, s = e, e = e.x), i.x < n.x ? (t = i, E = i.x, l = n, i = n.x) : (t = n, E = n.x, l = i, i = i.x)) : (e.y < t.y ? (a = e, h = e.y, s = t, e = t.y) : (a = t, h = t.y, s = e, e = e.y), i.y < n.y ? (t = i, E = i.y, l = n, i = n.y) : (t = n, E = n.y, l = i, i = i.y)), E >= h ? E > e ? [] : e == E ? o ? [] : [t] : i >= e ? [t, s] : [t, l] : h > i ? [] : h == i ? o ? [] : [a] : i >= e ? [a, s] : [a, l])) } function n(e, t, r, i) { var n = t.x - e.x, o = t.y - e.y; t = r.x - e.x, r = r.y - e.y; var a = i.x - e.x; return i = i.y - e.y, e = n * r - o * t, n = n * i - o * a, 1e-10 < Math.abs(e) ? (t = a * r - i * t, e > 0 ? n >= 0 && t >= 0 : n >= 0 || t >= 0) : n > 0 } var o, a, s, h, l, c = {}; for (s = e.concat(), o = 0, a = t.length; a > o; o++) Array.prototype.push.apply(s, t[o]); for (o = 0, a = s.length; a > o; o++) l = s[o].x + ":" + s[o].y, void 0 !== c[l] && THREE.warn("THREE.Shape: Duplicate point", l), c[l] = o; o = function(e, t) { function r(e, t) { var r = m.length - 1, i = e - 1; 0 > i && (i = r); var o = e + 1; return o > r && (o = 0), (r = n(m[e], m[i], m[o], s[t])) ? (r = s.length - 1, i = t - 1, 0 > i && (i = r), o = t + 1, o > r && (o = 0), (r = n(s[t], s[i], s[o], m[e])) ? !0 : !1) : !1; } function o(e, t) { var r, n; for (r = 0; r < m.length; r++) if (n = r + 1, n %= m.length, n = i(e, t, m[r], m[n], !0), 0 < n.length) return !0; return !1 } function a(e, r) { var n, o, a, s; for (n = 0; n < T.length; n++) for (o = t[T[n]], a = 0; a < o.length; a++) if (s = a + 1, s %= o.length, s = i(e, r, o[a], o[s], !0), 0 < s.length) return !0; return !1 } var s, h, l, c, u, E, p, d, f, m = e.concat(), T = [], g = [], R = 0; for (h = t.length; h > R; R++) T.push(R); p = 0; for (var y = 2 * T.length; 0 < T.length;) { if (y--, 0 > y) { console.log("Infinite Loop! Holes left:" + T.length + ", Probably Hole outside Shape!"); break } for (l = p; l < m.length; l++) { for (c = m[l], h = -1, R = 0; R < T.length; R++) if (u = T[R], E = c.x + ":" + c.y + ":" + u, void 0 === g[E]) { for (s = t[u], d = 0; d < s.length; d++) if (u = s[d], r(l, d) && !o(c, u) && !a(c, u)) { h = d, T.splice(R, 1), p = m.slice(0, l + 1), u = m.slice(l), d = s.slice(h), f = s.slice(0, h + 1), m = p.concat(d).concat(f).concat(u), p = l; break } if (h >= 0) break; g[E] = !0 } if (h >= 0) break } } return m }(e, t); var u = THREE.FontUtils.Triangulate(o, !1); for (o = 0, a = u.length; a > o; o++) for (h = u[o], s = 0; 3 > s; s++) l = h[s].x + ":" + h[s].y, l = c[l], void 0 !== l && (h[s] = l); return u.concat() }, isClockWise: function(e) { return 0 > THREE.FontUtils.Triangulate.area(e) }, b2p0: function(e, t) { var r = 1 - e; return r * r * t }, b2p1: function(e, t) { return 2 * (1 - e) * e * t }, b2p2: function(e, t) { return e * e * t }, b2: function(e, t, r, i) { return this.b2p0(e, t) + this.b2p1(e, r) + this.b2p2(e, i) }, b3p0: function(e, t) { var r = 1 - e; return r * r * r * t }, b3p1: function(e, t) { var r = 1 - e; return 3 * r * r * e * t }, b3p2: function(e, t) { return 3 * (1 - e) * e * e * t }, b3p3: function(e, t) { return e * e * e * t }, b3: function(e, t, r, i, n) { return this.b3p0(e, t) + this.b3p1(e, r) + this.b3p2(e, i) + this.b3p3(e, n) } }, THREE.LineCurve = function(e, t) { this.v1 = e, this.v2 = t }, THREE.LineCurve.prototype = Object.create(THREE.Curve.prototype), THREE.LineCurve.prototype.constructor = THREE.LineCurve, THREE.LineCurve.prototype.getPoint = function(e) { var t = this.v2.clone().sub(this.v1); return t.multiplyScalar(e).add(this.v1), t }, THREE.LineCurve.prototype.getPointAt = function(e) { return this.getPoint(e) }, THREE.LineCurve.prototype.getTangent = function(e) { return this.v2.clone().sub(this.v1).normalize() }, THREE.QuadraticBezierCurve = function(e, t, r) { this.v0 = e, this.v1 = t, this.v2 = r }, THREE.QuadraticBezierCurve.prototype = Object.create(THREE.Curve.prototype), THREE.QuadraticBezierCurve.prototype.constructor = THREE.QuadraticBezierCurve, THREE.QuadraticBezierCurve.prototype.getPoint = function(e) { var t = new THREE.Vector2; return t.x = THREE.Shape.Utils.b2(e, this.v0.x, this.v1.x, this.v2.x), t.y = THREE.Shape.Utils.b2(e, this.v0.y, this.v1.y, this.v2.y), t }, THREE.QuadraticBezierCurve.prototype.getTangent = function(e) { var t = new THREE.Vector2; return t.x = THREE.Curve.Utils.tangentQuadraticBezier(e, this.v0.x, this.v1.x, this.v2.x), t.y = THREE.Curve.Utils.tangentQuadraticBezier(e, this.v0.y, this.v1.y, this.v2.y), t.normalize() }, THREE.CubicBezierCurve = function(e, t, r, i) { this.v0 = e, this.v1 = t, this.v2 = r, this.v3 = i }, THREE.CubicBezierCurve.prototype = Object.create(THREE.Curve.prototype), THREE.CubicBezierCurve.prototype.constructor = THREE.CubicBezierCurve, THREE.CubicBezierCurve.prototype.getPoint = function(e) { var t; return t = THREE.Shape.Utils.b3(e, this.v0.x, this.v1.x, this.v2.x, this.v3.x), e = THREE.Shape.Utils.b3(e, this.v0.y, this.v1.y, this.v2.y, this.v3.y), new THREE.Vector2(t, e) }, THREE.CubicBezierCurve.prototype.getTangent = function(e) { var t; return t = THREE.Curve.Utils.tangentCubicBezier(e, this.v0.x, this.v1.x, this.v2.x, this.v3.x), e = THREE.Curve.Utils.tangentCubicBezier(e, this.v0.y, this.v1.y, this.v2.y, this.v3.y), t = new THREE.Vector2(t, e), t.normalize(), t }, THREE.SplineCurve = function(e) { this.points = void 0 == e ? [] : e }, THREE.SplineCurve.prototype = Object.create(THREE.Curve.prototype), THREE.SplineCurve.prototype.constructor = THREE.SplineCurve, THREE.SplineCurve.prototype.getPoint = function(e) { var t = this.points; e *= t.length - 1; var r = Math.floor(e); e -= r; var i = t[0 == r ? r : r - 1], n = t[r], o = t[r > t.length - 2 ? t.length - 1 : r + 1], t = t[r > t.length - 3 ? t.length - 1 : r + 2], r = new THREE.Vector2; return r.x = THREE.Curve.Utils.interpolate(i.x, n.x, o.x, t.x, e), r.y = THREE.Curve.Utils.interpolate(i.y, n.y, o.y, t.y, e), r }, THREE.EllipseCurve = function(e, t, r, i, n, o, a) { this.aX = e, this.aY = t, this.xRadius = r, this.yRadius = i, this.aStartAngle = n, this.aEndAngle = o, this.aClockwise = a }, THREE.EllipseCurve.prototype = Object.create(THREE.Curve.prototype), THREE.EllipseCurve.prototype.constructor = THREE.EllipseCurve, THREE.EllipseCurve.prototype.getPoint = function(e) { var t = this.aEndAngle - this.aStartAngle; return 0 > t && (t += 2 * Math.PI), t > 2 * Math.PI && (t -= 2 * Math.PI), e = !0 === this.aClockwise ? this.aEndAngle + (1 - e) * (2 * Math.PI - t) : this.aStartAngle + e * t, t = new THREE.Vector2, t.x = this.aX + this.xRadius * Math.cos(e), t.y = this.aY + this.yRadius * Math.sin(e), t }, THREE.ArcCurve = function(e, t, r, i, n, o) { THREE.EllipseCurve.call(this, e, t, r, r, i, n, o) }, THREE.ArcCurve.prototype = Object.create(THREE.EllipseCurve.prototype), THREE.ArcCurve.prototype.constructor = THREE.ArcCurve, THREE.LineCurve3 = THREE.Curve.create(function(e, t) { this.v1 = e, this.v2 = t }, function(e) { var t = new THREE.Vector3; return t.subVectors(this.v2, this.v1), t.multiplyScalar(e), t.add(this.v1), t }), THREE.QuadraticBezierCurve3 = THREE.Curve.create(function(e, t, r) { this.v0 = e, this.v1 = t, this.v2 = r }, function(e) { var t = new THREE.Vector3; return t.x = THREE.Shape.Utils.b2(e, this.v0.x, this.v1.x, this.v2.x), t.y = THREE.Shape.Utils.b2(e, this.v0.y, this.v1.y, this.v2.y), t.z = THREE.Shape.Utils.b2(e, this.v0.z, this.v1.z, this.v2.z), t }), THREE.CubicBezierCurve3 = THREE.Curve.create(function(e, t, r, i) { this.v0 = e, this.v1 = t, this.v2 = r, this.v3 = i }, function(e) { var t = new THREE.Vector3; return t.x = THREE.Shape.Utils.b3(e, this.v0.x, this.v1.x, this.v2.x, this.v3.x), t.y = THREE.Shape.Utils.b3(e, this.v0.y, this.v1.y, this.v2.y, this.v3.y), t.z = THREE.Shape.Utils.b3(e, this.v0.z, this.v1.z, this.v2.z, this.v3.z), t }), THREE.SplineCurve3 = THREE.Curve.create(function(e) { this.points = void 0 == e ? [] : e }, function(e) { var t = this.points; e *= t.length - 1; var r = Math.floor(e); e -= r; var i = t[0 == r ? r : r - 1], n = t[r], o = t[r > t.length - 2 ? t.length - 1 : r + 1], t = t[r > t.length - 3 ? t.length - 1 : r + 2], r = new THREE.Vector3; return r.x = THREE.Curve.Utils.interpolate(i.x, n.x, o.x, t.x, e), r.y = THREE.Curve.Utils.interpolate(i.y, n.y, o.y, t.y, e), r.z = THREE.Curve.Utils.interpolate(i.z, n.z, o.z, t.z, e), r }), THREE.ClosedSplineCurve3 = THREE.Curve.create(function(e) { this.points = void 0 == e ? [] : e }, function(e) { var t = this.points; e *= t.length - 0; var r = Math.floor(e); e -= r; var r = r + (r > 0 ? 0 : (Math.floor(Math.abs(r) / t.length) + 1) * t.length), i = t[(r - 1) % t.length], n = t[r % t.length], o = t[(r + 1) % t.length], t = t[(r + 2) % t.length], r = new THREE.Vector3; return r.x = THREE.Curve.Utils.interpolate(i.x, n.x, o.x, t.x, e), r.y = THREE.Curve.Utils.interpolate(i.y, n.y, o.y, t.y, e), r.z = THREE.Curve.Utils.interpolate(i.z, n.z, o.z, t.z, e), r }), THREE.AnimationHandler = { LINEAR: 0, CATMULLROM: 1, CATMULLROM_FORWARD: 2, add: function() { THREE.warn("THREE.AnimationHandler.add() has been deprecated.") }, get: function() { THREE.warn("THREE.AnimationHandler.get() has been deprecated.") }, remove: function() { THREE.warn("THREE.AnimationHandler.remove() has been deprecated.") }, animations: [], init: function(e) { if (!0 === e.initialized) return e; for (var t = 0; t < e.hierarchy.length; t++) { for (var r = 0; r < e.hierarchy[t].keys.length; r++) if (0 > e.hierarchy[t].keys[r].time && (e.hierarchy[t].keys[r].time = 0), void 0 !== e.hierarchy[t].keys[r].rot && !(e.hierarchy[t].keys[r].rot instanceof THREE.Quaternion)) { var i = e.hierarchy[t].keys[r].rot; e.hierarchy[t].keys[r].rot = (new THREE.Quaternion).fromArray(i) } if (e.hierarchy[t].keys.length && void 0 !== e.hierarchy[t].keys[0].morphTargets) { for (i = {}, r = 0; r < e.hierarchy[t].keys.length; r++) for (var n = 0; n < e.hierarchy[t].keys[r].morphTargets.length; n++) { var o = e.hierarchy[t].keys[r].morphTargets[n]; i[o] = -1 } for (e.hierarchy[t].usedMorphTargets = i, r = 0; r < e.hierarchy[t].keys.length; r++) { var a = {}; for (o in i) { for (n = 0; n < e.hierarchy[t].keys[r].morphTargets.length; n++) if (e.hierarchy[t].keys[r].morphTargets[n] === o) { a[o] = e.hierarchy[t].keys[r].morphTargetsInfluences[n]; break } n === e.hierarchy[t].keys[r].morphTargets.length && (a[o] = 0) } e.hierarchy[t].keys[r].morphTargetsInfluences = a } } for (r = 1; r < e.hierarchy[t].keys.length; r++) e.hierarchy[t].keys[r].time === e.hierarchy[t].keys[r - 1].time && (e.hierarchy[t].keys.splice(r, 1), r--); for (r = 0; r < e.hierarchy[t].keys.length; r++) e.hierarchy[t].keys[r].index = r } return e.initialized = !0, e }, parse: function(e) { var t = function(e, r) { r.push(e); for (var i = 0; i < e.children.length; i++) t(e.children[i], r) }, r = []; if (e instanceof THREE.SkinnedMesh) for (var i = 0; i < e.skeleton.bones.length; i++) r.push(e.skeleton.bones[i]); else t(e, r); return r }, play: function(e) {-1 === this.animations.indexOf(e) && this.animations.push(e) }, stop: function(e) { e = this.animations.indexOf(e), -1 !== e && this.animations.splice(e, 1) }, update: function(e) { for (var t = 0; t < this.animations.length; t++) this.animations[t].resetBlendWeights(); for (t = 0; t < this.animations.length; t++) this.animations[t].update(e) } }, THREE.Animation = function(e, t) { this.root = e, this.data = THREE.AnimationHandler.init(t), this.hierarchy = THREE.AnimationHandler.parse(e), this.currentTime = 0, this.timeScale = 1, this.isPlaying = !1, this.loop = !0, this.weight = 0, this.interpolationType = THREE.AnimationHandler.LINEAR }, THREE.Animation.prototype = { constructor: THREE.Animation, keyTypes: ["pos", "rot", "scl"], play: function(e, t) { this.currentTime = void 0 !== e ? e : 0, this.weight = void 0 !== t ? t : 1, this.isPlaying = !0, this.reset(), THREE.AnimationHandler.play(this) }, stop: function() { this.isPlaying = !1, THREE.AnimationHandler.stop(this) }, reset: function() { for (var e = 0, t = this.hierarchy.length; t > e; e++) { var r = this.hierarchy[e]; void 0 === r.animationCache && (r.animationCache = { animations: {}, blending: { positionWeight: 0, quaternionWeight: 0, scaleWeight: 0 } }); var i = this.data.name, n = r.animationCache.animations, o = n[i]; for (void 0 === o && (o = { prevKey: { pos: 0, rot: 0, scl: 0 }, nextKey: { pos: 0, rot: 0, scl: 0 }, originalMatrix: r.matrix }, n[i] = o), r = 0; 3 > r; r++) { for (var i = this.keyTypes[r], n = this.data.hierarchy[e].keys[0], a = this.getNextKeyWith(i, e, 1); a.time < this.currentTime && a.index > n.index;) n = a, a = this.getNextKeyWith(i, e, a.index + 1); o.prevKey[i] = n, o.nextKey[i] = a } } }, resetBlendWeights: function() { for (var e = 0, t = this.hierarchy.length; t > e; e++) { var r = this.hierarchy[e].animationCache; void 0 !== r && (r = r.blending, r.positionWeight = 0, r.quaternionWeight = 0, r.scaleWeight = 0) } }, update: function() { var e = [], t = new THREE.Vector3, r = new THREE.Vector3, i = new THREE.Quaternion, n = function(e, t) { var r, i, n, a, s, h, l = [], c = []; return r = (e.length - 1) * t, i = Math.floor(r), r -= i, l[0] = 0 === i ? i : i - 1, l[1] = i, l[2] = i > e.length - 2 ? i : i + 1, l[3] = i > e.length - 3 ? i : i + 2, i = e[l[0]], a = e[l[1]], s = e[l[2]], h = e[l[3]], l = r * r, n = r * l, c[0] = o(i[0], a[0], s[0], h[0], r, l, n), c[1] = o(i[1], a[1], s[1], h[1], r, l, n), c[2] = o(i[2], a[2], s[2], h[2], r, l, n), c }, o = function(e, t, r, i, n, o, a) { return e = .5 * (r - e), i = .5 * (i - t), (2 * (t - r) + e + i) * a + (-3 * (t - r) - 2 * e - i) * o + e * n + t }; return function(o) { if (!1 !== this.isPlaying && (this.currentTime += o * this.timeScale, 0 !== this.weight)) { o = this.data.length, (this.currentTime > o || 0 > this.currentTime) && (this.loop ? (this.currentTime %= o, 0 > this.currentTime && (this.currentTime += o), this.reset()) : this.stop()), o = 0; for (var a = this.hierarchy.length; a > o; o++) for (var s = this.hierarchy[o], h = s.animationCache.animations[this.data.name], l = s.animationCache.blending, c = 0; 3 > c; c++) { var u = this.keyTypes[c], E = h.prevKey[u], p = h.nextKey[u]; if (0 < this.timeScale && p.time <= this.currentTime || 0 > this.timeScale && E.time >= this.currentTime) { for (E = this.data.hierarchy[o].keys[0], p = this.getNextKeyWith(u, o, 1); p.time < this.currentTime && p.index > E.index;) E = p, p = this.getNextKeyWith(u, o, p.index + 1); h.prevKey[u] = E, h.nextKey[u] = p } var d = (this.currentTime - E.time) / (p.time - E.time), f = E[u], m = p[u]; 0 > d && (d = 0), d > 1 && (d = 1), "pos" === u ? this.interpolationType === THREE.AnimationHandler.LINEAR ? (r.x = f[0] + (m[0] - f[0]) * d, r.y = f[1] + (m[1] - f[1]) * d, r.z = f[2] + (m[2] - f[2]) * d, E = this.weight / (this.weight + l.positionWeight), s.position.lerp(r, E), l.positionWeight += this.weight) : (this.interpolationType === THREE.AnimationHandler.CATMULLROM || this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD) && (e[0] = this.getPrevKeyWith("pos", o, E.index - 1).pos, e[1] = f, e[2] = m, e[3] = this.getNextKeyWith("pos", o, p.index + 1).pos, d = .33 * d + .33, p = n(e, d), E = this.weight / (this.weight + l.positionWeight), l.positionWeight += this.weight, u = s.position, u.x += (p[0] - u.x) * E, u.y += (p[1] - u.y) * E, u.z += (p[2] - u.z) * E, this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD && (d = n(e, 1.01 * d), t.set(d[0], d[1], d[2]), t.sub(u), t.y = 0, t.normalize(), d = Math.atan2(t.x, t.z), s.rotation.set(0, d, 0))) : "rot" === u ? (THREE.Quaternion.slerp(f, m, i, d), 0 === l.quaternionWeight ? (s.quaternion.copy(i), l.quaternionWeight = this.weight) : (E = this.weight / (this.weight + l.quaternionWeight), THREE.Quaternion.slerp(s.quaternion, i, s.quaternion, E), l.quaternionWeight += this.weight)) : "scl" === u && (r.x = f[0] + (m[0] - f[0]) * d, r.y = f[1] + (m[1] - f[1]) * d, r.z = f[2] + (m[2] - f[2]) * d, E = this.weight / (this.weight + l.scaleWeight), s.scale.lerp(r, E), l.scaleWeight += this.weight) } return !0 } } }(), getNextKeyWith: function(e, t, r) { var i = this.data.hierarchy[t].keys; for (r = this.interpolationType === THREE.AnimationHandler.CATMULLROM || this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ? r < i.length - 1 ? r : i.length - 1 : r % i.length; r < i.length; r++) if (void 0 !== i[r][e]) return i[r]; return this.data.hierarchy[t].keys[0] }, getPrevKeyWith: function(e, t, r) { var i = this.data.hierarchy[t].keys; for (r = this.interpolationType === THREE.AnimationHandler.CATMULLROM || this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ? r > 0 ? r : 0 : r >= 0 ? r : r + i.length; r >= 0; r--) if (void 0 !== i[r][e]) return i[r]; return this.data.hierarchy[t].keys[i.length - 1] } }, THREE.KeyFrameAnimation = function(e) { this.root = e.node, this.data = THREE.AnimationHandler.init(e), this.hierarchy = THREE.AnimationHandler.parse(this.root), this.currentTime = 0, this.timeScale = .001, this.isPlaying = !1, this.loop = this.isPaused = !0, e = 0; for (var t = this.hierarchy.length; t > e; e++) { var r = this.data.hierarchy[e].sids, i = this.hierarchy[e]; if (this.data.hierarchy[e].keys.length && r) { for (var n = 0; n < r.length; n++) { var o = r[n], a = this.getNextKeyWith(o, e, 0); a && a.apply(o) } i.matrixAutoUpdate = !1, this.data.hierarchy[e].node.updateMatrix(), i.matrixWorldNeedsUpdate = !0 } } }, THREE.KeyFrameAnimation.prototype = { constructor: THREE.KeyFrameAnimation, play: function(e) { if (this.currentTime = void 0 !== e ? e : 0, !1 === this.isPlaying) { this.isPlaying = !0; var t, r, i = this.hierarchy.length; for (e = 0; i > e; e++) t = this.hierarchy[e], r = this.data.hierarchy[e], void 0 === r.animationCache && (r.animationCache = {}, r.animationCache.prevKey = null, r.animationCache.nextKey = null, r.animationCache.originalMatrix = t.matrix), t = this.data.hierarchy[e].keys, t.length && (r.animationCache.prevKey = t[0], r.animationCache.nextKey = t[1], this.startTime = Math.min(t[0].time, this.startTime), this.endTime = Math.max(t[t.length - 1].time, this.endTime)); this.update(0) } this.isPaused = !1, THREE.AnimationHandler.play(this) }, stop: function() { this.isPaused = this.isPlaying = !1, THREE.AnimationHandler.stop(this); for (var e = 0; e < this.data.hierarchy.length; e++) { var t = this.hierarchy[e], r = this.data.hierarchy[e]; if (void 0 !== r.animationCache) { var i = r.animationCache.originalMatrix; i.copy(t.matrix), t.matrix = i, delete r.animationCache } } }, update: function(e) { if (!1 !== this.isPlaying) { this.currentTime += e * this.timeScale, e = this.data.length, !0 === this.loop && this.currentTime > e && (this.currentTime %= e), this.currentTime = Math.min(this.currentTime, e), e = 0; for (var t = this.hierarchy.length; t > e; e++) { var r = this.hierarchy[e], i = this.data.hierarchy[e], n = i.keys, i = i.animationCache; if (n.length) { var o = i.prevKey, a = i.nextKey; if (a.time <= this.currentTime) { for (; a.time < this.currentTime && a.index > o.index;) o = a, a = n[o.index + 1]; i.prevKey = o, i.nextKey = a } a.time >= this.currentTime ? o.interpolate(a, this.currentTime) : o.interpolate(a, a.time), this.data.hierarchy[e].node.updateMatrix(), r.matrixWorldNeedsUpdate = !0 } } } }, getNextKeyWith: function(e, t, r) { for (t = this.data.hierarchy[t].keys, r %= t.length; r < t.length; r++) if (t[r].hasTarget(e)) return t[r]; return t[0] }, getPrevKeyWith: function(e, t, r) { for (t = this.data.hierarchy[t].keys, r = r >= 0 ? r : r + t.length; r >= 0; r--) if (t[r].hasTarget(e)) return t[r]; return t[t.length - 1] } }, THREE.MorphAnimation = function(e) { this.mesh = e, this.frames = e.morphTargetInfluences.length, this.currentTime = 0, this.duration = 1e3, this.loop = !0, this.currentFrame = this.lastFrame = 0, this.isPlaying = !1 }, THREE.MorphAnimation.prototype = { constructor: THREE.MorphAnimation, play: function() { this.isPlaying = !0 }, pause: function() { this.isPlaying = !1 }, update: function(e) { if (!1 !== this.isPlaying) { this.currentTime += e, !0 === this.loop && this.currentTime > this.duration && (this.currentTime %= this.duration), this.currentTime = Math.min(this.currentTime, this.duration), e = this.duration / this.frames; var t = Math.floor(this.currentTime / e), r = this.mesh.morphTargetInfluences; t != this.currentFrame && (r[this.lastFrame] = 0, r[this.currentFrame] = 1, r[t] = 0, this.lastFrame = this.currentFrame, this.currentFrame = t), r[t] = this.currentTime % e / e, r[this.lastFrame] = 1 - r[t] } } }, THREE.BoxGeometry = function(e, t, r, i, n, o) { function a(e, t, r, i, n, o, a, h) { var l, c = s.widthSegments, u = s.heightSegments, E = n / 2, p = o / 2, d = s.vertices.length; "x" === e && "y" === t || "y" === e && "x" === t ? l = "z" : "x" === e && "z" === t || "z" === e && "x" === t ? (l = "y", u = s.depthSegments) : ("z" === e && "y" === t || "y" === e && "z" === t) && (l = "x", c = s.depthSegments); var f = c + 1, m = u + 1, T = n / c, g = o / u, R = new THREE.Vector3; for (R[l] = a > 0 ? 1 : -1, n = 0; m > n; n++) for (o = 0; f > o; o++) { var y = new THREE.Vector3; y[e] = (o * T - E) * r, y[t] = (n * g - p) * i, y[l] = a, s.vertices.push(y) } for (n = 0; u > n; n++) for (o = 0; c > o; o++) p = o + f * n, e = o + f * (n + 1), t = o + 1 + f * (n + 1), r = o + 1 + f * n, i = new THREE.Vector2(o / c, 1 - n / u), a = new THREE.Vector2(o / c, 1 - (n + 1) / u), l = new THREE.Vector2((o + 1) / c, 1 - (n + 1) / u), E = new THREE.Vector2((o + 1) / c, 1 - n / u), p = new THREE.Face3(p + d, e + d, r + d), p.normal.copy(R), p.vertexNormals.push(R.clone(), R.clone(), R.clone()), p.materialIndex = h, s.faces.push(p), s.faceVertexUvs[0].push([i, a, E]), p = new THREE.Face3(e + d, t + d, r + d), p.normal.copy(R), p.vertexNormals.push(R.clone(), R.clone(), R.clone()), p.materialIndex = h, s.faces.push(p), s.faceVertexUvs[0].push([a.clone(), l, E.clone()]) } THREE.Geometry.call(this), this.type = "BoxGeometry", this.parameters = { width: e, height: t, depth: r, widthSegments: i, heightSegments: n, depthSegments: o }, this.widthSegments = i || 1, this.heightSegments = n || 1, this.depthSegments = o || 1; var s = this; i = e / 2, n = t / 2, o = r / 2, a("z", "y", -1, -1, r, t, i, 0), a("z", "y", 1, -1, r, t, -i, 1), a("x", "z", 1, 1, e, r, n, 2), a("x", "z", 1, -1, e, r, -n, 3), a("x", "y", 1, -1, e, t, o, 4), a("x", "y", -1, -1, e, t, -o, 5), this.mergeVertices() }, THREE.BoxGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.BoxGeometry.prototype.constructor = THREE.BoxGeometry, THREE.CircleGeometry = function(e, t, r, i) { THREE.Geometry.call(this), this.type = "CircleGeometry", this.parameters = { radius: e, segments: t, thetaStart: r, thetaLength: i }, e = e || 50, t = void 0 !== t ? Math.max(3, t) : 8, r = void 0 !== r ? r : 0, i = void 0 !== i ? i : 2 * Math.PI; var n, o = []; n = new THREE.Vector3; var a = new THREE.Vector2(.5, .5); for (this.vertices.push(n), o.push(a), n = 0; t >= n; n++) { var s = new THREE.Vector3, h = r + n / t * i; s.x = e * Math.cos(h), s.y = e * Math.sin(h), this.vertices.push(s), o.push(new THREE.Vector2((s.x / e + 1) / 2, (s.y / e + 1) / 2)) } for (r = new THREE.Vector3(0, 0, 1), n = 1; t >= n; n++) this.faces.push(new THREE.Face3(n, n + 1, 0, [r.clone(), r.clone(), r.clone()])), this.faceVertexUvs[0].push([o[n].clone(), o[n + 1].clone(), a.clone()]); this.computeFaceNormals(), this.boundingSphere = new THREE.Sphere(new THREE.Vector3, e) }, THREE.CircleGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.CircleGeometry.prototype.constructor = THREE.CircleGeometry, THREE.CubeGeometry = function(e, t, r, i, n, o) { return THREE.warn("THREE.CubeGeometry has been renamed to THREE.BoxGeometry."), new THREE.BoxGeometry(e, t, r, i, n, o) }, THREE.CylinderGeometry = function(e, t, r, i, n, o, a, s) { THREE.Geometry.call(this), this.type = "CylinderGeometry", this.parameters = { radiusTop: e, radiusBottom: t, height: r, radialSegments: i, heightSegments: n, openEnded: o, thetaStart: a, thetaLength: s }, e = void 0 !== e ? e : 20, t = void 0 !== t ? t : 20, r = void 0 !== r ? r : 100, i = i || 8, n = n || 1, o = void 0 !== o ? o : !1, a = void 0 !== a ? a : 0, s = void 0 !== s ? s : 2 * Math.PI; var h, l, c = r / 2, u = [], E = []; for (l = 0; n >= l; l++) { var p = [], d = [], f = l / n, m = f * (t - e) + e; for (h = 0; i >= h; h++) { var T = h / i, g = new THREE.Vector3; g.x = m * Math.sin(T * s + a), g.y = -f * r + c, g.z = m * Math.cos(T * s + a), this.vertices.push(g), p.push(this.vertices.length - 1), d.push(new THREE.Vector2(T, 1 - f)) } u.push(p), E.push(d) } for (r = (t - e) / r, h = 0; i > h; h++) for (0 !== e ? (a = this.vertices[u[0][h]].clone(), s = this.vertices[u[0][h + 1]].clone()) : (a = this.vertices[u[1][h]].clone(), s = this.vertices[u[1][h + 1]].clone()), a.setY(Math.sqrt(a.x * a.x + a.z * a.z) * r).normalize(), s.setY(Math.sqrt(s.x * s.x + s.z * s.z) * r).normalize(), l = 0; n > l; l++) { var p = u[l][h], d = u[l + 1][h], f = u[l + 1][h + 1], m = u[l][h + 1], T = a.clone(), g = a.clone(), R = s.clone(), y = s.clone(), v = E[l][h].clone(), H = E[l + 1][h].clone(), x = E[l + 1][h + 1].clone(), b = E[l][h + 1].clone(); this.faces.push(new THREE.Face3(p, d, m, [T, g, y])), this.faceVertexUvs[0].push([v, H, b]), this.faces.push(new THREE.Face3(d, f, m, [g.clone(), R, y.clone()])), this.faceVertexUvs[0].push([H.clone(), x, b.clone()]) } if (!1 === o && e > 0) for (this.vertices.push(new THREE.Vector3(0, c, 0)), h = 0; i > h; h++) p = u[0][h], d = u[0][h + 1], f = this.vertices.length - 1, T = new THREE.Vector3(0, 1, 0), g = new THREE.Vector3(0, 1, 0), R = new THREE.Vector3(0, 1, 0), v = E[0][h].clone(), H = E[0][h + 1].clone(), x = new THREE.Vector2(H.x, 0), this.faces.push(new THREE.Face3(p, d, f, [T, g, R])), this.faceVertexUvs[0].push([v, H, x]); if (!1 === o && t > 0) for (this.vertices.push(new THREE.Vector3(0, -c, 0)), h = 0; i > h; h++) p = u[n][h + 1], d = u[n][h], f = this.vertices.length - 1, T = new THREE.Vector3(0, -1, 0), g = new THREE.Vector3(0, -1, 0), R = new THREE.Vector3(0, -1, 0), v = E[n][h + 1].clone(), H = E[n][h].clone(), x = new THREE.Vector2(H.x, 1), this.faces.push(new THREE.Face3(p, d, f, [T, g, R])), this.faceVertexUvs[0].push([v, H, x]); this.computeFaceNormals() }, THREE.CylinderGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.CylinderGeometry.prototype.constructor = THREE.CylinderGeometry, THREE.ExtrudeGeometry = function(e, t) { "undefined" != typeof e && (THREE.Geometry.call(this), this.type = "ExtrudeGeometry", e = e instanceof Array ? e : [e], this.addShapeList(e, t), this.computeFaceNormals()) }, THREE.ExtrudeGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.ExtrudeGeometry.prototype.constructor = THREE.ExtrudeGeometry, THREE.ExtrudeGeometry.prototype.addShapeList = function(e, t) { for (var r = e.length, i = 0; r > i; i++) this.addShape(e[i], t) }, THREE.ExtrudeGeometry.prototype.addShape = function(e, t) { function r(e, t, r) { return t || THREE.error("THREE.ExtrudeGeometry: vec does not exist"), t.clone().multiplyScalar(r).add(e) } function i(e, t, r) { var i = 1, i = e.x - t.x, n = e.y - t.y, o = r.x - e.x, a = r.y - e.y, s = i * i + n * n; if (1e-10 < Math.abs(i * a - n * o)) { var h = Math.sqrt(s), l = Math.sqrt(o * o + a * a), s = t.x - n / h; if (t = t.y + i / h, o = ((r.x - a / l - s) * a - (r.y + o / l - t) * o) / (i * a - n * o), r = s + i * o - e.x, e = t + n * o - e.y, i = r * r + e * e, 2 >= i) return new THREE.Vector2(r, e); i = Math.sqrt(i / 2) } else e = !1, i > 1e-10 ? o > 1e-10 && (e = !0) : -1e-10 > i ? -1e-10 > o && (e = !0) : Math.sign(n) == Math.sign(a) && (e = !0), e ? (r = -n, e = i, i = Math.sqrt(s)) : (r = i, e = n, i = Math.sqrt(s / 2)); return new THREE.Vector2(r / i, e / i) } function n(e, t) { var r, i; for (N = e.length; 0 <= --N;) { r = N, i = N - 1, 0 > i && (i = e.length - 1); for (var n = 0, o = g + 2 * f, n = 0; o > n; n++) { var a = z * n, s = z * (n + 1), h = t + r + a, a = t + i + a, l = t + i + s, s = t + r + s, h = h + S, a = a + S, l = l + S, s = s + S; M.faces.push(new THREE.Face3(h, a, s, null, null, H)), M.faces.push(new THREE.Face3(a, l, s, null, null, H)), h = x.generateSideWallUV(M, h, a, l, s), M.faceVertexUvs[0].push([h[0], h[1], h[3]]), M.faceVertexUvs[0].push([h[1], h[2], h[3]]) } } } function o(e, t, r) { M.vertices.push(new THREE.Vector3(e, t, r)) } function a(e, t, r) { e += S, t += S, r += S, M.faces.push(new THREE.Face3(e, t, r, null, null, v)), e = x.generateTopUV(M, e, t, r), M.faceVertexUvs[0].push(e) } var s, h, l, c, u, E = void 0 !== t.amount ? t.amount : 100, p = void 0 !== t.bevelThickness ? t.bevelThickness : 6, d = void 0 !== t.bevelSize ? t.bevelSize : p - 2, f = void 0 !== t.bevelSegments ? t.bevelSegments : 3, m = void 0 !== t.bevelEnabled ? t.bevelEnabled : !0, T = void 0 !== t.curveSegments ? t.curveSegments : 12, g = void 0 !== t.steps ? t.steps : 1, R = t.extrudePath, y = !1, v = t.material, H = t.extrudeMaterial, x = void 0 !== t.UVGenerator ? t.UVGenerator : THREE.ExtrudeGeometry.WorldUVGenerator; R && (s = R.getSpacedPoints(g), y = !0, m = !1, h = void 0 !== t.frames ? t.frames : new THREE.TubeGeometry.FrenetFrames(R, g, !1), l = new THREE.Vector3, c = new THREE.Vector3, u = new THREE.Vector3), m || (d = p = f = 0); var b, w, _, M = this, S = this.vertices.length, R = e.extractPoints(T), T = R.shape, C = R.holes; if (R = !THREE.Shape.Utils.isClockWise(T)) { for (T = T.reverse(), w = 0, _ = C.length; _ > w; w++) b = C[w], THREE.Shape.Utils.isClockWise(b) && (C[w] = b.reverse()); R = !1 } var A = THREE.Shape.Utils.triangulateShape(T, C), L = T; for (w = 0, _ = C.length; _ > w; w++) b = C[w], T = T.concat(b); var P, F, B, U, D, V, z = T.length, k = A.length, R = [], N = 0; for (B = L.length, P = B - 1, F = N + 1; B > N; N++, P++, F++) P === B && (P = 0), F === B && (F = 0), R[N] = i(L[N], L[P], L[F]); var O, G = [], I = R.concat(); for (w = 0, _ = C.length; _ > w; w++) { for (b = C[w], O = [], N = 0, B = b.length, P = B - 1, F = N + 1; B > N; N++, P++, F++) P === B && (P = 0), F === B && (F = 0), O[N] = i(b[N], b[P], b[F]); G.push(O), I = I.concat(O) } for (P = 0; f > P; P++) { for (B = P / f, U = p * (1 - B), F = d * Math.sin(B * Math.PI / 2), N = 0, B = L.length; B > N; N++) D = r(L[N], R[N], F), o(D.x, D.y, -U); for (w = 0, _ = C.length; _ > w; w++) for (b = C[w], O = G[w], N = 0, B = b.length; B > N; N++) D = r(b[N], O[N], F), o(D.x, D.y, -U) } for (F = d, N = 0; z > N; N++) D = m ? r(T[N], I[N], F) : T[N], y ? (c.copy(h.normals[0]).multiplyScalar(D.x), l.copy(h.binormals[0]).multiplyScalar(D.y), u.copy(s[0]).add(c).add(l), o(u.x, u.y, u.z)) : o(D.x, D.y, 0); for (B = 1; g >= B; B++) for (N = 0; z > N; N++) D = m ? r(T[N], I[N], F) : T[N], y ? (c.copy(h.normals[B]).multiplyScalar(D.x), l.copy(h.binormals[B]).multiplyScalar(D.y), u.copy(s[B]).add(c).add(l), o(u.x, u.y, u.z)) : o(D.x, D.y, E / g * B); for (P = f - 1; P >= 0; P--) { for (B = P / f, U = p * (1 - B), F = d * Math.sin(B * Math.PI / 2), N = 0, B = L.length; B > N; N++) D = r(L[N], R[N], F), o(D.x, D.y, E + U); for (w = 0, _ = C.length; _ > w; w++) for (b = C[w], O = G[w], N = 0, B = b.length; B > N; N++) D = r(b[N], O[N], F), y ? o(D.x, D.y + s[g - 1].y, s[g - 1].x + U) : o(D.x, D.y, E + U) }! function() { if (m) { var e; for (e = 0 * z, N = 0; k > N; N++) V = A[N], a(V[2] + e, V[1] + e, V[0] + e); for (e = g + 2 * f, e *= z, N = 0; k > N; N++) V = A[N], a(V[0] + e, V[1] + e, V[2] + e) } else { for (N = 0; k > N; N++) V = A[N], a(V[2], V[1], V[0]); for (N = 0; k > N; N++) V = A[N], a(V[0] + z * g, V[1] + z * g, V[2] + z * g) } }(), function() { var e = 0; for (n(L, e), e += L.length, w = 0, _ = C.length; _ > w; w++) b = C[w], n(b, e), e += b.length }() }, THREE.ExtrudeGeometry.WorldUVGenerator = { generateTopUV: function(e, t, r, i) { return e = e.vertices, t = e[t], r = e[r], i = e[i], [new THREE.Vector2(t.x, t.y), new THREE.Vector2(r.x, r.y), new THREE.Vector2(i.x, i.y)] }, generateSideWallUV: function(e, t, r, i, n) { return e = e.vertices, t = e[t], r = e[r], i = e[i], n = e[n], .01 > Math.abs(t.y - r.y) ? [new THREE.Vector2(t.x, 1 - t.z), new THREE.Vector2(r.x, 1 - r.z), new THREE.Vector2(i.x, 1 - i.z), new THREE.Vector2(n.x, 1 - n.z)] : [new THREE.Vector2(t.y, 1 - t.z), new THREE.Vector2(r.y, 1 - r.z), new THREE.Vector2(i.y, 1 - i.z), new THREE.Vector2(n.y, 1 - n.z)] } }, THREE.ShapeGeometry = function(e, t) { THREE.Geometry.call(this), this.type = "ShapeGeometry", !1 == e instanceof Array && (e = [e]), this.addShapeList(e, t), this.computeFaceNormals() }, THREE.ShapeGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.ShapeGeometry.prototype.constructor = THREE.ShapeGeometry, THREE.ShapeGeometry.prototype.addShapeList = function(e, t) { for (var r = 0, i = e.length; i > r; r++) this.addShape(e[r], t); return this }, THREE.ShapeGeometry.prototype.addShape = function(e, t) { void 0 === t && (t = {}); var r, i, n, o = t.material, a = void 0 === t.UVGenerator ? THREE.ExtrudeGeometry.WorldUVGenerator : t.UVGenerator, s = this.vertices.length; r = e.extractPoints(void 0 !== t.curveSegments ? t.curveSegments : 12); var h = r.shape, l = r.holes; if (!THREE.Shape.Utils.isClockWise(h)) for (h = h.reverse(), r = 0, i = l.length; i > r; r++) n = l[r], THREE.Shape.Utils.isClockWise(n) && (l[r] = n.reverse()); var c = THREE.Shape.Utils.triangulateShape(h, l); for (r = 0, i = l.length; i > r; r++) n = l[r], h = h.concat(n); for (l = h.length, i = c.length, r = 0; l > r; r++) n = h[r], this.vertices.push(new THREE.Vector3(n.x, n.y, 0)); for (r = 0; i > r; r++) l = c[r], h = l[0] + s, n = l[1] + s, l = l[2] + s, this.faces.push(new THREE.Face3(h, n, l, null, null, o)), this.faceVertexUvs[0].push(a.generateTopUV(this, h, n, l)) }, THREE.LatheGeometry = function(e, t, r, i) { THREE.Geometry.call(this), this.type = "LatheGeometry", this.parameters = { points: e, segments: t, phiStart: r, phiLength: i }, t = t || 12, r = r || 0, i = i || 2 * Math.PI; for (var n = 1 / (e.length - 1), o = 1 / t, a = 0, s = t; s >= a; a++) for (var h = r + a * o * i, l = Math.cos(h), c = Math.sin(h), h = 0, u = e.length; u > h; h++) { var E = e[h], p = new THREE.Vector3; p.x = l * E.x - c * E.y, p.y = c * E.x + l * E.y, p.z = E.z, this.vertices.push(p) } for (r = e.length, a = 0, s = t; s > a; a++) for (h = 0, u = e.length - 1; u > h; h++) { t = c = h + r * a, i = c + r; var l = c + 1 + r, c = c + 1, E = a * o, p = h * n, d = E + o, f = p + n; this.faces.push(new THREE.Face3(t, i, c)), this.faceVertexUvs[0].push([new THREE.Vector2(E, p), new THREE.Vector2(d, p), new THREE.Vector2(E, f)]), this.faces.push(new THREE.Face3(i, l, c)), this.faceVertexUvs[0].push([new THREE.Vector2(d, p), new THREE.Vector2(d, f), new THREE.Vector2(E, f)]) } this.mergeVertices(), this.computeFaceNormals(), this.computeVertexNormals() }, THREE.LatheGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.LatheGeometry.prototype.constructor = THREE.LatheGeometry, THREE.PlaneGeometry = function(e, t, r, i) { console.info("THREE.PlaneGeometry: Consider using THREE.PlaneBufferGeometry for lower memory footprint."), THREE.Geometry.call(this), this.type = "PlaneGeometry", this.parameters = { width: e, height: t, widthSegments: r, heightSegments: i }, this.fromBufferGeometry(new THREE.PlaneBufferGeometry(e, t, r, i)) }, THREE.PlaneGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.PlaneGeometry.prototype.constructor = THREE.PlaneGeometry, THREE.PlaneBufferGeometry = function(e, t, r, i) { THREE.BufferGeometry.call(this), this.type = "PlaneBufferGeometry", this.parameters = { width: e, height: t, widthSegments: r, heightSegments: i }; var n = e / 2, o = t / 2; r = r || 1, i = i || 1; var a = r + 1, s = i + 1, h = e / r, l = t / i; t = new Float32Array(a * s * 3), e = new Float32Array(a * s * 3); for (var c = new Float32Array(a * s * 2), u = 0, E = 0, p = 0; s > p; p++) for (var d = p * l - o, f = 0; a > f; f++) t[u] = f * h - n, t[u + 1] = -d, e[u + 2] = 1, c[E] = f / r, c[E + 1] = 1 - p / i, u += 3, E += 2; for (u = 0, n = new(65535 < t.length / 3 ? Uint32Array : Uint16Array)(r * i * 6), p = 0; i > p; p++) for (f = 0; r > f; f++) o = f + a * (p + 1), s = f + 1 + a * (p + 1), h = f + 1 + a * p, n[u] = f + a * p, n[u + 1] = o, n[u + 2] = h, n[u + 3] = o, n[u + 4] = s, n[u + 5] = h, u += 6; this.addAttribute("index", new THREE.BufferAttribute(n, 1)), this.addAttribute("position", new THREE.BufferAttribute(t, 3)), this.addAttribute("normal", new THREE.BufferAttribute(e, 3)), this.addAttribute("uv", new THREE.BufferAttribute(c, 2)) }, THREE.PlaneBufferGeometry.prototype = Object.create(THREE.BufferGeometry.prototype), THREE.PlaneBufferGeometry.prototype.constructor = THREE.PlaneBufferGeometry, THREE.RingGeometry = function(e, t, r, i, n, o) { THREE.Geometry.call(this), this.type = "RingGeometry", this.parameters = { innerRadius: e, outerRadius: t, thetaSegments: r, phiSegments: i, thetaStart: n, thetaLength: o }, e = e || 0, t = t || 50, n = void 0 !== n ? n : 0, o = void 0 !== o ? o : 2 * Math.PI, r = void 0 !== r ? Math.max(3, r) : 8, i = void 0 !== i ? Math.max(1, i) : 8; var a, s = [], h = e, l = (t - e) / i; for (e = 0; i + 1 > e; e++) { for (a = 0; r + 1 > a; a++) { var c = new THREE.Vector3, u = n + a / r * o; c.x = h * Math.cos(u), c.y = h * Math.sin(u), this.vertices.push(c), s.push(new THREE.Vector2((c.x / t + 1) / 2, (c.y / t + 1) / 2)) } h += l } for (t = new THREE.Vector3(0, 0, 1), e = 0; i > e; e++) for (n = e * (r + 1), a = 0; r > a; a++) o = u = a + n, l = u + r + 1, c = u + r + 2, this.faces.push(new THREE.Face3(o, l, c, [t.clone(), t.clone(), t.clone()])), this.faceVertexUvs[0].push([s[o].clone(), s[l].clone(), s[c].clone()]), o = u, l = u + r + 2, c = u + 1, this.faces.push(new THREE.Face3(o, l, c, [t.clone(), t.clone(), t.clone()])), this.faceVertexUvs[0].push([s[o].clone(), s[l].clone(), s[c].clone()]); this.computeFaceNormals(), this.boundingSphere = new THREE.Sphere(new THREE.Vector3, h) }, THREE.RingGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.RingGeometry.prototype.constructor = THREE.RingGeometry, THREE.SphereGeometry = function(e, t, r, i, n, o, a) { THREE.Geometry.call(this), this.type = "SphereGeometry", this.parameters = { radius: e, widthSegments: t, heightSegments: r, phiStart: i, phiLength: n, thetaStart: o, thetaLength: a }, e = e || 50, t = Math.max(3, Math.floor(t) || 8), r = Math.max(2, Math.floor(r) || 6), i = void 0 !== i ? i : 0, n = void 0 !== n ? n : 2 * Math.PI, o = void 0 !== o ? o : 0, a = void 0 !== a ? a : Math.PI; var s, h, l = [], c = []; for (h = 0; r >= h; h++) { var u = [], E = []; for (s = 0; t >= s; s++) { var p = s / t, d = h / r, f = new THREE.Vector3; f.x = -e * Math.cos(i + p * n) * Math.sin(o + d * a), f.y = e * Math.cos(o + d * a), f.z = e * Math.sin(i + p * n) * Math.sin(o + d * a), this.vertices.push(f), u.push(this.vertices.length - 1), E.push(new THREE.Vector2(p, 1 - d)) } l.push(u), c.push(E) } for (h = 0; r > h; h++) for (s = 0; t > s; s++) { i = l[h][s + 1], n = l[h][s], o = l[h + 1][s], a = l[h + 1][s + 1]; var u = this.vertices[i].clone().normalize(), E = this.vertices[n].clone().normalize(), p = this.vertices[o].clone().normalize(), d = this.vertices[a].clone().normalize(), f = c[h][s + 1].clone(), m = c[h][s].clone(), T = c[h + 1][s].clone(), g = c[h + 1][s + 1].clone(); Math.abs(this.vertices[i].y) === e ? (f.x = (f.x + m.x) / 2, this.faces.push(new THREE.Face3(i, o, a, [u, p, d])), this.faceVertexUvs[0].push([f, T, g])) : Math.abs(this.vertices[o].y) === e ? (T.x = (T.x + g.x) / 2, this.faces.push(new THREE.Face3(i, n, o, [u, E, p])), this.faceVertexUvs[0].push([f, m, T])) : (this.faces.push(new THREE.Face3(i, n, a, [u, E, d])), this.faceVertexUvs[0].push([f, m, g]), this.faces.push(new THREE.Face3(n, o, a, [E.clone(), p, d.clone()])), this.faceVertexUvs[0].push([m.clone(), T, g.clone()])) } this.computeFaceNormals(), this.boundingSphere = new THREE.Sphere(new THREE.Vector3, e) }, THREE.SphereGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.SphereGeometry.prototype.constructor = THREE.SphereGeometry, THREE.TextGeometry = function(e, t) { t = t || {}; var r = THREE.FontUtils.generateShapes(e, t); t.amount = void 0 !== t.height ? t.height : 50, void 0 === t.bevelThickness && (t.bevelThickness = 10), void 0 === t.bevelSize && (t.bevelSize = 8), void 0 === t.bevelEnabled && (t.bevelEnabled = !1), THREE.ExtrudeGeometry.call(this, r, t), this.type = "TextGeometry" }, THREE.TextGeometry.prototype = Object.create(THREE.ExtrudeGeometry.prototype), THREE.TextGeometry.prototype.constructor = THREE.TextGeometry, THREE.TorusGeometry = function(e, t, r, i, n) { THREE.Geometry.call(this), this.type = "TorusGeometry", this.parameters = { radius: e, tube: t, radialSegments: r, tubularSegments: i, arc: n }, e = e || 100, t = t || 40, r = r || 8, i = i || 6, n = n || 2 * Math.PI; for (var o = new THREE.Vector3, a = [], s = [], h = 0; r >= h; h++) for (var l = 0; i >= l; l++) { var c = l / i * n, u = h / r * Math.PI * 2; o.x = e * Math.cos(c), o.y = e * Math.sin(c); var E = new THREE.Vector3; E.x = (e + t * Math.cos(u)) * Math.cos(c), E.y = (e + t * Math.cos(u)) * Math.sin(c), E.z = t * Math.sin(u), this.vertices.push(E), a.push(new THREE.Vector2(l / i, h / r)), s.push(E.clone().sub(o).normalize()) } for (h = 1; r >= h; h++) for (l = 1; i >= l; l++) e = (i + 1) * h + l - 1, t = (i + 1) * (h - 1) + l - 1, n = (i + 1) * (h - 1) + l, o = (i + 1) * h + l, c = new THREE.Face3(e, t, o, [s[e].clone(), s[t].clone(), s[o].clone()]), this.faces.push(c), this.faceVertexUvs[0].push([a[e].clone(), a[t].clone(), a[o].clone()]), c = new THREE.Face3(t, n, o, [s[t].clone(), s[n].clone(), s[o].clone()]), this.faces.push(c), this.faceVertexUvs[0].push([a[t].clone(), a[n].clone(), a[o].clone()]); this.computeFaceNormals() }, THREE.TorusGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.TorusGeometry.prototype.constructor = THREE.TorusGeometry, THREE.TorusKnotGeometry = function(e, t, r, i, n, o, a) { function s(e, t, r, i, n) { var o = Math.cos(e), a = Math.sin(e); return e *= t / r, t = Math.cos(e), o *= i * (2 + t) * .5, a = i * (2 + t) * a * .5, i = n * i * Math.sin(e) * .5, new THREE.Vector3(o, a, i) } THREE.Geometry.call(this), this.type = "TorusKnotGeometry", this.parameters = { radius: e, tube: t, radialSegments: r, tubularSegments: i, p: n, q: o, heightScale: a }, e = e || 100, t = t || 40, r = r || 64, i = i || 8, n = n || 2, o = o || 3, a = a || 1; for (var h = Array(r), l = new THREE.Vector3, c = new THREE.Vector3, u = new THREE.Vector3, E = 0; r > E; ++E) { h[E] = Array(i); var p = E / r * 2 * n * Math.PI, d = s(p, o, n, e, a), p = s(p + .01, o, n, e, a); for (l.subVectors(p, d), c.addVectors(p, d), u.crossVectors(l, c), c.crossVectors(u, l), u.normalize(), c.normalize(), p = 0; i > p; ++p) { var f = p / i * 2 * Math.PI, m = -t * Math.cos(f), f = t * Math.sin(f), T = new THREE.Vector3; T.x = d.x + m * c.x + f * u.x, T.y = d.y + m * c.y + f * u.y, T.z = d.z + m * c.z + f * u.z, h[E][p] = this.vertices.push(T) - 1 } } for (E = 0; r > E; ++E) for (p = 0; i > p; ++p) n = (E + 1) % r, o = (p + 1) % i, e = h[E][p], t = h[n][p], n = h[n][o], o = h[E][o], a = new THREE.Vector2(E / r, p / i), l = new THREE.Vector2((E + 1) / r, p / i), c = new THREE.Vector2((E + 1) / r, (p + 1) / i), u = new THREE.Vector2(E / r, (p + 1) / i), this.faces.push(new THREE.Face3(e, t, o)), this.faceVertexUvs[0].push([a, l, u]), this.faces.push(new THREE.Face3(t, n, o)), this.faceVertexUvs[0].push([l.clone(), c, u.clone()]); this.computeFaceNormals(), this.computeVertexNormals() }, THREE.TorusKnotGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.TorusKnotGeometry.prototype.constructor = THREE.TorusKnotGeometry, THREE.TubeGeometry = function(e, t, r, i, n, o) { THREE.Geometry.call(this), this.type = "TubeGeometry", this.parameters = { path: e, segments: t, radius: r, radialSegments: i, closed: n }, t = t || 64, r = r || 1, i = i || 8, n = n || !1, o = o || THREE.TubeGeometry.NoTaper; var a, s, h, l, c, u, E, p, d, f, m = [], T = t + 1, g = new THREE.Vector3; for (p = new THREE.TubeGeometry.FrenetFrames(e, t, n), d = p.normals, f = p.binormals, this.tangents = p.tangents, this.normals = d, this.binormals = f, p = 0; T > p; p++) for (m[p] = [], h = p / (T - 1), E = e.getPointAt(h), a = d[p], s = f[p], c = r * o(h), h = 0; i > h; h++) l = h / i * 2 * Math.PI, u = -c * Math.cos(l), l = c * Math.sin(l), g.copy(E), g.x += u * a.x + l * s.x, g.y += u * a.y + l * s.y, g.z += u * a.z + l * s.z, m[p][h] = this.vertices.push(new THREE.Vector3(g.x, g.y, g.z)) - 1; for (p = 0; t > p; p++) for (h = 0; i > h; h++) o = n ? (p + 1) % t : p + 1, T = (h + 1) % i, e = m[p][h], r = m[o][h], o = m[o][T], T = m[p][T], g = new THREE.Vector2(p / t, h / i), d = new THREE.Vector2((p + 1) / t, h / i), f = new THREE.Vector2((p + 1) / t, (h + 1) / i), a = new THREE.Vector2(p / t, (h + 1) / i), this.faces.push(new THREE.Face3(e, r, T)), this.faceVertexUvs[0].push([g, d, a]), this.faces.push(new THREE.Face3(r, o, T)), this.faceVertexUvs[0].push([d.clone(), f, a.clone()]); this.computeFaceNormals(), this.computeVertexNormals() }, THREE.TubeGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.TubeGeometry.prototype.constructor = THREE.TubeGeometry, THREE.TubeGeometry.NoTaper = function(e) { return 1 }, THREE.TubeGeometry.SinusoidalTaper = function(e) { return Math.sin(Math.PI * e) }, THREE.TubeGeometry.FrenetFrames = function(e, t, r) { var i = new THREE.Vector3, n = [], o = [], a = [], s = new THREE.Vector3, h = new THREE.Matrix4; t += 1; var l, c, u; for (this.tangents = n, this.normals = o, this.binormals = a, l = 0; t > l; l++) c = l / (t - 1), n[l] = e.getTangentAt(c), n[l].normalize(); for (o[0] = new THREE.Vector3, a[0] = new THREE.Vector3, e = Number.MAX_VALUE, l = Math.abs(n[0].x), c = Math.abs(n[0].y), u = Math.abs(n[0].z), e >= l && (e = l, i.set(1, 0, 0)), e >= c && (e = c, i.set(0, 1, 0)), e >= u && i.set(0, 0, 1), s.crossVectors(n[0], i).normalize(), o[0].crossVectors(n[0], s), a[0].crossVectors(n[0], o[0]), l = 1; t > l; l++) o[l] = o[l - 1].clone(), a[l] = a[l - 1].clone(), s.crossVectors(n[l - 1], n[l]), 1e-4 < s.length() && (s.normalize(), i = Math.acos(THREE.Math.clamp(n[l - 1].dot(n[l]), -1, 1)), o[l].applyMatrix4(h.makeRotationAxis(s, i))), a[l].crossVectors(n[l], o[l]); if (r) for (i = Math.acos(THREE.Math.clamp(o[0].dot(o[t - 1]), -1, 1)), i /= t - 1, 0 < n[0].dot(s.crossVectors(o[0], o[t - 1])) && (i = -i), l = 1; t > l; l++) o[l].applyMatrix4(h.makeRotationAxis(n[l], i * l)), a[l].crossVectors(n[l], o[l]) }, THREE.PolyhedronGeometry = function(e, t, r, i) { function n(e) { var t = e.normalize().clone(); t.index = h.vertices.push(t) - 1; var r = Math.atan2(e.z, -e.x) / 2 / Math.PI + .5; return e = Math.atan2(-e.y, Math.sqrt(e.x * e.x + e.z * e.z)) / Math.PI + .5, t.uv = new THREE.Vector2(r, 1 - e), t } function o(e, t, r) { var i = new THREE.Face3(e.index, t.index, r.index, [e.clone(), t.clone(), r.clone()]); h.faces.push(i), m.copy(e).add(t).add(r).divideScalar(3), i = Math.atan2(m.z, -m.x), h.faceVertexUvs[0].push([s(e.uv, e, i), s(t.uv, t, i), s(r.uv, r, i)]) } function a(e, t) { for (var r = Math.pow(2, t), i = n(h.vertices[e.a]), a = n(h.vertices[e.b]), s = n(h.vertices[e.c]), l = [], c = 0; r >= c; c++) { l[c] = []; for (var u = n(i.clone().lerp(s, c / r)), E = n(a.clone().lerp(s, c / r)), p = r - c, d = 0; p >= d; d++) l[c][d] = 0 == d && c == r ? u : n(u.clone().lerp(E, d / p)) } for (c = 0; r > c; c++) for (d = 0; 2 * (r - c) - 1 > d; d++) i = Math.floor(d / 2), 0 == d % 2 ? o(l[c][i + 1], l[c + 1][i], l[c][i]) : o(l[c][i + 1], l[c + 1][i + 1], l[c + 1][i]) } function s(e, t, r) { return 0 > r && 1 === e.x && (e = new THREE.Vector2(e.x - 1, e.y)), 0 === t.x && 0 === t.z && (e = new THREE.Vector2(r / 2 / Math.PI + .5, e.y)), e.clone() } THREE.Geometry.call(this), this.type = "PolyhedronGeometry", this.parameters = { vertices: e, indices: t, radius: r, detail: i }, r = r || 1, i = i || 0; for (var h = this, l = 0, c = e.length; c > l; l += 3) n(new THREE.Vector3(e[l], e[l + 1], e[l + 2])); e = this.vertices; for (var u = [], E = l = 0, c = t.length; c > l; l += 3, E++) { var p = e[t[l]], d = e[t[l + 1]], f = e[t[l + 2]]; u[E] = new THREE.Face3(p.index, d.index, f.index, [p.clone(), d.clone(), f.clone()]) } for (var m = new THREE.Vector3, l = 0, c = u.length; c > l; l++) a(u[l], i); for (l = 0, c = this.faceVertexUvs[0].length; c > l; l++) t = this.faceVertexUvs[0][l], i = t[0].x, e = t[1].x, u = t[2].x, E = Math.max(i, Math.max(e, u)), p = Math.min(i, Math.min(e, u)), E > .9 && .1 > p && (.2 > i && (t[0].x += 1), .2 > e && (t[1].x += 1), .2 > u && (t[2].x += 1)); for (l = 0, c = this.vertices.length; c > l; l++) this.vertices[l].multiplyScalar(r); this.mergeVertices(), this.computeFaceNormals(), this.boundingSphere = new THREE.Sphere(new THREE.Vector3, r) }, THREE.PolyhedronGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.PolyhedronGeometry.prototype.constructor = THREE.PolyhedronGeometry, THREE.DodecahedronGeometry = function(e, t) { this.parameters = { radius: e, detail: t }; var r = (1 + Math.sqrt(5)) / 2, i = 1 / r; THREE.PolyhedronGeometry.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, -i, -r, 0, -i, r, 0, i, -r, 0, i, r, -i, -r, 0, -i, r, 0, i, -r, 0, i, r, 0, -r, 0, -i, r, 0, -i, -r, 0, i, r, 0, i], [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], e, t) }, THREE.DodecahedronGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.DodecahedronGeometry.prototype.constructor = THREE.DodecahedronGeometry, THREE.IcosahedronGeometry = function(e, t) { var r = (1 + Math.sqrt(5)) / 2; THREE.PolyhedronGeometry.call(this, [-1, r, 0, 1, r, 0, -1, -r, 0, 1, -r, 0, 0, -1, r, 0, 1, r, 0, -1, -r, 0, 1, -r, r, 0, -1, r, 0, 1, -r, 0, -1, -r, 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], e, t), this.type = "IcosahedronGeometry", this.parameters = { radius: e, detail: t } }, THREE.IcosahedronGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.IcosahedronGeometry.prototype.constructor = THREE.IcosahedronGeometry, THREE.OctahedronGeometry = function(e, t) { this.parameters = { radius: e, detail: t }, THREE.PolyhedronGeometry.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], e, t), this.type = "OctahedronGeometry", this.parameters = { radius: e, detail: t } }, THREE.OctahedronGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.OctahedronGeometry.prototype.constructor = THREE.OctahedronGeometry, THREE.TetrahedronGeometry = function(e, t) { THREE.PolyhedronGeometry.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], e, t), this.type = "TetrahedronGeometry", this.parameters = { radius: e, detail: t } }, THREE.TetrahedronGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.TetrahedronGeometry.prototype.constructor = THREE.TetrahedronGeometry, THREE.ParametricGeometry = function(e, t, r) { THREE.Geometry.call(this), this.type = "ParametricGeometry", this.parameters = { func: e, slices: t, stacks: r }; var i, n, o, a, s = this.vertices, h = this.faces, l = this.faceVertexUvs[0], c = t + 1; for (i = 0; r >= i; i++) for (a = i / r, n = 0; t >= n; n++) o = n / t, o = e(o, a), s.push(o); var u, E, p, d; for (i = 0; r > i; i++) for (n = 0; t > n; n++) e = i * c + n, s = i * c + n + 1, a = (i + 1) * c + n + 1, o = (i + 1) * c + n, u = new THREE.Vector2(n / t, i / r), E = new THREE.Vector2((n + 1) / t, i / r), p = new THREE.Vector2((n + 1) / t, (i + 1) / r), d = new THREE.Vector2(n / t, (i + 1) / r), h.push(new THREE.Face3(e, s, o)), l.push([u, E, d]), h.push(new THREE.Face3(s, a, o)), l.push([E.clone(), p, d.clone()]); this.computeFaceNormals(), this.computeVertexNormals() }, THREE.ParametricGeometry.prototype = Object.create(THREE.Geometry.prototype), THREE.ParametricGeometry.prototype.constructor = THREE.ParametricGeometry, THREE.AxisHelper = function(e) { e = e || 1; var t = new Float32Array([0, 0, 0, e, 0, 0, 0, 0, 0, 0, e, 0, 0, 0, 0, 0, 0, e]), r = new Float32Array([1, 0, 0, 1, .6, 0, 0, 1, 0, .6, 1, 0, 0, 0, 1, 0, .6, 1]); e = new THREE.BufferGeometry, e.addAttribute("position", new THREE.BufferAttribute(t, 3)), e.addAttribute("color", new THREE.BufferAttribute(r, 3)), t = new THREE.LineBasicMaterial({ vertexColors: THREE.VertexColors }), THREE.Line.call(this, e, t, THREE.LinePieces) }, THREE.AxisHelper.prototype = Object.create(THREE.Line.prototype), THREE.AxisHelper.prototype.constructor = THREE.AxisHelper, THREE.ArrowHelper = function() { var e = new THREE.Geometry; e.vertices.push(new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 1, 0)); var t = new THREE.CylinderGeometry(0, .5, 1, 5, 1); return t.applyMatrix((new THREE.Matrix4).makeTranslation(0, -.5, 0)), function(r, i, n, o, a, s) { THREE.Object3D.call(this), void 0 === o && (o = 16776960), void 0 === n && (n = 1), void 0 === a && (a = .2 * n), void 0 === s && (s = .2 * a), this.position.copy(i), this.line = new THREE.Line(e, new THREE.LineBasicMaterial({ color: o })), this.line.matrixAutoUpdate = !1, this.add(this.line), this.cone = new THREE.Mesh(t, new THREE.MeshBasicMaterial({ color: o })), this.cone.matrixAutoUpdate = !1, this.add(this.cone), this.setDirection(r), this.setLength(n, a, s) } }(), THREE.ArrowHelper.prototype = Object.create(THREE.Object3D.prototype), THREE.ArrowHelper.prototype.constructor = THREE.ArrowHelper, THREE.ArrowHelper.prototype.setDirection = function() { var e, t = new THREE.Vector3; return function(r) { .99999 < r.y ? this.quaternion.set(0, 0, 0, 1) : -.99999 > r.y ? this.quaternion.set(1, 0, 0, 0) : (t.set(r.z, 0, -r.x).normalize(), e = Math.acos(r.y), this.quaternion.setFromAxisAngle(t, e)) } }(), THREE.ArrowHelper.prototype.setLength = function(e, t, r) { void 0 === t && (t = .2 * e), void 0 === r && (r = .2 * t), this.line.scale.set(1, e - t, 1), this.line.updateMatrix(), this.cone.scale.set(r, t, r), this.cone.position.y = e, this.cone.updateMatrix() }, THREE.ArrowHelper.prototype.setColor = function(e) { this.line.material.color.set(e), this.cone.material.color.set(e) }, THREE.BoxHelper = function(e) { var t = new THREE.BufferGeometry; t.addAttribute("position", new THREE.BufferAttribute(new Float32Array(72), 3)), THREE.Line.call(this, t, new THREE.LineBasicMaterial({ color: 16776960 }), THREE.LinePieces), void 0 !== e && this.update(e) }, THREE.BoxHelper.prototype = Object.create(THREE.Line.prototype), THREE.BoxHelper.prototype.constructor = THREE.BoxHelper, THREE.BoxHelper.prototype.update = function(e) { var t = e.geometry; null === t.boundingBox && t.computeBoundingBox(); var r = t.boundingBox.min, t = t.boundingBox.max, i = this.geometry.attributes.position.array; i[0] = t.x, i[1] = t.y, i[2] = t.z, i[3] = r.x, i[4] = t.y, i[5] = t.z, i[6] = r.x, i[7] = t.y, i[8] = t.z, i[9] = r.x, i[10] = r.y, i[11] = t.z, i[12] = r.x, i[13] = r.y, i[14] = t.z, i[15] = t.x, i[16] = r.y, i[17] = t.z, i[18] = t.x, i[19] = r.y, i[20] = t.z, i[21] = t.x, i[22] = t.y, i[23] = t.z, i[24] = t.x, i[25] = t.y, i[26] = r.z, i[27] = r.x, i[28] = t.y, i[29] = r.z, i[30] = r.x, i[31] = t.y, i[32] = r.z, i[33] = r.x, i[34] = r.y, i[35] = r.z, i[36] = r.x, i[37] = r.y, i[38] = r.z, i[39] = t.x, i[40] = r.y, i[41] = r.z, i[42] = t.x, i[43] = r.y, i[44] = r.z, i[45] = t.x, i[46] = t.y, i[47] = r.z, i[48] = t.x, i[49] = t.y, i[50] = t.z, i[51] = t.x, i[52] = t.y, i[53] = r.z, i[54] = r.x, i[55] = t.y, i[56] = t.z, i[57] = r.x, i[58] = t.y, i[59] = r.z, i[60] = r.x, i[61] = r.y, i[62] = t.z, i[63] = r.x, i[64] = r.y, i[65] = r.z, i[66] = t.x, i[67] = r.y, i[68] = t.z, i[69] = t.x, i[70] = r.y, i[71] = r.z, this.geometry.attributes.position.needsUpdate = !0, this.geometry.computeBoundingSphere(), this.matrix = e.matrixWorld, this.matrixAutoUpdate = !1 }, THREE.BoundingBoxHelper = function(e, t) { var r = void 0 !== t ? t : 8947848; this.object = e, this.box = new THREE.Box3, THREE.Mesh.call(this, new THREE.BoxGeometry(1, 1, 1), new THREE.MeshBasicMaterial({ color: r, wireframe: !0 })) }, THREE.BoundingBoxHelper.prototype = Object.create(THREE.Mesh.prototype), THREE.BoundingBoxHelper.prototype.constructor = THREE.BoundingBoxHelper, THREE.BoundingBoxHelper.prototype.update = function() { this.box.setFromObject(this.object), this.box.size(this.scale), this.box.center(this.position) }, THREE.CameraHelper = function(e) { function t(e, t, i) { r(e, i), r(t, i) } function r(e, t) { i.vertices.push(new THREE.Vector3), i.colors.push(new THREE.Color(t)), void 0 === o[e] && (o[e] = []), o[e].push(i.vertices.length - 1) } var i = new THREE.Geometry, n = new THREE.LineBasicMaterial({ color: 16777215, vertexColors: THREE.FaceColors }), o = {}; t("n1", "n2", 16755200), t("n2", "n4", 16755200), t("n4", "n3", 16755200), t("n3", "n1", 16755200), t("f1", "f2", 16755200), t("f2", "f4", 16755200), t("f4", "f3", 16755200), t("f3", "f1", 16755200), t("n1", "f1", 16755200), t("n2", "f2", 16755200), t("n3", "f3", 16755200), t("n4", "f4", 16755200), t("p", "n1", 16711680), t("p", "n2", 16711680), t("p", "n3", 16711680), t("p", "n4", 16711680), t("u1", "u2", 43775), t("u2", "u3", 43775), t("u3", "u1", 43775), t("c", "t", 16777215), t("p", "c", 3355443), t("cn1", "cn2", 3355443), t("cn3", "cn4", 3355443), t("cf1", "cf2", 3355443), t("cf3", "cf4", 3355443), THREE.Line.call(this, i, n, THREE.LinePieces), this.camera = e, this.matrix = e.matrixWorld, this.matrixAutoUpdate = !1, this.pointMap = o, this.update() }, THREE.CameraHelper.prototype = Object.create(THREE.Line.prototype), THREE.CameraHelper.prototype.constructor = THREE.CameraHelper, THREE.CameraHelper.prototype.update = function() { var e, t, r = new THREE.Vector3, i = new THREE.Camera, n = function(n, o, a, s) { if (r.set(o, a, s).unproject(i), n = t[n], void 0 !== n) for (o = 0, a = n.length; a > o; o++) e.vertices[n[o]].copy(r) }; return function() { e = this.geometry, t = this.pointMap, i.projectionMatrix.copy(this.camera.projectionMatrix), n("c", 0, 0, -1), n("t", 0, 0, 1), n("n1", -1, -1, -1), n("n2", 1, -1, -1), n("n3", -1, 1, -1), n("n4", 1, 1, -1), n("f1", -1, -1, 1), n("f2", 1, -1, 1), n("f3", -1, 1, 1), n("f4", 1, 1, 1), n("u1", .7, 1.1, -1), n("u2", -.7, 1.1, -1), n("u3", 0, 2, -1), n("cf1", -1, 0, 1), n("cf2", 1, 0, 1), n("cf3", 0, -1, 1), n("cf4", 0, 1, 1), n("cn1", -1, 0, -1), n("cn2", 1, 0, -1), n("cn3", 0, -1, -1), n("cn4", 0, 1, -1), e.verticesNeedUpdate = !0 } }(), THREE.DirectionalLightHelper = function(e, t) { THREE.Object3D.call(this), this.light = e, this.light.updateMatrixWorld(), this.matrix = e.matrixWorld, this.matrixAutoUpdate = !1, t = t || 1; var r = new THREE.Geometry; r.vertices.push(new THREE.Vector3(-t, t, 0), new THREE.Vector3(t, t, 0), new THREE.Vector3(t, -t, 0), new THREE.Vector3(-t, -t, 0), new THREE.Vector3(-t, t, 0)); var i = new THREE.LineBasicMaterial({ fog: !1 }); i.color.copy(this.light.color).multiplyScalar(this.light.intensity), this.lightPlane = new THREE.Line(r, i), this.add(this.lightPlane), r = new THREE.Geometry, r.vertices.push(new THREE.Vector3, new THREE.Vector3), i = new THREE.LineBasicMaterial({ fog: !1 }), i.color.copy(this.light.color).multiplyScalar(this.light.intensity), this.targetLine = new THREE.Line(r, i), this.add(this.targetLine), this.update() }, THREE.DirectionalLightHelper.prototype = Object.create(THREE.Object3D.prototype), THREE.DirectionalLightHelper.prototype.constructor = THREE.DirectionalLightHelper, THREE.DirectionalLightHelper.prototype.dispose = function() { this.lightPlane.geometry.dispose(), this.lightPlane.material.dispose(), this.targetLine.geometry.dispose(), this.targetLine.material.dispose() }, THREE.DirectionalLightHelper.prototype.update = function() { var e = new THREE.Vector3, t = new THREE.Vector3, r = new THREE.Vector3; return function() { e.setFromMatrixPosition(this.light.matrixWorld), t.setFromMatrixPosition(this.light.target.matrixWorld), r.subVectors(t, e), this.lightPlane.lookAt(r), this.lightPlane.material.color.copy(this.light.color).multiplyScalar(this.light.intensity), this.targetLine.geometry.vertices[1].copy(r), this.targetLine.geometry.verticesNeedUpdate = !0, this.targetLine.material.color.copy(this.lightPlane.material.color) } }(), THREE.EdgesHelper = function(e, t, r) { t = void 0 !== t ? t : 16777215, r = Math.cos(THREE.Math.degToRad(void 0 !== r ? r : 1)); var i, n = [0, 0], o = {}, a = function(e, t) { return e - t }, s = ["a", "b", "c"], h = new THREE.BufferGeometry; e.geometry instanceof THREE.BufferGeometry ? (i = new THREE.Geometry, i.fromBufferGeometry(e.geometry)) : i = e.geometry.clone(), i.mergeVertices(), i.computeFaceNormals(); var l = i.vertices; i = i.faces; for (var c = 0, u = 0, E = i.length; E > u; u++) for (var p = i[u], d = 0; 3 > d; d++) { n[0] = p[s[d]], n[1] = p[s[(d + 1) % 3]], n.sort(a); var f = n.toString(); void 0 === o[f] ? (o[f] = { vert1: n[0], vert2: n[1], face1: u, face2: void 0 }, c++) : o[f].face2 = u } n = new Float32Array(6 * c), a = 0; for (f in o) s = o[f], (void 0 === s.face2 || i[s.face1].normal.dot(i[s.face2].normal) <= r) && (c = l[s.vert1], n[a++] = c.x, n[a++] = c.y, n[a++] = c.z, c = l[s.vert2], n[a++] = c.x, n[a++] = c.y, n[a++] = c.z); h.addAttribute("position", new THREE.BufferAttribute(n, 3)), THREE.Line.call(this, h, new THREE.LineBasicMaterial({ color: t }), THREE.LinePieces), this.matrix = e.matrixWorld, this.matrixAutoUpdate = !1 }, THREE.EdgesHelper.prototype = Object.create(THREE.Line.prototype), THREE.EdgesHelper.prototype.constructor = THREE.EdgesHelper, THREE.FaceNormalsHelper = function(e, t, r, i) { this.object = e, this.size = void 0 !== t ? t : 1, e = void 0 !== r ? r : 16776960, i = void 0 !== i ? i : 1, t = new THREE.Geometry, r = 0; for (var n = this.object.geometry.faces.length; n > r; r++) t.vertices.push(new THREE.Vector3, new THREE.Vector3); THREE.Line.call(this, t, new THREE.LineBasicMaterial({ color: e, linewidth: i }), THREE.LinePieces), this.matrixAutoUpdate = !1, this.normalMatrix = new THREE.Matrix3, this.update() }, THREE.FaceNormalsHelper.prototype = Object.create(THREE.Line.prototype), THREE.FaceNormalsHelper.prototype.constructor = THREE.FaceNormalsHelper, THREE.FaceNormalsHelper.prototype.update = function() { var e = this.geometry.vertices, t = this.object, r = t.geometry.vertices, i = t.geometry.faces, n = t.matrixWorld; t.updateMatrixWorld(!0), this.normalMatrix.getNormalMatrix(n); for (var o = t = 0, a = i.length; a > t; t++, o += 2) { var s = i[t]; e[o].copy(r[s.a]).add(r[s.b]).add(r[s.c]).divideScalar(3).applyMatrix4(n), e[o + 1].copy(s.normal).applyMatrix3(this.normalMatrix).normalize().multiplyScalar(this.size).add(e[o]) } return this.geometry.verticesNeedUpdate = !0, this }, THREE.GridHelper = function(e, t) { var r = new THREE.Geometry, i = new THREE.LineBasicMaterial({ vertexColors: THREE.VertexColors }); this.color1 = new THREE.Color(4473924), this.color2 = new THREE.Color(8947848); for (var n = -e; e >= n; n += t) { r.vertices.push(new THREE.Vector3(-e, 0, n), new THREE.Vector3(e, 0, n), new THREE.Vector3(n, 0, -e), new THREE.Vector3(n, 0, e)); var o = 0 === n ? this.color1 : this.color2; r.colors.push(o, o, o, o) } THREE.Line.call(this, r, i, THREE.LinePieces) }, THREE.GridHelper.prototype = Object.create(THREE.Line.prototype), THREE.GridHelper.prototype.constructor = THREE.GridHelper, THREE.GridHelper.prototype.setColors = function(e, t) { this.color1.set(e), this.color2.set(t), this.geometry.colorsNeedUpdate = !0 }, THREE.HemisphereLightHelper = function(e, t) { THREE.Object3D.call(this), this.light = e, this.light.updateMatrixWorld(), this.matrix = e.matrixWorld, this.matrixAutoUpdate = !1, this.colors = [new THREE.Color, new THREE.Color]; var r = new THREE.SphereGeometry(t, 4, 2); r.applyMatrix((new THREE.Matrix4).makeRotationX(-Math.PI / 2)); for (var i = 0; 8 > i; i++) r.faces[i].color = this.colors[4 > i ? 0 : 1]; i = new THREE.MeshBasicMaterial({ vertexColors: THREE.FaceColors, wireframe: !0 }), this.lightSphere = new THREE.Mesh(r, i), this.add(this.lightSphere), this.update() }, THREE.HemisphereLightHelper.prototype = Object.create(THREE.Object3D.prototype), THREE.HemisphereLightHelper.prototype.constructor = THREE.HemisphereLightHelper, THREE.HemisphereLightHelper.prototype.dispose = function() { this.lightSphere.geometry.dispose(), this.lightSphere.material.dispose() }, THREE.HemisphereLightHelper.prototype.update = function() { var e = new THREE.Vector3; return function() { this.colors[0].copy(this.light.color).multiplyScalar(this.light.intensity), this.colors[1].copy(this.light.groundColor).multiplyScalar(this.light.intensity), this.lightSphere.lookAt(e.setFromMatrixPosition(this.light.matrixWorld).negate()), this.lightSphere.geometry.colorsNeedUpdate = !0 } }(), THREE.PointLightHelper = function(e, t) { this.light = e, this.light.updateMatrixWorld(); var r = new THREE.SphereGeometry(t, 4, 2), i = new THREE.MeshBasicMaterial({ wireframe: !0, fog: !1 }); i.color.copy(this.light.color).multiplyScalar(this.light.intensity), THREE.Mesh.call(this, r, i), this.matrix = this.light.matrixWorld, this.matrixAutoUpdate = !1 }, THREE.PointLightHelper.prototype = Object.create(THREE.Mesh.prototype), THREE.PointLightHelper.prototype.constructor = THREE.PointLightHelper, THREE.PointLightHelper.prototype.dispose = function() { this.geometry.dispose(), this.material.dispose() }, THREE.PointLightHelper.prototype.update = function() { this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity) }, THREE.SkeletonHelper = function(e) { this.bones = this.getBoneList(e); for (var t = new THREE.Geometry, r = 0; r < this.bones.length; r++) this.bones[r].parent instanceof THREE.Bone && (t.vertices.push(new THREE.Vector3), t.vertices.push(new THREE.Vector3), t.colors.push(new THREE.Color(0, 0, 1)), t.colors.push(new THREE.Color(0, 1, 0))); r = new THREE.LineBasicMaterial({ vertexColors: THREE.VertexColors, depthTest: !1, depthWrite: !1, transparent: !0 }), THREE.Line.call(this, t, r, THREE.LinePieces), this.root = e, this.matrix = e.matrixWorld, this.matrixAutoUpdate = !1, this.update() }, THREE.SkeletonHelper.prototype = Object.create(THREE.Line.prototype), THREE.SkeletonHelper.prototype.constructor = THREE.SkeletonHelper, THREE.SkeletonHelper.prototype.getBoneList = function(e) { var t = []; e instanceof THREE.Bone && t.push(e); for (var r = 0; r < e.children.length; r++) t.push.apply(t, this.getBoneList(e.children[r])); return t }, THREE.SkeletonHelper.prototype.update = function() { for (var e = this.geometry, t = (new THREE.Matrix4).getInverse(this.root.matrixWorld), r = new THREE.Matrix4, i = 0, n = 0; n < this.bones.length; n++) { var o = this.bones[n]; o.parent instanceof THREE.Bone && (r.multiplyMatrices(t, o.matrixWorld), e.vertices[i].setFromMatrixPosition(r), r.multiplyMatrices(t, o.parent.matrixWorld), e.vertices[i + 1].setFromMatrixPosition(r), i += 2) } e.verticesNeedUpdate = !0, e.computeBoundingSphere() }, THREE.SpotLightHelper = function(e) { THREE.Object3D.call(this), this.light = e, this.light.updateMatrixWorld(), this.matrix = e.matrixWorld, this.matrixAutoUpdate = !1, e = new THREE.CylinderGeometry(0, 1, 1, 8, 1, !0), e.applyMatrix((new THREE.Matrix4).makeTranslation(0, -.5, 0)), e.applyMatrix((new THREE.Matrix4).makeRotationX(-Math.PI / 2)); var t = new THREE.MeshBasicMaterial({ wireframe: !0, fog: !1 }); this.cone = new THREE.Mesh(e, t), this.add(this.cone), this.update() }, THREE.SpotLightHelper.prototype = Object.create(THREE.Object3D.prototype), THREE.SpotLightHelper.prototype.constructor = THREE.SpotLightHelper, THREE.SpotLightHelper.prototype.dispose = function() { this.cone.geometry.dispose(), this.cone.material.dispose() }, THREE.SpotLightHelper.prototype.update = function() { var e = new THREE.Vector3, t = new THREE.Vector3; return function() { var r = this.light.distance ? this.light.distance : 1e4, i = r * Math.tan(this.light.angle); this.cone.scale.set(i, i, r), e.setFromMatrixPosition(this.light.matrixWorld), t.setFromMatrixPosition(this.light.target.matrixWorld), this.cone.lookAt(t.sub(e)), this.cone.material.color.copy(this.light.color).multiplyScalar(this.light.intensity) } }(), THREE.VertexNormalsHelper = function(e, t, r, i) { this.object = e, this.size = void 0 !== t ? t : 1, t = void 0 !== r ? r : 16711680, i = void 0 !== i ? i : 1, r = new THREE.Geometry, e = e.geometry.faces; for (var n = 0, o = e.length; o > n; n++) for (var a = 0, s = e[n].vertexNormals.length; s > a; a++) r.vertices.push(new THREE.Vector3, new THREE.Vector3); THREE.Line.call(this, r, new THREE.LineBasicMaterial({ color: t, linewidth: i }), THREE.LinePieces), this.matrixAutoUpdate = !1, this.normalMatrix = new THREE.Matrix3, this.update() }, THREE.VertexNormalsHelper.prototype = Object.create(THREE.Line.prototype), THREE.VertexNormalsHelper.prototype.constructor = THREE.VertexNormalsHelper, THREE.VertexNormalsHelper.prototype.update = function(e) { var t = new THREE.Vector3; return function(e) { e = ["a", "b", "c", "d"], this.object.updateMatrixWorld(!0), this.normalMatrix.getNormalMatrix(this.object.matrixWorld); for (var r = this.geometry.vertices, i = this.object.geometry.vertices, n = this.object.geometry.faces, o = this.object.matrixWorld, a = 0, s = 0, h = n.length; h > s; s++) for (var l = n[s], c = 0, u = l.vertexNormals.length; u > c; c++) { var E = l.vertexNormals[c]; r[a].copy(i[l[e[c]]]).applyMatrix4(o), t.copy(E).applyMatrix3(this.normalMatrix).normalize().multiplyScalar(this.size), t.add(r[a]), a += 1, r[a].copy(t), a += 1 } return this.geometry.verticesNeedUpdate = !0, this } }(), THREE.VertexTangentsHelper = function(e, t, r, i) { this.object = e, this.size = void 0 !== t ? t : 1, t = void 0 !== r ? r : 255, i = void 0 !== i ? i : 1, r = new THREE.Geometry, e = e.geometry.faces; for (var n = 0, o = e.length; o > n; n++) for (var a = 0, s = e[n].vertexTangents.length; s > a; a++) r.vertices.push(new THREE.Vector3), r.vertices.push(new THREE.Vector3); THREE.Line.call(this, r, new THREE.LineBasicMaterial({ color: t, linewidth: i }), THREE.LinePieces), this.matrixAutoUpdate = !1, this.update() }, THREE.VertexTangentsHelper.prototype = Object.create(THREE.Line.prototype), THREE.VertexTangentsHelper.prototype.constructor = THREE.VertexTangentsHelper, THREE.VertexTangentsHelper.prototype.update = function(e) { var t = new THREE.Vector3; return function(e) { e = ["a", "b", "c", "d"], this.object.updateMatrixWorld(!0); for (var r = this.geometry.vertices, i = this.object.geometry.vertices, n = this.object.geometry.faces, o = this.object.matrixWorld, a = 0, s = 0, h = n.length; h > s; s++) for (var l = n[s], c = 0, u = l.vertexTangents.length; u > c; c++) { var E = l.vertexTangents[c]; r[a].copy(i[l[e[c]]]).applyMatrix4(o), t.copy(E).transformDirection(o).multiplyScalar(this.size), t.add(r[a]), a += 1, r[a].copy(t), a += 1 } return this.geometry.verticesNeedUpdate = !0, this } }(), THREE.WireframeHelper = function(e, t) { var r = void 0 !== t ? t : 16777215, i = [0, 0], n = {}, o = function(e, t) { return e - t }, a = ["a", "b", "c"], s = new THREE.BufferGeometry; if (e.geometry instanceof THREE.Geometry) { for (var h = e.geometry.vertices, l = e.geometry.faces, c = 0, u = new Uint32Array(6 * l.length), E = 0, p = l.length; p > E; E++) for (var d = l[E], f = 0; 3 > f; f++) { i[0] = d[a[f]], i[1] = d[a[(f + 1) % 3]], i.sort(o); var m = i.toString(); void 0 === n[m] && (u[2 * c] = i[0], u[2 * c + 1] = i[1], n[m] = !0, c++) } for (i = new Float32Array(6 * c), E = 0, p = c; p > E; E++) for (f = 0; 2 > f; f++) c = h[u[2 * E + f]], a = 6 * E + 3 * f, i[a + 0] = c.x, i[a + 1] = c.y, i[a + 2] = c.z; s.addAttribute("position", new THREE.BufferAttribute(i, 3)) } else if (e.geometry instanceof THREE.BufferGeometry) { if (void 0 !== e.geometry.attributes.index) { h = e.geometry.attributes.position.array, p = e.geometry.attributes.index.array, l = e.geometry.drawcalls, c = 0, 0 === l.length && (l = [{ count: p.length, index: 0, start: 0 }]); for (var u = new Uint32Array(2 * p.length), d = 0, T = l.length; T > d; ++d) for (var f = l[d].start, m = l[d].count, a = l[d].index, E = f, g = f + m; g > E; E += 3) for (f = 0; 3 > f; f++) i[0] = a + p[E + f], i[1] = a + p[E + (f + 1) % 3], i.sort(o), m = i.toString(), void 0 === n[m] && (u[2 * c] = i[0], u[2 * c + 1] = i[1], n[m] = !0, c++); for (i = new Float32Array(6 * c), E = 0, p = c; p > E; E++) for (f = 0; 2 > f; f++) a = 6 * E + 3 * f, c = 3 * u[2 * E + f], i[a + 0] = h[c], i[a + 1] = h[c + 1], i[a + 2] = h[c + 2] } else for (h = e.geometry.attributes.position.array, c = h.length / 3, u = c / 3, i = new Float32Array(6 * c), E = 0, p = u; p > E; E++) for (f = 0; 3 > f; f++) a = 18 * E + 6 * f, u = 9 * E + 3 * f, i[a + 0] = h[u], i[a + 1] = h[u + 1], i[a + 2] = h[u + 2], c = 9 * E + (f + 1) % 3 * 3, i[a + 3] = h[c], i[a + 4] = h[c + 1], i[a + 5] = h[c + 2]; s.addAttribute("position", new THREE.BufferAttribute(i, 3)) } THREE.Line.call(this, s, new THREE.LineBasicMaterial({ color: r }), THREE.LinePieces), this.matrix = e.matrixWorld, this.matrixAutoUpdate = !1 }, THREE.WireframeHelper.prototype = Object.create(THREE.Line.prototype), THREE.WireframeHelper.prototype.constructor = THREE.WireframeHelper, THREE.ImmediateRenderObject = function() { THREE.Object3D.call(this), this.render = function(e) {} }, THREE.ImmediateRenderObject.prototype = Object.create(THREE.Object3D.prototype), THREE.ImmediateRenderObject.prototype.constructor = THREE.ImmediateRenderObject, THREE.MorphBlendMesh = function(e, t) { THREE.Mesh.call(this, e, t), this.animationsMap = {}, this.animationsList = []; var r = this.geometry.morphTargets.length; this.createAnimation("__default", 0, r - 1, r / 1), this.setAnimationWeight("__default", 1) }, THREE.MorphBlendMesh.prototype = Object.create(THREE.Mesh.prototype), THREE.MorphBlendMesh.prototype.constructor = THREE.MorphBlendMesh, THREE.MorphBlendMesh.prototype.createAnimation = function(e, t, r, i) { t = { startFrame: t, endFrame: r, length: r - t + 1, fps: i, duration: (r - t) / i, lastFrame: 0, currentFrame: 0, active: !1, time: 0, direction: 1, weight: 1, directionBackwards: !1, mirroredLoop: !1 }, this.animationsMap[e] = t, this.animationsList.push(t) }, THREE.MorphBlendMesh.prototype.autoCreateAnimations = function(e) { for (var t, r = /([a-z]+)_?(\d+)/, i = {}, n = this.geometry, o = 0, a = n.morphTargets.length; a > o; o++) { var s = n.morphTargets[o].name.match(r); if (s && 1 < s.length) { var h = s[1]; i[h] || (i[h] = { start: 1 / 0, end: -(1 / 0) }), s = i[h], o < s.start && (s.start = o), o > s.end && (s.end = o), t || (t = h) } } for (h in i) s = i[h], this.createAnimation(h, s.start, s.end, e); this.firstAnimation = t }, THREE.MorphBlendMesh.prototype.setAnimationDirectionForward = function(e) { (e = this.animationsMap[e]) && (e.direction = 1, e.directionBackwards = !1) }, THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward = function(e) { (e = this.animationsMap[e]) && (e.direction = -1, e.directionBackwards = !0) }, THREE.MorphBlendMesh.prototype.setAnimationFPS = function(e, t) { var r = this.animationsMap[e]; r && (r.fps = t, r.duration = (r.end - r.start) / r.fps) }, THREE.MorphBlendMesh.prototype.setAnimationDuration = function(e, t) { var r = this.animationsMap[e]; r && (r.duration = t, r.fps = (r.end - r.start) / r.duration) }, THREE.MorphBlendMesh.prototype.setAnimationWeight = function(e, t) { var r = this.animationsMap[e]; r && (r.weight = t) }, THREE.MorphBlendMesh.prototype.setAnimationTime = function(e, t) { var r = this.animationsMap[e]; r && (r.time = t) }, THREE.MorphBlendMesh.prototype.getAnimationTime = function(e) { var t = 0; return (e = this.animationsMap[e]) && (t = e.time), t }, THREE.MorphBlendMesh.prototype.getAnimationDuration = function(e) { var t = -1; return (e = this.animationsMap[e]) && (t = e.duration), t }, THREE.MorphBlendMesh.prototype.playAnimation = function(e) { var t = this.animationsMap[e]; t ? (t.time = 0, t.active = !0) : THREE.warn("THREE.MorphBlendMesh: animation[" + e + "] undefined in .playAnimation()") }, THREE.MorphBlendMesh.prototype.stopAnimation = function(e) { (e = this.animationsMap[e]) && (e.active = !1) }, THREE.MorphBlendMesh.prototype.update = function(e) { for (var t = 0, r = this.animationsList.length; r > t; t++) { var i = this.animationsList[t]; if (i.active) { var n = i.duration / i.length; i.time += i.direction * e, i.mirroredLoop ? (i.time > i.duration || 0 > i.time) && (i.direction *= -1, i.time > i.duration && (i.time = i.duration, i.directionBackwards = !0), 0 > i.time && (i.time = 0, i.directionBackwards = !1)) : (i.time %= i.duration, 0 > i.time && (i.time += i.duration)); var o = i.startFrame + THREE.Math.clamp(Math.floor(i.time / n), 0, i.length - 1), a = i.weight; o !== i.currentFrame && (this.morphTargetInfluences[i.lastFrame] = 0, this.morphTargetInfluences[i.currentFrame] = 1 * a, this.morphTargetInfluences[o] = 0, i.lastFrame = i.currentFrame, i.currentFrame = o), n = i.time % n / n, i.directionBackwards && (n = 1 - n), this.morphTargetInfluences[i.currentFrame] = n * a, this.morphTargetInfluences[i.lastFrame] = (1 - n) * a } } }, THREE.SpriteCanvasMaterial = function(e) { THREE.Material.call(this), this.type = "SpriteCanvasMaterial", this.color = new THREE.Color(16777215), this.program = function(e, t) {}, this.setValues(e) }, THREE.SpriteCanvasMaterial.prototype = Object.create(THREE.Material.prototype), THREE.SpriteCanvasMaterial.prototype.constructor = THREE.SpriteCanvasMaterial, THREE.SpriteCanvasMaterial.prototype.clone = function() { var e = new THREE.SpriteCanvasMaterial; return THREE.Material.prototype.clone.call(this, e), e.color.copy(this.color), e.program = this.program, e }, THREE.CanvasRenderer = function(e) { function t() { Re.setRGB(0, 0, 0), ye.setRGB(0, 0, 0), ve.setRGB(0, 0, 0); for (var e = 0, t = b.length; t > e; e++) { var r = b[e], i = r.color; r instanceof THREE.AmbientLight ? Re.add(i) : r instanceof THREE.DirectionalLight ? ye.add(i) : r instanceof THREE.PointLight && ve.add(i) } } function r(e, t, r) { for (var i = 0, n = b.length; n > i; i++) { var o = b[i]; if (de.copy(o.color), o instanceof THREE.DirectionalLight) { var a = He.setFromMatrixPosition(o.matrixWorld).normalize(), s = t.dot(a); if (0 >= s) continue; s *= o.intensity, r.add(de.multiplyScalar(s)) } else if (o instanceof THREE.PointLight) { var a = He.setFromMatrixPosition(o.matrixWorld), s = t.dot(He.subVectors(a, e).normalize()); if (0 >= s) continue; if (s *= 0 == o.distance ? 1 : 1 - Math.min(e.distanceTo(a) / o.distance, 1), 0 == s) continue; s *= o.intensity, r.add(de.multiplyScalar(s)) } } } function i(e, t, r) { p(r.opacity), d(r.blending); var i = t.scale.x * q, n = t.scale.y * Y, o = .5 * Math.sqrt(i * i + n * n); if (ge.min.set(e.x - o, e.y - o), ge.max.set(e.x + o, e.y + o), r instanceof THREE.SpriteMaterial) { var a = r.map; if (null !== a && void 0 !== a.image) { a.hasEventListener("update", l) === !1 && (a.image.width > 0 && c(a), a.addEventListener("update", l)); var s = fe[a.id]; R(void 0 !== s ? s : "rgba( 0, 0, 0, 1 )"); var h = a.image, u = h.width * a.offset.x, E = h.height * a.offset.y, f = h.width * a.repeat.x, m = h.height * a.repeat.y, T = i / f, y = n / m; ee.save(), ee.translate(e.x, e.y), 0 !== r.rotation && ee.rotate(r.rotation), ee.translate(-i / 2, -n / 2), ee.scale(T, y), ee.translate(-u, -E), ee.fillRect(u, E, f, m), ee.restore() } else R(r.color.getStyle()), ee.save(), ee.translate(e.x, e.y), 0 !== r.rotation && ee.rotate(r.rotation), ee.scale(i, -n), ee.fillRect(-.5, -.5, 1, 1), ee.restore() } else r instanceof THREE.SpriteCanvasMaterial && (g(r.color.getStyle()), R(r.color.getStyle()), ee.save(), ee.translate(e.x, e.y), 0 !== r.rotation && ee.rotate(r.rotation), ee.scale(i, n), r.program(ee), ee.restore()) } function n(e, t, r, i) { if (p(i.opacity), d(i.blending), ee.beginPath(), ee.moveTo(e.positionScreen.x, e.positionScreen.y), ee.lineTo(t.positionScreen.x, t.positionScreen.y), i instanceof THREE.LineBasicMaterial) { if (f(i.linewidth), m(i.linecap), T(i.linejoin), i.vertexColors !== THREE.VertexColors) g(i.color.getStyle()); else { var n = r.vertexColors[0].getStyle(), o = r.vertexColors[1].getStyle(); if (n === o) g(n); else { try { var a = ee.createLinearGradient(e.positionScreen.x, e.positionScreen.y, t.positionScreen.x, t.positionScreen.y); a.addColorStop(0, n), a.addColorStop(1, o) } catch (s) { a = n } g(a) } } ee.stroke(), ge.expandByScalar(2 * i.linewidth) } else i instanceof THREE.LineDashedMaterial && (f(i.linewidth), m(i.linecap), T(i.linejoin), g(i.color.getStyle()), y([i.dashSize, i.gapSize]), ee.stroke(), ge.expandByScalar(2 * i.linewidth), y([])) } function o(e, t, i, n, o, l, c, E) { if (G.info.render.vertices += 3, G.info.render.faces++, p(E.opacity), d(E.blending), C = e.positionScreen.x, A = e.positionScreen.y, L = t.positionScreen.x, P = t.positionScreen.y, F = i.positionScreen.x, B = i.positionScreen.y, a(C, A, L, P, F, B), (E instanceof THREE.MeshLambertMaterial || E instanceof THREE.MeshPhongMaterial) && null === E.map) Ee.copy(E.color), pe.copy(E.emissive), E.vertexColors === THREE.FaceColors && Ee.multiply(c.color), ue.copy(Re), xe.copy(e.positionWorld).add(t.positionWorld).add(i.positionWorld).divideScalar(3), r(xe, c.normalModel, ue), ue.multiply(Ee).add(pe), E.wireframe === !0 ? s(ue, E.wireframeLinewidth, E.wireframeLinecap, E.wireframeLinejoin) : h(ue); else if (E instanceof THREE.MeshBasicMaterial || E instanceof THREE.MeshLambertMaterial || E instanceof THREE.MeshPhongMaterial) if (null !== E.map) { var f = E.map.mapping; f === THREE.UVMapping && (U = c.uvs, u(C, A, L, P, F, B, U[n].x, U[n].y, U[o].x, U[o].y, U[l].x, U[l].y, E.map)) } else null !== E.envMap ? E.envMap.mapping === THREE.SphericalReflectionMapping && (be.copy(c.vertexNormalsModel[n]).applyMatrix3(we), D = .5 * be.x + .5, V = .5 * be.y + .5, be.copy(c.vertexNormalsModel[o]).applyMatrix3(we), z = .5 * be.x + .5, k = .5 * be.y + .5, be.copy(c.vertexNormalsModel[l]).applyMatrix3(we), N = .5 * be.x + .5, O = .5 * be.y + .5, u(C, A, L, P, F, B, D, V, z, k, N, O, E.envMap)) : (ue.copy(E.color), E.vertexColors === THREE.FaceColors && ue.multiply(c.color), E.wireframe === !0 ? s(ue, E.wireframeLinewidth, E.wireframeLinecap, E.wireframeLinejoin) : h(ue)); else E instanceof THREE.MeshDepthMaterial ? (ue.r = ue.g = ue.b = 1 - v(e.positionScreen.z * e.positionScreen.w, w.near, w.far), E.wireframe === !0 ? s(ue, E.wireframeLinewidth, E.wireframeLinecap, E.wireframeLinejoin) : h(ue)) : E instanceof THREE.MeshNormalMaterial ? (be.copy(c.normalModel).applyMatrix3(we), ue.setRGB(be.x, be.y, be.z).multiplyScalar(.5).addScalar(.5), E.wireframe === !0 ? s(ue, E.wireframeLinewidth, E.wireframeLinecap, E.wireframeLinejoin) : h(ue)) : (ue.setRGB(1, 1, 1), E.wireframe === !0 ? s(ue, E.wireframeLinewidth, E.wireframeLinecap, E.wireframeLinejoin) : h(ue)) } function a(e, t, r, i, n, o) { ee.beginPath(), ee.moveTo(e, t), ee.lineTo(r, i), ee.lineTo(n, o), ee.closePath() } function s(e, t, r, i) { f(t), m(r), T(i), g(e.getStyle()), ee.stroke(), ge.expandByScalar(2 * t) } function h(e) { R(e.getStyle()), ee.fill() } function l(e) { c(e.target) } function c(e) { if (!(e instanceof THREE.CompressedTexture)) { var t = e.wrapS === THREE.RepeatWrapping, r = e.wrapT === THREE.RepeatWrapping, i = e.image, n = document.createElement("canvas"); n.width = i.width, n.height = i.height; var o = n.getContext("2d"); o.setTransform(1, 0, 0, -1, 0, i.height), o.drawImage(i, 0, 0), fe[e.id] = ee.createPattern(n, t === !0 && r === !0 ? "repeat" : t === !0 && r === !1 ? "repeat-x" : t === !1 && r === !0 ? "repeat-y" : "no-repeat") } } function u(e, t, r, i, n, o, a, s, h, u, E, p, d) { if (!(d instanceof THREE.DataTexture)) { d.hasEventListener("update", l) === !1 && (void 0 !== d.image && d.image.width > 0 && c(d), d.addEventListener("update", l)); var f = fe[d.id]; if (void 0 === f) return R("rgba(0,0,0,1)"), void ee.fill(); R(f); var m, T, g, y, v, H, x, b, w = d.offset.x / d.repeat.x, _ = d.offset.y / d.repeat.y, M = d.image.width * d.repeat.x, S = d.image.height * d.repeat.y; a = (a + w) * M, s = (s + _) * S, h = (h + w) * M, u = (u + _) * S, E = (E + w) * M, p = (p + _) * S, r -= e, i -= t, n -= e, o -= t, h -= a, u -= s, E -= a, p -= s, x = h * p - E * u, 0 !== x && (b = 1 / x, m = (p * r - u * n) * b, T = (p * i - u * o) * b, g = (h * n - E * r) * b, y = (h * o - E * i) * b, v = e - m * a - g * s, H = t - T * a - y * s, ee.save(), ee.transform(m, T, g, y, v, H), ee.fill(), ee.restore()) } } function E(e, t, r) { var i, n = t.x - e.x, o = t.y - e.y, a = n * n + o * o; 0 !== a && (i = r / Math.sqrt(a), n *= i, o *= i, t.x += n, t.y += o, e.x -= n, e.y -= o) } function p(e) { ie !== e && (ee.globalAlpha = e, ie = e) } function d(e) { ne !== e && (e === THREE.NormalBlending ? ee.globalCompositeOperation = "source-over" : e === THREE.AdditiveBlending ? ee.globalCompositeOperation = "lighter" : e === THREE.SubtractiveBlending && (ee.globalCompositeOperation = "darker"), ne = e) } function f(e) { se !== e && (ee.lineWidth = e, se = e) } function m(e) { he !== e && (ee.lineCap = e, he = e) } function T(e) { le !== e && (ee.lineJoin = e, le = e) } function g(e) { oe !== e && (ee.strokeStyle = e, oe = e) } function R(e) { ae !== e && (ee.fillStyle = e, ae = e) } function y(e) { ce.length !== e.length && (ee.setLineDash(e), ce = e) } console.log("THREE.CanvasRenderer", THREE.REVISION); var v = THREE.Math.smoothstep; e = e || {}; var H, x, b, w, _, M, S, C, A, L, P, F, B, U, D, V, z, k, N, O, G = this, I = new THREE.Projector, W = void 0 !== e.canvas ? e.canvas : document.createElement("canvas"), j = W.width, X = W.height, q = Math.floor(j / 2), Y = Math.floor(X / 2), K = 0, Q = 0, Z = j, J = X, $ = 1, ee = W.getContext("2d", { alpha: e.alpha === !0 }), te = new THREE.Color(0), re = e.alpha === !0 ? 0 : 1, ie = 1, ne = 0, oe = null, ae = null, se = null, he = null, le = null, ce = [], ue = (new THREE.RenderableVertex, new THREE.RenderableVertex, new THREE.Color), Ee = (new THREE.Color, new THREE.Color, new THREE.Color, new THREE.Color, new THREE.Color), pe = new THREE.Color, de = new THREE.Color, fe = {}, me = new THREE.Box2, Te = new THREE.Box2, ge = new THREE.Box2, Re = new THREE.Color, ye = new THREE.Color, ve = new THREE.Color, He = new THREE.Vector3, xe = new THREE.Vector3, be = new THREE.Vector3, we = new THREE.Matrix3; void 0 === ee.setLineDash && (ee.setLineDash = function() {}), this.domElement = W, this.autoClear = !0, this.sortObjects = !0, this.sortElements = !0, this.info = { render: { vertices: 0, faces: 0 } }, this.supportsVertexTextures = function() {}, this.setFaceCulling = function() {}, this.getPixelRatio = function() { return $ }, this.setPixelRatio = function(e) { $ = e }, this.setSize = function(e, t, r) { j = e * $, X = t * $, W.width = j, W.height = X, q = Math.floor(j / 2), Y = Math.floor(X / 2), r !== !1 && (W.style.width = e + "px", W.style.height = t + "px"), me.min.set(-q, -Y), me.max.set(q, Y), Te.min.set(-q, -Y), Te.max.set(q, Y), ie = 1, ne = 0, oe = null, ae = null, se = null, he = null, le = null, this.setViewport(0, 0, e, t) }, this.setViewport = function(e, t, r, i) { K = e * $, Q = t * $, Z = r * $, J = i * $ }, this.setScissor = function() {}, this.enableScissorTest = function() {}, this.setClearColor = function(e, t) { te.set(e), re = void 0 !== t ? t : 1, Te.min.set(-q, -Y), Te.max.set(q, Y) }, this.setClearColorHex = function(e, t) { console.warn("THREE.CanvasRenderer: .setClearColorHex() is being removed. Use .setClearColor() instead."), this.setClearColor(e, t) }, this.getClearColor = function() { return te }, this.getClearAlpha = function() { return re }, this.getMaxAnisotropy = function() { return 0 }, this.clear = function() { Te.empty() === !1 && (Te.intersect(me), Te.expandByScalar(2), Te.min.x = Te.min.x + q, Te.min.y = -Te.min.y + Y, Te.max.x = Te.max.x + q, Te.max.y = -Te.max.y + Y, 1 > re && ee.clearRect(0 | Te.min.x, 0 | Te.max.y, Te.max.x - Te.min.x | 0, Te.min.y - Te.max.y | 0), re > 0 && (d(THREE.NormalBlending), p(1), R("rgba(" + Math.floor(255 * te.r) + "," + Math.floor(255 * te.g) + "," + Math.floor(255 * te.b) + "," + re + ")"), ee.fillRect(0 | Te.min.x, 0 | Te.max.y, Te.max.x - Te.min.x | 0, Te.min.y - Te.max.y | 0)), Te.makeEmpty()) }, this.clearColor = function() {}, this.clearDepth = function() {}, this.clearStencil = function() {}, this.render = function(e, r) { if (r instanceof THREE.Camera == !1) return void console.error("THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera."); this.autoClear === !0 && this.clear(), G.info.render.vertices = 0, G.info.render.faces = 0, ee.setTransform(Z / j, 0, 0, -J / X, K, X - Q), ee.translate(q, Y), H = I.projectScene(e, r, this.sortObjects, this.sortElements), x = H.elements, b = H.lights, w = r, we.getNormalMatrix(r.matrixWorldInverse), t(); for (var a = 0, s = x.length; s > a; a++) { var h = x[a], l = h.material; if (void 0 !== l && 0 !== l.opacity) { if (ge.makeEmpty(), h instanceof THREE.RenderableSprite) _ = h, _.x *= q, _.y *= Y, i(_, h, l); else if (h instanceof THREE.RenderableLine) _ = h.v1, M = h.v2, _.positionScreen.x *= q, _.positionScreen.y *= Y, M.positionScreen.x *= q, M.positionScreen.y *= Y, ge.setFromPoints([_.positionScreen, M.positionScreen]), me.isIntersectionBox(ge) === !0 && n(_, M, h, l); else if (h instanceof THREE.RenderableFace) { if (_ = h.v1, M = h.v2, S = h.v3, _.positionScreen.z < -1 || _.positionScreen.z > 1) continue; if (M.positionScreen.z < -1 || M.positionScreen.z > 1) continue; if (S.positionScreen.z < -1 || S.positionScreen.z > 1) continue; _.positionScreen.x *= q, _.positionScreen.y *= Y, M.positionScreen.x *= q, M.positionScreen.y *= Y, S.positionScreen.x *= q, S.positionScreen.y *= Y, l.overdraw > 0 && (E(_.positionScreen, M.positionScreen, l.overdraw), E(M.positionScreen, S.positionScreen, l.overdraw), E(S.positionScreen, _.positionScreen, l.overdraw)), ge.setFromPoints([_.positionScreen, M.positionScreen, S.positionScreen]), me.isIntersectionBox(ge) === !0 && o(_, M, S, 0, 1, 2, h, l) } Te.union(ge) } } ee.setTransform(1, 0, 0, 1, 0, 0) } }, THREE.RenderableObject = function() { this.id = 0, this.object = null, this.z = 0 }, THREE.RenderableFace = function() { this.id = 0, this.v1 = new THREE.RenderableVertex, this.v2 = new THREE.RenderableVertex, this.v3 = new THREE.RenderableVertex, this.normalModel = new THREE.Vector3, this.vertexNormalsModel = [new THREE.Vector3, new THREE.Vector3, new THREE.Vector3], this.vertexNormalsLength = 0, this.color = new THREE.Color, this.material = null, this.uvs = [new THREE.Vector2, new THREE.Vector2, new THREE.Vector2], this.z = 0 }, THREE.RenderableVertex = function() { this.position = new THREE.Vector3, this.positionWorld = new THREE.Vector3, this.positionScreen = new THREE.Vector4, this.visible = !0 }, THREE.RenderableVertex.prototype.copy = function(e) { this.positionWorld.copy(e.positionWorld), this.positionScreen.copy(e.positionScreen) }, THREE.RenderableLine = function() { this.id = 0, this.v1 = new THREE.RenderableVertex, this.v2 = new THREE.RenderableVertex, this.vertexColors = [new THREE.Color, new THREE.Color], this.material = null, this.z = 0 }, THREE.RenderableSprite = function() { this.id = 0, this.object = null, this.x = 0, this.y = 0, this.z = 0, this.rotation = 0, this.scale = new THREE.Vector2, this.material = null }, THREE.Projector = function() { function e() { if (h === R) { var e = new THREE.RenderableObject; return g.push(e), R++, h++, e } return g[h++] } function t() { if (c === v) { var e = new THREE.RenderableVertex; return y.push(e), v++, c++, e } return y[c++] } function r() { if (E === x) { var e = new THREE.RenderableFace; return H.push(e), x++, E++, e } return H[E++] } function i() { if (d === w) { var e = new THREE.RenderableLine; return b.push(e), w++, d++, e } return b[d++] } function n() { if (m === M) { var e = new THREE.RenderableSprite; return _.push(e), M++, m++, e } return _[m++] } function o(e, t) { return e.z !== t.z ? t.z - e.z : e.id !== t.id ? e.id - t.id : 0 } function a(e, t) { var r = 0, i = 1, n = e.z + e.w, o = t.z + t.w, a = -e.z + e.w, s = -t.z + t.w; return n >= 0 && o >= 0 && a >= 0 && s >= 0 ? !0 : 0 > n && 0 > o || 0 > a && 0 > s ? !1 : (0 > n ? r = Math.max(r, n / (n - o)) : 0 > o && (i = Math.min(i, n / (n - o))), 0 > a ? r = Math.max(r, a / (a - s)) : 0 > s && (i = Math.min(i, a / (a - s))), r > i ? !1 : (e.lerp(t, r), t.lerp(e, 1 - i), !0)) } var s, h, l, c, u, E, p, d, f, m, T, g = [], R = 0, y = [], v = 0, H = [], x = 0, b = [], w = 0, _ = [], M = 0, S = { objects: [], lights: [], elements: [] }, C = new THREE.Vector3, A = new THREE.Vector4, L = new THREE.Box3(new THREE.Vector3(-1, -1, -1), new THREE.Vector3(1, 1, 1)), P = new THREE.Box3, F = new Array(3), B = (new Array(4), new THREE.Matrix4), U = new THREE.Matrix4, D = new THREE.Matrix4, V = new THREE.Matrix3, z = new THREE.Frustum, k = new THREE.Vector4, N = new THREE.Vector4; this.projectVector = function(e, t) { console.warn("THREE.Projector: .projectVector() is now vector.project()."), e.project(t) }, this.unprojectVector = function(e, t) { console.warn("THREE.Projector: .unprojectVector() is now vector.unproject()."), e.unproject(t) }, this.pickingRay = function(e, t) { console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().") }; var O = function() { var e = [], n = [], o = null, a = null, s = new THREE.Matrix3, h = function(t) { o = t, a = o.material, s.getNormalMatrix(o.matrixWorld), e.length = 0, n.length = 0 }, c = function(e) { var t = e.position, r = e.positionWorld, i = e.positionScreen; r.copy(t).applyMatrix4(T), i.copy(r).applyMatrix4(U); var n = 1 / i.w; i.x *= n, i.y *= n, i.z *= n, e.visible = i.x >= -1 && i.x <= 1 && i.y >= -1 && i.y <= 1 && i.z >= -1 && i.z <= 1 }, E = function(e, r, i) { l = t(), l.position.set(e, r, i), c(l) }, d = function(t, r, i) { e.push(t, r, i) }, f = function(e, t) { n.push(e, t) }, m = function(e, t, r) { return e.visible === !0 || t.visible === !0 || r.visible === !0 ? !0 : (F[0] = e.positionScreen, F[1] = t.positionScreen, F[2] = r.positionScreen, L.isIntersectionBox(P.setFromPoints(F))) }, g = function(e, t, r) { return (r.positionScreen.x - e.positionScreen.x) * (t.positionScreen.y - e.positionScreen.y) - (r.positionScreen.y - e.positionScreen.y) * (t.positionScreen.x - e.positionScreen.x) < 0 }, R = function(e, t) { var r = y[e], n = y[t]; p = i(), p.id = o.id, p.v1.copy(r), p.v2.copy(n), p.z = (r.positionScreen.z + n.positionScreen.z) / 2, p.material = o.material, S.elements.push(p) }, v = function(t, i, h) { var l = y[t], c = y[i], E = y[h]; if (m(l, c, E) !== !1 && (a.side === THREE.DoubleSide || g(l, c, E) === !0)) { u = r(), u.id = o.id, u.v1.copy(l), u.v2.copy(c), u.v3.copy(E), u.z = (l.positionScreen.z + c.positionScreen.z + E.positionScreen.z) / 3; for (var p = 0; 3 > p; p++) { var d = 3 * arguments[p], f = u.vertexNormalsModel[p]; f.set(e[d], e[d + 1], e[d + 2]), f.applyMatrix3(s).normalize(); var T = 2 * arguments[p], R = u.uvs[p]; R.set(n[T], n[T + 1]) } u.vertexNormalsLength = 3, u.material = o.material, S.elements.push(u) } }; return { setObject: h, projectVertex: c, checkTriangleVisibility: m, checkBackfaceCulling: g, pushVertex: E, pushNormal: d, pushUv: f, pushLine: R, pushTriangle: v } }, G = new O; this.projectScene = function(l, g, R, v) { E = 0, d = 0, m = 0, S.elements.length = 0, l.autoUpdate === !0 && l.updateMatrixWorld(), void 0 === g.parent && g.updateMatrixWorld(), B.copy(g.matrixWorldInverse.getInverse(g.matrixWorld)), U.multiplyMatrices(g.projectionMatrix, B), z.setFromMatrix(U), h = 0, S.objects.length = 0, S.lights.length = 0, l.traverseVisible(function(t) { if (t instanceof THREE.Light) S.lights.push(t); else if (t instanceof THREE.Mesh || t instanceof THREE.Line || t instanceof THREE.Sprite) { if (t.material.visible === !1) return; (t.frustumCulled === !1 || z.intersectsObject(t) === !0) && (s = e(), s.id = t.id, s.object = t, C.setFromMatrixPosition(t.matrixWorld), C.applyProjection(U), s.z = C.z, S.objects.push(s)) } }), R === !0 && S.objects.sort(o); for (var H = 0, x = S.objects.length; x > H; H++) { var b = S.objects[H].object, w = b.geometry; if (G.setObject(b), T = b.matrixWorld, c = 0, b instanceof THREE.Mesh) { if (w instanceof THREE.BufferGeometry) { var _ = w.attributes, M = w.offsets; if (void 0 === _.position) continue; for (var L = _.position.array, P = 0, F = L.length; F > P; P += 3) G.pushVertex(L[P], L[P + 1], L[P + 2]); if (void 0 !== _.normal) for (var O = _.normal.array, P = 0, F = O.length; F > P; P += 3) G.pushNormal(O[P], O[P + 1], O[P + 2]); if (void 0 !== _.uv) for (var I = _.uv.array, P = 0, F = I.length; F > P; P += 2) G.pushUv(I[P], I[P + 1]); if (void 0 !== _.index) { var W = _.index.array; if (M.length > 0) for (var H = 0; H < M.length; H++) for (var j = M[H], X = j.index, P = j.start, F = j.start + j.count; F > P; P += 3) G.pushTriangle(W[P] + X, W[P + 1] + X, W[P + 2] + X); else for (var P = 0, F = W.length; F > P; P += 3) G.pushTriangle(W[P], W[P + 1], W[P + 2]) } else for (var P = 0, F = L.length / 3; F > P; P += 3) G.pushTriangle(P, P + 1, P + 2) } else if (w instanceof THREE.Geometry) { var q = w.vertices, Y = w.faces, K = w.faceVertexUvs[0]; V.getNormalMatrix(T); for (var Q = b.material, Z = Q instanceof THREE.MeshFaceMaterial, J = Z === !0 ? b.material : null, $ = 0, ee = q.length; ee > $; $++) { var te = q[$]; if (C.copy(te), Q.morphTargets === !0) for (var re = w.morphTargets, ie = b.morphTargetInfluences, ne = 0, oe = re.length; oe > ne; ne++) { var ae = ie[ne]; if (0 !== ae) { var se = re[ne], he = se.vertices[$]; C.x += (he.x - te.x) * ae, C.y += (he.y - te.y) * ae, C.z += (he.z - te.z) * ae } } G.pushVertex(C.x, C.y, C.z) } for (var le = 0, ce = Y.length; ce > le; le++) { var ue = Y[le], Q = Z === !0 ? J.materials[ue.materialIndex] : b.material; if (void 0 !== Q) { var Ee = Q.side, pe = y[ue.a], de = y[ue.b], fe = y[ue.c]; if (G.checkTriangleVisibility(pe, de, fe) !== !1) { var me = G.checkBackfaceCulling(pe, de, fe); if (Ee !== THREE.DoubleSide) { if (Ee === THREE.FrontSide && me === !1) continue; if (Ee === THREE.BackSide && me === !0) continue } u = r(), u.id = b.id, u.v1.copy(pe), u.v2.copy(de), u.v3.copy(fe), u.normalModel.copy(ue.normal), me !== !1 || Ee !== THREE.BackSide && Ee !== THREE.DoubleSide || u.normalModel.negate(), u.normalModel.applyMatrix3(V).normalize(); for (var Te = ue.vertexNormals, ge = 0, Re = Math.min(Te.length, 3); Re > ge; ge++) { var ye = u.vertexNormalsModel[ge]; ye.copy(Te[ge]), me !== !1 || Ee !== THREE.BackSide && Ee !== THREE.DoubleSide || ye.negate(), ye.applyMatrix3(V).normalize() } u.vertexNormalsLength = Te.length; var ve = K[le]; if (void 0 !== ve) for (var He = 0; 3 > He; He++) u.uvs[He].copy(ve[He]); u.color = ue.color, u.material = Q, u.z = (pe.positionScreen.z + de.positionScreen.z + fe.positionScreen.z) / 3, S.elements.push(u) } } } } } else if (b instanceof THREE.Line) { if (w instanceof THREE.BufferGeometry) { var _ = w.attributes; if (void 0 !== _.position) { for (var L = _.position.array, P = 0, F = L.length; F > P; P += 3) G.pushVertex(L[P], L[P + 1], L[P + 2]); if (void 0 !== _.index) for (var W = _.index.array, P = 0, F = W.length; F > P; P += 2) G.pushLine(W[P], W[P + 1]); else for (var xe = b.mode === THREE.LinePieces ? 2 : 1, P = 0, F = L.length / 3 - 1; F > P; P += xe) G.pushLine(P, P + 1) } } else if (w instanceof THREE.Geometry) { D.multiplyMatrices(U, T); var q = b.geometry.vertices; if (0 === q.length) continue; pe = t(), pe.positionScreen.copy(q[0]).applyMatrix4(D); for (var xe = b.mode === THREE.LinePieces ? 2 : 1, $ = 1, ee = q.length; ee > $; $++) pe = t(), pe.positionScreen.copy(q[$]).applyMatrix4(D), ($ + 1) % xe > 0 || (de = y[c - 2], k.copy(pe.positionScreen), N.copy(de.positionScreen), a(k, N) === !0 && (k.multiplyScalar(1 / k.w), N.multiplyScalar(1 / N.w), p = i(), p.id = b.id, p.v1.positionScreen.copy(k), p.v2.positionScreen.copy(N), p.z = Math.max(k.z, N.z), p.material = b.material, b.material.vertexColors === THREE.VertexColors && (p.vertexColors[0].copy(b.geometry.colors[$]), p.vertexColors[1].copy(b.geometry.colors[$ - 1])), S.elements.push(p))) } } else if (b instanceof THREE.Sprite) { A.set(T.elements[12], T.elements[13], T.elements[14], 1), A.applyMatrix4(U); var be = 1 / A.w; A.z *= be, A.z >= -1 && A.z <= 1 && (f = n(), f.id = b.id, f.x = A.x * be, f.y = A.y * be, f.z = A.z, f.object = b, f.rotation = b.rotation, f.scale.x = b.scale.x * Math.abs(f.x - (A.x + g.projectionMatrix.elements[0]) / (A.w + g.projectionMatrix.elements[12])), f.scale.y = b.scale.y * Math.abs(f.y - (A.y + g.projectionMatrix.elements[5]) / (A.w + g.projectionMatrix.elements[13])), f.material = b.material, S.elements.push(f)) } } return v === !0 && S.elements.sort(o), S } }, THREE.StereoEffect = function(e) { var t = this; this.eyeSeparation = 3, this.focalLength = 15, Object.defineProperties(this, { separation: { get: function() { return t.eyeSeparation }, set: function(e) { console.warn("THREE.StereoEffect: .separation is now .eyeSeparation."), t.eyeSeparation = e } }, targetDistance: { get: function() { return t.focalLength }, set: function(e) { console.warn("THREE.StereoEffect: .targetDistance is now .focalLength."), t.focalLength = e } } }); var r, i, n, o, a, s, h, l, c, u, E, p, d = new THREE.Vector3, f = new THREE.Quaternion, m = new THREE.Vector3, T = new THREE.PerspectiveCamera, g = new THREE.PerspectiveCamera; e.autoClear = !1, this.setSize = function(t, n) { r = t / 2, i = n, e.setSize(t, n) }, this.render = function(t, R) { t.updateMatrixWorld(), void 0 === R.parent && R.updateMatrixWorld(), R.matrixWorld.decompose(d, f, m), n = THREE.Math.radToDeg(2 * Math.atan(Math.tan(.5 * THREE.Math.degToRad(R.fov)) / R.zoom)), l = R.near / this.focalLength, u = Math.tan(.5 * THREE.Math.degToRad(n)) * this.focalLength, c = .5 * u * R.aspect, s = u * l, h = -s, E = (c + this.eyeSeparation / 2) / (2 * c), p = 1 - E, o = 2 * c * l * p, a = 2 * c * l * E, T.projectionMatrix.makeFrustum(-o, a, h, s, R.near, R.far), T.position.copy(d), T.quaternion.copy(f), T.translateX(-this.eyeSeparation / 2), g.projectionMatrix.makeFrustum(-a, o, h, s, R.near, R.far), g.position.copy(d), g.quaternion.copy(f), g.translateX(this.eyeSeparation / 2), e.clear(), e.enableScissorTest(!0), e.setScissor(0, 0, r, i), e.setViewport(0, 0, r, i), e.render(t, T), e.setScissor(r, 0, r, i), e.setViewport(r, 0, r, i), e.render(t, g), e.enableScissorTest(!1) } };