// threejs.org/license (function(l, sa) { "object" === typeof exports && "undefined" !== typeof module ? sa(exports) : "function" === typeof define && define.amd ? define(["exports"], sa) : sa(l.THREE = l.THREE || {}) } )(this, function(l) { function sa() {} function B(a, b) { this.x = a || 0; this.y = b || 0 } function da(a, b, c, d, e, f, g, h, k, m) { Object.defineProperty(this, "id", { value: ee++ }); this.uuid = T.generateUUID(); this.sourceFile = this.name = ""; this.image = void 0 !== a ? a : da.DEFAULT_IMAGE; this.mipmaps = []; this.mapping = void 0 !== b ? b : da.DEFAULT_MAPPING; this.wrapS = void 0 !== c ? c : 1001; this.wrapT = void 0 !== d ? d : 1001; this.magFilter = void 0 !== e ? e : 1006; this.minFilter = void 0 !== f ? f : 1008; this.anisotropy = void 0 !== k ? k : 1; this.format = void 0 !== g ? g : 1023; this.type = void 0 !== h ? h : 1009; this.offset = new B(0,0); this.repeat = new B(1,1); this.generateMipmaps = !0; this.premultiplyAlpha = !1; this.flipY = !0; this.unpackAlignment = 4; this.encoding = void 0 !== m ? m : 3E3; this.version = 0; this.onUpdate = null } function ga(a, b, c, d) { this.x = a || 0; this.y = b || 0; this.z = c || 0; this.w = void 0 !== d ? d : 1 } function Db(a, b, c) { this.uuid = T.generateUUID(); this.width = a; this.height = b; this.scissor = new ga(0,0,a,b); this.scissorTest = !1; this.viewport = new ga(0,0,a,b); c = c || {}; void 0 === c.minFilter && (c.minFilter = 1006); this.texture = new da(void 0,void 0,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,c.encoding); this.depthBuffer = void 0 !== c.depthBuffer ? c.depthBuffer : !0; this.stencilBuffer = void 0 !== c.stencilBuffer ? c.stencilBuffer : !0; this.depthTexture = void 0 !== c.depthTexture ? c.depthTexture : null } function Eb(a, b, c) { Db.call(this, a, b, c); this.activeMipMapLevel = this.activeCubeFace = 0 } function ba(a, b, c, d) { this._x = a || 0; this._y = b || 0; this._z = c || 0; this._w = void 0 !== d ? d : 1 } function q(a, b, c) { this.x = a || 0; this.y = b || 0; this.z = c || 0 } function J() { this.elements = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]); 0 < arguments.length && console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.") } function Xa(a, b, c, d, e, f, g, h, k, m) { a = void 0 !== a ? a : []; da.call(this, a, void 0 !== b ? b : 301, c, d, e, f, g, h, k, m); this.flipY = !1 } function Fb(a, b, c) { var d = a[0]; if (0 >= d || 0 < d) return a; var e = b * c , f = fe[e]; void 0 === f && (f = new Float32Array(e), fe[e] = f); if (0 !== b) for (d.toArray(f, 0), d = 1, e = 0; d !== b; ++d) e += c, a[d].toArray(f, e); return f } function ge(a, b) { var c = he[b]; void 0 === c && (c = new Int32Array(b), he[b] = c); for (var d = 0; d !== b; ++d) c[d] = a.allocTextureUnit(); return c } function Ie(a, b) { a.uniform1f(this.addr, b) } function Je(a, b) { a.uniform1i(this.addr, b) } function Ke(a, b) { void 0 === b.x ? a.uniform2fv(this.addr, b) : a.uniform2f(this.addr, b.x, b.y) } function Le(a, b) { void 0 !== b.x ? a.uniform3f(this.addr, b.x, b.y, b.z) : void 0 !== b.r ? a.uniform3f(this.addr, b.r, b.g, b.b) : a.uniform3fv(this.addr, b) } function Me(a, b) { void 0 === b.x ? a.uniform4fv(this.addr, b) : a.uniform4f(this.addr, b.x, b.y, b.z, b.w) } function Ne(a, b) { a.uniformMatrix2fv(this.addr, !1, b.elements || b) } function Oe(a, b) { a.uniformMatrix3fv(this.addr, !1, b.elements || b) } function Pe(a, b) { a.uniformMatrix4fv(this.addr, !1, b.elements || b) } function Qe(a, b, c) { var d = c.allocTextureUnit(); a.uniform1i(this.addr, d); c.setTexture2D(b || ie, d) } function Re(a, b, c) { var d = c.allocTextureUnit(); a.uniform1i(this.addr, d); c.setTextureCube(b || je, d) } function ke(a, b) { a.uniform2iv(this.addr, b) } function le(a, b) { a.uniform3iv(this.addr, b) } function me(a, b) { a.uniform4iv(this.addr, b) } function Se(a) { switch (a) { case 5126: return Ie; case 35664: return Ke; case 35665: return Le; case 35666: return Me; case 35674: return Ne; case 35675: return Oe; case 35676: return Pe; case 35678: return Qe; case 35680: return Re; case 5124: case 35670: return Je; case 35667: case 35671: return ke; case 35668: case 35672: return le; case 35669: case 35673: return me } } function Te(a, b) { a.uniform1fv(this.addr, b) } function Ue(a, b) { a.uniform1iv(this.addr, b) } function Ve(a, b) { a.uniform2fv(this.addr, Fb(b, this.size, 2)) } function We(a, b) { a.uniform3fv(this.addr, Fb(b, this.size, 3)) } function Xe(a, b) { a.uniform4fv(this.addr, Fb(b, this.size, 4)) } function Ye(a, b) { a.uniformMatrix2fv(this.addr, !1, Fb(b, this.size, 4)) } function Ze(a, b) { a.uniformMatrix3fv(this.addr, !1, Fb(b, this.size, 9)) } function $e(a, b) { a.uniformMatrix4fv(this.addr, !1, Fb(b, this.size, 16)) } function af(a, b, c) { var d = b.length , e = ge(c, d); a.uniform1iv(this.addr, e); for (a = 0; a !== d; ++a) c.setTexture2D(b[a] || ie, e[a]) } function bf(a, b, c) { var d = b.length , e = ge(c, d); a.uniform1iv(this.addr, e); for (a = 0; a !== d; ++a) c.setTextureCube(b[a] || je, e[a]) } function cf(a) { switch (a) { case 5126: return Te; case 35664: return Ve; case 35665: return We; case 35666: return Xe; case 35674: return Ye; case 35675: return Ze; case 35676: return $e; case 35678: return af; case 35680: return bf; case 5124: case 35670: return Ue; case 35667: case 35671: return ke; case 35668: case 35672: return le; case 35669: case 35673: return me } } function df(a, b, c) { this.id = a; this.addr = c; this.setValue = Se(b.type) } function ef(a, b, c) { this.id = a; this.addr = c; this.size = b.size; this.setValue = cf(b.type) } function ne(a) { this.id = a; this.seq = []; this.map = {} } function Ya(a, b, c) { this.seq = []; this.map = {}; this.renderer = c; c = a.getProgramParameter(b, a.ACTIVE_UNIFORMS); for (var d = 0; d !== c; ++d) { var e = a.getActiveUniform(b, d) , f = a.getUniformLocation(b, e.name) , g = this , h = e.name , k = h.length; for (zd.lastIndex = 0; ; ) { var m = zd.exec(h) , w = zd.lastIndex , n = m[1] , p = m[3]; "]" === m[2] && (n |= 0); if (void 0 === p || "[" === p && w + 2 === k) { h = g; e = void 0 === p ? new df(n,e,f) : new ef(n,e,f); h.seq.push(e); h.map[e.id] = e; break } else p = g.map[n], void 0 === p && (p = new ne(n), n = g, g = p, n.seq.push(g), n.map[g.id] = g), g = p } } } function O(a, b, c) { return void 0 === b && void 0 === c ? this.set(a) : this.setRGB(a, b, c) } function mc(a, b) { this.min = void 0 !== a ? a : new B(Infinity,Infinity); this.max = void 0 !== b ? b : new B(-Infinity,-Infinity) } function ff(a, b) { var c, d, e, f, g, h, k, m, w, n, p = a.context, r = a.state, x, l, D, u, v, I; this.render = function(y, E, H) { if (0 !== b.length) { y = new q; var F = H.w / H.z , M = .5 * H.z , ca = .5 * H.w , K = 16 / H.w , ja = new B(K * F,K) , Aa = new q(1,1,0) , eb = new B(1,1) , Ka = new mc; Ka.min.set(H.x, H.y); Ka.max.set(H.x + (H.z - 16), H.y + (H.w - 16)); if (void 0 === u) { var K = new Float32Array([-1, -1, 0, 0, 1, -1, 1, 0, 1, 1, 1, 1, -1, 1, 0, 1]) , N = new Uint16Array([0, 1, 2, 0, 2, 3]); x = p.createBuffer(); l = p.createBuffer(); p.bindBuffer(p.ARRAY_BUFFER, x); p.bufferData(p.ARRAY_BUFFER, K, p.STATIC_DRAW); p.bindBuffer(p.ELEMENT_ARRAY_BUFFER, l); p.bufferData(p.ELEMENT_ARRAY_BUFFER, N, p.STATIC_DRAW); v = p.createTexture(); I = p.createTexture(); r.bindTexture(p.TEXTURE_2D, v); p.texImage2D(p.TEXTURE_2D, 0, p.RGB, 16, 16, 0, p.RGB, p.UNSIGNED_BYTE, null); p.texParameteri(p.TEXTURE_2D, p.TEXTURE_WRAP_S, p.CLAMP_TO_EDGE); p.texParameteri(p.TEXTURE_2D, p.TEXTURE_WRAP_T, p.CLAMP_TO_EDGE); p.texParameteri(p.TEXTURE_2D, p.TEXTURE_MAG_FILTER, p.NEAREST); p.texParameteri(p.TEXTURE_2D, p.TEXTURE_MIN_FILTER, p.NEAREST); r.bindTexture(p.TEXTURE_2D, I); p.texImage2D(p.TEXTURE_2D, 0, p.RGBA, 16, 16, 0, p.RGBA, p.UNSIGNED_BYTE, null); p.texParameteri(p.TEXTURE_2D, p.TEXTURE_WRAP_S, p.CLAMP_TO_EDGE); p.texParameteri(p.TEXTURE_2D, p.TEXTURE_WRAP_T, p.CLAMP_TO_EDGE); p.texParameteri(p.TEXTURE_2D, p.TEXTURE_MAG_FILTER, p.NEAREST); p.texParameteri(p.TEXTURE_2D, p.TEXTURE_MIN_FILTER, p.NEAREST); var K = D = { 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}" } , N = p.createProgram() , P = p.createShader(p.FRAGMENT_SHADER) , R = p.createShader(p.VERTEX_SHADER) , S = "precision " + a.getPrecision() + " float;\n"; p.shaderSource(P, S + K.fragmentShader); p.shaderSource(R, S + K.vertexShader); p.compileShader(P); p.compileShader(R); p.attachShader(N, P); p.attachShader(N, R); p.linkProgram(N); u = N; w = p.getAttribLocation(u, "position"); n = p.getAttribLocation(u, "uv"); c = p.getUniformLocation(u, "renderType"); d = p.getUniformLocation(u, "map"); e = p.getUniformLocation(u, "occlusionMap"); f = p.getUniformLocation(u, "opacity"); g = p.getUniformLocation(u, "color"); h = p.getUniformLocation(u, "scale"); k = p.getUniformLocation(u, "rotation"); m = p.getUniformLocation(u, "screenPosition") } p.useProgram(u); r.initAttributes(); r.enableAttribute(w); r.enableAttribute(n); r.disableUnusedAttributes(); p.uniform1i(e, 0); p.uniform1i(d, 1); p.bindBuffer(p.ARRAY_BUFFER, x); p.vertexAttribPointer(w, 2, p.FLOAT, !1, 16, 0); p.vertexAttribPointer(n, 2, p.FLOAT, !1, 16, 8); p.bindBuffer(p.ELEMENT_ARRAY_BUFFER, l); r.disable(p.CULL_FACE); r.setDepthWrite(!1); N = 0; for (P = b.length; N < P; N++) if (K = 16 / H.w, ja.set(K * F, K), R = b[N], y.set(R.matrixWorld.elements[12], R.matrixWorld.elements[13], R.matrixWorld.elements[14]), y.applyMatrix4(E.matrixWorldInverse), y.applyProjection(E.projectionMatrix), Aa.copy(y), eb.x = H.x + Aa.x * M + M - 8, eb.y = H.y + Aa.y * ca + ca - 8, !0 === Ka.containsPoint(eb)) { r.activeTexture(p.TEXTURE0); r.bindTexture(p.TEXTURE_2D, null); r.activeTexture(p.TEXTURE1); r.bindTexture(p.TEXTURE_2D, v); p.copyTexImage2D(p.TEXTURE_2D, 0, p.RGB, eb.x, eb.y, 16, 16, 0); p.uniform1i(c, 0); p.uniform2f(h, ja.x, ja.y); p.uniform3f(m, Aa.x, Aa.y, Aa.z); r.disable(p.BLEND); r.enable(p.DEPTH_TEST); p.drawElements(p.TRIANGLES, 6, p.UNSIGNED_SHORT, 0); r.activeTexture(p.TEXTURE0); r.bindTexture(p.TEXTURE_2D, I); p.copyTexImage2D(p.TEXTURE_2D, 0, p.RGBA, eb.x, eb.y, 16, 16, 0); p.uniform1i(c, 1); r.disable(p.DEPTH_TEST); r.activeTexture(p.TEXTURE1); r.bindTexture(p.TEXTURE_2D, v); p.drawElements(p.TRIANGLES, 6, p.UNSIGNED_SHORT, 0); R.positionScreen.copy(Aa); R.customUpdateCallback ? R.customUpdateCallback(R) : R.updateLensFlares(); p.uniform1i(c, 2); r.enable(p.BLEND); for (var S = 0, gf = R.lensFlares.length; S < gf; S++) { var V = R.lensFlares[S]; .001 < V.opacity && .001 < V.scale && (Aa.x = V.x, Aa.y = V.y, Aa.z = V.z, K = V.size * V.scale / H.w, ja.x = K * F, ja.y = K, p.uniform3f(m, Aa.x, Aa.y, Aa.z), p.uniform2f(h, ja.x, ja.y), p.uniform1f(k, V.rotation), p.uniform1f(f, V.opacity), p.uniform3f(g, V.color.r, V.color.g, V.color.b), r.setBlending(V.blending, V.blendEquation, V.blendSrc, V.blendDst), a.setTexture2D(V.texture, 1), p.drawElements(p.TRIANGLES, 6, p.UNSIGNED_SHORT, 0)) } } r.enable(p.CULL_FACE); r.enable(p.DEPTH_TEST); r.setDepthWrite(!0); a.resetGLState() } } } function hf(a, b) { var c, d, e, f, g, h, k, m, w, n, p, r, x, l, D, u, v; function I(a, b) { return a.renderOrder !== b.renderOrder ? a.renderOrder - b.renderOrder : a.z !== b.z ? b.z - a.z : b.id - a.id } var y = a.context, E = a.state, H, F, M, ca, K = new q, ja = new ba, Aa = new q; this.render = function(q, Ka) { if (0 !== b.length) { if (void 0 === M) { var N = new Float32Array([-.5, -.5, 0, 0, .5, -.5, 1, 0, .5, .5, 1, 1, -.5, .5, 0, 1]) , P = new Uint16Array([0, 1, 2, 0, 2, 3]); H = y.createBuffer(); F = y.createBuffer(); y.bindBuffer(y.ARRAY_BUFFER, H); y.bufferData(y.ARRAY_BUFFER, N, y.STATIC_DRAW); y.bindBuffer(y.ELEMENT_ARRAY_BUFFER, F); y.bufferData(y.ELEMENT_ARRAY_BUFFER, P, y.STATIC_DRAW); var N = y.createProgram() , P = y.createShader(y.VERTEX_SHADER) , R = y.createShader(y.FRAGMENT_SHADER); y.shaderSource(P, ["precision " + a.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")); y.shaderSource(R, ["precision " + a.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;\nfogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"].join("\n")); y.compileShader(P); y.compileShader(R); y.attachShader(N, P); y.attachShader(N, R); y.linkProgram(N); M = N; u = y.getAttribLocation(M, "position"); v = y.getAttribLocation(M, "uv"); c = y.getUniformLocation(M, "uvOffset"); d = y.getUniformLocation(M, "uvScale"); e = y.getUniformLocation(M, "rotation"); f = y.getUniformLocation(M, "scale"); g = y.getUniformLocation(M, "color"); h = y.getUniformLocation(M, "map"); k = y.getUniformLocation(M, "opacity"); m = y.getUniformLocation(M, "modelViewMatrix"); w = y.getUniformLocation(M, "projectionMatrix"); n = y.getUniformLocation(M, "fogType"); p = y.getUniformLocation(M, "fogDensity"); r = y.getUniformLocation(M, "fogNear"); x = y.getUniformLocation(M, "fogFar"); l = y.getUniformLocation(M, "fogColor"); D = y.getUniformLocation(M, "alphaTest"); N = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas"); N.width = 8; N.height = 8; P = N.getContext("2d"); P.fillStyle = "white"; P.fillRect(0, 0, 8, 8); ca = new da(N); ca.needsUpdate = !0 } y.useProgram(M); E.initAttributes(); E.enableAttribute(u); E.enableAttribute(v); E.disableUnusedAttributes(); E.disable(y.CULL_FACE); E.enable(y.BLEND); y.bindBuffer(y.ARRAY_BUFFER, H); y.vertexAttribPointer(u, 2, y.FLOAT, !1, 16, 0); y.vertexAttribPointer(v, 2, y.FLOAT, !1, 16, 8); y.bindBuffer(y.ELEMENT_ARRAY_BUFFER, F); y.uniformMatrix4fv(w, !1, Ka.projectionMatrix.elements); E.activeTexture(y.TEXTURE0); y.uniform1i(h, 0); P = N = 0; (R = q.fog) ? (y.uniform3f(l, R.color.r, R.color.g, R.color.b), R && R.isFog ? (y.uniform1f(r, R.near), y.uniform1f(x, R.far), y.uniform1i(n, 1), P = N = 1) : R && R.isFogExp2 && (y.uniform1f(p, R.density), y.uniform1i(n, 2), P = N = 2)) : (y.uniform1i(n, 0), P = N = 0); for (var R = 0, S = b.length; R < S; R++) { var B = b[R]; B.modelViewMatrix.multiplyMatrices(Ka.matrixWorldInverse, B.matrixWorld); B.z = -B.modelViewMatrix.elements[14] } b.sort(I); for (var V = [], R = 0, S = b.length; R < S; R++) { var B = b[R] , ta = B.material; !1 !== ta.visible && (y.uniform1f(D, ta.alphaTest), y.uniformMatrix4fv(m, !1, B.modelViewMatrix.elements), B.matrixWorld.decompose(K, ja, Aa), V[0] = Aa.x, V[1] = Aa.y, B = 0, q.fog && ta.fog && (B = P), N !== B && (y.uniform1i(n, B), N = B), null !== ta.map ? (y.uniform2f(c, ta.map.offset.x, ta.map.offset.y), y.uniform2f(d, ta.map.repeat.x, ta.map.repeat.y)) : (y.uniform2f(c, 0, 0), y.uniform2f(d, 1, 1)), y.uniform1f(k, ta.opacity), y.uniform3f(g, ta.color.r, ta.color.g, ta.color.b), y.uniform1f(e, ta.rotation), y.uniform2fv(f, V), E.setBlending(ta.blending, ta.blendEquation, ta.blendSrc, ta.blendDst), E.setDepthTest(ta.depthTest), E.setDepthWrite(ta.depthWrite), ta.map ? a.setTexture2D(ta.map, 0) : a.setTexture2D(ca, 0), y.drawElements(y.TRIANGLES, 6, y.UNSIGNED_SHORT, 0)) } E.enable(y.CULL_FACE); a.resetGLState() } } } function U() { Object.defineProperty(this, "id", { value: oe++ }); this.uuid = T.generateUUID(); this.name = ""; this.type = "Material"; this.lights = this.fog = !0; this.blending = 1; this.side = 0; this.shading = 2; this.vertexColors = 0; this.opacity = 1; this.transparent = !1; this.blendSrc = 204; this.blendDst = 205; this.blendEquation = 100; this.blendEquationAlpha = this.blendDstAlpha = this.blendSrcAlpha = null; this.depthFunc = 3; this.depthWrite = this.depthTest = !0; this.clippingPlanes = null; this.clipShadows = this.clipIntersection = !1; this.colorWrite = !0; this.precision = null; this.polygonOffset = !1; this.alphaTest = this.polygonOffsetUnits = this.polygonOffsetFactor = 0; this.premultipliedAlpha = !1; this.overdraw = 0; this._needsUpdate = this.visible = !0 } function Fa(a) { U.call(this); this.type = "ShaderMaterial"; this.defines = {}; this.uniforms = {}; this.vertexShader = "void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}"; this.fragmentShader = "void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}"; this.linewidth = 1; this.wireframe = !1; this.wireframeLinewidth = 1; this.morphNormals = this.morphTargets = this.skinning = this.clipping = this.lights = this.fog = !1; this.extensions = { derivatives: !1, fragDepth: !1, drawBuffers: !1, shaderTextureLOD: !1 }; this.defaultAttributeValues = { color: [1, 1, 1], uv: [0, 0], uv2: [0, 0] }; this.index0AttributeName = void 0; void 0 !== a && (void 0 !== a.attributes && console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."), this.setValues(a)) } function Za(a) { U.call(this); this.type = "MeshDepthMaterial"; this.depthPacking = 3200; this.morphTargets = this.skinning = !1; this.displacementMap = this.alphaMap = this.map = null; this.displacementScale = 1; this.displacementBias = 0; this.wireframe = !1; this.wireframeLinewidth = 1; this.lights = this.fog = !1; this.setValues(a) } function Ba(a, b) { this.min = void 0 !== a ? a : new q(Infinity,Infinity,Infinity); this.max = void 0 !== b ? b : new q(-Infinity,-Infinity,-Infinity) } function Ca(a, b) { this.center = void 0 !== a ? a : new q; this.radius = void 0 !== b ? b : 0 } function Ia() { this.elements = new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); 0 < arguments.length && console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.") } function va(a, b) { this.normal = void 0 !== a ? a : new q(1,0,0); this.constant = void 0 !== b ? b : 0 } function nc(a, b, c, d, e, f) { this.planes = [void 0 !== a ? a : new va, void 0 !== b ? b : new va, void 0 !== c ? c : new va, void 0 !== d ? d : new va, void 0 !== e ? e : new va, void 0 !== f ? f : new va] } function pe(a, b, c, d) { function e(b, c, d, e) { var f = b.geometry, g; g = D; var h = b.customDepthMaterial; d && (g = u, h = b.customDistanceMaterial); h ? g = h : (h = !1, c.morphTargets && (f && f.isBufferGeometry ? h = f.morphAttributes && f.morphAttributes.position && 0 < f.morphAttributes.position.length : f && f.isGeometry && (h = f.morphTargets && 0 < f.morphTargets.length)), b = b.isSkinnedMesh && c.skinning, f = 0, h && (f |= 1), b && (f |= 2), g = g[f]); a.localClippingEnabled && !0 === c.clipShadows && 0 !== c.clippingPlanes.length && (f = g.uuid, h = c.uuid, b = v[f], void 0 === b && (b = {}, v[f] = b), f = b[h], void 0 === f && (f = g.clone(), b[h] = f), g = f); g.visible = c.visible; g.wireframe = c.wireframe; h = c.side; ja.renderSingleSided && 2 == h && (h = 0); ja.renderReverseSided && (0 === h ? h = 1 : 1 === h && (h = 0)); g.side = h; g.clipShadows = c.clipShadows; g.clippingPlanes = c.clippingPlanes; g.wireframeLinewidth = c.wireframeLinewidth; g.linewidth = c.linewidth; d && void 0 !== g.uniforms.lightPos && g.uniforms.lightPos.value.copy(e); return g } function f(a, b, c) { if (!1 !== a.visible) { 0 !== (a.layers.mask & b.layers.mask) && (a.isMesh || a.isLine || a.isPoints) && a.castShadow && (!1 === a.frustumCulled || !0 === k.intersectsObject(a)) && !0 === a.material.visible && (a.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse, a.matrixWorld), l.push(a)); a = a.children; for (var d = 0, e = a.length; d < e; d++) f(a[d], b, c) } } var g = a.context , h = a.state , k = new nc , m = new J , w = b.shadows , n = new B , p = new B(d.maxTextureSize,d.maxTextureSize) , r = new q , x = new q , l = [] , D = Array(4) , u = Array(4) , v = {} , I = [new q(1,0,0), new q(-1,0,0), new q(0,0,1), new q(0,0,-1), new q(0,1,0), new q(0,-1,0)] , y = [new q(0,1,0), new q(0,1,0), new q(0,1,0), new q(0,1,0), new q(0,0,1), new q(0,0,-1)] , E = [new ga, new ga, new ga, new ga, new ga, new ga]; b = new Za; b.depthPacking = 3201; b.clipping = !0; d = Gb.distanceRGBA; for (var H = La.clone(d.uniforms), F = 0; 4 !== F; ++F) { var M = 0 !== (F & 1) , ca = 0 !== (F & 2) , K = b.clone(); K.morphTargets = M; K.skinning = ca; D[F] = K; M = new Fa({ defines: { USE_SHADOWMAP: "" }, uniforms: H, vertexShader: d.vertexShader, fragmentShader: d.fragmentShader, morphTargets: M, skinning: ca, clipping: !0 }); u[F] = M } var ja = this; this.enabled = !1; this.autoUpdate = !0; this.needsUpdate = !1; this.type = 1; this.renderSingleSided = this.renderReverseSided = !0; this.render = function(b, d) { if (!1 !== ja.enabled && (!1 !== ja.autoUpdate || !1 !== ja.needsUpdate) && 0 !== w.length) { h.clearColor(1, 1, 1, 1); h.disable(g.BLEND); h.setDepthTest(!0); h.setScissorTest(!1); for (var v, u, q = 0, D = w.length; q < D; q++) { var H = w[q] , F = H.shadow; if (void 0 === F) console.warn("THREE.WebGLShadowMap:", H, "has no shadow."); else { var M = F.camera; n.copy(F.mapSize); n.min(p); if (H && H.isPointLight) { v = 6; u = !0; var K = n.x , ca = n.y; E[0].set(2 * K, ca, K, ca); E[1].set(0, ca, K, ca); E[2].set(3 * K, ca, K, ca); E[3].set(K, ca, K, ca); E[4].set(3 * K, 0, K, ca); E[5].set(K, 0, K, ca); n.x *= 4; n.y *= 2 } else v = 1, u = !1; null === F.map && (F.map = new Db(n.x,n.y,{ minFilter: 1003, magFilter: 1003, format: 1023 }), M.updateProjectionMatrix()); F && F.isSpotLightShadow && F.update(H); K = F.map; F = F.matrix; x.setFromMatrixPosition(H.matrixWorld); M.position.copy(x); a.setRenderTarget(K); a.clear(); for (K = 0; K < v; K++) { u ? (r.copy(M.position), r.add(I[K]), M.up.copy(y[K]), M.lookAt(r), h.viewport(E[K])) : (r.setFromMatrixPosition(H.target.matrixWorld), M.lookAt(r)); M.updateMatrixWorld(); M.matrixWorldInverse.getInverse(M.matrixWorld); F.set(.5, 0, 0, .5, 0, .5, 0, .5, 0, 0, .5, .5, 0, 0, 0, 1); F.multiply(M.projectionMatrix); F.multiply(M.matrixWorldInverse); m.multiplyMatrices(M.projectionMatrix, M.matrixWorldInverse); k.setFromMatrix(m); l.length = 0; f(b, d, M); for (var ca = 0, B = l.length; ca < B; ca++) { var C = l[ca] , z = c.update(C) , G = C.material; if (G && G.isMultiMaterial) for (var $a = z.groups, G = G.materials, Ad = 0, Da = $a.length; Ad < Da; Ad++) { var Ra = $a[Ad] , Pa = G[Ra.materialIndex]; !0 === Pa.visible && (Pa = e(C, Pa, u, x), a.renderBufferDirect(M, null, z, Pa, C, Ra)) } else Pa = e(C, G, u, x), a.renderBufferDirect(M, null, z, Pa, C, null) } } } } v = a.getClearColor(); u = a.getClearAlpha(); a.setClearColor(v, u); ja.needsUpdate = !1 } } } function ab(a, b) { this.origin = void 0 !== a ? a : new q; this.direction = void 0 !== b ? b : new q } function bb(a, b, c, d) { this._x = a || 0; this._y = b || 0; this._z = c || 0; this._order = d || bb.DefaultOrder } function Yc() { this.mask = 1 } function z() { Object.defineProperty(this, "id", { value: qe++ }); this.uuid = T.generateUUID(); this.name = ""; this.type = "Object3D"; this.parent = null; this.children = []; this.up = z.DefaultUp.clone(); var a = new q , b = new bb , c = new ba , d = new q(1,1,1); b.onChange(function() { c.setFromEuler(b, !1) }); c.onChange(function() { b.setFromQuaternion(c, void 0, !1) }); Object.defineProperties(this, { position: { enumerable: !0, value: a }, rotation: { enumerable: !0, value: b }, quaternion: { enumerable: !0, value: c }, scale: { enumerable: !0, value: d }, modelViewMatrix: { value: new J }, normalMatrix: { value: new Ia } }); this.matrix = new J; this.matrixWorld = new J; this.matrixAutoUpdate = z.DefaultMatrixAutoUpdate; this.matrixWorldNeedsUpdate = !1; this.layers = new Yc; this.visible = !0; this.receiveShadow = this.castShadow = !1; this.frustumCulled = !0; this.renderOrder = 0; this.userData = {}; this.onBeforeRender = function() {} ; this.onAfterRender = function() {} } function gb(a, b) { this.start = void 0 !== a ? a : new q; this.end = void 0 !== b ? b : new q } function wa(a, b, c) { this.a = void 0 !== a ? a : new q; this.b = void 0 !== b ? b : new q; this.c = void 0 !== c ? c : new q } function ea(a, b, c, d, e, f) { this.a = a; this.b = b; this.c = c; this.normal = d && d.isVector3 ? d : new q; this.vertexNormals = Array.isArray(d) ? d : []; this.color = e && e.isColor ? e : new O; this.vertexColors = Array.isArray(e) ? e : []; this.materialIndex = void 0 !== f ? f : 0 } function Ma(a) { U.call(this); this.type = "MeshBasicMaterial"; this.color = new O(16777215); this.aoMap = this.map = null; this.aoMapIntensity = 1; this.envMap = this.alphaMap = this.specularMap = null; this.combine = 0; this.reflectivity = 1; this.refractionRatio = .98; this.wireframe = !1; this.wireframeLinewidth = 1; this.wireframeLinejoin = this.wireframeLinecap = "round"; this.lights = this.morphTargets = this.skinning = !1; this.setValues(a) } function C(a, b, c) { if (Array.isArray(a)) throw new TypeError("THREE.BufferAttribute: array should be a Typed Array."); this.uuid = T.generateUUID(); this.array = a; this.itemSize = b; this.count = void 0 !== a ? a.length / b : 0; this.normalized = !0 === c; this.dynamic = !1; this.updateRange = { offset: 0, count: -1 }; this.version = 0 } function Zc(a, b) { return new C(new Uint16Array(a),b) } function $c(a, b) { return new C(new Uint32Array(a),b) } function ha(a, b) { return new C(new Float32Array(a),b) } function Q() { Object.defineProperty(this, "id", { value: ad++ }); this.uuid = T.generateUUID(); this.name = ""; this.type = "Geometry"; this.vertices = []; this.colors = []; this.faces = []; this.faceVertexUvs = [[]]; this.morphTargets = []; this.morphNormals = []; this.skinWeights = []; this.skinIndices = []; this.lineDistances = []; this.boundingSphere = this.boundingBox = null; this.groupsNeedUpdate = this.lineDistancesNeedUpdate = this.colorsNeedUpdate = this.normalsNeedUpdate = this.uvsNeedUpdate = this.verticesNeedUpdate = this.elementsNeedUpdate = !1 } function re() { Object.defineProperty(this, "id", { value: ad++ }); this.uuid = T.generateUUID(); this.name = ""; this.type = "DirectGeometry"; this.indices = []; this.vertices = []; this.normals = []; this.colors = []; this.uvs = []; this.uvs2 = []; this.groups = []; this.morphTargets = {}; this.skinWeights = []; this.skinIndices = []; this.boundingSphere = this.boundingBox = null; this.groupsNeedUpdate = this.uvsNeedUpdate = this.colorsNeedUpdate = this.normalsNeedUpdate = this.verticesNeedUpdate = !1 } function G() { Object.defineProperty(this, "id", { value: ad++ }); this.uuid = T.generateUUID(); this.name = ""; this.type = "BufferGeometry"; this.index = null; this.attributes = {}; this.morphAttributes = {}; this.groups = []; this.boundingSphere = this.boundingBox = null; this.drawRange = { start: 0, count: Infinity } } function ya(a, b) { z.call(this); this.type = "Mesh"; this.geometry = void 0 !== a ? a : new G; this.material = void 0 !== b ? b : new Ma({ color: 16777215 * Math.random() }); this.drawMode = 0; this.updateMorphTargets() } function hb(a, b, c, d, e, f) { function g(a, b, c, d, e, f, g, k, m, B, C) { var Ka = f / m , N = g / B , P = f / 2 , R = g / 2 , S = k / 2; g = m + 1; for (var z = B + 1, V = f = 0, G = new q, L = 0; L < z; L++) for (var O = L * N - R, J = 0; J < g; J++) G[a] = (J * Ka - P) * d, G[b] = O * e, G[c] = S, n[l] = G.x, n[l + 1] = G.y, n[l + 2] = G.z, G[a] = 0, G[b] = 0, G[c] = 0 < k ? 1 : -1, p[l] = G.x, p[l + 1] = G.y, p[l + 2] = G.z, r[t] = J / m, r[t + 1] = 1 - L / B, l += 3, t += 2, f += 1; for (L = 0; L < B; L++) for (J = 0; J < m; J++) a = u + J + g * (L + 1), b = u + (J + 1) + g * (L + 1), c = u + (J + 1) + g * L, w[D] = u + J + g * L, w[D + 1] = a, w[D + 2] = c, w[D + 3] = a, w[D + 4] = b, w[D + 5] = c, D += 6, V += 6; h.addGroup(v, V, C); v += V; u += f } G.call(this); this.type = "BoxBufferGeometry"; this.parameters = { width: a, height: b, depth: c, widthSegments: d, heightSegments: e, depthSegments: f }; var h = this; d = Math.floor(d) || 1; e = Math.floor(e) || 1; f = Math.floor(f) || 1; var k = function(a, b, c) { return a = 0 + (a + 1) * (b + 1) * 2 + (a + 1) * (c + 1) * 2 + (c + 1) * (b + 1) * 2 }(d, e, f) , m = function(a, b, c) { a = 0 + a * b * 2 + a * c * 2 + c * b * 2; return 6 * a }(d, e, f) , w = new (65535 < m ? Uint32Array : Uint16Array)(m) , n = new Float32Array(3 * k) , p = new Float32Array(3 * k) , r = new Float32Array(2 * k) , l = 0 , t = 0 , D = 0 , u = 0 , v = 0; g("z", "y", "x", -1, -1, c, b, a, f, e, 0); g("z", "y", "x", 1, -1, c, b, -a, f, e, 1); g("x", "z", "y", 1, 1, a, c, b, d, f, 2); g("x", "z", "y", 1, -1, a, c, -b, d, f, 3); g("x", "y", "z", 1, -1, a, b, c, d, e, 4); g("x", "y", "z", -1, -1, a, b, -c, d, e, 5); this.setIndex(new C(w,1)); this.addAttribute("position", new C(n,3)); this.addAttribute("normal", new C(p,3)); this.addAttribute("uv", new C(r,2)) } function ib(a, b, c, d) { G.call(this); this.type = "PlaneBufferGeometry"; this.parameters = { width: a, height: b, widthSegments: c, heightSegments: d }; var e = a / 2 , f = b / 2; c = Math.floor(c) || 1; d = Math.floor(d) || 1; var g = c + 1 , h = d + 1 , k = a / c , m = b / d; b = new Float32Array(g * h * 3); a = new Float32Array(g * h * 3); for (var w = new Float32Array(g * h * 2), n = 0, p = 0, r = 0; r < h; r++) for (var l = r * m - f, t = 0; t < g; t++) b[n] = t * k - e, b[n + 1] = -l, a[n + 2] = 1, w[p] = t / c, w[p + 1] = 1 - r / d, n += 3, p += 2; n = 0; e = new (65535 < b.length / 3 ? Uint32Array : Uint16Array)(c * d * 6); for (r = 0; r < d; r++) for (t = 0; t < c; t++) f = t + g * (r + 1), h = t + 1 + g * (r + 1), k = t + 1 + g * r, e[n] = t + g * r, e[n + 1] = f, e[n + 2] = k, e[n + 3] = f, e[n + 4] = h, e[n + 5] = k, n += 6; this.setIndex(new C(e,1)); this.addAttribute("position", new C(b,3)); this.addAttribute("normal", new C(a,3)); this.addAttribute("uv", new C(w,2)) } function Z() { z.call(this); this.type = "Camera"; this.matrixWorldInverse = new J; this.projectionMatrix = new J } function Ea(a, b, c, d) { Z.call(this); this.type = "PerspectiveCamera"; this.fov = void 0 !== a ? a : 50; this.zoom = 1; this.near = void 0 !== c ? c : .1; this.far = void 0 !== d ? d : 2E3; this.focus = 10; this.aspect = void 0 !== b ? b : 1; this.view = null; this.filmGauge = 35; this.filmOffset = 0; this.updateProjectionMatrix() } function Hb(a, b, c, d, e, f) { Z.call(this); this.type = "OrthographicCamera"; this.zoom = 1; this.view = null; this.left = a; this.right = b; this.top = c; this.bottom = d; this.near = void 0 !== e ? e : .1; this.far = void 0 !== f ? f : 2E3; this.updateProjectionMatrix() } function jf(a, b, c) { var d, e, f; return { setMode: function(a) { d = a }, setIndex: function(c) { c.array instanceof Uint32Array && b.get("OES_element_index_uint") ? (e = a.UNSIGNED_INT, f = 4) : (e = a.UNSIGNED_SHORT, f = 2) }, render: function(b, h) { a.drawElements(d, h, e, b * f); c.calls++; c.vertices += h; d === a.TRIANGLES && (c.faces += h / 3) }, renderInstances: function(g, h, k) { var m = b.get("ANGLE_instanced_arrays"); null === m ? console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.") : (m.drawElementsInstancedANGLE(d, k, e, h * f, g.maxInstancedCount), c.calls++, c.vertices += k * g.maxInstancedCount, d === a.TRIANGLES && (c.faces += g.maxInstancedCount * k / 3)) } } } function kf(a, b, c) { var d; return { setMode: function(a) { d = a }, render: function(b, f) { a.drawArrays(d, b, f); c.calls++; c.vertices += f; d === a.TRIANGLES && (c.faces += f / 3) }, renderInstances: function(e) { var f = b.get("ANGLE_instanced_arrays"); if (null === f) console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."); else { var g = e.attributes.position , g = g && g.isInterleavedBufferAttribute ? g.data.count : g.count; f.drawArraysInstancedANGLE(d, 0, g, e.maxInstancedCount); c.calls++; c.vertices += g * e.maxInstancedCount; d === a.TRIANGLES && (c.faces += e.maxInstancedCount * g / 3) } } } } function lf() { var a = {}; return { get: function(b) { if (void 0 !== a[b.id]) return a[b.id]; var c; switch (b.type) { case "DirectionalLight": c = { direction: new q, color: new O, shadow: !1, shadowBias: 0, shadowRadius: 1, shadowMapSize: new B }; break; case "SpotLight": c = { position: new q, direction: new q, color: new O, distance: 0, coneCos: 0, penumbraCos: 0, decay: 0, shadow: !1, shadowBias: 0, shadowRadius: 1, shadowMapSize: new B }; break; case "PointLight": c = { position: new q, color: new O, distance: 0, decay: 0, shadow: !1, shadowBias: 0, shadowRadius: 1, shadowMapSize: new B }; break; case "HemisphereLight": c = { direction: new q, skyColor: new O, groundColor: new O } } return a[b.id] = c } } } function mf(a) { a = a.split("\n"); for (var b = 0; b < a.length; b++) a[b] = b + 1 + ": " + a[b]; return a.join("\n") } function se(a, b, c) { var d = a.createShader(b); a.shaderSource(d, c); a.compileShader(d); !1 === a.getShaderParameter(d, a.COMPILE_STATUS) && console.error("THREE.WebGLShader: Shader couldn't compile."); "" !== a.getShaderInfoLog(d) && console.warn("THREE.WebGLShader: gl.getShaderInfoLog()", b === a.VERTEX_SHADER ? "vertex" : "fragment", a.getShaderInfoLog(d), mf(c)); return d } function te(a) { switch (a) { case 3E3: return ["Linear", "( value )"]; case 3001: return ["sRGB", "( value )"]; case 3002: return ["RGBE", "( value )"]; case 3004: return ["RGBM", "( value, 7.0 )"]; case 3005: return ["RGBM", "( value, 16.0 )"]; case 3006: return ["RGBD", "( value, 256.0 )"]; case 3007: return ["Gamma", "( value, float( GAMMA_FACTOR ) )"]; default: throw Error("unsupported encoding: " + a); } } function Bd(a, b) { var c = te(b); return "vec4 " + a + "( vec4 value ) { return " + c[0] + "ToLinear" + c[1] + "; }" } function nf(a, b) { var c = te(b); return "vec4 " + a + "( vec4 value ) { return LinearTo" + c[0] + c[1] + "; }" } function of(a, b) { var c; switch (b) { case 1: c = "Linear"; break; case 2: c = "Reinhard"; break; case 3: c = "Uncharted2"; break; case 4: c = "OptimizedCineon"; break; default: throw Error("unsupported toneMapping: " + b); } return "vec3 " + a + "( vec3 color ) { return " + c + "ToneMapping( color ); }" } function pf(a, b, c) { a = a || {}; return [a.derivatives || b.envMapCubeUV || b.bumpMap || b.normalMap || b.flatShading ? "#extension GL_OES_standard_derivatives : enable" : "", (a.fragDepth || b.logarithmicDepthBuffer) && c.get("EXT_frag_depth") ? "#extension GL_EXT_frag_depth : enable" : "", a.drawBuffers && c.get("WEBGL_draw_buffers") ? "#extension GL_EXT_draw_buffers : require" : "", (a.shaderTextureLOD || b.envMap) && c.get("EXT_shader_texture_lod") ? "#extension GL_EXT_shader_texture_lod : enable" : ""].filter(oc).join("\n") } function qf(a) { var b = [], c; for (c in a) { var d = a[c]; !1 !== d && b.push("#define " + c + " " + d) } return b.join("\n") } function oc(a) { return "" !== a } function ue(a, b) { return a.replace(/NUM_DIR_LIGHTS/g, b.numDirLights).replace(/NUM_SPOT_LIGHTS/g, b.numSpotLights).replace(/NUM_POINT_LIGHTS/g, b.numPointLights).replace(/NUM_HEMI_LIGHTS/g, b.numHemiLights) } function Cd(a) { return a.replace(/#include +<([\w\d.]+)>/g, function(a, c) { var d = X[c]; if (void 0 === d) throw Error("Can not resolve #include <" + c + ">"); return Cd(d) }) } function ve(a) { return a.replace(/for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g, function(a, c, d, e) { a = ""; for (c = parseInt(c); c < parseInt(d); c++) a += e.replace(/\[ i \]/g, "[ " + c + " ]"); return a }) } function rf(a, b, c, d) { var e = a.context , f = c.extensions , g = c.defines , h = c.__webglShader.vertexShader , k = c.__webglShader.fragmentShader , m = "SHADOWMAP_TYPE_BASIC"; 1 === d.shadowMapType ? m = "SHADOWMAP_TYPE_PCF" : 2 === d.shadowMapType && (m = "SHADOWMAP_TYPE_PCF_SOFT"); var w = "ENVMAP_TYPE_CUBE" , n = "ENVMAP_MODE_REFLECTION" , p = "ENVMAP_BLENDING_MULTIPLY"; if (d.envMap) { switch (c.envMap.mapping) { case 301: case 302: w = "ENVMAP_TYPE_CUBE"; break; case 306: case 307: w = "ENVMAP_TYPE_CUBE_UV"; break; case 303: case 304: w = "ENVMAP_TYPE_EQUIREC"; break; case 305: w = "ENVMAP_TYPE_SPHERE" } switch (c.envMap.mapping) { case 302: case 304: n = "ENVMAP_MODE_REFRACTION" } switch (c.combine) { case 0: p = "ENVMAP_BLENDING_MULTIPLY"; break; case 1: p = "ENVMAP_BLENDING_MIX"; break; case 2: p = "ENVMAP_BLENDING_ADD" } } var r = 0 < a.gammaFactor ? a.gammaFactor : 1 , f = pf(f, d, a.extensions) , l = qf(g) , t = e.createProgram(); c.isRawShaderMaterial ? (g = [l, "\n"].filter(oc).join("\n"), m = [f, l, "\n"].filter(oc).join("\n")) : (g = ["precision " + d.precision + " float;", "precision " + d.precision + " int;", "#define SHADER_NAME " + c.__webglShader.name, l, d.supportsVertexTextures ? "#define VERTEX_TEXTURES" : "", "#define GAMMA_FACTOR " + r, "#define MAX_BONES " + d.maxBones, d.map ? "#define USE_MAP" : "", d.envMap ? "#define USE_ENVMAP" : "", d.envMap ? "#define " + n : "", d.lightMap ? "#define USE_LIGHTMAP" : "", d.aoMap ? "#define USE_AOMAP" : "", d.emissiveMap ? "#define USE_EMISSIVEMAP" : "", d.bumpMap ? "#define USE_BUMPMAP" : "", d.normalMap ? "#define USE_NORMALMAP" : "", d.displacementMap && d.supportsVertexTextures ? "#define USE_DISPLACEMENTMAP" : "", d.specularMap ? "#define USE_SPECULARMAP" : "", d.roughnessMap ? "#define USE_ROUGHNESSMAP" : "", d.metalnessMap ? "#define USE_METALNESSMAP" : "", d.alphaMap ? "#define USE_ALPHAMAP" : "", d.vertexColors ? "#define USE_COLOR" : "", d.flatShading ? "#define FLAT_SHADED" : "", d.skinning ? "#define USE_SKINNING" : "", d.useVertexTexture ? "#define BONE_TEXTURE" : "", d.morphTargets ? "#define USE_MORPHTARGETS" : "", d.morphNormals && !1 === d.flatShading ? "#define USE_MORPHNORMALS" : "", d.doubleSided ? "#define DOUBLE_SIDED" : "", d.flipSided ? "#define FLIP_SIDED" : "", "#define NUM_CLIPPING_PLANES " + d.numClippingPlanes, d.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", d.shadowMapEnabled ? "#define " + m : "", d.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "", d.logarithmicDepthBuffer ? "#define USE_LOGDEPTHBUF" : "", d.logarithmicDepthBuffer && a.extensions.get("EXT_frag_depth") ? "#define USE_LOGDEPTHBUF_EXT" : "", "uniform mat4 modelMatrix;", "uniform mat4 modelViewMatrix;", "uniform mat4 projectionMatrix;", "uniform mat4 viewMatrix;", "uniform mat3 normalMatrix;", "uniform vec3 cameraPosition;", "attribute vec3 position;", "attribute vec3 normal;", "attribute vec2 uv;", "#ifdef USE_COLOR", "\tattribute vec3 color;", "#endif", "#ifdef USE_MORPHTARGETS", "\tattribute vec3 morphTarget0;", "\tattribute vec3 morphTarget1;", "\tattribute vec3 morphTarget2;", "\tattribute vec3 morphTarget3;", "\t#ifdef USE_MORPHNORMALS", "\t\tattribute vec3 morphNormal0;", "\t\tattribute vec3 morphNormal1;", "\t\tattribute vec3 morphNormal2;", "\t\tattribute vec3 morphNormal3;", "\t#else", "\t\tattribute vec3 morphTarget4;", "\t\tattribute vec3 morphTarget5;", "\t\tattribute vec3 morphTarget6;", "\t\tattribute vec3 morphTarget7;", "\t#endif", "#endif", "#ifdef USE_SKINNING", "\tattribute vec4 skinIndex;", "\tattribute vec4 skinWeight;", "#endif", "\n"].filter(oc).join("\n"), m = [f, "precision " + d.precision + " float;", "precision " + d.precision + " int;", "#define SHADER_NAME " + c.__webglShader.name, l, d.alphaTest ? "#define ALPHATEST " + d.alphaTest : "", "#define GAMMA_FACTOR " + r, d.useFog && d.fog ? "#define USE_FOG" : "", d.useFog && d.fogExp ? "#define FOG_EXP2" : "", d.map ? "#define USE_MAP" : "", d.envMap ? "#define USE_ENVMAP" : "", d.envMap ? "#define " + w : "", d.envMap ? "#define " + n : "", d.envMap ? "#define " + p : "", d.lightMap ? "#define USE_LIGHTMAP" : "", d.aoMap ? "#define USE_AOMAP" : "", d.emissiveMap ? "#define USE_EMISSIVEMAP" : "", d.bumpMap ? "#define USE_BUMPMAP" : "", d.normalMap ? "#define USE_NORMALMAP" : "", d.specularMap ? "#define USE_SPECULARMAP" : "", d.roughnessMap ? "#define USE_ROUGHNESSMAP" : "", d.metalnessMap ? "#define USE_METALNESSMAP" : "", d.alphaMap ? "#define USE_ALPHAMAP" : "", d.vertexColors ? "#define USE_COLOR" : "", d.flatShading ? "#define FLAT_SHADED" : "", d.doubleSided ? "#define DOUBLE_SIDED" : "", d.flipSided ? "#define FLIP_SIDED" : "", "#define NUM_CLIPPING_PLANES " + d.numClippingPlanes, "#define UNION_CLIPPING_PLANES " + (d.numClippingPlanes - d.numClipIntersection), d.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", d.shadowMapEnabled ? "#define " + m : "", d.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : "", d.physicallyCorrectLights ? "#define PHYSICALLY_CORRECT_LIGHTS" : "", d.logarithmicDepthBuffer ? "#define USE_LOGDEPTHBUF" : "", d.logarithmicDepthBuffer && a.extensions.get("EXT_frag_depth") ? "#define USE_LOGDEPTHBUF_EXT" : "", d.envMap && a.extensions.get("EXT_shader_texture_lod") ? "#define TEXTURE_LOD_EXT" : "", "uniform mat4 viewMatrix;", "uniform vec3 cameraPosition;", 0 !== d.toneMapping ? "#define TONE_MAPPING" : "", 0 !== d.toneMapping ? X.tonemapping_pars_fragment : "", 0 !== d.toneMapping ? of("toneMapping", d.toneMapping) : "", d.outputEncoding || d.mapEncoding || d.envMapEncoding || d.emissiveMapEncoding ? X.encodings_pars_fragment : "", d.mapEncoding ? Bd("mapTexelToLinear", d.mapEncoding) : "", d.envMapEncoding ? Bd("envMapTexelToLinear", d.envMapEncoding) : "", d.emissiveMapEncoding ? Bd("emissiveMapTexelToLinear", d.emissiveMapEncoding) : "", d.outputEncoding ? nf("linearToOutputTexel", d.outputEncoding) : "", d.depthPacking ? "#define DEPTH_PACKING " + c.depthPacking : "", "\n"].filter(oc).join("\n")); h = Cd(h, d); h = ue(h, d); k = Cd(k, d); k = ue(k, d); c.isShaderMaterial || (h = ve(h), k = ve(k)); k = m + k; h = se(e, e.VERTEX_SHADER, g + h); k = se(e, e.FRAGMENT_SHADER, k); e.attachShader(t, h); e.attachShader(t, k); void 0 !== c.index0AttributeName ? e.bindAttribLocation(t, 0, c.index0AttributeName) : !0 === d.morphTargets && e.bindAttribLocation(t, 0, "position"); e.linkProgram(t); d = e.getProgramInfoLog(t); w = e.getShaderInfoLog(h); n = e.getShaderInfoLog(k); r = p = !0; if (!1 === e.getProgramParameter(t, e.LINK_STATUS)) p = !1, console.error("THREE.WebGLProgram: shader error: ", e.getError(), "gl.VALIDATE_STATUS", e.getProgramParameter(t, e.VALIDATE_STATUS), "gl.getProgramInfoLog", d, w, n); else if ("" !== d) console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()", d); else if ("" === w || "" === n) r = !1; r && (this.diagnostics = { runnable: p, material: c, programLog: d, vertexShader: { log: w, prefix: g }, fragmentShader: { log: n, prefix: m } }); e.deleteShader(h); e.deleteShader(k); var q; this.getUniforms = function() { void 0 === q && (q = new Ya(e,t,a)); return q } ; var u; this.getAttributes = function() { if (void 0 === u) { for (var a = {}, b = e.getProgramParameter(t, e.ACTIVE_ATTRIBUTES), c = 0; c < b; c++) { var d = e.getActiveAttrib(t, c).name; a[d] = e.getAttribLocation(t, d) } u = a } return u } ; this.destroy = function() { e.deleteProgram(t); this.program = void 0 } ; Object.defineProperties(this, { uniforms: { get: function() { console.warn("THREE.WebGLProgram: .uniforms is now .getUniforms()."); return this.getUniforms() } }, attributes: { get: function() { console.warn("THREE.WebGLProgram: .attributes is now .getAttributes()."); return this.getAttributes() } } }); this.id = sf++; this.code = b; this.usedTimes = 1; this.program = t; this.vertexShader = h; this.fragmentShader = k; return this } function tf(a, b) { function c(a, b) { var c; a ? a && a.isTexture ? c = a.encoding : a && a.isWebGLRenderTarget && (console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."), c = a.texture.encoding) : c = 3E3; 3E3 === c && b && (c = 3007); return c } var d = [] , e = { MeshDepthMaterial: "depth", MeshNormalMaterial: "normal", MeshBasicMaterial: "basic", MeshLambertMaterial: "lambert", MeshPhongMaterial: "phong", MeshStandardMaterial: "physical", MeshPhysicalMaterial: "physical", LineBasicMaterial: "basic", LineDashedMaterial: "dashed", PointsMaterial: "points" } , f = "precision supportsVertexTextures map mapEncoding envMap envMapMode envMapEncoding lightMap aoMap emissiveMap emissiveMapEncoding bumpMap normalMap displacementMap specularMap roughnessMap metalnessMap alphaMap combine vertexColors fog useFog fogExp flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking".split(" "); this.getParameters = function(d, f, k, m, w, n) { var p = e[d.type], r; b.floatVertexTextures && n && n.skeleton && n.skeleton.useVertexTexture ? r = 1024 : (r = Math.floor((b.maxVertexUniforms - 20) / 4), void 0 !== n && n && n.isSkinnedMesh && (r = Math.min(n.skeleton.bones.length, r), r < n.skeleton.bones.length && console.warn("WebGLRenderer: too many bones - " + n.skeleton.bones.length + ", this GPU supports just " + r + " (try OpenGL instead of ANGLE)"))); var l = a.getPrecision(); null !== d.precision && (l = b.getMaxPrecision(d.precision), l !== d.precision && console.warn("THREE.WebGLProgram.getParameters:", d.precision, "not supported, using", l, "instead.")); var t = a.getCurrentRenderTarget(); return { shaderID: p, precision: l, supportsVertexTextures: b.vertexTextures, outputEncoding: c(t ? t.texture : null, a.gammaOutput), map: !!d.map, mapEncoding: c(d.map, a.gammaInput), envMap: !!d.envMap, envMapMode: d.envMap && d.envMap.mapping, envMapEncoding: c(d.envMap, a.gammaInput), envMapCubeUV: !!d.envMap && (306 === d.envMap.mapping || 307 === d.envMap.mapping), lightMap: !!d.lightMap, aoMap: !!d.aoMap, emissiveMap: !!d.emissiveMap, emissiveMapEncoding: c(d.emissiveMap, a.gammaInput), bumpMap: !!d.bumpMap, normalMap: !!d.normalMap, displacementMap: !!d.displacementMap, roughnessMap: !!d.roughnessMap, metalnessMap: !!d.metalnessMap, specularMap: !!d.specularMap, alphaMap: !!d.alphaMap, combine: d.combine, vertexColors: d.vertexColors, fog: !!k, useFog: d.fog, fogExp: k && k.isFogExp2, flatShading: 1 === d.shading, sizeAttenuation: d.sizeAttenuation, logarithmicDepthBuffer: b.logarithmicDepthBuffer, skinning: d.skinning, maxBones: r, useVertexTexture: b.floatVertexTextures && n && n.skeleton && n.skeleton.useVertexTexture, morphTargets: d.morphTargets, morphNormals: d.morphNormals, maxMorphTargets: a.maxMorphTargets, maxMorphNormals: a.maxMorphNormals, numDirLights: f.directional.length, numPointLights: f.point.length, numSpotLights: f.spot.length, numHemiLights: f.hemi.length, numClippingPlanes: m, numClipIntersection: w, shadowMapEnabled: a.shadowMap.enabled && n.receiveShadow && 0 < f.shadows.length, shadowMapType: a.shadowMap.type, toneMapping: a.toneMapping, physicallyCorrectLights: a.physicallyCorrectLights, premultipliedAlpha: d.premultipliedAlpha, alphaTest: d.alphaTest, doubleSided: 2 === d.side, flipSided: 1 === d.side, depthPacking: void 0 !== d.depthPacking ? d.depthPacking : !1 } } ; this.getProgramCode = function(a, b) { var c = []; b.shaderID ? c.push(b.shaderID) : (c.push(a.fragmentShader), c.push(a.vertexShader)); if (void 0 !== a.defines) for (var d in a.defines) c.push(d), c.push(a.defines[d]); for (d = 0; d < f.length; d++) c.push(b[f[d]]); return c.join() } ; this.acquireProgram = function(b, c, e) { for (var f, w = 0, n = d.length; w < n; w++) { var p = d[w]; if (p.code === e) { f = p; ++f.usedTimes; break } } void 0 === f && (f = new rf(a,e,b,c), d.push(f)); return f } ; this.releaseProgram = function(a) { if (0 === --a.usedTimes) { var b = d.indexOf(a); d[b] = d[d.length - 1]; d.pop(); a.destroy() } } ; this.programs = d } function uf(a, b, c) { function d(a) { var h = a.target; a = f[h.id]; null !== a.index && e(a.index); var k = a.attributes, m; for (m in k) e(k[m]); h.removeEventListener("dispose", d); delete f[h.id]; m = b.get(h); m.wireframe && e(m.wireframe); b["delete"](h); h = b.get(a); h.wireframe && e(h.wireframe); b["delete"](a); c.memory.geometries-- } function e(c) { var d; d = c.isInterleavedBufferAttribute ? b.get(c.data).__webglBuffer : b.get(c).__webglBuffer; void 0 !== d && (a.deleteBuffer(d), c.isInterleavedBufferAttribute ? b["delete"](c.data) : b["delete"](c)) } var f = {}; return { get: function(a) { var b = a.geometry; if (void 0 !== f[b.id]) return f[b.id]; b.addEventListener("dispose", d); var e; b.isBufferGeometry ? e = b : b.isGeometry && (void 0 === b._bufferGeometry && (b._bufferGeometry = (new G).setFromObject(a)), e = b._bufferGeometry); f[b.id] = e; c.memory.geometries++; return e } } } function vf(a, b, c) { function d(c, d) { var e = c.isInterleavedBufferAttribute ? c.data : c , k = b.get(e); void 0 === k.__webglBuffer ? (k.__webglBuffer = a.createBuffer(), a.bindBuffer(d, k.__webglBuffer), a.bufferData(d, e.array, e.dynamic ? a.DYNAMIC_DRAW : a.STATIC_DRAW), k.version = e.version) : k.version !== e.version && (a.bindBuffer(d, k.__webglBuffer), !1 === e.dynamic ? a.bufferData(d, e.array, a.STATIC_DRAW) : -1 === e.updateRange.count ? a.bufferSubData(d, 0, e.array) : 0 === e.updateRange.count ? console.error("THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.") : (a.bufferSubData(d, e.updateRange.offset * e.array.BYTES_PER_ELEMENT, e.array.subarray(e.updateRange.offset, e.updateRange.offset + e.updateRange.count)), e.updateRange.count = 0), k.version = e.version) } var e = new uf(a,b,c); return { getAttributeBuffer: function(a) { return a.isInterleavedBufferAttribute ? b.get(a.data).__webglBuffer : b.get(a).__webglBuffer }, getWireframeAttribute: function(c) { var e = b.get(c); if (void 0 !== e.wireframe) return e.wireframe; var h = [] , k = c.index , m = c.attributes; c = m.position; if (null !== k) for (var k = k.array, m = 0, w = k.length; m < w; m += 3) { var n = k[m + 0] , p = k[m + 1] , r = k[m + 2]; h.push(n, p, p, r, r, n) } else for (k = m.position.array, m = 0, w = k.length / 3 - 1; m < w; m += 3) n = m + 0, p = m + 1, r = m + 2, h.push(n, p, p, r, r, n); h = new C(new (65535 < c.count ? Uint32Array : Uint16Array)(h),1); d(h, a.ELEMENT_ARRAY_BUFFER); return e.wireframe = h }, update: function(b) { var c = e.get(b); b.geometry.isGeometry && c.updateFromObject(b); b = c.index; var h = c.attributes; null !== b && d(b, a.ELEMENT_ARRAY_BUFFER); for (var k in h) d(h[k], a.ARRAY_BUFFER); b = c.morphAttributes; for (k in b) for (var h = b[k], m = 0, w = h.length; m < w; m++) d(h[m], a.ARRAY_BUFFER); return c } } } function wf(a, b, c, d, e, f, g) { function h(a, b) { if (a.width > b || a.height > b) { var c = b / Math.max(a.width, a.height) , d = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas"); d.width = Math.floor(a.width * c); d.height = Math.floor(a.height * c); d.getContext("2d").drawImage(a, 0, 0, a.width, a.height, 0, 0, d.width, d.height); console.warn("THREE.WebGLRenderer: image is too big (" + a.width + "x" + a.height + "). Resized to " + d.width + "x" + d.height, a); return d } return a } function k(a) { return T.isPowerOfTwo(a.width) && T.isPowerOfTwo(a.height) } function m(b) { return 1003 === b || 1004 === b || 1005 === b ? a.NEAREST : a.LINEAR } function w(b) { b = b.target; b.removeEventListener("dispose", w); a: { var c = d.get(b); if (b.image && c.__image__webglTextureCube) a.deleteTexture(c.__image__webglTextureCube); else { if (void 0 === c.__webglInit) break a; a.deleteTexture(c.__webglTexture) } d["delete"](b) } q.textures-- } function n(b) { b = b.target; b.removeEventListener("dispose", n); var c = d.get(b) , e = d.get(b.texture); if (b) { void 0 !== e.__webglTexture && a.deleteTexture(e.__webglTexture); b.depthTexture && b.depthTexture.dispose(); if (b && b.isWebGLRenderTargetCube) for (e = 0; 6 > e; e++) a.deleteFramebuffer(c.__webglFramebuffer[e]), c.__webglDepthbuffer && a.deleteRenderbuffer(c.__webglDepthbuffer[e]); else a.deleteFramebuffer(c.__webglFramebuffer), c.__webglDepthbuffer && a.deleteRenderbuffer(c.__webglDepthbuffer); d["delete"](b.texture); d["delete"](b) } q.textures-- } function p(b, g) { var m = d.get(b); if (0 < b.version && m.__version !== b.version) { var p = b.image; if (void 0 === p) console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined", b); else if (!1 === p.complete) console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete", b); else { void 0 === m.__webglInit && (m.__webglInit = !0, b.addEventListener("dispose", w), m.__webglTexture = a.createTexture(), q.textures++); c.activeTexture(a.TEXTURE0 + g); c.bindTexture(a.TEXTURE_2D, m.__webglTexture); a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL, b.flipY); a.pixelStorei(a.UNPACK_PREMULTIPLY_ALPHA_WEBGL, b.premultiplyAlpha); a.pixelStorei(a.UNPACK_ALIGNMENT, b.unpackAlignment); var n = h(b.image, e.maxTextureSize); if ((1001 !== b.wrapS || 1001 !== b.wrapT || 1003 !== b.minFilter && 1006 !== b.minFilter) && !1 === k(n)) if (p = n, p instanceof HTMLImageElement || p instanceof HTMLCanvasElement) { var l = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas"); l.width = T.nearestPowerOfTwo(p.width); l.height = T.nearestPowerOfTwo(p.height); l.getContext("2d").drawImage(p, 0, 0, l.width, l.height); console.warn("THREE.WebGLRenderer: image is not power of two (" + p.width + "x" + p.height + "). Resized to " + l.width + "x" + l.height, p); n = l } else n = p; var p = k(n) , l = f(b.format) , x = f(b.type); r(a.TEXTURE_2D, b, p); var t = b.mipmaps; if (b && b.isDepthTexture) { t = a.DEPTH_COMPONENT; if (1015 === b.type) { if (!u) throw Error("Float Depth Texture only supported in WebGL2.0"); t = a.DEPTH_COMPONENT32F } else u && (t = a.DEPTH_COMPONENT16); 1027 === b.format && (t = a.DEPTH_STENCIL); c.texImage2D(a.TEXTURE_2D, 0, t, n.width, n.height, 0, l, x, null) } else if (b && b.isDataTexture) if (0 < t.length && p) { for (var K = 0, ja = t.length; K < ja; K++) n = t[K], c.texImage2D(a.TEXTURE_2D, K, l, n.width, n.height, 0, l, x, n.data); b.generateMipmaps = !1 } else c.texImage2D(a.TEXTURE_2D, 0, l, n.width, n.height, 0, l, x, n.data); else if (b && b.isCompressedTexture) for (K = 0, ja = t.length; K < ja; K++) n = t[K], 1023 !== b.format && 1022 !== b.format ? -1 < c.getCompressedTextureFormats().indexOf(l) ? c.compressedTexImage2D(a.TEXTURE_2D, K, l, n.width, n.height, 0, n.data) : console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()") : c.texImage2D(a.TEXTURE_2D, K, l, n.width, n.height, 0, l, x, n.data); else if (0 < t.length && p) { K = 0; for (ja = t.length; K < ja; K++) n = t[K], c.texImage2D(a.TEXTURE_2D, K, l, l, x, n); b.generateMipmaps = !1 } else c.texImage2D(a.TEXTURE_2D, 0, l, l, x, n); b.generateMipmaps && p && a.generateMipmap(a.TEXTURE_2D); m.__version = b.version; if (b.onUpdate) b.onUpdate(b); return } } c.activeTexture(a.TEXTURE0 + g); c.bindTexture(a.TEXTURE_2D, m.__webglTexture) } function r(c, g, h) { h ? (a.texParameteri(c, a.TEXTURE_WRAP_S, f(g.wrapS)), a.texParameteri(c, a.TEXTURE_WRAP_T, f(g.wrapT)), a.texParameteri(c, a.TEXTURE_MAG_FILTER, f(g.magFilter)), a.texParameteri(c, a.TEXTURE_MIN_FILTER, f(g.minFilter))) : (a.texParameteri(c, a.TEXTURE_WRAP_S, a.CLAMP_TO_EDGE), a.texParameteri(c, a.TEXTURE_WRAP_T, a.CLAMP_TO_EDGE), 1001 === g.wrapS && 1001 === g.wrapT || console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.", g), a.texParameteri(c, a.TEXTURE_MAG_FILTER, m(g.magFilter)), a.texParameteri(c, a.TEXTURE_MIN_FILTER, m(g.minFilter)), 1003 !== g.minFilter && 1006 !== g.minFilter && console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.", g)); !(h = b.get("EXT_texture_filter_anisotropic")) || 1015 === g.type && null === b.get("OES_texture_float_linear") || 1016 === g.type && null === b.get("OES_texture_half_float_linear") || !(1 < g.anisotropy || d.get(g).__currentAnisotropy) || (a.texParameterf(c, h.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(g.anisotropy, e.getMaxAnisotropy())), d.get(g).__currentAnisotropy = g.anisotropy) } function l(b, e, g, h) { var k = f(e.texture.format) , m = f(e.texture.type); c.texImage2D(h, 0, k, e.width, e.height, 0, k, m, null); a.bindFramebuffer(a.FRAMEBUFFER, b); a.framebufferTexture2D(a.FRAMEBUFFER, g, h, d.get(e.texture).__webglTexture, 0); a.bindFramebuffer(a.FRAMEBUFFER, null) } function t(b, c) { a.bindRenderbuffer(a.RENDERBUFFER, b); c.depthBuffer && !c.stencilBuffer ? (a.renderbufferStorage(a.RENDERBUFFER, a.DEPTH_COMPONENT16, c.width, c.height), a.framebufferRenderbuffer(a.FRAMEBUFFER, a.DEPTH_ATTACHMENT, a.RENDERBUFFER, b)) : c.depthBuffer && c.stencilBuffer ? (a.renderbufferStorage(a.RENDERBUFFER, a.DEPTH_STENCIL, c.width, c.height), a.framebufferRenderbuffer(a.FRAMEBUFFER, a.DEPTH_STENCIL_ATTACHMENT, a.RENDERBUFFER, b)) : a.renderbufferStorage(a.RENDERBUFFER, a.RGBA4, c.width, c.height); a.bindRenderbuffer(a.RENDERBUFFER, null) } var q = g.memory , u = "undefined" !== typeof WebGL2RenderingContext && a instanceof WebGL2RenderingContext; this.setTexture2D = p; this.setTextureCube = function(b, g) { var m = d.get(b); if (6 === b.image.length) if (0 < b.version && m.__version !== b.version) { m.__image__webglTextureCube || (b.addEventListener("dispose", w), m.__image__webglTextureCube = a.createTexture(), q.textures++); c.activeTexture(a.TEXTURE0 + g); c.bindTexture(a.TEXTURE_CUBE_MAP, m.__image__webglTextureCube); a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL, b.flipY); for (var p = b && b.isCompressedTexture, n = b.image[0] && b.image[0].isDataTexture, l = [], x = 0; 6 > x; x++) l[x] = p || n ? n ? b.image[x].image : b.image[x] : h(b.image[x], e.maxCubemapSize); var t = k(l[0]) , u = f(b.format) , ja = f(b.type); r(a.TEXTURE_CUBE_MAP, b, t); for (x = 0; 6 > x; x++) if (p) for (var B, C = l[x].mipmaps, z = 0, N = C.length; z < N; z++) B = C[z], 1023 !== b.format && 1022 !== b.format ? -1 < c.getCompressedTextureFormats().indexOf(u) ? c.compressedTexImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X + x, z, u, B.width, B.height, 0, B.data) : console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()") : c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X + x, z, u, B.width, B.height, 0, u, ja, B.data); else n ? c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X + x, 0, u, l[x].width, l[x].height, 0, u, ja, l[x].data) : c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X + x, 0, u, u, ja, l[x]); b.generateMipmaps && t && a.generateMipmap(a.TEXTURE_CUBE_MAP); m.__version = b.version; if (b.onUpdate) b.onUpdate(b) } else c.activeTexture(a.TEXTURE0 + g), c.bindTexture(a.TEXTURE_CUBE_MAP, m.__image__webglTextureCube) } ; this.setTextureCubeDynamic = function(b, e) { c.activeTexture(a.TEXTURE0 + e); c.bindTexture(a.TEXTURE_CUBE_MAP, d.get(b).__webglTexture) } ; this.setupRenderTarget = function(b) { var e = d.get(b) , f = d.get(b.texture); b.addEventListener("dispose", n); f.__webglTexture = a.createTexture(); q.textures++; var g = b && b.isWebGLRenderTargetCube , h = k(b); if (g) { e.__webglFramebuffer = []; for (var m = 0; 6 > m; m++) e.__webglFramebuffer[m] = a.createFramebuffer() } else e.__webglFramebuffer = a.createFramebuffer(); if (g) { c.bindTexture(a.TEXTURE_CUBE_MAP, f.__webglTexture); r(a.TEXTURE_CUBE_MAP, b.texture, h); for (m = 0; 6 > m; m++) l(e.__webglFramebuffer[m], b, a.COLOR_ATTACHMENT0, a.TEXTURE_CUBE_MAP_POSITIVE_X + m); b.texture.generateMipmaps && h && a.generateMipmap(a.TEXTURE_CUBE_MAP); c.bindTexture(a.TEXTURE_CUBE_MAP, null) } else c.bindTexture(a.TEXTURE_2D, f.__webglTexture), r(a.TEXTURE_2D, b.texture, h), l(e.__webglFramebuffer, b, a.COLOR_ATTACHMENT0, a.TEXTURE_2D), b.texture.generateMipmaps && h && a.generateMipmap(a.TEXTURE_2D), c.bindTexture(a.TEXTURE_2D, null); if (b.depthBuffer) { e = d.get(b); f = b && b.isWebGLRenderTargetCube; if (b.depthTexture) { if (f) throw Error("target.depthTexture not supported in Cube render targets"); if (b && b.isWebGLRenderTargetCube) throw Error("Depth Texture with cube render targets is not supported!"); a.bindFramebuffer(a.FRAMEBUFFER, e.__webglFramebuffer); if (!b.depthTexture || !b.depthTexture.isDepthTexture) throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture"); d.get(b.depthTexture).__webglTexture && b.depthTexture.image.width === b.width && b.depthTexture.image.height === b.height || (b.depthTexture.image.width = b.width, b.depthTexture.image.height = b.height, b.depthTexture.needsUpdate = !0); p(b.depthTexture, 0); e = d.get(b.depthTexture).__webglTexture; if (1026 === b.depthTexture.format) a.framebufferTexture2D(a.FRAMEBUFFER, a.DEPTH_ATTACHMENT, a.TEXTURE_2D, e, 0); else if (1027 === b.depthTexture.format) a.framebufferTexture2D(a.FRAMEBUFFER, a.DEPTH_STENCIL_ATTACHMENT, a.TEXTURE_2D, e, 0); else throw Error("Unknown depthTexture format"); } else if (f) for (e.__webglDepthbuffer = [], f = 0; 6 > f; f++) a.bindFramebuffer(a.FRAMEBUFFER, e.__webglFramebuffer[f]), e.__webglDepthbuffer[f] = a.createRenderbuffer(), t(e.__webglDepthbuffer[f], b); else a.bindFramebuffer(a.FRAMEBUFFER, e.__webglFramebuffer), e.__webglDepthbuffer = a.createRenderbuffer(), t(e.__webglDepthbuffer, b); a.bindFramebuffer(a.FRAMEBUFFER, null) } } ; this.updateRenderTargetMipmap = function(b) { var e = b.texture; e.generateMipmaps && k(b) && 1003 !== e.minFilter && 1006 !== e.minFilter && (b = b && b.isWebGLRenderTargetCube ? a.TEXTURE_CUBE_MAP : a.TEXTURE_2D, e = d.get(e).__webglTexture, c.bindTexture(b, e), a.generateMipmap(b), c.bindTexture(b, null)) } } function xf() { var a = {}; return { get: function(b) { b = b.uuid; var c = a[b]; void 0 === c && (c = {}, a[b] = c); return c }, "delete": function(b) { delete a[b.uuid] }, clear: function() { a = {} } } } function yf(a, b, c) { function d(b, c, d) { var e = new Uint8Array(4) , f = a.createTexture(); a.bindTexture(b, f); a.texParameteri(b, a.TEXTURE_MIN_FILTER, a.NEAREST); a.texParameteri(b, a.TEXTURE_MAG_FILTER, a.NEAREST); for (b = 0; b < d; b++) a.texImage2D(c + b, 0, a.RGBA, 1, 1, 0, a.RGBA, a.UNSIGNED_BYTE, e); return f } function e(b) { !0 !== E[b] && (a.enable(b), E[b] = !0) } function f(b) { !1 !== E[b] && (a.disable(b), E[b] = !1) } function g(b, d, g, h, k, m, p, n) { 0 !== b ? e(a.BLEND) : f(a.BLEND); if (b !== F || n !== G) 2 === b ? n ? (a.blendEquationSeparate(a.FUNC_ADD, a.FUNC_ADD), a.blendFuncSeparate(a.ONE, a.ONE, a.ONE, a.ONE)) : (a.blendEquation(a.FUNC_ADD), a.blendFunc(a.SRC_ALPHA, a.ONE)) : 3 === b ? n ? (a.blendEquationSeparate(a.FUNC_ADD, a.FUNC_ADD), a.blendFuncSeparate(a.ZERO, a.ZERO, a.ONE_MINUS_SRC_COLOR, a.ONE_MINUS_SRC_ALPHA)) : (a.blendEquation(a.FUNC_ADD), a.blendFunc(a.ZERO, a.ONE_MINUS_SRC_COLOR)) : 4 === b ? n ? (a.blendEquationSeparate(a.FUNC_ADD, a.FUNC_ADD), a.blendFuncSeparate(a.ZERO, a.SRC_COLOR, a.ZERO, a.SRC_ALPHA)) : (a.blendEquation(a.FUNC_ADD), a.blendFunc(a.ZERO, a.SRC_COLOR)) : n ? (a.blendEquationSeparate(a.FUNC_ADD, a.FUNC_ADD), a.blendFuncSeparate(a.ONE, a.ONE_MINUS_SRC_ALPHA, a.ONE, a.ONE_MINUS_SRC_ALPHA)) : (a.blendEquationSeparate(a.FUNC_ADD, a.FUNC_ADD), a.blendFuncSeparate(a.SRC_ALPHA, a.ONE_MINUS_SRC_ALPHA, a.ONE, a.ONE_MINUS_SRC_ALPHA)), F = b, G = n; if (5 === b) { k = k || d; m = m || g; p = p || h; if (d !== M || k !== B) a.blendEquationSeparate(c(d), c(k)), M = d, B = k; if (g !== ca || h !== K || m !== C || p !== z) a.blendFuncSeparate(c(g), c(h), c(m), c(p)), ca = g, K = h, C = m, z = p } else z = C = B = K = ca = M = null } function h(a) { t.setFunc(a) } function k(b) { N !== b && (b ? a.frontFace(a.CW) : a.frontFace(a.CCW), N = b) } function m(b) { 0 !== b ? (e(a.CULL_FACE), b !== P && (1 === b ? a.cullFace(a.BACK) : 2 === b ? a.cullFace(a.FRONT) : a.cullFace(a.FRONT_AND_BACK))) : f(a.CULL_FACE); P = b } function w(b) { void 0 === b && (b = a.TEXTURE0 + O - 1); L !== b && (a.activeTexture(b), L = b) } function n(a, b, c, d) { l.setClear(a, b, c, d) } function p(a) { t.setClear(a) } function r(a) { q.setClear(a) } var l = new function() { var b = !1 , c = new ga , d = null , e = new ga; return { setMask: function(c) { d === c || b || (a.colorMask(c, c, c, c), d = c) }, setLocked: function(a) { b = a }, setClear: function(b, d, f, g) { c.set(b, d, f, g); !1 === e.equals(c) && (a.clearColor(b, d, f, g), e.copy(c)) }, reset: function() { b = !1; d = null; e.set(0, 0, 0, 1) } } } , t = new function() { var b = !1 , c = null , d = null , g = null; return { setTest: function(b) { b ? e(a.DEPTH_TEST) : f(a.DEPTH_TEST) }, setMask: function(d) { c === d || b || (a.depthMask(d), c = d) }, setFunc: function(b) { if (d !== b) { if (b) switch (b) { case 0: a.depthFunc(a.NEVER); break; case 1: a.depthFunc(a.ALWAYS); break; case 2: a.depthFunc(a.LESS); break; case 3: a.depthFunc(a.LEQUAL); break; case 4: a.depthFunc(a.EQUAL); break; case 5: a.depthFunc(a.GEQUAL); break; case 6: a.depthFunc(a.GREATER); break; case 7: a.depthFunc(a.NOTEQUAL); break; default: a.depthFunc(a.LEQUAL) } else a.depthFunc(a.LEQUAL); d = b } }, setLocked: function(a) { b = a }, setClear: function(b) { g !== b && (a.clearDepth(b), g = b) }, reset: function() { b = !1; g = d = c = null } } } , q = new function() { var b = !1 , c = null , d = null , g = null , h = null , k = null , m = null , p = null , n = null; return { setTest: function(b) { b ? e(a.STENCIL_TEST) : f(a.STENCIL_TEST) }, setMask: function(d) { c === d || b || (a.stencilMask(d), c = d) }, setFunc: function(b, c, e) { if (d !== b || g !== c || h !== e) a.stencilFunc(b, c, e), d = b, g = c, h = e }, setOp: function(b, c, d) { if (k !== b || m !== c || p !== d) a.stencilOp(b, c, d), k = b, m = c, p = d }, setLocked: function(a) { b = a }, setClear: function(b) { n !== b && (a.clearStencil(b), n = b) }, reset: function() { b = !1; n = p = m = k = h = g = d = c = null } } } , u = a.getParameter(a.MAX_VERTEX_ATTRIBS) , v = new Uint8Array(u) , I = new Uint8Array(u) , y = new Uint8Array(u) , E = {} , H = null , F = null , M = null , ca = null , K = null , B = null , C = null , z = null , G = !1 , N = null , P = null , R = null , S = null , J = null , V = null , O = a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS) , L = null , Q = {} , T = new ga , U = new ga , fb = {}; fb[a.TEXTURE_2D] = d(a.TEXTURE_2D, a.TEXTURE_2D, 1); fb[a.TEXTURE_CUBE_MAP] = d(a.TEXTURE_CUBE_MAP, a.TEXTURE_CUBE_MAP_POSITIVE_X, 6); return { buffers: { color: l, depth: t, stencil: q }, init: function() { n(0, 0, 0, 1); p(1); r(0); e(a.DEPTH_TEST); h(3); k(!1); m(1); e(a.CULL_FACE); e(a.BLEND); g(1) }, initAttributes: function() { for (var a = 0, b = v.length; a < b; a++) v[a] = 0 }, enableAttribute: function(c) { v[c] = 1; 0 === I[c] && (a.enableVertexAttribArray(c), I[c] = 1); 0 !== y[c] && (b.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(c, 0), y[c] = 0) }, enableAttributeAndDivisor: function(b, c, d) { v[b] = 1; 0 === I[b] && (a.enableVertexAttribArray(b), I[b] = 1); y[b] !== c && (d.vertexAttribDivisorANGLE(b, c), y[b] = c) }, disableUnusedAttributes: function() { for (var b = 0, c = I.length; b !== c; ++b) I[b] !== v[b] && (a.disableVertexAttribArray(b), I[b] = 0) }, enable: e, disable: f, getCompressedTextureFormats: function() { if (null === H && (H = [], b.get("WEBGL_compressed_texture_pvrtc") || b.get("WEBGL_compressed_texture_s3tc") || b.get("WEBGL_compressed_texture_etc1"))) for (var c = a.getParameter(a.COMPRESSED_TEXTURE_FORMATS), d = 0; d < c.length; d++) H.push(c[d]); return H }, setBlending: g, setColorWrite: function(a) { l.setMask(a) }, setDepthTest: function(a) { t.setTest(a) }, setDepthWrite: function(a) { t.setMask(a) }, setDepthFunc: h, setStencilTest: function(a) { q.setTest(a) }, setStencilWrite: function(a) { q.setMask(a) }, setStencilFunc: function(a, b, c) { q.setFunc(a, b, c) }, setStencilOp: function(a, b, c) { q.setOp(a, b, c) }, setFlipSided: k, setCullFace: m, setLineWidth: function(b) { b !== R && (a.lineWidth(b), R = b) }, setPolygonOffset: function(b, c, d) { if (b) { if (e(a.POLYGON_OFFSET_FILL), S !== c || J !== d) a.polygonOffset(c, d), S = c, J = d } else f(a.POLYGON_OFFSET_FILL) }, getScissorTest: function() { return V }, setScissorTest: function(b) { (V = b) ? e(a.SCISSOR_TEST) : f(a.SCISSOR_TEST) }, activeTexture: w, bindTexture: function(b, c) { null === L && w(); var d = Q[L]; void 0 === d && (d = { type: void 0, texture: void 0 }, Q[L] = d); if (d.type !== b || d.texture !== c) a.bindTexture(b, c || fb[b]), d.type = b, d.texture = c }, compressedTexImage2D: function() { try { a.compressedTexImage2D.apply(a, arguments) } catch (b) { console.error(b) } }, texImage2D: function() { try { a.texImage2D.apply(a, arguments) } catch (b) { console.error(b) } }, clearColor: n, clearDepth: p, clearStencil: r, scissor: function(b) { !1 === T.equals(b) && (a.scissor(b.x, b.y, b.z, b.w), T.copy(b)) }, viewport: function(b) { !1 === U.equals(b) && (a.viewport(b.x, b.y, b.z, b.w), U.copy(b)) }, reset: function() { for (var b = 0; b < I.length; b++) 1 === I[b] && (a.disableVertexAttribArray(b), I[b] = 0); E = {}; L = H = null; Q = {}; P = N = F = null; l.reset(); t.reset(); q.reset() } } } function zf(a, b, c) { function d(b) { if ("highp" === b) { if (0 < a.getShaderPrecisionFormat(a.VERTEX_SHADER, a.HIGH_FLOAT).precision && 0 < a.getShaderPrecisionFormat(a.FRAGMENT_SHADER, a.HIGH_FLOAT).precision) return "highp"; b = "mediump" } return "mediump" === b && 0 < a.getShaderPrecisionFormat(a.VERTEX_SHADER, a.MEDIUM_FLOAT).precision && 0 < a.getShaderPrecisionFormat(a.FRAGMENT_SHADER, a.MEDIUM_FLOAT).precision ? "mediump" : "lowp" } var e, f = void 0 !== c.precision ? c.precision : "highp", g = d(f); g !== f && (console.warn("THREE.WebGLRenderer:", f, "not supported, using", g, "instead."), f = g); c = !0 === c.logarithmicDepthBuffer && !!b.get("EXT_frag_depth"); var g = a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS) , h = a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS) , k = a.getParameter(a.MAX_TEXTURE_SIZE) , m = a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE) , w = a.getParameter(a.MAX_VERTEX_ATTRIBS) , n = a.getParameter(a.MAX_VERTEX_UNIFORM_VECTORS) , p = a.getParameter(a.MAX_VARYING_VECTORS) , r = a.getParameter(a.MAX_FRAGMENT_UNIFORM_VECTORS) , l = 0 < h , t = !!b.get("OES_texture_float"); return { getMaxAnisotropy: function() { if (void 0 !== e) return e; var c = b.get("EXT_texture_filter_anisotropic"); return e = null !== c ? a.getParameter(c.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0 }, getMaxPrecision: d, precision: f, logarithmicDepthBuffer: c, maxTextures: g, maxVertexTextures: h, maxTextureSize: k, maxCubemapSize: m, maxAttributes: w, maxVertexUniforms: n, maxVaryings: p, maxFragmentUniforms: r, vertexTextures: l, floatFragmentTextures: t, floatVertexTextures: l && t } } function Af(a) { var b = {}; return { get: function(c) { if (void 0 !== b[c]) return b[c]; var d; switch (c) { case "WEBGL_depth_texture": d = a.getExtension("WEBGL_depth_texture") || a.getExtension("MOZ_WEBGL_depth_texture") || a.getExtension("WEBKIT_WEBGL_depth_texture"); break; case "EXT_texture_filter_anisotropic": d = a.getExtension("EXT_texture_filter_anisotropic") || a.getExtension("MOZ_EXT_texture_filter_anisotropic") || a.getExtension("WEBKIT_EXT_texture_filter_anisotropic"); break; case "WEBGL_compressed_texture_s3tc": d = a.getExtension("WEBGL_compressed_texture_s3tc") || a.getExtension("MOZ_WEBGL_compressed_texture_s3tc") || a.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc"); break; case "WEBGL_compressed_texture_pvrtc": d = a.getExtension("WEBGL_compressed_texture_pvrtc") || a.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"); break; case "WEBGL_compressed_texture_etc1": d = a.getExtension("WEBGL_compressed_texture_etc1"); break; default: d = a.getExtension(c) } null === d && console.warn("THREE.WebGLRenderer: " + c + " extension not supported."); return b[c] = d } } } function Bf() { function a() { m.value !== d && (m.value = d, m.needsUpdate = 0 < e); c.numPlanes = e; c.numIntersection = 0 } function b(a, b, d, e) { var f = null !== a ? a.length : 0 , g = null; if (0 !== f) { g = m.value; if (!0 !== e || null === g) { e = d + 4 * f; b = b.matrixWorldInverse; k.getNormalMatrix(b); if (null === g || g.length < e) g = new Float32Array(e); for (e = 0; e !== f; ++e, d += 4) h.copy(a[e]).applyMatrix4(b, k), h.normal.toArray(g, d), g[d + 3] = h.constant } m.value = g; m.needsUpdate = !0 } c.numPlanes = f; return g } var c = this , d = null , e = 0 , f = !1 , g = !1 , h = new va , k = new Ia , m = { value: null, needsUpdate: !1 }; this.uniform = m; this.numIntersection = this.numPlanes = 0; this.init = function(a, c, g) { var h = 0 !== a.length || c || 0 !== e || f; f = c; d = b(a, g, 0); e = a.length; return h } ; this.beginShadows = function() { g = !0; b(null) } ; this.endShadows = function() { g = !1; a() } ; this.setState = function(c, h, k, r, l, t) { if (!f || null === c || 0 === c.length || g && !k) g ? b(null) : a(); else { k = g ? 0 : e; var q = 4 * k , u = l.clippingState || null; m.value = u; u = b(c, r, q, t); for (c = 0; c !== q; ++c) u[c] = d[c]; l.clippingState = u; this.numIntersection = h ? this.numPlanes : 0; this.numPlanes += k } } } function Dd(a) { function b(a, b, c, d) { !0 === M && (a *= d, b *= d, c *= d); Y.clearColor(a, b, c, d) } function c() { Y.init(); Y.scissor(X.copy(ha).multiplyScalar(Qa)); Y.viewport($a.copy(fa).multiplyScalar(Qa)); b(Da.r, Da.g, Da.b, Ra) } function d() { W = Q = null; U = ""; L = -1; Y.reset() } function e(a) { a.preventDefault(); d(); c(); ea.clear() } function f(a) { a = a.target; a.removeEventListener("dispose", f); g(a); ea["delete"](a) } function g(a) { var b = ea.get(a).program; a.program = void 0; void 0 !== b && va.releaseProgram(b) } function h(a, b) { return Math.abs(b[0]) - Math.abs(a[0]) } function k(a, b) { return a.object.renderOrder !== b.object.renderOrder ? a.object.renderOrder - b.object.renderOrder : a.material.program && b.material.program && a.material.program !== b.material.program ? a.material.program.id - b.material.program.id : a.material.id !== b.material.id ? a.material.id - b.material.id : a.z !== b.z ? a.z - b.z : a.id - b.id } function m(a, b) { return a.object.renderOrder !== b.object.renderOrder ? a.object.renderOrder - b.object.renderOrder : a.z !== b.z ? b.z - a.z : a.id - b.id } function w(a, b, c, d, e) { var f; c.transparent ? (d = z, f = ++Ka) : (d = B, f = ++C); f = d[f]; void 0 !== f ? (f.id = a.id, f.object = a, f.geometry = b, f.material = c, f.z = Z.z, f.group = e) : (f = { id: a.id, object: a, geometry: b, material: c, z: Z.z, group: e }, d.push(f)) } function n(a) { if (!oa.intersectsSphere(a)) return !1; var b = ba.numPlanes; if (0 === b) return !0; var c = S.clippingPlanes , d = a.center; a = -a.radius; var e = 0; do if (c[e].distanceToPoint(d) < a) return !1; while (++e !== b); return !0 } function p(a, b) { if (!1 !== a.visible) { if (0 !== (a.layers.mask & b.layers.mask)) if (a.isLight) K.push(a); else if (a.isSprite) { var c; (c = !1 === a.frustumCulled) || (na.center.set(0, 0, 0), na.radius = .7071067811865476, na.applyMatrix4(a.matrixWorld), c = !0 === n(na)); c && P.push(a) } else if (a.isLensFlare) R.push(a); else if (a.isImmediateRenderObject) !0 === S.sortObjects && (Z.setFromMatrixPosition(a.matrixWorld), Z.applyProjection(ra)), w(a, null, a.material, Z.z, null); else if (a.isMesh || a.isLine || a.isPoints) if (a.isSkinnedMesh && a.skeleton.update(), (c = !1 === a.frustumCulled) || (c = a.geometry, null === c.boundingSphere && c.computeBoundingSphere(), na.copy(c.boundingSphere).applyMatrix4(a.matrixWorld), c = !0 === n(na)), c) { var d = a.material; if (!0 === d.visible) if (!0 === S.sortObjects && (Z.setFromMatrixPosition(a.matrixWorld), Z.applyProjection(ra)), c = qa.update(a), d.isMultiMaterial) for (var e = c.groups, f = d.materials, d = 0, g = e.length; d < g; d++) { var h = e[d] , k = f[h.materialIndex]; !0 === k.visible && w(a, c, k, Z.z, h) } else w(a, c, d, Z.z, null) } c = a.children; d = 0; for (g = c.length; d < g; d++) p(c[d], b) } } function r(a, b, c, d) { for (var e = 0, f = a.length; e < f; e++) { var g = a[e] , h = g.object , k = g.geometry , m = void 0 === d ? g.material : d , g = g.group; h.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse, h.matrixWorld); h.normalMatrix.getNormalMatrix(h.modelViewMatrix); h.onBeforeRender(S, b, c, k, m, g); if (h.isImmediateRenderObject) { l(m); var p = t(c, b.fog, m, h); U = ""; h.render(function(a) { S.renderBufferImmediate(a, p, m) }) } else S.renderBufferDirect(c, b.fog, k, m, h, g); h.onAfterRender(S, b, c, k, m, g) } } function l(a) { 2 === a.side ? Y.disable(A.CULL_FACE) : Y.enable(A.CULL_FACE); Y.setFlipSided(1 === a.side); !0 === a.transparent ? Y.setBlending(a.blending, a.blendEquation, a.blendSrc, a.blendDst, a.blendEquationAlpha, a.blendSrcAlpha, a.blendDstAlpha, a.premultipliedAlpha) : Y.setBlending(0); Y.setDepthFunc(a.depthFunc); Y.setDepthTest(a.depthTest); Y.setDepthWrite(a.depthWrite); Y.setColorWrite(a.colorWrite); Y.setPolygonOffset(a.polygonOffset, a.polygonOffsetFactor, a.polygonOffsetUnits) } function t(a, b, c, d) { da = 0; var e = ea.get(c); pa && (sa || a !== W) && ba.setState(c.clippingPlanes, c.clipIntersection, c.clipShadows, a, e, a === W && c.id === L); !1 === c.needsUpdate && (void 0 === e.program ? c.needsUpdate = !0 : c.fog && e.fog !== b ? c.needsUpdate = !0 : c.lights && e.lightsHash !== aa.hash ? c.needsUpdate = !0 : void 0 === e.numClippingPlanes || e.numClippingPlanes === ba.numPlanes && e.numIntersection === ba.numIntersection || (c.needsUpdate = !0)); if (c.needsUpdate) { a: { var h = ea.get(c) , k = va.getParameters(c, aa, b, ba.numPlanes, ba.numIntersection, d) , m = va.getProgramCode(c, k) , p = h.program , n = !0; if (void 0 === p) c.addEventListener("dispose", f); else if (p.code !== m) g(c); else if (void 0 !== k.shaderID) break a; else n = !1; n && (k.shaderID ? (p = Gb[k.shaderID], h.__webglShader = { name: c.type, uniforms: La.clone(p.uniforms), vertexShader: p.vertexShader, fragmentShader: p.fragmentShader }) : h.__webglShader = { name: c.type, uniforms: c.uniforms, vertexShader: c.vertexShader, fragmentShader: c.fragmentShader }, c.__webglShader = h.__webglShader, p = va.acquireProgram(c, k, m), h.program = p, c.program = p); k = p.getAttributes(); if (c.morphTargets) for (m = c.numSupportedMorphTargets = 0; m < S.maxMorphTargets; m++) 0 <= k["morphTarget" + m] && c.numSupportedMorphTargets++; if (c.morphNormals) for (m = c.numSupportedMorphNormals = 0; m < S.maxMorphNormals; m++) 0 <= k["morphNormal" + m] && c.numSupportedMorphNormals++; k = h.__webglShader.uniforms; if (!c.isShaderMaterial && !c.isRawShaderMaterial || !0 === c.clipping) h.numClippingPlanes = ba.numPlanes, h.numIntersection = ba.numIntersection, k.clippingPlanes = ba.uniform; h.fog = b; h.lightsHash = aa.hash; c.lights && (k.ambientLightColor.value = aa.ambient, k.directionalLights.value = aa.directional, k.spotLights.value = aa.spot, k.pointLights.value = aa.point, k.hemisphereLights.value = aa.hemi, k.directionalShadowMap.value = aa.directionalShadowMap, k.directionalShadowMatrix.value = aa.directionalShadowMatrix, k.spotShadowMap.value = aa.spotShadowMap, k.spotShadowMatrix.value = aa.spotShadowMatrix, k.pointShadowMap.value = aa.pointShadowMap, k.pointShadowMatrix.value = aa.pointShadowMatrix); m = h.program.getUniforms(); k = Ya.seqWithValue(m.seq, k); h.uniformsList = k } c.needsUpdate = !1 } var w = !1 , n = p = !1 , h = e.program , k = h.getUniforms() , m = e.__webglShader.uniforms; h.id !== Q && (A.useProgram(h.program), Q = h.id, n = p = w = !0); c.id !== L && (L = c.id, p = !0); if (w || a !== W) { k.set(A, a, "projectionMatrix"); ia.logarithmicDepthBuffer && k.setValue(A, "logDepthBufFC", 2 / (Math.log(a.far + 1) / Math.LN2)); a !== W && (W = a, n = p = !0); if (c.isShaderMaterial || c.isMeshPhongMaterial || c.isMeshStandardMaterial || c.envMap) w = k.map.cameraPosition, void 0 !== w && w.setValue(A, Z.setFromMatrixPosition(a.matrixWorld)); (c.isMeshPhongMaterial || c.isMeshLambertMaterial || c.isMeshBasicMaterial || c.isMeshStandardMaterial || c.isShaderMaterial || c.skinning) && k.setValue(A, "viewMatrix", a.matrixWorldInverse); k.set(A, S, "toneMappingExposure"); k.set(A, S, "toneMappingWhitePoint") } c.skinning && (k.setOptional(A, d, "bindMatrix"), k.setOptional(A, d, "bindMatrixInverse"), a = d.skeleton) && (ia.floatVertexTextures && a.useVertexTexture ? (k.set(A, a, "boneTexture"), k.set(A, a, "boneTextureWidth"), k.set(A, a, "boneTextureHeight")) : k.setOptional(A, a, "boneMatrices")); if (p) { c.lights && (a = n, m.ambientLightColor.needsUpdate = a, m.directionalLights.needsUpdate = a, m.pointLights.needsUpdate = a, m.spotLights.needsUpdate = a, m.hemisphereLights.needsUpdate = a); b && c.fog && (m.fogColor.value = b.color, b.isFog ? (m.fogNear.value = b.near, m.fogFar.value = b.far) : b.isFogExp2 && (m.fogDensity.value = b.density)); if (c.isMeshBasicMaterial || c.isMeshLambertMaterial || c.isMeshPhongMaterial || c.isMeshStandardMaterial || c.isMeshDepthMaterial) { m.opacity.value = c.opacity; m.diffuse.value = c.color; c.emissive && m.emissive.value.copy(c.emissive).multiplyScalar(c.emissiveIntensity); m.map.value = c.map; m.specularMap.value = c.specularMap; m.alphaMap.value = c.alphaMap; c.aoMap && (m.aoMap.value = c.aoMap, m.aoMapIntensity.value = c.aoMapIntensity); var r; c.map ? r = c.map : c.specularMap ? r = c.specularMap : c.displacementMap ? r = c.displacementMap : c.normalMap ? r = c.normalMap : c.bumpMap ? r = c.bumpMap : c.roughnessMap ? r = c.roughnessMap : c.metalnessMap ? r = c.metalnessMap : c.alphaMap ? r = c.alphaMap : c.emissiveMap && (r = c.emissiveMap); void 0 !== r && (r.isWebGLRenderTarget && (r = r.texture), b = r.offset, r = r.repeat, m.offsetRepeat.value.set(b.x, b.y, r.x, r.y)); m.envMap.value = c.envMap; m.flipEnvMap.value = c.envMap && c.envMap.isCubeTexture ? -1 : 1; m.reflectivity.value = c.reflectivity; m.refractionRatio.value = c.refractionRatio } c.isLineBasicMaterial ? (m.diffuse.value = c.color, m.opacity.value = c.opacity) : c.isLineDashedMaterial ? (m.diffuse.value = c.color, m.opacity.value = c.opacity, m.dashSize.value = c.dashSize, m.totalSize.value = c.dashSize + c.gapSize, m.scale.value = c.scale) : c.isPointsMaterial ? (m.diffuse.value = c.color, m.opacity.value = c.opacity, m.size.value = c.size * Qa, m.scale.value = .5 * pc, m.map.value = c.map, null !== c.map && (r = c.map.offset, c = c.map.repeat, m.offsetRepeat.value.set(r.x, r.y, c.x, c.y))) : c.isMeshLambertMaterial ? (c.lightMap && (m.lightMap.value = c.lightMap, m.lightMapIntensity.value = c.lightMapIntensity), c.emissiveMap && (m.emissiveMap.value = c.emissiveMap)) : c.isMeshPhongMaterial ? (m.specular.value = c.specular, m.shininess.value = Math.max(c.shininess, 1E-4), c.lightMap && (m.lightMap.value = c.lightMap, m.lightMapIntensity.value = c.lightMapIntensity), c.emissiveMap && (m.emissiveMap.value = c.emissiveMap), c.bumpMap && (m.bumpMap.value = c.bumpMap, m.bumpScale.value = c.bumpScale), c.normalMap && (m.normalMap.value = c.normalMap, m.normalScale.value.copy(c.normalScale)), c.displacementMap && (m.displacementMap.value = c.displacementMap, m.displacementScale.value = c.displacementScale, m.displacementBias.value = c.displacementBias)) : c.isMeshPhysicalMaterial ? (m.clearCoat.value = c.clearCoat, m.clearCoatRoughness.value = c.clearCoatRoughness, D(m, c)) : c.isMeshStandardMaterial ? D(m, c) : c.isMeshDepthMaterial ? c.displacementMap && (m.displacementMap.value = c.displacementMap, m.displacementScale.value = c.displacementScale, m.displacementBias.value = c.displacementBias) : c.isMeshNormalMaterial && (m.opacity.value = c.opacity); Ya.upload(A, e.uniformsList, m, S) } k.set(A, d, "modelViewMatrix"); k.set(A, d, "normalMatrix"); k.setValue(A, "modelMatrix", d.matrixWorld); return h } function D(a, b) { a.roughness.value = b.roughness; a.metalness.value = b.metalness; b.roughnessMap && (a.roughnessMap.value = b.roughnessMap); b.metalnessMap && (a.metalnessMap.value = b.metalnessMap); b.lightMap && (a.lightMap.value = b.lightMap, a.lightMapIntensity.value = b.lightMapIntensity); b.emissiveMap && (a.emissiveMap.value = b.emissiveMap); b.bumpMap && (a.bumpMap.value = b.bumpMap, a.bumpScale.value = b.bumpScale); b.normalMap && (a.normalMap.value = b.normalMap, a.normalScale.value.copy(b.normalScale)); b.displacementMap && (a.displacementMap.value = b.displacementMap, a.displacementScale.value = b.displacementScale, a.displacementBias.value = b.displacementBias); b.envMap && (a.envMapIntensity.value = b.envMapIntensity) } function u(a) { var b; if (1E3 === a) return A.REPEAT; if (1001 === a) return A.CLAMP_TO_EDGE; if (1002 === a) return A.MIRRORED_REPEAT; if (1003 === a) return A.NEAREST; if (1004 === a) return A.NEAREST_MIPMAP_NEAREST; if (1005 === a) return A.NEAREST_MIPMAP_LINEAR; if (1006 === a) return A.LINEAR; if (1007 === a) return A.LINEAR_MIPMAP_NEAREST; if (1008 === a) return A.LINEAR_MIPMAP_LINEAR; if (1009 === a) return A.UNSIGNED_BYTE; if (1017 === a) return A.UNSIGNED_SHORT_4_4_4_4; if (1018 === a) return A.UNSIGNED_SHORT_5_5_5_1; if (1019 === a) return A.UNSIGNED_SHORT_5_6_5; if (1010 === a) return A.BYTE; if (1011 === a) return A.SHORT; if (1012 === a) return A.UNSIGNED_SHORT; if (1013 === a) return A.INT; if (1014 === a) return A.UNSIGNED_INT; if (1015 === a) return A.FLOAT; if (1016 === a && (b = ka.get("OES_texture_half_float"), null !== b)) return b.HALF_FLOAT_OES; if (1021 === a) return A.ALPHA; if (1022 === a) return A.RGB; if (1023 === a) return A.RGBA; if (1024 === a) return A.LUMINANCE; if (1025 === a) return A.LUMINANCE_ALPHA; if (1026 === a) return A.DEPTH_COMPONENT; if (1027 === a) return A.DEPTH_STENCIL; if (100 === a) return A.FUNC_ADD; if (101 === a) return A.FUNC_SUBTRACT; if (102 === a) return A.FUNC_REVERSE_SUBTRACT; if (200 === a) return A.ZERO; if (201 === a) return A.ONE; if (202 === a) return A.SRC_COLOR; if (203 === a) return A.ONE_MINUS_SRC_COLOR; if (204 === a) return A.SRC_ALPHA; if (205 === a) return A.ONE_MINUS_SRC_ALPHA; if (206 === a) return A.DST_ALPHA; if (207 === a) return A.ONE_MINUS_DST_ALPHA; if (208 === a) return A.DST_COLOR; if (209 === a) return A.ONE_MINUS_DST_COLOR; if (210 === a) return A.SRC_ALPHA_SATURATE; if (2001 === a || 2002 === a || 2003 === a || 2004 === a) if (b = ka.get("WEBGL_compressed_texture_s3tc"), null !== b) { if (2001 === a) return b.COMPRESSED_RGB_S3TC_DXT1_EXT; if (2002 === a) return b.COMPRESSED_RGBA_S3TC_DXT1_EXT; if (2003 === a) return b.COMPRESSED_RGBA_S3TC_DXT3_EXT; if (2004 === a) return b.COMPRESSED_RGBA_S3TC_DXT5_EXT } if (2100 === a || 2101 === a || 2102 === a || 2103 === a) if (b = ka.get("WEBGL_compressed_texture_pvrtc"), null !== b) { if (2100 === a) return b.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; if (2101 === a) return b.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; if (2102 === a) return b.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; if (2103 === a) return b.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG } if (2151 === a && (b = ka.get("WEBGL_compressed_texture_etc1"), null !== b)) return b.COMPRESSED_RGB_ETC1_WEBGL; if (103 === a || 104 === a) if (b = ka.get("EXT_blend_minmax"), null !== b) { if (103 === a) return b.MIN_EXT; if (104 === a) return b.MAX_EXT } return 1020 === a && (b = ka.get("WEBGL_depth_texture"), null !== b) ? b.UNSIGNED_INT_24_8_WEBGL : 0 } // console.log("THREE.WebGLRenderer", "82"); a = a || {}; var v = void 0 !== a.canvas ? a.canvas : document.createElementNS("http://www.w3.org/1999/xhtml", "canvas") , I = void 0 !== a.context ? a.context : null , y = void 0 !== a.alpha ? a.alpha : !1 , E = void 0 !== a.depth ? a.depth : !0 , H = void 0 !== a.stencil ? a.stencil : !0 , F = void 0 !== a.antialias ? a.antialias : !1 , M = void 0 !== a.premultipliedAlpha ? a.premultipliedAlpha : !0 , ca = void 0 !== a.preserveDrawingBuffer ? a.preserveDrawingBuffer : !1 , K = [] , B = [] , C = -1 , z = [] , Ka = -1 , N = new Float32Array(8) , P = [] , R = []; this.domElement = v; this.context = null; this.sortObjects = this.autoClearStencil = this.autoClearDepth = this.autoClearColor = this.autoClear = !0; this.clippingPlanes = []; this.localClippingEnabled = !1; this.gammaFactor = 2; this.physicallyCorrectLights = this.gammaOutput = this.gammaInput = !1; this.toneMappingWhitePoint = this.toneMappingExposure = this.toneMapping = 1; this.maxMorphTargets = 8; this.maxMorphNormals = 4; var S = this , Q = null , V = null , T = null , L = -1 , U = "" , W = null , X = new ga , fb = null , $a = new ga , da = 0 , Da = new O(0) , Ra = 0 , Pa = v.width , pc = v.height , Qa = 1 , ha = new ga(0,0,Pa,pc) , la = !1 , fa = new ga(0,0,Pa,pc) , oa = new nc , ba = new Bf , pa = !1 , sa = !1 , na = new Ca , ra = new J , Z = new q , aa = { hash: "", ambient: [0, 0, 0], directional: [], directionalShadowMap: [], directionalShadowMatrix: [], spot: [], spotShadowMap: [], spotShadowMatrix: [], point: [], pointShadowMap: [], pointShadowMatrix: [], hemi: [], shadows: [] } , ma = { calls: 0, vertices: 0, faces: 0, points: 0 }; this.info = { render: ma, memory: { geometries: 0, textures: 0 }, programs: null }; var A; try { y = { alpha: y, depth: E, stencil: H, antialias: F, premultipliedAlpha: M, preserveDrawingBuffer: ca }; A = I || v.getContext("webgl", y) || v.getContext("experimental-webgl", y); if (null === A) { if (null !== v.getContext("webgl")) throw "Error creating WebGL context with your selected attributes."; throw "Error creating WebGL context."; } void 0 === A.getShaderPrecisionFormat && (A.getShaderPrecisionFormat = function() { return { rangeMin: 1, rangeMax: 1, precision: 1 } } ); v.addEventListener("webglcontextlost", e, !1) } catch (Cf) { console.error("THREE.WebGLRenderer: " + Cf) } var ka = new Af(A); ka.get("WEBGL_depth_texture"); ka.get("OES_texture_float"); ka.get("OES_texture_float_linear"); ka.get("OES_texture_half_float"); ka.get("OES_texture_half_float_linear"); ka.get("OES_standard_derivatives"); ka.get("ANGLE_instanced_arrays"); ka.get("OES_element_index_uint") && (G.MaxIndex = 4294967296); var ia = new zf(A,ka,a) , Y = new yf(A,ka,u) , ea = new xf , ua = new wf(A,ka,Y,ea,ia,u,this.info) , qa = new vf(A,ea,this.info) , va = new tf(this,ia) , za = new lf; this.info.programs = va.programs; var Ga = new kf(A,ka,ma) , Ha = new jf(A,ka,ma) , Ia = new Hb(-1,1,1,-1,0,1) , wa = new Ea , Ba = new ya(new ib(2,2),new Ma({ depthTest: !1, depthWrite: !1, fog: !1 })); a = Gb.cube; var xa = new ya(new hb(5,5,5),new Fa({ uniforms: a.uniforms, vertexShader: a.vertexShader, fragmentShader: a.fragmentShader, side: 1, depthTest: !1, depthWrite: !1, fog: !1 })); c(); this.context = A; this.capabilities = ia; this.extensions = ka; this.properties = ea; this.state = Y; var Ja = new pe(this,aa,qa,ia); this.shadowMap = Ja; var Na = new hf(this,P) , Oa = new ff(this,R); this.getContext = function() { return A } ; this.getContextAttributes = function() { return A.getContextAttributes() } ; this.forceContextLoss = function() { ka.get("WEBGL_lose_context").loseContext() } ; this.getMaxAnisotropy = function() { return ia.getMaxAnisotropy() } ; this.getPrecision = function() { return ia.precision } ; this.getPixelRatio = function() { return Qa } ; this.setPixelRatio = function(a) { void 0 !== a && (Qa = a, this.setSize(fa.z, fa.w, !1)) } ; this.getSize = function() { return { width: Pa, height: pc } } ; this.setSize = function(a, b, c) { Pa = a; pc = b; v.width = a * Qa; v.height = b * Qa; !1 !== c && (v.style.width = a + "px", v.style.height = b + "px"); this.setViewport(0, 0, a, b) } ; this.setViewport = function(a, b, c, d) { Y.viewport(fa.set(a, b, c, d)) } ; this.setScissor = function(a, b, c, d) { Y.scissor(ha.set(a, b, c, d)) } ; this.setScissorTest = function(a) { Y.setScissorTest(la = a) } ; this.getClearColor = function() { return Da } ; this.setClearColor = function(a, c) { Da.set(a); Ra = void 0 !== c ? c : 1; b(Da.r, Da.g, Da.b, Ra) } ; this.getClearAlpha = function() { return Ra } ; this.setClearAlpha = function(a) { Ra = a; b(Da.r, Da.g, Da.b, Ra) } ; this.clear = function(a, b, c) { var d = 0; if (void 0 === a || a) d |= A.COLOR_BUFFER_BIT; if (void 0 === b || b) d |= A.DEPTH_BUFFER_BIT; if (void 0 === c || c) d |= A.STENCIL_BUFFER_BIT; A.clear(d) } ; this.clearColor = function() { this.clear(!0, !1, !1) } ; this.clearDepth = function() { this.clear(!1, !0, !1) } ; this.clearStencil = function() { this.clear(!1, !1, !0) } ; this.clearTarget = function(a, b, c, d) { this.setRenderTarget(a); this.clear(b, c, d) } ; this.resetGLState = d; this.dispose = function() { z = []; Ka = -1; B = []; C = -1; v.removeEventListener("webglcontextlost", e, !1) } ; this.renderBufferImmediate = function(a, b, c) { Y.initAttributes(); var d = ea.get(a); a.hasPositions && !d.position && (d.position = A.createBuffer()); a.hasNormals && !d.normal && (d.normal = A.createBuffer()); a.hasUvs && !d.uv && (d.uv = A.createBuffer()); a.hasColors && !d.color && (d.color = A.createBuffer()); b = b.getAttributes(); a.hasPositions && (A.bindBuffer(A.ARRAY_BUFFER, d.position), A.bufferData(A.ARRAY_BUFFER, a.positionArray, A.DYNAMIC_DRAW), Y.enableAttribute(b.position), A.vertexAttribPointer(b.position, 3, A.FLOAT, !1, 0, 0)); if (a.hasNormals) { A.bindBuffer(A.ARRAY_BUFFER, d.normal); if (!c.isMeshPhongMaterial && !c.isMeshStandardMaterial && 1 === c.shading) for (var e = 0, f = 3 * a.count; e < f; e += 9) { var g = a.normalArray , h = (g[e + 0] + g[e + 3] + g[e + 6]) / 3 , k = (g[e + 1] + g[e + 4] + g[e + 7]) / 3 , m = (g[e + 2] + g[e + 5] + g[e + 8]) / 3; g[e + 0] = h; g[e + 1] = k; g[e + 2] = m; g[e + 3] = h; g[e + 4] = k; g[e + 5] = m; g[e + 6] = h; g[e + 7] = k; g[e + 8] = m } A.bufferData(A.ARRAY_BUFFER, a.normalArray, A.DYNAMIC_DRAW); Y.enableAttribute(b.normal); A.vertexAttribPointer(b.normal, 3, A.FLOAT, !1, 0, 0) } a.hasUvs && c.map && (A.bindBuffer(A.ARRAY_BUFFER, d.uv), A.bufferData(A.ARRAY_BUFFER, a.uvArray, A.DYNAMIC_DRAW), Y.enableAttribute(b.uv), A.vertexAttribPointer(b.uv, 2, A.FLOAT, !1, 0, 0)); a.hasColors && 0 !== c.vertexColors && (A.bindBuffer(A.ARRAY_BUFFER, d.color), A.bufferData(A.ARRAY_BUFFER, a.colorArray, A.DYNAMIC_DRAW), Y.enableAttribute(b.color), A.vertexAttribPointer(b.color, 3, A.FLOAT, !1, 0, 0)); Y.disableUnusedAttributes(); A.drawArrays(A.TRIANGLES, 0, a.count); a.count = 0 } ; this.renderBufferDirect = function(a, b, c, d, e, f) { l(d); var g = t(a, b, d, e) , k = !1; a = c.id + "_" + g.id + "_" + d.wireframe; a !== U && (U = a, k = !0); b = e.morphTargetInfluences; if (void 0 !== b) { var m = []; a = 0; for (var p = b.length; a < p; a++) k = b[a], m.push([k, a]); m.sort(h); 8 < m.length && (m.length = 8); var n = c.morphAttributes; a = 0; for (p = m.length; a < p; a++) k = m[a], N[a] = k[0], 0 !== k[0] ? (b = k[1], !0 === d.morphTargets && n.position && c.addAttribute("morphTarget" + a, n.position[b]), !0 === d.morphNormals && n.normal && c.addAttribute("morphNormal" + a, n.normal[b])) : (!0 === d.morphTargets && c.removeAttribute("morphTarget" + a), !0 === d.morphNormals && c.removeAttribute("morphNormal" + a)); a = m.length; for (b = N.length; a < b; a++) N[a] = 0; g.getUniforms().setValue(A, "morphTargetInfluences", N); k = !0 } b = c.index; p = c.attributes.position; m = 1; !0 === d.wireframe && (b = qa.getWireframeAttribute(c), m = 2); null !== b ? (a = Ha, a.setIndex(b)) : a = Ga; if (k) { a: { var k = void 0, w; if (c && c.isInstancedBufferGeometry && (w = ka.get("ANGLE_instanced_arrays"), null === w)) { console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."); break a } void 0 === k && (k = 0); Y.initAttributes(); var n = c.attributes, g = g.getAttributes(), r = d.defaultAttributeValues, v; for (v in g) { var q = g[v]; if (0 <= q) { var u = n[v]; if (void 0 !== u) { var y = A.FLOAT , D = u.array , H = u.normalized; D instanceof Float32Array ? y = A.FLOAT : D instanceof Float64Array ? console.warn("Unsupported data buffer format: Float64Array") : D instanceof Uint16Array ? y = A.UNSIGNED_SHORT : D instanceof Int16Array ? y = A.SHORT : D instanceof Uint32Array ? y = A.UNSIGNED_INT : D instanceof Int32Array ? y = A.INT : D instanceof Int8Array ? y = A.BYTE : D instanceof Uint8Array && (y = A.UNSIGNED_BYTE); var D = u.itemSize , F = qa.getAttributeBuffer(u); if (u.isInterleavedBufferAttribute) { var I = u.data , E = I.stride , u = u.offset; I && I.isInstancedInterleavedBuffer ? (Y.enableAttributeAndDivisor(q, I.meshPerAttribute, w), void 0 === c.maxInstancedCount && (c.maxInstancedCount = I.meshPerAttribute * I.count)) : Y.enableAttribute(q); A.bindBuffer(A.ARRAY_BUFFER, F); A.vertexAttribPointer(q, D, y, H, E * I.array.BYTES_PER_ELEMENT, (k * E + u) * I.array.BYTES_PER_ELEMENT) } else u.isInstancedBufferAttribute ? (Y.enableAttributeAndDivisor(q, u.meshPerAttribute, w), void 0 === c.maxInstancedCount && (c.maxInstancedCount = u.meshPerAttribute * u.count)) : Y.enableAttribute(q), A.bindBuffer(A.ARRAY_BUFFER, F), A.vertexAttribPointer(q, D, y, H, 0, k * D * u.array.BYTES_PER_ELEMENT) } else if (void 0 !== r && (y = r[v], void 0 !== y)) switch (y.length) { case 2: A.vertexAttrib2fv(q, y); break; case 3: A.vertexAttrib3fv(q, y); break; case 4: A.vertexAttrib4fv(q, y); break; default: A.vertexAttrib1fv(q, y) } } } Y.disableUnusedAttributes() } null !== b && A.bindBuffer(A.ELEMENT_ARRAY_BUFFER, qa.getAttributeBuffer(b)) } w = 0; null !== b ? w = b.count : void 0 !== p && (w = p.count); b = c.drawRange.start * m; p = null !== f ? f.start * m : 0; v = Math.max(b, p); f = Math.max(0, Math.min(w, b + c.drawRange.count * m, p + (null !== f ? f.count * m : Infinity)) - 1 - v + 1); if (0 !== f) { if (e.isMesh) if (!0 === d.wireframe) Y.setLineWidth(d.wireframeLinewidth * (null === V ? Qa : 1)), a.setMode(A.LINES); else switch (e.drawMode) { case 0: a.setMode(A.TRIANGLES); break; case 1: a.setMode(A.TRIANGLE_STRIP); break; case 2: a.setMode(A.TRIANGLE_FAN) } else e.isLine ? (d = d.linewidth, void 0 === d && (d = 1), Y.setLineWidth(d * (null === V ? Qa : 1)), e.isLineSegments ? a.setMode(A.LINES) : a.setMode(A.LINE_STRIP)) : e.isPoints && a.setMode(A.POINTS); c && c.isInstancedBufferGeometry ? 0 < c.maxInstancedCount && a.renderInstances(c, v, f) : a.render(v, f) } } ; this.render = function(a, c, d, e) { if (void 0 !== c && !0 !== c.isCamera) console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera."); else { U = ""; L = -1; W = null; !0 === a.autoUpdate && a.updateMatrixWorld(); null === c.parent && c.updateMatrixWorld(); c.matrixWorldInverse.getInverse(c.matrixWorld); ra.multiplyMatrices(c.projectionMatrix, c.matrixWorldInverse); oa.setFromMatrix(ra); K.length = 0; Ka = C = -1; P.length = 0; R.length = 0; sa = this.localClippingEnabled; pa = ba.init(this.clippingPlanes, sa, c); p(a, c); B.length = C + 1; z.length = Ka + 1; !0 === S.sortObjects && (B.sort(k), z.sort(m)); pa && ba.beginShadows(); for (var f = K, g = 0, h = 0, n = f.length; h < n; h++) { var w = f[h]; w.castShadow && (aa.shadows[g++] = w) } aa.shadows.length = g; Ja.render(a, c); for (var f = K, l = w = 0, x = 0, t, v, q, u, y = c.matrixWorldInverse, D = 0, H = 0, F = 0, I = 0, g = 0, h = f.length; g < h; g++) if (n = f[g], t = n.color, v = n.intensity, q = n.distance, u = n.shadow && n.shadow.map ? n.shadow.map.texture : null, n.isAmbientLight) w += t.r * v, l += t.g * v, x += t.b * v; else if (n.isDirectionalLight) { var E = za.get(n); E.color.copy(n.color).multiplyScalar(n.intensity); E.direction.setFromMatrixPosition(n.matrixWorld); Z.setFromMatrixPosition(n.target.matrixWorld); E.direction.sub(Z); E.direction.transformDirection(y); if (E.shadow = n.castShadow) E.shadowBias = n.shadow.bias, E.shadowRadius = n.shadow.radius, E.shadowMapSize = n.shadow.mapSize; aa.directionalShadowMap[D] = u; aa.directionalShadowMatrix[D] = n.shadow.matrix; aa.directional[D++] = E } else if (n.isSpotLight) { E = za.get(n); E.position.setFromMatrixPosition(n.matrixWorld); E.position.applyMatrix4(y); E.color.copy(t).multiplyScalar(v); E.distance = q; E.direction.setFromMatrixPosition(n.matrixWorld); Z.setFromMatrixPosition(n.target.matrixWorld); E.direction.sub(Z); E.direction.transformDirection(y); E.coneCos = Math.cos(n.angle); E.penumbraCos = Math.cos(n.angle * (1 - n.penumbra)); E.decay = 0 === n.distance ? 0 : n.decay; if (E.shadow = n.castShadow) E.shadowBias = n.shadow.bias, E.shadowRadius = n.shadow.radius, E.shadowMapSize = n.shadow.mapSize; aa.spotShadowMap[F] = u; aa.spotShadowMatrix[F] = n.shadow.matrix; aa.spot[F++] = E } else if (n.isPointLight) { E = za.get(n); E.position.setFromMatrixPosition(n.matrixWorld); E.position.applyMatrix4(y); E.color.copy(n.color).multiplyScalar(n.intensity); E.distance = n.distance; E.decay = 0 === n.distance ? 0 : n.decay; if (E.shadow = n.castShadow) E.shadowBias = n.shadow.bias, E.shadowRadius = n.shadow.radius, E.shadowMapSize = n.shadow.mapSize; aa.pointShadowMap[H] = u; void 0 === aa.pointShadowMatrix[H] && (aa.pointShadowMatrix[H] = new J); Z.setFromMatrixPosition(n.matrixWorld).negate(); aa.pointShadowMatrix[H].identity().setPosition(Z); aa.point[H++] = E } else n.isHemisphereLight && (E = za.get(n), E.direction.setFromMatrixPosition(n.matrixWorld), E.direction.transformDirection(y), E.direction.normalize(), E.skyColor.copy(n.color).multiplyScalar(v), E.groundColor.copy(n.groundColor).multiplyScalar(v), aa.hemi[I++] = E); aa.ambient[0] = w; aa.ambient[1] = l; aa.ambient[2] = x; aa.directional.length = D; aa.spot.length = F; aa.point.length = H; aa.hemi.length = I; aa.hash = D + "," + H + "," + F + "," + I + "," + aa.shadows.length; pa && ba.endShadows(); ma.calls = 0; ma.vertices = 0; ma.faces = 0; ma.points = 0; void 0 === d && (d = null); this.setRenderTarget(d); f = a.background; null === f ? b(Da.r, Da.g, Da.b, Ra) : f && f.isColor && (b(f.r, f.g, f.b, 1), e = !0); (this.autoClear || e) && this.clear(this.autoClearColor, this.autoClearDepth, this.autoClearStencil); f && f.isCubeTexture ? (wa.projectionMatrix.copy(c.projectionMatrix), wa.matrixWorld.extractRotation(c.matrixWorld), wa.matrixWorldInverse.getInverse(wa.matrixWorld), xa.material.uniforms.tCube.value = f, xa.modelViewMatrix.multiplyMatrices(wa.matrixWorldInverse, xa.matrixWorld), qa.update(xa), S.renderBufferDirect(wa, null, xa.geometry, xa.material, xa, null)) : f && f.isTexture && (Ba.material.map = f, qa.update(Ba), S.renderBufferDirect(Ia, null, Ba.geometry, Ba.material, Ba, null)); a.overrideMaterial ? (e = a.overrideMaterial, r(B, a, c, e), r(z, a, c, e)) : (Y.setBlending(0), r(B, a, c), r(z, a, c)); Na.render(a, c); Oa.render(a, c, $a); d && ua.updateRenderTargetMipmap(d); Y.setDepthTest(!0); Y.setDepthWrite(!0); Y.setColorWrite(!0) } } ; this.setFaceCulling = function(a, b) { Y.setCullFace(a); Y.setFlipSided(0 === b) } ; this.allocTextureUnit = function() { var a = da; a >= ia.maxTextures && console.warn("WebGLRenderer: trying to use " + a + " texture units while this GPU supports only " + ia.maxTextures); da += 1; return a } ; this.setTexture2D = function() { var a = !1; return function(b, c) { b && b.isWebGLRenderTarget && (a || (console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."), a = !0), b = b.texture); ua.setTexture2D(b, c) } }(); this.setTexture = function() { var a = !1; return function(b, c) { a || (console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."), a = !0); ua.setTexture2D(b, c) } }(); this.setTextureCube = function() { var a = !1; return function(b, c) { b && b.isWebGLRenderTargetCube && (a || (console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."), a = !0), b = b.texture); b && b.isCubeTexture || Array.isArray(b.image) && 6 === b.image.length ? ua.setTextureCube(b, c) : ua.setTextureCubeDynamic(b, c) } }(); this.getCurrentRenderTarget = function() { return V } ; this.setRenderTarget = function(a) { (V = a) && void 0 === ea.get(a).__webglFramebuffer && ua.setupRenderTarget(a); var b = a && a.isWebGLRenderTargetCube, c; a ? (c = ea.get(a), c = b ? c.__webglFramebuffer[a.activeCubeFace] : c.__webglFramebuffer, X.copy(a.scissor), fb = a.scissorTest, $a.copy(a.viewport)) : (c = null, X.copy(ha).multiplyScalar(Qa), fb = la, $a.copy(fa).multiplyScalar(Qa)); T !== c && (A.bindFramebuffer(A.FRAMEBUFFER, c), T = c); Y.scissor(X); Y.setScissorTest(fb); Y.viewport($a); b && (b = ea.get(a.texture), A.framebufferTexture2D(A.FRAMEBUFFER, A.COLOR_ATTACHMENT0, A.TEXTURE_CUBE_MAP_POSITIVE_X + a.activeCubeFace, b.__webglTexture, a.activeMipMapLevel)) } ; this.readRenderTargetPixels = function(a, b, c, d, e, f) { if (!1 === (a && a.isWebGLRenderTarget)) console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget."); else { var g = ea.get(a).__webglFramebuffer; if (g) { var h = !1; g !== T && (A.bindFramebuffer(A.FRAMEBUFFER, g), h = !0); try { var k = a.texture , m = k.format , n = k.type; 1023 !== m && u(m) !== A.getParameter(A.IMPLEMENTATION_COLOR_READ_FORMAT) ? console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.") : 1009 === n || u(n) === A.getParameter(A.IMPLEMENTATION_COLOR_READ_TYPE) || 1015 === n && (ka.get("OES_texture_float") || ka.get("WEBGL_color_buffer_float")) || 1016 === n && ka.get("EXT_color_buffer_half_float") ? A.checkFramebufferStatus(A.FRAMEBUFFER) === A.FRAMEBUFFER_COMPLETE ? 0 <= b && b <= a.width - d && 0 <= c && c <= a.height - e && A.readPixels(b, c, d, e, u(m), u(n), f) : console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.") : console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.") } finally { h && A.bindFramebuffer(A.FRAMEBUFFER, T) } } } } } function Ib(a, b) { this.name = ""; this.color = new O(a); this.density = void 0 !== b ? b : 2.5E-4 } function Jb(a, b, c) { this.name = ""; this.color = new O(a); this.near = void 0 !== b ? b : 1; this.far = void 0 !== c ? c : 1E3 } function jb() { z.call(this); this.type = "Scene"; this.overrideMaterial = this.fog = this.background = null; this.autoUpdate = !0 } function Ed(a, b, c, d, e) { z.call(this); this.lensFlares = []; this.positionScreen = new q; this.customUpdateCallback = void 0; void 0 !== a && this.add(a, b, c, d, e) } function kb(a) { U.call(this); this.type = "SpriteMaterial"; this.color = new O(16777215); this.map = null; this.rotation = 0; this.lights = this.fog = !1; this.setValues(a) } function qc(a) { z.call(this); this.type = "Sprite"; this.material = void 0 !== a ? a : new kb } function rc() { z.call(this); this.type = "LOD"; Object.defineProperties(this, { levels: { enumerable: !0, value: [] } }) } function lb(a, b, c, d, e, f, g, h, k, m, w, n) { da.call(this, null, f, g, h, k, m, d, e, w, n); this.image = { data: a, width: b, height: c }; this.magFilter = void 0 !== k ? k : 1003; this.minFilter = void 0 !== m ? m : 1003; this.flipY = this.generateMipmaps = !1; this.unpackAlignment = 1 } function bd(a, b, c) { this.useVertexTexture = void 0 !== c ? c : !0; this.identityMatrix = new J; a = a || []; this.bones = a.slice(0); this.useVertexTexture ? (a = Math.sqrt(4 * this.bones.length), a = T.nextPowerOfTwo(Math.ceil(a)), this.boneTextureHeight = this.boneTextureWidth = a = Math.max(a, 4), this.boneMatrices = new Float32Array(this.boneTextureWidth * this.boneTextureHeight * 4), this.boneTexture = new lb(this.boneMatrices,this.boneTextureWidth,this.boneTextureHeight,1023,1015)) : this.boneMatrices = new Float32Array(16 * this.bones.length); if (void 0 === b) this.calculateInverses(); else if (this.bones.length === b.length) this.boneInverses = b.slice(0); else for (console.warn("THREE.Skeleton bonInverses is the wrong length."), this.boneInverses = [], b = 0, a = this.bones.length; b < a; b++) this.boneInverses.push(new J) } function cd(a) { z.call(this); this.type = "Bone"; this.skin = a } function dd(a, b, c) { ya.call(this, a, b); this.type = "SkinnedMesh"; this.bindMode = "attached"; this.bindMatrix = new J; this.bindMatrixInverse = new J; a = []; if (this.geometry && void 0 !== this.geometry.bones) { for (var d, e = 0, f = this.geometry.bones.length; e < f; ++e) d = this.geometry.bones[e], b = new cd(this), a.push(b), b.name = d.name, b.position.fromArray(d.pos), b.quaternion.fromArray(d.rotq), void 0 !== d.scl && b.scale.fromArray(d.scl); e = 0; for (f = this.geometry.bones.length; e < f; ++e) d = this.geometry.bones[e], -1 !== d.parent && null !== d.parent && void 0 !== a[d.parent] ? a[d.parent].add(a[e]) : this.add(a[e]) } this.normalizeSkinWeights(); this.updateMatrixWorld(!0); this.bind(new bd(a,void 0,c), this.matrixWorld) } function oa(a) { U.call(this); this.type = "LineBasicMaterial"; this.color = new O(16777215); this.linewidth = 1; this.linejoin = this.linecap = "round"; this.lights = !1; this.setValues(a) } function Ta(a, b, c) { if (1 === c) return console.warn("THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead."), new la(a,b); z.call(this); this.type = "Line"; this.geometry = void 0 !== a ? a : new G; this.material = void 0 !== b ? b : new oa({ color: 16777215 * Math.random() }) } function la(a, b) { Ta.call(this, a, b); this.type = "LineSegments" } function xa(a) { U.call(this); this.type = "PointsMaterial"; this.color = new O(16777215); this.map = null; this.size = 1; this.sizeAttenuation = !0; this.lights = !1; this.setValues(a) } function Kb(a, b) { z.call(this); this.type = "Points"; this.geometry = void 0 !== a ? a : new G; this.material = void 0 !== b ? b : new xa({ color: 16777215 * Math.random() }) } function sc() { z.call(this); this.type = "Group" } function ed(a, b, c, d, e, f, g, h, k) { function m() { requestAnimationFrame(m); a.readyState >= a.HAVE_CURRENT_DATA && (w.needsUpdate = !0) } da.call(this, a, b, c, d, e, f, g, h, k); this.generateMipmaps = !1; var w = this; m() } function Lb(a, b, c, d, e, f, g, h, k, m, w, n) { da.call(this, null, f, g, h, k, m, d, e, w, n); this.image = { width: b, height: c }; this.mipmaps = a; this.generateMipmaps = this.flipY = !1 } function fd(a, b, c, d, e, f, g, h, k) { da.call(this, a, b, c, d, e, f, g, h, k); this.needsUpdate = !0 } function tc(a, b, c, d, e, f, g, h, k, m) { m = void 0 !== m ? m : 1026; if (1026 !== m && 1027 !== m) throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat"); da.call(this, null, d, e, f, g, h, m, c, k); this.image = { width: a, height: b }; this.type = void 0 !== c ? c : 1012; this.magFilter = void 0 !== g ? g : 1003; this.minFilter = void 0 !== h ? h : 1003; this.generateMipmaps = this.flipY = !1 } function Mb(a) { function b(a, b) { return a - b } G.call(this); var c = [0, 0] , d = {} , e = ["a", "b", "c"]; if (a && a.isGeometry) { var f = a.vertices , g = a.faces , h = 0 , k = new Uint32Array(6 * g.length); a = 0; for (var m = g.length; a < m; a++) for (var w = g[a], n = 0; 3 > n; n++) { c[0] = w[e[n]]; c[1] = w[e[(n + 1) % 3]]; c.sort(b); var p = c.toString(); void 0 === d[p] && (k[2 * h] = c[0], k[2 * h + 1] = c[1], d[p] = !0, h++) } c = new Float32Array(6 * h); a = 0; for (m = h; a < m; a++) for (n = 0; 2 > n; n++) d = f[k[2 * a + n]], h = 6 * a + 3 * n, c[h + 0] = d.x, c[h + 1] = d.y, c[h + 2] = d.z; this.addAttribute("position", new C(c,3)) } else if (a && a.isBufferGeometry) { if (null !== a.index) { m = a.index.array; f = a.attributes.position; e = a.groups; h = 0; 0 === e.length && a.addGroup(0, m.length); k = new Uint32Array(2 * m.length); g = 0; for (w = e.length; g < w; ++g) { a = e[g]; n = a.start; p = a.count; a = n; for (var r = n + p; a < r; a += 3) for (n = 0; 3 > n; n++) c[0] = m[a + n], c[1] = m[a + (n + 1) % 3], c.sort(b), p = c.toString(), void 0 === d[p] && (k[2 * h] = c[0], k[2 * h + 1] = c[1], d[p] = !0, h++) } c = new Float32Array(6 * h); a = 0; for (m = h; a < m; a++) for (n = 0; 2 > n; n++) h = 6 * a + 3 * n, d = k[2 * a + n], c[h + 0] = f.getX(d), c[h + 1] = f.getY(d), c[h + 2] = f.getZ(d) } else for (f = a.attributes.position.array, h = f.length / 3, k = h / 3, c = new Float32Array(6 * h), a = 0, m = k; a < m; a++) for (n = 0; 3 > n; n++) h = 18 * a + 6 * n, k = 9 * a + 3 * n, c[h + 0] = f[k], c[h + 1] = f[k + 1], c[h + 2] = f[k + 2], d = 9 * a + (n + 1) % 3 * 3, c[h + 3] = f[d], c[h + 4] = f[d + 1], c[h + 5] = f[d + 2]; this.addAttribute("position", new C(c,3)) } } function Nb(a, b, c) { G.call(this); this.type = "ParametricBufferGeometry"; this.parameters = { func: a, slices: b, stacks: c }; var d = [], e = [], f, g, h, k, m, w = b + 1; for (f = 0; f <= c; f++) for (m = f / c, g = 0; g <= b; g++) k = g / b, h = a(k, m), d.push(h.x, h.y, h.z), e.push(k, m); a = []; var n; for (f = 0; f < c; f++) for (g = 0; g < b; g++) h = f * w + g, k = f * w + g + 1, m = (f + 1) * w + g + 1, n = (f + 1) * w + g, a.push(h, k, n), a.push(k, m, n); this.setIndex((65535 < a.length ? $c : Zc)(a, 1)); this.addAttribute("position", ha(d, 3)); this.addAttribute("uv", ha(e, 2)); this.computeVertexNormals() } function uc(a, b, c) { Q.call(this); this.type = "ParametricGeometry"; this.parameters = { func: a, slices: b, stacks: c }; this.fromBufferGeometry(new Nb(a,b,c)); this.mergeVertices() } function ua(a, b, c, d) { function e(a) { h.push(a.x, a.y, a.z) } function f(b, c) { var d = 3 * b; c.x = a[d + 0]; c.y = a[d + 1]; c.z = a[d + 2] } function g(a, b, c, d) { 0 > d && 1 === a.x && (k[b] = a.x - 1); 0 === c.x && 0 === c.z && (k[b] = d / 2 / Math.PI + .5) } G.call(this); this.type = "PolyhedronBufferGeometry"; this.parameters = { vertices: a, indices: b, radius: c, detail: d }; c = c || 1; var h = [] , k = []; (function(a) { for (var c = new q, d = new q, g = new q, h = 0; h < b.length; h += 3) { f(b[h + 0], c); f(b[h + 1], d); f(b[h + 2], g); var k = c, l = d, D = g, u = Math.pow(2, a), v = [], I, y; for (I = 0; I <= u; I++) { v[I] = []; var E = k.clone().lerp(D, I / u) , H = l.clone().lerp(D, I / u) , F = u - I; for (y = 0; y <= F; y++) v[I][y] = 0 === y && I === u ? E : E.clone().lerp(H, y / F) } for (I = 0; I < u; I++) for (y = 0; y < 2 * (u - I) - 1; y++) k = Math.floor(y / 2), 0 === y % 2 ? (e(v[I][k + 1]), e(v[I + 1][k]), e(v[I][k])) : (e(v[I][k + 1]), e(v[I + 1][k + 1]), e(v[I + 1][k])) } } )(d || 0); (function(a) { for (var b = new q, c = 0; c < h.length; c += 3) b.x = h[c + 0], b.y = h[c + 1], b.z = h[c + 2], b.normalize().multiplyScalar(a), h[c + 0] = b.x, h[c + 1] = b.y, h[c + 2] = b.z } )(c); (function() { for (var a = new q, b = 0; b < h.length; b += 3) a.x = h[b + 0], a.y = h[b + 1], a.z = h[b + 2], k.push(Math.atan2(a.z, -a.x) / 2 / Math.PI + .5, 1 - (Math.atan2(-a.y, Math.sqrt(a.x * a.x + a.z * a.z)) / Math.PI + .5)); for (var a = new q, b = new q, c = new q, d = new q, e = new B, f = new B, l = new B, D = 0, u = 0; D < h.length; D += 9, u += 6) { a.set(h[D + 0], h[D + 1], h[D + 2]); b.set(h[D + 3], h[D + 4], h[D + 5]); c.set(h[D + 6], h[D + 7], h[D + 8]); e.set(k[u + 0], k[u + 1]); f.set(k[u + 2], k[u + 3]); l.set(k[u + 4], k[u + 5]); d.copy(a).add(b).add(c).divideScalar(3); var v = Math.atan2(d.z, -d.x); g(e, u + 0, a, v); g(f, u + 2, b, v); g(l, u + 4, c, v) } for (a = 0; a < k.length; a += 6) b = k[a + 0], c = k[a + 2], d = k[a + 4], e = Math.min(b, c, d), .9 < Math.max(b, c, d) && .1 > e && (.2 > b && (k[a + 0] += 1), .2 > c && (k[a + 2] += 1), .2 > d && (k[a + 4] += 1)) } )(); this.addAttribute("position", ha(h, 3)); this.addAttribute("normal", ha(h.slice(), 3)); this.addAttribute("uv", ha(k, 2)); this.normalizeNormals(); this.boundingSphere = new Ca(new q,c) } function Ob(a, b) { ua.call(this, [1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1], [2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1], a, b); this.type = "TetrahedronBufferGeometry"; this.parameters = { radius: a, detail: b } } function vc(a, b) { Q.call(this); this.type = "TetrahedronGeometry"; this.parameters = { radius: a, detail: b }; this.fromBufferGeometry(new Ob(a,b)); this.mergeVertices() } function Pb(a, b) { ua.call(this, [1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1], [0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2], a, b); this.type = "OctahedronBufferGeometry"; this.parameters = { radius: a, detail: b } } function wc(a, b) { Q.call(this); this.type = "OctahedronGeometry"; this.parameters = { radius: a, detail: b }; this.fromBufferGeometry(new Pb(a,b)); this.mergeVertices() } function Qb(a, b) { var c = (1 + Math.sqrt(5)) / 2; ua.call(this, [-1, c, 0, 1, c, 0, -1, -c, 0, 1, -c, 0, 0, -1, c, 0, 1, c, 0, -1, -c, 0, 1, -c, c, 0, -1, c, 0, 1, -c, 0, -1, -c, 0, 1], [0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1], a, b); this.type = "IcosahedronBufferGeometry"; this.parameters = { radius: a, detail: b } } function xc(a, b) { Q.call(this); this.type = "IcosahedronGeometry"; this.parameters = { radius: a, detail: b }; this.fromBufferGeometry(new Qb(a,b)); this.mergeVertices() } function Rb(a, b) { var c = (1 + Math.sqrt(5)) / 2 , d = 1 / c; ua.call(this, [-1, -1, -1, -1, -1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 0, -d, -c, 0, -d, c, 0, d, -c, 0, d, c, -d, -c, 0, -d, c, 0, d, -c, 0, d, c, 0, -c, 0, -d, c, 0, -d, -c, 0, d, c, 0, d], [3, 11, 7, 3, 7, 15, 3, 15, 13, 7, 19, 17, 7, 17, 6, 7, 6, 15, 17, 4, 8, 17, 8, 10, 17, 10, 6, 8, 0, 16, 8, 16, 2, 8, 2, 10, 0, 12, 1, 0, 1, 18, 0, 18, 16, 6, 10, 2, 6, 2, 13, 6, 13, 15, 2, 16, 18, 2, 18, 3, 2, 3, 13, 18, 1, 9, 18, 9, 11, 18, 11, 3, 4, 14, 12, 4, 12, 0, 4, 0, 8, 11, 9, 5, 11, 5, 19, 11, 19, 7, 19, 5, 14, 19, 14, 4, 19, 4, 17, 1, 12, 14, 1, 14, 5, 1, 5, 9], a, b); this.type = "DodecahedronBufferGeometry"; this.parameters = { radius: a, detail: b } } function yc(a, b) { Q.call(this); this.type = "DodecahedronGeometry"; this.parameters = { radius: a, detail: b }; this.fromBufferGeometry(new Rb(a,b)); this.mergeVertices() } function zc(a, b, c, d) { Q.call(this); this.type = "PolyhedronGeometry"; this.parameters = { vertices: a, indices: b, radius: c, detail: d }; this.fromBufferGeometry(new ua(a,b,c,d)); this.mergeVertices() } function Sb(a, b, c, d, e) { function f(e) { var f = a.getPointAt(e / b) , m = g.normals[e]; e = g.binormals[e]; for (n = 0; n <= d; n++) { var w = n / d * Math.PI * 2 , l = Math.sin(w) , w = -Math.cos(w); k.x = w * m.x + l * e.x; k.y = w * m.y + l * e.y; k.z = w * m.z + l * e.z; k.normalize(); r.push(k.x, k.y, k.z); h.x = f.x + c * k.x; h.y = f.y + c * k.y; h.z = f.z + c * k.z; p.push(h.x, h.y, h.z) } } G.call(this); this.type = "TubeBufferGeometry"; this.parameters = { path: a, tubularSegments: b, radius: c, radialSegments: d, closed: e }; b = b || 64; c = c || 1; d = d || 8; e = e || !1; var g = a.computeFrenetFrames(b, e); this.tangents = g.tangents; this.normals = g.normals; this.binormals = g.binormals; var h = new q, k = new q, m = new B, w, n, p = [], r = [], l = [], t = []; for (w = 0; w < b; w++) f(w); f(!1 === e ? b : 0); for (w = 0; w <= b; w++) for (n = 0; n <= d; n++) m.x = w / b, m.y = n / d, l.push(m.x, m.y); (function() { for (n = 1; n <= b; n++) for (w = 1; w <= d; w++) { var a = (d + 1) * n + (w - 1) , c = (d + 1) * n + w , e = (d + 1) * (n - 1) + w; t.push((d + 1) * (n - 1) + (w - 1), a, e); t.push(a, c, e) } } )(); this.setIndex((65535 < t.length ? $c : Zc)(t, 1)); this.addAttribute("position", ha(p, 3)); this.addAttribute("normal", ha(r, 3)); this.addAttribute("uv", ha(l, 2)) } function Ac(a, b, c, d, e, f) { Q.call(this); this.type = "TubeGeometry"; this.parameters = { path: a, tubularSegments: b, radius: c, radialSegments: d, closed: e }; void 0 !== f && console.warn("THREE.TubeGeometry: taper has been removed."); a = new Sb(a,b,c,d,e); this.tangents = a.tangents; this.normals = a.normals; this.binormals = a.binormals; this.fromBufferGeometry(a); this.mergeVertices() } function Tb(a, b, c, d, e, f) { function g(a, b, c, d, e) { var f = Math.sin(a); b = c / b * a; c = Math.cos(b); e.x = d * (2 + c) * .5 * Math.cos(a); e.y = d * (2 + c) * f * .5; e.z = d * Math.sin(b) * .5 } G.call(this); this.type = "TorusKnotBufferGeometry"; this.parameters = { radius: a, tube: b, tubularSegments: c, radialSegments: d, p: e, q: f }; a = a || 100; b = b || 40; c = Math.floor(c) || 64; d = Math.floor(d) || 8; e = e || 2; f = f || 3; var h = (d + 1) * (c + 1), k = d * c * 6, k = new C(new (65535 < k ? Uint32Array : Uint16Array)(k),1), m = new C(new Float32Array(3 * h),3), w = new C(new Float32Array(3 * h),3), h = new C(new Float32Array(2 * h),2), n, p, r = 0, l = 0, t = new q, D = new q, u = new B, v = new q, I = new q, y = new q, E = new q, H = new q; for (n = 0; n <= c; ++n) for (p = n / c * e * Math.PI * 2, g(p, e, f, a, v), g(p + .01, e, f, a, I), E.subVectors(I, v), H.addVectors(I, v), y.crossVectors(E, H), H.crossVectors(y, E), y.normalize(), H.normalize(), p = 0; p <= d; ++p) { var F = p / d * Math.PI * 2 , M = -b * Math.cos(F) , F = b * Math.sin(F); t.x = v.x + (M * H.x + F * y.x); t.y = v.y + (M * H.y + F * y.y); t.z = v.z + (M * H.z + F * y.z); m.setXYZ(r, t.x, t.y, t.z); D.subVectors(t, v).normalize(); w.setXYZ(r, D.x, D.y, D.z); u.x = n / c; u.y = p / d; h.setXY(r, u.x, u.y); r++ } for (p = 1; p <= c; p++) for (n = 1; n <= d; n++) a = (d + 1) * p + (n - 1), b = (d + 1) * p + n, e = (d + 1) * (p - 1) + n, k.setX(l, (d + 1) * (p - 1) + (n - 1)), l++, k.setX(l, a), l++, k.setX(l, e), l++, k.setX(l, a), l++, k.setX(l, b), l++, k.setX(l, e), l++; this.setIndex(k); this.addAttribute("position", m); this.addAttribute("normal", w); this.addAttribute("uv", h) } function Bc(a, b, c, d, e, f, g) { Q.call(this); this.type = "TorusKnotGeometry"; this.parameters = { radius: a, tube: b, tubularSegments: c, radialSegments: d, p: e, q: f }; void 0 !== g && console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead."); this.fromBufferGeometry(new Tb(a,b,c,d,e,f)); this.mergeVertices() } function Ub(a, b, c, d, e) { G.call(this); this.type = "TorusBufferGeometry"; this.parameters = { radius: a, tube: b, radialSegments: c, tubularSegments: d, arc: e }; a = a || 100; b = b || 40; c = Math.floor(c) || 8; d = Math.floor(d) || 6; e = e || 2 * Math.PI; var f = (c + 1) * (d + 1), g = c * d * 6, g = new (65535 < g ? Uint32Array : Uint16Array)(g), h = new Float32Array(3 * f), k = new Float32Array(3 * f), f = new Float32Array(2 * f), m = 0, w = 0, n = 0, p = new q, r = new q, l = new q, t, D; for (t = 0; t <= c; t++) for (D = 0; D <= d; D++) { var u = D / d * e , v = t / c * Math.PI * 2; r.x = (a + b * Math.cos(v)) * Math.cos(u); r.y = (a + b * Math.cos(v)) * Math.sin(u); r.z = b * Math.sin(v); h[m] = r.x; h[m + 1] = r.y; h[m + 2] = r.z; p.x = a * Math.cos(u); p.y = a * Math.sin(u); l.subVectors(r, p).normalize(); k[m] = l.x; k[m + 1] = l.y; k[m + 2] = l.z; f[w] = D / d; f[w + 1] = t / c; m += 3; w += 2 } for (t = 1; t <= c; t++) for (D = 1; D <= d; D++) a = (d + 1) * (t - 1) + D - 1, b = (d + 1) * (t - 1) + D, e = (d + 1) * t + D, g[n] = (d + 1) * t + D - 1, g[n + 1] = a, g[n + 2] = e, g[n + 3] = a, g[n + 4] = b, g[n + 5] = e, n += 6; this.setIndex(new C(g,1)); this.addAttribute("position", new C(h,3)); this.addAttribute("normal", new C(k,3)); this.addAttribute("uv", new C(f,2)) } function Cc(a, b, c, d, e) { Q.call(this); this.type = "TorusGeometry"; this.parameters = { radius: a, tube: b, radialSegments: c, tubularSegments: d, arc: e }; this.fromBufferGeometry(new Ub(a,b,c,d,e)) } function za(a, b) { "undefined" !== typeof a && (Q.call(this), this.type = "ExtrudeGeometry", a = Array.isArray(a) ? a : [a], this.addShapeList(a, b), this.computeFaceNormals()) } function Dc(a, b) { b = b || {}; var c = b.font; if (!1 === (c && c.isFont)) return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."), new Q; c = c.generateShapes(a, b.size, b.curveSegments); b.amount = void 0 !== b.height ? b.height : 50; void 0 === b.bevelThickness && (b.bevelThickness = 10); void 0 === b.bevelSize && (b.bevelSize = 8); void 0 === b.bevelEnabled && (b.bevelEnabled = !1); za.call(this, c, b); this.type = "TextGeometry" } function mb(a, b, c, d, e, f, g) { G.call(this); this.type = "SphereBufferGeometry"; this.parameters = { radius: a, widthSegments: b, heightSegments: c, phiStart: d, phiLength: e, thetaStart: f, thetaLength: g }; a = a || 50; b = Math.max(3, Math.floor(b) || 8); c = Math.max(2, Math.floor(c) || 6); d = void 0 !== d ? d : 0; e = void 0 !== e ? e : 2 * Math.PI; f = void 0 !== f ? f : 0; g = void 0 !== g ? g : Math.PI; for (var h = f + g, k = (b + 1) * (c + 1), m = new C(new Float32Array(3 * k),3), w = new C(new Float32Array(3 * k),3), k = new C(new Float32Array(2 * k),2), n = 0, p = [], l = new q, x = 0; x <= c; x++) { for (var t = [], D = x / c, u = 0; u <= b; u++) { var v = u / b , I = -a * Math.cos(d + v * e) * Math.sin(f + D * g) , y = a * Math.cos(f + D * g) , E = a * Math.sin(d + v * e) * Math.sin(f + D * g); l.set(I, y, E).normalize(); m.setXYZ(n, I, y, E); w.setXYZ(n, l.x, l.y, l.z); k.setXY(n, v, 1 - D); t.push(n); n++ } p.push(t) } d = []; for (x = 0; x < c; x++) for (u = 0; u < b; u++) e = p[x][u + 1], g = p[x][u], n = p[x + 1][u], l = p[x + 1][u + 1], (0 !== x || 0 < f) && d.push(e, g, l), (x !== c - 1 || h < Math.PI) && d.push(g, n, l); this.setIndex(new (65535 < m.count ? $c : Zc)(d,1)); this.addAttribute("position", m); this.addAttribute("normal", w); this.addAttribute("uv", k); this.boundingSphere = new Ca(new q,a) } function Vb(a, b, c, d, e, f, g) { Q.call(this); this.type = "SphereGeometry"; this.parameters = { radius: a, widthSegments: b, heightSegments: c, phiStart: d, phiLength: e, thetaStart: f, thetaLength: g }; this.fromBufferGeometry(new mb(a,b,c,d,e,f,g)) } function Wb(a, b, c, d, e, f) { G.call(this); this.type = "RingBufferGeometry"; this.parameters = { innerRadius: a, outerRadius: b, thetaSegments: c, phiSegments: d, thetaStart: e, thetaLength: f }; a = a || 20; b = b || 50; e = void 0 !== e ? e : 0; f = void 0 !== f ? f : 2 * Math.PI; c = void 0 !== c ? Math.max(3, c) : 8; d = void 0 !== d ? Math.max(1, d) : 1; var g = (c + 1) * (d + 1), h = c * d * 6, h = new C(new (65535 < h ? Uint32Array : Uint16Array)(h),1), k = new C(new Float32Array(3 * g),3), m = new C(new Float32Array(3 * g),3), g = new C(new Float32Array(2 * g),2), w = 0, n = 0, p, l = a, x = (b - a) / d, t = new q, D = new B, u; for (a = 0; a <= d; a++) { for (u = 0; u <= c; u++) p = e + u / c * f, t.x = l * Math.cos(p), t.y = l * Math.sin(p), k.setXYZ(w, t.x, t.y, t.z), m.setXYZ(w, 0, 0, 1), D.x = (t.x / b + 1) / 2, D.y = (t.y / b + 1) / 2, g.setXY(w, D.x, D.y), w++; l += x } for (a = 0; a < d; a++) for (b = a * (c + 1), u = 0; u < c; u++) e = p = u + b, f = p + c + 1, w = p + c + 2, p += 1, h.setX(n, e), n++, h.setX(n, f), n++, h.setX(n, w), n++, h.setX(n, e), n++, h.setX(n, w), n++, h.setX(n, p), n++; this.setIndex(h); this.addAttribute("position", k); this.addAttribute("normal", m); this.addAttribute("uv", g) } function Ec(a, b, c, d, e, f) { Q.call(this); this.type = "RingGeometry"; this.parameters = { innerRadius: a, outerRadius: b, thetaSegments: c, phiSegments: d, thetaStart: e, thetaLength: f }; this.fromBufferGeometry(new Wb(a,b,c,d,e,f)) } function Fc(a, b, c, d) { Q.call(this); this.type = "PlaneGeometry"; this.parameters = { width: a, height: b, widthSegments: c, heightSegments: d }; this.fromBufferGeometry(new ib(a,b,c,d)) } function Xb(a, b, c, d) { G.call(this); this.type = "LatheBufferGeometry"; this.parameters = { points: a, segments: b, phiStart: c, phiLength: d }; b = Math.floor(b) || 12; c = c || 0; d = d || 2 * Math.PI; d = T.clamp(d, 0, 2 * Math.PI); for (var e = (b + 1) * a.length, f = b * a.length * 6, g = new C(new (65535 < f ? Uint32Array : Uint16Array)(f),1), h = new C(new Float32Array(3 * e),3), k = new C(new Float32Array(2 * e),2), m = 0, w = 0, n = 1 / b, p = new q, l = new B, e = 0; e <= b; e++) for (var f = c + e * n * d, x = Math.sin(f), t = Math.cos(f), f = 0; f <= a.length - 1; f++) p.x = a[f].x * x, p.y = a[f].y, p.z = a[f].x * t, h.setXYZ(m, p.x, p.y, p.z), l.x = e / b, l.y = f / (a.length - 1), k.setXY(m, l.x, l.y), m++; for (e = 0; e < b; e++) for (f = 0; f < a.length - 1; f++) c = f + e * a.length, m = c + a.length, n = c + a.length + 1, p = c + 1, g.setX(w, c), w++, g.setX(w, m), w++, g.setX(w, p), w++, g.setX(w, m), w++, g.setX(w, n), w++, g.setX(w, p), w++; this.setIndex(g); this.addAttribute("position", h); this.addAttribute("uv", k); this.computeVertexNormals(); if (d === 2 * Math.PI) for (d = this.attributes.normal.array, g = new q, h = new q, k = new q, c = b * a.length * 3, f = e = 0; e < a.length; e++, f += 3) g.x = d[f + 0], g.y = d[f + 1], g.z = d[f + 2], h.x = d[c + f + 0], h.y = d[c + f + 1], h.z = d[c + f + 2], k.addVectors(g, h).normalize(), d[f + 0] = d[c + f + 0] = k.x, d[f + 1] = d[c + f + 1] = k.y, d[f + 2] = d[c + f + 2] = k.z } function Gc(a, b, c, d) { Q.call(this); this.type = "LatheGeometry"; this.parameters = { points: a, segments: b, phiStart: c, phiLength: d }; this.fromBufferGeometry(new Xb(a,b,c,d)); this.mergeVertices() } function cb(a, b) { Q.call(this); this.type = "ShapeGeometry"; !1 === Array.isArray(a) && (a = [a]); this.addShapeList(a, b); this.computeFaceNormals() } function Yb(a, b) { function c(a, b) { return a - b } G.call(this); var d = Math.cos(T.DEG2RAD * (void 0 !== b ? b : 1)), e = [0, 0], f = {}, g = ["a", "b", "c"], h; a && a.isBufferGeometry ? (h = new Q, h.fromBufferGeometry(a)) : h = a.clone(); h.mergeVertices(); h.computeFaceNormals(); var k = h.vertices; h = h.faces; for (var m = 0, w = h.length; m < w; m++) for (var n = h[m], p = 0; 3 > p; p++) { e[0] = n[g[p]]; e[1] = n[g[(p + 1) % 3]]; e.sort(c); var l = e.toString(); void 0 === f[l] ? f[l] = { vert1: e[0], vert2: e[1], face1: m, face2: void 0 } : f[l].face2 = m } e = []; for (l in f) if (g = f[l], void 0 === g.face2 || h[g.face1].normal.dot(h[g.face2].normal) <= d) m = k[g.vert1], e.push(m.x), e.push(m.y), e.push(m.z), m = k[g.vert2], e.push(m.x), e.push(m.y), e.push(m.z); this.addAttribute("position", new C(new Float32Array(e),3)) } function Ua(a, b, c, d, e, f, g, h) { function k(c) { var e, f, k, n = new B, p = new q, l = 0, w = !0 === c ? a : b, I = !0 === c ? 1 : -1; f = u; for (e = 1; e <= d; e++) x.setXYZ(u, 0, y * I, 0), t.setXYZ(u, 0, I, 0), n.x = .5, n.y = .5, D.setXY(u, n.x, n.y), u++; k = u; for (e = 0; e <= d; e++) { var z = e / d * h + g , C = Math.cos(z) , z = Math.sin(z); p.x = w * z; p.y = y * I; p.z = w * C; x.setXYZ(u, p.x, p.y, p.z); t.setXYZ(u, 0, I, 0); n.x = .5 * C + .5; n.y = .5 * z * I + .5; D.setXY(u, n.x, n.y); u++ } for (e = 0; e < d; e++) n = f + e, p = k + e, !0 === c ? (r.setX(v, p), v++, r.setX(v, p + 1)) : (r.setX(v, p + 1), v++, r.setX(v, p)), v++, r.setX(v, n), v++, l += 3; m.addGroup(E, l, !0 === c ? 1 : 2); E += l } G.call(this); this.type = "CylinderBufferGeometry"; this.parameters = { radiusTop: a, radiusBottom: b, height: c, radialSegments: d, heightSegments: e, openEnded: f, thetaStart: g, thetaLength: h }; var m = this; a = void 0 !== a ? a : 20; b = void 0 !== b ? b : 20; c = void 0 !== c ? c : 100; d = Math.floor(d) || 8; e = Math.floor(e) || 1; f = void 0 !== f ? f : !1; g = void 0 !== g ? g : 0; h = void 0 !== h ? h : 2 * Math.PI; var l = 0; !1 === f && (0 < a && l++, 0 < b && l++); var n = function() { var a = (d + 1) * (e + 1); !1 === f && (a += (d + 1) * l + d * l); return a }() , p = function() { var a = d * e * 6; !1 === f && (a += d * l * 3); return a }() , r = new C(new (65535 < p ? Uint32Array : Uint16Array)(p),1) , x = new C(new Float32Array(3 * n),3) , t = new C(new Float32Array(3 * n),3) , D = new C(new Float32Array(2 * n),2) , u = 0 , v = 0 , I = [] , y = c / 2 , E = 0; (function() { var f, k, n = new q, p = new q, l = 0, w = (b - a) / c; for (k = 0; k <= e; k++) { var B = [] , z = k / e , C = z * (b - a) + a; for (f = 0; f <= d; f++) { var N = f / d , P = N * h + g , R = Math.sin(P) , P = Math.cos(P); p.x = C * R; p.y = -z * c + y; p.z = C * P; x.setXYZ(u, p.x, p.y, p.z); n.set(R, w, P).normalize(); t.setXYZ(u, n.x, n.y, n.z); D.setXY(u, N, 1 - z); B.push(u); u++ } I.push(B) } for (f = 0; f < d; f++) for (k = 0; k < e; k++) n = I[k + 1][f], p = I[k + 1][f + 1], w = I[k][f + 1], r.setX(v, I[k][f]), v++, r.setX(v, n), v++, r.setX(v, w), v++, r.setX(v, n), v++, r.setX(v, p), v++, r.setX(v, w), v++, l += 6; m.addGroup(E, l, 0); E += l } )(); !1 === f && (0 < a && k(!0), 0 < b && k(!1)); this.setIndex(r); this.addAttribute("position", x); this.addAttribute("normal", t); this.addAttribute("uv", D) } function nb(a, b, c, d, e, f, g, h) { Q.call(this); this.type = "CylinderGeometry"; this.parameters = { radiusTop: a, radiusBottom: b, height: c, radialSegments: d, heightSegments: e, openEnded: f, thetaStart: g, thetaLength: h }; this.fromBufferGeometry(new Ua(a,b,c,d,e,f,g,h)); this.mergeVertices() } function Hc(a, b, c, d, e, f, g) { nb.call(this, 0, a, b, c, d, e, f, g); this.type = "ConeGeometry"; this.parameters = { radius: a, height: b, radialSegments: c, heightSegments: d, openEnded: e, thetaStart: f, thetaLength: g } } function Ic(a, b, c, d, e, f, g) { Ua.call(this, 0, a, b, c, d, e, f, g); this.type = "ConeBufferGeometry"; this.parameters = { radius: a, height: b, radialSegments: c, heightSegments: d, openEnded: e, thetaStart: f, thetaLength: g } } function Zb(a, b, c, d) { G.call(this); this.type = "CircleBufferGeometry"; this.parameters = { radius: a, segments: b, thetaStart: c, thetaLength: d }; a = a || 50; b = void 0 !== b ? Math.max(3, b) : 8; c = void 0 !== c ? c : 0; d = void 0 !== d ? d : 2 * Math.PI; var e = b + 2 , f = new Float32Array(3 * e) , g = new Float32Array(3 * e) , e = new Float32Array(2 * e); g[2] = 1; e[0] = .5; e[1] = .5; for (var h = 0, k = 3, m = 2; h <= b; h++, k += 3, m += 2) { var l = c + h / b * d; f[k] = a * Math.cos(l); f[k + 1] = a * Math.sin(l); g[k + 2] = 1; e[m] = (f[k] / a + 1) / 2; e[m + 1] = (f[k + 1] / a + 1) / 2 } c = []; for (k = 1; k <= b; k++) c.push(k, k + 1, 0); this.setIndex(new C(new Uint16Array(c),1)); this.addAttribute("position", new C(f,3)); this.addAttribute("normal", new C(g,3)); this.addAttribute("uv", new C(e,2)); this.boundingSphere = new Ca(new q,a) } function Jc(a, b, c, d) { Q.call(this); this.type = "CircleGeometry"; this.parameters = { radius: a, segments: b, thetaStart: c, thetaLength: d }; this.fromBufferGeometry(new Zb(a,b,c,d)) } function ob(a, b, c, d, e, f) { Q.call(this); this.type = "BoxGeometry"; this.parameters = { width: a, height: b, depth: c, widthSegments: d, heightSegments: e, depthSegments: f }; this.fromBufferGeometry(new hb(a,b,c,d,e,f)); this.mergeVertices() } function $b() { Fa.call(this, { uniforms: La.merge([W.lights, { opacity: { value: 1 } }]), vertexShader: X.shadow_vert, fragmentShader: X.shadow_frag }); this.transparent = this.lights = !0; Object.defineProperties(this, { opacity: { enumerable: !0, get: function() { return this.uniforms.opacity.value }, set: function(a) { this.uniforms.opacity.value = a } } }) } function ac(a) { Fa.call(this, a); this.type = "RawShaderMaterial" } function Kc(a) { this.uuid = T.generateUUID(); this.type = "MultiMaterial"; this.materials = a instanceof Array ? a : []; this.visible = !0 } function Oa(a) { U.call(this); this.defines = { STANDARD: "" }; this.type = "MeshStandardMaterial"; this.color = new O(16777215); this.metalness = this.roughness = .5; this.lightMap = this.map = null; this.lightMapIntensity = 1; this.aoMap = null; this.aoMapIntensity = 1; this.emissive = new O(0); this.emissiveIntensity = 1; this.bumpMap = this.emissiveMap = null; this.bumpScale = 1; this.normalMap = null; this.normalScale = new B(1,1); this.displacementMap = null; this.displacementScale = 1; this.displacementBias = 0; this.envMap = this.alphaMap = this.metalnessMap = this.roughnessMap = null; this.envMapIntensity = 1; this.refractionRatio = .98; this.wireframe = !1; this.wireframeLinewidth = 1; this.wireframeLinejoin = this.wireframeLinecap = "round"; this.morphNormals = this.morphTargets = this.skinning = !1; this.setValues(a) } function pb(a) { Oa.call(this); this.defines = { PHYSICAL: "" }; this.type = "MeshPhysicalMaterial"; this.reflectivity = .5; this.clearCoatRoughness = this.clearCoat = 0; this.setValues(a) } function db(a) { U.call(this); this.type = "MeshPhongMaterial"; this.color = new O(16777215); this.specular = new O(1118481); this.shininess = 30; this.lightMap = this.map = null; this.lightMapIntensity = 1; this.aoMap = null; this.aoMapIntensity = 1; this.emissive = new O(0); this.emissiveIntensity = 1; this.bumpMap = this.emissiveMap = null; this.bumpScale = 1; this.normalMap = null; this.normalScale = new B(1,1); this.displacementMap = null; this.displacementScale = 1; this.displacementBias = 0; this.envMap = this.alphaMap = this.specularMap = null; this.combine = 0; this.reflectivity = 1; this.refractionRatio = .98; this.wireframe = !1; this.wireframeLinewidth = 1; this.wireframeLinejoin = this.wireframeLinecap = "round"; this.morphNormals = this.morphTargets = this.skinning = !1; this.setValues(a) } function qb(a) { U.call(this, a); this.type = "MeshNormalMaterial"; this.wireframe = !1; this.wireframeLinewidth = 1; this.morphTargets = this.lights = this.fog = !1; this.setValues(a) } function rb(a) { U.call(this); this.type = "MeshLambertMaterial"; this.color = new O(16777215); this.lightMap = this.map = null; this.lightMapIntensity = 1; this.aoMap = null; this.aoMapIntensity = 1; this.emissive = new O(0); this.emissiveIntensity = 1; this.envMap = this.alphaMap = this.specularMap = this.emissiveMap = null; this.combine = 0; this.reflectivity = 1; this.refractionRatio = .98; this.wireframe = !1; this.wireframeLinewidth = 1; this.wireframeLinejoin = this.wireframeLinecap = "round"; this.morphNormals = this.morphTargets = this.skinning = !1; this.setValues(a) } function sb(a) { U.call(this); this.type = "LineDashedMaterial"; this.color = new O(16777215); this.scale = this.linewidth = 1; this.dashSize = 3; this.gapSize = 1; this.lights = !1; this.setValues(a) } function Fd(a, b, c) { var d = this , e = !1 , f = 0 , g = 0; this.onStart = void 0; this.onLoad = a; this.onProgress = b; this.onError = c; this.itemStart = function(a) { g++; if (!1 === e && void 0 !== d.onStart) d.onStart(a, f, g); e = !0 } ; this.itemEnd = function(a) { f++; if (void 0 !== d.onProgress) d.onProgress(a, f, g); if (f === g && (e = !1, void 0 !== d.onLoad)) d.onLoad() } ; this.itemError = function(a) { if (void 0 !== d.onError) d.onError(a) } } function Ja(a) { this.manager = void 0 !== a ? a : Ga } function we(a) { this.manager = void 0 !== a ? a : Ga; this._parser = null } function Gd(a) { this.manager = void 0 !== a ? a : Ga; this._parser = null } function Lc(a) { this.manager = void 0 !== a ? a : Ga } function Hd(a) { this.manager = void 0 !== a ? a : Ga } function gd(a) { this.manager = void 0 !== a ? a : Ga } function pa(a, b) { z.call(this); this.type = "Light"; this.color = new O(a); this.intensity = void 0 !== b ? b : 1; this.receiveShadow = void 0 } function hd(a, b, c) { pa.call(this, a, c); this.type = "HemisphereLight"; this.castShadow = void 0; this.position.copy(z.DefaultUp); this.updateMatrix(); this.groundColor = new O(b) } function tb(a) { this.camera = a; this.bias = 0; this.radius = 1; this.mapSize = new B(512,512); this.map = null; this.matrix = new J } function id() { tb.call(this, new Ea(50,1,.5,500)) } function jd(a, b, c, d, e, f) { pa.call(this, a, b); this.type = "SpotLight"; this.position.copy(z.DefaultUp); this.updateMatrix(); this.target = new z; Object.defineProperty(this, "power", { get: function() { return this.intensity * Math.PI }, set: function(a) { this.intensity = a / Math.PI } }); this.distance = void 0 !== c ? c : 0; this.angle = void 0 !== d ? d : Math.PI / 3; this.penumbra = void 0 !== e ? e : 0; this.decay = void 0 !== f ? f : 1; this.shadow = new id } function kd(a, b, c, d) { pa.call(this, a, b); this.type = "PointLight"; Object.defineProperty(this, "power", { get: function() { return 4 * this.intensity * Math.PI }, set: function(a) { this.intensity = a / (4 * Math.PI) } }); this.distance = void 0 !== c ? c : 0; this.decay = void 0 !== d ? d : 1; this.shadow = new tb(new Ea(90,1,.5,500)) } function ld(a) { tb.call(this, new Hb(-5,5,5,-5,.5,500)) } function md(a, b) { pa.call(this, a, b); this.type = "DirectionalLight"; this.position.copy(z.DefaultUp); this.updateMatrix(); this.target = new z; this.shadow = new ld } function nd(a, b) { pa.call(this, a, b); this.type = "AmbientLight"; this.castShadow = void 0 } function qa(a, b, c, d) { this.parameterPositions = a; this._cachedIndex = 0; this.resultBuffer = void 0 !== d ? d : new b.constructor(c); this.sampleValues = b; this.valueSize = c } function od(a, b, c, d) { qa.call(this, a, b, c, d); this._offsetNext = this._weightNext = this._offsetPrev = this._weightPrev = -0 } function Mc(a, b, c, d) { qa.call(this, a, b, c, d) } function pd(a, b, c, d) { qa.call(this, a, b, c, d) } function ub(a, b, c, d) { if (void 0 === a) throw Error("track name is undefined"); if (void 0 === b || 0 === b.length) throw Error("no keyframes in track named " + a); this.name = a; this.times = ma.convertArray(b, this.TimeBufferType); this.values = ma.convertArray(c, this.ValueBufferType); this.setInterpolation(d || this.DefaultInterpolation); this.validate(); this.optimize() } function bc(a, b, c, d) { ub.call(this, a, b, c, d) } function qd(a, b, c, d) { qa.call(this, a, b, c, d) } function Nc(a, b, c, d) { ub.call(this, a, b, c, d) } function cc(a, b, c, d) { ub.call(this, a, b, c, d) } function rd(a, b, c, d) { ub.call(this, a, b, c, d) } function sd(a, b, c) { ub.call(this, a, b, c) } function td(a, b, c, d) { ub.call(this, a, b, c, d) } function vb(a, b, c, d) { ub.apply(this, arguments) } function Ha(a, b, c) { this.name = a; this.tracks = c; this.duration = void 0 !== b ? b : -1; this.uuid = T.generateUUID(); 0 > this.duration && this.resetDuration(); this.optimize() } function ud(a) { this.manager = void 0 !== a ? a : Ga; this.textures = {} } function Id(a) { this.manager = void 0 !== a ? a : Ga } function wb() { this.onLoadStart = function() {} ; this.onLoadProgress = function() {} ; this.onLoadComplete = function() {} } function Jd(a) { "boolean" === typeof a && (console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."), a = void 0); this.manager = void 0 !== a ? a : Ga; this.withCredentials = !1 } function xe(a) { this.manager = void 0 !== a ? a : Ga; this.texturePath = "" } function ia() {} function Sa(a, b) { this.v1 = a; this.v2 = b } function Oc() { this.curves = []; this.autoClose = !1 } function Va(a, b, c, d, e, f, g, h) { this.aX = a; this.aY = b; this.xRadius = c; this.yRadius = d; this.aStartAngle = e; this.aEndAngle = f; this.aClockwise = g; this.aRotation = h || 0 } function xb(a) { this.points = void 0 === a ? [] : a } function yb(a, b, c, d) { this.v0 = a; this.v1 = b; this.v2 = c; this.v3 = d } function zb(a, b, c) { this.v0 = a; this.v1 = b; this.v2 = c } function Ab() { Pc.apply(this, arguments); this.holes = [] } function Pc(a) { Oc.call(this); this.currentPoint = new B; a && this.fromPoints(a) } function Kd() { this.subPaths = []; this.currentPath = null } function Ld(a) { this.data = a } function ye(a) { this.manager = void 0 !== a ? a : Ga } function Md() { void 0 === Nd && (Nd = new (window.AudioContext || window.webkitAudioContext)); return Nd } function Od(a) { this.manager = void 0 !== a ? a : Ga } function ze() { this.type = "StereoCamera"; this.aspect = 1; this.eyeSep = .064; this.cameraL = new Ea; this.cameraL.layers.enable(1); this.cameraL.matrixAutoUpdate = !1; this.cameraR = new Ea; this.cameraR.layers.enable(2); this.cameraR.matrixAutoUpdate = !1 } function vd(a, b, c) { z.call(this); this.type = "CubeCamera"; var d = new Ea(90,1,a,b); d.up.set(0, -1, 0); d.lookAt(new q(1,0,0)); this.add(d); var e = new Ea(90,1,a,b); e.up.set(0, -1, 0); e.lookAt(new q(-1,0,0)); this.add(e); var f = new Ea(90,1,a,b); f.up.set(0, 0, 1); f.lookAt(new q(0,1,0)); this.add(f); var g = new Ea(90,1,a,b); g.up.set(0, 0, -1); g.lookAt(new q(0,-1,0)); this.add(g); var h = new Ea(90,1,a,b); h.up.set(0, -1, 0); h.lookAt(new q(0,0,1)); this.add(h); var k = new Ea(90,1,a,b); k.up.set(0, -1, 0); k.lookAt(new q(0,0,-1)); this.add(k); this.renderTarget = new Eb(c,c,{ format: 1022, magFilter: 1006, minFilter: 1006 }); this.updateCubeMap = function(a, b) { null === this.parent && this.updateMatrixWorld(); var c = this.renderTarget , p = c.texture.generateMipmaps; c.texture.generateMipmaps = !1; c.activeCubeFace = 0; a.render(b, d, c); c.activeCubeFace = 1; a.render(b, e, c); c.activeCubeFace = 2; a.render(b, f, c); c.activeCubeFace = 3; a.render(b, g, c); c.activeCubeFace = 4; a.render(b, h, c); c.texture.generateMipmaps = p; c.activeCubeFace = 5; a.render(b, k, c); a.setRenderTarget(null) } } function Pd() { z.call(this); this.type = "AudioListener"; this.context = Md(); this.gain = this.context.createGain(); this.gain.connect(this.context.destination); this.filter = null } function dc(a) { z.call(this); this.type = "Audio"; this.context = a.context; this.source = this.context.createBufferSource(); this.source.onended = this.onEnded.bind(this); this.gain = this.context.createGain(); this.gain.connect(a.getInput()); this.autoplay = !1; this.startTime = 0; this.playbackRate = 1; this.isPlaying = !1; this.hasPlaybackControl = !0; this.sourceType = "empty"; this.filters = [] } function Qd(a) { dc.call(this, a); this.panner = this.context.createPanner(); this.panner.connect(this.gain) } function Rd(a, b) { this.analyser = a.context.createAnalyser(); this.analyser.fftSize = void 0 !== b ? b : 2048; this.data = new Uint8Array(this.analyser.frequencyBinCount); a.getOutput().connect(this.analyser) } function wd(a, b, c) { this.binding = a; this.valueSize = c; a = Float64Array; switch (b) { case "quaternion": b = this._slerp; break; case "string": case "bool": a = Array; b = this._select; break; default: b = this._lerp } this.buffer = new a(4 * c); this._mixBufferRegion = b; this.referenceCount = this.useCount = this.cumulativeWeight = 0 } function fa(a, b, c) { this.path = b; this.parsedPath = c || fa.parseTrackName(b); this.node = fa.findNode(a, this.parsedPath.nodeName) || a; this.rootNode = a } function Sd(a) { this.uuid = T.generateUUID(); this._objects = Array.prototype.slice.call(arguments); this.nCachedObjects_ = 0; var b = {}; this._indicesByUUID = b; for (var c = 0, d = arguments.length; c !== d; ++c) b[arguments[c].uuid] = c; this._paths = []; this._parsedPaths = []; this._bindings = []; this._bindingsIndicesByPath = {}; var e = this; this.stats = { objects: { get total() { return e._objects.length }, get inUse() { return this.total - e.nCachedObjects_ } }, get bindingsPerObject() { return e._bindings.length } } } function Td(a, b, c) { this._mixer = a; this._clip = b; this._localRoot = c || null; a = b.tracks; b = a.length; c = Array(b); for (var d = { endingStart: 2400, endingEnd: 2400 }, e = 0; e !== b; ++e) { var f = a[e].createInterpolant(null); c[e] = f; f.settings = d } this._interpolantSettings = d; this._interpolants = c; this._propertyBindings = Array(b); this._weightInterpolant = this._timeScaleInterpolant = this._byClipCacheIndex = this._cacheIndex = null; this.loop = 2201; this._loopCount = -1; this._startTime = null; this.time = 0; this._effectiveWeight = this.weight = this._effectiveTimeScale = this.timeScale = 1; this.repetitions = Infinity; this.paused = !1; this.enabled = !0; this.clampWhenFinished = !1; this.zeroSlopeAtEnd = this.zeroSlopeAtStart = !0 } function Ud(a) { this._root = a; this._initMemoryManager(); this.time = this._accuIndex = 0; this.timeScale = 1 } function Ae(a, b) { "string" === typeof a && (console.warn("THREE.Uniform: Type parameter is no longer needed."), a = b); this.value = a } function Bb() { G.call(this); this.type = "InstancedBufferGeometry"; this.maxInstancedCount = void 0 } function Vd(a, b, c, d) { this.uuid = T.generateUUID(); this.data = a; this.itemSize = b; this.offset = c; this.normalized = !0 === d } function ec(a, b) { this.uuid = T.generateUUID(); this.array = a; this.stride = b; this.count = void 0 !== a ? a.length / b : 0; this.dynamic = !1; this.updateRange = { offset: 0, count: -1 }; this.version = 0 } function fc(a, b, c) { ec.call(this, a, b); this.meshPerAttribute = c || 1 } function gc(a, b, c) { C.call(this, a, b); this.meshPerAttribute = c || 1 } function Wd(a, b, c, d) { this.ray = new ab(a,b); this.near = c || 0; this.far = d || Infinity; this.params = { Mesh: {}, Line: {}, LOD: {}, Points: { threshold: 1 }, Sprite: {} }; Object.defineProperties(this.params, { PointCloud: { get: function() { console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points."); return this.Points } } }) } function Be(a, b) { return a.distance - b.distance } function Xd(a, b, c, d) { if (!1 !== a.visible && (a.raycast(b, c), !0 === d)) { a = a.children; d = 0; for (var e = a.length; d < e; d++) Xd(a[d], b, c, !0) } } function Yd(a) { this.autoStart = void 0 !== a ? a : !0; this.elapsedTime = this.oldTime = this.startTime = 0; this.running = !1 } function Zd(a, b, c) { this.radius = void 0 !== a ? a : 1; this.phi = void 0 !== b ? b : 0; this.theta = void 0 !== c ? c : 0; return this } function na(a, b) { ya.call(this, a, b); this.animationsMap = {}; this.animationsList = []; var c = this.geometry.morphTargets.length; this.createAnimation("__default", 0, c - 1, c / 1); this.setAnimationWeight("__default", 1) } function Qc(a) { z.call(this); this.material = a; this.render = function(a) {} } function Rc(a, b, c, d) { this.object = a; this.size = void 0 !== b ? b : 1; a = void 0 !== c ? c : 16711680; d = void 0 !== d ? d : 1; b = 0; (c = this.object.geometry) && c.isGeometry ? b = 3 * c.faces.length : c && c.isBufferGeometry && (b = c.attributes.normal.count); c = new G; b = new ha(6 * b,3); c.addAttribute("position", b); la.call(this, c, new oa({ color: a, linewidth: d })); this.matrixAutoUpdate = !1; this.update() } function hc(a) { z.call(this); this.light = a; this.light.updateMatrixWorld(); this.matrix = a.matrixWorld; this.matrixAutoUpdate = !1; a = new G; for (var b = [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, -1, 1], c = 0, d = 1; 32 > c; c++, d++) { var e = c / 32 * Math.PI * 2 , f = d / 32 * Math.PI * 2; b.push(Math.cos(e), Math.sin(e), 1, Math.cos(f), Math.sin(f), 1) } a.addAttribute("position", new ha(b,3)); b = new oa({ fog: !1 }); this.cone = new la(a,b); this.add(this.cone); this.update() } function ic(a) { this.bones = this.getBoneList(a); for (var b = new Q, c = 0; c < this.bones.length; c++) { var d = this.bones[c]; d.parent && d.parent.isBone && (b.vertices.push(new q), b.vertices.push(new q), b.colors.push(new O(0,0,1)), b.colors.push(new O(0,1,0))) } b.dynamic = !0; c = new oa({ vertexColors: 2, depthTest: !1, depthWrite: !1, transparent: !0 }); la.call(this, b, c); this.root = a; this.matrix = a.matrixWorld; this.matrixAutoUpdate = !1; this.update() } function jc(a, b) { this.light = a; this.light.updateMatrixWorld(); var c = new mb(b,4,2) , d = new Ma({ wireframe: !0, fog: !1 }); d.color.copy(this.light.color).multiplyScalar(this.light.intensity); ya.call(this, c, d); this.matrix = this.light.matrixWorld; this.matrixAutoUpdate = !1 } function kc(a, b) { z.call(this); this.light = a; this.light.updateMatrixWorld(); this.matrix = a.matrixWorld; this.matrixAutoUpdate = !1; this.colors = [new O, new O]; var c = new Vb(b,4,2); c.rotateX(-Math.PI / 2); for (var d = 0; 8 > d; d++) c.faces[d].color = this.colors[4 > d ? 0 : 1]; d = new Ma({ vertexColors: 1, wireframe: !0 }); this.lightSphere = new ya(c,d); this.add(this.lightSphere); this.update() } function Sc(a, b, c, d) { b = b || 1; c = new O(void 0 !== c ? c : 4473924); d = new O(void 0 !== d ? d : 8947848); for (var e = b / 2, f = 2 * a / b, g = [], h = [], k = 0, m = 0, l = -a; k <= b; k++, l += f) { g.push(-a, 0, l, a, 0, l); g.push(l, 0, -a, l, 0, a); var n = k === e ? c : d; n.toArray(h, m); m += 3; n.toArray(h, m); m += 3; n.toArray(h, m); m += 3; n.toArray(h, m); m += 3 } a = new G; a.addAttribute("position", new ha(g,3)); a.addAttribute("color", new ha(h,3)); g = new oa({ vertexColors: 2 }); la.call(this, a, g) } function Tc(a, b, c, d) { this.object = a; this.size = void 0 !== b ? b : 1; a = void 0 !== c ? c : 16776960; d = void 0 !== d ? d : 1; b = 0; (c = this.object.geometry) && c.isGeometry ? b = c.faces.length : console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead."); c = new G; b = new ha(6 * b,3); c.addAttribute("position", b); la.call(this, c, new oa({ color: a, linewidth: d })); this.matrixAutoUpdate = !1; this.update() } function lc(a, b) { z.call(this); this.light = a; this.light.updateMatrixWorld(); this.matrix = a.matrixWorld; this.matrixAutoUpdate = !1; void 0 === b && (b = 1); var c = new G; c.addAttribute("position", new ha([-b, b, 0, b, b, 0, b, -b, 0, -b, -b, 0, -b, b, 0],3)); var d = new oa({ fog: !1 }); this.add(new Ta(c,d)); c = new G; c.addAttribute("position", new ha([0, 0, 0, 0, 0, 1],3)); this.add(new Ta(c,d)); this.update() } function Uc(a) { function b(a, b, d) { c(a, d); c(b, d) } function c(a, b) { d.vertices.push(new q); d.colors.push(new O(b)); void 0 === f[a] && (f[a] = []); f[a].push(d.vertices.length - 1) } var d = new Q , e = new oa({ color: 16777215, vertexColors: 1 }) , f = {}; b("n1", "n2", 16755200); b("n2", "n4", 16755200); b("n4", "n3", 16755200); b("n3", "n1", 16755200); b("f1", "f2", 16755200); b("f2", "f4", 16755200); b("f4", "f3", 16755200); b("f3", "f1", 16755200); b("n1", "f1", 16755200); b("n2", "f2", 16755200); b("n3", "f3", 16755200); b("n4", "f4", 16755200); b("p", "n1", 16711680); b("p", "n2", 16711680); b("p", "n3", 16711680); b("p", "n4", 16711680); b("u1", "u2", 43775); b("u2", "u3", 43775); b("u3", "u1", 43775); b("c", "t", 16777215); b("p", "c", 3355443); b("cn1", "cn2", 3355443); b("cn3", "cn4", 3355443); b("cf1", "cf2", 3355443); b("cf3", "cf4", 3355443); la.call(this, d, e); this.camera = a; this.camera.updateProjectionMatrix && this.camera.updateProjectionMatrix(); this.matrix = a.matrixWorld; this.matrixAutoUpdate = !1; this.pointMap = f; this.update() } function Vc(a, b) { var c = void 0 !== b ? b : 8947848; this.object = a; this.box = new Ba; ya.call(this, new ob(1,1,1), new Ma({ color: c, wireframe: !0 })) } function Wc(a, b) { void 0 === b && (b = 16776960); var c = new Uint16Array([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7]) , d = new Float32Array(24) , e = new G; e.setIndex(new C(c,1)); e.addAttribute("position", new C(d,3)); la.call(this, e, new oa({ color: b })); void 0 !== a && this.update(a) } function Cb(a, b, c, d, e, f) { z.call(this); void 0 === d && (d = 16776960); void 0 === c && (c = 1); void 0 === e && (e = .2 * c); void 0 === f && (f = .2 * e); this.position.copy(b); this.line = new Ta(Ce,new oa({ color: d })); this.line.matrixAutoUpdate = !1; this.add(this.line); this.cone = new ya(De,new Ma({ color: d })); this.cone.matrixAutoUpdate = !1; this.add(this.cone); this.setDirection(a); this.setLength(c, e, f) } function xd(a) { a = a || 1; var b = new Float32Array([0, 0, 0, a, 0, 0, 0, 0, 0, 0, a, 0, 0, 0, 0, 0, 0, a]) , c = new Float32Array([1, 0, 0, 1, .6, 0, 0, 1, 0, .6, 1, 0, 0, 0, 1, 0, .6, 1]); a = new G; a.addAttribute("position", new C(b,3)); a.addAttribute("color", new C(c,3)); b = new oa({ vertexColors: 2 }); la.call(this, a, b) } function Ee(a) { console.warn("THREE.ClosedSplineCurve3 has been deprecated. Please use THREE.CatmullRomCurve3."); $d.call(this, a); this.type = "catmullrom"; this.closed = !0 } function yd(a, b, c, d, e, f) { Va.call(this, a, b, c, c, d, e, f) } void 0 === Number.EPSILON && (Number.EPSILON = Math.pow(2, -52)); void 0 === Math.sign && (Math.sign = function(a) { return 0 > a ? -1 : 0 < a ? 1 : +a } ); void 0 === Function.prototype.name && Object.defineProperty(Function.prototype, "name", { get: function() { return this.toString().match(/^\s*function\s*(\S*)\s*\(/)[1] } }); void 0 === Object.assign && function() { Object.assign = function(a) { if (void 0 === a || null === a) throw new TypeError("Cannot convert undefined or null to object"); for (var b = Object(a), c = 1; c < arguments.length; c++) { var d = arguments[c]; if (void 0 !== d && null !== d) for (var e in d) Object.prototype.hasOwnProperty.call(d, e) && (b[e] = d[e]) } return b } }(); Object.assign(sa.prototype, { addEventListener: function(a, b) { void 0 === this._listeners && (this._listeners = {}); var c = this._listeners; void 0 === c[a] && (c[a] = []); -1 === c[a].indexOf(b) && c[a].push(b) }, hasEventListener: function(a, b) { if (void 0 === this._listeners) return !1; var c = this._listeners; return void 0 !== c[a] && -1 !== c[a].indexOf(b) ? !0 : !1 }, removeEventListener: function(a, b) { if (void 0 !== this._listeners) { var c = this._listeners[a]; if (void 0 !== c) { var d = c.indexOf(b); -1 !== d && c.splice(d, 1) } } }, dispatchEvent: function(a) { if (void 0 !== this._listeners) { var b = this._listeners[a.type]; if (void 0 !== b) { a.target = this; var c = [], d, e = b.length; for (d = 0; d < e; d++) c[d] = b[d]; for (d = 0; d < e; d++) c[d].call(this, a) } } } }); var Fe = { NoBlending: 0, NormalBlending: 1, AdditiveBlending: 2, SubtractiveBlending: 3, MultiplyBlending: 4, CustomBlending: 5 } , Ge = { UVMapping: 300, CubeReflectionMapping: 301, CubeRefractionMapping: 302, EquirectangularReflectionMapping: 303, EquirectangularRefractionMapping: 304, SphericalReflectionMapping: 305, CubeUVReflectionMapping: 306, CubeUVRefractionMapping: 307 } , ae = { RepeatWrapping: 1E3, ClampToEdgeWrapping: 1001, MirroredRepeatWrapping: 1002 } , be = { NearestFilter: 1003, NearestMipMapNearestFilter: 1004, NearestMipMapLinearFilter: 1005, LinearFilter: 1006, LinearMipMapNearestFilter: 1007, LinearMipMapLinearFilter: 1008 } , T = { DEG2RAD: Math.PI / 180, RAD2DEG: 180 / Math.PI, generateUUID: function() { var a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""), b = Array(36), c = 0, d; return function() { for (var e = 0; 36 > e; e++) 8 === e || 13 === e || 18 === e || 23 === e ? b[e] = "-" : 14 === e ? b[e] = "4" : (2 >= c && (c = 33554432 + 16777216 * Math.random() | 0), d = c & 15, c >>= 4, b[e] = a[19 === e ? d & 3 | 8 : d]); return b.join("") } }(), clamp: function(a, b, c) { return Math.max(b, Math.min(c, a)) }, euclideanModulo: function(a, b) { return (a % b + b) % b }, mapLinear: function(a, b, c, d, e) { return d + (a - b) * (e - d) / (c - b) }, lerp: function(a, b, c) { return (1 - c) * a + c * b }, smoothstep: function(a, b, c) { if (a <= b) return 0; if (a >= c) return 1; a = (a - b) / (c - b); return a * a * (3 - 2 * a) }, smootherstep: function(a, b, c) { if (a <= b) return 0; if (a >= c) return 1; a = (a - b) / (c - b); return a * a * a * (a * (6 * a - 15) + 10) }, random16: function() { console.warn("THREE.Math.random16() has been deprecated. Use Math.random() instead."); return Math.random() }, randInt: function(a, b) { return a + Math.floor(Math.random() * (b - a + 1)) }, randFloat: function(a, b) { return a + Math.random() * (b - a) }, randFloatSpread: function(a) { return a * (.5 - Math.random()) }, degToRad: function(a) { return a * T.DEG2RAD }, radToDeg: function(a) { return a * T.RAD2DEG }, isPowerOfTwo: function(a) { return 0 === (a & a - 1) && 0 !== a }, nearestPowerOfTwo: function(a) { return Math.pow(2, Math.round(Math.log(a) / Math.LN2)) }, nextPowerOfTwo: function(a) { a--; a |= a >> 1; a |= a >> 2; a |= a >> 4; a |= a >> 8; a |= a >> 16; a++; return a } }; B.prototype = { constructor: B, isVector2: !0, get width() { return this.x }, set width(a) { this.x = a }, get height() { return this.y }, set height(a) { this.y = a }, set: function(a, b) { this.x = a; this.y = b; return this }, setScalar: function(a) { this.y = this.x = a; return this }, setX: function(a) { this.x = a; return this }, setY: function(a) { this.y = a; return this }, setComponent: function(a, b) { switch (a) { case 0: this.x = b; break; case 1: this.y = b; break; default: throw Error("index is out of range: " + a); } return this }, getComponent: function(a) { switch (a) { case 0: return this.x; case 1: return this.y; default: throw Error("index is out of range: " + a); } }, clone: function() { return new this.constructor(this.x,this.y) }, copy: function(a) { this.x = a.x; this.y = a.y; return this }, add: function(a, b) { if (void 0 !== b) return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."), this.addVectors(a, b); this.x += a.x; this.y += a.y; return this }, addScalar: function(a) { this.x += a; this.y += a; return this }, addVectors: function(a, b) { this.x = a.x + b.x; this.y = a.y + b.y; return this }, addScaledVector: function(a, b) { this.x += a.x * b; this.y += a.y * b; return this }, sub: function(a, b) { if (void 0 !== b) return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), this.subVectors(a, b); this.x -= a.x; this.y -= a.y; return this }, subScalar: function(a) { this.x -= a; this.y -= a; return this }, subVectors: function(a, b) { this.x = a.x - b.x; this.y = a.y - b.y; return this }, multiply: function(a) { this.x *= a.x; this.y *= a.y; return this }, multiplyScalar: function(a) { isFinite(a) ? (this.x *= a, this.y *= a) : this.y = this.x = 0; return this }, divide: function(a) { this.x /= a.x; this.y /= a.y; return this }, divideScalar: function(a) { return this.multiplyScalar(1 / a) }, min: function(a) { this.x = Math.min(this.x, a.x); this.y = Math.min(this.y, a.y); return this }, max: function(a) { this.x = Math.max(this.x, a.x); this.y = Math.max(this.y, a.y); return this }, clamp: function(a, b) { this.x = Math.max(a.x, Math.min(b.x, this.x)); this.y = Math.max(a.y, Math.min(b.y, this.y)); return this }, clampScalar: function() { var a, b; return function(c, d) { void 0 === a && (a = new B, b = new B); a.set(c, c); b.set(d, d); return this.clamp(a, b) } }(), clampLength: function(a, b) { var c = this.length(); return this.multiplyScalar(Math.max(a, Math.min(b, c)) / c) }, floor: function() { this.x = Math.floor(this.x); this.y = Math.floor(this.y); return this }, ceil: function() { this.x = Math.ceil(this.x); this.y = Math.ceil(this.y); return this }, round: function() { this.x = Math.round(this.x); this.y = Math.round(this.y); return this }, roundToZero: function() { this.x = 0 > this.x ? Math.ceil(this.x) : Math.floor(this.x); this.y = 0 > this.y ? Math.ceil(this.y) : Math.floor(this.y); return this }, negate: function() { this.x = -this.x; this.y = -this.y; return this }, dot: function(a) { return this.x * a.x + this.y * a.y }, lengthSq: function() { return this.x * this.x + this.y * this.y }, length: function() { return Math.sqrt(this.x * this.x + this.y * this.y) }, lengthManhattan: function() { return Math.abs(this.x) + Math.abs(this.y) }, normalize: function() { return this.divideScalar(this.length()) }, angle: function() { var a = Math.atan2(this.y, this.x); 0 > a && (a += 2 * Math.PI); return a }, distanceTo: function(a) { return Math.sqrt(this.distanceToSquared(a)) }, distanceToSquared: function(a) { var b = this.x - a.x; a = this.y - a.y; return b * b + a * a }, distanceToManhattan: function(a) { return Math.abs(this.x - a.x) + Math.abs(this.y - a.y) }, setLength: function(a) { return this.multiplyScalar(a / this.length()) }, lerp: function(a, b) { this.x += (a.x - this.x) * b; this.y += (a.y - this.y) * b; return this }, lerpVectors: function(a, b, c) { return this.subVectors(b, a).multiplyScalar(c).add(a) }, equals: function(a) { return a.x === this.x && a.y === this.y }, fromArray: function(a, b) { void 0 === b && (b = 0); this.x = a[b]; this.y = a[b + 1]; return this }, toArray: function(a, b) { void 0 === a && (a = []); void 0 === b && (b = 0); a[b] = this.x; a[b + 1] = this.y; return a }, fromAttribute: function(a, b, c) { void 0 === c && (c = 0); b = b * a.itemSize + c; this.x = a.array[b]; this.y = a.array[b + 1]; return this }, rotateAround: function(a, b) { var c = Math.cos(b) , d = Math.sin(b) , e = this.x - a.x , f = this.y - a.y; this.x = e * c - f * d + a.x; this.y = e * d + f * c + a.y; return this } }; da.DEFAULT_IMAGE = void 0; da.DEFAULT_MAPPING = 300; da.prototype = { constructor: da, isTexture: !0, set needsUpdate(a) { !0 === a && this.version++ }, clone: function() { return (new this.constructor).copy(this) }, copy: function(a) { this.image = a.image; this.mipmaps = a.mipmaps.slice(0); this.mapping = a.mapping; this.wrapS = a.wrapS; this.wrapT = a.wrapT; this.magFilter = a.magFilter; this.minFilter = a.minFilter; this.anisotropy = a.anisotropy; this.format = a.format; this.type = a.type; this.offset.copy(a.offset); this.repeat.copy(a.repeat); this.generateMipmaps = a.generateMipmaps; this.premultiplyAlpha = a.premultiplyAlpha; this.flipY = a.flipY; this.unpackAlignment = a.unpackAlignment; this.encoding = a.encoding; return this }, toJSON: function(a) { if (void 0 !== a.textures[this.uuid]) return a.textures[this.uuid]; var b = { metadata: { version: 4.4, type: "Texture", generator: "Texture.toJSON" }, uuid: this.uuid, name: this.name, mapping: this.mapping, repeat: [this.repeat.x, this.repeat.y], offset: [this.offset.x, this.offset.y], wrap: [this.wrapS, this.wrapT], minFilter: this.minFilter, magFilter: this.magFilter, anisotropy: this.anisotropy, flipY: this.flipY }; if (void 0 !== this.image) { var c = this.image; void 0 === c.uuid && (c.uuid = T.generateUUID()); if (void 0 === a.images[c.uuid]) { var d = a.images, e = c.uuid, f = c.uuid, g; void 0 !== c.toDataURL ? g = c : (g = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas"), g.width = c.width, g.height = c.height, g.getContext("2d").drawImage(c, 0, 0, c.width, c.height)); g = 2048 < g.width || 2048 < g.height ? g.toDataURL("image/jpeg", .6) : g.toDataURL("image/png"); d[e] = { uuid: f, url: g } } b.image = c.uuid } return a.textures[this.uuid] = b }, dispose: function() { this.dispatchEvent({ type: "dispose" }) }, transformUv: function(a) { if (300 === this.mapping) { a.multiply(this.repeat); a.add(this.offset); if (0 > a.x || 1 < a.x) switch (this.wrapS) { case 1E3: a.x -= Math.floor(a.x); break; case 1001: a.x = 0 > a.x ? 0 : 1; break; case 1002: a.x = 1 === Math.abs(Math.floor(a.x) % 2) ? Math.ceil(a.x) - a.x : a.x - Math.floor(a.x) } if (0 > a.y || 1 < a.y) switch (this.wrapT) { case 1E3: a.y -= Math.floor(a.y); break; case 1001: a.y = 0 > a.y ? 0 : 1; break; case 1002: a.y = 1 === Math.abs(Math.floor(a.y) % 2) ? Math.ceil(a.y) - a.y : a.y - Math.floor(a.y) } this.flipY && (a.y = 1 - a.y) } } }; Object.assign(da.prototype, sa.prototype); var ee = 0; ga.prototype = { constructor: ga, isVector4: !0, set: function(a, b, c, d) { this.x = a; this.y = b; this.z = c; this.w = d; return this }, setScalar: function(a) { this.w = this.z = this.y = this.x = a; return this }, setX: function(a) { this.x = a; return this }, setY: function(a) { this.y = a; return this }, setZ: function(a) { this.z = a; return this }, setW: function(a) { this.w = a; return this }, setComponent: function(a, b) { switch (a) { case 0: this.x = b; break; case 1: this.y = b; break; case 2: this.z = b; break; case 3: this.w = b; break; default: throw Error("index is out of range: " + a); } return this }, getComponent: function(a) { switch (a) { case 0: return this.x; case 1: return this.y; case 2: return this.z; case 3: return this.w; default: throw Error("index is out of range: " + a); } }, clone: function() { return new this.constructor(this.x,this.y,this.z,this.w) }, copy: function(a) { this.x = a.x; this.y = a.y; this.z = a.z; this.w = void 0 !== a.w ? a.w : 1; return this }, add: function(a, b) { if (void 0 !== b) return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."), this.addVectors(a, b); this.x += a.x; this.y += a.y; this.z += a.z; this.w += a.w; return this }, addScalar: function(a) { this.x += a; this.y += a; this.z += a; this.w += a; return this }, addVectors: function(a, b) { this.x = a.x + b.x; this.y = a.y + b.y; this.z = a.z + b.z; this.w = a.w + b.w; return this }, addScaledVector: function(a, b) { this.x += a.x * b; this.y += a.y * b; this.z += a.z * b; this.w += a.w * b; return this }, sub: function(a, b) { if (void 0 !== b) return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), this.subVectors(a, b); this.x -= a.x; this.y -= a.y; this.z -= a.z; this.w -= a.w; return this }, subScalar: function(a) { this.x -= a; this.y -= a; this.z -= a; this.w -= a; return this }, subVectors: function(a, b) { this.x = a.x - b.x; this.y = a.y - b.y; this.z = a.z - b.z; this.w = a.w - b.w; return this }, multiplyScalar: function(a) { isFinite(a) ? (this.x *= a, this.y *= a, this.z *= a, this.w *= a) : this.w = this.z = this.y = this.x = 0; return this }, applyMatrix4: function(a) { var b = this.x , c = this.y , d = this.z , e = this.w; a = a.elements; this.x = a[0] * b + a[4] * c + a[8] * d + a[12] * e; this.y = a[1] * b + a[5] * c + a[9] * d + a[13] * e; this.z = a[2] * b + a[6] * c + a[10] * d + a[14] * e; this.w = a[3] * b + a[7] * c + a[11] * d + a[15] * e; return this }, divideScalar: function(a) { return this.multiplyScalar(1 / a) }, setAxisAngleFromQuaternion: function(a) { this.w = 2 * Math.acos(a.w); var b = Math.sqrt(1 - a.w * a.w); 1E-4 > b ? (this.x = 1, this.z = this.y = 0) : (this.x = a.x / b, this.y = a.y / b, this.z = a.z / b); return this }, setAxisAngleFromRotationMatrix: function(a) { var b, c, d; a = a.elements; var e = a[0]; d = a[4]; var f = a[8] , g = a[1] , h = a[5] , k = a[9]; c = a[2]; b = a[6]; var m = a[10]; if (.01 > Math.abs(d - g) && .01 > Math.abs(f - c) && .01 > Math.abs(k - b)) { if (.1 > Math.abs(d + g) && .1 > Math.abs(f + c) && .1 > Math.abs(k + b) && .1 > Math.abs(e + h + m - 3)) return this.set(1, 0, 0, 0), this; a = Math.PI; e = (e + 1) / 2; h = (h + 1) / 2; m = (m + 1) / 2; d = (d + g) / 4; f = (f + c) / 4; k = (k + b) / 4; e > h && e > m ? .01 > e ? (b = 0, d = c = .707106781) : (b = Math.sqrt(e), c = d / b, d = f / b) : h > m ? .01 > h ? (b = .707106781, c = 0, d = .707106781) : (c = Math.sqrt(h), b = d / c, d = k / c) : .01 > m ? (c = b = .707106781, d = 0) : (d = Math.sqrt(m), b = f / d, c = k / d); this.set(b, c, d, a); return this } a = Math.sqrt((b - k) * (b - k) + (f - c) * (f - c) + (g - d) * (g - d)); .001 > Math.abs(a) && (a = 1); this.x = (b - k) / a; this.y = (f - c) / a; this.z = (g - d) / a; this.w = Math.acos((e + h + m - 1) / 2); return this }, min: function(a) { this.x = Math.min(this.x, a.x); this.y = Math.min(this.y, a.y); this.z = Math.min(this.z, a.z); this.w = Math.min(this.w, a.w); return this }, max: function(a) { this.x = Math.max(this.x, a.x); this.y = Math.max(this.y, a.y); this.z = Math.max(this.z, a.z); this.w = Math.max(this.w, a.w); return this }, clamp: function(a, b) { this.x = Math.max(a.x, Math.min(b.x, this.x)); this.y = Math.max(a.y, Math.min(b.y, this.y)); this.z = Math.max(a.z, Math.min(b.z, this.z)); this.w = Math.max(a.w, Math.min(b.w, this.w)); return this }, clampScalar: function() { var a, b; return function(c, d) { void 0 === a && (a = new ga, b = new ga); a.set(c, c, c, c); b.set(d, d, d, d); return this.clamp(a, b) } }(), floor: function() { this.x = Math.floor(this.x); this.y = Math.floor(this.y); this.z = Math.floor(this.z); this.w = Math.floor(this.w); return this }, ceil: function() { this.x = Math.ceil(this.x); this.y = Math.ceil(this.y); this.z = Math.ceil(this.z); this.w = Math.ceil(this.w); return this }, round: function() { this.x = Math.round(this.x); this.y = Math.round(this.y); this.z = Math.round(this.z); this.w = Math.round(this.w); return this }, roundToZero: function() { this.x = 0 > this.x ? Math.ceil(this.x) : Math.floor(this.x); this.y = 0 > this.y ? Math.ceil(this.y) : Math.floor(this.y); this.z = 0 > this.z ? Math.ceil(this.z) : Math.floor(this.z); this.w = 0 > this.w ? Math.ceil(this.w) : Math.floor(this.w); return this }, negate: function() { this.x = -this.x; this.y = -this.y; this.z = -this.z; this.w = -this.w; return this }, dot: function(a) { return this.x * a.x + this.y * a.y + this.z * a.z + this.w * a.w }, lengthSq: function() { return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w }, length: function() { return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w) }, lengthManhattan: function() { return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w) }, normalize: function() { return this.divideScalar(this.length()) }, setLength: function(a) { return this.multiplyScalar(a / this.length()) }, lerp: function(a, b) { this.x += (a.x - this.x) * b; this.y += (a.y - this.y) * b; this.z += (a.z - this.z) * b; this.w += (a.w - this.w) * b; return this }, lerpVectors: function(a, b, c) { return this.subVectors(b, a).multiplyScalar(c).add(a) }, equals: function(a) { return a.x === this.x && a.y === this.y && a.z === this.z && a.w === this.w }, fromArray: function(a, b) { void 0 === b && (b = 0); this.x = a[b]; this.y = a[b + 1]; this.z = a[b + 2]; this.w = a[b + 3]; return this }, toArray: function(a, b) { void 0 === a && (a = []); void 0 === b && (b = 0); a[b] = this.x; a[b + 1] = this.y; a[b + 2] = this.z; a[b + 3] = this.w; return a }, fromAttribute: function(a, b, c) { void 0 === c && (c = 0); b = b * a.itemSize + c; this.x = a.array[b]; this.y = a.array[b + 1]; this.z = a.array[b + 2]; this.w = a.array[b + 3]; return this } }; Object.assign(Db.prototype, sa.prototype, { isWebGLRenderTarget: !0, setSize: function(a, b) { if (this.width !== a || this.height !== b) this.width = a, this.height = b, this.dispose(); this.viewport.set(0, 0, a, b); this.scissor.set(0, 0, a, b) }, clone: function() { return (new this.constructor).copy(this) }, copy: function(a) { this.width = a.width; this.height = a.height; this.viewport.copy(a.viewport); this.texture = a.texture.clone(); this.depthBuffer = a.depthBuffer; this.stencilBuffer = a.stencilBuffer; this.depthTexture = a.depthTexture; return this }, dispose: function() { this.dispatchEvent({ type: "dispose" }) } }); Eb.prototype = Object.create(Db.prototype); Eb.prototype.constructor = Eb; Eb.prototype.isWebGLRenderTargetCube = !0; ba.prototype = { constructor: ba, get x() { return this._x }, set x(a) { this._x = a; this.onChangeCallback() }, get y() { return this._y }, set y(a) { this._y = a; this.onChangeCallback() }, get z() { return this._z }, set z(a) { this._z = a; this.onChangeCallback() }, get w() { return this._w }, set w(a) { this._w = a; this.onChangeCallback() }, set: function(a, b, c, d) { this._x = a; this._y = b; this._z = c; this._w = d; this.onChangeCallback(); return this }, clone: function() { return new this.constructor(this._x,this._y,this._z,this._w) }, copy: function(a) { this._x = a.x; this._y = a.y; this._z = a.z; this._w = a.w; this.onChangeCallback(); return this }, setFromEuler: function(a, b) { if (!1 === (a && a.isEuler)) throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order."); var c = Math.cos(a._x / 2) , d = Math.cos(a._y / 2) , e = Math.cos(a._z / 2) , f = Math.sin(a._x / 2) , g = Math.sin(a._y / 2) , h = Math.sin(a._z / 2) , k = a.order; "XYZ" === k ? (this._x = f * d * e + c * g * h, this._y = c * g * e - f * d * h, this._z = c * d * h + f * g * e, this._w = c * d * e - f * g * h) : "YXZ" === k ? (this._x = f * d * e + c * g * h, this._y = c * g * e - f * d * h, this._z = c * d * h - f * g * e, this._w = c * d * e + f * g * h) : "ZXY" === k ? (this._x = f * d * e - c * g * h, this._y = c * g * e + f * d * h, this._z = c * d * h + f * g * e, this._w = c * d * e - f * g * h) : "ZYX" === k ? (this._x = f * d * e - c * g * h, this._y = c * g * e + f * d * h, this._z = c * d * h - f * g * e, this._w = c * d * e + f * g * h) : "YZX" === k ? (this._x = f * d * e + c * g * h, this._y = c * g * e + f * d * h, this._z = c * d * h - f * g * e, this._w = c * d * e - f * g * h) : "XZY" === k && (this._x = f * d * e - c * g * h, this._y = c * g * e - f * d * h, this._z = c * d * h + f * g * e, this._w = c * d * e + f * g * h); if (!1 !== b) this.onChangeCallback(); return this }, setFromAxisAngle: function(a, b) { var c = b / 2 , d = Math.sin(c); this._x = a.x * d; this._y = a.y * d; this._z = a.z * d; this._w = Math.cos(c); this.onChangeCallback(); return this }, setFromRotationMatrix: function(a) { var b = a.elements , c = b[0]; a = b[4]; var d = b[8] , e = b[1] , f = b[5] , g = b[9] , h = b[2] , k = b[6] , b = b[10] , m = c + f + b; 0 < m ? (c = .5 / Math.sqrt(m + 1), this._w = .25 / c, this._x = (k - g) * c, this._y = (d - h) * c, this._z = (e - a) * c) : c > f && c > b ? (c = 2 * Math.sqrt(1 + c - f - b), this._w = (k - g) / c, this._x = .25 * c, this._y = (a + e) / c, this._z = (d + h) / c) : f > b ? (c = 2 * Math.sqrt(1 + f - c - b), this._w = (d - h) / c, this._x = (a + e) / c, this._y = .25 * c, this._z = (g + k) / c) : (c = 2 * Math.sqrt(1 + b - c - f), this._w = (e - a) / c, this._x = (d + h) / c, this._y = (g + k) / c, this._z = .25 * c); this.onChangeCallback(); return this }, setFromUnitVectors: function() { var a, b; return function(c, d) { void 0 === a && (a = new q); b = c.dot(d) + 1; 1E-6 > b ? (b = 0, Math.abs(c.x) > Math.abs(c.z) ? a.set(-c.y, c.x, 0) : a.set(0, -c.z, c.y)) : a.crossVectors(c, d); this._x = a.x; this._y = a.y; this._z = a.z; this._w = b; return this.normalize() } }(), inverse: function() { return this.conjugate().normalize() }, conjugate: function() { this._x *= -1; this._y *= -1; this._z *= -1; this.onChangeCallback(); return this }, dot: function(a) { return this._x * a._x + this._y * a._y + this._z * a._z + this._w * a._w }, lengthSq: function() { return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w }, length: function() { return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w) }, normalize: function() { var a = this.length(); 0 === a ? (this._z = this._y = this._x = 0, this._w = 1) : (a = 1 / a, this._x *= a, this._y *= a, this._z *= a, this._w *= a); this.onChangeCallback(); return this }, multiply: function(a, b) { return void 0 !== b ? (console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."), this.multiplyQuaternions(a, b)) : this.multiplyQuaternions(this, a) }, premultiply: function(a) { return this.multiplyQuaternions(a, this) }, multiplyQuaternions: function(a, b) { var c = a._x , d = a._y , e = a._z , f = a._w , g = b._x , h = b._y , k = b._z , m = b._w; this._x = c * m + f * g + d * k - e * h; this._y = d * m + f * h + e * g - c * k; this._z = e * m + f * k + c * h - d * g; this._w = f * m - c * g - d * h - e * k; this.onChangeCallback(); return this }, slerp: function(a, b) { if (0 === b) return this; if (1 === b) return this.copy(a); var c = this._x , d = this._y , e = this._z , f = this._w , g = f * a._w + c * a._x + d * a._y + e * a._z; 0 > g ? (this._w = -a._w, this._x = -a._x, this._y = -a._y, this._z = -a._z, g = -g) : this.copy(a); if (1 <= g) return this._w = f, this._x = c, this._y = d, this._z = e, this; var h = Math.sqrt(1 - g * g); if (.001 > Math.abs(h)) return this._w = .5 * (f + this._w), this._x = .5 * (c + this._x), this._y = .5 * (d + this._y), this._z = .5 * (e + this._z), this; var k = Math.atan2(h, g) , g = Math.sin((1 - b) * k) / h , h = Math.sin(b * k) / h; this._w = f * g + this._w * h; this._x = c * g + this._x * h; this._y = d * g + this._y * h; this._z = e * g + this._z * h; this.onChangeCallback(); return this }, equals: function(a) { return a._x === this._x && a._y === this._y && a._z === this._z && a._w === this._w }, fromArray: function(a, b) { void 0 === b && (b = 0); this._x = a[b]; this._y = a[b + 1]; this._z = a[b + 2]; this._w = a[b + 3]; this.onChangeCallback(); return this }, toArray: function(a, b) { void 0 === a && (a = []); void 0 === b && (b = 0); a[b] = this._x; a[b + 1] = this._y; a[b + 2] = this._z; a[b + 3] = this._w; return a }, onChange: function(a) { this.onChangeCallback = a; return this }, onChangeCallback: function() {} }; Object.assign(ba, { slerp: function(a, b, c, d) { return c.copy(a).slerp(b, d) }, slerpFlat: function(a, b, c, d, e, f, g) { var h = c[d + 0] , k = c[d + 1] , m = c[d + 2]; c = c[d + 3]; d = e[f + 0]; var l = e[f + 1] , n = e[f + 2]; e = e[f + 3]; if (c !== e || h !== d || k !== l || m !== n) { f = 1 - g; var p = h * d + k * l + m * n + c * e , r = 0 <= p ? 1 : -1 , x = 1 - p * p; x > Number.EPSILON && (x = Math.sqrt(x), p = Math.atan2(x, p * r), f = Math.sin(f * p) / x, g = Math.sin(g * p) / x); r *= g; h = h * f + d * r; k = k * f + l * r; m = m * f + n * r; c = c * f + e * r; f === 1 - g && (g = 1 / Math.sqrt(h * h + k * k + m * m + c * c), h *= g, k *= g, m *= g, c *= g) } a[b] = h; a[b + 1] = k; a[b + 2] = m; a[b + 3] = c } }); q.prototype = { constructor: q, isVector3: !0, set: function(a, b, c) { this.x = a; this.y = b; this.z = c; return this }, setScalar: function(a) { this.z = this.y = this.x = a; return this }, setX: function(a) { this.x = a; return this }, setY: function(a) { this.y = a; return this }, setZ: function(a) { this.z = a; return this }, setComponent: function(a, b) { switch (a) { case 0: this.x = b; break; case 1: this.y = b; break; case 2: this.z = b; break; default: throw Error("index is out of range: " + a); } return this }, getComponent: function(a) { switch (a) { case 0: return this.x; case 1: return this.y; case 2: return this.z; default: throw Error("index is out of range: " + a); } }, clone: function() { return new this.constructor(this.x,this.y,this.z) }, copy: function(a) { this.x = a.x; this.y = a.y; this.z = a.z; return this }, add: function(a, b) { if (void 0 !== b) return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."), this.addVectors(a, b); this.x += a.x; this.y += a.y; this.z += a.z; return this }, addScalar: function(a) { this.x += a; this.y += a; this.z += a; return this }, addVectors: function(a, b) { this.x = a.x + b.x; this.y = a.y + b.y; this.z = a.z + b.z; return this }, addScaledVector: function(a, b) { this.x += a.x * b; this.y += a.y * b; this.z += a.z * b; return this }, sub: function(a, b) { if (void 0 !== b) return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), this.subVectors(a, b); this.x -= a.x; this.y -= a.y; this.z -= a.z; return this }, subScalar: function(a) { this.x -= a; this.y -= a; this.z -= a; return this }, subVectors: function(a, b) { this.x = a.x - b.x; this.y = a.y - b.y; this.z = a.z - b.z; return this }, multiply: function(a, b) { if (void 0 !== b) return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."), this.multiplyVectors(a, b); this.x *= a.x; this.y *= a.y; this.z *= a.z; return this }, multiplyScalar: function(a) { isFinite(a) ? (this.x *= a, this.y *= a, this.z *= a) : this.z = this.y = this.x = 0; return this }, multiplyVectors: function(a, b) { this.x = a.x * b.x; this.y = a.y * b.y; this.z = a.z * b.z; return this }, applyEuler: function() { var a; return function(b) { !1 === (b && b.isEuler) && console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."); void 0 === a && (a = new ba); return this.applyQuaternion(a.setFromEuler(b)) } }(), applyAxisAngle: function() { var a; return function(b, c) { void 0 === a && (a = new ba); return this.applyQuaternion(a.setFromAxisAngle(b, c)) } }(), applyMatrix3: function(a) { var b = this.x , c = this.y , d = this.z; a = a.elements; this.x = a[0] * b + a[3] * c + a[6] * d; this.y = a[1] * b + a[4] * c + a[7] * d; this.z = a[2] * b + a[5] * c + a[8] * d; return this }, applyMatrix4: function(a) { var b = this.x , c = this.y , d = this.z; a = a.elements; this.x = a[0] * b + a[4] * c + a[8] * d + a[12]; this.y = a[1] * b + a[5] * c + a[9] * d + a[13]; this.z = a[2] * b + a[6] * c + a[10] * d + a[14]; return this }, applyProjection: function(a) { var b = this.x , c = this.y , d = this.z; a = a.elements; var e = 1 / (a[3] * b + a[7] * c + a[11] * d + a[15]); this.x = (a[0] * b + a[4] * c + a[8] * d + a[12]) * e; this.y = (a[1] * b + a[5] * c + a[9] * d + a[13]) * e; this.z = (a[2] * b + a[6] * c + a[10] * d + a[14]) * e; return this }, applyQuaternion: function(a) { var b = this.x , c = this.y , d = this.z , e = a.x , f = a.y , g = a.z; a = a.w; var h = a * b + f * d - g * c , k = a * c + g * b - e * d , m = a * d + e * c - f * b , b = -e * b - f * c - g * d; this.x = h * a + b * -e + k * -g - m * -f; this.y = k * a + b * -f + m * -e - h * -g; this.z = m * a + b * -g + h * -f - k * -e; return this }, project: function() { var a; return function(b) { void 0 === a && (a = new J); a.multiplyMatrices(b.projectionMatrix, a.getInverse(b.matrixWorld)); return this.applyProjection(a) } }(), unproject: function() { var a; return function(b) { void 0 === a && (a = new J); a.multiplyMatrices(b.matrixWorld, a.getInverse(b.projectionMatrix)); return this.applyProjection(a) } }(), transformDirection: function(a) { var b = this.x , c = this.y , d = this.z; a = a.elements; this.x = a[0] * b + a[4] * c + a[8] * d; this.y = a[1] * b + a[5] * c + a[9] * d; this.z = a[2] * b + a[6] * c + a[10] * d; return this.normalize() }, divide: function(a) { this.x /= a.x; this.y /= a.y; this.z /= a.z; return this }, divideScalar: function(a) { return this.multiplyScalar(1 / a) }, min: function(a) { this.x = Math.min(this.x, a.x); this.y = Math.min(this.y, a.y); this.z = Math.min(this.z, a.z); return this }, max: function(a) { this.x = Math.max(this.x, a.x); this.y = Math.max(this.y, a.y); this.z = Math.max(this.z, a.z); return this }, clamp: function(a, b) { this.x = Math.max(a.x, Math.min(b.x, this.x)); this.y = Math.max(a.y, Math.min(b.y, this.y)); this.z = Math.max(a.z, Math.min(b.z, this.z)); return this }, clampScalar: function() { var a, b; return function(c, d) { void 0 === a && (a = new q, b = new q); a.set(c, c, c); b.set(d, d, d); return this.clamp(a, b) } }(), clampLength: function(a, b) { var c = this.length(); return this.multiplyScalar(Math.max(a, Math.min(b, c)) / c) }, floor: function() { this.x = Math.floor(this.x); this.y = Math.floor(this.y); this.z = Math.floor(this.z); return this }, ceil: function() { this.x = Math.ceil(this.x); this.y = Math.ceil(this.y); this.z = Math.ceil(this.z); return this }, round: function() { this.x = Math.round(this.x); this.y = Math.round(this.y); this.z = Math.round(this.z); return this }, roundToZero: function() { this.x = 0 > this.x ? Math.ceil(this.x) : Math.floor(this.x); this.y = 0 > this.y ? Math.ceil(this.y) : Math.floor(this.y); this.z = 0 > this.z ? Math.ceil(this.z) : Math.floor(this.z); return this }, negate: function() { this.x = -this.x; this.y = -this.y; this.z = -this.z; return this }, dot: function(a) { return this.x * a.x + this.y * a.y + this.z * a.z }, lengthSq: function() { return this.x * this.x + this.y * this.y + this.z * this.z }, length: function() { return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z) }, lengthManhattan: function() { return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) }, normalize: function() { return this.divideScalar(this.length()) }, setLength: function(a) { return this.multiplyScalar(a / this.length()) }, lerp: function(a, b) { this.x += (a.x - this.x) * b; this.y += (a.y - this.y) * b; this.z += (a.z - this.z) * b; return this }, lerpVectors: function(a, b, c) { return this.subVectors(b, a).multiplyScalar(c).add(a) }, cross: function(a, b) { if (void 0 !== b) return console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."), this.crossVectors(a, b); var c = this.x , d = this.y , e = this.z; this.x = d * a.z - e * a.y; this.y = e * a.x - c * a.z; this.z = c * a.y - d * a.x; return this }, crossVectors: function(a, b) { var c = a.x , d = a.y , e = a.z , f = b.x , g = b.y , h = b.z; this.x = d * h - e * g; this.y = e * f - c * h; this.z = c * g - d * f; return this }, projectOnVector: function(a) { var b = a.dot(this) / a.lengthSq(); return this.copy(a).multiplyScalar(b) }, projectOnPlane: function() { var a; return function(b) { void 0 === a && (a = new q); a.copy(this).projectOnVector(b); return this.sub(a) } }(), reflect: function() { var a; return function(b) { void 0 === a && (a = new q); return this.sub(a.copy(b).multiplyScalar(2 * this.dot(b))) } }(), angleTo: function(a) { a = this.dot(a) / Math.sqrt(this.lengthSq() * a.lengthSq()); return Math.acos(T.clamp(a, -1, 1)) }, distanceTo: function(a) { return Math.sqrt(this.distanceToSquared(a)) }, distanceToSquared: function(a) { var b = this.x - a.x , c = this.y - a.y; a = this.z - a.z; return b * b + c * c + a * a }, distanceToManhattan: function(a) { return Math.abs(this.x - a.x) + Math.abs(this.y - a.y) + Math.abs(this.z - a.z) }, setFromSpherical: function(a) { var b = Math.sin(a.phi) * a.radius; this.x = b * Math.sin(a.theta); this.y = Math.cos(a.phi) * a.radius; this.z = b * Math.cos(a.theta); return this }, setFromMatrixPosition: function(a) { return this.setFromMatrixColumn(a, 3) }, setFromMatrixScale: function(a) { var b = this.setFromMatrixColumn(a, 0).length() , c = this.setFromMatrixColumn(a, 1).length(); a = this.setFromMatrixColumn(a, 2).length(); this.x = b; this.y = c; this.z = a; return this }, setFromMatrixColumn: function(a, b) { if ("number" === typeof a) { console.warn("THREE.Vector3: setFromMatrixColumn now expects ( matrix, index )."); var c = a; a = b; b = c } return this.fromArray(a.elements, 4 * b) }, equals: function(a) { return a.x === this.x && a.y === this.y && a.z === this.z }, fromArray: function(a, b) { void 0 === b && (b = 0); this.x = a[b]; this.y = a[b + 1]; this.z = a[b + 2]; return this }, toArray: function(a, b) { void 0 === a && (a = []); void 0 === b && (b = 0); a[b] = this.x; a[b + 1] = this.y; a[b + 2] = this.z; return a }, fromAttribute: function(a, b, c) { void 0 === c && (c = 0); b = b * a.itemSize + c; this.x = a.array[b]; this.y = a.array[b + 1]; this.z = a.array[b + 2]; return this } }; J.prototype = { constructor: J, isMatrix4: !0, set: function(a, b, c, d, e, f, g, h, k, m, l, n, p, r, x, t) { var q = this.elements; q[0] = a; q[4] = b; q[8] = c; q[12] = d; q[1] = e; q[5] = f; q[9] = g; q[13] = h; q[2] = k; q[6] = m; q[10] = l; q[14] = n; q[3] = p; q[7] = r; q[11] = x; q[15] = t; return this }, identity: function() { this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); return this }, clone: function() { return (new J).fromArray(this.elements) }, copy: function(a) { this.elements.set(a.elements); return this }, copyPosition: function(a) { var b = this.elements; a = a.elements; b[12] = a[12]; b[13] = a[13]; b[14] = a[14]; return this }, extractBasis: function(a, b, c) { a.setFromMatrixColumn(this, 0); b.setFromMatrixColumn(this, 1); c.setFromMatrixColumn(this, 2); return this }, makeBasis: function(a, b, c) { this.set(a.x, b.x, c.x, 0, a.y, b.y, c.y, 0, a.z, b.z, c.z, 0, 0, 0, 0, 1); return this }, extractRotation: function() { var a; return function(b) { void 0 === a && (a = new q); var c = this.elements , d = b.elements , e = 1 / a.setFromMatrixColumn(b, 0).length() , f = 1 / a.setFromMatrixColumn(b, 1).length(); b = 1 / a.setFromMatrixColumn(b, 2).length(); c[0] = d[0] * e; c[1] = d[1] * e; c[2] = d[2] * e; c[4] = d[4] * f; c[5] = d[5] * f; c[6] = d[6] * f; c[8] = d[8] * b; c[9] = d[9] * b; c[10] = d[10] * b; return this } }(), makeRotationFromEuler: function(a) { !1 === (a && a.isEuler) && console.error("THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order."); var b = this.elements , c = a.x , d = a.y , e = a.z , f = Math.cos(c) , c = Math.sin(c) , g = Math.cos(d) , d = Math.sin(d) , h = Math.cos(e) , e = Math.sin(e); if ("XYZ" === a.order) { a = f * h; var k = f * e , m = c * h , l = c * e; b[0] = g * h; b[4] = -g * e; b[8] = d; b[1] = k + m * d; b[5] = a - l * d; b[9] = -c * g; b[2] = l - a * d; b[6] = m + k * d; b[10] = f * g } else "YXZ" === a.order ? (a = g * h, k = g * e, m = d * h, l = d * e, b[0] = a + l * c, b[4] = m * c - k, b[8] = f * d, b[1] = f * e, b[5] = f * h, b[9] = -c, b[2] = k * c - m, b[6] = l + a * c, b[10] = f * g) : "ZXY" === a.order ? (a = g * h, k = g * e, m = d * h, l = d * e, b[0] = a - l * c, b[4] = -f * e, b[8] = m + k * c, b[1] = k + m * c, b[5] = f * h, b[9] = l - a * c, b[2] = -f * d, b[6] = c, b[10] = f * g) : "ZYX" === a.order ? (a = f * h, k = f * e, m = c * h, l = c * e, b[0] = g * h, b[4] = m * d - k, b[8] = a * d + l, b[1] = g * e, b[5] = l * d + a, b[9] = k * d - m, b[2] = -d, b[6] = c * g, b[10] = f * g) : "YZX" === a.order ? (a = f * g, k = f * d, m = c * g, l = c * d, b[0] = g * h, b[4] = l - a * e, b[8] = m * e + k, b[1] = e, b[5] = f * h, b[9] = -c * h, b[2] = -d * h, b[6] = k * e + m, b[10] = a - l * e) : "XZY" === a.order && (a = f * g, k = f * d, m = c * g, l = c * d, b[0] = g * h, b[4] = -e, b[8] = d * h, b[1] = a * e + l, b[5] = f * h, b[9] = k * e - m, b[2] = m * e - k, b[6] = c * h, b[10] = l * e + a); b[3] = 0; b[7] = 0; b[11] = 0; b[12] = 0; b[13] = 0; b[14] = 0; b[15] = 1; return this }, makeRotationFromQuaternion: function(a) { var b = this.elements , c = a.x , d = a.y , e = a.z , f = a.w , g = c + c , h = d + d , k = e + e; a = c * g; var m = c * h , c = c * k , l = d * h , d = d * k , e = e * k , g = f * g , h = f * h , f = f * k; b[0] = 1 - (l + e); b[4] = m - f; b[8] = c + h; b[1] = m + f; b[5] = 1 - (a + e); b[9] = d - g; b[2] = c - h; b[6] = d + g; b[10] = 1 - (a + l); b[3] = 0; b[7] = 0; b[11] = 0; b[12] = 0; b[13] = 0; b[14] = 0; b[15] = 1; return this }, lookAt: function() { var a, b, c; return function(d, e, f) { void 0 === a && (a = new q, b = new q, c = new q); var g = this.elements; c.subVectors(d, e).normalize(); 0 === c.lengthSq() && (c.z = 1); a.crossVectors(f, c).normalize(); 0 === a.lengthSq() && (c.z += 1E-4, a.crossVectors(f, c).normalize()); b.crossVectors(c, a); g[0] = a.x; g[4] = b.x; g[8] = c.x; g[1] = a.y; g[5] = b.y; g[9] = c.y; g[2] = a.z; g[6] = b.z; g[10] = c.z; return this } }(), multiply: function(a, b) { return void 0 !== b ? (console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."), this.multiplyMatrices(a, b)) : this.multiplyMatrices(this, a) }, premultiply: function(a) { return this.multiplyMatrices(a, this) }, multiplyMatrices: function(a, b) { var c = a.elements , d = b.elements , e = this.elements , f = c[0] , g = c[4] , h = c[8] , k = c[12] , m = c[1] , l = c[5] , n = c[9] , p = c[13] , r = c[2] , x = c[6] , t = c[10] , q = c[14] , u = c[3] , v = c[7] , I = c[11] , c = c[15] , y = d[0] , E = d[4] , H = d[8] , F = d[12] , M = d[1] , B = d[5] , K = d[9] , z = d[13] , C = d[2] , G = d[6] , J = d[10] , N = d[14] , P = d[3] , R = d[7] , S = d[11] , d = d[15]; e[0] = f * y + g * M + h * C + k * P; e[4] = f * E + g * B + h * G + k * R; e[8] = f * H + g * K + h * J + k * S; e[12] = f * F + g * z + h * N + k * d; e[1] = m * y + l * M + n * C + p * P; e[5] = m * E + l * B + n * G + p * R; e[9] = m * H + l * K + n * J + p * S; e[13] = m * F + l * z + n * N + p * d; e[2] = r * y + x * M + t * C + q * P; e[6] = r * E + x * B + t * G + q * R; e[10] = r * H + x * K + t * J + q * S; e[14] = r * F + x * z + t * N + q * d; e[3] = u * y + v * M + I * C + c * P; e[7] = u * E + v * B + I * G + c * R; e[11] = u * H + v * K + I * J + c * S; e[15] = u * F + v * z + I * N + c * d; return this }, multiplyToArray: function(a, b, c) { var d = this.elements; this.multiplyMatrices(a, b); c[0] = d[0]; c[1] = d[1]; c[2] = d[2]; c[3] = d[3]; c[4] = d[4]; c[5] = d[5]; c[6] = d[6]; c[7] = d[7]; c[8] = d[8]; c[9] = d[9]; c[10] = d[10]; c[11] = d[11]; c[12] = d[12]; c[13] = d[13]; c[14] = d[14]; c[15] = d[15]; return this }, multiplyScalar: function(a) { var b = this.elements; b[0] *= a; b[4] *= a; b[8] *= a; b[12] *= a; b[1] *= a; b[5] *= a; b[9] *= a; b[13] *= a; b[2] *= a; b[6] *= a; b[10] *= a; b[14] *= a; b[3] *= a; b[7] *= a; b[11] *= a; b[15] *= a; return this }, applyToVector3Array: function() { var a; return function(b, c, d) { void 0 === a && (a = new q); void 0 === c && (c = 0); void 0 === d && (d = b.length); for (var e = 0; e < d; e += 3, c += 3) a.fromArray(b, c), a.applyMatrix4(this), a.toArray(b, c); return b } }(), applyToBuffer: function() { var a; return function(b, c, d) { void 0 === a && (a = new q); void 0 === c && (c = 0); void 0 === d && (d = b.length / b.itemSize); for (var e = 0; e < d; e++, c++) a.x = b.getX(c), a.y = b.getY(c), a.z = b.getZ(c), a.applyMatrix4(this), b.setXYZ(c, a.x, a.y, a.z); return b } }(), determinant: function() { var a = this.elements , b = a[0] , c = a[4] , d = a[8] , e = a[12] , f = a[1] , g = a[5] , h = a[9] , k = a[13] , m = a[2] , l = a[6] , n = a[10] , p = a[14]; return a[3] * (+e * h * l - d * k * l - e * g * n + c * k * n + d * g * p - c * h * p) + a[7] * (+b * h * p - b * k * n + e * f * n - d * f * p + d * k * m - e * h * m) + a[11] * (+b * k * l - b * g * p - e * f * l + c * f * p + e * g * m - c * k * m) + a[15] * (-d * g * m - b * h * l + b * g * n + d * f * l - c * f * n + c * h * m) }, transpose: function() { var a = this.elements, b; b = a[1]; a[1] = a[4]; a[4] = b; b = a[2]; a[2] = a[8]; a[8] = b; b = a[6]; a[6] = a[9]; a[9] = b; b = a[3]; a[3] = a[12]; a[12] = b; b = a[7]; a[7] = a[13]; a[13] = b; b = a[11]; a[11] = a[14]; a[14] = b; return this }, flattenToArrayOffset: function(a, b) { console.warn("THREE.Matrix3: .flattenToArrayOffset is deprecated - just use .toArray instead."); return this.toArray(a, b) }, getPosition: function() { var a; return function() { void 0 === a && (a = new q); console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."); return a.setFromMatrixColumn(this, 3) } }(), setPosition: function(a) { var b = this.elements; b[12] = a.x; b[13] = a.y; b[14] = a.z; return this }, getInverse: function(a, b) { var c = this.elements , d = a.elements , e = d[0] , f = d[1] , g = d[2] , h = d[3] , k = d[4] , m = d[5] , l = d[6] , n = d[7] , p = d[8] , r = d[9] , x = d[10] , t = d[11] , q = d[12] , u = d[13] , v = d[14] , d = d[15] , I = r * v * n - u * x * n + u * l * t - m * v * t - r * l * d + m * x * d , y = q * x * n - p * v * n - q * l * t + k * v * t + p * l * d - k * x * d , E = p * u * n - q * r * n + q * m * t - k * u * t - p * m * d + k * r * d , H = q * r * l - p * u * l - q * m * x + k * u * x + p * m * v - k * r * v , F = e * I + f * y + g * E + h * H; if (0 === F) { if (!0 === b) throw Error("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0"); console.warn("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0"); return this.identity() } F = 1 / F; c[0] = I * F; c[1] = (u * x * h - r * v * h - u * g * t + f * v * t + r * g * d - f * x * d) * F; c[2] = (m * v * h - u * l * h + u * g * n - f * v * n - m * g * d + f * l * d) * F; c[3] = (r * l * h - m * x * h - r * g * n + f * x * n + m * g * t - f * l * t) * F; c[4] = y * F; c[5] = (p * v * h - q * x * h + q * g * t - e * v * t - p * g * d + e * x * d) * F; c[6] = (q * l * h - k * v * h - q * g * n + e * v * n + k * g * d - e * l * d) * F; c[7] = (k * x * h - p * l * h + p * g * n - e * x * n - k * g * t + e * l * t) * F; c[8] = E * F; c[9] = (q * r * h - p * u * h - q * f * t + e * u * t + p * f * d - e * r * d) * F; c[10] = (k * u * h - q * m * h + q * f * n - e * u * n - k * f * d + e * m * d) * F; c[11] = (p * m * h - k * r * h - p * f * n + e * r * n + k * f * t - e * m * t) * F; c[12] = H * F; c[13] = (p * u * g - q * r * g + q * f * x - e * u * x - p * f * v + e * r * v) * F; c[14] = (q * m * g - k * u * g - q * f * l + e * u * l + k * f * v - e * m * v) * F; c[15] = (k * r * g - p * m * g + p * f * l - e * r * l - k * f * x + e * m * x) * F; return this }, scale: function(a) { var b = this.elements , c = a.x , d = a.y; a = a.z; b[0] *= c; b[4] *= d; b[8] *= a; b[1] *= c; b[5] *= d; b[9] *= a; b[2] *= c; b[6] *= d; b[10] *= a; b[3] *= c; b[7] *= d; b[11] *= a; return this }, getMaxScaleOnAxis: function() { var a = this.elements; return Math.sqrt(Math.max(a[0] * a[0] + a[1] * a[1] + a[2] * a[2], a[4] * a[4] + a[5] * a[5] + a[6] * a[6], a[8] * a[8] + a[9] * a[9] + a[10] * a[10])) }, makeTranslation: function(a, b, c) { this.set(1, 0, 0, a, 0, 1, 0, b, 0, 0, 1, c, 0, 0, 0, 1); return this }, makeRotationX: function(a) { var b = Math.cos(a); a = Math.sin(a); this.set(1, 0, 0, 0, 0, b, -a, 0, 0, a, b, 0, 0, 0, 0, 1); return this }, makeRotationY: function(a) { var b = Math.cos(a); a = Math.sin(a); this.set(b, 0, a, 0, 0, 1, 0, 0, -a, 0, b, 0, 0, 0, 0, 1); return this }, makeRotationZ: function(a) { var b = Math.cos(a); a = Math.sin(a); this.set(b, -a, 0, 0, a, b, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); return this }, makeRotationAxis: function(a, b) { var c = Math.cos(b) , d = Math.sin(b) , e = 1 - c , f = a.x , g = a.y , h = a.z , k = e * f , m = e * g; this.set(k * f + c, k * g - d * h, k * h + d * g, 0, k * g + d * h, m * g + c, m * h - d * f, 0, k * h - d * g, m * h + d * f, e * h * h + c, 0, 0, 0, 0, 1); return this }, makeScale: function(a, b, c) { this.set(a, 0, 0, 0, 0, b, 0, 0, 0, 0, c, 0, 0, 0, 0, 1); return this }, compose: function(a, b, c) { this.makeRotationFromQuaternion(b); this.scale(c); this.setPosition(a); return this }, decompose: function() { var a, b; return function(c, d, e) { void 0 === a && (a = new q, b = new J); var f = this.elements , g = a.set(f[0], f[1], f[2]).length() , h = a.set(f[4], f[5], f[6]).length() , k = a.set(f[8], f[9], f[10]).length(); 0 > this.determinant() && (g = -g); c.x = f[12]; c.y = f[13]; c.z = f[14]; b.elements.set(this.elements); c = 1 / g; var f = 1 / h , m = 1 / k; b.elements[0] *= c; b.elements[1] *= c; b.elements[2] *= c; b.elements[4] *= f; b.elements[5] *= f; b.elements[6] *= f; b.elements[8] *= m; b.elements[9] *= m; b.elements[10] *= m; d.setFromRotationMatrix(b); e.x = g; e.y = h; e.z = k; return this } }(), makeFrustum: function(a, b, c, d, e, f) { var g = this.elements; g[0] = 2 * e / (b - a); g[4] = 0; g[8] = (b + a) / (b - a); g[12] = 0; g[1] = 0; g[5] = 2 * e / (d - c); g[9] = (d + c) / (d - c); g[13] = 0; g[2] = 0; g[6] = 0; g[10] = -(f + e) / (f - e); g[14] = -2 * f * e / (f - e); g[3] = 0; g[7] = 0; g[11] = -1; g[15] = 0; return this }, makePerspective: function(a, b, c, d) { a = c * Math.tan(T.DEG2RAD * a * .5); var e = -a; return this.makeFrustum(e * b, a * b, e, a, c, d) }, makeOrthographic: function(a, b, c, d, e, f) { var g = this.elements , h = 1 / (b - a) , k = 1 / (c - d) , m = 1 / (f - e); g[0] = 2 * h; g[4] = 0; g[8] = 0; g[12] = -((b + a) * h); g[1] = 0; g[5] = 2 * k; g[9] = 0; g[13] = -((c + d) * k); g[2] = 0; g[6] = 0; g[10] = -2 * m; g[14] = -((f + e) * m); g[3] = 0; g[7] = 0; g[11] = 0; g[15] = 1; return this }, equals: function(a) { var b = this.elements; a = a.elements; for (var c = 0; 16 > c; c++) if (b[c] !== a[c]) return !1; return !0 }, fromArray: function(a, b) { void 0 === b && (b = 0); for (var c = 0; 16 > c; c++) this.elements[c] = a[c + b]; return this }, toArray: function(a, b) { void 0 === a && (a = []); void 0 === b && (b = 0); var c = this.elements; a[b] = c[0]; a[b + 1] = c[1]; a[b + 2] = c[2]; a[b + 3] = c[3]; a[b + 4] = c[4]; a[b + 5] = c[5]; a[b + 6] = c[6]; a[b + 7] = c[7]; a[b + 8] = c[8]; a[b + 9] = c[9]; a[b + 10] = c[10]; a[b + 11] = c[11]; a[b + 12] = c[12]; a[b + 13] = c[13]; a[b + 14] = c[14]; a[b + 15] = c[15]; return a } }; Xa.prototype = Object.create(da.prototype); Xa.prototype.constructor = Xa; Xa.prototype.isCubeTexture = !0; Object.defineProperty(Xa.prototype, "images", { get: function() { return this.image }, set: function(a) { this.image = a } }); var ie = new da , je = new Xa , fe = [] , he = []; ne.prototype.setValue = function(a, b) { for (var c = this.seq, d = 0, e = c.length; d !== e; ++d) { var f = c[d]; f.setValue(a, b[f.id]) } } ; var zd = /([\w\d_]+)(\])?(\[|\.)?/g; Ya.prototype.setValue = function(a, b, c) { b = this.map[b]; void 0 !== b && b.setValue(a, c, this.renderer) } ; Ya.prototype.set = function(a, b, c) { var d = this.map[c]; void 0 !== d && d.setValue(a, b[c], this.renderer) } ; Ya.prototype.setOptional = function(a, b, c) { b = b[c]; void 0 !== b && this.setValue(a, c, b) } ; Ya.upload = function(a, b, c, d) { for (var e = 0, f = b.length; e !== f; ++e) { var g = b[e] , h = c[g.id]; !1 !== h.needsUpdate && g.setValue(a, h.value, d) } } ; Ya.seqWithValue = function(a, b) { for (var c = [], d = 0, e = a.length; d !== e; ++d) { var f = a[d]; f.id in b && c.push(f) } return c } ; var La = { merge: function(a) { for (var b = {}, c = 0; c < a.length; c++) { var d = this.clone(a[c]), e; for (e in d) b[e] = d[e] } return b }, clone: function(a) { var b = {}, c; for (c in a) { b[c] = {}; for (var d in a[c]) { var e = a[c][d]; e && (e.isColor || e.isMatrix3 || e.isMatrix4 || e.isVector2 || e.isVector3 || e.isVector4 || e.isTexture) ? b[c][d] = e.clone() : Array.isArray(e) ? b[c][d] = e.slice() : b[c][d] = e } } return b } } , X = { alphamap_fragment: "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n", alphamap_pars_fragment: "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n", alphatest_fragment: "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n", aomap_fragment: "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n", aomap_pars_fragment: "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif", begin_vertex: "\nvec3 transformed = vec3( position );\n", beginnormal_vertex: "\nvec3 objectNormal = vec3( normal );\n", bsdfs: "bool testLightInRange( const in float lightDistance, const in float cutoffDistance ) {\n\treturn any( bvec2( cutoffDistance == 0.0, lightDistance < cutoffDistance ) );\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t\t}\n\t\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n", bumpmap_pars_fragment: "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = dFdx( surf_pos );\n\t\tvec3 vSigmaY = dFdy( surf_pos );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n", clipping_planes_fragment: "#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n", clipping_planes_pars_fragment: "#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n", clipping_planes_pars_vertex: "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n", clipping_planes_vertex: "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n", color_fragment: "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif", color_pars_fragment: "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n", color_pars_vertex: "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif", color_vertex: "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif", common: "#define PI 3.14159265359\n#define PI2 6.28318530718\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\n", cube_uv_reflection_fragment: "#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n", defaultnormal_vertex: "#ifdef FLIP_SIDED\n\tobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;\n", displacementmap_pars_vertex: "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n", displacementmap_vertex: "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n", emissivemap_fragment: "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n", emissivemap_pars_fragment: "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n", encodings_fragment: " gl_FragColor = linearToOutputTexel( gl_FragColor );\n", encodings_pars_fragment: "\nvec4 LinearToLinear( in vec4 value ) {\n return value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n float maxComponent = max( max( value.r, value.g ), value.b );\n float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n return vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n float maxRGB = max( value.x, max( value.g, value.b ) );\n float M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n M = ceil( M * 255.0 ) / 255.0;\n return vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n float maxRGB = max( value.x, max( value.g, value.b ) );\n float D = max( maxRange / maxRGB, 1.0 );\n D = min( floor( D ) / 255.0, 1.0 );\n return vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n vec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n Xp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n vec4 vResult;\n vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n vResult.w = fract(Le);\n vResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n return vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n float Le = value.z * 255.0 + value.w;\n vec3 Xp_Y_XYZp;\n Xp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n return vec4( max(vRGB, 0.0), 1.0 );\n}\n", envmap_fragment: "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n", envmap_pars_fragment: "#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntenstiy;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n", envmap_pars_vertex: "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n", envmap_vertex: "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n", fog_fragment: "#ifdef USE_FOG\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\n\t#else\n\t\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n\t#endif\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n", fog_pars_fragment: "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif", lightmap_fragment: "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n", lightmap_pars_fragment: "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif", lights_lambert_vertex: "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n", lights_pars: "uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tif ( testLightInRange( lightDistance, pointLight.distance ) ) {\n\t\t\tdirectLight.color = pointLight.color;\n\t\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( all( bvec2( angleCos > spotLight.coneCos, testLightInRange( lightDistance, spotLight.distance ) ) ) ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\t#include <normal_flip>\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\t#include <normal_flip>\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n", lights_phong_fragment: "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n", lights_phong_pars_fragment: "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n", lights_physical_fragment: "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n", lights_physical_pars_fragment: "struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n", lights_template: "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t \tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\t\t\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n", logdepthbuf_fragment: "#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif", logdepthbuf_pars_fragment: "#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n", logdepthbuf_pars_vertex: "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif", logdepthbuf_vertex: "#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n", map_fragment: "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n", map_pars_fragment: "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n", map_particle_fragment: "#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n", map_particle_pars_fragment: "#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n", metalnessmap_fragment: "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.r;\n#endif\n", metalnessmap_pars_fragment: "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif", morphnormal_vertex: "#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n", morphtarget_pars_vertex: "#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif", morphtarget_vertex: "#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n", normal_flip: "#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n", normal_fragment: "#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n", normalmap_pars_fragment: "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n", packing: "vec3 packNormalToRGB( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n return 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n return ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n return linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n return (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n return ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n", premultiplied_alpha_fragment: "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n", project_vertex: "#ifdef USE_SKINNING\n\tvec4 mvPosition = modelViewMatrix * skinned;\n#else\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;\n", roughnessmap_fragment: "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.r;\n#endif\n", roughnessmap_pars_fragment: "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif", shadowmap_pars_fragment: "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn 1.0;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n", shadowmap_pars_vertex: "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n", shadowmap_vertex: "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n", shadowmask_pars_fragment: "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n", skinbase_vertex: "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif", skinning_pars_vertex: "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureWidth;\n\t\tuniform int boneTextureHeight;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureWidth ) );\n\t\t\tfloat y = floor( j / float( boneTextureWidth ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureWidth );\n\t\t\tfloat dy = 1.0 / float( boneTextureHeight );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n", skinning_vertex: "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\tskinned = bindMatrixInverse * skinned;\n#endif\n", skinnormal_vertex: "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n", specularmap_fragment: "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif", specularmap_pars_fragment: "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif", tonemapping_fragment: "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n", tonemapping_pars_fragment: "#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n return toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n return saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n color = max( vec3( 0.0 ), color - 0.004 );\n return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n", uv_pars_fragment: "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif", uv_pars_vertex: "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n", uv_vertex: "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif", uv2_pars_fragment: "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif", uv2_pars_vertex: "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif", uv2_vertex: "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif", worldpos_vertex: "#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\t#ifdef USE_SKINNING\n\t\tvec4 worldPosition = modelMatrix * skinned;\n\t#else\n\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\t#endif\n#endif\n", cube_frag: "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n", cube_vert: "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n", depth_frag: "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n", depth_vert: "#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n", distanceRGBA_frag: "uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include <common>\n#include <packing>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n", distanceRGBA_vert: "varying vec4 vWorldPosition;\n#include <common>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition;\n}\n", equirect_frag: "uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n", equirect_vert: "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n", linedashed_frag: "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n", linedashed_vert: "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n", meshbasic_frag: "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight;\n\treflectedLight.directDiffuse = vec3( 0.0 );\n\treflectedLight.directSpecular = vec3( 0.0 );\n\treflectedLight.indirectDiffuse = diffuseColor.rgb;\n\treflectedLight.indirectSpecular = vec3( 0.0 );\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n", meshbasic_vert: "#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n}\n", meshlambert_frag: "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n", meshlambert_vert: "#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars>\n#include <color_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n}\n", meshphong_frag: "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n", meshphong_vert: "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n}\n", meshphysical_frag: "#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nuniform float envMapIntensity;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n", meshphysical_vert: "#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n", normal_frag: "uniform float opacity;\nvarying vec3 vNormal;\n#include <common>\n#include <packing>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tgl_FragColor = vec4( packNormalToRGB( vNormal ), opacity );\n\t#include <logdepthbuf_fragment>\n}\n", normal_vert: "varying vec3 vNormal;\n#include <common>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvNormal = normalize( normalMatrix * normal );\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n", points_frag: "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n", points_vert: "uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n", shadow_frag: "uniform float opacity;\n#include <common>\n#include <packing>\n#include <bsdfs>\n#include <lights_pars>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n", shadow_vert: "#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n" }; O.prototype = { constructor: O, isColor: !0, r: 1, g: 1, b: 1, set: function(a) { a && a.isColor ? this.copy(a) : "number" === typeof a ? this.setHex(a) : "string" === typeof a && this.setStyle(a); return this }, setScalar: function(a) { this.b = this.g = this.r = a; return this }, setHex: function(a) { a = Math.floor(a); this.r = (a >> 16 & 255) / 255; this.g = (a >> 8 & 255) / 255; this.b = (a & 255) / 255; return this }, setRGB: function(a, b, c) { this.r = a; this.g = b; this.b = c; return this }, setHSL: function() { function a(a, c, d) { 0 > d && (d += 1); 1 < d && --d; return d < 1 / 6 ? a + 6 * (c - a) * d : .5 > d ? c : d < 2 / 3 ? a + 6 * (c - a) * (2 / 3 - d) : a } return function(b, c, d) { b = T.euclideanModulo(b, 1); c = T.clamp(c, 0, 1); d = T.clamp(d, 0, 1); 0 === c ? this.r = this.g = this.b = d : (c = .5 >= d ? d * (1 + c) : d + c - d * c, d = 2 * d - c, this.r = a(d, c, b + 1 / 3), this.g = a(d, c, b), this.b = a(d, c, b - 1 / 3)); return this } }(), setStyle: function(a) { function b(b) { void 0 !== b && 1 > parseFloat(b) && console.warn("THREE.Color: Alpha component of " + a + " will be ignored.") } var c; if (c = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)) { var d = c[2]; switch (c[1]) { case "rgb": case "rgba": if (c = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)) return this.r = Math.min(255, parseInt(c[1], 10)) / 255, this.g = Math.min(255, parseInt(c[2], 10)) / 255, this.b = Math.min(255, parseInt(c[3], 10)) / 255, b(c[5]), this; if (c = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)) return this.r = Math.min(100, parseInt(c[1], 10)) / 100, this.g = Math.min(100, parseInt(c[2], 10)) / 100, this.b = Math.min(100, parseInt(c[3], 10)) / 100, b(c[5]), this; break; case "hsl": case "hsla": if (c = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)) { var d = parseFloat(c[1]) / 360 , e = parseInt(c[2], 10) / 100 , f = parseInt(c[3], 10) / 100; b(c[5]); return this.setHSL(d, e, f) } } } else if (c = /^\#([A-Fa-f0-9]+)$/.exec(a)) { c = c[1]; d = c.length; if (3 === d) return this.r = parseInt(c.charAt(0) + c.charAt(0), 16) / 255, this.g = parseInt(c.charAt(1) + c.charAt(1), 16) / 255, this.b = parseInt(c.charAt(2) + c.charAt(2), 16) / 255, this; if (6 === d) return this.r = parseInt(c.charAt(0) + c.charAt(1), 16) / 255, this.g = parseInt(c.charAt(2) + c.charAt(3), 16) / 255, this.b = parseInt(c.charAt(4) + c.charAt(5), 16) / 255, this } a && 0 < a.length && (c = He[a], void 0 !== c ? this.setHex(c) : console.warn("THREE.Color: Unknown color " + a)); return this }, clone: function() { return new this.constructor(this.r,this.g,this.b) }, copy: function(a) { this.r = a.r; this.g = a.g; this.b = a.b; return this }, copyGammaToLinear: function(a, b) { void 0 === b && (b = 2); this.r = Math.pow(a.r, b); this.g = Math.pow(a.g, b); this.b = Math.pow(a.b, b); return this }, copyLinearToGamma: function(a, b) { void 0 === b && (b = 2); var c = 0 < b ? 1 / b : 1; this.r = Math.pow(a.r, c); this.g = Math.pow(a.g, c); this.b = Math.pow(a.b, c); return this }, convertGammaToLinear: function() { var a = this.r , b = this.g , c = this.b; this.r = a * a; this.g = b * b; this.b = c * c; return this }, convertLinearToGamma: function() { this.r = Math.sqrt(this.r); this.g = Math.sqrt(this.g); this.b = Math.sqrt(this.b); return 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(a) { a = a || { h: 0, s: 0, l: 0 }; var b = this.r, c = this.g, d = this.b, e = Math.max(b, c, d), f = Math.min(b, c, d), g, h = (f + e) / 2; if (f === e) f = g = 0; else { var k = e - f , f = .5 >= h ? k / (e + f) : k / (2 - e - f); switch (e) { case b: g = (c - d) / k + (c < d ? 6 : 0); break; case c: g = (d - b) / k + 2; break; case d: g = (b - c) / k + 4 } g /= 6 } a.h = g; a.s = f; a.l = h; return a }, getStyle: function() { return "rgb(" + (255 * this.r | 0) + "," + (255 * this.g | 0) + "," + (255 * this.b | 0) + ")" }, offsetHSL: function(a, b, c) { var d = this.getHSL(); d.h += a; d.s += b; d.l += c; this.setHSL(d.h, d.s, d.l); return this }, add: function(a) { this.r += a.r; this.g += a.g; this.b += a.b; return this }, addColors: function(a, b) { this.r = a.r + b.r; this.g = a.g + b.g; this.b = a.b + b.b; return this }, addScalar: function(a) { this.r += a; this.g += a; this.b += a; return this }, sub: function(a) { this.r = Math.max(0, this.r - a.r); this.g = Math.max(0, this.g - a.g); this.b = Math.max(0, this.b - a.b); return this }, multiply: function(a) { this.r *= a.r; this.g *= a.g; this.b *= a.b; return this }, multiplyScalar: function(a) { this.r *= a; this.g *= a; this.b *= a; return this }, lerp: function(a, b) { this.r += (a.r - this.r) * b; this.g += (a.g - this.g) * b; this.b += (a.b - this.b) * b; return this }, equals: function(a) { return a.r === this.r && a.g === this.g && a.b === this.b }, fromArray: function(a, b) { void 0 === b && (b = 0); this.r = a[b]; this.g = a[b + 1]; this.b = a[b + 2]; return this }, toArray: function(a, b) { void 0 === a && (a = []); void 0 === b && (b = 0); a[b] = this.r; a[b + 1] = this.g; a[b + 2] = this.b; return a }, toJSON: function() { return this.getHex() } }; var He = { 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 } , W = { common: { diffuse: { value: new O(15658734) }, opacity: { value: 1 }, map: { value: null }, offsetRepeat: { value: new ga(0,0,1,1) }, specularMap: { value: null }, alphaMap: { value: null }, envMap: { value: null }, flipEnvMap: { value: -1 }, reflectivity: { value: 1 }, refractionRatio: { value: .98 } }, aomap: { aoMap: { value: null }, aoMapIntensity: { value: 1 } }, lightmap: { lightMap: { value: null }, lightMapIntensity: { value: 1 } }, emissivemap: { emissiveMap: { value: null } }, bumpmap: { bumpMap: { value: null }, bumpScale: { value: 1 } }, normalmap: { normalMap: { value: null }, normalScale: { value: new B(1,1) } }, displacementmap: { displacementMap: { value: null }, displacementScale: { value: 1 }, displacementBias: { value: 0 } }, roughnessmap: { roughnessMap: { value: null } }, metalnessmap: { metalnessMap: { value: null } }, fog: { fogDensity: { value: 2.5E-4 }, fogNear: { value: 1 }, fogFar: { value: 2E3 }, fogColor: { value: new O(16777215) } }, lights: { ambientLightColor: { value: [] }, directionalLights: { value: [], properties: { direction: {}, color: {}, shadow: {}, shadowBias: {}, shadowRadius: {}, shadowMapSize: {} } }, directionalShadowMap: { value: [] }, directionalShadowMatrix: { value: [] }, spotLights: { value: [], properties: { color: {}, position: {}, direction: {}, distance: {}, coneCos: {}, penumbraCos: {}, decay: {}, shadow: {}, shadowBias: {}, shadowRadius: {}, shadowMapSize: {} } }, spotShadowMap: { value: [] }, spotShadowMatrix: { value: [] }, pointLights: { value: [], properties: { color: {}, position: {}, decay: {}, distance: {}, shadow: {}, shadowBias: {}, shadowRadius: {}, shadowMapSize: {} } }, pointShadowMap: { value: [] }, pointShadowMatrix: { value: [] }, hemisphereLights: { value: [], properties: { direction: {}, skyColor: {}, groundColor: {} } } }, points: { diffuse: { value: new O(15658734) }, opacity: { value: 1 }, size: { value: 1 }, scale: { value: 1 }, map: { value: null }, offsetRepeat: { value: new ga(0,0,1,1) } } } , Gb = { basic: { uniforms: La.merge([W.common, W.aomap, W.fog]), vertexShader: X.meshbasic_vert, fragmentShader: X.meshbasic_frag }, lambert: { uniforms: La.merge([W.common, W.aomap, W.lightmap, W.emissivemap, W.fog, W.lights, { emissive: { value: new O(0) } }]), vertexShader: X.meshlambert_vert, fragmentShader: X.meshlambert_frag }, phong: { uniforms: La.merge([W.common, W.aomap, W.lightmap, W.emissivemap, W.bumpmap, W.normalmap, W.displacementmap, W.fog, W.lights, { emissive: { value: new O(0) }, specular: { value: new O(1118481) }, shininess: { value: 30 } }]), vertexShader: X.meshphong_vert, fragmentShader: X.meshphong_frag }, standard: { uniforms: La.merge([W.common, W.aomap, W.lightmap, W.emissivemap, W.bumpmap, W.normalmap, W.displacementmap, W.roughnessmap, W.metalnessmap, W.fog, W.lights, { emissive: { value: new O(0) }, roughness: { value: .5 }, metalness: { value: 0 }, envMapIntensity: { value: 1 } }]), vertexShader: X.meshphysical_vert, fragmentShader: X.meshphysical_frag }, points: { uniforms: La.merge([W.points, W.fog]), vertexShader: X.points_vert, fragmentShader: X.points_frag }, dashed: { uniforms: La.merge([W.common, W.fog, { scale: { value: 1 }, dashSize: { value: 1 }, totalSize: { value: 2 } }]), vertexShader: X.linedashed_vert, fragmentShader: X.linedashed_frag }, depth: { uniforms: La.merge([W.common, W.displacementmap]), vertexShader: X.depth_vert, fragmentShader: X.depth_frag }, normal: { uniforms: { opacity: { value: 1 } }, vertexShader: X.normal_vert, fragmentShader: X.normal_frag }, cube: { uniforms: { tCube: { value: null }, tFlip: { value: -1 }, opacity: { value: 1 } }, vertexShader: X.cube_vert, fragmentShader: X.cube_frag }, equirect: { uniforms: { tEquirect: { value: null }, tFlip: { value: -1 } }, vertexShader: X.equirect_vert, fragmentShader: X.equirect_frag }, distanceRGBA: { uniforms: { lightPos: { value: new q } }, vertexShader: X.distanceRGBA_vert, fragmentShader: X.distanceRGBA_frag } }; Gb.physical = { uniforms: La.merge([Gb.standard.uniforms, { clearCoat: { value: 0 }, clearCoatRoughness: { value: 0 } }]), vertexShader: X.meshphysical_vert, fragmentShader: X.meshphysical_frag }; mc.prototype = { constructor: mc, set: function(a, b) { this.min.copy(a); this.max.copy(b); return this }, setFromPoints: function(a) { this.makeEmpty(); for (var b = 0, c = a.length; b < c; b++) this.expandByPoint(a[b]); return this }, setFromCenterAndSize: function() { var a = new B; return function(b, c) { var d = a.copy(c).multiplyScalar(.5); this.min.copy(b).sub(d); this.max.copy(b).add(d); return this } }(), clone: function() { return (new this.constructor).copy(this) }, copy: function(a) { this.min.copy(a.min); this.max.copy(a.max); return this }, makeEmpty: function() { this.min.x = this.min.y = Infinity; this.max.x = this.max.y = -Infinity; return this }, isEmpty: function() { return this.max.x < this.min.x || this.max.y < this.min.y }, getCenter: function(a) { a = a || new B; return this.isEmpty() ? a.set(0, 0) : a.addVectors(this.min, this.max).multiplyScalar(.5) }, getSize: function(a) { a = a || new B; return this.isEmpty() ? a.set(0, 0) : a.subVectors(this.max, this.min) }, expandByPoint: function(a) { this.min.min(a); this.max.max(a); return this }, expandByVector: function(a) { this.min.sub(a); this.max.add(a); return this }, expandByScalar: function(a) { this.min.addScalar(-a); this.max.addScalar(a); return this }, containsPoint: function(a) { return a.x < this.min.x || a.x > this.max.x || a.y < this.min.y || a.y > this.max.y ? !1 : !0 }, containsBox: function(a) { return this.min.x <= a.min.x && a.max.x <= this.max.x && this.min.y <= a.min.y && a.max.y <= this.max.y ? !0 : !1 }, getParameter: function(a, b) { return (b || new B).set((a.x - this.min.x) / (this.max.x - this.min.x), (a.y - this.min.y) / (this.max.y - this.min.y)) }, intersectsBox: function(a) { return a.max.x < this.min.x || a.min.x > this.max.x || a.max.y < this.min.y || a.min.y > this.max.y ? !1 : !0 }, clampPoint: function(a, b) { return (b || new B).copy(a).clamp(this.min, this.max) }, distanceToPoint: function() { var a = new B; return function(b) { return a.copy(b).clamp(this.min, this.max).sub(b).length() } }(), intersect: function(a) { this.min.max(a.min); this.max.min(a.max); return this }, union: function(a) { this.min.min(a.min); this.max.max(a.max); return this }, translate: function(a) { this.min.add(a); this.max.add(a); return this }, equals: function(a) { return a.min.equals(this.min) && a.max.equals(this.max) } }; U.prototype = { constructor: U, isMaterial: !0, get needsUpdate() { return this._needsUpdate }, set needsUpdate(a) { !0 === a && this.update(); this._needsUpdate = a }, setValues: function(a) { if (void 0 !== a) for (var b in a) { var c = a[b]; if (void 0 === c) console.warn("THREE.Material: '" + b + "' parameter is undefined."); else { var d = this[b]; void 0 === d ? console.warn("THREE." + this.type + ": '" + b + "' is not a property of this material.") : d && d.isColor ? d.set(c) : d && d.isVector3 && c && c.isVector3 ? d.copy(c) : this[b] = "overdraw" === b ? Number(c) : c } } }, toJSON: function(a) { function b(a) { var b = [], c; for (c in a) { var d = a[c]; delete d.metadata; b.push(d) } return b } var c = void 0 === a; c && (a = { textures: {}, images: {} }); var d = { metadata: { version: 4.4, type: "Material", generator: "Material.toJSON" } }; d.uuid = this.uuid; d.type = this.type; "" !== this.name && (d.name = this.name); this.color && this.color.isColor && (d.color = this.color.getHex()); void 0 !== this.roughness && (d.roughness = this.roughness); void 0 !== this.metalness && (d.metalness = this.metalness); this.emissive && this.emissive.isColor && (d.emissive = this.emissive.getHex()); this.specular && this.specular.isColor && (d.specular = this.specular.getHex()); void 0 !== this.shininess && (d.shininess = this.shininess); this.map && this.map.isTexture && (d.map = this.map.toJSON(a).uuid); this.alphaMap && this.alphaMap.isTexture && (d.alphaMap = this.alphaMap.toJSON(a).uuid); this.lightMap && this.lightMap.isTexture && (d.lightMap = this.lightMap.toJSON(a).uuid); this.bumpMap && this.bumpMap.isTexture && (d.bumpMap = this.bumpMap.toJSON(a).uuid, d.bumpScale = this.bumpScale); this.normalMap && this.normalMap.isTexture && (d.normalMap = this.normalMap.toJSON(a).uuid, d.normalScale = this.normalScale.toArray()); this.displacementMap && this.displacementMap.isTexture && (d.displacementMap = this.displacementMap.toJSON(a).uuid, d.displacementScale = this.displacementScale, d.displacementBias = this.displacementBias); this.roughnessMap && this.roughnessMap.isTexture && (d.roughnessMap = this.roughnessMap.toJSON(a).uuid); this.metalnessMap && this.metalnessMap.isTexture && (d.metalnessMap = this.metalnessMap.toJSON(a).uuid); this.emissiveMap && this.emissiveMap.isTexture && (d.emissiveMap = this.emissiveMap.toJSON(a).uuid); this.specularMap && this.specularMap.isTexture && (d.specularMap = this.specularMap.toJSON(a).uuid); this.envMap && this.envMap.isTexture && (d.envMap = this.envMap.toJSON(a).uuid, d.reflectivity = this.reflectivity); void 0 !== this.size && (d.size = this.size); void 0 !== this.sizeAttenuation && (d.sizeAttenuation = this.sizeAttenuation); 1 !== this.blending && (d.blending = this.blending); 2 !== this.shading && (d.shading = this.shading); 0 !== this.side && (d.side = this.side); 0 !== this.vertexColors && (d.vertexColors = this.vertexColors); 1 > this.opacity && (d.opacity = this.opacity); !0 === this.transparent && (d.transparent = this.transparent); d.depthFunc = this.depthFunc; d.depthTest = this.depthTest; d.depthWrite = this.depthWrite; 0 < this.alphaTest && (d.alphaTest = this.alphaTest); !0 === this.premultipliedAlpha && (d.premultipliedAlpha = this.premultipliedAlpha); !0 === this.wireframe && (d.wireframe = this.wireframe); 1 < this.wireframeLinewidth && (d.wireframeLinewidth = this.wireframeLinewidth); "round" !== this.wireframeLinecap && (d.wireframeLinecap = this.wireframeLinecap); "round" !== this.wireframeLinejoin && (d.wireframeLinejoin = this.wireframeLinejoin); d.skinning = this.skinning; d.morphTargets = this.morphTargets; c && (c = b(a.textures), a = b(a.images), 0 < c.length && (d.textures = c), 0 < a.length && (d.images = a)); return d }, clone: function() { return (new this.constructor).copy(this) }, copy: function(a) { this.name = a.name; this.fog = a.fog; this.lights = a.lights; this.blending = a.blending; this.side = a.side; this.shading = a.shading; this.vertexColors = a.vertexColors; this.opacity = a.opacity; this.transparent = a.transparent; this.blendSrc = a.blendSrc; this.blendDst = a.blendDst; this.blendEquation = a.blendEquation; this.blendSrcAlpha = a.blendSrcAlpha; this.blendDstAlpha = a.blendDstAlpha; this.blendEquationAlpha = a.blendEquationAlpha; this.depthFunc = a.depthFunc; this.depthTest = a.depthTest; this.depthWrite = a.depthWrite; this.colorWrite = a.colorWrite; this.precision = a.precision; this.polygonOffset = a.polygonOffset; this.polygonOffsetFactor = a.polygonOffsetFactor; this.polygonOffsetUnits = a.polygonOffsetUnits; this.alphaTest = a.alphaTest; this.premultipliedAlpha = a.premultipliedAlpha; this.overdraw = a.overdraw; this.visible = a.visible; this.clipShadows = a.clipShadows; this.clipIntersection = a.clipIntersection; a = a.clippingPlanes; var b = null; if (null !== a) for (var c = a.length, b = Array(c), d = 0; d !== c; ++d) b[d] = a[d].clone(); this.clippingPlanes = b; return this }, update: function() { this.dispatchEvent({ type: "update" }) }, dispose: function() { this.dispatchEvent({ type: "dispose" }) } }; Object.assign(U.prototype, sa.prototype); var oe = 0; Fa.prototype = Object.create(U.prototype); Fa.prototype.constructor = Fa; Fa.prototype.isShaderMaterial = !0; Fa.prototype.copy = function(a) { U.prototype.copy.call(this, a); this.fragmentShader = a.fragmentShader; this.vertexShader = a.vertexShader; this.uniforms = La.clone(a.uniforms); this.defines = a.defines; this.wireframe = a.wireframe; this.wireframeLinewidth = a.wireframeLinewidth; this.lights = a.lights; this.clipping = a.clipping; this.skinning = a.skinning; this.morphTargets = a.morphTargets; this.morphNormals = a.morphNormals; this.extensions = a.extensions; return this } ; Fa.prototype.toJSON = function(a) { a = U.prototype.toJSON.call(this, a); a.uniforms = this.uniforms; a.vertexShader = this.vertexShader; a.fragmentShader = this.fragmentShader; return a } ; Za.prototype = Object.create(U.prototype); Za.prototype.constructor = Za; Za.prototype.isMeshDepthMaterial = !0; Za.prototype.copy = function(a) { U.prototype.copy.call(this, a); this.depthPacking = a.depthPacking; this.skinning = a.skinning; this.morphTargets = a.morphTargets; this.map = a.map; this.alphaMap = a.alphaMap; this.displacementMap = a.displacementMap; this.displacementScale = a.displacementScale; this.displacementBias = a.displacementBias; this.wireframe = a.wireframe; this.wireframeLinewidth = a.wireframeLinewidth; return this } ; Ba.prototype = { constructor: Ba, isBox3: !0, set: function(a, b) { this.min.copy(a); this.max.copy(b); return this }, setFromArray: function(a) { for (var b = Infinity, c = Infinity, d = Infinity, e = -Infinity, f = -Infinity, g = -Infinity, h = 0, k = a.length; h < k; h += 3) { var m = a[h] , l = a[h + 1] , n = a[h + 2]; m < b && (b = m); l < c && (c = l); n < d && (d = n); m > e && (e = m); l > f && (f = l); n > g && (g = n) } this.min.set(b, c, d); this.max.set(e, f, g) }, setFromPoints: function(a) { this.makeEmpty(); for (var b = 0, c = a.length; b < c; b++) this.expandByPoint(a[b]); return this }, setFromCenterAndSize: function() { var a = new q; return function(b, c) { var d = a.copy(c).multiplyScalar(.5); this.min.copy(b).sub(d); this.max.copy(b).add(d); return this } }(), setFromObject: function() { var a = new q; return function(b) { var c = this; b.updateMatrixWorld(!0); this.makeEmpty(); b.traverse(function(b) { var e = b.geometry; if (void 0 !== e) if (e && e.isGeometry) for (var e = e.vertices, f = 0, g = e.length; f < g; f++) a.copy(e[f]), a.applyMatrix4(b.matrixWorld), c.expandByPoint(a); else if (e && e.isBufferGeometry && (g = e.attributes.position, void 0 !== g)) { var h; g && g.isInterleavedBufferAttribute ? (e = g.data.array, f = g.offset, h = g.data.stride) : (e = g.array, f = 0, h = 3); for (g = e.length; f < g; f += h) a.fromArray(e, f), a.applyMatrix4(b.matrixWorld), c.expandByPoint(a) } }); return this } }(), clone: function() { return (new this.constructor).copy(this) }, copy: function(a) { this.min.copy(a.min); this.max.copy(a.max); return this }, makeEmpty: function() { this.min.x = this.min.y = this.min.z = Infinity; this.max.x = this.max.y = this.max.z = -Infinity; return this }, isEmpty: function() { return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z }, getCenter: function(a) { a = a || new q; return this.isEmpty() ? a.set(0, 0, 0) : a.addVectors(this.min, this.max).multiplyScalar(.5) }, getSize: function(a) { a = a || new q; return this.isEmpty() ? a.set(0, 0, 0) : a.subVectors(this.max, this.min) }, expandByPoint: function(a) { this.min.min(a); this.max.max(a); return this }, expandByVector: function(a) { this.min.sub(a); this.max.add(a); return this }, expandByScalar: function(a) { this.min.addScalar(-a); this.max.addScalar(a); return this }, containsPoint: function(a) { return a.x < this.min.x || a.x > this.max.x || a.y < this.min.y || a.y > this.max.y || a.z < this.min.z || a.z > this.max.z ? !1 : !0 }, containsBox: function(a) { return this.min.x <= a.min.x && a.max.x <= this.max.x && this.min.y <= a.min.y && a.max.y <= this.max.y && this.min.z <= a.min.z && a.max.z <= this.max.z ? !0 : !1 }, getParameter: function(a, b) { return (b || new q).set((a.x - this.min.x) / (this.max.x - this.min.x), (a.y - this.min.y) / (this.max.y - this.min.y), (a.z - this.min.z) / (this.max.z - this.min.z)) }, intersectsBox: function(a) { return a.max.x < this.min.x || a.min.x > this.max.x || a.max.y < this.min.y || a.min.y > this.max.y || a.max.z < this.min.z || a.min.z > this.max.z ? !1 : !0 }, intersectsSphere: function() { var a; return function(b) { void 0 === a && (a = new q); this.clampPoint(b.center, a); return a.distanceToSquared(b.center) <= b.radius * b.radius } }(), intersectsPlane: function(a) { var b, c; 0 < a.normal.x ? (b = a.normal.x * this.min.x, c = a.normal.x * this.max.x) : (b = a.normal.x * this.max.x, c = a.normal.x * this.min.x); 0 < a.normal.y ? (b += a.normal.y * this.min.y, c += a.normal.y * this.max.y) : (b += a.normal.y * this.max.y, c += a.normal.y * this.min.y); 0 < a.normal.z ? (b += a.normal.z * this.min.z, c += a.normal.z * this.max.z) : (b += a.normal.z * this.max.z, c += a.normal.z * this.min.z); return b <= a.constant && c >= a.constant }, clampPoint: function(a, b) { return (b || new q).copy(a).clamp(this.min, this.max) }, distanceToPoint: function() { var a = new q; return function(b) { return a.copy(b).clamp(this.min, this.max).sub(b).length() } }(), getBoundingSphere: function() { var a = new q; return function(b) { b = b || new Ca; this.getCenter(b.center); b.radius = .5 * this.getSize(a).length(); return b } }(), intersect: function(a) { this.min.max(a.min); this.max.min(a.max); this.isEmpty() && this.makeEmpty(); return this }, union: function(a) { this.min.min(a.min); this.max.max(a.max); return this }, applyMatrix4: function() { var a = [new q, new q, new q, new q, new q, new q, new q, new q]; return function(b) { if (this.isEmpty()) return this; a[0].set(this.min.x, this.min.y, this.min.z).applyMatrix4(b); a[1].set(this.min.x, this.min.y, this.max.z).applyMatrix4(b); a[2].set(this.min.x, this.max.y, this.min.z).applyMatrix4(b); a[3].set(this.min.x, this.max.y, this.max.z).applyMatrix4(b); a[4].set(this.max.x, this.min.y, this.min.z).applyMatrix4(b); a[5].set(this.max.x, this.min.y, this.max.z).applyMatrix4(b); a[6].set(this.max.x, this.max.y, this.min.z).applyMatrix4(b); a[7].set(this.max.x, this.max.y, this.max.z).applyMatrix4(b); this.setFromPoints(a); return this } }(), translate: function(a) { this.min.add(a); this.max.add(a); return this }, equals: function(a) { return a.min.equals(this.min) && a.max.equals(this.max) } }; Ca.prototype = { constructor: Ca, set: function(a, b) { this.center.copy(a); this.radius = b; return this }, setFromPoints: function() { var a = new Ba; return function(b, c) { var d = this.center; void 0 !== c ? d.copy(c) : a.setFromPoints(b).getCenter(d); for (var e = 0, f = 0, g = b.length; f < g; f++) e = Math.max(e, d.distanceToSquared(b[f])); this.radius = Math.sqrt(e); return this } }(), clone: function() { return (new this.constructor).copy(this) }, copy: function(a) { this.center.copy(a.center); this.radius = a.radius; return this }, empty: function() { return 0 >= this.radius }, containsPoint: function(a) { return a.distanceToSquared(this.center) <= this.radius * this.radius }, distanceToPoint: function(a) { return a.distanceTo(this.center) - this.radius }, intersectsSphere: function(a) { var b = this.radius + a.radius; return a.center.distanceToSquared(this.center) <= b * b }, intersectsBox: function(a) { return a.intersectsSphere(this) }, intersectsPlane: function(a) { return Math.abs(this.center.dot(a.normal) - a.constant) <= this.radius }, clampPoint: function(a, b) { var c = this.center.distanceToSquared(a) , d = b || new q; d.copy(a); c > this.radius * this.radius && (d.sub(this.center).normalize(), d.multiplyScalar(this.radius).add(this.center)); return d }, getBoundingBox: function(a) { a = a || new Ba; a.set(this.center, this.center); a.expandByScalar(this.radius); return a }, applyMatrix4: function(a) { this.center.applyMatrix4(a); this.radius *= a.getMaxScaleOnAxis(); return this }, translate: function(a) { this.center.add(a); return this }, equals: function(a) { return a.center.equals(this.center) && a.radius === this.radius } }; Ia.prototype = { constructor: Ia, isMatrix3: !0, set: function(a, b, c, d, e, f, g, h, k) { var m = this.elements; m[0] = a; m[1] = d; m[2] = g; m[3] = b; m[4] = e; m[5] = h; m[6] = c; m[7] = f; m[8] = k; return this }, identity: function() { this.set(1, 0, 0, 0, 1, 0, 0, 0, 1); return this }, clone: function() { return (new this.constructor).fromArray(this.elements) }, copy: function(a) { a = a.elements; this.set(a[0], a[3], a[6], a[1], a[4], a[7], a[2], a[5], a[8]); return this }, setFromMatrix4: function(a) { a = a.elements; this.set(a[0], a[4], a[8], a[1], a[5], a[9], a[2], a[6], a[10]); return this }, applyToVector3Array: function() { var a; return function(b, c, d) { void 0 === a && (a = new q); void 0 === c && (c = 0); void 0 === d && (d = b.length); for (var e = 0; e < d; e += 3, c += 3) a.fromArray(b, c), a.applyMatrix3(this), a.toArray(b, c); return b } }(), applyToBuffer: function() { var a; return function(b, c, d) { void 0 === a && (a = new q); void 0 === c && (c = 0); void 0 === d && (d = b.length / b.itemSize); for (var e = 0; e < d; e++, c++) a.x = b.getX(c), a.y = b.getY(c), a.z = b.getZ(c), a.applyMatrix3(this), b.setXYZ(c, a.x, a.y, a.z); return b } }(), multiplyScalar: function(a) { var b = this.elements; b[0] *= a; b[3] *= a; b[6] *= a; b[1] *= a; b[4] *= a; b[7] *= a; b[2] *= a; b[5] *= a; b[8] *= a; return this }, determinant: function() { var a = this.elements , b = a[0] , c = a[1] , d = a[2] , e = a[3] , f = a[4] , g = a[5] , h = a[6] , k = a[7] , a = a[8]; return b * f * a - b * g * k - c * e * a + c * g * h + d * e * k - d * f * h }, getInverse: function(a, b) { a && a.isMatrix4 && console.error("THREE.Matrix3.getInverse no longer takes a Matrix4 argument."); var c = a.elements , d = this.elements , e = c[0] , f = c[1] , g = c[2] , h = c[3] , k = c[4] , m = c[5] , l = c[6] , n = c[7] , c = c[8] , p = c * k - m * n , r = m * l - c * h , q = n * h - k * l , t = e * p + f * r + g * q; if (0 === t) { if (!0 === b) throw Error("THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0"); console.warn("THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0"); return this.identity() } t = 1 / t; d[0] = p * t; d[1] = (g * n - c * f) * t; d[2] = (m * f - g * k) * t; d[3] = r * t; d[4] = (c * e - g * l) * t; d[5] = (g * h - m * e) * t; d[6] = q * t; d[7] = (f * l - n * e) * t; d[8] = (k * e - f * h) * t; return this }, transpose: function() { var a, b = this.elements; a = b[1]; b[1] = b[3]; b[3] = a; a = b[2]; b[2] = b[6]; b[6] = a; a = b[5]; b[5] = b[7]; b[7] = a; return this }, flattenToArrayOffset: function(a, b) { console.warn("THREE.Matrix3: .flattenToArrayOffset is deprecated - just use .toArray instead."); return this.toArray(a, b) }, getNormalMatrix: function(a) { return this.setFromMatrix4(a).getInverse(this).transpose() }, transposeIntoArray: function(a) { var b = this.elements; a[0] = b[0]; a[1] = b[3]; a[2] = b[6]; a[3] = b[1]; a[4] = b[4]; a[5] = b[7]; a[6] = b[2]; a[7] = b[5]; a[8] = b[8]; return this }, fromArray: function(a, b) { void 0 === b && (b = 0); for (var c = 0; 9 > c; c++) this.elements[c] = a[c + b]; return this }, toArray: function(a, b) { void 0 === a && (a = []); void 0 === b && (b = 0); var c = this.elements; a[b] = c[0]; a[b + 1] = c[1]; a[b + 2] = c[2]; a[b + 3] = c[3]; a[b + 4] = c[4]; a[b + 5] = c[5]; a[b + 6] = c[6]; a[b + 7] = c[7]; a[b + 8] = c[8]; return a } }; va.prototype = { constructor: va, set: function(a, b) { this.normal.copy(a); this.constant = b; return this }, setComponents: function(a, b, c, d) { this.normal.set(a, b, c); this.constant = d; return this }, setFromNormalAndCoplanarPoint: function(a, b) { this.normal.copy(a); this.constant = -b.dot(this.normal); return this }, setFromCoplanarPoints: function() { var a = new q , b = new q; return function(c, d, e) { d = a.subVectors(e, d).cross(b.subVectors(c, d)).normalize(); this.setFromNormalAndCoplanarPoint(d, c); return this } }(), clone: function() { return (new this.constructor).copy(this) }, copy: function(a) { this.normal.copy(a.normal); this.constant = a.constant; return this }, normalize: function() { var a = 1 / this.normal.length(); this.normal.multiplyScalar(a); this.constant *= a; return this }, negate: function() { this.constant *= -1; this.normal.negate(); return this }, distanceToPoint: function(a) { return this.normal.dot(a) + this.constant }, distanceToSphere: function(a) { return this.distanceToPoint(a.center) - a.radius }, projectPoint: function(a, b) { return this.orthoPoint(a, b).sub(a).negate() }, orthoPoint: function(a, b) { var c = this.distanceToPoint(a); return (b || new q).copy(this.normal).multiplyScalar(c) }, intersectLine: function() { var a = new q; return function(b, c) { var d = c || new q , e = b.delta(a) , f = this.normal.dot(e); if (0 === f) { if (0 === this.distanceToPoint(b.start)) return d.copy(b.start) } else return f = -(b.start.dot(this.normal) + this.constant) / f, 0 > f || 1 < f ? void 0 : d.copy(e).multiplyScalar(f).add(b.start) } }(), intersectsLine: function(a) { var b = this.distanceToPoint(a.start); a = this.distanceToPoint(a.end); return 0 > b && 0 < a || 0 > a && 0 < b }, intersectsBox: function(a) { return a.intersectsPlane(this) }, intersectsSphere: function(a) { return a.intersectsPlane(this) }, coplanarPoint: function(a) { return (a || new q).copy(this.normal).multiplyScalar(-this.constant) }, applyMatrix4: function() { var a = new q , b = new Ia; return function(c, d) { var e = this.coplanarPoint(a).applyMatrix4(c) , f = d || b.getNormalMatrix(c) , f = this.normal.applyMatrix3(f).normalize(); this.constant = -e.dot(f); return this } }(), translate: function(a) { this.constant -= a.dot(this.normal); return this }, equals: function(a) { return a.normal.equals(this.normal) && a.constant === this.constant } }; nc.prototype = { constructor: nc, set: function(a, b, c, d, e, f) { var g = this.planes; g[0].copy(a); g[1].copy(b); g[2].copy(c); g[3].copy(d); g[4].copy(e); g[5].copy(f); return this }, clone: function() { return (new this.constructor).copy(this) }, copy: function(a) { for (var b = this.planes, c = 0; 6 > c; c++) b[c].copy(a.planes[c]); return this }, setFromMatrix: function(a) { var b = this.planes , c = a.elements; a = c[0]; var d = c[1] , e = c[2] , f = c[3] , g = c[4] , h = c[5] , k = c[6] , m = c[7] , l = c[8] , n = c[9] , p = c[10] , r = c[11] , q = c[12] , t = c[13] , D = c[14] , c = c[15]; b[0].setComponents(f - a, m - g, r - l, c - q).normalize(); b[1].setComponents(f + a, m + g, r + l, c + q).normalize(); b[2].setComponents(f + d, m + h, r + n, c + t).normalize(); b[3].setComponents(f - d, m - h, r - n, c - t).normalize(); b[4].setComponents(f - e, m - k, r - p, c - D).normalize(); b[5].setComponents(f + e, m + k, r + p, c + D).normalize(); return this }, intersectsObject: function() { var a = new Ca; return function(b) { var c = b.geometry; null === c.boundingSphere && c.computeBoundingSphere(); a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld); return this.intersectsSphere(a) } }(), intersectsSprite: function() { var a = new Ca; return function(b) { a.center.set(0, 0, 0); a.radius = .7071067811865476; a.applyMatrix4(b.matrixWorld); return this.intersectsSphere(a) } }(), intersectsSphere: function(a) { var b = this.planes , c = a.center; a = -a.radius; for (var d = 0; 6 > d; d++) if (b[d].distanceToPoint(c) < a) return !1; return !0 }, intersectsBox: function() { var a = new q , b = new q; return function(c) { for (var d = this.planes, e = 0; 6 > e; e++) { var f = d[e]; a.x = 0 < f.normal.x ? c.min.x : c.max.x; b.x = 0 < f.normal.x ? c.max.x : c.min.x; a.y = 0 < f.normal.y ? c.min.y : c.max.y; b.y = 0 < f.normal.y ? c.max.y : c.min.y; a.z = 0 < f.normal.z ? c.min.z : c.max.z; b.z = 0 < f.normal.z ? c.max.z : c.min.z; var g = f.distanceToPoint(a) , f = f.distanceToPoint(b); if (0 > g && 0 > f) return !1 } return !0 } }(), containsPoint: function(a) { for (var b = this.planes, c = 0; 6 > c; c++) if (0 > b[c].distanceToPoint(a)) return !1; return !0 } }; ab.prototype = { constructor: ab, set: function(a, b) { this.origin.copy(a); this.direction.copy(b); return this }, clone: function() { return (new this.constructor).copy(this) }, copy: function(a) { this.origin.copy(a.origin); this.direction.copy(a.direction); return this }, at: function(a, b) { return (b || new q).copy(this.direction).multiplyScalar(a).add(this.origin) }, lookAt: function(a) { this.direction.copy(a).sub(this.origin).normalize(); return this }, recast: function() { var a = new q; return function(b) { this.origin.copy(this.at(b, a)); return this } }(), closestPointToPoint: function(a, b) { var c = b || new q; c.subVectors(a, this.origin); var d = c.dot(this.direction); return 0 > d ? c.copy(this.origin) : c.copy(this.direction).multiplyScalar(d).add(this.origin) }, distanceToPoint: function(a) { return Math.sqrt(this.distanceSqToPoint(a)) }, distanceSqToPoint: function() { var a = new q; return function(b) { var c = a.subVectors(b, this.origin).dot(this.direction); if (0 > c) return this.origin.distanceToSquared(b); a.copy(this.direction).multiplyScalar(c).add(this.origin); return a.distanceToSquared(b) } }(), distanceSqToSegment: function() { var a = new q , b = new q , c = new q; return function(d, e, f, g) { a.copy(d).add(e).multiplyScalar(.5); b.copy(e).sub(d).normalize(); c.copy(this.origin).sub(a); var h = .5 * d.distanceTo(e), k = -this.direction.dot(b), m = c.dot(this.direction), l = -c.dot(b), n = c.lengthSq(), p = Math.abs(1 - k * k), r; 0 < p ? (d = k * l - m, e = k * m - l, r = h * p, 0 <= d ? e >= -r ? e <= r ? (h = 1 / p, d *= h, e *= h, k = d * (d + k * e + 2 * m) + e * (k * d + e + 2 * l) + n) : (e = h, d = Math.max(0, -(k * e + m)), k = -d * d + e * (e + 2 * l) + n) : (e = -h, d = Math.max(0, -(k * e + m)), k = -d * d + e * (e + 2 * l) + n) : e <= -r ? (d = Math.max(0, -(-k * h + m)), e = 0 < d ? -h : Math.min(Math.max(-h, -l), h), k = -d * d + e * (e + 2 * l) + n) : e <= r ? (d = 0, e = Math.min(Math.max(-h, -l), h), k = e * (e + 2 * l) + n) : (d = Math.max(0, -(k * h + m)), e = 0 < d ? h : Math.min(Math.max(-h, -l), h), k = -d * d + e * (e + 2 * l) + n)) : (e = 0 < k ? -h : h, d = Math.max(0, -(k * e + m)), k = -d * d + e * (e + 2 * l) + n); f && f.copy(this.direction).multiplyScalar(d).add(this.origin); g && g.copy(b).multiplyScalar(e).add(a); return k } }(), intersectSphere: function() { var a = new q; return function(b, c) { a.subVectors(b.center, this.origin); var d = a.dot(this.direction) , e = a.dot(a) - d * d , f = b.radius * b.radius; if (e > f) return null; f = Math.sqrt(f - e); e = d - f; d += f; return 0 > e && 0 > d ? null : 0 > e ? this.at(d, c) : this.at(e, c) } }(), intersectsSphere: function(a) { return this.distanceToPoint(a.center) <= a.radius }, distanceToPlane: function(a) { var b = a.normal.dot(this.direction); if (0 === b) return 0 === a.distanceToPoint(this.origin) ? 0 : null; a = -(this.origin.dot(a.normal) + a.constant) / b; return 0 <= a ? a : null }, intersectPlane: function(a, b) { var c = this.distanceToPlane(a); return null === c ? null : this.at(c, b) }, intersectsPlane: function(a) { var b = a.distanceToPoint(this.origin); return 0 === b || 0 > a.normal.dot(this.direction) * b ? !0 : !1 }, intersectBox: function(a, b) { var c, d, e, f, g; d = 1 / this.direction.x; f = 1 / this.direction.y; g = 1 / this.direction.z; var h = this.origin; 0 <= d ? (c = (a.min.x - h.x) * d, d *= a.max.x - h.x) : (c = (a.max.x - h.x) * d, d *= a.min.x - h.x); 0 <= f ? (e = (a.min.y - h.y) * f, f *= a.max.y - h.y) : (e = (a.max.y - h.y) * f, f *= a.min.y - h.y); if (c > f || e > d) return null; if (e > c || c !== c) c = e; if (f < d || d !== d) d = f; 0 <= g ? (e = (a.min.z - h.z) * g, g *= a.max.z - h.z) : (e = (a.max.z - h.z) * g, g *= a.min.z - h.z); if (c > g || e > d) return null; if (e > c || c !== c) c = e; if (g < d || d !== d) d = g; return 0 > d ? null : this.at(0 <= c ? c : d, b) }, intersectsBox: function() { var a = new q; return function(b) { return null !== this.intersectBox(b, a) } }(), intersectTriangle: function() { var a = new q , b = new q , c = new q , d = new q; return function(e, f, g, h, k) { b.subVectors(f, e); c.subVectors(g, e); d.crossVectors(b, c); f = this.direction.dot(d); if (0 < f) { if (h) return null; h = 1 } else if (0 > f) h = -1, f = -f; else return null; a.subVectors(this.origin, e); e = h * this.direction.dot(c.crossVectors(a, c)); if (0 > e) return null; g = h * this.direction.dot(b.cross(a)); if (0 > g || e + g > f) return null; e = -h * a.dot(d); return 0 > e ? null : this.at(e / f, k) } }(), applyMatrix4: function(a) { this.direction.add(this.origin).applyMatrix4(a); this.origin.applyMatrix4(a); this.direction.sub(this.origin); this.direction.normalize(); return this }, equals: function(a) { return a.origin.equals(this.origin) && a.direction.equals(this.direction) } }; bb.RotationOrders = "XYZ YZX ZXY XZY YXZ ZYX".split(" "); bb.DefaultOrder = "XYZ"; bb.prototype = { constructor: bb, isEuler: !0, get x() { return this._x }, set x(a) { this._x = a; this.onChangeCallback() }, get y() { return this._y }, set y(a) { this._y = a; this.onChangeCallback() }, get z() { return this._z }, set z(a) { this._z = a; this.onChangeCallback() }, get order() { return this._order }, set order(a) { this._order = a; this.onChangeCallback() }, set: function(a, b, c, d) { this._x = a; this._y = b; this._z = c; this._order = d || this._order; this.onChangeCallback(); return this }, clone: function() { return new this.constructor(this._x,this._y,this._z,this._order) }, copy: function(a) { this._x = a._x; this._y = a._y; this._z = a._z; this._order = a._order; this.onChangeCallback(); return this }, setFromRotationMatrix: function(a, b, c) { var d = T.clamp , e = a.elements; a = e[0]; var f = e[4] , g = e[8] , h = e[1] , k = e[5] , m = e[9] , l = e[2] , n = e[6] , e = e[10]; b = b || this._order; "XYZ" === b ? (this._y = Math.asin(d(g, -1, 1)), .99999 > Math.abs(g) ? (this._x = Math.atan2(-m, e), this._z = Math.atan2(-f, a)) : (this._x = Math.atan2(n, k), this._z = 0)) : "YXZ" === b ? (this._x = Math.asin(-d(m, -1, 1)), .99999 > Math.abs(m) ? (this._y = Math.atan2(g, e), this._z = Math.atan2(h, k)) : (this._y = Math.atan2(-l, a), this._z = 0)) : "ZXY" === b ? (this._x = Math.asin(d(n, -1, 1)), .99999 > Math.abs(n) ? (this._y = Math.atan2(-l, e), this._z = Math.atan2(-f, k)) : (this._y = 0, this._z = Math.atan2(h, a))) : "ZYX" === b ? (this._y = Math.asin(-d(l, -1, 1)), .99999 > Math.abs(l) ? (this._x = Math.atan2(n, e), this._z = Math.atan2(h, a)) : (this._x = 0, this._z = Math.atan2(-f, k))) : "YZX" === b ? (this._z = Math.asin(d(h, -1, 1)), .99999 > Math.abs(h) ? (this._x = Math.atan2(-m, k), this._y = Math.atan2(-l, a)) : (this._x = 0, this._y = Math.atan2(g, e))) : "XZY" === b ? (this._z = Math.asin(-d(f, -1, 1)), .99999 > Math.abs(f) ? (this._x = Math.atan2(n, k), this._y = Math.atan2(g, a)) : (this._x = Math.atan2(-m, e), this._y = 0)) : console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: " + b); this._order = b; if (!1 !== c) this.onChangeCallback(); return this }, setFromQuaternion: function() { var a; return function(b, c, d) { void 0 === a && (a = new J); a.makeRotationFromQuaternion(b); return this.setFromRotationMatrix(a, c, d) } }(), setFromVector3: function(a, b) { return this.set(a.x, a.y, a.z, b || this._order) }, reorder: function() { var a = new ba; return function(b) { a.setFromEuler(this); return this.setFromQuaternion(a, b) } }(), equals: function(a) { return a._x === this._x && a._y === this._y && a._z === this._z && a._order === this._order }, fromArray: function(a) { this._x = a[0]; this._y = a[1]; this._z = a[2]; void 0 !== a[3] && (this._order = a[3]); this.onChangeCallback(); return this }, toArray: function(a, b) { void 0 === a && (a = []); void 0 === b && (b = 0); a[b] = this._x; a[b + 1] = this._y; a[b + 2] = this._z; a[b + 3] = this._order; return a }, toVector3: function(a) { return a ? a.set(this._x, this._y, this._z) : new q(this._x,this._y,this._z) }, onChange: function(a) { this.onChangeCallback = a; return this }, onChangeCallback: function() {} }; Yc.prototype = { constructor: Yc, set: function(a) { this.mask = 1 << a }, enable: function(a) { this.mask |= 1 << a }, toggle: function(a) { this.mask ^= 1 << a }, disable: function(a) { this.mask &= ~(1 << a) }, test: function(a) { return 0 !== (this.mask & a.mask) } }; z.DefaultUp = new q(0,1,0); z.DefaultMatrixAutoUpdate = !0; Object.assign(z.prototype, sa.prototype, { isObject3D: !0, applyMatrix: function(a) { this.matrix.multiplyMatrices(a, this.matrix); this.matrix.decompose(this.position, this.quaternion, this.scale) }, setRotationFromAxisAngle: function(a, b) { this.quaternion.setFromAxisAngle(a, b) }, setRotationFromEuler: function(a) { this.quaternion.setFromEuler(a, !0) }, setRotationFromMatrix: function(a) { this.quaternion.setFromRotationMatrix(a) }, setRotationFromQuaternion: function(a) { this.quaternion.copy(a) }, rotateOnAxis: function() { var a = new ba; return function(b, c) { a.setFromAxisAngle(b, c); this.quaternion.multiply(a); return this } }(), rotateX: function() { var a = new q(1,0,0); return function(b) { return this.rotateOnAxis(a, b) } }(), rotateY: function() { var a = new q(0,1,0); return function(b) { return this.rotateOnAxis(a, b) } }(), rotateZ: function() { var a = new q(0,0,1); return function(b) { return this.rotateOnAxis(a, b) } }(), translateOnAxis: function() { var a = new q; return function(b, c) { a.copy(b).applyQuaternion(this.quaternion); this.position.add(a.multiplyScalar(c)); return this } }(), translateX: function() { var a = new q(1,0,0); return function(b) { return this.translateOnAxis(a, b) } }(), translateY: function() { var a = new q(0,1,0); return function(b) { return this.translateOnAxis(a, b) } }(), translateZ: function() { var a = new q(0,0,1); return function(b) { return this.translateOnAxis(a, b) } }(), localToWorld: function(a) { return a.applyMatrix4(this.matrixWorld) }, worldToLocal: function() { var a = new J; return function(b) { return b.applyMatrix4(a.getInverse(this.matrixWorld)) } }(), lookAt: function() { var a = new J; return function(b) { a.lookAt(b, this.position, this.up); this.quaternion.setFromRotationMatrix(a) } }(), add: function(a) { if (1 < arguments.length) { for (var b = 0; b < arguments.length; b++) this.add(arguments[b]); return this } if (a === this) return console.error("THREE.Object3D.add: object can't be added as a child of itself.", a), this; a && a.isObject3D ? (null !== a.parent && a.parent.remove(a), a.parent = this, a.dispatchEvent({ type: "added" }), this.children.push(a)) : console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.", a); return this }, remove: function(a) { if (1 < arguments.length) for (var b = 0; b < arguments.length; b++) this.remove(arguments[b]); b = this.children.indexOf(a); -1 !== b && (a.parent = null, a.dispatchEvent({ type: "removed" }), this.children.splice(b, 1)) }, getObjectById: function(a) { return this.getObjectByProperty("id", a) }, getObjectByName: function(a) { return this.getObjectByProperty("name", a) }, getObjectByProperty: function(a, b) { if (this[a] === b) return this; for (var c = 0, d = this.children.length; c < d; c++) { var e = this.children[c].getObjectByProperty(a, b); if (void 0 !== e) return e } }, getWorldPosition: function(a) { a = a || new q; this.updateMatrixWorld(!0); return a.setFromMatrixPosition(this.matrixWorld) }, getWorldQuaternion: function() { var a = new q , b = new q; return function(c) { c = c || new ba; this.updateMatrixWorld(!0); this.matrixWorld.decompose(a, c, b); return c } }(), getWorldRotation: function() { var a = new ba; return function(b) { b = b || new bb; this.getWorldQuaternion(a); return b.setFromQuaternion(a, this.rotation.order, !1) } }(), getWorldScale: function() { var a = new q , b = new ba; return function(c) { c = c || new q; this.updateMatrixWorld(!0); this.matrixWorld.decompose(a, b, c); return c } }(), getWorldDirection: function() { var a = new ba; return function(b) { b = b || new q; this.getWorldQuaternion(a); return b.set(0, 0, 1).applyQuaternion(a) } }(), raycast: function() {}, traverse: function(a) { a(this); for (var b = this.children, c = 0, d = b.length; c < d; c++) b[c].traverse(a) }, traverseVisible: function(a) { if (!1 !== this.visible) { a(this); for (var b = this.children, c = 0, d = b.length; c < d; c++) b[c].traverseVisible(a) } }, traverseAncestors: function(a) { var b = this.parent; null !== b && (a(b), b.traverseAncestors(a)) }, updateMatrix: function() { this.matrix.compose(this.position, this.quaternion, this.scale); this.matrixWorldNeedsUpdate = !0 }, updateMatrixWorld: function(a) { !0 === this.matrixAutoUpdate && this.updateMatrix(); if (!0 === this.matrixWorldNeedsUpdate || !0 === a) null === this.parent ? this.matrixWorld.copy(this.matrix) : this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix), this.matrixWorldNeedsUpdate = !1, a = !0; for (var b = this.children, c = 0, d = b.length; c < d; c++) b[c].updateMatrixWorld(a) }, toJSON: function(a) { function b(a) { var b = [], c; for (c in a) { var d = a[c]; delete d.metadata; b.push(d) } return b } var c = void 0 === a || "" === a , d = {}; c && (a = { geometries: {}, materials: {}, textures: {}, images: {} }, d.metadata = { version: 4.4, type: "Object", generator: "Object3D.toJSON" }); var e = {}; e.uuid = this.uuid; e.type = this.type; "" !== this.name && (e.name = this.name); "{}" !== JSON.stringify(this.userData) && (e.userData = this.userData); !0 === this.castShadow && (e.castShadow = !0); !0 === this.receiveShadow && (e.receiveShadow = !0); !1 === this.visible && (e.visible = !1); e.matrix = this.matrix.toArray(); void 0 !== this.geometry && (void 0 === a.geometries[this.geometry.uuid] && (a.geometries[this.geometry.uuid] = this.geometry.toJSON(a)), e.geometry = this.geometry.uuid); void 0 !== this.material && (void 0 === a.materials[this.material.uuid] && (a.materials[this.material.uuid] = this.material.toJSON(a)), e.material = this.material.uuid); if (0 < this.children.length) { e.children = []; for (var f = 0; f < this.children.length; f++) e.children.push(this.children[f].toJSON(a).object) } if (c) { var c = b(a.geometries) , f = b(a.materials) , g = b(a.textures); a = b(a.images); 0 < c.length && (d.geometries = c); 0 < f.length && (d.materials = f); 0 < g.length && (d.textures = g); 0 < a.length && (d.images = a) } d.object = e; return d }, clone: function(a) { return (new this.constructor).copy(this, a) }, copy: function(a, b) { void 0 === b && (b = !0); this.name = a.name; this.up.copy(a.up); this.position.copy(a.position); this.quaternion.copy(a.quaternion); this.scale.copy(a.scale); this.matrix.copy(a.matrix); this.matrixWorld.copy(a.matrixWorld); this.matrixAutoUpdate = a.matrixAutoUpdate; this.matrixWorldNeedsUpdate = a.matrixWorldNeedsUpdate; this.visible = a.visible; this.castShadow = a.castShadow; this.receiveShadow = a.receiveShadow; this.frustumCulled = a.frustumCulled; this.renderOrder = a.renderOrder; this.userData = JSON.parse(JSON.stringify(a.userData)); if (!0 === b) for (var c = 0; c < a.children.length; c++) this.add(a.children[c].clone()); return this } }); var qe = 0; gb.prototype = { constructor: gb, set: function(a, b) { this.start.copy(a); this.end.copy(b); return this }, clone: function() { return (new this.constructor).copy(this) }, copy: function(a) { this.start.copy(a.start); this.end.copy(a.end); return this }, getCenter: function(a) { return (a || new q).addVectors(this.start, this.end).multiplyScalar(.5) }, delta: function(a) { return (a || new q).subVectors(this.end, this.start) }, distanceSq: function() { return this.start.distanceToSquared(this.end) }, distance: function() { return this.start.distanceTo(this.end) }, at: function(a, b) { var c = b || new q; return this.delta(c).multiplyScalar(a).add(this.start) }, closestPointToPointParameter: function() { var a = new q , b = new q; return function(c, d) { a.subVectors(c, this.start); b.subVectors(this.end, this.start); var e = b.dot(b) , e = b.dot(a) / e; d && (e = T.clamp(e, 0, 1)); return e } }(), closestPointToPoint: function(a, b, c) { a = this.closestPointToPointParameter(a, b); c = c || new q; return this.delta(c).multiplyScalar(a).add(this.start) }, applyMatrix4: function(a) { this.start.applyMatrix4(a); this.end.applyMatrix4(a); return this }, equals: function(a) { return a.start.equals(this.start) && a.end.equals(this.end) } }; wa.normal = function() { var a = new q; return function(b, c, d, e) { e = e || new q; e.subVectors(d, c); a.subVectors(b, c); e.cross(a); b = e.lengthSq(); return 0 < b ? e.multiplyScalar(1 / Math.sqrt(b)) : e.set(0, 0, 0) } }(); wa.barycoordFromPoint = function() { var a = new q , b = new q , c = new q; return function(d, e, f, g, h) { a.subVectors(g, e); b.subVectors(f, e); c.subVectors(d, e); d = a.dot(a); e = a.dot(b); f = a.dot(c); var k = b.dot(b); g = b.dot(c); var m = d * k - e * e; h = h || new q; if (0 === m) return h.set(-2, -1, -1); m = 1 / m; k = (k * f - e * g) * m; d = (d * g - e * f) * m; return h.set(1 - k - d, d, k) } }(); wa.containsPoint = function() { var a = new q; return function(b, c, d, e) { b = wa.barycoordFromPoint(b, c, d, e, a); return 0 <= b.x && 0 <= b.y && 1 >= b.x + b.y } }(); wa.prototype = { constructor: wa, set: function(a, b, c) { this.a.copy(a); this.b.copy(b); this.c.copy(c); return this }, setFromPointsAndIndices: function(a, b, c, d) { this.a.copy(a[b]); this.b.copy(a[c]); this.c.copy(a[d]); return this }, clone: function() { return (new this.constructor).copy(this) }, copy: function(a) { this.a.copy(a.a); this.b.copy(a.b); this.c.copy(a.c); return this }, area: function() { var a = new q , b = new q; return function() { a.subVectors(this.c, this.b); b.subVectors(this.a, this.b); return .5 * a.cross(b).length() } }(), midpoint: function(a) { return (a || new q).addVectors(this.a, this.b).add(this.c).multiplyScalar(1 / 3) }, normal: function(a) { return wa.normal(this.a, this.b, this.c, a) }, plane: function(a) { return (a || new va).setFromCoplanarPoints(this.a, this.b, this.c) }, barycoordFromPoint: function(a, b) { return wa.barycoordFromPoint(a, this.a, this.b, this.c, b) }, containsPoint: function(a) { return wa.containsPoint(a, this.a, this.b, this.c) }, closestPointToPoint: function() { var a, b, c, d; return function(e, f) { void 0 === a && (a = new va, b = [new gb, new gb, new gb], c = new q, d = new q); var g = f || new q , h = Infinity; a.setFromCoplanarPoints(this.a, this.b, this.c); a.projectPoint(e, c); if (!0 === this.containsPoint(c)) g.copy(c); else { b[0].set(this.a, this.b); b[1].set(this.b, this.c); b[2].set(this.c, this.a); for (var k = 0; k < b.length; k++) { b[k].closestPointToPoint(c, !0, d); var m = c.distanceToSquared(d); m < h && (h = m, g.copy(d)) } } return g } }(), equals: function(a) { return a.a.equals(this.a) && a.b.equals(this.b) && a.c.equals(this.c) } }; ea.prototype = { constructor: ea, clone: function() { return (new this.constructor).copy(this) }, copy: function(a) { this.a = a.a; this.b = a.b; this.c = a.c; this.normal.copy(a.normal); this.color.copy(a.color); this.materialIndex = a.materialIndex; for (var b = 0, c = a.vertexNormals.length; b < c; b++) this.vertexNormals[b] = a.vertexNormals[b].clone(); b = 0; for (c = a.vertexColors.length; b < c; b++) this.vertexColors[b] = a.vertexColors[b].clone(); return this } }; Ma.prototype = Object.create(U.prototype); Ma.prototype.constructor = Ma; Ma.prototype.isMeshBasicMaterial = !0; Ma.prototype.copy = function(a) { U.prototype.copy.call(this, a); this.color.copy(a.color); this.map = a.map; this.aoMap = a.aoMap; this.aoMapIntensity = a.aoMapIntensity; this.specularMap = a.specularMap; this.alphaMap = a.alphaMap; this.envMap = a.envMap; this.combine = a.combine; this.reflectivity = a.reflectivity; this.refractionRatio = a.refractionRatio; this.wireframe = a.wireframe; this.wireframeLinewidth = a.wireframeLinewidth; this.wireframeLinecap = a.wireframeLinecap; this.wireframeLinejoin = a.wireframeLinejoin; this.skinning = a.skinning; this.morphTargets = a.morphTargets; return this } ; C.prototype = { constructor: C, isBufferAttribute: !0, set needsUpdate(a) { !0 === a && this.version++ }, setArray: function(a) { if (Array.isArray(a)) throw new TypeError("THREE.BufferAttribute: array should be a Typed Array."); this.count = void 0 !== a ? a.length / this.itemSize : 0; this.array = a }, setDynamic: function(a) { this.dynamic = a; return this }, copy: function(a) { this.array = new a.array.constructor(a.array); this.itemSize = a.itemSize; this.count = a.count; this.normalized = a.normalized; this.dynamic = a.dynamic; return this }, copyAt: function(a, b, c) { a *= this.itemSize; c *= b.itemSize; for (var d = 0, e = this.itemSize; d < e; d++) this.array[a + d] = b.array[c + d]; return this }, copyArray: function(a) { this.array.set(a); return this }, copyColorsArray: function(a) { for (var b = this.array, c = 0, d = 0, e = a.length; d < e; d++) { var f = a[d]; void 0 === f && (console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined", d), f = new O); b[c++] = f.r; b[c++] = f.g; b[c++] = f.b } return this }, copyIndicesArray: function(a) { for (var b = this.array, c = 0, d = 0, e = a.length; d < e; d++) { var f = a[d]; b[c++] = f.a; b[c++] = f.b; b[c++] = f.c } return this }, copyVector2sArray: function(a) { for (var b = this.array, c = 0, d = 0, e = a.length; d < e; d++) { var f = a[d]; void 0 === f && (console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined", d), f = new B); b[c++] = f.x; b[c++] = f.y } return this }, copyVector3sArray: function(a) { for (var b = this.array, c = 0, d = 0, e = a.length; d < e; d++) { var f = a[d]; void 0 === f && (console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined", d), f = new q); b[c++] = f.x; b[c++] = f.y; b[c++] = f.z } return this }, copyVector4sArray: function(a) { for (var b = this.array, c = 0, d = 0, e = a.length; d < e; d++) { var f = a[d]; void 0 === f && (console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined", d), f = new ga); b[c++] = f.x; b[c++] = f.y; b[c++] = f.z; b[c++] = f.w } return this }, set: function(a, b) { void 0 === b && (b = 0); this.array.set(a, b); return this }, getX: function(a) { return this.array[a * this.itemSize] }, setX: function(a, b) { this.array[a * this.itemSize] = b; return this }, getY: function(a) { return this.array[a * this.itemSize + 1] }, setY: function(a, b) { this.array[a * this.itemSize + 1] = b; return this }, getZ: function(a) { return this.array[a * this.itemSize + 2] }, setZ: function(a, b) { this.array[a * this.itemSize + 2] = b; return this }, getW: function(a) { return this.array[a * this.itemSize + 3] }, setW: function(a, b) { this.array[a * this.itemSize + 3] = b; return this }, setXY: function(a, b, c) { a *= this.itemSize; this.array[a + 0] = b; this.array[a + 1] = c; return this }, setXYZ: function(a, b, c, d) { a *= this.itemSize; this.array[a + 0] = b; this.array[a + 1] = c; this.array[a + 2] = d; return this }, setXYZW: function(a, b, c, d, e) { a *= this.itemSize; this.array[a + 0] = b; this.array[a + 1] = c; this.array[a + 2] = d; this.array[a + 3] = e; return this }, clone: function() { return (new this.constructor).copy(this) } }; Object.assign(Q.prototype, sa.prototype, { isGeometry: !0, applyMatrix: function(a) { for (var b = (new Ia).getNormalMatrix(a), c = 0, d = this.vertices.length; c < d; c++) this.vertices[c].applyMatrix4(a); c = 0; for (d = this.faces.length; c < d; c++) { a = this.faces[c]; a.normal.applyMatrix3(b).normalize(); for (var e = 0, f = a.vertexNormals.length; e < f; e++) a.vertexNormals[e].applyMatrix3(b).normalize() } null !== this.boundingBox && this.computeBoundingBox(); null !== this.boundingSphere && this.computeBoundingSphere(); this.normalsNeedUpdate = this.verticesNeedUpdate = !0; return this }, rotateX: function() { var a; return function(b) { void 0 === a && (a = new J); a.makeRotationX(b); this.applyMatrix(a); return this } }(), rotateY: function() { var a; return function(b) { void 0 === a && (a = new J); a.makeRotationY(b); this.applyMatrix(a); return this } }(), rotateZ: function() { var a; return function(b) { void 0 === a && (a = new J); a.makeRotationZ(b); this.applyMatrix(a); return this } }(), translate: function() { var a; return function(b, c, d) { void 0 === a && (a = new J); a.makeTranslation(b, c, d); this.applyMatrix(a); return this } }(), scale: function() { var a; return function(b, c, d) { void 0 === a && (a = new J); a.makeScale(b, c, d); this.applyMatrix(a); return this } }(), lookAt: function() { var a; return function(b) { void 0 === a && (a = new z); a.lookAt(b); a.updateMatrix(); this.applyMatrix(a.matrix) } }(), fromBufferGeometry: function(a) { function b(a, b, d, e) { var f = void 0 !== g ? [l[a].clone(), l[b].clone(), l[d].clone()] : [] , r = void 0 !== h ? [c.colors[a].clone(), c.colors[b].clone(), c.colors[d].clone()] : []; e = new ea(a,b,d,f,r,e); c.faces.push(e); void 0 !== k && c.faceVertexUvs[0].push([n[a].clone(), n[b].clone(), n[d].clone()]); void 0 !== m && c.faceVertexUvs[1].push([p[a].clone(), p[b].clone(), p[d].clone()]) } var c = this , d = null !== a.index ? a.index.array : void 0 , e = a.attributes , f = e.position.array , g = void 0 !== e.normal ? e.normal.array : void 0 , h = void 0 !== e.color ? e.color.array : void 0 , k = void 0 !== e.uv ? e.uv.array : void 0 , m = void 0 !== e.uv2 ? e.uv2.array : void 0; void 0 !== m && (this.faceVertexUvs[1] = []); for (var l = [], n = [], p = [], r = e = 0; e < f.length; e += 3, r += 2) c.vertices.push(new q(f[e],f[e + 1],f[e + 2])), void 0 !== g && l.push(new q(g[e],g[e + 1],g[e + 2])), void 0 !== h && c.colors.push(new O(h[e],h[e + 1],h[e + 2])), void 0 !== k && n.push(new B(k[r],k[r + 1])), void 0 !== m && p.push(new B(m[r],m[r + 1])); if (void 0 !== d) if (f = a.groups, 0 < f.length) for (e = 0; e < f.length; e++) for (var x = f[e], t = x.start, D = x.count, r = t, t = t + D; r < t; r += 3) b(d[r], d[r + 1], d[r + 2], x.materialIndex); else for (e = 0; e < d.length; e += 3) b(d[e], d[e + 1], d[e + 2]); else for (e = 0; e < f.length / 3; e += 3) b(e, e + 1, e + 2); this.computeFaceNormals(); null !== a.boundingBox && (this.boundingBox = a.boundingBox.clone()); null !== a.boundingSphere && (this.boundingSphere = a.boundingSphere.clone()); return this }, center: function() { this.computeBoundingBox(); var a = this.boundingBox.getCenter().negate(); this.translate(a.x, a.y, a.z); return a }, normalize: function() { this.computeBoundingSphere(); var a = this.boundingSphere.center , b = this.boundingSphere.radius , b = 0 === b ? 1 : 1 / b , c = new J; c.set(b, 0, 0, -b * a.x, 0, b, 0, -b * a.y, 0, 0, b, -b * a.z, 0, 0, 0, 1); this.applyMatrix(c); return this }, computeFaceNormals: function() { for (var a = new q, b = new q, c = 0, d = this.faces.length; c < d; c++) { var e = this.faces[c] , f = this.vertices[e.a] , g = this.vertices[e.b]; a.subVectors(this.vertices[e.c], g); b.subVectors(f, g); a.cross(b); a.normalize(); e.normal.copy(a) } }, computeVertexNormals: function(a) { void 0 === a && (a = !0); var b, c, d; d = Array(this.vertices.length); b = 0; for (c = this.vertices.length; b < c; b++) d[b] = new q; if (a) { var e, f, g, h = new q, k = new q; a = 0; for (b = this.faces.length; a < b; a++) c = this.faces[a], e = this.vertices[c.a], f = this.vertices[c.b], g = this.vertices[c.c], h.subVectors(g, f), k.subVectors(e, f), h.cross(k), d[c.a].add(h), d[c.b].add(h), d[c.c].add(h) } else for (this.computeFaceNormals(), a = 0, b = this.faces.length; a < b; a++) c = this.faces[a], d[c.a].add(c.normal), d[c.b].add(c.normal), d[c.c].add(c.normal); b = 0; for (c = this.vertices.length; b < c; b++) d[b].normalize(); a = 0; for (b = this.faces.length; a < b; a++) c = this.faces[a], e = c.vertexNormals, 3 === e.length ? (e[0].copy(d[c.a]), e[1].copy(d[c.b]), e[2].copy(d[c.c])) : (e[0] = d[c.a].clone(), e[1] = d[c.b].clone(), e[2] = d[c.c].clone()); 0 < this.faces.length && (this.normalsNeedUpdate = !0) }, computeFlatVertexNormals: function() { var a, b, c; this.computeFaceNormals(); a = 0; for (b = this.faces.length; a < b; a++) { c = this.faces[a]; var d = c.vertexNormals; 3 === d.length ? (d[0].copy(c.normal), d[1].copy(c.normal), d[2].copy(c.normal)) : (d[0] = c.normal.clone(), d[1] = c.normal.clone(), d[2] = c.normal.clone()) } 0 < this.faces.length && (this.normalsNeedUpdate = !0) }, computeMorphNormals: function() { var a, b, c, d, e; c = 0; for (d = this.faces.length; c < d; c++) for (e = this.faces[c], e.__originalFaceNormal ? e.__originalFaceNormal.copy(e.normal) : e.__originalFaceNormal = e.normal.clone(), e.__originalVertexNormals || (e.__originalVertexNormals = []), a = 0, b = e.vertexNormals.length; a < b; a++) e.__originalVertexNormals[a] ? e.__originalVertexNormals[a].copy(e.vertexNormals[a]) : e.__originalVertexNormals[a] = e.vertexNormals[a].clone(); var f = new Q; f.faces = this.faces; a = 0; for (b = this.morphTargets.length; a < b; a++) { if (!this.morphNormals[a]) { this.morphNormals[a] = {}; this.morphNormals[a].faceNormals = []; this.morphNormals[a].vertexNormals = []; e = this.morphNormals[a].faceNormals; var g = this.morphNormals[a].vertexNormals, h, k; c = 0; for (d = this.faces.length; c < d; c++) h = new q, k = { a: new q, b: new q, c: new q }, e.push(h), g.push(k) } g = this.morphNormals[a]; f.vertices = this.morphTargets[a].vertices; f.computeFaceNormals(); f.computeVertexNormals(); c = 0; for (d = this.faces.length; c < d; c++) e = this.faces[c], h = g.faceNormals[c], k = g.vertexNormals[c], h.copy(e.normal), k.a.copy(e.vertexNormals[0]), k.b.copy(e.vertexNormals[1]), k.c.copy(e.vertexNormals[2]) } c = 0; for (d = this.faces.length; c < d; c++) e = this.faces[c], e.normal = e.__originalFaceNormal, e.vertexNormals = e.__originalVertexNormals }, computeTangents: function() { console.warn("THREE.Geometry: .computeTangents() has been removed.") }, computeLineDistances: function() { for (var a = 0, b = this.vertices, c = 0, d = b.length; c < d; c++) 0 < c && (a += b[c].distanceTo(b[c - 1])), this.lineDistances[c] = a }, computeBoundingBox: function() { null === this.boundingBox && (this.boundingBox = new Ba); this.boundingBox.setFromPoints(this.vertices) }, computeBoundingSphere: function() { null === this.boundingSphere && (this.boundingSphere = new Ca); this.boundingSphere.setFromPoints(this.vertices) }, merge: function(a, b, c) { if (!1 === (a && a.isGeometry)) console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.", a); else { var d, e = this.vertices.length, f = this.vertices, g = a.vertices, h = this.faces, k = a.faces, m = this.faceVertexUvs[0], l = a.faceVertexUvs[0], n = this.colors, p = a.colors; void 0 === c && (c = 0); void 0 !== b && (d = (new Ia).getNormalMatrix(b)); a = 0; for (var r = g.length; a < r; a++) { var q = g[a].clone(); void 0 !== b && q.applyMatrix4(b); f.push(q) } a = 0; for (r = p.length; a < r; a++) n.push(p[a].clone()); a = 0; for (r = k.length; a < r; a++) { var g = k[a] , t = g.vertexNormals , p = g.vertexColors , n = new ea(g.a + e,g.b + e,g.c + e); n.normal.copy(g.normal); void 0 !== d && n.normal.applyMatrix3(d).normalize(); b = 0; for (f = t.length; b < f; b++) q = t[b].clone(), void 0 !== d && q.applyMatrix3(d).normalize(), n.vertexNormals.push(q); n.color.copy(g.color); b = 0; for (f = p.length; b < f; b++) q = p[b], n.vertexColors.push(q.clone()); n.materialIndex = g.materialIndex + c; h.push(n) } a = 0; for (r = l.length; a < r; a++) if (c = l[a], d = [], void 0 !== c) { b = 0; for (f = c.length; b < f; b++) d.push(c[b].clone()); m.push(d) } } }, mergeMesh: function(a) { !1 === (a && a.isMesh) ? console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.", a) : (a.matrixAutoUpdate && a.updateMatrix(), this.merge(a.geometry, a.matrix)) }, mergeVertices: function() { var a = {}, b = [], c = [], d, e = Math.pow(10, 4), f, g; f = 0; for (g = this.vertices.length; f < g; f++) d = this.vertices[f], d = Math.round(d.x * e) + "_" + Math.round(d.y * e) + "_" + Math.round(d.z * e), void 0 === a[d] ? (a[d] = f, b.push(this.vertices[f]), c[f] = b.length - 1) : c[f] = c[a[d]]; a = []; f = 0; for (g = this.faces.length; f < g; f++) for (e = this.faces[f], e.a = c[e.a], e.b = c[e.b], e.c = c[e.c], e = [e.a, e.b, e.c], d = 0; 3 > d; d++) if (e[d] === e[(d + 1) % 3]) { a.push(f); break } for (f = a.length - 1; 0 <= f; f--) for (e = a[f], this.faces.splice(e, 1), c = 0, g = this.faceVertexUvs.length; c < g; c++) this.faceVertexUvs[c].splice(e, 1); f = this.vertices.length - b.length; this.vertices = b; return f }, sortFacesByMaterialIndex: function() { for (var a = this.faces, b = a.length, c = 0; c < b; c++) a[c]._id = c; a.sort(function(a, b) { return a.materialIndex - b.materialIndex }); var d = this.faceVertexUvs[0], e = this.faceVertexUvs[1], f, g; d && d.length === b && (f = []); e && e.length === b && (g = []); for (c = 0; c < b; c++) { var h = a[c]._id; f && f.push(d[h]); g && g.push(e[h]) } f && (this.faceVertexUvs[0] = f); g && (this.faceVertexUvs[1] = g) }, toJSON: function() { function a(a, b, c) { return c ? a | 1 << b : a & ~(1 << b) } function b(a) { var b = a.x.toString() + a.y.toString() + a.z.toString(); if (void 0 !== m[b]) return m[b]; m[b] = k.length / 3; k.push(a.x, a.y, a.z); return m[b] } function c(a) { var b = a.r.toString() + a.g.toString() + a.b.toString(); if (void 0 !== n[b]) return n[b]; n[b] = l.length; l.push(a.getHex()); return n[b] } function d(a) { var b = a.x.toString() + a.y.toString(); if (void 0 !== r[b]) return r[b]; r[b] = p.length / 2; p.push(a.x, a.y); return r[b] } var e = { metadata: { version: 4.4, type: "Geometry", generator: "Geometry.toJSON" } }; e.uuid = this.uuid; e.type = this.type; "" !== this.name && (e.name = this.name); if (void 0 !== this.parameters) { var f = this.parameters, g; for (g in f) void 0 !== f[g] && (e[g] = f[g]); return e } f = []; for (g = 0; g < this.vertices.length; g++) { var h = this.vertices[g]; f.push(h.x, h.y, h.z) } var h = [] , k = [] , m = {} , l = [] , n = {} , p = [] , r = {}; for (g = 0; g < this.faces.length; g++) { var q = this.faces[g] , t = void 0 !== this.faceVertexUvs[0][g] , D = 0 < q.normal.length() , u = 0 < q.vertexNormals.length , v = 1 !== q.color.r || 1 !== q.color.g || 1 !== q.color.b , I = 0 < q.vertexColors.length , y = 0 , y = a(y, 0, 0) , y = a(y, 1, !0) , y = a(y, 2, !1) , y = a(y, 3, t) , y = a(y, 4, D) , y = a(y, 5, u) , y = a(y, 6, v) , y = a(y, 7, I); h.push(y); h.push(q.a, q.b, q.c); h.push(q.materialIndex); t && (t = this.faceVertexUvs[0][g], h.push(d(t[0]), d(t[1]), d(t[2]))); D && h.push(b(q.normal)); u && (D = q.vertexNormals, h.push(b(D[0]), b(D[1]), b(D[2]))); v && h.push(c(q.color)); I && (q = q.vertexColors, h.push(c(q[0]), c(q[1]), c(q[2]))) } e.data = {}; e.data.vertices = f; e.data.normals = k; 0 < l.length && (e.data.colors = l); 0 < p.length && (e.data.uvs = [p]); e.data.faces = h; return e }, clone: function() { return (new Q).copy(this) }, copy: function(a) { this.vertices = []; this.faces = []; this.faceVertexUvs = [[]]; this.colors = []; for (var b = a.vertices, c = 0, d = b.length; c < d; c++) this.vertices.push(b[c].clone()); b = a.colors; c = 0; for (d = b.length; c < d; c++) this.colors.push(b[c].clone()); b = a.faces; c = 0; for (d = b.length; c < d; c++) this.faces.push(b[c].clone()); c = 0; for (d = a.faceVertexUvs.length; c < d; c++) { b = a.faceVertexUvs[c]; void 0 === this.faceVertexUvs[c] && (this.faceVertexUvs[c] = []); for (var e = 0, f = b.length; e < f; e++) { for (var g = b[e], h = [], k = 0, m = g.length; k < m; k++) h.push(g[k].clone()); this.faceVertexUvs[c].push(h) } } return this }, dispose: function() { this.dispatchEvent({ type: "dispose" }) } }); var ad = 0; Object.assign(re.prototype, sa.prototype, { computeBoundingBox: Q.prototype.computeBoundingBox, computeBoundingSphere: Q.prototype.computeBoundingSphere, computeFaceNormals: function() { console.warn("THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.") }, computeVertexNormals: function() { console.warn("THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.") }, computeGroups: function(a) { var b, c = [], d; a = a.faces; for (var e = 0; e < a.length; e++) { var f = a[e]; f.materialIndex !== d && (d = f.materialIndex, void 0 !== b && (b.count = 3 * e - b.start, c.push(b)), b = { start: 3 * e, materialIndex: d }) } void 0 !== b && (b.count = 3 * e - b.start, c.push(b)); this.groups = c }, fromGeometry: function(a) { var b = a.faces, c = a.vertices, d = a.faceVertexUvs, e = d[0] && 0 < d[0].length, f = d[1] && 0 < d[1].length, g = a.morphTargets, h = g.length, k; if (0 < h) { k = []; for (var m = 0; m < h; m++) k[m] = []; this.morphTargets.position = k } var l = a.morphNormals, n = l.length, p; if (0 < n) { p = []; for (m = 0; m < n; m++) p[m] = []; this.morphTargets.normal = p } for (var r = a.skinIndices, q = a.skinWeights, t = r.length === c.length, D = q.length === c.length, m = 0; m < b.length; m++) { var u = b[m]; this.vertices.push(c[u.a], c[u.b], c[u.c]); var v = u.vertexNormals; 3 === v.length ? this.normals.push(v[0], v[1], v[2]) : (v = u.normal, this.normals.push(v, v, v)); v = u.vertexColors; 3 === v.length ? this.colors.push(v[0], v[1], v[2]) : (v = u.color, this.colors.push(v, v, v)); !0 === e && (v = d[0][m], void 0 !== v ? this.uvs.push(v[0], v[1], v[2]) : (console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ", m), this.uvs.push(new B, new B, new B))); !0 === f && (v = d[1][m], void 0 !== v ? this.uvs2.push(v[0], v[1], v[2]) : (console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ", m), this.uvs2.push(new B, new B, new B))); for (v = 0; v < h; v++) { var I = g[v].vertices; k[v].push(I[u.a], I[u.b], I[u.c]) } for (v = 0; v < n; v++) I = l[v].vertexNormals[m], p[v].push(I.a, I.b, I.c); t && this.skinIndices.push(r[u.a], r[u.b], r[u.c]); D && this.skinWeights.push(q[u.a], q[u.b], q[u.c]) } this.computeGroups(a); this.verticesNeedUpdate = a.verticesNeedUpdate; this.normalsNeedUpdate = a.normalsNeedUpdate; this.colorsNeedUpdate = a.colorsNeedUpdate; this.uvsNeedUpdate = a.uvsNeedUpdate; this.groupsNeedUpdate = a.groupsNeedUpdate; return this }, dispose: function() { this.dispatchEvent({ type: "dispose" }) } }); Object.assign(G.prototype, sa.prototype, { isBufferGeometry: !0, getIndex: function() { return this.index }, setIndex: function(a) { this.index = a }, addAttribute: function(a, b, c) { if (!1 === (b && b.isBufferAttribute) && !1 === (b && b.isInterleavedBufferAttribute)) console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."), this.addAttribute(a, new C(b,c)); else if ("index" === a) console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."), this.setIndex(b); else return this.attributes[a] = b, this }, getAttribute: function(a) { return this.attributes[a] }, removeAttribute: function(a) { delete this.attributes[a]; return this }, addGroup: function(a, b, c) { this.groups.push({ start: a, count: b, materialIndex: void 0 !== c ? c : 0 }) }, clearGroups: function() { this.groups = [] }, setDrawRange: function(a, b) { this.drawRange.start = a; this.drawRange.count = b }, applyMatrix: function(a) { var b = this.attributes.position; void 0 !== b && (a.applyToVector3Array(b.array), b.needsUpdate = !0); b = this.attributes.normal; void 0 !== b && ((new Ia).getNormalMatrix(a).applyToVector3Array(b.array), b.needsUpdate = !0); null !== this.boundingBox && this.computeBoundingBox(); null !== this.boundingSphere && this.computeBoundingSphere(); return this }, rotateX: function() { var a; return function(b) { void 0 === a && (a = new J); a.makeRotationX(b); this.applyMatrix(a); return this } }(), rotateY: function() { var a; return function(b) { void 0 === a && (a = new J); a.makeRotationY(b); this.applyMatrix(a); return this } }(), rotateZ: function() { var a; return function(b) { void 0 === a && (a = new J); a.makeRotationZ(b); this.applyMatrix(a); return this } }(), translate: function() { var a; return function(b, c, d) { void 0 === a && (a = new J); a.makeTranslation(b, c, d); this.applyMatrix(a); return this } }(), scale: function() { var a; return function(b, c, d) { void 0 === a && (a = new J); a.makeScale(b, c, d); this.applyMatrix(a); return this } }(), lookAt: function() { var a; return function(b) { void 0 === a && (a = new z); a.lookAt(b); a.updateMatrix(); this.applyMatrix(a.matrix) } }(), center: function() { this.computeBoundingBox(); var a = this.boundingBox.getCenter().negate(); this.translate(a.x, a.y, a.z); return a }, setFromObject: function(a) { var b = a.geometry; if (a && a.isPoints || a && a.isLine) { a = new ha(3 * b.vertices.length,3); var c = new ha(3 * b.colors.length,3); this.addAttribute("position", a.copyVector3sArray(b.vertices)); this.addAttribute("color", c.copyColorsArray(b.colors)); b.lineDistances && b.lineDistances.length === b.vertices.length && (a = new ha(b.lineDistances.length,1), this.addAttribute("lineDistance", a.copyArray(b.lineDistances))); null !== b.boundingSphere && (this.boundingSphere = b.boundingSphere.clone()); null !== b.boundingBox && (this.boundingBox = b.boundingBox.clone()) } else a && a.isMesh && b && b.isGeometry && this.fromGeometry(b); return this }, updateFromObject: function(a) { var b = a.geometry; if (a && a.isMesh) { var c = b.__directGeometry; !0 === b.elementsNeedUpdate && (c = void 0, b.elementsNeedUpdate = !1); if (void 0 === c) return this.fromGeometry(b); c.verticesNeedUpdate = b.verticesNeedUpdate; c.normalsNeedUpdate = b.normalsNeedUpdate; c.colorsNeedUpdate = b.colorsNeedUpdate; c.uvsNeedUpdate = b.uvsNeedUpdate; c.groupsNeedUpdate = b.groupsNeedUpdate; b.verticesNeedUpdate = !1; b.normalsNeedUpdate = !1; b.colorsNeedUpdate = !1; b.uvsNeedUpdate = !1; b.groupsNeedUpdate = !1; b = c } !0 === b.verticesNeedUpdate && (c = this.attributes.position, void 0 !== c && (c.copyVector3sArray(b.vertices), c.needsUpdate = !0), b.verticesNeedUpdate = !1); !0 === b.normalsNeedUpdate && (c = this.attributes.normal, void 0 !== c && (c.copyVector3sArray(b.normals), c.needsUpdate = !0), b.normalsNeedUpdate = !1); !0 === b.colorsNeedUpdate && (c = this.attributes.color, void 0 !== c && (c.copyColorsArray(b.colors), c.needsUpdate = !0), b.colorsNeedUpdate = !1); b.uvsNeedUpdate && (c = this.attributes.uv, void 0 !== c && (c.copyVector2sArray(b.uvs), c.needsUpdate = !0), b.uvsNeedUpdate = !1); b.lineDistancesNeedUpdate && (c = this.attributes.lineDistance, void 0 !== c && (c.copyArray(b.lineDistances), c.needsUpdate = !0), b.lineDistancesNeedUpdate = !1); b.groupsNeedUpdate && (b.computeGroups(a.geometry), this.groups = b.groups, b.groupsNeedUpdate = !1); return this }, fromGeometry: function(a) { a.__directGeometry = (new re).fromGeometry(a); return this.fromDirectGeometry(a.__directGeometry) }, fromDirectGeometry: function(a) { var b = new Float32Array(3 * a.vertices.length); this.addAttribute("position", (new C(b,3)).copyVector3sArray(a.vertices)); 0 < a.normals.length && (b = new Float32Array(3 * a.normals.length), this.addAttribute("normal", (new C(b,3)).copyVector3sArray(a.normals))); 0 < a.colors.length && (b = new Float32Array(3 * a.colors.length), this.addAttribute("color", (new C(b,3)).copyColorsArray(a.colors))); 0 < a.uvs.length && (b = new Float32Array(2 * a.uvs.length), this.addAttribute("uv", (new C(b,2)).copyVector2sArray(a.uvs))); 0 < a.uvs2.length && (b = new Float32Array(2 * a.uvs2.length), this.addAttribute("uv2", (new C(b,2)).copyVector2sArray(a.uvs2))); 0 < a.indices.length && (b = new (65535 < a.vertices.length ? Uint32Array : Uint16Array)(3 * a.indices.length), this.setIndex((new C(b,1)).copyIndicesArray(a.indices))); this.groups = a.groups; for (var c in a.morphTargets) { for (var b = [], d = a.morphTargets[c], e = 0, f = d.length; e < f; e++) { var g = d[e] , h = new ha(3 * g.length,3); b.push(h.copyVector3sArray(g)) } this.morphAttributes[c] = b } 0 < a.skinIndices.length && (c = new ha(4 * a.skinIndices.length,4), this.addAttribute("skinIndex", c.copyVector4sArray(a.skinIndices))); 0 < a.skinWeights.length && (c = new ha(4 * a.skinWeights.length,4), this.addAttribute("skinWeight", c.copyVector4sArray(a.skinWeights))); null !== a.boundingSphere && (this.boundingSphere = a.boundingSphere.clone()); null !== a.boundingBox && (this.boundingBox = a.boundingBox.clone()); return this }, computeBoundingBox: function() { null === this.boundingBox && (this.boundingBox = new Ba); var a = this.attributes.position.array; void 0 !== a ? this.boundingBox.setFromArray(a) : this.boundingBox.makeEmpty(); (isNaN(this.boundingBox.min.x) || isNaN(this.boundingBox.min.y) || isNaN(this.boundingBox.min.z)) && console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this) }, computeBoundingSphere: function() { var a = new Ba , b = new q; return function() { null === this.boundingSphere && (this.boundingSphere = new Ca); var c = this.attributes.position; if (c) { var c = c.array , d = this.boundingSphere.center; a.setFromArray(c); a.getCenter(d); for (var e = 0, f = 0, g = c.length; f < g; f += 3) b.fromArray(c, f), e = Math.max(e, d.distanceToSquared(b)); this.boundingSphere.radius = Math.sqrt(e); isNaN(this.boundingSphere.radius) && console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this) } } }(), computeFaceNormals: function() {}, computeVertexNormals: function() { var a = this.index , b = this.attributes , c = this.groups; if (b.position) { var d = b.position.array; if (void 0 === b.normal) this.addAttribute("normal", new C(new Float32Array(d.length),3)); else for (var e = b.normal.array, f = 0, g = e.length; f < g; f++) e[f] = 0; var e = b.normal.array, h, k, m, l = new q, n = new q, p = new q, r = new q, x = new q; if (a) { a = a.array; 0 === c.length && this.addGroup(0, a.length); for (var t = 0, D = c.length; t < D; ++t) for (f = c[t], g = f.start, h = f.count, f = g, g += h; f < g; f += 3) h = 3 * a[f + 0], k = 3 * a[f + 1], m = 3 * a[f + 2], l.fromArray(d, h), n.fromArray(d, k), p.fromArray(d, m), r.subVectors(p, n), x.subVectors(l, n), r.cross(x), e[h] += r.x, e[h + 1] += r.y, e[h + 2] += r.z, e[k] += r.x, e[k + 1] += r.y, e[k + 2] += r.z, e[m] += r.x, e[m + 1] += r.y, e[m + 2] += r.z } else for (f = 0, g = d.length; f < g; f += 9) l.fromArray(d, f), n.fromArray(d, f + 3), p.fromArray(d, f + 6), r.subVectors(p, n), x.subVectors(l, n), r.cross(x), e[f] = r.x, e[f + 1] = r.y, e[f + 2] = r.z, e[f + 3] = r.x, e[f + 4] = r.y, e[f + 5] = r.z, e[f + 6] = r.x, e[f + 7] = r.y, e[f + 8] = r.z; this.normalizeNormals(); b.normal.needsUpdate = !0 } }, merge: function(a, b) { if (!1 === (a && a.isBufferGeometry)) console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.", a); else { void 0 === b && (b = 0); var c = this.attributes, d; for (d in c) if (void 0 !== a.attributes[d]) for (var e = c[d].array, f = a.attributes[d], g = f.array, h = 0, f = f.itemSize * b; h < g.length; h++, f++) e[f] = g[h]; return this } }, normalizeNormals: function() { for (var a = this.attributes.normal.array, b, c, d, e = 0, f = a.length; e < f; e += 3) b = a[e], c = a[e + 1], d = a[e + 2], b = 1 / Math.sqrt(b * b + c * c + d * d), a[e] *= b, a[e + 1] *= b, a[e + 2] *= b }, toNonIndexed: function() { if (null === this.index) return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."), this; var a = new G, b = this.index.array, c = this.attributes, d; for (d in c) { for (var e = c[d], f = e.array, e = e.itemSize, g = new f.constructor(b.length * e), h, k = 0, m = 0, l = b.length; m < l; m++) { h = b[m] * e; for (var n = 0; n < e; n++) g[k++] = f[h++] } a.addAttribute(d, new C(g,e)) } return a }, toJSON: function() { var a = { metadata: { version: 4.4, type: "BufferGeometry", generator: "BufferGeometry.toJSON" } }; a.uuid = this.uuid; a.type = this.type; "" !== this.name && (a.name = this.name); if (void 0 !== this.parameters) { var b = this.parameters, c; for (c in b) void 0 !== b[c] && (a[c] = b[c]); return a } a.data = { attributes: {} }; var d = this.index; null !== d && (b = Array.prototype.slice.call(d.array), a.data.index = { type: d.array.constructor.name, array: b }); d = this.attributes; for (c in d) { var e = d[c] , b = Array.prototype.slice.call(e.array); a.data.attributes[c] = { itemSize: e.itemSize, type: e.array.constructor.name, array: b, normalized: e.normalized } } c = this.groups; 0 < c.length && (a.data.groups = JSON.parse(JSON.stringify(c))); c = this.boundingSphere; null !== c && (a.data.boundingSphere = { center: c.center.toArray(), radius: c.radius }); return a }, clone: function() { return (new G).copy(this) }, copy: function(a) { var b = a.index; null !== b && this.setIndex(b.clone()); var b = a.attributes, c; for (c in b) this.addAttribute(c, b[c].clone()); a = a.groups; c = 0; for (b = a.length; c < b; c++) { var d = a[c]; this.addGroup(d.start, d.count, d.materialIndex) } return this }, dispose: function() { this.dispatchEvent({ type: "dispose" }) } }); G.MaxIndex = 65535; ya.prototype = Object.assign(Object.create(z.prototype), { constructor: ya, isMesh: !0, setDrawMode: function(a) { this.drawMode = a }, copy: function(a) { z.prototype.copy.call(this, a); this.drawMode = a.drawMode; return this }, updateMorphTargets: function() { var a = this.geometry.morphTargets; if (void 0 !== a && 0 < a.length) { this.morphTargetInfluences = []; this.morphTargetDictionary = {}; for (var b = 0, c = a.length; b < c; b++) this.morphTargetInfluences.push(0), this.morphTargetDictionary[a[b].name] = b } }, raycast: function() { function a(a, b, c, d, e, f, g) { wa.barycoordFromPoint(a, b, c, d, t); e.multiplyScalar(t.x); f.multiplyScalar(t.y); g.multiplyScalar(t.z); e.add(f).add(g); return e.clone() } function b(a, b, c, d, e, f, g) { var h = a.material; if (null === (1 === h.side ? c.intersectTriangle(f, e, d, !0, g) : c.intersectTriangle(d, e, f, 2 !== h.side, g))) return null; u.copy(g); u.applyMatrix4(a.matrixWorld); c = b.ray.origin.distanceTo(u); return c < b.near || c > b.far ? null : { distance: c, point: u.clone(), object: a } } function c(c, d, e, f, m, l, n, w) { g.fromArray(f, 3 * l); h.fromArray(f, 3 * n); k.fromArray(f, 3 * w); if (c = b(c, d, e, g, h, k, D)) m && (p.fromArray(m, 2 * l), r.fromArray(m, 2 * n), x.fromArray(m, 2 * w), c.uv = a(D, g, h, k, p, r, x)), c.face = new ea(l,n,w,wa.normal(g, h, k)), c.faceIndex = l; return c } var d = new J , e = new ab , f = new Ca , g = new q , h = new q , k = new q , m = new q , l = new q , n = new q , p = new B , r = new B , x = new B , t = new q , D = new q , u = new q; return function(q, t) { var u = this.geometry , E = this.material , H = this.matrixWorld; if (void 0 !== E && (null === u.boundingSphere && u.computeBoundingSphere(), f.copy(u.boundingSphere), f.applyMatrix4(H), !1 !== q.ray.intersectsSphere(f) && (d.getInverse(H), e.copy(q.ray).applyMatrix4(d), null === u.boundingBox || !1 !== e.intersectsBox(u.boundingBox)))) { var F, M; if (u && u.isBufferGeometry) { var B, K, E = u.index, H = u.attributes, u = H.position.array; void 0 !== H.uv && (F = H.uv.array); if (null !== E) for (var H = E.array, z = 0, C = H.length; z < C; z += 3) { if (E = H[z], B = H[z + 1], K = H[z + 2], M = c(this, q, e, u, F, E, B, K)) M.faceIndex = Math.floor(z / 3), t.push(M) } else for (z = 0, C = u.length; z < C; z += 9) if (E = z / 3, B = E + 1, K = E + 2, M = c(this, q, e, u, F, E, B, K)) M.index = E, t.push(M) } else if (u && u.isGeometry) { var G, J, H = E && E.isMultiMaterial, z = !0 === H ? E.materials : null, C = u.vertices; B = u.faces; K = u.faceVertexUvs[0]; 0 < K.length && (F = K); for (var N = 0, P = B.length; N < P; N++) { var R = B[N]; M = !0 === H ? z[R.materialIndex] : E; if (void 0 !== M) { K = C[R.a]; G = C[R.b]; J = C[R.c]; if (!0 === M.morphTargets) { M = u.morphTargets; var S = this.morphTargetInfluences; g.set(0, 0, 0); h.set(0, 0, 0); k.set(0, 0, 0); for (var Q = 0, V = M.length; Q < V; Q++) { var O = S[Q]; if (0 !== O) { var L = M[Q].vertices; g.addScaledVector(m.subVectors(L[R.a], K), O); h.addScaledVector(l.subVectors(L[R.b], G), O); k.addScaledVector(n.subVectors(L[R.c], J), O) } } g.add(K); h.add(G); k.add(J); K = g; G = h; J = k } if (M = b(this, q, e, K, G, J, D)) F && (S = F[N], p.copy(S[0]), r.copy(S[1]), x.copy(S[2]), M.uv = a(D, K, G, J, p, r, x)), M.face = R, M.faceIndex = N, t.push(M) } } } } } }(), clone: function() { return (new this.constructor(this.geometry,this.material)).copy(this) } }); hb.prototype = Object.create(G.prototype); hb.prototype.constructor = hb; ib.prototype = Object.create(G.prototype); ib.prototype.constructor = ib; Z.prototype = Object.create(z.prototype); Z.prototype.constructor = Z; Z.prototype.isCamera = !0; Z.prototype.getWorldDirection = function() { var a = new ba; return function(b) { b = b || new q; this.getWorldQuaternion(a); return b.set(0, 0, -1).applyQuaternion(a) } }(); Z.prototype.lookAt = function() { var a = new J; return function(b) { a.lookAt(this.position, b, this.up); this.quaternion.setFromRotationMatrix(a) } }(); Z.prototype.clone = function() { return (new this.constructor).copy(this) } ; Z.prototype.copy = function(a) { z.prototype.copy.call(this, a); this.matrixWorldInverse.copy(a.matrixWorldInverse); this.projectionMatrix.copy(a.projectionMatrix); return this } ; Ea.prototype = Object.assign(Object.create(Z.prototype), { constructor: Ea, isPerspectiveCamera: !0, copy: function(a) { Z.prototype.copy.call(this, a); this.fov = a.fov; this.zoom = a.zoom; this.near = a.near; this.far = a.far; this.focus = a.focus; this.aspect = a.aspect; this.view = null === a.view ? null : Object.assign({}, a.view); this.filmGauge = a.filmGauge; this.filmOffset = a.filmOffset; return this }, setFocalLength: function(a) { a = .5 * this.getFilmHeight() / a; this.fov = 2 * T.RAD2DEG * Math.atan(a); this.updateProjectionMatrix() }, getFocalLength: function() { var a = Math.tan(.5 * T.DEG2RAD * this.fov); return .5 * this.getFilmHeight() / a }, getEffectiveFOV: function() { return 2 * T.RAD2DEG * Math.atan(Math.tan(.5 * T.DEG2RAD * this.fov) / this.zoom) }, getFilmWidth: function() { return this.filmGauge * Math.min(this.aspect, 1) }, getFilmHeight: function() { return this.filmGauge / Math.max(this.aspect, 1) }, setViewOffset: function(a, b, c, d, e, f) { this.aspect = a / b; this.view = { fullWidth: a, fullHeight: b, offsetX: c, offsetY: d, width: e, height: f }; this.updateProjectionMatrix() }, clearViewOffset: function() { this.view = null; this.updateProjectionMatrix() }, updateProjectionMatrix: function() { var a = this.near , b = a * Math.tan(.5 * T.DEG2RAD * this.fov) / this.zoom , c = 2 * b , d = this.aspect * c , e = -.5 * d , f = this.view; if (null !== f) var g = f.fullWidth , h = f.fullHeight , e = e + f.offsetX * d / g , b = b - f.offsetY * c / h , d = f.width / g * d , c = f.height / h * c; f = this.filmOffset; 0 !== f && (e += a * f / this.getFilmWidth()); this.projectionMatrix.makeFrustum(e, e + d, b - c, b, a, this.far) }, toJSON: function(a) { a = z.prototype.toJSON.call(this, a); a.object.fov = this.fov; a.object.zoom = this.zoom; a.object.near = this.near; a.object.far = this.far; a.object.focus = this.focus; a.object.aspect = this.aspect; null !== this.view && (a.object.view = Object.assign({}, this.view)); a.object.filmGauge = this.filmGauge; a.object.filmOffset = this.filmOffset; return a } }); Hb.prototype = Object.assign(Object.create(Z.prototype), { constructor: Hb, isOrthographicCamera: !0, copy: function(a) { Z.prototype.copy.call(this, a); this.left = a.left; this.right = a.right; this.top = a.top; this.bottom = a.bottom; this.near = a.near; this.far = a.far; this.zoom = a.zoom; this.view = null === a.view ? null : Object.assign({}, a.view); return this }, setViewOffset: function(a, b, c, d, e, f) { this.view = { fullWidth: a, fullHeight: b, offsetX: c, offsetY: d, width: e, height: f }; this.updateProjectionMatrix() }, clearViewOffset: function() { this.view = null; this.updateProjectionMatrix() }, updateProjectionMatrix: function() { var a = (this.right - this.left) / (2 * this.zoom) , b = (this.top - this.bottom) / (2 * this.zoom) , c = (this.right + this.left) / 2 , d = (this.top + this.bottom) / 2 , e = c - a , c = c + a , a = d + b , b = d - b; if (null !== this.view) var c = this.zoom / (this.view.width / this.view.fullWidth) , b = this.zoom / (this.view.height / this.view.fullHeight) , f = (this.right - this.left) / this.view.width , d = (this.top - this.bottom) / this.view.height , e = e + this.view.offsetX / c * f , c = e + this.view.width / c * f , a = a - this.view.offsetY / b * d , b = a - this.view.height / b * d; this.projectionMatrix.makeOrthographic(e, c, a, b, this.near, this.far) }, toJSON: function(a) { a = z.prototype.toJSON.call(this, a); a.object.zoom = this.zoom; a.object.left = this.left; a.object.right = this.right; a.object.top = this.top; a.object.bottom = this.bottom; a.object.near = this.near; a.object.far = this.far; null !== this.view && (a.object.view = Object.assign({}, this.view)); return a } }); var sf = 0; Ib.prototype.isFogExp2 = !0; Ib.prototype.clone = function() { return new Ib(this.color.getHex(),this.density) } ; Ib.prototype.toJSON = function(a) { return { type: "FogExp2", color: this.color.getHex(), density: this.density } } ; Jb.prototype.isFog = !0; Jb.prototype.clone = function() { return new Jb(this.color.getHex(),this.near,this.far) } ; Jb.prototype.toJSON = function(a) { return { type: "Fog", color: this.color.getHex(), near: this.near, far: this.far } } ; jb.prototype = Object.create(z.prototype); jb.prototype.constructor = jb; jb.prototype.copy = function(a, b) { z.prototype.copy.call(this, a, b); null !== a.background && (this.background = a.background.clone()); null !== a.fog && (this.fog = a.fog.clone()); null !== a.overrideMaterial && (this.overrideMaterial = a.overrideMaterial.clone()); this.autoUpdate = a.autoUpdate; this.matrixAutoUpdate = a.matrixAutoUpdate; return this } ; jb.prototype.toJSON = function(a) { var b = z.prototype.toJSON.call(this, a); null !== this.background && (b.object.background = this.background.toJSON(a)); null !== this.fog && (b.object.fog = this.fog.toJSON()); return b } ; Ed.prototype = Object.assign(Object.create(z.prototype), { constructor: Ed, isLensFlare: !0, copy: function(a) { z.prototype.copy.call(this, a); this.positionScreen.copy(a.positionScreen); this.customUpdateCallback = a.customUpdateCallback; for (var b = 0, c = a.lensFlares.length; b < c; b++) this.lensFlares.push(a.lensFlares[b]); return this }, add: function(a, b, c, d, e, f) { void 0 === b && (b = -1); void 0 === c && (c = 0); void 0 === f && (f = 1); void 0 === e && (e = new O(16777215)); void 0 === d && (d = 1); c = Math.min(c, Math.max(0, c)); this.lensFlares.push({ texture: a, size: b, distance: c, x: 0, y: 0, z: 0, scale: 1, rotation: 0, opacity: f, color: e, blending: d }) }, updateLensFlares: function() { var a, b = this.lensFlares.length, c, d = 2 * -this.positionScreen.x, e = 2 * -this.positionScreen.y; for (a = 0; a < b; a++) c = this.lensFlares[a], c.x = this.positionScreen.x + d * c.distance, c.y = this.positionScreen.y + e * c.distance, c.wantedRotation = c.x * Math.PI * .25, c.rotation += .25 * (c.wantedRotation - c.rotation) } }); kb.prototype = Object.create(U.prototype); kb.prototype.constructor = kb; kb.prototype.copy = function(a) { U.prototype.copy.call(this, a); this.color.copy(a.color); this.map = a.map; this.rotation = a.rotation; return this } ; qc.prototype = Object.assign(Object.create(z.prototype), { constructor: qc, isSprite: !0, raycast: function() { var a = new q; return function(b, c) { a.setFromMatrixPosition(this.matrixWorld); var d = b.ray.distanceSqToPoint(a); d > this.scale.x * this.scale.y / 4 || c.push({ distance: Math.sqrt(d), point: this.position, face: null, object: this }) } }(), clone: function() { return (new this.constructor(this.material)).copy(this) } }); rc.prototype = Object.assign(Object.create(z.prototype), { constructor: rc, copy: function(a) { z.prototype.copy.call(this, a, !1); a = a.levels; for (var b = 0, c = a.length; b < c; b++) { var d = a[b]; this.addLevel(d.object.clone(), d.distance) } return this }, addLevel: function(a, b) { void 0 === b && (b = 0); b = Math.abs(b); for (var c = this.levels, d = 0; d < c.length && !(b < c[d].distance); d++) ; c.splice(d, 0, { distance: b, object: a }); this.add(a) }, getObjectForDistance: function(a) { for (var b = this.levels, c = 1, d = b.length; c < d && !(a < b[c].distance); c++) ; return b[c - 1].object }, raycast: function() { var a = new q; return function(b, c) { a.setFromMatrixPosition(this.matrixWorld); var d = b.ray.origin.distanceTo(a); this.getObjectForDistance(d).raycast(b, c) } }(), update: function() { var a = new q , b = new q; return function(c) { var d = this.levels; if (1 < d.length) { a.setFromMatrixPosition(c.matrixWorld); b.setFromMatrixPosition(this.matrixWorld); c = a.distanceTo(b); d[0].object.visible = !0; for (var e = 1, f = d.length; e < f; e++) if (c >= d[e].distance) d[e - 1].object.visible = !1, d[e].object.visible = !0; else break; for (; e < f; e++) d[e].object.visible = !1 } } }(), toJSON: function(a) { a = z.prototype.toJSON.call(this, a); a.object.levels = []; for (var b = this.levels, c = 0, d = b.length; c < d; c++) { var e = b[c]; a.object.levels.push({ object: e.object.uuid, distance: e.distance }) } return a } }); lb.prototype = Object.create(da.prototype); lb.prototype.constructor = lb; lb.prototype.isDataTexture = !0; Object.assign(bd.prototype, { calculateInverses: function() { this.boneInverses = []; for (var a = 0, b = this.bones.length; a < b; a++) { var c = new J; this.bones[a] && c.getInverse(this.bones[a].matrixWorld); this.boneInverses.push(c) } }, pose: function() { for (var a, b = 0, c = this.bones.length; b < c; b++) (a = this.bones[b]) && a.matrixWorld.getInverse(this.boneInverses[b]); b = 0; for (c = this.bones.length; b < c; b++) if (a = this.bones[b]) a.parent && a.parent.isBone ? (a.matrix.getInverse(a.parent.matrixWorld), a.matrix.multiply(a.matrixWorld)) : a.matrix.copy(a.matrixWorld), a.matrix.decompose(a.position, a.quaternion, a.scale) }, update: function() { var a = new J; return function() { for (var b = 0, c = this.bones.length; b < c; b++) a.multiplyMatrices(this.bones[b] ? this.bones[b].matrixWorld : this.identityMatrix, this.boneInverses[b]), a.toArray(this.boneMatrices, 16 * b); this.useVertexTexture && (this.boneTexture.needsUpdate = !0) } }(), clone: function() { return new bd(this.bones,this.boneInverses,this.useVertexTexture) } }); cd.prototype = Object.assign(Object.create(z.prototype), { constructor: cd, isBone: !0, copy: function(a) { z.prototype.copy.call(this, a); this.skin = a.skin; return this } }); dd.prototype = Object.assign(Object.create(ya.prototype), { constructor: dd, isSkinnedMesh: !0, bind: function(a, b) { this.skeleton = a; void 0 === b && (this.updateMatrixWorld(!0), this.skeleton.calculateInverses(), b = this.matrixWorld); this.bindMatrix.copy(b); this.bindMatrixInverse.getInverse(b) }, pose: function() { this.skeleton.pose() }, normalizeSkinWeights: function() { if (this.geometry && this.geometry.isGeometry) for (var a = 0; a < this.geometry.skinWeights.length; a++) { var b = this.geometry.skinWeights[a] , c = 1 / b.lengthManhattan(); Infinity !== c ? b.multiplyScalar(c) : b.set(1, 0, 0, 0) } else if (this.geometry && this.geometry.isBufferGeometry) for (var b = new ga, d = this.geometry.attributes.skinWeight, a = 0; a < d.count; a++) b.x = d.getX(a), b.y = d.getY(a), b.z = d.getZ(a), b.w = d.getW(a), c = 1 / b.lengthManhattan(), Infinity !== c ? b.multiplyScalar(c) : b.set(1, 0, 0, 0), d.setXYZW(a, b.x, b.y, b.z, b.w) }, updateMatrixWorld: function(a) { ya.prototype.updateMatrixWorld.call(this, !0); "attached" === this.bindMode ? this.bindMatrixInverse.getInverse(this.matrixWorld) : "detached" === this.bindMode ? this.bindMatrixInverse.getInverse(this.bindMatrix) : console.warn("THREE.SkinnedMesh unrecognized bindMode: " + this.bindMode) }, clone: function() { return (new this.constructor(this.geometry,this.material,this.skeleton.useVertexTexture)).copy(this) } }); oa.prototype = Object.create(U.prototype); oa.prototype.constructor = oa; oa.prototype.isLineBasicMaterial = !0; oa.prototype.copy = function(a) { U.prototype.copy.call(this, a); this.color.copy(a.color); this.linewidth = a.linewidth; this.linecap = a.linecap; this.linejoin = a.linejoin; return this } ; Ta.prototype = Object.assign(Object.create(z.prototype), { constructor: Ta, isLine: !0, raycast: function() { var a = new J , b = new ab , c = new Ca; return function(d, e) { var f = d.linePrecision , f = f * f , g = this.geometry , h = this.matrixWorld; null === g.boundingSphere && g.computeBoundingSphere(); c.copy(g.boundingSphere); c.applyMatrix4(h); if (!1 !== d.ray.intersectsSphere(c)) { a.getInverse(h); b.copy(d.ray).applyMatrix4(a); var k = new q , m = new q , h = new q , l = new q , n = this && this.isLineSegments ? 2 : 1; if (g && g.isBufferGeometry) { var p = g.index , r = g.attributes.position.array; if (null !== p) for (var p = p.array, g = 0, x = p.length - 1; g < x; g += n) { var t = p[g + 1]; k.fromArray(r, 3 * p[g]); m.fromArray(r, 3 * t); t = b.distanceSqToSegment(k, m, l, h); t > f || (l.applyMatrix4(this.matrixWorld), t = d.ray.origin.distanceTo(l), t < d.near || t > d.far || e.push({ distance: t, point: h.clone().applyMatrix4(this.matrixWorld), index: g, face: null, faceIndex: null, object: this })) } else for (g = 0, x = r.length / 3 - 1; g < x; g += n) k.fromArray(r, 3 * g), m.fromArray(r, 3 * g + 3), t = b.distanceSqToSegment(k, m, l, h), t > f || (l.applyMatrix4(this.matrixWorld), t = d.ray.origin.distanceTo(l), t < d.near || t > d.far || e.push({ distance: t, point: h.clone().applyMatrix4(this.matrixWorld), index: g, face: null, faceIndex: null, object: this })) } else if (g && g.isGeometry) for (k = g.vertices, m = k.length, g = 0; g < m - 1; g += n) t = b.distanceSqToSegment(k[g], k[g + 1], l, h), t > f || (l.applyMatrix4(this.matrixWorld), t = d.ray.origin.distanceTo(l), t < d.near || t > d.far || e.push({ distance: t, point: h.clone().applyMatrix4(this.matrixWorld), index: g, face: null, faceIndex: null, object: this })) } } }(), clone: function() { return (new this.constructor(this.geometry,this.material)).copy(this) } }); la.prototype = Object.assign(Object.create(Ta.prototype), { constructor: la, isLineSegments: !0 }); xa.prototype = Object.create(U.prototype); xa.prototype.constructor = xa; xa.prototype.isPointsMaterial = !0; xa.prototype.copy = function(a) { U.prototype.copy.call(this, a); this.color.copy(a.color); this.map = a.map; this.size = a.size; this.sizeAttenuation = a.sizeAttenuation; return this } ; Kb.prototype = Object.assign(Object.create(z.prototype), { constructor: Kb, isPoints: !0, raycast: function() { var a = new J , b = new ab , c = new Ca; return function(d, e) { function f(a, c) { var f = b.distanceSqToPoint(a); if (f < l) { var h = b.closestPointToPoint(a); h.applyMatrix4(k); var m = d.ray.origin.distanceTo(h); m < d.near || m > d.far || e.push({ distance: m, distanceToRay: Math.sqrt(f), point: h.clone(), index: c, face: null, object: g }) } } var g = this , h = this.geometry , k = this.matrixWorld , m = d.params.Points.threshold; null === h.boundingSphere && h.computeBoundingSphere(); c.copy(h.boundingSphere); c.applyMatrix4(k); if (!1 !== d.ray.intersectsSphere(c)) { a.getInverse(k); b.copy(d.ray).applyMatrix4(a); var m = m / ((this.scale.x + this.scale.y + this.scale.z) / 3) , l = m * m , m = new q; if (h && h.isBufferGeometry) { var n = h.index , h = h.attributes.position.array; if (null !== n) for (var p = n.array, n = 0, r = p.length; n < r; n++) { var x = p[n]; m.fromArray(h, 3 * x); f(m, x) } else for (n = 0, p = h.length / 3; n < p; n++) m.fromArray(h, 3 * n), f(m, n) } else for (m = h.vertices, n = 0, p = m.length; n < p; n++) f(m[n], n) } } }(), clone: function() { return (new this.constructor(this.geometry,this.material)).copy(this) } }); sc.prototype = Object.assign(Object.create(z.prototype), { constructor: sc }); ed.prototype = Object.create(da.prototype); ed.prototype.constructor = ed; Lb.prototype = Object.create(da.prototype); Lb.prototype.constructor = Lb; Lb.prototype.isCompressedTexture = !0; fd.prototype = Object.create(da.prototype); fd.prototype.constructor = fd; tc.prototype = Object.create(da.prototype); tc.prototype.constructor = tc; tc.prototype.isDepthTexture = !0; Mb.prototype = Object.create(G.prototype); Mb.prototype.constructor = Mb; Nb.prototype = Object.create(G.prototype); Nb.prototype.constructor = Nb; uc.prototype = Object.create(Q.prototype); uc.prototype.constructor = uc; ua.prototype = Object.create(G.prototype); ua.prototype.constructor = ua; Ob.prototype = Object.create(ua.prototype); Ob.prototype.constructor = Ob; vc.prototype = Object.create(Q.prototype); vc.prototype.constructor = vc; Pb.prototype = Object.create(ua.prototype); Pb.prototype.constructor = Pb; wc.prototype = Object.create(Q.prototype); wc.prototype.constructor = wc; Qb.prototype = Object.create(ua.prototype); Qb.prototype.constructor = Qb; xc.prototype = Object.create(Q.prototype); xc.prototype.constructor = xc; Rb.prototype = Object.create(ua.prototype); Rb.prototype.constructor = Rb; yc.prototype = Object.create(Q.prototype); yc.prototype.constructor = yc; zc.prototype = Object.create(Q.prototype); zc.prototype.constructor = zc; Sb.prototype = Object.create(G.prototype); Sb.prototype.constructor = Sb; Ac.prototype = Object.create(Q.prototype); Ac.prototype.constructor = Ac; Tb.prototype = Object.create(G.prototype); Tb.prototype.constructor = Tb; Bc.prototype = Object.create(Q.prototype); Bc.prototype.constructor = Bc; Ub.prototype = Object.create(G.prototype); Ub.prototype.constructor = Ub; Cc.prototype = Object.create(Q.prototype); Cc.prototype.constructor = Cc; var ra = { area: function(a) { for (var b = a.length, c = 0, d = b - 1, e = 0; e < b; d = e++) c += a[d].x * a[e].y - a[e].x * a[d].y; return .5 * c }, triangulate: function() { return function(a, b) { var c = a.length; if (3 > c) return null; var d = [], e = [], f = [], g, h, k; if (0 < ra.area(a)) for (h = 0; h < c; h++) e[h] = h; else for (h = 0; h < c; h++) e[h] = c - 1 - h; var m = 2 * c; for (h = c - 1; 2 < c; ) { if (0 >= m--) { console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()"); break } g = h; c <= g && (g = 0); h = g + 1; c <= h && (h = 0); k = h + 1; c <= k && (k = 0); var l; a: { var n, p, r, q, t, D, u, v; n = a[e[g]].x; p = a[e[g]].y; r = a[e[h]].x; q = a[e[h]].y; t = a[e[k]].x; D = a[e[k]].y; if (0 >= (r - n) * (D - p) - (q - p) * (t - n)) l = !1; else { var I, y, E, H, F, M, B, z, C, G; I = t - r; y = D - q; E = n - t; H = p - D; F = r - n; M = q - p; for (l = 0; l < c; l++) if (u = a[e[l]].x, v = a[e[l]].y, !(u === n && v === p || u === r && v === q || u === t && v === D) && (B = u - n, z = v - p, C = u - r, G = v - q, u -= t, v -= D, C = I * G - y * C, B = F * z - M * B, z = E * v - H * u, C >= -Number.EPSILON && z >= -Number.EPSILON && B >= -Number.EPSILON)) { l = !1; break a } l = !0 } } if (l) { d.push([a[e[g]], a[e[h]], a[e[k]]]); f.push([e[g], e[h], e[k]]); g = h; for (k = h + 1; k < c; g++, k++) e[g] = e[k]; c--; m = 2 * c } } return b ? f : d } }(), triangulateShape: function(a, b) { function c(a) { var b = a.length; 2 < b && a[b - 1].equals(a[0]) && a.pop() } function d(a, b, c) { return a.x !== b.x ? a.x < b.x ? a.x <= c.x && c.x <= b.x : b.x <= c.x && c.x <= a.x : a.y < b.y ? a.y <= c.y && c.y <= b.y : b.y <= c.y && c.y <= a.y } function e(a, b, c, e, f) { var g = b.x - a.x , h = b.y - a.y , k = e.x - c.x , m = e.y - c.y , l = a.x - c.x , n = a.y - c.y , p = h * k - g * m , q = h * l - g * n; if (Math.abs(p) > Number.EPSILON) { if (0 < p) { if (0 > q || q > p) return []; k = m * l - k * n; if (0 > k || k > p) return [] } else { if (0 < q || q < p) return []; k = m * l - k * n; if (0 < k || k < p) return [] } if (0 === k) return !f || 0 !== q && q !== p ? [a] : []; if (k === p) return !f || 0 !== q && q !== p ? [b] : []; if (0 === q) return [c]; if (q === p) return [e]; f = k / p; return [{ x: a.x + f * g, y: a.y + f * h }] } if (0 !== q || m * l !== k * n) return []; h = 0 === g && 0 === h; k = 0 === k && 0 === m; if (h && k) return a.x !== c.x || a.y !== c.y ? [] : [a]; if (h) return d(c, e, a) ? [a] : []; if (k) return d(a, b, c) ? [c] : []; 0 !== g ? (a.x < b.x ? (g = a, k = a.x, h = b, a = b.x) : (g = b, k = b.x, h = a, a = a.x), c.x < e.x ? (b = c, p = c.x, m = e, c = e.x) : (b = e, p = e.x, m = c, c = c.x)) : (a.y < b.y ? (g = a, k = a.y, h = b, a = b.y) : (g = b, k = b.y, h = a, a = a.y), c.y < e.y ? (b = c, p = c.y, m = e, c = e.y) : (b = e, p = e.y, m = c, c = c.y)); return k <= p ? a < p ? [] : a === p ? f ? [] : [b] : a <= c ? [b, h] : [b, m] : k > c ? [] : k === c ? f ? [] : [g] : a <= c ? [g, h] : [g, m] } function f(a, b, c, d) { var e = b.x - a.x , f = b.y - a.y; b = c.x - a.x; c = c.y - a.y; var g = d.x - a.x; d = d.y - a.y; a = e * c - f * b; e = e * d - f * g; return Math.abs(a) > Number.EPSILON ? (b = g * c - d * b, 0 < a ? 0 <= e && 0 <= b : 0 <= e || 0 <= b) : 0 < e } c(a); b.forEach(c); var g, h, k, m, l, n = {}; k = a.concat(); g = 0; for (h = b.length; g < h; g++) Array.prototype.push.apply(k, b[g]); g = 0; for (h = k.length; g < h; g++) l = k[g].x + ":" + k[g].y, void 0 !== n[l] && console.warn("THREE.ShapeUtils: Duplicate point", l, g), n[l] = g; g = function(a, b) { function c(a, b) { var d = h.length - 1 , e = a - 1; 0 > e && (e = d); var g = a + 1; g > d && (g = 0); d = f(h[a], h[e], h[g], k[b]); if (!d) return !1; d = k.length - 1; e = b - 1; 0 > e && (e = d); g = b + 1; g > d && (g = 0); return (d = f(k[b], k[e], k[g], h[a])) ? !0 : !1 } function d(a, b) { var c, f; for (c = 0; c < h.length; c++) if (f = c + 1, f %= h.length, f = e(a, b, h[c], h[f], !0), 0 < f.length) return !0; return !1 } function g(a, c) { var d, f, h, k; for (d = 0; d < m.length; d++) for (f = b[m[d]], h = 0; h < f.length; h++) if (k = h + 1, k %= f.length, k = e(a, c, f[h], f[k], !0), 0 < k.length) return !0; return !1 } var h = a.concat(), k, m = [], l, n, p, q, w, B = [], z, C, G, J = 0; for (l = b.length; J < l; J++) m.push(J); z = 0; for (var N = 2 * m.length; 0 < m.length; ) { N--; if (0 > N) { console.log("Infinite Loop! Holes left:" + m.length + ", Probably Hole outside Shape!"); break } for (n = z; n < h.length; n++) { p = h[n]; l = -1; for (J = 0; J < m.length; J++) if (q = m[J], w = p.x + ":" + p.y + ":" + q, void 0 === B[w]) { k = b[q]; for (C = 0; C < k.length; C++) if (q = k[C], c(n, C) && !d(p, q) && !g(p, q)) { l = C; m.splice(J, 1); z = h.slice(0, n + 1); q = h.slice(n); C = k.slice(l); G = k.slice(0, l + 1); h = z.concat(C).concat(G).concat(q); z = n; break } if (0 <= l) break; B[w] = !0 } if (0 <= l) break } } return h }(a, b); var p = ra.triangulate(g, !1); g = 0; for (h = p.length; g < h; g++) for (m = p[g], k = 0; 3 > k; k++) l = m[k].x + ":" + m[k].y, l = n[l], void 0 !== l && (m[k] = l); return p.concat() }, isClockWise: function(a) { return 0 > ra.area(a) }, b2: function() { return function(a, b, c, d) { var e = 1 - a; return e * e * b + 2 * (1 - a) * a * c + a * a * d } }(), b3: function() { return function(a, b, c, d, e) { var f = 1 - a , g = 1 - a; return f * f * f * b + 3 * g * g * a * c + 3 * (1 - a) * a * a * d + a * a * a * e } }() }; za.prototype = Object.create(Q.prototype); za.prototype.constructor = za; za.prototype.addShapeList = function(a, b) { for (var c = a.length, d = 0; d < c; d++) this.addShape(a[d], b) } ; za.prototype.addShape = function(a, b) { function c(a, b, c) { b || console.error("THREE.ExtrudeGeometry: vec does not exist"); return b.clone().multiplyScalar(c).add(a) } function d(a, b, c) { var d, e, f; e = a.x - b.x; f = a.y - b.y; d = c.x - a.x; var g = c.y - a.y , h = e * e + f * f; if (Math.abs(e * g - f * d) > Number.EPSILON) { var k = Math.sqrt(h) , m = Math.sqrt(d * d + g * g) , h = b.x - f / k; b = b.y + e / k; g = ((c.x - g / m - h) * g - (c.y + d / m - b) * d) / (e * g - f * d); d = h + e * g - a.x; e = b + f * g - a.y; f = d * d + e * e; if (2 >= f) return new B(d,e); f = Math.sqrt(f / 2) } else a = !1, e > Number.EPSILON ? d > Number.EPSILON && (a = !0) : e < -Number.EPSILON ? d < -Number.EPSILON && (a = !0) : Math.sign(f) === Math.sign(g) && (a = !0), a ? (d = -f, f = Math.sqrt(h)) : (d = e, e = f, f = Math.sqrt(h / 2)); return new B(d / f,e / f) } function e(a, b) { var c, d; for (L = a.length; 0 <= --L; ) { c = L; d = L - 1; 0 > d && (d = a.length - 1); var e, f = r + 2 * l; for (e = 0; e < f; e++) { var g = T * e , h = T * (e + 1) , k = b + c + g , g = b + d + g , m = b + d + h , h = b + c + h , k = k + K , g = g + K , m = m + K , h = h + K; C.faces.push(new ea(k,g,h,null,null,1)); C.faces.push(new ea(g,m,h,null,null,1)); k = u.generateSideWallUV(C, k, g, m, h); C.faceVertexUvs[0].push([k[0], k[1], k[3]]); C.faceVertexUvs[0].push([k[1], k[2], k[3]]) } } } function f(a, b, c) { C.vertices.push(new q(a,b,c)) } function g(a, b, c) { a += K; b += K; c += K; C.faces.push(new ea(a,b,c,null,null,0)); a = u.generateTopUV(C, a, b, c); C.faceVertexUvs[0].push(a) } var h = void 0 !== b.amount ? b.amount : 100, k = void 0 !== b.bevelThickness ? b.bevelThickness : 6, m = void 0 !== b.bevelSize ? b.bevelSize : k - 2, l = void 0 !== b.bevelSegments ? b.bevelSegments : 3, n = void 0 !== b.bevelEnabled ? b.bevelEnabled : !0, p = void 0 !== b.curveSegments ? b.curveSegments : 12, r = void 0 !== b.steps ? b.steps : 1, x = b.extrudePath, t, D = !1, u = void 0 !== b.UVGenerator ? b.UVGenerator : za.WorldUVGenerator, v, I, y, E; x && (t = x.getSpacedPoints(r), D = !0, n = !1, v = void 0 !== b.frames ? b.frames : x.computeFrenetFrames(r, !1), I = new q, y = new q, E = new q); n || (m = k = l = 0); var H, F, z, C = this, K = this.vertices.length, x = a.extractPoints(p), p = x.shape, G = x.holes; if (x = !ra.isClockWise(p)) { p = p.reverse(); F = 0; for (z = G.length; F < z; F++) H = G[F], ra.isClockWise(H) && (G[F] = H.reverse()); x = !1 } var J = ra.triangulateShape(p, G) , Q = p; F = 0; for (z = G.length; F < z; F++) H = G[F], p = p.concat(H); var O, N, P, R, S, T = p.length, V, U = J.length, x = [], L = 0; P = Q.length; O = P - 1; for (N = L + 1; L < P; L++, O++, N++) O === P && (O = 0), N === P && (N = 0), x[L] = d(Q[L], Q[O], Q[N]); var W = [], X, Z = x.concat(); F = 0; for (z = G.length; F < z; F++) { H = G[F]; X = []; L = 0; P = H.length; O = P - 1; for (N = L + 1; L < P; L++, O++, N++) O === P && (O = 0), N === P && (N = 0), X[L] = d(H[L], H[O], H[N]); W.push(X); Z = Z.concat(X) } for (O = 0; O < l; O++) { P = O / l; R = k * Math.cos(P * Math.PI / 2); N = m * Math.sin(P * Math.PI / 2); L = 0; for (P = Q.length; L < P; L++) S = c(Q[L], x[L], N), f(S.x, S.y, -R); F = 0; for (z = G.length; F < z; F++) for (H = G[F], X = W[F], L = 0, P = H.length; L < P; L++) S = c(H[L], X[L], N), f(S.x, S.y, -R) } N = m; for (L = 0; L < T; L++) S = n ? c(p[L], Z[L], N) : p[L], D ? (y.copy(v.normals[0]).multiplyScalar(S.x), I.copy(v.binormals[0]).multiplyScalar(S.y), E.copy(t[0]).add(y).add(I), f(E.x, E.y, E.z)) : f(S.x, S.y, 0); for (P = 1; P <= r; P++) for (L = 0; L < T; L++) S = n ? c(p[L], Z[L], N) : p[L], D ? (y.copy(v.normals[P]).multiplyScalar(S.x), I.copy(v.binormals[P]).multiplyScalar(S.y), E.copy(t[P]).add(y).add(I), f(E.x, E.y, E.z)) : f(S.x, S.y, h / r * P); for (O = l - 1; 0 <= O; O--) { P = O / l; R = k * Math.cos(P * Math.PI / 2); N = m * Math.sin(P * Math.PI / 2); L = 0; for (P = Q.length; L < P; L++) S = c(Q[L], x[L], N), f(S.x, S.y, h + R); F = 0; for (z = G.length; F < z; F++) for (H = G[F], X = W[F], L = 0, P = H.length; L < P; L++) S = c(H[L], X[L], N), D ? f(S.x, S.y + t[r - 1].y, t[r - 1].x + R) : f(S.x, S.y, h + R) } (function() { if (n) { var a = 0 * T; for (L = 0; L < U; L++) V = J[L], g(V[2] + a, V[1] + a, V[0] + a); a = T * (r + 2 * l); for (L = 0; L < U; L++) V = J[L], g(V[0] + a, V[1] + a, V[2] + a) } else { for (L = 0; L < U; L++) V = J[L], g(V[2], V[1], V[0]); for (L = 0; L < U; L++) V = J[L], g(V[0] + T * r, V[1] + T * r, V[2] + T * r) } } )(); (function() { var a = 0; e(Q, a); a += Q.length; F = 0; for (z = G.length; F < z; F++) H = G[F], e(H, a), a += H.length } )() } ; za.WorldUVGenerator = { generateTopUV: function(a, b, c, d) { a = a.vertices; b = a[b]; c = a[c]; d = a[d]; return [new B(b.x,b.y), new B(c.x,c.y), new B(d.x,d.y)] }, generateSideWallUV: function(a, b, c, d, e) { a = a.vertices; b = a[b]; c = a[c]; d = a[d]; e = a[e]; return .01 > Math.abs(b.y - c.y) ? [new B(b.x,1 - b.z), new B(c.x,1 - c.z), new B(d.x,1 - d.z), new B(e.x,1 - e.z)] : [new B(b.y,1 - b.z), new B(c.y,1 - c.z), new B(d.y,1 - d.z), new B(e.y,1 - e.z)] } }; Dc.prototype = Object.create(za.prototype); Dc.prototype.constructor = Dc; mb.prototype = Object.create(G.prototype); mb.prototype.constructor = mb; Vb.prototype = Object.create(Q.prototype); Vb.prototype.constructor = Vb; Wb.prototype = Object.create(G.prototype); Wb.prototype.constructor = Wb; Ec.prototype = Object.create(Q.prototype); Ec.prototype.constructor = Ec; Fc.prototype = Object.create(Q.prototype); Fc.prototype.constructor = Fc; Xb.prototype = Object.create(G.prototype); Xb.prototype.constructor = Xb; Gc.prototype = Object.create(Q.prototype); Gc.prototype.constructor = Gc; cb.prototype = Object.create(Q.prototype); cb.prototype.constructor = cb; cb.prototype.addShapeList = function(a, b) { for (var c = 0, d = a.length; c < d; c++) this.addShape(a[c], b); return this } ; cb.prototype.addShape = function(a, b) { void 0 === b && (b = {}); var c = b.material, d = void 0 === b.UVGenerator ? za.WorldUVGenerator : b.UVGenerator, e, f, g, h = this.vertices.length; e = a.extractPoints(void 0 !== b.curveSegments ? b.curveSegments : 12); var k = e.shape , m = e.holes; if (!ra.isClockWise(k)) for (k = k.reverse(), e = 0, f = m.length; e < f; e++) g = m[e], ra.isClockWise(g) && (m[e] = g.reverse()); var l = ra.triangulateShape(k, m); e = 0; for (f = m.length; e < f; e++) g = m[e], k = k.concat(g); m = k.length; f = l.length; for (e = 0; e < m; e++) g = k[e], this.vertices.push(new q(g.x,g.y,0)); for (e = 0; e < f; e++) m = l[e], k = m[0] + h, g = m[1] + h, m = m[2] + h, this.faces.push(new ea(k,g,m,null,null,c)), this.faceVertexUvs[0].push(d.generateTopUV(this, k, g, m)) } ; Yb.prototype = Object.create(G.prototype); Yb.prototype.constructor = Yb; Ua.prototype = Object.create(G.prototype); Ua.prototype.constructor = Ua; nb.prototype = Object.create(Q.prototype); nb.prototype.constructor = nb; Hc.prototype = Object.create(nb.prototype); Hc.prototype.constructor = Hc; Ic.prototype = Object.create(Ua.prototype); Ic.prototype.constructor = Ic; Zb.prototype = Object.create(G.prototype); Zb.prototype.constructor = Zb; Jc.prototype = Object.create(Q.prototype); Jc.prototype.constructor = Jc; ob.prototype = Object.create(Q.prototype); ob.prototype.constructor = ob; var Na = Object.freeze({ WireframeGeometry: Mb, ParametricGeometry: uc, ParametricBufferGeometry: Nb, TetrahedronGeometry: vc, TetrahedronBufferGeometry: Ob, OctahedronGeometry: wc, OctahedronBufferGeometry: Pb, IcosahedronGeometry: xc, IcosahedronBufferGeometry: Qb, DodecahedronGeometry: yc, DodecahedronBufferGeometry: Rb, PolyhedronGeometry: zc, PolyhedronBufferGeometry: ua, TubeGeometry: Ac, TubeBufferGeometry: Sb, TorusKnotGeometry: Bc, TorusKnotBufferGeometry: Tb, TorusGeometry: Cc, TorusBufferGeometry: Ub, TextGeometry: Dc, SphereBufferGeometry: mb, SphereGeometry: Vb, RingGeometry: Ec, RingBufferGeometry: Wb, PlaneBufferGeometry: ib, PlaneGeometry: Fc, LatheGeometry: Gc, LatheBufferGeometry: Xb, ShapeGeometry: cb, ExtrudeGeometry: za, EdgesGeometry: Yb, ConeGeometry: Hc, ConeBufferGeometry: Ic, CylinderGeometry: nb, CylinderBufferGeometry: Ua, CircleBufferGeometry: Zb, CircleGeometry: Jc, BoxBufferGeometry: hb, BoxGeometry: ob }); $b.prototype = Object.create(Fa.prototype); $b.prototype.constructor = $b; $b.prototype.isShadowMaterial = !0; ac.prototype = Object.create(Fa.prototype); ac.prototype.constructor = ac; ac.prototype.isRawShaderMaterial = !0; Kc.prototype = { constructor: Kc, isMultiMaterial: !0, toJSON: function(a) { for (var b = { metadata: { version: 4.2, type: "material", generator: "MaterialExporter" }, uuid: this.uuid, type: this.type, materials: [] }, c = this.materials, d = 0, e = c.length; d < e; d++) { var f = c[d].toJSON(a); delete f.metadata; b.materials.push(f) } b.visible = this.visible; return b }, clone: function() { for (var a = new this.constructor, b = 0; b < this.materials.length; b++) a.materials.push(this.materials[b].clone()); a.visible = this.visible; return a } }; Oa.prototype = Object.create(U.prototype); Oa.prototype.constructor = Oa; Oa.prototype.isMeshStandardMaterial = !0; Oa.prototype.copy = function(a) { U.prototype.copy.call(this, a); this.defines = { STANDARD: "" }; this.color.copy(a.color); this.roughness = a.roughness; this.metalness = a.metalness; this.map = a.map; this.lightMap = a.lightMap; this.lightMapIntensity = a.lightMapIntensity; this.aoMap = a.aoMap; this.aoMapIntensity = a.aoMapIntensity; this.emissive.copy(a.emissive); this.emissiveMap = a.emissiveMap; this.emissiveIntensity = a.emissiveIntensity; this.bumpMap = a.bumpMap; this.bumpScale = a.bumpScale; this.normalMap = a.normalMap; this.normalScale.copy(a.normalScale); this.displacementMap = a.displacementMap; this.displacementScale = a.displacementScale; this.displacementBias = a.displacementBias; this.roughnessMap = a.roughnessMap; this.metalnessMap = a.metalnessMap; this.alphaMap = a.alphaMap; this.envMap = a.envMap; this.envMapIntensity = a.envMapIntensity; this.refractionRatio = a.refractionRatio; this.wireframe = a.wireframe; this.wireframeLinewidth = a.wireframeLinewidth; this.wireframeLinecap = a.wireframeLinecap; this.wireframeLinejoin = a.wireframeLinejoin; this.skinning = a.skinning; this.morphTargets = a.morphTargets; this.morphNormals = a.morphNormals; return this } ; pb.prototype = Object.create(Oa.prototype); pb.prototype.constructor = pb; pb.prototype.isMeshPhysicalMaterial = !0; pb.prototype.copy = function(a) { Oa.prototype.copy.call(this, a); this.defines = { PHYSICAL: "" }; this.reflectivity = a.reflectivity; this.clearCoat = a.clearCoat; this.clearCoatRoughness = a.clearCoatRoughness; return this } ; db.prototype = Object.create(U.prototype); db.prototype.constructor = db; db.prototype.isMeshPhongMaterial = !0; db.prototype.copy = function(a) { U.prototype.copy.call(this, a); this.color.copy(a.color); this.specular.copy(a.specular); this.shininess = a.shininess; this.map = a.map; this.lightMap = a.lightMap; this.lightMapIntensity = a.lightMapIntensity; this.aoMap = a.aoMap; this.aoMapIntensity = a.aoMapIntensity; this.emissive.copy(a.emissive); this.emissiveMap = a.emissiveMap; this.emissiveIntensity = a.emissiveIntensity; this.bumpMap = a.bumpMap; this.bumpScale = a.bumpScale; this.normalMap = a.normalMap; this.normalScale.copy(a.normalScale); this.displacementMap = a.displacementMap; this.displacementScale = a.displacementScale; this.displacementBias = a.displacementBias; this.specularMap = a.specularMap; this.alphaMap = a.alphaMap; this.envMap = a.envMap; this.combine = a.combine; this.reflectivity = a.reflectivity; this.refractionRatio = a.refractionRatio; this.wireframe = a.wireframe; this.wireframeLinewidth = a.wireframeLinewidth; this.wireframeLinecap = a.wireframeLinecap; this.wireframeLinejoin = a.wireframeLinejoin; this.skinning = a.skinning; this.morphTargets = a.morphTargets; this.morphNormals = a.morphNormals; return this } ; qb.prototype = Object.create(U.prototype); qb.prototype.constructor = qb; qb.prototype.isMeshNormalMaterial = !0; qb.prototype.copy = function(a) { U.prototype.copy.call(this, a); this.wireframe = a.wireframe; this.wireframeLinewidth = a.wireframeLinewidth; return this } ; rb.prototype = Object.create(U.prototype); rb.prototype.constructor = rb; rb.prototype.isMeshLambertMaterial = !0; rb.prototype.copy = function(a) { U.prototype.copy.call(this, a); this.color.copy(a.color); this.map = a.map; this.lightMap = a.lightMap; this.lightMapIntensity = a.lightMapIntensity; this.aoMap = a.aoMap; this.aoMapIntensity = a.aoMapIntensity; this.emissive.copy(a.emissive); this.emissiveMap = a.emissiveMap; this.emissiveIntensity = a.emissiveIntensity; this.specularMap = a.specularMap; this.alphaMap = a.alphaMap; this.envMap = a.envMap; this.combine = a.combine; this.reflectivity = a.reflectivity; this.refractionRatio = a.refractionRatio; this.wireframe = a.wireframe; this.wireframeLinewidth = a.wireframeLinewidth; this.wireframeLinecap = a.wireframeLinecap; this.wireframeLinejoin = a.wireframeLinejoin; this.skinning = a.skinning; this.morphTargets = a.morphTargets; this.morphNormals = a.morphNormals; return this } ; sb.prototype = Object.create(U.prototype); sb.prototype.constructor = sb; sb.prototype.isLineDashedMaterial = !0; sb.prototype.copy = function(a) { U.prototype.copy.call(this, a); this.color.copy(a.color); this.linewidth = a.linewidth; this.scale = a.scale; this.dashSize = a.dashSize; this.gapSize = a.gapSize; return this } ; var Df = Object.freeze({ ShadowMaterial: $b, SpriteMaterial: kb, RawShaderMaterial: ac, ShaderMaterial: Fa, PointsMaterial: xa, MultiMaterial: Kc, MeshPhysicalMaterial: pb, MeshStandardMaterial: Oa, MeshPhongMaterial: db, MeshNormalMaterial: qb, MeshLambertMaterial: rb, MeshDepthMaterial: Za, MeshBasicMaterial: Ma, LineDashedMaterial: sb, LineBasicMaterial: oa, Material: U }) , ce = { enabled: !1, files: {}, add: function(a, b) { !1 !== this.enabled && (this.files[a] = b) }, get: function(a) { if (!1 !== this.enabled) return this.files[a] }, remove: function(a) { delete this.files[a] }, clear: function() { this.files = {} } } , Ga = new Fd; Object.assign(Ja.prototype, { load: function(a, b, c, d) { void 0 === a && (a = ""); void 0 !== this.path && (a = this.path + a); var e = this , f = ce.get(a); if (void 0 !== f) return e.manager.itemStart(a), setTimeout(function() { b && b(f); e.manager.itemEnd(a) }, 0), f; var g = a.match(/^data:(.*?)(;base64)?,(.*)$/); if (g) { var h = g[1] , k = !!g[2] , g = g[3] , g = window.decodeURIComponent(g); k && (g = window.atob(g)); try { var m, l = (this.responseType || "").toLowerCase(); switch (l) { case "arraybuffer": case "blob": m = new ArrayBuffer(g.length); for (var n = new Uint8Array(m), k = 0; k < g.length; k++) n[k] = g.charCodeAt(k); "blob" === l && (m = new Blob([m],{ type: h })); break; case "document": m = (new DOMParser).parseFromString(g, h); break; case "json": m = JSON.parse(g); break; default: m = g } window.setTimeout(function() { b && b(m); e.manager.itemEnd(a) }, 0) } catch (q) { window.setTimeout(function() { d && d(q); e.manager.itemError(a) }, 0) } } else { var p = new XMLHttpRequest; p.open("GET", a, !0); p.addEventListener("load", function(c) { var f = c.target.response; ce.add(a, f); 200 === this.status ? (b && b(f), e.manager.itemEnd(a)) : 0 === this.status ? (console.warn("THREE.XHRLoader: HTTP Status 0 received."), b && b(f), e.manager.itemEnd(a)) : (d && d(c), e.manager.itemError(a)) }, !1); void 0 !== c && p.addEventListener("progress", function(a) { c(a) }, !1); p.addEventListener("error", function(b) { d && d(b); e.manager.itemError(a) }, !1); void 0 !== this.responseType && (p.responseType = this.responseType); void 0 !== this.withCredentials && (p.withCredentials = this.withCredentials); p.overrideMimeType && p.overrideMimeType("text/plain"); p.send(null) } e.manager.itemStart(a); return p }, setPath: function(a) { this.path = a; return this }, setResponseType: function(a) { this.responseType = a; return this }, setWithCredentials: function(a) { this.withCredentials = a; return this } }); Object.assign(we.prototype, { load: function(a, b, c, d) { function e(e) { k.load(a[e], function(a) { a = f._parser(a, !0); g[e] = { width: a.width, height: a.height, format: a.format, mipmaps: a.mipmaps }; m += 1; 6 === m && (1 === a.mipmapCount && (h.minFilter = 1006), h.format = a.format, h.needsUpdate = !0, b && b(h)) }, c, d) } var f = this , g = [] , h = new Lb; h.image = g; var k = new Ja(this.manager); k.setPath(this.path); k.setResponseType("arraybuffer"); if (Array.isArray(a)) for (var m = 0, l = 0, n = a.length; l < n; ++l) e(l); else k.load(a, function(a) { a = f._parser(a, !0); if (a.isCubemap) for (var c = a.mipmaps.length / a.mipmapCount, d = 0; d < c; d++) { g[d] = { mipmaps: [] }; for (var e = 0; e < a.mipmapCount; e++) g[d].mipmaps.push(a.mipmaps[d * a.mipmapCount + e]), g[d].format = a.format, g[d].width = a.width, g[d].height = a.height } else h.image.width = a.width, h.image.height = a.height, h.mipmaps = a.mipmaps; 1 === a.mipmapCount && (h.minFilter = 1006); h.format = a.format; h.needsUpdate = !0; b && b(h) }, c, d); return h }, setPath: function(a) { this.path = a; return this } }); Object.assign(Gd.prototype, { load: function(a, b, c, d) { var e = this , f = new lb , g = new Ja(this.manager); g.setResponseType("arraybuffer"); g.load(a, function(a) { if (a = e._parser(a)) void 0 !== a.image ? f.image = a.image : void 0 !== a.data && (f.image.width = a.width, f.image.height = a.height, f.image.data = a.data), f.wrapS = void 0 !== a.wrapS ? a.wrapS : 1001, f.wrapT = void 0 !== a.wrapT ? a.wrapT : 1001, f.magFilter = void 0 !== a.magFilter ? a.magFilter : 1006, f.minFilter = void 0 !== a.minFilter ? a.minFilter : 1008, f.anisotropy = void 0 !== a.anisotropy ? a.anisotropy : 1, void 0 !== a.format && (f.format = a.format), void 0 !== a.type && (f.type = a.type), void 0 !== a.mipmaps && (f.mipmaps = a.mipmaps), 1 === a.mipmapCount && (f.minFilter = 1006), f.needsUpdate = !0, b && b(f, a) }, c, d); return f } }); Object.assign(Lc.prototype, { load: function(a, b, c, d) { var e = this , f = document.createElementNS("http://www.w3.org/1999/xhtml", "img"); f.onload = function() { f.onload = null; URL.revokeObjectURL(f.src); b && b(f); e.manager.itemEnd(a) } ; f.onerror = d; if (0 === a.indexOf("data:")) f.src = a; else { var g = new Ja; g.setPath(this.path); g.setResponseType("blob"); g.setWithCredentials(this.withCredentials); g.load(a, function(a) { f.src = URL.createObjectURL(a) }, c, d) } e.manager.itemStart(a); return f }, setCrossOrigin: function(a) { this.crossOrigin = a; return this }, setWithCredentials: function(a) { this.withCredentials = a; return this }, setPath: function(a) { this.path = a; return this } }); Object.assign(Hd.prototype, { load: function(a, b, c, d) { function e(c) { g.load(a[c], function(a) { f.images[c] = a; h++; 6 === h && (f.needsUpdate = !0, b && b(f)) }, void 0, d) } var f = new Xa , g = new Lc(this.manager); g.setCrossOrigin(this.crossOrigin); g.setPath(this.path); var h = 0; for (c = 0; c < a.length; ++c) e(c); return f }, setCrossOrigin: function(a) { this.crossOrigin = a; return this }, setPath: function(a) { this.path = a; return this } }); Object.assign(gd.prototype, { load: function(a, b, c, d) { var e = new da , f = new Lc(this.manager); f.setCrossOrigin(this.crossOrigin); f.setWithCredentials(this.withCredentials); f.setPath(this.path); f.load(a, function(c) { var d = 0 < a.search(/\.(jpg|jpeg)$/) || 0 === a.search(/^data\:image\/jpeg/); e.format = d ? 1022 : 1023; e.image = c; e.needsUpdate = !0; void 0 !== b && b(e) }, c, d); return e }, setCrossOrigin: function(a) { this.crossOrigin = a; return this }, setWithCredentials: function(a) { this.withCredentials = a; return this }, setPath: function(a) { this.path = a; return this } }); pa.prototype = Object.assign(Object.create(z.prototype), { constructor: pa, isLight: !0, copy: function(a) { z.prototype.copy.call(this, a); this.color.copy(a.color); this.intensity = a.intensity; return this }, toJSON: function(a) { a = z.prototype.toJSON.call(this, a); a.object.color = this.color.getHex(); a.object.intensity = this.intensity; void 0 !== this.groundColor && (a.object.groundColor = this.groundColor.getHex()); void 0 !== this.distance && (a.object.distance = this.distance); void 0 !== this.angle && (a.object.angle = this.angle); void 0 !== this.decay && (a.object.decay = this.decay); void 0 !== this.penumbra && (a.object.penumbra = this.penumbra); void 0 !== this.shadow && (a.object.shadow = this.shadow.toJSON()); return a } }); hd.prototype = Object.assign(Object.create(pa.prototype), { constructor: hd, isHemisphereLight: !0, copy: function(a) { pa.prototype.copy.call(this, a); this.groundColor.copy(a.groundColor); return this } }); Object.assign(tb.prototype, { copy: function(a) { this.camera = a.camera.clone(); this.bias = a.bias; this.radius = a.radius; this.mapSize.copy(a.mapSize); return this }, clone: function() { return (new this.constructor).copy(this) }, toJSON: function() { var a = {}; 0 !== this.bias && (a.bias = this.bias); 1 !== this.radius && (a.radius = this.radius); if (512 !== this.mapSize.x || 512 !== this.mapSize.y) a.mapSize = this.mapSize.toArray(); a.camera = this.camera.toJSON(!1).object; delete a.camera.matrix; return a } }); id.prototype = Object.assign(Object.create(tb.prototype), { constructor: id, isSpotLightShadow: !0, update: function(a) { var b = 2 * T.RAD2DEG * a.angle , c = this.mapSize.width / this.mapSize.height; a = a.distance || 500; var d = this.camera; if (b !== d.fov || c !== d.aspect || a !== d.far) d.fov = b, d.aspect = c, d.far = a, d.updateProjectionMatrix() } }); jd.prototype = Object.assign(Object.create(pa.prototype), { constructor: jd, isSpotLight: !0, copy: function(a) { pa.prototype.copy.call(this, a); this.distance = a.distance; this.angle = a.angle; this.penumbra = a.penumbra; this.decay = a.decay; this.target = a.target.clone(); this.shadow = a.shadow.clone(); return this } }); kd.prototype = Object.assign(Object.create(pa.prototype), { constructor: kd, isPointLight: !0, copy: function(a) { pa.prototype.copy.call(this, a); this.distance = a.distance; this.decay = a.decay; this.shadow = a.shadow.clone(); return this } }); ld.prototype = Object.assign(Object.create(tb.prototype), { constructor: ld }); md.prototype = Object.assign(Object.create(pa.prototype), { constructor: md, isDirectionalLight: !0, copy: function(a) { pa.prototype.copy.call(this, a); this.target = a.target.clone(); this.shadow = a.shadow.clone(); return this } }); nd.prototype = Object.assign(Object.create(pa.prototype), { constructor: nd, isAmbientLight: !0 }); var ma = { arraySlice: function(a, b, c) { return ma.isTypedArray(a) ? new a.constructor(a.subarray(b, c)) : a.slice(b, c) }, convertArray: function(a, b, c) { return !a || !c && a.constructor === b ? a : "number" === typeof b.BYTES_PER_ELEMENT ? new b(a) : Array.prototype.slice.call(a) }, isTypedArray: function(a) { return ArrayBuffer.isView(a) && !(a instanceof DataView) }, getKeyframeOrder: function(a) { for (var b = a.length, c = Array(b), d = 0; d !== b; ++d) c[d] = d; c.sort(function(b, c) { return a[b] - a[c] }); return c }, sortedArray: function(a, b, c) { for (var d = a.length, e = new a.constructor(d), f = 0, g = 0; g !== d; ++f) for (var h = c[f] * b, k = 0; k !== b; ++k) e[g++] = a[h + k]; return e }, flattenJSON: function(a, b, c, d) { for (var e = 1, f = a[0]; void 0 !== f && void 0 === f[d]; ) f = a[e++]; if (void 0 !== f) { var g = f[d]; if (void 0 !== g) if (Array.isArray(g)) { do g = f[d], void 0 !== g && (b.push(f.time), c.push.apply(c, g)), f = a[e++]; while (void 0 !== f) } else if (void 0 !== g.toArray) { do g = f[d], void 0 !== g && (b.push(f.time), g.toArray(c, c.length)), f = a[e++]; while (void 0 !== f) } else { do g = f[d], void 0 !== g && (b.push(f.time), c.push(g)), f = a[e++]; while (void 0 !== f) } } } }; qa.prototype = { constructor: qa, evaluate: function(a) { var b = this.parameterPositions , c = this._cachedIndex , d = b[c] , e = b[c - 1]; a: { b: { c: { d: if (!(a < d)) { for (var f = c + 2; ; ) { if (void 0 === d) { if (a < e) break d; this._cachedIndex = c = b.length; return this.afterEnd_(c - 1, a, e) } if (c === f) break; e = d; d = b[++c]; if (a < d) break b } d = b.length; break c } if (a >= e) break a; else { f = b[1]; a < f && (c = 2, e = f); for (f = c - 2; ; ) { if (void 0 === e) return this._cachedIndex = 0, this.beforeStart_(0, a, d); if (c === f) break; d = e; e = b[--c - 1]; if (a >= e) break b } d = c; c = 0 } } for (; c < d; ) e = c + d >>> 1, a < b[e] ? d = e : c = e + 1; d = b[c]; e = b[c - 1]; if (void 0 === e) return this._cachedIndex = 0, this.beforeStart_(0, a, d); if (void 0 === d) return this._cachedIndex = c = b.length, this.afterEnd_(c - 1, e, a) } this._cachedIndex = c; this.intervalChanged_(c, e, d) } return this.interpolate_(c, e, a, d) }, settings: null, DefaultSettings_: {}, getSettings_: function() { return this.settings || this.DefaultSettings_ }, copySampleValue_: function(a) { var b = this.resultBuffer , c = this.sampleValues , d = this.valueSize; a *= d; for (var e = 0; e !== d; ++e) b[e] = c[a + e]; return b }, interpolate_: function(a, b, c, d) { throw Error("call to abstract method"); }, intervalChanged_: function(a, b, c) {} }; Object.assign(qa.prototype, { beforeStart_: qa.prototype.copySampleValue_, afterEnd_: qa.prototype.copySampleValue_ }); od.prototype = Object.assign(Object.create(qa.prototype), { constructor: od, DefaultSettings_: { endingStart: 2400, endingEnd: 2400 }, intervalChanged_: function(a, b, c) { var d = this.parameterPositions , e = a - 2 , f = a + 1 , g = d[e] , h = d[f]; if (void 0 === g) switch (this.getSettings_().endingStart) { case 2401: e = a; g = 2 * b - c; break; case 2402: e = d.length - 2; g = b + d[e] - d[e + 1]; break; default: e = a, g = c } if (void 0 === h) switch (this.getSettings_().endingEnd) { case 2401: f = a; h = 2 * c - b; break; case 2402: f = 1; h = c + d[1] - d[0]; break; default: f = a - 1, h = b } a = .5 * (c - b); d = this.valueSize; this._weightPrev = a / (b - g); this._weightNext = a / (h - c); this._offsetPrev = e * d; this._offsetNext = f * d }, interpolate_: function(a, b, c, d) { var e = this.resultBuffer , f = this.sampleValues , g = this.valueSize; a *= g; var h = a - g , k = this._offsetPrev , m = this._offsetNext , l = this._weightPrev , n = this._weightNext , p = (c - b) / (d - b); c = p * p; d = c * p; b = -l * d + 2 * l * c - l * p; l = (1 + l) * d + (-1.5 - 2 * l) * c + (-.5 + l) * p + 1; p = (-1 - n) * d + (1.5 + n) * c + .5 * p; n = n * d - n * c; for (c = 0; c !== g; ++c) e[c] = b * f[k + c] + l * f[h + c] + p * f[a + c] + n * f[m + c]; return e } }); Mc.prototype = Object.assign(Object.create(qa.prototype), { constructor: Mc, interpolate_: function(a, b, c, d) { var e = this.resultBuffer , f = this.sampleValues , g = this.valueSize; a *= g; var h = a - g; b = (c - b) / (d - b); c = 1 - b; for (d = 0; d !== g; ++d) e[d] = f[h + d] * c + f[a + d] * b; return e } }); pd.prototype = Object.assign(Object.create(qa.prototype), { constructor: pd, interpolate_: function(a, b, c, d) { return this.copySampleValue_(a - 1) } }); var Wa; Wa = { TimeBufferType: Float32Array, ValueBufferType: Float32Array, DefaultInterpolation: 2301, InterpolantFactoryMethodDiscrete: function(a) { return new pd(this.times,this.values,this.getValueSize(),a) }, InterpolantFactoryMethodLinear: function(a) { return new Mc(this.times,this.values,this.getValueSize(),a) }, InterpolantFactoryMethodSmooth: function(a) { return new od(this.times,this.values,this.getValueSize(),a) }, setInterpolation: function(a) { var b; switch (a) { case 2300: b = this.InterpolantFactoryMethodDiscrete; break; case 2301: b = this.InterpolantFactoryMethodLinear; break; case 2302: b = this.InterpolantFactoryMethodSmooth } if (void 0 === b) { b = "unsupported interpolation for " + this.ValueTypeName + " keyframe track named " + this.name; if (void 0 === this.createInterpolant) if (a !== this.DefaultInterpolation) this.setInterpolation(this.DefaultInterpolation); else throw Error(b); console.warn(b) } else this.createInterpolant = b }, getInterpolation: function() { switch (this.createInterpolant) { case this.InterpolantFactoryMethodDiscrete: return 2300; case this.InterpolantFactoryMethodLinear: return 2301; case this.InterpolantFactoryMethodSmooth: return 2302 } }, getValueSize: function() { return this.values.length / this.times.length }, shift: function(a) { if (0 !== a) for (var b = this.times, c = 0, d = b.length; c !== d; ++c) b[c] += a; return this }, scale: function(a) { if (1 !== a) for (var b = this.times, c = 0, d = b.length; c !== d; ++c) b[c] *= a; return this }, trim: function(a, b) { for (var c = this.times, d = c.length, e = 0, f = d - 1; e !== d && c[e] < a; ) ++e; for (; -1 !== f && c[f] > b; ) --f; ++f; if (0 !== e || f !== d) e >= f && (f = Math.max(f, 1), e = f - 1), d = this.getValueSize(), this.times = ma.arraySlice(c, e, f), this.values = ma.arraySlice(this.values, e * d, f * d); return this }, validate: function() { var a = !0 , b = this.getValueSize(); 0 !== b - Math.floor(b) && (console.error("invalid value size in track", this), a = !1); var c = this.times , b = this.values , d = c.length; 0 === d && (console.error("track is empty", this), a = !1); for (var e = null, f = 0; f !== d; f++) { var g = c[f]; if ("number" === typeof g && isNaN(g)) { console.error("time is not a valid number", this, f, g); a = !1; break } if (null !== e && e > g) { console.error("out of order keys", this, f, g, e); a = !1; break } e = g } if (void 0 !== b && ma.isTypedArray(b)) for (f = 0, c = b.length; f !== c; ++f) if (d = b[f], isNaN(d)) { console.error("value is not a valid number", this, f, d); a = !1; break } return a }, optimize: function() { for (var a = this.times, b = this.values, c = this.getValueSize(), d = 2302 === this.getInterpolation(), e = 1, f = a.length - 1, g = 1; g < f; ++g) { var h = !1 , k = a[g]; if (k !== a[g + 1] && (1 !== g || k !== k[0])) if (d) h = !0; else for (var m = g * c, l = m - c, n = m + c, k = 0; k !== c; ++k) { var p = b[m + k]; if (p !== b[l + k] || p !== b[n + k]) { h = !0; break } } if (h) { if (g !== e) for (a[e] = a[g], h = g * c, m = e * c, k = 0; k !== c; ++k) b[m + k] = b[h + k]; ++e } } if (0 < f) { a[e] = a[f]; h = f * c; m = e * c; for (k = 0; k !== c; ++k) b[m + k] = b[h + k]; ++e } e !== a.length && (this.times = ma.arraySlice(a, 0, e), this.values = ma.arraySlice(b, 0, e * c)); return this } }; bc.prototype = Object.assign(Object.create(Wa), { constructor: bc, ValueTypeName: "vector" }); qd.prototype = Object.assign(Object.create(qa.prototype), { constructor: qd, interpolate_: function(a, b, c, d) { var e = this.resultBuffer , f = this.sampleValues , g = this.valueSize; a *= g; b = (c - b) / (d - b); for (c = a + g; a !== c; a += 4) ba.slerpFlat(e, 0, f, a - g, f, a, b); return e } }); Nc.prototype = Object.assign(Object.create(Wa), { constructor: Nc, ValueTypeName: "quaternion", DefaultInterpolation: 2301, InterpolantFactoryMethodLinear: function(a) { return new qd(this.times,this.values,this.getValueSize(),a) }, InterpolantFactoryMethodSmooth: void 0 }); cc.prototype = Object.assign(Object.create(Wa), { constructor: cc, ValueTypeName: "number" }); rd.prototype = Object.assign(Object.create(Wa), { constructor: rd, ValueTypeName: "string", ValueBufferType: Array, DefaultInterpolation: 2300, InterpolantFactoryMethodLinear: void 0, InterpolantFactoryMethodSmooth: void 0 }); sd.prototype = Object.assign(Object.create(Wa), { constructor: sd, ValueTypeName: "bool", ValueBufferType: Array, DefaultInterpolation: 2300, InterpolantFactoryMethodLinear: void 0, InterpolantFactoryMethodSmooth: void 0 }); td.prototype = Object.assign(Object.create(Wa), { constructor: td, ValueTypeName: "color" }); vb.prototype = Wa; Wa.constructor = vb; Object.assign(vb, { parse: function(a) { if (void 0 === a.type) throw Error("track type undefined, can not parse"); var b = vb._getTrackTypeForValueTypeName(a.type); if (void 0 === a.times) { var c = [] , d = []; ma.flattenJSON(a.keys, c, d, "value"); a.times = c; a.values = d } return void 0 !== b.parse ? b.parse(a) : new b(a.name,a.times,a.values,a.interpolation) }, toJSON: function(a) { var b = a.constructor; if (void 0 !== b.toJSON) b = b.toJSON(a); else { var b = { name: a.name, times: ma.convertArray(a.times, Array), values: ma.convertArray(a.values, Array) } , c = a.getInterpolation(); c !== a.DefaultInterpolation && (b.interpolation = c) } b.type = a.ValueTypeName; return b }, _getTrackTypeForValueTypeName: function(a) { switch (a.toLowerCase()) { case "scalar": case "double": case "float": case "number": case "integer": return cc; case "vector": case "vector2": case "vector3": case "vector4": return bc; case "color": return td; case "quaternion": return Nc; case "bool": case "boolean": return sd; case "string": return rd } throw Error("Unsupported typeName: " + a); } }); Ha.prototype = { constructor: Ha, resetDuration: function() { for (var a = 0, b = 0, c = this.tracks.length; b !== c; ++b) var d = this.tracks[b] , a = Math.max(a, d.times[d.times.length - 1]); this.duration = a }, trim: function() { for (var a = 0; a < this.tracks.length; a++) this.tracks[a].trim(0, this.duration); return this }, optimize: function() { for (var a = 0; a < this.tracks.length; a++) this.tracks[a].optimize(); return this } }; Object.assign(Ha, { parse: function(a) { for (var b = [], c = a.tracks, d = 1 / (a.fps || 1), e = 0, f = c.length; e !== f; ++e) b.push(vb.parse(c[e]).scale(d)); return new Ha(a.name,a.duration,b) }, toJSON: function(a) { var b = [] , c = a.tracks; a = { name: a.name, duration: a.duration, tracks: b }; for (var d = 0, e = c.length; d !== e; ++d) b.push(vb.toJSON(c[d])); return a }, CreateFromMorphTargetSequence: function(a, b, c, d) { for (var e = b.length, f = [], g = 0; g < e; g++) { var h = [] , k = []; h.push((g + e - 1) % e, g, (g + 1) % e); k.push(0, 1, 0); var m = ma.getKeyframeOrder(h) , h = ma.sortedArray(h, 1, m) , k = ma.sortedArray(k, 1, m); d || 0 !== h[0] || (h.push(e), k.push(k[0])); f.push((new cc(".morphTargetInfluences[" + b[g].name + "]",h,k)).scale(1 / c)) } return new Ha(a,-1,f) }, findByName: function(a, b) { var c = a; Array.isArray(a) || (c = a.geometry && a.geometry.animations || a.animations); for (var d = 0; d < c.length; d++) if (c[d].name === b) return c[d]; return null }, CreateClipsFromMorphTargetSequences: function(a, b, c) { for (var d = {}, e = /^([\w-]*?)([\d]+)$/, f = 0, g = a.length; f < g; f++) { var h = a[f] , k = h.name.match(e); if (k && 1 < k.length) { var m = k[1]; (k = d[m]) || (d[m] = k = []); k.push(h) } } a = []; for (m in d) a.push(Ha.CreateFromMorphTargetSequence(m, d[m], b, c)); return a }, parseAnimation: function(a, b) { if (!a) return console.error(" no animation in JSONLoader data"), null; for (var c = function(a, b, c, d, e) { if (0 !== c.length) { var f = [] , g = []; ma.flattenJSON(c, f, g, d); 0 !== f.length && e.push(new a(b,f,g)) } }, d = [], e = a.name || "default", f = a.length || -1, g = a.fps || 30, h = a.hierarchy || [], k = 0; k < h.length; k++) { var m = h[k].keys; if (m && 0 !== m.length) if (m[0].morphTargets) { for (var f = {}, l = 0; l < m.length; l++) if (m[l].morphTargets) for (var n = 0; n < m[l].morphTargets.length; n++) f[m[l].morphTargets[n]] = -1; for (var p in f) { for (var q = [], x = [], n = 0; n !== m[l].morphTargets.length; ++n) { var t = m[l]; q.push(t.time); x.push(t.morphTarget === p ? 1 : 0) } d.push(new cc(".morphTargetInfluence[" + p + "]",q,x)) } f = f.length * (g || 1) } else l = ".bones[" + b[k].name + "]", c(bc, l + ".position", m, "pos", d), c(Nc, l + ".quaternion", m, "rot", d), c(bc, l + ".scale", m, "scl", d) } return 0 === d.length ? null : new Ha(e,f,d) } }); Object.assign(ud.prototype, { load: function(a, b, c, d) { var e = this; (new Ja(e.manager)).load(a, function(a) { b(e.parse(JSON.parse(a))) }, c, d) }, setTextures: function(a) { this.textures = a }, parse: function(a) { function b(a) { void 0 === c[a] && console.warn("THREE.MaterialLoader: Undefined texture", a); return c[a] } var c = this.textures , d = new Df[a.type]; void 0 !== a.uuid && (d.uuid = a.uuid); void 0 !== a.name && (d.name = a.name); void 0 !== a.color && d.color.setHex(a.color); void 0 !== a.roughness && (d.roughness = a.roughness); void 0 !== a.metalness && (d.metalness = a.metalness); void 0 !== a.emissive && d.emissive.setHex(a.emissive); void 0 !== a.specular && d.specular.setHex(a.specular); void 0 !== a.shininess && (d.shininess = a.shininess); void 0 !== a.uniforms && (d.uniforms = a.uniforms); void 0 !== a.vertexShader && (d.vertexShader = a.vertexShader); void 0 !== a.fragmentShader && (d.fragmentShader = a.fragmentShader); void 0 !== a.vertexColors && (d.vertexColors = a.vertexColors); void 0 !== a.fog && (d.fog = a.fog); void 0 !== a.shading && (d.shading = a.shading); void 0 !== a.blending && (d.blending = a.blending); void 0 !== a.side && (d.side = a.side); void 0 !== a.opacity && (d.opacity = a.opacity); void 0 !== a.transparent && (d.transparent = a.transparent); void 0 !== a.alphaTest && (d.alphaTest = a.alphaTest); void 0 !== a.depthTest && (d.depthTest = a.depthTest); void 0 !== a.depthWrite && (d.depthWrite = a.depthWrite); void 0 !== a.colorWrite && (d.colorWrite = a.colorWrite); void 0 !== a.wireframe && (d.wireframe = a.wireframe); void 0 !== a.wireframeLinewidth && (d.wireframeLinewidth = a.wireframeLinewidth); void 0 !== a.wireframeLinecap && (d.wireframeLinecap = a.wireframeLinecap); void 0 !== a.wireframeLinejoin && (d.wireframeLinejoin = a.wireframeLinejoin); void 0 !== a.skinning && (d.skinning = a.skinning); void 0 !== a.morphTargets && (d.morphTargets = a.morphTargets); void 0 !== a.size && (d.size = a.size); void 0 !== a.sizeAttenuation && (d.sizeAttenuation = a.sizeAttenuation); void 0 !== a.map && (d.map = b(a.map)); void 0 !== a.alphaMap && (d.alphaMap = b(a.alphaMap), d.transparent = !0); void 0 !== a.bumpMap && (d.bumpMap = b(a.bumpMap)); void 0 !== a.bumpScale && (d.bumpScale = a.bumpScale); void 0 !== a.normalMap && (d.normalMap = b(a.normalMap)); if (void 0 !== a.normalScale) { var e = a.normalScale; !1 === Array.isArray(e) && (e = [e, e]); d.normalScale = (new B).fromArray(e) } void 0 !== a.displacementMap && (d.displacementMap = b(a.displacementMap)); void 0 !== a.displacementScale && (d.displacementScale = a.displacementScale); void 0 !== a.displacementBias && (d.displacementBias = a.displacementBias); void 0 !== a.roughnessMap && (d.roughnessMap = b(a.roughnessMap)); void 0 !== a.metalnessMap && (d.metalnessMap = b(a.metalnessMap)); void 0 !== a.emissiveMap && (d.emissiveMap = b(a.emissiveMap)); void 0 !== a.emissiveIntensity && (d.emissiveIntensity = a.emissiveIntensity); void 0 !== a.specularMap && (d.specularMap = b(a.specularMap)); void 0 !== a.envMap && (d.envMap = b(a.envMap)); void 0 !== a.reflectivity && (d.reflectivity = a.reflectivity); void 0 !== a.lightMap && (d.lightMap = b(a.lightMap)); void 0 !== a.lightMapIntensity && (d.lightMapIntensity = a.lightMapIntensity); void 0 !== a.aoMap && (d.aoMap = b(a.aoMap)); void 0 !== a.aoMapIntensity && (d.aoMapIntensity = a.aoMapIntensity); if (void 0 !== a.materials) for (var e = 0, f = a.materials.length; e < f; e++) d.materials.push(this.parse(a.materials[e])); return d } }); Object.assign(Id.prototype, { load: function(a, b, c, d) { var e = this; (new Ja(e.manager)).load(a, function(a) { b(e.parse(JSON.parse(a))) }, c, d) }, parse: function(a) { var b = new G , c = a.data.index , d = { Int8Array: Int8Array, Uint8Array: Uint8Array, Uint8ClampedArray: Uint8ClampedArray, Int16Array: Int16Array, Uint16Array: Uint16Array, Int32Array: Int32Array, Uint32Array: Uint32Array, Float32Array: Float32Array, Float64Array: Float64Array }; void 0 !== c && (c = new d[c.type](c.array), b.setIndex(new C(c,1))); var e = a.data.attributes, f; for (f in e) { var g = e[f] , c = new d[g.type](g.array); b.addAttribute(f, new C(c,g.itemSize,g.normalized)) } d = a.data.groups || a.data.drawcalls || a.data.offsets; if (void 0 !== d) for (f = 0, c = d.length; f !== c; ++f) e = d[f], b.addGroup(e.start, e.count, e.materialIndex); a = a.data.boundingSphere; void 0 !== a && (d = new q, void 0 !== a.center && d.fromArray(a.center), b.boundingSphere = new Ca(d,a.radius)); return b } }); wb.prototype = { constructor: wb, crossOrigin: void 0, extractUrlBase: function(a) { a = a.split("/"); if (1 === a.length) return "./"; a.pop(); return a.join("/") + "/" }, initMaterials: function(a, b, c) { for (var d = [], e = 0; e < a.length; ++e) d[e] = this.createMaterial(a[e], b, c); return d }, createMaterial: function() { var a, b, c; return function(d, e, f) { function g(a, c, d, g, k) { a = e + a; var l = wb.Handlers.get(a); null !== l ? a = l.load(a) : (b.setCrossOrigin(f), a = b.load(a)); void 0 !== c && (a.repeat.fromArray(c), 1 !== c[0] && (a.wrapS = 1E3), 1 !== c[1] && (a.wrapT = 1E3)); void 0 !== d && a.offset.fromArray(d); void 0 !== g && ("repeat" === g[0] && (a.wrapS = 1E3), "mirror" === g[0] && (a.wrapS = 1002), "repeat" === g[1] && (a.wrapT = 1E3), "mirror" === g[1] && (a.wrapT = 1002)); void 0 !== k && (a.anisotropy = k); c = T.generateUUID(); h[c] = a; return c } void 0 === a && (a = new O); void 0 === b && (b = new gd); void 0 === c && (c = new ud); var h = {}, k = { uuid: T.generateUUID(), type: "MeshLambertMaterial" }, m; for (m in d) { var l = d[m]; switch (m) { case "DbgColor": case "DbgIndex": case "opticalDensity": case "illumination": break; case "DbgName": k.name = l; break; case "blending": k.blending = Fe[l]; break; case "colorAmbient": case "mapAmbient": console.warn("THREE.Loader.createMaterial:", m, "is no longer supported."); break; case "colorDiffuse": k.color = a.fromArray(l).getHex(); break; case "colorSpecular": k.specular = a.fromArray(l).getHex(); break; case "colorEmissive": k.emissive = a.fromArray(l).getHex(); break; case "specularCoef": k.shininess = l; break; case "shading": "basic" === l.toLowerCase() && (k.type = "MeshBasicMaterial"); "phong" === l.toLowerCase() && (k.type = "MeshPhongMaterial"); "standard" === l.toLowerCase() && (k.type = "MeshStandardMaterial"); break; case "mapDiffuse": k.map = g(l, d.mapDiffuseRepeat, d.mapDiffuseOffset, d.mapDiffuseWrap, d.mapDiffuseAnisotropy); break; case "mapDiffuseRepeat": case "mapDiffuseOffset": case "mapDiffuseWrap": case "mapDiffuseAnisotropy": break; case "mapEmissive": k.emissiveMap = g(l, d.mapEmissiveRepeat, d.mapEmissiveOffset, d.mapEmissiveWrap, d.mapEmissiveAnisotropy); break; case "mapEmissiveRepeat": case "mapEmissiveOffset": case "mapEmissiveWrap": case "mapEmissiveAnisotropy": break; case "mapLight": k.lightMap = g(l, d.mapLightRepeat, d.mapLightOffset, d.mapLightWrap, d.mapLightAnisotropy); break; case "mapLightRepeat": case "mapLightOffset": case "mapLightWrap": case "mapLightAnisotropy": break; case "mapAO": k.aoMap = g(l, d.mapAORepeat, d.mapAOOffset, d.mapAOWrap, d.mapAOAnisotropy); break; case "mapAORepeat": case "mapAOOffset": case "mapAOWrap": case "mapAOAnisotropy": break; case "mapBump": k.bumpMap = g(l, d.mapBumpRepeat, d.mapBumpOffset, d.mapBumpWrap, d.mapBumpAnisotropy); break; case "mapBumpScale": k.bumpScale = l; break; case "mapBumpRepeat": case "mapBumpOffset": case "mapBumpWrap": case "mapBumpAnisotropy": break; case "mapNormal": k.normalMap = g(l, d.mapNormalRepeat, d.mapNormalOffset, d.mapNormalWrap, d.mapNormalAnisotropy); break; case "mapNormalFactor": k.normalScale = [l, l]; break; case "mapNormalRepeat": case "mapNormalOffset": case "mapNormalWrap": case "mapNormalAnisotropy": break; case "mapSpecular": k.specularMap = g(l, d.mapSpecularRepeat, d.mapSpecularOffset, d.mapSpecularWrap, d.mapSpecularAnisotropy); break; case "mapSpecularRepeat": case "mapSpecularOffset": case "mapSpecularWrap": case "mapSpecularAnisotropy": break; case "mapMetalness": k.metalnessMap = g(l, d.mapMetalnessRepeat, d.mapMetalnessOffset, d.mapMetalnessWrap, d.mapMetalnessAnisotropy); break; case "mapMetalnessRepeat": case "mapMetalnessOffset": case "mapMetalnessWrap": case "mapMetalnessAnisotropy": break; case "mapRoughness": k.roughnessMap = g(l, d.mapRoughnessRepeat, d.mapRoughnessOffset, d.mapRoughnessWrap, d.mapRoughnessAnisotropy); break; case "mapRoughnessRepeat": case "mapRoughnessOffset": case "mapRoughnessWrap": case "mapRoughnessAnisotropy": break; case "mapAlpha": k.alphaMap = g(l, d.mapAlphaRepeat, d.mapAlphaOffset, d.mapAlphaWrap, d.mapAlphaAnisotropy); break; case "mapAlphaRepeat": case "mapAlphaOffset": case "mapAlphaWrap": case "mapAlphaAnisotropy": break; case "flipSided": k.side = 1; break; case "doubleSided": k.side = 2; break; case "transparency": console.warn("THREE.Loader.createMaterial: transparency has been renamed to opacity"); k.opacity = l; break; case "depthTest": case "depthWrite": case "colorWrite": case "opacity": case "reflectivity": case "transparent": case "visible": case "wireframe": k[m] = l; break; case "vertexColors": !0 === l && (k.vertexColors = 2); "face" === l && (k.vertexColors = 1); break; default: console.error("THREE.Loader.createMaterial: Unsupported", m, l) } } "MeshBasicMaterial" === k.type && delete k.emissive; "MeshPhongMaterial" !== k.type && delete k.specular; 1 > k.opacity && (k.transparent = !0); c.setTextures(h); return c.parse(k) } }() }; wb.Handlers = { handlers: [], add: function(a, b) { this.handlers.push(a, b) }, get: function(a) { for (var b = this.handlers, c = 0, d = b.length; c < d; c += 2) { var e = b[c + 1]; if (b[c].test(a)) return e } return null } }; Object.assign(Jd.prototype, { load: function(a, b, c, d) { var e = this , f = this.texturePath && "string" === typeof this.texturePath ? this.texturePath : wb.prototype.extractUrlBase(a) , g = new Ja(this.manager); g.setWithCredentials(this.withCredentials); g.load(a, function(c) { c = JSON.parse(c); var d = c.metadata; if (void 0 !== d && (d = d.type, void 0 !== d)) { if ("object" === d.toLowerCase()) { console.error("THREE.JSONLoader: " + a + " should be loaded with THREE.ObjectLoader instead."); return } if ("scene" === d.toLowerCase()) { console.error("THREE.JSONLoader: " + a + " should be loaded with THREE.SceneLoader instead."); return } } c = e.parse(c, f); b(c.geometry, c.materials) }, c, d) }, setTexturePath: function(a) { this.texturePath = a }, parse: function(a, b) { var c = new Q , d = void 0 !== a.scale ? 1 / a.scale : 1; (function(b) { var d, g, h, k, l, w, n, p, r, x, t, D, u, v = a.faces; w = a.vertices; var z = a.normals , y = a.colors , E = 0; if (void 0 !== a.uvs) { for (d = 0; d < a.uvs.length; d++) a.uvs[d].length && E++; for (d = 0; d < E; d++) c.faceVertexUvs[d] = [] } k = 0; for (l = w.length; k < l; ) d = new q, d.x = w[k++] * b, d.y = w[k++] * b, d.z = w[k++] * b, c.vertices.push(d); k = 0; for (l = v.length; k < l; ) if (b = v[k++], r = b & 1, h = b & 2, d = b & 8, n = b & 16, x = b & 32, w = b & 64, b &= 128, r) { r = new ea; r.a = v[k]; r.b = v[k + 1]; r.c = v[k + 3]; t = new ea; t.a = v[k + 1]; t.b = v[k + 2]; t.c = v[k + 3]; k += 4; h && (h = v[k++], r.materialIndex = h, t.materialIndex = h); h = c.faces.length; if (d) for (d = 0; d < E; d++) for (D = a.uvs[d], c.faceVertexUvs[d][h] = [], c.faceVertexUvs[d][h + 1] = [], g = 0; 4 > g; g++) p = v[k++], u = D[2 * p], p = D[2 * p + 1], u = new B(u,p), 2 !== g && c.faceVertexUvs[d][h].push(u), 0 !== g && c.faceVertexUvs[d][h + 1].push(u); n && (n = 3 * v[k++], r.normal.set(z[n++], z[n++], z[n]), t.normal.copy(r.normal)); if (x) for (d = 0; 4 > d; d++) n = 3 * v[k++], x = new q(z[n++],z[n++],z[n]), 2 !== d && r.vertexNormals.push(x), 0 !== d && t.vertexNormals.push(x); w && (w = v[k++], w = y[w], r.color.setHex(w), t.color.setHex(w)); if (b) for (d = 0; 4 > d; d++) w = v[k++], w = y[w], 2 !== d && r.vertexColors.push(new O(w)), 0 !== d && t.vertexColors.push(new O(w)); c.faces.push(r); c.faces.push(t) } else { r = new ea; r.a = v[k++]; r.b = v[k++]; r.c = v[k++]; h && (h = v[k++], r.materialIndex = h); h = c.faces.length; if (d) for (d = 0; d < E; d++) for (D = a.uvs[d], c.faceVertexUvs[d][h] = [], g = 0; 3 > g; g++) p = v[k++], u = D[2 * p], p = D[2 * p + 1], u = new B(u,p), c.faceVertexUvs[d][h].push(u); n && (n = 3 * v[k++], r.normal.set(z[n++], z[n++], z[n])); if (x) for (d = 0; 3 > d; d++) n = 3 * v[k++], x = new q(z[n++],z[n++],z[n]), r.vertexNormals.push(x); w && (w = v[k++], r.color.setHex(y[w])); if (b) for (d = 0; 3 > d; d++) w = v[k++], r.vertexColors.push(new O(y[w])); c.faces.push(r) } } )(d); (function() { var b = void 0 !== a.influencesPerVertex ? a.influencesPerVertex : 2; if (a.skinWeights) for (var d = 0, g = a.skinWeights.length; d < g; d += b) c.skinWeights.push(new ga(a.skinWeights[d],1 < b ? a.skinWeights[d + 1] : 0,2 < b ? a.skinWeights[d + 2] : 0,3 < b ? a.skinWeights[d + 3] : 0)); if (a.skinIndices) for (d = 0, g = a.skinIndices.length; d < g; d += b) c.skinIndices.push(new ga(a.skinIndices[d],1 < b ? a.skinIndices[d + 1] : 0,2 < b ? a.skinIndices[d + 2] : 0,3 < b ? a.skinIndices[d + 3] : 0)); c.bones = a.bones; c.bones && 0 < c.bones.length && (c.skinWeights.length !== c.skinIndices.length || c.skinIndices.length !== c.vertices.length) && console.warn("When skinning, number of vertices (" + c.vertices.length + "), skinIndices (" + c.skinIndices.length + "), and skinWeights (" + c.skinWeights.length + ") should match.") } )(); (function(b) { if (void 0 !== a.morphTargets) for (var d = 0, g = a.morphTargets.length; d < g; d++) { c.morphTargets[d] = {}; c.morphTargets[d].name = a.morphTargets[d].name; c.morphTargets[d].vertices = []; for (var h = c.morphTargets[d].vertices, k = a.morphTargets[d].vertices, l = 0, w = k.length; l < w; l += 3) { var n = new q; n.x = k[l] * b; n.y = k[l + 1] * b; n.z = k[l + 2] * b; h.push(n) } } if (void 0 !== a.morphColors && 0 < a.morphColors.length) for (console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.'), b = c.faces, h = a.morphColors[0].colors, d = 0, g = b.length; d < g; d++) b[d].color.fromArray(h, 3 * d) } )(d); (function() { var b = [] , d = []; void 0 !== a.animation && d.push(a.animation); void 0 !== a.animations && (a.animations.length ? d = d.concat(a.animations) : d.push(a.animations)); for (var g = 0; g < d.length; g++) { var h = Ha.parseAnimation(d[g], c.bones); h && b.push(h) } c.morphTargets && (d = Ha.CreateClipsFromMorphTargetSequences(c.morphTargets, 10), b = b.concat(d)); 0 < b.length && (c.animations = b) } )(); c.computeFaceNormals(); c.computeBoundingSphere(); if (void 0 === a.materials || 0 === a.materials.length) return { geometry: c }; d = wb.prototype.initMaterials(a.materials, b, this.crossOrigin); return { geometry: c, materials: d } } }); Object.assign(xe.prototype, { load: function(a, b, c, d) { "" === this.texturePath && (this.texturePath = a.substring(0, a.lastIndexOf("/") + 1)); var e = this; (new Ja(e.manager)).load(a, function(a) { e.parse(JSON.parse(a), b) }, c, d) }, setTexturePath: function(a) { this.texturePath = a }, setCrossOrigin: function(a) { this.crossOrigin = a }, parse: function(a, b) { var c = this.parseGeometries(a.geometries) , d = this.parseImages(a.images, function() { void 0 !== b && b(e) }) , d = this.parseTextures(a.textures, d) , d = this.parseMaterials(a.materials, d) , e = this.parseObject(a.object, c, d); a.animations && (e.animations = this.parseAnimations(a.animations)); void 0 !== a.images && 0 !== a.images.length || void 0 === b || b(e); return e }, parseGeometries: function(a) { var b = {}; if (void 0 !== a) for (var c = new Jd, d = new Id, e = 0, f = a.length; e < f; e++) { var g, h = a[e]; switch (h.type) { case "PlaneGeometry": case "PlaneBufferGeometry": g = new Na[h.type](h.width,h.height,h.widthSegments,h.heightSegments); break; case "BoxGeometry": case "BoxBufferGeometry": case "CubeGeometry": g = new Na[h.type](h.width,h.height,h.depth,h.widthSegments,h.heightSegments,h.depthSegments); break; case "CircleGeometry": case "CircleBufferGeometry": g = new Na[h.type](h.radius,h.segments,h.thetaStart,h.thetaLength); break; case "CylinderGeometry": case "CylinderBufferGeometry": g = new Na[h.type](h.radiusTop,h.radiusBottom,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength); break; case "ConeGeometry": case "ConeBufferGeometry": g = new Na[h.type](h.radius,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength); break; case "SphereGeometry": case "SphereBufferGeometry": g = new Na[h.type](h.radius,h.widthSegments,h.heightSegments,h.phiStart,h.phiLength,h.thetaStart,h.thetaLength); break; case "DodecahedronGeometry": case "IcosahedronGeometry": case "OctahedronGeometry": case "TetrahedronGeometry": g = new Na[h.type](h.radius,h.detail); break; case "RingGeometry": case "RingBufferGeometry": g = new Na[h.type](h.innerRadius,h.outerRadius,h.thetaSegments,h.phiSegments,h.thetaStart,h.thetaLength); break; case "TorusGeometry": case "TorusBufferGeometry": g = new Na[h.type](h.radius,h.tube,h.radialSegments,h.tubularSegments,h.arc); break; case "TorusKnotGeometry": case "TorusKnotBufferGeometry": g = new Na[h.type](h.radius,h.tube,h.tubularSegments,h.radialSegments,h.p,h.q); break; case "LatheGeometry": case "LatheBufferGeometry": g = new Na[h.type](h.points,h.segments,h.phiStart,h.phiLength); break; case "BufferGeometry": g = d.parse(h); break; case "Geometry": g = c.parse(h.data, this.texturePath).geometry; break; default: console.warn('THREE.ObjectLoader: Unsupported geometry type "' + h.type + '"'); continue } g.uuid = h.uuid; void 0 !== h.name && (g.name = h.name); b[h.uuid] = g } return b }, parseMaterials: function(a, b) { var c = {}; if (void 0 !== a) { var d = new ud; d.setTextures(b); for (var e = 0, f = a.length; e < f; e++) { var g = d.parse(a[e]); c[g.uuid] = g } } return c }, parseAnimations: function(a) { for (var b = [], c = 0; c < a.length; c++) { var d = Ha.parse(a[c]); b.push(d) } return b }, parseImages: function(a, b) { function c(a) { d.manager.itemStart(a); return g.load(a, function() { d.manager.itemEnd(a) }, void 0, function() { d.manager.itemError(a) }) } var d = this , e = {}; if (void 0 !== a && 0 < a.length) { var f = new Fd(b) , g = new Lc(f); g.setCrossOrigin(this.crossOrigin); for (var f = 0, h = a.length; f < h; f++) { var k = a[f] , l = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(k.url) ? k.url : d.texturePath + k.url; e[k.uuid] = c(l) } } return e }, parseTextures: function(a, b) { function c(a, b) { if ("number" === typeof a) return a; console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.", a); return b[a] } var d = {}; if (void 0 !== a) for (var e = 0, f = a.length; e < f; e++) { var g = a[e]; void 0 === g.image && console.warn('THREE.ObjectLoader: No "image" specified for', g.uuid); void 0 === b[g.image] && console.warn("THREE.ObjectLoader: Undefined image", g.image); var h = new da(b[g.image]); h.needsUpdate = !0; h.uuid = g.uuid; void 0 !== g.name && (h.name = g.name); void 0 !== g.mapping && (h.mapping = c(g.mapping, Ge)); void 0 !== g.offset && h.offset.fromArray(g.offset); void 0 !== g.repeat && h.repeat.fromArray(g.repeat); void 0 !== g.wrap && (h.wrapS = c(g.wrap[0], ae), h.wrapT = c(g.wrap[1], ae)); void 0 !== g.minFilter && (h.minFilter = c(g.minFilter, be)); void 0 !== g.magFilter && (h.magFilter = c(g.magFilter, be)); void 0 !== g.anisotropy && (h.anisotropy = g.anisotropy); void 0 !== g.flipY && (h.flipY = g.flipY); d[g.uuid] = h } return d }, parseObject: function() { var a = new J; return function(b, c, d) { function e(a) { void 0 === c[a] && console.warn("THREE.ObjectLoader: Undefined geometry", a); return c[a] } function f(a) { if (void 0 !== a) return void 0 === d[a] && console.warn("THREE.ObjectLoader: Undefined material", a), d[a] } var g; switch (b.type) { case "Scene": g = new jb; void 0 !== b.background && Number.isInteger(b.background) && (g.background = new O(b.background)); void 0 !== b.fog && ("Fog" === b.fog.type ? g.fog = new Jb(b.fog.color,b.fog.near,b.fog.far) : "FogExp2" === b.fog.type && (g.fog = new Ib(b.fog.color,b.fog.density))); break; case "PerspectiveCamera": g = new Ea(b.fov,b.aspect,b.near,b.far); void 0 !== b.focus && (g.focus = b.focus); void 0 !== b.zoom && (g.zoom = b.zoom); void 0 !== b.filmGauge && (g.filmGauge = b.filmGauge); void 0 !== b.filmOffset && (g.filmOffset = b.filmOffset); void 0 !== b.view && (g.view = Object.assign({}, b.view)); break; case "OrthographicCamera": g = new Hb(b.left,b.right,b.top,b.bottom,b.near,b.far); break; case "AmbientLight": g = new nd(b.color,b.intensity); break; case "DirectionalLight": g = new md(b.color,b.intensity); break; case "PointLight": g = new kd(b.color,b.intensity,b.distance,b.decay); break; case "SpotLight": g = new jd(b.color,b.intensity,b.distance,b.angle,b.penumbra,b.decay); break; case "HemisphereLight": g = new hd(b.color,b.groundColor,b.intensity); break; case "Mesh": g = e(b.geometry); var h = f(b.material); g = g.bones && 0 < g.bones.length ? new dd(g,h) : new ya(g,h); break; case "LOD": g = new rc; break; case "Line": g = new Ta(e(b.geometry),f(b.material),b.mode); break; case "LineSegments": g = new la(e(b.geometry),f(b.material)); break; case "PointCloud": case "Points": g = new Kb(e(b.geometry),f(b.material)); break; case "Sprite": g = new qc(f(b.material)); break; case "Group": g = new sc; break; default: g = new z } g.uuid = b.uuid; void 0 !== b.name && (g.name = b.name); void 0 !== b.matrix ? (a.fromArray(b.matrix), a.decompose(g.position, g.quaternion, g.scale)) : (void 0 !== b.position && g.position.fromArray(b.position), void 0 !== b.rotation && g.rotation.fromArray(b.rotation), void 0 !== b.quaternion && g.quaternion.fromArray(b.quaternion), void 0 !== b.scale && g.scale.fromArray(b.scale)); void 0 !== b.castShadow && (g.castShadow = b.castShadow); void 0 !== b.receiveShadow && (g.receiveShadow = b.receiveShadow); b.shadow && (void 0 !== b.shadow.bias && (g.shadow.bias = b.shadow.bias), void 0 !== b.shadow.radius && (g.shadow.radius = b.shadow.radius), void 0 !== b.shadow.mapSize && g.shadow.mapSize.fromArray(b.shadow.mapSize), void 0 !== b.shadow.camera && (g.shadow.camera = this.parseObject(b.shadow.camera))); void 0 !== b.visible && (g.visible = b.visible); void 0 !== b.userData && (g.userData = b.userData); if (void 0 !== b.children) for (var k in b.children) g.add(this.parseObject(b.children[k], c, d)); if ("LOD" === b.type) for (b = b.levels, h = 0; h < b.length; h++) { var l = b[h]; k = g.getObjectByProperty("uuid", l.object); void 0 !== k && g.addLevel(k, l.distance) } return g } }() }); ia.prototype = { constructor: ia, getPoint: function(a) { console.warn("THREE.Curve: Warning, getPoint() not implemented!"); return null }, getPointAt: function(a) { a = this.getUtoTmapping(a); return this.getPoint(a) }, getPoints: function(a) { a || (a = 5); for (var b = [], c = 0; c <= a; c++) b.push(this.getPoint(c / a)); return b }, getSpacedPoints: function(a) { a || (a = 5); for (var b = [], c = 0; c <= a; c++) b.push(this.getPointAt(c / a)); return b }, getLength: function() { var a = this.getLengths(); return a[a.length - 1] }, getLengths: function(a) { a || (a = this.__arcLengthDivisions ? this.__arcLengthDivisions : 200); if (this.cacheArcLengths && this.cacheArcLengths.length === a + 1 && !this.needsUpdate) return this.cacheArcLengths; this.needsUpdate = !1; var b = [], c, d = this.getPoint(0), e, f = 0; b.push(0); for (e = 1; e <= a; e++) c = this.getPoint(e / a), f += c.distanceTo(d), b.push(f), d = c; return this.cacheArcLengths = b }, updateArcLengths: function() { this.needsUpdate = !0; this.getLengths() }, getUtoTmapping: function(a, b) { var c = this.getLengths(), d, e = c.length, f; f = b ? b : a * c[e - 1]; for (var g = 0, h = e - 1, k; g <= h; ) if (d = Math.floor(g + (h - g) / 2), k = c[d] - f, 0 > k) g = d + 1; else if (0 < k) h = d - 1; else { h = d; break } d = h; if (c[d] === f) return d / (e - 1); g = c[d]; return (d + (f - g) / (c[d + 1] - g)) / (e - 1) }, getTangent: function(a) { var b = a - 1E-4; a += 1E-4; 0 > b && (b = 0); 1 < a && (a = 1); b = this.getPoint(b); return this.getPoint(a).clone().sub(b).normalize() }, getTangentAt: function(a) { a = this.getUtoTmapping(a); return this.getTangent(a) }, computeFrenetFrames: function(a, b) { var c = new q, d = [], e = [], f = [], g = new q, h = new J, k, l; for (k = 0; k <= a; k++) l = k / a, d[k] = this.getTangentAt(l), d[k].normalize(); e[0] = new q; f[0] = new q; k = Number.MAX_VALUE; l = Math.abs(d[0].x); var w = Math.abs(d[0].y) , n = Math.abs(d[0].z); l <= k && (k = l, c.set(1, 0, 0)); w <= k && (k = w, c.set(0, 1, 0)); n <= k && c.set(0, 0, 1); g.crossVectors(d[0], c).normalize(); e[0].crossVectors(d[0], g); f[0].crossVectors(d[0], e[0]); for (k = 1; k <= a; k++) e[k] = e[k - 1].clone(), f[k] = f[k - 1].clone(), g.crossVectors(d[k - 1], d[k]), g.length() > Number.EPSILON && (g.normalize(), c = Math.acos(T.clamp(d[k - 1].dot(d[k]), -1, 1)), e[k].applyMatrix4(h.makeRotationAxis(g, c))), f[k].crossVectors(d[k], e[k]); if (!0 === b) for (c = Math.acos(T.clamp(e[0].dot(e[a]), -1, 1)), c /= a, 0 < d[0].dot(g.crossVectors(e[0], e[a])) && (c = -c), k = 1; k <= a; k++) e[k].applyMatrix4(h.makeRotationAxis(d[k], c * k)), f[k].crossVectors(d[k], e[k]); return { tangents: d, normals: e, binormals: f } } }; ia.create = function(a, b) { a.prototype = Object.create(ia.prototype); a.prototype.constructor = a; a.prototype.getPoint = b; return a } ; Sa.prototype = Object.create(ia.prototype); Sa.prototype.constructor = Sa; Sa.prototype.isLineCurve = !0; Sa.prototype.getPoint = function(a) { if (1 === a) return this.v2.clone(); var b = this.v2.clone().sub(this.v1); b.multiplyScalar(a).add(this.v1); return b } ; Sa.prototype.getPointAt = function(a) { return this.getPoint(a) } ; Sa.prototype.getTangent = function(a) { return this.v2.clone().sub(this.v1).normalize() } ; Oc.prototype = Object.assign(Object.create(ia.prototype), { constructor: Oc, add: function(a) { this.curves.push(a) }, closePath: function() { var a = this.curves[0].getPoint(0) , b = this.curves[this.curves.length - 1].getPoint(1); a.equals(b) || this.curves.push(new Sa(b,a)) }, getPoint: function(a) { var b = a * this.getLength() , c = this.getCurveLengths(); for (a = 0; a < c.length; ) { if (c[a] >= b) return b = c[a] - b, a = this.curves[a], c = a.getLength(), a.getPointAt(0 === c ? 0 : 1 - b / c); a++ } return null }, getLength: function() { var a = this.getCurveLengths(); return a[a.length - 1] }, updateArcLengths: function() { this.needsUpdate = !0; this.cacheLengths = null; this.getLengths() }, getCurveLengths: function() { if (this.cacheLengths && this.cacheLengths.length === this.curves.length) return this.cacheLengths; for (var a = [], b = 0, c = 0, d = this.curves.length; c < d; c++) b += this.curves[c].getLength(), a.push(b); return this.cacheLengths = a }, getSpacedPoints: function(a) { a || (a = 40); for (var b = [], c = 0; c <= a; c++) b.push(this.getPoint(c / a)); this.autoClose && b.push(b[0]); return b }, getPoints: function(a) { a = a || 12; for (var b = [], c, d = 0, e = this.curves; d < e.length; d++) for (var f = e[d], f = f.getPoints(f && f.isEllipseCurve ? 2 * a : f && f.isLineCurve ? 1 : f && f.isSplineCurve ? a * f.points.length : a), g = 0; g < f.length; g++) { var h = f[g]; c && c.equals(h) || (b.push(h), c = h) } this.autoClose && 1 < b.length && !b[b.length - 1].equals(b[0]) && b.push(b[0]); return b }, createPointsGeometry: function(a) { a = this.getPoints(a); return this.createGeometry(a) }, createSpacedPointsGeometry: function(a) { a = this.getSpacedPoints(a); return this.createGeometry(a) }, createGeometry: function(a) { for (var b = new Q, c = 0, d = a.length; c < d; c++) { var e = a[c]; b.vertices.push(new q(e.x,e.y,e.z || 0)) } return b } }); Va.prototype = Object.create(ia.prototype); Va.prototype.constructor = Va; Va.prototype.isEllipseCurve = !0; Va.prototype.getPoint = function(a) { for (var b = 2 * Math.PI, c = this.aEndAngle - this.aStartAngle, d = Math.abs(c) < Number.EPSILON; 0 > c; ) c += b; for (; c > b; ) c -= b; c < Number.EPSILON && (c = d ? 0 : b); !0 !== this.aClockwise || d || (c = c === b ? -b : c - b); b = this.aStartAngle + a * c; a = this.aX + this.xRadius * Math.cos(b); var e = this.aY + this.yRadius * Math.sin(b); 0 !== this.aRotation && (b = Math.cos(this.aRotation), c = Math.sin(this.aRotation), d = a - this.aX, e -= this.aY, a = d * b - e * c + this.aX, e = d * c + e * b + this.aY); return new B(a,e) } ; var Xc = { tangentQuadraticBezier: function(a, b, c, d) { return 2 * (1 - a) * (c - b) + 2 * a * (d - c) }, tangentCubicBezier: function(a, b, c, d, e) { return -3 * b * (1 - a) * (1 - a) + 3 * c * (1 - a) * (1 - a) - 6 * a * c * (1 - a) + 6 * a * d * (1 - a) - 3 * a * a * d + 3 * a * a * e }, tangentSpline: function(a, b, c, d, e) { return 6 * a * a - 6 * a + (3 * a * a - 4 * a + 1) + (-6 * a * a + 6 * a) + (3 * a * a - 2 * a) }, interpolate: function(a, b, c, d, e) { a = .5 * (c - a); d = .5 * (d - b); var f = e * e; return (2 * b - 2 * c + a + d) * e * f + (-3 * b + 3 * c - 2 * a - d) * f + a * e + b } }; xb.prototype = Object.create(ia.prototype); xb.prototype.constructor = xb; xb.prototype.isSplineCurve = !0; xb.prototype.getPoint = function(a) { var b = this.points; a *= b.length - 1; var c = Math.floor(a); a -= c; var d = b[0 === c ? c : c - 1] , e = b[c] , f = b[c > b.length - 2 ? b.length - 1 : c + 1] , b = b[c > b.length - 3 ? b.length - 1 : c + 2] , c = Xc.interpolate; return new B(c(d.x, e.x, f.x, b.x, a),c(d.y, e.y, f.y, b.y, a)) } ; yb.prototype = Object.create(ia.prototype); yb.prototype.constructor = yb; yb.prototype.getPoint = function(a) { var b = ra.b3; return new B(b(a, this.v0.x, this.v1.x, this.v2.x, this.v3.x),b(a, this.v0.y, this.v1.y, this.v2.y, this.v3.y)) } ; yb.prototype.getTangent = function(a) { var b = Xc.tangentCubicBezier; return (new B(b(a, this.v0.x, this.v1.x, this.v2.x, this.v3.x),b(a, this.v0.y, this.v1.y, this.v2.y, this.v3.y))).normalize() } ; zb.prototype = Object.create(ia.prototype); zb.prototype.constructor = zb; zb.prototype.getPoint = function(a) { var b = ra.b2; return new B(b(a, this.v0.x, this.v1.x, this.v2.x),b(a, this.v0.y, this.v1.y, this.v2.y)) } ; zb.prototype.getTangent = function(a) { var b = Xc.tangentQuadraticBezier; return (new B(b(a, this.v0.x, this.v1.x, this.v2.x),b(a, this.v0.y, this.v1.y, this.v2.y))).normalize() } ; var de = Object.assign(Object.create(Oc.prototype), { fromPoints: function(a) { this.moveTo(a[0].x, a[0].y); for (var b = 1, c = a.length; b < c; b++) this.lineTo(a[b].x, a[b].y) }, moveTo: function(a, b) { this.currentPoint.set(a, b) }, lineTo: function(a, b) { var c = new Sa(this.currentPoint.clone(),new B(a,b)); this.curves.push(c); this.currentPoint.set(a, b) }, quadraticCurveTo: function(a, b, c, d) { a = new zb(this.currentPoint.clone(),new B(a,b),new B(c,d)); this.curves.push(a); this.currentPoint.set(c, d) }, bezierCurveTo: function(a, b, c, d, e, f) { a = new yb(this.currentPoint.clone(),new B(a,b),new B(c,d),new B(e,f)); this.curves.push(a); this.currentPoint.set(e, f) }, splineThru: function(a) { var b = [this.currentPoint.clone()].concat(a) , b = new xb(b); this.curves.push(b); this.currentPoint.copy(a[a.length - 1]) }, arc: function(a, b, c, d, e, f) { this.absarc(a + this.currentPoint.x, b + this.currentPoint.y, c, d, e, f) }, absarc: function(a, b, c, d, e, f) { this.absellipse(a, b, c, c, d, e, f) }, ellipse: function(a, b, c, d, e, f, g, h) { this.absellipse(a + this.currentPoint.x, b + this.currentPoint.y, c, d, e, f, g, h) }, absellipse: function(a, b, c, d, e, f, g, h) { a = new Va(a,b,c,d,e,f,g,h); 0 < this.curves.length && (b = a.getPoint(0), b.equals(this.currentPoint) || this.lineTo(b.x, b.y)); this.curves.push(a); a = a.getPoint(1); this.currentPoint.copy(a) } }); Ab.prototype = Object.assign(Object.create(de), { constructor: Ab, getPointsHoles: function(a) { for (var b = [], c = 0, d = this.holes.length; c < d; c++) b[c] = this.holes[c].getPoints(a); return b }, extractAllPoints: function(a) { return { shape: this.getPoints(a), holes: this.getPointsHoles(a) } }, extractPoints: function(a) { return this.extractAllPoints(a) } }); Pc.prototype = de; de.constructor = Pc; Kd.prototype = { moveTo: function(a, b) { this.currentPath = new Pc; this.subPaths.push(this.currentPath); this.currentPath.moveTo(a, b) }, lineTo: function(a, b) { this.currentPath.lineTo(a, b) }, quadraticCurveTo: function(a, b, c, d) { this.currentPath.quadraticCurveTo(a, b, c, d) }, bezierCurveTo: function(a, b, c, d, e, f) { this.currentPath.bezierCurveTo(a, b, c, d, e, f) }, splineThru: function(a) { this.currentPath.splineThru(a) }, toShapes: function(a, b) { function c(a) { for (var b = [], c = 0, d = a.length; c < d; c++) { var e = a[c] , f = new Ab; f.curves = e.curves; b.push(f) } return b } function d(a, b) { for (var c = b.length, d = !1, e = c - 1, f = 0; f < c; e = f++) { var g = b[e] , h = b[f] , k = h.x - g.x , l = h.y - g.y; if (Math.abs(l) > Number.EPSILON) { if (0 > l && (g = b[f], k = -k, h = b[e], l = -l), !(a.y < g.y || a.y > h.y)) if (a.y === g.y) { if (a.x === g.x) return !0 } else { e = l * (a.x - g.x) - k * (a.y - g.y); if (0 === e) return !0; 0 > e || (d = !d) } } else if (a.y === g.y && (h.x <= a.x && a.x <= g.x || g.x <= a.x && a.x <= h.x)) return !0 } return d } var e = ra.isClockWise , f = this.subPaths; if (0 === f.length) return []; if (!0 === b) return c(f); var g, h, k, l = []; if (1 === f.length) return h = f[0], k = new Ab, k.curves = h.curves, l.push(k), l; var q = !e(f[0].getPoints()) , q = a ? !q : q; k = []; var n = [], p = [], r = 0, x; n[r] = void 0; p[r] = []; for (var t = 0, D = f.length; t < D; t++) h = f[t], x = h.getPoints(), g = e(x), (g = a ? !g : g) ? (!q && n[r] && r++, n[r] = { s: new Ab, p: x }, n[r].s.curves = h.curves, q && r++, p[r] = []) : p[r].push({ h: h, p: x[0] }); if (!n[0]) return c(f); if (1 < n.length) { t = !1; h = []; e = 0; for (f = n.length; e < f; e++) k[e] = []; e = 0; for (f = n.length; e < f; e++) for (g = p[e], q = 0; q < g.length; q++) { r = g[q]; x = !0; for (D = 0; D < n.length; D++) d(r.p, n[D].p) && (e !== D && h.push({ froms: e, tos: D, hole: q }), x ? (x = !1, k[D].push(r)) : t = !0); x && k[e].push(r) } 0 < h.length && (t || (p = k)) } t = 0; for (e = n.length; t < e; t++) for (k = n[t].s, l.push(k), h = p[t], f = 0, g = h.length; f < g; f++) k.holes.push(h[f].h); return l } }; Object.assign(Ld.prototype, { isFont: !0, generateShapes: function(a, b, c) { void 0 === b && (b = 100); void 0 === c && (c = 4); var d = this.data; a = String(a).split(""); var e = b / d.resolution , f = 0; b = []; for (var g = 0; g < a.length; g++) { var h; h = e; var k = f , l = d.glyphs[a[g]] || d.glyphs["?"]; if (l) { var q = new Kd, n = [], p = ra.b2, r = ra.b3, x, t, D, u, v, z, y, E; if (l.o) for (var B = l._cachedOutline || (l._cachedOutline = l.o.split(" ")), C = 0, G = B.length; C < G; ) switch (B[C++]) { case "m": x = B[C++] * h + k; t = B[C++] * h; q.moveTo(x, t); break; case "l": x = B[C++] * h + k; t = B[C++] * h; q.lineTo(x, t); break; case "q": x = B[C++] * h + k; t = B[C++] * h; v = B[C++] * h + k; z = B[C++] * h; q.quadraticCurveTo(v, z, x, t); if (u = n[n.length - 1]) { D = u.x; u = u.y; for (var J = 1; J <= c; J++) { var K = J / c; p(K, D, v, x); p(K, u, z, t) } } break; case "b": if (x = B[C++] * h + k, t = B[C++] * h, v = B[C++] * h + k, z = B[C++] * h, y = B[C++] * h + k, E = B[C++] * h, q.bezierCurveTo(v, z, y, E, x, t), u = n[n.length - 1]) for (D = u.x, u = u.y, J = 1; J <= c; J++) K = J / c, r(K, D, v, y, x), r(K, u, z, E, t) } h = { offset: l.ha * h, path: q } } else h = void 0; f += h.offset; b.push(h.path) } c = []; d = 0; for (a = b.length; d < a; d++) Array.prototype.push.apply(c, b[d].toShapes()); return c } }); Object.assign(ye.prototype, { load: function(a, b, c, d) { var e = this; (new Ja(this.manager)).load(a, function(a) { var c; try { c = JSON.parse(a) } catch (d) { console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."), c = JSON.parse(a.substring(65, a.length - 2)) } a = e.parse(c); b && b(a) }, c, d) }, parse: function(a) { return new Ld(a) } }); var Nd; Object.assign(Od.prototype, { load: function(a, b, c, d) { var e = new Ja(this.manager); e.setResponseType("arraybuffer"); e.load(a, function(a) { Md().decodeAudioData(a, function(a) { b(a) }) }, c, d) } }); Object.assign(ze.prototype, { update: function() { var a, b, c, d, e, f, g, h = new J, k = new J; return function(l) { if (a !== this || b !== l.focus || c !== l.fov || d !== l.aspect * this.aspect || e !== l.near || f !== l.far || g !== l.zoom) { a = this; b = l.focus; c = l.fov; d = l.aspect * this.aspect; e = l.near; f = l.far; g = l.zoom; var q = l.projectionMatrix.clone(), n = this.eyeSep / 2, p = n * e / b, r = e * Math.tan(T.DEG2RAD * c * .5) / g, x; k.elements[12] = -n; h.elements[12] = n; n = -r * d + p; x = r * d + p; q.elements[0] = 2 * e / (x - n); q.elements[8] = (x + n) / (x - n); this.cameraL.projectionMatrix.copy(q); n = -r * d - p; x = r * d - p; q.elements[0] = 2 * e / (x - n); q.elements[8] = (x + n) / (x - n); this.cameraR.projectionMatrix.copy(q) } this.cameraL.matrixWorld.copy(l.matrixWorld).multiply(k); this.cameraR.matrixWorld.copy(l.matrixWorld).multiply(h) } }() }); vd.prototype = Object.create(z.prototype); vd.prototype.constructor = vd; Pd.prototype = Object.assign(Object.create(z.prototype), { constructor: Pd, getInput: function() { return this.gain }, removeFilter: function() { null !== this.filter && (this.gain.disconnect(this.filter), this.filter.disconnect(this.context.destination), this.gain.connect(this.context.destination), this.filter = null) }, getFilter: function() { return this.filter }, setFilter: function(a) { null !== this.filter ? (this.gain.disconnect(this.filter), this.filter.disconnect(this.context.destination)) : this.gain.disconnect(this.context.destination); this.filter = a; this.gain.connect(this.filter); this.filter.connect(this.context.destination) }, getMasterVolume: function() { return this.gain.gain.value }, setMasterVolume: function(a) { this.gain.gain.value = a }, updateMatrixWorld: function() { var a = new q , b = new ba , c = new q , d = new q; return function(e) { z.prototype.updateMatrixWorld.call(this, e); e = this.context.listener; var f = this.up; this.matrixWorld.decompose(a, b, c); d.set(0, 0, -1).applyQuaternion(b); e.setPosition(a.x, a.y, a.z); e.setOrientation(d.x, d.y, d.z, f.x, f.y, f.z) } }() }); dc.prototype = Object.assign(Object.create(z.prototype), { constructor: dc, getOutput: function() { return this.gain }, setNodeSource: function(a) { this.hasPlaybackControl = !1; this.sourceType = "audioNode"; this.source = a; this.connect(); return this }, setBuffer: function(a) { this.source.buffer = a; this.sourceType = "buffer"; this.autoplay && this.play(); return this }, play: function() { if (!0 === this.isPlaying) console.warn("THREE.Audio: Audio is already playing."); else if (!1 === this.hasPlaybackControl) console.warn("THREE.Audio: this Audio has no playback control."); else { var a = this.context.createBufferSource(); a.buffer = this.source.buffer; a.loop = this.source.loop; a.onended = this.source.onended; a.start(0, this.startTime); a.playbackRate.value = this.playbackRate; this.isPlaying = !0; this.source = a; return this.connect() } }, pause: function() { if (!1 === this.hasPlaybackControl) console.warn("THREE.Audio: this Audio has no playback control."); else return this.source.stop(), this.startTime = this.context.currentTime, this.isPlaying = !1, this }, stop: function() { if (!1 === this.hasPlaybackControl) console.warn("THREE.Audio: this Audio has no playback control."); else return this.source.stop(), this.startTime = 0, this.isPlaying = !1, this }, connect: function() { if (0 < this.filters.length) { this.source.connect(this.filters[0]); for (var a = 1, b = this.filters.length; a < b; a++) this.filters[a - 1].connect(this.filters[a]); this.filters[this.filters.length - 1].connect(this.getOutput()) } else this.source.connect(this.getOutput()); return this }, disconnect: function() { if (0 < this.filters.length) { this.source.disconnect(this.filters[0]); for (var a = 1, b = this.filters.length; a < b; a++) this.filters[a - 1].disconnect(this.filters[a]); this.filters[this.filters.length - 1].disconnect(this.getOutput()) } else this.source.disconnect(this.getOutput()); return this }, getFilters: function() { return this.filters }, setFilters: function(a) { a || (a = []); !0 === this.isPlaying ? (this.disconnect(), this.filters = a, this.connect()) : this.filters = a; return this }, getFilter: function() { return this.getFilters()[0] }, setFilter: function(a) { return this.setFilters(a ? [a] : []) }, setPlaybackRate: function(a) { if (!1 === this.hasPlaybackControl) console.warn("THREE.Audio: this Audio has no playback control."); else return this.playbackRate = a, !0 === this.isPlaying && (this.source.playbackRate.value = this.playbackRate), this }, getPlaybackRate: function() { return this.playbackRate }, onEnded: function() { this.isPlaying = !1 }, getLoop: function() { return !1 === this.hasPlaybackControl ? (console.warn("THREE.Audio: this Audio has no playback control."), !1) : this.source.loop }, setLoop: function(a) { !1 === this.hasPlaybackControl ? console.warn("THREE.Audio: this Audio has no playback control.") : this.source.loop = a }, getVolume: function() { return this.gain.gain.value }, setVolume: function(a) { this.gain.gain.value = a; return this } }); Qd.prototype = Object.assign(Object.create(dc.prototype), { constructor: Qd, getOutput: function() { return this.panner }, getRefDistance: function() { return this.panner.refDistance }, setRefDistance: function(a) { this.panner.refDistance = a }, getRolloffFactor: function() { return this.panner.rolloffFactor }, setRolloffFactor: function(a) { this.panner.rolloffFactor = a }, getDistanceModel: function() { return this.panner.distanceModel }, setDistanceModel: function(a) { this.panner.distanceModel = a }, getMaxDistance: function() { return this.panner.maxDistance }, setMaxDistance: function(a) { this.panner.maxDistance = a }, updateMatrixWorld: function() { var a = new q; return function(b) { z.prototype.updateMatrixWorld.call(this, b); a.setFromMatrixPosition(this.matrixWorld); this.panner.setPosition(a.x, a.y, a.z) } }() }); Object.assign(Rd.prototype, { getFrequencyData: function() { this.analyser.getByteFrequencyData(this.data); return this.data }, getAverageFrequency: function() { for (var a = 0, b = this.getFrequencyData(), c = 0; c < b.length; c++) a += b[c]; return a / b.length } }); wd.prototype = { constructor: wd, accumulate: function(a, b) { var c = this.buffer , d = this.valueSize , e = a * d + d , f = this.cumulativeWeight; if (0 === f) { for (f = 0; f !== d; ++f) c[e + f] = c[f]; f = b } else f += b, this._mixBufferRegion(c, e, 0, b / f, d); this.cumulativeWeight = f }, apply: function(a) { var b = this.valueSize , c = this.buffer; a = a * b + b; var d = this.cumulativeWeight , e = this.binding; this.cumulativeWeight = 0; 1 > d && this._mixBufferRegion(c, a, 3 * b, 1 - d, b); for (var d = b, f = b + b; d !== f; ++d) if (c[d] !== c[d + b]) { e.setValue(c, a); break } }, saveOriginalState: function() { var a = this.buffer , b = this.valueSize , c = 3 * b; this.binding.getValue(a, c); for (var d = b; d !== c; ++d) a[d] = a[c + d % b]; this.cumulativeWeight = 0 }, restoreOriginalState: function() { this.binding.setValue(this.buffer, 3 * this.valueSize) }, _select: function(a, b, c, d, e) { if (.5 <= d) for (d = 0; d !== e; ++d) a[b + d] = a[c + d] }, _slerp: function(a, b, c, d, e) { ba.slerpFlat(a, b, a, b, a, c, d) }, _lerp: function(a, b, c, d, e) { for (var f = 1 - d, g = 0; g !== e; ++g) { var h = b + g; a[h] = a[h] * f + a[c + g] * d } } }; fa.prototype = { constructor: fa, getValue: function(a, b) { this.bind(); this.getValue(a, b) }, setValue: function(a, b) { this.bind(); this.setValue(a, b) }, bind: function() { var a = this.node , b = this.parsedPath , c = b.objectName , d = b.propertyName , e = b.propertyIndex; a || (this.node = a = fa.findNode(this.rootNode, b.nodeName) || this.rootNode); this.getValue = this._getValue_unavailable; this.setValue = this._setValue_unavailable; if (a) { if (c) { var f = b.objectIndex; switch (c) { case "materials": if (!a.material) { console.error(" can not bind to material as node does not have a material", this); return } if (!a.material.materials) { console.error(" can not bind to material.materials as node.material does not have a materials array", this); return } a = a.material.materials; break; case "bones": if (!a.skeleton) { console.error(" can not bind to bones as node does not have a skeleton", this); return } a = a.skeleton.bones; for (c = 0; c < a.length; c++) if (a[c].name === f) { f = c; break } break; default: if (void 0 === a[c]) { console.error(" can not bind to objectName of node, undefined", this); return } a = a[c] } if (void 0 !== f) { if (void 0 === a[f]) { console.error(" trying to bind to objectIndex of objectName, but is undefined:", this, a); return } a = a[f] } } f = a[d]; if (void 0 === f) console.error(" trying to update property for track: " + b.nodeName + "." + d + " but it wasn't found.", a); else { b = this.Versioning.None; void 0 !== a.needsUpdate ? (b = this.Versioning.NeedsUpdate, this.targetObject = a) : void 0 !== a.matrixWorldNeedsUpdate && (b = this.Versioning.MatrixWorldNeedsUpdate, this.targetObject = a); c = this.BindingType.Direct; if (void 0 !== e) { if ("morphTargetInfluences" === d) { if (!a.geometry) { console.error(" can not bind to morphTargetInfluences becasuse node does not have a geometry", this); return } if (!a.geometry.morphTargets) { console.error(" can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets", this); return } for (c = 0; c < this.node.geometry.morphTargets.length; c++) if (a.geometry.morphTargets[c].name === e) { e = c; break } } c = this.BindingType.ArrayElement; this.resolvedProperty = f; this.propertyIndex = e } else void 0 !== f.fromArray && void 0 !== f.toArray ? (c = this.BindingType.HasFromToArray, this.resolvedProperty = f) : void 0 !== f.length ? (c = this.BindingType.EntireArray, this.resolvedProperty = f) : this.propertyName = d; this.getValue = this.GetterByBindingType[c]; this.setValue = this.SetterByBindingTypeAndVersioning[c][b] } } else console.error(" trying to update node for track: " + this.path + " but it wasn't found.") }, unbind: function() { this.node = null; this.getValue = this._getValue_unbound; this.setValue = this._setValue_unbound } }; Object.assign(fa.prototype, { _getValue_unavailable: function() {}, _setValue_unavailable: function() {}, _getValue_unbound: fa.prototype.getValue, _setValue_unbound: fa.prototype.setValue, BindingType: { Direct: 0, EntireArray: 1, ArrayElement: 2, HasFromToArray: 3 }, Versioning: { None: 0, NeedsUpdate: 1, MatrixWorldNeedsUpdate: 2 }, GetterByBindingType: [function(a, b) { a[b] = this.node[this.propertyName] } , function(a, b) { for (var c = this.resolvedProperty, d = 0, e = c.length; d !== e; ++d) a[b++] = c[d] } , function(a, b) { a[b] = this.resolvedProperty[this.propertyIndex] } , function(a, b) { this.resolvedProperty.toArray(a, b) } ], SetterByBindingTypeAndVersioning: [[function(a, b) { this.node[this.propertyName] = a[b] } , function(a, b) { this.node[this.propertyName] = a[b]; this.targetObject.needsUpdate = !0 } , function(a, b) { this.node[this.propertyName] = a[b]; this.targetObject.matrixWorldNeedsUpdate = !0 } ], [function(a, b) { for (var c = this.resolvedProperty, d = 0, e = c.length; d !== e; ++d) c[d] = a[b++] } , function(a, b) { for (var c = this.resolvedProperty, d = 0, e = c.length; d !== e; ++d) c[d] = a[b++]; this.targetObject.needsUpdate = !0 } , function(a, b) { for (var c = this.resolvedProperty, d = 0, e = c.length; d !== e; ++d) c[d] = a[b++]; this.targetObject.matrixWorldNeedsUpdate = !0 } ], [function(a, b) { this.resolvedProperty[this.propertyIndex] = a[b] } , function(a, b) { this.resolvedProperty[this.propertyIndex] = a[b]; this.targetObject.needsUpdate = !0 } , function(a, b) { this.resolvedProperty[this.propertyIndex] = a[b]; this.targetObject.matrixWorldNeedsUpdate = !0 } ], [function(a, b) { this.resolvedProperty.fromArray(a, b) } , function(a, b) { this.resolvedProperty.fromArray(a, b); this.targetObject.needsUpdate = !0 } , function(a, b) { this.resolvedProperty.fromArray(a, b); this.targetObject.matrixWorldNeedsUpdate = !0 } ]] }); fa.Composite = function(a, b, c) { c = c || fa.parseTrackName(b); this._targetGroup = a; this._bindings = a.subscribe_(b, c) } ; fa.Composite.prototype = { constructor: fa.Composite, getValue: function(a, b) { this.bind(); var c = this._bindings[this._targetGroup.nCachedObjects_]; void 0 !== c && c.getValue(a, b) }, setValue: function(a, b) { for (var c = this._bindings, d = this._targetGroup.nCachedObjects_, e = c.length; d !== e; ++d) c[d].setValue(a, b) }, bind: function() { for (var a = this._bindings, b = this._targetGroup.nCachedObjects_, c = a.length; b !== c; ++b) a[b].bind() }, unbind: function() { for (var a = this._bindings, b = this._targetGroup.nCachedObjects_, c = a.length; b !== c; ++b) a[b].unbind() } }; fa.create = function(a, b, c) { return a && a.isAnimationObjectGroup ? new fa.Composite(a,b,c) : new fa(a,b,c) } ; fa.parseTrackName = function(a) { var b = /^((?:\w+[\/:])*)(\w+)?(?:\.(\w+)(?:\[(.+)\])?)?\.(\w+)(?:\[(.+)\])?$/.exec(a); if (!b) throw Error("cannot parse trackName at all: " + a); b = { nodeName: b[2], objectName: b[3], objectIndex: b[4], propertyName: b[5], propertyIndex: b[6] }; if (null === b.propertyName || 0 === b.propertyName.length) throw Error("can not parse propertyName from trackName: " + a); return b } ; fa.findNode = function(a, b) { if (!b || "" === b || "root" === b || "." === b || -1 === b || b === a.name || b === a.uuid) return a; if (a.skeleton) { var c = function(a) { for (var c = 0; c < a.bones.length; c++) { var d = a.bones[c]; if (d.name === b) return d } return null }(a.skeleton); if (c) return c } if (a.children) { var d = function(a) { for (var c = 0; c < a.length; c++) { var g = a[c]; if (g.name === b || g.uuid === b || (g = d(g.children))) return g } return null }; if (c = d(a.children)) return c } return null } ; Sd.prototype = { constructor: Sd, isAnimationObjectGroup: !0, add: function(a) { for (var b = this._objects, c = b.length, d = this.nCachedObjects_, e = this._indicesByUUID, f = this._paths, g = this._parsedPaths, h = this._bindings, k = h.length, l = 0, q = arguments.length; l !== q; ++l) { var n = arguments[l] , p = n.uuid , r = e[p]; if (void 0 === r) { r = c++; e[p] = r; b.push(n); for (var p = 0, x = k; p !== x; ++p) h[p].push(new fa(n,f[p],g[p])) } else if (r < d) { var t = b[r] , D = --d , x = b[D]; e[x.uuid] = r; b[r] = x; e[p] = D; b[D] = n; p = 0; for (x = k; p !== x; ++p) { var u = h[p] , v = u[r]; u[r] = u[D]; void 0 === v && (v = new fa(n,f[p],g[p])); u[D] = v } } else b[r] !== t && console.error("Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes...") } this.nCachedObjects_ = d }, remove: function(a) { for (var b = this._objects, c = this.nCachedObjects_, d = this._indicesByUUID, e = this._bindings, f = e.length, g = 0, h = arguments.length; g !== h; ++g) { var k = arguments[g] , l = k.uuid , q = d[l]; if (void 0 !== q && q >= c) { var n = c++ , p = b[n]; d[p.uuid] = q; b[q] = p; d[l] = n; b[n] = k; k = 0; for (l = f; k !== l; ++k) { var p = e[k] , r = p[q]; p[q] = p[n]; p[n] = r } } } this.nCachedObjects_ = c }, uncache: function(a) { for (var b = this._objects, c = b.length, d = this.nCachedObjects_, e = this._indicesByUUID, f = this._bindings, g = f.length, h = 0, k = arguments.length; h !== k; ++h) { var l = arguments[h].uuid , q = e[l]; if (void 0 !== q) if (delete e[l], q < d) { var l = --d , n = b[l] , p = --c , r = b[p]; e[n.uuid] = q; b[q] = n; e[r.uuid] = l; b[l] = r; b.pop(); n = 0; for (r = g; n !== r; ++n) { var x = f[n] , t = x[p]; x[q] = x[l]; x[l] = t; x.pop() } } else for (p = --c, r = b[p], e[r.uuid] = q, b[q] = r, b.pop(), n = 0, r = g; n !== r; ++n) x = f[n], x[q] = x[p], x.pop() } this.nCachedObjects_ = d }, subscribe_: function(a, b) { var c = this._bindingsIndicesByPath , d = c[a] , e = this._bindings; if (void 0 !== d) return e[d]; var f = this._paths , g = this._parsedPaths , h = this._objects , k = this.nCachedObjects_ , l = Array(h.length) , d = e.length; c[a] = d; f.push(a); g.push(b); e.push(l); c = k; for (d = h.length; c !== d; ++c) l[c] = new fa(h[c],a,b); return l }, unsubscribe_: function(a) { var b = this._bindingsIndicesByPath , c = b[a]; if (void 0 !== c) { var d = this._paths , e = this._parsedPaths , f = this._bindings , g = f.length - 1 , h = f[g]; b[a[g]] = c; f[c] = h; f.pop(); e[c] = e[g]; e.pop(); d[c] = d[g]; d.pop() } } }; Td.prototype = { constructor: Td, play: function() { this._mixer._activateAction(this); return this }, stop: function() { this._mixer._deactivateAction(this); return this.reset() }, reset: function() { this.paused = !1; this.enabled = !0; this.time = 0; this._loopCount = -1; this._startTime = null; return this.stopFading().stopWarping() }, isRunning: function() { return this.enabled && !this.paused && 0 !== this.timeScale && null === this._startTime && this._mixer._isActiveAction(this) }, isScheduled: function() { return this._mixer._isActiveAction(this) }, startAt: function(a) { this._startTime = a; return this }, setLoop: function(a, b) { this.loop = a; this.repetitions = b; return this }, setEffectiveWeight: function(a) { this.weight = a; this._effectiveWeight = this.enabled ? a : 0; return this.stopFading() }, getEffectiveWeight: function() { return this._effectiveWeight }, fadeIn: function(a) { return this._scheduleFading(a, 0, 1) }, fadeOut: function(a) { return this._scheduleFading(a, 1, 0) }, crossFadeFrom: function(a, b, c) { a.fadeOut(b); this.fadeIn(b); if (c) { c = this._clip.duration; var d = a._clip.duration , e = c / d; a.warp(1, d / c, b); this.warp(e, 1, b) } return this }, crossFadeTo: function(a, b, c) { return a.crossFadeFrom(this, b, c) }, stopFading: function() { var a = this._weightInterpolant; null !== a && (this._weightInterpolant = null, this._mixer._takeBackControlInterpolant(a)); return this }, setEffectiveTimeScale: function(a) { this.timeScale = a; this._effectiveTimeScale = this.paused ? 0 : a; return this.stopWarping() }, getEffectiveTimeScale: function() { return this._effectiveTimeScale }, setDuration: function(a) { this.timeScale = this._clip.duration / a; return this.stopWarping() }, syncWith: function(a) { this.time = a.time; this.timeScale = a.timeScale; return this.stopWarping() }, halt: function(a) { return this.warp(this._effectiveTimeScale, 0, a) }, warp: function(a, b, c) { var d = this._mixer , e = d.time , f = this._timeScaleInterpolant , g = this.timeScale; null === f && (this._timeScaleInterpolant = f = d._lendControlInterpolant()); d = f.parameterPositions; f = f.sampleValues; d[0] = e; d[1] = e + c; f[0] = a / g; f[1] = b / g; return this }, stopWarping: function() { var a = this._timeScaleInterpolant; null !== a && (this._timeScaleInterpolant = null, this._mixer._takeBackControlInterpolant(a)); return this }, getMixer: function() { return this._mixer }, getClip: function() { return this._clip }, getRoot: function() { return this._localRoot || this._mixer._root }, _update: function(a, b, c, d) { var e = this._startTime; if (null !== e) { b = (a - e) * c; if (0 > b || 0 === c) return; this._startTime = null; b *= c } b *= this._updateTimeScale(a); c = this._updateTime(b); a = this._updateWeight(a); if (0 < a) { b = this._interpolants; for (var e = this._propertyBindings, f = 0, g = b.length; f !== g; ++f) b[f].evaluate(c), e[f].accumulate(d, a) } }, _updateWeight: function(a) { var b = 0; if (this.enabled) { var b = this.weight , c = this._weightInterpolant; if (null !== c) { var d = c.evaluate(a)[0] , b = b * d; a > c.parameterPositions[1] && (this.stopFading(), 0 === d && (this.enabled = !1)) } } return this._effectiveWeight = b }, _updateTimeScale: function(a) { var b = 0; if (!this.paused) { var b = this.timeScale , c = this._timeScaleInterpolant; if (null !== c) { var d = c.evaluate(a)[0] , b = b * d; a > c.parameterPositions[1] && (this.stopWarping(), 0 === b ? this.paused = !0 : this.timeScale = b) } } return this._effectiveTimeScale = b }, _updateTime: function(a) { var b = this.time + a; if (0 === a) return b; var c = this._clip.duration , d = this.loop , e = this._loopCount; if (2200 === d) a: { if (-1 === e && (this.loopCount = 0, this._setEndings(!0, !0, !1)), b >= c) b = c; else if (0 > b) b = 0; else break a; this.clampWhenFinished ? this.paused = !0 : this.enabled = !1; this._mixer.dispatchEvent({ type: "finished", action: this, direction: 0 > a ? -1 : 1 }) } else { d = 2202 === d; -1 === e && (0 <= a ? (e = 0, this._setEndings(!0, 0 === this.repetitions, d)) : this._setEndings(0 === this.repetitions, !0, d)); if (b >= c || 0 > b) { var f = Math.floor(b / c) , b = b - c * f , e = e + Math.abs(f) , g = this.repetitions - e; 0 > g ? (this.clampWhenFinished ? this.paused = !0 : this.enabled = !1, b = 0 < a ? c : 0, this._mixer.dispatchEvent({ type: "finished", action: this, direction: 0 < a ? 1 : -1 })) : (0 === g ? (a = 0 > a, this._setEndings(a, !a, d)) : this._setEndings(!1, !1, d), this._loopCount = e, this._mixer.dispatchEvent({ type: "loop", action: this, loopDelta: f })) } if (d && 1 === (e & 1)) return this.time = b, c - b } return this.time = b }, _setEndings: function(a, b, c) { var d = this._interpolantSettings; c ? (d.endingStart = 2401, d.endingEnd = 2401) : (d.endingStart = a ? this.zeroSlopeAtStart ? 2401 : 2400 : 2402, d.endingEnd = b ? this.zeroSlopeAtEnd ? 2401 : 2400 : 2402) }, _scheduleFading: function(a, b, c) { var d = this._mixer , e = d.time , f = this._weightInterpolant; null === f && (this._weightInterpolant = f = d._lendControlInterpolant()); d = f.parameterPositions; f = f.sampleValues; d[0] = e; f[0] = b; d[1] = e + a; f[1] = c; return this } }; Object.assign(Ud.prototype, sa.prototype, { clipAction: function(a, b) { var c = b || this._root , d = c.uuid , e = "string" === typeof a ? Ha.findByName(c, a) : a , c = null !== e ? e.uuid : a , f = this._actionsByClip[c] , g = null; if (void 0 !== f) { g = f.actionByRoot[d]; if (void 0 !== g) return g; g = f.knownActions[0]; null === e && (e = g._clip) } if (null === e) return null; e = new Td(this,e,b); this._bindAction(e, g); this._addInactiveAction(e, c, d); return e }, existingAction: function(a, b) { var c = b || this._root , d = c.uuid , c = "string" === typeof a ? Ha.findByName(c, a) : a , c = this._actionsByClip[c ? c.uuid : a]; return void 0 !== c ? c.actionByRoot[d] || null : null }, stopAllAction: function() { for (var a = this._actions, b = this._nActiveActions, c = this._bindings, d = this._nActiveBindings, e = this._nActiveBindings = this._nActiveActions = 0; e !== b; ++e) a[e].reset(); for (e = 0; e !== d; ++e) c[e].useCount = 0; return this }, update: function(a) { a *= this.timeScale; for (var b = this._actions, c = this._nActiveActions, d = this.time += a, e = Math.sign(a), f = this._accuIndex ^= 1, g = 0; g !== c; ++g) { var h = b[g]; h.enabled && h._update(d, a, e, f) } a = this._bindings; b = this._nActiveBindings; for (g = 0; g !== b; ++g) a[g].apply(f); return this }, getRoot: function() { return this._root }, uncacheClip: function(a) { var b = this._actions; a = a.uuid; var c = this._actionsByClip , d = c[a]; if (void 0 !== d) { for (var d = d.knownActions, e = 0, f = d.length; e !== f; ++e) { var g = d[e]; this._deactivateAction(g); var h = g._cacheIndex , k = b[b.length - 1]; g._cacheIndex = null; g._byClipCacheIndex = null; k._cacheIndex = h; b[h] = k; b.pop(); this._removeInactiveBindingsForAction(g) } delete c[a] } }, uncacheRoot: function(a) { a = a.uuid; var b = this._actionsByClip, c; for (c in b) { var d = b[c].actionByRoot[a]; void 0 !== d && (this._deactivateAction(d), this._removeInactiveAction(d)) } c = this._bindingsByRootAndName[a]; if (void 0 !== c) for (var e in c) a = c[e], a.restoreOriginalState(), this._removeInactiveBinding(a) }, uncacheAction: function(a, b) { var c = this.existingAction(a, b); null !== c && (this._deactivateAction(c), this._removeInactiveAction(c)) } }); Object.assign(Ud.prototype, { _bindAction: function(a, b) { var c = a._localRoot || this._root , d = a._clip.tracks , e = d.length , f = a._propertyBindings , g = a._interpolants , h = c.uuid , k = this._bindingsByRootAndName , l = k[h]; void 0 === l && (l = {}, k[h] = l); for (k = 0; k !== e; ++k) { var q = d[k] , n = q.name , p = l[n]; if (void 0 === p) { p = f[k]; if (void 0 !== p) { null === p._cacheIndex && (++p.referenceCount, this._addInactiveBinding(p, h, n)); continue } p = new wd(fa.create(c, n, b && b._propertyBindings[k].binding.parsedPath),q.ValueTypeName,q.getValueSize()); ++p.referenceCount; this._addInactiveBinding(p, h, n) } f[k] = p; g[k].resultBuffer = p.buffer } }, _activateAction: function(a) { if (!this._isActiveAction(a)) { if (null === a._cacheIndex) { var b = (a._localRoot || this._root).uuid , c = a._clip.uuid , d = this._actionsByClip[c]; this._bindAction(a, d && d.knownActions[0]); this._addInactiveAction(a, c, b) } b = a._propertyBindings; c = 0; for (d = b.length; c !== d; ++c) { var e = b[c]; 0 === e.useCount++ && (this._lendBinding(e), e.saveOriginalState()) } this._lendAction(a) } }, _deactivateAction: function(a) { if (this._isActiveAction(a)) { for (var b = a._propertyBindings, c = 0, d = b.length; c !== d; ++c) { var e = b[c]; 0 === --e.useCount && (e.restoreOriginalState(), this._takeBackBinding(e)) } this._takeBackAction(a) } }, _initMemoryManager: function() { this._actions = []; this._nActiveActions = 0; this._actionsByClip = {}; this._bindings = []; this._nActiveBindings = 0; this._bindingsByRootAndName = {}; this._controlInterpolants = []; this._nActiveControlInterpolants = 0; var a = this; this.stats = { actions: { get total() { return a._actions.length }, get inUse() { return a._nActiveActions } }, bindings: { get total() { return a._bindings.length }, get inUse() { return a._nActiveBindings } }, controlInterpolants: { get total() { return a._controlInterpolants.length }, get inUse() { return a._nActiveControlInterpolants } } } }, _isActiveAction: function(a) { a = a._cacheIndex; return null !== a && a < this._nActiveActions }, _addInactiveAction: function(a, b, c) { var d = this._actions , e = this._actionsByClip , f = e[b]; void 0 === f ? (f = { knownActions: [a], actionByRoot: {} }, a._byClipCacheIndex = 0, e[b] = f) : (b = f.knownActions, a._byClipCacheIndex = b.length, b.push(a)); a._cacheIndex = d.length; d.push(a); f.actionByRoot[c] = a }, _removeInactiveAction: function(a) { var b = this._actions , c = b[b.length - 1] , d = a._cacheIndex; c._cacheIndex = d; b[d] = c; b.pop(); a._cacheIndex = null; var c = a._clip.uuid , d = this._actionsByClip , e = d[c] , f = e.knownActions , g = f[f.length - 1] , h = a._byClipCacheIndex; g._byClipCacheIndex = h; f[h] = g; f.pop(); a._byClipCacheIndex = null; delete e.actionByRoot[(b._localRoot || this._root).uuid]; 0 === f.length && delete d[c]; this._removeInactiveBindingsForAction(a) }, _removeInactiveBindingsForAction: function(a) { a = a._propertyBindings; for (var b = 0, c = a.length; b !== c; ++b) { var d = a[b]; 0 === --d.referenceCount && this._removeInactiveBinding(d) } }, _lendAction: function(a) { var b = this._actions , c = a._cacheIndex , d = this._nActiveActions++ , e = b[d]; a._cacheIndex = d; b[d] = a; e._cacheIndex = c; b[c] = e }, _takeBackAction: function(a) { var b = this._actions , c = a._cacheIndex , d = --this._nActiveActions , e = b[d]; a._cacheIndex = d; b[d] = a; e._cacheIndex = c; b[c] = e }, _addInactiveBinding: function(a, b, c) { var d = this._bindingsByRootAndName , e = d[b] , f = this._bindings; void 0 === e && (e = {}, d[b] = e); e[c] = a; a._cacheIndex = f.length; f.push(a) }, _removeInactiveBinding: function(a) { var b = this._bindings , c = a.binding , d = c.rootNode.uuid , c = c.path , e = this._bindingsByRootAndName , f = e[d] , g = b[b.length - 1]; a = a._cacheIndex; g._cacheIndex = a; b[a] = g; b.pop(); delete f[c]; a: { for (var h in f) break a; delete e[d] } }, _lendBinding: function(a) { var b = this._bindings , c = a._cacheIndex , d = this._nActiveBindings++ , e = b[d]; a._cacheIndex = d; b[d] = a; e._cacheIndex = c; b[c] = e }, _takeBackBinding: function(a) { var b = this._bindings , c = a._cacheIndex , d = --this._nActiveBindings , e = b[d]; a._cacheIndex = d; b[d] = a; e._cacheIndex = c; b[c] = e }, _lendControlInterpolant: function() { var a = this._controlInterpolants , b = this._nActiveControlInterpolants++ , c = a[b]; void 0 === c && (c = new Mc(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer), c.__cacheIndex = b, a[b] = c); return c }, _takeBackControlInterpolant: function(a) { var b = this._controlInterpolants , c = a.__cacheIndex , d = --this._nActiveControlInterpolants , e = b[d]; a.__cacheIndex = d; b[d] = a; e.__cacheIndex = c; b[c] = e }, _controlInterpolantsResultBuffer: new Float32Array(1) }); Bb.prototype = Object.create(G.prototype); Bb.prototype.constructor = Bb; Bb.prototype.isInstancedBufferGeometry = !0; Bb.prototype.addGroup = function(a, b, c) { this.groups.push({ start: a, count: b, materialIndex: c }) } ; Bb.prototype.copy = function(a) { var b = a.index; null !== b && this.setIndex(b.clone()); var b = a.attributes, c; for (c in b) this.addAttribute(c, b[c].clone()); a = a.groups; c = 0; for (b = a.length; c < b; c++) { var d = a[c]; this.addGroup(d.start, d.count, d.materialIndex) } return this } ; Vd.prototype = { constructor: Vd, isInterleavedBufferAttribute: !0, get count() { return this.data.count }, get array() { return this.data.array }, setX: function(a, b) { this.data.array[a * this.data.stride + this.offset] = b; return this }, setY: function(a, b) { this.data.array[a * this.data.stride + this.offset + 1] = b; return this }, setZ: function(a, b) { this.data.array[a * this.data.stride + this.offset + 2] = b; return this }, setW: function(a, b) { this.data.array[a * this.data.stride + this.offset + 3] = b; return this }, getX: function(a) { return this.data.array[a * this.data.stride + this.offset] }, getY: function(a) { return this.data.array[a * this.data.stride + this.offset + 1] }, getZ: function(a) { return this.data.array[a * this.data.stride + this.offset + 2] }, getW: function(a) { return this.data.array[a * this.data.stride + this.offset + 3] }, setXY: function(a, b, c) { a = a * this.data.stride + this.offset; this.data.array[a + 0] = b; this.data.array[a + 1] = c; return this }, setXYZ: function(a, b, c, d) { a = a * this.data.stride + this.offset; this.data.array[a + 0] = b; this.data.array[a + 1] = c; this.data.array[a + 2] = d; return this }, setXYZW: function(a, b, c, d, e) { a = a * this.data.stride + this.offset; this.data.array[a + 0] = b; this.data.array[a + 1] = c; this.data.array[a + 2] = d; this.data.array[a + 3] = e; return this } }; ec.prototype = { constructor: ec, isInterleavedBuffer: !0, set needsUpdate(a) { !0 === a && this.version++ }, setArray: function(a) { if (Array.isArray(a)) throw new TypeError("THREE.BufferAttribute: array should be a Typed Array."); this.count = void 0 !== a ? a.length / this.stride : 0; this.array = a }, setDynamic: function(a) { this.dynamic = a; return this }, copy: function(a) { this.array = new a.array.constructor(a.array); this.count = a.count; this.stride = a.stride; this.dynamic = a.dynamic; return this }, copyAt: function(a, b, c) { a *= this.stride; c *= b.stride; for (var d = 0, e = this.stride; d < e; d++) this.array[a + d] = b.array[c + d]; return this }, set: function(a, b) { void 0 === b && (b = 0); this.array.set(a, b); return this }, clone: function() { return (new this.constructor).copy(this) } }; fc.prototype = Object.create(ec.prototype); fc.prototype.constructor = fc; fc.prototype.isInstancedInterleavedBuffer = !0; fc.prototype.copy = function(a) { ec.prototype.copy.call(this, a); this.meshPerAttribute = a.meshPerAttribute; return this } ; gc.prototype = Object.create(C.prototype); gc.prototype.constructor = gc; gc.prototype.isInstancedBufferAttribute = !0; gc.prototype.copy = function(a) { C.prototype.copy.call(this, a); this.meshPerAttribute = a.meshPerAttribute; return this } ; Wd.prototype = { constructor: Wd, linePrecision: 1, set: function(a, b) { this.ray.set(a, b) }, setFromCamera: function(a, b) { b && b.isPerspectiveCamera ? (this.ray.origin.setFromMatrixPosition(b.matrixWorld), this.ray.direction.set(a.x, a.y, .5).unproject(b).sub(this.ray.origin).normalize()) : b && b.isOrthographicCamera ? (this.ray.origin.set(a.x, a.y, (b.near + b.far) / (b.near - b.far)).unproject(b), this.ray.direction.set(0, 0, -1).transformDirection(b.matrixWorld)) : console.error("THREE.Raycaster: Unsupported camera type.") }, intersectObject: function(a, b) { var c = []; Xd(a, this, c, b); c.sort(Be); return c }, intersectObjects: function(a, b) { var c = []; if (!1 === Array.isArray(a)) return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."), c; for (var d = 0, e = a.length; d < e; d++) Xd(a[d], this, c, b); c.sort(Be); return c } }; Yd.prototype = { constructor: Yd, start: function() { this.oldTime = this.startTime = (performance || Date).now(); this.elapsedTime = 0; this.running = !0 }, stop: function() { this.getElapsedTime(); this.running = !1 }, getElapsedTime: function() { this.getDelta(); return this.elapsedTime }, getDelta: function() { var a = 0; this.autoStart && !this.running && this.start(); if (this.running) { var b = (performance || Date).now() , a = (b - this.oldTime) / 1E3; this.oldTime = b; this.elapsedTime += a } return a } }; Zd.prototype = { constructor: Zd, set: function(a, b, c) { this.radius = a; this.phi = b; this.theta = c; return this }, clone: function() { return (new this.constructor).copy(this) }, copy: function(a) { this.radius = a.radius; this.phi = a.phi; this.theta = a.theta; return this }, makeSafe: function() { this.phi = Math.max(1E-6, Math.min(Math.PI - 1E-6, this.phi)); return this }, setFromVector3: function(a) { this.radius = a.length(); 0 === this.radius ? this.phi = this.theta = 0 : (this.theta = Math.atan2(a.x, a.z), this.phi = Math.acos(T.clamp(a.y / this.radius, -1, 1))); return this } }; na.prototype = Object.create(ya.prototype); na.prototype.constructor = na; na.prototype.createAnimation = function(a, b, c, d) { b = { start: b, end: c, length: c - b + 1, fps: d, duration: (c - b) / d, lastFrame: 0, currentFrame: 0, active: !1, time: 0, direction: 1, weight: 1, directionBackwards: !1, mirroredLoop: !1 }; this.animationsMap[a] = b; this.animationsList.push(b) } ; na.prototype.autoCreateAnimations = function(a) { for (var b = /([a-z]+)_?(\d+)/i, c, d = {}, e = this.geometry, f = 0, g = e.morphTargets.length; f < g; f++) { var h = e.morphTargets[f].name.match(b); if (h && 1 < h.length) { var k = h[1]; d[k] || (d[k] = { start: Infinity, end: -Infinity }); h = d[k]; f < h.start && (h.start = f); f > h.end && (h.end = f); c || (c = k) } } for (k in d) h = d[k], this.createAnimation(k, h.start, h.end, a); this.firstAnimation = c } ; na.prototype.setAnimationDirectionForward = function(a) { if (a = this.animationsMap[a]) a.direction = 1, a.directionBackwards = !1 } ; na.prototype.setAnimationDirectionBackward = function(a) { if (a = this.animationsMap[a]) a.direction = -1, a.directionBackwards = !0 } ; na.prototype.setAnimationFPS = function(a, b) { var c = this.animationsMap[a]; c && (c.fps = b, c.duration = (c.end - c.start) / c.fps) } ; na.prototype.setAnimationDuration = function(a, b) { var c = this.animationsMap[a]; c && (c.duration = b, c.fps = (c.end - c.start) / c.duration) } ; na.prototype.setAnimationWeight = function(a, b) { var c = this.animationsMap[a]; c && (c.weight = b) } ; na.prototype.setAnimationTime = function(a, b) { var c = this.animationsMap[a]; c && (c.time = b) } ; na.prototype.getAnimationTime = function(a) { var b = 0; if (a = this.animationsMap[a]) b = a.time; return b } ; na.prototype.getAnimationDuration = function(a) { var b = -1; if (a = this.animationsMap[a]) b = a.duration; return b } ; na.prototype.playAnimation = function(a) { var b = this.animationsMap[a]; b ? (b.time = 0, b.active = !0) : console.warn("THREE.MorphBlendMesh: animation[" + a + "] undefined in .playAnimation()") } ; na.prototype.stopAnimation = function(a) { if (a = this.animationsMap[a]) a.active = !1 } ; na.prototype.update = function(a) { for (var b = 0, c = this.animationsList.length; b < c; b++) { var d = this.animationsList[b]; if (d.active) { var e = d.duration / d.length; d.time += d.direction * a; if (d.mirroredLoop) { if (d.time > d.duration || 0 > d.time) d.direction *= -1, d.time > d.duration && (d.time = d.duration, d.directionBackwards = !0), 0 > d.time && (d.time = 0, d.directionBackwards = !1) } else d.time %= d.duration, 0 > d.time && (d.time += d.duration); var f = d.start + T.clamp(Math.floor(d.time / e), 0, d.length - 1) , g = d.weight; f !== d.currentFrame && (this.morphTargetInfluences[d.lastFrame] = 0, this.morphTargetInfluences[d.currentFrame] = 1 * g, this.morphTargetInfluences[f] = 0, d.lastFrame = d.currentFrame, d.currentFrame = f); e = d.time % e / e; d.directionBackwards && (e = 1 - e); d.currentFrame !== d.lastFrame ? (this.morphTargetInfluences[d.currentFrame] = e * g, this.morphTargetInfluences[d.lastFrame] = (1 - e) * g) : this.morphTargetInfluences[d.currentFrame] = g } } } ; Qc.prototype = Object.create(z.prototype); Qc.prototype.constructor = Qc; Qc.prototype.isImmediateRenderObject = !0; Rc.prototype = Object.create(la.prototype); Rc.prototype.constructor = Rc; Rc.prototype.update = function() { var a = new q , b = new q , c = new Ia; return function() { var d = ["a", "b", "c"]; this.object.updateMatrixWorld(!0); c.getNormalMatrix(this.object.matrixWorld); var e = this.object.matrixWorld , f = this.geometry.attributes.position , g = this.object.geometry; if (g && g.isGeometry) for (var h = g.vertices, k = g.faces, l = g = 0, q = k.length; l < q; l++) for (var n = k[l], p = 0, r = n.vertexNormals.length; p < r; p++) { var x = n.vertexNormals[p]; a.copy(h[n[d[p]]]).applyMatrix4(e); b.copy(x).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a); f.setXYZ(g, a.x, a.y, a.z); g += 1; f.setXYZ(g, b.x, b.y, b.z); g += 1 } else if (g && g.isBufferGeometry) for (d = g.attributes.position, h = g.attributes.normal, p = g = 0, r = d.count; p < r; p++) a.set(d.getX(p), d.getY(p), d.getZ(p)).applyMatrix4(e), b.set(h.getX(p), h.getY(p), h.getZ(p)), b.applyMatrix3(c).normalize().multiplyScalar(this.size).add(a), f.setXYZ(g, a.x, a.y, a.z), g += 1, f.setXYZ(g, b.x, b.y, b.z), g += 1; f.needsUpdate = !0; return this } }(); hc.prototype = Object.create(z.prototype); hc.prototype.constructor = hc; hc.prototype.dispose = function() { this.cone.geometry.dispose(); this.cone.material.dispose() } ; hc.prototype.update = function() { var a = new q , b = new q; return function() { var c = this.light.distance ? this.light.distance : 1E3 , d = c * Math.tan(this.light.angle); this.cone.scale.set(d, d, c); a.setFromMatrixPosition(this.light.matrixWorld); b.setFromMatrixPosition(this.light.target.matrixWorld); this.cone.lookAt(b.sub(a)); this.cone.material.color.copy(this.light.color).multiplyScalar(this.light.intensity) } }(); ic.prototype = Object.create(la.prototype); ic.prototype.constructor = ic; ic.prototype.getBoneList = function(a) { var b = []; a && a.isBone && b.push(a); for (var c = 0; c < a.children.length; c++) b.push.apply(b, this.getBoneList(a.children[c])); return b } ; ic.prototype.update = function() { for (var a = this.geometry, b = (new J).getInverse(this.root.matrixWorld), c = new J, d = 0, e = 0; e < this.bones.length; e++) { var f = this.bones[e]; f.parent && f.parent.isBone && (c.multiplyMatrices(b, f.matrixWorld), a.vertices[d].setFromMatrixPosition(c), c.multiplyMatrices(b, f.parent.matrixWorld), a.vertices[d + 1].setFromMatrixPosition(c), d += 2) } a.verticesNeedUpdate = !0; a.computeBoundingSphere() } ; jc.prototype = Object.create(ya.prototype); jc.prototype.constructor = jc; jc.prototype.dispose = function() { this.geometry.dispose(); this.material.dispose() } ; jc.prototype.update = function() { this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity) } ; kc.prototype = Object.create(z.prototype); kc.prototype.constructor = kc; kc.prototype.dispose = function() { this.lightSphere.geometry.dispose(); this.lightSphere.material.dispose() } ; kc.prototype.update = function() { var a = new q; 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(a.setFromMatrixPosition(this.light.matrixWorld).negate()); this.lightSphere.geometry.colorsNeedUpdate = !0 } }(); Sc.prototype = Object.create(la.prototype); Sc.prototype.constructor = Sc; Sc.prototype.setColors = function() { console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.") } ; Tc.prototype = Object.create(la.prototype); Tc.prototype.constructor = Tc; Tc.prototype.update = function() { var a = new q , b = new q , c = new Ia; return function() { this.object.updateMatrixWorld(!0); c.getNormalMatrix(this.object.matrixWorld); for (var d = this.object.matrixWorld, e = this.geometry.attributes.position, f = this.object.geometry, g = f.vertices, f = f.faces, h = 0, k = 0, l = f.length; k < l; k++) { var q = f[k] , n = q.normal; a.copy(g[q.a]).add(g[q.b]).add(g[q.c]).divideScalar(3).applyMatrix4(d); b.copy(n).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a); e.setXYZ(h, a.x, a.y, a.z); h += 1; e.setXYZ(h, b.x, b.y, b.z); h += 1 } e.needsUpdate = !0; return this } }(); lc.prototype = Object.create(z.prototype); lc.prototype.constructor = lc; lc.prototype.dispose = function() { var a = this.children[0] , b = this.children[1]; a.geometry.dispose(); a.material.dispose(); b.geometry.dispose(); b.material.dispose() } ; lc.prototype.update = function() { var a = new q , b = new q , c = new q; return function() { a.setFromMatrixPosition(this.light.matrixWorld); b.setFromMatrixPosition(this.light.target.matrixWorld); c.subVectors(b, a); var d = this.children[0] , e = this.children[1]; d.lookAt(c); d.material.color.copy(this.light.color).multiplyScalar(this.light.intensity); e.lookAt(c); e.scale.z = c.length() } }(); Uc.prototype = Object.create(la.prototype); Uc.prototype.constructor = Uc; Uc.prototype.update = function() { function a(a, g, h, k) { d.set(g, h, k).unproject(e); a = c[a]; if (void 0 !== a) for (g = 0, h = a.length; g < h; g++) b.vertices[a[g]].copy(d) } var b, c, d = new q, e = new Z; return function() { b = this.geometry; c = this.pointMap; e.projectionMatrix.copy(this.camera.projectionMatrix); a("c", 0, 0, -1); a("t", 0, 0, 1); a("n1", -1, -1, -1); a("n2", 1, -1, -1); a("n3", -1, 1, -1); a("n4", 1, 1, -1); a("f1", -1, -1, 1); a("f2", 1, -1, 1); a("f3", -1, 1, 1); a("f4", 1, 1, 1); a("u1", .7, 1.1, -1); a("u2", -.7, 1.1, -1); a("u3", 0, 2, -1); a("cf1", -1, 0, 1); a("cf2", 1, 0, 1); a("cf3", 0, -1, 1); a("cf4", 0, 1, 1); a("cn1", -1, 0, -1); a("cn2", 1, 0, -1); a("cn3", 0, -1, -1); a("cn4", 0, 1, -1); b.verticesNeedUpdate = !0 } }(); Vc.prototype = Object.create(ya.prototype); Vc.prototype.constructor = Vc; Vc.prototype.update = function() { this.box.setFromObject(this.object); this.box.getSize(this.scale); this.box.getCenter(this.position) } ; Wc.prototype = Object.create(la.prototype); Wc.prototype.constructor = Wc; Wc.prototype.update = function() { var a = new Ba; return function(b) { b && b.isBox3 ? a.copy(b) : a.setFromObject(b); if (!a.isEmpty()) { b = a.min; var c = a.max , d = this.geometry.attributes.position , e = d.array; e[0] = c.x; e[1] = c.y; e[2] = c.z; e[3] = b.x; e[4] = c.y; e[5] = c.z; e[6] = b.x; e[7] = b.y; e[8] = c.z; e[9] = c.x; e[10] = b.y; e[11] = c.z; e[12] = c.x; e[13] = c.y; e[14] = b.z; e[15] = b.x; e[16] = c.y; e[17] = b.z; e[18] = b.x; e[19] = b.y; e[20] = b.z; e[21] = c.x; e[22] = b.y; e[23] = b.z; d.needsUpdate = !0; this.geometry.computeBoundingSphere() } } }(); var Ce = new G; Ce.addAttribute("position", new ha([0, 0, 0, 0, 1, 0],3)); var De = new Ua(0,.5,1,5,1); De.translate(0, -.5, 0); Cb.prototype = Object.create(z.prototype); Cb.prototype.constructor = Cb; Cb.prototype.setDirection = function() { var a = new q, b; return function(c) { .99999 < c.y ? this.quaternion.set(0, 0, 0, 1) : -.99999 > c.y ? this.quaternion.set(1, 0, 0, 0) : (a.set(c.z, 0, -c.x).normalize(), b = Math.acos(c.y), this.quaternion.setFromAxisAngle(a, b)) } }(); Cb.prototype.setLength = function(a, b, c) { void 0 === b && (b = .2 * a); void 0 === c && (c = .2 * b); this.line.scale.set(1, Math.max(0, a - b), 1); this.line.updateMatrix(); this.cone.scale.set(c, b, c); this.cone.position.y = a; this.cone.updateMatrix() } ; Cb.prototype.setColor = function(a) { this.line.material.color.copy(a); this.cone.material.color.copy(a) } ; xd.prototype = Object.create(la.prototype); xd.prototype.constructor = xd; var $d = function() { function a() {} var b = new q , c = new a , d = new a , e = new a; a.prototype.init = function(a, b, c, d) { this.c0 = a; this.c1 = c; this.c2 = -3 * a + 3 * b - 2 * c - d; this.c3 = 2 * a - 2 * b + c + d } ; a.prototype.initNonuniformCatmullRom = function(a, b, c, d, e, l, n) { this.init(b, c, ((b - a) / e - (c - a) / (e + l) + (c - b) / l) * l, ((c - b) / l - (d - b) / (l + n) + (d - c) / n) * l) } ; a.prototype.initCatmullRom = function(a, b, c, d, e) { this.init(b, c, e * (c - a), e * (d - b)) } ; a.prototype.calc = function(a) { var b = a * a; return this.c0 + this.c1 * a + this.c2 * b + this.c3 * b * a } ; return ia.create(function(a) { this.points = a || []; this.closed = !1 }, function(a) { var g = this.points, h, k; k = g.length; 2 > k && console.log("duh, you need at least 2 points"); a *= k - (this.closed ? 0 : 1); h = Math.floor(a); a -= h; this.closed ? h += 0 < h ? 0 : (Math.floor(Math.abs(h) / g.length) + 1) * g.length : 0 === a && h === k - 1 && (h = k - 2, a = 1); var l, w, n; this.closed || 0 < h ? l = g[(h - 1) % k] : (b.subVectors(g[0], g[1]).add(g[0]), l = b); w = g[h % k]; n = g[(h + 1) % k]; this.closed || h + 2 < k ? g = g[(h + 2) % k] : (b.subVectors(g[k - 1], g[k - 2]).add(g[k - 1]), g = b); if (void 0 === this.type || "centripetal" === this.type || "chordal" === this.type) { var p = "chordal" === this.type ? .5 : .25; k = Math.pow(l.distanceToSquared(w), p); h = Math.pow(w.distanceToSquared(n), p); p = Math.pow(n.distanceToSquared(g), p); 1E-4 > h && (h = 1); 1E-4 > k && (k = h); 1E-4 > p && (p = h); c.initNonuniformCatmullRom(l.x, w.x, n.x, g.x, k, h, p); d.initNonuniformCatmullRom(l.y, w.y, n.y, g.y, k, h, p); e.initNonuniformCatmullRom(l.z, w.z, n.z, g.z, k, h, p) } else "catmullrom" === this.type && (k = void 0 !== this.tension ? this.tension : .5, c.initCatmullRom(l.x, w.x, n.x, g.x, k), d.initCatmullRom(l.y, w.y, n.y, g.y, k), e.initCatmullRom(l.z, w.z, n.z, g.z, k)); return new q(c.calc(a),d.calc(a),e.calc(a)) }) }(); Ee.prototype = Object.create($d.prototype); var Ef = ia.create(function(a) { console.warn("THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3"); this.points = void 0 === a ? [] : a }, function(a) { var b = this.points; a *= b.length - 1; var c = Math.floor(a); a -= c; var d = b[0 == c ? c : c - 1] , e = b[c] , f = b[c > b.length - 2 ? b.length - 1 : c + 1] , b = b[c > b.length - 3 ? b.length - 1 : c + 2] , c = Xc.interpolate; return new q(c(d.x, e.x, f.x, b.x, a),c(d.y, e.y, f.y, b.y, a),c(d.z, e.z, f.z, b.z, a)) }) , Ff = ia.create(function(a, b, c, d) { this.v0 = a; this.v1 = b; this.v2 = c; this.v3 = d }, function(a) { var b = ra.b3; return new q(b(a, this.v0.x, this.v1.x, this.v2.x, this.v3.x),b(a, this.v0.y, this.v1.y, this.v2.y, this.v3.y),b(a, this.v0.z, this.v1.z, this.v2.z, this.v3.z)) }) , Gf = ia.create(function(a, b, c) { this.v0 = a; this.v1 = b; this.v2 = c }, function(a) { var b = ra.b2; return new q(b(a, this.v0.x, this.v1.x, this.v2.x),b(a, this.v0.y, this.v1.y, this.v2.y),b(a, this.v0.z, this.v1.z, this.v2.z)) }) , Hf = ia.create(function(a, b) { this.v1 = a; this.v2 = b }, function(a) { if (1 === a) return this.v2.clone(); var b = new q; b.subVectors(this.v2, this.v1); b.multiplyScalar(a); b.add(this.v1); return b }); yd.prototype = Object.create(Va.prototype); yd.prototype.constructor = yd; Object.assign(mc.prototype, { center: function(a) { console.warn("THREE.Box2: .center() has been renamed to .getCenter()."); return this.getCenter(a) }, empty: function() { console.warn("THREE.Box2: .empty() has been renamed to .isEmpty()."); return this.isEmpty() }, isIntersectionBox: function(a) { console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."); return this.intersectsBox(a) }, size: function(a) { console.warn("THREE.Box2: .size() has been renamed to .getSize()."); return this.getSize(a) } }); Object.assign(Ba.prototype, { center: function(a) { console.warn("THREE.Box3: .center() has been renamed to .getCenter()."); return this.getCenter(a) }, empty: function() { console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."); return this.isEmpty() }, isIntersectionBox: function(a) { console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."); return this.intersectsBox(a) }, isIntersectionSphere: function(a) { console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."); return this.intersectsSphere(a) }, size: function(a) { console.warn("THREE.Box3: .size() has been renamed to .getSize()."); return this.getSize(a) } }); Object.assign(gb.prototype, { center: function(a) { console.warn("THREE.Line3: .center() has been renamed to .getCenter()."); return this.getCenter(a) } }); Object.assign(Ia.prototype, { multiplyVector3: function(a) { console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."); return a.applyMatrix3(this) }, multiplyVector3Array: function(a) { console.warn("THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead."); return this.applyToVector3Array(a) } }); Object.assign(J.prototype, { extractPosition: function(a) { console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."); return this.copyPosition(a) }, setRotationFromQuaternion: function(a) { console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."); return this.makeRotationFromQuaternion(a) }, multiplyVector3: function(a) { console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead."); return a.applyProjection(this) }, multiplyVector4: function(a) { console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."); return a.applyMatrix4(this) }, multiplyVector3Array: function(a) { console.warn("THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead."); return this.applyToVector3Array(a) }, rotateAxis: function(a) { console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."); a.transformDirection(this) }, crossVector: function(a) { console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."); return a.applyMatrix4(this) }, translate: function(a) { console.error("THREE.Matrix4: .translate() has been removed.") }, rotateX: function(a) { console.error("THREE.Matrix4: .rotateX() has been removed.") }, rotateY: function(a) { console.error("THREE.Matrix4: .rotateY() has been removed.") }, rotateZ: function(a) { console.error("THREE.Matrix4: .rotateZ() has been removed.") }, rotateByAxis: function(a, b) { console.error("THREE.Matrix4: .rotateByAxis() has been removed.") } }); Object.assign(va.prototype, { isIntersectionLine: function(a) { console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."); return this.intersectsLine(a) } }); Object.assign(ba.prototype, { multiplyVector3: function(a) { console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."); return a.applyQuaternion(this) } }); Object.assign(ab.prototype, { isIntersectionBox: function(a) { console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."); return this.intersectsBox(a) }, isIntersectionPlane: function(a) { console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."); return this.intersectsPlane(a) }, isIntersectionSphere: function(a) { console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."); return this.intersectsSphere(a) } }); Object.assign(Ab.prototype, { extrude: function(a) { console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."); return new za(this,a) }, makeGeometry: function(a) { console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."); return new cb(this,a) } }); Object.assign(q.prototype, { setEulerFromRotationMatrix: function() { console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.") }, setEulerFromQuaternion: function() { console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.") }, getPositionFromMatrix: function(a) { console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."); return this.setFromMatrixPosition(a) }, getScaleFromMatrix: function(a) { console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."); return this.setFromMatrixScale(a) }, getColumnFromMatrix: function(a, b) { console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."); return this.setFromMatrixColumn(b, a) } }); Object.assign(z.prototype, { getChildByName: function(a) { console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."); return this.getObjectByName(a) }, renderDepth: function(a) { console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.") }, translate: function(a, b) { console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."); return this.translateOnAxis(b, a) } }); Object.defineProperties(z.prototype, { eulerOrder: { get: function() { console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."); return this.rotation.order }, set: function(a) { console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."); this.rotation.order = a } }, useQuaternion: { get: function() { console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.") }, set: function(a) { console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.") } } }); Object.defineProperties(rc.prototype, { objects: { get: function() { console.warn("THREE.LOD: .objects has been renamed to .levels."); return this.levels } } }); Ea.prototype.setLens = function(a, b) { console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."); void 0 !== b && (this.filmGauge = b); this.setFocalLength(a) } ; Object.defineProperties(pa.prototype, { onlyShadow: { set: function(a) { console.warn("THREE.Light: .onlyShadow has been removed.") } }, shadowCameraFov: { set: function(a) { console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."); this.shadow.camera.fov = a } }, shadowCameraLeft: { set: function(a) { console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."); this.shadow.camera.left = a } }, shadowCameraRight: { set: function(a) { console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."); this.shadow.camera.right = a } }, shadowCameraTop: { set: function(a) { console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."); this.shadow.camera.top = a } }, shadowCameraBottom: { set: function(a) { console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."); this.shadow.camera.bottom = a } }, shadowCameraNear: { set: function(a) { console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."); this.shadow.camera.near = a } }, shadowCameraFar: { set: function(a) { console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."); this.shadow.camera.far = a } }, shadowCameraVisible: { set: function(a) { console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.") } }, shadowBias: { set: function(a) { console.warn("THREE.Light: .shadowBias is now .shadow.bias."); this.shadow.bias = a } }, shadowDarkness: { set: function(a) { console.warn("THREE.Light: .shadowDarkness has been removed.") } }, shadowMapWidth: { set: function(a) { console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."); this.shadow.mapSize.width = a } }, shadowMapHeight: { set: function(a) { console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."); this.shadow.mapSize.height = a } } }); Object.defineProperties(C.prototype, { length: { get: function() { console.warn("THREE.BufferAttribute: .length has been deprecated. Please use .count."); return this.array.length } } }); Object.assign(G.prototype, { addIndex: function(a) { console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."); this.setIndex(a) }, addDrawCall: function(a, b, c) { void 0 !== c && console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."); console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."); this.addGroup(a, b) }, clearDrawCalls: function() { console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."); this.clearGroups() }, computeTangents: function() { console.warn("THREE.BufferGeometry: .computeTangents() has been removed.") }, computeOffsets: function() { console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.") } }); Object.defineProperties(G.prototype, { drawcalls: { get: function() { console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."); return this.groups } }, offsets: { get: function() { console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."); return this.groups } } }); Object.defineProperties(U.prototype, { wrapAround: { get: function() { console.warn("THREE." + this.type + ": .wrapAround has been removed.") }, set: function(a) { console.warn("THREE." + this.type + ": .wrapAround has been removed.") } }, wrapRGB: { get: function() { console.warn("THREE." + this.type + ": .wrapRGB has been removed."); return new O } } }); Object.defineProperties(db.prototype, { metal: { get: function() { console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead."); return !1 }, set: function(a) { console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead") } } }); Object.defineProperties(Fa.prototype, { derivatives: { get: function() { console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."); return this.extensions.derivatives }, set: function(a) { console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."); this.extensions.derivatives = a } } }); sa.prototype = Object.assign(Object.create({ constructor: sa, apply: function(a) { console.warn("THREE.EventDispatcher: .apply is deprecated, just inherit or Object.assign the prototype to mix-in."); Object.assign(a, this) } }), sa.prototype); Object.defineProperties(Ae.prototype, { dynamic: { set: function(a) { console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.") } }, onUpdate: { value: function() { console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."); return this } } }); Object.assign(Dd.prototype, { supportsFloatTextures: function() { console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."); return this.extensions.get("OES_texture_float") }, supportsHalfFloatTextures: function() { console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."); return this.extensions.get("OES_texture_half_float") }, supportsStandardDerivatives: function() { console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."); return this.extensions.get("OES_standard_derivatives") }, supportsCompressedTextureS3TC: function() { console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."); return this.extensions.get("WEBGL_compressed_texture_s3tc") }, supportsCompressedTexturePVRTC: function() { console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."); return this.extensions.get("WEBGL_compressed_texture_pvrtc") }, supportsBlendMinMax: function() { console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."); return this.extensions.get("EXT_blend_minmax") }, supportsVertexTextures: function() { return this.capabilities.vertexTextures }, supportsInstancedArrays: function() { console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."); return this.extensions.get("ANGLE_instanced_arrays") }, enableScissorTest: function(a) { console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."); this.setScissorTest(a) }, initMaterial: function() { console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.") }, addPrePlugin: function() { console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.") }, addPostPlugin: function() { console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.") }, updateShadowMap: function() { console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.") } }); Object.defineProperties(Dd.prototype, { shadowMapEnabled: { get: function() { return this.shadowMap.enabled }, set: function(a) { console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."); this.shadowMap.enabled = a } }, shadowMapType: { get: function() { return this.shadowMap.type }, set: function(a) { console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."); this.shadowMap.type = a } }, shadowMapCullFace: { get: function() { return this.shadowMap.cullFace }, set: function(a) { console.warn("THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace."); this.shadowMap.cullFace = a } } }); Object.defineProperties(pe.prototype, { cullFace: { get: function() { return this.renderReverseSided ? 2 : 1 }, set: function(a) { a = 1 !== a; console.warn("WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to " + a + "."); this.renderReverseSided = a } } }); Object.defineProperties(Db.prototype, { wrapS: { get: function() { console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."); return this.texture.wrapS }, set: function(a) { console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."); this.texture.wrapS = a } }, wrapT: { get: function() { console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."); return this.texture.wrapT }, set: function(a) { console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."); this.texture.wrapT = a } }, magFilter: { get: function() { console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."); return this.texture.magFilter }, set: function(a) { console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."); this.texture.magFilter = a } }, minFilter: { get: function() { console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."); return this.texture.minFilter }, set: function(a) { console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."); this.texture.minFilter = a } }, anisotropy: { get: function() { console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."); return this.texture.anisotropy }, set: function(a) { console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."); this.texture.anisotropy = a } }, offset: { get: function() { console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."); return this.texture.offset }, set: function(a) { console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."); this.texture.offset = a } }, repeat: { get: function() { console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."); return this.texture.repeat }, set: function(a) { console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."); this.texture.repeat = a } }, format: { get: function() { console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."); return this.texture.format }, set: function(a) { console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."); this.texture.format = a } }, type: { get: function() { console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."); return this.texture.type }, set: function(a) { console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."); this.texture.type = a } }, generateMipmaps: { get: function() { console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."); return this.texture.generateMipmaps }, set: function(a) { console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."); this.texture.generateMipmaps = a } } }); Object.assign(dc.prototype, { load: function(a) { console.warn("THREE.Audio: .load has been deprecated. Please use THREE.AudioLoader."); var b = this; (new Od).load(a, function(a) { b.setBuffer(a) }); return this } }); Object.assign(Rd.prototype, { getData: function(a) { console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData()."); return this.getFrequencyData() } }); l.WebGLRenderTargetCube = Eb; l.WebGLRenderTarget = Db; l.WebGLRenderer = Dd; l.ShaderLib = Gb; l.UniformsLib = W; l.UniformsUtils = La; l.ShaderChunk = X; l.FogExp2 = Ib; l.Fog = Jb; l.Scene = jb; l.LensFlare = Ed; l.Sprite = qc; l.LOD = rc; l.SkinnedMesh = dd; l.Skeleton = bd; l.Bone = cd; l.Mesh = ya; l.LineSegments = la; l.Line = Ta; l.Points = Kb; l.Group = sc; l.VideoTexture = ed; l.DataTexture = lb; l.CompressedTexture = Lb; l.CubeTexture = Xa; l.CanvasTexture = fd; l.DepthTexture = tc; l.TextureIdCount = function() { return ee++ } ; l.Texture = da; l.MaterialIdCount = function() { return oe++ } ; l.CompressedTextureLoader = we; l.BinaryTextureLoader = Gd; l.DataTextureLoader = Gd; l.CubeTextureLoader = Hd; l.TextureLoader = gd; l.ObjectLoader = xe; l.MaterialLoader = ud; l.BufferGeometryLoader = Id; l.DefaultLoadingManager = Ga; l.LoadingManager = Fd; l.JSONLoader = Jd; l.ImageLoader = Lc; l.FontLoader = ye; l.XHRLoader = Ja; l.Loader = wb; l.Cache = ce; l.AudioLoader = Od; l.SpotLightShadow = id; l.SpotLight = jd; l.PointLight = kd; l.HemisphereLight = hd; l.DirectionalLightShadow = ld; l.DirectionalLight = md; l.AmbientLight = nd; l.LightShadow = tb; l.Light = pa; l.StereoCamera = ze; l.PerspectiveCamera = Ea; l.OrthographicCamera = Hb; l.CubeCamera = vd; l.Camera = Z; l.AudioListener = Pd; l.PositionalAudio = Qd; l.getAudioContext = Md; l.AudioAnalyser = Rd; l.Audio = dc; l.VectorKeyframeTrack = bc; l.StringKeyframeTrack = rd; l.QuaternionKeyframeTrack = Nc; l.NumberKeyframeTrack = cc; l.ColorKeyframeTrack = td; l.BooleanKeyframeTrack = sd; l.PropertyMixer = wd; l.PropertyBinding = fa; l.KeyframeTrack = vb; l.AnimationUtils = ma; l.AnimationObjectGroup = Sd; l.AnimationMixer = Ud; l.AnimationClip = Ha; l.Uniform = Ae; l.InstancedBufferGeometry = Bb; l.BufferGeometry = G; l.GeometryIdCount = function() { return ad++ } ; l.Geometry = Q; l.InterleavedBufferAttribute = Vd; l.InstancedInterleavedBuffer = fc; l.InterleavedBuffer = ec; l.InstancedBufferAttribute = gc; l.DynamicBufferAttribute = function(a, b) { console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead."); return (new C(a,b)).setDynamic(!0) } ; l.Float64Attribute = function(a, b) { return new C(new Float64Array(a),b) } ; l.Float32Attribute = ha; l.Uint32Attribute = $c; l.Int32Attribute = function(a, b) { return new C(new Int32Array(a),b) } ; l.Uint16Attribute = Zc; l.Int16Attribute = function(a, b) { return new C(new Int16Array(a),b) } ; l.Uint8ClampedAttribute = function(a, b) { return new C(new Uint8ClampedArray(a),b) } ; l.Uint8Attribute = function(a, b) { return new C(new Uint8Array(a),b) } ; l.Int8Attribute = function(a, b) { return new C(new Int8Array(a),b) } ; l.BufferAttribute = C; l.Face3 = ea; l.Object3DIdCount = function() { return qe++ } ; l.Object3D = z; l.Raycaster = Wd; l.Layers = Yc; l.EventDispatcher = sa; l.Clock = Yd; l.QuaternionLinearInterpolant = qd; l.LinearInterpolant = Mc; l.DiscreteInterpolant = pd; l.CubicInterpolant = od; l.Interpolant = qa; l.Triangle = wa; l.Spline = function(a) { function b(a, b, c, d, e, f, g) { a = .5 * (c - a); d = .5 * (d - b); return (2 * (b - c) + a + d) * g + (-3 * (b - c) - 2 * a - d) * f + a * e + b } this.points = a; var c = [], d = { x: 0, y: 0, z: 0 }, e, f, g, h, k, l, w, n, p; this.initFromArray = function(a) { this.points = []; for (var b = 0; b < a.length; b++) this.points[b] = { x: a[b][0], y: a[b][1], z: a[b][2] } } ; this.getPoint = function(a) { e = (this.points.length - 1) * a; f = Math.floor(e); g = e - f; c[0] = 0 === f ? f : f - 1; c[1] = f; c[2] = f > this.points.length - 2 ? this.points.length - 1 : f + 1; c[3] = f > this.points.length - 3 ? this.points.length - 1 : f + 2; l = this.points[c[0]]; w = this.points[c[1]]; n = this.points[c[2]]; p = this.points[c[3]]; h = g * g; k = g * h; d.x = b(l.x, w.x, n.x, p.x, g, h, k); d.y = b(l.y, w.y, n.y, p.y, g, h, k); d.z = b(l.z, w.z, n.z, p.z, g, h, k); return d } ; this.getControlPointsArray = function() { var a, b, c = this.points.length, d = []; for (a = 0; a < c; a++) b = this.points[a], d[a] = [b.x, b.y, b.z]; return d } ; this.getLength = function(a) { var b, c, d, e = 0, f = new q, g = new q, h = [], k = 0; h[0] = 0; a || (a = 100); c = this.points.length * a; f.copy(this.points[0]); for (a = 1; a < c; a++) b = a / c, d = this.getPoint(b), g.copy(d), k += g.distanceTo(f), f.copy(d), b *= this.points.length - 1, b = Math.floor(b), b !== e && (h[b] = k, e = b); h[h.length] = k; return { chunks: h, total: k } } ; this.reparametrizeByArcLength = function(a) { var b, c, d, e, f, g, h = [], k = new q, l = this.getLength(); h.push(k.copy(this.points[0]).clone()); for (b = 1; b < this.points.length; b++) { c = l.chunks[b] - l.chunks[b - 1]; g = Math.ceil(a * c / l.total); e = (b - 1) / (this.points.length - 1); f = b / (this.points.length - 1); for (c = 1; c < g - 1; c++) d = e + 1 / g * c * (f - e), d = this.getPoint(d), h.push(k.copy(d).clone()); h.push(k.copy(this.points[b]).clone()) } this.points = h } } ; l.Math = T; l.Spherical = Zd; l.Plane = va; l.Frustum = nc; l.Sphere = Ca; l.Ray = ab; l.Matrix4 = J; l.Matrix3 = Ia; l.Box3 = Ba; l.Box2 = mc; l.Line3 = gb; l.Euler = bb; l.Vector4 = ga; l.Vector3 = q; l.Vector2 = B; l.Quaternion = ba; l.ColorKeywords = He; l.Color = O; l.MorphBlendMesh = na; l.ImmediateRenderObject = Qc; l.VertexNormalsHelper = Rc; l.SpotLightHelper = hc; l.SkeletonHelper = ic; l.PointLightHelper = jc; l.HemisphereLightHelper = kc; l.GridHelper = Sc; l.FaceNormalsHelper = Tc; l.DirectionalLightHelper = lc; l.CameraHelper = Uc; l.BoundingBoxHelper = Vc; l.BoxHelper = Wc; l.ArrowHelper = Cb; l.AxisHelper = xd; l.ClosedSplineCurve3 = Ee; l.CatmullRomCurve3 = $d; l.SplineCurve3 = Ef; l.CubicBezierCurve3 = Ff; l.QuadraticBezierCurve3 = Gf; l.LineCurve3 = Hf; l.ArcCurve = yd; l.EllipseCurve = Va; l.SplineCurve = xb; l.CubicBezierCurve = yb; l.QuadraticBezierCurve = zb; l.LineCurve = Sa; l.Shape = Ab; l.ShapePath = Kd; l.Path = Pc; l.Font = Ld; l.CurvePath = Oc; l.Curve = ia; l.ShapeUtils = ra; l.SceneUtils = { createMultiMaterialObject: function(a, b) { for (var c = new sc, d = 0, e = b.length; d < e; d++) c.add(new ya(a,b[d])); return c }, detach: function(a, b, c) { a.applyMatrix(b.matrixWorld); b.remove(a); c.add(a) }, attach: function(a, b, c) { var d = new J; d.getInverse(c.matrixWorld); a.applyMatrix(d); b.remove(a); c.add(a) } }; l.CurveUtils = Xc; l.WireframeGeometry = Mb; l.ParametricGeometry = uc; l.ParametricBufferGeometry = Nb; l.TetrahedronGeometry = vc; l.TetrahedronBufferGeometry = Ob; l.OctahedronGeometry = wc; l.OctahedronBufferGeometry = Pb; l.IcosahedronGeometry = xc; l.IcosahedronBufferGeometry = Qb; l.DodecahedronGeometry = yc; l.DodecahedronBufferGeometry = Rb; l.PolyhedronGeometry = zc; l.PolyhedronBufferGeometry = ua; l.TubeGeometry = Ac; l.TubeBufferGeometry = Sb; l.TorusKnotGeometry = Bc; l.TorusKnotBufferGeometry = Tb; l.TorusGeometry = Cc; l.TorusBufferGeometry = Ub; l.TextGeometry = Dc; l.SphereBufferGeometry = mb; l.SphereGeometry = Vb; l.RingGeometry = Ec; l.RingBufferGeometry = Wb; l.PlaneBufferGeometry = ib; l.PlaneGeometry = Fc; l.LatheGeometry = Gc; l.LatheBufferGeometry = Xb; l.ShapeGeometry = cb; l.ExtrudeGeometry = za; l.EdgesGeometry = Yb; l.ConeGeometry = Hc; l.ConeBufferGeometry = Ic; l.CylinderGeometry = nb; l.CylinderBufferGeometry = Ua; l.CircleBufferGeometry = Zb; l.CircleGeometry = Jc; l.BoxBufferGeometry = hb; l.BoxGeometry = ob; l.ShadowMaterial = $b; l.SpriteMaterial = kb; l.RawShaderMaterial = ac; l.ShaderMaterial = Fa; l.PointsMaterial = xa; l.MultiMaterial = Kc; l.MeshPhysicalMaterial = pb; l.MeshStandardMaterial = Oa; l.MeshPhongMaterial = db; l.MeshNormalMaterial = qb; l.MeshLambertMaterial = rb; l.MeshDepthMaterial = Za; l.MeshBasicMaterial = Ma; l.LineDashedMaterial = sb; l.LineBasicMaterial = oa; l.Material = U; l.REVISION = "82"; l.MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; l.CullFaceNone = 0; l.CullFaceBack = 1; l.CullFaceFront = 2; l.CullFaceFrontBack = 3; l.FrontFaceDirectionCW = 0; l.FrontFaceDirectionCCW = 1; l.BasicShadowMap = 0; l.PCFShadowMap = 1; l.PCFSoftShadowMap = 2; l.FrontSide = 0; l.BackSide = 1; l.DoubleSide = 2; l.FlatShading = 1; l.SmoothShading = 2; l.NoColors = 0; l.FaceColors = 1; l.VertexColors = 2; l.NoBlending = 0; l.NormalBlending = 1; l.AdditiveBlending = 2; l.SubtractiveBlending = 3; l.MultiplyBlending = 4; l.CustomBlending = 5; l.BlendingMode = Fe; l.AddEquation = 100; l.SubtractEquation = 101; l.ReverseSubtractEquation = 102; l.MinEquation = 103; l.MaxEquation = 104; l.ZeroFactor = 200; l.OneFactor = 201; l.SrcColorFactor = 202; l.OneMinusSrcColorFactor = 203; l.SrcAlphaFactor = 204; l.OneMinusSrcAlphaFactor = 205; l.DstAlphaFactor = 206; l.OneMinusDstAlphaFactor = 207; l.DstColorFactor = 208; l.OneMinusDstColorFactor = 209; l.SrcAlphaSaturateFactor = 210; l.NeverDepth = 0; l.AlwaysDepth = 1; l.LessDepth = 2; l.LessEqualDepth = 3; l.EqualDepth = 4; l.GreaterEqualDepth = 5; l.GreaterDepth = 6; l.NotEqualDepth = 7; l.MultiplyOperation = 0; l.MixOperation = 1; l.AddOperation = 2; l.NoToneMapping = 0; l.LinearToneMapping = 1; l.ReinhardToneMapping = 2; l.Uncharted2ToneMapping = 3; l.CineonToneMapping = 4; l.UVMapping = 300; l.CubeReflectionMapping = 301; l.CubeRefractionMapping = 302; l.EquirectangularReflectionMapping = 303; l.EquirectangularRefractionMapping = 304; l.SphericalReflectionMapping = 305; l.CubeUVReflectionMapping = 306; l.CubeUVRefractionMapping = 307; l.TextureMapping = Ge; l.RepeatWrapping = 1E3; l.ClampToEdgeWrapping = 1001; l.MirroredRepeatWrapping = 1002; l.TextureWrapping = ae; l.NearestFilter = 1003; l.NearestMipMapNearestFilter = 1004; l.NearestMipMapLinearFilter = 1005; l.LinearFilter = 1006; l.LinearMipMapNearestFilter = 1007; l.LinearMipMapLinearFilter = 1008; l.TextureFilter = be; l.UnsignedByteType = 1009; l.ByteType = 1010; l.ShortType = 1011; l.UnsignedShortType = 1012; l.IntType = 1013; l.UnsignedIntType = 1014; l.FloatType = 1015; l.HalfFloatType = 1016; l.UnsignedShort4444Type = 1017; l.UnsignedShort5551Type = 1018; l.UnsignedShort565Type = 1019; l.UnsignedInt248Type = 1020; l.AlphaFormat = 1021; l.RGBFormat = 1022; l.RGBAFormat = 1023; l.LuminanceFormat = 1024; l.LuminanceAlphaFormat = 1025; l.RGBEFormat = 1023; l.DepthFormat = 1026; l.DepthStencilFormat = 1027; l.RGB_S3TC_DXT1_Format = 2001; l.RGBA_S3TC_DXT1_Format = 2002; l.RGBA_S3TC_DXT3_Format = 2003; l.RGBA_S3TC_DXT5_Format = 2004; l.RGB_PVRTC_4BPPV1_Format = 2100; l.RGB_PVRTC_2BPPV1_Format = 2101; l.RGBA_PVRTC_4BPPV1_Format = 2102; l.RGBA_PVRTC_2BPPV1_Format = 2103; l.RGB_ETC1_Format = 2151; l.LoopOnce = 2200; l.LoopRepeat = 2201; l.LoopPingPong = 2202; l.InterpolateDiscrete = 2300; l.InterpolateLinear = 2301; l.InterpolateSmooth = 2302; l.ZeroCurvatureEnding = 2400; l.ZeroSlopeEnding = 2401; l.WrapAroundEnding = 2402; l.TrianglesDrawMode = 0; l.TriangleStripDrawMode = 1; l.TriangleFanDrawMode = 2; l.LinearEncoding = 3E3; l.sRGBEncoding = 3001; l.GammaEncoding = 3007; l.RGBEEncoding = 3002; l.LogLuvEncoding = 3003; l.RGBM7Encoding = 3004; l.RGBM16Encoding = 3005; l.RGBDEncoding = 3006; l.BasicDepthPacking = 3200; l.RGBADepthPacking = 3201; l.CubeGeometry = ob; l.Face4 = function(a, b, c, d, e, f, g) { console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead."); return new ea(a,b,c,e,f,g) } ; l.LineStrip = 0; l.LinePieces = 1; l.MeshFaceMaterial = Kc; l.PointCloud = function(a, b) { console.warn("THREE.PointCloud has been renamed to THREE.Points."); return new Kb(a,b) } ; l.Particle = qc; l.ParticleSystem = function(a, b) { console.warn("THREE.ParticleSystem has been renamed to THREE.Points."); return new Kb(a,b) } ; l.PointCloudMaterial = function(a) { console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial."); return new xa(a) } ; l.ParticleBasicMaterial = function(a) { console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial."); return new xa(a) } ; l.ParticleSystemMaterial = function(a) { console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial."); return new xa(a) } ; l.Vertex = function(a, b, c) { console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead."); return new q(a,b,c) } ; l.EdgesHelper = function(a, b) { console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead."); return new la(new Yb(a.geometry),new oa({ color: void 0 !== b ? b : 16777215 })) } ; l.WireframeHelper = function(a, b) { console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead."); return new la(new Mb(a.geometry),new oa({ color: void 0 !== b ? b : 16777215 })) } ; l.GeometryUtils = { merge: function(a, b, c) { console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead."); var d; b.isMesh && (b.matrixAutoUpdate && b.updateMatrix(), d = b.matrix, b = b.geometry); a.merge(b, d, c) }, center: function(a) { console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead."); return a.center() } }; l.ImageUtils = { crossOrigin: void 0, loadTexture: function(a, b, c, d) { console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead."); var e = new gd; e.setCrossOrigin(this.crossOrigin); a = e.load(a, c, void 0, d); b && (a.mapping = b); return a }, loadTextureCube: function(a, b, c, d) { console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead."); var e = new Hd; e.setCrossOrigin(this.crossOrigin); a = e.load(a, c, void 0, d); b && (a.mapping = b); return a }, loadCompressedTexture: function() { console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.") }, loadCompressedTextureCube: function() { console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.") } }; l.Projector = function() { console.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js."); this.projectVector = function(a, b) { console.warn("THREE.Projector: .projectVector() is now vector.project()."); a.project(b) } ; this.unprojectVector = function(a, b) { console.warn("THREE.Projector: .unprojectVector() is now vector.unproject()."); a.unproject(b) } ; this.pickingRay = function(a, b) { console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().") } } ; l.CanvasRenderer = function() { console.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js"); this.domElement = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas"); this.clear = function() {} ; this.render = function() {} ; this.setClearColor = function() {} ; this.setSize = function() {} } ; Object.defineProperty(l, "__esModule", { value: !0 }); Object.defineProperty(l, "AudioContext", { get: function() { return l.getAudioContext() } }) });